@rangertechnologies/ngnxt 2.1.252 → 2.1.253
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/environments/version.mjs +2 -2
- package/esm2022/lib/components/button/nxt-button.component.mjs +4 -4
- package/esm2022/lib/components/custom-calendar/custom-calendar.component.mjs +8 -5
- package/esm2022/lib/components/custom-dropdown/custom-dropdown.component.mjs +13 -14
- package/esm2022/lib/components/custom-model/custom-model.component.mjs +5 -3
- package/esm2022/lib/components/custom-radio/custom-radio.component.mjs +8 -11
- package/esm2022/lib/components/datatable/datatable.component.mjs +7 -8
- package/esm2022/lib/components/file-upload/file-upload.component.mjs +13 -16
- package/esm2022/lib/components/icon-selector/icon-selector.component.mjs +4 -3
- package/esm2022/lib/components/list-view-filter/list-view-filter.component.mjs +9 -9
- package/esm2022/lib/components/nxt-input/nxt-input.component.mjs +24 -12
- package/esm2022/lib/components/pagination/pagination.component.mjs +3 -3
- package/esm2022/lib/components/pick-location/pick-location.component.mjs +10 -13
- package/esm2022/lib/components/search-box/search-box.component.mjs +14 -15
- package/esm2022/lib/nxt-app.module.mjs +9 -33
- package/esm2022/lib/pages/booklet/booklet.component.mjs +31 -56
- package/esm2022/lib/pages/builder/element/element.component.mjs +68 -36
- package/esm2022/lib/pages/builder/form/form.component.mjs +6 -3
- package/esm2022/lib/pages/builder/properties/common-fields.constants.mjs +3 -3
- package/esm2022/lib/pages/builder/properties/properties.component.mjs +203 -78
- package/esm2022/lib/pages/builder/templates/templates.component.mjs +5 -4
- package/esm2022/lib/pages/pdfDesigner/pdf-designer/pdf-designer.component.mjs +5 -4
- package/esm2022/lib/pages/pdfDesigner/pdf-properties/pdf-properties.component.mjs +42 -45
- package/esm2022/lib/pages/questionbook/questionbook.component.mjs +18 -40
- package/esm2022/lib/pages/questionnaire/questionnaire.component.mjs +17 -17
- package/esm2022/lib/pipe/custom-translate.pipe.mjs +16 -10
- package/esm2022/lib/services/change/change.service.mjs +46 -0
- package/esm2022/lib/services/country/country.service.mjs +135 -0
- package/esm2022/lib/services/data/data.service.mjs +100 -0
- package/esm2022/lib/services/form-builder/form-builder.service.mjs +500 -0
- package/esm2022/lib/services/pdf-designer/pdf-designer.service.mjs +398 -0
- package/esm2022/lib/services/salesforce/salesforce.service.mjs +41 -0
- package/esm2022/lib/services/shared/shared.service.mjs +100 -0
- package/esm2022/lib/services/storage/storage.service.mjs +59 -0
- package/esm2022/lib/services/template/template.service.mjs +351 -0
- package/esm2022/lib/services/translation/translation.service.mjs +121 -0
- package/esm2022/public-api.mjs +2 -5
- package/fesm2022/rangertechnologies-ngnxt.mjs +1265 -1259
- package/fesm2022/rangertechnologies-ngnxt.mjs.map +1 -1
- package/lib/components/button/nxt-button.component.d.ts +1 -1
- package/lib/components/custom-calendar/custom-calendar.component.d.ts +1 -1
- package/lib/components/custom-dropdown/custom-dropdown.component.d.ts +3 -5
- package/lib/components/custom-radio/custom-radio.component.d.ts +3 -5
- package/lib/components/datatable/datatable.component.d.ts +3 -3
- package/lib/components/file-upload/file-upload.component.d.ts +3 -5
- package/lib/components/image-cropper/component/image-cropper.component.d.ts +1 -1
- package/lib/components/nxt-input/nxt-input.component.d.ts +2 -2
- package/lib/components/pick-location/pick-location.component.d.ts +1 -3
- package/lib/components/search-box/search-box.component.d.ts +5 -7
- package/lib/nxt-app.module.d.ts +15 -17
- package/lib/pages/booklet/booklet.component.d.ts +9 -9
- package/lib/pages/builder/element/element.component.d.ts +10 -4
- package/lib/pages/builder/form/form.component.d.ts +2 -1
- package/lib/pages/builder/properties/properties.component.d.ts +34 -6
- package/lib/pages/builder/templates/templates.component.d.ts +1 -1
- package/lib/pages/pdfDesigner/pdf-designer/pdf-designer.component.d.ts +1 -1
- package/lib/pages/pdfDesigner/pdf-properties/pdf-properties.component.d.ts +19 -2
- package/lib/pages/questionbook/questionbook.component.d.ts +7 -11
- package/lib/pages/questionnaire/questionnaire.component.d.ts +7 -8
- package/lib/pipe/custom-translate.pipe.d.ts +2 -3
- package/lib/services/{form-builder.service.d.ts → form-builder/form-builder.service.d.ts} +2 -2
- package/lib/services/{pdf-designer.service.d.ts → pdf-designer/pdf-designer.service.d.ts} +1 -1
- package/lib/services/{storage.service.d.ts → storage/storage.service.d.ts} +2 -2
- package/lib/services/{translation.service.d.ts → translation/translation.service.d.ts} +12 -1
- package/package.json +1 -1
- package/public-api.d.ts +1 -3
- package/rangertechnologies-ngnxt-2.1.253.tgz +0 -0
- package/esm2022/lib/ar.i18n.mjs +0 -29
- package/esm2022/lib/en.i18n.mjs +0 -29
- package/esm2022/lib/i18n-config.service.mjs +0 -4
- package/esm2022/lib/i18n.component.mjs +0 -45
- package/esm2022/lib/i18n.module.mjs +0 -38
- package/esm2022/lib/i18n.pipe.mjs +0 -26
- package/esm2022/lib/i18n.service.mjs +0 -56
- package/esm2022/lib/interfaces/apimeta.mjs +0 -2
- package/esm2022/lib/services/change.service.mjs +0 -46
- package/esm2022/lib/services/country.service.mjs +0 -135
- package/esm2022/lib/services/data.service.mjs +0 -100
- package/esm2022/lib/services/form-builder.service.mjs +0 -402
- package/esm2022/lib/services/pdf-designer.service.mjs +0 -398
- package/esm2022/lib/services/salesforce.service.mjs +0 -41
- package/esm2022/lib/services/shared.service.mjs +0 -100
- package/esm2022/lib/services/storage.service.mjs +0 -59
- package/esm2022/lib/services/template.service.mjs +0 -351
- package/esm2022/lib/services/translation.service.mjs +0 -61
- package/esm2022/lib/tam.i18n.mjs +0 -29
- package/lib/ar.i18n.d.ts +0 -24
- package/lib/en.i18n.d.ts +0 -24
- package/lib/i18n-config.service.d.ts +0 -2
- package/lib/i18n.component.d.ts +0 -11
- package/lib/i18n.module.d.ts +0 -9
- package/lib/i18n.pipe.d.ts +0 -10
- package/lib/i18n.service.d.ts +0 -14
- package/lib/interfaces/apimeta.d.ts +0 -15
- package/lib/tam.i18n.d.ts +0 -24
- package/rangertechnologies-ngnxt-2.1.252.tgz +0 -0
- /package/lib/services/{change.service.d.ts → change/change.service.d.ts} +0 -0
- /package/lib/services/{country.service.d.ts → country/country.service.d.ts} +0 -0
- /package/lib/services/{data.service.d.ts → data/data.service.d.ts} +0 -0
- /package/lib/services/{salesforce.service.d.ts → salesforce/salesforce.service.d.ts} +0 -0
- /package/lib/services/{shared.service.d.ts → shared/shared.service.d.ts} +0 -0
- /package/lib/services/{template.service.d.ts → template/template.service.d.ts} +0 -0
|
@@ -4,10 +4,11 @@ import { CommonModule } from '@angular/common';
|
|
|
4
4
|
import { FormsModule } from '@angular/forms';
|
|
5
5
|
import { NxtSearchBox } from '../../../components/search-box/search-box.component';
|
|
6
6
|
import { ImageCropperComponent } from '../../../components/image-cropper/component/image-cropper.component';
|
|
7
|
+
import { NxtCustomTranslatePipe } from '../../../pipe/custom-translate.pipe';
|
|
7
8
|
import * as i0 from "@angular/core";
|
|
8
9
|
import * as i1 from "@angular/common/http";
|
|
9
|
-
import * as i2 from "../../../services/pdf-designer.service";
|
|
10
|
-
import * as i3 from "../../../services/template.service";
|
|
10
|
+
import * as i2 from "../../../services/pdf-designer/pdf-designer.service";
|
|
11
|
+
import * as i3 from "../../../services/template/template.service";
|
|
11
12
|
import * as i4 from "@angular/common";
|
|
12
13
|
import * as i5 from "@angular/forms";
|
|
13
14
|
export class PdfPropertiesComponent {
|
|
@@ -71,65 +72,61 @@ export class PdfPropertiesComponent {
|
|
|
71
72
|
// AP-25MAR25 Add subtext all variables
|
|
72
73
|
'Header': {
|
|
73
74
|
elementProps: [
|
|
74
|
-
{ label: 'Label', placeholder: 'Enter Text', type: 'text', key: 'title' }
|
|
75
|
-
]
|
|
75
|
+
{ label: 'Label', labelPath: 'LABEL', placeholder: 'Enter Text', type: 'text', key: 'title' }
|
|
76
|
+
],
|
|
76
77
|
},
|
|
77
78
|
'text': {
|
|
78
79
|
elementProps: [
|
|
79
|
-
{ label: 'Place Holder', placeholder: 'Enter Text', type: 'text', key: 'question' },
|
|
80
|
-
{ label: 'Element', type: 'number', key: 'questionNumber' },
|
|
81
|
-
{ label: 'width', type: 'fieldSize', key: 'width' },
|
|
80
|
+
{ label: 'Place Holder', labelPath: 'PLACEHOLDER', placeholder: 'Enter Text', type: 'text', key: 'question' },
|
|
81
|
+
{ label: 'Element', labelPath: 'ELEMENT', type: 'number', key: 'questionNumber' },
|
|
82
|
+
{ label: 'width', labelPath: 'WIDTH', type: 'fieldSize', key: 'width' },
|
|
82
83
|
],
|
|
83
84
|
fieldProps: [
|
|
84
|
-
{ label: '', type: 'toggleGroup', key: 'toggleOptions' },
|
|
85
|
-
{ label: 'Help Text', placeholder: 'Enter Text
|
|
86
|
-
{ label: 'Value', placeholder: 'Enter Text
|
|
87
|
-
{ label: 'Reference Field', placeholder: 'Reference Field', type: 'text', key: 'referenceField' },
|
|
85
|
+
{ label: '', labelPath: 'TOGGLEOPTIONS', type: 'toggleGroup', key: 'toggleOptions' },
|
|
86
|
+
{ label: 'Help Text', labelPath: 'HELPTEXT', placeholder: 'Enter Text', type: 'text' },
|
|
87
|
+
{ label: 'Value', labelPath: 'VALUE', placeholder: 'Enter Text', type: 'text', key: 'value' },
|
|
88
|
+
{ label: 'Reference Field', labelPath: 'REFERENCEFIELD', placeholder: 'Reference Field', type: 'text', key: 'referenceField' },
|
|
88
89
|
{
|
|
89
|
-
|
|
90
|
-
|
|
90
|
+
label: '', labelPath: 'SUBTEXT', placeholder: 'Enter Text', type: 'subQuestion', key: 'isSubText',
|
|
91
|
+
subQuestion: []
|
|
91
92
|
}
|
|
92
93
|
],
|
|
93
94
|
appearance: [
|
|
94
95
|
{
|
|
95
|
-
label: 'Select Font', type: 'select', key: 'font', placeholder: 'Left',
|
|
96
|
+
label: 'Select Font', labelPath: 'SELECTFONT', type: 'select', key: 'font', placeholder: 'Left',
|
|
96
97
|
options: ['Helvetica Neue', 'Arial', 'Times New Roman', 'Roboto']
|
|
97
98
|
},
|
|
98
|
-
{ label: 'Font Color', type: 'color', key: 'fontColor', value: '' },
|
|
99
|
+
{ label: 'Font Color', labelPath: 'FONTCOLOR', type: 'color', key: 'fontColor', value: '' },
|
|
99
100
|
{
|
|
100
|
-
label: 'Font Size',
|
|
101
|
-
type: 'number',
|
|
102
|
-
key: 'fontSize',
|
|
103
|
-
value: 14
|
|
101
|
+
label: 'Font Size', labelPath: 'FONTSIZE', type: 'number', key: 'fontSize', value: 14
|
|
104
102
|
},
|
|
105
103
|
{
|
|
106
|
-
label: 'Font Weight', type: 'select', key: 'fontWeight', value: '',
|
|
104
|
+
label: 'Font Weight', labelPath: 'FONTWEIGHT', type: 'select', key: 'fontWeight', value: '',
|
|
107
105
|
options: [
|
|
108
|
-
{ value: '400', label: '400-Normal' },
|
|
109
|
-
{ value: '500', label: '500-Medium' },
|
|
110
|
-
{ value: '600', label: '600-Semi Bold' },
|
|
111
|
-
{ value: '700', label: '700-Bold' }
|
|
106
|
+
{ value: '400', label: '400-Normal', labelPath: 'FONTWEIGHT_NORMAL' },
|
|
107
|
+
{ value: '500', label: '500-Medium', labelPath: 'FONTWEIGHT_MEDIUM' },
|
|
108
|
+
{ value: '600', label: '600-Semi Bold', labelPath: 'FONTWEIGHT_SEMIBOLD' },
|
|
109
|
+
{ value: '700', label: '700-Bold', labelPath: 'FONTWEIGHT_BOLD' }
|
|
112
110
|
]
|
|
113
111
|
},
|
|
114
112
|
{
|
|
115
|
-
label: 'Font Style', type: 'select', key: 'fontStyle', value: '',
|
|
113
|
+
label: 'Font Style', labelPath: 'FONTSTYLE', type: 'select', key: 'fontStyle', value: '',
|
|
116
114
|
options: [
|
|
117
|
-
{ label: 'Normal', value: 'normal' },
|
|
118
|
-
{ label: 'Bold', value: 'bold' },
|
|
119
|
-
{ label: 'Italic', value: 'italic' }
|
|
115
|
+
{ label: 'Normal', labelPath: 'FONTSTYLE_NORMAL', value: 'normal' },
|
|
116
|
+
{ label: 'Bold', labelPath: 'FONTSTYLE_BOLD', value: 'bold' },
|
|
117
|
+
{ label: 'Italic', labelPath: 'FONTSTYLE_ITALIC', value: 'italic' }
|
|
120
118
|
]
|
|
121
119
|
},
|
|
122
120
|
{
|
|
123
|
-
label: 'Margin', type: 'marginPicker', key: 'margin',
|
|
124
|
-
placeholder: 'Left, Top, Right, Bottom',
|
|
125
|
-
value: [0, 0, 0, 0]
|
|
121
|
+
label: 'Margin', labelPath: 'MARGIN', type: 'marginPicker', key: 'margin',
|
|
122
|
+
placeholder: 'Left, Top, Right, Bottom', value: [0, 0, 0, 0]
|
|
126
123
|
},
|
|
127
124
|
{
|
|
128
|
-
label: 'Align Item', type: 'select', key: 'alignItems', value: '',
|
|
125
|
+
label: 'Align Item', labelPath: 'ALIGNITEM', type: 'select', key: 'alignItems', value: '',
|
|
129
126
|
options: [
|
|
130
|
-
{ label: 'Left', value: 'left' },
|
|
131
|
-
{ label: 'Center', value: 'center' },
|
|
132
|
-
{ label: 'Right', value: 'right' }
|
|
127
|
+
{ label: 'Left', labelPath: 'ALIGNITEM_LEFT', value: 'left' },
|
|
128
|
+
{ label: 'Center', labelPath: 'ALIGNITEM_CENTER', value: 'center' },
|
|
129
|
+
{ label: 'Right', labelPath: 'ALIGNITEM_RIGHT', value: 'right' }
|
|
133
130
|
]
|
|
134
131
|
}
|
|
135
132
|
]
|
|
@@ -256,16 +253,16 @@ export class PdfPropertiesComponent {
|
|
|
256
253
|
},
|
|
257
254
|
'Pdf': {
|
|
258
255
|
elementProps: [
|
|
259
|
-
{ label: 'Element', type: 'number', key: 'questionNumber' },
|
|
260
|
-
{ label: 'width', type: 'fieldSize', key: 'width' }
|
|
256
|
+
{ label: 'Element', labelPath: 'ELEMENT', type: 'number', key: 'questionNumber' },
|
|
257
|
+
{ label: 'width', labelPath: 'WIDTH', type: 'fieldSize', key: 'width' }
|
|
261
258
|
],
|
|
262
259
|
fieldProps: [
|
|
263
|
-
{ label: 'Help Text', placeholder: 'Enter Text
|
|
264
|
-
{ label: 'Value', placeholder: 'Enter Text
|
|
265
|
-
{ label: 'Reference Field', placeholder: 'Reference Field', type: 'text', key: 'referenceField' },
|
|
260
|
+
{ label: 'Help Text', labelPath: 'HELPTEXT', placeholder: 'Enter Text', type: 'text' },
|
|
261
|
+
{ label: 'Value', labelPath: 'VALUE', placeholder: 'Enter Text', type: 'text', key: 'value' },
|
|
262
|
+
{ label: 'Reference Field', labelPath: 'REFERENCEFIELD', placeholder: 'Reference Field', type: 'text', key: 'referenceField' },
|
|
266
263
|
{
|
|
267
|
-
|
|
268
|
-
|
|
264
|
+
label: '', labelPath: 'SUBTEXT', placeholder: 'Enter Text', type: 'subQuestion', key: 'isSubText',
|
|
265
|
+
subQuestion: []
|
|
269
266
|
}
|
|
270
267
|
],
|
|
271
268
|
appearance: []
|
|
@@ -1098,11 +1095,11 @@ export class PdfPropertiesComponent {
|
|
|
1098
1095
|
}
|
|
1099
1096
|
}
|
|
1100
1097
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PdfPropertiesComponent, deps: [{ token: i1.HttpClient }, { token: i2.PdfDesignerService }, { token: i3.TemplateService }], target: i0.ɵɵFactoryTarget.Component });
|
|
1101
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: PdfPropertiesComponent, isStandalone: true, selector: "app-pdf-properties", inputs: { selectedElementType: "selectedElementType", templateSelected: "templateSelected" }, outputs: { formButtonHandler: "formButtonHandler", templateSaveHandler: "templateSaveHandler" }, host: { listeners: { "document:click": "onClickOutside($event)" } }, viewQueries: [{ propertyName: "dropdown", first: true, predicate: ["dropdown"], descendants: true }], ngImport: i0, template: "<!-- - Field and Element Properties -->\n<div class=\"container\">\n <div class=\"tabs\">\n <div class=\"tab\" [ngClass]=\"{'active': activeTab === 'attributes'}\" (click)=\"setActiveTab('attributes')\">\n Attributes\n </div>\n <div class=\"tab\" [ngClass]=\"{'active': activeTab === 'property'}\" (click)=\"setActiveTab('property')\">\n Property\n </div>\n <div class=\"tab\" [ngClass]=\"{'active': activeTab === 'appearance'}\" (click)=\"setActiveTab('appearance')\">\n Appearance\n </div>\n </div>\n\n <div class=\"tab-content\" *ngIf=\"activeTab === 'attributes'\">\n <!-- Element Properrties -->\n <!-- Select element type show -->\n <div *ngIf=\"getProperties()\">\n <!-- SKS25MAR25 this is for image edit -->\n <div *ngIf=\"selectedElement?.type === 'image'\">\n <image-cropper *ngIf=\"selectedElement.imageData \" [imageBase64]=\"selectedElement.orgImageData\"\n [disabled]=\"false\" [alignImage]=\"alignImage\" [roundCropper]=\"roundCropper\" [backgroundColor]=\"'white'\"\n imageAltText=\"Alternative image text\" [allowMoveImage]=\"false\" [hideResizeSquares]=\"false\"\n [canvasRotation]=\"canvasRotation\" [aspectRatio]=\"aspectRatio\" [containWithinAspectRatio]=\"false\"\n [maintainAspectRatio]=\"false\" [cropperStaticWidth]=\"cropperStaticWidth\"\n [cropperStaticHeight]=\"cropperStaticHeight\" [cropperMinWidth]=\"cropperMinWidth\"\n [cropperMinHeight]=\"cropperMinHeight\" [cropperMaxWidth]=\"cropperMaxWidth\"\n [cropperMaxHeight]=\"cropperMaxHeight\" [resetCropOnAspectRatioChange]='true' [(cropper)]=\"cropper\"\n [(transform)]=\"transform\" [onlyScaleDown]=\"true\" output=\"blob\" format=\"png\"\n (imageCropped)=\"imageCropped($event)\" (cropperReady)=\"cropperReady($event)\"></image-cropper>\n <div *ngIf=\"selectedElement.imageData \" style=\"display: flex; gap: 2px;\">\n <div class=\"cursor-pointer logo-icon\" (click)=\"rotateLeft()\" title=\"Rotate Left\">\u27F2</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"rotateRight()\" title=\"Rotate Right\">\u27F3</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"zoomOut()\" title=\"Zoom Out\">-</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"zoomIn()\" title=\"Zoom In\">+</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"moveLeft()\" title=\"Move Left\">\u2190</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"moveRight()\" title=\"Move Right\">\u2192</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"moveUp()\" title=\"Move Up\">\u2191</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"moveDown()\" title=\"Move Down\">\u2193</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"flipHorizontal()\" [class.enabled]=\"transform.flipH\"\n title=\"Flip Horizontally\">\u2194</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"flipVertical()\" [class.enabled]=\"transform.flipV\"\n title=\"Flip Vertically\">\u2195</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"resetImage()\" title=\"Reset\">\u00D7</div>\n </div>\n </div>\n <!-- SKS28MAR25 search pdf specific for pdf element -->\n <div *ngIf=\"selectedElement?.type === 'Pdf'\">\n <label class=\"text-sm\">Search Pdf</label>\n <div style=\"display: flex; gap: 2px; align-items: center; justify-content: center;\">\n <nxt-search-box [question]=\"selectedElement\" [readOnly]=\"selectedElement.isReadOnly\" [apiMeta]=\"bookSubtext\"\n [placeHolderText]=\"selectedElement.question || ''\"\n [mode]=\"'edit'\"\n (searchValueChange)=\"childEventCapture($event)\">\n </nxt-search-box>\n <div class=\"link-icon\">\n <svg (click)=\"linkToggleDropdown($event)\" fill=\"#000000\" version=\"1.1\" id=\"Capa_1\"\n xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"24px\" height=\"24px\"\n viewBox=\"0 0 450 450\" xml:space=\"preserve\">\n <g>\n <g>\n <g>\n <path d=\"M318.15,230.195l77.934-77.937c31.894-31.892,31.894-83.782-0.004-115.674l-12.66-12.66\n c-31.893-31.896-83.78-31.896-115.674-0.004l-77.937,77.934c-17.588,17.588-25.457,41.264-23.646,64.311\n c-23.045-1.813-46.722,6.056-64.308,23.647L23.92,267.748c-31.894,31.889-31.894,83.779,0,115.674l12.664,12.662\n c31.893,31.893,83.783,31.893,115.674,0l77.935-77.936c17.592-17.59,25.459-41.266,23.647-64.309\n C276.884,255.654,300.56,247.783,318.15,230.195z M202.653,290.605l-77.936,77.938c-16.705,16.703-43.889,16.703-60.59,0\n l-12.666-12.666c-16.705-16.701-16.703-43.885,0-60.594l77.936-77.932c14.14-14.141,35.779-16.306,52.226-6.516l-32.302,32.307\n c-7.606,7.604-7.606,19.938,0,27.541c7.605,7.607,19.937,7.607,27.541,0l32.306-32.303\n C218.959,254.828,216.795,276.469,202.653,290.605z M238.382,209.169l32.299-32.306c7.608-7.602,7.608-19.935,0-27.538\n c-7.604-7.61-19.936-7.61-27.541-0.004l-32.303,32.303c-9.791-16.446-7.627-38.087,6.514-52.226l77.935-77.935\n c16.707-16.707,43.89-16.707,60.594,0l12.664,12.664c16.705,16.705,16.705,43.886,0,60.591l-77.936,77.937\n C276.468,216.797,254.828,218.959,238.382,209.169z\" />\n <path d=\"M343.466,261.465c-45.287,0-82,36.713-82,82s36.713,82,82,82c45.286,0,82-36.713,82-82S388.753,261.465,343.466,261.465z\n M372.505,333.564l-56.046,56.104c-0.239,0.238-0.536,0.41-0.862,0.496l-22.315,5.85c-0.649,0.168-1.347-0.02-1.822-0.494\n c-0.477-0.479-0.666-1.172-0.496-1.824l5.826-22.318c0.084-0.326,0.256-0.627,0.494-0.863l56.047-56.104\n c0.742-0.742,1.945-0.744,2.688-0.002l4.548,4.541c0.739,0.74,0.741,1.943,0,2.688l-37.433,37.471l4.709,4.703l37.435-37.471\n c0.739-0.742,1.94-0.742,2.682-0.002l4.55,4.541C373.25,331.617,373.25,332.822,372.505,333.564z M395.472,310.574l-17,17.018\n c-0.739,0.744-1.942,0.744-2.685,0.002l-16.489-16.475c-0.744-0.74-0.744-1.943-0.002-2.688l17-17.02\n c0.741-0.74,1.944-0.74,2.688-0.002l16.487,16.477C396.216,308.629,396.216,309.832,395.472,310.574z\" />\n </g>\n </g>\n </g>\n </svg>\n <div class=\"link-dropdown-menu\" *ngIf=\"isLinkDropdownOpen\" #dropdown>\n <label>Endpoint:</label>\n <input type=\"text\" [(ngModel)]=\"bookSubtext.endpoint\" />\n\n <label>Variable:</label>\n <input type=\"text\" [(ngModel)]=\"bookSubtext.variable\" />\n\n <label>Field:</label>\n <input type=\"text\" [ngModel]=\"fieldAsString\" (ngModelChange)=\"updateField($event)\" />\n\n <label>Default Field:</label>\n <input type=\"text\" [(ngModel)]=\"bookSubtext.defaultField\" />\n </div>\n </div>\n </div>\n </div>\n <ng-container *ngFor=\"let prop of getProperties().elementProps\">\n <div class=\"form-group\">\n <label *ngIf=\"prop.type !== 'checkbox' && prop.type !== 'subQuestion'\" class=\"text-sm\">{{ prop.label\n }}</label>\n\n <!-- Text Input -->\n <input *ngIf=\"prop.type === 'text'\" type=\"text\" [placeholder]=\"prop.placeholder\"\n [value]=\"headerSelect ? pdf.title : (selectedElement?.type === 'Table' ? (prop.targetArray ? getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn, prop.key ) : getValueByPath(prop.key) ) : getValueByPath(prop.key))\"\n (input)=\"headerSelect ? updateTitle($event.target.value) : (selectedElement?.type === 'Table' ? (prop.targetArray ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn, prop.key, $event) : setValueByPath(prop.key, $event.target.value) ) : setValueByPath(prop.key, $event.target.value))\"\n [class.read-only]=\"selectedElement.readOnly\" [readonly]=\"selectedElement.readOnly\" />\n\n <!-- questionNumber -->\n <input *ngIf=\"prop.key === 'questionNumber'\" type=\"number\" [value]=\"selectedElement.questionNumber\"\n (input)=\"setValueByPath('questionNumber', $event.target.value)\" />\n\n <!-- file -->\n <!-- Add this inside the elementProps loop where other inputs are rendered -->\n <select *ngIf=\"prop.type === 'select' && prop.key === 'supportType'\" [value]=\"selectedElement[prop.key]\"\n (change)=\"setValueByPath(prop.key, $event.target.value)\">\n <option value=\"\">---Select---</option>\n <option *ngFor=\"let option of prop.options\" [value]=\"option.value\"> {{ option.label }} </option>\n </select>\n\n <div *ngIf=\"prop.type === 'checkbox'\">\n\n <input type=\"checkbox\"\n [checked]=\"selectedElement.type === 'Table' ? (prop.targetArray ? getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn, prop.key ) : getValueByPath(prop.key) ): getValueByPath(prop.key) \"\n (change)=\" selectedElement.type === 'Table' ? (prop.targetArray ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn, prop.key, $event) : onToggleChange(prop.key, $event) ) : onToggleChange(prop.key, $event)\" />\n <span class=\"toggle-label\" style=\"padding-left: 10px;\">{{ prop.label }}</span>\n\n </div>\n <!-- SKS20MAR25 Subquestion Type -->\n <div *ngIf=\"prop.type === 'subQuestion'\">\n <div style=\"display: flex; flex-direction: row; gap: 10px; align-items: center;\">\n <div>{{ prop.label }}</div>\n <input type=\"checkbox\"\n [checked]=\"selectedElement.type === 'Table' ? (prop.targetArray ? getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn, prop.key ) : getValueByPath(prop.key) ): getValueByPath(prop.key) \"\n (change)=\" selectedElement.type === 'Table' ? (prop.targetArray ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn, prop.key, $event) : onToggleChange(prop.key, $event) ) : onToggleChange(prop.key, $event)\" />\n </div>\n <!-- SKS20MAR25 Render subquestions when checkbox is checked -->\n <div\n *ngIf=\"selectedElement.type === 'Table' ? (prop.targetArray ? getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn, prop.key ) : getValueByPath(prop.key) ): getValueByPath(prop.key)\">\n <div *ngFor=\"let subProp of prop.subQuestion\"\n style=\"background-color: #e7f2ff; padding: 8px; border-radius: 4px;\">\n <div class=\"form-group\">\n <label>{{ subProp.label }}</label>\n <div *ngIf=\"subProp.type === 'array'\">\n <!-- Iterate over filtered columns to display checkboxes -->\n <div *ngFor=\"let column of filteredColumns\">\n <label>\n <input type=\"checkbox\"\n [checked]=\"subProp.operands ? subProp.operands.includes(column.apiName) : false\"\n (change)=\"onCheckboxChange(subProp.targetArray,subProp.targetArrayKey,subProp.key, column.apiName, $event.target.checked)\">\n {{ column.apiName }}\n </label>\n </div>\n </div>\n <!-- SKS21MAR25 New radio type -->\n <div *ngIf=\"subProp.type === 'radio'\">\n <div *ngFor=\"let column of filteredColumns\">\n <label>\n <input type=\"radio\" [name]=\"subProp.key\" [value]=\"column.apiName\"\n [checked]=\"getValueByArrayPath(subProp.targetArray, subProp.targetArrayKey, selectColumn, subProp.key) === column.apiName\"\n (change)=\"onRadioChange(subProp.targetArray, subProp.targetArrayKey, subProp.key, column.apiName)\">\n {{ column.apiName }}\n </label>\n </div>\n </div>\n <!-- SKS20MAR25 Add more subproperty types as needed -->\n <!-- Inside the subProp ngFor loop -->\n <input *ngIf=\"subProp.type === 'text'\" type=\"text\" [placeholder]=\"subProp.placeholder\"\n [value]=\"selectedElement.type === 'Table' ? (subProp.targetArray ? getValueByArrayPath(subProp.targetArray, subProp.targetArrayKey, selectColumn, subProp.key ) : getValueByPath(subProp.key) ) : getValueByPath(subProp.key)\"\n (input)=\"selectedElement.type === 'Table' ? (subProp.targetArray ? updateValueByArrayPath(subProp.targetArray, subProp.targetArrayKey, selectColumn, subProp.key, $event) : setValueByPath(subProp.key, $event.target.value) ) : setValueByPath(subProp.key, $event.target.value)\" />\n\n <input *ngIf=\"subProp.type === 'boolean'\" type=\"checkbox\" [checked]=\"getValueByPath(subProp.key)\"\n (change)=\"setValueByPath(subProp.key, $event.target.checked)\" />\n <select *ngIf=\"subProp.type === 'select'\" [value]=\"getValueByPath(subProp.key)\"\n (change)=\"setValueByPath(subProp.key, $event.target.value)\">\n <option *ngFor=\"let option of subProp.options\" [value]=\"option\">{{ option }}</option>\n </select>\n <input *ngIf=\"subProp.type === 'checkbox'\" type=\"checkbox\" [checked]=\"getValueByPath(subProp.key)\"\n (change)=\"setValueByPath(subProp.key, $event.target.checked)\" />\n </div>\n </div>\n </div>\n </div>\n\n <!-- SKS20MAR25 Text Align Buttons -->\n <div *ngIf=\"prop.type === 'align'\">\n <button *ngFor=\"let option of prop.options\" (click)=\"onAlignSelect(option.value)\"\n [class.active]=\"selectedElement?.textAlign === option.value\" [title]=\"option.value\">\n <img [src]=\"'../assets/icons/' + option.icon + '.svg'\" [alt]=\"option.value\" class=\"icon-size\" />\n </button>\n </div>\n\n <div *ngIf=\"prop.type === 'style'\">\n <button *ngFor=\"let option of prop.options\" (click)=\"onStyleSelect(option.value)\"\n [class.active]=\"isStyleActive(option.value)\" [title]=\"option.value\">\n <img [src]=\"'../assets/icons/' + option.icon + '.svg'\" [alt]=\"option.value\" class=\"icon-size\" />\n </button>\n </div>\n\n <!-- Field Size Controls -->\n <!-- Change key width -->\n <div *ngIf=\"prop.key === 'width'\" [ngClass]=\"{'flex-container': true, 'custom-active': selectedElement?.width !== '*' && selectedElement?.width !== 'auto'}\">\n <select\n class=\"size-select\"\n [value]=\"selectedElement?.width === '*' ? 'Default' : selectedElement?.width === 'auto' ? 'Auto' : 'Custom'\"\n (change)=\"onWidthSelect(\n $event.target.value === 'Default' ? '*' :\n $event.target.value === 'Auto' ? 'auto' : 'custom'\n )\">\n <option value=\"Default\">Default</option>\n <option value=\"Auto\">Auto</option>\n <option value=\"Custom\">Custom</option>\n </select>\n \n <input\n *ngIf=\"selectedElement?.width !== '*' && selectedElement?.width !== 'auto'\"\n type=\"number\"\n class=\"size-input\"\n min=\"1\"\n max=\"100\"\n [value]=\"selectedElement?.width\"\n (input)=\"setValueByPath(\n 'width',\n $event.target.valueAsNumber < 1 ? 1 :\n $event.target.valueAsNumber > 100 ? 100 :\n $event.target.valueAsNumber\n )\" />\n </div> \n\n <!-- Line Properties -->\n <!-- Padding Top -->\n <div *ngIf=\"prop.key === 'paddingTop'\">\n <input type=\"number\" [placeholder]=\"prop.placeholder\" [value]=\"selectedElement?.paddingTop\"\n (input)=\"setValueByPath('paddingTop', $event.target.value)\" />\n </div>\n\n <!-- Padding Bottom -->\n <div *ngIf=\"prop.key === 'paddingBottom'\">\n <input type=\"number\" [placeholder]=\"prop.placeholder\" [value]=\"selectedElement?.paddingBottom\"\n (input)=\"setValueByPath('paddingBottom', $event.target.value)\" />\n </div>\n\n <!-- Line Style -->\n <div *ngIf=\"prop.key === 'lineStyle'\">\n <select [value]=\"selectedElement?.lineStyle\" (change)=\"setValueByPath('lineStyle', $event.target.value)\">\n <option *ngFor=\"let option of prop.options\" [value]=\"option\">{{ option }}</option>\n </select>\n </div>\n\n <!-- Color -->\n <div *ngIf=\"prop.key === 'color'\">\n <input type=\"color\" [value]=\"selectedElement?.color\"\n (input)=\"setValueByPath('color', $event.target.value)\" />\n </div>\n\n </div>\n </ng-container>\n </div>\n </div>\n <div class=\"tab-content\" *ngIf=\"activeTab === 'property'\">\n <!-- Field Elements Properties -->\n <!-- Show elements ID -->\n <div *ngIf=\"getProperties()\">\n <label>Label Id</label>\n <div\n style=\"font-size: 13px; padding: 11px; border-radius: 5px; background-color: #f8f8f8; border: 1px solid #ddd;\">\n {{ headerSelect ? bookId : selectedElement.id }}</div>\n <ng-container *ngFor=\"let prop of getProperties().fieldProps\">\n <div class=\"form-group\">\n <label class=\"text-sm\">{{ prop.label }}</label>\n\n <!-- SKS21MAR25 Toggle Group -->\n <div *ngIf=\"prop.type === 'toggleGroup'\" class=\"toggle-group\">\n <div class=\"toggle-item\">\n <label class=\"toggle-label\">\n <input type=\"checkbox\" />\n Disabled\n </label>\n </div>\n </div>\n\n <!-- - handled options with UUID -->\n <div\n *ngIf=\"prop.type === 'dropdown' || prop.type === 'checkbox' || prop.type === 'radio' && prop.key === 'options'\"\n class=\"options-container\">\n\n <div class=\"option-list\" (dragover)=\"onDragOver($event)\" (drop)=\"onDrop($event, prop.key)\">\n <div *ngFor=\"let option of selectedElement[prop.key]\" class=\"option-items\" [attr.data-id]=\"option.id\"\n draggable=\"true\" (dragstart)=\"onDragStart($event, option.id)\">\n\n <input type=\"text\" [(ngModel)]=\"option.value\" placeholder=\"Option\" class=\"options\" />\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeOption(selectedElement[prop.key], option.id)\">\n <span class=\"drag-handle\">\u2630</span>\n </div>\n </div>\n\n <button (click)=\"addOption(selectedElement[prop.key])\">\n <div class=\"add-varient\">\n <span class=\"text-lg\">+</span>\n <span>Add</span>\n </div>\n </button>\n </div>\n\n <input *ngIf=\"prop.type === 'text'\" type=\"text\" [placeholder]=\"prop.placeholder\"\n [value]=\"headerSelect ? pdf.title : (selectedElement?.type === 'Table' ? (prop.targetArray ? getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn, prop.key ) : getValueByPath(prop.key) ) : getValueByPath(prop.key))\"\n (input)=\"headerSelect ? updateTitle($event.target.value) : (selectedElement?.type === 'Table' ? (prop.targetArray ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn, prop.key, $event) : setValueByPath(prop.key, $event.target.value) ) : setValueByPath(prop.key, $event.target.value))\"\n [class.read-only]=\"selectedElement.readOnly\" [readonly]=\"selectedElement.readOnly\" />\n\n <!-- Sub Questions Toggle -->\n <div *ngIf=\"prop.type === 'subQuestion'\">\n <div class=\"style-toggle-header\" (click)=\"toggleSubQuestion(prop)\">\n <div class=\"head-elements\">Sub Text</div>\n <img [src]=\"prop.isExpanded ? '../assets/icons/arrow-down.svg' : '../assets/icons/arrow-right.svg'\"\n alt=\"Toggle Arrow\" class=\"arrow-icon\">\n </div>\n\n <!-- Render subquestions when arrow is down -->\n <div *ngIf=\"prop.isExpanded\" style=\"border: 1px solid #ddd; padding: 8px; border-radius: 4px;\">\n <div *ngFor=\"let subProp of prop.subQuestion\" class=\"sub-question-container\">\n <div class=\"form-group\">\n <label>{{ subProp.label }}</label>\n\n <input *ngIf=\"subProp.type === 'text'\" type=\"text\" [placeholder]=\"subProp.placeholder\"\n [value]=\"getValueByPath(subProp.key)\" (input)=\"setValueByPath(subProp.key, $event.target.value)\" />\n \n <!-- Render input field only if subProp.type is 'array' -->\n <input *ngIf=\"subProp.type === 'array'\" type=\"text\" [placeholder]=\"subProp.placeholder\"\n [value]=\"getValueByPath(subProp.key)\" (input)=\"setValueByPath(subProp.key, $event.target.value)\" />\n <!-- <input type=\"text\" [ngModel]=\"fieldAsString\" (ngModelChange)=\"updateField($event)\" /> -->\n\n <input *ngIf=\"subProp.type === 'boolean'\" type=\"checkbox\" [checked]=\"getValueByPath(subProp.key)\"\n (change)=\"setValueByPath(subProp.key, $event.target.checked)\" />\n </div>\n </div>\n </div>\n </div>\n\n <div *ngIf=\"prop.type === 'checkbox'\">\n <span class=\"toggle-label\" style=\"padding-right: 10px;\">{{ prop.label }}</span>\n <input type=\"checkbox\"\n [checked]=\"selectedElement.type === 'Table' ? (prop.targetArray ? getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn, prop.key ) : getValueByPath(prop.key) ): getValueByPath(prop.key) \"\n (change)=\" selectedElement.type === 'Table' ? (prop.targetArray ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn, prop.key, $event) : onToggleChange(prop.key, $event) ) : onToggleChange(prop.key, $event)\" />\n\n </div>\n\n </div>\n </ng-container>\n\n <!-- SKS21MAR25 Move Style Outside the Loop -->\n <!-- Style Toggle -->\n <div class=\"style-toggle-header\" (click)=\"toggleStyleSection()\">\n <div class=\"head-elements\">Style</div>\n <img [src]=\"isStyleExpanded ? '../assets/icons/arrow-down.svg' : '../assets/icons/arrow-right.svg'\"\n alt=\"Toggle Arrow\" class=\"arrow-icon\">\n </div>\n\n <div *ngIf=\"isStyleExpanded\" style=\"border: 1px solid #ddd; padding: 8px; border-radius: 4px;\">\n <div class=\"form-group\">\n <div *ngFor=\"let key of getStyleKeys()\">\n <label>{{ key }}</label>\n <input type=\"text\" [(ngModel)]=\"selectedElement.style[key]\"\n (input)=\"setValueByPath('style.' + key, $event.target.value)\" placeholder=\"Enter {{ key }}\" />\n </div>\n </div>\n </div>\n\n </div>\n </div>\n <div class=\"tab-content\" *ngIf=\"activeTab === 'appearance'\">\n <div *ngIf=\"getProperties()\">\n <ng-container *ngFor=\"let prop of getProperties().appearance\">\n <div class=\"form-group\">\n <label class=\"text-sm\">{{ prop.label }}</label>\n <!-- Font Selection -->\n <div *ngIf=\"prop.key === 'font'\">\n <select *ngIf=\"prop.type === 'select'\" class=\"select-container\" [(ngModel)]=\"selectedElement.font\"\n (change)=\"setValueByPath('font', $event.target.value)\">\n <option *ngFor=\"let option of prop.options\" [value]=\"option\">\n {{ option }}\n </option>\n </select>\n </div>\n <!-- Input Box -->\n <input *ngIf=\"prop.type === 'text'\" type=\"text\" [placeholder]=\"prop.placeholder\"\n [value]=\"selectedElement[prop.key]\" (input)=\"setValueByPath(prop.key, $event.target.value)\" />\n\n <!-- Font Size -->\n <div *ngIf=\"prop.key === 'fontSize' && prop.type === 'number'\">\n <input type=\"number\" min=\"1\" max=\"100\" step=\"1\"\n [(ngModel)]=\"selectedElement.fontSize\"\n (change)=\"setValueByPath('fontSize', selectedElement.fontSize)\" />\n </div>\n <!-- Font Weight Selection -->\n <div *ngIf=\"prop.key === 'fontWeight'\">\n <select *ngIf=\"prop.type === 'select'\" [(ngModel)]=\"selectedElement[prop.key]\"\n (change)=\"setValueByPath(prop.key, $event.target.value)\">\n <option *ngFor=\"let option of prop.options\" [value]=\"option.value\">\n {{ option.label }}\n </option>\n </select>\n </div>\n\n <div class=\"flex-container\">\n <!-- Dropdown Box -->\n <div *ngIf=\"prop.type === 'dropdown'\" class=\"input-box-field\">\n <select [(ngModel)]=\"selectedElement[prop.key]\" (change)=\"setValueByPath(prop.key, $event.target.value)\">\n <option *ngFor=\"let option of prop.options\" [value]=\"option\">\n {{ option }}\n </option>\n </select>\n </div>\n\n <!-- Color Picker -->\n <div *ngIf=\"prop.type === 'color'\" class=\"color-selector\">\n <input type=\"color\" [(ngModel)]=\"selectedElement.fontColor\"\n (change)=\"setValueByPath('fontColor', $event.target.value)\">\n </div>\n\n <!-- HEX Input Box -->\n <div *ngIf=\"prop.type === 'color'\" class=\"hex-input-container\">\n <span>HEX Code</span>\n <input type=\"text\" [(ngModel)]=\"selectedElement[prop.key]\"\n (change)=\"setValueByPath(prop.key, $event.target.value)\" />\n </div>\n </div>\n\n <!-- Font Style -->\n<div *ngIf=\"prop.key === 'fontStyle'\">\n <select [(ngModel)]=\"selectedElement.fontStyle\"\n (change)=\"setValueByPath('fontStyle', $event.target.value)\">\n <option *ngFor=\"let option of prop.options\" [value]=\"option.value\">\n {{ option.label }}\n </option>\n </select>\n</div>\n\n<!-- margin: [0, 10, 0, 0] // [ left, top, right, bottom ] -->\n<div *ngIf=\"prop.key === 'margin'&& selectedElement?.margin\">\n <div class=\"margin-inputs\">\n <div>\n <label>Right</label>\n <input type=\"number\" [(ngModel)]=\"selectedElement.margin[1]\"\n (change)=\"setValueByPath('margin', selectedElement.margin)\" />\n </div>\n <div>\n <label>Bottom</label>\n <input type=\"number\" [(ngModel)]=\"selectedElement.margin[2]\"\n (change)=\"setValueByPath('margin', selectedElement.margin)\" />\n </div>\n <div>\n <label>Left</label>\n <input type=\"number\" [(ngModel)]=\"selectedElement.margin[3]\"\n (change)=\"setValueByPath('margin', selectedElement.margin)\" />\n </div>\n <div>\n <label>Top</label>\n <input type=\"number\" [(ngModel)]=\"selectedElement.margin[0]\"\n (change)=\"setValueByPath('margin', selectedElement.margin)\" />\n </div>\n </div>\n</div>\n\n <!-- TextAlign -->\n <div *ngIf=\"prop.key === 'alignItems'\">\n <select [(ngModel)]=\"selectedElement.alignItems\"\n (change)=\"setValueByPath('alignItems', $event.target.value)\">\n <option *ngFor=\"let option of prop.options\" [value]=\"option.value\">\n {{ option.label }}\n </option>\n </select>\n </div> \n\n </div>\n </ng-container>\n </div>\n </div>\n\n<!-- Default Save Button -->\n<div class=\"button-container\" *ngIf=\"!templateSelected\">\n <button class=\"cancel-btn\" (click)=\"onCancel()\">Cancel</button>\n <button class=\"save-btn\" (click)=\"handleButtonClick()\">Save</button>\n</div>\n</div>\n", styles: ["@import\"https://fonts.googleapis.com/css?family=Roboto:300,400,500&display=swap\";*{margin:0;padding:0;box-sizing:border-box;font-family:Roboto,sans-serif}.properties{height:calc(100vh - 20px);overflow-y:auto}.design-header{display:flex;justify-content:center;align-items:center;padding:15px 20px;background:#fff;border-radius:8px;box-shadow:0 2px 10px #0000001a;margin-bottom:20px}.header-title{font-size:20px;font-weight:400;color:#222}.all-properties details{background:#fff;border:1px solid #ddd;border-radius:8px;margin-bottom:12px;padding:12px;box-shadow:0 2px 8px #0000000d}.all-properties summary{font-size:15px;font-weight:400;cursor:pointer;padding:6px;transition:color .3s}.all-properties summary:hover{color:#007bff}.inner-content{padding:12px 0}.head-elements{font-size:14px;font-weight:500;color:#444}label{font-size:14px;font-weight:500;color:#444;margin-bottom:5px;display:block}input[type=text],input[type=number],select{width:100%;height:40px;padding:10px;font-size:14px;border:1px solid #ccc;border-radius:6px;outline:none;transition:.3s;background:#f8f8f8;text-align:left}input:focus,select:focus{border-color:#007bff;background:#fff;box-shadow:0 0 5px #007bff4d}button{padding:10px 15px;border:none;border-radius:6px;background:#007bff;color:#fff;font-size:15px;cursor:pointer;transition:.3s}button:hover{background:#0056b3;transform:translateY(-2px)}.toggle-group{display:flex;align-items:center;gap:20px}.toggle-item{display:flex;align-items:center;gap:10px}.switch{position:relative;width:42px;height:22px}.switch input{opacity:0;width:0;height:0}.slider{position:absolute;cursor:pointer;inset:0;background-color:#ccc;transition:.4s;border-radius:24px}.slider:before{position:absolute;content:\"\";height:20px;width:20px;left:1px;bottom:1px;background-color:#fff;transition:.4s;border-radius:50%}input:checked+.slider{background-color:#2196f3}input:checked+.slider:before{transform:translate(18px)}.radio-item{display:flex;align-items:center;gap:20px}.radio-item input{accent-color:#007bff}.options-container{display:flex;flex-direction:column;gap:12px}.options{width:100%}.field-size-controls{display:flex;align-items:center;gap:12px}.size-input{width:110px;text-align:center}.design-footer{display:flex;justify-content:space-between;margin-top:20px}.design-footer .btn{background:#007bff;color:#fff;padding:10px 18px;border-radius:6px;font-size:15px;transition:.3s}.design-footer .btn:hover{background:#0056b3}.input-container{display:flex;flex-direction:column;align-items:flex-start;gap:10px;width:100%}.subtext-textarea{width:100%;margin-left:auto}.container{width:100%;max-width:500px;margin:0 auto;background-color:#fff;box-shadow:0 2px 10px #0000001a;overflow:hidden;font-family:Arial,sans-serif}.tabs{display:flex;background-color:#f0f2f5;border-bottom:2px solid #0052cc}.tab{flex:1;padding:15px 10px;text-align:center;cursor:pointer}.tab.active{background-color:#0052cc;color:#fff;font-weight:700}.tab-content{padding:20px;max-height:77vh;overflow-y:auto;overflow-x:hidden}.form-group{margin-bottom:15px}label{display:flex;gap:16px;margin-bottom:8px;color:#666;font-size:14px}.required:before{content:\"*\";color:red;margin-right:3px}input[type=text],select{width:100%;padding:10px;border:1px solid #ddd;border-radius:4px;box-sizing:border-box;font-size:14px}.select-container{position:relative;width:100%}.dropdown-arrow{position:absolute;right:10px;top:50%;transform:translateY(-50%);pointer-events:none;color:#666;font-size:12px}.checkbox-row{display:flex;margin-bottom:10px}.checkbox-group{display:flex;align-items:center;margin-right:20px;min-width:120px}.checkbox-group input[type=checkbox]{margin-right:5px}.toggle-header{display:flex;align-items:center;justify-content:space-between;cursor:pointer;padding:10px}.arrow-icon{width:19px;height:23px;transition:transform .3s ease}.icon{display:inline-block;width:18px;height:18px;border-radius:50%;text-align:center;line-height:18px;color:#fff;font-size:12px;margin-left:5px}.edit-icon{background-color:#4caf50}.view-icon{background-color:#2196f3}.delete-icon{background-color:#f44336}.color-picker-row{display:flex;align-items:center}.color-picker-container{display:flex;align-items:center;border:1px solid #ddd;border-radius:4px;margin-right:10px}.color-box{width:30px;border:none;height:30px}.hex-label{color:#999;margin-right:5px}.hex-input{width:100px}.divider{border-top:1px dashed #ddd;margin:20px 0}.button-container{display:flex;padding:15px;background-color:#f9f9f9;border-top:1px solid #eee}.cancel-btn,.save-btn{padding:12px;border:none;border-radius:4px;cursor:pointer;font-weight:700}.cancel-btn{flex:1;background-color:#fff;color:#666;border:1px solid #ddd;margin-right:10px}.cancel-btn:hover{background-color:#0052cc!important;color:#fff!important}.save-btn{flex:1;background-color:#0052cc;color:#fff}.toggle-group{display:grid;grid-template-columns:1fr 1fr;gap:10px}.toggle-item{display:flex;align-items:center;padding:8px}textarea{width:100%;min-height:55px;padding:8px;border:1px solid #ccc;border-radius:5px;font-size:14px;resize:vertical}.flex-container{display:flex;align-items:center;gap:12px;margin-bottom:1rem}.input-box-field select{background-color:#28343e;color:#fff;border:none;padding:10px 14px;border-radius:6px;appearance:none;-webkit-appearance:none;-moz-appearance:none;position:relative;font-size:14px;font-family:inherit}.input-box-field{position:relative}.input-box-field select::-ms-expand{display:none}.input-box-field:after{content:\"\\25bc\";position:absolute;top:50%;right:10px;transform:translateY(-50%);color:#1c1b1f;pointer-events:none;font-size:10px}.color-selector input[type=color]{width:78px;height:40px;border-radius:4px;background:none;cursor:pointer}.hex-input-container{display:flex;font-size:12px;gap:20px;color:#b0b0b0;align-items:center}.hex-input-container span{font-size:14px;margin-top:10px}.hex-input-container input[type=text]{padding:10px 12px;border:1px solid #d1d1d1;border-radius:6px;font-size:14px;width:120px;color:#28343e}input{width:auto}@media screen and (max-width: 1099px){.container{height:calc(100vh - 20px);min-height:calc(100vh - 20px)}.tabs{flex-direction:column}.tab{flex:1;padding:1rem;font-size:.9rem;text-align:center}.form-group{flex-direction:column}}@media screen and (max-width: 768px){.container{height:calc(100vh - 20px) h;min-height:calc(100vh - 20px)}.tabs{flex-direction:column}.tab{flex:1;padding:1rem;font-size:.9rem;text-align:center}.form-group{flex-direction:column}}@media screen and (max-width: 480px){.container{padding:0 10px}.tabs{flex-direction:column}.tab{flex:1;padding:1rem;border-bottom:1px solid #dee2e6}input[type=text],input[type=number],select,textarea{font-size:.9rem}}@media screen and (max-width: 768px){.tab-content[aria-label=attributes] .form-group,.tab-content[aria-label=property] .form-group,.tab-content[aria-label=appearance] .form-group{grid-template-columns:1fr}.toggle-group{flex-direction:column;align-items:flex-start}}.logo-icon{width:20px;height:20px;display:flex;justify-content:center;background-color:#d0d9ff;border-radius:4px}.link-icon{background-color:#e7f2ff;padding:5px;border-radius:5px;margin:5px;display:inline-block;cursor:pointer;position:relative;transition:background-color .3s,transform .2s}.link-icon:hover{background-color:#d0e5ff}.link-icon:active{background-color:#a8d0ff}.link-dropdown-menu{position:absolute;top:100%;right:0;background:#fff;border:1px solid #ccc;padding:10px;width:200px;box-shadow:0 4px 6px #0000001a}.link-dropdown-menu input{width:100%;margin-bottom:5px;padding:5px;border:1px solid #ccc;border-radius:3px}.option-items{display:flex;align-items:center;padding:5px;border:1px solid #ccc;margin-bottom:10px;cursor:grab;background:#fff}.drag-handle{margin-left:10px;cursor:grab}.option-items:active{opacity:.5}.style-toggle-header{display:flex;justify-content:space-between;align-items:center;background-color:#f8f8f8;border:1px solid #ddd;padding:10px;border-radius:6px;cursor:pointer;margin-bottom:6px}.button-toggle-wrapper{margin-top:8px}.toggle-button{padding:8px 16px;border:1px solid #cbd2d9;border-radius:6px;font-size:14px;cursor:pointer;transition:all .2s ease-in-out}.toggle-button.active:hover{background-color:#2c6dd5}.flex-container{display:flex;gap:8px;align-items:center}.size-select{transition:width .3s ease;width:100%;max-width:200px}.flex-container.custom-active .size-select{max-width:100px}.size-input{width:60px}.margin-inputs{display:flex;gap:15px;margin-top:5px}.margin-inputs>div{display:flex;flex-direction:column;width:60px}.margin-inputs label{font-size:12px;margin-bottom:3px}.pdf-actions-container{width:100%;max-width:400px;padding:10px}.pdf-action-card{background-color:#fff;border-radius:6px;padding:9px;box-shadow:0 2px 6px #0000001a;display:flex;flex-direction:column;gap:10px}.pdf-btn{display:flex;align-items:center;justify-content:center;gap:8px;padding:10px;background-color:#6c757d;color:#fff;border:none;border-radius:4px;cursor:pointer;font-size:14px;transition:background-color .2s}.pdf-btn:hover{background-color:#5a6268}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i5.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i5.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i5.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i5.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: NxtSearchBox, selector: "nxt-search-box", inputs: ["placeHolderText", "question", "apiMeta", "id", "readOnly", "mode", "from"], outputs: ["searchValueChange"] }, { kind: "component", type: ImageCropperComponent, selector: "image-cropper", inputs: ["imageChangedEvent", "imageURL", "imageBase64", "imageFile", "imageAltText", "options", "cropperFrameAriaLabel", "output", "format", "autoCrop", "cropper", "transform", "maintainAspectRatio", "aspectRatio", "resetCropOnAspectRatioChange", "resizeToWidth", "resizeToHeight", "cropperMinWidth", "cropperMinHeight", "cropperMaxHeight", "cropperMaxWidth", "cropperStaticWidth", "cropperStaticHeight", "canvasRotation", "initialStepSize", "roundCropper", "onlyScaleDown", "imageQuality", "backgroundColor", "containWithinAspectRatio", "hideResizeSquares", "allowMoveImage", "checkImageType", "alignImage", "disabled", "hidden"], outputs: ["imageCropped", "startCropImage", "imageLoaded", "cropperReady", "loadImageFailed", "transformChange", "cropperChange"] }] });
|
|
1098
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: PdfPropertiesComponent, isStandalone: true, selector: "app-pdf-properties", inputs: { selectedElementType: "selectedElementType", templateSelected: "templateSelected" }, outputs: { formButtonHandler: "formButtonHandler", templateSaveHandler: "templateSaveHandler" }, host: { listeners: { "document:click": "onClickOutside($event)" } }, viewQueries: [{ propertyName: "dropdown", first: true, predicate: ["dropdown"], descendants: true }], ngImport: i0, template: "<!-- - Field and Element Properties -->\n<div class=\"container\">\n <div class=\"tabs\">\n <div class=\"tab\" [ngClass]=\"{'active': activeTab === 'attributes'}\" (click)=\"setActiveTab('attributes')\">\n {{ 'ATTRIBUTES' | nxtCustomTranslate : 'Attributes' }}\n </div>\n <div class=\"tab\" [ngClass]=\"{'active': activeTab === 'property'}\" (click)=\"setActiveTab('property')\">\n {{ 'PROPERTY' | nxtCustomTranslate : 'Property' }}\n </div>\n <div class=\"tab\" [ngClass]=\"{'active': activeTab === 'appearance'}\" (click)=\"setActiveTab('appearance')\">\n {{ 'APPEARANCE' | nxtCustomTranslate : 'Appearance' }}\n </div>\n </div>\n\n <div class=\"tab-content\" *ngIf=\"activeTab === 'attributes'\">\n <!-- Element Properrties -->\n <!-- Select element type show -->\n <div *ngIf=\"getProperties()\">\n <!-- SKS25MAR25 this is for image edit -->\n <div *ngIf=\"selectedElement?.type === 'image'\">\n <image-cropper *ngIf=\"selectedElement.imageData \" [imageBase64]=\"selectedElement.orgImageData\"\n [disabled]=\"false\" [alignImage]=\"alignImage\" [roundCropper]=\"roundCropper\" [backgroundColor]=\"'white'\"\n imageAltText=\"Alternative image text\" [allowMoveImage]=\"false\" [hideResizeSquares]=\"false\"\n [canvasRotation]=\"canvasRotation\" [aspectRatio]=\"aspectRatio\" [containWithinAspectRatio]=\"false\"\n [maintainAspectRatio]=\"false\" [cropperStaticWidth]=\"cropperStaticWidth\"\n [cropperStaticHeight]=\"cropperStaticHeight\" [cropperMinWidth]=\"cropperMinWidth\"\n [cropperMinHeight]=\"cropperMinHeight\" [cropperMaxWidth]=\"cropperMaxWidth\"\n [cropperMaxHeight]=\"cropperMaxHeight\" [resetCropOnAspectRatioChange]='true' [(cropper)]=\"cropper\"\n [(transform)]=\"transform\" [onlyScaleDown]=\"true\" output=\"blob\" format=\"png\"\n (imageCropped)=\"imageCropped($event)\" (cropperReady)=\"cropperReady($event)\"></image-cropper>\n <div *ngIf=\"selectedElement.imageData \" style=\"display: flex; gap: 2px;\">\n <div class=\"cursor-pointer logo-icon\" (click)=\"rotateLeft()\" title=\"Rotate Left\">\u27F2</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"rotateRight()\" title=\"Rotate Right\">\u27F3</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"zoomOut()\" title=\"Zoom Out\">-</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"zoomIn()\" title=\"Zoom In\">+</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"moveLeft()\" title=\"Move Left\">\u2190</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"moveRight()\" title=\"Move Right\">\u2192</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"moveUp()\" title=\"Move Up\">\u2191</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"moveDown()\" title=\"Move Down\">\u2193</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"flipHorizontal()\" [class.enabled]=\"transform.flipH\"\n title=\"Flip Horizontally\">\u2194</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"flipVertical()\" [class.enabled]=\"transform.flipV\"\n title=\"Flip Vertically\">\u2195</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"resetImage()\" title=\"Reset\">\u00D7</div>\n </div>\n </div>\n <!-- SKS28MAR25 search pdf specific for pdf element -->\n <div *ngIf=\"selectedElement?.type === 'Pdf'\">\n <label class=\"text-sm\">{{ 'SEARCHPDF' | nxtCustomTranslate : 'Search Pdf' }}</label>\n <div style=\"display: flex; gap: 2px; align-items: center; justify-content: center;\">\n <nxt-search-box [question]=\"selectedElement\" [readOnly]=\"selectedElement.isReadOnly\" [apiMeta]=\"bookSubtext\"\n [placeHolderText]=\"selectedElement.question || ''\"\n [mode]=\"'edit'\"\n (searchValueChange)=\"childEventCapture($event)\">\n </nxt-search-box>\n <div class=\"link-icon\">\n <svg (click)=\"linkToggleDropdown($event)\" fill=\"#000000\" version=\"1.1\" id=\"Capa_1\"\n xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"24px\" height=\"24px\"\n viewBox=\"0 0 450 450\" xml:space=\"preserve\">\n <g>\n <g>\n <g>\n <path d=\"M318.15,230.195l77.934-77.937c31.894-31.892,31.894-83.782-0.004-115.674l-12.66-12.66\n c-31.893-31.896-83.78-31.896-115.674-0.004l-77.937,77.934c-17.588,17.588-25.457,41.264-23.646,64.311\n c-23.045-1.813-46.722,6.056-64.308,23.647L23.92,267.748c-31.894,31.889-31.894,83.779,0,115.674l12.664,12.662\n c31.893,31.893,83.783,31.893,115.674,0l77.935-77.936c17.592-17.59,25.459-41.266,23.647-64.309\n C276.884,255.654,300.56,247.783,318.15,230.195z M202.653,290.605l-77.936,77.938c-16.705,16.703-43.889,16.703-60.59,0\n l-12.666-12.666c-16.705-16.701-16.703-43.885,0-60.594l77.936-77.932c14.14-14.141,35.779-16.306,52.226-6.516l-32.302,32.307\n c-7.606,7.604-7.606,19.938,0,27.541c7.605,7.607,19.937,7.607,27.541,0l32.306-32.303\n C218.959,254.828,216.795,276.469,202.653,290.605z M238.382,209.169l32.299-32.306c7.608-7.602,7.608-19.935,0-27.538\n c-7.604-7.61-19.936-7.61-27.541-0.004l-32.303,32.303c-9.791-16.446-7.627-38.087,6.514-52.226l77.935-77.935\n c16.707-16.707,43.89-16.707,60.594,0l12.664,12.664c16.705,16.705,16.705,43.886,0,60.591l-77.936,77.937\n C276.468,216.797,254.828,218.959,238.382,209.169z\" />\n <path d=\"M343.466,261.465c-45.287,0-82,36.713-82,82s36.713,82,82,82c45.286,0,82-36.713,82-82S388.753,261.465,343.466,261.465z\n M372.505,333.564l-56.046,56.104c-0.239,0.238-0.536,0.41-0.862,0.496l-22.315,5.85c-0.649,0.168-1.347-0.02-1.822-0.494\n c-0.477-0.479-0.666-1.172-0.496-1.824l5.826-22.318c0.084-0.326,0.256-0.627,0.494-0.863l56.047-56.104\n c0.742-0.742,1.945-0.744,2.688-0.002l4.548,4.541c0.739,0.74,0.741,1.943,0,2.688l-37.433,37.471l4.709,4.703l37.435-37.471\n c0.739-0.742,1.94-0.742,2.682-0.002l4.55,4.541C373.25,331.617,373.25,332.822,372.505,333.564z M395.472,310.574l-17,17.018\n c-0.739,0.744-1.942,0.744-2.685,0.002l-16.489-16.475c-0.744-0.74-0.744-1.943-0.002-2.688l17-17.02\n c0.741-0.74,1.944-0.74,2.688-0.002l16.487,16.477C396.216,308.629,396.216,309.832,395.472,310.574z\" />\n </g>\n </g>\n </g>\n </svg>\n <div class=\"link-dropdown-menu\" *ngIf=\"isLinkDropdownOpen\" #dropdown>\n <label>{{ 'ENDPOINT' | nxtCustomTranslate : 'Endpoint' }}:</label>\n <input type=\"text\" [(ngModel)]=\"bookSubtext.endpoint\" />\n\n <label>{{ 'VARIABLE' | nxtCustomTranslate : 'Variable' }}:</label>\n <input type=\"text\" [(ngModel)]=\"bookSubtext.variable\" />\n\n <label>{{ 'FIELD' | nxtCustomTranslate : 'Field' }}:</label>\n <input type=\"text\" [ngModel]=\"fieldAsString\" (ngModelChange)=\"updateField($event)\" />\n\n <label>{{ 'DEFAULTFIELD' | nxtCustomTranslate : 'Default Field' }}:</label>\n <input type=\"text\" [(ngModel)]=\"bookSubtext.defaultField\" />\n </div>\n </div>\n </div>\n </div>\n <ng-container *ngFor=\"let prop of getProperties().elementProps\">\n <div class=\"form-group\">\n <label *ngIf=\"prop.type !== 'checkbox' && prop.type !== 'subQuestion'\" class=\"text-sm\">{{ prop.labelPath | nxtCustomTranslate : prop.label \n }}</label>\n\n <!-- Text Input -->\n <input *ngIf=\"prop.type === 'text'\" type=\"text\" [placeholder]=\"prop.placeholder\"\n [value]=\"headerSelect ? pdf.title : (selectedElement?.type === 'Table' ? (prop.targetArray ? getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn, prop.key ) : getValueByPath(prop.key) ) : getValueByPath(prop.key))\"\n (input)=\"headerSelect ? updateTitle($event.target.value) : (selectedElement?.type === 'Table' ? (prop.targetArray ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn, prop.key, $event) : setValueByPath(prop.key, $event.target.value) ) : setValueByPath(prop.key, $event.target.value))\"\n [class.read-only]=\"selectedElement.readOnly\" [readonly]=\"selectedElement.readOnly\" />\n\n <!-- questionNumber -->\n <input *ngIf=\"prop.key === 'questionNumber'\" type=\"number\" [value]=\"selectedElement.questionNumber\"\n (input)=\"setValueByPath('questionNumber', $event.target.value)\" />\n\n <!-- file -->\n <!-- Add this inside the elementProps loop where other inputs are rendered -->\n <select *ngIf=\"prop.type === 'select' && prop.key === 'supportType'\" [value]=\"selectedElement[prop.key]\"\n (change)=\"setValueByPath(prop.key, $event.target.value)\">\n <option value=\"\">---Select---</option>\n <option *ngFor=\"let option of prop.options\" [value]=\"option.value\"> {{ option.labelPath | nxtCustomTranslate : option.label }} </option>\n </select>\n\n <div *ngIf=\"prop.type === 'checkbox'\">\n\n <input type=\"checkbox\"\n [checked]=\"selectedElement.type === 'Table' ? (prop.targetArray ? getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn, prop.key ) : getValueByPath(prop.key) ): getValueByPath(prop.key) \"\n (change)=\" selectedElement.type === 'Table' ? (prop.targetArray ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn, prop.key, $event) : onToggleChange(prop.key, $event) ) : onToggleChange(prop.key, $event)\" />\n <span class=\"toggle-label\" style=\"padding-left: 10px;\">{{ prop.labelPath | nxtCustomTranslate : prop.label }}</span>\n\n </div>\n <!-- SKS20MAR25 Subquestion Type -->\n <div *ngIf=\"prop.type === 'subQuestion'\">\n <div style=\"display: flex; flex-direction: row; gap: 10px; align-items: center;\">\n <div>{{ prop.labelPath | nxtCustomTranslate : prop.label }}</div>\n <input type=\"checkbox\"\n [checked]=\"selectedElement.type === 'Table' ? (prop.targetArray ? getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn, prop.key ) : getValueByPath(prop.key) ): getValueByPath(prop.key) \"\n (change)=\" selectedElement.type === 'Table' ? (prop.targetArray ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn, prop.key, $event) : onToggleChange(prop.key, $event) ) : onToggleChange(prop.key, $event)\" />\n </div>\n <!-- SKS20MAR25 Render subquestions when checkbox is checked -->\n <div\n *ngIf=\"selectedElement.type === 'Table' ? (prop.targetArray ? getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn, prop.key ) : getValueByPath(prop.key) ): getValueByPath(prop.key)\">\n <div *ngFor=\"let subProp of prop.subQuestion\"\n style=\"background-color: #e7f2ff; padding: 8px; border-radius: 4px;\">\n <div class=\"form-group\">\n <label>{{ subProp.labelPath | nxtCustomTranslate : subProp.label }}</label>\n <div *ngIf=\"subProp.type === 'array'\">\n <!-- Iterate over filtered columns to display checkboxes -->\n <div *ngFor=\"let column of filteredColumns\">\n <label>\n <input type=\"checkbox\"\n [checked]=\"subProp.operands ? subProp.operands.includes(column.apiName) : false\"\n (change)=\"onCheckboxChange(subProp.targetArray,subProp.targetArrayKey,subProp.key, column.apiName, $event.target.checked)\">\n {{ column.apiName }}\n </label>\n </div>\n </div>\n <!-- SKS21MAR25 New radio type -->\n <div *ngIf=\"subProp.type === 'radio'\">\n <div *ngFor=\"let column of filteredColumns\">\n <label>\n <input type=\"radio\" [name]=\"subProp.key\" [value]=\"column.apiName\"\n [checked]=\"getValueByArrayPath(subProp.targetArray, subProp.targetArrayKey, selectColumn, subProp.key) === column.apiName\"\n (change)=\"onRadioChange(subProp.targetArray, subProp.targetArrayKey, subProp.key, column.apiName)\">\n {{ column.apiName }}\n </label>\n </div>\n </div>\n <!-- SKS20MAR25 Add more subproperty types as needed -->\n <!-- Inside the subProp ngFor loop -->\n <input *ngIf=\"subProp.type === 'text'\" type=\"text\" [placeholder]=\"subProp.placeholder\"\n [value]=\"selectedElement.type === 'Table' ? (subProp.targetArray ? getValueByArrayPath(subProp.targetArray, subProp.targetArrayKey, selectColumn, subProp.key ) : getValueByPath(subProp.key) ) : getValueByPath(subProp.key)\"\n (input)=\"selectedElement.type === 'Table' ? (subProp.targetArray ? updateValueByArrayPath(subProp.targetArray, subProp.targetArrayKey, selectColumn, subProp.key, $event) : setValueByPath(subProp.key, $event.target.value) ) : setValueByPath(subProp.key, $event.target.value)\" />\n\n <input *ngIf=\"subProp.type === 'boolean'\" type=\"checkbox\" [checked]=\"getValueByPath(subProp.key)\"\n (change)=\"setValueByPath(subProp.key, $event.target.checked)\" />\n <select *ngIf=\"subProp.type === 'select'\" [value]=\"getValueByPath(subProp.key)\"\n (change)=\"setValueByPath(subProp.key, $event.target.value)\">\n <option *ngFor=\"let option of subProp.options\" [value]=\"option\">{{ option }}</option>\n </select>\n <input *ngIf=\"subProp.type === 'checkbox'\" type=\"checkbox\" [checked]=\"getValueByPath(subProp.key)\"\n (change)=\"setValueByPath(subProp.key, $event.target.checked)\" />\n </div>\n </div>\n </div>\n </div>\n\n <!-- SKS20MAR25 Text Align Buttons -->\n <div *ngIf=\"prop.type === 'align'\">\n <button *ngFor=\"let option of prop.options\" (click)=\"onAlignSelect(option.value)\"\n [class.active]=\"selectedElement?.textAlign === option.value\" [title]=\"option.value\">\n <img [src]=\"'../assets/icons/' + option.icon + '.svg'\" [alt]=\"option.value\" class=\"icon-size\" />\n </button>\n </div>\n\n <div *ngIf=\"prop.type === 'style'\">\n <button *ngFor=\"let option of prop.options\" (click)=\"onStyleSelect(option.value)\"\n [class.active]=\"isStyleActive(option.value)\" [title]=\"option.value\">\n <img [src]=\"'../assets/icons/' + option.icon + '.svg'\" [alt]=\"option.value\" class=\"icon-size\" />\n </button>\n </div>\n\n <!-- Field Size Controls -->\n <!-- Change key width -->\n <div *ngIf=\"prop.key === 'width'\" [ngClass]=\"{'flex-container': true, 'custom-active': selectedElement?.width !== '*' && selectedElement?.width !== 'auto'}\">\n <select\n class=\"size-select\"\n [value]=\"selectedElement?.width === '*' ? 'Default' : selectedElement?.width === 'auto' ? 'Auto' : 'Custom'\"\n (change)=\"onWidthSelect(\n $event.target.value === 'Default' ? '*' :\n $event.target.value === 'Auto' ? 'auto' : 'custom'\n )\">\n <option value=\"Default\">{{ 'DEFAULT' | nxtCustomTranslate : 'Default' }}</option>\n <option value=\"Auto\">{{ 'AUTO' | nxtCustomTranslate : 'Auto' }}</option>\n <option value=\"Custom\">{{ 'CUSTOM' | nxtCustomTranslate : 'Custom' }}</option>\n </select>\n \n <input\n *ngIf=\"selectedElement?.width !== '*' && selectedElement?.width !== 'auto'\"\n type=\"number\"\n class=\"size-input\"\n min=\"1\"\n max=\"100\"\n [value]=\"selectedElement?.width\"\n (input)=\"setValueByPath(\n 'width',\n $event.target.valueAsNumber < 1 ? 1 :\n $event.target.valueAsNumber > 100 ? 100 :\n $event.target.valueAsNumber\n )\" />\n </div> \n\n <!-- Line Properties -->\n <!-- Padding Top -->\n <div *ngIf=\"prop.key === 'paddingTop'\">\n <input type=\"number\" [placeholder]=\"prop.placeholder\" [value]=\"selectedElement?.paddingTop\"\n (input)=\"setValueByPath('paddingTop', $event.target.value)\" />\n </div>\n\n <!-- Padding Bottom -->\n <div *ngIf=\"prop.key === 'paddingBottom'\">\n <input type=\"number\" [placeholder]=\"prop.placeholder\" [value]=\"selectedElement?.paddingBottom\"\n (input)=\"setValueByPath('paddingBottom', $event.target.value)\" />\n </div>\n\n <!-- Line Style -->\n <div *ngIf=\"prop.key === 'lineStyle'\">\n <select [value]=\"selectedElement?.lineStyle\" (change)=\"setValueByPath('lineStyle', $event.target.value)\">\n <option *ngFor=\"let option of prop.options\" [value]=\"option\">{{ option }}</option>\n </select>\n </div>\n\n <!-- Color -->\n <div *ngIf=\"prop.key === 'color'\">\n <input type=\"color\" [value]=\"selectedElement?.color\"\n (input)=\"setValueByPath('color', $event.target.value)\" />\n </div>\n\n </div>\n </ng-container>\n </div>\n </div>\n <div class=\"tab-content\" *ngIf=\"activeTab === 'property'\">\n <!-- Field Elements Properties -->\n <!-- Show elements ID -->\n <div *ngIf=\"getProperties()\">\n <label>Label Id</label>\n <div\n style=\"font-size: 13px; padding: 11px; border-radius: 5px; background-color: #f8f8f8; border: 1px solid #ddd;\">\n {{ headerSelect ? bookId : selectedElement.id }}</div>\n <ng-container *ngFor=\"let prop of getProperties().fieldProps\">\n <div class=\"form-group\">\n <label class=\"text-sm\">{{ prop.labelPath | nxtCustomTranslate : prop.label }}</label>\n\n <!-- SKS21MAR25 Toggle Group -->\n <div *ngIf=\"prop.type === 'toggleGroup'\" class=\"toggle-group\">\n <div class=\"toggle-item\">\n <label class=\"toggle-label\">\n <input type=\"checkbox\" />\n Disabled\n </label>\n </div>\n </div>\n\n <!-- - handled options with UUID -->\n <div\n *ngIf=\"prop.type === 'dropdown' || prop.type === 'checkbox' || prop.type === 'radio' && prop.key === 'options'\"\n class=\"options-container\">\n\n <div class=\"option-list\" (dragover)=\"onDragOver($event)\" (drop)=\"onDrop($event, prop.key)\">\n <div *ngFor=\"let option of selectedElement[prop.key]\" class=\"option-items\" [attr.data-id]=\"option.id\"\n draggable=\"true\" (dragstart)=\"onDragStart($event, option.id)\">\n\n <input type=\"text\" [(ngModel)]=\"option.value\" placeholder=\"Option\" class=\"options\" />\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeOption(selectedElement[prop.key], option.id)\">\n <span class=\"drag-handle\">\u2630</span>\n </div>\n </div>\n\n <button (click)=\"addOption(selectedElement[prop.key])\">\n <div class=\"add-varient\">\n <span class=\"text-lg\">+</span>\n <span>Add</span>\n </div>\n </button>\n </div>\n\n <input *ngIf=\"prop.type === 'text'\" type=\"text\" [placeholder]=\"prop.placeholder\"\n [value]=\"headerSelect ? pdf.title : (selectedElement?.type === 'Table' ? (prop.targetArray ? getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn, prop.key ) : getValueByPath(prop.key) ) : getValueByPath(prop.key))\"\n (input)=\"headerSelect ? updateTitle($event.target.value) : (selectedElement?.type === 'Table' ? (prop.targetArray ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn, prop.key, $event) : setValueByPath(prop.key, $event.target.value) ) : setValueByPath(prop.key, $event.target.value))\"\n [class.read-only]=\"selectedElement.readOnly\" [readonly]=\"selectedElement.readOnly\" />\n\n <!-- Sub Questions Toggle -->\n <div *ngIf=\"prop.type === 'subQuestion'\">\n <div class=\"style-toggle-header\" (click)=\"toggleSubQuestion(prop)\">\n <div class=\"head-elements\">Sub Text</div>\n <img [src]=\"prop.isExpanded ? '../assets/icons/arrow-down.svg' : '../assets/icons/arrow-right.svg'\"\n alt=\"Toggle Arrow\" class=\"arrow-icon\">\n </div>\n\n <!-- Render subquestions when arrow is down -->\n <div *ngIf=\"prop.isExpanded\" style=\"border: 1px solid #ddd; padding: 8px; border-radius: 4px;\">\n <div *ngFor=\"let subProp of prop.subQuestion\" class=\"sub-question-container\">\n <div class=\"form-group\">\n <label>{{ subProp.labelPath | nxtCustomTranslate : subProp.label }}</label>\n\n <input *ngIf=\"subProp.type === 'text'\" type=\"text\" [placeholder]=\"subProp.placeholder\"\n [value]=\"getValueByPath(subProp.key)\" (input)=\"setValueByPath(subProp.key, $event.target.value)\" />\n \n <!-- Render input field only if subProp.type is 'array' -->\n <input *ngIf=\"subProp.type === 'array'\" type=\"text\" [placeholder]=\"subProp.placeholder\"\n [value]=\"getValueByPath(subProp.key)\" (input)=\"setValueByPath(subProp.key, $event.target.value)\" />\n <!-- <input type=\"text\" [ngModel]=\"fieldAsString\" (ngModelChange)=\"updateField($event)\" /> -->\n\n <input *ngIf=\"subProp.type === 'boolean'\" type=\"checkbox\" [checked]=\"getValueByPath(subProp.key)\"\n (change)=\"setValueByPath(subProp.key, $event.target.checked)\" />\n </div>\n </div>\n </div>\n </div>\n\n <div *ngIf=\"prop.type === 'checkbox'\">\n <span class=\"toggle-label\" style=\"padding-right: 10px;\">{{ prop.labelPath | nxtCustomTranslate : prop.label }}</span>\n <input type=\"checkbox\"\n [checked]=\"selectedElement.type === 'Table' ? (prop.targetArray ? getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn, prop.key ) : getValueByPath(prop.key) ): getValueByPath(prop.key) \"\n (change)=\" selectedElement.type === 'Table' ? (prop.targetArray ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn, prop.key, $event) : onToggleChange(prop.key, $event) ) : onToggleChange(prop.key, $event)\" />\n\n </div>\n\n </div>\n </ng-container>\n\n <!-- SKS21MAR25 Move Style Outside the Loop -->\n <!-- Style Toggle -->\n <div class=\"style-toggle-header\" (click)=\"toggleStyleSection()\">\n <div class=\"head-elements\">Style</div>\n <img [src]=\"isStyleExpanded ? '../assets/icons/arrow-down.svg' : '../assets/icons/arrow-right.svg'\"\n alt=\"Toggle Arrow\" class=\"arrow-icon\">\n </div>\n\n <div *ngIf=\"isStyleExpanded\" style=\"border: 1px solid #ddd; padding: 8px; border-radius: 4px;\">\n <div class=\"form-group\">\n <div *ngFor=\"let key of getStyleKeys()\">\n <label>{{ key }}</label>\n <input type=\"text\" [(ngModel)]=\"selectedElement.style[key]\"\n (input)=\"setValueByPath('style.' + key, $event.target.value)\" placeholder=\"Enter {{ key }}\" />\n </div>\n </div>\n </div>\n\n </div>\n </div>\n <div class=\"tab-content\" *ngIf=\"activeTab === 'appearance'\">\n <div *ngIf=\"getProperties()\">\n <ng-container *ngFor=\"let prop of getProperties().appearance\">\n <div class=\"form-group\">\n <label class=\"text-sm\">{{ prop.labelPath | nxtCustomTranslate : prop.label }}</label>\n <!-- Font Selection -->\n <div *ngIf=\"prop.key === 'font'\">\n <select *ngIf=\"prop.type === 'select'\" class=\"select-container\" [(ngModel)]=\"selectedElement.font\"\n (change)=\"setValueByPath('font', $event.target.value)\">\n <option *ngFor=\"let option of prop.options\" [value]=\"option\">\n {{ option }}\n </option>\n </select>\n </div>\n <!-- Input Box -->\n <input *ngIf=\"prop.type === 'text'\" type=\"text\" [placeholder]=\"prop.placeholder\"\n [value]=\"selectedElement[prop.key]\" (input)=\"setValueByPath(prop.key, $event.target.value)\" />\n\n <!-- Font Size -->\n <div *ngIf=\"prop.key === 'fontSize' && prop.type === 'number'\">\n <input type=\"number\" min=\"1\" max=\"100\" step=\"1\"\n [(ngModel)]=\"selectedElement.fontSize\"\n (change)=\"setValueByPath('fontSize', selectedElement.fontSize)\" />\n </div>\n <!-- Font Weight Selection -->\n <div *ngIf=\"prop.key === 'fontWeight'\">\n <select *ngIf=\"prop.type === 'select'\" [(ngModel)]=\"selectedElement[prop.key]\"\n (change)=\"setValueByPath(prop.key, $event.target.value)\">\n <option *ngFor=\"let option of prop.options\" [value]=\"option.value\">\n {{ option.labelPath | nxtCustomTranslate : option.label }}\n </option>\n </select>\n </div>\n\n <div class=\"flex-container\">\n <!-- Dropdown Box -->\n <div *ngIf=\"prop.type === 'dropdown'\" class=\"input-box-field\">\n <select [(ngModel)]=\"selectedElement[prop.key]\" (change)=\"setValueByPath(prop.key, $event.target.value)\">\n <option *ngFor=\"let option of prop.options\" [value]=\"option\">\n {{ option }}\n </option>\n </select>\n </div>\n\n <!-- Color Picker -->\n <div *ngIf=\"prop.type === 'color'\" class=\"color-selector\">\n <input type=\"color\" [(ngModel)]=\"selectedElement.fontColor\"\n (change)=\"setValueByPath('fontColor', $event.target.value)\">\n </div>\n\n <!-- HEX Input Box -->\n <div *ngIf=\"prop.type === 'color'\" class=\"hex-input-container\">\n <span>HEX Code</span>\n <input type=\"text\" [(ngModel)]=\"selectedElement[prop.key]\"\n (change)=\"setValueByPath(prop.key, $event.target.value)\" />\n </div>\n </div>\n\n <!-- Font Style -->\n<div *ngIf=\"prop.key === 'fontStyle'\">\n <select [(ngModel)]=\"selectedElement.fontStyle\"\n (change)=\"setValueByPath('fontStyle', $event.target.value)\">\n <option *ngFor=\"let option of prop.options\" [value]=\"option.value\">\n {{ option.labelPath | nxtCustomTranslate : option.label }}\n </option>\n </select>\n</div>\n\n<!-- margin: [0, 10, 0, 0] // [ left, top, right, bottom ] -->\n<div *ngIf=\"prop.key === 'margin'&& selectedElement?.margin\">\n <div class=\"margin-inputs\">\n <div>\n <label>Right</label>\n <input type=\"number\" [(ngModel)]=\"selectedElement.margin[1]\"\n (change)=\"setValueByPath('margin', selectedElement.margin)\" />\n </div>\n <div>\n <label>Bottom</label>\n <input type=\"number\" [(ngModel)]=\"selectedElement.margin[2]\"\n (change)=\"setValueByPath('margin', selectedElement.margin)\" />\n </div>\n <div>\n <label>Left</label>\n <input type=\"number\" [(ngModel)]=\"selectedElement.margin[3]\"\n (change)=\"setValueByPath('margin', selectedElement.margin)\" />\n </div>\n <div>\n <label>Top</label>\n <input type=\"number\" [(ngModel)]=\"selectedElement.margin[0]\"\n (change)=\"setValueByPath('margin', selectedElement.margin)\" />\n </div>\n </div>\n</div>\n\n <!-- TextAlign -->\n <div *ngIf=\"prop.key === 'alignItems'\">\n <select [(ngModel)]=\"selectedElement.alignItems\"\n (change)=\"setValueByPath('alignItems', $event.target.value)\">\n <option *ngFor=\"let option of prop.options\" [value]=\"option.value\">\n {{ option.labelPath | nxtCustomTranslate : option.label }}\n </option>\n </select>\n </div> \n\n </div>\n </ng-container>\n </div>\n </div>\n\n<!-- Default Save Button -->\n<div class=\"button-container\" *ngIf=\"!templateSelected\">\n <button class=\"cancel-btn\" (click)=\"onCancel()\">Cancel</button>\n <button class=\"save-btn\" (click)=\"handleButtonClick()\">Save</button>\n</div>\n</div>\n", styles: ["@import\"https://fonts.googleapis.com/css?family=Roboto:300,400,500&display=swap\";*{margin:0;padding:0;box-sizing:border-box;font-family:Roboto,sans-serif}.properties{height:calc(100vh - 20px);overflow-y:auto}.design-header{display:flex;justify-content:center;align-items:center;padding:15px 20px;background:#fff;border-radius:8px;box-shadow:0 2px 10px #0000001a;margin-bottom:20px}.header-title{font-size:20px;font-weight:400;color:#222}.all-properties details{background:#fff;border:1px solid #ddd;border-radius:8px;margin-bottom:12px;padding:12px;box-shadow:0 2px 8px #0000000d}.all-properties summary{font-size:15px;font-weight:400;cursor:pointer;padding:6px;transition:color .3s}.all-properties summary:hover{color:#007bff}.inner-content{padding:12px 0}.head-elements{font-size:14px;font-weight:500;color:#444}label{font-size:14px;font-weight:500;color:#444;margin-bottom:5px;display:block}input[type=text],input[type=number],select{width:100%;height:40px;padding:10px;font-size:14px;border:1px solid #ccc;border-radius:6px;outline:none;transition:.3s;background:#f8f8f8;text-align:left}input:focus,select:focus{border-color:#007bff;background:#fff;box-shadow:0 0 5px #007bff4d}button{padding:10px 15px;border:none;border-radius:6px;background:#007bff;color:#fff;font-size:15px;cursor:pointer;transition:.3s}button:hover{background:#0056b3;transform:translateY(-2px)}.toggle-group{display:flex;align-items:center;gap:20px}.toggle-item{display:flex;align-items:center;gap:10px}.switch{position:relative;width:42px;height:22px}.switch input{opacity:0;width:0;height:0}.slider{position:absolute;cursor:pointer;inset:0;background-color:#ccc;transition:.4s;border-radius:24px}.slider:before{position:absolute;content:\"\";height:20px;width:20px;left:1px;bottom:1px;background-color:#fff;transition:.4s;border-radius:50%}input:checked+.slider{background-color:#2196f3}input:checked+.slider:before{transform:translate(18px)}.radio-item{display:flex;align-items:center;gap:20px}.radio-item input{accent-color:#007bff}.options-container{display:flex;flex-direction:column;gap:12px}.options{width:100%}.field-size-controls{display:flex;align-items:center;gap:12px}.size-input{width:110px;text-align:center}.design-footer{display:flex;justify-content:space-between;margin-top:20px}.design-footer .btn{background:#007bff;color:#fff;padding:10px 18px;border-radius:6px;font-size:15px;transition:.3s}.design-footer .btn:hover{background:#0056b3}.input-container{display:flex;flex-direction:column;align-items:flex-start;gap:10px;width:100%}.subtext-textarea{width:100%;margin-left:auto}.container{width:100%;max-width:500px;margin:0 auto;background-color:#fff;box-shadow:0 2px 10px #0000001a;overflow:hidden;font-family:Arial,sans-serif}.tabs{display:flex;background-color:#f0f2f5;border-bottom:2px solid #0052cc}.tab{flex:1;padding:15px 10px;text-align:center;cursor:pointer}.tab.active{background-color:#0052cc;color:#fff;font-weight:700}.tab-content{padding:20px;max-height:77vh;overflow-y:auto;overflow-x:hidden}.form-group{margin-bottom:15px}label{display:flex;gap:16px;margin-bottom:8px;color:#666;font-size:14px}.required:before{content:\"*\";color:red;margin-right:3px}input[type=text],select{width:100%;padding:10px;border:1px solid #ddd;border-radius:4px;box-sizing:border-box;font-size:14px}.select-container{position:relative;width:100%}.dropdown-arrow{position:absolute;right:10px;top:50%;transform:translateY(-50%);pointer-events:none;color:#666;font-size:12px}.checkbox-row{display:flex;margin-bottom:10px}.checkbox-group{display:flex;align-items:center;margin-right:20px;min-width:120px}.checkbox-group input[type=checkbox]{margin-right:5px}.toggle-header{display:flex;align-items:center;justify-content:space-between;cursor:pointer;padding:10px}.arrow-icon{width:19px;height:23px;transition:transform .3s ease}.icon{display:inline-block;width:18px;height:18px;border-radius:50%;text-align:center;line-height:18px;color:#fff;font-size:12px;margin-left:5px}.edit-icon{background-color:#4caf50}.view-icon{background-color:#2196f3}.delete-icon{background-color:#f44336}.color-picker-row{display:flex;align-items:center}.color-picker-container{display:flex;align-items:center;border:1px solid #ddd;border-radius:4px;margin-right:10px}.color-box{width:30px;border:none;height:30px}.hex-label{color:#999;margin-right:5px}.hex-input{width:100px}.divider{border-top:1px dashed #ddd;margin:20px 0}.button-container{display:flex;padding:15px;background-color:#f9f9f9;border-top:1px solid #eee}.cancel-btn,.save-btn{padding:12px;border:none;border-radius:4px;cursor:pointer;font-weight:700}.cancel-btn{flex:1;background-color:#fff;color:#666;border:1px solid #ddd;margin-right:10px}.cancel-btn:hover{background-color:#0052cc!important;color:#fff!important}.save-btn{flex:1;background-color:#0052cc;color:#fff}.toggle-group{display:grid;grid-template-columns:1fr 1fr;gap:10px}.toggle-item{display:flex;align-items:center;padding:8px}textarea{width:100%;min-height:55px;padding:8px;border:1px solid #ccc;border-radius:5px;font-size:14px;resize:vertical}.flex-container{display:flex;align-items:center;gap:12px;margin-bottom:1rem}.input-box-field select{background-color:#28343e;color:#fff;border:none;padding:10px 14px;border-radius:6px;appearance:none;-webkit-appearance:none;-moz-appearance:none;position:relative;font-size:14px;font-family:inherit}.input-box-field{position:relative}.input-box-field select::-ms-expand{display:none}.input-box-field:after{content:\"\\25bc\";position:absolute;top:50%;right:10px;transform:translateY(-50%);color:#1c1b1f;pointer-events:none;font-size:10px}.color-selector input[type=color]{width:78px;height:40px;border-radius:4px;background:none;cursor:pointer}.hex-input-container{display:flex;font-size:12px;gap:20px;color:#b0b0b0;align-items:center}.hex-input-container span{font-size:14px;margin-top:10px}.hex-input-container input[type=text]{padding:10px 12px;border:1px solid #d1d1d1;border-radius:6px;font-size:14px;width:120px;color:#28343e}input{width:auto}@media screen and (max-width: 1099px){.container{height:calc(100vh - 20px);min-height:calc(100vh - 20px)}.tabs{flex-direction:column}.tab{flex:1;padding:1rem;font-size:.9rem;text-align:center}.form-group{flex-direction:column}}@media screen and (max-width: 768px){.container{height:calc(100vh - 20px) h;min-height:calc(100vh - 20px)}.tabs{flex-direction:column}.tab{flex:1;padding:1rem;font-size:.9rem;text-align:center}.form-group{flex-direction:column}}@media screen and (max-width: 480px){.container{padding:0 10px}.tabs{flex-direction:column}.tab{flex:1;padding:1rem;border-bottom:1px solid #dee2e6}input[type=text],input[type=number],select,textarea{font-size:.9rem}}@media screen and (max-width: 768px){.tab-content[aria-label=attributes] .form-group,.tab-content[aria-label=property] .form-group,.tab-content[aria-label=appearance] .form-group{grid-template-columns:1fr}.toggle-group{flex-direction:column;align-items:flex-start}}.logo-icon{width:20px;height:20px;display:flex;justify-content:center;background-color:#d0d9ff;border-radius:4px}.link-icon{background-color:#e7f2ff;padding:5px;border-radius:5px;margin:5px;display:inline-block;cursor:pointer;position:relative;transition:background-color .3s,transform .2s}.link-icon:hover{background-color:#d0e5ff}.link-icon:active{background-color:#a8d0ff}.link-dropdown-menu{position:absolute;top:100%;right:0;background:#fff;border:1px solid #ccc;padding:10px;width:200px;box-shadow:0 4px 6px #0000001a}.link-dropdown-menu input{width:100%;margin-bottom:5px;padding:5px;border:1px solid #ccc;border-radius:3px}.option-items{display:flex;align-items:center;padding:5px;border:1px solid #ccc;margin-bottom:10px;cursor:grab;background:#fff}.drag-handle{margin-left:10px;cursor:grab}.option-items:active{opacity:.5}.style-toggle-header{display:flex;justify-content:space-between;align-items:center;background-color:#f8f8f8;border:1px solid #ddd;padding:10px;border-radius:6px;cursor:pointer;margin-bottom:6px}.button-toggle-wrapper{margin-top:8px}.toggle-button{padding:8px 16px;border:1px solid #cbd2d9;border-radius:6px;font-size:14px;cursor:pointer;transition:all .2s ease-in-out}.toggle-button.active:hover{background-color:#2c6dd5}.flex-container{display:flex;gap:8px;align-items:center}.size-select{transition:width .3s ease;width:100%;max-width:200px}.flex-container.custom-active .size-select{max-width:100px}.size-input{width:60px}.margin-inputs{display:flex;gap:15px;margin-top:5px}.margin-inputs>div{display:flex;flex-direction:column;width:60px}.margin-inputs label{font-size:12px;margin-bottom:3px}.pdf-actions-container{width:100%;max-width:400px;padding:10px}.pdf-action-card{background-color:#fff;border-radius:6px;padding:9px;box-shadow:0 2px 6px #0000001a;display:flex;flex-direction:column;gap:10px}.pdf-btn{display:flex;align-items:center;justify-content:center;gap:8px;padding:10px;background-color:#6c757d;color:#fff;border:none;border-radius:4px;cursor:pointer;font-size:14px;transition:background-color .2s}.pdf-btn:hover{background-color:#5a6268}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i5.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i5.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i5.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i5.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: NxtSearchBox, selector: "nxt-search-box", inputs: ["placeHolderText", "question", "apiMeta", "id", "readOnly", "mode", "from"], outputs: ["searchValueChange"] }, { kind: "component", type: ImageCropperComponent, selector: "image-cropper", inputs: ["imageChangedEvent", "imageURL", "imageBase64", "imageFile", "imageAltText", "options", "cropperFrameAriaLabel", "output", "format", "autoCrop", "cropper", "transform", "maintainAspectRatio", "aspectRatio", "resetCropOnAspectRatioChange", "resizeToWidth", "resizeToHeight", "cropperMinWidth", "cropperMinHeight", "cropperMaxHeight", "cropperMaxWidth", "cropperStaticWidth", "cropperStaticHeight", "canvasRotation", "initialStepSize", "roundCropper", "onlyScaleDown", "imageQuality", "backgroundColor", "containWithinAspectRatio", "hideResizeSquares", "allowMoveImage", "checkImageType", "alignImage", "disabled", "hidden"], outputs: ["imageCropped", "startCropImage", "imageLoaded", "cropperReady", "loadImageFailed", "transformChange", "cropperChange"] }, { kind: "pipe", type: NxtCustomTranslatePipe, name: "nxtCustomTranslate" }] });
|
|
1102
1099
|
}
|
|
1103
1100
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PdfPropertiesComponent, decorators: [{
|
|
1104
1101
|
type: Component,
|
|
1105
|
-
args: [{ selector: 'app-pdf-properties', standalone: true, imports: [CommonModule, FormsModule, NxtSearchBox, ImageCropperComponent], template: "<!-- - Field and Element Properties -->\n<div class=\"container\">\n <div class=\"tabs\">\n <div class=\"tab\" [ngClass]=\"{'active': activeTab === 'attributes'}\" (click)=\"setActiveTab('attributes')\">\n Attributes\n </div>\n <div class=\"tab\" [ngClass]=\"{'active': activeTab === 'property'}\" (click)=\"setActiveTab('property')\">\n Property\n </div>\n <div class=\"tab\" [ngClass]=\"{'active': activeTab === 'appearance'}\" (click)=\"setActiveTab('appearance')\">\n Appearance\n </div>\n </div>\n\n <div class=\"tab-content\" *ngIf=\"activeTab === 'attributes'\">\n <!-- Element Properrties -->\n <!-- Select element type show -->\n <div *ngIf=\"getProperties()\">\n <!-- SKS25MAR25 this is for image edit -->\n <div *ngIf=\"selectedElement?.type === 'image'\">\n <image-cropper *ngIf=\"selectedElement.imageData \" [imageBase64]=\"selectedElement.orgImageData\"\n [disabled]=\"false\" [alignImage]=\"alignImage\" [roundCropper]=\"roundCropper\" [backgroundColor]=\"'white'\"\n imageAltText=\"Alternative image text\" [allowMoveImage]=\"false\" [hideResizeSquares]=\"false\"\n [canvasRotation]=\"canvasRotation\" [aspectRatio]=\"aspectRatio\" [containWithinAspectRatio]=\"false\"\n [maintainAspectRatio]=\"false\" [cropperStaticWidth]=\"cropperStaticWidth\"\n [cropperStaticHeight]=\"cropperStaticHeight\" [cropperMinWidth]=\"cropperMinWidth\"\n [cropperMinHeight]=\"cropperMinHeight\" [cropperMaxWidth]=\"cropperMaxWidth\"\n [cropperMaxHeight]=\"cropperMaxHeight\" [resetCropOnAspectRatioChange]='true' [(cropper)]=\"cropper\"\n [(transform)]=\"transform\" [onlyScaleDown]=\"true\" output=\"blob\" format=\"png\"\n (imageCropped)=\"imageCropped($event)\" (cropperReady)=\"cropperReady($event)\"></image-cropper>\n <div *ngIf=\"selectedElement.imageData \" style=\"display: flex; gap: 2px;\">\n <div class=\"cursor-pointer logo-icon\" (click)=\"rotateLeft()\" title=\"Rotate Left\">\u27F2</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"rotateRight()\" title=\"Rotate Right\">\u27F3</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"zoomOut()\" title=\"Zoom Out\">-</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"zoomIn()\" title=\"Zoom In\">+</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"moveLeft()\" title=\"Move Left\">\u2190</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"moveRight()\" title=\"Move Right\">\u2192</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"moveUp()\" title=\"Move Up\">\u2191</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"moveDown()\" title=\"Move Down\">\u2193</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"flipHorizontal()\" [class.enabled]=\"transform.flipH\"\n title=\"Flip Horizontally\">\u2194</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"flipVertical()\" [class.enabled]=\"transform.flipV\"\n title=\"Flip Vertically\">\u2195</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"resetImage()\" title=\"Reset\">\u00D7</div>\n </div>\n </div>\n <!-- SKS28MAR25 search pdf specific for pdf element -->\n <div *ngIf=\"selectedElement?.type === 'Pdf'\">\n <label class=\"text-sm\">Search Pdf</label>\n <div style=\"display: flex; gap: 2px; align-items: center; justify-content: center;\">\n <nxt-search-box [question]=\"selectedElement\" [readOnly]=\"selectedElement.isReadOnly\" [apiMeta]=\"bookSubtext\"\n [placeHolderText]=\"selectedElement.question || ''\"\n [mode]=\"'edit'\"\n (searchValueChange)=\"childEventCapture($event)\">\n </nxt-search-box>\n <div class=\"link-icon\">\n <svg (click)=\"linkToggleDropdown($event)\" fill=\"#000000\" version=\"1.1\" id=\"Capa_1\"\n xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"24px\" height=\"24px\"\n viewBox=\"0 0 450 450\" xml:space=\"preserve\">\n <g>\n <g>\n <g>\n <path d=\"M318.15,230.195l77.934-77.937c31.894-31.892,31.894-83.782-0.004-115.674l-12.66-12.66\n c-31.893-31.896-83.78-31.896-115.674-0.004l-77.937,77.934c-17.588,17.588-25.457,41.264-23.646,64.311\n c-23.045-1.813-46.722,6.056-64.308,23.647L23.92,267.748c-31.894,31.889-31.894,83.779,0,115.674l12.664,12.662\n c31.893,31.893,83.783,31.893,115.674,0l77.935-77.936c17.592-17.59,25.459-41.266,23.647-64.309\n C276.884,255.654,300.56,247.783,318.15,230.195z M202.653,290.605l-77.936,77.938c-16.705,16.703-43.889,16.703-60.59,0\n l-12.666-12.666c-16.705-16.701-16.703-43.885,0-60.594l77.936-77.932c14.14-14.141,35.779-16.306,52.226-6.516l-32.302,32.307\n c-7.606,7.604-7.606,19.938,0,27.541c7.605,7.607,19.937,7.607,27.541,0l32.306-32.303\n C218.959,254.828,216.795,276.469,202.653,290.605z M238.382,209.169l32.299-32.306c7.608-7.602,7.608-19.935,0-27.538\n c-7.604-7.61-19.936-7.61-27.541-0.004l-32.303,32.303c-9.791-16.446-7.627-38.087,6.514-52.226l77.935-77.935\n c16.707-16.707,43.89-16.707,60.594,0l12.664,12.664c16.705,16.705,16.705,43.886,0,60.591l-77.936,77.937\n C276.468,216.797,254.828,218.959,238.382,209.169z\" />\n <path d=\"M343.466,261.465c-45.287,0-82,36.713-82,82s36.713,82,82,82c45.286,0,82-36.713,82-82S388.753,261.465,343.466,261.465z\n M372.505,333.564l-56.046,56.104c-0.239,0.238-0.536,0.41-0.862,0.496l-22.315,5.85c-0.649,0.168-1.347-0.02-1.822-0.494\n c-0.477-0.479-0.666-1.172-0.496-1.824l5.826-22.318c0.084-0.326,0.256-0.627,0.494-0.863l56.047-56.104\n c0.742-0.742,1.945-0.744,2.688-0.002l4.548,4.541c0.739,0.74,0.741,1.943,0,2.688l-37.433,37.471l4.709,4.703l37.435-37.471\n c0.739-0.742,1.94-0.742,2.682-0.002l4.55,4.541C373.25,331.617,373.25,332.822,372.505,333.564z M395.472,310.574l-17,17.018\n c-0.739,0.744-1.942,0.744-2.685,0.002l-16.489-16.475c-0.744-0.74-0.744-1.943-0.002-2.688l17-17.02\n c0.741-0.74,1.944-0.74,2.688-0.002l16.487,16.477C396.216,308.629,396.216,309.832,395.472,310.574z\" />\n </g>\n </g>\n </g>\n </svg>\n <div class=\"link-dropdown-menu\" *ngIf=\"isLinkDropdownOpen\" #dropdown>\n <label>Endpoint:</label>\n <input type=\"text\" [(ngModel)]=\"bookSubtext.endpoint\" />\n\n <label>Variable:</label>\n <input type=\"text\" [(ngModel)]=\"bookSubtext.variable\" />\n\n <label>Field:</label>\n <input type=\"text\" [ngModel]=\"fieldAsString\" (ngModelChange)=\"updateField($event)\" />\n\n <label>Default Field:</label>\n <input type=\"text\" [(ngModel)]=\"bookSubtext.defaultField\" />\n </div>\n </div>\n </div>\n </div>\n <ng-container *ngFor=\"let prop of getProperties().elementProps\">\n <div class=\"form-group\">\n <label *ngIf=\"prop.type !== 'checkbox' && prop.type !== 'subQuestion'\" class=\"text-sm\">{{ prop.label\n }}</label>\n\n <!-- Text Input -->\n <input *ngIf=\"prop.type === 'text'\" type=\"text\" [placeholder]=\"prop.placeholder\"\n [value]=\"headerSelect ? pdf.title : (selectedElement?.type === 'Table' ? (prop.targetArray ? getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn, prop.key ) : getValueByPath(prop.key) ) : getValueByPath(prop.key))\"\n (input)=\"headerSelect ? updateTitle($event.target.value) : (selectedElement?.type === 'Table' ? (prop.targetArray ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn, prop.key, $event) : setValueByPath(prop.key, $event.target.value) ) : setValueByPath(prop.key, $event.target.value))\"\n [class.read-only]=\"selectedElement.readOnly\" [readonly]=\"selectedElement.readOnly\" />\n\n <!-- questionNumber -->\n <input *ngIf=\"prop.key === 'questionNumber'\" type=\"number\" [value]=\"selectedElement.questionNumber\"\n (input)=\"setValueByPath('questionNumber', $event.target.value)\" />\n\n <!-- file -->\n <!-- Add this inside the elementProps loop where other inputs are rendered -->\n <select *ngIf=\"prop.type === 'select' && prop.key === 'supportType'\" [value]=\"selectedElement[prop.key]\"\n (change)=\"setValueByPath(prop.key, $event.target.value)\">\n <option value=\"\">---Select---</option>\n <option *ngFor=\"let option of prop.options\" [value]=\"option.value\"> {{ option.label }} </option>\n </select>\n\n <div *ngIf=\"prop.type === 'checkbox'\">\n\n <input type=\"checkbox\"\n [checked]=\"selectedElement.type === 'Table' ? (prop.targetArray ? getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn, prop.key ) : getValueByPath(prop.key) ): getValueByPath(prop.key) \"\n (change)=\" selectedElement.type === 'Table' ? (prop.targetArray ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn, prop.key, $event) : onToggleChange(prop.key, $event) ) : onToggleChange(prop.key, $event)\" />\n <span class=\"toggle-label\" style=\"padding-left: 10px;\">{{ prop.label }}</span>\n\n </div>\n <!-- SKS20MAR25 Subquestion Type -->\n <div *ngIf=\"prop.type === 'subQuestion'\">\n <div style=\"display: flex; flex-direction: row; gap: 10px; align-items: center;\">\n <div>{{ prop.label }}</div>\n <input type=\"checkbox\"\n [checked]=\"selectedElement.type === 'Table' ? (prop.targetArray ? getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn, prop.key ) : getValueByPath(prop.key) ): getValueByPath(prop.key) \"\n (change)=\" selectedElement.type === 'Table' ? (prop.targetArray ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn, prop.key, $event) : onToggleChange(prop.key, $event) ) : onToggleChange(prop.key, $event)\" />\n </div>\n <!-- SKS20MAR25 Render subquestions when checkbox is checked -->\n <div\n *ngIf=\"selectedElement.type === 'Table' ? (prop.targetArray ? getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn, prop.key ) : getValueByPath(prop.key) ): getValueByPath(prop.key)\">\n <div *ngFor=\"let subProp of prop.subQuestion\"\n style=\"background-color: #e7f2ff; padding: 8px; border-radius: 4px;\">\n <div class=\"form-group\">\n <label>{{ subProp.label }}</label>\n <div *ngIf=\"subProp.type === 'array'\">\n <!-- Iterate over filtered columns to display checkboxes -->\n <div *ngFor=\"let column of filteredColumns\">\n <label>\n <input type=\"checkbox\"\n [checked]=\"subProp.operands ? subProp.operands.includes(column.apiName) : false\"\n (change)=\"onCheckboxChange(subProp.targetArray,subProp.targetArrayKey,subProp.key, column.apiName, $event.target.checked)\">\n {{ column.apiName }}\n </label>\n </div>\n </div>\n <!-- SKS21MAR25 New radio type -->\n <div *ngIf=\"subProp.type === 'radio'\">\n <div *ngFor=\"let column of filteredColumns\">\n <label>\n <input type=\"radio\" [name]=\"subProp.key\" [value]=\"column.apiName\"\n [checked]=\"getValueByArrayPath(subProp.targetArray, subProp.targetArrayKey, selectColumn, subProp.key) === column.apiName\"\n (change)=\"onRadioChange(subProp.targetArray, subProp.targetArrayKey, subProp.key, column.apiName)\">\n {{ column.apiName }}\n </label>\n </div>\n </div>\n <!-- SKS20MAR25 Add more subproperty types as needed -->\n <!-- Inside the subProp ngFor loop -->\n <input *ngIf=\"subProp.type === 'text'\" type=\"text\" [placeholder]=\"subProp.placeholder\"\n [value]=\"selectedElement.type === 'Table' ? (subProp.targetArray ? getValueByArrayPath(subProp.targetArray, subProp.targetArrayKey, selectColumn, subProp.key ) : getValueByPath(subProp.key) ) : getValueByPath(subProp.key)\"\n (input)=\"selectedElement.type === 'Table' ? (subProp.targetArray ? updateValueByArrayPath(subProp.targetArray, subProp.targetArrayKey, selectColumn, subProp.key, $event) : setValueByPath(subProp.key, $event.target.value) ) : setValueByPath(subProp.key, $event.target.value)\" />\n\n <input *ngIf=\"subProp.type === 'boolean'\" type=\"checkbox\" [checked]=\"getValueByPath(subProp.key)\"\n (change)=\"setValueByPath(subProp.key, $event.target.checked)\" />\n <select *ngIf=\"subProp.type === 'select'\" [value]=\"getValueByPath(subProp.key)\"\n (change)=\"setValueByPath(subProp.key, $event.target.value)\">\n <option *ngFor=\"let option of subProp.options\" [value]=\"option\">{{ option }}</option>\n </select>\n <input *ngIf=\"subProp.type === 'checkbox'\" type=\"checkbox\" [checked]=\"getValueByPath(subProp.key)\"\n (change)=\"setValueByPath(subProp.key, $event.target.checked)\" />\n </div>\n </div>\n </div>\n </div>\n\n <!-- SKS20MAR25 Text Align Buttons -->\n <div *ngIf=\"prop.type === 'align'\">\n <button *ngFor=\"let option of prop.options\" (click)=\"onAlignSelect(option.value)\"\n [class.active]=\"selectedElement?.textAlign === option.value\" [title]=\"option.value\">\n <img [src]=\"'../assets/icons/' + option.icon + '.svg'\" [alt]=\"option.value\" class=\"icon-size\" />\n </button>\n </div>\n\n <div *ngIf=\"prop.type === 'style'\">\n <button *ngFor=\"let option of prop.options\" (click)=\"onStyleSelect(option.value)\"\n [class.active]=\"isStyleActive(option.value)\" [title]=\"option.value\">\n <img [src]=\"'../assets/icons/' + option.icon + '.svg'\" [alt]=\"option.value\" class=\"icon-size\" />\n </button>\n </div>\n\n <!-- Field Size Controls -->\n <!-- Change key width -->\n <div *ngIf=\"prop.key === 'width'\" [ngClass]=\"{'flex-container': true, 'custom-active': selectedElement?.width !== '*' && selectedElement?.width !== 'auto'}\">\n <select\n class=\"size-select\"\n [value]=\"selectedElement?.width === '*' ? 'Default' : selectedElement?.width === 'auto' ? 'Auto' : 'Custom'\"\n (change)=\"onWidthSelect(\n $event.target.value === 'Default' ? '*' :\n $event.target.value === 'Auto' ? 'auto' : 'custom'\n )\">\n <option value=\"Default\">Default</option>\n <option value=\"Auto\">Auto</option>\n <option value=\"Custom\">Custom</option>\n </select>\n \n <input\n *ngIf=\"selectedElement?.width !== '*' && selectedElement?.width !== 'auto'\"\n type=\"number\"\n class=\"size-input\"\n min=\"1\"\n max=\"100\"\n [value]=\"selectedElement?.width\"\n (input)=\"setValueByPath(\n 'width',\n $event.target.valueAsNumber < 1 ? 1 :\n $event.target.valueAsNumber > 100 ? 100 :\n $event.target.valueAsNumber\n )\" />\n </div> \n\n <!-- Line Properties -->\n <!-- Padding Top -->\n <div *ngIf=\"prop.key === 'paddingTop'\">\n <input type=\"number\" [placeholder]=\"prop.placeholder\" [value]=\"selectedElement?.paddingTop\"\n (input)=\"setValueByPath('paddingTop', $event.target.value)\" />\n </div>\n\n <!-- Padding Bottom -->\n <div *ngIf=\"prop.key === 'paddingBottom'\">\n <input type=\"number\" [placeholder]=\"prop.placeholder\" [value]=\"selectedElement?.paddingBottom\"\n (input)=\"setValueByPath('paddingBottom', $event.target.value)\" />\n </div>\n\n <!-- Line Style -->\n <div *ngIf=\"prop.key === 'lineStyle'\">\n <select [value]=\"selectedElement?.lineStyle\" (change)=\"setValueByPath('lineStyle', $event.target.value)\">\n <option *ngFor=\"let option of prop.options\" [value]=\"option\">{{ option }}</option>\n </select>\n </div>\n\n <!-- Color -->\n <div *ngIf=\"prop.key === 'color'\">\n <input type=\"color\" [value]=\"selectedElement?.color\"\n (input)=\"setValueByPath('color', $event.target.value)\" />\n </div>\n\n </div>\n </ng-container>\n </div>\n </div>\n <div class=\"tab-content\" *ngIf=\"activeTab === 'property'\">\n <!-- Field Elements Properties -->\n <!-- Show elements ID -->\n <div *ngIf=\"getProperties()\">\n <label>Label Id</label>\n <div\n style=\"font-size: 13px; padding: 11px; border-radius: 5px; background-color: #f8f8f8; border: 1px solid #ddd;\">\n {{ headerSelect ? bookId : selectedElement.id }}</div>\n <ng-container *ngFor=\"let prop of getProperties().fieldProps\">\n <div class=\"form-group\">\n <label class=\"text-sm\">{{ prop.label }}</label>\n\n <!-- SKS21MAR25 Toggle Group -->\n <div *ngIf=\"prop.type === 'toggleGroup'\" class=\"toggle-group\">\n <div class=\"toggle-item\">\n <label class=\"toggle-label\">\n <input type=\"checkbox\" />\n Disabled\n </label>\n </div>\n </div>\n\n <!-- - handled options with UUID -->\n <div\n *ngIf=\"prop.type === 'dropdown' || prop.type === 'checkbox' || prop.type === 'radio' && prop.key === 'options'\"\n class=\"options-container\">\n\n <div class=\"option-list\" (dragover)=\"onDragOver($event)\" (drop)=\"onDrop($event, prop.key)\">\n <div *ngFor=\"let option of selectedElement[prop.key]\" class=\"option-items\" [attr.data-id]=\"option.id\"\n draggable=\"true\" (dragstart)=\"onDragStart($event, option.id)\">\n\n <input type=\"text\" [(ngModel)]=\"option.value\" placeholder=\"Option\" class=\"options\" />\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeOption(selectedElement[prop.key], option.id)\">\n <span class=\"drag-handle\">\u2630</span>\n </div>\n </div>\n\n <button (click)=\"addOption(selectedElement[prop.key])\">\n <div class=\"add-varient\">\n <span class=\"text-lg\">+</span>\n <span>Add</span>\n </div>\n </button>\n </div>\n\n <input *ngIf=\"prop.type === 'text'\" type=\"text\" [placeholder]=\"prop.placeholder\"\n [value]=\"headerSelect ? pdf.title : (selectedElement?.type === 'Table' ? (prop.targetArray ? getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn, prop.key ) : getValueByPath(prop.key) ) : getValueByPath(prop.key))\"\n (input)=\"headerSelect ? updateTitle($event.target.value) : (selectedElement?.type === 'Table' ? (prop.targetArray ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn, prop.key, $event) : setValueByPath(prop.key, $event.target.value) ) : setValueByPath(prop.key, $event.target.value))\"\n [class.read-only]=\"selectedElement.readOnly\" [readonly]=\"selectedElement.readOnly\" />\n\n <!-- Sub Questions Toggle -->\n <div *ngIf=\"prop.type === 'subQuestion'\">\n <div class=\"style-toggle-header\" (click)=\"toggleSubQuestion(prop)\">\n <div class=\"head-elements\">Sub Text</div>\n <img [src]=\"prop.isExpanded ? '../assets/icons/arrow-down.svg' : '../assets/icons/arrow-right.svg'\"\n alt=\"Toggle Arrow\" class=\"arrow-icon\">\n </div>\n\n <!-- Render subquestions when arrow is down -->\n <div *ngIf=\"prop.isExpanded\" style=\"border: 1px solid #ddd; padding: 8px; border-radius: 4px;\">\n <div *ngFor=\"let subProp of prop.subQuestion\" class=\"sub-question-container\">\n <div class=\"form-group\">\n <label>{{ subProp.label }}</label>\n\n <input *ngIf=\"subProp.type === 'text'\" type=\"text\" [placeholder]=\"subProp.placeholder\"\n [value]=\"getValueByPath(subProp.key)\" (input)=\"setValueByPath(subProp.key, $event.target.value)\" />\n \n <!-- Render input field only if subProp.type is 'array' -->\n <input *ngIf=\"subProp.type === 'array'\" type=\"text\" [placeholder]=\"subProp.placeholder\"\n [value]=\"getValueByPath(subProp.key)\" (input)=\"setValueByPath(subProp.key, $event.target.value)\" />\n <!-- <input type=\"text\" [ngModel]=\"fieldAsString\" (ngModelChange)=\"updateField($event)\" /> -->\n\n <input *ngIf=\"subProp.type === 'boolean'\" type=\"checkbox\" [checked]=\"getValueByPath(subProp.key)\"\n (change)=\"setValueByPath(subProp.key, $event.target.checked)\" />\n </div>\n </div>\n </div>\n </div>\n\n <div *ngIf=\"prop.type === 'checkbox'\">\n <span class=\"toggle-label\" style=\"padding-right: 10px;\">{{ prop.label }}</span>\n <input type=\"checkbox\"\n [checked]=\"selectedElement.type === 'Table' ? (prop.targetArray ? getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn, prop.key ) : getValueByPath(prop.key) ): getValueByPath(prop.key) \"\n (change)=\" selectedElement.type === 'Table' ? (prop.targetArray ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn, prop.key, $event) : onToggleChange(prop.key, $event) ) : onToggleChange(prop.key, $event)\" />\n\n </div>\n\n </div>\n </ng-container>\n\n <!-- SKS21MAR25 Move Style Outside the Loop -->\n <!-- Style Toggle -->\n <div class=\"style-toggle-header\" (click)=\"toggleStyleSection()\">\n <div class=\"head-elements\">Style</div>\n <img [src]=\"isStyleExpanded ? '../assets/icons/arrow-down.svg' : '../assets/icons/arrow-right.svg'\"\n alt=\"Toggle Arrow\" class=\"arrow-icon\">\n </div>\n\n <div *ngIf=\"isStyleExpanded\" style=\"border: 1px solid #ddd; padding: 8px; border-radius: 4px;\">\n <div class=\"form-group\">\n <div *ngFor=\"let key of getStyleKeys()\">\n <label>{{ key }}</label>\n <input type=\"text\" [(ngModel)]=\"selectedElement.style[key]\"\n (input)=\"setValueByPath('style.' + key, $event.target.value)\" placeholder=\"Enter {{ key }}\" />\n </div>\n </div>\n </div>\n\n </div>\n </div>\n <div class=\"tab-content\" *ngIf=\"activeTab === 'appearance'\">\n <div *ngIf=\"getProperties()\">\n <ng-container *ngFor=\"let prop of getProperties().appearance\">\n <div class=\"form-group\">\n <label class=\"text-sm\">{{ prop.label }}</label>\n <!-- Font Selection -->\n <div *ngIf=\"prop.key === 'font'\">\n <select *ngIf=\"prop.type === 'select'\" class=\"select-container\" [(ngModel)]=\"selectedElement.font\"\n (change)=\"setValueByPath('font', $event.target.value)\">\n <option *ngFor=\"let option of prop.options\" [value]=\"option\">\n {{ option }}\n </option>\n </select>\n </div>\n <!-- Input Box -->\n <input *ngIf=\"prop.type === 'text'\" type=\"text\" [placeholder]=\"prop.placeholder\"\n [value]=\"selectedElement[prop.key]\" (input)=\"setValueByPath(prop.key, $event.target.value)\" />\n\n <!-- Font Size -->\n <div *ngIf=\"prop.key === 'fontSize' && prop.type === 'number'\">\n <input type=\"number\" min=\"1\" max=\"100\" step=\"1\"\n [(ngModel)]=\"selectedElement.fontSize\"\n (change)=\"setValueByPath('fontSize', selectedElement.fontSize)\" />\n </div>\n <!-- Font Weight Selection -->\n <div *ngIf=\"prop.key === 'fontWeight'\">\n <select *ngIf=\"prop.type === 'select'\" [(ngModel)]=\"selectedElement[prop.key]\"\n (change)=\"setValueByPath(prop.key, $event.target.value)\">\n <option *ngFor=\"let option of prop.options\" [value]=\"option.value\">\n {{ option.label }}\n </option>\n </select>\n </div>\n\n <div class=\"flex-container\">\n <!-- Dropdown Box -->\n <div *ngIf=\"prop.type === 'dropdown'\" class=\"input-box-field\">\n <select [(ngModel)]=\"selectedElement[prop.key]\" (change)=\"setValueByPath(prop.key, $event.target.value)\">\n <option *ngFor=\"let option of prop.options\" [value]=\"option\">\n {{ option }}\n </option>\n </select>\n </div>\n\n <!-- Color Picker -->\n <div *ngIf=\"prop.type === 'color'\" class=\"color-selector\">\n <input type=\"color\" [(ngModel)]=\"selectedElement.fontColor\"\n (change)=\"setValueByPath('fontColor', $event.target.value)\">\n </div>\n\n <!-- HEX Input Box -->\n <div *ngIf=\"prop.type === 'color'\" class=\"hex-input-container\">\n <span>HEX Code</span>\n <input type=\"text\" [(ngModel)]=\"selectedElement[prop.key]\"\n (change)=\"setValueByPath(prop.key, $event.target.value)\" />\n </div>\n </div>\n\n <!-- Font Style -->\n<div *ngIf=\"prop.key === 'fontStyle'\">\n <select [(ngModel)]=\"selectedElement.fontStyle\"\n (change)=\"setValueByPath('fontStyle', $event.target.value)\">\n <option *ngFor=\"let option of prop.options\" [value]=\"option.value\">\n {{ option.label }}\n </option>\n </select>\n</div>\n\n<!-- margin: [0, 10, 0, 0] // [ left, top, right, bottom ] -->\n<div *ngIf=\"prop.key === 'margin'&& selectedElement?.margin\">\n <div class=\"margin-inputs\">\n <div>\n <label>Right</label>\n <input type=\"number\" [(ngModel)]=\"selectedElement.margin[1]\"\n (change)=\"setValueByPath('margin', selectedElement.margin)\" />\n </div>\n <div>\n <label>Bottom</label>\n <input type=\"number\" [(ngModel)]=\"selectedElement.margin[2]\"\n (change)=\"setValueByPath('margin', selectedElement.margin)\" />\n </div>\n <div>\n <label>Left</label>\n <input type=\"number\" [(ngModel)]=\"selectedElement.margin[3]\"\n (change)=\"setValueByPath('margin', selectedElement.margin)\" />\n </div>\n <div>\n <label>Top</label>\n <input type=\"number\" [(ngModel)]=\"selectedElement.margin[0]\"\n (change)=\"setValueByPath('margin', selectedElement.margin)\" />\n </div>\n </div>\n</div>\n\n <!-- TextAlign -->\n <div *ngIf=\"prop.key === 'alignItems'\">\n <select [(ngModel)]=\"selectedElement.alignItems\"\n (change)=\"setValueByPath('alignItems', $event.target.value)\">\n <option *ngFor=\"let option of prop.options\" [value]=\"option.value\">\n {{ option.label }}\n </option>\n </select>\n </div> \n\n </div>\n </ng-container>\n </div>\n </div>\n\n<!-- Default Save Button -->\n<div class=\"button-container\" *ngIf=\"!templateSelected\">\n <button class=\"cancel-btn\" (click)=\"onCancel()\">Cancel</button>\n <button class=\"save-btn\" (click)=\"handleButtonClick()\">Save</button>\n</div>\n</div>\n", styles: ["@import\"https://fonts.googleapis.com/css?family=Roboto:300,400,500&display=swap\";*{margin:0;padding:0;box-sizing:border-box;font-family:Roboto,sans-serif}.properties{height:calc(100vh - 20px);overflow-y:auto}.design-header{display:flex;justify-content:center;align-items:center;padding:15px 20px;background:#fff;border-radius:8px;box-shadow:0 2px 10px #0000001a;margin-bottom:20px}.header-title{font-size:20px;font-weight:400;color:#222}.all-properties details{background:#fff;border:1px solid #ddd;border-radius:8px;margin-bottom:12px;padding:12px;box-shadow:0 2px 8px #0000000d}.all-properties summary{font-size:15px;font-weight:400;cursor:pointer;padding:6px;transition:color .3s}.all-properties summary:hover{color:#007bff}.inner-content{padding:12px 0}.head-elements{font-size:14px;font-weight:500;color:#444}label{font-size:14px;font-weight:500;color:#444;margin-bottom:5px;display:block}input[type=text],input[type=number],select{width:100%;height:40px;padding:10px;font-size:14px;border:1px solid #ccc;border-radius:6px;outline:none;transition:.3s;background:#f8f8f8;text-align:left}input:focus,select:focus{border-color:#007bff;background:#fff;box-shadow:0 0 5px #007bff4d}button{padding:10px 15px;border:none;border-radius:6px;background:#007bff;color:#fff;font-size:15px;cursor:pointer;transition:.3s}button:hover{background:#0056b3;transform:translateY(-2px)}.toggle-group{display:flex;align-items:center;gap:20px}.toggle-item{display:flex;align-items:center;gap:10px}.switch{position:relative;width:42px;height:22px}.switch input{opacity:0;width:0;height:0}.slider{position:absolute;cursor:pointer;inset:0;background-color:#ccc;transition:.4s;border-radius:24px}.slider:before{position:absolute;content:\"\";height:20px;width:20px;left:1px;bottom:1px;background-color:#fff;transition:.4s;border-radius:50%}input:checked+.slider{background-color:#2196f3}input:checked+.slider:before{transform:translate(18px)}.radio-item{display:flex;align-items:center;gap:20px}.radio-item input{accent-color:#007bff}.options-container{display:flex;flex-direction:column;gap:12px}.options{width:100%}.field-size-controls{display:flex;align-items:center;gap:12px}.size-input{width:110px;text-align:center}.design-footer{display:flex;justify-content:space-between;margin-top:20px}.design-footer .btn{background:#007bff;color:#fff;padding:10px 18px;border-radius:6px;font-size:15px;transition:.3s}.design-footer .btn:hover{background:#0056b3}.input-container{display:flex;flex-direction:column;align-items:flex-start;gap:10px;width:100%}.subtext-textarea{width:100%;margin-left:auto}.container{width:100%;max-width:500px;margin:0 auto;background-color:#fff;box-shadow:0 2px 10px #0000001a;overflow:hidden;font-family:Arial,sans-serif}.tabs{display:flex;background-color:#f0f2f5;border-bottom:2px solid #0052cc}.tab{flex:1;padding:15px 10px;text-align:center;cursor:pointer}.tab.active{background-color:#0052cc;color:#fff;font-weight:700}.tab-content{padding:20px;max-height:77vh;overflow-y:auto;overflow-x:hidden}.form-group{margin-bottom:15px}label{display:flex;gap:16px;margin-bottom:8px;color:#666;font-size:14px}.required:before{content:\"*\";color:red;margin-right:3px}input[type=text],select{width:100%;padding:10px;border:1px solid #ddd;border-radius:4px;box-sizing:border-box;font-size:14px}.select-container{position:relative;width:100%}.dropdown-arrow{position:absolute;right:10px;top:50%;transform:translateY(-50%);pointer-events:none;color:#666;font-size:12px}.checkbox-row{display:flex;margin-bottom:10px}.checkbox-group{display:flex;align-items:center;margin-right:20px;min-width:120px}.checkbox-group input[type=checkbox]{margin-right:5px}.toggle-header{display:flex;align-items:center;justify-content:space-between;cursor:pointer;padding:10px}.arrow-icon{width:19px;height:23px;transition:transform .3s ease}.icon{display:inline-block;width:18px;height:18px;border-radius:50%;text-align:center;line-height:18px;color:#fff;font-size:12px;margin-left:5px}.edit-icon{background-color:#4caf50}.view-icon{background-color:#2196f3}.delete-icon{background-color:#f44336}.color-picker-row{display:flex;align-items:center}.color-picker-container{display:flex;align-items:center;border:1px solid #ddd;border-radius:4px;margin-right:10px}.color-box{width:30px;border:none;height:30px}.hex-label{color:#999;margin-right:5px}.hex-input{width:100px}.divider{border-top:1px dashed #ddd;margin:20px 0}.button-container{display:flex;padding:15px;background-color:#f9f9f9;border-top:1px solid #eee}.cancel-btn,.save-btn{padding:12px;border:none;border-radius:4px;cursor:pointer;font-weight:700}.cancel-btn{flex:1;background-color:#fff;color:#666;border:1px solid #ddd;margin-right:10px}.cancel-btn:hover{background-color:#0052cc!important;color:#fff!important}.save-btn{flex:1;background-color:#0052cc;color:#fff}.toggle-group{display:grid;grid-template-columns:1fr 1fr;gap:10px}.toggle-item{display:flex;align-items:center;padding:8px}textarea{width:100%;min-height:55px;padding:8px;border:1px solid #ccc;border-radius:5px;font-size:14px;resize:vertical}.flex-container{display:flex;align-items:center;gap:12px;margin-bottom:1rem}.input-box-field select{background-color:#28343e;color:#fff;border:none;padding:10px 14px;border-radius:6px;appearance:none;-webkit-appearance:none;-moz-appearance:none;position:relative;font-size:14px;font-family:inherit}.input-box-field{position:relative}.input-box-field select::-ms-expand{display:none}.input-box-field:after{content:\"\\25bc\";position:absolute;top:50%;right:10px;transform:translateY(-50%);color:#1c1b1f;pointer-events:none;font-size:10px}.color-selector input[type=color]{width:78px;height:40px;border-radius:4px;background:none;cursor:pointer}.hex-input-container{display:flex;font-size:12px;gap:20px;color:#b0b0b0;align-items:center}.hex-input-container span{font-size:14px;margin-top:10px}.hex-input-container input[type=text]{padding:10px 12px;border:1px solid #d1d1d1;border-radius:6px;font-size:14px;width:120px;color:#28343e}input{width:auto}@media screen and (max-width: 1099px){.container{height:calc(100vh - 20px);min-height:calc(100vh - 20px)}.tabs{flex-direction:column}.tab{flex:1;padding:1rem;font-size:.9rem;text-align:center}.form-group{flex-direction:column}}@media screen and (max-width: 768px){.container{height:calc(100vh - 20px) h;min-height:calc(100vh - 20px)}.tabs{flex-direction:column}.tab{flex:1;padding:1rem;font-size:.9rem;text-align:center}.form-group{flex-direction:column}}@media screen and (max-width: 480px){.container{padding:0 10px}.tabs{flex-direction:column}.tab{flex:1;padding:1rem;border-bottom:1px solid #dee2e6}input[type=text],input[type=number],select,textarea{font-size:.9rem}}@media screen and (max-width: 768px){.tab-content[aria-label=attributes] .form-group,.tab-content[aria-label=property] .form-group,.tab-content[aria-label=appearance] .form-group{grid-template-columns:1fr}.toggle-group{flex-direction:column;align-items:flex-start}}.logo-icon{width:20px;height:20px;display:flex;justify-content:center;background-color:#d0d9ff;border-radius:4px}.link-icon{background-color:#e7f2ff;padding:5px;border-radius:5px;margin:5px;display:inline-block;cursor:pointer;position:relative;transition:background-color .3s,transform .2s}.link-icon:hover{background-color:#d0e5ff}.link-icon:active{background-color:#a8d0ff}.link-dropdown-menu{position:absolute;top:100%;right:0;background:#fff;border:1px solid #ccc;padding:10px;width:200px;box-shadow:0 4px 6px #0000001a}.link-dropdown-menu input{width:100%;margin-bottom:5px;padding:5px;border:1px solid #ccc;border-radius:3px}.option-items{display:flex;align-items:center;padding:5px;border:1px solid #ccc;margin-bottom:10px;cursor:grab;background:#fff}.drag-handle{margin-left:10px;cursor:grab}.option-items:active{opacity:.5}.style-toggle-header{display:flex;justify-content:space-between;align-items:center;background-color:#f8f8f8;border:1px solid #ddd;padding:10px;border-radius:6px;cursor:pointer;margin-bottom:6px}.button-toggle-wrapper{margin-top:8px}.toggle-button{padding:8px 16px;border:1px solid #cbd2d9;border-radius:6px;font-size:14px;cursor:pointer;transition:all .2s ease-in-out}.toggle-button.active:hover{background-color:#2c6dd5}.flex-container{display:flex;gap:8px;align-items:center}.size-select{transition:width .3s ease;width:100%;max-width:200px}.flex-container.custom-active .size-select{max-width:100px}.size-input{width:60px}.margin-inputs{display:flex;gap:15px;margin-top:5px}.margin-inputs>div{display:flex;flex-direction:column;width:60px}.margin-inputs label{font-size:12px;margin-bottom:3px}.pdf-actions-container{width:100%;max-width:400px;padding:10px}.pdf-action-card{background-color:#fff;border-radius:6px;padding:9px;box-shadow:0 2px 6px #0000001a;display:flex;flex-direction:column;gap:10px}.pdf-btn{display:flex;align-items:center;justify-content:center;gap:8px;padding:10px;background-color:#6c757d;color:#fff;border:none;border-radius:4px;cursor:pointer;font-size:14px;transition:background-color .2s}.pdf-btn:hover{background-color:#5a6268}\n"] }]
|
|
1102
|
+
args: [{ selector: 'app-pdf-properties', standalone: true, imports: [CommonModule, FormsModule, NxtSearchBox, ImageCropperComponent, NxtCustomTranslatePipe], template: "<!-- - Field and Element Properties -->\n<div class=\"container\">\n <div class=\"tabs\">\n <div class=\"tab\" [ngClass]=\"{'active': activeTab === 'attributes'}\" (click)=\"setActiveTab('attributes')\">\n {{ 'ATTRIBUTES' | nxtCustomTranslate : 'Attributes' }}\n </div>\n <div class=\"tab\" [ngClass]=\"{'active': activeTab === 'property'}\" (click)=\"setActiveTab('property')\">\n {{ 'PROPERTY' | nxtCustomTranslate : 'Property' }}\n </div>\n <div class=\"tab\" [ngClass]=\"{'active': activeTab === 'appearance'}\" (click)=\"setActiveTab('appearance')\">\n {{ 'APPEARANCE' | nxtCustomTranslate : 'Appearance' }}\n </div>\n </div>\n\n <div class=\"tab-content\" *ngIf=\"activeTab === 'attributes'\">\n <!-- Element Properrties -->\n <!-- Select element type show -->\n <div *ngIf=\"getProperties()\">\n <!-- SKS25MAR25 this is for image edit -->\n <div *ngIf=\"selectedElement?.type === 'image'\">\n <image-cropper *ngIf=\"selectedElement.imageData \" [imageBase64]=\"selectedElement.orgImageData\"\n [disabled]=\"false\" [alignImage]=\"alignImage\" [roundCropper]=\"roundCropper\" [backgroundColor]=\"'white'\"\n imageAltText=\"Alternative image text\" [allowMoveImage]=\"false\" [hideResizeSquares]=\"false\"\n [canvasRotation]=\"canvasRotation\" [aspectRatio]=\"aspectRatio\" [containWithinAspectRatio]=\"false\"\n [maintainAspectRatio]=\"false\" [cropperStaticWidth]=\"cropperStaticWidth\"\n [cropperStaticHeight]=\"cropperStaticHeight\" [cropperMinWidth]=\"cropperMinWidth\"\n [cropperMinHeight]=\"cropperMinHeight\" [cropperMaxWidth]=\"cropperMaxWidth\"\n [cropperMaxHeight]=\"cropperMaxHeight\" [resetCropOnAspectRatioChange]='true' [(cropper)]=\"cropper\"\n [(transform)]=\"transform\" [onlyScaleDown]=\"true\" output=\"blob\" format=\"png\"\n (imageCropped)=\"imageCropped($event)\" (cropperReady)=\"cropperReady($event)\"></image-cropper>\n <div *ngIf=\"selectedElement.imageData \" style=\"display: flex; gap: 2px;\">\n <div class=\"cursor-pointer logo-icon\" (click)=\"rotateLeft()\" title=\"Rotate Left\">\u27F2</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"rotateRight()\" title=\"Rotate Right\">\u27F3</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"zoomOut()\" title=\"Zoom Out\">-</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"zoomIn()\" title=\"Zoom In\">+</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"moveLeft()\" title=\"Move Left\">\u2190</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"moveRight()\" title=\"Move Right\">\u2192</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"moveUp()\" title=\"Move Up\">\u2191</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"moveDown()\" title=\"Move Down\">\u2193</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"flipHorizontal()\" [class.enabled]=\"transform.flipH\"\n title=\"Flip Horizontally\">\u2194</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"flipVertical()\" [class.enabled]=\"transform.flipV\"\n title=\"Flip Vertically\">\u2195</div>\n <div class=\"cursor-pointer logo-icon\" (click)=\"resetImage()\" title=\"Reset\">\u00D7</div>\n </div>\n </div>\n <!-- SKS28MAR25 search pdf specific for pdf element -->\n <div *ngIf=\"selectedElement?.type === 'Pdf'\">\n <label class=\"text-sm\">{{ 'SEARCHPDF' | nxtCustomTranslate : 'Search Pdf' }}</label>\n <div style=\"display: flex; gap: 2px; align-items: center; justify-content: center;\">\n <nxt-search-box [question]=\"selectedElement\" [readOnly]=\"selectedElement.isReadOnly\" [apiMeta]=\"bookSubtext\"\n [placeHolderText]=\"selectedElement.question || ''\"\n [mode]=\"'edit'\"\n (searchValueChange)=\"childEventCapture($event)\">\n </nxt-search-box>\n <div class=\"link-icon\">\n <svg (click)=\"linkToggleDropdown($event)\" fill=\"#000000\" version=\"1.1\" id=\"Capa_1\"\n xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"24px\" height=\"24px\"\n viewBox=\"0 0 450 450\" xml:space=\"preserve\">\n <g>\n <g>\n <g>\n <path d=\"M318.15,230.195l77.934-77.937c31.894-31.892,31.894-83.782-0.004-115.674l-12.66-12.66\n c-31.893-31.896-83.78-31.896-115.674-0.004l-77.937,77.934c-17.588,17.588-25.457,41.264-23.646,64.311\n c-23.045-1.813-46.722,6.056-64.308,23.647L23.92,267.748c-31.894,31.889-31.894,83.779,0,115.674l12.664,12.662\n c31.893,31.893,83.783,31.893,115.674,0l77.935-77.936c17.592-17.59,25.459-41.266,23.647-64.309\n C276.884,255.654,300.56,247.783,318.15,230.195z M202.653,290.605l-77.936,77.938c-16.705,16.703-43.889,16.703-60.59,0\n l-12.666-12.666c-16.705-16.701-16.703-43.885,0-60.594l77.936-77.932c14.14-14.141,35.779-16.306,52.226-6.516l-32.302,32.307\n c-7.606,7.604-7.606,19.938,0,27.541c7.605,7.607,19.937,7.607,27.541,0l32.306-32.303\n C218.959,254.828,216.795,276.469,202.653,290.605z M238.382,209.169l32.299-32.306c7.608-7.602,7.608-19.935,0-27.538\n c-7.604-7.61-19.936-7.61-27.541-0.004l-32.303,32.303c-9.791-16.446-7.627-38.087,6.514-52.226l77.935-77.935\n c16.707-16.707,43.89-16.707,60.594,0l12.664,12.664c16.705,16.705,16.705,43.886,0,60.591l-77.936,77.937\n C276.468,216.797,254.828,218.959,238.382,209.169z\" />\n <path d=\"M343.466,261.465c-45.287,0-82,36.713-82,82s36.713,82,82,82c45.286,0,82-36.713,82-82S388.753,261.465,343.466,261.465z\n M372.505,333.564l-56.046,56.104c-0.239,0.238-0.536,0.41-0.862,0.496l-22.315,5.85c-0.649,0.168-1.347-0.02-1.822-0.494\n c-0.477-0.479-0.666-1.172-0.496-1.824l5.826-22.318c0.084-0.326,0.256-0.627,0.494-0.863l56.047-56.104\n c0.742-0.742,1.945-0.744,2.688-0.002l4.548,4.541c0.739,0.74,0.741,1.943,0,2.688l-37.433,37.471l4.709,4.703l37.435-37.471\n c0.739-0.742,1.94-0.742,2.682-0.002l4.55,4.541C373.25,331.617,373.25,332.822,372.505,333.564z M395.472,310.574l-17,17.018\n c-0.739,0.744-1.942,0.744-2.685,0.002l-16.489-16.475c-0.744-0.74-0.744-1.943-0.002-2.688l17-17.02\n c0.741-0.74,1.944-0.74,2.688-0.002l16.487,16.477C396.216,308.629,396.216,309.832,395.472,310.574z\" />\n </g>\n </g>\n </g>\n </svg>\n <div class=\"link-dropdown-menu\" *ngIf=\"isLinkDropdownOpen\" #dropdown>\n <label>{{ 'ENDPOINT' | nxtCustomTranslate : 'Endpoint' }}:</label>\n <input type=\"text\" [(ngModel)]=\"bookSubtext.endpoint\" />\n\n <label>{{ 'VARIABLE' | nxtCustomTranslate : 'Variable' }}:</label>\n <input type=\"text\" [(ngModel)]=\"bookSubtext.variable\" />\n\n <label>{{ 'FIELD' | nxtCustomTranslate : 'Field' }}:</label>\n <input type=\"text\" [ngModel]=\"fieldAsString\" (ngModelChange)=\"updateField($event)\" />\n\n <label>{{ 'DEFAULTFIELD' | nxtCustomTranslate : 'Default Field' }}:</label>\n <input type=\"text\" [(ngModel)]=\"bookSubtext.defaultField\" />\n </div>\n </div>\n </div>\n </div>\n <ng-container *ngFor=\"let prop of getProperties().elementProps\">\n <div class=\"form-group\">\n <label *ngIf=\"prop.type !== 'checkbox' && prop.type !== 'subQuestion'\" class=\"text-sm\">{{ prop.labelPath | nxtCustomTranslate : prop.label \n }}</label>\n\n <!-- Text Input -->\n <input *ngIf=\"prop.type === 'text'\" type=\"text\" [placeholder]=\"prop.placeholder\"\n [value]=\"headerSelect ? pdf.title : (selectedElement?.type === 'Table' ? (prop.targetArray ? getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn, prop.key ) : getValueByPath(prop.key) ) : getValueByPath(prop.key))\"\n (input)=\"headerSelect ? updateTitle($event.target.value) : (selectedElement?.type === 'Table' ? (prop.targetArray ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn, prop.key, $event) : setValueByPath(prop.key, $event.target.value) ) : setValueByPath(prop.key, $event.target.value))\"\n [class.read-only]=\"selectedElement.readOnly\" [readonly]=\"selectedElement.readOnly\" />\n\n <!-- questionNumber -->\n <input *ngIf=\"prop.key === 'questionNumber'\" type=\"number\" [value]=\"selectedElement.questionNumber\"\n (input)=\"setValueByPath('questionNumber', $event.target.value)\" />\n\n <!-- file -->\n <!-- Add this inside the elementProps loop where other inputs are rendered -->\n <select *ngIf=\"prop.type === 'select' && prop.key === 'supportType'\" [value]=\"selectedElement[prop.key]\"\n (change)=\"setValueByPath(prop.key, $event.target.value)\">\n <option value=\"\">---Select---</option>\n <option *ngFor=\"let option of prop.options\" [value]=\"option.value\"> {{ option.labelPath | nxtCustomTranslate : option.label }} </option>\n </select>\n\n <div *ngIf=\"prop.type === 'checkbox'\">\n\n <input type=\"checkbox\"\n [checked]=\"selectedElement.type === 'Table' ? (prop.targetArray ? getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn, prop.key ) : getValueByPath(prop.key) ): getValueByPath(prop.key) \"\n (change)=\" selectedElement.type === 'Table' ? (prop.targetArray ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn, prop.key, $event) : onToggleChange(prop.key, $event) ) : onToggleChange(prop.key, $event)\" />\n <span class=\"toggle-label\" style=\"padding-left: 10px;\">{{ prop.labelPath | nxtCustomTranslate : prop.label }}</span>\n\n </div>\n <!-- SKS20MAR25 Subquestion Type -->\n <div *ngIf=\"prop.type === 'subQuestion'\">\n <div style=\"display: flex; flex-direction: row; gap: 10px; align-items: center;\">\n <div>{{ prop.labelPath | nxtCustomTranslate : prop.label }}</div>\n <input type=\"checkbox\"\n [checked]=\"selectedElement.type === 'Table' ? (prop.targetArray ? getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn, prop.key ) : getValueByPath(prop.key) ): getValueByPath(prop.key) \"\n (change)=\" selectedElement.type === 'Table' ? (prop.targetArray ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn, prop.key, $event) : onToggleChange(prop.key, $event) ) : onToggleChange(prop.key, $event)\" />\n </div>\n <!-- SKS20MAR25 Render subquestions when checkbox is checked -->\n <div\n *ngIf=\"selectedElement.type === 'Table' ? (prop.targetArray ? getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn, prop.key ) : getValueByPath(prop.key) ): getValueByPath(prop.key)\">\n <div *ngFor=\"let subProp of prop.subQuestion\"\n style=\"background-color: #e7f2ff; padding: 8px; border-radius: 4px;\">\n <div class=\"form-group\">\n <label>{{ subProp.labelPath | nxtCustomTranslate : subProp.label }}</label>\n <div *ngIf=\"subProp.type === 'array'\">\n <!-- Iterate over filtered columns to display checkboxes -->\n <div *ngFor=\"let column of filteredColumns\">\n <label>\n <input type=\"checkbox\"\n [checked]=\"subProp.operands ? subProp.operands.includes(column.apiName) : false\"\n (change)=\"onCheckboxChange(subProp.targetArray,subProp.targetArrayKey,subProp.key, column.apiName, $event.target.checked)\">\n {{ column.apiName }}\n </label>\n </div>\n </div>\n <!-- SKS21MAR25 New radio type -->\n <div *ngIf=\"subProp.type === 'radio'\">\n <div *ngFor=\"let column of filteredColumns\">\n <label>\n <input type=\"radio\" [name]=\"subProp.key\" [value]=\"column.apiName\"\n [checked]=\"getValueByArrayPath(subProp.targetArray, subProp.targetArrayKey, selectColumn, subProp.key) === column.apiName\"\n (change)=\"onRadioChange(subProp.targetArray, subProp.targetArrayKey, subProp.key, column.apiName)\">\n {{ column.apiName }}\n </label>\n </div>\n </div>\n <!-- SKS20MAR25 Add more subproperty types as needed -->\n <!-- Inside the subProp ngFor loop -->\n <input *ngIf=\"subProp.type === 'text'\" type=\"text\" [placeholder]=\"subProp.placeholder\"\n [value]=\"selectedElement.type === 'Table' ? (subProp.targetArray ? getValueByArrayPath(subProp.targetArray, subProp.targetArrayKey, selectColumn, subProp.key ) : getValueByPath(subProp.key) ) : getValueByPath(subProp.key)\"\n (input)=\"selectedElement.type === 'Table' ? (subProp.targetArray ? updateValueByArrayPath(subProp.targetArray, subProp.targetArrayKey, selectColumn, subProp.key, $event) : setValueByPath(subProp.key, $event.target.value) ) : setValueByPath(subProp.key, $event.target.value)\" />\n\n <input *ngIf=\"subProp.type === 'boolean'\" type=\"checkbox\" [checked]=\"getValueByPath(subProp.key)\"\n (change)=\"setValueByPath(subProp.key, $event.target.checked)\" />\n <select *ngIf=\"subProp.type === 'select'\" [value]=\"getValueByPath(subProp.key)\"\n (change)=\"setValueByPath(subProp.key, $event.target.value)\">\n <option *ngFor=\"let option of subProp.options\" [value]=\"option\">{{ option }}</option>\n </select>\n <input *ngIf=\"subProp.type === 'checkbox'\" type=\"checkbox\" [checked]=\"getValueByPath(subProp.key)\"\n (change)=\"setValueByPath(subProp.key, $event.target.checked)\" />\n </div>\n </div>\n </div>\n </div>\n\n <!-- SKS20MAR25 Text Align Buttons -->\n <div *ngIf=\"prop.type === 'align'\">\n <button *ngFor=\"let option of prop.options\" (click)=\"onAlignSelect(option.value)\"\n [class.active]=\"selectedElement?.textAlign === option.value\" [title]=\"option.value\">\n <img [src]=\"'../assets/icons/' + option.icon + '.svg'\" [alt]=\"option.value\" class=\"icon-size\" />\n </button>\n </div>\n\n <div *ngIf=\"prop.type === 'style'\">\n <button *ngFor=\"let option of prop.options\" (click)=\"onStyleSelect(option.value)\"\n [class.active]=\"isStyleActive(option.value)\" [title]=\"option.value\">\n <img [src]=\"'../assets/icons/' + option.icon + '.svg'\" [alt]=\"option.value\" class=\"icon-size\" />\n </button>\n </div>\n\n <!-- Field Size Controls -->\n <!-- Change key width -->\n <div *ngIf=\"prop.key === 'width'\" [ngClass]=\"{'flex-container': true, 'custom-active': selectedElement?.width !== '*' && selectedElement?.width !== 'auto'}\">\n <select\n class=\"size-select\"\n [value]=\"selectedElement?.width === '*' ? 'Default' : selectedElement?.width === 'auto' ? 'Auto' : 'Custom'\"\n (change)=\"onWidthSelect(\n $event.target.value === 'Default' ? '*' :\n $event.target.value === 'Auto' ? 'auto' : 'custom'\n )\">\n <option value=\"Default\">{{ 'DEFAULT' | nxtCustomTranslate : 'Default' }}</option>\n <option value=\"Auto\">{{ 'AUTO' | nxtCustomTranslate : 'Auto' }}</option>\n <option value=\"Custom\">{{ 'CUSTOM' | nxtCustomTranslate : 'Custom' }}</option>\n </select>\n \n <input\n *ngIf=\"selectedElement?.width !== '*' && selectedElement?.width !== 'auto'\"\n type=\"number\"\n class=\"size-input\"\n min=\"1\"\n max=\"100\"\n [value]=\"selectedElement?.width\"\n (input)=\"setValueByPath(\n 'width',\n $event.target.valueAsNumber < 1 ? 1 :\n $event.target.valueAsNumber > 100 ? 100 :\n $event.target.valueAsNumber\n )\" />\n </div> \n\n <!-- Line Properties -->\n <!-- Padding Top -->\n <div *ngIf=\"prop.key === 'paddingTop'\">\n <input type=\"number\" [placeholder]=\"prop.placeholder\" [value]=\"selectedElement?.paddingTop\"\n (input)=\"setValueByPath('paddingTop', $event.target.value)\" />\n </div>\n\n <!-- Padding Bottom -->\n <div *ngIf=\"prop.key === 'paddingBottom'\">\n <input type=\"number\" [placeholder]=\"prop.placeholder\" [value]=\"selectedElement?.paddingBottom\"\n (input)=\"setValueByPath('paddingBottom', $event.target.value)\" />\n </div>\n\n <!-- Line Style -->\n <div *ngIf=\"prop.key === 'lineStyle'\">\n <select [value]=\"selectedElement?.lineStyle\" (change)=\"setValueByPath('lineStyle', $event.target.value)\">\n <option *ngFor=\"let option of prop.options\" [value]=\"option\">{{ option }}</option>\n </select>\n </div>\n\n <!-- Color -->\n <div *ngIf=\"prop.key === 'color'\">\n <input type=\"color\" [value]=\"selectedElement?.color\"\n (input)=\"setValueByPath('color', $event.target.value)\" />\n </div>\n\n </div>\n </ng-container>\n </div>\n </div>\n <div class=\"tab-content\" *ngIf=\"activeTab === 'property'\">\n <!-- Field Elements Properties -->\n <!-- Show elements ID -->\n <div *ngIf=\"getProperties()\">\n <label>Label Id</label>\n <div\n style=\"font-size: 13px; padding: 11px; border-radius: 5px; background-color: #f8f8f8; border: 1px solid #ddd;\">\n {{ headerSelect ? bookId : selectedElement.id }}</div>\n <ng-container *ngFor=\"let prop of getProperties().fieldProps\">\n <div class=\"form-group\">\n <label class=\"text-sm\">{{ prop.labelPath | nxtCustomTranslate : prop.label }}</label>\n\n <!-- SKS21MAR25 Toggle Group -->\n <div *ngIf=\"prop.type === 'toggleGroup'\" class=\"toggle-group\">\n <div class=\"toggle-item\">\n <label class=\"toggle-label\">\n <input type=\"checkbox\" />\n Disabled\n </label>\n </div>\n </div>\n\n <!-- - handled options with UUID -->\n <div\n *ngIf=\"prop.type === 'dropdown' || prop.type === 'checkbox' || prop.type === 'radio' && prop.key === 'options'\"\n class=\"options-container\">\n\n <div class=\"option-list\" (dragover)=\"onDragOver($event)\" (drop)=\"onDrop($event, prop.key)\">\n <div *ngFor=\"let option of selectedElement[prop.key]\" class=\"option-items\" [attr.data-id]=\"option.id\"\n draggable=\"true\" (dragstart)=\"onDragStart($event, option.id)\">\n\n <input type=\"text\" [(ngModel)]=\"option.value\" placeholder=\"Option\" class=\"options\" />\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeOption(selectedElement[prop.key], option.id)\">\n <span class=\"drag-handle\">\u2630</span>\n </div>\n </div>\n\n <button (click)=\"addOption(selectedElement[prop.key])\">\n <div class=\"add-varient\">\n <span class=\"text-lg\">+</span>\n <span>Add</span>\n </div>\n </button>\n </div>\n\n <input *ngIf=\"prop.type === 'text'\" type=\"text\" [placeholder]=\"prop.placeholder\"\n [value]=\"headerSelect ? pdf.title : (selectedElement?.type === 'Table' ? (prop.targetArray ? getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn, prop.key ) : getValueByPath(prop.key) ) : getValueByPath(prop.key))\"\n (input)=\"headerSelect ? updateTitle($event.target.value) : (selectedElement?.type === 'Table' ? (prop.targetArray ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn, prop.key, $event) : setValueByPath(prop.key, $event.target.value) ) : setValueByPath(prop.key, $event.target.value))\"\n [class.read-only]=\"selectedElement.readOnly\" [readonly]=\"selectedElement.readOnly\" />\n\n <!-- Sub Questions Toggle -->\n <div *ngIf=\"prop.type === 'subQuestion'\">\n <div class=\"style-toggle-header\" (click)=\"toggleSubQuestion(prop)\">\n <div class=\"head-elements\">Sub Text</div>\n <img [src]=\"prop.isExpanded ? '../assets/icons/arrow-down.svg' : '../assets/icons/arrow-right.svg'\"\n alt=\"Toggle Arrow\" class=\"arrow-icon\">\n </div>\n\n <!-- Render subquestions when arrow is down -->\n <div *ngIf=\"prop.isExpanded\" style=\"border: 1px solid #ddd; padding: 8px; border-radius: 4px;\">\n <div *ngFor=\"let subProp of prop.subQuestion\" class=\"sub-question-container\">\n <div class=\"form-group\">\n <label>{{ subProp.labelPath | nxtCustomTranslate : subProp.label }}</label>\n\n <input *ngIf=\"subProp.type === 'text'\" type=\"text\" [placeholder]=\"subProp.placeholder\"\n [value]=\"getValueByPath(subProp.key)\" (input)=\"setValueByPath(subProp.key, $event.target.value)\" />\n \n <!-- Render input field only if subProp.type is 'array' -->\n <input *ngIf=\"subProp.type === 'array'\" type=\"text\" [placeholder]=\"subProp.placeholder\"\n [value]=\"getValueByPath(subProp.key)\" (input)=\"setValueByPath(subProp.key, $event.target.value)\" />\n <!-- <input type=\"text\" [ngModel]=\"fieldAsString\" (ngModelChange)=\"updateField($event)\" /> -->\n\n <input *ngIf=\"subProp.type === 'boolean'\" type=\"checkbox\" [checked]=\"getValueByPath(subProp.key)\"\n (change)=\"setValueByPath(subProp.key, $event.target.checked)\" />\n </div>\n </div>\n </div>\n </div>\n\n <div *ngIf=\"prop.type === 'checkbox'\">\n <span class=\"toggle-label\" style=\"padding-right: 10px;\">{{ prop.labelPath | nxtCustomTranslate : prop.label }}</span>\n <input type=\"checkbox\"\n [checked]=\"selectedElement.type === 'Table' ? (prop.targetArray ? getValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn, prop.key ) : getValueByPath(prop.key) ): getValueByPath(prop.key) \"\n (change)=\" selectedElement.type === 'Table' ? (prop.targetArray ? updateValueByArrayPath(prop.targetArray, prop.targetArrayKey, selectColumn, prop.key, $event) : onToggleChange(prop.key, $event) ) : onToggleChange(prop.key, $event)\" />\n\n </div>\n\n </div>\n </ng-container>\n\n <!-- SKS21MAR25 Move Style Outside the Loop -->\n <!-- Style Toggle -->\n <div class=\"style-toggle-header\" (click)=\"toggleStyleSection()\">\n <div class=\"head-elements\">Style</div>\n <img [src]=\"isStyleExpanded ? '../assets/icons/arrow-down.svg' : '../assets/icons/arrow-right.svg'\"\n alt=\"Toggle Arrow\" class=\"arrow-icon\">\n </div>\n\n <div *ngIf=\"isStyleExpanded\" style=\"border: 1px solid #ddd; padding: 8px; border-radius: 4px;\">\n <div class=\"form-group\">\n <div *ngFor=\"let key of getStyleKeys()\">\n <label>{{ key }}</label>\n <input type=\"text\" [(ngModel)]=\"selectedElement.style[key]\"\n (input)=\"setValueByPath('style.' + key, $event.target.value)\" placeholder=\"Enter {{ key }}\" />\n </div>\n </div>\n </div>\n\n </div>\n </div>\n <div class=\"tab-content\" *ngIf=\"activeTab === 'appearance'\">\n <div *ngIf=\"getProperties()\">\n <ng-container *ngFor=\"let prop of getProperties().appearance\">\n <div class=\"form-group\">\n <label class=\"text-sm\">{{ prop.labelPath | nxtCustomTranslate : prop.label }}</label>\n <!-- Font Selection -->\n <div *ngIf=\"prop.key === 'font'\">\n <select *ngIf=\"prop.type === 'select'\" class=\"select-container\" [(ngModel)]=\"selectedElement.font\"\n (change)=\"setValueByPath('font', $event.target.value)\">\n <option *ngFor=\"let option of prop.options\" [value]=\"option\">\n {{ option }}\n </option>\n </select>\n </div>\n <!-- Input Box -->\n <input *ngIf=\"prop.type === 'text'\" type=\"text\" [placeholder]=\"prop.placeholder\"\n [value]=\"selectedElement[prop.key]\" (input)=\"setValueByPath(prop.key, $event.target.value)\" />\n\n <!-- Font Size -->\n <div *ngIf=\"prop.key === 'fontSize' && prop.type === 'number'\">\n <input type=\"number\" min=\"1\" max=\"100\" step=\"1\"\n [(ngModel)]=\"selectedElement.fontSize\"\n (change)=\"setValueByPath('fontSize', selectedElement.fontSize)\" />\n </div>\n <!-- Font Weight Selection -->\n <div *ngIf=\"prop.key === 'fontWeight'\">\n <select *ngIf=\"prop.type === 'select'\" [(ngModel)]=\"selectedElement[prop.key]\"\n (change)=\"setValueByPath(prop.key, $event.target.value)\">\n <option *ngFor=\"let option of prop.options\" [value]=\"option.value\">\n {{ option.labelPath | nxtCustomTranslate : option.label }}\n </option>\n </select>\n </div>\n\n <div class=\"flex-container\">\n <!-- Dropdown Box -->\n <div *ngIf=\"prop.type === 'dropdown'\" class=\"input-box-field\">\n <select [(ngModel)]=\"selectedElement[prop.key]\" (change)=\"setValueByPath(prop.key, $event.target.value)\">\n <option *ngFor=\"let option of prop.options\" [value]=\"option\">\n {{ option }}\n </option>\n </select>\n </div>\n\n <!-- Color Picker -->\n <div *ngIf=\"prop.type === 'color'\" class=\"color-selector\">\n <input type=\"color\" [(ngModel)]=\"selectedElement.fontColor\"\n (change)=\"setValueByPath('fontColor', $event.target.value)\">\n </div>\n\n <!-- HEX Input Box -->\n <div *ngIf=\"prop.type === 'color'\" class=\"hex-input-container\">\n <span>HEX Code</span>\n <input type=\"text\" [(ngModel)]=\"selectedElement[prop.key]\"\n (change)=\"setValueByPath(prop.key, $event.target.value)\" />\n </div>\n </div>\n\n <!-- Font Style -->\n<div *ngIf=\"prop.key === 'fontStyle'\">\n <select [(ngModel)]=\"selectedElement.fontStyle\"\n (change)=\"setValueByPath('fontStyle', $event.target.value)\">\n <option *ngFor=\"let option of prop.options\" [value]=\"option.value\">\n {{ option.labelPath | nxtCustomTranslate : option.label }}\n </option>\n </select>\n</div>\n\n<!-- margin: [0, 10, 0, 0] // [ left, top, right, bottom ] -->\n<div *ngIf=\"prop.key === 'margin'&& selectedElement?.margin\">\n <div class=\"margin-inputs\">\n <div>\n <label>Right</label>\n <input type=\"number\" [(ngModel)]=\"selectedElement.margin[1]\"\n (change)=\"setValueByPath('margin', selectedElement.margin)\" />\n </div>\n <div>\n <label>Bottom</label>\n <input type=\"number\" [(ngModel)]=\"selectedElement.margin[2]\"\n (change)=\"setValueByPath('margin', selectedElement.margin)\" />\n </div>\n <div>\n <label>Left</label>\n <input type=\"number\" [(ngModel)]=\"selectedElement.margin[3]\"\n (change)=\"setValueByPath('margin', selectedElement.margin)\" />\n </div>\n <div>\n <label>Top</label>\n <input type=\"number\" [(ngModel)]=\"selectedElement.margin[0]\"\n (change)=\"setValueByPath('margin', selectedElement.margin)\" />\n </div>\n </div>\n</div>\n\n <!-- TextAlign -->\n <div *ngIf=\"prop.key === 'alignItems'\">\n <select [(ngModel)]=\"selectedElement.alignItems\"\n (change)=\"setValueByPath('alignItems', $event.target.value)\">\n <option *ngFor=\"let option of prop.options\" [value]=\"option.value\">\n {{ option.labelPath | nxtCustomTranslate : option.label }}\n </option>\n </select>\n </div> \n\n </div>\n </ng-container>\n </div>\n </div>\n\n<!-- Default Save Button -->\n<div class=\"button-container\" *ngIf=\"!templateSelected\">\n <button class=\"cancel-btn\" (click)=\"onCancel()\">Cancel</button>\n <button class=\"save-btn\" (click)=\"handleButtonClick()\">Save</button>\n</div>\n</div>\n", styles: ["@import\"https://fonts.googleapis.com/css?family=Roboto:300,400,500&display=swap\";*{margin:0;padding:0;box-sizing:border-box;font-family:Roboto,sans-serif}.properties{height:calc(100vh - 20px);overflow-y:auto}.design-header{display:flex;justify-content:center;align-items:center;padding:15px 20px;background:#fff;border-radius:8px;box-shadow:0 2px 10px #0000001a;margin-bottom:20px}.header-title{font-size:20px;font-weight:400;color:#222}.all-properties details{background:#fff;border:1px solid #ddd;border-radius:8px;margin-bottom:12px;padding:12px;box-shadow:0 2px 8px #0000000d}.all-properties summary{font-size:15px;font-weight:400;cursor:pointer;padding:6px;transition:color .3s}.all-properties summary:hover{color:#007bff}.inner-content{padding:12px 0}.head-elements{font-size:14px;font-weight:500;color:#444}label{font-size:14px;font-weight:500;color:#444;margin-bottom:5px;display:block}input[type=text],input[type=number],select{width:100%;height:40px;padding:10px;font-size:14px;border:1px solid #ccc;border-radius:6px;outline:none;transition:.3s;background:#f8f8f8;text-align:left}input:focus,select:focus{border-color:#007bff;background:#fff;box-shadow:0 0 5px #007bff4d}button{padding:10px 15px;border:none;border-radius:6px;background:#007bff;color:#fff;font-size:15px;cursor:pointer;transition:.3s}button:hover{background:#0056b3;transform:translateY(-2px)}.toggle-group{display:flex;align-items:center;gap:20px}.toggle-item{display:flex;align-items:center;gap:10px}.switch{position:relative;width:42px;height:22px}.switch input{opacity:0;width:0;height:0}.slider{position:absolute;cursor:pointer;inset:0;background-color:#ccc;transition:.4s;border-radius:24px}.slider:before{position:absolute;content:\"\";height:20px;width:20px;left:1px;bottom:1px;background-color:#fff;transition:.4s;border-radius:50%}input:checked+.slider{background-color:#2196f3}input:checked+.slider:before{transform:translate(18px)}.radio-item{display:flex;align-items:center;gap:20px}.radio-item input{accent-color:#007bff}.options-container{display:flex;flex-direction:column;gap:12px}.options{width:100%}.field-size-controls{display:flex;align-items:center;gap:12px}.size-input{width:110px;text-align:center}.design-footer{display:flex;justify-content:space-between;margin-top:20px}.design-footer .btn{background:#007bff;color:#fff;padding:10px 18px;border-radius:6px;font-size:15px;transition:.3s}.design-footer .btn:hover{background:#0056b3}.input-container{display:flex;flex-direction:column;align-items:flex-start;gap:10px;width:100%}.subtext-textarea{width:100%;margin-left:auto}.container{width:100%;max-width:500px;margin:0 auto;background-color:#fff;box-shadow:0 2px 10px #0000001a;overflow:hidden;font-family:Arial,sans-serif}.tabs{display:flex;background-color:#f0f2f5;border-bottom:2px solid #0052cc}.tab{flex:1;padding:15px 10px;text-align:center;cursor:pointer}.tab.active{background-color:#0052cc;color:#fff;font-weight:700}.tab-content{padding:20px;max-height:77vh;overflow-y:auto;overflow-x:hidden}.form-group{margin-bottom:15px}label{display:flex;gap:16px;margin-bottom:8px;color:#666;font-size:14px}.required:before{content:\"*\";color:red;margin-right:3px}input[type=text],select{width:100%;padding:10px;border:1px solid #ddd;border-radius:4px;box-sizing:border-box;font-size:14px}.select-container{position:relative;width:100%}.dropdown-arrow{position:absolute;right:10px;top:50%;transform:translateY(-50%);pointer-events:none;color:#666;font-size:12px}.checkbox-row{display:flex;margin-bottom:10px}.checkbox-group{display:flex;align-items:center;margin-right:20px;min-width:120px}.checkbox-group input[type=checkbox]{margin-right:5px}.toggle-header{display:flex;align-items:center;justify-content:space-between;cursor:pointer;padding:10px}.arrow-icon{width:19px;height:23px;transition:transform .3s ease}.icon{display:inline-block;width:18px;height:18px;border-radius:50%;text-align:center;line-height:18px;color:#fff;font-size:12px;margin-left:5px}.edit-icon{background-color:#4caf50}.view-icon{background-color:#2196f3}.delete-icon{background-color:#f44336}.color-picker-row{display:flex;align-items:center}.color-picker-container{display:flex;align-items:center;border:1px solid #ddd;border-radius:4px;margin-right:10px}.color-box{width:30px;border:none;height:30px}.hex-label{color:#999;margin-right:5px}.hex-input{width:100px}.divider{border-top:1px dashed #ddd;margin:20px 0}.button-container{display:flex;padding:15px;background-color:#f9f9f9;border-top:1px solid #eee}.cancel-btn,.save-btn{padding:12px;border:none;border-radius:4px;cursor:pointer;font-weight:700}.cancel-btn{flex:1;background-color:#fff;color:#666;border:1px solid #ddd;margin-right:10px}.cancel-btn:hover{background-color:#0052cc!important;color:#fff!important}.save-btn{flex:1;background-color:#0052cc;color:#fff}.toggle-group{display:grid;grid-template-columns:1fr 1fr;gap:10px}.toggle-item{display:flex;align-items:center;padding:8px}textarea{width:100%;min-height:55px;padding:8px;border:1px solid #ccc;border-radius:5px;font-size:14px;resize:vertical}.flex-container{display:flex;align-items:center;gap:12px;margin-bottom:1rem}.input-box-field select{background-color:#28343e;color:#fff;border:none;padding:10px 14px;border-radius:6px;appearance:none;-webkit-appearance:none;-moz-appearance:none;position:relative;font-size:14px;font-family:inherit}.input-box-field{position:relative}.input-box-field select::-ms-expand{display:none}.input-box-field:after{content:\"\\25bc\";position:absolute;top:50%;right:10px;transform:translateY(-50%);color:#1c1b1f;pointer-events:none;font-size:10px}.color-selector input[type=color]{width:78px;height:40px;border-radius:4px;background:none;cursor:pointer}.hex-input-container{display:flex;font-size:12px;gap:20px;color:#b0b0b0;align-items:center}.hex-input-container span{font-size:14px;margin-top:10px}.hex-input-container input[type=text]{padding:10px 12px;border:1px solid #d1d1d1;border-radius:6px;font-size:14px;width:120px;color:#28343e}input{width:auto}@media screen and (max-width: 1099px){.container{height:calc(100vh - 20px);min-height:calc(100vh - 20px)}.tabs{flex-direction:column}.tab{flex:1;padding:1rem;font-size:.9rem;text-align:center}.form-group{flex-direction:column}}@media screen and (max-width: 768px){.container{height:calc(100vh - 20px) h;min-height:calc(100vh - 20px)}.tabs{flex-direction:column}.tab{flex:1;padding:1rem;font-size:.9rem;text-align:center}.form-group{flex-direction:column}}@media screen and (max-width: 480px){.container{padding:0 10px}.tabs{flex-direction:column}.tab{flex:1;padding:1rem;border-bottom:1px solid #dee2e6}input[type=text],input[type=number],select,textarea{font-size:.9rem}}@media screen and (max-width: 768px){.tab-content[aria-label=attributes] .form-group,.tab-content[aria-label=property] .form-group,.tab-content[aria-label=appearance] .form-group{grid-template-columns:1fr}.toggle-group{flex-direction:column;align-items:flex-start}}.logo-icon{width:20px;height:20px;display:flex;justify-content:center;background-color:#d0d9ff;border-radius:4px}.link-icon{background-color:#e7f2ff;padding:5px;border-radius:5px;margin:5px;display:inline-block;cursor:pointer;position:relative;transition:background-color .3s,transform .2s}.link-icon:hover{background-color:#d0e5ff}.link-icon:active{background-color:#a8d0ff}.link-dropdown-menu{position:absolute;top:100%;right:0;background:#fff;border:1px solid #ccc;padding:10px;width:200px;box-shadow:0 4px 6px #0000001a}.link-dropdown-menu input{width:100%;margin-bottom:5px;padding:5px;border:1px solid #ccc;border-radius:3px}.option-items{display:flex;align-items:center;padding:5px;border:1px solid #ccc;margin-bottom:10px;cursor:grab;background:#fff}.drag-handle{margin-left:10px;cursor:grab}.option-items:active{opacity:.5}.style-toggle-header{display:flex;justify-content:space-between;align-items:center;background-color:#f8f8f8;border:1px solid #ddd;padding:10px;border-radius:6px;cursor:pointer;margin-bottom:6px}.button-toggle-wrapper{margin-top:8px}.toggle-button{padding:8px 16px;border:1px solid #cbd2d9;border-radius:6px;font-size:14px;cursor:pointer;transition:all .2s ease-in-out}.toggle-button.active:hover{background-color:#2c6dd5}.flex-container{display:flex;gap:8px;align-items:center}.size-select{transition:width .3s ease;width:100%;max-width:200px}.flex-container.custom-active .size-select{max-width:100px}.size-input{width:60px}.margin-inputs{display:flex;gap:15px;margin-top:5px}.margin-inputs>div{display:flex;flex-direction:column;width:60px}.margin-inputs label{font-size:12px;margin-bottom:3px}.pdf-actions-container{width:100%;max-width:400px;padding:10px}.pdf-action-card{background-color:#fff;border-radius:6px;padding:9px;box-shadow:0 2px 6px #0000001a;display:flex;flex-direction:column;gap:10px}.pdf-btn{display:flex;align-items:center;justify-content:center;gap:8px;padding:10px;background-color:#6c757d;color:#fff;border:none;border-radius:4px;cursor:pointer;font-size:14px;transition:background-color .2s}.pdf-btn:hover{background-color:#5a6268}\n"] }]
|
|
1106
1103
|
}], ctorParameters: () => [{ type: i1.HttpClient }, { type: i2.PdfDesignerService }, { type: i3.TemplateService }], propDecorators: { formButtonHandler: [{
|
|
1107
1104
|
type: Output
|
|
1108
1105
|
}], templateSaveHandler: [{
|
|
@@ -1118,4 +1115,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
1118
1115
|
type: HostListener,
|
|
1119
1116
|
args: ['document:click', ['$event']]
|
|
1120
1117
|
}] } });
|
|
1121
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGRmLXByb3BlcnRpZXMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbnh0LWFwcC9zcmMvbGliL3BhZ2VzL3BkZkRlc2lnbmVyL3BkZi1wcm9wZXJ0aWVzL3BkZi1wcm9wZXJ0aWVzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL254dC1hcHAvc3JjL2xpYi9wYWdlcy9wZGZEZXNpZ25lci9wZGYtcHJvcGVydGllcy9wZGYtcHJvcGVydGllcy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsU0FBUyxFQUFjLFlBQVksRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBaUIsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRW5JLE9BQU8sRUFBRSxFQUFFLElBQUksTUFBTSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUUvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHFEQUFxRCxDQUFDO0FBQ25GLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHFFQUFxRSxDQUFDOzs7Ozs7O0FBVTVHLE1BQU0sT0FBTyxzQkFBc0I7SUFxbkJiO0lBQTBCO0lBQStDO0lBbm5CbkYsaUJBQWlCLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztJQUM1QyxtQkFBbUIsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO0lBQ3hELGNBQWMsR0FBVyxFQUFFLENBQUM7SUFDNUIsb0JBQW9CLEdBQVcsQ0FBQyxDQUFDLENBQUM7SUFDekIsbUJBQW1CLEdBQVcsRUFBRSxDQUFDO0lBQzFDLGFBQWEsR0FBVyxZQUFZLENBQUMsQ0FBRSxvQkFBb0I7SUFDM0QsY0FBYyxH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QUFHLENBQUMsQ0FBQztRQUNwQyxDQUFDO0lBQ0gsQ0FBQzt3R0E3b0NVLHNCQUFzQjs0RkFBdEIsc0JBQXNCLHdiQ2xCbkMsdW00QkF1ZUEsdzNSRHpkWSxZQUFZLDZWQUFFLFdBQVcsa2lEQUFFLFlBQVksaUxBQUUscUJBQXFCOzs0RkFJN0Qsc0JBQXNCO2tCQVBsQyxTQUFTOytCQUNFLG9CQUFvQixjQUNsQixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxxQkFBcUIsQ0FBQzs4SUFNL0QsaUJBQWlCO3NCQUExQixNQUFNO2dCQUNHLG1CQUFtQjtzQkFBNUIsTUFBTTtnQkFHRSxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBMkNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFFb0MsUUFBUTtzQkFBakQsU0FBUzt1QkFBQyxVQUFVLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQThpQ3hDLGNBQWM7c0JBRGIsWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSG9zdExpc3RlbmVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIFNpbXBsZUNoYW5nZXMsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ3JvcHBlclBvc2l0aW9uLCBEaW1lbnNpb25zLCBJbWFnZVRyYW5zZm9ybSB9IGZyb20gJy4uLy4uLy4uL2NvbXBvbmVudHMvaW1hZ2UtY3JvcHBlci9pbnRlcmZhY2VzJztcbmltcG9ydCB7IHY0IGFzIHV1aWR2NCB9IGZyb20gJ3V1aWQnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFBkZkRlc2lnbmVyU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3BkZi1kZXNpZ25lci5zZXJ2aWNlJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTnh0U2VhcmNoQm94IH0gZnJvbSAnLi4vLi4vLi4vY29tcG9uZW50cy9zZWFyY2gtYm94L3NlYXJjaC1ib3guY29tcG9uZW50JztcbmltcG9ydCB7IEltYWdlQ3JvcHBlckNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2NvbXBvbmVudHMvaW1hZ2UtY3JvcHBlci9jb21wb25lbnQvaW1hZ2UtY3JvcHBlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgVGVtcGxhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvdGVtcGxhdGUuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1wZGYtcHJvcGVydGllcycsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEZvcm1zTW9kdWxlLCBOeHRTZWFyY2hCb3gsIEltYWdlQ3JvcHBlckNvbXBvbmVudF0sXG4gIHRlbXBsYXRlVXJsOiAnLi9wZGYtcHJvcGVydGllcy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9wZGYtcHJvcGVydGllcy5jb21wb25lbnQuY3NzJ1xufSlcbmV4cG9ydCBjbGFzcyBQZGZQcm9wZXJ0aWVzQ29tcG9uZW50IHtcblxuICBAT3V0cHV0KCkgZm9ybUJ1dHRvbkhhbmRsZXIgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIHRlbXBsYXRlU2F2ZUhhbmRsZXIgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgc2VsZWN0ZWRPcHRpb246IHN0cmluZyA9ICcnO1xuICBzZWxlY3RlZEVsZW1lbnRJbmRleDogbnVtYmVyID0gLTE7XG4gIEBJbnB1dCgpIHNlbGVjdGVkRWxlbWVudFR5cGU6IHN0cmluZyA9ICcnO1xuICBzZWxlY3RlZEFsaWduOiBzdHJpbmcgPSAnYWxpZ24tbGVmdCc7ICAvLyBBZGQgdGhpcyBwcm9wZXJ0eVxuICBzZWxlY3RlZFN0eWxlczogc3RyaW5nW10gPSBbXTsgIC8vIFVzaW5nIGFycmF5IHNpbmNlIG11bHRpcGxlIHN0eWxlcyBjYW4gYmUgc2VsZWN0ZWRcbiAgc2VsZWN0ZWRFbGVtZW50OiBhbnkgPSBudWxsOyAgLy8gUmVjZWl2ZSB0aGUgc2VsZWN0ZWQgZWxlbWVudFxuICBoZWFkZXJTZWxlY3Q6IGJvb2xlYW4gPSBmYWxzZTtcbiAgYm9va0lkOiBhbnk7XG4gIHBkZjogYW55O1xuICBhY3RpdmVUYWI6IHN0cmluZyA9ICdhdHRyaWJ1dGVzJztcbiAgc2VsZWN0Q29sdW1uOiBhbnlcbiAgdHJhbnNmb3JtOiBJbWFnZVRyYW5zZm9ybSA9IHtcbiAgICB0cmFuc2xhdGVVbml0OiAncHgnLFxuICAgIHNjYWxlOiAxLFxuICAgIHJvdGF0ZTogMCxcbiAgICBmbGlwSDogZmFsc2UsXG4gICAgZmxpcFY6IGZhbHNlLFxuICAgIHRyYW5zbGF0ZUg6IDAsXG4gICAgdHJhbnNsYXRlVjogMFxuICB9O1xuICBjYW52YXNSb3RhdGlvbiA9IDA7XG4gIGNyb3BwZXI/OiBDcm9wcGVyUG9zaXRpb247XG4gIGxvYWRpbmcgPSBmYWxzZTtcbiAgY3JvcHBlck1heEhlaWdodCA9IDA7XG4gIGNyb3BwZXJNYXhXaWR0aCA9IDA7XG4gIGNyb3BwZXJNaW5IZWlnaHQgPSAwO1xuICBjcm9wcGVyTWluV2lkdGggPSAwO1xuICBjcm9wcGVyU3RhdGljV2lkdGggPSAwO1xuICBjcm9wcGVyU3RhdGljSGVpZ2h0ID0gMDtcbiAgYXNwZWN0UmF0aW8gPSA0IC8gMztcbiAgcm91bmRDcm9wcGVyID0gZmFsc2U7XG4gIGltYWdlQ2hhbmdlZEV2ZW50OiBFdmVudCB8IG51bGwgPSBudWxsO1xuICBhbGlnbkltYWdlID0gJ2NlbnRlcicgYXMgY29uc3Q7XG4gIC8vICBcImVuZHBvaW50XCI6IFwiaHR0cHM6Ly9kZXYtYXBpLnZhbGFyaHIuY29tL254dFwiLFxuICAvLyBTS1MyOE1BUjI1IGRlZmF1bHQgcGRmIHNlYXJjaCBlbmRwb2ludFxuICBib29rU3VidGV4dCA9IHtcbiAgICBcImVuZHBvaW50XCI6IFwiaHR0cHM6Ly8wNWRiZDIzMS1jZjQzLTRkMTEtYmQyNC1kOGVhNzFhNDU4MjgubW9jay5wc3Rtbi5pb1wiLFxuICAgIFwidmFyaWFibGVcIjogbnVsbCxcbiAgICBcImZpZWxkXCI6IFsndGl0bGUnXSxcbiAgICBcImRlZmF1bHRGaWVsZFwiOiBcInRpdGxlXCJcbiAgfVxuICBpc0xpbmtEcm9wZG93bk9wZW4gPSBmYWxzZTtcbiAgZmllbGRBc1N0cmluZzogc3RyaW5nID0gJyc7XG4gIGZpbHRlcmVkQ29sdW1uczogYW55W10gPSBbXTtcblxuICBASW5wdXQoKSB0ZW1wbGF0ZVNlbGVjdGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQFZpZXdDaGlsZCgnZHJvcGRvd24nLCB7IHN0YXRpYzogZmFsc2UgfSkgZHJvcGRvd24hOiBFbGVtZW50UmVmO1xuXG5cbiAgZHJhZ2dlZElkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcGRmRWxlbWVudHM6IGFueVtdID0gW107XG4gXG4gIHVuaXF1ZV9pZDogc3RyaW5nID0gJ3BkZi0xMjM0JzsgLy8gc2hvdWxkIGJlIGNvbnNpc3RlbnRcbiAgc2VsZWN0ZWRUZW1wbGF0ZTogYW55O1xuXG4gIGVsZW1lbnRQcm9wZXJ0aWVzID0ge1xuICAgIC8vIEFQLTEwTUFSMjUgLSBEZWZpbmVzIHRoZSBIZWFkZXIgZWxlbWVudCB3aXRoIGEgdGV4dCBpbnB1dCBmaWVsZCAgIFxuICAgIC8vIEFQLTI1TUFSMjUgQWRkIHN1YnRleHQgYWxsIHZhcmlhYmxlc1xuICAgICdIZWFkZXInOiB7XG4gICAgICBlbGVtZW50UHJvcHM6IFtcbiAgICAgICAgeyBsYWJlbDogJ0xhYmVsJywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0JywgdHlwZTogJ3RleHQnLCBrZXk6ICd0aXRsZScgfV1cbiAgICB9LFxuXG4gICAgJ3RleHQnOiB7XG4gICAgICBlbGVtZW50UHJvcHM6IFtcbiAgICAgICAgeyBsYWJlbDogJ1BsYWNlIEhvbGRlcicsIHBsYWNlaG9sZGVyOiAnRW50ZXIgVGV4dCcsIHR5cGU6ICd0ZXh0Jywga2V5OiAncXVlc3Rpb24nIH0sXG4gICAgICAgIHsgbGFiZWw6ICdFbGVtZW50JywgdHlwZTogJ251bWJlcicsIGtleTogJ3F1ZXN0aW9uTnVtYmVyJyB9LFxuICAgICAgICB7IGxhYmVsOiAnd2lkdGgnLCB0eXBlOiAnZmllbGRTaXplJywga2V5OiAnd2lkdGgnIH0sXG4gICAgICBdLFxuICAgICAgZmllbGRQcm9wczogW1xuICAgICAgICB7IGxhYmVsOiAnJywgdHlwZTogJ3RvZ2dsZUdyb3VwJywga2V5OiAndG9nZ2xlT3B0aW9ucycgfSxcbiAgICAgICAgeyBsYWJlbDogJ0hlbHAgVGV4dCcsIHBsYWNlaG9sZGVyOiAnRW50ZXIgVGV4dCAnLCB0eXBlOiAndGV4dCcgfSxcbiAgICAgICAgeyBsYWJlbDogJ1ZhbHVlJywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0ICcsIHR5cGU6ICd0ZXh0Jywga2V5OiAndmFsdWUnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdSZWZlcmVuY2UgRmllbGQnLCBwbGFjZWhvbGRlcjogJ1JlZmVyZW5jZSBGaWVsZCcsIHR5cGU6ICd0ZXh0Jywga2V5OiAncmVmZXJlbmNlRmllbGQnIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcImxhYmVsXCI6IFwiXCIsIFwicGxhY2Vob2xkZXJcIjogXCJFbnRlciBUZXh0XCIsIFwidHlwZVwiOiBcInN1YlF1ZXN0aW9uXCIsIFwia2V5XCI6IFwiaXNTdWJUZXh0XCIsXG4gICAgICAgICAgXCJzdWJRdWVzdGlvblwiOiBbXG4gICAgICAgICAgXVxuICAgICAgICB9XG4gICAgICBdLFxuICAgICAgYXBwZWFyYW5jZTogW1xuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICdTZWxlY3QgRm9udCcsIHR5cGU6ICdzZWxlY3QnLCBrZXk6ICdmb250JywgcGxhY2Vob2xkZXI6ICdMZWZ0JyxcbiAgICAgICAgICBvcHRpb25zOiBbJ0hlbHZldGljYSBOZXVlJywgJ0FyaWFsJywgJ1RpbWVzIE5ldyBSb21hbicsICdSb2JvdG8nXVxuICAgICAgICB9LFxuICAgICAgICB7IGxhYmVsOiAnRm9udCBDb2xvcicsIHR5cGU6ICdjb2xvcicsIGtleTogJ2ZvbnRDb2xvcicsIHZhbHVlOiAnJyB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICdGb250IFNpemUnLFxuICAgICAgICAgIHR5cGU6ICdudW1iZXInLCAgICBcbiAgICAgICAgICBrZXk6ICdmb250U2l6ZScsXG4gICAgICAgICAgdmFsdWU6IDE0ICAgICAgICAgIFxuICAgICAgICB9LCAgICAgICAgXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ0ZvbnQgV2VpZ2h0JywgdHlwZTogJ3NlbGVjdCcsIGtleTogJ2ZvbnRXZWlnaHQnLCB2YWx1ZTogJycsXG4gICAgICAgICAgb3B0aW9uczogW1xuICAgICAgICAgICAgeyB2YWx1ZTogJzQwMCcsIGxhYmVsOiAnNDAwLU5vcm1hbCcgfSxcbiAgICAgICAgICAgIHsgdmFsdWU6ICc1MDAnLCBsYWJlbDogJzUwMC1NZWRpdW0nIH0sXG4gICAgICAgICAgICB7IHZhbHVlOiAnNjAwJywgbGFiZWw6ICc2MDAtU2VtaSBCb2xkJyB9LFxuICAgICAgICAgICAgeyB2YWx1ZTogJzcwMCcsIGxhYmVsOiAnNzAwLUJvbGQnIH1cbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ0ZvbnQgU3R5bGUnLCB0eXBlOiAnc2VsZWN0Jywga2V5OiAnZm9udFN0eWxlJywgdmFsdWU6ICcnLFxuICAgICAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgICAgIHsgbGFiZWw6ICdOb3JtYWwnLCB2YWx1ZTogJ25vcm1hbCcgfSxcbiAgICAgICAgICAgIHsgbGFiZWw6ICdCb2xkJywgdmFsdWU6ICdib2xkJyB9LFxuICAgICAgICAgICAgeyBsYWJlbDogJ0l0YWxpYycsIHZhbHVlOiAnaXRhbGljJyB9XG4gICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICdNYXJnaW4nLCB0eXBlOiAnbWFyZ2luUGlja2VyJywga2V5OiAnbWFyZ2luJyxcbiAgICAgICAgICBwbGFjZWhvbGRlcjogJ0xlZnQsIFRvcCwgUmlnaHQsIEJvdHRvbScsXG4gICAgICAgICAgdmFsdWU6IFswLCAwLCAwLCAwXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICdBbGlnbiBJdGVtJywgdHlwZTogJ3NlbGVjdCcsIGtleTogJ2FsaWduSXRlbXMnLCB2YWx1ZTogJycsXG4gICAgICAgICAgb3B0aW9uczogW1xuICAgICAgICAgICAgeyBsYWJlbDogJ0xlZnQnLCB2YWx1ZTogJ2xlZnQnIH0sXG4gICAgICAgICAgICB7IGxhYmVsOiAnQ2VudGVyJywgdmFsdWU6ICdjZW50ZXInIH0sXG4gICAgICAgICAgICB7IGxhYmVsOiAnUmlnaHQnLCB2YWx1ZTogJ3JpZ2h0JyB9XG4gICAgICAgICAgXVxuICAgICAgICB9XG4gICAgICBdXG4gICAgICBcbiAgICB9LFxuICAgICdpbnB1dCc6IHtcbiAgICAgIGVsZW1lbnRQcm9wczogW1xuICAgICAgICB7IGxhYmVsOiAnUGxhY2UgSG9sZGVyJywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0JywgdHlwZTogJ3RleHQnLCBrZXk6ICdxdWVzdGlvbicgfSxcbiAgICAgICAgeyBsYWJlbDogJ0VsZW1lbnQnLCB0eXBlOiAnbnVtYmVyJywga2V5OiAncXVlc3Rpb25OdW1iZXInIH0sXG4gICAgICAgIHsgbGFiZWw6ICd3aWR0aCcsIHR5cGU6ICdmaWVsZFNpemUnLCBrZXk6ICd3aWR0aCcgfSxcbiAgICAgIF0sXG4gICAgICBmaWVsZFByb3BzOiBbXG4gICAgICAgIHsgbGFiZWw6ICcnLCB0eXBlOiAndG9nZ2xlR3JvdXAnLCBrZXk6ICd0b2dnbGVPcHRpb25zJyB9LFxuICAgICAgICB7IGxhYmVsOiAnSGVscCBUZXh0JywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0ICcsIHR5cGU6ICd0ZXh0JyB9LFxuICAgICAgICB7IGxhYmVsOiAnVmFsdWUnLCBwbGFjZWhvbGRlcjogJ0VudGVyIFRleHQgJywgdHlwZTogJ3RleHQnLCBrZXk6ICd2YWx1ZScgfSxcbiAgICAgICAgeyBsYWJlbDogJ1JlZmVyZW5jZSBGaWVsZCcsIHBsYWNlaG9sZGVyOiAnUmVmZXJlbmNlIEZpZWxkJywgdHlwZTogJ3RleHQnLCBrZXk6ICdyZWZlcmVuY2VGaWVsZCcgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibGFiZWxcIjogXCJcIiwgXCJwbGFjZWhvbGRlclwiOiBcIkVudGVyIFRleHRcIiwgXCJ0eXBlXCI6IFwic3ViUXVlc3Rpb25cIiwgXCJrZXlcIjogXCJpc1N1YlRleHRcIixcbiAgICAgICAgICBcInN1YlF1ZXN0aW9uXCI6IFtcbiAgICAgICAgICBdXG4gICAgICAgIH1cbiAgICAgIF0sXG4gICAgICBhcHBlYXJhbmNlOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ1NlbGVjdCBGb250JywgdHlwZTogJ3NlbGVjdCcsIGtleTogJ2ZvbnQnLCBwbGFjZWhvbGRlcjogJ0xlZnQnLFxuICAgICAgICAgIG9wdGlvbnM6IFsnSGVsdmV0aWNhIE5ldWUnLCAnQXJpYWwnLCAnVGltZXMgTmV3IFJvbWFuJywgJ1JvYm90byddXG4gICAgICAgIH0sXG4gICAgICAgIHsgbGFiZWw6ICdGb250IENvbG9yJywgdHlwZTogJ2NvbG9yJywga2V5OiAnZm9udENvbG9yJywgdmFsdWU6ICcnIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ0ZvbnQgU2l6ZScsXG4gICAgICAgICAgdHlwZTogJ251bWJlcicsICAgIFxuICAgICAgICAgIGtleTogJ2ZvbnRTaXplJyxcbiAgICAgICAgICB2YWx1ZTogMTQgICAgICAgICAgXG4gICAgICAgIH0sICAgICAgICBcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnRm9udCBXZWlnaHQnLCB0eXBlOiAnc2VsZWN0Jywga2V5OiAnZm9udFdlaWdodCcsIHZhbHVlOiAnJyxcbiAgICAgICAgICBvcHRpb25zOiBbXG4gICAgICAgICAgICB7IHZhbHVlOiAnNDAwJywgbGFiZWw6ICc0MDAtTm9ybWFsJyB9LFxuICAgICAgICAgICAgeyB2YWx1ZTogJzUwMCcsIGxhYmVsOiAnNTAwLU1lZGl1bScgfSxcbiAgICAgICAgICAgIHsgdmFsdWU6ICc2MDAnLCBsYWJlbDogJzYwMC1TZW1pIEJvbGQnIH0sXG4gICAgICAgICAgICB7IHZhbHVlOiAnNzAwJywgbGFiZWw6ICc3MDAtQm9sZCcgfVxuICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnRm9udCBTdHlsZScsIHR5cGU6ICdzZWxlY3QnLCBrZXk6ICdmb250U3R5bGUnLCB2YWx1ZTogJycsXG4gICAgICAgICAgb3B0aW9uczogW1xuICAgICAgICAgICAgeyBsYWJlbDogJ05vcm1hbCcsIHZhbHVlOiAnbm9ybWFsJyB9LFxuICAgICAgICAgICAgeyBsYWJlbDogJ0JvbGQnLCB2YWx1ZTogJ2JvbGQnIH0sXG4gICAgICAgICAgICB7IGxhYmVsOiAnSXRhbGljJywgdmFsdWU6ICdpdGFsaWMnIH1cbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ01hcmdpbicsIHR5cGU6ICdtYXJnaW5QaWNrZXInLCBrZXk6ICdtYXJnaW4nLFxuICAgICAgICAgIHBsYWNlaG9sZGVyOiAnTGVmdCwgVG9wLCBSaWdodCwgQm90dG9tJyxcbiAgICAgICAgICB2YWx1ZTogWzAsIDAsIDAsIDBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ0FsaWduIEl0ZW0nLCB0eXBlOiAnc2VsZWN0Jywga2V5OiAnYWxpZ25JdGVtcycsIHZhbHVlOiAnJyxcbiAgICAgICAgICBvcHRpb25zOiBbXG4gICAgICAgICAgICB7IGxhYmVsOiAnTGVmdCcsIHZhbHVlOiAnbGVmdCcgfSxcbiAgICAgICAgICAgIHsgbGFiZWw6ICdDZW50ZXInLCB2YWx1ZTogJ2NlbnRlcicgfSxcbiAgICAgICAgICAgIHsgbGFiZWw6ICdSaWdodCcsIHZhbHVlOiAncmlnaHQnIH1cbiAgICAgICAgICBdXG4gICAgICAgIH1cbiAgICAgIF1cbiAgICAgIFxuICAgIH0sXG4gICAgJ2RhdGUnOiB7XG4gICAgICBlbGVtZW50UHJvcHM6IFtcbiAgICAgICAgeyBsYWJlbDogJ1BsYWNlIEhvbGRlcicsIHBsYWNlaG9sZGVyOiAnRW50ZXIgVGV4dCcsIHR5cGU6ICd0ZXh0Jywga2V5OiAncXVlc3Rpb24nIH0sXG4gICAgICAgIHsgbGFiZWw6ICdFbGVtZW50JywgdHlwZTogJ251bWJlcicsIGtleTogJ3F1ZXN0aW9uTnVtYmVyJyB9LFxuICAgICAgICB7IGxhYmVsOiAnd2lkdGgnLCB0eXBlOiAnZmllbGRTaXplJywga2V5OiAnd2lkdGgnIH0sXG4gICAgICBdLFxuICAgICAgZmllbGRQcm9wczogW1xuICAgICAgICB7IGxhYmVsOiAnJywgdHlwZTogJ3RvZ2dsZUdyb3VwJywga2V5OiAndG9nZ2xlT3B0aW9ucycgfSxcbiAgICAgICAgeyBsYWJlbDogJ0hlbHAgVGV4dCcsIHBsYWNlaG9sZGVyOiAnRW50ZXIgVGV4dCAnLCB0eXBlOiAndGV4dCcgfSxcbiAgICAgICAgeyBsYWJlbDogJ1ZhbHVlJywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0ICcsIHR5cGU6ICd0ZXh0Jywga2V5OiAndmFsdWUnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdSZWZlcmVuY2UgRmllbGQnLCBwbGFjZWhvbGRlcjogJ1JlZmVyZW5jZSBGaWVsZCcsIHR5cGU6ICd0ZXh0Jywga2V5OiAncmVmZXJlbmNlRmllbGQnIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcImxhYmVsXCI6IFwiXCIsIFwicGxhY2Vob2xkZXJcIjogXCJFbnRlciBUZXh0XCIsIFwidHlwZVwiOiBcInN1YlF1ZXN0aW9uXCIsIFwia2V5XCI6IFwiaXNTdWJUZXh0XCIsXG4gICAgICAgICAgXCJzdWJRdWVzdGlvblwiOiBbXG4gICAgICAgICAgXVxuICAgICAgICB9XG4gICAgICBdLFxuICAgICAgYXBwZWFyYW5jZTogW1xuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICdTZWxlY3QgRm9udCcsIHR5cGU6ICdzZWxlY3QnLCBrZXk6ICdmb250JywgcGxhY2Vob2xkZXI6ICdMZWZ0JyxcbiAgICAgICAgICBvcHRpb25zOiBbJ0hlbHZldGljYSBOZXVlJywgJ0FyaWFsJywgJ1RpbWVzIE5ldyBSb21hbicsICdSb2JvdG8nXVxuICAgICAgICB9LFxuICAgICAgICB7IGxhYmVsOiAnRm9udCBDb2xvcicsIHR5cGU6ICdjb2xvcicsIGtleTogJ2ZvbnRDb2xvcicsIHZhbHVlOiAnJyB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICdGb250IFNpemUnLFxuICAgICAgICAgIHR5cGU6ICdudW1iZXInLCAgICBcbiAgICAgICAgICBrZXk6ICdmb250U2l6ZScsXG4gICAgICAgICAgdmFsdWU6IDE0ICAgICAgICAgIFxuICAgICAgICB9LCAgICAgICAgXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ0ZvbnQgV2VpZ2h0JywgdHlwZTogJ3NlbGVjdCcsIGtleTogJ2ZvbnRXZWlnaHQnLCB2YWx1ZTogJycsXG4gICAgICAgICAgb3B0aW9uczogW1xuICAgICAgICAgICAgeyB2YWx1ZTogJzQwMCcsIGxhYmVsOiAnNDAwLU5vcm1hbCcgfSxcbiAgICAgICAgICAgIHsgdmFsdWU6ICc1MDAnLCBsYWJlbDogJzUwMC1NZWRpdW0nIH0sXG4gICAgICAgICAgICB7IHZhbHVlOiAnNjAwJywgbGFiZWw6ICc2MDAtU2VtaSBCb2xkJyB9LFxuICAgICAgICAgICAgeyB2YWx1ZTogJzcwMCcsIGxhYmVsOiAnNzAwLUJvbGQnIH1cbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ0ZvbnQgU3R5bGUnLCB0eXBlOiAnc2VsZWN0Jywga2V5OiAnZm9udFN0eWxlJywgdmFsdWU6ICcnLFxuICAgICAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgICAgIHsgbGFiZWw6ICdOb3JtYWwnLCB2YWx1ZTogJ25vcm1hbCcgfSxcbiAgICAgICAgICAgIHsgbGFiZWw6ICdCb2xkJywgdmFsdWU6ICdib2xkJyB9LFxuICAgICAgICAgICAgeyBsYWJlbDogJ0l0YWxpYycsIHZhbHVlOiAnaXRhbGljJyB9XG4gICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICdNYXJnaW4nLCB0eXBlOiAnbWFyZ2luUGlja2VyJywga2V5OiAnbWFyZ2luJyxcbiAgICAgICAgICBwbGFjZWhvbGRlcjogJ0xlZnQsIFRvcCwgUmlnaHQsIEJvdHRvbScsXG4gICAgICAgICAgdmFsdWU6IFswLCAwLCAwLCAwXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICdBbGlnbiBJdGVtJywgdHlwZTogJ3NlbGVjdCcsIGtleTogJ2FsaWduSXRlbXMnLCB2YWx1ZTogJycsXG4gICAgICAgICAgb3B0aW9uczogW1xuICAgICAgICAgICAgeyBsYWJlbDogJ0xlZnQnLCB2YWx1ZTogJ2xlZnQnIH0sXG4gICAgICAgICAgICB7IGxhYmVsOiAnQ2VudGVyJywgdmFsdWU6ICdjZW50ZXInIH0sXG4gICAgICAgICAgICB7IGxhYmVsOiAnUmlnaHQnLCB2YWx1ZTogJ3JpZ2h0JyB9XG4gICAgICAgICAgXVxuICAgICAgICB9XG4gICAgICBdXG4gICAgICBcbiAgICB9LFxuICAgICdQZGYnOiB7XG4gICAgICBlbGVtZW50UHJvcHM6IFsgICBcbiAgICAgICAgeyBsYWJlbDogJ0VsZW1lbnQnLCB0eXBlOiAnbnVtYmVyJywga2V5OiAncXVlc3Rpb25OdW1iZXInIH0sXG4gICAgICAgIHsgbGFiZWw6ICd3aWR0aCcsIHR5cGU6ICdmaWVsZFNpemUnLCBrZXk6ICd3aWR0aCcgfVxuICAgICAgXSxcbiAgICAgIGZpZWxkUHJvcHM6IFtcbiAgICAgICAgeyBsYWJlbDogJ0hlbHAgVGV4dCcsIHBsYWNlaG9sZGVyOiAnRW50ZXIgVGV4dCAnLCB0eXBlOiAndGV4dCcgfSxcbiAgICAgICAgeyBsYWJlbDogJ1ZhbHVlJywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0ICcsIHR5cGU6ICd0ZXh0Jywga2V5OiAndmFsdWUnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdSZWZlcmVuY2UgRmllbGQnLCBwbGFjZWhvbGRlcjogJ1JlZmVyZW5jZSBGaWVsZCcsIHR5cGU6ICd0ZXh0Jywga2V5OiAncmVmZXJlbmNlRmllbGQnIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcImxhYmVsXCI6IFwiXCIsIFwicGxhY2Vob2xkZXJcIjogXCJFbnRlciBUZXh0XCIsIFwidHlwZVwiOiBcInN1YlF1ZXN0aW9uXCIsIFwia2V5XCI6IFwiaXNTdWJUZXh0XCIsXG4gICAgICAgICAgXCJzdWJRdWVzdGlvblwiOiBbXG4gICAgICAgICAgXVxuICAgICAgICB9XG4gICAgICBdLFxuICAgICAgYXBwZWFyYW5jZTogW11cbiAgICB9LFxuICAgIC8vIEFQLTE5TUFSMjUgQWRkIExpbmUgUHJvcGVydHlcbiAgICAnTGluZSc6IHtcbiAgICAgIGVsZW1lbnRQcm9wczogW1xuICAgICAgICB7IGxhYmVsOiAnTGluZSBXaWR0aCcsIHR5cGU6ICdmaWVsZFNpemUnLCBrZXk6ICd3aWR0aCcgfSxcbiAgICAgICAgeyBsYWJlbDogJ1BhZGRpbmcgVG9wJywgdHlwZTogJ251bWJlcicsIGtleTogJ3BhZGRpbmdUb3AnLCBwbGFjZWhvbGRlcjogJ0VudGVyIHBhZGRpbmcgdG9wJyB9LFxuICAgICAgICB7IGxhYmVsOiAnUGFkZGluZyBCb3R0b20nLCB0eXBlOiAnbnVtYmVyJywga2V5OiAncGFkZGluZ0JvdHRvbScsIHBsYWNlaG9sZGVyOiAnRW50ZXIgcGFkZGluZyBib3R0b20nIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ0xpbmUgU3R5bGUnLCB0eXBlOiAnc2VsZWN0Jywga2V5OiAnbGluZVN0eWxlJyxcbiAgICAgICAgICBvcHRpb25zOiBbJ1NvbGlkJywgJ0Rhc2hlZCcsICdEb3R0ZWQnXVxuICAgICAgICB9XG4gICAgICBdLFxuICAgICAgZmllbGRQcm9wczogW10sXG4gICAgICBhcHBlYXJhbmNlOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ1NlbGVjdCBGb250JywgdHlwZTogJ3NlbGVjdCcsIGtleTogJ2ZvbnQnLCBwbGFjZWhvbGRlcjogJ0xlZnQnLFxuICAgICAgICAgIG9wdGlvbnM6IFsnSGVsdmV0aWNhIE5ldWUnLCAnQXJpYWwnLCAnVGltZXMgTmV3IFJvbWFuJywgJ1JvYm90byddXG4gICAgICAgIH0sXG4gICAgICAgIHsgbGFiZWw6ICdGb250IENvbG9yJywgdHlwZTogJ2NvbG9yJywga2V5OiAnZm9udENvbG9yJywgdmFsdWU6ICcnIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ0ZvbnQgU2l6ZScsXG4gICAgICAgICAgdHlwZTogJ251bWJlcicsICAgIFxuICAgICAgICAgIGtleTogJ2ZvbnRTaXplJyxcbiAgICAgICAgICB2YWx1ZTogMTQgICAgICAgICAgXG4gICAgICAgIH0sICAgICAgICBcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnRm9udCBXZWlnaHQnLCB0eXBlOiAnc2VsZWN0Jywga2V5OiAnZm9udFdlaWdodCcsIHZhbHVlOiAnJyxcbiAgICAgICAgICBvcHRpb25zOiBbXG4gICAgICAgICAgICB7IHZhbHVlOiAnNDAwJywgbGFiZWw6ICc0MDAtTm9ybWFsJyB9LFxuICAgICAgICAgICAgeyB2YWx1ZTogJzUwMCcsIGxhYmVsOiAnNTAwLU1lZGl1bScgfSxcbiAgICAgICAgICAgIHsgdmFsdWU6ICc2MDAnLCBsYWJlbDogJzYwMC1TZW1pIEJvbGQnIH0sXG4gICAgICAgICAgICB7IHZhbHVlOiAnNzAwJywgbGFiZWw6ICc3MDAtQm9sZCcgfVxuICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnRm9udCBTdHlsZScsIHR5cGU6ICdzZWxlY3QnLCBrZXk6ICdmb250U3R5bGUnLCB2YWx1ZTogJycsXG4gICAgICAgICAgb3B0aW9uczogW1xuICAgICAgICAgICAgeyBsYWJlbDogJ05vcm1hbCcsIHZhbHVlOiAnbm9ybWFsJyB9LFxuICAgICAgICAgICAgeyBsYWJlbDogJ0JvbGQnLCB2YWx1ZTogJ2JvbGQnIH0sXG4gICAgICAgICAgICB7IGxhYmVsOiAnSXRhbGljJywgdmFsdWU6ICdpdGFsaWMnIH1cbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ01hcmdpbicsIHR5cGU6ICdtYXJnaW5QaWNrZXInLCBrZXk6ICdtYXJnaW4nLFxuICAgICAgICAgIHBsYWNlaG9sZGVyOiAnTGVmdCwgVG9wLCBSaWdodCwgQm90dG9tJyxcbiAgICAgICAgICB2YWx1ZTogWzAsIDAsIDAsIDBdXG4gICAgICAgIH0sXG4gICAgICAgIC8vIHtcbiAgICAgICAgLy8gICBsYWJlbDogJ0FsaWduIEl0ZW0nLCB0eXBlOiAnc2VsZWN0Jywga2V5OiAnYWxpZ25JdGVtcycsIHZhbHVlOiAnJyxcbiAgICAgICAgLy8gICBvcHRpb25zOiBbXG4gICAgICAgIC8vICAgICB7IGxhYmVsOiAnTGVmdCcsIHZhbHVlOiAnbGVmdCcgfSxcbiAgICAgICAgLy8gICAgIHsgbGFiZWw6ICdDZW50ZXInLCB2YWx1ZTogJ2NlbnRlcicgfSxcbiAgICAgICAgLy8gICAgIHsgbGFiZWw6ICdSaWdodCcsIHZhbHVlOiAncmlnaHQnIH1cbiAgICAgICAgLy8gICBdXG4gICAgICAgIC8vIH1cbiAgICAgIF1cbiAgICAgIFxuICAgIH0sXG5cbiAgICAnU3BhY2UnOiB7XG4gICAgICBlbGVtZW50UHJvcHM6IFtcbiAgICAgICAgeyBsYWJlbDogJ0VsZW1lbnQnLCB0eXBlOiAnbnVtYmVyJywga2V5OiAncXVlc3Rpb25OdW1iZXInIH0sXG4gICAgICAgIHsgbGFiZWw6ICdGaWVsZCBTaXplJywgdHlwZTogJ2ZpZWxkU2l6ZScsIGtleTogJ3dpZHRoJyB9LFxuICAgICAgXSxcbiAgICAgIGZpZWxkUHJvcHM6IFtdLFxuICAgICAgYXBwZWFyYW5jZTogW1xuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICdTZWxlY3QgRm9udCcsIHR5cGU6ICdzZWxlY3QnLCBrZXk6ICdmb250JywgcGxhY2Vob2xkZXI6ICdMZWZ0JyxcbiAgICAgICAgICBvcHRpb25zOiBbJ0hlbHZldGljYSBOZXVlJywgJ0FyaWFsJywgJ1RpbWVzIE5ldyBSb21hbicsICdSb2JvdG8nXVxuICAgICAgICB9LFxuICAgICAgICB7IGxhYmVsOiAnRm9udCBDb2xvcicsIHR5cGU6ICdjb2xvcicsIGtleTogJ2ZvbnRDb2xvcicsIHZhbHVlOiAnJyB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICdGb250IFNpemUnLFxuICAgICAgICAgIHR5cGU6ICdudW1iZXInLCAgICBcbiAgICAgICAgICBrZXk6ICdmb250U2l6ZScsXG4gICAgICAgICAgdmFsdWU6IDE0ICAgICAgICAgIFxuICAgICAgICB9LCAgICAgICAgXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ0ZvbnQgV2VpZ2h0JywgdHlwZTogJ3NlbGVjdCcsIGtleTogJ2ZvbnRXZWlnaHQnLCB2YWx1ZTogJycsXG4gICAgICAgICAgb3B0aW9uczogW1xuICAgICAgICAgICAgeyB2YWx1ZTogJzQwMCcsIGxhYmVsOiAnNDAwLU5vcm1hbCcgfSxcbiAgICAgICAgICAgIHsgdmFsdWU6ICc1MDAnLCBsYWJlbDogJzUwMC1NZWRpdW0nIH0sXG4gICAgICAgICAgICB7IHZhbHVlOiAnNjAwJywgbGFiZWw6ICc2MDAtU2VtaSBCb2xkJyB9LFxuICAgICAgICAgICAgeyB2YWx1ZTogJzcwMCcsIGxhYmVsOiAnNzAwLUJvbGQnIH1cbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ0ZvbnQgU3R5bGUnLCB0eXBlOiAnc2VsZWN0Jywga2V5OiAnZm9udFN0eWxlJywgdmFsdWU6ICcnLFxuICAgICAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgICAgIHsgbGFiZWw6ICdOb3JtYWwnLCB2YWx1ZTogJ25vcm1hbCcgfSxcbiAgICAgICAgICAgIHsgbGFiZWw6ICdCb2xkJywgdmFsdWU6ICdib2xkJyB9LFxuICAgICAgICAgICAgeyBsYWJlbDogJ0l0YWxpYycsIHZhbHVlOiAnaXRhbGljJyB9XG4gICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICdNYXJnaW4nLCB0eXBlOiAnbWFyZ2luUGlja2VyJywga2V5OiAnbWFyZ2luJyxcbiAgICAgICAgICBwbGFjZWhvbGRlcjogJ0xlZnQsIFRvcCwgUmlnaHQsIEJvdHRvbScsXG4gICAgICAgICAgdmFsdWU6IFswLCAwLCAwLCAwXVxuICAgICAgICB9LFxuICAgICAgICAvLyB7XG4gICAgICAgIC8vICAgbGFiZWw6ICdBbGlnbiBJdGVtJywgdHlwZTogJ3NlbGVjdCcsIGtleTogJ2FsaWduSXRlbXMnLCB2YWx1ZTogJycsXG4gICAgICAgIC8vICAgb3B0aW9uczogW1xuICAgICAgICAvLyAgICAgeyBsYWJlbDogJ0xlZnQnLCB2YWx1ZTogJ2xlZnQnIH0sXG4gICAgICAgIC8vICAgICB7IGxhYmVsOiAnQ2VudGVyJywgdmFsdWU6ICdjZW50ZXInIH0sXG4gICAgICAgIC8vICAgICB7IGxhYmVsOiAnUmlnaHQnLCB2YWx1ZTogJ3JpZ2h0JyB9XG4gICAgICAgIC8vICAgXVxuICAgICAgICAvLyB9XG4gICAgICBdXG4gICAgICBcbiAgICB9LFxuXG4gICAgXCJUYWJsZVwiOiB7XG4gICAgICBcImVsZW1lbnRQcm9wc1wiOiBbXG4gICAgICAgIHsgXCJsYWJlbFwiOiBcInJvd0Nob2ljZVwiLCBcInBsYWNlaG9sZGVyXCI6IFwiXCIsIFwidHlwZVwiOiBcInRleHRcIiwgXCJrZXlcIjogXCJyb3dDaG9pY2VcIiB9LFxuICAgICAgICB7IGxhYmVsOiAncXVlc3Rpb25OdW1iZXInLCB0eXBlOiAnbnVtYmVyJywga2V5OiAncXVlc3Rpb25OdW1iZXInIH0sXG4gICAgICAgIHsgbGFiZWw6ICdUYWJsZSBTaXplJywgdHlwZTogJ2ZpZWxkU2l6ZScsIGtleTogJ3dpZHRoJyB9LFxuICAgICAgXSxcbiAgICAgIFwiZmllbGRQcm9wc1wiOiBbXG4gICAgICAgIHsgXCJsYWJlbFwiOiBcInRhYmxlSWRcIiwgXCJwbGFjZWhvbGRlclwiOiBcIkVtcF9UYWJsZV8wMVwiLCBcInR5cGVcIjogXCJ0ZXh0XCIsIFwia2V5XCI6IFwidGFibGVJZFwiIH0sXG4gICAgICAgIHsgXCJsYWJlbFwiOiBcInZhbHVlXCIsIFwicGxhY2Vob2xkZXJcIjogXCJWYWx1ZVwiLCBcInR5cGVcIjogXCJ0ZXh0XCIsIFwia2V5XCI6IFwidmFsdWVcIiB9LFxuICAgICAgICB7IGxhYmVsOiAnUmVmZXJlbmNlJywgcGxhY2Vob2xkZXI6ICdSZWZlcmVuY2UgRmllbGQnLCB0eXBlOiAndGV4dCcsIGtleTogJ3JlZmVyZW5jZUZpZWxkJyB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJsYWJlbFwiOiBcIlwiLCBcInBsYWNlaG9sZGVyXCI6IFwiRW50ZXIgVGV4dFwiLCBcInR5cGVcIjogXCJzdWJRdWVzdGlvblwiLCBcImtleVwiOiBcImlzU3ViVGV4dFwiLFxuICAgICAgICAgIFwic3ViUXVlc3Rpb25cIjogW1xuICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBhcHBlYXJhbmNlOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ1NlbGVjdCBGb250JywgdHlwZTogJ3NlbGVjdCcsIGtleTogJ2ZvbnQnLCBwbGFjZWhvbGRlcjogJ0xlZnQnLFxuICAgICAgICAgIG9wdGlvbnM6IFsnSGVsdmV0aWNhIE5ldWUnLCAnQXJpYWwnLCAnVGltZXMgTmV3IFJvbWFuJywgJ1JvYm90byddXG4gICAgICAgIH0sXG4gICAgICAgIHsgbGFiZWw6ICdGb250IENvbG9yJywgdHlwZTogJ2NvbG9yJywga2V5OiAnZm9udENvbG9yJywgdmFsdWU6ICcnIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ0ZvbnQgU2l6ZScsXG4gICAgICAgICAgdHlwZTogJ251bWJlcicsICAgIFxuICAgICAgICAgIGtleTogJ2ZvbnRTaXplJyxcbiAgICAgICAgICB2YWx1ZTogMTQgICAgICAgICAgXG4gICAgICAgIH0sICAgICAgICBcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnRm9udCBXZWlnaHQnLCB0eXBlOiAnc2VsZWN0Jywga2V5OiAnZm9udFdlaWdodCcsIHZhbHVlOiAnJyxcbiAgICAgICAgICBvcHRpb25zOiBbXG4gICAgICAgICAgICB7IHZhbHVlOiAnNDAwJywgbGFiZWw6ICc0MDAtTm9ybWFsJyB9LFxuICAgICAgICAgICAgeyB2YWx1ZTogJzUwMCcsIGxhYmVsOiAnNTAwLU1lZGl1bScgfSxcbiAgICAgICAgICAgIHsgdmFsdWU6ICc2MDAnLCBsYWJlbDogJzYwMC1TZW1pIEJvbGQnIH0sXG4gICAgICAgICAgICB7IHZhbHVlOiAnNzAwJywgbGFiZWw6ICc3MDAtQm9sZCcgfVxuICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnRm9udCBTdHlsZScsIHR5cGU6ICdzZWxlY3QnLCBrZXk6ICdmb250U3R5bGUnLCB2YWx1ZTogJycsXG4gICAgICAgICAgb3B0aW9uczogW1xuICAgICAgICAgICAgeyBsYWJlbDogJ05vcm1hbCcsIHZhbHVlOiAnbm9ybWFsJyB9LFxuICAgICAgICAgICAgeyBsYWJlbDogJ0JvbGQnLCB2YWx1ZTogJ2JvbGQnIH0sXG4gICAgICAgICAgICB7IGxhYmVsOiAnSXRhbGljJywgdmFsdWU6ICdpdGFsaWMnIH1cbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ01hcmdpbicsIHR5cGU6ICdtYXJnaW5QaWNrZXInLCBrZXk6ICdtYXJnaW4nLFxuICAgICAgICAgIHBsYWNlaG9sZGVyOiAnTGVmdCwgVG9wLCBSaWdodCwgQm90dG9tJyxcbiAgICAgICAgICB2YWx1ZTogWzAsIDAsIDAsIDBdXG4gICAgICAgIH0sXG4gICAgICAgIC8vIHtcbiAgICAgICAgLy8gICBsYWJlbDogJ0FsaWduIEl0ZW0nLCB0eXBlOiAnc2VsZWN0Jywga2V5OiAnYWxpZ25JdGVtcycsIHZhbHVlOiAnJyxcbiAgICAgICAgLy8gICBvcHRpb25zOiBbXG4gICAgICAgIC8vICAgICB7IGxhYmVsOiAnTGVmdCcsIHZhbHVlOiAnbGVmdCcgfSxcbiAgICAgICAgLy8gICAgIHsgbGFiZWw6ICdDZW50ZXInLCB2YWx1ZTogJ2NlbnRlcicgfSxcbiAgICAgICAgLy8gICAgIHsgbGFiZWw6ICdSaWdodCcsIHZhbHVlOiAncmlnaHQnIH1cbiAgICAgICAgLy8gICBdXG4gICAgICAgIC8vIH1cbiAgICAgIF1cbiAgICAgIFxuICAgIH0sXG5cbiAgICBcIlRhYmxlQ29sdW1uXCI6IHtcbiAgICAgIFwiZWxlbWVudFByb3BzXCI6IFtcblxuICAgICAgICB7IFwibGFiZWxcIjogXCJoZWFkZXJMYWJlbHNcIiwgXCJwbGFjZWhvbGRlclwiOiBcIkVtcGxveWVlIERldGFpbHNcIiwgXCJ0eXBlXCI6IFwidGV4dFwiLCBcInRhcmdldEFycmF5XCI6IFwiZmllbGRzTWV0YVwiLCBcInRhcmdldEFycmF5S2V5XCI6IFwidW5pcXVlSWRlbnRpZmllclwiLCBcImtleVwiOiBcImxhYmVsXCIgfSxcbiAgICAgICAgeyBcImxhYmVsXCI6IFwiYXBpTmFtZVwiLCBcInBsYWNlaG9sZGVyXCI6IFwiRW1wbG95ZWUgRGV0YWlsc1wiLCBcInR5cGVcIjogXCJ0ZXh0XCIsIFwidGFyZ2V0QXJyYXlcIjogXCJmaWVsZHNNZXRhXCIsIFwidGFyZ2V0QXJyYXlLZXlcIjogXCJ1bmlxdWVJZGVudGlmaWVyXCIsIFwia2V5XCI6IFwiYXBpTmFtZVwiIH0sXG5cbiAgICAgICAge1xuICAgICAgICAgIFwibGFiZWxcIjogXCJTdW1tYXJ5IENvbHVtblwiLCBcInBsYWNlaG9sZGVyXCI6IFwiU3VtbWFyeSBDb2x1bW5cIiwgXCJ0eXBlXCI6IFwic3ViUXVlc3Rpb25cIiwgXCJ0YXJnZXRBcnJheVwiOiBcImZpZWxkc01ldGFcIiwgXCJ0YXJnZXRBcnJheUtleVwiOiBcInVuaXF1ZUlkZW50aWZpZXJcIiwgXCJrZXlcIjogXCJzdW1tYXJ5Q29sdW1uXCIsXG4gICAgICAgICAgXCJzdWJRdWVzdGlvblwiOiBbXG4gICAgICAgICAgICB7IFwibGFiZWxcIjogXCJUeXBlXCIsIFwicGxhY2Vob2xkZXJcIjogXCJFbXBsb3llZSBEZXRhaWxzXCIsIFwidHlwZVwiOiBcInRleHRcIiwgXCJ0YXJnZXRBcnJheVwiOiBcImZpZWxkc01ldGFcIiwgXCJ0YXJnZXRBcnJheUtleVwiOiBcInVuaXF1ZUlkZW50aWZpZXJcIiwgXCJrZXlcIjogXCJmbGRUeXBlXCIgfSxcbiAgICAgICAgICAgIHsgXCJsYWJlbFwiOiBcIk9wZXJhdGlvblwiLCBcInBsYWNlaG9sZGVyXCI6IFwiRW1wbG95ZWUgRGV0YWlsc1wiLCBcInR5cGVcIjogXCJ0ZXh0XCIsIFwidGFyZ2V0QXJyYXlcIjogXCJmaWVsZHNNZXRhXCIsIFwidGFyZ2V0QXJyYXlLZXlcIjogXCJ1bmlxdWVJZGVudGlmaWVyXCIsIFwia2V5XCI6IFwib3BlcmF0aW9uXCIgfSxcbiAgICAgICAgICAgIHsgXCJsYWJlbFwiOiBcIk9wZXJhbmRzXCIsIFwicGxhY2Vob2xkZXJcIjogXCJFbXBsb3llZSBEZXRhaWxzXCIsIFwidHlwZVwiOiBcImFycmF5XCIsIFwidGFyZ2V0QXJyYXlcIjogXCJmaWVsZHNNZXRhXCIsIFwidGFyZ2V0QXJyYXlLZXlcIjogXCJ1bmlxdWVJZGVudGlmaWVyXCIsIFwia2V5XCI6IFwib3BlcmFuZHNcIiB9LFxuICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibGFiZWxcIjogXCJTdW1tYXJ5IFJvd1wiLCBcInBsYWNlaG9sZGVyXCI6IFwiU3VtbWFyeSBSb3dcIiwgXCJ0eXBlXCI6IFwic3ViUXVlc3Rpb25cIiwgXCJ0YXJnZXRBcnJheVwiOiBcImZpZWxkc01ldGFcIiwgXCJ0YXJnZXRBcnJheUtleVwiOiBcInVuaXF1ZUlkZW50aWZpZXJcIiwgXCJrZXlcIjogXCJzdW1tYXJ5Um93XCIsIFwic3ViUXVlc3Rpb25cIjogW1xuICAgICAgICAgICAgeyBcImxhYmVsXCI6IFwiVHlwZVwiLCBcInBsYWNlaG9sZGVyXCI6IFwiRW1wbG95ZWUgRGV0YWlsc1wiLCBcInR5cGVcIjogXCJ0ZXh0XCIsIFwidGFyZ2V0QXJyYXlcIjogXCJmaWVsZHNNZXRhXCIsIFwidGFyZ2V0QXJyYXlLZXlcIjogXCJ1bmlxdWVJZGVudGlmaWVyXCIsIFwia2V5XCI6IFwiZmxkVHlwZVwiIH0sXG4gICAgICAgICAgICB7IFwibGFiZWxcIjogXCJvcGVyYXRpb25cIiwgXCJwbGFjZWhvbGRlclwiOiBcIm9wZXJhdGlvblwiLCBcInR5cGVcIjogXCJ0ZXh0XCIsIFwidGFyZ2V0QXJyYXlcIjogXCJmaWVsZHNNZXRhXCIsIFwidGFyZ2V0QXJyYXlLZXlcIjogXCJ1bmlxdWVJZGVudGlmaWVyXCIsIFwia2V5XCI6IFwib3BlcmF0aW9uXCIgfSxcbiAgICAgICAgICAgIHsgXCJsYWJlbFwiOiBcImNvbHVtblwiLCBcInBsYWNlaG9sZGVyXCI6IFwiRW1wbG95ZWUgRGV0YWlsc1wiLCBcInR5cGVcIjogXCJyYWRpb1wiLCBcInRhcmdldEFycmF5XCI6IFwiZmllbGRzTWV0YVwiLCBcInRhcmdldEFycmF5S2V5XCI6IFwidW5pcXVlSWRlbnRpZmllclwiLCBcImtleVwiOiBcImNvbHVtblwiIH0sXG4gICAgICAgICAgICB7IFwibGFiZWxcIjogXCJvcGVyYW5kc1wiLCBcInBsYWNlaG9sZGVyXCI6IFwiRW1wbG95ZWUgRGV0YWlsc1wiLCBcInR5cGVcIjogXCJhcnJheVwiLCBcInRhcmdldEFycmF5XCI6IFwiZmllbGRzTWV0YVwiLCBcInRhcmdldEFycmF5S2V5XCI6IFwidW5pcXVlSWRlbnRpZmllclwiLCBcImtleVwiOiBcIm9wZXJhbmRzXCIgfSxcbiAgICAgICAgICBdXG4gICAgICAgIH0sXG5cbiAgICAgICAgeyBcImxhYmVsXCI6IFwiaW5wdXRUZXh0QWxpZ25tZW50XCIsIFwicGxhY2Vob2xkZXJcIjogXCJMZWZ0XCIsIFwidHlwZVwiOiBcInRleHRcIiwgXCJrZXlcIjogXCJpbnB1dFRleHRBbGlnbm1lbnRcIiB9LFxuICAgICAgICB7IFwibGFiZWxcIjogXCJ0YWJsZVNjYWxlU2l6ZVwiLCBcInBsYWNlaG9sZGVyXCI6IFwiMDYgLSBGdWxsIFNjYWxlXCIsIFwidHlwZVwiOiBcInRleHRcIiwgXCJrZXlcIjogXCJ0YWJsZVNjYWxlU2l6ZVwiIH0sXG4gICAgICAgIHsgXCJsYWJlbFwiOiBcInJvd0Nob2ljZVwiLCBcInBsYWNlaG9sZGVyXCI6IFwiXCIsIFwidHlwZVwiOiBcInRleHRcIiwgXCJrZXlcIjogXCJyb3dDaG9pY2VcIiB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJsYWJlbFwiOiBcInF1aWNrQWN0aW9uVG9vbHNcIixcbiAgICAgICAgICBcInR5cGVcIjogXCJncm91cFwiLFxuICAgICAgICAgIFwia2V5XCI6IFwicXVpY2tBY3Rpb25Ub29sc1wiLFxuICAgICAgICAgIFwiY2hpbGRyZW5cIjogW1xuICAgICAgICAgICAgeyBcImxhYmVsXCI6IFwiZWRpdFwiLCBcInR5cGVcIjogXCJ0b2dnbGVcIiwgXCJrZXlcIjogXCJlZGl0XCIgfSxcbiAgICAgICAgICAgIHsgXCJsYWJlbFwiOiBcInZpZXdcIiwgXCJ0eXBlXCI6IFwidG9nZ2xlXCIsIFwia2V5XCI6IFwidmlld1wiIH0sXG4gICAgICAgICAgICB7IFwibGFiZWxcIjogXCJkZWxldGVcIiwgXCJ0eXBlXCI6IFwidG9nZ2xlXCIsIFwia2V5XCI6IFwiZGVsZXRlXCIgfVxuICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAgeyBcImxhYmVsXCI6IFwiYWRkUmVjb3JkRXZlbnRcIiwgXCJ0eXBlXCI6IFwidG9nZ2xlXCIsIFwia2V5XCI6IFwiYWRkUmVjb3JkRXZlbnRcIiB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJsYWJlbFwiOiBcInRhYmxlU2Nyb2xsRXZlbnRDaG9pY2VcIixcbiAgICAgICAgICBcInR5cGVcIjogXCJncm91cFwiLFxuICAgICAgICAgIFwia2V5XCI6IFwidGFibGVTY3JvbGxFdmVudENob2ljZVwiLFxuICAgICAgICAgIFwiY2hpbGRyZW5cIjogW1xuICAgICAgICAgICAgeyBcImxhYmVsXCI6IFwiaG9yaXpvbnRhbFwiLCBcInR5cGVcIjogXCJ0b2dnbGVcIiwgXCJrZXlcIjogXCJob3Jpem9udGFsXCIgfSxcbiAgICAgICAgICAgIHsgXCJsYWJlbFwiOiBcInZlcnRpY2FsXCIsIFwidHlwZVwiOiBcInRvZ2dsZVwiLCBcImtleVwiOiBcInZlcnRpY2FsXCIgfVxuICAgICAgICAgIF1cbiAgICAgICAgfVxuICAgICAgXSxcbiAgICAgIFwiZmllbGRQcm9wc1wiOiBbXG4gICAgICAgIHsgXCJsYWJlbFwiOiBcInRhYmxlSWRcIiwgXCJwbGFjZWhvbGRlclwiOiBcIkVtcF9UYWJsZV8wMVwiLCBcInR5cGVcIjogXCJ0ZXh0XCIsIFwia2V5XCI6IFwidGFibGVJZFwiIH0sXG4gICAgICAgIHsgXCJsYWJlbFwiOiBcImlucHV0VGV4dEFsaWdubWVudFwiLCBcInBsYWNlaG9sZGVyXCI6IFwiTGVmdFwiLCBcInR5cGVcIjogXCJ0ZXh0XCIsIFwia2V5XCI6IFwiaW5wdXRUZXh0QWxpZ25tZW50XCIgfSxcbiAgICAgICAgeyBcImxhYmVsXCI6IFwicmVxdWlyZWRGaWVsZFwiLCBcInR5cGVcIjogXCJ0b2dnbGVcIiwgXCJrZXlcIjogXCJyZXF1aXJlZEZpZWxkXCIgfSxcbiAgICAgICAgeyBcImxhYmVsXCI6IFwiUmVhZCBPbmx5XCIsIFwidHlwZVwiOiBcImNoZWNrYm94XCIsIFwidGFyZ2V0QXJyYXlcIjogXCJmaWVsZHNNZXRhXCIsIFwidGFyZ2V0QXJyYXlLZXlcIjogXCJ1bmlxdWVJZGVudGlmaWVyXCIsIFwia2V5XCI6IFwiZWRpdFwiIH0sXG4gICAgICAgIHsgXCJsYWJlbFwiOiBcImhpZGVMYWJlbFwiLCBcInR5cGVcIjogXCJ0b2dnbGVcIiwgXCJrZXlcIjogXCJoaWRlTGFiZWxcIiB9LFxuICAgICAgICB7IFwibGFiZWxcIjogXCJkaXNhYmxlZFwiLCBcInR5cGVcIjogXCJ0b2dnbGVcIiwgXCJrZXlcIjogXCJkaXNhYmxlZFwiIH0sXG4gICAgICAgIHsgXCJsYWJlbFwiOiBcImhpZGVFbGVtZW50c1wiLCBcInR5cGVcIjogXCJ0b2dnbGVcIiwgXCJrZXlcIjogXCJoaWRlRWxlbWVudHNcIiB9LFxuICAgICAgICB7IFwibGFiZWxcIjogXCJtYXNraW5nXCIsIFwidHlwZVwiOiBcInRvZ2dsZVwiLCBcImtleVwiOiBcIm1hc2tpbmdcIiB9LFxuICAgICAgICB7IFwibGFiZWxcIjogXCJ2YWx1ZVwiLCBcInBsYWNlaG9sZGVyXCI6IFwiVmFsdWVcIiwgXCJ0eXBlXCI6IFwidGV4dFwiLCBcImtleVwiOiBcInZhbHVlXCIgfSxcbiAgICAgICAgeyBcImxhYmVsXCI6IFwicmVmZXJlbmNlQW5jaG9yXCIsIFwicGxhY2Vob2xkZXJcIjogXCJodHRwOi8vc291cmNlL3Jhbmdlcm54dF9iaW9fZGF0YS83NC9kLmRvY1wiLCBcInR5cGVcIjogXCJ0ZXh0XCIsIFwia2V5XCI6IFwicmVmZXJlbmNlQW5jaG9yXCIgfSxcbiAgICAgICAgeyBcImxhYmVsXCI6IFwiY29udHJvbGxpbmdFbGVtZW50c1wiLCBcInR5cGVcIjogXCJ0b2dnbGVcIiwgXCJrZXlcIjogXCJjb250cm9sbGluZ0VsZW1lbnRzXCIgfSxcbiAgICAgICAgeyBcImxhYmVsXCI6IFwiaXNEZXBlbmRlbmNlXCIsIFwidHlwZVwiOiBcInRvZ2dsZVwiLCBcImtleVwiOiBcImlzRGVwZW5kZW5jZVwiIH0sXG4gICAgICAgIHsgXCJsYWJlbFwiOiBcIm5ld0xpbmVcIiwgXCJ0eXBlXCI6IFwidG9nZ2xlXCIsIFwia2V5XCI6IFwibmV3TGluZVwiIH1cbiAgICAgIF0sXG4gICAgICBcImFwcGVhcmFuY2VcIjogW1xuICAgICAgICB7IFwibGFiZWxcIjogXCJzZWxlY3RGb250XCIsIFwicGxhY2Vob2xkZXJcIjogXCJMZWZ0XCIsIFwidHlwZVwiOiBcInRleHRcIiwgXCJrZXlcIjogXCJzZWxlY3RGb250XCIgfSxcbiAgICAgICAgeyBcImxhYmVsXCI6IFwiZm9udENvbG9yXCIsIFwicGxhY2Vob2xkZXJcIjogXCIjMjgzNDNFXCIsIFwidHlwZVwiOiBcInRleHRcIiwgXCJrZXlcIjogXCJmb250Q29sb3JcIiB9LFxuICAgICAgICB7IFwibGFiZWxcIjogXCJoZXhDb2RlXCIsIFwicGxhY2Vob2xkZXJcIjogXCIjMjgzNDNFXCIsIFwidHlwZVwiOiBcInRleHRcIiwgXCJrZXlcIjogXCJoZXhDb2RlXCIgfSxcbiAgICAgICAgeyBcImxhYmVsXCI6IFwiZm9udFNpemVcIiwgXCJwbGFjZWhvbGRlclwiOiBcIjMwMCAtIE1lZGl1bVwiLCBcInR5cGVcIjogXCJ0ZXh0XCIsIFwia2V5XCI6IFwiZm9udFNpemVcIiB9LFxuICAgICAgICB7IFwibGFiZWxcIjogXCJmb250V2lkdGhcIiwgXCJwbGFjZWhvbGRlclwiOiBcIkxlZnRcIiwgXCJ0eXBlXCI6IFwidGV4dFwiLCBcImtleVwiOiBcImZvbnRXaWR0aFwiIH0sXG4gICAgICAgIHsgXCJsYWJlbFwiOiBcImJhY2tncm91bmRDb2xvclwiLCBcInBsYWNlaG9sZGVyXCI6IFwiI0UyRTJFMlwiLCBcInR5cGVcIjogXCJ0ZXh0XCIsIFwia2V5XCI6IFwiYmFja2dyb3VuZENvbG9yXCIgfSxcbiAgICAgICAgeyBcImxhYmVsXCI6IFwiYmFja2dyb3VuZEhleENvZGVcIiwgXCJwbGFjZWhvbGRlclwiOiBcIiNFMkUyRTJcIiwgXCJ0eXBlXCI6IFwidGV4dFwiLCBcImtleVwiOiBcImJhY2tncm91bmRIZXhDb2RlXCIgfSxcbiAgICAgICAgeyBcImxhYmVsXCI6IFwicmVmZXJlbmNlQW5jaG9yXCIsIFwicGxhY2Vob2xkZXJcIjogXCJodHRwOi8vc291cmNlL3Jhbmdlcm54dF9iaW9fZGF0YS83NC9kLmRvY1wiLCBcInR5cGVcIjogXCJ0ZXh0XCIsIFwia2V5XCI6IFwicmVmZXJlbmNlQW5jaG9yXCIgfSxcbiAgICAgICAgeyBcImxhYmVsXCI6IFwiYmxhbmtTcGFjZVwiLCBcInR5cGVcIjogXCJ0b2dnbGVcIiwgXCJrZXlcIjogXCJibGFua1NwYWNlXCIgfVxuICAgICAgXVxuICAgIH0sXG5cbiAgICAnVGV4dEFyZWEnOiB7XG4gICAgICBlbGVtZW50UHJvcHM6IFtcbiAgICAgICAgeyBsYWJlbDogJ0VsZW1lbnQnLCB0eXBlOiAnbnVtYmVyJywga2V5OiAncXVlc3Rpb25OdW1iZXInIH0sXG4gICAgICAgIHsgbGFiZWw6ICd3aWR0aCcsIHR5cGU6ICdmaWVsZFNpemUnLCBrZXk6ICd3aWR0aCcgfSxcbiAgICAgIF0sXG4gICAgICBmaWVsZFByb3BzOiBbXG4gICAgICAgIHsgbGFiZWw6ICcnLCB0eXBlOiAndG9nZ2xlR3JvdXAnLCBrZXk6ICd0b2dnbGVPcHRpb25zJyB9LFxuICAgICAgICB7IGxhYmVsOiAnSGVscCBUZXh0JywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0ICcsIHR5cGU6ICd0ZXh0JyB9LFxuICAgICAgICB7IGxhYmVsOiAnVmFsdWUnLCBwbGFjZWhvbGRlcjogJ0VudGVyIFRleHQgJywgdHlwZTogJ3RleHQnLCBrZXk6ICd2YWx1ZScgfSxcbiAgICAgICAgeyBsYWJlbDogJ1JlZmVyZW5jZSBGaWVsZCcsIHBsYWNlaG9sZGVyOiAnUmVmZXJlbmNlIEZpZWxkJywgdHlwZTogJ3RleHQnLCBrZXk6ICdyZWZlcmVuY2VGaWVsZCcgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibGFiZWxcIjogXCJcIiwgXCJwbGFjZWhvbGRlclwiOiBcIkVudGVyIFRleHRcIiwgXCJ0eXBlXCI6IFwic3ViUXVlc3Rpb25cIiwgXCJrZXlcIjogXCJpc1N1YlRleHRcIixcbiAgICAgICAgICBcInN1YlF1ZXN0aW9uXCI6IFtcbiAgICAgICAgICBdXG4gICAgICAgIH1cbiAgICAgIF0sXG4gICAgICBhcHBlYXJhbmNlOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ1NlbGVjdCBGb250JywgdHlwZTogJ3NlbGVjdCcsIGtleTogJ2ZvbnQnLCBwbGFjZWhvbGRlcjogJ0xlZnQnLFxuICAgICAgICAgIG9wdGlvbnM6IFsnSGVsdmV0aWNhIE5ldWUnLCAnQXJpYWwnLCAnVGltZXMgTmV3IFJvbWFuJywgJ1JvYm90byddXG4gICAgICAgIH0sXG5cbiAgICAgICAgeyBsYWJlbDogJ0ZvbnQgQ29sb3InLCB0eXBlOiAnY29sb3InLCBrZXk6ICdmb250Q29sb3InLCB2YWx1ZTogJycgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnRm9udCBTaXplJywgdHlwZTogJ3NlbGVjdCcsIGtleTogJ2ZvbnRTaXplJywgdmFsdWU6ICcnLFxuICAgICAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgICAgIHsgbGFiZWw6ICdTbWFsbCcsIHZhbHVlOiAnMTJweCcgfSxcbiAgICAgICAgICAgIHsgbGFiZWw6ICdNZWRpdW0nLCB2YWx1ZTogJzE0cHgnIH0sXG4gICAgICAgICAgICB7IGxhYmVsOiAnTGFyZ2UnLCB2YWx1ZTogJzE2cHgnIH1cbiAgICAgICAgICBdXG4gICAgICAgIH0sXG5cbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnRm9udCBXaWR0aCcsIHR5cGU6ICdzZWxlY3QnLCBrZXk6ICdmb250V2VpZ2h0JywgdmFsdWU6ICcnLFxuICAgICAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgICAgIHsgdmFsdWU6ICc0MDAnLCBsYWJlbDogJzQwMC1Ob3JtYWwnIH0sXG4gICAgICAgICAgICB7IHZhbHVlOiAnNTAwJywgbGFiZWw6ICc1MDAtTWVkaXVtJyB9LFxuICAgICAgICAgICAgeyB2YWx1ZTogJzYwMCcsIGxhYmVsOiAnNjAwLVNlbWkgQm9sZCcgfSxcbiAgICAgICAgICAgIHsgdmFsdWU6ICc3MDAnLCBsYWJlbDogJzcwMC1Cb2xkJyB9XG4gICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICAvLyB7IGxhYmVsOiAnQmFja2dyb3VuZCBDb2xvcicsIHR5cGU6ICdjb2xvcicsIGtleTogJ2JhY2tncm91bmRDb2xvcicsIHZhbHVlOiAnJyB9LFxuICAgICAgICBcbiAgICAgIF1cbiAgICB9LFxuXG4gICAgJ2ltYWdlJzoge1xuICAgICAgZWxlbWVudFByb3BzOiBbXG4gICAgICAgIHsgbGFiZWw6ICdFbGVtZW50JywgdHlwZTogJ251bWJlcicsIGtleTogJ3F1ZXN0aW9uTnVtYmVyJyB9LFxuICAgICAgICB7IGxhYmVsOiAnd2lkdGgnLCB0eXBlOiAnZmllbGRTaXplJywga2V5OiAnd2lkdGgnIH0sXG4gICAgICBdLFxuICAgICAgZmllbGRQcm9wczogW1xuICAgICAgICB7IGxhYmVsOiAnJywgdHlwZTogJ3RvZ2dsZUdyb3VwJywga2V5OiAndG9nZ2xlT3B0aW9ucycgfSxcbiAgICAgICAgeyBsYWJlbDogJ0hlbHAgVGV4dCcsIHBsYWNlaG9sZGVyOiAnRW50ZXIgVGV4dCAnLCB0eXBlOiAndGV4dCcgfSxcbiAgICAgICAgeyBsYWJlbDogJ1ZhbHVlJywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0ICcsIHR5cGU6ICd0ZXh0Jywga2V5OiAndmFsdWUnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdSZWZlcmVuY2UgRmllbGQnLCBwbGFjZWhvbGRlcjogJ1JlZmVyZW5jZSBGaWVsZCcsIHR5cGU6ICd0ZXh0Jywga2V5OiAncmVmZXJlbmNlRmllbGQnIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcImxhYmVsXCI6IFwiXCIsIFwicGxhY2Vob2xkZXJcIjogXCJFbnRlciBUZXh0XCIsIFwidHlwZVwiOiBcInN1YlF1ZXN0aW9uXCIsIFwia2V5XCI6IFwiaXNTdWJUZXh0XCIsXG4gICAgICAgICAgXCJzdWJRdWVzdGlvblwiOiBbXG4gICAgICAgICAgXVxuICAgICAgICB9XG4gICAgICBdLFxuICAgICAgYXBwZWFyYW5jZTogW1xuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICdTZWxlY3QgRm9udCcsIHR5cGU6ICdzZWxlY3QnLCBrZXk6ICdmb250JywgcGxhY2Vob2xkZXI6ICdMZWZ0JyxcbiAgICAgICAgICBvcHRpb25zOiBbJ0hlbHZldGljYSBOZXVlJywgJ0FyaWFsJywgJ1RpbWVzIE5ldyBSb21hbicsICdSb2JvdG8nXVxuICAgICAgICB9LFxuICAgICAgICB7IGxhYmVsOiAnRm9udCBDb2xvcicsIHR5cGU6ICdjb2xvcicsIGtleTogJ2ZvbnRDb2xvcicsIHZhbHVlOiAnJyB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICdGb250IFNpemUnLFxuICAgICAgICAgIHR5cGU6ICdudW1iZXInLCAgICBcbiAgICAgICAgICBrZXk6ICdmb250U2l6ZScsXG4gICAgICAgICAgdmFsdWU6IDE0ICAgICAgICAgIFxuICAgICAgICB9LCAgICAgICAgXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ0ZvbnQgV2VpZ2h0JywgdHlwZTogJ3NlbGVjdCcsIGtleTogJ2ZvbnRXZWlnaHQnLCB2YWx1ZTogJycsXG4gICAgICAgICAgb3B0aW9uczogW1xuICAgICAgICAgICAgeyB2YWx1ZTogJzQwMCcsIGxhYmVsOiAnNDAwLU5vcm1hbCcgfSxcbiAgICAgICAgICAgIHsgdmFsdWU6ICc1MDAnLCBsYWJlbDogJzUwMC1NZWRpdW0nIH0sXG4gICAgICAgICAgICB7IHZhbHVlOiAnNjAwJywgbGFiZWw6ICc2MDAtU2VtaSBCb2xkJyB9LFxuICAgICAgICAgICAgeyB2YWx1ZTogJzcwMCcsIGxhYmVsOiAnNzAwLUJvbGQnIH1cbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ0ZvbnQgU3R5bGUnLCB0eXBlOiAnc2VsZWN0Jywga2V5OiAnZm9udFN0eWxlJywgdmFsdWU6ICcnLFxuICAgICAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgICAgIHsgbGFiZWw6ICdOb3JtYWwnLCB2YWx1ZTogJ25vcm1hbCcgfSxcbiAgICAgICAgICAgIHsgbGFiZWw6ICdCb2xkJywgdmFsdWU6ICdib2xkJyB9LFxuICAgICAgICAgICAgeyBsYWJlbDogJ0l0YWxpYycsIHZhbHVlOiAnaXRhbGljJyB9XG4gICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICdNYXJnaW4nLCB0eXBlOiAnbWFyZ2luUGlja2VyJywga2V5OiAnbWFyZ2luJyxcbiAgICAgICAgICBwbGFjZWhvbGRlcjogJ0xlZnQsIFRvcCwgUmlnaHQsIEJvdHRvbScsXG4gICAgICAgICAgdmFsdWU6IFswLCAwLCAwLCAwXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICdBbGlnbiBJdGVtJywgdHlwZTogJ3NlbGVjdCcsIGtleTogJ2FsaWduSXRlbXMnLCB2YWx1ZTogJycsXG4gICAgICAgICAgb3B0aW9uczogW1xuICAgICAgICAgICAgeyBsYWJlbDogJ0xlZnQnLCB2YWx1ZTogJ2xlZnQnIH0sXG4gICAgICAgICAgICB7IGxhYmVsOiAnQ2VudGVyJywgdmFsdWU6ICdjZW50ZXInIH0sXG4gICAgICAgICAgICB7IGxhYmVsOiAnUmlnaHQnLCB2YWx1ZTogJ3JpZ2h0JyB9XG4gICAgICAgICAgXVxuICAgICAgICB9XG4gICAgICBdXG4gICAgICBcbiAgICB9LFxuXG4gIH07XG4gIGVycm9yTWVzc2FnZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgaHR0cDogSHR0cENsaWVudCwgcHJpdmF0ZSBwZGZEZXNpZ25lclNlcnZpY2U6IFBkZkRlc2lnbmVyU2VydmljZSxwcml2YXRlIHRlbXBsYXRlU2VydmljZTogVGVtcGxhdGVTZXJ2aWNlKSB7IH1cblxuICBoYW5kbGVUZW1wbGF0ZVNlbGVjdGlvbihldmVudDogYW55KSB7XG4gICAgdGhpcy5wZGZFbGVtZW50cyA9IGV2ZW50LmVsZW1lbnRzOyBcbiAgICB0aGlzLnNlbGVjdGVkVGVtcGxhdGUgPSBldmVudC5zZWxlY3RlZFRlbXBsYXRlO1xuICB9XG5cbiAgXG5cbiAgbmdPbkluaXQoKSB7XG4gICAgLy9BUC0xME1BUjI1IFN1YnNjcmliZXMgdG8gaGVhZGVyIHNlbGVjdGlvbiBjaGFuZ2VzIGFuZCB1cGRhdGVzIHRoZSBzZWxlY3RlZCBlbGVtZW50ICBcbiAgICB0aGlzLnBkZkRlc2lnbmVyU2VydmljZS5zZWxlY3RIZWFkZXJTdWJqZWN0JC5zdWJzY3JpYmUoaGVhZGVyID0+IHtcbiAgICAgIGlmIChoZWFkZXIpIHtcbiAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGVkRWxlbWVudCkge1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50ID0ge307XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZWxlY3RlZEVsZW1lbnRbJ3R5cGUnXSA9IGhlYWRlcjtcbiAgICAgICAgdGhpcy5oZWFkZXJTZWxlY3QgPSB0cnVlO1xuICAgICAgICB0aGlzLnBkZiA9IHRoaXMucGRmRGVzaWduZXJTZXJ2aWNlLmdldEJvb2soKTtcbiAgICAgICAgdGhpcy5ib29rSWQgPSBPYmplY3Qua2V5cyh0aGlzLnBkZilbMF1cbiAgICAgIH1cblxuICAgIH0pO1xuICAgIHRoaXMucGRmRGVzaWduZXJTZXJ2aWNlLnNlbGVjdGVkRWxlbWVudCQuc3Vic2NyaWJlKGluZGV4ID0+IHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50SW5kZXggPSBpbmRleDtcbiAgICAgIHRoaXMuaGVhZGVyU2VsZWN0ID0gZmFsc2U7XG4gICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICBjb25zdCBlbGVtZW50cyA9IHRoaXMucGRmRGVzaWduZXJTZXJ2aWNlLmdldEVsZW1lbnRzKCk7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50ID0gZWxlbWVudHNbaW5kZXhdO1xuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZEVsZW1lbnQ/LnR5cGUgPT09ICdUYWJsZScpIHtcbiAgICAgICAgICB0aGlzLnNlbGVjdENvbHVtbiA9IHRoaXMucGRmRGVzaWduZXJTZXJ2aWNlLmdldFNlbGVjdFRhYmxlQ29sdW1uKCkgPT09IHVuZGVmaW5lZCA/IG51bGwgOiB0aGlzLnBkZkRlc2lnbmVyU2VydmljZS5nZXRTZWxlY3RUYWJsZUNvbHVtbigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc2VsZWN0Q29sdW1uID0gbnVsbFxuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5zZWxlY3RlZEVsZW1lbnQubWFyZ2luKSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZEVsZW1lbnQubWFyZ2luID0gWzAsIDAsIDAsIDBdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmdldFByb3BlcnRpZXMoKVxuICAgICAgdGhpcy51cGRhdGVQZGZwRGF0YSgpXG4gICAgfSk7XG4gICAgdGhpcy51cGRhdGVQZGZwRGF0YSgpXG4gIH1cbiAgLy9BUC0xME1BUjI1IFVwZGF0ZXMgdGhlIHRpdGxlIHVzaW5nIHRoZSBmb3JtIGJ1aWxkZXIgc2VydmljZSAgXG4gIHVwZGF0ZVRpdGxlKGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLnBkZkRlc2lnbmVyU2VydmljZS51cGRhdGVUaXRsZShldmVudCk7XG4gIH1cblxuICB1cGRhdGVQZGZwRGF0YSgpOiB2b2lkIHtcbiAgICAvLyBTS1MyOE1BUjI1IENvbnZlcnQgYXJyYXkgdG8gY29tbWEtc2VwYXJhdGVkIHN0cmluZ1xuICAgIHRoaXMuZmllbGRBc1N0cmluZyA9IHRoaXMuYm9va1N1YnRleHQ/LmZpZWxkPy5qb2luKCcsICcpIHx8ICcnO1xuICBcbiAgICAvLyBTS1MyME1BUjI1IEZpbHRlciBjb2x1bW5zXG4gICAgY29uc3QgdGFyZ2V0QXJyYXkgPSB0aGlzLmdldERhdGFCeVBhdGgoJ2ZpZWxkc01ldGEnKSB8fCBbXTtcbiAgICB0aGlzLmZpbHRlcmVkQ29sdW1ucyA9IHRhcmdldEFycmF5LmZpbHRlcihcbiAgICAgIGNvbHVtbiA9PiBjb2x1bW4udW5pcXVlSWRlbnRpZmllciAhPT0gdGhpcy5zZWxlY3RDb2x1bW5cbiAgICApO1xuICB9XG4gIHVwZGF0ZUZpZWxkKHZhbHVlOiBzdHJpbmcpIHsgXG4gICAgdGhpcy5ib29rU3VidGV4dC5maWVsZCA9IHZhbHVlLnNwbGl0KCcsJykubWFwKGl0ZW0gPT4gaXRlbS50cmltKCkpOyAvL1NLUzI4TUFSMjUgQ29udmVydCBzdHJpbmcgYmFjayB0byBhcnJheVxuICB9XG5cbiAgLy8gU0tTMjBNQVIyNSBNZXRob2QgdG8gaGFuZGxlIGNoZWNrYm94IGNoYW5nZXNcbiAgb25DaGVja2JveENoYW5nZSh0YXJnZXRBcnJheVBhdGg6IGFueSwgdGFyZ2V0QXJyYXlLZXk6IGFueSwga2V5OiBhbnksIGFwaU5hbWU6IHN0cmluZywgaXNDaGVja2VkOiBib29sZWFuKSB7XG4gICAgY29uc3QgdGFyZ2V0QXJyYXkgPSB0aGlzLmdldERhdGFCeVBhdGgodGFyZ2V0QXJyYXlQYXRoKTtcbiAgICBjb25zdCBmb3VuZEl0ZW0gPSB0YXJnZXRBcnJheS5maW5kKGl0ZW0gPT4gaXRlbVt0YXJnZXRBcnJheUtleV0gPT09IHRoaXMuc2VsZWN0Q29sdW1uKTtcbiAgICBmb3VuZEl0ZW1ba2V5XSA9IGZvdW5kSXRlbVtrZXldID8gZm91bmRJdGVtW2tleV0gOiBbXTtcbiAgICBpZiAoaXNDaGVja2VkKSB7XG4gICAgICAvLyBBZGQgYXBpTmFtZSB0byBzZWxlY3RlZEFwaU5hbWVzIGlmIG5vdCBhbHJlYWR5IHByZXNlbnRcbiAgICAgIGlmICghZm91bmRJdGVtW2tleV0uaW5jbHVkZXMoYXBpTmFtZSkpIHtcbiAgICAgICAgZm91bmRJdGVtW2tleV0ucHVzaChhcGlOYW1lKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmVtb3ZlIGFwaU5hbWUgZnJvbSBzZWxlY3RlZEFwaU5hbWVzIGlmIHByZXNlbnRcbiAgICAgIGNvbnN0IGluZGV4ID0gZm91bmRJdGVtW2tleV0uaW5kZXhPZihhcGlOYW1lKTtcbiAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgIGZvdW5kSXRlbVtrZXldLnNwbGljZShpbmRleCwgMSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHVwZGF0ZVByb3BlcnR5KGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRFbGVtZW50SW5kZXggPj0gMCkge1xuICAgICAgICB0aGlzLnNldFZhbHVlQnlQYXRoKGtleSwgdmFsdWUpO1xuICAgIH1cbiAgICBpZiAoa2V5ID09PSAncXVlc3Rpb24nKSB7XG4gICAgICBpZiAoIXRoaXMudmFsaWRhdGVJbnB1dCh2YWx1ZSwga2V5KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8vIFNLUzIxTUFSMjUgcmFkaW8gYnV0dG9uIGNsaWNrIGhhbmRsZXJcbiAgb25SYWRpb0NoYW5nZSh0YXJnZXRBcnJheVBhdGg6IGFueSwgdGFyZ2V0QXJyYXlLZXk6IGFueSwga2V5OiBhbnksIHZhbHVlOiBhbnkpIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZEVsZW1lbnQudHlwZSA9PT0gJ1RhYmxlJykge1xuICAgICAgLy8gdGhpcy51cGRhdGVWYWx1ZUJ5QXJyYXlQYXRoKHRhcmdldEFycmF5LCB0YXJnZXRBcnJheUtleSwgdGhpcy5zZWxlY3RDb2x1bW4sIGtleSwgdmFsdWUpO1xuICAgICAgY29uc3QgdGFyZ2V0QXJyYXkgPSB0aGlzLmdldERhdGFCeVBhdGgodGFyZ2V0QXJyYXlQYXRoKTtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheSh0YXJnZXRBcnJheSkpIHJldHVybjtcblxuICAgICAgLy8gRmluZCB0aGUgb2JqZWN0IHRoYXQgbWF0Y2hlcyBzZWxlY3RDb2x1bW5cbiAgICAgIGxldCBmb3VuZEl0ZW0gPSB0YXJnZXRBcnJheS5maW5kKGl0ZW0gPT4gaXRlbVt0YXJnZXRBcnJheUtleV0gPT09IHRoaXMuc2VsZWN0Q29sdW1uKTtcblxuICAgICAgLy8gSWYgdGhlIGl0ZW0gZG9lcyBub3QgZXhpc3QsIGNyZWF0ZSBhbmQgYWRkIGl0XG4gICAgICBpZiAoIWZvdW5kSXRlbSkge1xuICAgICAgICBmb3VuZEl0ZW0gPSB7IFt0YXJnZXRBcnJheUtleV06IHRoaXMuc2VsZWN0Q29sdW1uIH07IC8vIEVuc3VyZSB0aGUga2V5IGV4aXN0c1xuICAgICAgICB0YXJnZXRBcnJheS5wdXNoKGZvdW5kSXRlbSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFRyYXZlcnNlIGFuZCBzZXQgdGhlIHZhbHVlXG4gICAgICBjb25zdCBrZXlzID0ga2V5LnNwbGl0KCcuJyk7XG4gICAgICBsZXQgb2JqID0gZm91bmRJdGVtO1xuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGtleXNbaV07XG4gICAgICAgIGlmICghb2JqW2tleV0pIG9ialtrZXldID0ge307IC8vIEluaXRpYWxpemUgbWlzc2luZyBvYmplY3RzXG4gICAgICAgIG9iaiA9IG9ialtrZXldO1xuICAgICAgfVxuXG4gICAgICAvLyBBc3NpZ24gdGhlIHZhbHVlIGJhc2VkIG9uIGlucHV0IHR5cGVcbiAgICAgIGNvbnN0IGxhc3RLZXkgPSBrZXlzW2tleXMubGVuZ3RoIC0gMV07XG5cbiAgICAgIG9ialtsYXN0S2V5XSA9IHZhbHVlO1xuICAgICAgdGhpcy51cGRhdGVFbGVtZW50KHRoaXMuc2VsZWN0ZWRFbGVtZW50KVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldFZhbHVlQnlQYXRoKGtleSwgdmFsdWUpOyAvLyBGYWxsYmFjayBmb3Igbm9uLVRhYmxlIGVsZW1lbnRzLCBpZiBhcHBsaWNhYmxlXG4gICAgfVxuICB9XG4gIG9uUmVxdWlyZWRDaGFuZ2UodmFsdWU6IGJvb2xlYW4pIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZEVsZW1lbnQpIHtcbiAgICAgIGxldCBsYWJlbCA9IHRoaXMuc2VsZWN0ZWRFbGVtZW50LmxhYmVsID8gdGhpcy5zZWxlY3RlZEVsZW1lbnQubGFiZWwucmVwbGFjZSgvXFxzKlxcKiskLywgJycpIDogJ0xhYmVsJztcblxuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIGxhYmVsID0gYCR7bGFiZWx9ICpgO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnVwZGF0ZVByb3BlcnR5KCdsYWJlbCcsIGxhYmVsKTtcbiAgICB9XG4gIH1cblxuICAvLyBUb2dnbGUgZm9yIFN1YiBRdWVzdGlvbnMgKEVhY2ggcHJvcCBoYXMgaXRzIG93biBzdGF0ZSlcbiAgdG9nZ2xlU3ViUXVlc3Rpb24ocHJvcDogYW55KSB7XG4gICAgcHJvcC5pc0V4cGFuZGVkID0gIXByb3AuaXNFeHBhbmRlZDtcbiAgfVxuXG4gIC8vIFNlcGFyYXRlIFRvZ2dsZSBmb3IgU3R5bGUgU2VjdGlvblxuICBpc1N0eWxlRXhwYW5kZWQgPSBmYWxzZTtcblxuICB0b2dnbGVTdHlsZVNlY3Rpb24oKSB7XG4gICAgdGhpcy5pc1N0eWxlRXhwYW5kZWQgPSAhdGhpcy5pc1N0eWxlRXhwYW5kZWQ7XG4gIH1cblxuICBnZXRQcm9wZXJ0aWVzKCkge1xuICAgIGlmICghdGhpcy5zZWxlY3RlZEVsZW1lbnQpIHJldHVybiBudWxsO1xuXG4gICAgLy8gQVAtMTBNQVIyNSBSZXRyaWV2ZSB0aGUgbGF0ZXN0IHBkZiBkYXRhXG4gICAgdGhpcy5wZGYgPSB0aGlzLnBkZkRlc2lnbmVyU2VydmljZS5nZXRCb29rKCk7XG5cbiAgICAvLyBBUC0xME1BUjI1IElmIHRoZSBzZWxlY3RlZCBlbGVtZW50IGlzIGEgJ0hlYWRlcicsIHJldHVybiBpdHMgcHJvcGVydGllc1xuICAgIGlmICh0aGlzLnNlbGVjdGVkRWxlbWVudD8udHlwZSA9PT0gJ0hlYWRlcicpIHtcbiAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRQcm9wZXJ0aWVzWydIZWFkZXInXTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRFbGVtZW50Py50eXBlID09PSAnVGFibGUnKSB7XG4gICAgICBpZiAodGhpcy5zZWxlY3RDb2x1bW4gIT09ICcnICYmIHRoaXMuc2VsZWN0Q29sdW1uICE9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRQcm9wZXJ0aWVzWydUYWJsZUNvbHVtbiddO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5lbGVtZW50UHJvcGVydGllc1t0aGlzLnNlbGVjdGVkRWxlbWVudD8udHlwZV07XG4gIH1cbiAgLy8gQVAtMjhNQVIyNSBBZGQgYW4gb3B0aW9uIHdpdGggYSB1bmlxdWUgVVVJRFxuICBhZGRPcHRpb24ob3B0aW9uczogYW55W10pIHtcbiAgICBjb25zdCB1bmlxdWVfaWQgPSB1dWlkdjQoKTtcbiAgICBvcHRpb25zLnB1c2goeyBpZDogdW5pcXVlX2lkLHZhbHVlOiAnJyB9KTtcbiAgfVxuXG4gIC8vIEFQLTI4TUFSMjUgRnVuY3Rpb24gdG8gcmVtb3ZlIGFuIG9wdGlvbiBiYXNlZCBvbiBpdHMgdW5pcXVlIFVVSURcbiAgcmVtb3ZlT3B0aW9uKG9wdGlvbnM6IGFueVtdLCBpZDogc3RyaW5nKSB7XG4gICAgY29uc3QgaW5kZXggPSBvcHRpb25zLmZpbmRJbmRleChvcHRpb24gPT4gb3B0aW9uLmlkID09PSBpZCk7XG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgb3B0aW9ucy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZUJ1dHRvbkNsaWNrKCkge1xuICAgIHRoaXMuZm9ybUJ1dHRvbkhhbmRsZXIuZW1pdCh0aGlzLnBkZkRlc2lnbmVyU2VydmljZS5kb3dubG9hZEVsZW1lbnQoKSk7XG4gIH1cbiAgLy8gU0tTMTNNQVIyNSBhY3RpdmUgdGFiIHNlbGVjdFxuICBzZXRBY3RpdmVUYWIodGFiOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmFjdGl2ZVRhYiA9IHRhYjtcbiAgfVxuICAvLyBTS1MxM01BUjI1IHRhYmxlIHByb3BlcnR5IHNhdmVcbiAgb25TYXZlKCk6IHZvaWQge1xuICB9XG4gIC8vIFNLUzEzTUFSMjUgdGFibGUgcHJvcGVydHkgcmVzZXRcbiAgb25DYW5jZWwoKTogdm9pZCB7XG4gIH1cblxuICB1cGRhdGVQcm9wZXJ0aWVzKGVsZW1lbnRUeXBlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAvLyBSZXNldCBhbGlnbm1lbnQgYW5kIHN0eWxlcyBpZiBzd2l0Y2hpbmcgZWxlbWVudHNcbiAgICB0aGlzLnNlbGVjdGVkQWxpZ24gPSAnYWxpZ24tbGVmdCc7XG4gICAgdGhpcy5zZWxlY3RlZFN0eWxlcyA9IFtdO1xuXG4gICAgLy8gRmV0Y2ggdGhlIHByb3BlcnRpZXMgb2YgdGhlIHNlbGVjdGVkIGVsZW1lbnQgdHlwZVxuXG4gICAgY29uc3QgcHJvcGVydGllcyA9IHRoaXMuZ2V0UHJvcGVydGllcygpO1xuICAgIGlmIChwcm9wZXJ0aWVzKSB7XG4gICAgICAvLyBNYWtlIHN1cmUgdGhlIHByb3BlcnRpZXMgYXJlIGR5bmFtaWNhbGx5IHVwZGF0ZWRcbiAgICB9XG4gIH1cblxuICBvbkFsaWduU2VsZWN0KHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZEVsZW1lbnQpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50LnRleHRBbGlnbiA9IHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIG9uU3R5bGVTZWxlY3QodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zZWxlY3RlZEVsZW1lbnQpIHJldHVybjtcblxuICAgIC8vIEluaXRpYWxpemUgc3R5bGVzIGFycmF5IGlmIGl0IGRvZXNuJ3QgZXhpc3RcbiAgICB0aGlzLnNlbGVjdGVkRWxlbWVudC5zdHlsZXMgPSB0aGlzLnNlbGVjdGVkRWxlbWVudC5zdHlsZXMgfHwgW107XG5cbiAgICAvLyBFbnN1cmUgb25seSBvbmUgc3R5bGUgaXMgc2VsZWN0ZWQgYXQgYSB0aW1lXG4gICAgdGhpcy5zZWxlY3RlZEVsZW1lbnQuc3R5bGVzID0gW3ZhbHVlXTtcblxuICB9XG5cbiAgaXNTdHlsZUFjdGl2ZSh2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRFbGVtZW50Py5zdHlsZXM/LmluY2x1ZGVzKHZhbHVlKSB8fCBmYWxzZTtcbiAgfVxuICBnZXRWYWx1ZUJ5UGF0aChwYXRoOiBzdHJpbmcpOiBhbnkge1xuICAgIHJldHVybiBwYXRoPy5zcGxpdCgnLicpLnJlZHVjZSgob2JqLCBrZXkpID0+IG9iaj8uW2tleV0gPz8gJycsIHRoaXMuc2VsZWN0ZWRFbGVtZW50KTtcbiAgfVxuXG4gIG9uVG9nZ2xlQ2hhbmdlKHBhdGg6IHN0cmluZywgZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgY2hlY2tlZCA9IChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkuY2hlY2tlZDtcbiAgICB0aGlzLnNldFZhbHVlQnlQYXRoKHBhdGgsIGNoZWNrZWQpO1xuICAgIHRoaXMudXBkYXRlRWxlbWVudCh0aGlzLnNlbGVjdGVkRWxlbWVudClcbiAgfVxuICB2YWxpZGF0ZUlucHV0KHZhbHVlOiBzdHJpbmcsIHR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmICh0eXBlID09PSAncGxhY2Vob2xkZXInKSB7XG4gICAgICBjb25zdCByZWdleCA9IC9eW2EtekEtWjAtOVxcc10qJC87XG4gICAgICBpZiAoIXJlZ2V4LnRlc3QodmFsdWUpKSB7XG4gICAgICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gJ09ubHkgbGV0dGVycyBhbmQgbnVtYmVycyBhcmUgYWxsb3dlZCc7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5lcnJvck1lc3NhZ2UgPSAnJztcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBzZXRWYWx1ZUJ5UGF0aChwYXRoOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAodmFsdWUgPT09ICdxdWVzdGlvbicpIHtcbiAgICAgIGlmICghdGhpcy52YWxpZGF0ZUlucHV0KHZhbHVlLCB2YWx1ZSkpIHtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qga2V5cyA9IHBhdGguc3BsaXQoJy4nKTtcbiAgICBsZXQgb2JqID0gdGhpcy5zZWxlY3RlZEVsZW1lbnQ7XG5cbiAgICBrZXlzLmZvckVhY2goKGtleSwgaW5kZXgpID0+IHtcbiAgICAgIGlmICghb2JqW2tleV0pIHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIG5leHQga2V5IGlzIGEgbnVtYmVyIChhcnJheSBpbmRleClcbiAgICAgICAgY29uc3QgbmV4dEtleSA9IGtleXNbaW5kZXggKyAxXTtcbiAgICAgICAgb2JqW2tleV0gPSBpc05hTihOdW1iZXIobmV4dEtleSkpID8ge30gOiBbXTtcbiAgICAgIH1cbiAgICAgIGlmIChpbmRleCA9PT0ga2V5cy5sZW5ndGggLSAxKSB7XG4gICAgICAgIC8vIENvbnZlcnQgdmFsdWUgdG8gbnVtYmVyIGZvciBmb250U2l6ZVxuICAgICAgICBpZiAoa2V5ID09PSAnZm9udFNpemUnKSB7XG4gICAgICAgICAgb2JqW2tleV0gPSBwYXJzZUludCh2YWx1ZSwgMTApIHx8IDE0OyAvLyBEZWZhdWx0IHRvIDE0IGlmIGludmFsaWRcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvYmpba2V5XSA9IHZhbHVlOyAvLyBBc3NpZ24gdmFsdWUgdG8gbGFzdCBrZXlcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb2JqID0gb2JqW2tleV07IC8vIE1vdmUgZGVlcGVyXG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5wZGZEZXNpZ25lclNlcnZpY2UuZWxlbWVudFVwZGF0ZSh0aGlzLnNlbGVjdGVkRWxlbWVudCk7XG4gIH1cbiAgZ2V0U3R5bGVLZXlzKCk6IHN0cmluZ1tdIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRFbGVtZW50IHx8ICF0aGlzLnNlbGVjdGVkRWxlbWVudC5zdHlsZSB8fCB0eXBlb2YgdGhpcy5zZWxlY3RlZEVsZW1lbnQuc3R5bGUgIT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLnNlbGVjdGVkRWxlbWVudC5zdHlsZSk7XG4gIH0gIFxuXG4gIC8vIFNLUzE5TUFSMjUgdXBkYXRlIGVsZW1lbnQgaW4gc2Vydmllc1xuICB1cGRhdGVFbGVtZW50KGVsZW1lbnQ6IGFueSkge1xuICAgIHRoaXMucGRmRGVzaWduZXJTZXJ2aWNlLmVsZW1lbnRVcGRhdGUoZWxlbWVudClcbiAgICBpZiAodGhpcy5zZWxlY3RlZEVsZW1lbnQ/LnR5cGUgPT09ICdUYWJsZScgJiYgdGhpcy5zZWxlY3RDb2x1bW4pIHtcbiAgICAgIHRoaXMucGRmRGVzaWduZXJTZXJ2aWNlLnNldFNlbGVjdGVkVGFibGVFbGVtZW50KHRoaXMuc2VsZWN0ZWRFbGVtZW50SW5kZXgsIHsgdW5pcXVlSWRlbnRpZmllcjogdGhpcy5zZWxlY3RDb2x1bW4gfHwgbnVsbCB9KTtcbiAgICB9XG4gIH1cbiAgLy8gU0tTMTlNQVIyNSBnZXQgdmFsdWUgZnJvbSBhcnJheVxuICBnZXRWYWx1ZUJ5QXJyYXlQYXRoKHRhcmdldEFycmF5UGF0aDogYW55LCB0YXJnZXRBcnJheUtleTogc3RyaW5nLCBzZWxlY3RDb2x1bW46IHN0cmluZywga2V5UGF0aDogc3RyaW5nKTogYW55IHtcbiAgICBjb25zdCB0YXJnZXRBcnJheSA9IHRoaXMuZ2V0RGF0YUJ5UGF0aCh0YXJnZXRBcnJheVBhdGgpO1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh0YXJnZXRBcnJheSkpIHJldHVybiAnJztcblxuICAgIGNvbnN0IGZvdW5kSXRlbSA9IHRhcmdldEFycmF5LmZpbmQoaXRlbSA9PiBpdGVtW3RhcmdldEFycmF5S2V5XSA9PT0gc2VsZWN0Q29sdW1uKTtcblxuICAgIHJldHVybiBmb3VuZEl0ZW0gPyBrZXlQYXRoLnNwbGl0KCcuJykucmVkdWNlKChvYmosIGtleSkgPT4gb2JqPy5ba2V5XSwgZm91bmRJdGVtKSA6ICcnO1xuICB9XG5cbiAgLy9TS1MxOU1BUjI1IEZ1bmN0aW9uIHRvIHVwZGF0ZSBhIHZhbHVlIGluIGFuIGFycmF5IGR5bmFtaWNhbGx5XG4gIHVwZGF0ZVZhbHVlQnlBcnJheVBhdGgodGFyZ2V0QXJyYXlQYXRoOiBhbnksIHRhcmdldEFycmF5S2V5OiBzdHJpbmcsIHNlbGVjdENvbHVtbjogc3RyaW5nLCBrZXlQYXRoOiBzdHJpbmcsIGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHRhcmdldEFycmF5ID0gdGhpcy5nZXREYXRhQnlQYXRoKHRhcmdldEFycmF5UGF0aCk7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHRhcmdldEFycmF5KSkgcmV0dXJuO1xuXG4gICAgLy8gRmluZCB0aGUgb2JqZWN0IHRoYXQgbWF0Y2hlcyBzZWxlY3RDb2x1bW5cbiAgICBsZXQgZm91bmRJdGVtID0gdGFyZ2V0QXJyYXkuZmluZChpdGVtID0+IGl0ZW1bdGFyZ2V0QXJyYXlLZXldID09PSBzZWxlY3RDb2x1bW4pO1xuXG4gICAgLy8gSWYgdGhlIGl0ZW0gZG9lcyBub3QgZXhpc3QsIGNyZWF0ZSBhbmQgYWRkIGl0XG4gICAgaWYgKCFmb3VuZEl0ZW0pIHtcbiAgICAgIGZvdW5kSXRlbSA9IHsgW3RhcmdldEFycmF5S2V5XTogc2VsZWN0Q29sdW1uIH07IC8vIEVuc3VyZSB0aGUga2V5IGV4aXN0c1xuICAgICAgdGFyZ2V0QXJyYXkucHVzaChmb3VuZEl0ZW0pO1xuICAgIH1cblxuICAgIC8vIFRyYXZlcnNlIGFuZCBzZXQgdGhlIHZhbHVlXG4gICAgY29uc3Qga2V5cyA9IGtleVBhdGguc3BsaXQoJy4nKTtcbiAgICBsZXQgb2JqID0gZm91bmRJdGVtO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgY29uc3Qga2V5ID0ga2V5c1tpXTtcbiAgICAgIGlmICghb2JqW2tleV0pIG9ialtrZXldID0ge307IC8vIEluaXRpYWxpemUgbWlzc2luZyBvYmplY3RzXG4gICAgICBvYmogPSBvYmpba2V5XTtcbiAgICB9XG5cbiAgICAvLyBBc3NpZ24gdGhlIHZhbHVlIGJhc2VkIG9uIGlucHV0IHR5cGVcbiAgICBjb25zdCBsYXN0S2V5ID0ga2V5c1trZXlzLmxlbmd0aCAtIDFdO1xuICAgIGNvbnN0IGlucHV0RWxlbWVudCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuXG4gICAgb2JqW2xhc3RLZXldID0gaW5wdXRFbGVtZW50Py50eXBlID09PSAnY2hlY2tib3gnID8gaW5wdXRFbGVtZW50LmNoZWNrZWQgOiBpbnB1dEVsZW1lbnQudmFsdWU7XG4gICAgaWYgKGtleVBhdGggPT09ICdzdW1tYXJ5Q29sdW1uJykge1xuICAgICAgaWYgKG9ialsnc3VtbWFyeVJvdyddID09PSB0cnVlKSB7XG4gICAgICAgIG9ialsnc3VtbWFyeVJvdyddID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoaW5wdXRFbGVtZW50LmNoZWNrZWQgPT09IHRydWUpIHtcbiAgICAgICAgb2JqWydmbGRUeXBlJ10gPSAnY2FsY3VsYXRpb24nXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvYmpbJ2ZsZFR5cGUnXSA9ICdUZXh0J1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoa2V5UGF0aCA9PT0gJ3N1bW1hcnlSb3cnKSB7XG4gICAgICAvL3RoaXMucGRmRGVzaWduZXJTZXJ2aWNlLnNldFN1bW1hcnlSb3dEYXRhKG9iaik7IFxuICAgICAgaWYgKG9ialsnc3VtbWFyeUNvbHVtbiddID09PSB0cnVlKSB7XG4gICAgICAgIG9ialsnc3VtbWFyeUNvbHVtbiddID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoaW5wdXRFbGVtZW50LmNoZWNrZWQgPT09IHRydWUpIHtcbiAgICAgICAgb2JqWydmbGRUeXBlJ10gPSAnY2FsY3VsYXRpb24nXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvYmpbJ2ZsZFR5cGUnXSA9ICdUZXh0J1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnVwZGF0ZUVsZW1lbnQodGhpcy5zZWxlY3RlZEVsZW1lbnQpXG4gIH1cbiAgZ2V0RGF0YUJ5UGF0aChwYXRoOiBzdHJpbmcpOiBhbnkge1xuICAgIHJldHVybiBwYXRoLnNwbGl0KCcuJykucmVkdWNlKChvYmosIGtleSkgPT4gb2JqPy5ba2V5XSwgdGhpcy5zZWxlY3RlZEVsZW1lbnQpO1xuICB9XG5cbiAgLy8gU0tTMjVNQVIyNSBpbWFnZSBlZGl0IGZ1bmN0aW9uc1xuICBmbGlwSG9yaXpvbnRhbCgpIHtcbiAgICB0aGlzLnRyYW5zZm9ybSA9IHtcbiAgICAgIC4uLnRoaXMudHJhbnNmb3JtLFxuICAgICAgZmxpcEg6ICF0aGlzLnRyYW5zZm9ybS5mbGlwSFxuICAgIH07XG4gIH1cblxuICBmbGlwVmVydGljYWwoKSB7XG4gICAgdGhpcy50cmFuc2Zvcm0gPSB7XG4gICAgICAuLi50aGlzLnRyYW5zZm9ybSxcbiAgICAgIGZsaXBWOiAhdGhpcy50cmFuc2Zvcm0uZmxpcFZcbiAgICB9O1xuICB9XG5cbiAgcmVzZXRJbWFnZSgpIHtcbiAgICB0aGlzLmNhbnZhc1JvdGF0aW9uID0gMDtcbiAgICB0aGlzLmNyb3BwZXIgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy50cmFuc2Zvcm0gPSB7XG4gICAgICB0cmFuc2xhdGVVbml0OiAncHgnLFxuICAgICAgc2NhbGU6IDEsXG4gICAgICByb3RhdGU6IDAsXG4gICAgICBmbGlwSDogZmFsc2UsXG4gICAgICBmbGlwVjogZmFsc2UsXG4gICAgICB0cmFuc2xhdGVIOiAwLFxuICAgICAgdHJhbnNsYXRlVjogMFxuICAgIH07XG4gIH1cblxuICB6b29tT3V0KCkge1xuICAgIHRoaXMudHJhbnNmb3JtID0ge1xuICAgICAgLi4udGhpcy50cmFuc2Zvcm0sXG4gICAgICBzY2FsZTogdGhpcy50cmFuc2Zvcm0uc2NhbGUhIC0gLjFcbiAgICB9O1xuICB9XG5cbiAgem9vbUluKCkge1xuICAgIHRoaXMudHJhbnNmb3JtID0ge1xuICAgICAgLi4udGhpcy50cmFuc2Zvcm0sXG4gICAgICBzY2FsZTogdGhpcy50cmFuc2Zvcm0uc2NhbGUhICsgLjFcbiAgICB9O1xuICB9XG4gIHJvdGF0ZUxlZnQoKSB7XG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHsgLy8gVXNlIHRpbWVvdXQgYmVjYXVzZSByb3RhdGluZyBpbWFnZSBpcyBhIGhlYXZ5IG9wZXJhdGlvbiBhbmQgd2lsbCBibG9jayB0aGUgdWkgdGhyZWFkXG4gICAgICB0aGlzLmNhbnZhc1JvdGF0aW9uLS07XG4gICAgICB0aGlzLmZsaXBBZnRlclJvdGF0ZSgpO1xuICAgIH0pO1xuICB9XG5cbiAgcm90YXRlUmlnaHQoKSB7XG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuY2FudmFzUm90YXRpb24rKztcbiAgICAgIHRoaXMuZmxpcEFmdGVyUm90YXRlKCk7XG4gICAgfSk7XG4gIH1cblxuICBtb3ZlTGVmdCgpIHtcbiAgICB0aGlzLnRyYW5zZm9ybSA9IHtcbiAgICAgIC4uLnRoaXMudHJhbnNmb3JtLFxuICAgICAgdHJhbnNsYXRlSDogdGhpcy50cmFuc2Zvcm0udHJhbnNsYXRlSCEgLSAxXG4gICAgfTtcbiAgfVxuXG4gIG1vdmVSaWdodCgpIHtcbiAgICB0aGlzLnRyYW5zZm9ybSA9IHtcbiAgICAgIC4uLnRoaXMudHJhbnNmb3JtLFxuICAgICAgdHJhbnNsYXRlSDogdGhpcy50cmFuc2Zvcm0udHJhbnNsYXRlSCEgKyAxXG4gICAgfTtcbiAgfVxuXG4gIG1vdmVEb3duKCkge1xuICAgIHRoaXMudHJhbnNmb3JtID0ge1xuICAgICAgLi4udGhpcy50cmFuc2Zvcm0sXG4gICAgICB0cmFuc2xhdGVWOiB0aGlzLnRyYW5zZm9ybS50cmFuc2xhdGVWISArIDFcbiAgICB9O1xuICB9XG5cbiAgbW92ZVVwKCkge1xuICAgIHRoaXMudHJhbnNmb3JtID0ge1xuICAgICAgLi4udGhpcy50cmFuc2Zvcm0sXG4gICAgICB0cmFuc2xhdGVWOiB0aGlzLnRyYW5zZm9ybS50cmFuc2xhdGVWISAtIDFcbiAgICB9O1xuICB9XG4gIHByaXZhdGUgZmxpcEFmdGVyUm90YXRlKCkge1xuICAgIGNvbnN0IGZsaXBwZWRIID0gdGhpcy50cmFuc2Zvcm0uZmxpcEg7XG4gICAgY29uc3QgZmxpcHBlZFYgPSB0aGlzLnRyYW5zZm9ybS5mbGlwVjtcbiAgICB0aGlzLnRyYW5zZm9ybSA9IHtcbiAgICAgIC4uLnRoaXMudHJhbnNmb3JtLFxuICAgICAgZmxpcEg6IGZsaXBwZWRWLFxuICAgICAgZmxpcFY6IGZsaXBwZWRILFxuICAgICAgdHJhbnNsYXRlSDogMCxcbiAgICAgIHRyYW5zbGF0ZVY6IDBcbiAgICB9O1xuICB9XG4gIGFzeW5jIGltYWdlQ3JvcHBlZChldmVudDogYW55KSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGJhc2U2NCA9IGF3YWl0IHRoaXMuY29udmVydEJsb2JUb0Jhc2U2NChldmVudC5vYmplY3RVcmwpO1xuICAgICAgdGhpcy5zZWxlY3RlZEVsZW1lbnQuaW1hZ2VEYXRhID0gYmFzZTY0O1xuICAgICAgYXdhaXQgdGhpcy5wZGZEZXNpZ25lclNlcnZpY2UuZWxlbWVudFVwZGF0ZSggdGhpcy5zZWxlY3RlZEVsZW1lbnQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgaW4gaW1hZ2VDcm9wcGVkOlwiLCBlcnJvcik7XG4gICAgfVxuICB9XG5cblxuICBjcm9wcGVyUmVhZHkoc291cmNlSW1hZ2VEaW1lbnNpb25zOiBEaW1lbnNpb25zKSB7XG4gICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gIH1cbiAgLy8gU0tTMjVNQVIyNSBibG9iIHRvIGJhc2UgNjQgY29udmVydGVyXG4gIGNvbnZlcnRCbG9iVG9CYXNlNjQob2JqZWN0VXJsOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBmZXRjaChvYmplY3RVcmwpXG4gICAgICAudGhlbihyZXNwb25zZSA9PiByZXNwb25zZS5ibG9iKCkpXG4gICAgICAudGhlbihibG9iID0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGJsb2IpO1xuICAgICAgICAgIHJlYWRlci5vbmxvYWRlbmQgPSAoKSA9PiByZXNvbHZlKHJlYWRlci5yZXN1bHQgYXMgc3RyaW5nKTtcbiAgICAgICAgICByZWFkZXIub25lcnJvciA9IGVycm9yID0+IHJlamVjdChlcnJvcik7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gIH1cbiAgLy8gU0tTMjhNQVIyNSBxYiBwZGYgdXBkYXRlIGluIHBkZiBlbGVtZW50XG4gIGNoaWxkRXZlbnRDYXB0dXJlKGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLnNlbGVjdGVkRWxlbWVudC5wZGZSZWZlcmVuY2UgPSBPYmplY3Qua2V5cyhldmVudC52YWx1ZS52YWx1ZU9iailbMF1cbiAgICB0aGlzLnNlbGVjdGVkRWxlbWVudC5wZGZSZWZlcmVuY2VRdWVzdGlvbnMgPSBldmVudC52YWx1ZS52YWx1ZU9ialxuICAgIHRoaXMucGRmRGVzaWduZXJTZXJ2aWNlLmVsZW1lbnRVcGRhdGUoIHRoaXMuc2VsZWN0ZWRFbGVtZW50KTtcbiAgfVxuXG4gIC8vIFNLUzI4TUFSMjUgcGRmIHNlYXJjaCBkcm9wZG93biBlbWl0XG4gIGxpbmtUb2dnbGVEcm9wZG93bihldmVudDogRXZlbnQpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLmlzTGlua0Ryb3Bkb3duT3BlbiA9ICF0aGlzLmlzTGlua0Ryb3Bkb3duT3BlbjtcbiAgfVxuXG4gIC8vIFNLUzI4TUFSMjUgcGRmIHNlYXJjaCBkcm9wZG93biBjbG9zZVxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycsIFsnJGV2ZW50J10pXG4gIG9uQ2xpY2tPdXRzaWRlKGV2ZW50OiBFdmVudCkge1xuICAgIGlmICh0aGlzLmRyb3Bkb3duICYmICF0aGlzLmRyb3Bkb3duLm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0KSkge1xuICAgICAgdGhpcy5pc0xpbmtEcm9wZG93bk9wZW4gPSBmYWxzZTtcbiAgICB9XG4gIH1cbiAgLy8gQVAtMjhNQVIyNSBXaGVuIGRyYWcgc3RhcnRzLCBzdG9yZSB0aGUgaW5kZXhcbiAgb25EcmFnU3RhcnQoZXZlbnQ6IERyYWdFdmVudCwgaWQ6IHN0cmluZykge1xuICAgIHRoaXMuZHJhZ2dlZElkID0gaWQ7XG4gICAgZXZlbnQuZGF0YVRyYW5zZmVyIS5lZmZlY3RBbGxvd2VkID0gXCJtb3ZlXCI7XG4gIH1cblxuICAvLyBBUC0yOE1BUjI1IFByZXZlbnQgZGVmYXVsdCBiZWhhdmlvciB0byBhbGxvdyBkcm9wXG4gIG9uRHJhZ092ZXIoZXZlbnQ6IERyYWdFdmVudCkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIH1cblxuICAvLyBBUC0yOE1BUjI1IFN3YXAgdGhlIGRyYWdnZWQgaXRlbSB3aXRoIHRoZSBkcm9wcGVkIHBvc2l0aW9uXG4gIG9uRHJvcChldmVudDogRHJhZ0V2ZW50LCBrZXk6IHN0cmluZykge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgY29uc3QgdGFyZ2V0SWQgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KFwiLm9wdGlvbi1pdGVtc1wiKT8uZ2V0QXR0cmlidXRlKFwiZGF0YS1pZFwiKTtcblxuICAgIGlmICh0aGlzLmRyYWdnZWRJZCAmJiB0YXJnZXRJZCAmJiB0aGlzLmRyYWdnZWRJZCAhPT0gdGFyZ2V0SWQpIHtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLnNlbGVjdGVkRWxlbWVudFtrZXldO1xuXG4gICAgICBbb3B0aW9uc1t0aGlzLmRyYWdnZWRJZF0sIG9wdGlvbnNbdGFyZ2V0SWRdXSA9IFtvcHRpb25zW3RhcmdldElkXSwgb3B0aW9uc1t0aGlzLmRyYWdnZWRJZF1dO1xuICAgICAgLy8gRmluZCB0aGUgaW5kZXhlcyBvZiB0aGUgZHJhZ2dlZCBhbmQgdGFyZ2V0IG9wdGlvbnNcbiAgICAgIGNvbnN0IGRyYWdnZWRJbmRleCA9IG9wdGlvbnMuZmluZEluZGV4KG9wdGlvbiA9PiBvcHRpb24uaWQgPT09IHRoaXMuZHJhZ2dlZElkKTtcbiAgICAgIGNvbnN0IHRhcmdldEluZGV4ID0gb3B0aW9ucy5maW5kSW5kZXgob3B0aW9uID0+IG9wdGlvbi5pZCA9PT0gdGFyZ2V0SWQpO1xuXG4gICAgICAvLyBTd2FwIHRoZSBpdGVtc1xuICAgICAgaWYgKGRyYWdnZWRJbmRleCAhPT0gLTEgJiYgdGFyZ2V0SW5kZXggIT09IC0xKSB7XG4gICAgICAgIFtvcHRpb25zW2RyYWdnZWRJbmRleF0sIG9wdGlvbnNbdGFyZ2V0SW5kZXhdXSA9IFtvcHRpb25zW3RhcmdldEluZGV4XSwgb3B0aW9uc1tkcmFnZ2VkSW5kZXhdXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmRyYWdnZWRJZCA9IG51bGw7XG4gIH1cbiAgb25XaWR0aFNlbGVjdCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgaWYgKHZhbHVlID09PSAnKicgfHwgdmFsdWUgPT09ICdhdXRvJykge1xuICAgICAgdGhpcy5zZXRWYWx1ZUJ5UGF0aCgnd2lkdGgnLCB2YWx1ZSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGVkRWxlbWVudD8ud2lkdGggPT09ICcqJyB8fCB0aGlzLnNlbGVjdGVkRWxlbWVudD8ud2lkdGggPT09ICdhdXRvJykge1xuICAgICAgLy8gRGVmYXVsdCB0byAxMDAgaWYgc3dpdGNoaW5nIGZyb20gKiBvciBhdXRvIHRvIGN1c3RvbVxuICAgICAgdGhpcy5zZXRWYWx1ZUJ5UGF0aCgnd2lkdGgnLCAxMDApO1xuICAgIH1cbiAgfVxuICBcbn1cbiIsIjwhLS0gIC0gRmllbGQgYW5kIEVsZW1lbnQgUHJvcGVydGllcyAtLT5cbjxkaXYgY2xhc3M9XCJjb250YWluZXJcIj5cbiAgPGRpdiBjbGFzcz1cInRhYnNcIj5cbiAgICA8ZGl2IGNsYXNzPVwidGFiXCIgW25nQ2xhc3NdPVwieydhY3RpdmUnOiBhY3RpdmVUYWIgPT09ICdhdHRyaWJ1dGVzJ31cIiAoY2xpY2spPVwic2V0QWN0aXZlVGFiKCdhdHRyaWJ1dGVzJylcIj5cbiAgICAgIEF0dHJpYnV0ZXNcbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwidGFiXCIgW25nQ2xhc3NdPVwieydhY3RpdmUnOiBhY3RpdmVUYWIgPT09ICdwcm9wZXJ0eSd9XCIgKGNsaWNrKT1cInNldEFjdGl2ZVRhYigncHJvcGVydHknKVwiPlxuICAgICAgUHJvcGVydHlcbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwidGFiXCIgW25nQ2xhc3NdPVwieydhY3RpdmUnOiBhY3RpdmVUYWIgPT09ICdhcHBlYXJhbmNlJ31cIiAoY2xpY2spPVwic2V0QWN0aXZlVGFiKCdhcHBlYXJhbmNlJylcIj5cbiAgICAgIEFwcGVhcmFuY2VcbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cInRhYi1jb250ZW50XCIgKm5nSWY9XCJhY3RpdmVUYWIgPT09ICdhdHRyaWJ1dGVzJ1wiPlxuICAgIDwhLS0gRWxlbWVudCBQcm9wZXJydGllcyAtLT5cbiAgICA8IS0tICBTZWxlY3QgZWxlbWVudCB0eXBlIHNob3cgLS0+XG4gICAgPGRpdiAqbmdJZj1cImdldFByb3BlcnRpZXMoKVwiPlxuICAgICAgPCEtLSBTS1MyNU1BUjI1IHRoaXMgaXMgZm9yIGltYWdlIGVkaXQgLS0+XG4gICAgICA8ZGl2ICpuZ0lmPVwic2VsZWN0ZWRFbGVtZW50Py50eXBlID09PSAnaW1hZ2UnXCI+XG4gICAgICAgIDxpbWFnZS1jcm9wcGVyICpuZ0lmPVwic2VsZWN0ZWRFbGVtZW50LmltYWdlRGF0YSBcIiBbaW1hZ2VCYXNlNjRdPVwic2VsZWN0ZWRFbGVtZW50Lm9yZ0ltYWdlRGF0YVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImZhbHNlXCIgW2FsaWduSW1hZ2VdPVwiYWxpZ25JbWFnZVwiIFtyb3VuZENyb3BwZXJdPVwicm91bmRDcm9wcGVyXCIgW2JhY2tncm91bmRDb2xvcl09XCInd2hpdGUnXCJcbiAgICAgICAgICBpbWFnZUFsdFRleHQ9XCJBbHRlcm5hdGl2ZSBpbWFnZSB0ZXh0XCIgW2FsbG93TW92ZUltYWdlXT1cImZhbHNlXCIgW2hpZGVSZXNpemVTcXVhcmVzXT1cImZhbHNlXCJcbiAgICAgICAgICBbY2FudmFzUm90YXRpb25dPVwiY2FudmFzUm90YXRpb25cIiBbYXNwZWN0UmF0aW9dPVwiYXNwZWN0UmF0aW9cIiBbY29udGFpbldpdGhpbkFzcGVjdFJhdGlvXT1cImZhbHNlXCJcbiAgICAgICAgICBbbWFpbnRhaW5Bc3BlY3RSYXRpb109XCJmYWxzZVwiIFtjcm9wcGVyU3RhdGljV2lkdGhdPVwiY3JvcHBlclN0YXRpY1dpZHRoXCJcbiAgICAgICAgICBbY3JvcHBlclN0YXRpY0hlaWdodF09XCJjcm9wcGVyU3RhdGljSGVpZ2h0XCIgW2Nyb3BwZXJNaW5XaWR0aF09XCJjcm9wcGVyTWluV2lkdGhcIlxuICAgICAgICAgIFtjcm9wcGVyTWluSGVpZ2h0XT1cImNyb3BwZXJNaW5IZWlnaHRcIiBbY3JvcHBlck1heFdpZHRoXT1cImNyb3BwZXJNYXhXaWR0aFwiXG4gICAgICAgICAgW2Nyb3BwZXJNYXhIZWlnaHRdPVwiY3JvcHBlck1heEhlaWdodFwiIFtyZXNldENyb3BPbkFzcGVjdFJhdGlvQ2hhbmdlXT0ndHJ1ZScgWyhjcm9wcGVyKV09XCJjcm9wcGVyXCJcbiAgICAgICAgICBbKHRyYW5zZm9ybSldPVwidHJhbnNmb3JtXCIgW29ubHlTY2FsZURvd25dPVwidHJ1ZVwiIG91dHB1dD1cImJsb2JcIiBmb3JtYXQ9XCJwbmdcIlxuICAgICAgICAgIChpbWFnZUNyb3BwZWQpPVwiaW1hZ2VDcm9wcGVkKCRldmVudClcIiAoY3JvcHBlclJlYWR5KT1cImNyb3BwZXJSZWFkeSgkZXZlbnQpXCI+PC9pbWFnZS1jcm9wcGVyPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwic2VsZWN0ZWRFbGVtZW50LmltYWdlRGF0YSBcIiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGdhcDogMnB4O1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBsb2dvLWljb25cIiAoY2xpY2spPVwicm90YXRlTGVmdCgpXCIgdGl0bGU9XCJSb3RhdGUgTGVmdFwiPuKfsjwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBsb2dvLWljb25cIiAoY2xpY2spPVwicm90YXRlUmlnaHQoKVwiIHRpdGxlPVwiUm90YXRlIFJpZ2h0XCI+4p+zPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImN1cnNvci1wb2ludGVyIGxvZ28taWNvblwiIChjbGljayk9XCJ6b29tT3V0KClcIiB0aXRsZT1cIlpvb20gT3V0XCI+LTwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBsb2dvLWljb25cIiAoY2xpY2spPVwiem9vbUluKClcIiB0aXRsZT1cIlpvb20gSW5cIj4rPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImN1cnNvci1wb2ludGVyIGxvZ28taWNvblwiIChjbGljayk9XCJtb3ZlTGVmdCgpXCIgdGl0bGU9XCJNb3ZlIExlZnRcIj7ihpA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgbG9nby1pY29uXCIgKGNsaWNrKT1cIm1vdmVSaWdodCgpXCIgdGl0bGU9XCJNb3ZlIFJpZ2h0XCI+4oaSPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImN1cnNvci1wb2ludGVyIGxvZ28taWNvblwiIChjbGljayk9XCJtb3ZlVXAoKVwiIHRpdGxlPVwiTW92ZSBVcFwiPuKGkTwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBsb2dvLWljb25cIiAoY2xpY2spPVwibW92ZURvd24oKVwiIHRpdGxlPVwiTW92ZSBEb3duXCI+4oaTPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImN1cnNvci1wb2ludGVyIGxvZ28taWNvblwiIChjbGljayk9XCJmbGlwSG9yaXpvbnRhbCgpXCIgW2NsYXNzLmVuYWJsZWRdPVwidHJhbnNmb3JtLmZsaXBIXCJcbiAgICAgICAgICAgIHRpdGxlPVwiRmxpcCBIb3Jpem9udGFsbHlcIj7ihpQ8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgbG9nby1pY29uXCIgKGNsaWNrKT1cImZsaXBWZXJ0aWNhbCgpXCIgW2NsYXNzLmVuYWJsZWRdPVwidHJhbnNmb3JtLmZsaXBWXCJcbiAgICAgICAgICAgIHRpdGxlPVwiRmxpcCBWZXJ0aWNhbGx5XCI+4oaVPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImN1cnNvci1wb2ludGVyIGxvZ28taWNvblwiIChjbGljayk9XCJyZXNldEltYWdlKClcIiB0aXRsZT1cIlJlc2V0XCI+w5c8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDwhLS0gU0tTMjhNQVIyNSBzZWFyY2ggcGRmIHNwZWNpZmljIGZvciBwZGYgZWxlbWVudCAtLT5cbiAgICAgIDxkaXYgKm5nSWY9XCJzZWxlY3RlZEVsZW1lbnQ/LnR5cGUgPT09ICdQZGYnXCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cInRleHQtc21cIj5TZWFyY2ggUGRmPC9sYWJlbD5cbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGdhcDogMnB4OyBhbGlnbi1pdGVtczogY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcIj5cbiAgICAgICAgICA8bnh0LXNlYXJjaC1ib3ggW3F1ZXN0aW9uXT1cInNlbGVjdGVkRWxlbWVudFwiIFtyZWFkT25seV09XCJzZWxlY3RlZEVsZW1lbnQuaXNSZWFkT25seVwiIFthcGlNZXRhXT1cImJvb2tTdWJ0ZXh0XCJcbiAgICAgICAgICAgICAgW3BsYWNlSG9sZGVyVGV4dF09XCJzZWxlY3RlZEVsZW1lbnQucXVlc3Rpb24gfHwgJydcIlxuICAgICAgICAgICAgICBbbW9kZV09XCInZWRpdCdcIlxuICAgICAgICAgICAgICAoc2VhcmNoVmFsdWVDaGFuZ2UpPVwiY2hpbGRFdmVudENhcHR1cmUoJGV2ZW50KVwiPlxuICAgICAgICAgIDwvbnh0LXNlYXJjaC1ib3g+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImxpbmstaWNvblwiPlxuICAgICAgICAgICAgPHN2ZyAoY2xpY2spPVwibGlua1RvZ2dsZURyb3Bkb3duKCRldmVudClcIiBmaWxsPVwiIzAwMDAwMFwiIHZlcnNpb249XCIxLjFcIiBpZD1cIkNhcGFfMVwiXG4gICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB3aWR0aD1cIjI0cHhcIiBoZWlnaHQ9XCIyNHB4XCJcbiAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCA0NTAgNDUwXCIgeG1sOnNwYWNlPVwicHJlc2VydmVcIj5cbiAgICAgICAgICAgICAgPGc+XG4gICAgICAgICAgICAgICAgPGc+XG4gICAgICAgICAgICAgICAgICA8Zz5cbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0zMTguMTUsMjMwLjE5NWw3Ny45MzQtNzcuOTM3YzMxLjg5NC0zMS44OTIsMzEuODk0LTgzLjc4Mi0wLjAwNC0xMTUuNjc0bC0xMi42Ni0xMi42NlxuICAgICAgICAgIGMtMzEuODkzLTMxLjg5Ni04My43OC0zMS44OTYtMTE1LjY3NC0wLjAwNGwtNzcuOTM3LDc3LjkzNGMtMTcuNTg4LDE3LjU4OC0yNS40NTcsNDEuMjY0LTIzLjY0Niw2NC4zMTFcbiAgICAgICAgICBjLTIzLjA0NS0xLjgxMy00Ni43MjIsNi4wNTYtNjQuMzA4LDIzLjY0N0wyMy45MiwyNjcuNzQ4Yy0zMS44OTQsMzEuODg5LTMxLjg5NCw4My43NzksMCwxMTUuNjc0bDEyLjY2NCwxMi42NjJcbiAgICAgICAgICBjMzEuODkzLDMxLjg5Myw4My43ODMsMzEuODkzLDExNS42NzQsMGw3Ny45MzUtNzcuOTM2YzE3LjU5Mi0xNy41OSwyNS40NTktNDEuMjY2LDIzLjY0Ny02NC4zMDlcbiAgICAgICAgICBDMjc2Ljg4NCwyNTUuNjU0LDMwMC41NiwyNDcuNzgzLDMxOC4xNSwyMzAuMTk1eiBNMjAyLjY1MywyOTAuNjA1bC03Ny45MzYsNzcuOTM4Yy0xNi43MDUsMTYuNzAzLTQzLjg4OSwxNi43MDMtNjAuNTksMFxuICAgICAgICAgIGwtMTIuNjY2LTEyLjY2NmMtMTYuNzA1LTE2LjcwMS0xNi43MDMtNDMuODg1LDAtNjAuNTk0bDc3LjkzNi03Ny45MzJjMTQuMTQtMTQuMTQxLDM1Ljc3OS0xNi4zMDYsNTIuMjI2LTYuNTE2bC0zMi4zMDIsMzIuMzA3XG4gICAgICAgICAgYy03LjYwNiw3LjYwNC03LjYwNiwxOS45MzgsMCwyNy41NDFjNy42MDUsNy42MDcsMTkuOTM3LDcuNjA3LDI3LjU0MSwwbDMyLjMwNi0zMi4zMDNcbiAgICAgICAgICBDMjE4Ljk1OSwyNTQuODI4LDIxNi43OTUsMjc2LjQ2OSwyMDIuNjUzLDI5MC42MDV6IE0yMzguMzgyLDIwOS4xNjlsMzIuMjk5LTMyLjMwNmM3LjYwOC03LjYwMiw3LjYwOC0xOS45MzUsMC0yNy41MzhcbiAgICAgICAgICBjLTcuNjA0LTcuNjEtMTkuOTM2LTcuNjEtMjcuNTQxLTAuMDA0bC0zMi4zMDMsMzIuMzAzYy05Ljc5MS0xNi40NDYtNy42MjctMzguMDg3LDYuNTE0LTUyLjIyNmw3Ny45MzUtNzcuOTM1XG4gICAgICAgICAgYzE2LjcwNy0xNi43MDcsNDMuODktMTYuNzA3LDYwLjU5NCwwbDEyLjY2NCwxMi42NjRjMTYuNzA1LDE2LjcwNSwxNi43MDUsNDMuODg2LDAsNjAuNTkxbC03Ny45MzYsNzcuOTM3XG4gICAgICAgICAgQzI3Ni40NjgsMjE2Ljc5NywyNTQuODI4LDIxOC45NTksMjM4LjM4MiwyMDkuMTY5elwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMzQzLjQ2NiwyNjEuNDY1Yy00NS4yODcsMC04MiwzNi43MTMtODIsODJzMzYuNzEzLDgyLDgyLDgyYzQ1LjI4NiwwLDgyLTM2LjcxMyw4Mi04MlMzODguNzUzLDI2MS40NjUsMzQzLjQ2NiwyNjEuNDY1elxuICAgICAgICAgICBNMzcyLjUwNSwzMzMuNTY0bC01Ni4wNDYsNTYuMTA0Yy0wLjIzOSwwLjIzOC0wLjUzNiwwLjQxLTAuODYyLDAuNDk2bC0yMi4zMTUsNS44NWMtMC42NDksMC4xNjgtMS4zNDctMC4wMi0xLjgyMi0wLjQ5NFxuICAgICAgICAgIGMtMC40NzctMC40NzktMC42NjYtMS4xNzItMC40OTYtMS44MjRsNS44MjYtMjIuMzE4YzAuMDg0LTAuMzI2LDAuMjU2LTAuNjI3LDAuNDk0LTAuODYzbDU2LjA0Ny01Ni4xMDRcbiAgICAgICAgICBjMC43NDItMC43NDIsMS45NDUtMC43NDQsMi42ODgtMC4wMDJsNC41NDgsNC41NDFjMC43MzksMC43NCwwLjc0MSwxLjk0MywwLDIuNjg4bC0zNy40MzMsMzcuNDcxbDQuNzA5LDQuNzAzbDM3LjQzNS0zNy40NzFcbiAgICAgICAgICBjMC43MzktMC43NDIsMS45NC0wLjc0MiwyLjY4Mi0wLjAwMmw0LjU1LDQuNTQxQzM3My4yNSwzMzEuNjE3LDM3My4yNSwzMzIuODIyLDM3Mi41MDUsMzMzLjU2NHogTTM5NS40NzIsMzEwLjU3NGwtMTcsMTcuMDE4XG4gICAgICAgICAgYy0wLjczOSwwLjc0NC0xLjk0MiwwLjc0NC0yLjY4NSwwLjAwMmwtMTYuNDg5LTE2LjQ3NWMtMC43NDQtMC43NC0wLjc0NC0xLjk0My0wLjAwMi0yLjY4OGwxNy0xNy4wMlxuICAgICAgICAgIGMwLjc0MS0wLjc0LDEuOTQ0LTAuNzQsMi42ODgtMC4wMDJsMTYuNDg3LDE2LjQ3N0MzOTYuMjE2LDMwOC42MjksMzk2LjIxNiwzMDkuODMyLDM5NS40NzIsMzEwLjU3NHpcIiAvPlxuICAgICAgICAgICAgICAgICAgPC9nPlxuICAgICAgICAgICAgICAgIDwvZz5cbiAgICAgICAgICAgICAgPC9nPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGluay1kcm9wZG93bi1tZW51XCIgKm5nSWY9XCJpc0xpbmtEcm9wZG93bk9wZW5cIiAjZHJvcGRvd24+XG4gICAgICAgICAgICAgIDxsYWJlbD5FbmRwb2ludDo8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cImJvb2tTdWJ0ZXh0LmVuZHBvaW50XCIgLz5cblxuICAgICAgICAgICAgICA8bGFiZWw+VmFyaWFibGU6PC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJib29rU3VidGV4dC52YXJpYWJsZVwiIC8+XG5cbiAgICAgICAgICAgICAgPGxhYmVsPkZpZWxkOjwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIFtuZ01vZGVsXT1cImZpZWxkQXNTdHJpbmdcIiAobmdNb2RlbENoYW5nZSk9XCJ1cGRhdGVGaWVsZCgkZXZlbnQpXCIgLz5cblxuICAgICAgICAgICAgICA8bGFiZWw+RGVmYXVsdCBGaWVsZDo8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cImJvb2tTdWJ0ZXh0LmRlZmF1bHRGaWVsZFwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHByb3Agb2YgZ2V0UHJvcGVydGllcygpLmVsZW1lbnRQcm9wc1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICAgICAgICAgIDxsYWJlbCAqbmdJZj1cInByb3AudHlwZSAhPT0gJ2NoZWNrYm94JyAmJiBwcm9wLnR5cGUgIT09ICdzdWJRdWVzdGlvbidcIiBjbGFzcz1cInRleHQtc21cIj57eyBwcm9wLmxhYmVsXG4gICAgICAgICAgICB9fTwvbGFiZWw+XG5cbiAgICAgICAgICA8IS0tIFRleHQgSW5wdXQgLS0+XG4gICAgICAgICAgPGlucHV0ICpuZ0lmPVwicHJvcC50eXBlID09PSAndGV4dCdcIiB0eXBlPVwidGV4dFwiIFtwbGFjZWhvbGRlcl09XCJwcm9wLnBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJoZWFkZXJTZWxlY3QgPyBwZGYudGl0bGUgOiAoc2VsZWN0ZWRFbGVtZW50Py50eXBlID09PSAnVGFibGUnID8gKHByb3AudGFyZ2V0QXJyYXkgPyBnZXRWYWx1ZUJ5QXJyYXlQYXRoKHByb3AudGFyZ2V0QXJyYXksIHByb3AudGFyZ2V0QXJyYXlLZXksIHNlbGVjdENvbHVtbiwgcHJvcC5rZXkgKSA6IGdldFZhbHVlQnlQYXRoKHByb3Aua2V5KSApIDogIGdldFZhbHVlQnlQYXRoKHByb3Aua2V5KSlcIlxuICAgICAgICAgICAgKGlucHV0KT1cImhlYWRlclNlbGVjdCA/IHVwZGF0ZVRpdGxlKCRldmVudC50YXJnZXQudmFsdWUpIDogKHNlbGVjdGVkRWxlbWVudD8udHlwZSA9PT0gJ1RhYmxlJyA/IChwcm9wLnRhcmdldEFycmF5ID8gdXBkYXRlVmFsdWVCeUFycmF5UGF0aChwcm9wLnRhcmdldEFycmF5LCBwcm9wLnRhcmdldEFycmF5S2V5LCBzZWxlY3RDb2x1bW4sIHByb3Aua2V5LCAkZXZlbnQpIDogc2V0VmFsdWVCeVBhdGgocHJvcC5rZXksICRldmVudC50YXJnZXQudmFsdWUpICkgOiBzZXRWYWx1ZUJ5UGF0aChwcm9wLmtleSwgJGV2ZW50LnRhcmdldC52YWx1ZSkpXCJcbiAgICAgICAgICAgIFtjbGFzcy5yZWFkLW9ubHldPVwic2VsZWN0ZWRFbGVtZW50LnJlYWRPbmx5XCIgW3JlYWRvbmx5XT1cInNlbGVjdGVkRWxlbWVudC5yZWFkT25seVwiIC8+XG5cbiAgICAgICAgICA8IS0tIHF1ZXN0aW9uTnVtYmVyIC0tPlxuICAgICAgICAgIDxpbnB1dCAqbmdJZj1cInByb3Aua2V5ID09PSAncXVlc3Rpb25OdW1iZXInXCIgdHlwZT1cIm51bWJlclwiIFt2YWx1ZV09XCJzZWxlY3RlZEVsZW1lbnQucXVlc3Rpb25OdW1iZXJcIlxuICAgICAgICAgICAgKGlucHV0KT1cInNldFZhbHVlQnlQYXRoKCdxdWVzdGlvbk51bWJlcicsICRldmVudC50YXJnZXQudmFsdWUpXCIgLz5cblxuICAgICAgICAgIDwhLS0gZmlsZSAtLT5cbiAgICAgICAgICA8IS0tIEFkZCB0aGlzIGluc2lkZSB0aGUgZWxlbWVudFByb3BzIGxvb3Agd2hlcmUgb3RoZXIgaW5wdXRzIGFyZSByZW5kZXJlZCAtLT5cbiAgICAgICAgICA8c2VsZWN0ICpuZ0lmPVwicHJvcC50eXBlID09PSAnc2VsZWN0JyAmJiBwcm9wLmtleSA9PT0gJ3N1cHBvcnRUeXBlJ1wiIFt2YWx1ZV09XCJzZWxlY3RlZEVsZW1lbnRbcHJvcC5rZXldXCJcbiAgICAgICAgICAgIChjaGFuZ2UpPVwic2V0VmFsdWVCeVBhdGgocHJvcC5rZXksICRldmVudC50YXJnZXQudmFsdWUpXCI+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+LS0tU2VsZWN0LS0tPC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgcHJvcC5vcHRpb25zXCIgW3ZhbHVlXT1cIm9wdGlvbi52YWx1ZVwiPiB7eyBvcHRpb24ubGFiZWwgfX0gPC9vcHRpb24+XG4gICAgICAgICAgPC9zZWxlY3Q+XG5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwicHJvcC50eXBlID09PSAnY2hlY2tib3gnXCI+XG5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICBbY2hlY2tlZF09XCJzZWxlY3RlZEVsZW1lbnQudHlwZSA9PT0gJ1RhYmxlJyA/IChwcm9wLnRhcmdldEFycmF5ID8gZ2V0VmFsdWVCeUFycmF5UGF0aChwcm9wLnRhcmdldEFycmF5LCBwcm9wLnRhcmdldEFycmF5S2V5LCBzZWxlY3RDb2x1bW4sIHByb3Aua2V5ICkgOiBnZXRWYWx1ZUJ5UGF0aChwcm9wLmtleSkgKTogIGdldFZhbHVlQnlQYXRoKHByb3Aua2V5KSBcIlxuICAgICAgICAgICAgICAoY2hhbmdlKT1cIiBzZWxlY3RlZEVsZW1lbnQudHlwZSA9PT0gJ1RhYmxlJyA/IChwcm9wLnRhcmdldEFycmF5ID8gdXBkYXRlVmFsdWVCeUFycmF5UGF0aChwcm9wLnRhcmdldEFycmF5LCBwcm9wLnRhcmdldEFycmF5S2V5LCBzZWxlY3RDb2x1bW4sIHByb3Aua2V5LCAkZXZlbnQpIDogb25Ub2dnbGVDaGFuZ2UocHJvcC5rZXksICRldmVudCkgKSA6IG9uVG9nZ2xlQ2hhbmdlKHByb3Aua2V5LCAkZXZlbnQpXCIgLz5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0b2dnbGUtbGFiZWxcIiBzdHlsZT1cInBhZGRpbmctbGVmdDogMTBweDtcIj57eyBwcm9wLmxhYmVsIH19PC9zcGFuPlxuXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPCEtLSBTS1MyME1BUjI1IFN1YnF1ZXN0aW9uIFR5cGUgLS0+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cInByb3AudHlwZSA9PT0gJ3N1YlF1ZXN0aW9uJ1wiPlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiByb3c7IGdhcDogMTBweDsgYWxpZ24taXRlbXM6IGNlbnRlcjtcIj5cbiAgICAgICAgICAgICAgPGRpdj57eyBwcm9wLmxhYmVsIH19PC9kaXY+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cInNlbGVjdGVkRWxlbWVudC50eXBlID09PSAnVGFibGUnID8gKHByb3AudGFyZ2V0QXJyYXkgPyBnZXRWYWx1ZUJ5QXJyYXlQYXRoKHByb3AudGFyZ2V0QXJyYXksIHByb3AudGFyZ2V0QXJyYXlLZXksIHNlbGVjdENvbHVtbiwgcHJvcC5rZXkgKSA6IGdldFZhbHVlQnlQYXRoKHByb3Aua2V5KSApOiAgZ2V0VmFsdWVCeVBhdGgocHJvcC5rZXkpIFwiXG4gICAgICAgICAgICAgICAgKGNoYW5nZSk9XCIgc2VsZWN0ZWRFbGVtZW50LnR5cGUgPT09ICdUYWJsZScgPyAocHJvcC50YXJnZXRBcnJheSA/IHVwZGF0ZVZhbHVlQnlBcnJheVBhdGgocHJvcC50YXJnZXRBcnJheSwgcHJvcC50YXJnZXRBcnJheUtleSwgc2VsZWN0Q29sdW1uLCBwcm9wLmtleSwgJGV2ZW50KSA6IG9uVG9nZ2xlQ2hhbmdlKHByb3Aua2V5LCAkZXZlbnQpICkgOiBvblRvZ2dsZUNoYW5nZShwcm9wLmtleSwgJGV2ZW50KVwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwhLS0gU0tTMjBNQVIyNSBSZW5kZXIgc3VicXVlc3Rpb25zIHdoZW4gY2hlY2tib3ggaXMgY2hlY2tlZCAtLT5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgKm5nSWY9XCJzZWxlY3RlZEVsZW1lbnQudHlwZSA9PT0gJ1RhYmxlJyA/IChwcm9wLnRhcmdldEFycmF5ID8gZ2V0VmFsdWVCeUFycmF5UGF0aChwcm9wLnRhcmdldEFycmF5LCBwcm9wLnRhcmdldEFycmF5S2V5LCBzZWxlY3RDb2x1bW4sIHByb3Aua2V5ICkgOiBnZXRWYWx1ZUJ5UGF0aChwcm9wLmtleSkgKTogIGdldFZhbHVlQnlQYXRoKHByb3Aua2V5KVwiPlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBzdWJQcm9wIG9mIHByb3Auc3ViUXVlc3Rpb25cIlxuICAgICAgICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjogI2U3ZjJmZjsgcGFkZGluZzogOHB4OyBib3JkZXItcmFkaXVzOiA0cHg7XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyBzdWJQcm9wLmxhYmVsIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzdWJQcm9wLnR5cGUgPT09ICdhcnJheSdcIj5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBJdGVyYXRlIG92ZXIgZmlsdGVyZWQgY29sdW1ucyB0byBkaXNwbGF5IGNoZWNrYm94ZXMgLS0+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBmaWx0ZXJlZENvbHVtbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwic3ViUHJvcC5vcGVyYW5kcyA/IHN1YlByb3Aub3BlcmFuZHMuaW5jbHVkZXMoY29sdW1uLmFwaU5hbWUpIDogZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uQ2hlY2tib3hDaGFuZ2Uoc3ViUHJvcC50YXJnZXRBcnJheSxzdWJQcm9wLnRhcmdldEFycmF5S2V5LHN1YlByb3Aua2V5LCBjb2x1bW4uYXBpTmFtZSwgJGV2ZW50LnRhcmdldC5jaGVja2VkKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgY29sdW1uLmFwaU5hbWUgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPCEtLSBTS1MyMU1BUjI1IE5ldyByYWRpbyB0eXBlIC0tPlxuICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInN1YlByb3AudHlwZSA9PT0gJ3JhZGlvJ1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgZmlsdGVyZWRDb2x1bW5zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiIFtuYW1lXT1cInN1YlByb3Aua2V5XCIgW3ZhbHVlXT1cImNvbHVtbi5hcGlOYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiZ2V0VmFsdWVCeUFycmF5UGF0aChzdWJQcm9wLnRhcmdldEFycmF5LCBzdWJQcm9wLnRhcmdldEFycmF5S2V5LCBzZWxlY3RDb2x1bW4sIHN1YlByb3Aua2V5KSA9PT0gY29sdW1uLmFwaU5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uUmFkaW9DaGFuZ2Uoc3ViUHJvcC50YXJnZXRBcnJheSwgc3ViUHJvcC50YXJnZXRBcnJheUtleSwgc3ViUHJvcC5rZXksIGNvbHVtbi5hcGlOYW1lKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgY29sdW1uLmFwaU5hbWUgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPCEtLSBTS1MyME1BUjI1IEFkZCBtb3JlIHN1YnByb3BlcnR5IHR5cGVzIGFzIG5lZWRlZCAtLT5cbiAgICAgICAgICAgICAgICAgIDwhLS0gSW5zaWRlIHRoZSBzdWJQcm9wIG5nRm9yIGxvb3AgLS0+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgKm5nSWY9XCJzdWJQcm9wLnR5cGUgPT09ICd0ZXh0J1wiIHR5cGU9XCJ0ZXh0XCIgW3BsYWNlaG9sZGVyXT1cInN1YlByb3AucGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwic2VsZWN0ZWRFbGVtZW50LnR5cGUgPT09ICdUYWJsZScgPyAoc3ViUHJvcC50YXJnZXRBcnJheSA/IGdldFZhbHVlQnlBcnJheVBhdGgoc3ViUHJvcC50YXJnZXRBcnJheSwgc3ViUHJvcC50YXJnZXRBcnJheUtleSwgc2VsZWN0Q29sdW1uLCBzdWJQcm9wLmtleSApIDogZ2V0VmFsdWVCeVBhdGgoc3ViUHJvcC5rZXkpICkgOiBnZXRWYWx1ZUJ5UGF0aChzdWJQcm9wLmtleSlcIlxuICAgICAgICAgICAgICAgICAgICAoaW5wdXQpPVwic2VsZWN0ZWRFbGVtZW50LnR5cGUgPT09ICdUYWJsZScgPyAoc3ViUHJvcC50YXJnZXRBcnJheSA/IHVwZGF0ZVZhbHVlQnlBcnJheVBhdGgoc3ViUHJvcC50YXJnZXRBcnJheSwgc3ViUHJvcC50YXJnZXRBcnJheUtleSwgc2VsZWN0Q29sdW1uLCBzdWJQcm9wLmtleSwgJGV2ZW50KSA6IHNldFZhbHVlQnlQYXRoKHN1YlByb3Aua2V5LCAkZXZlbnQudGFyZ2V0LnZhbHVlKSApIDogc2V0VmFsdWVCeVBhdGgoc3ViUHJvcC5rZXksICRldmVudC50YXJnZXQudmFsdWUpXCIgLz5cblxuICAgICAgICAgICAgICAgICAgPGlucHV0ICpuZ0lmPVwic3ViUHJvcC50eXBlID09PSAnYm9vbGVhbidcIiB0eXBlPVwiY2hlY2tib3hcIiBbY2hlY2tlZF09XCJnZXRWYWx1ZUJ5UGF0aChzdWJQcm9wLmtleSlcIlxuICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInNldFZhbHVlQnlQYXRoKHN1YlByb3Aua2V5LCAkZXZlbnQudGFyZ2V0LmNoZWNrZWQpXCIgLz5cbiAgICAgICAgICAgICAgICAgIDxzZWxlY3QgKm5nSWY9XCJzdWJQcm9wLnR5cGUgPT09ICdzZWxlY3QnXCIgW3ZhbHVlXT1cImdldFZhbHVlQnlQYXRoKHN1YlByb3Aua2V5KVwiXG4gICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwic2V0VmFsdWVCeVBhdGgoc3ViUHJvcC5rZXksICRldmVudC50YXJnZXQudmFsdWUpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBzdWJQcm9wLm9wdGlvbnNcIiBbdmFsdWVdPVwib3B0aW9uXCI+e3sgb3B0aW9uIH19PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCAqbmdJZj1cInN1YlByb3AudHlwZSA9PT0gJ2NoZWNrYm94J1wiIHR5cGU9XCJjaGVja2JveFwiIFtjaGVja2VkXT1cImdldFZhbHVlQnlQYXRoKHN1YlByb3Aua2V5KVwiXG4gICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwic2V0VmFsdWVCeVBhdGgoc3ViUHJvcC5rZXksICRldmVudC50YXJnZXQuY2hlY2tlZClcIiAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPCEtLSBTS1MyME1BUjI1IFRleHQgQWxpZ24gQnV0dG9ucyAtLT5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwicHJvcC50eXBlID09PSAnYWxpZ24nXCI+XG4gICAgICAgICAgICA8YnV0dG9uICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgcHJvcC5vcHRpb25zXCIgKGNsaWNrKT1cIm9uQWxpZ25TZWxlY3Qob3B0aW9uLnZhbHVlKVwiXG4gICAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwic2VsZWN0ZWRFbGVtZW50Py50ZXh0QWxpZ24gPT09IG9wdGlvbi52YWx1ZVwiIFt0aXRsZV09XCJvcHRpb24udmFsdWVcIj5cbiAgICAgICAgICAgICAgPGltZyBbc3JjXT1cIicuLi9hc3NldHMvaWNvbnMvJyArIG9wdGlvbi5pY29uICsgJy5zdmcnXCIgW2FsdF09XCJvcHRpb24udmFsdWVcIiBjbGFzcz1cImljb24tc2l6ZVwiIC8+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJwcm9wLnR5cGUgPT09ICdzdHlsZSdcIj5cbiAgICAgICAgICAgIDxidXR0b24gKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBwcm9wLm9wdGlvbnNcIiAoY2xpY2spPVwib25TdHlsZVNlbGVjdChvcHRpb24udmFsdWUpXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJpc1N0eWxlQWN0aXZlKG9wdGlvbi52YWx1ZSlcIiBbdGl0bGVdPVwib3B0aW9uLnZhbHVlXCI+XG4gICAgICAgICAgICAgIDxpbWcgW3NyY109XCInLi4vYXNzZXRzL2ljb25zLycgKyBvcHRpb24uaWNvbiArICcuc3ZnJ1wiIFthbHRdPVwib3B0aW9uLnZhbHVlXCIgY2xhc3M9XCJpY29uLXNpemVcIiAvPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIEZpZWxkIFNpemUgQ29udHJvbHMgLS0+XG4gICAgICAgICAgPCEtLSAgQ2hhbmdlIGtleSB3aWR0aCAtLT5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwicHJvcC5rZXkgPT09ICd3aWR0aCdcIiBbbmdDbGFzc109XCJ7J2ZsZXgtY29udGFpbmVyJzogdHJ1ZSwgJ2N1c3RvbS1hY3RpdmUnOiBzZWxlY3RlZEVsZW1lbnQ/LndpZHRoICE9PSAnKicgJiYgc2VsZWN0ZWRFbGVtZW50Py53aWR0aCAhPT0gJ2F1dG8nfVwiPlxuICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICBjbGFzcz1cInNpemUtc2VsZWN0XCJcbiAgICAgICAgICAgICAgW3ZhbHVlXT1cInNlbGVjdGVkRWxlbWVudD8ud2lkdGggPT09ICcqJyA/ICdEZWZhdWx0JyA6IHNlbGVjdGVkRWxlbWVudD8ud2lkdGggPT09ICdhdXRvJyA/ICdBdXRvJyA6ICdDdXN0b20nXCJcbiAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvbldpZHRoU2VsZWN0KFxuICAgICAgICAgICAgICAgICRldmVudC50YXJnZXQudmFsdWUgPT09ICdEZWZhdWx0JyA/ICcqJyA6XG4gICAgICAgICAgICAgICAgJGV2ZW50LnRhcmdldC52YWx1ZSA9PT0gJ0F1dG8nID8gJ2F1dG8nIDogJ2N1c3RvbSdcbiAgICAgICAgICAgICAgKVwiPlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiRGVmYXVsdFwiPkRlZmF1bHQ8L29wdGlvbj5cbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIkF1dG9cIj5BdXRvPC9vcHRpb24+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJDdXN0b21cIj5DdXN0b208L29wdGlvbj5cbiAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgIFxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICpuZ0lmPVwic2VsZWN0ZWRFbGVtZW50Py53aWR0aCAhPT0gJyonICYmIHNlbGVjdGVkRWxlbWVudD8ud2lkdGggIT09ICdhdXRvJ1wiXG4gICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICAgICAgICBjbGFzcz1cInNpemUtaW5wdXRcIlxuICAgICAgICAgICAgICBtaW49XCIxXCJcbiAgICAgICAgICAgICAgbWF4PVwiMTAwXCJcbiAgICAgICAgICAgICAgW3ZhbHVlXT1cInNlbGVjdGVkRWxlbWVudD8ud2lkdGhcIlxuICAgICAgICAgICAgICAoaW5wdXQpPVwic2V0VmFsdWVCeVBhdGgoXG4gICAgICAgICAgICAgICAgJ3dpZHRoJyxcbiAgICAgICAgICAgICAgICAkZXZlbnQudGFyZ2V0LnZhbHVlQXNOdW1iZXIgPCAxID8gMSA6XG4gICAgICAgICAgICAgICAgJGV2ZW50LnRhcmdldC52YWx1ZUFzTnVtYmVyID4gMTAwID8gMTAwIDpcbiAgICAgICAgICAgICAgICAkZXZlbnQudGFyZ2V0LnZhbHVlQXNOdW1iZXJcbiAgICAgICAgICAgICAgKVwiIC8+XG4gICAgICAgICAgPC9kaXY+ICAgICAgICAgICAgICAgICAgIFxuXG4gICAgICAgICAgPCEtLSAgTGluZSBQcm9wZXJ0aWVzIC0tPlxuICAgICAgICAgIDwhLS0gUGFkZGluZyBUb3AgLS0+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cInByb3Aua2V5ID09PSAncGFkZGluZ1RvcCdcIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgW3BsYWNlaG9sZGVyXT1cInByb3AucGxhY2Vob2xkZXJcIiBbdmFsdWVdPVwic2VsZWN0ZWRFbGVtZW50Py5wYWRkaW5nVG9wXCJcbiAgICAgICAgICAgICAgKGlucHV0KT1cInNldFZhbHVlQnlQYXRoKCdwYWRkaW5nVG9wJywgJGV2ZW50LnRhcmdldC52YWx1ZSlcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPCEtLSBQYWRkaW5nIEJvdHRvbSAtLT5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwicHJvcC5rZXkgPT09ICdwYWRkaW5nQm90dG9tJ1wiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBbcGxhY2Vob2xkZXJdPVwicHJvcC5wbGFjZWhvbGRlclwiIFt2YWx1ZV09XCJzZWxlY3RlZEVsZW1lbnQ/LnBhZGRpbmdCb3R0b21cIlxuICAgICAgICAgICAgICAoaW5wdXQpPVwic2V0VmFsdWVCeVBhdGgoJ3BhZGRpbmdCb3R0b20nLCAkZXZlbnQudGFyZ2V0LnZhbHVlKVwiIC8+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIExpbmUgU3R5bGUgLS0+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cInByb3Aua2V5ID09PSAnbGluZVN0eWxlJ1wiPlxuICAgICAgICAgICAgPHNlbGVjdCBbdmFsdWVdPVwic2VsZWN0ZWRFbGVtZW50Py5saW5lU3R5bGVcIiAoY2hhbmdlKT1cInNldFZhbHVlQnlQYXRoKCdsaW5lU3R5bGUnLCAkZXZlbnQudGFyZ2V0LnZhbHVlKVwiPlxuICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgcHJvcC5vcHRpb25zXCIgW3ZhbHVlXT1cIm9wdGlvblwiPnt7IG9wdGlvbiB9fTwvb3B0aW9uPlxuICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIENvbG9yIC0tPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJwcm9wLmtleSA9PT0gJ2NvbG9yJ1wiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjb2xvclwiIFt2YWx1ZV09XCJzZWxlY3RlZEVsZW1lbnQ/LmNvbG9yXCJcbiAgICAgICAgICAgICAgKGlucHV0KT1cInNldFZhbHVlQnlQYXRoKCdjb2xvcicsICRldmVudC50YXJnZXQudmFsdWUpXCIgLz5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cInRhYi1jb250ZW50XCIgKm5nSWY9XCJhY3RpdmVUYWIgPT09ICdwcm9wZXJ0eSdcIj5cbiAgICA8IS0tIEZpZWxkIEVsZW1lbnRzIFByb3BlcnRpZXMgLS0+XG4gICAgPCEtLSAgU2hvdyBlbGVtZW50cyBJRCAgLS0+XG4gICAgPGRpdiAqbmdJZj1cImdldFByb3BlcnRpZXMoKVwiPlxuICAgICAgPGxhYmVsPkxhYmVsIElkPC9sYWJlbD5cbiAgICAgIDxkaXZcbiAgICAgICAgc3R5bGU9XCJmb250LXNpemU6IDEzcHg7IHBhZGRpbmc6IDExcHg7IGJvcmRlci1yYWRpdXM6IDVweDsgYmFja2dyb3VuZC1jb2xvcjogI2Y4ZjhmODsgYm9yZGVyOiAxcHggc29saWQgI2RkZDtcIj5cbiAgICAgICAge3sgaGVhZGVyU2VsZWN0ID8gYm9va0lkIDogc2VsZWN0ZWRFbGVtZW50LmlkIH19PC9kaXY+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBwcm9wIG9mIGdldFByb3BlcnRpZXMoKS5maWVsZFByb3BzXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwidGV4dC1zbVwiPnt7IHByb3AubGFiZWwgfX08L2xhYmVsPlxuXG4gICAgICAgICAgPCEtLSBTS1MyMU1BUjI1IFRvZ2dsZSBHcm91cCAtLT5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwicHJvcC50eXBlID09PSAndG9nZ2xlR3JvdXAnXCIgY2xhc3M9XCJ0b2dnbGUtZ3JvdXBcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0b2dnbGUtaXRlbVwiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJ0b2dnbGUtbGFiZWxcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgLz5cbiAgICAgICAgICAgICAgICBEaXNhYmxlZFxuICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tICAtIGhhbmRsZWQgb3B0aW9ucyB3aXRoIFVVSUQgLS0+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgKm5nSWY9XCJwcm9wLnR5cGUgPT09ICdkcm9wZG93bicgfHwgcHJvcC50eXBlID09PSAnY2hlY2tib3gnIHx8IHByb3AudHlwZSA9PT0gJ3JhZGlvJyAmJiBwcm9wLmtleSA9PT0gJ29wdGlvbnMnXCJcbiAgICAgICAgICAgIGNsYXNzPVwib3B0aW9ucy1jb250YWluZXJcIj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm9wdGlvbi1saXN0XCIgKGRyYWdvdmVyKT1cIm9uRHJhZ092ZXIoJGV2ZW50KVwiIChkcm9wKT1cIm9uRHJvcCgkZXZlbnQsIHByb3Aua2V5KVwiPlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBvcHRpb24gb2Ygc2VsZWN0ZWRFbGVtZW50W3Byb3Aua2V5XVwiIGNsYXNzPVwib3B0aW9uLWl0ZW1zXCIgW2F0dHIuZGF0YS1pZF09XCJvcHRpb24uaWRcIlxuICAgICAgICAgICAgICAgIGRyYWdnYWJsZT1cInRydWVcIiAoZHJhZ3N0YXJ0KT1cIm9uRHJhZ1N0YXJ0KCRldmVudCwgb3B0aW9uLmlkKVwiPlxuXG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJvcHRpb24udmFsdWVcIiBwbGFjZWhvbGRlcj1cIk9wdGlvblwiIGNsYXNzPVwib3B0aW9uc1wiIC8+XG4gICAgICAgICAgICAgICAgPGltZyBzcmM9XCIuLi9hc3NldHMvaWNvbnMvVHJhc2guc3ZnXCIgKGNsaWNrKT1cInJlbW92ZU9wdGlvbihzZWxlY3RlZEVsZW1lbnRbcHJvcC5rZXldLCBvcHRpb24uaWQpXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkcmFnLWhhbmRsZVwiPuKYsDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiYWRkT3B0aW9uKHNlbGVjdGVkRWxlbWVudFtwcm9wLmtleV0pXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhZGQtdmFyaWVudFwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1sZ1wiPis8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4+QWRkPC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGlucHV0ICpuZ0lmPVwicHJvcC50eXBlID09PSAndGV4dCdcIiB0eXBlPVwidGV4dFwiIFtwbGFjZWhvbGRlcl09XCJwcm9wLnBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJoZWFkZXJTZWxlY3QgPyBwZGYudGl0bGUgOiAoc2VsZWN0ZWRFbGVtZW50Py50eXBlID09PSAnVGFibGUnID8gKHByb3AudGFyZ2V0QXJyYXkgPyBnZXRWYWx1ZUJ5QXJyYXlQYXRoKHByb3AudGFyZ2V0QXJyYXksIHByb3AudGFyZ2V0QXJyYXlLZXksIHNlbGVjdENvbHVtbiwgcHJvcC5rZXkgKSA6IGdldFZhbHVlQnlQYXRoKHByb3Aua2V5KSApIDogIGdldFZhbHVlQnlQYXRoKHByb3Aua2V5KSlcIlxuICAgICAgICAgICAgKGlucHV0KT1cImhlYWRlclNlbGVjdCA/IHVwZGF0ZVRpdGxlKCRldmVudC50YXJnZXQudmFsdWUpIDogKHNlbGVjdGVkRWxlbWVudD8udHlwZSA9PT0gJ1RhYmxlJyA/IChwcm9wLnRhcmdldEFycmF5ID8gdXBkYXRlVmFsdWVCeUFycmF5UGF0aChwcm9wLnRhcmdldEFycmF5LCBwcm9wLnRhcmdldEFycmF5S2V5LCBzZWxlY3RDb2x1bW4sIHByb3Aua2V5LCAkZXZlbnQpIDogc2V0VmFsdWVCeVBhdGgocHJvcC5rZXksICRldmVudC50YXJnZXQudmFsdWUpICkgOiBzZXRWYWx1ZUJ5UGF0aChwcm9wLmtleSwgJGV2ZW50LnRhcmdldC52YWx1ZSkpXCJcbiAgICAgICAgICAgIFtjbGFzcy5yZWFkLW9ubHldPVwic2VsZWN0ZWRFbGVtZW50LnJlYWRPbmx5XCIgW3JlYWRvbmx5XT1cInNlbGVjdGVkRWxlbWVudC5yZWFkT25seVwiIC8+XG5cbiAgICAgICAgICA8IS0tIFN1YiBRdWVzdGlvbnMgVG9nZ2xlIC0tPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJwcm9wLnR5cGUgPT09ICdzdWJRdWVzdGlvbidcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHlsZS10b2dnbGUtaGVhZGVyXCIgKGNsaWNrKT1cInRvZ2dsZVN1YlF1ZXN0aW9uKHByb3ApXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkLWVsZW1lbnRzXCI+U3ViIFRleHQ8L2Rpdj5cbiAgICAgICAgICAgICAgPGltZyBbc3JjXT1cInByb3AuaXNFeHBhbmRlZCA/ICcuLi9hc3NldHMvaWNvbnMvYXJyb3ctZG93bi5zdmcnIDogJy4uL2Fzc2V0cy9pY29ucy9hcnJvdy1yaWdodC5zdmcnXCJcbiAgICAgICAgICAgICAgICBhbHQ9XCJUb2dnbGUgQXJyb3dcIiBjbGFzcz1cImFycm93LWljb25cIj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIFJlbmRlciBzdWJxdWVzdGlvbnMgd2hlbiBhcnJvdyBpcyBkb3duIC0tPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInByb3AuaXNFeHBhbmRlZFwiIHN0eWxlPVwiYm9yZGVyOiAxcHggc29saWQgI2RkZDsgcGFkZGluZzogOHB4OyBib3JkZXItcmFkaXVzOiA0cHg7XCI+XG4gICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHN1YlByb3Agb2YgcHJvcC5zdWJRdWVzdGlvblwiIGNsYXNzPVwic3ViLXF1ZXN0aW9uLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgICA8bGFiZWw+e3sgc3ViUHJvcC5sYWJlbCB9fTwvbGFiZWw+XG5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCAqbmdJZj1cInN1YlByb3AudHlwZSA9PT0gJ3RleHQnXCIgdHlwZT1cInRleHRcIiBbcGxhY2Vob2xkZXJdPVwic3ViUHJvcC5wbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJnZXRWYWx1ZUJ5UGF0aChzdWJQcm9wLmtleSlcIiAoaW5wdXQpPVwic2V0VmFsdWVCeVBhdGgoc3ViUHJvcC5rZXksICRldmVudC50YXJnZXQudmFsdWUpXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICA8IS0tICBSZW5kZXIgaW5wdXQgZmllbGQgb25seSBpZiBzdWJQcm9wLnR5cGUgaXMgJ2FycmF5JyAtLT5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCAqbmdJZj1cInN1YlByb3AudHlwZSA9PT0gJ2FycmF5J1wiIHR5cGU9XCJ0ZXh0XCIgW3BsYWNlaG9sZGVyXT1cInN1YlByb3AucGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiZ2V0VmFsdWVCeVBhdGgoc3ViUHJvcC5rZXkpXCIgKGlucHV0KT1cInNldFZhbHVlQnlQYXRoKHN1YlByb3Aua2V5LCAkZXZlbnQudGFyZ2V0LnZhbHVlKVwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gPGlucHV0IHR5cGU9XCJ0ZXh0XCIgW25nTW9kZWxdPVwiZmllbGRBc1N0cmluZ1wiIChuZ01vZGVsQ2hhbmdlKT1cInVwZGF0ZUZpZWxkKCRldmVudClcIiAvPiAtLT5cblxuICAgICAgICAgICAgICAgICAgPGlucHV0ICpuZ0lmPVwic3ViUHJvcC50eXBlID09PSAnYm9vbGVhbidcIiB0eXBlPVwiY2hlY2tib3hcIiBbY2hlY2tlZF09XCJnZXRWYWx1ZUJ5UGF0aChzdWJQcm9wLmtleSlcIlxuICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInNldFZhbHVlQnlQYXRoKHN1YlByb3Aua2V5LCAkZXZlbnQudGFyZ2V0LmNoZWNrZWQpXCIgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJwcm9wLnR5cGUgPT09ICdjaGVja2JveCdcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidG9nZ2xlLWxhYmVsXCIgc3R5bGU9XCJwYWRkaW5nLXJpZ2h0OiAxMHB4O1wiPnt7IHByb3AubGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgW2NoZWNrZWRdPVwic2VsZWN0ZWRFbGVtZW50LnR5cGUgPT09ICdUYWJsZScgPyAocHJvcC50YXJnZXRBcnJheSA/IGdldFZhbHVlQnlBcnJheVBhdGgocHJvcC50YXJnZXRBcnJheSwgcHJvcC50YXJnZXRBcnJheUtleSwgc2VsZWN0Q29sdW1uLCBwcm9wLmtleSApIDogZ2V0VmFsdWVCeVBhdGgocHJvcC5rZXkpICk6ICBnZXRWYWx1ZUJ5UGF0aChwcm9wLmtleSkgXCJcbiAgICAgICAgICAgICAgKGNoYW5nZSk9XCIgc2VsZWN0ZWRFbGVtZW50LnR5cGUgPT09ICdUYWJsZScgPyAocHJvcC50YXJnZXRBcnJheSA/IHVwZGF0ZVZhbHVlQnlBcnJheVBhdGgocHJvcC50YXJnZXRBcnJheSwgcHJvcC50YXJnZXRBcnJheUtleSwgc2VsZWN0Q29sdW1uLCBwcm9wLmtleSwgJGV2ZW50KSA6IG9uVG9nZ2xlQ2hhbmdlKHByb3Aua2V5LCAkZXZlbnQpICkgOiBvblRvZ2dsZUNoYW5nZShwcm9wLmtleSwgJGV2ZW50KVwiIC8+XG5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8IS0tIFNLUzIxTUFSMjUgTW92ZSBTdHlsZSBPdXRzaWRlIHRoZSBMb29wIC0tPlxuICAgICAgPCEtLSBTdHlsZSBUb2dnbGUgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwic3R5bGUtdG9nZ2xlLWhlYWRlclwiIChjbGljayk9XCJ0b2dnbGVTdHlsZVNlY3Rpb24oKVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZC1lbGVtZW50c1wiPlN0eWxlPC9kaXY+XG4gICAgICAgIDxpbWcgW3NyY109XCJpc1N0eWxlRXhwYW5kZWQgPyAnLi4vYXNzZXRzL2ljb25zL2Fycm93LWRvd24uc3ZnJyA6ICcuLi9hc3NldHMvaWNvbnMvYXJyb3ctcmlnaHQuc3ZnJ1wiXG4gICAgICAgICAgYWx0PVwiVG9nZ2xlIEFycm93XCIgY2xhc3M9XCJhcnJvdy1pY29uXCI+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiAqbmdJZj1cImlzU3R5bGVFeHBhbmRlZFwiIHN0eWxlPVwiYm9yZGVyOiAxcHggc29saWQgI2RkZDsgcGFkZGluZzogOHB4OyBib3JkZXItcmFkaXVzOiA0cHg7XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQga2V5IG9mIGdldFN0eWxlS2V5cygpXCI+XG4gICAgICAgICAgICA8bGFiZWw+e3sga2V5IH19PC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwic2VsZWN0ZWRFbGVtZW50LnN0eWxlW2tleV1cIlxuICAgICAgICAgICAgICAoaW5wdXQpPVwic2V0VmFsdWVCeVBhdGgoJ3N0eWxlLicgKyBrZXksICRldmVudC50YXJnZXQudmFsdWUpXCIgcGxhY2Vob2xkZXI9XCJFbnRlciB7eyBrZXkgfX1cIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwidGFiLWNvbnRlbnRcIiAqbmdJZj1cImFjdGl2ZVRhYiA9PT0gJ2FwcGVhcmFuY2UnXCI+XG4gICAgPGRpdiAqbmdJZj1cImdldFByb3BlcnRpZXMoKVwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcHJvcCBvZiBnZXRQcm9wZXJ0aWVzKCkuYXBwZWFyYW5jZVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInRleHQtc21cIj57eyBwcm9wLmxhYmVsIH19PC9sYWJlbD5cbiAgICAgICAgICA8IS0tIEZvbnQgU2VsZWN0aW9uIC0tPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJwcm9wLmtleSA9PT0gJ2ZvbnQnXCI+XG4gICAgICAgICAgICA8c2VsZWN0ICpuZ0lmPVwicHJvcC50eXBlID09PSAnc2VsZWN0J1wiIGNsYXNzPVwic2VsZWN0LWNvbnRhaW5lclwiIFsobmdNb2RlbCldPVwic2VsZWN0ZWRFbGVtZW50LmZvbnRcIlxuICAgICAgICAgICAgICAoY2hhbmdlKT1cInNldFZhbHVlQnlQYXRoKCdmb250JywgJGV2ZW50LnRhcmdldC52YWx1ZSlcIj5cbiAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIHByb3Aub3B0aW9uc1wiIFt2YWx1ZV09XCJvcHRpb25cIj5cbiAgICAgICAgICAgICAgICB7eyBvcHRpb24gfX1cbiAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8IS0tIElucHV0IEJveCAtLT5cbiAgICAgICAgICA8aW5wdXQgKm5nSWY9XCJwcm9wLnR5cGUgPT09ICd0ZXh0J1wiIHR5cGU9XCJ0ZXh0XCIgW3BsYWNlaG9sZGVyXT1cInByb3AucGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgW3ZhbHVlXT1cInNlbGVjdGVkRWxlbWVudFtwcm9wLmtleV1cIiAoaW5wdXQpPVwic2V0VmFsdWVCeVBhdGgocHJvcC5rZXksICRldmVudC50YXJnZXQudmFsdWUpXCIgLz5cblxuICAgICAgICAgIDwhLS0gRm9udCBTaXplIC0tPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJwcm9wLmtleSA9PT0gJ2ZvbnRTaXplJyAmJiBwcm9wLnR5cGUgPT09ICdudW1iZXInXCI+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIG1pbj1cIjFcIiBtYXg9XCIxMDBcIiBzdGVwPVwiMVwiXG4gICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInNlbGVjdGVkRWxlbWVudC5mb250U2l6ZVwiXG4gICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInNldFZhbHVlQnlQYXRoKCdmb250U2l6ZScsIHNlbGVjdGVkRWxlbWVudC5mb250U2l6ZSlcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwhLS0gRm9udCBXZWlnaHQgU2VsZWN0aW9uIC0tPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJwcm9wLmtleSA9PT0gJ2ZvbnRXZWlnaHQnXCI+XG4gICAgICAgICAgICA8c2VsZWN0ICpuZ0lmPVwicHJvcC50eXBlID09PSAnc2VsZWN0J1wiIFsobmdNb2RlbCldPVwic2VsZWN0ZWRFbGVtZW50W3Byb3Aua2V5XVwiXG4gICAgICAgICAgICAgIChjaGFuZ2UpPVwic2V0VmFsdWVCeVBhdGgocHJvcC5rZXksICRldmVudC50YXJnZXQudmFsdWUpXCI+XG4gICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBwcm9wLm9wdGlvbnNcIiBbdmFsdWVdPVwib3B0aW9uLnZhbHVlXCI+XG4gICAgICAgICAgICAgICAge3sgb3B0aW9uLmxhYmVsIH19XG4gICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDwhLS0gRHJvcGRvd24gQm94IC0tPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInByb3AudHlwZSA9PT0gJ2Ryb3Bkb3duJ1wiIGNsYXNzPVwiaW5wdXQtYm94LWZpZWxkXCI+XG4gICAgICAgICAgICAgIDxzZWxlY3QgWyhuZ01vZGVsKV09XCJzZWxlY3RlZEVsZW1lbnRbcHJvcC5rZXldXCIgKGNoYW5nZSk9XCJzZXRWYWx1ZUJ5UGF0aChwcm9wLmtleSwgJGV2ZW50LnRhcmdldC52YWx1ZSlcIj5cbiAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgcHJvcC5vcHRpb25zXCIgW3ZhbHVlXT1cIm9wdGlvblwiPlxuICAgICAgICAgICAgICAgICAge3sgb3B0aW9uIH19XG4gICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gQ29sb3IgUGlja2VyIC0tPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInByb3AudHlwZSA9PT0gJ2NvbG9yJ1wiIGNsYXNzPVwiY29sb3Itc2VsZWN0b3JcIj5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjb2xvclwiIFsobmdNb2RlbCldPVwic2VsZWN0ZWRFbGVtZW50LmZvbnRDb2xvclwiXG4gICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJzZXRWYWx1ZUJ5UGF0aCgnZm9udENvbG9yJywgJGV2ZW50LnRhcmdldC52YWx1ZSlcIj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIEhFWCBJbnB1dCBCb3ggLS0+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicHJvcC50eXBlID09PSAnY29sb3InXCIgY2xhc3M9XCJoZXgtaW5wdXQtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgIDxzcGFuPkhFWCBDb2RlPC9zcGFuPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cInNlbGVjdGVkRWxlbWVudFtwcm9wLmtleV1cIlxuICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwic2V0VmFsdWVCeVBhdGgocHJvcC5rZXksICRldmVudC50YXJnZXQudmFsdWUpXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPCEtLSBGb250IFN0eWxlIC0tPlxuPGRpdiAqbmdJZj1cInByb3Aua2V5ID09PSAnZm9udFN0eWxlJ1wiPlxuICA8c2VsZWN0IFsobmdNb2RlbCldPVwic2VsZWN0ZWRFbGVtZW50LmZvbnRTdHlsZVwiXG4gICAgICAgICAgKGNoYW5nZSk9XCJzZXRWYWx1ZUJ5UGF0aCgnZm9udFN0eWxlJywgJGV2ZW50LnRhcmdldC52YWx1ZSlcIj5cbiAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgcHJvcC5vcHRpb25zXCIgW3ZhbHVlXT1cIm9wdGlvbi52YWx1ZVwiPlxuICAgICAge3sgb3B0aW9uLmxhYmVsIH19XG4gICAgPC9vcHRpb24+XG4gIDwvc2VsZWN0PlxuPC9kaXY+XG5cbjwhLS0gbWFyZ2luOiBbMCwgMTAsIDAsIDBdIC8vIFsgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tIF0gLS0+XG48ZGl2ICpuZ0lmPVwicHJvcC5rZXkgPT09ICdtYXJnaW4nJiYgc2VsZWN0ZWRFbGVtZW50Py5tYXJnaW5cIj5cbiAgPGRpdiBjbGFzcz1cIm1hcmdpbi1pbnB1dHNcIj5cbiAgICA8ZGl2PlxuICAgICAgPGxhYmVsPlJpZ2h0PC9sYWJlbD5cbiAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgWyhuZ01vZGVsKV09XCJzZWxlY3RlZEVsZW1lbnQubWFyZ2luWzFdXCJcbiAgICAgICAgICAgICAoY2hhbmdlKT1cInNldFZhbHVlQnlQYXRoKCdtYXJnaW4nLCBzZWxlY3RlZEVsZW1lbnQubWFyZ2luKVwiIC8+XG4gICAgPC9kaXY+XG4gICAgPGRpdj5cbiAgICAgIDxsYWJlbD5Cb3R0b208L2xhYmVsPlxuICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBbKG5nTW9kZWwpXT1cInNlbGVjdGVkRWxlbWVudC5tYXJnaW5bMl1cIlxuICAgICAgICAgICAgIChjaGFuZ2UpPVwic2V0VmFsdWVCeVBhdGgoJ21hcmdpbicsIHNlbGVjdGVkRWxlbWVudC5tYXJnaW4pXCIgLz5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2PlxuICAgICAgPGxhYmVsPkxlZnQ8L2xhYmVsPlxuICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBbKG5nTW9kZWwpXT1cInNlbGVjdGVkRWxlbWVudC5tYXJnaW5bM11cIlxuICAgICAgICAgICAgIChjaGFuZ2UpPVwic2V0VmFsdWVCeVBhdGgoJ21hcmdpbicsIHNlbGVjdGVkRWxlbWVudC5tYXJnaW4pXCIgLz5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2PlxuICAgICAgPGxhYmVsPlRvcDwvbGFiZWw+XG4gICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIFsobmdNb2RlbCldPVwic2VsZWN0ZWRFbGVtZW50Lm1hcmdpblswXVwiXG4gICAgICAgICAgICAgKGNoYW5nZSk9XCJzZXRWYWx1ZUJ5UGF0aCgnbWFyZ2luJywgc2VsZWN0ZWRFbGVtZW50Lm1hcmdpbilcIiAvPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuXG4gICAgICAgICAgPCEtLSBUZXh0QWxpZ24gLS0+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cInByb3Aua2V5ID09PSAnYWxpZ25JdGVtcydcIj5cbiAgICAgICAgICAgIDxzZWxlY3QgWyhuZ01vZGVsKV09XCJzZWxlY3RlZEVsZW1lbnQuYWxpZ25JdGVtc1wiXG4gICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwic2V0VmFsdWVCeVBhdGgoJ2FsaWduSXRlbXMnLCAkZXZlbnQudGFyZ2V0LnZhbHVlKVwiPlxuICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgcHJvcC5vcHRpb25zXCIgW3ZhbHVlXT1cIm9wdGlvbi52YWx1ZVwiPlxuICAgICAgICAgICAgICAgIHt7IG9wdGlvbi5sYWJlbCB9fVxuICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgIDwvZGl2PiAgICAgICAgICBcblxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuPCEtLSBEZWZhdWx0IFNhdmUgQnV0dG9uIC0tPlxuPGRpdiBjbGFzcz1cImJ1dHRvbi1jb250YWluZXJcIiAqbmdJZj1cIiF0ZW1wbGF0ZVNlbGVjdGVkXCI+XG4gIDxidXR0b24gY2xhc3M9XCJjYW5jZWwtYnRuXCIgKGNsaWNrKT1cIm9uQ2FuY2VsKClcIj5DYW5jZWw8L2J1dHRvbj5cbiAgPGJ1dHRvbiBjbGFzcz1cInNhdmUtYnRuXCIgKGNsaWNrKT1cImhhbmRsZUJ1dHRvbkNsaWNrKClcIj5TYXZlPC9idXR0b24+XG48L2Rpdj5cbjwvZGl2PlxuIl19
|
|
1118
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGRmLXByb3BlcnRpZXMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbnh0LWFwcC9zcmMvbGliL3BhZ2VzL3BkZkRlc2lnbmVyL3BkZi1wcm9wZXJ0aWVzL3BkZi1wcm9wZXJ0aWVzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL254dC1hcHAvc3JjL2xpYi9wYWdlcy9wZGZEZXNpZ25lci9wZGYtcHJvcGVydGllcy9wZGYtcHJvcGVydGllcy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsU0FBUyxFQUFjLFlBQVksRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBaUIsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRW5JLE9BQU8sRUFBRSxFQUFFLElBQUksTUFBTSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHFEQUFxRCxDQUFDO0FBQ25GLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHFFQUFxRSxDQUFDO0FBRzVHLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHFDQUFxQyxDQUFDOzs7Ozs7O0FBUzdFLE1BQU0sT0FBTyxzQkFBc0I7SUE4bUJiO0lBQTBCO0lBQStDO0lBNW1CbkYsaUJBQWlCLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztJQUM1QyxtQkFBbUIsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO0lBQ3hELGNBQWMsR0FBVyxFQUFFLENBQUM7SUFDNUIsb0JBQW9CLEdBQVcsQ0FBQyxDQUFDLENBQUM7SUFDekIsbUJBQW1CLEdBQVcsRUFBRSxDQUFDO0lBQzFD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LFdBQ1AsQ0FBQyxZQUFZLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxxQkFBcUIsRUFBRSxzQkFBc0IsQ0FBQzs4SUFNdkYsaUJBQWlCO3NCQUExQixNQUFNO2dCQUNHLG1CQUFtQjtzQkFBNUIsTUFBTTtnQkFHRSxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBMkNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFFb0MsUUFBUTtzQkFBakQsU0FBUzt1QkFBQyxVQUFVLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQXVpQ3hDLGNBQWM7c0JBRGIsWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSG9zdExpc3RlbmVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIFNpbXBsZUNoYW5nZXMsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ3JvcHBlclBvc2l0aW9uLCBEaW1lbnNpb25zLCBJbWFnZVRyYW5zZm9ybSB9IGZyb20gJy4uLy4uLy4uL2NvbXBvbmVudHMvaW1hZ2UtY3JvcHBlci9pbnRlcmZhY2VzJztcbmltcG9ydCB7IHY0IGFzIHV1aWR2NCB9IGZyb20gJ3V1aWQnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTnh0U2VhcmNoQm94IH0gZnJvbSAnLi4vLi4vLi4vY29tcG9uZW50cy9zZWFyY2gtYm94L3NlYXJjaC1ib3guY29tcG9uZW50JztcbmltcG9ydCB7IEltYWdlQ3JvcHBlckNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2NvbXBvbmVudHMvaW1hZ2UtY3JvcHBlci9jb21wb25lbnQvaW1hZ2UtY3JvcHBlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgUGRmRGVzaWduZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvcGRmLWRlc2lnbmVyL3BkZi1kZXNpZ25lci5zZXJ2aWNlJztcbmltcG9ydCB7IFRlbXBsYXRlU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3RlbXBsYXRlL3RlbXBsYXRlLnNlcnZpY2UnO1xuaW1wb3J0IHsgTnh0Q3VzdG9tVHJhbnNsYXRlUGlwZSB9IGZyb20gJy4uLy4uLy4uL3BpcGUvY3VzdG9tLXRyYW5zbGF0ZS5waXBlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLXBkZi1wcm9wZXJ0aWVzJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRm9ybXNNb2R1bGUsIE54dFNlYXJjaEJveCwgSW1hZ2VDcm9wcGVyQ29tcG9uZW50LCBOeHRDdXN0b21UcmFuc2xhdGVQaXBlXSxcbiAgdGVtcGxhdGVVcmw6ICcuL3BkZi1wcm9wZXJ0aWVzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL3BkZi1wcm9wZXJ0aWVzLmNvbXBvbmVudC5jc3MnXG59KVxuZXhwb3J0IGNsYXNzIFBkZlByb3BlcnRpZXNDb21wb25lbnQge1xuXG4gIEBPdXRwdXQoKSBmb3JtQnV0dG9uSGFuZGxlciA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgdGVtcGxhdGVTYXZlSGFuZGxlciA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBzZWxlY3RlZE9wdGlvbjogc3RyaW5nID0gJyc7XG4gIHNlbGVjdGVkRWxlbWVudEluZGV4OiBudW1iZXIgPSAtMTtcbiAgQElucHV0KCkgc2VsZWN0ZWRFbGVtZW50VHlwZTogc3RyaW5nID0gJyc7XG4gIHNlbGVjdGVkQWxpZ246IHN0cmluZyA9ICdhbGlnbi1sZWZ0JzsgIC8vIEFkZCB0aGlzIHByb3BlcnR5XG4gIHNlbGVjdGVkU3R5bGVzOiBzdHJpbmdbXSA9IFtdOyAgLy8gVXNpbmcgYXJyYXkgc2luY2UgbXVsdGlwbGUgc3R5bGVzIGNhbiBiZSBzZWxlY3RlZFxuICBzZWxlY3RlZEVsZW1lbnQ6IGFueSA9IG51bGw7ICAvLyBSZWNlaXZlIHRoZSBzZWxlY3RlZCBlbGVtZW50XG4gIGhlYWRlclNlbGVjdDogYm9vbGVhbiA9IGZhbHNlO1xuICBib29rSWQ6IGFueTtcbiAgcGRmOiBhbnk7XG4gIGFjdGl2ZVRhYjogc3RyaW5nID0gJ2F0dHJpYnV0ZXMnO1xuICBzZWxlY3RDb2x1bW46IGFueVxuICB0cmFuc2Zvcm06IEltYWdlVHJhbnNmb3JtID0ge1xuICAgIHRyYW5zbGF0ZVVuaXQ6ICdweCcsXG4gICAgc2NhbGU6IDEsXG4gICAgcm90YXRlOiAwLFxuICAgIGZsaXBIOiBmYWxzZSxcbiAgICBmbGlwVjogZmFsc2UsXG4gICAgdHJhbnNsYXRlSDogMCxcbiAgICB0cmFuc2xhdGVWOiAwXG4gIH07XG4gIGNhbnZhc1JvdGF0aW9uID0gMDtcbiAgY3JvcHBlcj86IENyb3BwZXJQb3NpdGlvbjtcbiAgbG9hZGluZyA9IGZhbHNlO1xuICBjcm9wcGVyTWF4SGVpZ2h0ID0gMDtcbiAgY3JvcHBlck1heFdpZHRoID0gMDtcbiAgY3JvcHBlck1pbkhlaWdodCA9IDA7XG4gIGNyb3BwZXJNaW5XaWR0aCA9IDA7XG4gIGNyb3BwZXJTdGF0aWNXaWR0aCA9IDA7XG4gIGNyb3BwZXJTdGF0aWNIZWlnaHQgPSAwO1xuICBhc3BlY3RSYXRpbyA9IDQgLyAzO1xuICByb3VuZENyb3BwZXIgPSBmYWxzZTtcbiAgaW1hZ2VDaGFuZ2VkRXZlbnQ6IEV2ZW50IHwgbnVsbCA9IG51bGw7XG4gIGFsaWduSW1hZ2UgPSAnY2VudGVyJyBhcyBjb25zdDtcbiAgLy8gIFwiZW5kcG9pbnRcIjogXCJodHRwczovL2Rldi1hcGkudmFsYXJoci5jb20vbnh0XCIsXG4gIC8vIFNLUzI4TUFSMjUgZGVmYXVsdCBwZGYgc2VhcmNoIGVuZHBvaW50XG4gIGJvb2tTdWJ0ZXh0ID0ge1xuICAgIFwiZW5kcG9pbnRcIjogXCJodHRwczovLzA1ZGJkMjMxLWNmNDMtNGQxMS1iZDI0LWQ4ZWE3MWE0NTgyOC5tb2NrLnBzdG1uLmlvXCIsXG4gICAgXCJ2YXJpYWJsZVwiOiBudWxsLFxuICAgIFwiZmllbGRcIjogWyd0aXRsZSddLFxuICAgIFwiZGVmYXVsdEZpZWxkXCI6IFwidGl0bGVcIlxuICB9XG4gIGlzTGlua0Ryb3Bkb3duT3BlbiA9IGZhbHNlO1xuICBmaWVsZEFzU3RyaW5nOiBzdHJpbmcgPSAnJztcbiAgZmlsdGVyZWRDb2x1bW5zOiBhbnlbXSA9IFtdO1xuXG4gIEBJbnB1dCgpIHRlbXBsYXRlU2VsZWN0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBAVmlld0NoaWxkKCdkcm9wZG93bicsIHsgc3RhdGljOiBmYWxzZSB9KSBkcm9wZG93biE6IEVsZW1lbnRSZWY7XG5cblxuICBkcmFnZ2VkSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwZGZFbGVtZW50czogYW55W10gPSBbXTtcbiBcbiAgdW5pcXVlX2lkOiBzdHJpbmcgPSAncGRmLTEyMzQnOyAvLyBzaG91bGQgYmUgY29uc2lzdGVudFxuICBzZWxlY3RlZFRlbXBsYXRlOiBhbnk7XG5cbiAgZWxlbWVudFByb3BlcnRpZXMgPSB7XG4gICAgLy8gQVAtMTBNQVIyNSAtIERlZmluZXMgdGhlIEhlYWRlciBlbGVtZW50IHdpdGggYSB0ZXh0IGlucHV0IGZpZWxkICAgXG4gICAgLy8gQVAtMjVNQVIyNSBBZGQgc3VidGV4dCBhbGwgdmFyaWFibGVzXG4gICAgJ0hlYWRlcic6IHtcbiAgICBlbGVtZW50UHJvcHM6IFtcbiAgICAgIHsgbGFiZWw6ICdMYWJlbCcsIGxhYmVsUGF0aDogJ0xBQkVMJywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0JywgdHlwZTogJ3RleHQnLCBrZXk6ICd0aXRsZScgfVxuICAgIF0sXG4gIH0sXG4gICd0ZXh0Jzoge1xuICAgIGVsZW1lbnRQcm9wczogW1xuICAgICAgeyBsYWJlbDogJ1BsYWNlIEhvbGRlcicsIGxhYmVsUGF0aDogJ1BMQUNFSE9MREVSJywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0JywgdHlwZTogJ3RleHQnLCBrZXk6ICdxdWVzdGlvbicgfSxcbiAgICAgIHsgbGFiZWw6ICdFbGVtZW50JywgbGFiZWxQYXRoOiAnRUxFTUVOVCcsIHR5cGU6ICdudW1iZXInLCBrZXk6ICdxdWVzdGlvbk51bWJlcicgfSxcbiAgICAgIHsgbGFiZWw6ICd3aWR0aCcsIGxhYmVsUGF0aDogJ1dJRFRIJywgdHlwZTogJ2ZpZWxkU2l6ZScsIGtleTogJ3dpZHRoJyB9LFxuICAgIF0sXG4gICAgZmllbGRQcm9wczogW1xuICAgICAgeyBsYWJlbDogJycsIGxhYmVsUGF0aDogJ1RPR0dMRU9QVElPTlMnLCB0eXBlOiAndG9nZ2xlR3JvdXAnLCBrZXk6ICd0b2dnbGVPcHRpb25zJyB9LFxuICAgICAgeyBsYWJlbDogJ0hlbHAgVGV4dCcsIGxhYmVsUGF0aDogJ0hFTFBURVhUJywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0JywgdHlwZTogJ3RleHQnIH0sXG4gICAgICB7IGxhYmVsOiAnVmFsdWUnLCBsYWJlbFBhdGg6ICdWQUxVRScsIHBsYWNlaG9sZGVyOiAnRW50ZXIgVGV4dCcsIHR5cGU6ICd0ZXh0Jywga2V5OiAndmFsdWUnIH0sXG4gICAgICB7IGxhYmVsOiAnUmVmZXJlbmNlIEZpZWxkJywgbGFiZWxQYXRoOiAnUkVGRVJFTkNFRklFTEQnLCBwbGFjZWhvbGRlcjogJ1JlZmVyZW5jZSBGaWVsZCcsIHR5cGU6ICd0ZXh0Jywga2V5OiAncmVmZXJlbmNlRmllbGQnIH0sXG4gICAgICB7XG4gICAgICAgIGxhYmVsOiAnJywgbGFiZWxQYXRoOiAnU1VCVEVYVCcsIHBsYWNlaG9sZGVyOiAnRW50ZXIgVGV4dCcsIHR5cGU6ICdzdWJRdWVzdGlvbicsIGtleTogJ2lzU3ViVGV4dCcsXG4gICAgICAgIHN1YlF1ZXN0aW9uOiBbXVxuICAgICAgfVxuICAgIF0sXG4gICAgYXBwZWFyYW5jZTogW1xuICAgICAge1xuICAgICAgICBsYWJlbDogJ1NlbGVjdCBGb250JywgbGFiZWxQYXRoOiAnU0VMRUNURk9OVCcsIHR5cGU6ICdzZWxlY3QnLCBrZXk6ICdmb250JywgcGxhY2Vob2xkZXI6ICdMZWZ0JyxcbiAgICAgICAgb3B0aW9uczogWydIZWx2ZXRpY2EgTmV1ZScsICdBcmlhbCcsICdUaW1lcyBOZXcgUm9tYW4nLCAnUm9ib3RvJ11cbiAgICAgIH0sXG4gICAgICB7IGxhYmVsOiAnRm9udCBDb2xvcicsIGxhYmVsUGF0aDogJ0ZPTlRDT0xPUicsIHR5cGU6ICdjb2xvcicsIGtleTogJ2ZvbnRDb2xvcicsIHZhbHVlOiAnJyB9LFxuICAgICAge1xuICAgICAgICBsYWJlbDogJ0ZvbnQgU2l6ZScsIGxhYmVsUGF0aDogJ0ZPTlRTSVpFJywgdHlwZTogJ251bWJlcicsIGtleTogJ2ZvbnRTaXplJywgdmFsdWU6IDE0XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBsYWJlbDogJ0ZvbnQgV2VpZ2h0JywgbGFiZWxQYXRoOiAnRk9OVFdFSUdIVCcsIHR5cGU6ICdzZWxlY3QnLCBrZXk6ICdmb250V2VpZ2h0JywgdmFsdWU6ICcnLFxuICAgICAgICBvcHRpb25zOiBbXG4gICAgICAgICAgeyB2YWx1ZTogJzQwMCcsIGxhYmVsOiAnNDAwLU5vcm1hbCcsIGxhYmVsUGF0aDogJ0ZPTlRXRUlHSFRfTk9STUFMJyB9LFxuICAgICAgICAgIHsgdmFsdWU6ICc1MDAnLCBsYWJlbDogJzUwMC1NZWRpdW0nLCBsYWJlbFBhdGg6ICdGT05UV0VJR0hUX01FRElVTScgfSxcbiAgICAgICAgICB7IHZhbHVlOiAnNjAwJywgbGFiZWw6ICc2MDAtU2VtaSBCb2xkJywgbGFiZWxQYXRoOiAnRk9OVFdFSUdIVF9TRU1JQk9MRCcgfSxcbiAgICAgICAgICB7IHZhbHVlOiAnNzAwJywgbGFiZWw6ICc3MDAtQm9sZCcsIGxhYmVsUGF0aDogJ0ZPTlRXRUlHSFRfQk9MRCcgfVxuICAgICAgICBdXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBsYWJlbDogJ0ZvbnQgU3R5bGUnLCBsYWJlbFBhdGg6ICdGT05UU1RZTEUnLCB0eXBlOiAnc2VsZWN0Jywga2V5OiAnZm9udFN0eWxlJywgdmFsdWU6ICcnLFxuICAgICAgICBvcHRpb25zOiBbXG4gICAgICAgICAgeyBsYWJlbDogJ05vcm1hbCcsIGxhYmVsUGF0aDogJ0ZPTlRTVFlMRV9OT1JNQUwnLCB2YWx1ZTogJ25vcm1hbCcgfSxcbiAgICAgICAgICB7IGxhYmVsOiAnQm9sZCcsIGxhYmVsUGF0aDogJ0ZPTlRTVFlMRV9CT0xEJywgdmFsdWU6ICdib2xkJyB9LFxuICAgICAgICAgIHsgbGFiZWw6ICdJdGFsaWMnLCBsYWJlbFBhdGg6ICdGT05UU1RZTEVfSVRBTElDJywgdmFsdWU6ICdpdGFsaWMnIH1cbiAgICAgICAgXVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbGFiZWw6ICdNYXJnaW4nLCBsYWJlbFBhdGg6ICdNQVJHSU4nLCB0eXBlOiAnbWFyZ2luUGlja2VyJywga2V5OiAnbWFyZ2luJyxcbiAgICAgICAgcGxhY2Vob2xkZXI6ICdMZWZ0LCBUb3AsIFJpZ2h0LCBCb3R0b20nLCB2YWx1ZTogWzAsIDAsIDAsIDBdXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBsYWJlbDogJ0FsaWduIEl0ZW0nLCBsYWJlbFBhdGg6ICdBTElHTklURU0nLCB0eXBlOiAnc2VsZWN0Jywga2V5OiAnYWxpZ25JdGVtcycsIHZhbHVlOiAnJyxcbiAgICAgICAgb3B0aW9uczogW1xuICAgICAgICAgIHsgbGFiZWw6ICdMZWZ0JywgbGFiZWxQYXRoOiAnQUxJR05JVEVNX0xFRlQnLCB2YWx1ZTogJ2xlZnQnIH0sXG4gICAgICAgICAgeyBsYWJlbDogJ0NlbnRlcicsIGxhYmVsUGF0aDogJ0FMSUdOSVRFTV9DRU5URVInLCB2YWx1ZTogJ2NlbnRlcicgfSxcbiAgICAgICAgICB7IGxhYmVsOiAnUmlnaHQnLCBsYWJlbFBhdGg6ICdBTElHTklURU1fUklHSFQnLCB2YWx1ZTogJ3JpZ2h0JyB9XG4gICAgICAgIF1cbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gICAgJ2lucHV0Jzoge1xuICAgICAgZWxlbWVudFByb3BzOiBbXG4gICAgICAgIHsgbGFiZWw6ICdQbGFjZSBIb2xkZXInLCBwbGFjZWhvbGRlcjogJ0VudGVyIFRleHQnLCB0eXBlOiAndGV4dCcsIGtleTogJ3F1ZXN0aW9uJyB9LFxuICAgICAgICB7IGxhYmVsOiAnRWxlbWVudCcsIHR5cGU6ICdudW1iZXInLCBrZXk6ICdxdWVzdGlvbk51bWJlcicgfSxcbiAgICAgICAgeyBsYWJlbDogJ3dpZHRoJywgdHlwZTogJ2ZpZWxkU2l6ZScsIGtleTogJ3dpZHRoJyB9LFxuICAgICAgXSxcbiAgICAgIGZpZWxkUHJvcHM6IFtcbiAgICAgICAgeyBsYWJlbDogJycsIHR5cGU6ICd0b2dnbGVHcm91cCcsIGtleTogJ3RvZ2dsZU9wdGlvbnMnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdIZWxwIFRleHQnLCBwbGFjZWhvbGRlcjogJ0VudGVyIFRleHQgJywgdHlwZTogJ3RleHQnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdWYWx1ZScsIHBsYWNlaG9sZGVyOiAnRW50ZXIgVGV4dCAnLCB0eXBlOiAndGV4dCcsIGtleTogJ3ZhbHVlJyB9LFxuICAgICAgICB7IGxhYmVsOiAnUmVmZXJlbmNlIEZpZWxkJywgcGxhY2Vob2xkZXI6ICdSZWZlcmVuY2UgRmllbGQnLCB0eXBlOiAndGV4dCcsIGtleTogJ3JlZmVyZW5jZUZpZWxkJyB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJsYWJlbFwiOiBcIlwiLCBcInBsYWNlaG9sZGVyXCI6IFwiRW50ZXIgVGV4dFwiLCBcInR5cGVcIjogXCJzdWJRdWVzdGlvblwiLCBcImtleVwiOiBcImlzU3ViVGV4dFwiLFxuICAgICAgICAgIFwic3ViUXVlc3Rpb25cIjogW1xuICAgICAgICAgIF1cbiAgICAgICAgfVxuICAgICAgXSxcbiAgICAgIGFwcGVhcmFuY2U6IFtcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnU2VsZWN0IEZvbnQnLCB0eXBlOiAnc2VsZWN0Jywga2V5OiAnZm9udCcsIHBsYWNlaG9sZGVyOiAnTGVmdCcsXG4gICAgICAgICAgb3B0aW9uczogWydIZWx2ZXRpY2EgTmV1ZScsICdBcmlhbCcsICdUaW1lcyBOZXcgUm9tYW4nLCAnUm9ib3RvJ11cbiAgICAgICAgfSxcbiAgICAgICAgeyBsYWJlbDogJ0ZvbnQgQ29sb3InLCB0eXBlOiAnY29sb3InLCBrZXk6ICdmb250Q29sb3InLCB2YWx1ZTogJycgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnRm9udCBTaXplJyxcbiAgICAgICAgICB0eXBlOiAnbnVtYmVyJywgICAgXG4gICAgICAgICAga2V5OiAnZm9udFNpemUnLFxuICAgICAgICAgIHZhbHVlOiAxNCAgICAgICAgICBcbiAgICAgICAgfSwgICAgICAgIFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICdGb250IFdlaWdodCcsIHR5cGU6ICdzZWxlY3QnLCBrZXk6ICdmb250V2VpZ2h0JywgdmFsdWU6ICcnLFxuICAgICAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgICAgIHsgdmFsdWU6ICc0MDAnLCBsYWJlbDogJzQwMC1Ob3JtYWwnIH0sXG4gICAgICAgICAgICB7IHZhbHVlOiAnNTAwJywgbGFiZWw6ICc1MDAtTWVkaXVtJyB9LFxuICAgICAgICAgICAgeyB2YWx1ZTogJzYwMCcsIGxhYmVsOiAnNjAwLVNlbWkgQm9sZCcgfSxcbiAgICAgICAgICAgIHsgdmFsdWU6ICc3MDAnLCBsYWJlbDogJzcwMC1Cb2xkJyB9XG4gICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICdGb250IFN0eWxlJywgdHlwZTogJ3NlbGVjdCcsIGtleTogJ2ZvbnRTdHlsZScsIHZhbHVlOiAnJyxcbiAgICAgICAgICBvcHRpb25zOiBbXG4gICAgICAgICAgICB7IGxhYmVsOiAnTm9ybWFsJywgdmFsdWU6ICdub3JtYWwnIH0sXG4gICAgICAgICAgICB7IGxhYmVsOiAnQm9sZCcsIHZhbHVlOiAnYm9sZCcgfSxcbiAgICAgICAgICAgIHsgbGFiZWw6ICdJdGFsaWMnLCB2YWx1ZTogJ2l0YWxpYycgfVxuICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnTWFyZ2luJywgdHlwZTogJ21hcmdpblBpY2tlcicsIGtleTogJ21hcmdpbicsXG4gICAgICAgICAgcGxhY2Vob2xkZXI6ICdMZWZ0LCBUb3AsIFJpZ2h0LCBCb3R0b20nLFxuICAgICAgICAgIHZhbHVlOiBbMCwgMCwgMCwgMF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnQWxpZ24gSXRlbScsIHR5cGU6ICdzZWxlY3QnLCBrZXk6ICdhbGlnbkl0ZW1zJywgdmFsdWU6ICcnLFxuICAgICAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgICAgIHsgbGFiZWw6ICdMZWZ0JywgdmFsdWU6ICdsZWZ0JyB9LFxuICAgICAgICAgICAgeyBsYWJlbDogJ0NlbnRlcicsIHZhbHVlOiAnY2VudGVyJyB9LFxuICAgICAgICAgICAgeyBsYWJlbDogJ1JpZ2h0JywgdmFsdWU6ICdyaWdodCcgfVxuICAgICAgICAgIF1cbiAgICAgICAgfVxuICAgICAgXVxuICAgICAgXG4gICAgfSxcbiAgICAnZGF0ZSc6IHtcbiAgICAgIGVsZW1lbnRQcm9wczogW1xuICAgICAgICB7IGxhYmVsOiAnUGxhY2UgSG9sZGVyJywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0JywgdHlwZTogJ3RleHQnLCBrZXk6ICdxdWVzdGlvbicgfSxcbiAgICAgICAgeyBsYWJlbDogJ0VsZW1lbnQnLCB0eXBlOiAnbnVtYmVyJywga2V5OiAncXVlc3Rpb25OdW1iZXInIH0sXG4gICAgICAgIHsgbGFiZWw6ICd3aWR0aCcsIHR5cGU6ICdmaWVsZFNpemUnLCBrZXk6ICd3aWR0aCcgfSxcbiAgICAgIF0sXG4gICAgICBmaWVsZFByb3BzOiBbXG4gICAgICAgIHsgbGFiZWw6ICcnLCB0eXBlOiAndG9nZ2xlR3JvdXAnLCBrZXk6ICd0b2dnbGVPcHRpb25zJyB9LFxuICAgICAgICB7IGxhYmVsOiAnSGVscCBUZXh0JywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0ICcsIHR5cGU6ICd0ZXh0JyB9LFxuICAgICAgICB7IGxhYmVsOiAnVmFsdWUnLCBwbGFjZWhvbGRlcjogJ0VudGVyIFRleHQgJywgdHlwZTogJ3RleHQnLCBrZXk6ICd2YWx1ZScgfSxcbiAgICAgICAgeyBsYWJlbDogJ1JlZmVyZW5jZSBGaWVsZCcsIHBsYWNlaG9sZGVyOiAnUmVmZXJlbmNlIEZpZWxkJywgdHlwZTogJ3RleHQnLCBrZXk6ICdyZWZlcmVuY2VGaWVsZCcgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibGFiZWxcIjogXCJcIiwgXCJwbGFjZWhvbGRlclwiOiBcIkVudGVyIFRleHRcIiwgXCJ0eXBlXCI6IFwic3ViUXVlc3Rpb25cIiwgXCJrZXlcIjogXCJpc1N1YlRleHRcIixcbiAgICAgICAgICBcInN1YlF1ZXN0aW9uXCI6IFtcbiAgICAgICAgICBdXG4gICAgICAgIH1cbiAgICAgIF0sXG4gICAgICBhcHBlYXJhbmNlOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ1NlbGVjdCBGb250JywgdHlwZTogJ3NlbGVjdCcsIGtleTogJ2ZvbnQnLCBwbGFjZWhvbGRlcjogJ0xlZnQnLFxuICAgICAgICAgIG9wdGlvbnM6IFsnSGVsdmV0aWNhIE5ldWUnLCAnQXJpYWwnLCAnVGltZXMgTmV3IFJvbWFuJywgJ1JvYm90byddXG4gICAgICAgIH0sXG4gICAgICAgIHsgbGFiZWw6ICdGb250IENvbG9yJywgdHlwZTogJ2NvbG9yJywga2V5OiAnZm9udENvbG9yJywgdmFsdWU6ICcnIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ0ZvbnQgU2l6ZScsXG4gICAgICAgICAgdHlwZTogJ251bWJlcicsICAgIFxuICAgICAgICAgIGtleTogJ2ZvbnRTaXplJyxcbiAgICAgICAgICB2YWx1ZTogMTQgICAgICAgICAgXG4gICAgICAgIH0sICAgICAgICBcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnRm9udCBXZWlnaHQnLCB0eXBlOiAnc2VsZWN0Jywga2V5OiAnZm9udFdlaWdodCcsIHZhbHVlOiAnJyxcbiAgICAgICAgICBvcHRpb25zOiBbXG4gICAgICAgICAgICB7IHZhbHVlOiAnNDAwJywgbGFiZWw6ICc0MDAtTm9ybWFsJyB9LFxuICAgICAgICAgICAgeyB2YWx1ZTogJzUwMCcsIGxhYmVsOiAnNTAwLU1lZGl1bScgfSxcbiAgICAgICAgICAgIHsgdmFsdWU6ICc2MDAnLCBsYWJlbDogJzYwMC1TZW1pIEJvbGQnIH0sXG4gICAgICAgICAgICB7IHZhbHVlOiAnNzAwJywgbGFiZWw6ICc3MDAtQm9sZCcgfVxuICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnRm9udCBTdHlsZScsIHR5cGU6ICdzZWxlY3QnLCBrZXk6ICdmb250U3R5bGUnLCB2YWx1ZTogJycsXG4gICAgICAgICAgb3B0aW9uczogW1xuICAgICAgICAgICAgeyBsYWJlbDogJ05vcm1hbCcsIHZhbHVlOiAnbm9ybWFsJyB9LFxuICAgICAgICAgICAgeyBsYWJlbDogJ0JvbGQnLCB2YWx1ZTogJ2JvbGQnIH0sXG4gICAgICAgICAgICB7IGxhYmVsOiAnSXRhbGljJywgdmFsdWU6ICdpdGFsaWMnIH1cbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ01hcmdpbicsIHR5cGU6ICdtYXJnaW5QaWNrZXInLCBrZXk6ICdtYXJnaW4nLFxuICAgICAgICAgIHBsYWNlaG9sZGVyOiAnTGVmdCwgVG9wLCBSaWdodCwgQm90dG9tJyxcbiAgICAgICAgICB2YWx1ZTogWzAsIDAsIDAsIDBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ0FsaWduIEl0ZW0nLCB0eXBlOiAnc2VsZWN0Jywga2V5OiAnYWxpZ25JdGVtcycsIHZhbHVlOiAnJyxcbiAgICAgICAgICBvcHRpb25zOiBbXG4gICAgICAgICAgICB7IGxhYmVsOiAnTGVmdCcsIHZhbHVlOiAnbGVmdCcgfSxcbiAgICAgICAgICAgIHsgbGFiZWw6ICdDZW50ZXInLCB2YWx1ZTogJ2NlbnRlcicgfSxcbiAgICAgICAgICAgIHsgbGFiZWw6ICdSaWdodCcsIHZhbHVlOiAncmlnaHQnIH1cbiAgICAgICAgICBdXG4gICAgICAgIH1cbiAgICAgIF1cbiAgICAgIFxuICAgIH0sXG4gICAgJ1BkZic6IHtcbiAgICBlbGVtZW50UHJvcHM6IFtcbiAgICAgIHsgbGFiZWw6ICdFbGVtZW50JywgbGFiZWxQYXRoOiAnRUxFTUVOVCcsIHR5cGU6ICdudW1iZXInLCBrZXk6ICdxdWVzdGlvbk51bWJlcicgfSxcbiAgICAgIHsgbGFiZWw6ICd3aWR0aCcsIGxhYmVsUGF0aDogJ1dJRFRIJywgdHlwZTogJ2ZpZWxkU2l6ZScsIGtleTogJ3dpZHRoJyB9XG4gICAgXSxcbiAgICBmaWVsZFByb3BzOiBbXG4gICAgICB7IGxhYmVsOiAnSGVscCBUZXh0JywgbGFiZWxQYXRoOiAnSEVMUFRFWFQnLCBwbGFjZWhvbGRlcjogJ0VudGVyIFRleHQnLCB0eXBlOiAndGV4dCcgfSxcbiAgICAgIHsgbGFiZWw6ICdWYWx1ZScsIGxhYmVsUGF0aDogJ1ZBTFVFJywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0JywgdHlwZTogJ3RleHQnLCBrZXk6ICd2YWx1ZScgfSxcbiAgICAgIHsgbGFiZWw6ICdSZWZlcmVuY2UgRmllbGQnLCBsYWJlbFBhdGg6ICdSRUZFUkVOQ0VGSUVMRCcsIHBsYWNlaG9sZGVyOiAnUmVmZXJlbmNlIEZpZWxkJywgdHlwZTogJ3RleHQnLCBrZXk6ICdyZWZlcmVuY2VGaWVsZCcgfSxcbiAgICAgIHtcbiAgICAgICAgbGFiZWw6ICcnLCBsYWJlbFBhdGg6ICdTVUJURVhUJywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0JywgdHlwZTogJ3N1YlF1ZXN0aW9uJywga2V5OiAnaXNTdWJUZXh0JyxcbiAgICAgICAgc3ViUXVlc3Rpb246IFtdXG4gICAgICB9XG4gICAgXSxcbiAgICBhcHBlYXJhbmNlOiBbXVxuICB9LFxuICAgIC8vIEFQLTE5TUFSMjUgQWRkIExpbmUgUHJvcGVydHlcbiAgICAnTGluZSc6IHtcbiAgICAgIGVsZW1lbnRQcm9wczogW1xuICAgICAgICB7IGxhYmVsOiAnTGluZSBXaWR0aCcsIHR5cGU6ICdmaWVsZFNpemUnLCBrZXk6ICd3aWR0aCcgfSxcbiAgICAgICAgeyBsYWJlbDogJ1BhZGRpbmcgVG9wJywgdHlwZTogJ251bWJlcicsIGtleTogJ3BhZGRpbmdUb3AnLCBwbGFjZWhvbGRlcjogJ0VudGVyIHBhZGRpbmcgdG9wJyB9LFxuICAgICAgICB7IGxhYmVsOiAnUGFkZGluZyBCb3R0b20nLCB0eXBlOiAnbnVtYmVyJywga2V5OiAncGFkZGluZ0JvdHRvbScsIHBsYWNlaG9sZGVyOiAnRW50ZXIgcGFkZGluZyBib3R0b20nIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ0xpbmUgU3R5bGUnLCB0eXBlOiAnc2VsZWN0Jywga2V5OiAnbGluZVN0eWxlJyxcbiAgICAgICAgICBvcHRpb25zOiBbJ1NvbGlkJywgJ0Rhc2hlZCcsICdEb3R0ZWQnXVxuICAgICAgICB9XG4gICAgICBdLFxuICAgICAgZmllbGRQcm9wczogW10sXG4gICAgICBhcHBlYXJhbmNlOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ1NlbGVjdCBGb250JywgdHlwZTogJ3NlbGVjdCcsIGtleTogJ2ZvbnQnLCBwbGFjZWhvbGRlcjogJ0xlZnQnLFxuICAgICAgICAgIG9wdGlvbnM6IFsnSGVsdmV0aWNhIE5ldWUnLCAnQXJpYWwnLCAnVGltZXMgTmV3IFJvbWFuJywgJ1JvYm90byddXG4gICAgICAgIH0sXG4gICAgICAgIHsgbGFiZWw6ICdGb250IENvbG9yJywgdHlwZTogJ2NvbG9yJywga2V5OiAnZm9udENvbG9yJywgdmFsdWU6ICcnIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ0ZvbnQgU2l6ZScsXG4gICAgICAgICAgdHlwZTogJ251bWJlcicsICAgIFxuICAgICAgICAgIGtleTogJ2ZvbnRTaXplJyxcbiAgICAgICAgICB2YWx1ZTogMTQgICAgICAgICAgXG4gICAgICAgIH0sICAgICAgICBcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnRm9udCBXZWlnaHQnLCB0eXBlOiAnc2VsZWN0Jywga2V5OiAnZm9udFdlaWdodCcsIHZhbHVlOiAnJyxcbiAgICAgICAgICBvcHRpb25zOiBbXG4gICAgICAgICAgICB7IHZhbHVlOiAnNDAwJywgbGFiZWw6ICc0MDAtTm9ybWFsJyB9LFxuICAgICAgICAgICAgeyB2YWx1ZTogJzUwMCcsIGxhYmVsOiAnNTAwLU1lZGl1bScgfSxcbiAgICAgICAgICAgIHsgdmFsdWU6ICc2MDAnLCBsYWJlbDogJzYwMC1TZW1pIEJvbGQnIH0sXG4gICAgICAgICAgICB7IHZhbHVlOiAnNzAwJywgbGFiZWw6ICc3MDAtQm9sZCcgfVxuICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnRm9udCBTdHlsZScsIHR5cGU6ICdzZWxlY3QnLCBrZXk6ICdmb250U3R5bGUnLCB2YWx1ZTogJycsXG4gICAgICAgICAgb3B0aW9uczogW1xuICAgICAgICAgICAgeyBsYWJlbDogJ05vcm1hbCcsIHZhbHVlOiAnbm9ybWFsJyB9LFxuICAgICAgICAgICAgeyBsYWJlbDogJ0JvbGQnLCB2YWx1ZTogJ2JvbGQnIH0sXG4gICAgICAgICAgICB7IGxhYmVsOiAnSXRhbGljJywgdmFsdWU6ICdpdGFsaWMnIH1cbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ01hcmdpbicsIHR5cGU6ICdtYXJnaW5QaWNrZXInLCBrZXk6ICdtYXJnaW4nLFxuICAgICAgICAgIHBsYWNlaG9sZGVyOiAnTGVmdCwgVG9wLCBSaWdodCwgQm90dG9tJyxcbiAgICAgICAgICB2YWx1ZTogWzAsIDAsIDAsIDBdXG4gICAgICAgIH0sXG4gICAgICAgIC8vIHtcbiAgICAgICAgLy8gICBsYWJlbDogJ0FsaWduIEl0ZW0nLCB0eXBlOiAnc2VsZWN0Jywga2V5OiAnYWxpZ25JdGVtcycsIHZhbHVlOiAnJyxcbiAgICAgICAgLy8gICBvcHRpb25zOiBbXG4gICAgICAgIC8vICAgICB7IGxhYmVsOiAnTGVmdCcsIHZhbHVlOiAnbGVmdCcgfSxcbiAgICAgICAgLy8gICAgIHsgbGFiZWw6ICdDZW50ZXInLCB2YWx1ZTogJ2NlbnRlcicgfSxcbiAgICAgICAgLy8gICAgIHsgbGFiZWw6ICdSaWdodCcsIHZhbHVlOiAncmlnaHQnIH1cbiAgICAgICAgLy8gICBdXG4gICAgICAgIC8vIH1cbiAgICAgIF1cbiAgICAgIFxuICAgIH0sXG5cbiAgICAnU3BhY2UnOiB7XG4gICAgICBlbGVtZW50UHJvcHM6IFtcbiAgICAgICAgeyBsYWJlbDogJ0VsZW1lbnQnLCB0eXBlOiAnbnVtYmVyJywga2V5OiAncXVlc3Rpb25OdW1iZXInIH0sXG4gICAgICAgIHsgbGFiZWw6ICdGaWVsZCBTaXplJywgdHlwZTogJ2ZpZWxkU2l6ZScsIGtleTogJ3dpZHRoJyB9LFxuICAgICAgXSxcbiAgICAgIGZpZWxkUHJvcHM6IFtdLFxuICAgICAgYXBwZWFyYW5jZTogW1xuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICdTZWxlY3QgRm9udCcsIHR5cGU6ICdzZWxlY3QnLCBrZXk6ICdmb250JywgcGxhY2Vob2xkZXI6ICdMZWZ0JyxcbiAgICAgICAgICBvcHRpb25zOiBbJ0hlbHZldGljYSBOZXVlJywgJ0FyaWFsJywgJ1RpbWVzIE5ldyBSb21hbicsICdSb2JvdG8nXVxuICAgICAgICB9LFxuICAgICAgICB7IGxhYmVsOiAnRm9udCBDb2xvcicsIHR5cGU6ICdjb2xvcicsIGtleTogJ2ZvbnRDb2xvcicsIHZhbHVlOiAnJyB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICdGb250IFNpemUnLFxuICAgICAgICAgIHR5cGU6ICdudW1iZXInLCAgICBcbiAgICAgICAgICBrZXk6ICdmb250U2l6ZScsXG4gICAgICAgICAgdmFsdWU6IDE0ICAgICAgICAgIFxuICAgICAgICB9LCAgICAgICAgXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ0ZvbnQgV2VpZ2h0JywgdHlwZTogJ3NlbGVjdCcsIGtleTogJ2ZvbnRXZWlnaHQnLCB2YWx1ZTogJycsXG4gICAgICAgICAgb3B0aW9uczogW1xuICAgICAgICAgICAgeyB2YWx1ZTogJzQwMCcsIGxhYmVsOiAnNDAwLU5vcm1hbCcgfSxcbiAgICAgICAgICAgIHsgdmFsdWU6ICc1MDAnLCBsYWJlbDogJzUwMC1NZWRpdW0nIH0sXG4gICAgICAgICAgICB7IHZhbHVlOiAnNjAwJywgbGFiZWw6ICc2MDAtU2VtaSBCb2xkJyB9LFxuICAgICAgICAgICAgeyB2YWx1ZTogJzcwMCcsIGxhYmVsOiAnNzAwLUJvbGQnIH1cbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ0ZvbnQgU3R5bGUnLCB0eXBlOiAnc2VsZWN0Jywga2V5OiAnZm9udFN0eWxlJywgdmFsdWU6ICcnLFxuICAgICAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgICAgIHsgbGFiZWw6ICdOb3JtYWwnLCB2YWx1ZTogJ25vcm1hbCcgfSxcbiAgICAgICAgICAgIHsgbGFiZWw6ICdCb2xkJywgdmFsdWU6ICdib2xkJyB9LFxuICAgICAgICAgICAgeyBsYWJlbDogJ0l0YWxpYycsIHZhbHVlOiAnaXRhbGljJyB9XG4gICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICdNYXJnaW4nLCB0eXBlOiAnbWFyZ2luUGlja2VyJywga2V5OiAnbWFyZ2luJyxcbiAgICAgICAgICBwbGFjZWhvbGRlcjogJ0xlZnQsIFRvcCwgUmlnaHQsIEJvdHRvbScsXG4gICAgICAgICAgdmFsdWU6IFswLCAwLCAwLCAwXVxuICAgICAgICB9LFxuICAgICAgICAvLyB7XG4gICAgICAgIC8vICAgbGFiZWw6ICdBbGlnbiBJdGVtJywgdHlwZTogJ3NlbGVjdCcsIGtleTogJ2FsaWduSXRlbXMnLCB2YWx1ZTogJycsXG4gICAgICAgIC8vICAgb3B0aW9uczogW1xuICAgICAgICAvLyAgICAgeyBsYWJlbDogJ0xlZnQnLCB2YWx1ZTogJ2xlZnQnIH0sXG4gICAgICAgIC8vICAgICB7IGxhYmVsOiAnQ2VudGVyJywgdmFsdWU6ICdjZW50ZXInIH0sXG4gICAgICAgIC8vICAgICB7IGxhYmVsOiAnUmlnaHQnLCB2YWx1ZTogJ3JpZ2h0JyB9XG4gICAgICAgIC8vICAgXVxuICAgICAgICAvLyB9XG4gICAgICBdXG4gICAgICBcbiAgICB9LFxuXG4gICAgXCJUYWJsZVwiOiB7XG4gICAgICBcImVsZW1lbnRQcm9wc1wiOiBbXG4gICAgICAgIHsgXCJsYWJlbFwiOiBcInJvd0Nob2ljZVwiLCBcInBsYWNlaG9sZGVyXCI6IFwiXCIsIFwidHlwZVwiOiBcInRleHRcIiwgXCJrZXlcIjogXCJyb3dDaG9pY2VcIiB9LFxuICAgICAgICB7IGxhYmVsOiAncXVlc3Rpb25OdW1iZXInLCB0eXBlOiAnbnVtYmVyJywga2V5OiAncXVlc3Rpb25OdW1iZXInIH0sXG4gICAgICAgIHsgbGFiZWw6ICdUYWJsZSBTaXplJywgdHlwZTogJ2ZpZWxkU2l6ZScsIGtleTogJ3dpZHRoJyB9LFxuICAgICAgXSxcbiAgICAgIFwiZmllbGRQcm9wc1wiOiBbXG4gICAgICAgIHsgXCJsYWJlbFwiOiBcInRhYmxlSWRcIiwgXCJwbGFjZWhvbGRlclwiOiBcIkVtcF9UYWJsZV8wMVwiLCBcInR5cGVcIjogXCJ0ZXh0XCIsIFwia2V5XCI6IFwidGFibGVJZFwiIH0sXG4gICAgICAgIHsgXCJsYWJlbFwiOiBcInZhbHVlXCIsIFwicGxhY2Vob2xkZXJcIjogXCJWYWx1ZVwiLCBcInR5cGVcIjogXCJ0ZXh0XCIsIFwia2V5XCI6IFwidmFsdWVcIiB9LFxuICAgICAgICB7IGxhYmVsOiAnUmVmZXJlbmNlJywgcGxhY2Vob2xkZXI6ICdSZWZlcmVuY2UgRmllbGQnLCB0eXBlOiAndGV4dCcsIGtleTogJ3JlZmVyZW5jZUZpZWxkJyB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJsYWJlbFwiOiBcIlwiLCBcInBsYWNlaG9sZGVyXCI6IFwiRW50ZXIgVGV4dFwiLCBcInR5cGVcIjogXCJzdWJRdWVzdGlvblwiLCBcImtleVwiOiBcImlzU3ViVGV4dFwiLFxuICAgICAgICAgIFwic3ViUXVlc3Rpb25cIjogW1xuICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBhcHBlYXJhbmNlOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ1NlbGVjdCBGb250JywgdHlwZTogJ3NlbGVjdCcsIGtleTogJ2ZvbnQnLCBwbGFjZWhvbGRlcjogJ0xlZnQnLFxuICAgICAgICAgIG9wdGlvbnM6IFsnSGVsdmV0aWNhIE5ldWUnLCAnQXJpYWwnLCAnVGltZXMgTmV3IFJvbWFuJywgJ1JvYm90byddXG4gICAgICAgIH0sXG4gICAgICAgIHsgbGFiZWw6ICdGb250IENvbG9yJywgdHlwZTogJ2NvbG9yJywga2V5OiAnZm9udENvbG9yJywgdmFsdWU6ICcnIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ0ZvbnQgU2l6ZScsXG4gICAgICAgICAgdHlwZTogJ251bWJlcicsICAgIFxuICAgICAgICAgIGtleTogJ2ZvbnRTaXplJyxcbiAgICAgICAgICB2YWx1ZTogMTQgICAgICAgICAgXG4gICAgICAgIH0sICAgICAgICBcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnRm9udCBXZWlnaHQnLCB0eXBlOiAnc2VsZWN0Jywga2V5OiAnZm9udFdlaWdodCcsIHZhbHVlOiAnJyxcbiAgICAgICAgICBvcHRpb25zOiBbXG4gICAgICAgICAgICB7IHZhbHVlOiAnNDAwJywgbGFiZWw6ICc0MDAtTm9ybWFsJyB9LFxuICAgICAgICAgICAgeyB2YWx1ZTogJzUwMCcsIGxhYmVsOiAnNTAwLU1lZGl1bScgfSxcbiAgICAgICAgICAgIHsgdmFsdWU6ICc2MDAnLCBsYWJlbDogJzYwMC1TZW1pIEJvbGQnIH0sXG4gICAgICAgICAgICB7IHZhbHVlOiAnNzAwJywgbGFiZWw6ICc3MDAtQm9sZCcgfVxuICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnRm9udCBTdHlsZScsIHR5cGU6ICdzZWxlY3QnLCBrZXk6ICdmb250U3R5bGUnLCB2YWx1ZTogJycsXG4gICAgICAgICAgb3B0aW9uczogW1xuICAgICAgICAgICAgeyBsYWJlbDogJ05vcm1hbCcsIHZhbHVlOiAnbm9ybWFsJyB9LFxuICAgICAgICAgICAgeyBsYWJlbDogJ0JvbGQnLCB2YWx1ZTogJ2JvbGQnIH0sXG4gICAgICAgICAgICB7IGxhYmVsOiAnSXRhbGljJywgdmFsdWU6ICdpdGFsaWMnIH1cbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ01hcmdpbicsIHR5cGU6ICdtYXJnaW5QaWNrZXInLCBrZXk6ICdtYXJnaW4nLFxuICAgICAgICAgIHBsYWNlaG9sZGVyOiAnTGVmdCwgVG9wLCBSaWdodCwgQm90dG9tJyxcbiAgICAgICAgICB2YWx1ZTogWzAsIDAsIDAsIDBdXG4gICAgICAgIH0sXG4gICAgICAgIC8vIHtcbiAgICAgICAgLy8gICBsYWJlbDogJ0FsaWduIEl0ZW0nLCB0eXBlOiAnc2VsZWN0Jywga2V5OiAnYWxpZ25JdGVtcycsIHZhbHVlOiAnJyxcbiAgICAgICAgLy8gICBvcHRpb25zOiBbXG4gICAgICAgIC8vICAgICB7IGxhYmVsOiAnTGVmdCcsIHZhbHVlOiAnbGVmdCcgfSxcbiAgICAgICAgLy8gICAgIHsgbGFiZWw6ICdDZW50ZXInLCB2YWx1ZTogJ2NlbnRlcicgfSxcbiAgICAgICAgLy8gICAgIHsgbGFiZWw6ICdSaWdodCcsIHZhbHVlOiAncmlnaHQnIH1cbiAgICAgICAgLy8gICBdXG4gICAgICAgIC8vIH1cbiAgICAgIF1cbiAgICAgIFxuICAgIH0sXG5cbiAgICBcIlRhYmxlQ29sdW1uXCI6IHtcbiAgICAgIFwiZWxlbWVudFByb3BzXCI6IFtcblxuICAgICAgICB7IFwibGFiZWxcIjogXCJoZWFkZXJMYWJlbHNcIiwgXCJwbGFjZWhvbGRlclwiOiBcIkVtcGxveWVlIERldGFpbHNcIiwgXCJ0eXBlXCI6IFwidGV4dFwiLCBcInRhcmdldEFycmF5XCI6IFwiZmllbGRzTWV0YVwiLCBcInRhcmdldEFycmF5S2V5XCI6IFwidW5pcXVlSWRlbnRpZmllclwiLCBcImtleVwiOiBcImxhYmVsXCIgfSxcbiAgICAgICAgeyBcImxhYmVsXCI6IFwiYXBpTmFtZVwiLCBcInBsYWNlaG9sZGVyXCI6IFwiRW1wbG95ZWUgRGV0YWlsc1wiLCBcInR5cGVcIjogXCJ0ZXh0XCIsIFwidGFyZ2V0QXJyYXlcIjogXCJmaWVsZHNNZXRhXCIsIFwidGFyZ2V0QXJyYXlLZXlcIjogXCJ1bmlxdWVJZGVudGlmaWVyXCIsIFwia2V5XCI6IFwiYXBpTmFtZVwiIH0sXG5cbiAgICAgICAge1xuICAgICAgICAgIFwibGFiZWxcIjogXCJTdW1tYXJ5IENvbHVtblwiLCBcInBsYWNlaG9sZGVyXCI6IFwiU3VtbWFyeSBDb2x1bW5cIiwgXCJ0eXBlXCI6IFwic3ViUXVlc3Rpb25cIiwgXCJ0YXJnZXRBcnJheVwiOiBcImZpZWxkc01ldGFcIiwgXCJ0YXJnZXRBcnJheUtleVwiOiBcInVuaXF1ZUlkZW50aWZpZXJcIiwgXCJrZXlcIjogXCJzdW1tYXJ5Q29sdW1uXCIsXG4gICAgICAgICAgXCJzdWJRdWVzdGlvblwiOiBbXG4gICAgICAgICAgICB7IFwibGFiZWxcIjogXCJUeXBlXCIsIFwicGxhY2Vob2xkZXJcIjogXCJFbXBsb3llZSBEZXRhaWxzXCIsIFwidHlwZVwiOiBcInRleHRcIiwgXCJ0YXJnZXRBcnJheVwiOiBcImZpZWxkc01ldGFcIiwgXCJ0YXJnZXRBcnJheUtleVwiOiBcInVuaXF1ZUlkZW50aWZpZXJcIiwgXCJrZXlcIjogXCJmbGRUeXBlXCIgfSxcbiAgICAgICAgICAgIHsgXCJsYWJlbFwiOiBcIk9wZXJhdGlvblwiLCBcInBsYWNlaG9sZGVyXCI6IFwiRW1wbG95ZWUgRGV0YWlsc1wiLCBcInR5cGVcIjogXCJ0ZXh0XCIsIFwidGFyZ2V0QXJyYXlcIjogXCJmaWVsZHNNZXRhXCIsIFwidGFyZ2V0QXJyYXlLZXlcIjogXCJ1bmlxdWVJZGVudGlmaWVyXCIsIFwia2V5XCI6IFwib3BlcmF0aW9uXCIgfSxcbiAgICAgICAgICAgIHsgXCJsYWJlbFwiOiBcIk9wZXJhbmRzXCIsIFwicGxhY2Vob2xkZXJcIjogXCJFbXBsb3llZSBEZXRhaWxzXCIsIFwidHlwZVwiOiBcImFycmF5XCIsIFwidGFyZ2V0QXJyYXlcIjogXCJmaWVsZHNNZXRhXCIsIFwidGFyZ2V0QXJyYXlLZXlcIjogXCJ1bmlxdWVJZGVudGlmaWVyXCIsIFwia2V5XCI6IFwib3BlcmFuZHNcIiB9LFxuICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibGFiZWxcIjogXCJTdW1tYXJ5IFJvd1wiLCBcInBsYWNlaG9sZGVyXCI6IFwiU3VtbWFyeSBSb3dcIiwgXCJ0eXBlXCI6IFwic3ViUXVlc3Rpb25cIiwgXCJ0YXJnZXRBcnJheVwiOiBcImZpZWxkc01ldGFcIiwgXCJ0YXJnZXRBcnJheUtleVwiOiBcInVuaXF1ZUlkZW50aWZpZXJcIiwgXCJrZXlcIjogXCJzdW1tYXJ5Um93XCIsIFwic3ViUXVlc3Rpb25cIjogW1xuICAgICAgICAgICAgeyBcImxhYmVsXCI6IFwiVHlwZVwiLCBcInBsYWNlaG9sZGVyXCI6IFwiRW1wbG95ZWUgRGV0YWlsc1wiLCBcInR5cGVcIjogXCJ0ZXh0XCIsIFwidGFyZ2V0QXJyYXlcIjogXCJmaWVsZHNNZXRhXCIsIFwidGFyZ2V0QXJyYXlLZXlcIjogXCJ1bmlxdWVJZGVudGlmaWVyXCIsIFwia2V5XCI6IFwiZmxkVHlwZVwiIH0sXG4gICAgICAgICAgICB7IFwibGFiZWxcIjogXCJvcGVyYXRpb25cIiwgXCJwbGFjZWhvbGRlclwiOiBcIm9wZXJhdGlvblwiLCBcInR5cGVcIjogXCJ0ZXh0XCIsIFwidGFyZ2V0QXJyYXlcIjogXCJmaWVsZHNNZXRhXCIsIFwidGFyZ2V0QXJyYXlLZXlcIjogXCJ1bmlxdWVJZGVudGlmaWVyXCIsIFwia2V5XCI6IFwib3BlcmF0aW9uXCIgfSxcbiAgICAgICAgICAgIHsgXCJsYWJlbFwiOiBcImNvbHVtblwiLCBcInBsYWNlaG9sZGVyXCI6IFwiRW1wbG95ZWUgRGV0YWlsc1wiLCBcInR5cGVcIjogXCJyYWRpb1wiLCBcInRhcmdldEFycmF5XCI6IFwiZmllbGRzTWV0YVwiLCBcInRhcmdldEFycmF5S2V5XCI6IFwidW5pcXVlSWRlbnRpZmllclwiLCBcImtleVwiOiBcImNvbHVtblwiIH0sXG4gICAgICAgICAgICB7IFwibGFiZWxcIjogXCJvcGVyYW5kc1wiLCBcInBsYWNlaG9sZGVyXCI6IFwiRW1wbG95ZWUgRGV0YWlsc1wiLCBcInR5cGVcIjogXCJhcnJheVwiLCBcInRhcmdldEFycmF5XCI6IFwiZmllbGRzTWV0YVwiLCBcInRhcmdldEFycmF5S2V5XCI6IFwidW5pcXVlSWRlbnRpZmllclwiLCBcImtleVwiOiBcIm9wZXJhbmRzXCIgfSxcbiAgICAgICAgICBdXG4gICAgICAgIH0sXG5cbiAgICAgICAgeyBcImxhYmVsXCI6IFwiaW5wdXRUZXh0QWxpZ25tZW50XCIsIFwicGxhY2Vob2xkZXJcIjogXCJMZWZ0XCIsIFwidHlwZVwiOiBcInRleHRcIiwgXCJrZXlcIjogXCJpbnB1dFRleHRBbGlnbm1lbnRcIiB9LFxuICAgICAgICB7IFwibGFiZWxcIjogXCJ0YWJsZVNjYWxlU2l6ZVwiLCBcInBsYWNlaG9sZGVyXCI6IFwiMDYgLSBGdWxsIFNjYWxlXCIsIFwidHlwZVwiOiBcInRleHRcIiwgXCJrZXlcIjogXCJ0YWJsZVNjYWxlU2l6ZVwiIH0sXG4gICAgICAgIHsgXCJsYWJlbFwiOiBcInJvd0Nob2ljZVwiLCBcInBsYWNlaG9sZGVyXCI6IFwiXCIsIFwidHlwZVwiOiBcInRleHRcIiwgXCJrZXlcIjogXCJyb3dDaG9pY2VcIiB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJsYWJlbFwiOiBcInF1aWNrQWN0aW9uVG9vbHNcIixcbiAgICAgICAgICBcInR5cGVcIjogXCJncm91cFwiLFxuICAgICAgICAgIFwia2V5XCI6IFwicXVpY2tBY3Rpb25Ub29sc1wiLFxuICAgICAgICAgIFwiY2hpbGRyZW5cIjogW1xuICAgICAgICAgICAgeyBcImxhYmVsXCI6IFwiZWRpdFwiLCBcInR5cGVcIjogXCJ0b2dnbGVcIiwgXCJrZXlcIjogXCJlZGl0XCIgfSxcbiAgICAgICAgICAgIHsgXCJsYWJlbFwiOiBcInZpZXdcIiwgXCJ0eXBlXCI6IFwidG9nZ2xlXCIsIFwia2V5XCI6IFwidmlld1wiIH0sXG4gICAgICAgICAgICB7IFwibGFiZWxcIjogXCJkZWxldGVcIiwgXCJ0eXBlXCI6IFwidG9nZ2xlXCIsIFwia2V5XCI6IFwiZGVsZXRlXCIgfVxuICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAgeyBcImxhYmVsXCI6IFwiYWRkUmVjb3JkRXZlbnRcIiwgXCJ0eXBlXCI6IFwidG9nZ2xlXCIsIFwia2V5XCI6IFwiYWRkUmVjb3JkRXZlbnRcIiB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJsYWJlbFwiOiBcInRhYmxlU2Nyb2xsRXZlbnRDaG9pY2VcIixcbiAgICAgICAgICBcInR5cGVcIjogXCJncm91cFwiLFxuICAgICAgICAgIFwia2V5XCI6IFwidGFibGVTY3JvbGxFdmVudENob2ljZVwiLFxuICAgICAgICAgIFwiY2hpbGRyZW5cIjogW1xuICAgICAgICAgICAgeyBcImxhYmVsXCI6IFwiaG9yaXpvbnRhbFwiLCBcInR5cGVcIjogXCJ0b2dnbGVcIiwgXCJrZXlcIjogXCJob3Jpem9udGFsXCIgfSxcbiAgICAgICAgICAgIHsgXCJsYWJlbFwiOiBcInZlcnRpY2FsXCIsIFwidHlwZVwiOiBcInRvZ2dsZVwiLCBcImtleVwiOiBcInZlcnRpY2FsXCIgfVxuICAgICAgICAgIF1cbiAgICAgICAgfVxuICAgICAgXSxcbiAgICAgIFwiZmllbGRQcm9wc1wiOiBbXG4gICAgICAgIHsgXCJsYWJlbFwiOiBcInRhYmxlSWRcIiwgXCJwbGFjZWhvbGRlclwiOiBcIkVtcF9UYWJsZV8wMVwiLCBcInR5cGVcIjogXCJ0ZXh0XCIsIFwia2V5XCI6IFwidGFibGVJZFwiIH0sXG4gICAgICAgIHsgXCJsYWJlbFwiOiBcImlucHV0VGV4dEFsaWdubWVudFwiLCBcInBsYWNlaG9sZGVyXCI6IFwiTGVmdFwiLCBcInR5cGVcIjogXCJ0ZXh0XCIsIFwia2V5XCI6IFwiaW5wdXRUZXh0QWxpZ25tZW50XCIgfSxcbiAgICAgICAgeyBcImxhYmVsXCI6IFwicmVxdWlyZWRGaWVsZFwiLCBcInR5cGVcIjogXCJ0b2dnbGVcIiwgXCJrZXlcIjogXCJyZXF1aXJlZEZpZWxkXCIgfSxcbiAgICAgICAgeyBcImxhYmVsXCI6IFwiUmVhZCBPbmx5XCIsIFwidHlwZVwiOiBcImNoZWNrYm94XCIsIFwidGFyZ2V0QXJyYXlcIjogXCJmaWVsZHNNZXRhXCIsIFwidGFyZ2V0QXJyYXlLZXlcIjogXCJ1bmlxdWVJZGVudGlmaWVyXCIsIFwia2V5XCI6IFwiZWRpdFwiIH0sXG4gICAgICAgIHsgXCJsYWJlbFwiOiBcImhpZGVMYWJlbFwiLCBcInR5cGVcIjogXCJ0b2dnbGVcIiwgXCJrZXlcIjogXCJoaWRlTGFiZWxcIiB9LFxuICAgICAgICB7IFwibGFiZWxcIjogXCJkaXNhYmxlZFwiLCBcInR5cGVcIjogXCJ0b2dnbGVcIiwgXCJrZXlcIjogXCJkaXNhYmxlZFwiIH0sXG4gICAgICAgIHsgXCJsYWJlbFwiOiBcImhpZGVFbGVtZW50c1wiLCBcInR5cGVcIjogXCJ0b2dnbGVcIiwgXCJrZXlcIjogXCJoaWRlRWxlbWVudHNcIiB9LFxuICAgICAgICB7IFwibGFiZWxcIjogXCJtYXNraW5nXCIsIFwidHlwZVwiOiBcInRvZ2dsZVwiLCBcImtleVwiOiBcIm1hc2tpbmdcIiB9LFxuICAgICAgICB7IFwibGFiZWxcIjogXCJ2YWx1ZVwiLCBcInBsYWNlaG9sZGVyXCI6IFwiVmFsdWVcIiwgXCJ0eXBlXCI6IFwidGV4dFwiLCBcImtleVwiOiBcInZhbHVlXCIgfSxcbiAgICAgICAgeyBcImxhYmVsXCI6IFwicmVmZXJlbmNlQW5jaG9yXCIsIFwicGxhY2Vob2xkZXJcIjogXCJodHRwOi8vc291cmNlL3Jhbmdlcm54dF9iaW9fZGF0YS83NC9kLmRvY1wiLCBcInR5cGVcIjogXCJ0ZXh0XCIsIFwia2V5XCI6IFwicmVmZXJlbmNlQW5jaG9yXCIgfSxcbiAgICAgICAgeyBcImxhYmVsXCI6IFwiY29udHJvbGxpbmdFbGVtZW50c1wiLCBcInR5cGVcIjogXCJ0b2dnbGVcIiwgXCJrZXlcIjogXCJjb250cm9sbGluZ0VsZW1lbnRzXCIgfSxcbiAgICAgICAgeyBcImxhYmVsXCI6IFwiaXNEZXBlbmRlbmNlXCIsIFwidHlwZVwiOiBcInRvZ2dsZVwiLCBcImtleVwiOiBcImlzRGVwZW5kZW5jZVwiIH0sXG4gICAgICAgIHsgXCJsYWJlbFwiOiBcIm5ld0xpbmVcIiwgXCJ0eXBlXCI6IFwidG9nZ2xlXCIsIFwia2V5XCI6IFwibmV3TGluZVwiIH1cbiAgICAgIF0sXG4gICAgICBcImFwcGVhcmFuY2VcIjogW1xuICAgICAgICB7IFwibGFiZWxcIjogXCJzZWxlY3RGb250XCIsIFwicGxhY2Vob2xkZXJcIjogXCJMZWZ0XCIsIFwidHlwZVwiOiBcInRleHRcIiwgXCJrZXlcIjogXCJzZWxlY3RGb250XCIgfSxcbiAgICAgICAgeyBcImxhYmVsXCI6IFwiZm9udENvbG9yXCIsIFwicGxhY2Vob2xkZXJcIjogXCIjMjgzNDNFXCIsIFwidHlwZVwiOiBcInRleHRcIiwgXCJrZXlcIjogXCJmb250Q29sb3JcIiB9LFxuICAgICAgICB7IFwibGFiZWxcIjogXCJoZXhDb2RlXCIsIFwicGxhY2Vob2xkZXJcIjogXCIjMjgzNDNFXCIsIFwidHlwZVwiOiBcInRleHRcIiwgXCJrZXlcIjogXCJoZXhDb2RlXCIgfSxcbiAgICAgICAgeyBcImxhYmVsXCI6IFwiZm9udFNpemVcIiwgXCJwbGFjZWhvbGRlclwiOiBcIjMwMCAtIE1lZGl1bVwiLCBcInR5cGVcIjogXCJ0ZXh0XCIsIFwia2V5XCI6IFwiZm9udFNpemVcIiB9LFxuICAgICAgICB7IFwibGFiZWxcIjogXCJmb250V2lkdGhcIiwgXCJwbGFjZWhvbGRlclwiOiBcIkxlZnRcIiwgXCJ0eXBlXCI6IFwidGV4dFwiLCBcImtleVwiOiBcImZvbnRXaWR0aFwiIH0sXG4gICAgICAgIHsgXCJsYWJlbFwiOiBcImJhY2tncm91bmRDb2xvclwiLCBcInBsYWNlaG9sZGVyXCI6IFwiI0UyRTJFMlwiLCBcInR5cGVcIjogXCJ0ZXh0XCIsIFwia2V5XCI6IFwiYmFja2dyb3VuZENvbG9yXCIgfSxcbiAgICAgICAgeyBcImxhYmVsXCI6IFwiYmFja2dyb3VuZEhleENvZGVcIiwgXCJwbGFjZWhvbGRlclwiOiBcIiNFMkUyRTJcIiwgXCJ0eXBlXCI6IFwidGV4dFwiLCBcImtleVwiOiBcImJhY2tncm91bmRIZXhDb2RlXCIgfSxcbiAgICAgICAgeyBcImxhYmVsXCI6IFwicmVmZXJlbmNlQW5jaG9yXCIsIFwicGxhY2Vob2xkZXJcIjogXCJodHRwOi8vc291cmNlL3Jhbmdlcm54dF9iaW9fZGF0YS83NC9kLmRvY1wiLCBcInR5cGVcIjogXCJ0ZXh0XCIsIFwia2V5XCI6IFwicmVmZXJlbmNlQW5jaG9yXCIgfSxcbiAgICAgICAgeyBcImxhYmVsXCI6IFwiYmxhbmtTcGFjZVwiLCBcInR5cGVcIjogXCJ0b2dnbGVcIiwgXCJrZXlcIjogXCJibGFua1NwYWNlXCIgfVxuICAgICAgXVxuICAgIH0sXG5cbiAgICAnVGV4dEFyZWEnOiB7XG4gICAgICBlbGVtZW50UHJvcHM6IFtcbiAgICAgICAgeyBsYWJlbDogJ0VsZW1lbnQnLCB0eXBlOiAnbnVtYmVyJywga2V5OiAncXVlc3Rpb25OdW1iZXInIH0sXG4gICAgICAgIHsgbGFiZWw6ICd3aWR0aCcsIHR5cGU6ICdmaWVsZFNpemUnLCBrZXk6ICd3aWR0aCcgfSxcbiAgICAgIF0sXG4gICAgICBmaWVsZFByb3BzOiBbXG4gICAgICAgIHsgbGFiZWw6ICcnLCB0eXBlOiAndG9nZ2xlR3JvdXAnLCBrZXk6ICd0b2dnbGVPcHRpb25zJyB9LFxuICAgICAgICB7IGxhYmVsOiAnSGVscCBUZXh0JywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0ICcsIHR5cGU6ICd0ZXh0JyB9LFxuICAgICAgICB7IGxhYmVsOiAnVmFsdWUnLCBwbGFjZWhvbGRlcjogJ0VudGVyIFRleHQgJywgdHlwZTogJ3RleHQnLCBrZXk6ICd2YWx1ZScgfSxcbiAgICAgICAgeyBsYWJlbDogJ1JlZmVyZW5jZSBGaWVsZCcsIHBsYWNlaG9sZGVyOiAnUmVmZXJlbmNlIEZpZWxkJywgdHlwZTogJ3RleHQnLCBrZXk6ICdyZWZlcmVuY2VGaWVsZCcgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibGFiZWxcIjogXCJcIiwgXCJwbGFjZWhvbGRlclwiOiBcIkVudGVyIFRleHRcIiwgXCJ0eXBlXCI6IFwic3ViUXVlc3Rpb25cIiwgXCJrZXlcIjogXCJpc1N1YlRleHRcIixcbiAgICAgICAgICBcInN1YlF1ZXN0aW9uXCI6IFtcbiAgICAgICAgICBdXG4gICAgICAgIH1cbiAgICAgIF0sXG4gICAgICBhcHBlYXJhbmNlOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ1NlbGVjdCBGb250JywgdHlwZTogJ3NlbGVjdCcsIGtleTogJ2ZvbnQnLCBwbGFjZWhvbGRlcjogJ0xlZnQnLFxuICAgICAgICAgIG9wdGlvbnM6IFsnSGVsdmV0aWNhIE5ldWUnLCAnQXJpYWwnLCAnVGltZXMgTmV3IFJvbWFuJywgJ1JvYm90byddXG4gICAgICAgIH0sXG5cbiAgICAgICAgeyBsYWJlbDogJ0ZvbnQgQ29sb3InLCB0eXBlOiAnY29sb3InLCBrZXk6ICdmb250Q29sb3InLCB2YWx1ZTogJycgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnRm9udCBTaXplJywgdHlwZTogJ3NlbGVjdCcsIGtleTogJ2ZvbnRTaXplJywgdmFsdWU6ICcnLFxuICAgICAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgICAgIHsgbGFiZWw6ICdTbWFsbCcsIHZhbHVlOiAnMTJweCcgfSxcbiAgICAgICAgICAgIHsgbGFiZWw6ICdNZWRpdW0nLCB2YWx1ZTogJzE0cHgnIH0sXG4gICAgICAgICAgICB7IGxhYmVsOiAnTGFyZ2UnLCB2YWx1ZTogJzE2cHgnIH1cbiAgICAgICAgICBdXG4gICAgICAgIH0sXG5cbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnRm9udCBXaWR0aCcsIHR5cGU6ICdzZWxlY3QnLCBrZXk6ICdmb250V2VpZ2h0JywgdmFsdWU6ICcnLFxuICAgICAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgICAgIHsgdmFsdWU6ICc0MDAnLCBsYWJlbDogJzQwMC1Ob3JtYWwnIH0sXG4gICAgICAgICAgICB7IHZhbHVlOiAnNTAwJywgbGFiZWw6ICc1MDAtTWVkaXVtJyB9LFxuICAgICAgICAgICAgeyB2YWx1ZTogJzYwMCcsIGxhYmVsOiAnNjAwLVNlbWkgQm9sZCcgfSxcbiAgICAgICAgICAgIHsgdmFsdWU6ICc3MDAnLCBsYWJlbDogJzcwMC1Cb2xkJyB9XG4gICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICAvLyB7IGxhYmVsOiAnQmFja2dyb3VuZCBDb2xvcicsIHR5cGU6ICdjb2xvcicsIGtleTogJ2JhY2tncm91bmRDb2xvcicsIHZhbHVlOiAnJyB9LFxuICAgICAgICBcbiAgICAgIF1cbiAgICB9LFxuXG4gICAgJ2ltYWdlJzoge1xuICAgICAgZWxlbWVudFByb3BzOiBbXG4gICAgICAgIHsgbGFiZWw6ICdFbGVtZW50JywgdHlwZTogJ251bWJlcicsIGtleTogJ3F1ZXN0aW9uTnVtYmVyJyB9LFxuICAgICAgICB7IGxhYmVsOiAnd2lkdGgnLCB0eXBlOiAnZmllbGRTaXplJywga2V5OiAnd2lkdGgnIH0sXG4gICAgICBdLFxuICAgICAgZmllbGRQcm9wczogW1xuICAgICAgICB7IGxhYmVsOiAnJywgdHlwZTogJ3RvZ2dsZUdyb3VwJywga2V5OiAndG9nZ2xlT3B0aW9ucycgfSxcbiAgICAgICAgeyBsYWJlbDogJ0hlbHAgVGV4dCcsIHBsYWNlaG9sZGVyOiAnRW50ZXIgVGV4dCAnLCB0eXBlOiAndGV4dCcgfSxcbiAgICAgICAgeyBsYWJlbDogJ1ZhbHVlJywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0ICcsIHR5cGU6ICd0ZXh0Jywga2V5OiAndmFsdWUnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdSZWZlcmVuY2UgRmllbGQnLCBwbGFjZWhvbGRlcjogJ1JlZmVyZW5jZSBGaWVsZCcsIHR5cGU6ICd0ZXh0Jywga2V5OiAncmVmZXJlbmNlRmllbGQnIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcImxhYmVsXCI6IFwiXCIsIFwicGxhY2Vob2xkZXJcIjogXCJFbnRlciBUZXh0XCIsIFwidHlwZVwiOiBcInN1YlF1ZXN0aW9uXCIsIFwia2V5XCI6IFwiaXNTdWJUZXh0XCIsXG4gICAgICAgICAgXCJzdWJRdWVzdGlvblwiOiBbXG4gICAgICAgICAgXVxuICAgICAgICB9XG4gICAgICBdLFxuICAgICAgYXBwZWFyYW5jZTogW1xuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICdTZWxlY3QgRm9udCcsIHR5cGU6ICdzZWxlY3QnLCBrZXk6ICdmb250JywgcGxhY2Vob2xkZXI6ICdMZWZ0JyxcbiAgICAgICAgICBvcHRpb25zOiBbJ0hlbHZldGljYSBOZXVlJywgJ0FyaWFsJywgJ1RpbWVzIE5ldyBSb21hbicsICdSb2JvdG8nXVxuICAgICAgICB9LFxuICAgICAgICB7IGxhYmVsOiAnRm9udCBDb2xvcicsIHR5cGU6ICdjb2xvcicsIGtleTogJ2ZvbnRDb2xvcicsIHZhbHVlOiAnJyB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICdGb250IFNpemUnLFxuICAgICAgICAgIHR5cGU6ICdudW1iZXInLCAgICBcbiAgICAgICAgICBrZXk6ICdmb250U2l6ZScsXG4gICAgICAgICAgdmFsdWU6IDE0ICAgICAgICAgIFxuICAgICAgICB9LCAgICAgICAgXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ0ZvbnQgV2VpZ2h0JywgdHlwZTogJ3NlbGVjdCcsIGtleTogJ2ZvbnRXZWlnaHQnLCB2YWx1ZTogJycsXG4gICAgICAgICAgb3B0aW9uczogW1xuICAgICAgICAgICAgeyB2YWx1ZTogJzQwMCcsIGxhYmVsOiAnNDAwLU5vcm1hbCcgfSxcbiAgICAgICAgICAgIHsgdmFsdWU6ICc1MDAnLCBsYWJlbDogJzUwMC1NZWRpdW0nIH0sXG4gICAgICAgICAgICB7IHZhbHVlOiAnNjAwJywgbGFiZWw6ICc2MDAtU2VtaSBCb2xkJyB9LFxuICAgICAgICAgICAgeyB2YWx1ZTogJzcwMCcsIGxhYmVsOiAnNzAwLUJvbGQnIH1cbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ0ZvbnQgU3R5bGUnLCB0eXBlOiAnc2VsZWN0Jywga2V5OiAnZm9udFN0eWxlJywgdmFsdWU6ICcnLFxuICAgICAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgICAgIHsgbGFiZWw6ICdOb3JtYWwnLCB2YWx1ZTogJ25vcm1hbCcgfSxcbiAgICAgICAgICAgIHsgbGFiZWw6ICdCb2xkJywgdmFsdWU6ICdib2xkJyB9LFxuICAgICAgICAgICAgeyBsYWJlbDogJ0l0YWxpYycsIHZhbHVlOiAnaXRhbGljJyB9XG4gICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICdNYXJnaW4nLCB0eXBlOiAnbWFyZ2luUGlja2VyJywga2V5OiAnbWFyZ2luJyxcbiAgICAgICAgICBwbGFjZWhvbGRlcjogJ0xlZnQsIFRvcCwgUmlnaHQsIEJvdHRvbScsXG4gICAgICAgICAgdmFsdWU6IFswLCAwLCAwLCAwXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICdBbGlnbiBJdGVtJywgdHlwZTogJ3NlbGVjdCcsIGtleTogJ2FsaWduSXRlbXMnLCB2YWx1ZTogJycsXG4gICAgICAgICAgb3B0aW9uczogW1xuICAgICAgICAgICAgeyBsYWJlbDogJ0xlZnQnLCB2YWx1ZTogJ2xlZnQnIH0sXG4gICAgICAgICAgICB7IGxhYmVsOiAnQ2VudGVyJywgdmFsdWU6ICdjZW50ZXInIH0sXG4gICAgICAgICAgICB7IGxhYmVsOiAnUmlnaHQnLCB2YWx1ZTogJ3JpZ2h0JyB9XG4gICAgICAgICAgXVxuICAgICAgICB9XG4gICAgICBdXG4gICAgICBcbiAgICB9LFxuXG4gIH07XG4gIGVycm9yTWVzc2FnZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgaHR0cDogSHR0cENsaWVudCwgcHJpdmF0ZSBwZGZEZXNpZ25lclNlcnZpY2U6IFBkZkRlc2lnbmVyU2VydmljZSxwcml2YXRlIHRlbXBsYXRlU2VydmljZTogVGVtcGxhdGVTZXJ2aWNlKSB7IH1cblxuICBoYW5kbGVUZW1wbGF0ZVNlbGVjdGlvbihldmVudDogYW55KSB7XG4gICAgdGhpcy5wZGZFbGVtZW50cyA9IGV2ZW50LmVsZW1lbnRzOyBcbiAgICB0aGlzLnNlbGVjdGVkVGVtcGxhdGUgPSBldmVudC5zZWxlY3RlZFRlbXBsYXRlO1xuICB9XG5cbiAgXG5cbiAgbmdPbkluaXQoKSB7XG4gICAgLy9BUC0xME1BUjI1IFN1YnNjcmliZXMgdG8gaGVhZGVyIHNlbGVjdGlvbiBjaGFuZ2VzIGFuZCB1cGRhdGVzIHRoZSBzZWxlY3RlZCBlbGVtZW50ICBcbiAgICB0aGlzLnBkZkRlc2lnbmVyU2VydmljZS5zZWxlY3RIZWFkZXJTdWJqZWN0JC5zdWJzY3JpYmUoaGVhZGVyID0+IHtcbiAgICAgIGlmIChoZWFkZXIpIHtcbiAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGVkRWxlbWVudCkge1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50ID0ge307XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZWxlY3RlZEVsZW1lbnRbJ3R5cGUnXSA9IGhlYWRlcjtcbiAgICAgICAgdGhpcy5oZWFkZXJTZWxlY3QgPSB0cnVlO1xuICAgICAgICB0aGlzLnBkZiA9IHRoaXMucGRmRGVzaWduZXJTZXJ2aWNlLmdldEJvb2soKTtcbiAgICAgICAgdGhpcy5ib29rSWQgPSBPYmplY3Qua2V5cyh0aGlzLnBkZilbMF1cbiAgICAgIH1cblxuICAgIH0pO1xuICAgIHRoaXMucGRmRGVzaWduZXJTZXJ2aWNlLnNlbGVjdGVkRWxlbWVudCQuc3Vic2NyaWJlKGluZGV4ID0+IHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50SW5kZXggPSBpbmRleDtcbiAgICAgIHRoaXMuaGVhZGVyU2VsZWN0ID0gZmFsc2U7XG4gICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICBjb25zdCBlbGVtZW50cyA9IHRoaXMucGRmRGVzaWduZXJTZXJ2aWNlLmdldEVsZW1lbnRzKCk7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50ID0gZWxlbWVudHNbaW5kZXhdO1xuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZEVsZW1lbnQ/LnR5cGUgPT09ICdUYWJsZScpIHtcbiAgICAgICAgICB0aGlzLnNlbGVjdENvbHVtbiA9IHRoaXMucGRmRGVzaWduZXJTZXJ2aWNlLmdldFNlbGVjdFRhYmxlQ29sdW1uKCkgPT09IHVuZGVmaW5lZCA/IG51bGwgOiB0aGlzLnBkZkRlc2lnbmVyU2VydmljZS5nZXRTZWxlY3RUYWJsZUNvbHVtbigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc2VsZWN0Q29sdW1uID0gbnVsbFxuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5zZWxlY3RlZEVsZW1lbnQubWFyZ2luKSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZEVsZW1lbnQubWFyZ2luID0gWzAsIDAsIDAsIDBdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmdldFByb3BlcnRpZXMoKVxuICAgICAgdGhpcy51cGRhdGVQZGZwRGF0YSgpXG4gICAgfSk7XG4gICAgdGhpcy51cGRhdGVQZGZwRGF0YSgpXG4gIH1cbiAgLy9BUC0xME1BUjI1IFVwZGF0ZXMgdGhlIHRpdGxlIHVzaW5nIHRoZSBmb3JtIGJ1aWxkZXIgc2VydmljZSAgXG4gIHVwZGF0ZVRpdGxlKGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLnBkZkRlc2lnbmVyU2VydmljZS51cGRhdGVUaXRsZShldmVudCk7XG4gIH1cblxuICB1cGRhdGVQZGZwRGF0YSgpOiB2b2lkIHtcbiAgICAvLyBTS1MyOE1BUjI1IENvbnZlcnQgYXJyYXkgdG8gY29tbWEtc2VwYXJhdGVkIHN0cmluZ1xuICAgIHRoaXMuZmllbGRBc1N0cmluZyA9IHRoaXMuYm9va1N1YnRleHQ/LmZpZWxkPy5qb2luKCcsICcpIHx8ICcnO1xuICBcbiAgICAvLyBTS1MyME1BUjI1IEZpbHRlciBjb2x1bW5zXG4gICAgY29uc3QgdGFyZ2V0QXJyYXkgPSB0aGlzLmdldERhdGFCeVBhdGgoJ2ZpZWxkc01ldGEnKSB8fCBbXTtcbiAgICB0aGlzLmZpbHRlcmVkQ29sdW1ucyA9IHRhcmdldEFycmF5LmZpbHRlcihcbiAgICAgIGNvbHVtbiA9PiBjb2x1bW4udW5pcXVlSWRlbnRpZmllciAhPT0gdGhpcy5zZWxlY3RDb2x1bW5cbiAgICApO1xuICB9XG4gIHVwZGF0ZUZpZWxkKHZhbHVlOiBzdHJpbmcpIHsgXG4gICAgdGhpcy5ib29rU3VidGV4dC5maWVsZCA9IHZhbHVlLnNwbGl0KCcsJykubWFwKGl0ZW0gPT4gaXRlbS50cmltKCkpOyAvL1NLUzI4TUFSMjUgQ29udmVydCBzdHJpbmcgYmFjayB0byBhcnJheVxuICB9XG5cbiAgLy8gU0tTMjBNQVIyNSBNZXRob2QgdG8gaGFuZGxlIGNoZWNrYm94IGNoYW5nZXNcbiAgb25DaGVja2JveENoYW5nZSh0YXJnZXRBcnJheVBhdGg6IGFueSwgdGFyZ2V0QXJyYXlLZXk6IGFueSwga2V5OiBhbnksIGFwaU5hbWU6IHN0cmluZywgaXNDaGVja2VkOiBib29sZWFuKSB7XG4gICAgY29uc3QgdGFyZ2V0QXJyYXkgPSB0aGlzLmdldERhdGFCeVBhdGgodGFyZ2V0QXJyYXlQYXRoKTtcbiAgICBjb25zdCBmb3VuZEl0ZW0gPSB0YXJnZXRBcnJheS5maW5kKGl0ZW0gPT4gaXRlbVt0YXJnZXRBcnJheUtleV0gPT09IHRoaXMuc2VsZWN0Q29sdW1uKTtcbiAgICBmb3VuZEl0ZW1ba2V5XSA9IGZvdW5kSXRlbVtrZXldID8gZm91bmRJdGVtW2tleV0gOiBbXTtcbiAgICBpZiAoaXNDaGVja2VkKSB7XG4gICAgICAvLyBBZGQgYXBpTmFtZSB0byBzZWxlY3RlZEFwaU5hbWVzIGlmIG5vdCBhbHJlYWR5IHByZXNlbnRcbiAgICAgIGlmICghZm91bmRJdGVtW2tleV0uaW5jbHVkZXMoYXBpTmFtZSkpIHtcbiAgICAgICAgZm91bmRJdGVtW2tleV0ucHVzaChhcGlOYW1lKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmVtb3ZlIGFwaU5hbWUgZnJvbSBzZWxlY3RlZEFwaU5hbWVzIGlmIHByZXNlbnRcbiAgICAgIGNvbnN0IGluZGV4ID0gZm91bmRJdGVtW2tleV0uaW5kZXhPZihhcGlOYW1lKTtcbiAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgIGZvdW5kSXRlbVtrZXldLnNwbGljZShpbmRleCwgMSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHVwZGF0ZVByb3BlcnR5KGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRFbGVtZW50SW5kZXggPj0gMCkge1xuICAgICAgICB0aGlzLnNldFZhbHVlQnlQYXRoKGtleSwgdmFsdWUpO1xuICAgIH1cbiAgICBpZiAoa2V5ID09PSAncXVlc3Rpb24nKSB7XG4gICAgICBpZiAoIXRoaXMudmFsaWRhdGVJbnB1dCh2YWx1ZSwga2V5KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8vIFNLUzIxTUFSMjUgcmFkaW8gYnV0dG9uIGNsaWNrIGhhbmRsZXJcbiAgb25SYWRpb0NoYW5nZSh0YXJnZXRBcnJheVBhdGg6IGFueSwgdGFyZ2V0QXJyYXlLZXk6IGFueSwga2V5OiBhbnksIHZhbHVlOiBhbnkpIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZEVsZW1lbnQudHlwZSA9PT0gJ1RhYmxlJykge1xuICAgICAgLy8gdGhpcy51cGRhdGVWYWx1ZUJ5QXJyYXlQYXRoKHRhcmdldEFycmF5LCB0YXJnZXRBcnJheUtleSwgdGhpcy5zZWxlY3RDb2x1bW4sIGtleSwgdmFsdWUpO1xuICAgICAgY29uc3QgdGFyZ2V0QXJyYXkgPSB0aGlzLmdldERhdGFCeVBhdGgodGFyZ2V0QXJyYXlQYXRoKTtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheSh0YXJnZXRBcnJheSkpIHJldHVybjtcblxuICAgICAgLy8gRmluZCB0aGUgb2JqZWN0IHRoYXQgbWF0Y2hlcyBzZWxlY3RDb2x1bW5cbiAgICAgIGxldCBmb3VuZEl0ZW0gPSB0YXJnZXRBcnJheS5maW5kKGl0ZW0gPT4gaXRlbVt0YXJnZXRBcnJheUtleV0gPT09IHRoaXMuc2VsZWN0Q29sdW1uKTtcblxuICAgICAgLy8gSWYgdGhlIGl0ZW0gZG9lcyBub3QgZXhpc3QsIGNyZWF0ZSBhbmQgYWRkIGl0XG4gICAgICBpZiAoIWZvdW5kSXRlbSkge1xuICAgICAgICBmb3VuZEl0ZW0gPSB7IFt0YXJnZXRBcnJheUtleV06IHRoaXMuc2VsZWN0Q29sdW1uIH07IC8vIEVuc3VyZSB0aGUga2V5IGV4aXN0c1xuICAgICAgICB0YXJnZXRBcnJheS5wdXNoKGZvdW5kSXRlbSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFRyYXZlcnNlIGFuZCBzZXQgdGhlIHZhbHVlXG4gICAgICBjb25zdCBrZXlzID0ga2V5LnNwbGl0KCcuJyk7XG4gICAgICBsZXQgb2JqID0gZm91bmRJdGVtO1xuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGtleXNbaV07XG4gICAgICAgIGlmICghb2JqW2tleV0pIG9ialtrZXldID0ge307IC8vIEluaXRpYWxpemUgbWlzc2luZyBvYmplY3RzXG4gICAgICAgIG9iaiA9IG9ialtrZXldO1xuICAgICAgfVxuXG4gICAgICAvLyBBc3NpZ24gdGhlIHZhbHVlIGJhc2VkIG9uIGlucHV0IHR5cGVcbiAgICAgIGNvbnN0IGxhc3RLZXkgPSBrZXlzW2tleXMubGVuZ3RoIC0gMV07XG5cbiAgICAgIG9ialtsYXN0S2V5XSA9IHZhbHVlO1xuICAgICAgdGhpcy51cGRhdGVFbGVtZW50KHRoaXMuc2VsZWN0ZWRFbGVtZW50KVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldFZhbHVlQnlQYXRoKGtleSwgdmFsdWUpOyAvLyBGYWxsYmFjayBmb3Igbm9uLVRhYmxlIGVsZW1lbnRzLCBpZiBhcHBsaWNhYmxlXG4gICAgfVxuICB9XG4gIG9uUmVxdWlyZWRDaGFuZ2UodmFsdWU6IGJvb2xlYW4pIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZEVsZW1lbnQpIHtcbiAgICAgIGxldCBsYWJlbCA9IHRoaXMuc2VsZWN0ZWRFbGVtZW50LmxhYmVsID8gdGhpcy5zZWxlY3RlZEVsZW1lbnQubGFiZWwucmVwbGFjZSgvXFxzKlxcKiskLywgJycpIDogJ0xhYmVsJztcblxuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIGxhYmVsID0gYCR7bGFiZWx9ICpgO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnVwZGF0ZVByb3BlcnR5KCdsYWJlbCcsIGxhYmVsKTtcbiAgICB9XG4gIH1cblxuICAvLyBUb2dnbGUgZm9yIFN1YiBRdWVzdGlvbnMgKEVhY2ggcHJvcCBoYXMgaXRzIG93biBzdGF0ZSlcbiAgdG9nZ2xlU3ViUXVlc3Rpb24ocHJvcDogYW55KSB7XG4gICAgcHJvcC5pc0V4cGFuZGVkID0gIXByb3AuaXNFeHBhbmRlZDtcbiAgfVxuXG4gIC8vIFNlcGFyYXRlIFRvZ2dsZSBmb3IgU3R5bGUgU2VjdGlvblxuICBpc1N0eWxlRXhwYW5kZWQgPSBmYWxzZTtcblxuICB0b2dnbGVTdHlsZVNlY3Rpb24oKSB7XG4gICAgdGhpcy5pc1N0eWxlRXhwYW5kZWQgPSAhdGhpcy5pc1N0eWxlRXhwYW5kZWQ7XG4gIH1cblxuICBnZXRQcm9wZXJ0aWVzKCkge1xuICAgIGlmICghdGhpcy5zZWxlY3RlZEVsZW1lbnQpIHJldHVybiBudWxsO1xuXG4gICAgLy8gQVAtMTBNQVIyNSBSZXRyaWV2ZSB0aGUgbGF0ZXN0IHBkZiBkYXRhXG4gICAgdGhpcy5wZGYgPSB0aGlzLnBkZkRlc2lnbmVyU2VydmljZS5nZXRCb29rKCk7XG5cbiAgICAvLyBBUC0xME1BUjI1IElmIHRoZSBzZWxlY3RlZCBlbGVtZW50IGlzIGEgJ0hlYWRlcicsIHJldHVybiBpdHMgcHJvcGVydGllc1xuICAgIGlmICh0aGlzLnNlbGVjdGVkRWxlbWVudD8udHlwZSA9PT0gJ0hlYWRlcicpIHtcbiAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRQcm9wZXJ0aWVzWydIZWFkZXInXTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRFbGVtZW50Py50eXBlID09PSAnVGFibGUnKSB7XG4gICAgICBpZiAodGhpcy5zZWxlY3RDb2x1bW4gIT09ICcnICYmIHRoaXMuc2VsZWN0Q29sdW1uICE9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRQcm9wZXJ0aWVzWydUYWJsZUNvbHVtbiddO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5lbGVtZW50UHJvcGVydGllc1t0aGlzLnNlbGVjdGVkRWxlbWVudD8udHlwZV07XG4gIH1cbiAgLy8gQVAtMjhNQVIyNSBBZGQgYW4gb3B0aW9uIHdpdGggYSB1bmlxdWUgVVVJRFxuICBhZGRPcHRpb24ob3B0aW9uczogYW55W10pIHtcbiAgICBjb25zdCB1bmlxdWVfaWQgPSB1dWlkdjQoKTtcbiAgICBvcHRpb25zLnB1c2goeyBpZDogdW5pcXVlX2lkLHZhbHVlOiAnJyB9KTtcbiAgfVxuXG4gIC8vIEFQLTI4TUFSMjUgRnVuY3Rpb24gdG8gcmVtb3ZlIGFuIG9wdGlvbiBiYXNlZCBvbiBpdHMgdW5pcXVlIFVVSURcbiAgcmVtb3ZlT3B0aW9uKG9wdGlvbnM6IGFueVtdLCBpZDogc3RyaW5nKSB7XG4gICAgY29uc3QgaW5kZXggPSBvcHRpb25zLmZpbmRJbmRleChvcHRpb24gPT4gb3B0aW9uLmlkID09PSBpZCk7XG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgb3B0aW9ucy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZUJ1dHRvbkNsaWNrKCkge1xuICAgIHRoaXMuZm9ybUJ1dHRvbkhhbmRsZXIuZW1pdCh0aGlzLnBkZkRlc2lnbmVyU2VydmljZS5kb3dubG9hZEVsZW1lbnQoKSk7XG4gIH1cbiAgLy8gU0tTMTNNQVIyNSBhY3RpdmUgdGFiIHNlbGVjdFxuICBzZXRBY3RpdmVUYWIodGFiOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmFjdGl2ZVRhYiA9IHRhYjtcbiAgfVxuICAvLyBTS1MxM01BUjI1IHRhYmxlIHByb3BlcnR5IHNhdmVcbiAgb25TYXZlKCk6IHZvaWQge1xuICB9XG4gIC8vIFNLUzEzTUFSMjUgdGFibGUgcHJvcGVydHkgcmVzZXRcbiAgb25DYW5jZWwoKTogdm9pZCB7XG4gIH1cblxuICB1cGRhdGVQcm9wZXJ0aWVzKGVsZW1lbnRUeXBlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAvLyBSZXNldCBhbGlnbm1lbnQgYW5kIHN0eWxlcyBpZiBzd2l0Y2hpbmcgZWxlbWVudHNcbiAgICB0aGlzLnNlbGVjdGVkQWxpZ24gPSAnYWxpZ24tbGVmdCc7XG4gICAgdGhpcy5zZWxlY3RlZFN0eWxlcyA9IFtdO1xuXG4gICAgLy8gRmV0Y2ggdGhlIHByb3BlcnRpZXMgb2YgdGhlIHNlbGVjdGVkIGVsZW1lbnQgdHlwZVxuXG4gICAgY29uc3QgcHJvcGVydGllcyA9IHRoaXMuZ2V0UHJvcGVydGllcygpO1xuICAgIGlmIChwcm9wZXJ0aWVzKSB7XG4gICAgICAvLyBNYWtlIHN1cmUgdGhlIHByb3BlcnRpZXMgYXJlIGR5bmFtaWNhbGx5IHVwZGF0ZWRcbiAgICB9XG4gIH1cblxuICBvbkFsaWduU2VsZWN0KHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZEVsZW1lbnQpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50LnRleHRBbGlnbiA9IHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIG9uU3R5bGVTZWxlY3QodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zZWxlY3RlZEVsZW1lbnQpIHJldHVybjtcblxuICAgIC8vIEluaXRpYWxpemUgc3R5bGVzIGFycmF5IGlmIGl0IGRvZXNuJ3QgZXhpc3RcbiAgICB0aGlzLnNlbGVjdGVkRWxlbWVudC5zdHlsZXMgPSB0aGlzLnNlbGVjdGVkRWxlbWVudC5zdHlsZXMgfHwgW107XG5cbiAgICAvLyBFbnN1cmUgb25seSBvbmUgc3R5bGUgaXMgc2VsZWN0ZWQgYXQgYSB0aW1lXG4gICAgdGhpcy5zZWxlY3RlZEVsZW1lbnQuc3R5bGVzID0gW3ZhbHVlXTtcblxuICB9XG5cbiAgaXNTdHlsZUFjdGl2ZSh2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRFbGVtZW50Py5zdHlsZXM/LmluY2x1ZGVzKHZhbHVlKSB8fCBmYWxzZTtcbiAgfVxuICBnZXRWYWx1ZUJ5UGF0aChwYXRoOiBzdHJpbmcpOiBhbnkge1xuICAgIHJldHVybiBwYXRoPy5zcGxpdCgnLicpLnJlZHVjZSgob2JqLCBrZXkpID0+IG9iaj8uW2tleV0gPz8gJycsIHRoaXMuc2VsZWN0ZWRFbGVtZW50KTtcbiAgfVxuXG4gIG9uVG9nZ2xlQ2hhbmdlKHBhdGg6IHN0cmluZywgZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgY2hlY2tlZCA9IChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkuY2hlY2tlZDtcbiAgICB0aGlzLnNldFZhbHVlQnlQYXRoKHBhdGgsIGNoZWNrZWQpO1xuICAgIHRoaXMudXBkYXRlRWxlbWVudCh0aGlzLnNlbGVjdGVkRWxlbWVudClcbiAgfVxuICB2YWxpZGF0ZUlucHV0KHZhbHVlOiBzdHJpbmcsIHR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmICh0eXBlID09PSAncGxhY2Vob2xkZXInKSB7XG4gICAgICBjb25zdCByZWdleCA9IC9eW2EtekEtWjAtOVxcc10qJC87XG4gICAgICBpZiAoIXJlZ2V4LnRlc3QodmFsdWUpKSB7XG4gICAgICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gJ09ubHkgbGV0dGVycyBhbmQgbnVtYmVycyBhcmUgYWxsb3dlZCc7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5lcnJvck1lc3NhZ2UgPSAnJztcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBzZXRWYWx1ZUJ5UGF0aChwYXRoOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAodmFsdWUgPT09ICdxdWVzdGlvbicpIHtcbiAgICAgIGlmICghdGhpcy52YWxpZGF0ZUlucHV0KHZhbHVlLCB2YWx1ZSkpIHtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qga2V5cyA9IHBhdGguc3BsaXQoJy4nKTtcbiAgICBsZXQgb2JqID0gdGhpcy5zZWxlY3RlZEVsZW1lbnQ7XG5cbiAgICBrZXlzLmZvckVhY2goKGtleSwgaW5kZXgpID0+IHtcbiAgICAgIGlmICghb2JqW2tleV0pIHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIG5leHQga2V5IGlzIGEgbnVtYmVyIChhcnJheSBpbmRleClcbiAgICAgICAgY29uc3QgbmV4dEtleSA9IGtleXNbaW5kZXggKyAxXTtcbiAgICAgICAgb2JqW2tleV0gPSBpc05hTihOdW1iZXIobmV4dEtleSkpID8ge30gOiBbXTtcbiAgICAgIH1cbiAgICAgIGlmIChpbmRleCA9PT0ga2V5cy5sZW5ndGggLSAxKSB7XG4gICAgICAgIC8vIENvbnZlcnQgdmFsdWUgdG8gbnVtYmVyIGZvciBmb250U2l6ZVxuICAgICAgICBpZiAoa2V5ID09PSAnZm9udFNpemUnKSB7XG4gICAgICAgICAgb2JqW2tleV0gPSBwYXJzZUludCh2YWx1ZSwgMTApIHx8IDE0OyAvLyBEZWZhdWx0IHRvIDE0IGlmIGludmFsaWRcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvYmpba2V5XSA9IHZhbHVlOyAvLyBBc3NpZ24gdmFsdWUgdG8gbGFzdCBrZXlcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb2JqID0gb2JqW2tleV07IC8vIE1vdmUgZGVlcGVyXG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5wZGZEZXNpZ25lclNlcnZpY2UuZWxlbWVudFVwZGF0ZSh0aGlzLnNlbGVjdGVkRWxlbWVudCk7XG4gIH1cbiAgZ2V0U3R5bGVLZXlzKCk6IHN0cmluZ1tdIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRFbGVtZW50IHx8ICF0aGlzLnNlbGVjdGVkRWxlbWVudC5zdHlsZSB8fCB0eXBlb2YgdGhpcy5zZWxlY3RlZEVsZW1lbnQuc3R5bGUgIT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLnNlbGVjdGVkRWxlbWVudC5zdHlsZSk7XG4gIH0gIFxuXG4gIC8vIFNLUzE5TUFSMjUgdXBkYXRlIGVsZW1lbnQgaW4gc2Vydmllc1xuICB1cGRhdGVFbGVtZW50KGVsZW1lbnQ6IGFueSkge1xuICAgIHRoaXMucGRmRGVzaWduZXJTZXJ2aWNlLmVsZW1lbnRVcGRhdGUoZWxlbWVudClcbiAgICBpZiAodGhpcy5zZWxlY3RlZEVsZW1lbnQ/LnR5cGUgPT09ICdUYWJsZScgJiYgdGhpcy5zZWxlY3RDb2x1bW4pIHtcbiAgICAgIHRoaXMucGRmRGVzaWduZXJTZXJ2aWNlLnNldFNlbGVjdGVkVGFibGVFbGVtZW50KHRoaXMuc2VsZWN0ZWRFbGVtZW50SW5kZXgsIHsgdW5pcXVlSWRlbnRpZmllcjogdGhpcy5zZWxlY3RDb2x1bW4gfHwgbnVsbCB9KTtcbiAgICB9XG4gIH1cbiAgLy8gU0tTMTlNQVIyNSBnZXQgdmFsdWUgZnJvbSBhcnJheVxuICBnZXRWYWx1ZUJ5QXJyYXlQYXRoKHRhcmdldEFycmF5UGF0aDogYW55LCB0YXJnZXRBcnJheUtleTogc3RyaW5nLCBzZWxlY3RDb2x1bW46IHN0cmluZywga2V5UGF0aDogc3RyaW5nKTogYW55IHtcbiAgICBjb25zdCB0YXJnZXRBcnJheSA9IHRoaXMuZ2V0RGF0YUJ5UGF0aCh0YXJnZXRBcnJheVBhdGgpO1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh0YXJnZXRBcnJheSkpIHJldHVybiAnJztcblxuICAgIGNvbnN0IGZvdW5kSXRlbSA9IHRhcmdldEFycmF5LmZpbmQoaXRlbSA9PiBpdGVtW3RhcmdldEFycmF5S2V5XSA9PT0gc2VsZWN0Q29sdW1uKTtcblxuICAgIHJldHVybiBmb3VuZEl0ZW0gPyBrZXlQYXRoLnNwbGl0KCcuJykucmVkdWNlKChvYmosIGtleSkgPT4gb2JqPy5ba2V5XSwgZm91bmRJdGVtKSA6ICcnO1xuICB9XG5cbiAgLy9TS1MxOU1BUjI1IEZ1bmN0aW9uIHRvIHVwZGF0ZSBhIHZhbHVlIGluIGFuIGFycmF5IGR5bmFtaWNhbGx5XG4gIHVwZGF0ZVZhbHVlQnlBcnJheVBhdGgodGFyZ2V0QXJyYXlQYXRoOiBhbnksIHRhcmdldEFycmF5S2V5OiBzdHJpbmcsIHNlbGVjdENvbHVtbjogc3RyaW5nLCBrZXlQYXRoOiBzdHJpbmcsIGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHRhcmdldEFycmF5ID0gdGhpcy5nZXREYXRhQnlQYXRoKHRhcmdldEFycmF5UGF0aCk7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHRhcmdldEFycmF5KSkgcmV0dXJuO1xuXG4gICAgLy8gRmluZCB0aGUgb2JqZWN0IHRoYXQgbWF0Y2hlcyBzZWxlY3RDb2x1bW5cbiAgICBsZXQgZm91bmRJdGVtID0gdGFyZ2V0QXJyYXkuZmluZChpdGVtID0+IGl0ZW1bdGFyZ2V0QXJyYXlLZXldID09PSBzZWxlY3RDb2x1bW4pO1xuXG4gICAgLy8gSWYgdGhlIGl0ZW0gZG9lcyBub3QgZXhpc3QsIGNyZWF0ZSBhbmQgYWRkIGl0XG4gICAgaWYgKCFmb3VuZEl0ZW0pIHtcbiAgICAgIGZvdW5kSXRlbSA9IHsgW3RhcmdldEFycmF5S2V5XTogc2VsZWN0Q29sdW1uIH07IC8vIEVuc3VyZSB0aGUga2V5IGV4aXN0c1xuICAgICAgdGFyZ2V0QXJyYXkucHVzaChmb3VuZEl0ZW0pO1xuICAgIH1cblxuICAgIC8vIFRyYXZlcnNlIGFuZCBzZXQgdGhlIHZhbHVlXG4gICAgY29uc3Qga2V5cyA9IGtleVBhdGguc3BsaXQoJy4nKTtcbiAgICBsZXQgb2JqID0gZm91bmRJdGVtO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgY29uc3Qga2V5ID0ga2V5c1tpXTtcbiAgICAgIGlmICghb2JqW2tleV0pIG9ialtrZXldID0ge307IC8vIEluaXRpYWxpemUgbWlzc2luZyBvYmplY3RzXG4gICAgICBvYmogPSBvYmpba2V5XTtcbiAgICB9XG5cbiAgICAvLyBBc3NpZ24gdGhlIHZhbHVlIGJhc2VkIG9uIGlucHV0IHR5cGVcbiAgICBjb25zdCBsYXN0S2V5ID0ga2V5c1trZXlzLmxlbmd0aCAtIDFdO1xuICAgIGNvbnN0IGlucHV0RWxlbWVudCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuXG4gICAgb2JqW2xhc3RLZXldID0gaW5wdXRFbGVtZW50Py50eXBlID09PSAnY2hlY2tib3gnID8gaW5wdXRFbGVtZW50LmNoZWNrZWQgOiBpbnB1dEVsZW1lbnQudmFsdWU7XG4gICAgaWYgKGtleVBhdGggPT09ICdzdW1tYXJ5Q29sdW1uJykge1xuICAgICAgaWYgKG9ialsnc3VtbWFyeVJvdyddID09PSB0cnVlKSB7XG4gICAgICAgIG9ialsnc3VtbWFyeVJvdyddID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoaW5wdXRFbGVtZW50LmNoZWNrZWQgPT09IHRydWUpIHtcbiAgICAgICAgb2JqWydmbGRUeXBlJ10gPSAnY2FsY3VsYXRpb24nXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvYmpbJ2ZsZFR5cGUnXSA9ICdUZXh0J1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoa2V5UGF0aCA9PT0gJ3N1bW1hcnlSb3cnKSB7XG4gICAgICAvL3RoaXMucGRmRGVzaWduZXJTZXJ2aWNlLnNldFN1bW1hcnlSb3dEYXRhKG9iaik7IFxuICAgICAgaWYgKG9ialsnc3VtbWFyeUNvbHVtbiddID09PSB0cnVlKSB7XG4gICAgICAgIG9ialsnc3VtbWFyeUNvbHVtbiddID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoaW5wdXRFbGVtZW50LmNoZWNrZWQgPT09IHRydWUpIHtcbiAgICAgICAgb2JqWydmbGRUeXBlJ10gPSAnY2FsY3VsYXRpb24nXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvYmpbJ2ZsZFR5cGUnXSA9ICdUZXh0J1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnVwZGF0ZUVsZW1lbnQodGhpcy5zZWxlY3RlZEVsZW1lbnQpXG4gIH1cbiAgZ2V0RGF0YUJ5UGF0aChwYXRoOiBzdHJpbmcpOiBhbnkge1xuICAgIHJldHVybiBwYXRoLnNwbGl0KCcuJykucmVkdWNlKChvYmosIGtleSkgPT4gb2JqPy5ba2V5XSwgdGhpcy5zZWxlY3RlZEVsZW1lbnQpO1xuICB9XG5cbiAgLy8gU0tTMjVNQVIyNSBpbWFnZSBlZGl0IGZ1bmN0aW9uc1xuICBmbGlwSG9yaXpvbnRhbCgpIHtcbiAgICB0aGlzLnRyYW5zZm9ybSA9IHtcbiAgICAgIC4uLnRoaXMudHJhbnNmb3JtLFxuICAgICAgZmxpcEg6ICF0aGlzLnRyYW5zZm9ybS5mbGlwSFxuICAgIH07XG4gIH1cblxuICBmbGlwVmVydGljYWwoKSB7XG4gICAgdGhpcy50cmFuc2Zvcm0gPSB7XG4gICAgICAuLi50aGlzLnRyYW5zZm9ybSxcbiAgICAgIGZsaXBWOiAhdGhpcy50cmFuc2Zvcm0uZmxpcFZcbiAgICB9O1xuICB9XG5cbiAgcmVzZXRJbWFnZSgpIHtcbiAgICB0aGlzLmNhbnZhc1JvdGF0aW9uID0gMDtcbiAgICB0aGlzLmNyb3BwZXIgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy50cmFuc2Zvcm0gPSB7XG4gICAgICB0cmFuc2xhdGVVbml0OiAncHgnLFxuICAgICAgc2NhbGU6IDEsXG4gICAgICByb3RhdGU6IDAsXG4gICAgICBmbGlwSDogZmFsc2UsXG4gICAgICBmbGlwVjogZmFsc2UsXG4gICAgICB0cmFuc2xhdGVIOiAwLFxuICAgICAgdHJhbnNsYXRlVjogMFxuICAgIH07XG4gIH1cblxuICB6b29tT3V0KCkge1xuICAgIHRoaXMudHJhbnNmb3JtID0ge1xuICAgICAgLi4udGhpcy50cmFuc2Zvcm0sXG4gICAgICBzY2FsZTogdGhpcy50cmFuc2Zvcm0uc2NhbGUhIC0gLjFcbiAgICB9O1xuICB9XG5cbiAgem9vbUluKCkge1xuICAgIHRoaXMudHJhbnNmb3JtID0ge1xuICAgICAgLi4udGhpcy50cmFuc2Zvcm0sXG4gICAgICBzY2FsZTogdGhpcy50cmFuc2Zvcm0uc2NhbGUhICsgLjFcbiAgICB9O1xuICB9XG4gIHJvdGF0ZUxlZnQoKSB7XG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHsgLy8gVXNlIHRpbWVvdXQgYmVjYXVzZSByb3RhdGluZyBpbWFnZSBpcyBhIGhlYXZ5IG9wZXJhdGlvbiBhbmQgd2lsbCBibG9jayB0aGUgdWkgdGhyZWFkXG4gICAgICB0aGlzLmNhbnZhc1JvdGF0aW9uLS07XG4gICAgICB0aGlzLmZsaXBBZnRlclJvdGF0ZSgpO1xuICAgIH0pO1xuICB9XG5cbiAgcm90YXRlUmlnaHQoKSB7XG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuY2FudmFzUm90YXRpb24rKztcbiAgICAgIHRoaXMuZmxpcEFmdGVyUm90YXRlKCk7XG4gICAgfSk7XG4gIH1cblxuICBtb3ZlTGVmdCgpIHtcbiAgICB0aGlzLnRyYW5zZm9ybSA9IHtcbiAgICAgIC4uLnRoaXMudHJhbnNmb3JtLFxuICAgICAgdHJhbnNsYXRlSDogdGhpcy50cmFuc2Zvcm0udHJhbnNsYXRlSCEgLSAxXG4gICAgfTtcbiAgfVxuXG4gIG1vdmVSaWdodCgpIHtcbiAgICB0aGlzLnRyYW5zZm9ybSA9IHtcbiAgICAgIC4uLnRoaXMudHJhbnNmb3JtLFxuICAgICAgdHJhbnNsYXRlSDogdGhpcy50cmFuc2Zvcm0udHJhbnNsYXRlSCEgKyAxXG4gICAgfTtcbiAgfVxuXG4gIG1vdmVEb3duKCkge1xuICAgIHRoaXMudHJhbnNmb3JtID0ge1xuICAgICAgLi4udGhpcy50cmFuc2Zvcm0sXG4gICAgICB0cmFuc2xhdGVWOiB0aGlzLnRyYW5zZm9ybS50cmFuc2xhdGVWISArIDFcbiAgICB9O1xuICB9XG5cbiAgbW92ZVVwKCkge1xuICAgIHRoaXMudHJhbnNmb3JtID0ge1xuICAgICAgLi4udGhpcy50cmFuc2Zvcm0sXG4gICAgICB0cmFuc2xhdGVWOiB0aGlzLnRyYW5zZm9ybS50cmFuc2xhdGVWISAtIDFcbiAgICB9O1xuICB9XG4gIHByaXZhdGUgZmxpcEFmdGVyUm90YXRlKCkge1xuICAgIGNvbnN0IGZsaXBwZWRIID0gdGhpcy50cmFuc2Zvcm0uZmxpcEg7XG4gICAgY29uc3QgZmxpcHBlZFYgPSB0aGlzLnRyYW5zZm9ybS5mbGlwVjtcbiAgICB0aGlzLnRyYW5zZm9ybSA9IHtcbiAgICAgIC4uLnRoaXMudHJhbnNmb3JtLFxuICAgICAgZmxpcEg6IGZsaXBwZWRWLFxuICAgICAgZmxpcFY6IGZsaXBwZWRILFxuICAgICAgdHJhbnNsYXRlSDogMCxcbiAgICAgIHRyYW5zbGF0ZVY6IDBcbiAgICB9O1xuICB9XG4gIGFzeW5jIGltYWdlQ3JvcHBlZChldmVudDogYW55KSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGJhc2U2NCA9IGF3YWl0IHRoaXMuY29udmVydEJsb2JUb0Jhc2U2NChldmVudC5vYmplY3RVcmwpO1xuICAgICAgdGhpcy5zZWxlY3RlZEVsZW1lbnQuaW1hZ2VEYXRhID0gYmFzZTY0O1xuICAgICAgYXdhaXQgdGhpcy5wZGZEZXNpZ25lclNlcnZpY2UuZWxlbWVudFVwZGF0ZSggdGhpcy5zZWxlY3RlZEVsZW1lbnQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgaW4gaW1hZ2VDcm9wcGVkOlwiLCBlcnJvcik7XG4gICAgfVxuICB9XG5cblxuICBjcm9wcGVyUmVhZHkoc291cmNlSW1hZ2VEaW1lbnNpb25zOiBEaW1lbnNpb25zKSB7XG4gICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gIH1cbiAgLy8gU0tTMjVNQVIyNSBibG9iIHRvIGJhc2UgNjQgY29udmVydGVyXG4gIGNvbnZlcnRCbG9iVG9CYXNlNjQob2JqZWN0VXJsOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBmZXRjaChvYmplY3RVcmwpXG4gICAgICAudGhlbihyZXNwb25zZSA9PiByZXNwb25zZS5ibG9iKCkpXG4gICAgICAudGhlbihibG9iID0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGJsb2IpO1xuICAgICAgICAgIHJlYWRlci5vbmxvYWRlbmQgPSAoKSA9PiByZXNvbHZlKHJlYWRlci5yZXN1bHQgYXMgc3RyaW5nKTtcbiAgICAgICAgICByZWFkZXIub25lcnJvciA9IGVycm9yID0+IHJlamVjdChlcnJvcik7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gIH1cbiAgLy8gU0tTMjhNQVIyNSBxYiBwZGYgdXBkYXRlIGluIHBkZiBlbGVtZW50XG4gIGNoaWxkRXZlbnRDYXB0dXJlKGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLnNlbGVjdGVkRWxlbWVudC5wZGZSZWZlcmVuY2UgPSBPYmplY3Qua2V5cyhldmVudC52YWx1ZS52YWx1ZU9iailbMF1cbiAgICB0aGlzLnNlbGVjdGVkRWxlbWVudC5wZGZSZWZlcmVuY2VRdWVzdGlvbnMgPSBldmVudC52YWx1ZS52YWx1ZU9ialxuICAgIHRoaXMucGRmRGVzaWduZXJTZXJ2aWNlLmVsZW1lbnRVcGRhdGUoIHRoaXMuc2VsZWN0ZWRFbGVtZW50KTtcbiAgfVxuXG4gIC8vIFNLUzI4TUFSMjUgcGRmIHNlYXJjaCBkcm9wZG93biBlbWl0XG4gIGxpbmtUb2dnbGVEcm9wZG93bihldmVudDogRXZlbnQpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLmlzTGlua0Ryb3Bkb3duT3BlbiA9ICF0aGlzLmlzTGlua0Ryb3Bkb3duT3BlbjtcbiAgfVxuXG4gIC8vIFNLUzI4TUFSMjUgcGRmIHNlYXJjaCBkcm9wZG93biBjbG9zZVxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycsIFsnJGV2ZW50J10pXG4gIG9uQ2xpY2tPdXRzaWRlKGV2ZW50OiBFdmVudCkge1xuICAgIGlmICh0aGlzLmRyb3Bkb3duICYmICF0aGlzLmRyb3Bkb3duLm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0KSkge1xuICAgICAgdGhpcy5pc0xpbmtEcm9wZG93bk9wZW4gPSBmYWxzZTtcbiAgICB9XG4gIH1cbiAgLy8gQVAtMjhNQVIyNSBXaGVuIGRyYWcgc3RhcnRzLCBzdG9yZSB0aGUgaW5kZXhcbiAgb25EcmFnU3RhcnQoZXZlbnQ6IERyYWdFdmVudCwgaWQ6IHN0cmluZykge1xuICAgIHRoaXMuZHJhZ2dlZElkID0gaWQ7XG4gICAgZXZlbnQuZGF0YVRyYW5zZmVyIS5lZmZlY3RBbGxvd2VkID0gXCJtb3ZlXCI7XG4gIH1cblxuICAvLyBBUC0yOE1BUjI1IFByZXZlbnQgZGVmYXVsdCBiZWhhdmlvciB0byBhbGxvdyBkcm9wXG4gIG9uRHJhZ092ZXIoZXZlbnQ6IERyYWdFdmVudCkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIH1cblxuICAvLyBBUC0yOE1BUjI1IFN3YXAgdGhlIGRyYWdnZWQgaXRlbSB3aXRoIHRoZSBkcm9wcGVkIHBvc2l0aW9uXG4gIG9uRHJvcChldmVudDogRHJhZ0V2ZW50LCBrZXk6IHN0cmluZykge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgY29uc3QgdGFyZ2V0SWQgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KFwiLm9wdGlvbi1pdGVtc1wiKT8uZ2V0QXR0cmlidXRlKFwiZGF0YS1pZFwiKTtcblxuICAgIGlmICh0aGlzLmRyYWdnZWRJZCAmJiB0YXJnZXRJZCAmJiB0aGlzLmRyYWdnZWRJZCAhPT0gdGFyZ2V0SWQpIHtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLnNlbGVjdGVkRWxlbWVudFtrZXldO1xuXG4gICAgICBbb3B0aW9uc1t0aGlzLmRyYWdnZWRJZF0sIG9wdGlvbnNbdGFyZ2V0SWRdXSA9IFtvcHRpb25zW3RhcmdldElkXSwgb3B0aW9uc1t0aGlzLmRyYWdnZWRJZF1dO1xuICAgICAgLy8gRmluZCB0aGUgaW5kZXhlcyBvZiB0aGUgZHJhZ2dlZCBhbmQgdGFyZ2V0IG9wdGlvbnNcbiAgICAgIGNvbnN0IGRyYWdnZWRJbmRleCA9IG9wdGlvbnMuZmluZEluZGV4KG9wdGlvbiA9PiBvcHRpb24uaWQgPT09IHRoaXMuZHJhZ2dlZElkKTtcbiAgICAgIGNvbnN0IHRhcmdldEluZGV4ID0gb3B0aW9ucy5maW5kSW5kZXgob3B0aW9uID0+IG9wdGlvbi5pZCA9PT0gdGFyZ2V0SWQpO1xuXG4gICAgICAvLyBTd2FwIHRoZSBpdGVtc1xuICAgICAgaWYgKGRyYWdnZWRJbmRleCAhPT0gLTEgJiYgdGFyZ2V0SW5kZXggIT09IC0xKSB7XG4gICAgICAgIFtvcHRpb25zW2RyYWdnZWRJbmRleF0sIG9wdGlvbnNbdGFyZ2V0SW5kZXhdXSA9IFtvcHRpb25zW3RhcmdldEluZGV4XSwgb3B0aW9uc1tkcmFnZ2VkSW5kZXhdXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmRyYWdnZWRJZCA9IG51bGw7XG4gIH1cbiAgb25XaWR0aFNlbGVjdCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgaWYgKHZhbHVlID09PSAnKicgfHwgdmFsdWUgPT09ICdhdXRvJykge1xuICAgICAgdGhpcy5zZXRWYWx1ZUJ5UGF0aCgnd2lkdGgnLCB2YWx1ZSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGVkRWxlbWVudD8ud2lkdGggPT09ICcqJyB8fCB0aGlzLnNlbGVjdGVkRWxlbWVudD8ud2lkdGggPT09ICdhdXRvJykge1xuICAgICAgLy8gRGVmYXVsdCB0byAxMDAgaWYgc3dpdGNoaW5nIGZyb20gKiBvciBhdXRvIHRvIGN1c3RvbVxuICAgICAgdGhpcy5zZXRWYWx1ZUJ5UGF0aCgnd2lkdGgnLCAxMDApO1xuICAgIH1cbiAgfVxuICBcbn1cbiIsIjwhLS0gIC0gRmllbGQgYW5kIEVsZW1lbnQgUHJvcGVydGllcyAtLT5cbjxkaXYgY2xhc3M9XCJjb250YWluZXJcIj5cbiAgPGRpdiBjbGFzcz1cInRhYnNcIj5cbiAgICA8ZGl2IGNsYXNzPVwidGFiXCIgW25nQ2xhc3NdPVwieydhY3RpdmUnOiBhY3RpdmVUYWIgPT09ICdhdHRyaWJ1dGVzJ31cIiAoY2xpY2spPVwic2V0QWN0aXZlVGFiKCdhdHRyaWJ1dGVzJylcIj5cbiAgICAgIHt7ICdBVFRSSUJVVEVTJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdBdHRyaWJ1dGVzJyB9fVxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJ0YWJcIiBbbmdDbGFzc109XCJ7J2FjdGl2ZSc6IGFjdGl2ZVRhYiA9PT0gJ3Byb3BlcnR5J31cIiAoY2xpY2spPVwic2V0QWN0aXZlVGFiKCdwcm9wZXJ0eScpXCI+XG4gICAgICB7eyAnUFJPUEVSVFknIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ1Byb3BlcnR5JyB9fVxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJ0YWJcIiBbbmdDbGFzc109XCJ7J2FjdGl2ZSc6IGFjdGl2ZVRhYiA9PT0gJ2FwcGVhcmFuY2UnfVwiIChjbGljayk9XCJzZXRBY3RpdmVUYWIoJ2FwcGVhcmFuY2UnKVwiPlxuICAgICAge3sgJ0FQUEVBUkFOQ0UnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ0FwcGVhcmFuY2UnIH19XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJ0YWItY29udGVudFwiICpuZ0lmPVwiYWN0aXZlVGFiID09PSAnYXR0cmlidXRlcydcIj5cbiAgICA8IS0tIEVsZW1lbnQgUHJvcGVycnRpZXMgLS0+XG4gICAgPCEtLSAgU2VsZWN0IGVsZW1lbnQgdHlwZSBzaG93IC0tPlxuICAgIDxkaXYgKm5nSWY9XCJnZXRQcm9wZXJ0aWVzKClcIj5cbiAgICAgIDwhLS0gU0tTMjVNQVIyNSB0aGlzIGlzIGZvciBpbWFnZSBlZGl0IC0tPlxuICAgICAgPGRpdiAqbmdJZj1cInNlbGVjdGVkRWxlbWVudD8udHlwZSA9PT0gJ2ltYWdlJ1wiPlxuICAgICAgICA8aW1hZ2UtY3JvcHBlciAqbmdJZj1cInNlbGVjdGVkRWxlbWVudC5pbWFnZURhdGEgXCIgW2ltYWdlQmFzZTY0XT1cInNlbGVjdGVkRWxlbWVudC5vcmdJbWFnZURhdGFcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJmYWxzZVwiIFthbGlnbkltYWdlXT1cImFsaWduSW1hZ2VcIiBbcm91bmRDcm9wcGVyXT1cInJvdW5kQ3JvcHBlclwiIFtiYWNrZ3JvdW5kQ29sb3JdPVwiJ3doaXRlJ1wiXG4gICAgICAgICAgaW1hZ2VBbHRUZXh0PVwiQWx0ZXJuYXRpdmUgaW1hZ2UgdGV4dFwiIFthbGxvd01vdmVJbWFnZV09XCJmYWxzZVwiIFtoaWRlUmVzaXplU3F1YXJlc109XCJmYWxzZVwiXG4gICAgICAgICAgW2NhbnZhc1JvdGF0aW9uXT1cImNhbnZhc1JvdGF0aW9uXCIgW2FzcGVjdFJhdGlvXT1cImFzcGVjdFJhdGlvXCIgW2NvbnRhaW5XaXRoaW5Bc3BlY3RSYXRpb109XCJmYWxzZVwiXG4gICAgICAgICAgW21haW50YWluQXNwZWN0UmF0aW9dPVwiZmFsc2VcIiBbY3JvcHBlclN0YXRpY1dpZHRoXT1cImNyb3BwZXJTdGF0aWNXaWR0aFwiXG4gICAgICAgICAgW2Nyb3BwZXJTdGF0aWNIZWlnaHRdPVwiY3JvcHBlclN0YXRpY0hlaWdodFwiIFtjcm9wcGVyTWluV2lkdGhdPVwiY3JvcHBlck1pbldpZHRoXCJcbiAgICAgICAgICBbY3JvcHBlck1pbkhlaWdodF09XCJjcm9wcGVyTWluSGVpZ2h0XCIgW2Nyb3BwZXJNYXhXaWR0aF09XCJjcm9wcGVyTWF4V2lkdGhcIlxuICAgICAgICAgIFtjcm9wcGVyTWF4SGVpZ2h0XT1cImNyb3BwZXJNYXhIZWlnaHRcIiBbcmVzZXRDcm9wT25Bc3BlY3RSYXRpb0NoYW5nZV09J3RydWUnIFsoY3JvcHBlcildPVwiY3JvcHBlclwiXG4gICAgICAgICAgWyh0cmFuc2Zvcm0pXT1cInRyYW5zZm9ybVwiIFtvbmx5U2NhbGVEb3duXT1cInRydWVcIiBvdXRwdXQ9XCJibG9iXCIgZm9ybWF0PVwicG5nXCJcbiAgICAgICAgICAoaW1hZ2VDcm9wcGVkKT1cImltYWdlQ3JvcHBlZCgkZXZlbnQpXCIgKGNyb3BwZXJSZWFkeSk9XCJjcm9wcGVyUmVhZHkoJGV2ZW50KVwiPjwvaW1hZ2UtY3JvcHBlcj5cbiAgICAgICAgPGRpdiAqbmdJZj1cInNlbGVjdGVkRWxlbWVudC5pbWFnZURhdGEgXCIgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBnYXA6IDJweDtcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgbG9nby1pY29uXCIgKGNsaWNrKT1cInJvdGF0ZUxlZnQoKVwiIHRpdGxlPVwiUm90YXRlIExlZnRcIj7in7I8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgbG9nby1pY29uXCIgKGNsaWNrKT1cInJvdGF0ZVJpZ2h0KClcIiB0aXRsZT1cIlJvdGF0ZSBSaWdodFwiPuKfszwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBsb2dvLWljb25cIiAoY2xpY2spPVwiem9vbU91dCgpXCIgdGl0bGU9XCJab29tIE91dFwiPi08L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgbG9nby1pY29uXCIgKGNsaWNrKT1cInpvb21JbigpXCIgdGl0bGU9XCJab29tIEluXCI+KzwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBsb2dvLWljb25cIiAoY2xpY2spPVwibW92ZUxlZnQoKVwiIHRpdGxlPVwiTW92ZSBMZWZ0XCI+4oaQPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImN1cnNvci1wb2ludGVyIGxvZ28taWNvblwiIChjbGljayk9XCJtb3ZlUmlnaHQoKVwiIHRpdGxlPVwiTW92ZSBSaWdodFwiPuKGkjwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBsb2dvLWljb25cIiAoY2xpY2spPVwibW92ZVVwKClcIiB0aXRsZT1cIk1vdmUgVXBcIj7ihpE8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgbG9nby1pY29uXCIgKGNsaWNrKT1cIm1vdmVEb3duKClcIiB0aXRsZT1cIk1vdmUgRG93blwiPuKGkzwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBsb2dvLWljb25cIiAoY2xpY2spPVwiZmxpcEhvcml6b250YWwoKVwiIFtjbGFzcy5lbmFibGVkXT1cInRyYW5zZm9ybS5mbGlwSFwiXG4gICAgICAgICAgICB0aXRsZT1cIkZsaXAgSG9yaXpvbnRhbGx5XCI+4oaUPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImN1cnNvci1wb2ludGVyIGxvZ28taWNvblwiIChjbGljayk9XCJmbGlwVmVydGljYWwoKVwiIFtjbGFzcy5lbmFibGVkXT1cInRyYW5zZm9ybS5mbGlwVlwiXG4gICAgICAgICAgICB0aXRsZT1cIkZsaXAgVmVydGljYWxseVwiPuKGlTwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBsb2dvLWljb25cIiAoY2xpY2spPVwicmVzZXRJbWFnZSgpXCIgdGl0bGU9XCJSZXNldFwiPsOXPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8IS0tIFNLUzI4TUFSMjUgc2VhcmNoIHBkZiBzcGVjaWZpYyBmb3IgcGRmIGVsZW1lbnQgLS0+XG4gICAgICA8ZGl2ICpuZ0lmPVwic2VsZWN0ZWRFbGVtZW50Py50eXBlID09PSAnUGRmJ1wiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJ0ZXh0LXNtXCI+e3sgJ1NFQVJDSFBERicgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnU2VhcmNoIFBkZicgfX08L2xhYmVsPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiAycHg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGp1c3RpZnktY29udGVudDogY2VudGVyO1wiPlxuICAgICAgICAgIDxueHQtc2VhcmNoLWJveCBbcXVlc3Rpb25dPVwic2VsZWN0ZWRFbGVtZW50XCIgW3JlYWRPbmx5XT1cInNlbGVjdGVkRWxlbWVudC5pc1JlYWRPbmx5XCIgW2FwaU1ldGFdPVwiYm9va1N1YnRleHRcIlxuICAgICAgICAgICAgICBbcGxhY2VIb2xkZXJUZXh0XT1cInNlbGVjdGVkRWxlbWVudC5xdWVzdGlvbiB8fCAnJ1wiXG4gICAgICAgICAgICAgIFttb2RlXT1cIidlZGl0J1wiXG4gICAgICAgICAgICAgIChzZWFyY2hWYWx1ZUNoYW5nZSk9XCJjaGlsZEV2ZW50Q2FwdHVyZSgkZXZlbnQpXCI+XG4gICAgICAgICAgPC9ueHQtc2VhcmNoLWJveD5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibGluay1pY29uXCI+XG4gICAgICAgICAgICA8c3ZnIChjbGljayk9XCJsaW5rVG9nZ2xlRHJvcGRvd24oJGV2ZW50KVwiIGZpbGw9XCIjMDAwMDAwXCIgdmVyc2lvbj1cIjEuMVwiIGlkPVwiQ2FwYV8xXCJcbiAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHdpZHRoPVwiMjRweFwiIGhlaWdodD1cIjI0cHhcIlxuICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDQ1MCA0NTBcIiB4bWw6c3BhY2U9XCJwcmVzZXJ2ZVwiPlxuICAgICAgICAgICAgICA8Zz5cbiAgICAgICAgICAgICAgICA8Zz5cbiAgICAgICAgICAgICAgICAgIDxnPlxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTMxOC4xNSwyMzAuMTk1bDc3LjkzNC03Ny45MzdjMzEuODk0LTMxLjg5MiwzMS44OTQtODMuNzgyLTAuMDA0LTExNS42NzRsLTEyLjY2LTEyLjY2XG4gICAgICAgICAgYy0zMS44OTMtMzEuODk2LTgzLjc4LTMxLjg5Ni0xMTUuNjc0LTAuMDA0bC03Ny45MzcsNzcuOTM0Yy0xNy41ODgsMTcuNTg4LTI1LjQ1Nyw0MS4yNjQtMjMuNjQ2LDY0LjMxMVxuICAgICAgICAgIGMtMjMuMDQ1LTEuODEzLTQ2LjcyMiw2LjA1Ni02NC4zMDgsMjMuNjQ3TDIzLjkyLDI2Ny43NDhjLTMxLjg5NCwzMS44ODktMzEuODk0LDgzLjc3OSwwLDExNS42NzRsMTIuNjY0LDEyLjY2MlxuICAgICAgICAgIGMzMS44OTMsMzEuODkzLDgzLjc4MywzMS44OTMsMTE1LjY3NCwwbDc3LjkzNS03Ny45MzZjMTcuNTkyLTE3LjU5LDI1LjQ1OS00MS4yNjYsMjMuNjQ3LTY0LjMwOVxuICAgICAgICAgIEMyNzYuODg0LDI1NS42NTQsMzAwLjU2LDI0Ny43ODMsMzE4LjE1LDIzMC4xOTV6IE0yMDIuNjUzLDI5MC42MDVsLTc3LjkzNiw3Ny45MzhjLTE2LjcwNSwxNi43MDMtNDMuODg5LDE2LjcwMy02MC41OSwwXG4gICAgICAgICAgbC0xMi42NjYtMTIuNjY2Yy0xNi43MDUtMTYuNzAxLTE2LjcwMy00My44ODUsMC02MC41OTRsNzcuOTM2LTc3LjkzMmMxNC4xNC0xNC4xNDEsMzUuNzc5LTE2LjMwNiw1Mi4yMjYtNi41MTZsLTMyLjMwMiwzMi4zMDdcbiAgICAgICAgICBjLTcuNjA2LDcuNjA0LTcuNjA2LDE5LjkzOCwwLDI3LjU0MWM3LjYwNSw3LjYwNywxOS45MzcsNy42MDcsMjcuNTQxLDBsMzIuMzA2LTMyLjMwM1xuICAgICAgICAgIEMyMTguOTU5LDI1NC44MjgsMjE2Ljc5NSwyNzYuNDY5LDIwMi42NTMsMjkwLjYwNXogTTIzOC4zODIsMjA5LjE2OWwzMi4yOTktMzIuMzA2YzcuNjA4LTcuNjAyLDcuNjA4LTE5LjkzNSwwLTI3LjUzOFxuICAgICAgICAgIGMtNy42MDQtNy42MS0xOS45MzYtNy42MS0yNy41NDEtMC4wMDRsLTMyLjMwMywzMi4zMDNjLTkuNzkxLTE2LjQ0Ni03LjYyNy0zOC4wODcsNi41MTQtNTIuMjI2bDc3LjkzNS03Ny45MzVcbiAgICAgICAgICBjMTYuNzA3LTE2LjcwNyw0My44OS0xNi43MDcsNjAuNTk0LDBsMTIuNjY0LDEyLjY2NGMxNi43MDUsMTYuNzA1LDE2LjcwNSw0My44ODYsMCw2MC41OTFsLTc3LjkzNiw3Ny45MzdcbiAgICAgICAgICBDMjc2LjQ2OCwyMTYuNzk3LDI1NC44MjgsMjE4Ljk1OSwyMzguMzgyLDIwOS4xNjl6XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0zNDMuNDY2LDI2MS40NjVjLTQ1LjI4NywwLTgyLDM2LjcxMy04Miw4MnMzNi43MTMsODIsODIsODJjNDUuMjg2LDAsODItMzYuNzEzLDgyLTgyUzM4OC43NTMsMjYxLjQ2NSwzNDMuNDY2LDI2MS40NjV6XG4gICAgICAgICAgIE0zNzIuNTA1LDMzMy41NjRsLTU2LjA0Niw1Ni4xMDRjLTAuMjM5LDAuMjM4LTAuNTM2LDAuNDEtMC44NjIsMC40OTZsLTIyLjMxNSw1Ljg1Yy0wLjY0OSwwLjE2OC0xLjM0Ny0wLjAyLTEuODIyLTAuNDk0XG4gICAgICAgICAgYy0wLjQ3Ny0wLjQ3OS0wLjY2Ni0xLjE3Mi0wLjQ5Ni0xLjgyNGw1LjgyNi0yMi4zMThjMC4wODQtMC4zMjYsMC4yNTYtMC42MjcsMC40OTQtMC44NjNsNTYuMDQ3LTU2LjEwNFxuICAgICAgICAgIGMwLjc0Mi0wLjc0MiwxLjk0NS0wLjc0NCwyLjY4OC0wLjAwMmw0LjU0OCw0LjU0MWMwLjczOSwwLjc0LDAuNzQxLDEuOTQzLDAsMi42ODhsLTM3LjQzMywzNy40NzFsNC43MDksNC43MDNsMzcuNDM1LTM3LjQ3MVxuICAgICAgICAgIGMwLjczOS0wLjc0MiwxLjk0LTAuNzQyLDIuNjgyLTAuMDAybDQuNTUsNC41NDFDMzczLjI1LDMzMS42MTcsMzczLjI1LDMzMi44MjIsMzcyLjUwNSwzMzMuNTY0eiBNMzk1LjQ3MiwzMTAuNTc0bC0xNywxNy4wMThcbiAgICAgICAgICBjLTAuNzM5LDAuNzQ0LTEuOTQyLDAuNzQ0LTIuNjg1LDAuMDAybC0xNi40ODktMTYuNDc1Yy0wLjc0NC0wLjc0LTAuNzQ0LTEuOTQzLTAuMDAyLTIuNjg4bDE3LTE3LjAyXG4gICAgICAgICAgYzAuNzQxLTAuNzQsMS45NDQtMC43NCwyLjY4OC0wLjAwMmwxNi40ODcsMTYuNDc3QzM5Ni4yMTYsMzA4LjYyOSwzOTYuMjE2LDMwOS44MzIsMzk1LjQ3MiwzMTAuNTc0elwiIC8+XG4gICAgICAgICAgICAgICAgICA8L2c+XG4gICAgICAgICAgICAgICAgPC9nPlxuICAgICAgICAgICAgICA8L2c+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaW5rLWRyb3Bkb3duLW1lbnVcIiAqbmdJZj1cImlzTGlua0Ryb3Bkb3duT3BlblwiICNkcm9wZG93bj5cbiAgICAgICAgICAgICAgPGxhYmVsPnt7ICdFTkRQT0lOVCcgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnRW5kcG9pbnQnIH19OjwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwiYm9va1N1YnRleHQuZW5kcG9pbnRcIiAvPlxuXG4gICAgICAgICAgICAgIDxsYWJlbD57eyAnVkFSSUFCTEUnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ1ZhcmlhYmxlJyB9fTo8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cImJvb2tTdWJ0ZXh0LnZhcmlhYmxlXCIgLz5cblxuICAgICAgICAgICAgICA8bGFiZWw+e3sgJ0ZJRUxEJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdGaWVsZCcgfX06PC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgW25nTW9kZWxdPVwiZmllbGRBc1N0cmluZ1wiIChuZ01vZGVsQ2hhbmdlKT1cInVwZGF0ZUZpZWxkKCRldmVudClcIiAvPlxuXG4gICAgICAgICAgICAgIDxsYWJlbD57eyAnREVGQVVMVEZJRUxEJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdEZWZhdWx0IEZpZWxkJyB9fTo8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cImJvb2tTdWJ0ZXh0LmRlZmF1bHRGaWVsZFwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHByb3Agb2YgZ2V0UHJvcGVydGllcygpLmVsZW1lbnRQcm9wc1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICAgICAgICAgIDxsYWJlbCAqbmdJZj1cInByb3AudHlwZSAhPT0gJ2NoZWNrYm94JyAmJiBwcm9wLnR5cGUgIT09ICdzdWJRdWVzdGlvbidcIiBjbGFzcz1cInRleHQtc21cIj57eyAgcHJvcC5sYWJlbFBhdGggfCBueHRDdXN0b21UcmFuc2xhdGUgOiBwcm9wLmxhYmVsIFxuICAgICAgICAgICAgfX08L2xhYmVsPlxuXG4gICAgICAgICAgPCEtLSBUZXh0IElucHV0IC0tPlxuICAgICAgICAgIDxpbnB1dCAqbmdJZj1cInByb3AudHlwZSA9PT0gJ3RleHQnXCIgdHlwZT1cInRleHRcIiBbcGxhY2Vob2xkZXJdPVwicHJvcC5wbGFjZWhvbGRlclwiXG4gICAgICAgICAgICBbdmFsdWVdPVwiaGVhZGVyU2VsZWN0ID8gcGRmLnRpdGxlIDogKHNlbGVjdGVkRWxlbWVudD8udHlwZSA9PT0gJ1RhYmxlJyA/IChwcm9wLnRhcmdldEFycmF5ID8gZ2V0VmFsdWVCeUFycmF5UGF0aChwcm9wLnRhcmdldEFycmF5LCBwcm9wLnRhcmdldEFycmF5S2V5LCBzZWxlY3RDb2x1bW4sIHByb3Aua2V5ICkgOiBnZXRWYWx1ZUJ5UGF0aChwcm9wLmtleSkgKSA6ICBnZXRWYWx1ZUJ5UGF0aChwcm9wLmtleSkpXCJcbiAgICAgICAgICAgIChpbnB1dCk9XCJoZWFkZXJTZWxlY3QgPyB1cGRhdGVUaXRsZSgkZXZlbnQudGFyZ2V0LnZhbHVlKSA6IChzZWxlY3RlZEVsZW1lbnQ/LnR5cGUgPT09ICdUYWJsZScgPyAocHJvcC50YXJnZXRBcnJheSA/IHVwZGF0ZVZhbHVlQnlBcnJheVBhdGgocHJvcC50YXJnZXRBcnJheSwgcHJvcC50YXJnZXRBcnJheUtleSwgc2VsZWN0Q29sdW1uLCBwcm9wLmtleSwgJGV2ZW50KSA6IHNldFZhbHVlQnlQYXRoKHByb3Aua2V5LCAkZXZlbnQudGFyZ2V0LnZhbHVlKSApIDogc2V0VmFsdWVCeVBhdGgocHJvcC5rZXksICRldmVudC50YXJnZXQudmFsdWUpKVwiXG4gICAgICAgICAgICBbY2xhc3MucmVhZC1vbmx5XT1cInNlbGVjdGVkRWxlbWVudC5yZWFkT25seVwiIFtyZWFkb25seV09XCJzZWxlY3RlZEVsZW1lbnQucmVhZE9ubHlcIiAvPlxuXG4gICAgICAgICAgPCEtLSBxdWVzdGlvbk51bWJlciAtLT5cbiAgICAgICAgICA8aW5wdXQgKm5nSWY9XCJwcm9wLmtleSA9PT0gJ3F1ZXN0aW9uTnVtYmVyJ1wiIHR5cGU9XCJudW1iZXJcIiBbdmFsdWVdPVwic2VsZWN0ZWRFbGVtZW50LnF1ZXN0aW9uTnVtYmVyXCJcbiAgICAgICAgICAgIChpbnB1dCk9XCJzZXRWYWx1ZUJ5UGF0aCgncXVlc3Rpb25OdW1iZXInLCAkZXZlbnQudGFyZ2V0LnZhbHVlKVwiIC8+XG5cbiAgICAgICAgICA8IS0tIGZpbGUgLS0+XG4gICAgICAgICAgPCEtLSBBZGQgdGhpcyBpbnNpZGUgdGhlIGVsZW1lbnRQcm9wcyBsb29wIHdoZXJlIG90aGVyIGlucHV0cyBhcmUgcmVuZGVyZWQgLS0+XG4gICAgICAgICAgPHNlbGVjdCAqbmdJZj1cInByb3AudHlwZSA9PT0gJ3NlbGVjdCcgJiYgcHJvcC5rZXkgPT09ICdzdXBwb3J0VHlwZSdcIiBbdmFsdWVdPVwic2VsZWN0ZWRFbGVtZW50W3Byb3Aua2V5XVwiXG4gICAgICAgICAgICAoY2hhbmdlKT1cInNldFZhbHVlQnlQYXRoKHByb3Aua2V5LCAkZXZlbnQudGFyZ2V0LnZhbHVlKVwiPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPi0tLVNlbGVjdC0tLTwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIHByb3Aub3B0aW9uc1wiIFt2YWx1ZV09XCJvcHRpb24udmFsdWVcIj4ge3sgb3B0aW9uLmxhYmVsUGF0aCB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6IG9wdGlvbi5sYWJlbCAgfX0gPC9vcHRpb24+XG4gICAgICAgICAgPC9zZWxlY3Q+XG5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwicHJvcC50eXBlID09PSAnY2hlY2tib3gnXCI+XG5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICBbY2hlY2tlZF09XCJzZWxlY3RlZEVsZW1lbnQudHlwZSA9PT0gJ1RhYmxlJyA/IChwcm9wLnRhcmdldEFycmF5ID8gZ2V0VmFsdWVCeUFycmF5UGF0aChwcm9wLnRhcmdldEFycmF5LCBwcm9wLnRhcmdldEFycmF5S2V5LCBzZWxlY3RDb2x1bW4sIHByb3Aua2V5ICkgOiBnZXRWYWx1ZUJ5UGF0aChwcm9wLmtleSkgKTogIGdldFZhbHVlQnlQYXRoKHByb3Aua2V5KSBcIlxuICAgICAgICAgICAgICAoY2hhbmdlKT1cIiBzZWxlY3RlZEVsZW1lbnQudHlwZSA9PT0gJ1RhYmxlJyA/IChwcm9wLnRhcmdldEFycmF5ID8gdXBkYXRlVmFsdWVCeUFycmF5UGF0aChwcm9wLnRhcmdldEFycmF5LCBwcm9wLnRhcmdldEFycmF5S2V5LCBzZWxlY3RDb2x1bW4sIHByb3Aua2V5LCAkZXZlbnQpIDogb25Ub2dnbGVDaGFuZ2UocHJvcC5rZXksICRldmVudCkgKSA6IG9uVG9nZ2xlQ2hhbmdlKHByb3Aua2V5LCAkZXZlbnQpXCIgLz5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0b2dnbGUtbGFiZWxcIiBzdHlsZT1cInBhZGRpbmctbGVmdDogMTBweDtcIj57eyAgcHJvcC5sYWJlbFBhdGggfCBueHRDdXN0b21UcmFuc2xhdGUgOiBwcm9wLmxhYmVsICB9fTwvc3Bhbj5cblxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwhLS0gU0tTMjBNQVIyNSBTdWJxdWVzdGlvbiBUeXBlIC0tPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJwcm9wLnR5cGUgPT09ICdzdWJRdWVzdGlvbidcIj5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogcm93OyBnYXA6IDEwcHg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7XCI+XG4gICAgICAgICAgICAgIDxkaXY+e3sgIHByb3AubGFiZWxQYXRoIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogcHJvcC5sYWJlbCAgfX08L2Rpdj5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwic2VsZWN0ZWRFbGVtZW50LnR5cGUgPT09ICdUYWJsZScgPyAocHJvcC50YXJnZXRBcnJheSA/IGdldFZhbHVlQnlBcnJheVBhdGgocHJvcC50YXJnZXRBcnJheSwgcHJvcC50YXJnZXRBcnJheUtleSwgc2VsZWN0Q29sdW1uLCBwcm9wLmtleSApIDogZ2V0VmFsdWVCeVBhdGgocHJvcC5rZXkpICk6ICBnZXRWYWx1ZUJ5UGF0aChwcm9wLmtleSkgXCJcbiAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIiBzZWxlY3RlZEVsZW1lbnQudHlwZSA9PT0gJ1RhYmxlJyA/IChwcm9wLnRhcmdldEFycmF5ID8gdXBkYXRlVmFsdWVCeUFycmF5UGF0aChwcm9wLnRhcmdldEFycmF5LCBwcm9wLnRhcmdldEFycmF5S2V5LCBzZWxlY3RDb2x1bW4sIHByb3Aua2V5LCAkZXZlbnQpIDogb25Ub2dnbGVDaGFuZ2UocHJvcC5rZXksICRldmVudCkgKSA6IG9uVG9nZ2xlQ2hhbmdlKHByb3Aua2V5LCAkZXZlbnQpXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPCEtLSBTS1MyME1BUjI1IFJlbmRlciBzdWJxdWVzdGlvbnMgd2hlbiBjaGVja2JveCBpcyBjaGVja2VkIC0tPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAqbmdJZj1cInNlbGVjdGVkRWxlbWVudC50eXBlID09PSAnVGFibGUnID8gKHByb3AudGFyZ2V0QXJyYXkgPyBnZXRWYWx1ZUJ5QXJyYXlQYXRoKHByb3AudGFyZ2V0QXJyYXksIHByb3AudGFyZ2V0QXJyYXlLZXksIHNlbGVjdENvbHVtbiwgcHJvcC5rZXkgKSA6IGdldFZhbHVlQnlQYXRoKHByb3Aua2V5KSApOiAgZ2V0VmFsdWVCeVBhdGgocHJvcC5rZXkpXCI+XG4gICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHN1YlByb3Agb2YgcHJvcC5zdWJRdWVzdGlvblwiXG4gICAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiAjZTdmMmZmOyBwYWRkaW5nOiA4cHg7IGJvcmRlci1yYWRpdXM6IDRweDtcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7IHN1YlByb3AubGFiZWxQYXRoIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogc3ViUHJvcC5sYWJlbCB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic3ViUHJvcC50eXBlID09PSAnYXJyYXknXCI+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gSXRlcmF0ZSBvdmVyIGZpbHRlcmVkIGNvbHVtbnMgdG8gZGlzcGxheSBjaGVja2JveGVzIC0tPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgZmlsdGVyZWRDb2x1bW5zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cInN1YlByb3Aub3BlcmFuZHMgPyBzdWJQcm9wLm9wZXJhbmRzLmluY2x1ZGVzKGNvbHVtbi5hcGlOYW1lKSA6IGZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvbkNoZWNrYm94Q2hhbmdlKHN1YlByb3AudGFyZ2V0QXJyYXksc3ViUHJvcC50YXJnZXRBcnJheUtleSxzdWJQcm9wLmtleSwgY29sdW1uLmFwaU5hbWUsICRldmVudC50YXJnZXQuY2hlY2tlZClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGNvbHVtbi5hcGlOYW1lIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwhLS0gU0tTMjFNQVIyNSBOZXcgcmFkaW8gdHlwZSAtLT5cbiAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzdWJQcm9wLnR5cGUgPT09ICdyYWRpbydcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIGZpbHRlcmVkQ29sdW1uc1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwicmFkaW9cIiBbbmFtZV09XCJzdWJQcm9wLmtleVwiIFt2YWx1ZV09XCJjb2x1bW4uYXBpTmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImdldFZhbHVlQnlBcnJheVBhdGgoc3ViUHJvcC50YXJnZXRBcnJheSwgc3ViUHJvcC50YXJnZXRBcnJheUtleSwgc2VsZWN0Q29sdW1uLCBzdWJQcm9wLmtleSkgPT09IGNvbHVtbi5hcGlOYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvblJhZGlvQ2hhbmdlKHN1YlByb3AudGFyZ2V0QXJyYXksIHN1YlByb3AudGFyZ2V0QXJyYXlLZXksIHN1YlByb3Aua2V5LCBjb2x1bW4uYXBpTmFtZSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGNvbHVtbi5hcGlOYW1lIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwhLS0gU0tTMjBNQVIyNSBBZGQgbW9yZSBzdWJwcm9wZXJ0eSB0eXBlcyBhcyBuZWVkZWQgLS0+XG4gICAgICAgICAgICAgICAgICA8IS0tIEluc2lkZSB0aGUgc3ViUHJvcCBuZ0ZvciBsb29wIC0tPlxuICAgICAgICAgICAgICAgICAgPGlucHV0ICpuZ0lmPVwic3ViUHJvcC50eXBlID09PSAndGV4dCdcIiB0eXBlPVwidGV4dFwiIFtwbGFjZWhvbGRlcl09XCJzdWJQcm9wLnBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInNlbGVjdGVkRWxlbWVudC50eXBlID09PSAnVGFibGUnID8gKHN1YlByb3AudGFyZ2V0QXJyYXkgPyBnZXRWYWx1ZUJ5QXJyYXlQYXRoKHN1YlByb3AudGFyZ2V0QXJyYXksIHN1YlByb3AudGFyZ2V0QXJyYXlLZXksIHNlbGVjdENvbHVtbiwgc3ViUHJvcC5rZXkgKSA6IGdldFZhbHVlQnlQYXRoKHN1YlByb3Aua2V5KSApIDogZ2V0VmFsdWVCeVBhdGgoc3ViUHJvcC5rZXkpXCJcbiAgICAgICAgICAgICAgICAgICAgKGlucHV0KT1cInNlbGVjdGVkRWxlbWVudC50eXBlID09PSAnVGFibGUnID8gKHN1YlByb3AudGFyZ2V0QXJyYXkgPyB1cGRhdGVWYWx1ZUJ5QXJyYXlQYXRoKHN1YlByb3AudGFyZ2V0QXJyYXksIHN1YlByb3AudGFyZ2V0QXJyYXlLZXksIHNlbGVjdENvbHVtbiwgc3ViUHJvcC5rZXksICRldmVudCkgOiBzZXRWYWx1ZUJ5UGF0aChzdWJQcm9wLmtleSwgJGV2ZW50LnRhcmdldC52YWx1ZSkgKSA6IHNldFZhbHVlQnlQYXRoKHN1YlByb3Aua2V5LCAkZXZlbnQudGFyZ2V0LnZhbHVlKVwiIC8+XG5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCAqbmdJZj1cInN1YlByb3AudHlwZSA9PT0gJ2Jvb2xlYW4nXCIgdHlwZT1cImNoZWNrYm94XCIgW2NoZWNrZWRdPVwiZ2V0VmFsdWVCeVBhdGgoc3ViUHJvcC5rZXkpXCJcbiAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJzZXRWYWx1ZUJ5UGF0aChzdWJQcm9wLmtleSwgJGV2ZW50LnRhcmdldC5jaGVja2VkKVwiIC8+XG4gICAgICAgICAgICAgICAgICA8c2VsZWN0ICpuZ0lmPVwic3ViUHJvcC50eXBlID09PSAnc2VsZWN0J1wiIFt2YWx1ZV09XCJnZXRWYWx1ZUJ5UGF0aChzdWJQcm9wLmtleSlcIlxuICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInNldFZhbHVlQnlQYXRoKHN1YlByb3Aua2V5LCAkZXZlbnQudGFyZ2V0LnZhbHVlKVwiPlxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBvcHRpb24gb2Ygc3ViUHJvcC5vcHRpb25zXCIgW3ZhbHVlXT1cIm9wdGlvblwiPnt7IG9wdGlvbiB9fTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgKm5nSWY9XCJzdWJQcm9wLnR5cGUgPT09ICdjaGVja2JveCdcIiB0eXBlPVwiY2hlY2tib3hcIiBbY2hlY2tlZF09XCJnZXRWYWx1ZUJ5UGF0aChzdWJQcm9wLmtleSlcIlxuICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInNldFZhbHVlQnlQYXRoKHN1YlByb3Aua2V5LCAkZXZlbnQudGFyZ2V0LmNoZWNrZWQpXCIgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gU0tTMjBNQVIyNSBUZXh0IEFsaWduIEJ1dHRvbnMgLS0+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cInByb3AudHlwZSA9PT0gJ2FsaWduJ1wiPlxuICAgICAgICAgICAgPGJ1dHRvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIHByb3Aub3B0aW9uc1wiIChjbGljayk9XCJvbkFsaWduU2VsZWN0KG9wdGlvbi52YWx1ZSlcIlxuICAgICAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cInNlbGVjdGVkRWxlbWVudD8udGV4dEFsaWduID09PSBvcHRpb24udmFsdWVcIiBbdGl0bGVdPVwib3B0aW9uLnZhbHVlXCI+XG4gICAgICAgICAgICAgIDxpbWcgW3NyY109XCInLi4vYXNzZXRzL2ljb25zLycgKyBvcHRpb24uaWNvbiArICcuc3ZnJ1wiIFthbHRdPVwib3B0aW9uLnZhbHVlXCIgY2xhc3M9XCJpY29uLXNpemVcIiAvPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwicHJvcC50eXBlID09PSAnc3R5bGUnXCI+XG4gICAgICAgICAgICA8YnV0dG9uICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgcHJvcC5vcHRpb25zXCIgKGNsaWNrKT1cIm9uU3R5bGVTZWxlY3Qob3B0aW9uLnZhbHVlKVwiXG4gICAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiaXNTdHlsZUFjdGl2ZShvcHRpb24udmFsdWUpXCIgW3RpdGxlXT1cIm9wdGlvbi52YWx1ZVwiPlxuICAgICAgICAgICAgICA8aW1nIFtzcmNdPVwiJy4uL2Fzc2V0cy9pY29ucy8nICsgb3B0aW9uLmljb24gKyAnLnN2ZydcIiBbYWx0XT1cIm9wdGlvbi52YWx1ZVwiIGNsYXNzPVwiaWNvbi1zaXplXCIgLz5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPCEtLSBGaWVsZCBTaXplIENvbnRyb2xzIC0tPlxuICAgICAgICAgIDwhLS0gIENoYW5nZSBrZXkgd2lkdGggLS0+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cInByb3Aua2V5ID09PSAnd2lkdGgnXCIgW25nQ2xhc3NdPVwieydmbGV4LWNvbnRhaW5lcic6IHRydWUsICdjdXN0b20tYWN0aXZlJzogc2VsZWN0ZWRFbGVtZW50Py53aWR0aCAhPT0gJyonICYmIHNlbGVjdGVkRWxlbWVudD8ud2lkdGggIT09ICdhdXRvJ31cIj5cbiAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgY2xhc3M9XCJzaXplLXNlbGVjdFwiXG4gICAgICAgICAgICAgIFt2YWx1ZV09XCJzZWxlY3RlZEVsZW1lbnQ/LndpZHRoID09PSAnKicgPyAnRGVmYXVsdCcgOiBzZWxlY3RlZEVsZW1lbnQ/LndpZHRoID09PSAnYXV0bycgPyAnQXV0bycgOiAnQ3VzdG9tJ1wiXG4gICAgICAgICAgICAgIChjaGFuZ2UpPVwib25XaWR0aFNlbGVjdChcbiAgICAgICAgICAgICAgICAkZXZlbnQudGFyZ2V0LnZhbHVlID09PSAnRGVmYXVsdCcgPyAnKicgOlxuICAgICAgICAgICAgICAgICRldmVudC50YXJnZXQudmFsdWUgPT09ICdBdXRvJyA/ICdhdXRvJyA6ICdjdXN0b20nXG4gICAgICAgICAgICAgIClcIj5cbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIkRlZmF1bHRcIj57eyAnREVGQVVMVCcgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnRGVmYXVsdCcgfX08L29wdGlvbj5cbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIkF1dG9cIj57eyAnQVVUTycgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnQXV0bycgfX08L29wdGlvbj5cbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIkN1c3RvbVwiPnt7ICdDVVNUT00nIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ0N1c3RvbScgfX08L29wdGlvbj5cbiAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgIFxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICpuZ0lmPVwic2VsZWN0ZWRFbGVtZW50Py53aWR0aCAhPT0gJyonICYmIHNlbGVjdGVkRWxlbWVudD8ud2lkdGggIT09ICdhdXRvJ1wiXG4gICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICAgICAgICBjbGFzcz1cInNpemUtaW5wdXRcIlxuICAgICAgICAgICAgICBtaW49XCIxXCJcbiAgICAgICAgICAgICAgbWF4PVwiMTAwXCJcbiAgICAgICAgICAgICAgW3ZhbHVlXT1cInNlbGVjdGVkRWxlbWVudD8ud2lkdGhcIlxuICAgICAgICAgICAgICAoaW5wdXQpPVwic2V0VmFsdWVCeVBhdGgoXG4gICAgICAgICAgICAgICAgJ3dpZHRoJyxcbiAgICAgICAgICAgICAgICAkZXZlbnQudGFyZ2V0LnZhbHVlQXNOdW1iZXIgPCAxID8gMSA6XG4gICAgICAgICAgICAgICAgJGV2ZW50LnRhcmdldC52YWx1ZUFzTnVtYmVyID4gMTAwID8gMTAwIDpcbiAgICAgICAgICAgICAgICAkZXZlbnQudGFyZ2V0LnZhbHVlQXNOdW1iZXJcbiAgICAgICAgICAgICAgKVwiIC8+XG4gICAgICAgICAgPC9kaXY+ICAgICAgICAgICAgICAgICAgIFxuXG4gICAgICAgICAgPCEtLSAgTGluZSBQcm9wZXJ0aWVzIC0tPlxuICAgICAgICAgIDwhLS0gUGFkZGluZyBUb3AgLS0+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cInByb3Aua2V5ID09PSAncGFkZGluZ1RvcCdcIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgW3BsYWNlaG9sZGVyXT1cInByb3AucGxhY2Vob2xkZXJcIiBbdmFsdWVdPVwic2VsZWN0ZWRFbGVtZW50Py5wYWRkaW5nVG9wXCJcbiAgICAgICAgICAgICAgKGlucHV0KT1cInNldFZhbHVlQnlQYXRoKCdwYWRkaW5nVG9wJywgJGV2ZW50LnRhcmdldC52YWx1ZSlcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPCEtLSBQYWRkaW5nIEJvdHRvbSAtLT5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwicHJvcC5rZXkgPT09ICdwYWRkaW5nQm90dG9tJ1wiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBbcGxhY2Vob2xkZXJdPVwicHJvcC5wbGFjZWhvbGRlclwiIFt2YWx1ZV09XCJzZWxlY3RlZEVsZW1lbnQ/LnBhZGRpbmdCb3R0b21cIlxuICAgICAgICAgICAgICAoaW5wdXQpPVwic2V0VmFsdWVCeVBhdGgoJ3BhZGRpbmdCb3R0b20nLCAkZXZlbnQudGFyZ2V0LnZhbHVlKVwiIC8+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIExpbmUgU3R5bGUgLS0+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cInByb3Aua2V5ID09PSAnbGluZVN0eWxlJ1wiPlxuICAgICAgICAgICAgPHNlbGVjdCBbdmFsdWVdPVwic2VsZWN0ZWRFbGVtZW50Py5saW5lU3R5bGVcIiAoY2hhbmdlKT1cInNldFZhbHVlQnlQYXRoKCdsaW5lU3R5bGUnLCAkZXZlbnQudGFyZ2V0LnZhbHVlKVwiPlxuICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgcHJvcC5vcHRpb25zXCIgW3ZhbHVlXT1cIm9wdGlvblwiPnt7IG9wdGlvbiB9fTwvb3B0aW9uPlxuICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIENvbG9yIC0tPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJwcm9wLmtleSA9PT0gJ2NvbG9yJ1wiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjb2xvclwiIFt2YWx1ZV09XCJzZWxlY3RlZEVsZW1lbnQ/LmNvbG9yXCJcbiAgICAgICAgICAgICAgKGlucHV0KT1cInNldFZhbHVlQnlQYXRoKCdjb2xvcicsICRldmVudC50YXJnZXQudmFsdWUpXCIgLz5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cInRhYi1jb250ZW50XCIgKm5nSWY9XCJhY3RpdmVUYWIgPT09ICdwcm9wZXJ0eSdcIj5cbiAgICA8IS0tIEZpZWxkIEVsZW1lbnRzIFByb3BlcnRpZXMgLS0+XG4gICAgPCEtLSAgU2hvdyBlbGVtZW50cyBJRCAgLS0+XG4gICAgPGRpdiAqbmdJZj1cImdldFByb3BlcnRpZXMoKVwiPlxuICAgICAgPGxhYmVsPkxhYmVsIElkPC9sYWJlbD5cbiAgICAgIDxkaXZcbiAgICAgICAgc3R5bGU9XCJmb250LXNpemU6IDEzcHg7IHBhZGRpbmc6IDExcHg7IGJvcmRlci1yYWRpdXM6IDVweDsgYmFja2dyb3VuZC1jb2xvcjogI2Y4ZjhmODsgYm9yZGVyOiAxcHggc29saWQgI2RkZDtcIj5cbiAgICAgICAge3sgaGVhZGVyU2VsZWN0ID8gYm9va0lkIDogc2VsZWN0ZWRFbGVtZW50LmlkIH19PC9kaXY+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBwcm9wIG9mIGdldFByb3BlcnRpZXMoKS5maWVsZFByb3BzXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwidGV4dC1zbVwiPnt7ICBwcm9wLmxhYmVsUGF0aCB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6IHByb3AubGFiZWwgIH19PC9sYWJlbD5cblxuICAgICAgICAgIDwhLS0gU0tTMjFNQVIyNSBUb2dnbGUgR3JvdXAgLS0+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cInByb3AudHlwZSA9PT0gJ3RvZ2dsZUdyb3VwJ1wiIGNsYXNzPVwidG9nZ2xlLWdyb3VwXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidG9nZ2xlLWl0ZW1cIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwidG9nZ2xlLWxhYmVsXCI+XG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIC8+XG4gICAgICAgICAgICAgICAgRGlzYWJsZWRcbiAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPCEtLSAgLSBoYW5kbGVkIG9wdGlvbnMgd2l0aCBVVUlEIC0tPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICpuZ0lmPVwicHJvcC50eXBlID09PSAnZHJvcGRvd24nIHx8IHByb3AudHlwZSA9PT0gJ2NoZWNrYm94JyB8fCBwcm9wLnR5cGUgPT09ICdyYWRpbycgJiYgcHJvcC5rZXkgPT09ICdvcHRpb25zJ1wiXG4gICAgICAgICAgICBjbGFzcz1cIm9wdGlvbnMtY29udGFpbmVyXCI+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJvcHRpb24tbGlzdFwiIChkcmFnb3Zlcik9XCJvbkRyYWdPdmVyKCRldmVudClcIiAoZHJvcCk9XCJvbkRyb3AoJGV2ZW50LCBwcm9wLmtleSlcIj5cbiAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIHNlbGVjdGVkRWxlbWVudFtwcm9wLmtleV1cIiBjbGFzcz1cIm9wdGlvbi1pdGVtc1wiIFthdHRyLmRhdGEtaWRdPVwib3B0aW9uLmlkXCJcbiAgICAgICAgICAgICAgICBkcmFnZ2FibGU9XCJ0cnVlXCIgKGRyYWdzdGFydCk9XCJvbkRyYWdTdGFydCgkZXZlbnQsIG9wdGlvbi5pZClcIj5cblxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwib3B0aW9uLnZhbHVlXCIgcGxhY2Vob2xkZXI9XCJPcHRpb25cIiBjbGFzcz1cIm9wdGlvbnNcIiAvPlxuICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiLi4vYXNzZXRzL2ljb25zL1RyYXNoLnN2Z1wiIChjbGljayk9XCJyZW1vdmVPcHRpb24oc2VsZWN0ZWRFbGVtZW50W3Byb3Aua2V5XSwgb3B0aW9uLmlkKVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZHJhZy1oYW5kbGVcIj7imLA8L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cImFkZE9wdGlvbihzZWxlY3RlZEVsZW1lbnRbcHJvcC5rZXldKVwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWRkLXZhcmllbnRcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbGdcIj4rPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuPkFkZDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxpbnB1dCAqbmdJZj1cInByb3AudHlwZSA9PT0gJ3RleHQnXCIgdHlwZT1cInRleHRcIiBbcGxhY2Vob2xkZXJdPVwicHJvcC5wbGFjZWhvbGRlclwiXG4gICAgICAgICAgICBbdmFsdWVdPVwiaGVhZGVyU2VsZWN0ID8gcGRmLnRpdGxlIDogKHNlbGVjdGVkRWxlbWVudD8udHlwZSA9PT0gJ1RhYmxlJyA/IChwcm9wLnRhcmdldEFycmF5ID8gZ2V0VmFsdWVCeUFycmF5UGF0aChwcm9wLnRhcmdldEFycmF5LCBwcm9wLnRhcmdldEFycmF5S2V5LCBzZWxlY3RDb2x1bW4sIHByb3Aua2V5ICkgOiBnZXRWYWx1ZUJ5UGF0aChwcm9wLmtleSkgKSA6ICBnZXRWYWx1ZUJ5UGF0aChwcm9wLmtleSkpXCJcbiAgICAgICAgICAgIChpbnB1dCk9XCJoZWFkZXJTZWxlY3QgPyB1cGRhdGVUaXRsZSgkZXZlbnQudGFyZ2V0LnZhbHVlKSA6IChzZWxlY3RlZEVsZW1lbnQ/LnR5cGUgPT09ICdUYWJsZScgPyAocHJvcC50YXJnZXRBcnJheSA/IHVwZGF0ZVZhbHVlQnlBcnJheVBhdGgocHJvcC50YXJnZXRBcnJheSwgcHJvcC50YXJnZXRBcnJheUtleSwgc2VsZWN0Q29sdW1uLCBwcm9wLmtleSwgJGV2ZW50KSA6IHNldFZhbHVlQnlQYXRoKHByb3Aua2V5LCAkZXZlbnQudGFyZ2V0LnZhbHVlKSApIDogc2V0VmFsdWVCeVBhdGgocHJvcC5rZXksICRldmVudC50YXJnZXQudmFsdWUpKVwiXG4gICAgICAgICAgICBbY2xhc3MucmVhZC1vbmx5XT1cInNlbGVjdGVkRWxlbWVudC5yZWFkT25seVwiIFtyZWFkb25seV09XCJzZWxlY3RlZEVsZW1lbnQucmVhZE9ubHlcIiAvPlxuXG4gICAgICAgICAgPCEtLSBTdWIgUXVlc3Rpb25zIFRvZ2dsZSAtLT5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwicHJvcC50eXBlID09PSAnc3ViUXVlc3Rpb24nXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3R5bGUtdG9nZ2xlLWhlYWRlclwiIChjbGljayk9XCJ0b2dnbGVTdWJRdWVzdGlvbihwcm9wKVwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZC1lbGVtZW50c1wiPlN1YiBUZXh0PC9kaXY+XG4gICAgICAgICAgICAgIDxpbWcgW3NyY109XCJwcm9wLmlzRXhwYW5kZWQgPyAnLi4vYXNzZXRzL2ljb25zL2Fycm93LWRvd24uc3ZnJyA6ICcuLi9hc3NldHMvaWNvbnMvYXJyb3ctcmlnaHQuc3ZnJ1wiXG4gICAgICAgICAgICAgICAgYWx0PVwiVG9nZ2xlIEFycm93XCIgY2xhc3M9XCJhcnJvdy1pY29uXCI+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSBSZW5kZXIgc3VicXVlc3Rpb25zIHdoZW4gYXJyb3cgaXMgZG93biAtLT5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJwcm9wLmlzRXhwYW5kZWRcIiBzdHlsZT1cImJvcmRlcjogMXB4IHNvbGlkICNkZGQ7IHBhZGRpbmc6IDhweDsgYm9yZGVyLXJhZGl1czogNHB4O1wiPlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBzdWJQcm9wIG9mIHByb3Auc3ViUXVlc3Rpb25cIiBjbGFzcz1cInN1Yi1xdWVzdGlvbi1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7IHN1YlByb3AubGFiZWxQYXRoIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogc3ViUHJvcC5sYWJlbCB9fTwvbGFiZWw+XG5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCAqbmdJZj1cInN1YlByb3AudHlwZSA9PT0gJ3RleHQnXCIgdHlwZT1cInRleHRcIiBbcGxhY2Vob2xkZXJdPVwic3ViUHJvcC5wbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJnZXRWYWx1ZUJ5UGF0aChzdWJQcm9wLmtleSlcIiAoaW5wdXQpPVwic2V0VmFsdWVCeVBhdGgoc3ViUHJvcC5rZXksICRldmVudC50YXJnZXQudmFsdWUpXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICA8IS0tICBSZW5kZXIgaW5wdXQgZmllbGQgb25seSBpZiBzdWJQcm9wLnR5cGUgaXMgJ2FycmF5JyAtLT5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCAqbmdJZj1cInN1YlByb3AudHlwZSA9PT0gJ2FycmF5J1wiIHR5cGU9XCJ0ZXh0XCIgW3BsYWNlaG9sZGVyXT1cInN1YlByb3AucGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiZ2V0VmFsdWVCeVBhdGgoc3ViUHJvcC5rZXkpXCIgKGlucHV0KT1cInNldFZhbHVlQnlQYXRoKHN1YlByb3Aua2V5LCAkZXZlbnQudGFyZ2V0LnZhbHVlKVwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gPGlucHV0IHR5cGU9XCJ0ZXh0XCIgW25nTW9kZWxdPVwiZmllbGRBc1N0cmluZ1wiIChuZ01vZGVsQ2hhbmdlKT1cInVwZGF0ZUZpZWxkKCRldmVudClcIiAvPiAtLT5cblxuICAgICAgICAgICAgICAgICAgPGlucHV0ICpuZ0lmPVwic3ViUHJvcC50eXBlID09PSAnYm9vbGVhbidcIiB0eXBlPVwiY2hlY2tib3hcIiBbY2hlY2tlZF09XCJnZXRWYWx1ZUJ5UGF0aChzdWJQcm9wLmtleSlcIlxuICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInNldFZhbHVlQnlQYXRoKHN1YlByb3Aua2V5LCAkZXZlbnQudGFyZ2V0LmNoZWNrZWQpXCIgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJwcm9wLnR5cGUgPT09ICdjaGVja2JveCdcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidG9nZ2xlLWxhYmVsXCIgc3R5bGU9XCJwYWRkaW5nLXJpZ2h0OiAxMHB4O1wiPnt7ICBwcm9wLmxhYmVsUGF0aCB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6IHByb3AubGFiZWwgIH19PC9zcGFuPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgIFtjaGVja2VkXT1cInNlbGVjdGVkRWxlbWVudC50eXBlID09PSAnVGFibGUnID8gKHByb3AudGFyZ2V0QXJyYXkgPyBnZXRWYWx1ZUJ5QXJyYXlQYXRoKHByb3AudGFyZ2V0QXJyYXksIHByb3AudGFyZ2V0QXJyYXlLZXksIHNlbGVjdENvbHVtbiwgcHJvcC5rZXkgKSA6IGdldFZhbHVlQnlQYXRoKHByb3Aua2V5KSApOiAgZ2V0VmFsdWVCeVBhdGgocHJvcC5rZXkpIFwiXG4gICAgICAgICAgICAgIChjaGFuZ2UpPVwiIHNlbGVjdGVkRWxlbWVudC50eXBlID09PSAnVGFibGUnID8gKHByb3AudGFyZ2V0QXJyYXkgPyB1cGRhdGVWYWx1ZUJ5QXJyYXlQYXRoKHByb3AudGFyZ2V0QXJyYXksIHByb3AudGFyZ2V0QXJyYXlLZXksIHNlbGVjdENvbHVtbiwgcHJvcC5rZXksICRldmVudCkgOiBvblRvZ2dsZUNoYW5nZShwcm9wLmtleSwgJGV2ZW50KSApIDogb25Ub2dnbGVDaGFuZ2UocHJvcC5rZXksICRldmVudClcIiAvPlxuXG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBTS1MyMU1BUjI1IE1vdmUgU3R5bGUgT3V0c2lkZSB0aGUgTG9vcCAtLT5cbiAgICAgIDwhLS0gU3R5bGUgVG9nZ2xlIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInN0eWxlLXRvZ2dsZS1oZWFkZXJcIiAoY2xpY2spPVwidG9nZ2xlU3R5bGVTZWN0aW9uKClcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImhlYWQtZWxlbWVudHNcIj5TdHlsZTwvZGl2PlxuICAgICAgICA8aW1nIFtzcmNdPVwiaXNTdHlsZUV4cGFuZGVkID8gJy4uL2Fzc2V0cy9pY29ucy9hcnJvdy1kb3duLnN2ZycgOiAnLi4vYXNzZXRzL2ljb25zL2Fycm93LXJpZ2h0LnN2ZydcIlxuICAgICAgICAgIGFsdD1cIlRvZ2dsZSBBcnJvd1wiIGNsYXNzPVwiYXJyb3ctaWNvblwiPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgKm5nSWY9XCJpc1N0eWxlRXhwYW5kZWRcIiBzdHlsZT1cImJvcmRlcjogMXB4IHNvbGlkICNkZGQ7IHBhZGRpbmc6IDhweDsgYm9yZGVyLXJhZGl1czogNHB4O1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGtleSBvZiBnZXRTdHlsZUtleXMoKVwiPlxuICAgICAgICAgICAgPGxhYmVsPnt7IGtleSB9fTwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cInNlbGVjdGVkRWxlbWVudC5zdHlsZVtrZXldXCJcbiAgICAgICAgICAgICAgKGlucHV0KT1cInNldFZhbHVlQnlQYXRoKCdzdHlsZS4nICsga2V5LCAkZXZlbnQudGFyZ2V0LnZhbHVlKVwiIHBsYWNlaG9sZGVyPVwiRW50ZXIge3sga2V5IH19XCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cInRhYi1jb250ZW50XCIgKm5nSWY9XCJhY3RpdmVUYWIgPT09ICdhcHBlYXJhbmNlJ1wiPlxuICAgIDxkaXYgKm5nSWY9XCJnZXRQcm9wZXJ0aWVzKClcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHByb3Agb2YgZ2V0UHJvcGVydGllcygpLmFwcGVhcmFuY2VcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJ0ZXh0LXNtXCI+e3sgIHByb3AubGFiZWxQYXRoIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogcHJvcC5sYWJlbCAgfX08L2xhYmVsPlxuICAgICAgICAgIDwhLS0gRm9udCBTZWxlY3Rpb24gLS0+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cInByb3Aua2V5ID09PSAnZm9udCdcIj5cbiAgICAgICAgICAgIDxzZWxlY3QgKm5nSWY9XCJwcm9wLnR5cGUgPT09ICdzZWxlY3QnXCIgY2xhc3M9XCJzZWxlY3QtY29udGFpbmVyXCIgWyhuZ01vZGVsKV09XCJzZWxlY3RlZEVsZW1lbnQuZm9udFwiXG4gICAgICAgICAgICAgIChjaGFuZ2UpPVwic2V0VmFsdWVCeVBhdGgoJ2ZvbnQnLCAkZXZlbnQudGFyZ2V0LnZhbHVlKVwiPlxuICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgcHJvcC5vcHRpb25zXCIgW3ZhbHVlXT1cIm9wdGlvblwiPlxuICAgICAgICAgICAgICAgIHt7IG9wdGlvbiB9fVxuICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwhLS0gSW5wdXQgQm94IC0tPlxuICAgICAgICAgIDxpbnB1dCAqbmdJZj1cInByb3AudHlwZSA9PT0gJ3RleHQnXCIgdHlwZT1cInRleHRcIiBbcGxhY2Vob2xkZXJdPVwicHJvcC5wbGFjZWhvbGRlclwiXG4gICAgICAgICAgICBbdmFsdWVdPVwic2VsZWN0ZWRFbGVtZW50W3Byb3Aua2V5XVwiIChpbnB1dCk9XCJzZXRWYWx1ZUJ5UGF0aChwcm9wLmtleSwgJGV2ZW50LnRhcmdldC52YWx1ZSlcIiAvPlxuXG4gICAgICAgICAgPCEtLSBGb250IFNpemUgLS0+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cInByb3Aua2V5ID09PSAnZm9udFNpemUnICYmIHByb3AudHlwZSA9PT0gJ251bWJlcidcIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgbWluPVwiMVwiIG1heD1cIjEwMFwiIHN0ZXA9XCIxXCJcbiAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwic2VsZWN0ZWRFbGVtZW50LmZvbnRTaXplXCJcbiAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwic2V0VmFsdWVCeVBhdGgoJ2ZvbnRTaXplJywgc2VsZWN0ZWRFbGVtZW50LmZvbnRTaXplKVwiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPCEtLSBGb250IFdlaWdodCBTZWxlY3Rpb24gLS0+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cInByb3Aua2V5ID09PSAnZm9udFdlaWdodCdcIj5cbiAgICAgICAgICAgIDxzZWxlY3QgKm5nSWY9XCJwcm9wLnR5cGUgPT09ICdzZWxlY3QnXCIgWyhuZ01vZGVsKV09XCJzZWxlY3RlZEVsZW1lbnRbcHJvcC5rZXldXCJcbiAgICAgICAgICAgICAgKGNoYW5nZSk9XCJzZXRWYWx1ZUJ5UGF0aChwcm9wLmtleSwgJGV2ZW50LnRhcmdldC52YWx1ZSlcIj5cbiAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIHByb3Aub3B0aW9uc1wiIFt2YWx1ZV09XCJvcHRpb24udmFsdWVcIj5cbiAgICAgICAgICAgICAgICB7eyBvcHRpb24ubGFiZWxQYXRoIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogb3B0aW9uLmxhYmVsICB9fVxuICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8IS0tIERyb3Bkb3duIEJveCAtLT5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJwcm9wLnR5cGUgPT09ICdkcm9wZG93bidcIiBjbGFzcz1cImlucHV0LWJveC1maWVsZFwiPlxuICAgICAgICAgICAgICA8c2VsZWN0IFsobmdNb2RlbCldPVwic2VsZWN0ZWRFbGVtZW50W3Byb3Aua2V5XVwiIChjaGFuZ2UpPVwic2V0VmFsdWVCeVBhdGgocHJvcC5rZXksICRldmVudC50YXJnZXQudmFsdWUpXCI+XG4gICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIHByb3Aub3B0aW9uc1wiIFt2YWx1ZV09XCJvcHRpb25cIj5cbiAgICAgICAgICAgICAgICAgIHt7IG9wdGlvbiB9fVxuICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIENvbG9yIFBpY2tlciAtLT5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJwcm9wLnR5cGUgPT09ICdjb2xvcidcIiBjbGFzcz1cImNvbG9yLXNlbGVjdG9yXCI+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY29sb3JcIiBbKG5nTW9kZWwpXT1cInNlbGVjdGVkRWxlbWVudC5mb250Q29sb3JcIlxuICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwic2V0VmFsdWVCeVBhdGgoJ2ZvbnRDb2xvcicsICRldmVudC50YXJnZXQudmFsdWUpXCI+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSBIRVggSW5wdXQgQm94IC0tPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInByb3AudHlwZSA9PT0gJ2NvbG9yJ1wiIGNsYXNzPVwiaGV4LWlucHV0LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICA8c3Bhbj5IRVggQ29kZTwvc3Bhbj5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJzZWxlY3RlZEVsZW1lbnRbcHJvcC5rZXldXCJcbiAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInNldFZhbHVlQnlQYXRoKHByb3Aua2V5LCAkZXZlbnQudGFyZ2V0LnZhbHVlKVwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gRm9udCBTdHlsZSAtLT5cbjxkaXYgKm5nSWY9XCJwcm9wLmtleSA9PT0gJ2ZvbnRTdHlsZSdcIj5cbiAgPHNlbGVjdCBbKG5nTW9kZWwpXT1cInNlbGVjdGVkRWxlbWVudC5mb250U3R5bGVcIlxuICAgICAgICAgIChjaGFuZ2UpPVwic2V0VmFsdWVCeVBhdGgoJ2ZvbnRTdHlsZScsICRldmVudC50YXJnZXQudmFsdWUpXCI+XG4gICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIHByb3Aub3B0aW9uc1wiIFt2YWx1ZV09XCJvcHRpb24udmFsdWVcIj5cbiAgICAgIHt7IG9wdGlvbi5sYWJlbFBhdGggfCBueHRDdXN0b21UcmFuc2xhdGUgOiBvcHRpb24ubGFiZWwgIH19XG4gICAgPC9vcHRpb24+XG4gIDwvc2VsZWN0PlxuPC9kaXY+XG5cbjwhLS0gbWFyZ2luOiBbMCwgMTAsIDAsIDBdIC8vIFsgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tIF0gLS0+XG48ZGl2ICpuZ0lmPVwicHJvcC5rZXkgPT09ICdtYXJnaW4nJiYgc2VsZWN0ZWRFbGVtZW50Py5tYXJnaW5cIj5cbiAgPGRpdiBjbGFzcz1cIm1hcmdpbi1pbnB1dHNcIj5cbiAgICA8ZGl2PlxuICAgICAgPGxhYmVsPlJpZ2h0PC9sYWJlbD5cbiAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgWyhuZ01vZGVsKV09XCJzZWxlY3RlZEVsZW1lbnQubWFyZ2luWzFdXCJcbiAgICAgICAgICAgICAoY2hhbmdlKT1cInNldFZhbHVlQnlQYXRoKCdtYXJnaW4nLCBzZWxlY3RlZEVsZW1lbnQubWFyZ2luKVwiIC8+XG4gICAgPC9kaXY+XG4gICAgPGRpdj5cbiAgICAgIDxsYWJlbD5Cb3R0b208L2xhYmVsPlxuICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBbKG5nTW9kZWwpXT1cInNlbGVjdGVkRWxlbWVudC5tYXJnaW5bMl1cIlxuICAgICAgICAgICAgIChjaGFuZ2UpPVwic2V0VmFsdWVCeVBhdGgoJ21hcmdpbicsIHNlbGVjdGVkRWxlbWVudC5tYXJnaW4pXCIgLz5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2PlxuICAgICAgPGxhYmVsPkxlZnQ8L2xhYmVsPlxuICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBbKG5nTW9kZWwpXT1cInNlbGVjdGVkRWxlbWVudC5tYXJnaW5bM11cIlxuICAgICAgICAgICAgIChjaGFuZ2UpPVwic2V0VmFsdWVCeVBhdGgoJ21hcmdpbicsIHNlbGVjdGVkRWxlbWVudC5tYXJnaW4pXCIgLz5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2PlxuICAgICAgPGxhYmVsPlRvcDwvbGFiZWw+XG4gICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIFsobmdNb2RlbCldPVwic2VsZWN0ZWRFbGVtZW50Lm1hcmdpblswXVwiXG4gICAgICAgICAgICAgKGNoYW5nZSk9XCJzZXRWYWx1ZUJ5UGF0aCgnbWFyZ2luJywgc2VsZWN0ZWRFbGVtZW50Lm1hcmdpbilcIiAvPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuXG4gICAgICAgICAgPCEtLSBUZXh0QWxpZ24gLS0+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cInByb3Aua2V5ID09PSAnYWxpZ25JdGVtcydcIj5cbiAgICAgICAgICAgIDxzZWxlY3QgWyhuZ01vZGVsKV09XCJzZWxlY3RlZEVsZW1lbnQuYWxpZ25JdGVtc1wiXG4gICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwic2V0VmFsdWVCeVBhdGgoJ2FsaWduSXRlbXMnLCAkZXZlbnQudGFyZ2V0LnZhbHVlKVwiPlxuICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgcHJvcC5vcHRpb25zXCIgW3ZhbHVlXT1cIm9wdGlvbi52YWx1ZVwiPlxuICAgICAgICAgICAgICAgIHt7IG9wdGlvbi5sYWJlbFBhdGggfCBueHRDdXN0b21UcmFuc2xhdGUgOiBvcHRpb24ubGFiZWwgIH19XG4gICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgPC9kaXY+ICAgICAgICAgIFxuXG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG48IS0tIERlZmF1bHQgU2F2ZSBCdXR0b24gLS0+XG48ZGl2IGNsYXNzPVwiYnV0dG9uLWNvbnRhaW5lclwiICpuZ0lmPVwiIXRlbXBsYXRlU2VsZWN0ZWRcIj5cbiAgPGJ1dHRvbiBjbGFzcz1cImNhbmNlbC1idG5cIiAoY2xpY2spPVwib25DYW5jZWwoKVwiPkNhbmNlbDwvYnV0dG9uPlxuICA8YnV0dG9uIGNsYXNzPVwic2F2ZS1idG5cIiAoY2xpY2spPVwiaGFuZGxlQnV0dG9uQ2xpY2soKVwiPlNhdmU8L2J1dHRvbj5cbjwvZGl2PlxuPC9kaXY+XG4iXX0=
|