@rangertechnologies/ngnxt 2.1.254 → 2.1.255
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/fesm2022/rangertechnologies-ngnxt.mjs +138 -169
- package/fesm2022/rangertechnologies-ngnxt.mjs.map +1 -1
- package/lib/components/pick-location/pick-location.component.d.ts +0 -1
- package/package.json +4 -6
- package/rangertechnologies-ngnxt-2.1.255.tgz +0 -0
- package/esm2022/environments/version.mjs +0 -15
- package/esm2022/lib/components/button/nxt-button.component.mjs +0 -154
- package/esm2022/lib/components/custom-calendar/custom-calendar.component.mjs +0 -360
- package/esm2022/lib/components/custom-dropdown/custom-dropdown.component.mjs +0 -263
- package/esm2022/lib/components/custom-model/custom-model.component.mjs +0 -53
- package/esm2022/lib/components/custom-radio/custom-radio.component.mjs +0 -158
- package/esm2022/lib/components/datatable/datatable.component.mjs +0 -1744
- package/esm2022/lib/components/file-upload/file-upload.component.mjs +0 -292
- package/esm2022/lib/components/icon-selector/icon-selector.component.mjs +0 -106
- package/esm2022/lib/components/image-cropper/component/cropper.state.mjs +0 -208
- package/esm2022/lib/components/image-cropper/component/image-cropper.component.mjs +0 -562
- package/esm2022/lib/components/image-cropper/interfaces/basic-event.interface.mjs +0 -2
- package/esm2022/lib/components/image-cropper/interfaces/cropper-options.interface.mjs +0 -2
- package/esm2022/lib/components/image-cropper/interfaces/cropper-position.interface.mjs +0 -2
- package/esm2022/lib/components/image-cropper/interfaces/dimensions.interface.mjs +0 -2
- package/esm2022/lib/components/image-cropper/interfaces/exif-transform.interface.mjs +0 -2
- package/esm2022/lib/components/image-cropper/interfaces/image-cropped-event.interface.mjs +0 -2
- package/esm2022/lib/components/image-cropper/interfaces/image-transform.interface.mjs +0 -2
- package/esm2022/lib/components/image-cropper/interfaces/index.mjs +0 -2
- package/esm2022/lib/components/image-cropper/interfaces/loaded-image.interface.mjs +0 -2
- package/esm2022/lib/components/image-cropper/interfaces/move-start.interface.mjs +0 -8
- package/esm2022/lib/components/image-cropper/services/crop.service.mjs +0 -139
- package/esm2022/lib/components/image-cropper/services/load-image.service.mjs +0 -194
- package/esm2022/lib/components/image-cropper/utils/cropper-position.utils.mjs +0 -239
- package/esm2022/lib/components/image-cropper/utils/exif.utils.mjs +0 -79
- package/esm2022/lib/components/image-cropper/utils/keyboard.utils.mjs +0 -40
- package/esm2022/lib/components/image-cropper/utils/percentage.utils.mjs +0 -4
- package/esm2022/lib/components/image-cropper/utils/resize.utils.mjs +0 -75
- package/esm2022/lib/components/list-view-filter/list-view-filter.component.mjs +0 -392
- package/esm2022/lib/components/nxt-input/nxt-input.component.mjs +0 -2972
- package/esm2022/lib/components/pagination/pagination.component.mjs +0 -105
- package/esm2022/lib/components/pick-location/pick-location.component.mjs +0 -220
- package/esm2022/lib/components/search-box/search-box.component.mjs +0 -470
- package/esm2022/lib/country.json +0 -43237
- package/esm2022/lib/interfaces/actionMeta.mjs +0 -2
- package/esm2022/lib/interfaces/dependencyMeta.mjs +0 -2
- package/esm2022/lib/model/bookletWrapper.mjs +0 -7
- package/esm2022/lib/model/changeWrapper.mjs +0 -10
- package/esm2022/lib/model/errorWrapper.mjs +0 -6
- package/esm2022/lib/nxt-app.component.mjs +0 -22
- package/esm2022/lib/nxt-app.module.mjs +0 -115
- package/esm2022/lib/nxt-app.service.mjs +0 -14
- package/esm2022/lib/pages/booklet/booklet.component.mjs +0 -616
- package/esm2022/lib/pages/builder/element/element.component.mjs +0 -483
- package/esm2022/lib/pages/builder/form/form.component.mjs +0 -48
- package/esm2022/lib/pages/builder/properties/common-fields.constants.mjs +0 -97
- package/esm2022/lib/pages/builder/properties/properties.component.mjs +0 -1121
- package/esm2022/lib/pages/builder/templates/templates.component.mjs +0 -35
- package/esm2022/lib/pages/pdfDesigner/pdf-designer/pdf-designer.component.mjs +0 -639
- package/esm2022/lib/pages/pdfDesigner/pdf-properties/pdf-properties.component.mjs +0 -1114
- package/esm2022/lib/pages/questionbook/questionbook.component.mjs +0 -784
- package/esm2022/lib/pages/questionnaire/questionnaire.component.mjs +0 -2206
- package/esm2022/lib/pipe/button-styles.pipe.mjs +0 -26
- package/esm2022/lib/pipe/custom-translate.pipe.mjs +0 -37
- package/esm2022/lib/pipe/get-value.pipe.mjs +0 -54
- package/esm2022/lib/pipe/question-by-row.pipe.mjs +0 -51
- package/esm2022/lib/pipe/search-filter/search-filter.pipe.mjs +0 -40
- package/esm2022/lib/pipe/svg/svg.pipe.mjs +0 -26
- package/esm2022/lib/sample.mjs +0 -3715
- package/esm2022/lib/services/change/change.service.mjs +0 -46
- package/esm2022/lib/services/country/country.service.mjs +0 -135
- package/esm2022/lib/services/data/data.service.mjs +0 -100
- package/esm2022/lib/services/form-builder/form-builder.service.mjs +0 -474
- package/esm2022/lib/services/pdf-designer/pdf-designer.service.mjs +0 -395
- package/esm2022/lib/services/salesforce/salesforce.service.mjs +0 -41
- package/esm2022/lib/services/shared/shared.service.mjs +0 -100
- package/esm2022/lib/services/storage/storage.service.mjs +0 -59
- package/esm2022/lib/services/template/template.service.mjs +0 -335
- package/esm2022/lib/services/translation/translation.service.mjs +0 -121
- package/esm2022/lib/wrapper.mjs +0 -175
- package/esm2022/public-api.mjs +0 -22
- package/esm2022/rangertechnologies-ngnxt.mjs +0 -5
- package/rangertechnologies-ngnxt-2.1.254.tgz +0 -0
|
@@ -1,1114 +0,0 @@
|
|
|
1
|
-
import { Component, EventEmitter, HostListener, Input, Output, ViewChild } from '@angular/core';
|
|
2
|
-
import { v4 as uuidv4 } from 'uuid';
|
|
3
|
-
import { CommonModule } from '@angular/common';
|
|
4
|
-
import { FormsModule } from '@angular/forms';
|
|
5
|
-
import { NxtSearchBox } from '../../../components/search-box/search-box.component';
|
|
6
|
-
import { ImageCropperComponent } from '../../../components/image-cropper/component/image-cropper.component';
|
|
7
|
-
import { NxtCustomTranslatePipe } from '../../../pipe/custom-translate.pipe';
|
|
8
|
-
import * as i0 from "@angular/core";
|
|
9
|
-
import * as i1 from "@angular/common/http";
|
|
10
|
-
import * as i2 from "../../../services/pdf-designer/pdf-designer.service";
|
|
11
|
-
import * as i3 from "../../../services/template/template.service";
|
|
12
|
-
import * as i4 from "@angular/common";
|
|
13
|
-
import * as i5 from "@angular/forms";
|
|
14
|
-
export class PdfPropertiesComponent {
|
|
15
|
-
http;
|
|
16
|
-
pdfDesignerService;
|
|
17
|
-
templateService;
|
|
18
|
-
formButtonHandler = new EventEmitter();
|
|
19
|
-
templateSaveHandler = new EventEmitter();
|
|
20
|
-
selectedOption = '';
|
|
21
|
-
selectedElementIndex = -1;
|
|
22
|
-
selectedElementType = '';
|
|
23
|
-
selectedAlign = 'align-left'; // Add this property
|
|
24
|
-
selectedStyles = []; // Using array since multiple styles can be selected
|
|
25
|
-
selectedElement = null; // Receive the selected element
|
|
26
|
-
headerSelect = false;
|
|
27
|
-
bookId;
|
|
28
|
-
pdf;
|
|
29
|
-
activeTab = 'attributes';
|
|
30
|
-
selectColumn;
|
|
31
|
-
transform = {
|
|
32
|
-
translateUnit: 'px',
|
|
33
|
-
scale: 1,
|
|
34
|
-
rotate: 0,
|
|
35
|
-
flipH: false,
|
|
36
|
-
flipV: false,
|
|
37
|
-
translateH: 0,
|
|
38
|
-
translateV: 0
|
|
39
|
-
};
|
|
40
|
-
canvasRotation = 0;
|
|
41
|
-
cropper;
|
|
42
|
-
loading = false;
|
|
43
|
-
cropperMaxHeight = 0;
|
|
44
|
-
cropperMaxWidth = 0;
|
|
45
|
-
cropperMinHeight = 0;
|
|
46
|
-
cropperMinWidth = 0;
|
|
47
|
-
cropperStaticWidth = 0;
|
|
48
|
-
cropperStaticHeight = 0;
|
|
49
|
-
aspectRatio = 4 / 3;
|
|
50
|
-
roundCropper = false;
|
|
51
|
-
imageChangedEvent = null;
|
|
52
|
-
alignImage = 'center';
|
|
53
|
-
// "endpoint": "https://dev-api.valarhr.com/nxt",
|
|
54
|
-
// SKS28MAR25 default pdf search endpoint
|
|
55
|
-
bookSubtext = {
|
|
56
|
-
"endpoint": "https://05dbd231-cf43-4d11-bd24-d8ea71a45828.mock.pstmn.io",
|
|
57
|
-
"variable": null,
|
|
58
|
-
"field": ['title'],
|
|
59
|
-
"defaultField": "title"
|
|
60
|
-
};
|
|
61
|
-
isLinkDropdownOpen = false;
|
|
62
|
-
fieldAsString = '';
|
|
63
|
-
filteredColumns = [];
|
|
64
|
-
templateSelected = false;
|
|
65
|
-
dropdown;
|
|
66
|
-
draggedId = null;
|
|
67
|
-
pdfElements = [];
|
|
68
|
-
unique_id = 'pdf-1234'; // should be consistent
|
|
69
|
-
selectedTemplate;
|
|
70
|
-
elementProperties = {
|
|
71
|
-
// AP-10MAR25 - Defines the Header element with a text input field
|
|
72
|
-
// AP-25MAR25 Add subtext all variables
|
|
73
|
-
'Header': {
|
|
74
|
-
elementProps: [
|
|
75
|
-
{ label: 'Label', labelPath: 'LABEL', placeholder: 'Enter Text', type: 'text', key: 'title' }
|
|
76
|
-
],
|
|
77
|
-
},
|
|
78
|
-
'text': {
|
|
79
|
-
elementProps: [
|
|
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' },
|
|
83
|
-
],
|
|
84
|
-
fieldProps: [
|
|
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' },
|
|
89
|
-
{
|
|
90
|
-
label: '', labelPath: 'SUBTEXT', placeholder: 'Enter Text', type: 'subQuestion', key: 'isSubText',
|
|
91
|
-
subQuestion: []
|
|
92
|
-
}
|
|
93
|
-
],
|
|
94
|
-
appearance: [
|
|
95
|
-
{
|
|
96
|
-
label: 'Select Font', labelPath: 'SELECTFONT', type: 'select', key: 'font', placeholder: 'Left',
|
|
97
|
-
options: ['Helvetica Neue', 'Arial', 'Times New Roman', 'Roboto']
|
|
98
|
-
},
|
|
99
|
-
{ label: 'Font Color', labelPath: 'FONTCOLOR', type: 'color', key: 'fontColor', value: '' },
|
|
100
|
-
{
|
|
101
|
-
label: 'Font Size', labelPath: 'FONTSIZE', type: 'number', key: 'fontSize', value: 14
|
|
102
|
-
},
|
|
103
|
-
{
|
|
104
|
-
label: 'Font Weight', labelPath: 'FONTWEIGHT', type: 'select', key: 'fontWeight', value: '',
|
|
105
|
-
options: [
|
|
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' }
|
|
110
|
-
]
|
|
111
|
-
},
|
|
112
|
-
{
|
|
113
|
-
label: 'Font Style', labelPath: 'FONTSTYLE', type: 'select', key: 'fontStyle', value: '',
|
|
114
|
-
options: [
|
|
115
|
-
{ label: 'Normal', labelPath: 'FONTSTYLE_NORMAL', value: 'normal' },
|
|
116
|
-
{ label: 'Bold', labelPath: 'FONTSTYLE_BOLD', value: 'bold' },
|
|
117
|
-
{ label: 'Italic', labelPath: 'FONTSTYLE_ITALIC', value: 'italic' }
|
|
118
|
-
]
|
|
119
|
-
},
|
|
120
|
-
{
|
|
121
|
-
label: 'Margin', labelPath: 'MARGIN', type: 'marginPicker', key: 'margin',
|
|
122
|
-
placeholder: 'Left, Top, Right, Bottom', value: [0, 0, 0, 0]
|
|
123
|
-
},
|
|
124
|
-
{
|
|
125
|
-
label: 'Align Item', labelPath: 'ALIGNITEM', type: 'select', key: 'alignItems', value: '',
|
|
126
|
-
options: [
|
|
127
|
-
{ label: 'Left', labelPath: 'ALIGNITEM_LEFT', value: 'left' },
|
|
128
|
-
{ label: 'Center', labelPath: 'ALIGNITEM_CENTER', value: 'center' },
|
|
129
|
-
{ label: 'Right', labelPath: 'ALIGNITEM_RIGHT', value: 'right' }
|
|
130
|
-
]
|
|
131
|
-
}
|
|
132
|
-
]
|
|
133
|
-
},
|
|
134
|
-
'input': {
|
|
135
|
-
elementProps: [
|
|
136
|
-
{ label: 'Place Holder', placeholder: 'Enter Text', type: 'text', key: 'question' },
|
|
137
|
-
{ label: 'Element', type: 'number', key: 'questionNumber' },
|
|
138
|
-
{ label: 'width', type: 'fieldSize', key: 'width' },
|
|
139
|
-
],
|
|
140
|
-
fieldProps: [
|
|
141
|
-
{ label: '', type: 'toggleGroup', key: 'toggleOptions' },
|
|
142
|
-
{ label: 'Help Text', placeholder: 'Enter Text ', type: 'text' },
|
|
143
|
-
{ label: 'Value', placeholder: 'Enter Text ', type: 'text', key: 'value' },
|
|
144
|
-
{ label: 'Reference Field', placeholder: 'Reference Field', type: 'text', key: 'referenceField' },
|
|
145
|
-
{
|
|
146
|
-
"label": "", "placeholder": "Enter Text", "type": "subQuestion", "key": "isSubText",
|
|
147
|
-
"subQuestion": []
|
|
148
|
-
}
|
|
149
|
-
],
|
|
150
|
-
appearance: [
|
|
151
|
-
{
|
|
152
|
-
label: 'Select Font', type: 'select', key: 'font', placeholder: 'Left',
|
|
153
|
-
options: ['Helvetica Neue', 'Arial', 'Times New Roman', 'Roboto']
|
|
154
|
-
},
|
|
155
|
-
{ label: 'Font Color', type: 'color', key: 'fontColor', value: '' },
|
|
156
|
-
{
|
|
157
|
-
label: 'Font Size',
|
|
158
|
-
type: 'number',
|
|
159
|
-
key: 'fontSize',
|
|
160
|
-
value: 14
|
|
161
|
-
},
|
|
162
|
-
{
|
|
163
|
-
label: 'Font Weight', type: 'select', key: 'fontWeight', value: '',
|
|
164
|
-
options: [
|
|
165
|
-
{ value: '400', label: '400-Normal' },
|
|
166
|
-
{ value: '500', label: '500-Medium' },
|
|
167
|
-
{ value: '600', label: '600-Semi Bold' },
|
|
168
|
-
{ value: '700', label: '700-Bold' }
|
|
169
|
-
]
|
|
170
|
-
},
|
|
171
|
-
{
|
|
172
|
-
label: 'Font Style', type: 'select', key: 'fontStyle', value: '',
|
|
173
|
-
options: [
|
|
174
|
-
{ label: 'Normal', value: 'normal' },
|
|
175
|
-
{ label: 'Bold', value: 'bold' },
|
|
176
|
-
{ label: 'Italic', value: 'italic' }
|
|
177
|
-
]
|
|
178
|
-
},
|
|
179
|
-
{
|
|
180
|
-
label: 'Margin', type: 'marginPicker', key: 'margin',
|
|
181
|
-
placeholder: 'Left, Top, Right, Bottom',
|
|
182
|
-
value: [0, 0, 0, 0]
|
|
183
|
-
},
|
|
184
|
-
{
|
|
185
|
-
label: 'Align Item', type: 'select', key: 'alignItems', value: '',
|
|
186
|
-
options: [
|
|
187
|
-
{ label: 'Left', value: 'left' },
|
|
188
|
-
{ label: 'Center', value: 'center' },
|
|
189
|
-
{ label: 'Right', value: 'right' }
|
|
190
|
-
]
|
|
191
|
-
}
|
|
192
|
-
]
|
|
193
|
-
},
|
|
194
|
-
'date': {
|
|
195
|
-
elementProps: [
|
|
196
|
-
{ label: 'Place Holder', placeholder: 'Enter Text', type: 'text', key: 'question' },
|
|
197
|
-
{ label: 'Element', type: 'number', key: 'questionNumber' },
|
|
198
|
-
{ label: 'width', type: 'fieldSize', key: 'width' },
|
|
199
|
-
],
|
|
200
|
-
fieldProps: [
|
|
201
|
-
{ label: '', type: 'toggleGroup', key: 'toggleOptions' },
|
|
202
|
-
{ label: 'Help Text', placeholder: 'Enter Text ', type: 'text' },
|
|
203
|
-
{ label: 'Value', placeholder: 'Enter Text ', type: 'text', key: 'value' },
|
|
204
|
-
{ label: 'Reference Field', placeholder: 'Reference Field', type: 'text', key: 'referenceField' },
|
|
205
|
-
{
|
|
206
|
-
"label": "", "placeholder": "Enter Text", "type": "subQuestion", "key": "isSubText",
|
|
207
|
-
"subQuestion": []
|
|
208
|
-
}
|
|
209
|
-
],
|
|
210
|
-
appearance: [
|
|
211
|
-
{
|
|
212
|
-
label: 'Select Font', type: 'select', key: 'font', placeholder: 'Left',
|
|
213
|
-
options: ['Helvetica Neue', 'Arial', 'Times New Roman', 'Roboto']
|
|
214
|
-
},
|
|
215
|
-
{ label: 'Font Color', type: 'color', key: 'fontColor', value: '' },
|
|
216
|
-
{
|
|
217
|
-
label: 'Font Size',
|
|
218
|
-
type: 'number',
|
|
219
|
-
key: 'fontSize',
|
|
220
|
-
value: 14
|
|
221
|
-
},
|
|
222
|
-
{
|
|
223
|
-
label: 'Font Weight', type: 'select', key: 'fontWeight', value: '',
|
|
224
|
-
options: [
|
|
225
|
-
{ value: '400', label: '400-Normal' },
|
|
226
|
-
{ value: '500', label: '500-Medium' },
|
|
227
|
-
{ value: '600', label: '600-Semi Bold' },
|
|
228
|
-
{ value: '700', label: '700-Bold' }
|
|
229
|
-
]
|
|
230
|
-
},
|
|
231
|
-
{
|
|
232
|
-
label: 'Font Style', type: 'select', key: 'fontStyle', value: '',
|
|
233
|
-
options: [
|
|
234
|
-
{ label: 'Normal', value: 'normal' },
|
|
235
|
-
{ label: 'Bold', value: 'bold' },
|
|
236
|
-
{ label: 'Italic', value: 'italic' }
|
|
237
|
-
]
|
|
238
|
-
},
|
|
239
|
-
{
|
|
240
|
-
label: 'Margin', type: 'marginPicker', key: 'margin',
|
|
241
|
-
placeholder: 'Left, Top, Right, Bottom',
|
|
242
|
-
value: [0, 0, 0, 0]
|
|
243
|
-
},
|
|
244
|
-
{
|
|
245
|
-
label: 'Align Item', type: 'select', key: 'alignItems', value: '',
|
|
246
|
-
options: [
|
|
247
|
-
{ label: 'Left', value: 'left' },
|
|
248
|
-
{ label: 'Center', value: 'center' },
|
|
249
|
-
{ label: 'Right', value: 'right' }
|
|
250
|
-
]
|
|
251
|
-
}
|
|
252
|
-
]
|
|
253
|
-
},
|
|
254
|
-
'Pdf': {
|
|
255
|
-
elementProps: [
|
|
256
|
-
{ label: 'Element', labelPath: 'ELEMENT', type: 'number', key: 'questionNumber' },
|
|
257
|
-
{ label: 'width', labelPath: 'WIDTH', type: 'fieldSize', key: 'width' }
|
|
258
|
-
],
|
|
259
|
-
fieldProps: [
|
|
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' },
|
|
263
|
-
{
|
|
264
|
-
label: '', labelPath: 'SUBTEXT', placeholder: 'Enter Text', type: 'subQuestion', key: 'isSubText',
|
|
265
|
-
subQuestion: []
|
|
266
|
-
}
|
|
267
|
-
],
|
|
268
|
-
appearance: []
|
|
269
|
-
},
|
|
270
|
-
// AP-19MAR25 Add Line Property
|
|
271
|
-
'Line': {
|
|
272
|
-
elementProps: [
|
|
273
|
-
{ label: 'Line Width', type: 'fieldSize', key: 'width' },
|
|
274
|
-
{ label: 'Padding Top', type: 'number', key: 'paddingTop', placeholder: 'Enter padding top' },
|
|
275
|
-
{ label: 'Padding Bottom', type: 'number', key: 'paddingBottom', placeholder: 'Enter padding bottom' },
|
|
276
|
-
{
|
|
277
|
-
label: 'Line Style', type: 'select', key: 'lineStyle',
|
|
278
|
-
options: ['Solid', 'Dashed', 'Dotted']
|
|
279
|
-
}
|
|
280
|
-
],
|
|
281
|
-
fieldProps: [],
|
|
282
|
-
appearance: [
|
|
283
|
-
{
|
|
284
|
-
label: 'Select Font', type: 'select', key: 'font', placeholder: 'Left',
|
|
285
|
-
options: ['Helvetica Neue', 'Arial', 'Times New Roman', 'Roboto']
|
|
286
|
-
},
|
|
287
|
-
{ label: 'Font Color', type: 'color', key: 'fontColor', value: '' },
|
|
288
|
-
{
|
|
289
|
-
label: 'Font Size',
|
|
290
|
-
type: 'number',
|
|
291
|
-
key: 'fontSize',
|
|
292
|
-
value: 14
|
|
293
|
-
},
|
|
294
|
-
{
|
|
295
|
-
label: 'Font Weight', type: 'select', key: 'fontWeight', value: '',
|
|
296
|
-
options: [
|
|
297
|
-
{ value: '400', label: '400-Normal' },
|
|
298
|
-
{ value: '500', label: '500-Medium' },
|
|
299
|
-
{ value: '600', label: '600-Semi Bold' },
|
|
300
|
-
{ value: '700', label: '700-Bold' }
|
|
301
|
-
]
|
|
302
|
-
},
|
|
303
|
-
{
|
|
304
|
-
label: 'Font Style', type: 'select', key: 'fontStyle', value: '',
|
|
305
|
-
options: [
|
|
306
|
-
{ label: 'Normal', value: 'normal' },
|
|
307
|
-
{ label: 'Bold', value: 'bold' },
|
|
308
|
-
{ label: 'Italic', value: 'italic' }
|
|
309
|
-
]
|
|
310
|
-
},
|
|
311
|
-
{
|
|
312
|
-
label: 'Margin', type: 'marginPicker', key: 'margin',
|
|
313
|
-
placeholder: 'Left, Top, Right, Bottom',
|
|
314
|
-
value: [0, 0, 0, 0]
|
|
315
|
-
},
|
|
316
|
-
// {
|
|
317
|
-
// label: 'Align Item', type: 'select', key: 'alignItems', value: '',
|
|
318
|
-
// options: [
|
|
319
|
-
// { label: 'Left', value: 'left' },
|
|
320
|
-
// { label: 'Center', value: 'center' },
|
|
321
|
-
// { label: 'Right', value: 'right' }
|
|
322
|
-
// ]
|
|
323
|
-
// }
|
|
324
|
-
]
|
|
325
|
-
},
|
|
326
|
-
'Space': {
|
|
327
|
-
elementProps: [
|
|
328
|
-
{ label: 'Element', type: 'number', key: 'questionNumber' },
|
|
329
|
-
{ label: 'Field Size', type: 'fieldSize', key: 'width' },
|
|
330
|
-
],
|
|
331
|
-
fieldProps: [],
|
|
332
|
-
appearance: [
|
|
333
|
-
{
|
|
334
|
-
label: 'Select Font', type: 'select', key: 'font', placeholder: 'Left',
|
|
335
|
-
options: ['Helvetica Neue', 'Arial', 'Times New Roman', 'Roboto']
|
|
336
|
-
},
|
|
337
|
-
{ label: 'Font Color', type: 'color', key: 'fontColor', value: '' },
|
|
338
|
-
{
|
|
339
|
-
label: 'Font Size',
|
|
340
|
-
type: 'number',
|
|
341
|
-
key: 'fontSize',
|
|
342
|
-
value: 14
|
|
343
|
-
},
|
|
344
|
-
{
|
|
345
|
-
label: 'Font Weight', type: 'select', key: 'fontWeight', value: '',
|
|
346
|
-
options: [
|
|
347
|
-
{ value: '400', label: '400-Normal' },
|
|
348
|
-
{ value: '500', label: '500-Medium' },
|
|
349
|
-
{ value: '600', label: '600-Semi Bold' },
|
|
350
|
-
{ value: '700', label: '700-Bold' }
|
|
351
|
-
]
|
|
352
|
-
},
|
|
353
|
-
{
|
|
354
|
-
label: 'Font Style', type: 'select', key: 'fontStyle', value: '',
|
|
355
|
-
options: [
|
|
356
|
-
{ label: 'Normal', value: 'normal' },
|
|
357
|
-
{ label: 'Bold', value: 'bold' },
|
|
358
|
-
{ label: 'Italic', value: 'italic' }
|
|
359
|
-
]
|
|
360
|
-
},
|
|
361
|
-
{
|
|
362
|
-
label: 'Margin', type: 'marginPicker', key: 'margin',
|
|
363
|
-
placeholder: 'Left, Top, Right, Bottom',
|
|
364
|
-
value: [0, 0, 0, 0]
|
|
365
|
-
},
|
|
366
|
-
// {
|
|
367
|
-
// label: 'Align Item', type: 'select', key: 'alignItems', value: '',
|
|
368
|
-
// options: [
|
|
369
|
-
// { label: 'Left', value: 'left' },
|
|
370
|
-
// { label: 'Center', value: 'center' },
|
|
371
|
-
// { label: 'Right', value: 'right' }
|
|
372
|
-
// ]
|
|
373
|
-
// }
|
|
374
|
-
]
|
|
375
|
-
},
|
|
376
|
-
"Table": {
|
|
377
|
-
"elementProps": [
|
|
378
|
-
{ "label": "rowChoice", "placeholder": "", "type": "text", "key": "rowChoice" },
|
|
379
|
-
{ label: 'questionNumber', type: 'number', key: 'questionNumber' },
|
|
380
|
-
{ label: 'Table Size', type: 'fieldSize', key: 'width' },
|
|
381
|
-
],
|
|
382
|
-
"fieldProps": [
|
|
383
|
-
{ "label": "tableId", "placeholder": "Emp_Table_01", "type": "text", "key": "tableId" },
|
|
384
|
-
{ "label": "value", "placeholder": "Value", "type": "text", "key": "value" },
|
|
385
|
-
{ label: 'Reference', placeholder: 'Reference Field', type: 'text', key: 'referenceField' },
|
|
386
|
-
{
|
|
387
|
-
"label": "", "placeholder": "Enter Text", "type": "subQuestion", "key": "isSubText",
|
|
388
|
-
"subQuestion": []
|
|
389
|
-
},
|
|
390
|
-
],
|
|
391
|
-
appearance: [
|
|
392
|
-
{
|
|
393
|
-
label: 'Select Font', type: 'select', key: 'font', placeholder: 'Left',
|
|
394
|
-
options: ['Helvetica Neue', 'Arial', 'Times New Roman', 'Roboto']
|
|
395
|
-
},
|
|
396
|
-
{ label: 'Font Color', type: 'color', key: 'fontColor', value: '' },
|
|
397
|
-
{
|
|
398
|
-
label: 'Font Size',
|
|
399
|
-
type: 'number',
|
|
400
|
-
key: 'fontSize',
|
|
401
|
-
value: 14
|
|
402
|
-
},
|
|
403
|
-
{
|
|
404
|
-
label: 'Font Weight', type: 'select', key: 'fontWeight', value: '',
|
|
405
|
-
options: [
|
|
406
|
-
{ value: '400', label: '400-Normal' },
|
|
407
|
-
{ value: '500', label: '500-Medium' },
|
|
408
|
-
{ value: '600', label: '600-Semi Bold' },
|
|
409
|
-
{ value: '700', label: '700-Bold' }
|
|
410
|
-
]
|
|
411
|
-
},
|
|
412
|
-
{
|
|
413
|
-
label: 'Font Style', type: 'select', key: 'fontStyle', value: '',
|
|
414
|
-
options: [
|
|
415
|
-
{ label: 'Normal', value: 'normal' },
|
|
416
|
-
{ label: 'Bold', value: 'bold' },
|
|
417
|
-
{ label: 'Italic', value: 'italic' }
|
|
418
|
-
]
|
|
419
|
-
},
|
|
420
|
-
{
|
|
421
|
-
label: 'Margin', type: 'marginPicker', key: 'margin',
|
|
422
|
-
placeholder: 'Left, Top, Right, Bottom',
|
|
423
|
-
value: [0, 0, 0, 0]
|
|
424
|
-
},
|
|
425
|
-
// {
|
|
426
|
-
// label: 'Align Item', type: 'select', key: 'alignItems', value: '',
|
|
427
|
-
// options: [
|
|
428
|
-
// { label: 'Left', value: 'left' },
|
|
429
|
-
// { label: 'Center', value: 'center' },
|
|
430
|
-
// { label: 'Right', value: 'right' }
|
|
431
|
-
// ]
|
|
432
|
-
// }
|
|
433
|
-
]
|
|
434
|
-
},
|
|
435
|
-
"TableColumn": {
|
|
436
|
-
"elementProps": [
|
|
437
|
-
{ "label": "headerLabels", "placeholder": "Enter here", "type": "text", "targetArray": "fieldsMeta", "targetArrayKey": "uniqueIdentifier", "key": "label" },
|
|
438
|
-
{ "label": "apiName", "placeholder": "Enter here", "type": "text", "targetArray": "fieldsMeta", "targetArrayKey": "uniqueIdentifier", "key": "apiName" },
|
|
439
|
-
{
|
|
440
|
-
"label": "Summary Column", "placeholder": "Summary Column", "type": "subQuestion", "targetArray": "fieldsMeta", "targetArrayKey": "uniqueIdentifier", "key": "summaryColumn",
|
|
441
|
-
"subQuestion": [
|
|
442
|
-
{ "label": "Type", "placeholder": "Enter here", "type": "text", "targetArray": "fieldsMeta", "targetArrayKey": "uniqueIdentifier", "key": "fldType" },
|
|
443
|
-
{ "label": "Operation", "placeholder": "Enter here", "type": "text", "targetArray": "fieldsMeta", "targetArrayKey": "uniqueIdentifier", "key": "operation" },
|
|
444
|
-
{ "label": "Operands", "placeholder": "Enter here", "type": "array", "targetArray": "fieldsMeta", "targetArrayKey": "uniqueIdentifier", "key": "operands" },
|
|
445
|
-
]
|
|
446
|
-
},
|
|
447
|
-
{
|
|
448
|
-
"label": "Summary Row", "placeholder": "Summary Row", "type": "subQuestion", "targetArray": "fieldsMeta", "targetArrayKey": "uniqueIdentifier", "key": "summaryRow", "subQuestion": [
|
|
449
|
-
{ "label": "Type", "placeholder": "Enter here", "type": "text", "targetArray": "fieldsMeta", "targetArrayKey": "uniqueIdentifier", "key": "fldType" },
|
|
450
|
-
{ "label": "operation", "placeholder": "operation", "type": "text", "targetArray": "fieldsMeta", "targetArrayKey": "uniqueIdentifier", "key": "operation" },
|
|
451
|
-
{ "label": "column", "placeholder": "Enter here", "type": "radio", "targetArray": "fieldsMeta", "targetArrayKey": "uniqueIdentifier", "key": "column" },
|
|
452
|
-
{ "label": "operands", "placeholder": "Enter here", "type": "array", "targetArray": "fieldsMeta", "targetArrayKey": "uniqueIdentifier", "key": "operands" },
|
|
453
|
-
]
|
|
454
|
-
},
|
|
455
|
-
{ "label": "inputTextAlignment", "placeholder": "Left", "type": "text", "key": "inputTextAlignment" },
|
|
456
|
-
{ "label": "tableScaleSize", "placeholder": "06 - Full Scale", "type": "text", "key": "tableScaleSize" },
|
|
457
|
-
{ "label": "rowChoice", "placeholder": "", "type": "text", "key": "rowChoice" },
|
|
458
|
-
{
|
|
459
|
-
"label": "quickActionTools",
|
|
460
|
-
"type": "group",
|
|
461
|
-
"key": "quickActionTools",
|
|
462
|
-
"children": [
|
|
463
|
-
{ "label": "edit", "type": "toggle", "key": "edit" },
|
|
464
|
-
{ "label": "view", "type": "toggle", "key": "view" },
|
|
465
|
-
{ "label": "delete", "type": "toggle", "key": "delete" }
|
|
466
|
-
]
|
|
467
|
-
},
|
|
468
|
-
{ "label": "addRecordEvent", "type": "toggle", "key": "addRecordEvent" },
|
|
469
|
-
{
|
|
470
|
-
"label": "tableScrollEventChoice",
|
|
471
|
-
"type": "group",
|
|
472
|
-
"key": "tableScrollEventChoice",
|
|
473
|
-
"children": [
|
|
474
|
-
{ "label": "horizontal", "type": "toggle", "key": "horizontal" },
|
|
475
|
-
{ "label": "vertical", "type": "toggle", "key": "vertical" }
|
|
476
|
-
]
|
|
477
|
-
}
|
|
478
|
-
],
|
|
479
|
-
"fieldProps": [
|
|
480
|
-
{ "label": "tableId", "placeholder": "Emp_Table_01", "type": "text", "key": "tableId" },
|
|
481
|
-
{ "label": "inputTextAlignment", "placeholder": "Left", "type": "text", "key": "inputTextAlignment" },
|
|
482
|
-
{ "label": "requiredField", "type": "toggle", "key": "requiredField" },
|
|
483
|
-
{ "label": "Read Only", "type": "checkbox", "targetArray": "fieldsMeta", "targetArrayKey": "uniqueIdentifier", "key": "edit" },
|
|
484
|
-
{ "label": "hideLabel", "type": "toggle", "key": "hideLabel" },
|
|
485
|
-
{ "label": "disabled", "type": "toggle", "key": "disabled" },
|
|
486
|
-
{ "label": "hideElements", "type": "toggle", "key": "hideElements" },
|
|
487
|
-
{ "label": "masking", "type": "toggle", "key": "masking" },
|
|
488
|
-
{ "label": "value", "placeholder": "Value", "type": "text", "key": "value" },
|
|
489
|
-
{ "label": "referenceAnchor", "placeholder": "http://source/rangernxt_bio_data/74/d.doc", "type": "text", "key": "referenceAnchor" },
|
|
490
|
-
{ "label": "controllingElements", "type": "toggle", "key": "controllingElements" },
|
|
491
|
-
{ "label": "isDependence", "type": "toggle", "key": "isDependence" },
|
|
492
|
-
{ "label": "newLine", "type": "toggle", "key": "newLine" }
|
|
493
|
-
],
|
|
494
|
-
"appearance": [
|
|
495
|
-
{ "label": "selectFont", "placeholder": "Left", "type": "text", "key": "selectFont" },
|
|
496
|
-
{ "label": "fontColor", "placeholder": "#28343E", "type": "text", "key": "fontColor" },
|
|
497
|
-
{ "label": "hexCode", "placeholder": "#28343E", "type": "text", "key": "hexCode" },
|
|
498
|
-
{ "label": "fontSize", "placeholder": "300 - Medium", "type": "text", "key": "fontSize" },
|
|
499
|
-
{ "label": "fontWidth", "placeholder": "Left", "type": "text", "key": "fontWidth" },
|
|
500
|
-
{ "label": "backgroundColor", "placeholder": "#E2E2E2", "type": "text", "key": "backgroundColor" },
|
|
501
|
-
{ "label": "backgroundHexCode", "placeholder": "#E2E2E2", "type": "text", "key": "backgroundHexCode" },
|
|
502
|
-
{ "label": "referenceAnchor", "placeholder": "http://source/rangernxt_bio_data/74/d.doc", "type": "text", "key": "referenceAnchor" },
|
|
503
|
-
{ "label": "blankSpace", "type": "toggle", "key": "blankSpace" }
|
|
504
|
-
]
|
|
505
|
-
},
|
|
506
|
-
'TextArea': {
|
|
507
|
-
elementProps: [
|
|
508
|
-
{ label: 'Element', type: 'number', key: 'questionNumber' },
|
|
509
|
-
{ label: 'width', type: 'fieldSize', key: 'width' },
|
|
510
|
-
],
|
|
511
|
-
fieldProps: [
|
|
512
|
-
{ label: '', type: 'toggleGroup', key: 'toggleOptions' },
|
|
513
|
-
{ label: 'Help Text', placeholder: 'Enter Text ', type: 'text' },
|
|
514
|
-
{ label: 'Value', placeholder: 'Enter Text ', type: 'text', key: 'value' },
|
|
515
|
-
{ label: 'Reference Field', placeholder: 'Reference Field', type: 'text', key: 'referenceField' },
|
|
516
|
-
{
|
|
517
|
-
"label": "", "placeholder": "Enter Text", "type": "subQuestion", "key": "isSubText",
|
|
518
|
-
"subQuestion": []
|
|
519
|
-
}
|
|
520
|
-
],
|
|
521
|
-
appearance: [
|
|
522
|
-
{
|
|
523
|
-
label: 'Select Font', type: 'select', key: 'font', placeholder: 'Left',
|
|
524
|
-
options: ['Helvetica Neue', 'Arial', 'Times New Roman', 'Roboto']
|
|
525
|
-
},
|
|
526
|
-
{ label: 'Font Color', type: 'color', key: 'fontColor', value: '' },
|
|
527
|
-
{
|
|
528
|
-
label: 'Font Size', type: 'select', key: 'fontSize', value: '',
|
|
529
|
-
options: [
|
|
530
|
-
{ label: 'Small', value: '12px' },
|
|
531
|
-
{ label: 'Medium', value: '14px' },
|
|
532
|
-
{ label: 'Large', value: '16px' }
|
|
533
|
-
]
|
|
534
|
-
},
|
|
535
|
-
{
|
|
536
|
-
label: 'Font Width', type: 'select', key: 'fontWeight', value: '',
|
|
537
|
-
options: [
|
|
538
|
-
{ value: '400', label: '400-Normal' },
|
|
539
|
-
{ value: '500', label: '500-Medium' },
|
|
540
|
-
{ value: '600', label: '600-Semi Bold' },
|
|
541
|
-
{ value: '700', label: '700-Bold' }
|
|
542
|
-
]
|
|
543
|
-
},
|
|
544
|
-
// { label: 'Background Color', type: 'color', key: 'backgroundColor', value: '' },
|
|
545
|
-
]
|
|
546
|
-
},
|
|
547
|
-
'image': {
|
|
548
|
-
elementProps: [
|
|
549
|
-
{ label: 'Element', type: 'number', key: 'questionNumber' },
|
|
550
|
-
{ label: 'width', type: 'fieldSize', key: 'width' },
|
|
551
|
-
],
|
|
552
|
-
fieldProps: [
|
|
553
|
-
{ label: '', type: 'toggleGroup', key: 'toggleOptions' },
|
|
554
|
-
{ label: 'Help Text', placeholder: 'Enter Text ', type: 'text' },
|
|
555
|
-
{ label: 'Value', placeholder: 'Enter Text ', type: 'text', key: 'value' },
|
|
556
|
-
{ label: 'Reference Field', placeholder: 'Reference Field', type: 'text', key: 'referenceField' },
|
|
557
|
-
{
|
|
558
|
-
"label": "", "placeholder": "Enter Text", "type": "subQuestion", "key": "isSubText",
|
|
559
|
-
"subQuestion": []
|
|
560
|
-
}
|
|
561
|
-
],
|
|
562
|
-
appearance: [
|
|
563
|
-
{
|
|
564
|
-
label: 'Select Font', type: 'select', key: 'font', placeholder: 'Left',
|
|
565
|
-
options: ['Helvetica Neue', 'Arial', 'Times New Roman', 'Roboto']
|
|
566
|
-
},
|
|
567
|
-
{ label: 'Font Color', type: 'color', key: 'fontColor', value: '' },
|
|
568
|
-
{
|
|
569
|
-
label: 'Font Size',
|
|
570
|
-
type: 'number',
|
|
571
|
-
key: 'fontSize',
|
|
572
|
-
value: 14
|
|
573
|
-
},
|
|
574
|
-
{
|
|
575
|
-
label: 'Font Weight', type: 'select', key: 'fontWeight', value: '',
|
|
576
|
-
options: [
|
|
577
|
-
{ value: '400', label: '400-Normal' },
|
|
578
|
-
{ value: '500', label: '500-Medium' },
|
|
579
|
-
{ value: '600', label: '600-Semi Bold' },
|
|
580
|
-
{ value: '700', label: '700-Bold' }
|
|
581
|
-
]
|
|
582
|
-
},
|
|
583
|
-
{
|
|
584
|
-
label: 'Font Style', type: 'select', key: 'fontStyle', value: '',
|
|
585
|
-
options: [
|
|
586
|
-
{ label: 'Normal', value: 'normal' },
|
|
587
|
-
{ label: 'Bold', value: 'bold' },
|
|
588
|
-
{ label: 'Italic', value: 'italic' }
|
|
589
|
-
]
|
|
590
|
-
},
|
|
591
|
-
{
|
|
592
|
-
label: 'Margin', type: 'marginPicker', key: 'margin',
|
|
593
|
-
placeholder: 'Left, Top, Right, Bottom',
|
|
594
|
-
value: [0, 0, 0, 0]
|
|
595
|
-
},
|
|
596
|
-
{
|
|
597
|
-
label: 'Align Item', type: 'select', key: 'alignItems', value: '',
|
|
598
|
-
options: [
|
|
599
|
-
{ label: 'Left', value: 'left' },
|
|
600
|
-
{ label: 'Center', value: 'center' },
|
|
601
|
-
{ label: 'Right', value: 'right' }
|
|
602
|
-
]
|
|
603
|
-
}
|
|
604
|
-
]
|
|
605
|
-
},
|
|
606
|
-
};
|
|
607
|
-
errorMessage;
|
|
608
|
-
constructor(http, pdfDesignerService, templateService) {
|
|
609
|
-
this.http = http;
|
|
610
|
-
this.pdfDesignerService = pdfDesignerService;
|
|
611
|
-
this.templateService = templateService;
|
|
612
|
-
}
|
|
613
|
-
handleTemplateSelection(event) {
|
|
614
|
-
this.pdfElements = event.elements;
|
|
615
|
-
this.selectedTemplate = event.selectedTemplate;
|
|
616
|
-
}
|
|
617
|
-
ngOnInit() {
|
|
618
|
-
//AP-10MAR25 Subscribes to header selection changes and updates the selected element
|
|
619
|
-
this.pdfDesignerService.selectHeaderSubject$.subscribe(header => {
|
|
620
|
-
if (header) {
|
|
621
|
-
if (!this.selectedElement) {
|
|
622
|
-
this.selectedElement = {};
|
|
623
|
-
}
|
|
624
|
-
this.selectedElement['type'] = header;
|
|
625
|
-
this.headerSelect = true;
|
|
626
|
-
this.pdf = this.pdfDesignerService.getBook();
|
|
627
|
-
this.bookId = Object.keys(this.pdf)[0];
|
|
628
|
-
}
|
|
629
|
-
});
|
|
630
|
-
this.pdfDesignerService.selectedElement$.subscribe(index => {
|
|
631
|
-
this.selectedElementIndex = index;
|
|
632
|
-
this.headerSelect = false;
|
|
633
|
-
if (index >= 0) {
|
|
634
|
-
const elements = this.pdfDesignerService.getElements();
|
|
635
|
-
this.selectedElement = elements[index];
|
|
636
|
-
if (this.selectedElement?.type === 'Table') {
|
|
637
|
-
this.selectColumn = this.pdfDesignerService.getSelectTableColumn() === undefined ? null : this.pdfDesignerService.getSelectTableColumn();
|
|
638
|
-
}
|
|
639
|
-
else {
|
|
640
|
-
this.selectColumn = null;
|
|
641
|
-
}
|
|
642
|
-
if (!this.selectedElement.margin) {
|
|
643
|
-
this.selectedElement.margin = [0, 0, 0, 0];
|
|
644
|
-
}
|
|
645
|
-
}
|
|
646
|
-
this.getProperties();
|
|
647
|
-
this.updatePdfpData();
|
|
648
|
-
});
|
|
649
|
-
this.updatePdfpData();
|
|
650
|
-
}
|
|
651
|
-
//AP-10MAR25 Updates the title using the form builder service
|
|
652
|
-
updateTitle(event) {
|
|
653
|
-
this.pdfDesignerService.updateTitle(event);
|
|
654
|
-
}
|
|
655
|
-
updatePdfpData() {
|
|
656
|
-
// SKS28MAR25 Convert array to comma-separated string
|
|
657
|
-
this.fieldAsString = this.bookSubtext?.field?.join(', ') || '';
|
|
658
|
-
// SKS20MAR25 Filter columns
|
|
659
|
-
const targetArray = this.getDataByPath('fieldsMeta') || [];
|
|
660
|
-
this.filteredColumns = targetArray.filter(column => column.uniqueIdentifier !== this.selectColumn);
|
|
661
|
-
}
|
|
662
|
-
updateField(value) {
|
|
663
|
-
this.bookSubtext.field = value.split(',').map(item => item.trim()); //SKS28MAR25 Convert string back to array
|
|
664
|
-
}
|
|
665
|
-
// SKS20MAR25 Method to handle checkbox changes
|
|
666
|
-
onCheckboxChange(targetArrayPath, targetArrayKey, key, apiName, isChecked) {
|
|
667
|
-
const targetArray = this.getDataByPath(targetArrayPath);
|
|
668
|
-
const foundItem = targetArray.find(item => item[targetArrayKey] === this.selectColumn);
|
|
669
|
-
foundItem[key] = foundItem[key] ? foundItem[key] : [];
|
|
670
|
-
if (isChecked) {
|
|
671
|
-
// Add apiName to selectedApiNames if not already present
|
|
672
|
-
if (!foundItem[key].includes(apiName)) {
|
|
673
|
-
foundItem[key].push(apiName);
|
|
674
|
-
}
|
|
675
|
-
}
|
|
676
|
-
else {
|
|
677
|
-
// Remove apiName from selectedApiNames if present
|
|
678
|
-
const index = foundItem[key].indexOf(apiName);
|
|
679
|
-
if (index > -1) {
|
|
680
|
-
foundItem[key].splice(index, 1);
|
|
681
|
-
}
|
|
682
|
-
}
|
|
683
|
-
}
|
|
684
|
-
updateProperty(key, value) {
|
|
685
|
-
if (this.selectedElementIndex >= 0) {
|
|
686
|
-
this.setValueByPath(key, value);
|
|
687
|
-
}
|
|
688
|
-
if (key === 'question') {
|
|
689
|
-
if (!this.validateInput(value, key)) {
|
|
690
|
-
return;
|
|
691
|
-
}
|
|
692
|
-
}
|
|
693
|
-
}
|
|
694
|
-
// SKS21MAR25 radio button click handler
|
|
695
|
-
onRadioChange(targetArrayPath, targetArrayKey, key, value) {
|
|
696
|
-
if (this.selectedElement.type === 'Table') {
|
|
697
|
-
// this.updateValueByArrayPath(targetArray, targetArrayKey, this.selectColumn, key, value);
|
|
698
|
-
const targetArray = this.getDataByPath(targetArrayPath);
|
|
699
|
-
if (!Array.isArray(targetArray))
|
|
700
|
-
return;
|
|
701
|
-
// Find the object that matches selectColumn
|
|
702
|
-
let foundItem = targetArray.find(item => item[targetArrayKey] === this.selectColumn);
|
|
703
|
-
// If the item does not exist, create and add it
|
|
704
|
-
if (!foundItem) {
|
|
705
|
-
foundItem = { [targetArrayKey]: this.selectColumn }; // Ensure the key exists
|
|
706
|
-
targetArray.push(foundItem);
|
|
707
|
-
}
|
|
708
|
-
// Traverse and set the value
|
|
709
|
-
const keys = key.split('.');
|
|
710
|
-
let obj = foundItem;
|
|
711
|
-
for (let i = 0; i < keys.length - 1; i++) {
|
|
712
|
-
const key = keys[i];
|
|
713
|
-
if (!obj[key])
|
|
714
|
-
obj[key] = {}; // Initialize missing objects
|
|
715
|
-
obj = obj[key];
|
|
716
|
-
}
|
|
717
|
-
// Assign the value based on input type
|
|
718
|
-
const lastKey = keys[keys.length - 1];
|
|
719
|
-
obj[lastKey] = value;
|
|
720
|
-
this.updateElement(this.selectedElement);
|
|
721
|
-
}
|
|
722
|
-
else {
|
|
723
|
-
this.setValueByPath(key, value); // Fallback for non-Table elements, if applicable
|
|
724
|
-
}
|
|
725
|
-
}
|
|
726
|
-
onRequiredChange(value) {
|
|
727
|
-
if (this.selectedElement) {
|
|
728
|
-
let label = this.selectedElement.label ? this.selectedElement.label.replace(/\s*\*+$/, '') : 'Label';
|
|
729
|
-
if (value) {
|
|
730
|
-
label = `${label} *`;
|
|
731
|
-
}
|
|
732
|
-
this.updateProperty('label', label);
|
|
733
|
-
}
|
|
734
|
-
}
|
|
735
|
-
// Toggle for Sub Questions (Each prop has its own state)
|
|
736
|
-
toggleSubQuestion(prop) {
|
|
737
|
-
prop.isExpanded = !prop.isExpanded;
|
|
738
|
-
}
|
|
739
|
-
// Separate Toggle for Style Section
|
|
740
|
-
isStyleExpanded = false;
|
|
741
|
-
toggleStyleSection() {
|
|
742
|
-
this.isStyleExpanded = !this.isStyleExpanded;
|
|
743
|
-
}
|
|
744
|
-
getProperties() {
|
|
745
|
-
if (!this.selectedElement)
|
|
746
|
-
return null;
|
|
747
|
-
// AP-10MAR25 Retrieve the latest pdf data
|
|
748
|
-
this.pdf = this.pdfDesignerService.getBook();
|
|
749
|
-
if (this.selectedElement?.type === 'Table') {
|
|
750
|
-
if (this.selectColumn !== '' && this.selectColumn !== null) {
|
|
751
|
-
return this.elementProperties['TableColumn'];
|
|
752
|
-
}
|
|
753
|
-
}
|
|
754
|
-
return this.elementProperties[this.selectedElement?.type];
|
|
755
|
-
}
|
|
756
|
-
// AP-28MAR25 Add an option with a unique UUID
|
|
757
|
-
addOption(options) {
|
|
758
|
-
const unique_id = uuidv4();
|
|
759
|
-
options.push({ id: unique_id, value: '' });
|
|
760
|
-
}
|
|
761
|
-
// AP-28MAR25 Function to remove an option based on its unique UUID
|
|
762
|
-
removeOption(options, id) {
|
|
763
|
-
const index = options.findIndex(option => option.id === id);
|
|
764
|
-
if (index !== -1) {
|
|
765
|
-
options.splice(index, 1);
|
|
766
|
-
}
|
|
767
|
-
}
|
|
768
|
-
handleButtonClick() {
|
|
769
|
-
this.formButtonHandler.emit(this.pdfDesignerService.downloadElement());
|
|
770
|
-
}
|
|
771
|
-
// SKS13MAR25 active tab select
|
|
772
|
-
setActiveTab(tab) {
|
|
773
|
-
this.activeTab = tab;
|
|
774
|
-
}
|
|
775
|
-
// SKS13MAR25 table property save
|
|
776
|
-
onSave() {
|
|
777
|
-
}
|
|
778
|
-
// SKS13MAR25 table property reset
|
|
779
|
-
onCancel() {
|
|
780
|
-
}
|
|
781
|
-
updateProperties(elementType) {
|
|
782
|
-
// Reset alignment and styles if switching elements
|
|
783
|
-
this.selectedAlign = 'align-left';
|
|
784
|
-
this.selectedStyles = [];
|
|
785
|
-
// Fetch the properties of the selected element type
|
|
786
|
-
const properties = this.getProperties();
|
|
787
|
-
if (properties) {
|
|
788
|
-
// Make sure the properties are dynamically updated
|
|
789
|
-
}
|
|
790
|
-
}
|
|
791
|
-
onAlignSelect(value) {
|
|
792
|
-
if (this.selectedElement) {
|
|
793
|
-
this.selectedElement.textAlign = value;
|
|
794
|
-
}
|
|
795
|
-
}
|
|
796
|
-
onStyleSelect(value) {
|
|
797
|
-
if (!this.selectedElement)
|
|
798
|
-
return;
|
|
799
|
-
// Initialize styles array if it doesn't exist
|
|
800
|
-
this.selectedElement.styles = this.selectedElement.styles || [];
|
|
801
|
-
// Ensure only one style is selected at a time
|
|
802
|
-
this.selectedElement.styles = [value];
|
|
803
|
-
}
|
|
804
|
-
isStyleActive(value) {
|
|
805
|
-
return this.selectedElement?.styles?.includes(value) || false;
|
|
806
|
-
}
|
|
807
|
-
getValueByPath(path) {
|
|
808
|
-
return path?.split('.').reduce((obj, key) => obj?.[key] ?? '', this.selectedElement);
|
|
809
|
-
}
|
|
810
|
-
onToggleChange(path, event) {
|
|
811
|
-
const checked = event.target.checked;
|
|
812
|
-
this.setValueByPath(path, checked);
|
|
813
|
-
this.updateElement(this.selectedElement);
|
|
814
|
-
}
|
|
815
|
-
validateInput(value, type) {
|
|
816
|
-
if (type === 'placeholder') {
|
|
817
|
-
const regex = /^[a-zA-Z0-9\s]*$/;
|
|
818
|
-
if (!regex.test(value)) {
|
|
819
|
-
this.errorMessage = 'Only letters and numbers are allowed';
|
|
820
|
-
return false;
|
|
821
|
-
}
|
|
822
|
-
}
|
|
823
|
-
this.errorMessage = '';
|
|
824
|
-
return true;
|
|
825
|
-
}
|
|
826
|
-
setValueByPath(path, value) {
|
|
827
|
-
if (value === 'question') {
|
|
828
|
-
if (!this.validateInput(value, value)) {
|
|
829
|
-
}
|
|
830
|
-
}
|
|
831
|
-
const keys = path.split('.');
|
|
832
|
-
let obj = this.selectedElement;
|
|
833
|
-
keys.forEach((key, index) => {
|
|
834
|
-
if (!obj[key]) {
|
|
835
|
-
// Check if the next key is a number (array index)
|
|
836
|
-
const nextKey = keys[index + 1];
|
|
837
|
-
obj[key] = isNaN(Number(nextKey)) ? {} : [];
|
|
838
|
-
}
|
|
839
|
-
if (index === keys.length - 1) {
|
|
840
|
-
// Convert value to number for fontSize
|
|
841
|
-
if (key === 'fontSize') {
|
|
842
|
-
obj[key] = parseInt(value, 10) || 14; // Default to 14 if invalid
|
|
843
|
-
}
|
|
844
|
-
else {
|
|
845
|
-
obj[key] = value; // Assign value to last key
|
|
846
|
-
}
|
|
847
|
-
}
|
|
848
|
-
else {
|
|
849
|
-
obj = obj[key]; // Move deeper
|
|
850
|
-
}
|
|
851
|
-
});
|
|
852
|
-
this.pdfDesignerService.elementUpdate(this.selectedElement);
|
|
853
|
-
}
|
|
854
|
-
getStyleKeys() {
|
|
855
|
-
if (!this.selectedElement || !this.selectedElement.style || typeof this.selectedElement.style !== 'object') {
|
|
856
|
-
return [];
|
|
857
|
-
}
|
|
858
|
-
return Object.keys(this.selectedElement.style);
|
|
859
|
-
}
|
|
860
|
-
// SKS19MAR25 update element in servies
|
|
861
|
-
updateElement(element) {
|
|
862
|
-
this.pdfDesignerService.elementUpdate(element);
|
|
863
|
-
if (this.selectedElement?.type === 'Table' && this.selectColumn) {
|
|
864
|
-
this.pdfDesignerService.setSelectedTableElement(this.selectedElementIndex, { uniqueIdentifier: this.selectColumn || null });
|
|
865
|
-
}
|
|
866
|
-
}
|
|
867
|
-
// SKS19MAR25 get value from array
|
|
868
|
-
getValueByArrayPath(targetArrayPath, targetArrayKey, selectColumn, keyPath) {
|
|
869
|
-
const targetArray = this.getDataByPath(targetArrayPath);
|
|
870
|
-
if (!Array.isArray(targetArray))
|
|
871
|
-
return '';
|
|
872
|
-
const foundItem = targetArray.find(item => item[targetArrayKey] === selectColumn);
|
|
873
|
-
return foundItem ? keyPath.split('.').reduce((obj, key) => obj?.[key], foundItem) : '';
|
|
874
|
-
}
|
|
875
|
-
//SKS19MAR25 Function to update a value in an array dynamically
|
|
876
|
-
updateValueByArrayPath(targetArrayPath, targetArrayKey, selectColumn, keyPath, event) {
|
|
877
|
-
const targetArray = this.getDataByPath(targetArrayPath);
|
|
878
|
-
if (!Array.isArray(targetArray))
|
|
879
|
-
return;
|
|
880
|
-
// Find the object that matches selectColumn
|
|
881
|
-
let foundItem = targetArray.find(item => item[targetArrayKey] === selectColumn);
|
|
882
|
-
// If the item does not exist, create and add it
|
|
883
|
-
if (!foundItem) {
|
|
884
|
-
foundItem = { [targetArrayKey]: selectColumn }; // Ensure the key exists
|
|
885
|
-
targetArray.push(foundItem);
|
|
886
|
-
}
|
|
887
|
-
// Traverse and set the value
|
|
888
|
-
const keys = keyPath.split('.');
|
|
889
|
-
let obj = foundItem;
|
|
890
|
-
for (let i = 0; i < keys.length - 1; i++) {
|
|
891
|
-
const key = keys[i];
|
|
892
|
-
if (!obj[key])
|
|
893
|
-
obj[key] = {}; // Initialize missing objects
|
|
894
|
-
obj = obj[key];
|
|
895
|
-
}
|
|
896
|
-
// Assign the value based on input type
|
|
897
|
-
const lastKey = keys[keys.length - 1];
|
|
898
|
-
const inputElement = event.target;
|
|
899
|
-
obj[lastKey] = inputElement?.type === 'checkbox' ? inputElement.checked : inputElement.value;
|
|
900
|
-
if (keyPath === 'summaryColumn') {
|
|
901
|
-
if (obj['summaryRow'] === true) {
|
|
902
|
-
obj['summaryRow'] = false;
|
|
903
|
-
}
|
|
904
|
-
if (inputElement.checked === true) {
|
|
905
|
-
obj['fldType'] = 'calculation';
|
|
906
|
-
}
|
|
907
|
-
else {
|
|
908
|
-
obj['fldType'] = 'Text';
|
|
909
|
-
}
|
|
910
|
-
}
|
|
911
|
-
if (keyPath === 'summaryRow') {
|
|
912
|
-
//this.pdfDesignerService.setSummaryRowData(obj);
|
|
913
|
-
if (obj['summaryColumn'] === true) {
|
|
914
|
-
obj['summaryColumn'] = false;
|
|
915
|
-
}
|
|
916
|
-
if (inputElement.checked === true) {
|
|
917
|
-
obj['fldType'] = 'calculation';
|
|
918
|
-
}
|
|
919
|
-
else {
|
|
920
|
-
obj['fldType'] = 'Text';
|
|
921
|
-
}
|
|
922
|
-
}
|
|
923
|
-
this.updateElement(this.selectedElement);
|
|
924
|
-
}
|
|
925
|
-
getDataByPath(path) {
|
|
926
|
-
return path.split('.').reduce((obj, key) => obj?.[key], this.selectedElement);
|
|
927
|
-
}
|
|
928
|
-
// SKS25MAR25 image edit functions
|
|
929
|
-
flipHorizontal() {
|
|
930
|
-
this.transform = {
|
|
931
|
-
...this.transform,
|
|
932
|
-
flipH: !this.transform.flipH
|
|
933
|
-
};
|
|
934
|
-
}
|
|
935
|
-
flipVertical() {
|
|
936
|
-
this.transform = {
|
|
937
|
-
...this.transform,
|
|
938
|
-
flipV: !this.transform.flipV
|
|
939
|
-
};
|
|
940
|
-
}
|
|
941
|
-
resetImage() {
|
|
942
|
-
this.canvasRotation = 0;
|
|
943
|
-
this.cropper = undefined;
|
|
944
|
-
this.transform = {
|
|
945
|
-
translateUnit: 'px',
|
|
946
|
-
scale: 1,
|
|
947
|
-
rotate: 0,
|
|
948
|
-
flipH: false,
|
|
949
|
-
flipV: false,
|
|
950
|
-
translateH: 0,
|
|
951
|
-
translateV: 0
|
|
952
|
-
};
|
|
953
|
-
}
|
|
954
|
-
zoomOut() {
|
|
955
|
-
this.transform = {
|
|
956
|
-
...this.transform,
|
|
957
|
-
scale: this.transform.scale - .1
|
|
958
|
-
};
|
|
959
|
-
}
|
|
960
|
-
zoomIn() {
|
|
961
|
-
this.transform = {
|
|
962
|
-
...this.transform,
|
|
963
|
-
scale: this.transform.scale + .1
|
|
964
|
-
};
|
|
965
|
-
}
|
|
966
|
-
rotateLeft() {
|
|
967
|
-
this.loading = true;
|
|
968
|
-
setTimeout(() => {
|
|
969
|
-
this.canvasRotation--;
|
|
970
|
-
this.flipAfterRotate();
|
|
971
|
-
});
|
|
972
|
-
}
|
|
973
|
-
rotateRight() {
|
|
974
|
-
this.loading = true;
|
|
975
|
-
setTimeout(() => {
|
|
976
|
-
this.canvasRotation++;
|
|
977
|
-
this.flipAfterRotate();
|
|
978
|
-
});
|
|
979
|
-
}
|
|
980
|
-
moveLeft() {
|
|
981
|
-
this.transform = {
|
|
982
|
-
...this.transform,
|
|
983
|
-
translateH: this.transform.translateH - 1
|
|
984
|
-
};
|
|
985
|
-
}
|
|
986
|
-
moveRight() {
|
|
987
|
-
this.transform = {
|
|
988
|
-
...this.transform,
|
|
989
|
-
translateH: this.transform.translateH + 1
|
|
990
|
-
};
|
|
991
|
-
}
|
|
992
|
-
moveDown() {
|
|
993
|
-
this.transform = {
|
|
994
|
-
...this.transform,
|
|
995
|
-
translateV: this.transform.translateV + 1
|
|
996
|
-
};
|
|
997
|
-
}
|
|
998
|
-
moveUp() {
|
|
999
|
-
this.transform = {
|
|
1000
|
-
...this.transform,
|
|
1001
|
-
translateV: this.transform.translateV - 1
|
|
1002
|
-
};
|
|
1003
|
-
}
|
|
1004
|
-
flipAfterRotate() {
|
|
1005
|
-
const flippedH = this.transform.flipH;
|
|
1006
|
-
const flippedV = this.transform.flipV;
|
|
1007
|
-
this.transform = {
|
|
1008
|
-
...this.transform,
|
|
1009
|
-
flipH: flippedV,
|
|
1010
|
-
flipV: flippedH,
|
|
1011
|
-
translateH: 0,
|
|
1012
|
-
translateV: 0
|
|
1013
|
-
};
|
|
1014
|
-
}
|
|
1015
|
-
async imageCropped(event) {
|
|
1016
|
-
try {
|
|
1017
|
-
const base64 = await this.convertBlobToBase64(event.objectUrl);
|
|
1018
|
-
this.selectedElement.imageData = base64;
|
|
1019
|
-
await this.pdfDesignerService.elementUpdate(this.selectedElement);
|
|
1020
|
-
}
|
|
1021
|
-
catch (error) {
|
|
1022
|
-
console.error("Error in imageCropped:", error);
|
|
1023
|
-
}
|
|
1024
|
-
}
|
|
1025
|
-
cropperReady(sourceImageDimensions) {
|
|
1026
|
-
this.loading = false;
|
|
1027
|
-
}
|
|
1028
|
-
// SKS25MAR25 blob to base 64 converter
|
|
1029
|
-
convertBlobToBase64(objectUrl) {
|
|
1030
|
-
return fetch(objectUrl)
|
|
1031
|
-
.then(response => response.blob())
|
|
1032
|
-
.then(blob => {
|
|
1033
|
-
return new Promise((resolve, reject) => {
|
|
1034
|
-
const reader = new FileReader();
|
|
1035
|
-
reader.readAsDataURL(blob);
|
|
1036
|
-
reader.onloadend = () => resolve(reader.result);
|
|
1037
|
-
reader.onerror = error => reject(error);
|
|
1038
|
-
});
|
|
1039
|
-
});
|
|
1040
|
-
}
|
|
1041
|
-
// SKS28MAR25 qb pdf update in pdf element
|
|
1042
|
-
childEventCapture(event) {
|
|
1043
|
-
this.selectedElement.pdfReference = Object.keys(event.value.valueObj)[0];
|
|
1044
|
-
this.selectedElement.pdfReferenceQuestions = event.value.valueObj;
|
|
1045
|
-
this.pdfDesignerService.elementUpdate(this.selectedElement);
|
|
1046
|
-
}
|
|
1047
|
-
// SKS28MAR25 pdf search dropdown emit
|
|
1048
|
-
linkToggleDropdown(event) {
|
|
1049
|
-
event.stopPropagation();
|
|
1050
|
-
this.isLinkDropdownOpen = !this.isLinkDropdownOpen;
|
|
1051
|
-
}
|
|
1052
|
-
// SKS28MAR25 pdf search dropdown close
|
|
1053
|
-
onClickOutside(event) {
|
|
1054
|
-
if (this.dropdown && !this.dropdown.nativeElement.contains(event.target)) {
|
|
1055
|
-
this.isLinkDropdownOpen = false;
|
|
1056
|
-
}
|
|
1057
|
-
}
|
|
1058
|
-
// AP-28MAR25 When drag starts, store the index
|
|
1059
|
-
onDragStart(event, id) {
|
|
1060
|
-
this.draggedId = id;
|
|
1061
|
-
event.dataTransfer.effectAllowed = "move";
|
|
1062
|
-
}
|
|
1063
|
-
// AP-28MAR25 Prevent default behavior to allow drop
|
|
1064
|
-
onDragOver(event) {
|
|
1065
|
-
event.preventDefault();
|
|
1066
|
-
}
|
|
1067
|
-
// AP-28MAR25 Swap the dragged item with the dropped position
|
|
1068
|
-
onDrop(event, key) {
|
|
1069
|
-
event.preventDefault();
|
|
1070
|
-
const targetId = event.target.closest(".option-items")?.getAttribute("data-id");
|
|
1071
|
-
if (this.draggedId && targetId && this.draggedId !== targetId) {
|
|
1072
|
-
const options = this.selectedElement[key];
|
|
1073
|
-
[options[this.draggedId], options[targetId]] = [options[targetId], options[this.draggedId]];
|
|
1074
|
-
// Find the indexes of the dragged and target options
|
|
1075
|
-
const draggedIndex = options.findIndex(option => option.id === this.draggedId);
|
|
1076
|
-
const targetIndex = options.findIndex(option => option.id === targetId);
|
|
1077
|
-
// Swap the items
|
|
1078
|
-
if (draggedIndex !== -1 && targetIndex !== -1) {
|
|
1079
|
-
[options[draggedIndex], options[targetIndex]] = [options[targetIndex], options[draggedIndex]];
|
|
1080
|
-
}
|
|
1081
|
-
}
|
|
1082
|
-
this.draggedId = null;
|
|
1083
|
-
}
|
|
1084
|
-
onWidthSelect(value) {
|
|
1085
|
-
if (value === '*' || value === 'auto') {
|
|
1086
|
-
this.setValueByPath('width', value);
|
|
1087
|
-
}
|
|
1088
|
-
else if (this.selectedElement?.width === '*' || this.selectedElement?.width === 'auto') {
|
|
1089
|
-
// Default to 100 if switching from * or auto to custom
|
|
1090
|
-
this.setValueByPath('width', 100);
|
|
1091
|
-
}
|
|
1092
|
-
}
|
|
1093
|
-
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 });
|
|
1094
|
-
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=\"elementProperties[selectedElement?.type === 'Table' && selectColumn !== '' && selectColumn !== null ? 'TableColumn' : selectedElement?.type] as props\">\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 elementProperties[selectedElement?.type === 'Table' && selectColumn !== '' && selectColumn !== null ? 'TableColumn' : selectedElement?.type].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=\"elementProperties[selectedElement?.type === 'Table' && selectColumn !== '' && selectColumn !== null ? 'TableColumn' : selectedElement?.type]\">\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 elementProperties[selectedElement?.type === 'Table' && selectColumn !== '' && selectColumn !== null ? 'TableColumn' : selectedElement?.type].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=\"elementProperties[selectedElement?.type === 'Table' && selectColumn !== '' && selectColumn !== null ? 'TableColumn' : selectedElement?.type]\">\n <ng-container *ngFor=\"let prop of elementProperties[selectedElement?.type === 'Table' && selectColumn !== '' && selectColumn !== null ? 'TableColumn' : selectedElement?.type].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;gap:5px;border:1px solid #ccc;margin-bottom:10px;cursor:grab;background:#fff}.drag-handle{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" }] });
|
|
1095
|
-
}
|
|
1096
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PdfPropertiesComponent, decorators: [{
|
|
1097
|
-
type: Component,
|
|
1098
|
-
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=\"elementProperties[selectedElement?.type === 'Table' && selectColumn !== '' && selectColumn !== null ? 'TableColumn' : selectedElement?.type] as props\">\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 elementProperties[selectedElement?.type === 'Table' && selectColumn !== '' && selectColumn !== null ? 'TableColumn' : selectedElement?.type].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=\"elementProperties[selectedElement?.type === 'Table' && selectColumn !== '' && selectColumn !== null ? 'TableColumn' : selectedElement?.type]\">\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 elementProperties[selectedElement?.type === 'Table' && selectColumn !== '' && selectColumn !== null ? 'TableColumn' : selectedElement?.type].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=\"elementProperties[selectedElement?.type === 'Table' && selectColumn !== '' && selectColumn !== null ? 'TableColumn' : selectedElement?.type]\">\n <ng-container *ngFor=\"let prop of elementProperties[selectedElement?.type === 'Table' && selectColumn !== '' && selectColumn !== null ? 'TableColumn' : selectedElement?.type].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;gap:5px;border:1px solid #ccc;margin-bottom:10px;cursor:grab;background:#fff}.drag-handle{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"] }]
|
|
1099
|
-
}], ctorParameters: () => [{ type: i1.HttpClient }, { type: i2.PdfDesignerService }, { type: i3.TemplateService }], propDecorators: { formButtonHandler: [{
|
|
1100
|
-
type: Output
|
|
1101
|
-
}], templateSaveHandler: [{
|
|
1102
|
-
type: Output
|
|
1103
|
-
}], selectedElementType: [{
|
|
1104
|
-
type: Input
|
|
1105
|
-
}], templateSelected: [{
|
|
1106
|
-
type: Input
|
|
1107
|
-
}], dropdown: [{
|
|
1108
|
-
type: ViewChild,
|
|
1109
|
-
args: ['dropdown', { static: false }]
|
|
1110
|
-
}], onClickOutside: [{
|
|
1111
|
-
type: HostListener,
|
|
1112
|
-
args: ['document:click', ['$event']]
|
|
1113
|
-
}] } });
|
|
1114
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGRmLXByb3BlcnRpZXMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbnh0LWFwcC9zcmMvbGliL3BhZ2VzL3BkZkRlc2lnbmVyL3BkZi1wcm9wZXJ0aWVzL3BkZi1wcm9wZXJ0aWVzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL254dC1hcHAvc3JjL2xpYi9wYWdlcy9wZGZEZXNpZ25lci9wZGYtcHJvcGVydGllcy9wZGYtcHJvcGVydGllcy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsU0FBUyxFQUFjLFlBQVksRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBaUIsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRW5JLE9BQU8sRUFBRSxFQUFFLElBQUksTUFBTSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHFEQUFxRCxDQUFDO0FBQ25GLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHFFQUFxRSxDQUFDO0FBRzVHLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHFDQUFxQyxDQUFDOzs7Ozs7O0FBUzdFLE1BQU0sT0FBTyxzQkFBc0I7SUE4bUJiO0lBQTBCO0lBQStDO0lBNW1CbkYsaUJBQWlCLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztJQUM1QyxtQkFBbUIsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO0lBQ3hELGNBQWMsR0FBVyxFQUFFLENBQUM7SUFDNUIsb0JBQW9CLEdBQVcsQ0FBQyxDQUFDLENBQUM7SUFDekIsbUJBQW1CLEdBQVcsRUFBRSxDQUFDO0lBQzFD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QTJDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBRW9DLFFBQVE7c0JBQWpELFNBQVM7dUJBQUMsVUFBVSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFraUN4QyxjQUFjO3NCQURiLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIEhvc3RMaXN0ZW5lciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENyb3BwZXJQb3NpdGlvbiwgRGltZW5zaW9ucywgSW1hZ2VUcmFuc2Zvcm0gfSBmcm9tICcuLi8uLi8uLi9jb21wb25lbnRzL2ltYWdlLWNyb3BwZXIvaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyB2NCBhcyB1dWlkdjQgfSBmcm9tICd1dWlkJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE54dFNlYXJjaEJveCB9IGZyb20gJy4uLy4uLy4uL2NvbXBvbmVudHMvc2VhcmNoLWJveC9zZWFyY2gtYm94LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJbWFnZUNyb3BwZXJDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9jb21wb25lbnRzL2ltYWdlLWNyb3BwZXIvY29tcG9uZW50L2ltYWdlLWNyb3BwZXIuY29tcG9uZW50JztcbmltcG9ydCB7IFBkZkRlc2lnbmVyU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3BkZi1kZXNpZ25lci9wZGYtZGVzaWduZXIuc2VydmljZSc7XG5pbXBvcnQgeyBUZW1wbGF0ZVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy90ZW1wbGF0ZS90ZW1wbGF0ZS5zZXJ2aWNlJztcbmltcG9ydCB7IE54dEN1c3RvbVRyYW5zbGF0ZVBpcGUgfSBmcm9tICcuLi8uLi8uLi9waXBlL2N1c3RvbS10cmFuc2xhdGUucGlwZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1wZGYtcHJvcGVydGllcycsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEZvcm1zTW9kdWxlLCBOeHRTZWFyY2hCb3gsIEltYWdlQ3JvcHBlckNvbXBvbmVudCwgTnh0Q3VzdG9tVHJhbnNsYXRlUGlwZV0sXG4gIHRlbXBsYXRlVXJsOiAnLi9wZGYtcHJvcGVydGllcy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9wZGYtcHJvcGVydGllcy5jb21wb25lbnQuY3NzJ1xufSlcbmV4cG9ydCBjbGFzcyBQZGZQcm9wZXJ0aWVzQ29tcG9uZW50IHtcblxuICBAT3V0cHV0KCkgZm9ybUJ1dHRvbkhhbmRsZXIgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIHRlbXBsYXRlU2F2ZUhhbmRsZXIgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgc2VsZWN0ZWRPcHRpb246IHN0cmluZyA9ICcnO1xuICBzZWxlY3RlZEVsZW1lbnRJbmRleDogbnVtYmVyID0gLTE7XG4gIEBJbnB1dCgpIHNlbGVjdGVkRWxlbWVudFR5cGU6IHN0cmluZyA9ICcnO1xuICBzZWxlY3RlZEFsaWduOiBzdHJpbmcgPSAnYWxpZ24tbGVmdCc7ICAvLyBBZGQgdGhpcyBwcm9wZXJ0eVxuICBzZWxlY3RlZFN0eWxlczogc3RyaW5nW10gPSBbXTsgIC8vIFVzaW5nIGFycmF5IHNpbmNlIG11bHRpcGxlIHN0eWxlcyBjYW4gYmUgc2VsZWN0ZWRcbiAgc2VsZWN0ZWRFbGVtZW50OiBhbnkgPSBudWxsOyAgLy8gUmVjZWl2ZSB0aGUgc2VsZWN0ZWQgZWxlbWVudFxuICBoZWFkZXJTZWxlY3Q6IGJvb2xlYW4gPSBmYWxzZTtcbiAgYm9va0lkOiBhbnk7XG4gIHBkZjogYW55O1xuICBhY3RpdmVUYWI6IHN0cmluZyA9ICdhdHRyaWJ1dGVzJztcbiAgc2VsZWN0Q29sdW1uOiBhbnlcbiAgdHJhbnNmb3JtOiBJbWFnZVRyYW5zZm9ybSA9IHtcbiAgICB0cmFuc2xhdGVVbml0OiAncHgnLFxuICAgIHNjYWxlOiAxLFxuICAgIHJvdGF0ZTogMCxcbiAgICBmbGlwSDogZmFsc2UsXG4gICAgZmxpcFY6IGZhbHNlLFxuICAgIHRyYW5zbGF0ZUg6IDAsXG4gICAgdHJhbnNsYXRlVjogMFxuICB9O1xuICBjYW52YXNSb3RhdGlvbiA9IDA7XG4gIGNyb3BwZXI/OiBDcm9wcGVyUG9zaXRpb247XG4gIGxvYWRpbmcgPSBmYWxzZTtcbiAgY3JvcHBlck1heEhlaWdodCA9IDA7XG4gIGNyb3BwZXJNYXhXaWR0aCA9IDA7XG4gIGNyb3BwZXJNaW5IZWlnaHQgPSAwO1xuICBjcm9wcGVyTWluV2lkdGggPSAwO1xuICBjcm9wcGVyU3RhdGljV2lkdGggPSAwO1xuICBjcm9wcGVyU3RhdGljSGVpZ2h0ID0gMDtcbiAgYXNwZWN0UmF0aW8gPSA0IC8gMztcbiAgcm91bmRDcm9wcGVyID0gZmFsc2U7XG4gIGltYWdlQ2hhbmdlZEV2ZW50OiBFdmVudCB8IG51bGwgPSBudWxsO1xuICBhbGlnbkltYWdlID0gJ2NlbnRlcicgYXMgY29uc3Q7XG4gIC8vICBcImVuZHBvaW50XCI6IFwiaHR0cHM6Ly9kZXYtYXBpLnZhbGFyaHIuY29tL254dFwiLFxuICAvLyBTS1MyOE1BUjI1IGRlZmF1bHQgcGRmIHNlYXJjaCBlbmRwb2ludFxuICBib29rU3VidGV4dCA9IHtcbiAgICBcImVuZHBvaW50XCI6IFwiaHR0cHM6Ly8wNWRiZDIzMS1jZjQzLTRkMTEtYmQyNC1kOGVhNzFhNDU4MjgubW9jay5wc3Rtbi5pb1wiLFxuICAgIFwidmFyaWFibGVcIjogbnVsbCxcbiAgICBcImZpZWxkXCI6IFsndGl0bGUnXSxcbiAgICBcImRlZmF1bHRGaWVsZFwiOiBcInRpdGxlXCJcbiAgfVxuICBpc0xpbmtEcm9wZG93bk9wZW4gPSBmYWxzZTtcbiAgZmllbGRBc1N0cmluZzogc3RyaW5nID0gJyc7XG4gIGZpbHRlcmVkQ29sdW1uczogYW55W10gPSBbXTtcblxuICBASW5wdXQoKSB0ZW1wbGF0ZVNlbGVjdGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQFZpZXdDaGlsZCgnZHJvcGRvd24nLCB7IHN0YXRpYzogZmFsc2UgfSkgZHJvcGRvd24hOiBFbGVtZW50UmVmO1xuXG5cbiAgZHJhZ2dlZElkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcGRmRWxlbWVudHM6IGFueVtdID0gW107XG4gXG4gIHVuaXF1ZV9pZDogc3RyaW5nID0gJ3BkZi0xMjM0JzsgLy8gc2hvdWxkIGJlIGNvbnNpc3RlbnRcbiAgc2VsZWN0ZWRUZW1wbGF0ZTogYW55O1xuXG4gIGVsZW1lbnRQcm9wZXJ0aWVzID0ge1xuICAgIC8vIEFQLTEwTUFSMjUgLSBEZWZpbmVzIHRoZSBIZWFkZXIgZWxlbWVudCB3aXRoIGEgdGV4dCBpbnB1dCBmaWVsZCAgIFxuICAgIC8vIEFQLTI1TUFSMjUgQWRkIHN1YnRleHQgYWxsIHZhcmlhYmxlc1xuICAgICdIZWFkZXInOiB7XG4gICAgZWxlbWVudFByb3BzOiBbXG4gICAgICB7IGxhYmVsOiAnTGFiZWwnLCBsYWJlbFBhdGg6ICdMQUJFTCcsIHBsYWNlaG9sZGVyOiAnRW50ZXIgVGV4dCcsIHR5cGU6ICd0ZXh0Jywga2V5OiAndGl0bGUnIH1cbiAgICBdLFxuICB9LFxuICAndGV4dCc6IHtcbiAgICBlbGVtZW50UHJvcHM6IFtcbiAgICAgIHsgbGFiZWw6ICdQbGFjZSBIb2xkZXInLCBsYWJlbFBhdGg6ICdQTEFDRUhPTERFUicsIHBsYWNlaG9sZGVyOiAnRW50ZXIgVGV4dCcsIHR5cGU6ICd0ZXh0Jywga2V5OiAncXVlc3Rpb24nIH0sXG4gICAgICB7IGxhYmVsOiAnRWxlbWVudCcsIGxhYmVsUGF0aDogJ0VMRU1FTlQnLCB0eXBlOiAnbnVtYmVyJywga2V5OiAncXVlc3Rpb25OdW1iZXInIH0sXG4gICAgICB7IGxhYmVsOiAnd2lkdGgnLCBsYWJlbFBhdGg6ICdXSURUSCcsIHR5cGU6ICdmaWVsZFNpemUnLCBrZXk6ICd3aWR0aCcgfSxcbiAgICBdLFxuICAgIGZpZWxkUHJvcHM6IFtcbiAgICAgIHsgbGFiZWw6ICcnLCBsYWJlbFBhdGg6ICdUT0dHTEVPUFRJT05TJywgdHlwZTogJ3RvZ2dsZUdyb3VwJywga2V5OiAndG9nZ2xlT3B0aW9ucycgfSxcbiAgICAgIHsgbGFiZWw6ICdIZWxwIFRleHQnLCBsYWJlbFBhdGg6ICdIRUxQVEVYVCcsIHBsYWNlaG9sZGVyOiAnRW50ZXIgVGV4dCcsIHR5cGU6ICd0ZXh0JyB9LFxuICAgICAgeyBsYWJlbDogJ1ZhbHVlJywgbGFiZWxQYXRoOiAnVkFMVUUnLCBwbGFjZWhvbGRlcjogJ0VudGVyIFRleHQnLCB0eXBlOiAndGV4dCcsIGtleTogJ3ZhbHVlJyB9LFxuICAgICAgeyBsYWJlbDogJ1JlZmVyZW5jZSBGaWVsZCcsIGxhYmVsUGF0aDogJ1JFRkVSRU5DRUZJRUxEJywgcGxhY2Vob2xkZXI6ICdSZWZlcmVuY2UgRmllbGQnLCB0eXBlOiAndGV4dCcsIGtleTogJ3JlZmVyZW5jZUZpZWxkJyB9LFxuICAgICAge1xuICAgICAgICBsYWJlbDogJycsIGxhYmVsUGF0aDogJ1NVQlRFWFQnLCBwbGFjZWhvbGRlcjogJ0VudGVyIFRleHQnLCB0eXBlOiAnc3ViUXVlc3Rpb24nLCBrZXk6ICdpc1N1YlRleHQnLFxuICAgICAgICBzdWJRdWVzdGlvbjogW11cbiAgICAgIH1cbiAgICBdLFxuICAgIGFwcGVhcmFuY2U6IFtcbiAgICAgIHtcbiAgICAgICAgbGFiZWw6ICdTZWxlY3QgRm9udCcsIGxhYmVsUGF0aDogJ1NFTEVDVEZPTlQnLCB0eXBlOiAnc2VsZWN0Jywga2V5OiAnZm9udCcsIHBsYWNlaG9sZGVyOiAnTGVmdCcsXG4gICAgICAgIG9wdGlvbnM6IFsnSGVsdmV0aWNhIE5ldWUnLCAnQXJpYWwnLCAnVGltZXMgTmV3IFJvbWFuJywgJ1JvYm90byddXG4gICAgICB9LFxuICAgICAgeyBsYWJlbDogJ0ZvbnQgQ29sb3InLCBsYWJlbFBhdGg6ICdGT05UQ09MT1InLCB0eXBlOiAnY29sb3InLCBrZXk6ICdmb250Q29sb3InLCB2YWx1ZTogJycgfSxcbiAgICAgIHtcbiAgICAgICAgbGFiZWw6ICdGb250IFNpemUnLCBsYWJlbFBhdGg6ICdGT05UU0laRScsIHR5cGU6ICdudW1iZXInLCBrZXk6ICdmb250U2l6ZScsIHZhbHVlOiAxNFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbGFiZWw6ICdGb250IFdlaWdodCcsIGxhYmVsUGF0aDogJ0ZPTlRXRUlHSFQnLCB0eXBlOiAnc2VsZWN0Jywga2V5OiAnZm9udFdlaWdodCcsIHZhbHVlOiAnJyxcbiAgICAgICAgb3B0aW9uczogW1xuICAgICAgICAgIHsgdmFsdWU6ICc0MDAnLCBsYWJlbDogJzQwMC1Ob3JtYWwnLCBsYWJlbFBhdGg6ICdGT05UV0VJR0hUX05PUk1BTCcgfSxcbiAgICAgICAgICB7IHZhbHVlOiAnNTAwJywgbGFiZWw6ICc1MDAtTWVkaXVtJywgbGFiZWxQYXRoOiAnRk9OVFdFSUdIVF9NRURJVU0nIH0sXG4gICAgICAgICAgeyB2YWx1ZTogJzYwMCcsIGxhYmVsOiAnNjAwLVNlbWkgQm9sZCcsIGxhYmVsUGF0aDogJ0ZPTlRXRUlHSFRfU0VNSUJPTEQnIH0sXG4gICAgICAgICAgeyB2YWx1ZTogJzcwMCcsIGxhYmVsOiAnNzAwLUJvbGQnLCBsYWJlbFBhdGg6ICdGT05UV0VJR0hUX0JPTEQnIH1cbiAgICAgICAgXVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbGFiZWw6ICdGb250IFN0eWxlJywgbGFiZWxQYXRoOiAnRk9OVFNUWUxFJywgdHlwZTogJ3NlbGVjdCcsIGtleTogJ2ZvbnRTdHlsZScsIHZhbHVlOiAnJyxcbiAgICAgICAgb3B0aW9uczogW1xuICAgICAgICAgIHsgbGFiZWw6ICdOb3JtYWwnLCBsYWJlbFBhdGg6ICdGT05UU1RZTEVfTk9STUFMJywgdmFsdWU6ICdub3JtYWwnIH0sXG4gICAgICAgICAgeyBsYWJlbDogJ0JvbGQnLCBsYWJlbFBhdGg6ICdGT05UU1RZTEVfQk9MRCcsIHZhbHVlOiAnYm9sZCcgfSxcbiAgICAgICAgICB7IGxhYmVsOiAnSXRhbGljJywgbGFiZWxQYXRoOiAnRk9OVFNUWUxFX0lUQUxJQycsIHZhbHVlOiAnaXRhbGljJyB9XG4gICAgICAgIF1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGxhYmVsOiAnTWFyZ2luJywgbGFiZWxQYXRoOiAnTUFSR0lOJywgdHlwZTogJ21hcmdpblBpY2tlcicsIGtleTogJ21hcmdpbicsXG4gICAgICAgIHBsYWNlaG9sZGVyOiAnTGVmdCwgVG9wLCBSaWdodCwgQm90dG9tJywgdmFsdWU6IFswLCAwLCAwLCAwXVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbGFiZWw6ICdBbGlnbiBJdGVtJywgbGFiZWxQYXRoOiAnQUxJR05JVEVNJywgdHlwZTogJ3NlbGVjdCcsIGtleTogJ2FsaWduSXRlbXMnLCB2YWx1ZTogJycsXG4gICAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgICB7IGxhYmVsOiAnTGVmdCcsIGxhYmVsUGF0aDogJ0FMSUdOSVRFTV9MRUZUJywgdmFsdWU6ICdsZWZ0JyB9LFxuICAgICAgICAgIHsgbGFiZWw6ICdDZW50ZXInLCBsYWJlbFBhdGg6ICdBTElHTklURU1fQ0VOVEVSJywgdmFsdWU6ICdjZW50ZXInIH0sXG4gICAgICAgICAgeyBsYWJlbDogJ1JpZ2h0JywgbGFiZWxQYXRoOiAnQUxJR05JVEVNX1JJR0hUJywgdmFsdWU6ICdyaWdodCcgfVxuICAgICAgICBdXG4gICAgICB9XG4gICAgXVxuICB9LFxuICAgICdpbnB1dCc6IHtcbiAgICAgIGVsZW1lbnRQcm9wczogW1xuICAgICAgICB7IGxhYmVsOiAnUGxhY2UgSG9sZGVyJywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0JywgdHlwZTogJ3RleHQnLCBrZXk6ICdxdWVzdGlvbicgfSxcbiAgICAgICAgeyBsYWJlbDogJ0VsZW1lbnQnLCB0eXBlOiAnbnVtYmVyJywga2V5OiAncXVlc3Rpb25OdW1iZXInIH0sXG4gICAgICAgIHsgbGFiZWw6ICd3aWR0aCcsIHR5cGU6ICdmaWVsZFNpemUnLCBrZXk6ICd3aWR0aCcgfSxcbiAgICAgIF0sXG4gICAgICBmaWVsZFByb3BzOiBbXG4gICAgICAgIHsgbGFiZWw6ICcnLCB0eXBlOiAndG9nZ2xlR3JvdXAnLCBrZXk6ICd0b2dnbGVPcHRpb25zJyB9LFxuICAgICAgICB7IGxhYmVsOiAnSGVscCBUZXh0JywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0ICcsIHR5cGU6ICd0ZXh0JyB9LFxuICAgICAgICB7IGxhYmVsOiAnVmFsdWUnLCBwbGFjZWhvbGRlcjogJ0VudGVyIFRleHQgJywgdHlwZTogJ3RleHQnLCBrZXk6ICd2YWx1ZScgfSxcbiAgICAgICAgeyBsYWJlbDogJ1JlZmVyZW5jZSBGaWVsZCcsIHBsYWNlaG9sZGVyOiAnUmVmZXJlbmNlIEZpZWxkJywgdHlwZTogJ3RleHQnLCBrZXk6ICdyZWZlcmVuY2VGaWVsZCcgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibGFiZWxcIjogXCJcIiwgXCJwbGFjZWhvbGRlclwiOiBcIkVudGVyIFRleHRcIiwgXCJ0eXBlXCI6IFwic3ViUXVlc3Rpb25cIiwgXCJrZXlcIjogXCJpc1N1YlRleHRcIixcbiAgICAgICAgICBcInN1YlF1ZXN0aW9uXCI6IFtcbiAgICAgICAgICBdXG4gICAgICAgIH1cbiAgICAgIF0sXG4gICAgICBhcHBlYXJhbmNlOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ1NlbGVjdCBGb250JywgdHlwZTogJ3NlbGVjdCcsIGtleTogJ2ZvbnQnLCBwbGFjZWhvbGRlcjogJ0xlZnQnLFxuICAgICAgICAgIG9wdGlvbnM6IFsnSGVsdmV0aWNhIE5ldWUnLCAnQXJpYWwnLCAnVGltZXMgTmV3IFJvbWFuJywgJ1JvYm90byddXG4gICAgICAgIH0sXG4gICAgICAgIHsgbGFiZWw6ICdGb250IENvbG9yJywgdHlwZTogJ2NvbG9yJywga2V5OiAnZm9udENvbG9yJywgdmFsdWU6ICcnIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ0ZvbnQgU2l6ZScsXG4gICAgICAgICAgdHlwZTogJ251bWJlcicsICAgIFxuICAgICAgICAgIGtleTogJ2ZvbnRTaXplJyxcbiAgICAgICAgICB2YWx1ZTogMTQgICAgICAgICAgXG4gICAgICAgIH0sICAgICAgICBcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnRm9udCBXZWlnaHQnLCB0eXBlOiAnc2VsZWN0Jywga2V5OiAnZm9udFdlaWdodCcsIHZhbHVlOiAnJyxcbiAgICAgICAgICBvcHRpb25zOiBbXG4gICAgICAgICAgICB7IHZhbHVlOiAnNDAwJywgbGFiZWw6ICc0MDAtTm9ybWFsJyB9LFxuICAgICAgICAgICAgeyB2YWx1ZTogJzUwMCcsIGxhYmVsOiAnNTAwLU1lZGl1bScgfSxcbiAgICAgICAgICAgIHsgdmFsdWU6ICc2MDAnLCBsYWJlbDogJzYwMC1TZW1pIEJvbGQnIH0sXG4gICAgICAgICAgICB7IHZhbHVlOiAnNzAwJywgbGFiZWw6ICc3MDAtQm9sZCcgfVxuICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnRm9udCBTdHlsZScsIHR5cGU6ICdzZWxlY3QnLCBrZXk6ICdmb250U3R5bGUnLCB2YWx1ZTogJycsXG4gICAgICAgICAgb3B0aW9uczogW1xuICAgICAgICAgICAgeyBsYWJlbDogJ05vcm1hbCcsIHZhbHVlOiAnbm9ybWFsJyB9LFxuICAgICAgICAgICAgeyBsYWJlbDogJ0JvbGQnLCB2YWx1ZTogJ2JvbGQnIH0sXG4gICAgICAgICAgICB7IGxhYmVsOiAnSXRhbGljJywgdmFsdWU6ICdpdGFsaWMnIH1cbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ01hcmdpbicsIHR5cGU6ICdtYXJnaW5QaWNrZXInLCBrZXk6ICdtYXJnaW4nLFxuICAgICAgICAgIHBsYWNlaG9sZGVyOiAnTGVmdCwgVG9wLCBSaWdodCwgQm90dG9tJyxcbiAgICAgICAgICB2YWx1ZTogWzAsIDAsIDAsIDBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ0FsaWduIEl0ZW0nLCB0eXBlOiAnc2VsZWN0Jywga2V5OiAnYWxpZ25JdGVtcycsIHZhbHVlOiAnJyxcbiAgICAgICAgICBvcHRpb25zOiBbXG4gICAgICAgICAgICB7IGxhYmVsOiAnTGVmdCcsIHZhbHVlOiAnbGVmdCcgfSxcbiAgICAgICAgICAgIHsgbGFiZWw6ICdDZW50ZXInLCB2YWx1ZTogJ2NlbnRlcicgfSxcbiAgICAgICAgICAgIHsgbGFiZWw6ICdSaWdodCcsIHZhbHVlOiAncmlnaHQnIH1cbiAgICAgICAgICBdXG4gICAgICAgIH1cbiAgICAgIF1cbiAgICAgIFxuICAgIH0sXG4gICAgJ2RhdGUnOiB7XG4gICAgICBlbGVtZW50UHJvcHM6IFtcbiAgICAgICAgeyBsYWJlbDogJ1BsYWNlIEhvbGRlcicsIHBsYWNlaG9sZGVyOiAnRW50ZXIgVGV4dCcsIHR5cGU6ICd0ZXh0Jywga2V5OiAncXVlc3Rpb24nIH0sXG4gICAgICAgIHsgbGFiZWw6ICdFbGVtZW50JywgdHlwZTogJ251bWJlcicsIGtleTogJ3F1ZXN0aW9uTnVtYmVyJyB9LFxuICAgICAgICB7IGxhYmVsOiAnd2lkdGgnLCB0eXBlOiAnZmllbGRTaXplJywga2V5OiAnd2lkdGgnIH0sXG4gICAgICBdLFxuICAgICAgZmllbGRQcm9wczogW1xuICAgICAgICB7IGxhYmVsOiAnJywgdHlwZTogJ3RvZ2dsZUdyb3VwJywga2V5OiAndG9nZ2xlT3B0aW9ucycgfSxcbiAgICAgICAgeyBsYWJlbDogJ0hlbHAgVGV4dCcsIHBsYWNlaG9sZGVyOiAnRW50ZXIgVGV4dCAnLCB0eXBlOiAndGV4dCcgfSxcbiAgICAgICAgeyBsYWJlbDogJ1ZhbHVlJywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0ICcsIHR5cGU6ICd0ZXh0Jywga2V5OiAndmFsdWUnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdSZWZlcmVuY2UgRmllbGQnLCBwbGFjZWhvbGRlcjogJ1JlZmVyZW5jZSBGaWVsZCcsIHR5cGU6ICd0ZXh0Jywga2V5OiAncmVmZXJlbmNlRmllbGQnIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcImxhYmVsXCI6IFwiXCIsIFwicGxhY2Vob2xkZXJcIjogXCJFbnRlciBUZXh0XCIsIFwidHlwZVwiOiBcInN1YlF1ZXN0aW9uXCIsIFwia2V5XCI6IFwiaXNTdWJUZXh0XCIsXG4gICAgICAgICAgXCJzdWJRdWVzdGlvblwiOiBbXG4gICAgICAgICAgXVxuICAgICAgICB9XG4gICAgICBdLFxuICAgICAgYXBwZWFyYW5jZTogW1xuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICdTZWxlY3QgRm9udCcsIHR5cGU6ICdzZWxlY3QnLCBrZXk6ICdmb250JywgcGxhY2Vob2xkZXI6ICdMZWZ0JyxcbiAgICAgICAgICBvcHRpb25zOiBbJ0hlbHZldGljYSBOZXVlJywgJ0FyaWFsJywgJ1RpbWVzIE5ldyBSb21hbicsICdSb2JvdG8nXVxuICAgICAgICB9LFxuICAgICAgICB7IGxhYmVsOiAnRm9udCBDb2xvcicsIHR5cGU6ICdjb2xvcicsIGtleTogJ2ZvbnRDb2xvcicsIHZhbHVlOiAnJyB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICdGb250IFNpemUnLFxuICAgICAgICAgIHR5cGU6ICdudW1iZXInLCAgICBcbiAgICAgICAgICBrZXk6ICdmb250U2l6ZScsXG4gICAgICAgICAgdmFsdWU6IDE0ICAgICAgICAgIFxuICAgICAgICB9LCAgICAgICAgXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ0ZvbnQgV2VpZ2h0JywgdHlwZTogJ3NlbGVjdCcsIGtleTogJ2ZvbnRXZWlnaHQnLCB2YWx1ZTogJycsXG4gICAgICAgICAgb3B0aW9uczogW1xuICAgICAgICAgICAgeyB2YWx1ZTogJzQwMCcsIGxhYmVsOiAnNDAwLU5vcm1hbCcgfSxcbiAgICAgICAgICAgIHsgdmFsdWU6ICc1MDAnLCBsYWJlbDogJzUwMC1NZWRpdW0nIH0sXG4gICAgICAgICAgICB7IHZhbHVlOiAnNjAwJywgbGFiZWw6ICc2MDAtU2VtaSBCb2xkJyB9LFxuICAgICAgICAgICAgeyB2YWx1ZTogJzcwMCcsIGxhYmVsOiAnNzAwLUJvbGQnIH1cbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ0ZvbnQgU3R5bGUnLCB0eXBlOiAnc2VsZWN0Jywga2V5OiAnZm9udFN0eWxlJywgdmFsdWU6ICcnLFxuICAgICAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgICAgIHsgbGFiZWw6ICdOb3JtYWwnLCB2YWx1ZTogJ25vcm1hbCcgfSxcbiAgICAgICAgICAgIHsgbGFiZWw6ICdCb2xkJywgdmFsdWU6ICdib2xkJyB9LFxuICAgICAgICAgICAgeyBsYWJlbDogJ0l0YWxpYycsIHZhbHVlOiAnaXRhbGljJyB9XG4gICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICdNYXJnaW4nLCB0eXBlOiAnbWFyZ2luUGlja2VyJywga2V5OiAnbWFyZ2luJyxcbiAgICAgICAgICBwbGFjZWhvbGRlcjogJ0xlZnQsIFRvcCwgUmlnaHQsIEJvdHRvbScsXG4gICAgICAgICAgdmFsdWU6IFswLCAwLCAwLCAwXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICdBbGlnbiBJdGVtJywgdHlwZTogJ3NlbGVjdCcsIGtleTogJ2FsaWduSXRlbXMnLCB2YWx1ZTogJycsXG4gICAgICAgICAgb3B0aW9uczogW1xuICAgICAgICAgICAgeyBsYWJlbDogJ0xlZnQnLCB2YWx1ZTogJ2xlZnQnIH0sXG4gICAgICAgICAgICB7IGxhYmVsOiAnQ2VudGVyJywgdmFsdWU6ICdjZW50ZXInIH0sXG4gICAgICAgICAgICB7IGxhYmVsOiAnUmlnaHQnLCB2YWx1ZTogJ3JpZ2h0JyB9XG4gICAgICAgICAgXVxuICAgICAgICB9XG4gICAgICBdXG4gICAgICBcbiAgICB9LFxuICAgICdQZGYnOiB7XG4gICAgZWxlbWVudFByb3BzOiBbXG4gICAgICB7IGxhYmVsOiAnRWxlbWVudCcsIGxhYmVsUGF0aDogJ0VMRU1FTlQnLCB0eXBlOiAnbnVtYmVyJywga2V5OiAncXVlc3Rpb25OdW1iZXInIH0sXG4gICAgICB7IGxhYmVsOiAnd2lkdGgnLCBsYWJlbFBhdGg6ICdXSURUSCcsIHR5cGU6ICdmaWVsZFNpemUnLCBrZXk6ICd3aWR0aCcgfVxuICAgIF0sXG4gICAgZmllbGRQcm9wczogW1xuICAgICAgeyBsYWJlbDogJ0hlbHAgVGV4dCcsIGxhYmVsUGF0aDogJ0hFTFBURVhUJywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0JywgdHlwZTogJ3RleHQnIH0sXG4gICAgICB7IGxhYmVsOiAnVmFsdWUnLCBsYWJlbFBhdGg6ICdWQUxVRScsIHBsYWNlaG9sZGVyOiAnRW50ZXIgVGV4dCcsIHR5cGU6ICd0ZXh0Jywga2V5OiAndmFsdWUnIH0sXG4gICAgICB7IGxhYmVsOiAnUmVmZXJlbmNlIEZpZWxkJywgbGFiZWxQYXRoOiAnUkVGRVJFTkNFRklFTEQnLCBwbGFjZWhvbGRlcjogJ1JlZmVyZW5jZSBGaWVsZCcsIHR5cGU6ICd0ZXh0Jywga2V5OiAncmVmZXJlbmNlRmllbGQnIH0sXG4gICAgICB7XG4gICAgICAgIGxhYmVsOiAnJywgbGFiZWxQYXRoOiAnU1VCVEVYVCcsIHBsYWNlaG9sZGVyOiAnRW50ZXIgVGV4dCcsIHR5cGU6ICdzdWJRdWVzdGlvbicsIGtleTogJ2lzU3ViVGV4dCcsXG4gICAgICAgIHN1YlF1ZXN0aW9uOiBbXVxuICAgICAgfVxuICAgIF0sXG4gICAgYXBwZWFyYW5jZTogW11cbiAgfSxcbiAgICAvLyBBUC0xOU1BUjI1IEFkZCBMaW5lIFByb3BlcnR5XG4gICAgJ0xpbmUnOiB7XG4gICAgICBlbGVtZW50UHJvcHM6IFtcbiAgICAgICAgeyBsYWJlbDogJ0xpbmUgV2lkdGgnLCB0eXBlOiAnZmllbGRTaXplJywga2V5OiAnd2lkdGgnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdQYWRkaW5nIFRvcCcsIHR5cGU6ICdudW1iZXInLCBrZXk6ICdwYWRkaW5nVG9wJywgcGxhY2Vob2xkZXI6ICdFbnRlciBwYWRkaW5nIHRvcCcgfSxcbiAgICAgICAgeyBsYWJlbDogJ1BhZGRpbmcgQm90dG9tJywgdHlwZTogJ251bWJlcicsIGtleTogJ3BhZGRpbmdCb3R0b20nLCBwbGFjZWhvbGRlcjogJ0VudGVyIHBhZGRpbmcgYm90dG9tJyB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICdMaW5lIFN0eWxlJywgdHlwZTogJ3NlbGVjdCcsIGtleTogJ2xpbmVTdHlsZScsXG4gICAgICAgICAgb3B0aW9uczogWydTb2xpZCcsICdEYXNoZWQnLCAnRG90dGVkJ11cbiAgICAgICAgfVxuICAgICAgXSxcbiAgICAgIGZpZWxkUHJvcHM6IFtdLFxuICAgICAgYXBwZWFyYW5jZTogW1xuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICdTZWxlY3QgRm9udCcsIHR5cGU6ICdzZWxlY3QnLCBrZXk6ICdmb250JywgcGxhY2Vob2xkZXI6ICdMZWZ0JyxcbiAgICAgICAgICBvcHRpb25zOiBbJ0hlbHZldGljYSBOZXVlJywgJ0FyaWFsJywgJ1RpbWVzIE5ldyBSb21hbicsICdSb2JvdG8nXVxuICAgICAgICB9LFxuICAgICAgICB7IGxhYmVsOiAnRm9udCBDb2xvcicsIHR5cGU6ICdjb2xvcicsIGtleTogJ2ZvbnRDb2xvcicsIHZhbHVlOiAnJyB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICdGb250IFNpemUnLFxuICAgICAgICAgIHR5cGU6ICdudW1iZXInLCAgICBcbiAgICAgICAgICBrZXk6ICdmb250U2l6ZScsXG4gICAgICAgICAgdmFsdWU6IDE0ICAgICAgICAgIFxuICAgICAgICB9LCAgICAgICAgXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ0ZvbnQgV2VpZ2h0JywgdHlwZTogJ3NlbGVjdCcsIGtleTogJ2ZvbnRXZWlnaHQnLCB2YWx1ZTogJycsXG4gICAgICAgICAgb3B0aW9uczogW1xuICAgICAgICAgICAgeyB2YWx1ZTogJzQwMCcsIGxhYmVsOiAnNDAwLU5vcm1hbCcgfSxcbiAgICAgICAgICAgIHsgdmFsdWU6ICc1MDAnLCBsYWJlbDogJzUwMC1NZWRpdW0nIH0sXG4gICAgICAgICAgICB7IHZhbHVlOiAnNjAwJywgbGFiZWw6ICc2MDAtU2VtaSBCb2xkJyB9LFxuICAgICAgICAgICAgeyB2YWx1ZTogJzcwMCcsIGxhYmVsOiAnNzAwLUJvbGQnIH1cbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ0ZvbnQgU3R5bGUnLCB0eXBlOiAnc2VsZWN0Jywga2V5OiAnZm9udFN0eWxlJywgdmFsdWU6ICcnLFxuICAgICAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgICAgIHsgbGFiZWw6ICdOb3JtYWwnLCB2YWx1ZTogJ25vcm1hbCcgfSxcbiAgICAgICAgICAgIHsgbGFiZWw6ICdCb2xkJywgdmFsdWU6ICdib2xkJyB9LFxuICAgICAgICAgICAgeyBsYWJlbDogJ0l0YWxpYycsIHZhbHVlOiAnaXRhbGljJyB9XG4gICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICdNYXJnaW4nLCB0eXBlOiAnbWFyZ2luUGlja2VyJywga2V5OiAnbWFyZ2luJyxcbiAgICAgICAgICBwbGFjZWhvbGRlcjogJ0xlZnQsIFRvcCwgUmlnaHQsIEJvdHRvbScsXG4gICAgICAgICAgdmFsdWU6IFswLCAwLCAwLCAwXVxuICAgICAgICB9LFxuICAgICAgICAvLyB7XG4gICAgICAgIC8vICAgbGFiZWw6ICdBbGlnbiBJdGVtJywgdHlwZTogJ3NlbGVjdCcsIGtleTogJ2FsaWduSXRlbXMnLCB2YWx1ZTogJycsXG4gICAgICAgIC8vICAgb3B0aW9uczogW1xuICAgICAgICAvLyAgICAgeyBsYWJlbDogJ0xlZnQnLCB2YWx1ZTogJ2xlZnQnIH0sXG4gICAgICAgIC8vICAgICB7IGxhYmVsOiAnQ2VudGVyJywgdmFsdWU6ICdjZW50ZXInIH0sXG4gICAgICAgIC8vICAgICB7IGxhYmVsOiAnUmlnaHQnLCB2YWx1ZTogJ3JpZ2h0JyB9XG4gICAgICAgIC8vICAgXVxuICAgICAgICAvLyB9XG4gICAgICBdXG4gICAgICBcbiAgICB9LFxuXG4gICAgJ1NwYWNlJzoge1xuICAgICAgZWxlbWVudFByb3BzOiBbXG4gICAgICAgIHsgbGFiZWw6ICdFbGVtZW50JywgdHlwZTogJ251bWJlcicsIGtleTogJ3F1ZXN0aW9uTnVtYmVyJyB9LFxuICAgICAgICB7IGxhYmVsOiAnRmllbGQgU2l6ZScsIHR5cGU6ICdmaWVsZFNpemUnLCBrZXk6ICd3aWR0aCcgfSxcbiAgICAgIF0sXG4gICAgICBmaWVsZFByb3BzOiBbXSxcbiAgICAgIGFwcGVhcmFuY2U6IFtcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnU2VsZWN0IEZvbnQnLCB0eXBlOiAnc2VsZWN0Jywga2V5OiAnZm9udCcsIHBsYWNlaG9sZGVyOiAnTGVmdCcsXG4gICAgICAgICAgb3B0aW9uczogWydIZWx2ZXRpY2EgTmV1ZScsICdBcmlhbCcsICdUaW1lcyBOZXcgUm9tYW4nLCAnUm9ib3RvJ11cbiAgICAgICAgfSxcbiAgICAgICAgeyBsYWJlbDogJ0ZvbnQgQ29sb3InLCB0eXBlOiAnY29sb3InLCBrZXk6ICdmb250Q29sb3InLCB2YWx1ZTogJycgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnRm9udCBTaXplJyxcbiAgICAgICAgICB0eXBlOiAnbnVtYmVyJywgICAgXG4gICAgICAgICAga2V5OiAnZm9udFNpemUnLFxuICAgICAgICAgIHZhbHVlOiAxNCAgICAgICAgICBcbiAgICAgICAgfSwgICAgICAgIFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICdGb250IFdlaWdodCcsIHR5cGU6ICdzZWxlY3QnLCBrZXk6ICdmb250V2VpZ2h0JywgdmFsdWU6ICcnLFxuICAgICAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgICAgIHsgdmFsdWU6ICc0MDAnLCBsYWJlbDogJzQwMC1Ob3JtYWwnIH0sXG4gICAgICAgICAgICB7IHZhbHVlOiAnNTAwJywgbGFiZWw6ICc1MDAtTWVkaXVtJyB9LFxuICAgICAgICAgICAgeyB2YWx1ZTogJzYwMCcsIGxhYmVsOiAnNjAwLVNlbWkgQm9sZCcgfSxcbiAgICAgICAgICAgIHsgdmFsdWU6ICc3MDAnLCBsYWJlbDogJzcwMC1Cb2xkJyB9XG4gICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICdGb250IFN0eWxlJywgdHlwZTogJ3NlbGVjdCcsIGtleTogJ2ZvbnRTdHlsZScsIHZhbHVlOiAnJyxcbiAgICAgICAgICBvcHRpb25zOiBbXG4gICAgICAgICAgICB7IGxhYmVsOiAnTm9ybWFsJywgdmFsdWU6ICdub3JtYWwnIH0sXG4gICAgICAgICAgICB7IGxhYmVsOiAnQm9sZCcsIHZhbHVlOiAnYm9sZCcgfSxcbiAgICAgICAgICAgIHsgbGFiZWw6ICdJdGFsaWMnLCB2YWx1ZTogJ2l0YWxpYycgfVxuICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnTWFyZ2luJywgdHlwZTogJ21hcmdpblBpY2tlcicsIGtleTogJ21hcmdpbicsXG4gICAgICAgICAgcGxhY2Vob2xkZXI6ICdMZWZ0LCBUb3AsIFJpZ2h0LCBCb3R0b20nLFxuICAgICAgICAgIHZhbHVlOiBbMCwgMCwgMCwgMF1cbiAgICAgICAgfSxcbiAgICAgICAgLy8ge1xuICAgICAgICAvLyAgIGxhYmVsOiAnQWxpZ24gSXRlbScsIHR5cGU6ICdzZWxlY3QnLCBrZXk6ICdhbGlnbkl0ZW1zJywgdmFsdWU6ICcnLFxuICAgICAgICAvLyAgIG9wdGlvbnM6IFtcbiAgICAgICAgLy8gICAgIHsgbGFiZWw6ICdMZWZ0JywgdmFsdWU6ICdsZWZ0JyB9LFxuICAgICAgICAvLyAgICAgeyBsYWJlbDogJ0NlbnRlcicsIHZhbHVlOiAnY2VudGVyJyB9LFxuICAgICAgICAvLyAgICAgeyBsYWJlbDogJ1JpZ2h0JywgdmFsdWU6ICdyaWdodCcgfVxuICAgICAgICAvLyAgIF1cbiAgICAgICAgLy8gfVxuICAgICAgXVxuICAgICAgXG4gICAgfSxcblxuICAgIFwiVGFibGVcIjoge1xuICAgICAgXCJlbGVtZW50UHJvcHNcIjogW1xuICAgICAgICB7IFwibGFiZWxcIjogXCJyb3dDaG9pY2VcIiwgXCJwbGFjZWhvbGRlclwiOiBcIlwiLCBcInR5cGVcIjogXCJ0ZXh0XCIsIFwia2V5XCI6IFwicm93Q2hvaWNlXCIgfSxcbiAgICAgICAgeyBsYWJlbDogJ3F1ZXN0aW9uTnVtYmVyJywgdHlwZTogJ251bWJlcicsIGtleTogJ3F1ZXN0aW9uTnVtYmVyJyB9LFxuICAgICAgICB7IGxhYmVsOiAnVGFibGUgU2l6ZScsIHR5cGU6ICdmaWVsZFNpemUnLCBrZXk6ICd3aWR0aCcgfSxcbiAgICAgIF0sXG4gICAgICBcImZpZWxkUHJvcHNcIjogW1xuICAgICAgICB7IFwibGFiZWxcIjogXCJ0YWJsZUlkXCIsIFwicGxhY2Vob2xkZXJcIjogXCJFbXBfVGFibGVfMDFcIiwgXCJ0eXBlXCI6IFwidGV4dFwiLCBcImtleVwiOiBcInRhYmxlSWRcIiB9LFxuICAgICAgICB7IFwibGFiZWxcIjogXCJ2YWx1ZVwiLCBcInBsYWNlaG9sZGVyXCI6IFwiVmFsdWVcIiwgXCJ0eXBlXCI6IFwidGV4dFwiLCBcImtleVwiOiBcInZhbHVlXCIgfSxcbiAgICAgICAgeyBsYWJlbDogJ1JlZmVyZW5jZScsIHBsYWNlaG9sZGVyOiAnUmVmZXJlbmNlIEZpZWxkJywgdHlwZTogJ3RleHQnLCBrZXk6ICdyZWZlcmVuY2VGaWVsZCcgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibGFiZWxcIjogXCJcIiwgXCJwbGFjZWhvbGRlclwiOiBcIkVudGVyIFRleHRcIiwgXCJ0eXBlXCI6IFwic3ViUXVlc3Rpb25cIiwgXCJrZXlcIjogXCJpc1N1YlRleHRcIixcbiAgICAgICAgICBcInN1YlF1ZXN0aW9uXCI6IFtcbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgYXBwZWFyYW5jZTogW1xuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICdTZWxlY3QgRm9udCcsIHR5cGU6ICdzZWxlY3QnLCBrZXk6ICdmb250JywgcGxhY2Vob2xkZXI6ICdMZWZ0JyxcbiAgICAgICAgICBvcHRpb25zOiBbJ0hlbHZldGljYSBOZXVlJywgJ0FyaWFsJywgJ1RpbWVzIE5ldyBSb21hbicsICdSb2JvdG8nXVxuICAgICAgICB9LFxuICAgICAgICB7IGxhYmVsOiAnRm9udCBDb2xvcicsIHR5cGU6ICdjb2xvcicsIGtleTogJ2ZvbnRDb2xvcicsIHZhbHVlOiAnJyB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICdGb250IFNpemUnLFxuICAgICAgICAgIHR5cGU6ICdudW1iZXInLCAgICBcbiAgICAgICAgICBrZXk6ICdmb250U2l6ZScsXG4gICAgICAgICAgdmFsdWU6IDE0ICAgICAgICAgIFxuICAgICAgICB9LCAgICAgICAgXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ0ZvbnQgV2VpZ2h0JywgdHlwZTogJ3NlbGVjdCcsIGtleTogJ2ZvbnRXZWlnaHQnLCB2YWx1ZTogJycsXG4gICAgICAgICAgb3B0aW9uczogW1xuICAgICAgICAgICAgeyB2YWx1ZTogJzQwMCcsIGxhYmVsOiAnNDAwLU5vcm1hbCcgfSxcbiAgICAgICAgICAgIHsgdmFsdWU6ICc1MDAnLCBsYWJlbDogJzUwMC1NZWRpdW0nIH0sXG4gICAgICAgICAgICB7IHZhbHVlOiAnNjAwJywgbGFiZWw6ICc2MDAtU2VtaSBCb2xkJyB9LFxuICAgICAgICAgICAgeyB2YWx1ZTogJzcwMCcsIGxhYmVsOiAnNzAwLUJvbGQnIH1cbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ0ZvbnQgU3R5bGUnLCB0eXBlOiAnc2VsZWN0Jywga2V5OiAnZm9udFN0eWxlJywgdmFsdWU6ICcnLFxuICAgICAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgICAgIHsgbGFiZWw6ICdOb3JtYWwnLCB2YWx1ZTogJ25vcm1hbCcgfSxcbiAgICAgICAgICAgIHsgbGFiZWw6ICdCb2xkJywgdmFsdWU6ICdib2xkJyB9LFxuICAgICAgICAgICAgeyBsYWJlbDogJ0l0YWxpYycsIHZhbHVlOiAnaXRhbGljJyB9XG4gICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICdNYXJnaW4nLCB0eXBlOiAnbWFyZ2luUGlja2VyJywga2V5OiAnbWFyZ2luJyxcbiAgICAgICAgICBwbGFjZWhvbGRlcjogJ0xlZnQsIFRvcCwgUmlnaHQsIEJvdHRvbScsXG4gICAgICAgICAgdmFsdWU6IFswLCAwLCAwLCAwXVxuICAgICAgICB9LFxuICAgICAgICAvLyB7XG4gICAgICAgIC8vICAgbGFiZWw6ICdBbGlnbiBJdGVtJywgdHlwZTogJ3NlbGVjdCcsIGtleTogJ2FsaWduSXRlbXMnLCB2YWx1ZTogJycsXG4gICAgICAgIC8vICAgb3B0aW9uczogW1xuICAgICAgICAvLyAgICAgeyBsYWJlbDogJ0xlZnQnLCB2YWx1ZTogJ2xlZnQnIH0sXG4gICAgICAgIC8vICAgICB7IGxhYmVsOiAnQ2VudGVyJywgdmFsdWU6ICdjZW50ZXInIH0sXG4gICAgICAgIC8vICAgICB7IGxhYmVsOiAnUmlnaHQnLCB2YWx1ZTogJ3JpZ2h0JyB9XG4gICAgICAgIC8vICAgXVxuICAgICAgICAvLyB9XG4gICAgICBdXG4gICAgICBcbiAgICB9LFxuXG4gICAgXCJUYWJsZUNvbHVtblwiOiB7XG4gICAgICBcImVsZW1lbnRQcm9wc1wiOiBbXG5cbiAgICAgICAgeyBcImxhYmVsXCI6IFwiaGVhZGVyTGFiZWxzXCIsIFwicGxhY2Vob2xkZXJcIjogXCJFbnRlciBoZXJlXCIsIFwidHlwZVwiOiBcInRleHRcIiwgXCJ0YXJnZXRBcnJheVwiOiBcImZpZWxkc01ldGFcIiwgXCJ0YXJnZXRBcnJheUtleVwiOiBcInVuaXF1ZUlkZW50aWZpZXJcIiwgXCJrZXlcIjogXCJsYWJlbFwiIH0sXG4gICAgICAgIHsgXCJsYWJlbFwiOiBcImFwaU5hbWVcIiwgXCJwbGFjZWhvbGRlclwiOiBcIkVudGVyIGhlcmVcIiwgXCJ0eXBlXCI6IFwidGV4dFwiLCBcInRhcmdldEFycmF5XCI6IFwiZmllbGRzTWV0YVwiLCBcInRhcmdldEFycmF5S2V5XCI6IFwidW5pcXVlSWRlbnRpZmllclwiLCBcImtleVwiOiBcImFwaU5hbWVcIiB9LFxuXG4gICAgICAgIHtcbiAgICAgICAgICBcImxhYmVsXCI6IFwiU3VtbWFyeSBDb2x1bW5cIiwgXCJwbGFjZWhvbGRlclwiOiBcIlN1bW1hcnkgQ29sdW1uXCIsIFwidHlwZVwiOiBcInN1YlF1ZXN0aW9uXCIsIFwidGFyZ2V0QXJyYXlcIjogXCJmaWVsZHNNZXRhXCIsIFwidGFyZ2V0QXJyYXlLZXlcIjogXCJ1bmlxdWVJZGVudGlmaWVyXCIsIFwia2V5XCI6IFwic3VtbWFyeUNvbHVtblwiLFxuICAgICAgICAgIFwic3ViUXVlc3Rpb25cIjogW1xuICAgICAgICAgICAgeyBcImxhYmVsXCI6IFwiVHlwZVwiLCBcInBsYWNlaG9sZGVyXCI6IFwiRW50ZXIgaGVyZVwiLCBcInR5cGVcIjogXCJ0ZXh0XCIsIFwidGFyZ2V0QXJyYXlcIjogXCJmaWVsZHNNZXRhXCIsIFwidGFyZ2V0QXJyYXlLZXlcIjogXCJ1bmlxdWVJZGVudGlmaWVyXCIsIFwia2V5XCI6IFwiZmxkVHlwZVwiIH0sXG4gICAgICAgICAgICB7IFwibGFiZWxcIjogXCJPcGVyYXRpb25cIiwgXCJwbGFjZWhvbGRlclwiOiBcIkVudGVyIGhlcmVcIiwgXCJ0eXBlXCI6IFwidGV4dFwiLCBcInRhcmdldEFycmF5XCI6IFwiZmllbGRzTWV0YVwiLCBcInRhcmdldEFycmF5S2V5XCI6IFwidW5pcXVlSWRlbnRpZmllclwiLCBcImtleVwiOiBcIm9wZXJhdGlvblwiIH0sXG4gICAgICAgICAgICB7IFwibGFiZWxcIjogXCJPcGVyYW5kc1wiLCBcInBsYWNlaG9sZGVyXCI6IFwiRW50ZXIgaGVyZVwiLCBcInR5cGVcIjogXCJhcnJheVwiLCBcInRhcmdldEFycmF5XCI6IFwiZmllbGRzTWV0YVwiLCBcInRhcmdldEFycmF5S2V5XCI6IFwidW5pcXVlSWRlbnRpZmllclwiLCBcImtleVwiOiBcIm9wZXJhbmRzXCIgfSxcbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcImxhYmVsXCI6IFwiU3VtbWFyeSBSb3dcIiwgXCJwbGFjZWhvbGRlclwiOiBcIlN1bW1hcnkgUm93XCIsIFwidHlwZVwiOiBcInN1YlF1ZXN0aW9uXCIsIFwidGFyZ2V0QXJyYXlcIjogXCJmaWVsZHNNZXRhXCIsIFwidGFyZ2V0QXJyYXlLZXlcIjogXCJ1bmlxdWVJZGVudGlmaWVyXCIsIFwia2V5XCI6IFwic3VtbWFyeVJvd1wiLCBcInN1YlF1ZXN0aW9uXCI6IFtcbiAgICAgICAgICAgIHsgXCJsYWJlbFwiOiBcIlR5cGVcIiwgXCJwbGFjZWhvbGRlclwiOiBcIkVudGVyIGhlcmVcIiwgXCJ0eXBlXCI6IFwidGV4dFwiLCBcInRhcmdldEFycmF5XCI6IFwiZmllbGRzTWV0YVwiLCBcInRhcmdldEFycmF5S2V5XCI6IFwidW5pcXVlSWRlbnRpZmllclwiLCBcImtleVwiOiBcImZsZFR5cGVcIiB9LFxuICAgICAgICAgICAgeyBcImxhYmVsXCI6IFwib3BlcmF0aW9uXCIsIFwicGxhY2Vob2xkZXJcIjogXCJvcGVyYXRpb25cIiwgXCJ0eXBlXCI6IFwidGV4dFwiLCBcInRhcmdldEFycmF5XCI6IFwiZmllbGRzTWV0YVwiLCBcInRhcmdldEFycmF5S2V5XCI6IFwidW5pcXVlSWRlbnRpZmllclwiLCBcImtleVwiOiBcIm9wZXJhdGlvblwiIH0sXG4gICAgICAgICAgICB7IFwibGFiZWxcIjogXCJjb2x1bW5cIiwgXCJwbGFjZWhvbGRlclwiOiBcIkVudGVyIGhlcmVcIiwgXCJ0eXBlXCI6IFwicmFkaW9cIiwgXCJ0YXJnZXRBcnJheVwiOiBcImZpZWxkc01ldGFcIiwgXCJ0YXJnZXRBcnJheUtleVwiOiBcInVuaXF1ZUlkZW50aWZpZXJcIiwgXCJrZXlcIjogXCJjb2x1bW5cIiB9LFxuICAgICAgICAgICAgeyBcImxhYmVsXCI6IFwib3BlcmFuZHNcIiwgXCJwbGFjZWhvbGRlclwiOiBcIkVudGVyIGhlcmVcIiwgXCJ0eXBlXCI6IFwiYXJyYXlcIiwgXCJ0YXJnZXRBcnJheVwiOiBcImZpZWxkc01ldGFcIiwgXCJ0YXJnZXRBcnJheUtleVwiOiBcInVuaXF1ZUlkZW50aWZpZXJcIiwgXCJrZXlcIjogXCJvcGVyYW5kc1wiIH0sXG4gICAgICAgICAgXVxuICAgICAgICB9LFxuXG4gICAgICAgIHsgXCJsYWJlbFwiOiBcImlucHV0VGV4dEFsaWdubWVudFwiLCBcInBsYWNlaG9sZGVyXCI6IFwiTGVmdFwiLCBcInR5cGVcIjogXCJ0ZXh0XCIsIFwia2V5XCI6IFwiaW5wdXRUZXh0QWxpZ25tZW50XCIgfSxcbiAgICAgICAgeyBcImxhYmVsXCI6IFwidGFibGVTY2FsZVNpemVcIiwgXCJwbGFjZWhvbGRlclwiOiBcIjA2IC0gRnVsbCBTY2FsZVwiLCBcInR5cGVcIjogXCJ0ZXh0XCIsIFwia2V5XCI6IFwidGFibGVTY2FsZVNpemVcIiB9LFxuICAgICAgICB7IFwibGFiZWxcIjogXCJyb3dDaG9pY2VcIiwgXCJwbGFjZWhvbGRlclwiOiBcIlwiLCBcInR5cGVcIjogXCJ0ZXh0XCIsIFwia2V5XCI6IFwicm93Q2hvaWNlXCIgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibGFiZWxcIjogXCJxdWlja0FjdGlvblRvb2xzXCIsXG4gICAgICAgICAgXCJ0eXBlXCI6IFwiZ3JvdXBcIixcbiAgICAgICAgICBcImtleVwiOiBcInF1aWNrQWN0aW9uVG9vbHNcIixcbiAgICAgICAgICBcImNoaWxkcmVuXCI6IFtcbiAgICAgICAgICAgIHsgXCJsYWJlbFwiOiBcImVkaXRcIiwgXCJ0eXBlXCI6IFwidG9nZ2xlXCIsIFwia2V5XCI6IFwiZWRpdFwiIH0sXG4gICAgICAgICAgICB7IFwibGFiZWxcIjogXCJ2aWV3XCIsIFwidHlwZVwiOiBcInRvZ2dsZVwiLCBcImtleVwiOiBcInZpZXdcIiB9LFxuICAgICAgICAgICAgeyBcImxhYmVsXCI6IFwiZGVsZXRlXCIsIFwidHlwZVwiOiBcInRvZ2dsZVwiLCBcImtleVwiOiBcImRlbGV0ZVwiIH1cbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHsgXCJsYWJlbFwiOiBcImFkZFJlY29yZEV2ZW50XCIsIFwidHlwZVwiOiBcInRvZ2dsZVwiLCBcImtleVwiOiBcImFkZFJlY29yZEV2ZW50XCIgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibGFiZWxcIjogXCJ0YWJsZVNjcm9sbEV2ZW50Q2hvaWNlXCIsXG4gICAgICAgICAgXCJ0eXBlXCI6IFwiZ3JvdXBcIixcbiAgICAgICAgICBcImtleVwiOiBcInRhYmxlU2Nyb2xsRXZlbnRDaG9pY2VcIixcbiAgICAgICAgICBcImNoaWxkcmVuXCI6IFtcbiAgICAgICAgICAgIHsgXCJsYWJlbFwiOiBcImhvcml6b250YWxcIiwgXCJ0eXBlXCI6IFwidG9nZ2xlXCIsIFwia2V5XCI6IFwiaG9yaXpvbnRhbFwiIH0sXG4gICAgICAgICAgICB7IFwibGFiZWxcIjogXCJ2ZXJ0aWNhbFwiLCBcInR5cGVcIjogXCJ0b2dnbGVcIiwgXCJrZXlcIjogXCJ2ZXJ0aWNhbFwiIH1cbiAgICAgICAgICBdXG4gICAgICAgIH1cbiAgICAgIF0sXG4gICAgICBcImZpZWxkUHJvcHNcIjogW1xuICAgICAgICB7IFwibGFiZWxcIjogXCJ0YWJsZUlkXCIsIFwicGxhY2Vob2xkZXJcIjogXCJFbXBfVGFibGVfMDFcIiwgXCJ0eXBlXCI6IFwidGV4dFwiLCBcImtleVwiOiBcInRhYmxlSWRcIiB9LFxuICAgICAgICB7IFwibGFiZWxcIjogXCJpbnB1dFRleHRBbGlnbm1lbnRcIiwgXCJwbGFjZWhvbGRlclwiOiBcIkxlZnRcIiwgXCJ0eXBlXCI6IFwidGV4dFwiLCBcImtleVwiOiBcImlucHV0VGV4dEFsaWdubWVudFwiIH0sXG4gICAgICAgIHsgXCJsYWJlbFwiOiBcInJlcXVpcmVkRmllbGRcIiwgXCJ0eXBlXCI6IFwidG9nZ2xlXCIsIFwia2V5XCI6IFwicmVxdWlyZWRGaWVsZFwiIH0sXG4gICAgICAgIHsgXCJsYWJlbFwiOiBcIlJlYWQgT25seVwiLCBcInR5cGVcIjogXCJjaGVja2JveFwiLCBcInRhcmdldEFycmF5XCI6IFwiZmllbGRzTWV0YVwiLCBcInRhcmdldEFycmF5S2V5XCI6IFwidW5pcXVlSWRlbnRpZmllclwiLCBcImtleVwiOiBcImVkaXRcIiB9LFxuICAgICAgICB7IFwibGFiZWxcIjogXCJoaWRlTGFiZWxcIiwgXCJ0eXBlXCI6IFwidG9nZ2xlXCIsIFwia2V5XCI6IFwiaGlkZUxhYmVsXCIgfSxcbiAgICAgICAgeyBcImxhYmVsXCI6IFwiZGlzYWJsZWRcIiwgXCJ0eXBlXCI6IFwidG9nZ2xlXCIsIFwia2V5XCI6IFwiZGlzYWJsZWRcIiB9LFxuICAgICAgICB7IFwibGFiZWxcIjogXCJoaWRlRWxlbWVudHNcIiwgXCJ0eXBlXCI6IFwidG9nZ2xlXCIsIFwia2V5XCI6IFwiaGlkZUVsZW1lbnRzXCIgfSxcbiAgICAgICAgeyBcImxhYmVsXCI6IFwibWFza2luZ1wiLCBcInR5cGVcIjogXCJ0b2dnbGVcIiwgXCJrZXlcIjogXCJtYXNraW5nXCIgfSxcbiAgICAgICAgeyBcImxhYmVsXCI6IFwidmFsdWVcIiwgXCJwbGFjZWhvbGRlclwiOiBcIlZhbHVlXCIsIFwidHlwZVwiOiBcInRleHRcIiwgXCJrZXlcIjogXCJ2YWx1ZVwiIH0sXG4gICAgICAgIHsgXCJsYWJlbFwiOiBcInJlZmVyZW5jZUFuY2hvclwiLCBcInBsYWNlaG9sZGVyXCI6IFwiaHR0cDovL3NvdXJjZS9yYW5nZXJueHRfYmlvX2RhdGEvNzQvZC5kb2NcIiwgXCJ0eXBlXCI6IFwidGV4dFwiLCBcImtleVwiOiBcInJlZmVyZW5jZUFuY2hvclwiIH0sXG4gICAgICAgIHsgXCJsYWJlbFwiOiBcImNvbnRyb2xsaW5nRWxlbWVudHNcIiwgXCJ0eXBlXCI6IFwidG9nZ2xlXCIsIFwia2V5XCI6IFwiY29udHJvbGxpbmdFbGVtZW50c1wiIH0sXG4gICAgICAgIHsgXCJsYWJlbFwiOiBcImlzRGVwZW5kZW5jZVwiLCBcInR5cGVcIjogXCJ0b2dnbGVcIiwgXCJrZXlcIjogXCJpc0RlcGVuZGVuY2VcIiB9LFxuICAgICAgICB7IFwibGFiZWxcIjogXCJuZXdMaW5lXCIsIFwidHlwZVwiOiBcInRvZ2dsZVwiLCBcImtleVwiOiBcIm5ld0xpbmVcIiB9XG4gICAgICBdLFxuICAgICAgXCJhcHBlYXJhbmNlXCI6IFtcbiAgICAgICAgeyBcImxhYmVsXCI6IFwic2VsZWN0Rm9udFwiLCBcInBsYWNlaG9sZGVyXCI6IFwiTGVmdFwiLCBcInR5cGVcIjogXCJ0ZXh0XCIsIFwia2V5XCI6IFwic2VsZWN0Rm9udFwiIH0sXG4gICAgICAgIHsgXCJsYWJlbFwiOiBcImZvbnRDb2xvclwiLCBcInBsYWNlaG9sZGVyXCI6IFwiIzI4MzQzRVwiLCBcInR5cGVcIjogXCJ0ZXh0XCIsIFwia2V5XCI6IFwiZm9udENvbG9yXCIgfSxcbiAgICAgICAgeyBcImxhYmVsXCI6IFwiaGV4Q29kZVwiLCBcInBsYWNlaG9sZGVyXCI6IFwiIzI4MzQzRVwiLCBcInR5cGVcIjogXCJ0ZXh0XCIsIFwia2V5XCI6IFwiaGV4Q29kZVwiIH0sXG4gICAgICAgIHsgXCJsYWJlbFwiOiBcImZvbnRTaXplXCIsIFwicGxhY2Vob2xkZXJcIjogXCIzMDAgLSBNZWRpdW1cIiwgXCJ0eXBlXCI6IFwidGV4dFwiLCBcImtleVwiOiBcImZvbnRTaXplXCIgfSxcbiAgICAgICAgeyBcImxhYmVsXCI6IFwiZm9udFdpZHRoXCIsIFwicGxhY2Vob2xkZXJcIjogXCJMZWZ0XCIsIFwidHlwZVwiOiBcInRleHRcIiwgXCJrZXlcIjogXCJmb250V2lkdGhcIiB9LFxuICAgICAgICB7IFwibGFiZWxcIjogXCJiYWNrZ3JvdW5kQ29sb3JcIiwgXCJwbGFjZWhvbGRlclwiOiBcIiNFMkUyRTJcIiwgXCJ0eXBlXCI6IFwidGV4dFwiLCBcImtleVwiOiBcImJhY2tncm91bmRDb2xvclwiIH0sXG4gICAgICAgIHsgXCJsYWJlbFwiOiBcImJhY2tncm91bmRIZXhDb2RlXCIsIFwicGxhY2Vob2xkZXJcIjogXCIjRTJFMkUyXCIsIFwidHlwZVwiOiBcInRleHRcIiwgXCJrZXlcIjogXCJiYWNrZ3JvdW5kSGV4Q29kZVwiIH0sXG4gICAgICAgIHsgXCJsYWJlbFwiOiBcInJlZmVyZW5jZUFuY2hvclwiLCBcInBsYWNlaG9sZGVyXCI6IFwiaHR0cDovL3NvdXJjZS9yYW5nZXJueHRfYmlvX2RhdGEvNzQvZC5kb2NcIiwgXCJ0eXBlXCI6IFwidGV4dFwiLCBcImtleVwiOiBcInJlZmVyZW5jZUFuY2hvclwiIH0sXG4gICAgICAgIHsgXCJsYWJlbFwiOiBcImJsYW5rU3BhY2VcIiwgXCJ0eXBlXCI6IFwidG9nZ2xlXCIsIFwia2V5XCI6IFwiYmxhbmtTcGFjZVwiIH1cbiAgICAgIF1cbiAgICB9LFxuXG4gICAgJ1RleHRBcmVhJzoge1xuICAgICAgZWxlbWVudFByb3BzOiBbXG4gICAgICAgIHsgbGFiZWw6ICdFbGVtZW50JywgdHlwZTogJ251bWJlcicsIGtleTogJ3F1ZXN0aW9uTnVtYmVyJyB9LFxuICAgICAgICB7IGxhYmVsOiAnd2lkdGgnLCB0eXBlOiAnZmllbGRTaXplJywga2V5OiAnd2lkdGgnIH0sXG4gICAgICBdLFxuICAgICAgZmllbGRQcm9wczogW1xuICAgICAgICB7IGxhYmVsOiAnJywgdHlwZTogJ3RvZ2dsZUdyb3VwJywga2V5OiAndG9nZ2xlT3B0aW9ucycgfSxcbiAgICAgICAgeyBsYWJlbDogJ0hlbHAgVGV4dCcsIHBsYWNlaG9sZGVyOiAnRW50ZXIgVGV4dCAnLCB0eXBlOiAndGV4dCcgfSxcbiAgICAgICAgeyBsYWJlbDogJ1ZhbHVlJywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0ICcsIHR5cGU6ICd0ZXh0Jywga2V5OiAndmFsdWUnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdSZWZlcmVuY2UgRmllbGQnLCBwbGFjZWhvbGRlcjogJ1JlZmVyZW5jZSBGaWVsZCcsIHR5cGU6ICd0ZXh0Jywga2V5OiAncmVmZXJlbmNlRmllbGQnIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcImxhYmVsXCI6IFwiXCIsIFwicGxhY2Vob2xkZXJcIjogXCJFbnRlciBUZXh0XCIsIFwidHlwZVwiOiBcInN1YlF1ZXN0aW9uXCIsIFwia2V5XCI6IFwiaXNTdWJUZXh0XCIsXG4gICAgICAgICAgXCJzdWJRdWVzdGlvblwiOiBbXG4gICAgICAgICAgXVxuICAgICAgICB9XG4gICAgICBdLFxuICAgICAgYXBwZWFyYW5jZTogW1xuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICdTZWxlY3QgRm9udCcsIHR5cGU6ICdzZWxlY3QnLCBrZXk6ICdmb250JywgcGxhY2Vob2xkZXI6ICdMZWZ0JyxcbiAgICAgICAgICBvcHRpb25zOiBbJ0hlbHZldGljYSBOZXVlJywgJ0FyaWFsJywgJ1RpbWVzIE5ldyBSb21hbicsICdSb2JvdG8nXVxuICAgICAgICB9LFxuXG4gICAgICAgIHsgbGFiZWw6ICdGb250IENvbG9yJywgdHlwZTogJ2NvbG9yJywga2V5OiAnZm9udENvbG9yJywgdmFsdWU6ICcnIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ0ZvbnQgU2l6ZScsIHR5cGU6ICdzZWxlY3QnLCBrZXk6ICdmb250U2l6ZScsIHZhbHVlOiAnJyxcbiAgICAgICAgICBvcHRpb25zOiBbXG4gICAgICAgICAgICB7IGxhYmVsOiAnU21hbGwnLCB2YWx1ZTogJzEycHgnIH0sXG4gICAgICAgICAgICB7IGxhYmVsOiAnTWVkaXVtJywgdmFsdWU6ICcxNHB4JyB9LFxuICAgICAgICAgICAgeyBsYWJlbDogJ0xhcmdlJywgdmFsdWU6ICcxNnB4JyB9XG4gICAgICAgICAgXVxuICAgICAgICB9LFxuXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ0ZvbnQgV2lkdGgnLCB0eXBlOiAnc2VsZWN0Jywga2V5OiAnZm9udFdlaWdodCcsIHZhbHVlOiAnJyxcbiAgICAgICAgICBvcHRpb25zOiBbXG4gICAgICAgICAgICB7IHZhbHVlOiAnNDAwJywgbGFiZWw6ICc0MDAtTm9ybWFsJyB9LFxuICAgICAgICAgICAgeyB2YWx1ZTogJzUwMCcsIGxhYmVsOiAnNTAwLU1lZGl1bScgfSxcbiAgICAgICAgICAgIHsgdmFsdWU6ICc2MDAnLCBsYWJlbDogJzYwMC1TZW1pIEJvbGQnIH0sXG4gICAgICAgICAgICB7IHZhbHVlOiAnNzAwJywgbGFiZWw6ICc3MDAtQm9sZCcgfVxuICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAgLy8geyBsYWJlbDogJ0JhY2tncm91bmQgQ29sb3InLCB0eXBlOiAnY29sb3InLCBrZXk6ICdiYWNrZ3JvdW5kQ29sb3InLCB2YWx1ZTogJycgfSxcbiAgICAgICAgXG4gICAgICBdXG4gICAgfSxcblxuICAgICdpbWFnZSc6IHtcbiAgICAgIGVsZW1lbnRQcm9wczogW1xuICAgICAgICB7IGxhYmVsOiAnRWxlbWVudCcsIHR5cGU6ICdudW1iZXInLCBrZXk6ICdxdWVzdGlvbk51bWJlcicgfSxcbiAgICAgICAgeyBsYWJlbDogJ3dpZHRoJywgdHlwZTogJ2ZpZWxkU2l6ZScsIGtleTogJ3dpZHRoJyB9LFxuICAgICAgXSxcbiAgICAgIGZpZWxkUHJvcHM6IFtcbiAgICAgICAgeyBsYWJlbDogJycsIHR5cGU6ICd0b2dnbGVHcm91cCcsIGtleTogJ3RvZ2dsZU9wdGlvbnMnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdIZWxwIFRleHQnLCBwbGFjZWhvbGRlcjogJ0VudGVyIFRleHQgJywgdHlwZTogJ3RleHQnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdWYWx1ZScsIHBsYWNlaG9sZGVyOiAnRW50ZXIgVGV4dCAnLCB0eXBlOiAndGV4dCcsIGtleTogJ3ZhbHVlJyB9LFxuICAgICAgICB7IGxhYmVsOiAnUmVmZXJlbmNlIEZpZWxkJywgcGxhY2Vob2xkZXI6ICdSZWZlcmVuY2UgRmllbGQnLCB0eXBlOiAndGV4dCcsIGtleTogJ3JlZmVyZW5jZUZpZWxkJyB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJsYWJlbFwiOiBcIlwiLCBcInBsYWNlaG9sZGVyXCI6IFwiRW50ZXIgVGV4dFwiLCBcInR5cGVcIjogXCJzdWJRdWVzdGlvblwiLCBcImtleVwiOiBcImlzU3ViVGV4dFwiLFxuICAgICAgICAgIFwic3ViUXVlc3Rpb25cIjogW1xuICAgICAgICAgIF1cbiAgICAgICAgfVxuICAgICAgXSxcbiAgICAgIGFwcGVhcmFuY2U6IFtcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnU2VsZWN0IEZvbnQnLCB0eXBlOiAnc2VsZWN0Jywga2V5OiAnZm9udCcsIHBsYWNlaG9sZGVyOiAnTGVmdCcsXG4gICAgICAgICAgb3B0aW9uczogWydIZWx2ZXRpY2EgTmV1ZScsICdBcmlhbCcsICdUaW1lcyBOZXcgUm9tYW4nLCAnUm9ib3RvJ11cbiAgICAgICAgfSxcbiAgICAgICAgeyBsYWJlbDogJ0ZvbnQgQ29sb3InLCB0eXBlOiAnY29sb3InLCBrZXk6ICdmb250Q29sb3InLCB2YWx1ZTogJycgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnRm9udCBTaXplJyxcbiAgICAgICAgICB0eXBlOiAnbnVtYmVyJywgICAgXG4gICAgICAgICAga2V5OiAnZm9udFNpemUnLFxuICAgICAgICAgIHZhbHVlOiAxNCAgICAgICAgICBcbiAgICAgICAgfSwgICAgICAgIFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICdGb250IFdlaWdodCcsIHR5cGU6ICdzZWxlY3QnLCBrZXk6ICdmb250V2VpZ2h0JywgdmFsdWU6ICcnLFxuICAgICAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgICAgIHsgdmFsdWU6ICc0MDAnLCBsYWJlbDogJzQwMC1Ob3JtYWwnIH0sXG4gICAgICAgICAgICB7IHZhbHVlOiAnNTAwJywgbGFiZWw6ICc1MDAtTWVkaXVtJyB9LFxuICAgICAgICAgICAgeyB2YWx1ZTogJzYwMCcsIGxhYmVsOiAnNjAwLVNlbWkgQm9sZCcgfSxcbiAgICAgICAgICAgIHsgdmFsdWU6ICc3MDAnLCBsYWJlbDogJzcwMC1Cb2xkJyB9XG4gICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICdGb250IFN0eWxlJywgdHlwZTogJ3NlbGVjdCcsIGtleTogJ2ZvbnRTdHlsZScsIHZhbHVlOiAnJyxcbiAgICAgICAgICBvcHRpb25zOiBbXG4gICAgICAgICAgICB7IGxhYmVsOiAnTm9ybWFsJywgdmFsdWU6ICdub3JtYWwnIH0sXG4gICAgICAgICAgICB7IGxhYmVsOiAnQm9sZCcsIHZhbHVlOiAnYm9sZCcgfSxcbiAgICAgICAgICAgIHsgbGFiZWw6ICdJdGFsaWMnLCB2YWx1ZTogJ2l0YWxpYycgfVxuICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnTWFyZ2luJywgdHlwZTogJ21hcmdpblBpY2tlcicsIGtleTogJ21hcmdpbicsXG4gICAgICAgICAgcGxhY2Vob2xkZXI6ICdMZWZ0LCBUb3AsIFJpZ2h0LCBCb3R0b20nLFxuICAgICAgICAgIHZhbHVlOiBbMCwgMCwgMCwgMF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnQWxpZ24gSXRlbScsIHR5cGU6ICdzZWxlY3QnLCBrZXk6ICdhbGlnbkl0ZW1zJywgdmFsdWU6ICcnLFxuICAgICAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgICAgIHsgbGFiZWw6ICdMZWZ0JywgdmFsdWU6ICdsZWZ0JyB9LFxuICAgICAgICAgICAgeyBsYWJlbDogJ0NlbnRlcicsIHZhbHVlOiAnY2VudGVyJyB9LFxuICAgICAgICAgICAgeyBsYWJlbDogJ1JpZ2h0JywgdmFsdWU6ICdyaWdodCcgfVxuICAgICAgICAgIF1cbiAgICAgICAgfVxuICAgICAgXVxuICAgICAgXG4gICAgfSxcblxuICB9O1xuICBlcnJvck1lc3NhZ2U6IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsIHByaXZhdGUgcGRmRGVzaWduZXJTZXJ2aWNlOiBQZGZEZXNpZ25lclNlcnZpY2UscHJpdmF0ZSB0ZW1wbGF0ZVNlcnZpY2U6IFRlbXBsYXRlU2VydmljZSkgeyB9XG5cbiAgaGFuZGxlVGVtcGxhdGVTZWxlY3Rpb24oZXZlbnQ6IGFueSkge1xuICAgIHRoaXMucGRmRWxlbWVudHMgPSBldmVudC5lbGVtZW50czsgXG4gICAgdGhpcy5zZWxlY3RlZFRlbXBsYXRlID0gZXZlbnQuc2VsZWN0ZWRUZW1wbGF0ZTtcbiAgfVxuXG4gIFxuXG4gIG5nT25Jbml0KCkge1xuICAgIC8vQVAtMTBNQVIyNSBTdWJzY3JpYmVzIHRvIGhlYWRlciBzZWxlY3Rpb24gY2hhbmdlcyBhbmQgdXBkYXRlcyB0aGUgc2VsZWN0ZWQgZWxlbWVudCAgXG4gICAgdGhpcy5wZGZEZXNpZ25lclNlcnZpY2Uuc2VsZWN0SGVhZGVyU3ViamVjdCQuc3Vic2NyaWJlKGhlYWRlciA9PiB7XG4gICAgICBpZiAoaGVhZGVyKSB7XG4gICAgICAgIGlmICghdGhpcy5zZWxlY3RlZEVsZW1lbnQpIHtcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkRWxlbWVudCA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50Wyd0eXBlJ10gPSBoZWFkZXI7XG4gICAgICAgIHRoaXMuaGVhZGVyU2VsZWN0ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5wZGYgPSB0aGlzLnBkZkRlc2lnbmVyU2VydmljZS5nZXRCb29rKCk7XG4gICAgICAgIHRoaXMuYm9va0lkID0gT2JqZWN0LmtleXModGhpcy5wZGYpWzBdXG4gICAgICB9XG5cbiAgICB9KTtcbiAgICB0aGlzLnBkZkRlc2lnbmVyU2VydmljZS5zZWxlY3RlZEVsZW1lbnQkLnN1YnNjcmliZShpbmRleCA9PiB7XG4gICAgICB0aGlzLnNlbGVjdGVkRWxlbWVudEluZGV4ID0gaW5kZXg7XG4gICAgICB0aGlzLmhlYWRlclNlbGVjdCA9IGZhbHNlO1xuICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSB0aGlzLnBkZkRlc2lnbmVyU2VydmljZS5nZXRFbGVtZW50cygpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkRWxlbWVudCA9IGVsZW1lbnRzW2luZGV4XTtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRFbGVtZW50Py50eXBlID09PSAnVGFibGUnKSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RDb2x1bW4gPSB0aGlzLnBkZkRlc2lnbmVyU2VydmljZS5nZXRTZWxlY3RUYWJsZUNvbHVtbigpID09PSB1bmRlZmluZWQgPyBudWxsIDogdGhpcy5wZGZEZXNpZ25lclNlcnZpY2UuZ2V0U2VsZWN0VGFibGVDb2x1bW4oKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnNlbGVjdENvbHVtbiA9IG51bGxcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRFbGVtZW50Lm1hcmdpbikge1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50Lm1hcmdpbiA9IFswLCAwLCAwLCAwXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5nZXRQcm9wZXJ0aWVzKClcbiAgICAgIHRoaXMudXBkYXRlUGRmcERhdGEoKVxuICAgIH0pO1xuICAgIHRoaXMudXBkYXRlUGRmcERhdGEoKVxuICB9XG4gIC8vQVAtMTBNQVIyNSBVcGRhdGVzIHRoZSB0aXRsZSB1c2luZyB0aGUgZm9ybSBidWlsZGVyIHNlcnZpY2UgIFxuICB1cGRhdGVUaXRsZShldmVudDogYW55KSB7XG4gICAgdGhpcy5wZGZEZXNpZ25lclNlcnZpY2UudXBkYXRlVGl0bGUoZXZlbnQpO1xuICB9XG5cbiAgdXBkYXRlUGRmcERhdGEoKTogdm9pZCB7XG4gICAgLy8gU0tTMjhNQVIyNSBDb252ZXJ0IGFycmF5IHRvIGNvbW1hLXNlcGFyYXRlZCBzdHJpbmdcbiAgICB0aGlzLmZpZWxkQXNTdHJpbmcgPSB0aGlzLmJvb2tTdWJ0ZXh0Py5maWVsZD8uam9pbignLCAnKSB8fCAnJztcbiAgXG4gICAgLy8gU0tTMjBNQVIyNSBGaWx0ZXIgY29sdW1uc1xuICAgIGNvbnN0IHRhcmdldEFycmF5ID0gdGhpcy5nZXREYXRhQnlQYXRoKCdmaWVsZHNNZXRhJykgfHwgW107XG4gICAgdGhpcy5maWx0ZXJlZENvbHVtbnMgPSB0YXJnZXRBcnJheS5maWx0ZXIoXG4gICAgICBjb2x1bW4gPT4gY29sdW1uLnVuaXF1ZUlkZW50aWZpZXIgIT09IHRoaXMuc2VsZWN0Q29sdW1uXG4gICAgKTtcbiAgfVxuICB1cGRhdGVGaWVsZCh2YWx1ZTogc3RyaW5nKSB7IFxuICAgIHRoaXMuYm9va1N1YnRleHQuZmllbGQgPSB2YWx1ZS5zcGxpdCgnLCcpLm1hcChpdGVtID0+IGl0ZW0udHJpbSgpKTsgLy9TS1MyOE1BUjI1IENvbnZlcnQgc3RyaW5nIGJhY2sgdG8gYXJyYXlcbiAgfVxuXG4gIC8vIFNLUzIwTUFSMjUgTWV0aG9kIHRvIGhhbmRsZSBjaGVja2JveCBjaGFuZ2VzXG4gIG9uQ2hlY2tib3hDaGFuZ2UodGFyZ2V0QXJyYXlQYXRoOiBhbnksIHRhcmdldEFycmF5S2V5OiBhbnksIGtleTogYW55LCBhcGlOYW1lOiBzdHJpbmcsIGlzQ2hlY2tlZDogYm9vbGVhbikge1xuICAgIGNvbnN0IHRhcmdldEFycmF5ID0gdGhpcy5nZXREYXRhQnlQYXRoKHRhcmdldEFycmF5UGF0aCk7XG4gICAgY29uc3QgZm91bmRJdGVtID0gdGFyZ2V0QXJyYXkuZmluZChpdGVtID0+IGl0ZW1bdGFyZ2V0QXJyYXlLZXldID09PSB0aGlzLnNlbGVjdENvbHVtbik7XG4gICAgZm91bmRJdGVtW2tleV0gPSBmb3VuZEl0ZW1ba2V5XSA/IGZvdW5kSXRlbVtrZXldIDogW107XG4gICAgaWYgKGlzQ2hlY2tlZCkge1xuICAgICAgLy8gQWRkIGFwaU5hbWUgdG8gc2VsZWN0ZWRBcGlOYW1lcyBpZiBub3QgYWxyZWFkeSBwcmVzZW50XG4gICAgICBpZiAoIWZvdW5kSXRlbVtrZXldLmluY2x1ZGVzKGFwaU5hbWUpKSB7XG4gICAgICAgIGZvdW5kSXRlbVtrZXldLnB1c2goYXBpTmFtZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJlbW92ZSBhcGlOYW1lIGZyb20gc2VsZWN0ZWRBcGlOYW1lcyBpZiBwcmVzZW50XG4gICAgICBjb25zdCBpbmRleCA9IGZvdW5kSXRlbVtrZXldLmluZGV4T2YoYXBpTmFtZSk7XG4gICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICBmb3VuZEl0ZW1ba2V5XS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICB1cGRhdGVQcm9wZXJ0eShrZXk6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICAgIGlmICh0aGlzLnNlbGVjdGVkRWxlbWVudEluZGV4ID49IDApIHtcbiAgICAgICAgdGhpcy5zZXRWYWx1ZUJ5UGF0aChrZXksIHZhbHVlKTtcbiAgICB9XG4gICAgaWYgKGtleSA9PT0gJ3F1ZXN0aW9uJykge1xuICAgICAgaWYgKCF0aGlzLnZhbGlkYXRlSW5wdXQodmFsdWUsIGtleSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvLyBTS1MyMU1BUjI1IHJhZGlvIGJ1dHRvbiBjbGljayBoYW5kbGVyXG4gIG9uUmFkaW9DaGFuZ2UodGFyZ2V0QXJyYXlQYXRoOiBhbnksIHRhcmdldEFycmF5S2V5OiBhbnksIGtleTogYW55LCB2YWx1ZTogYW55KSB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRFbGVtZW50LnR5cGUgPT09ICdUYWJsZScpIHtcbiAgICAgIC8vIHRoaXMudXBkYXRlVmFsdWVCeUFycmF5UGF0aCh0YXJnZXRBcnJheSwgdGFyZ2V0QXJyYXlLZXksIHRoaXMuc2VsZWN0Q29sdW1uLCBrZXksIHZhbHVlKTtcbiAgICAgIGNvbnN0IHRhcmdldEFycmF5ID0gdGhpcy5nZXREYXRhQnlQYXRoKHRhcmdldEFycmF5UGF0aCk7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkodGFyZ2V0QXJyYXkpKSByZXR1cm47XG5cbiAgICAgIC8vIEZpbmQgdGhlIG9iamVjdCB0aGF0IG1hdGNoZXMgc2VsZWN0Q29sdW1uXG4gICAgICBsZXQgZm91bmRJdGVtID0gdGFyZ2V0QXJyYXkuZmluZChpdGVtID0+IGl0ZW1bdGFyZ2V0QXJyYXlLZXldID09PSB0aGlzLnNlbGVjdENvbHVtbik7XG5cbiAgICAgIC8vIElmIHRoZSBpdGVtIGRvZXMgbm90IGV4aXN0LCBjcmVhdGUgYW5kIGFkZCBpdFxuICAgICAgaWYgKCFmb3VuZEl0ZW0pIHtcbiAgICAgICAgZm91bmRJdGVtID0geyBbdGFyZ2V0QXJyYXlLZXldOiB0aGlzLnNlbGVjdENvbHVtbiB9OyAvLyBFbnN1cmUgdGhlIGtleSBleGlzdHNcbiAgICAgICAgdGFyZ2V0QXJyYXkucHVzaChmb3VuZEl0ZW0pO1xuICAgICAgfVxuXG4gICAgICAvLyBUcmF2ZXJzZSBhbmQgc2V0IHRoZSB2YWx1ZVxuICAgICAgY29uc3Qga2V5cyA9IGtleS5zcGxpdCgnLicpO1xuICAgICAgbGV0IG9iaiA9IGZvdW5kSXRlbTtcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICBjb25zdCBrZXkgPSBrZXlzW2ldO1xuICAgICAgICBpZiAoIW9ialtrZXldKSBvYmpba2V5XSA9IHt9OyAvLyBJbml0aWFsaXplIG1pc3Npbmcgb2JqZWN0c1xuICAgICAgICBvYmogPSBvYmpba2V5XTtcbiAgICAgIH1cblxuICAgICAgLy8gQXNzaWduIHRoZSB2YWx1ZSBiYXNlZCBvbiBpbnB1dCB0eXBlXG4gICAgICBjb25zdCBsYXN0S2V5ID0ga2V5c1trZXlzLmxlbmd0aCAtIDFdO1xuXG4gICAgICBvYmpbbGFzdEtleV0gPSB2YWx1ZTtcbiAgICAgIHRoaXMudXBkYXRlRWxlbWVudCh0aGlzLnNlbGVjdGVkRWxlbWVudClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXRWYWx1ZUJ5UGF0aChrZXksIHZhbHVlKTsgLy8gRmFsbGJhY2sgZm9yIG5vbi1UYWJsZSBlbGVtZW50cywgaWYgYXBwbGljYWJsZVxuICAgIH1cbiAgfVxuICBvblJlcXVpcmVkQ2hhbmdlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRFbGVtZW50KSB7XG4gICAgICBsZXQgbGFiZWwgPSB0aGlzLnNlbGVjdGVkRWxlbWVudC5sYWJlbCA/IHRoaXMuc2VsZWN0ZWRFbGVtZW50LmxhYmVsLnJlcGxhY2UoL1xccypcXCorJC8sICcnKSA6ICdMYWJlbCc7XG5cbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICBsYWJlbCA9IGAke2xhYmVsfSAqYDtcbiAgICAgIH1cblxuICAgICAgdGhpcy51cGRhdGVQcm9wZXJ0eSgnbGFiZWwnLCBsYWJlbCk7XG4gICAgfVxuICB9XG5cbiAgLy8gVG9nZ2xlIGZvciBTdWIgUXVlc3Rpb25zIChFYWNoIHByb3AgaGFzIGl0cyBvd24gc3RhdGUpXG4gIHRvZ2dsZVN1YlF1ZXN0aW9uKHByb3A6IGFueSkge1xuICAgIHByb3AuaXNFeHBhbmRlZCA9ICFwcm9wLmlzRXhwYW5kZWQ7XG4gIH1cblxuICAvLyBTZXBhcmF0ZSBUb2dnbGUgZm9yIFN0eWxlIFNlY3Rpb25cbiAgaXNTdHlsZUV4cGFuZGVkID0gZmFsc2U7XG5cbiAgdG9nZ2xlU3R5bGVTZWN0aW9uKCkge1xuICAgIHRoaXMuaXNTdHlsZUV4cGFuZGVkID0gIXRoaXMuaXNTdHlsZUV4cGFuZGVkO1xuICB9XG5cbiAgZ2V0UHJvcGVydGllcygpIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRFbGVtZW50KSByZXR1cm4gbnVsbDtcblxuICAgIC8vIEFQLTEwTUFSMjUgUmV0cmlldmUgdGhlIGxhdGVzdCBwZGYgZGF0YVxuICAgIHRoaXMucGRmID0gdGhpcy5wZGZEZXNpZ25lclNlcnZpY2UuZ2V0Qm9vaygpO1xuICAgIGlmICh0aGlzLnNlbGVjdGVkRWxlbWVudD8udHlwZSA9PT0gJ1RhYmxlJykge1xuICAgICAgaWYgKHRoaXMuc2VsZWN0Q29sdW1uICE9PSAnJyAmJiB0aGlzLnNlbGVjdENvbHVtbiAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50UHJvcGVydGllc1snVGFibGVDb2x1bW4nXTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudFByb3BlcnRpZXNbdGhpcy5zZWxlY3RlZEVsZW1lbnQ/LnR5cGVdO1xuICB9XG4gIC8vIEFQLTI4TUFSMjUgQWRkIGFuIG9wdGlvbiB3aXRoIGEgdW5pcXVlIFVVSURcbiAgYWRkT3B0aW9uKG9wdGlvbnM6IGFueVtdKSB7XG4gICAgY29uc3QgdW5pcXVlX2lkID0gdXVpZHY0KCk7XG4gICAgb3B0aW9ucy5wdXNoKHsgaWQ6IHVuaXF1ZV9pZCx2YWx1ZTogJycgfSk7XG4gIH1cblxuICAvLyBBUC0yOE1BUjI1IEZ1bmN0aW9uIHRvIHJlbW92ZSBhbiBvcHRpb24gYmFzZWQgb24gaXRzIHVuaXF1ZSBVVUlEXG4gIHJlbW92ZU9wdGlvbihvcHRpb25zOiBhbnlbXSwgaWQ6IHN0cmluZykge1xuICAgIGNvbnN0IGluZGV4ID0gb3B0aW9ucy5maW5kSW5kZXgob3B0aW9uID0+IG9wdGlvbi5pZCA9PT0gaWQpO1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgIG9wdGlvbnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG4gIH1cblxuICBoYW5kbGVCdXR0b25DbGljaygpIHtcbiAgICB0aGlzLmZvcm1CdXR0b25IYW5kbGVyLmVtaXQodGhpcy5wZGZEZXNpZ25lclNlcnZpY2UuZG93bmxvYWRFbGVtZW50KCkpO1xuICB9XG4gIC8vIFNLUzEzTUFSMjUgYWN0aXZlIHRhYiBzZWxlY3RcbiAgc2V0QWN0aXZlVGFiKHRhYjogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5hY3RpdmVUYWIgPSB0YWI7XG4gIH1cbiAgLy8gU0tTMTNNQVIyNSB0YWJsZSBwcm9wZXJ0eSBzYXZlXG4gIG9uU2F2ZSgpOiB2b2lkIHtcbiAgfVxuICAvLyBTS1MxM01BUjI1IHRhYmxlIHByb3BlcnR5IHJlc2V0XG4gIG9uQ2FuY2VsKCk6IHZvaWQge1xuICB9XG5cbiAgdXBkYXRlUHJvcGVydGllcyhlbGVtZW50VHlwZTogc3RyaW5nKTogdm9pZCB7XG4gICAgLy8gUmVzZXQgYWxpZ25tZW50IGFuZCBzdHlsZXMgaWYgc3dpdGNoaW5nIGVsZW1lbnRzXG4gICAgdGhpcy5zZWxlY3RlZEFsaWduID0gJ2FsaWduLWxlZnQnO1xuICAgIHRoaXMuc2VsZWN0ZWRTdHlsZXMgPSBbXTtcblxuICAgIC8vIEZldGNoIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBzZWxlY3RlZCBlbGVtZW50IHR5cGVcblxuICAgIGNvbnN0IHByb3BlcnRpZXMgPSB0aGlzLmdldFByb3BlcnRpZXMoKTtcbiAgICBpZiAocHJvcGVydGllcykge1xuICAgICAgLy8gTWFrZSBzdXJlIHRoZSBwcm9wZXJ0aWVzIGFyZSBkeW5hbWljYWxseSB1cGRhdGVkXG4gICAgfVxuICB9XG5cbiAgb25BbGlnblNlbGVjdCh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRFbGVtZW50KSB7XG4gICAgICB0aGlzLnNlbGVjdGVkRWxlbWVudC50ZXh0QWxpZ24gPSB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICBvblN0eWxlU2VsZWN0KHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRFbGVtZW50KSByZXR1cm47XG5cbiAgICAvLyBJbml0aWFsaXplIHN0eWxlcyBhcnJheSBpZiBpdCBkb2Vzbid0IGV4aXN0XG4gICAgdGhpcy5zZWxlY3RlZEVsZW1lbnQuc3R5bGVzID0gdGhpcy5zZWxlY3RlZEVsZW1lbnQuc3R5bGVzIHx8IFtdO1xuXG4gICAgLy8gRW5zdXJlIG9ubHkgb25lIHN0eWxlIGlzIHNlbGVjdGVkIGF0IGEgdGltZVxuICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50LnN0eWxlcyA9IFt2YWx1ZV07XG5cbiAgfVxuXG4gIGlzU3R5bGVBY3RpdmUodmFsdWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkRWxlbWVudD8uc3R5bGVzPy5pbmNsdWRlcyh2YWx1ZSkgfHwgZmFsc2U7XG4gIH1cbiAgZ2V0VmFsdWVCeVBhdGgocGF0aDogc3RyaW5nKTogYW55IHtcbiAgICByZXR1cm4gcGF0aD8uc3BsaXQoJy4nKS5yZWR1Y2UoKG9iaiwga2V5KSA9PiBvYmo/LltrZXldID8/ICcnLCB0aGlzLnNlbGVjdGVkRWxlbWVudCk7XG4gIH1cblxuICBvblRvZ2dsZUNoYW5nZShwYXRoOiBzdHJpbmcsIGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGNoZWNrZWQgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLmNoZWNrZWQ7XG4gICAgdGhpcy5zZXRWYWx1ZUJ5UGF0aChwYXRoLCBjaGVja2VkKTtcbiAgICB0aGlzLnVwZGF0ZUVsZW1lbnQodGhpcy5zZWxlY3RlZEVsZW1lbnQpXG4gIH1cbiAgdmFsaWRhdGVJbnB1dCh2YWx1ZTogc3RyaW5nLCB0eXBlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAodHlwZSA9PT0gJ3BsYWNlaG9sZGVyJykge1xuICAgICAgY29uc3QgcmVnZXggPSAvXlthLXpBLVowLTlcXHNdKiQvO1xuICAgICAgaWYgKCFyZWdleC50ZXN0KHZhbHVlKSkge1xuICAgICAgICB0aGlzLmVycm9yTWVzc2FnZSA9ICdPbmx5IGxldHRlcnMgYW5kIG51bWJlcnMgYXJlIGFsbG93ZWQnO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gJyc7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgc2V0VmFsdWVCeVBhdGgocGF0aDogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgaWYgKHZhbHVlID09PSAncXVlc3Rpb24nKSB7XG4gICAgICBpZiAoIXRoaXMudmFsaWRhdGVJbnB1dCh2YWx1ZSwgdmFsdWUpKSB7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGtleXMgPSBwYXRoLnNwbGl0KCcuJyk7XG4gICAgbGV0IG9iaiA9IHRoaXMuc2VsZWN0ZWRFbGVtZW50O1xuXG4gICAga2V5cy5mb3JFYWNoKChrZXksIGluZGV4KSA9PiB7XG4gICAgICBpZiAoIW9ialtrZXldKSB7XG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBuZXh0IGtleSBpcyBhIG51bWJlciAoYXJyYXkgaW5kZXgpXG4gICAgICAgIGNvbnN0IG5leHRLZXkgPSBrZXlzW2luZGV4ICsgMV07XG4gICAgICAgIG9ialtrZXldID0gaXNOYU4oTnVtYmVyKG5leHRLZXkpKSA/IHt9IDogW107XG4gICAgICB9XG4gICAgICBpZiAoaW5kZXggPT09IGtleXMubGVuZ3RoIC0gMSkge1xuICAgICAgICAvLyBDb252ZXJ0IHZhbHVlIHRvIG51bWJlciBmb3IgZm9udFNpemVcbiAgICAgICAgaWYgKGtleSA9PT0gJ2ZvbnRTaXplJykge1xuICAgICAgICAgIG9ialtrZXldID0gcGFyc2VJbnQodmFsdWUsIDEwKSB8fCAxNDsgLy8gRGVmYXVsdCB0byAxNCBpZiBpbnZhbGlkXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb2JqW2tleV0gPSB2YWx1ZTsgLy8gQXNzaWduIHZhbHVlIHRvIGxhc3Qga2V5XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9iaiA9IG9ialtrZXldOyAvLyBNb3ZlIGRlZXBlclxuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucGRmRGVzaWduZXJTZXJ2aWNlLmVsZW1lbnRVcGRhdGUodGhpcy5zZWxlY3RlZEVsZW1lbnQpO1xuICB9XG4gIGdldFN0eWxlS2V5cygpOiBzdHJpbmdbXSB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkRWxlbWVudCB8fCAhdGhpcy5zZWxlY3RlZEVsZW1lbnQuc3R5bGUgfHwgdHlwZW9mIHRoaXMuc2VsZWN0ZWRFbGVtZW50LnN0eWxlICE9PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5zZWxlY3RlZEVsZW1lbnQuc3R5bGUpO1xuICB9ICBcblxuICAvLyBTS1MxOU1BUjI1IHVwZGF0ZSBlbGVtZW50IGluIHNlcnZpZXNcbiAgdXBkYXRlRWxlbWVudChlbGVtZW50OiBhbnkpIHtcbiAgICB0aGlzLnBkZkRlc2lnbmVyU2VydmljZS5lbGVtZW50VXBkYXRlKGVsZW1lbnQpXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRFbGVtZW50Py50eXBlID09PSAnVGFibGUnICYmIHRoaXMuc2VsZWN0Q29sdW1uKSB7XG4gICAgICB0aGlzLnBkZkRlc2lnbmVyU2VydmljZS5zZXRTZWxlY3RlZFRhYmxlRWxlbWVudCh0aGlzLnNlbGVjdGVkRWxlbWVudEluZGV4LCB7IHVuaXF1ZUlkZW50aWZpZXI6IHRoaXMuc2VsZWN0Q29sdW1uIHx8IG51bGwgfSk7XG4gICAgfVxuICB9XG4gIC8vIFNLUzE5TUFSMjUgZ2V0IHZhbHVlIGZyb20gYXJyYXlcbiAgZ2V0VmFsdWVCeUFycmF5UGF0aCh0YXJnZXRBcnJheVBhdGg6IGFueSwgdGFyZ2V0QXJyYXlLZXk6IHN0cmluZywgc2VsZWN0Q29sdW1uOiBzdHJpbmcsIGtleVBhdGg6IHN0cmluZyk6IGFueSB7XG4gICAgY29uc3QgdGFyZ2V0QXJyYXkgPSB0aGlzLmdldERhdGFCeVBhdGgodGFyZ2V0QXJyYXlQYXRoKTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodGFyZ2V0QXJyYXkpKSByZXR1cm4gJyc7XG5cbiAgICBjb25zdCBmb3VuZEl0ZW0gPSB0YXJnZXRBcnJheS5maW5kKGl0ZW0gPT4gaXRlbVt0YXJnZXRBcnJheUtleV0gPT09IHNlbGVjdENvbHVtbik7XG5cbiAgICByZXR1cm4gZm91bmRJdGVtID8ga2V5UGF0aC5zcGxpdCgnLicpLnJlZHVjZSgob2JqLCBrZXkpID0+IG9iaj8uW2tleV0sIGZvdW5kSXRlbSkgOiAnJztcbiAgfVxuXG4gIC8vU0tTMTlNQVIyNSBGdW5jdGlvbiB0byB1cGRhdGUgYSB2YWx1ZSBpbiBhbiBhcnJheSBkeW5hbWljYWxseVxuICB1cGRhdGVWYWx1ZUJ5QXJyYXlQYXRoKHRhcmdldEFycmF5UGF0aDogYW55LCB0YXJnZXRBcnJheUtleTogc3RyaW5nLCBzZWxlY3RDb2x1bW46IHN0cmluZywga2V5UGF0aDogc3RyaW5nLCBldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCB0YXJnZXRBcnJheSA9IHRoaXMuZ2V0RGF0YUJ5UGF0aCh0YXJnZXRBcnJheVBhdGgpO1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh0YXJnZXRBcnJheSkpIHJldHVybjtcblxuICAgIC8vIEZpbmQgdGhlIG9iamVjdCB0aGF0IG1hdGNoZXMgc2VsZWN0Q29sdW1uXG4gICAgbGV0IGZvdW5kSXRlbSA9IHRhcmdldEFycmF5LmZpbmQoaXRlbSA9PiBpdGVtW3RhcmdldEFycmF5S2V5XSA9PT0gc2VsZWN0Q29sdW1uKTtcblxuICAgIC8vIElmIHRoZSBpdGVtIGRvZXMgbm90IGV4aXN0LCBjcmVhdGUgYW5kIGFkZCBpdFxuICAgIGlmICghZm91bmRJdGVtKSB7XG4gICAgICBmb3VuZEl0ZW0gPSB7IFt0YXJnZXRBcnJheUtleV06IHNlbGVjdENvbHVtbiB9OyAvLyBFbnN1cmUgdGhlIGtleSBleGlzdHNcbiAgICAgIHRhcmdldEFycmF5LnB1c2goZm91bmRJdGVtKTtcbiAgICB9XG5cbiAgICAvLyBUcmF2ZXJzZSBhbmQgc2V0IHRoZSB2YWx1ZVxuICAgIGNvbnN0IGtleXMgPSBrZXlQYXRoLnNwbGl0KCcuJyk7XG4gICAgbGV0IG9iaiA9IGZvdW5kSXRlbTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgIGNvbnN0IGtleSA9IGtleXNbaV07XG4gICAgICBpZiAoIW9ialtrZXldKSBvYmpba2V5XSA9IHt9OyAvLyBJbml0aWFsaXplIG1pc3Npbmcgb2JqZWN0c1xuICAgICAgb2JqID0gb2JqW2tleV07XG4gICAgfVxuXG4gICAgLy8gQXNzaWduIHRoZSB2YWx1ZSBiYXNlZCBvbiBpbnB1dCB0eXBlXG4gICAgY29uc3QgbGFzdEtleSA9IGtleXNba2V5cy5sZW5ndGggLSAxXTtcbiAgICBjb25zdCBpbnB1dEVsZW1lbnQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcblxuICAgIG9ialtsYXN0S2V5XSA9IGlucHV0RWxlbWVudD8udHlwZSA9PT0gJ2NoZWNrYm94JyA/IGlucHV0RWxlbWVudC5jaGVja2VkIDogaW5wdXRFbGVtZW50LnZhbHVlO1xuICAgIGlmIChrZXlQYXRoID09PSAnc3VtbWFyeUNvbHVtbicpIHtcbiAgICAgIGlmIChvYmpbJ3N1bW1hcnlSb3cnXSA9PT0gdHJ1ZSkge1xuICAgICAgICBvYmpbJ3N1bW1hcnlSb3cnXSA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKGlucHV0RWxlbWVudC5jaGVja2VkID09PSB0cnVlKSB7XG4gICAgICAgIG9ialsnZmxkVHlwZSddID0gJ2NhbGN1bGF0aW9uJ1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb2JqWydmbGRUeXBlJ10gPSAnVGV4dCdcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGtleVBhdGggPT09ICdzdW1tYXJ5Um93Jykge1xuICAgICAgLy90aGlzLnBkZkRlc2lnbmVyU2VydmljZS5zZXRTdW1tYXJ5Um93RGF0YShvYmopOyBcbiAgICAgIGlmIChvYmpbJ3N1bW1hcnlDb2x1bW4nXSA9PT0gdHJ1ZSkge1xuICAgICAgICBvYmpbJ3N1bW1hcnlDb2x1bW4nXSA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKGlucHV0RWxlbWVudC5jaGVja2VkID09PSB0cnVlKSB7XG4gICAgICAgIG9ialsnZmxkVHlwZSddID0gJ2NhbGN1bGF0aW9uJ1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb2JqWydmbGRUeXBlJ10gPSAnVGV4dCdcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy51cGRhdGVFbGVtZW50KHRoaXMuc2VsZWN0ZWRFbGVtZW50KVxuICB9XG4gIGdldERhdGFCeVBhdGgocGF0aDogc3RyaW5nKTogYW55IHtcbiAgICByZXR1cm4gcGF0aC5zcGxpdCgnLicpLnJlZHVjZSgob2JqLCBrZXkpID0+IG9iaj8uW2tleV0sIHRoaXMuc2VsZWN0ZWRFbGVtZW50KTtcbiAgfVxuXG4gIC8vIFNLUzI1TUFSMjUgaW1hZ2UgZWRpdCBmdW5jdGlvbnNcbiAgZmxpcEhvcml6b250YWwoKSB7XG4gICAgdGhpcy50cmFuc2Zvcm0gPSB7XG4gICAgICAuLi50aGlzLnRyYW5zZm9ybSxcbiAgICAgIGZsaXBIOiAhdGhpcy50cmFuc2Zvcm0uZmxpcEhcbiAgICB9O1xuICB9XG5cbiAgZmxpcFZlcnRpY2FsKCkge1xuICAgIHRoaXMudHJhbnNmb3JtID0ge1xuICAgICAgLi4udGhpcy50cmFuc2Zvcm0sXG4gICAgICBmbGlwVjogIXRoaXMudHJhbnNmb3JtLmZsaXBWXG4gICAgfTtcbiAgfVxuXG4gIHJlc2V0SW1hZ2UoKSB7XG4gICAgdGhpcy5jYW52YXNSb3RhdGlvbiA9IDA7XG4gICAgdGhpcy5jcm9wcGVyID0gdW5kZWZpbmVkO1xuICAgIHRoaXMudHJhbnNmb3JtID0ge1xuICAgICAgdHJhbnNsYXRlVW5pdDogJ3B4JyxcbiAgICAgIHNjYWxlOiAxLFxuICAgICAgcm90YXRlOiAwLFxuICAgICAgZmxpcEg6IGZhbHNlLFxuICAgICAgZmxpcFY6IGZhbHNlLFxuICAgICAgdHJhbnNsYXRlSDogMCxcbiAgICAgIHRyYW5zbGF0ZVY6IDBcbiAgICB9O1xuICB9XG5cbiAgem9vbU91dCgpIHtcbiAgICB0aGlzLnRyYW5zZm9ybSA9IHtcbiAgICAgIC4uLnRoaXMudHJhbnNmb3JtLFxuICAgICAgc2NhbGU6IHRoaXMudHJhbnNmb3JtLnNjYWxlISAtIC4xXG4gICAgfTtcbiAgfVxuXG4gIHpvb21JbigpIHtcbiAgICB0aGlzLnRyYW5zZm9ybSA9IHtcbiAgICAgIC4uLnRoaXMudHJhbnNmb3JtLFxuICAgICAgc2NhbGU6IHRoaXMudHJhbnNmb3JtLnNjYWxlISArIC4xXG4gICAgfTtcbiAgfVxuICByb3RhdGVMZWZ0KCkge1xuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7IC8vIFVzZSB0aW1lb3V0IGJlY2F1c2Ugcm90YXRpbmcgaW1hZ2UgaXMgYSBoZWF2eSBvcGVyYXRpb24gYW5kIHdpbGwgYmxvY2sgdGhlIHVpIHRocmVhZFxuICAgICAgdGhpcy5jYW52YXNSb3RhdGlvbi0tO1xuICAgICAgdGhpcy5mbGlwQWZ0ZXJSb3RhdGUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJvdGF0ZVJpZ2h0KCkge1xuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmNhbnZhc1JvdGF0aW9uKys7XG4gICAgICB0aGlzLmZsaXBBZnRlclJvdGF0ZSgpO1xuICAgIH0pO1xuICB9XG5cbiAgbW92ZUxlZnQoKSB7XG4gICAgdGhpcy50cmFuc2Zvcm0gPSB7XG4gICAgICAuLi50aGlzLnRyYW5zZm9ybSxcbiAgICAgIHRyYW5zbGF0ZUg6IHRoaXMudHJhbnNmb3JtLnRyYW5zbGF0ZUghIC0gMVxuICAgIH07XG4gIH1cblxuICBtb3ZlUmlnaHQoKSB7XG4gICAgdGhpcy50cmFuc2Zvcm0gPSB7XG4gICAgICAuLi50aGlzLnRyYW5zZm9ybSxcbiAgICAgIHRyYW5zbGF0ZUg6IHRoaXMudHJhbnNmb3JtLnRyYW5zbGF0ZUghICsgMVxuICAgIH07XG4gIH1cblxuICBtb3ZlRG93bigpIHtcbiAgICB0aGlzLnRyYW5zZm9ybSA9IHtcbiAgICAgIC4uLnRoaXMudHJhbnNmb3JtLFxuICAgICAgdHJhbnNsYXRlVjogdGhpcy50cmFuc2Zvcm0udHJhbnNsYXRlViEgKyAxXG4gICAgfTtcbiAgfVxuXG4gIG1vdmVVcCgpIHtcbiAgICB0aGlzLnRyYW5zZm9ybSA9IHtcbiAgICAgIC4uLnRoaXMudHJhbnNmb3JtLFxuICAgICAgdHJhbnNsYXRlVjogdGhpcy50cmFuc2Zvcm0udHJhbnNsYXRlViEgLSAxXG4gICAgfTtcbiAgfVxuICBwcml2YXRlIGZsaXBBZnRlclJvdGF0ZSgpIHtcbiAgICBjb25zdCBmbGlwcGVkSCA9IHRoaXMudHJhbnNmb3JtLmZsaXBIO1xuICAgIGNvbnN0IGZsaXBwZWRWID0gdGhpcy50cmFuc2Zvcm0uZmxpcFY7XG4gICAgdGhpcy50cmFuc2Zvcm0gPSB7XG4gICAgICAuLi50aGlzLnRyYW5zZm9ybSxcbiAgICAgIGZsaXBIOiBmbGlwcGVkVixcbiAgICAgIGZsaXBWOiBmbGlwcGVkSCxcbiAgICAgIHRyYW5zbGF0ZUg6IDAsXG4gICAgICB0cmFuc2xhdGVWOiAwXG4gICAgfTtcbiAgfVxuICBhc3luYyBpbWFnZUNyb3BwZWQoZXZlbnQ6IGFueSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBiYXNlNjQgPSBhd2FpdCB0aGlzLmNvbnZlcnRCbG9iVG9CYXNlNjQoZXZlbnQub2JqZWN0VXJsKTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50LmltYWdlRGF0YSA9IGJhc2U2NDtcbiAgICAgIGF3YWl0IHRoaXMucGRmRGVzaWduZXJTZXJ2aWNlLmVsZW1lbnRVcGRhdGUoIHRoaXMuc2VsZWN0ZWRFbGVtZW50KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIGluIGltYWdlQ3JvcHBlZDpcIiwgZXJyb3IpO1xuICAgIH1cbiAgfVxuXG5cbiAgY3JvcHBlclJlYWR5KHNvdXJjZUltYWdlRGltZW5zaW9uczogRGltZW5zaW9ucykge1xuICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICB9XG4gIC8vIFNLUzI1TUFSMjUgYmxvYiB0byBiYXNlIDY0IGNvbnZlcnRlclxuICBjb252ZXJ0QmxvYlRvQmFzZTY0KG9iamVjdFVybDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gZmV0Y2gob2JqZWN0VXJsKVxuICAgICAgLnRoZW4ocmVzcG9uc2UgPT4gcmVzcG9uc2UuYmxvYigpKVxuICAgICAgLnRoZW4oYmxvYiA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICAgICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChibG9iKTtcbiAgICAgICAgICByZWFkZXIub25sb2FkZW5kID0gKCkgPT4gcmVzb2x2ZShyZWFkZXIucmVzdWx0IGFzIHN0cmluZyk7XG4gICAgICAgICAgcmVhZGVyLm9uZXJyb3IgPSBlcnJvciA9PiByZWplY3QoZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICB9XG4gIC8vIFNLUzI4TUFSMjUgcWIgcGRmIHVwZGF0ZSBpbiBwZGYgZWxlbWVudFxuICBjaGlsZEV2ZW50Q2FwdHVyZShldmVudDogYW55KSB7XG4gICAgdGhpcy5zZWxlY3RlZEVsZW1lbnQucGRmUmVmZXJlbmNlID0gT2JqZWN0LmtleXMoZXZlbnQudmFsdWUudmFsdWVPYmopWzBdXG4gICAgdGhpcy5zZWxlY3RlZEVsZW1lbnQucGRmUmVmZXJlbmNlUXVlc3Rpb25zID0gZXZlbnQudmFsdWUudmFsdWVPYmpcbiAgICB0aGlzLnBkZkRlc2lnbmVyU2VydmljZS5lbGVtZW50VXBkYXRlKCB0aGlzLnNlbGVjdGVkRWxlbWVudCk7XG4gIH1cblxuICAvLyBTS1MyOE1BUjI1IHBkZiBzZWFyY2ggZHJvcGRvd24gZW1pdFxuICBsaW5rVG9nZ2xlRHJvcGRvd24oZXZlbnQ6IEV2ZW50KSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5pc0xpbmtEcm9wZG93bk9wZW4gPSAhdGhpcy5pc0xpbmtEcm9wZG93bk9wZW47XG4gIH1cblxuICAvLyBTS1MyOE1BUjI1IHBkZiBzZWFyY2ggZHJvcGRvd24gY2xvc2VcbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6Y2xpY2snLCBbJyRldmVudCddKVxuICBvbkNsaWNrT3V0c2lkZShldmVudDogRXZlbnQpIHtcbiAgICBpZiAodGhpcy5kcm9wZG93biAmJiAhdGhpcy5kcm9wZG93bi5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCkpIHtcbiAgICAgIHRoaXMuaXNMaW5rRHJvcGRvd25PcGVuID0gZmFsc2U7XG4gICAgfVxuICB9XG4gIC8vIEFQLTI4TUFSMjUgV2hlbiBkcmFnIHN0YXJ0cywgc3RvcmUgdGhlIGluZGV4XG4gIG9uRHJhZ1N0YXJ0KGV2ZW50OiBEcmFnRXZlbnQsIGlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLmRyYWdnZWRJZCA9IGlkO1xuICAgIGV2ZW50LmRhdGFUcmFuc2ZlciEuZWZmZWN0QWxsb3dlZCA9IFwibW92ZVwiO1xuICB9XG5cbiAgLy8gQVAtMjhNQVIyNSBQcmV2ZW50IGRlZmF1bHQgYmVoYXZpb3IgdG8gYWxsb3cgZHJvcFxuICBvbkRyYWdPdmVyKGV2ZW50OiBEcmFnRXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG5cbiAgLy8gQVAtMjhNQVIyNSBTd2FwIHRoZSBkcmFnZ2VkIGl0ZW0gd2l0aCB0aGUgZHJvcHBlZCBwb3NpdGlvblxuICBvbkRyb3AoZXZlbnQ6IERyYWdFdmVudCwga2V5OiBzdHJpbmcpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGNvbnN0IHRhcmdldElkID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCkuY2xvc2VzdChcIi5vcHRpb24taXRlbXNcIik/LmdldEF0dHJpYnV0ZShcImRhdGEtaWRcIik7XG5cbiAgICBpZiAodGhpcy5kcmFnZ2VkSWQgJiYgdGFyZ2V0SWQgJiYgdGhpcy5kcmFnZ2VkSWQgIT09IHRhcmdldElkKSB7XG4gICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5zZWxlY3RlZEVsZW1lbnRba2V5XTtcblxuICAgICAgW29wdGlvbnNbdGhpcy5kcmFnZ2VkSWRdLCBvcHRpb25zW3RhcmdldElkXV0gPSBbb3B0aW9uc1t0YXJnZXRJZF0sIG9wdGlvbnNbdGhpcy5kcmFnZ2VkSWRdXTtcbiAgICAgIC8vIEZpbmQgdGhlIGluZGV4ZXMgb2YgdGhlIGRyYWdnZWQgYW5kIHRhcmdldCBvcHRpb25zXG4gICAgICBjb25zdCBkcmFnZ2VkSW5kZXggPSBvcHRpb25zLmZpbmRJbmRleChvcHRpb24gPT4gb3B0aW9uLmlkID09PSB0aGlzLmRyYWdnZWRJZCk7XG4gICAgICBjb25zdCB0YXJnZXRJbmRleCA9IG9wdGlvbnMuZmluZEluZGV4KG9wdGlvbiA9PiBvcHRpb24uaWQgPT09IHRhcmdldElkKTtcblxuICAgICAgLy8gU3dhcCB0aGUgaXRlbXNcbiAgICAgIGlmIChkcmFnZ2VkSW5kZXggIT09IC0xICYmIHRhcmdldEluZGV4ICE9PSAtMSkge1xuICAgICAgICBbb3B0aW9uc1tkcmFnZ2VkSW5kZXhdLCBvcHRpb25zW3RhcmdldEluZGV4XV0gPSBbb3B0aW9uc1t0YXJnZXRJbmRleF0sIG9wdGlvbnNbZHJhZ2dlZEluZGV4XV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5kcmFnZ2VkSWQgPSBudWxsO1xuICB9XG4gIG9uV2lkdGhTZWxlY3QodmFsdWU6IHN0cmluZykge1xuICAgIGlmICh2YWx1ZSA9PT0gJyonIHx8IHZhbHVlID09PSAnYXV0bycpIHtcbiAgICAgIHRoaXMuc2V0VmFsdWVCeVBhdGgoJ3dpZHRoJywgdmFsdWUpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3RlZEVsZW1lbnQ/LndpZHRoID09PSAnKicgfHwgdGhpcy5zZWxlY3RlZEVsZW1lbnQ/LndpZHRoID09PSAnYXV0bycpIHtcbiAgICAgIC8vIERlZmF1bHQgdG8gMTAwIGlmIHN3aXRjaGluZyBmcm9tICogb3IgYXV0byB0byBjdXN0b21cbiAgICAgIHRoaXMuc2V0VmFsdWVCeVBhdGgoJ3dpZHRoJywgMTAwKTtcbiAgICB9XG4gIH1cbiAgXG59XG4iLCI8IS0tICAtIEZpZWxkIGFuZCBFbGVtZW50IFByb3BlcnRpZXMgLS0+XG48ZGl2IGNsYXNzPVwiY29udGFpbmVyXCI+XG4gIDxkaXYgY2xhc3M9XCJ0YWJzXCI+XG4gICAgPGRpdiBjbGFzcz1cInRhYlwiIFtuZ0NsYXNzXT1cInsnYWN0aXZlJzogYWN0aXZlVGFiID09PSAnYXR0cmlidXRlcyd9XCIgKGNsaWNrKT1cInNldEFjdGl2ZVRhYignYXR0cmlidXRlcycpXCI+XG4gICAgICB7eyAnQVRUUklCVVRFUycgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnQXR0cmlidXRlcycgfX1cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwidGFiXCIgW25nQ2xhc3NdPVwieydhY3RpdmUnOiBhY3RpdmVUYWIgPT09ICdwcm9wZXJ0eSd9XCIgKGNsaWNrKT1cInNldEFjdGl2ZVRhYigncHJvcGVydHknKVwiPlxuICAgICAge3sgJ1BST1BFUlRZJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdQcm9wZXJ0eScgfX1cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwidGFiXCIgW25nQ2xhc3NdPVwieydhY3RpdmUnOiBhY3RpdmVUYWIgPT09ICdhcHBlYXJhbmNlJ31cIiAoY2xpY2spPVwic2V0QWN0aXZlVGFiKCdhcHBlYXJhbmNlJylcIj5cbiAgICAgIHt7ICdBUFBFQVJBTkNFJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdBcHBlYXJhbmNlJyB9fVxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwidGFiLWNvbnRlbnRcIiAqbmdJZj1cImFjdGl2ZVRhYiA9PT0gJ2F0dHJpYnV0ZXMnXCI+XG4gICAgPCEtLSBFbGVtZW50IFByb3BlcnJ0aWVzIC0tPlxuICAgIDwhLS0gIFNlbGVjdCBlbGVtZW50IHR5cGUgc2hvdyAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiZWxlbWVudFByb3BlcnRpZXNbc2VsZWN0ZWRFbGVtZW50Py50eXBlID09PSAnVGFibGUnICYmIHNlbGVjdENvbHVtbiAhPT0gJycgJiYgc2VsZWN0Q29sdW1uICE9PSBudWxsID8gJ1RhYmxlQ29sdW1uJyA6IHNlbGVjdGVkRWxlbWVudD8udHlwZV0gYXMgcHJvcHNcIj5cbiAgICAgIDwhLS0gU0tTMjVNQVIyNSB0aGlzIGlzIGZvciBpbWFnZSBlZGl0IC0tPlxuICAgICAgPGRpdiAqbmdJZj1cInNlbGVjdGVkRWxlbWVudD8udHlwZSA9PT0gJ2ltYWdlJ1wiPlxuICAgICAgICA8aW1hZ2UtY3JvcHBlciAqbmdJZj1cInNlbGVjdGVkRWxlbWVudC5pbWFnZURhdGEgXCIgW2ltYWdlQmFzZTY0XT1cInNlbGVjdGVkRWxlbWVudC5vcmdJbWFnZURhdGFcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJmYWxzZVwiIFthbGlnbkltYWdlXT1cImFsaWduSW1hZ2VcIiBbcm91bmRDcm9wcGVyXT1cInJvdW5kQ3JvcHBlclwiIFtiYWNrZ3JvdW5kQ29sb3JdPVwiJ3doaXRlJ1wiXG4gICAgICAgICAgaW1hZ2VBbHRUZXh0PVwiQWx0ZXJuYXRpdmUgaW1hZ2UgdGV4dFwiIFthbGxvd01vdmVJbWFnZV09XCJmYWxzZVwiIFtoaWRlUmVzaXplU3F1YXJlc109XCJmYWxzZVwiXG4gICAgICAgICAgW2NhbnZhc1JvdGF0aW9uXT1cImNhbnZhc1JvdGF0aW9uXCIgW2FzcGVjdFJhdGlvXT1cImFzcGVjdFJhdGlvXCIgW2NvbnRhaW5XaXRoaW5Bc3BlY3RSYXRpb109XCJmYWxzZVwiXG4gICAgICAgICAgW21haW50YWluQXNwZWN0UmF0aW9dPVwiZmFsc2VcIiBbY3JvcHBlclN0YXRpY1dpZHRoXT1cImNyb3BwZXJTdGF0aWNXaWR0aFwiXG4gICAgICAgICAgW2Nyb3BwZXJTdGF0aWNIZWlnaHRdPVwiY3JvcHBlclN0YXRpY0hlaWdodFwiIFtjcm9wcGVyTWluV2lkdGhdPVwiY3JvcHBlck1pbldpZHRoXCJcbiAgICAgICAgICBbY3JvcHBlck1pbkhlaWdodF09XCJjcm9wcGVyTWluSGVpZ2h0XCIgW2Nyb3BwZXJNYXhXaWR0aF09XCJjcm9wcGVyTWF4V2lkdGhcIlxuICAgICAgICAgIFtjcm9wcGVyTWF4SGVpZ2h0XT1cImNyb3BwZXJNYXhIZWlnaHRcIiBbcmVzZXRDcm9wT25Bc3BlY3RSYXRpb0NoYW5nZV09J3RydWUnIFsoY3JvcHBlcildPVwiY3JvcHBlclwiXG4gICAgICAgICAgWyh0cmFuc2Zvcm0pXT1cInRyYW5zZm9ybVwiIFtvbmx5U2NhbGVEb3duXT1cInRydWVcIiBvdXRwdXQ9XCJibG9iXCIgZm9ybWF0PVwicG5nXCJcbiAgICAgICAgICAoaW1hZ2VDcm9wcGVkKT1cImltYWdlQ3JvcHBlZCgkZXZlbnQpXCIgKGNyb3BwZXJSZWFkeSk9XCJjcm9wcGVyUmVhZHkoJGV2ZW50KVwiPjwvaW1hZ2UtY3JvcHBlcj5cbiAgICAgICAgPGRpdiAqbmdJZj1cInNlbGVjdGVkRWxlbWVudC5pbWFnZURhdGEgXCIgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBnYXA6IDJweDtcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgbG9nby1pY29uXCIgKGNsaWNrKT1cInJvdGF0ZUxlZnQoKVwiIHRpdGxlPVwiUm90YXRlIExlZnRcIj7in7I8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgbG9nby1pY29uXCIgKGNsaWNrKT1cInJvdGF0ZVJpZ2h0KClcIiB0aXRsZT1cIlJvdGF0ZSBSaWdodFwiPuKfszwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBsb2dvLWljb25cIiAoY2xpY2spPVwiem9vbU91dCgpXCIgdGl0bGU9XCJab29tIE91dFwiPi08L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgbG9nby1pY29uXCIgKGNsaWNrKT1cInpvb21JbigpXCIgdGl0bGU9XCJab29tIEluXCI+KzwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBsb2dvLWljb25cIiAoY2xpY2spPVwibW92ZUxlZnQoKVwiIHRpdGxlPVwiTW92ZSBMZWZ0XCI+4oaQPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImN1cnNvci1wb2ludGVyIGxvZ28taWNvblwiIChjbGljayk9XCJtb3ZlUmlnaHQoKVwiIHRpdGxlPVwiTW92ZSBSaWdodFwiPuKGkjwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBsb2dvLWljb25cIiAoY2xpY2spPVwibW92ZVVwKClcIiB0aXRsZT1cIk1vdmUgVXBcIj7ihpE8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgbG9nby1pY29uXCIgKGNsaWNrKT1cIm1vdmVEb3duKClcIiB0aXRsZT1cIk1vdmUgRG93blwiPuKGkzwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBsb2dvLWljb25cIiAoY2xpY2spPVwiZmxpcEhvcml6b250YWwoKVwiIFtjbGFzcy5lbmFibGVkXT1cInRyYW5zZm9ybS5mbGlwSFwiXG4gICAgICAgICAgICB0aXRsZT1cIkZsaXAgSG9yaXpvbnRhbGx5XCI+4oaUPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImN1cnNvci1wb2ludGVyIGxvZ28taWNvblwiIChjbGljayk9XCJmbGlwVmVydGljYWwoKVwiIFtjbGFzcy5lbmFibGVkXT1cInRyYW5zZm9ybS5mbGlwVlwiXG4gICAgICAgICAgICB0aXRsZT1cIkZsaXAgVmVydGljYWxseVwiPuKGlTwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBsb2dvLWljb25cIiAoY2xpY2spPVwicmVzZXRJbWFnZSgpXCIgdGl0bGU9XCJSZXNldFwiPsOXPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8IS0tIFNLUzI4TUFSMjUgc2VhcmNoIHBkZiBzcGVjaWZpYyBmb3IgcGRmIGVsZW1lbnQgLS0+XG4gICAgICA8ZGl2ICpuZ0lmPVwic2VsZWN0ZWRFbGVtZW50Py50eXBlID09PSAnUGRmJ1wiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJ0ZXh0LXNtXCI+e3sgJ1NFQVJDSFBERicgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnU2VhcmNoIFBkZicgfX08L2xhYmVsPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiAycHg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGp1c3RpZnktY29udGVudDogY2VudGVyO1wiPlxuICAgICAgICAgIDxueHQtc2VhcmNoLWJveCBbcXVlc3Rpb25dPVwic2VsZWN0ZWRFbGVtZW50XCIgW3JlYWRPbmx5XT1cInNlbGVjdGVkRWxlbWVudC5pc1JlYWRPbmx5XCIgW2FwaU1ldGFdPVwiYm9va1N1YnRleHRcIlxuICAgICAgICAgICAgICBbcGxhY2VIb2xkZXJUZXh0XT1cInNlbGVjdGVkRWxlbWVudC5xdWVzdGlvbiB8fCAnJ1wiXG4gICAgICAgICAgICAgIFttb2RlXT1cIidlZGl0J1wiXG4gICAgICAgICAgICAgIChzZWFyY2hWYWx1ZUNoYW5nZSk9XCJjaGlsZEV2ZW50Q2FwdHVyZSgkZXZlbnQpXCI+XG4gICAgICAgICAgPC9ueHQtc2VhcmNoLWJveD5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibGluay1pY29uXCI+XG4gICAgICAgICAgICA8c3ZnIChjbGljayk9XCJsaW5rVG9nZ2xlRHJvcGRvd24oJGV2ZW50KVwiIGZpbGw9XCIjMDAwMDAwXCIgdmVyc2lvbj1cIjEuMVwiIGlkPVwiQ2FwYV8xXCJcbiAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHdpZHRoPVwiMjRweFwiIGhlaWdodD1cIjI0cHhcIlxuICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDQ1MCA0NTBcIiB4bWw6c3BhY2U9XCJwcmVzZXJ2ZVwiPlxuICAgICAgICAgICAgICA8Zz5cbiAgICAgICAgICAgICAgICA8Zz5cbiAgICAgICAgICAgICAgICAgIDxnPlxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTMxOC4xNSwyMzAuMTk1bDc3LjkzNC03Ny45MzdjMzEuODk0LTMxLjg5MiwzMS44OTQtODMuNzgyLTAuMDA0LTExNS42NzRsLTEyLjY2LTEyLjY2XG4gICAgICAgICAgYy0zMS44OTMtMzEuODk2LTgzLjc4LTMxLjg5Ni0xMTUuNjc0LTAuMDA0bC03Ny45MzcsNzcuOTM0Yy0xNy41ODgsMTcuNTg4LTI1LjQ1Nyw0MS4yNjQtMjMuNjQ2LDY0LjMxMVxuICAgICAgICAgIGMtMjMuMDQ1LTEuODEzLTQ2LjcyMiw2LjA1Ni02NC4zMDgsMjMuNjQ3TDIzLjkyLDI2Ny43NDhjLTMxLjg5NCwzMS44ODktMzEuODk0LDgzLjc3OSwwLDExNS42NzRsMTIuNjY0LDEyLjY2MlxuICAgICAgICAgIGMzMS44OTMsMzEuODkzLDgzLjc4MywzMS44OTMsMTE1LjY3NCwwbDc3LjkzNS03Ny45MzZjMTcuNTkyLTE3LjU5LDI1LjQ1OS00MS4yNjYsMjMuNjQ3LTY0LjMwOVxuICAgICAgICAgIEMyNzYuODg0LDI1NS42NTQsMzAwLjU2LDI0Ny43ODMsMzE4LjE1LDIzMC4xOTV6IE0yMDIuNjUzLDI5MC42MDVsLTc3LjkzNiw3Ny45MzhjLTE2LjcwNSwxNi43MDMtNDMuODg5LDE2LjcwMy02MC41OSwwXG4gICAgICAgICAgbC0xMi42NjYtMTIuNjY2Yy0xNi43MDUtMTYuNzAxLTE2LjcwMy00My44ODUsMC02MC41OTRsNzcuOTM2LTc3LjkzMmMxNC4xNC0xNC4xNDEsMzUuNzc5LTE2LjMwNiw1Mi4yMjYtNi41MTZsLTMyLjMwMiwzMi4zMDdcbiAgICAgICAgICBjLTcuNjA2LDcuNjA0LTcuNjA2LDE5LjkzOCwwLDI3LjU0MWM3LjYwNSw3LjYwNywxOS45MzcsNy42MDcsMjcuNTQxLDBsMzIuMzA2LTMyLjMwM1xuICAgICAgICAgIEMyMTguOTU5LDI1NC44MjgsMjE2Ljc5NSwyNzYuNDY5LDIwMi42NTMsMjkwLjYwNXogTTIzOC4zODIsMjA5LjE2OWwzMi4yOTktMzIuMzA2YzcuNjA4LTcuNjAyLDcuNjA4LTE5LjkzNSwwLTI3LjUzOFxuICAgICAgICAgIGMtNy42MDQtNy42MS0xOS45MzYtNy42MS0yNy41NDEtMC4wMDRsLTMyLjMwMywzMi4zMDNjLTkuNzkxLTE2LjQ0Ni03LjYyNy0zOC4wODcsNi41MTQtNTIuMjI2bDc3LjkzNS03Ny45MzVcbiAgICAgICAgICBjMTYuNzA3LTE2LjcwNyw0My44OS0xNi43MDcsNjAuNTk0LDBsMTIuNjY0LDEyLjY2NGMxNi43MDUsMTYuNzA1LDE2LjcwNSw0My44ODYsMCw2MC41OTFsLTc3LjkzNiw3Ny45MzdcbiAgICAgICAgICBDMjc2LjQ2OCwyMTYuNzk3LDI1NC44MjgsMjE4Ljk1OSwyMzguMzgyLDIwOS4xNjl6XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0zNDMuNDY2LDI2MS40NjVjLTQ1LjI4NywwLTgyLDM2LjcxMy04Miw4MnMzNi43MTMsODIsODIsODJjNDUuMjg2LDAsODItMzYuNzEzLDgyLTgyUzM4OC43NTMsMjYxLjQ2NSwzNDMuNDY2LDI2MS40NjV6XG4gICAgICAgICAgIE0zNzIuNTA1LDMzMy41NjRsLTU2LjA0Niw1Ni4xMDRjLTAuMjM5LDAuMjM4LTAuNTM2LDAuNDEtMC44NjIsMC40OTZsLTIyLjMxNSw1Ljg1Yy0wLjY0OSwwLjE2OC0xLjM0Ny0wLjAyLTEuODIyLTAuNDk0XG4gICAgICAgICAgYy0wLjQ3Ny0wLjQ3OS0wLjY2Ni0xLjE3Mi0wLjQ5Ni0xLjgyNGw1LjgyNi0yMi4zMThjMC4wODQtMC4zMjYsMC4yNTYtMC42MjcsMC40OTQtMC44NjNsNTYuMDQ3LTU2LjEwNFxuICAgICAgICAgIGMwLjc0Mi0wLjc0MiwxLjk0NS0wLjc0NCwyLjY4OC0wLjAwMmw0LjU0OCw0LjU0MWMwLjczOSwwLjc0LDAuNzQxLDEuOTQzLDAsMi42ODhsLTM3LjQzMywzNy40NzFsNC43MDksNC43MDNsMzcuNDM1LTM3LjQ3MVxuICAgICAgICAgIGMwLjczOS0wLjc0MiwxLjk0LTAuNzQyLDIuNjgyLTAuMDAybDQuNTUsNC41NDFDMzczLjI1LDMzMS42MTcsMzczLjI1LDMzMi44MjIsMzcyLjUwNSwzMzMuNTY0eiBNMzk1LjQ3MiwzMTAuNTc0bC0xNywxNy4wMThcbiAgICAgICAgICBjLTAuNzM5LDAuNzQ0LTEuOTQyLDAuNzQ0LTIuNjg1LDAuMDAybC0xNi40ODktMTYuNDc1Yy0wLjc0NC0wLjc0LTAuNzQ0LTEuOTQzLTAuMDAyLTIuNjg4bDE3LTE3LjAyXG4gICAgICAgICAgYzAuNzQxLTAuNzQsMS45NDQtMC43NCwyLjY4OC0wLjAwMmwxNi40ODcsMTYuNDc3QzM5Ni4yMTYsMzA4LjYyOSwzOTYuMjE2LDMwOS44MzIsMzk1LjQ3MiwzMTAuNTc0elwiIC8+XG4gICAgICAgICAgICAgICAgICA8L2c+XG4gICAgICAgICAgICAgICAgPC9nPlxuICAgICAgICAgICAgICA8L2c+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaW5rLWRyb3Bkb3duLW1lbnVcIiAqbmdJZj1cImlzTGlua0Ryb3Bkb3duT3BlblwiICNkcm9wZG93bj5cbiAgICAgICAgICAgICAgPGxhYmVsPnt7ICdFTkRQT0lOVCcgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnRW5kcG9pbnQnIH19OjwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwiYm9va1N1YnRleHQuZW5kcG9pbnRcIiAvPlxuXG4gICAgICAgICAgICAgIDxsYWJlbD57eyAnVkFSSUFCTEUnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ1ZhcmlhYmxlJyB9fTo8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cImJvb2tTdWJ0ZXh0LnZhcmlhYmxlXCIgLz5cblxuICAgICAgICAgICAgICA8bGFiZWw+e3sgJ0ZJRUxEJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdGaWVsZCcgfX06PC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgW25nTW9kZWxdPVwiZmllbGRBc1N0cmluZ1wiIChuZ01vZGVsQ2hhbmdlKT1cInVwZGF0ZUZpZWxkKCRldmVudClcIiAvPlxuXG4gICAgICAgICAgICAgIDxsYWJlbD57eyAnREVGQVVMVEZJRUxEJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdEZWZhdWx0IEZpZWxkJyB9fTo8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cImJvb2tTdWJ0ZXh0LmRlZmF1bHRGaWVsZFwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHByb3Agb2YgZWxlbWVudFByb3BlcnRpZXNbc2VsZWN0ZWRFbGVtZW50Py50eXBlID09PSAnVGFibGUnICYmIHNlbGVjdENvbHVtbiAhPT0gJycgJiYgc2VsZWN0Q29sdW1uICE9PSBudWxsID8gJ1RhYmxlQ29sdW1uJyA6IHNlbGVjdGVkRWxlbWVudD8udHlwZV0uZWxlbWVudFByb3BzXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgPGxhYmVsICpuZ0lmPVwicHJvcC50eXBlICE9PSAnY2hlY2tib3gnICYmIHByb3AudHlwZSAhPT0gJ3N1YlF1ZXN0aW9uJ1wiIGNsYXNzPVwidGV4dC1zbVwiPnt7ICBwcm9wLmxhYmVsUGF0aCB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6IHByb3AubGFiZWwgXG4gICAgICAgICAgICB9fTwvbGFiZWw+XG5cbiAgICAgICAgICA8IS0tIFRleHQgSW5wdXQgLS0+XG4gICAgICAgICAgPGlucHV0ICpuZ0lmPVwicHJvcC50eXBlID09PSAndGV4dCdcIiB0eXBlPVwidGV4dFwiIFtwbGFjZWhvbGRlcl09XCJwcm9wLnBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJoZWFkZXJTZWxlY3QgPyBwZGYudGl0bGUgOiAoc2VsZWN0ZWRFbGVtZW50Py50eXBlID09PSAnVGFibGUnID8gKHByb3AudGFyZ2V0QXJyYXkgPyBnZXRWYWx1ZUJ5QXJyYXlQYXRoKHByb3AudGFyZ2V0QXJyYXksIHByb3AudGFyZ2V0QXJyYXlLZXksIHNlbGVjdENvbHVtbiwgcHJvcC5rZXkgKSA6IGdldFZhbHVlQnlQYXRoKHByb3Aua2V5KSApIDogIGdldFZhbHVlQnlQYXRoKHByb3Aua2V5KSlcIlxuICAgICAgICAgICAgKGlucHV0KT1cImhlYWRlclNlbGVjdCA/IHVwZGF0ZVRpdGxlKCRldmVudC50YXJnZXQudmFsdWUpIDogKHNlbGVjdGVkRWxlbWVudD8udHlwZSA9PT0gJ1RhYmxlJyA/IChwcm9wLnRhcmdldEFycmF5ID8gdXBkYXRlVmFsdWVCeUFycmF5UGF0aChwcm9wLnRhcmdldEFycmF5LCBwcm9wLnRhcmdldEFycmF5S2V5LCBzZWxlY3RDb2x1bW4sIHByb3Aua2V5LCAkZXZlbnQpIDogc2V0VmFsdWVCeVBhdGgocHJvcC5rZXksICRldmVudC50YXJnZXQudmFsdWUpICkgOiBzZXRWYWx1ZUJ5UGF0aChwcm9wLmtleSwgJGV2ZW50LnRhcmdldC52YWx1ZSkpXCJcbiAgICAgICAgICAgIFtjbGFzcy5yZWFkLW9ubHldPVwic2VsZWN0ZWRFbGVtZW50LnJlYWRPbmx5XCIgW3JlYWRvbmx5XT1cInNlbGVjdGVkRWxlbWVudC5yZWFkT25seVwiIC8+XG5cbiAgICAgICAgICA8IS0tIHF1ZXN0aW9uTnVtYmVyIC0tPlxuICAgICAgICAgIDxpbnB1dCAqbmdJZj1cInByb3Aua2V5ID09PSAncXVlc3Rpb25OdW1iZXInXCIgdHlwZT1cIm51bWJlclwiIFt2YWx1ZV09XCJzZWxlY3RlZEVsZW1lbnQucXVlc3Rpb25OdW1iZXJcIlxuICAgICAgICAgICAgKGlucHV0KT1cInNldFZhbHVlQnlQYXRoKCdxdWVzdGlvbk51bWJlcicsICRldmVudC50YXJnZXQudmFsdWUpXCIgLz5cblxuICAgICAgICAgIDwhLS0gZmlsZSAtLT5cbiAgICAgICAgICA8IS0tIEFkZCB0aGlzIGluc2lkZSB0aGUgZWxlbWVudFByb3BzIGxvb3Agd2hlcmUgb3RoZXIgaW5wdXRzIGFyZSByZW5kZXJlZCAtLT5cbiAgICAgICAgICA8c2VsZWN0ICpuZ0lmPVwicHJvcC50eXBlID09PSAnc2VsZWN0JyAmJiBwcm9wLmtleSA9PT0gJ3N1cHBvcnRUeXBlJ1wiIFt2YWx1ZV09XCJzZWxlY3RlZEVsZW1lbnRbcHJvcC5rZXldXCJcbiAgICAgICAgICAgIChjaGFuZ2UpPVwic2V0VmFsdWVCeVBhdGgocHJvcC5rZXksICRldmVudC50YXJnZXQudmFsdWUpXCI+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+LS0tU2VsZWN0LS0tPC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgcHJvcC5vcHRpb25zXCIgW3ZhbHVlXT1cIm9wdGlvbi52YWx1ZVwiPiB7eyBvcHRpb24ubGFiZWxQYXRoIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogb3B0aW9uLmxhYmVsICB9fSA8L29wdGlvbj5cbiAgICAgICAgICA8L3NlbGVjdD5cblxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJwcm9wLnR5cGUgPT09ICdjaGVja2JveCdcIj5cblxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgIFtjaGVja2VkXT1cInNlbGVjdGVkRWxlbWVudC50eXBlID09PSAnVGFibGUnID8gKHByb3AudGFyZ2V0QXJyYXkgPyBnZXRWYWx1ZUJ5QXJyYXlQYXRoKHByb3AudGFyZ2V0QXJyYXksIHByb3AudGFyZ2V0QXJyYXlLZXksIHNlbGVjdENvbHVtbiwgcHJvcC5rZXkgKSA6IGdldFZhbHVlQnlQYXRoKHByb3Aua2V5KSApOiAgZ2V0VmFsdWVCeVBhdGgocHJvcC5rZXkpIFwiXG4gICAgICAgICAgICAgIChjaGFuZ2UpPVwiIHNlbGVjdGVkRWxlbWVudC50eXBlID09PSAnVGFibGUnID8gKHByb3AudGFyZ2V0QXJyYXkgPyB1cGRhdGVWYWx1ZUJ5QXJyYXlQYXRoKHByb3AudGFyZ2V0QXJyYXksIHByb3AudGFyZ2V0QXJyYXlLZXksIHNlbGVjdENvbHVtbiwgcHJvcC5rZXksICRldmVudCkgOiBvblRvZ2dsZUNoYW5nZShwcm9wLmtleSwgJGV2ZW50KSApIDogb25Ub2dnbGVDaGFuZ2UocHJvcC5rZXksICRldmVudClcIiAvPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRvZ2dsZS1sYWJlbFwiIHN0eWxlPVwicGFkZGluZy1sZWZ0OiAxMHB4O1wiPnt7ICBwcm9wLmxhYmVsUGF0aCB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6IHByb3AubGFiZWwgIH19PC9zcGFuPlxuXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPCEtLSBTS1MyME1BUjI1IFN1YnF1ZXN0aW9uIFR5cGUgLS0+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cInByb3AudHlwZSA9PT0gJ3N1YlF1ZXN0aW9uJ1wiPlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiByb3c7IGdhcDogMTBweDsgYWxpZ24taXRlbXM6IGNlbnRlcjtcIj5cbiAgICAgICAgICAgICAgPGRpdj57eyAgcHJvcC5sYWJlbFBhdGggfCBueHRDdXN0b21UcmFuc2xhdGUgOiBwcm9wLmxhYmVsICB9fTwvZGl2PlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJzZWxlY3RlZEVsZW1lbnQudHlwZSA9PT0gJ1RhYmxlJyA/IChwcm9wLnRhcmdldEFycmF5ID8gZ2V0VmFsdWVCeUFycmF5UGF0aChwcm9wLnRhcmdldEFycmF5LCBwcm9wLnRhcmdldEFycmF5S2V5LCBzZWxlY3RDb2x1bW4sIHByb3Aua2V5ICkgOiBnZXRWYWx1ZUJ5UGF0aChwcm9wLmtleSkgKTogIGdldFZhbHVlQnlQYXRoKHByb3Aua2V5KSBcIlxuICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiIHNlbGVjdGVkRWxlbWVudC50eXBlID09PSAnVGFibGUnID8gKHByb3AudGFyZ2V0QXJyYXkgPyB1cGRhdGVWYWx1ZUJ5QXJyYXlQYXRoKHByb3AudGFyZ2V0QXJyYXksIHByb3AudGFyZ2V0QXJyYXlLZXksIHNlbGVjdENvbHVtbiwgcHJvcC5rZXksICRldmVudCkgOiBvblRvZ2dsZUNoYW5nZShwcm9wLmtleSwgJGV2ZW50KSApIDogb25Ub2dnbGVDaGFuZ2UocHJvcC5rZXksICRldmVudClcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8IS0tIFNLUzIwTUFSMjUgUmVuZGVyIHN1YnF1ZXN0aW9ucyB3aGVuIGNoZWNrYm94IGlzIGNoZWNrZWQgLS0+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICpuZ0lmPVwic2VsZWN0ZWRFbGVtZW50LnR5cGUgPT09ICdUYWJsZScgPyAocHJvcC50YXJnZXRBcnJheSA/IGdldFZhbHVlQnlBcnJheVBhdGgocHJvcC50YXJnZXRBcnJheSwgcHJvcC50YXJnZXRBcnJheUtleSwgc2VsZWN0Q29sdW1uLCBwcm9wLmtleSApIDogZ2V0VmFsdWVCeVBhdGgocHJvcC5rZXkpICk6ICBnZXRWYWx1ZUJ5UGF0aChwcm9wLmtleSlcIj5cbiAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgc3ViUHJvcCBvZiBwcm9wLnN1YlF1ZXN0aW9uXCJcbiAgICAgICAgICAgICAgICBzdHlsZT1cImJhY2tncm91bmQtY29sb3I6ICNlN2YyZmY7IHBhZGRpbmc6IDhweDsgYm9yZGVyLXJhZGl1czogNHB4O1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgICA8bGFiZWw+e3sgc3ViUHJvcC5sYWJlbFBhdGggfCBueHRDdXN0b21UcmFuc2xhdGUgOiBzdWJQcm9wLmxhYmVsIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzdWJQcm9wLnR5cGUgPT09ICdhcnJheSdcIj5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBJdGVyYXRlIG92ZXIgZmlsdGVyZWQgY29sdW1ucyB0byBkaXNwbGF5IGNoZWNrYm94ZXMgLS0+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBmaWx0ZXJlZENvbHVtbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwic3ViUHJvcC5vcGVyYW5kcyA/IHN1YlByb3Aub3BlcmFuZHMuaW5jbHVkZXMoY29sdW1uLmFwaU5hbWUpIDogZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uQ2hlY2tib3hDaGFuZ2Uoc3ViUHJvcC50YXJnZXRBcnJheSxzdWJQcm9wLnRhcmdldEFycmF5S2V5LHN1YlByb3Aua2V5LCBjb2x1bW4uYXBpTmFtZSwgJGV2ZW50LnRhcmdldC5jaGVja2VkKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgY29sdW1uLmFwaU5hbWUgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPCEtLSBTS1MyMU1BUjI1IE5ldyByYWRpbyB0eXBlIC0tPlxuICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInN1YlByb3AudHlwZSA9PT0gJ3JhZGlvJ1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgZmlsdGVyZWRDb2x1bW5zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiIFtuYW1lXT1cInN1YlByb3Aua2V5XCIgW3ZhbHVlXT1cImNvbHVtbi5hcGlOYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiZ2V0VmFsdWVCeUFycmF5UGF0aChzdWJQcm9wLnRhcmdldEFycmF5LCBzdWJQcm9wLnRhcmdldEFycmF5S2V5LCBzZWxlY3RDb2x1bW4sIHN1YlByb3Aua2V5KSA9PT0gY29sdW1uLmFwaU5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uUmFkaW9DaGFuZ2Uoc3ViUHJvcC50YXJnZXRBcnJheSwgc3ViUHJvcC50YXJnZXRBcnJheUtleSwgc3ViUHJvcC5rZXksIGNvbHVtbi5hcGlOYW1lKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgY29sdW1uLmFwaU5hbWUgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPCEtLSBTS1MyME1BUjI1IEFkZCBtb3JlIHN1YnByb3BlcnR5IHR5cGVzIGFzIG5lZWRlZCAtLT5cbiAgICAgICAgICAgICAgICAgIDwhLS0gSW5zaWRlIHRoZSBzdWJQcm9wIG5nRm9yIGxvb3AgLS0+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgKm5nSWY9XCJzdWJQcm9wLnR5cGUgPT09ICd0ZXh0J1wiIHR5cGU9XCJ0ZXh0XCIgW3BsYWNlaG9sZGVyXT1cInN1YlByb3AucGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwic2VsZWN0ZWRFbGVtZW50LnR5cGUgPT09ICdUYWJsZScgPyAoc3ViUHJvcC50YXJnZXRBcnJheSA/IGdldFZhbHVlQnlBcnJheVBhdGgoc3ViUHJvcC50YXJnZXRBcnJheSwgc3ViUHJvcC50YXJnZXRBcnJheUtleSwgc2VsZWN0Q29sdW1uLCBzdWJQcm9wLmtleSApIDogZ2V0VmFsdWVCeVBhdGgoc3ViUHJvcC5rZXkpICkgOiBnZXRWYWx1ZUJ5UGF0aChzdWJQcm9wLmtleSlcIlxuICAgICAgICAgICAgICAgICAgICAoaW5wdXQpPVwic2VsZWN0ZWRFbGVtZW50LnR5cGUgPT09ICdUYWJsZScgPyAoc3ViUHJvcC50YXJnZXRBcnJheSA/IHVwZGF0ZVZhbHVlQnlBcnJheVBhdGgoc3ViUHJvcC50YXJnZXRBcnJheSwgc3ViUHJvcC50YXJnZXRBcnJheUtleSwgc2VsZWN0Q29sdW1uLCBzdWJQcm9wLmtleSwgJGV2ZW50KSA6IHNldFZhbHVlQnlQYXRoKHN1YlByb3Aua2V5LCAkZXZlbnQudGFyZ2V0LnZhbHVlKSApIDogc2V0VmFsdWVCeVBhdGgoc3ViUHJvcC5rZXksICRldmVudC50YXJnZXQudmFsdWUpXCIgLz5cblxuICAgICAgICAgICAgICAgICAgPGlucHV0ICpuZ0lmPVwic3ViUHJvcC50eXBlID09PSAnYm9vbGVhbidcIiB0eXBlPVwiY2hlY2tib3hcIiBbY2hlY2tlZF09XCJnZXRWYWx1ZUJ5UGF0aChzdWJQcm9wLmtleSlcIlxuICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInNldFZhbHVlQnlQYXRoKHN1YlByb3Aua2V5LCAkZXZlbnQudGFyZ2V0LmNoZWNrZWQpXCIgLz5cbiAgICAgICAgICAgICAgICAgIDxzZWxlY3QgKm5nSWY9XCJzdWJQcm9wLnR5cGUgPT09ICdzZWxlY3QnXCIgW3ZhbHVlXT1cImdldFZhbHVlQnlQYXRoKHN1YlByb3Aua2V5KVwiXG4gICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwic2V0VmFsdWVCeVBhdGgoc3ViUHJvcC5rZXksICRldmVudC50YXJnZXQudmFsdWUpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBzdWJQcm9wLm9wdGlvbnNcIiBbdmFsdWVdPVwib3B0aW9uXCI+e3sgb3B0aW9uIH19PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCAqbmdJZj1cInN1YlByb3AudHlwZSA9PT0gJ2NoZWNrYm94J1wiIHR5cGU9XCJjaGVja2JveFwiIFtjaGVja2VkXT1cImdldFZhbHVlQnlQYXRoKHN1YlByb3Aua2V5KVwiXG4gICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwic2V0VmFsdWVCeVBhdGgoc3ViUHJvcC5rZXksICRldmVudC50YXJnZXQuY2hlY2tlZClcIiAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPCEtLSBTS1MyME1BUjI1IFRleHQgQWxpZ24gQnV0dG9ucyAtLT5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwicHJvcC50eXBlID09PSAnYWxpZ24nXCI+XG4gICAgICAgICAgICA8YnV0dG9uICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgcHJvcC5vcHRpb25zXCIgKGNsaWNrKT1cIm9uQWxpZ25TZWxlY3Qob3B0aW9uLnZhbHVlKVwiXG4gICAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwic2VsZWN0ZWRFbGVtZW50Py50ZXh0QWxpZ24gPT09IG9wdGlvbi52YWx1ZVwiIFt0aXRsZV09XCJvcHRpb24udmFsdWVcIj5cbiAgICAgICAgICAgICAgPGltZyBbc3JjXT1cIicuLi9hc3NldHMvaWNvbnMvJyArIG9wdGlvbi5pY29uICsgJy5zdmcnXCIgW2FsdF09XCJvcHRpb24udmFsdWVcIiBjbGFzcz1cImljb24tc2l6ZVwiIC8+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJwcm9wLnR5cGUgPT09ICdzdHlsZSdcIj5cbiAgICAgICAgICAgIDxidXR0b24gKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBwcm9wLm9wdGlvbnNcIiAoY2xpY2spPVwib25TdHlsZVNlbGVjdChvcHRpb24udmFsdWUpXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJpc1N0eWxlQWN0aXZlKG9wdGlvbi52YWx1ZSlcIiBbdGl0bGVdPVwib3B0aW9uLnZhbHVlXCI+XG4gICAgICAgICAgICAgIDxpbWcgW3NyY109XCInLi4vYXNzZXRzL2ljb25zLycgKyBvcHRpb24uaWNvbiArICcuc3ZnJ1wiIFthbHRdPVwib3B0aW9uLnZhbHVlXCIgY2xhc3M9XCJpY29uLXNpemVcIiAvPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIEZpZWxkIFNpemUgQ29udHJvbHMgLS0+XG4gICAgICAgICAgPCEtLSAgQ2hhbmdlIGtleSB3aWR0aCAtLT5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwicHJvcC5rZXkgPT09ICd3aWR0aCdcIiBbbmdDbGFzc109XCJ7J2ZsZXgtY29udGFpbmVyJzogdHJ1ZSwgJ2N1c3RvbS1hY3RpdmUnOiBzZWxlY3RlZEVsZW1lbnQ/LndpZHRoICE9PSAnKicgJiYgc2VsZWN0ZWRFbGVtZW50Py53aWR0aCAhPT0gJ2F1dG8nfVwiPlxuICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICBjbGFzcz1cInNpemUtc2VsZWN0XCJcbiAgICAgICAgICAgICAgW3ZhbHVlXT1cInNlbGVjdGVkRWxlbWVudD8ud2lkdGggPT09ICcqJyA/ICdEZWZhdWx0JyA6IHNlbGVjdGVkRWxlbWVudD8ud2lkdGggPT09ICdhdXRvJyA/ICdBdXRvJyA6ICdDdXN0b20nXCJcbiAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvbldpZHRoU2VsZWN0KFxuICAgICAgICAgICAgICAgICRldmVudC50YXJnZXQudmFsdWUgPT09ICdEZWZhdWx0JyA/ICcqJyA6XG4gICAgICAgICAgICAgICAgJGV2ZW50LnRhcmdldC52YWx1ZSA9PT0gJ0F1dG8nID8gJ2F1dG8nIDogJ2N1c3RvbSdcbiAgICAgICAgICAgICAgKVwiPlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiRGVmYXVsdFwiPnt7ICdERUZBVUxUJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdEZWZhdWx0JyB9fTwvb3B0aW9uPlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiQXV0b1wiPnt7ICdBVVRPJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdBdXRvJyB9fTwvb3B0aW9uPlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiQ3VzdG9tXCI+e3sgJ0NVU1RPTScgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnQ3VzdG9tJyB9fTwvb3B0aW9uPlxuICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgXG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgKm5nSWY9XCJzZWxlY3RlZEVsZW1lbnQ/LndpZHRoICE9PSAnKicgJiYgc2VsZWN0ZWRFbGVtZW50Py53aWR0aCAhPT0gJ2F1dG8nXCJcbiAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICAgIGNsYXNzPVwic2l6ZS1pbnB1dFwiXG4gICAgICAgICAgICAgIG1pbj1cIjFcIlxuICAgICAgICAgICAgICBtYXg9XCIxMDBcIlxuICAgICAgICAgICAgICBbdmFsdWVdPVwic2VsZWN0ZWRFbGVtZW50Py53aWR0aFwiXG4gICAgICAgICAgICAgIChpbnB1dCk9XCJzZXRWYWx1ZUJ5UGF0aChcbiAgICAgICAgICAgICAgICAnd2lkdGgnLFxuICAgICAgICAgICAgICAgICRldmVudC50YXJnZXQudmFsdWVBc051bWJlciA8IDEgPyAxIDpcbiAgICAgICAgICAgICAgICAkZXZlbnQudGFyZ2V0LnZhbHVlQXNOdW1iZXIgPiAxMDAgPyAxMDAgOlxuICAgICAgICAgICAgICAgICRldmVudC50YXJnZXQudmFsdWVBc051bWJlclxuICAgICAgICAgICAgICApXCIgLz5cbiAgICAgICAgICA8L2Rpdj4gICAgICAgICAgICAgICAgICAgXG5cbiAgICAgICAgICA8IS0tICBMaW5lIFByb3BlcnRpZXMgLS0+XG4gICAgICAgICAgPCEtLSBQYWRkaW5nIFRvcCAtLT5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwicHJvcC5rZXkgPT09ICdwYWRkaW5nVG9wJ1wiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBbcGxhY2Vob2xkZXJdPVwicHJvcC5wbGFjZWhvbGRlclwiIFt2YWx1ZV09XCJzZWxlY3RlZEVsZW1lbnQ/LnBhZGRpbmdUb3BcIlxuICAgICAgICAgICAgICAoaW5wdXQpPVwic2V0VmFsdWVCeVBhdGgoJ3BhZGRpbmdUb3AnLCAkZXZlbnQudGFyZ2V0LnZhbHVlKVwiIC8+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIFBhZGRpbmcgQm90dG9tIC0tPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJwcm9wLmtleSA9PT0gJ3BhZGRpbmdCb3R0b20nXCI+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIFtwbGFjZWhvbGRlcl09XCJwcm9wLnBsYWNlaG9sZGVyXCIgW3ZhbHVlXT1cInNlbGVjdGVkRWxlbWVudD8ucGFkZGluZ0JvdHRvbVwiXG4gICAgICAgICAgICAgIChpbnB1dCk9XCJzZXRWYWx1ZUJ5UGF0aCgncGFkZGluZ0JvdHRvbScsICRldmVudC50YXJnZXQudmFsdWUpXCIgLz5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gTGluZSBTdHlsZSAtLT5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwicHJvcC5rZXkgPT09ICdsaW5lU3R5bGUnXCI+XG4gICAgICAgICAgICA8c2VsZWN0IFt2YWx1ZV09XCJzZWxlY3RlZEVsZW1lbnQ/LmxpbmVTdHlsZVwiIChjaGFuZ2UpPVwic2V0VmFsdWVCeVBhdGgoJ2xpbmVTdHlsZScsICRldmVudC50YXJnZXQudmFsdWUpXCI+XG4gICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBwcm9wLm9wdGlvbnNcIiBbdmFsdWVdPVwib3B0aW9uXCI+e3sgb3B0aW9uIH19PC9vcHRpb24+XG4gICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gQ29sb3IgLS0+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cInByb3Aua2V5ID09PSAnY29sb3InXCI+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNvbG9yXCIgW3ZhbHVlXT1cInNlbGVjdGVkRWxlbWVudD8uY29sb3JcIlxuICAgICAgICAgICAgICAoaW5wdXQpPVwic2V0VmFsdWVCeVBhdGgoJ2NvbG9yJywgJGV2ZW50LnRhcmdldC52YWx1ZSlcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwidGFiLWNvbnRlbnRcIiAqbmdJZj1cImFjdGl2ZVRhYiA9PT0gJ3Byb3BlcnR5J1wiPlxuICAgIDwhLS0gRmllbGQgRWxlbWVudHMgUHJvcGVydGllcyAtLT5cbiAgICA8IS0tICBTaG93IGVsZW1lbnRzIElEICAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiZWxlbWVudFByb3BlcnRpZXNbc2VsZWN0ZWRFbGVtZW50Py50eXBlID09PSAnVGFibGUnICYmIHNlbGVjdENvbHVtbiAhPT0gJycgJiYgc2VsZWN0Q29sdW1uICE9PSBudWxsID8gJ1RhYmxlQ29sdW1uJyA6IHNlbGVjdGVkRWxlbWVudD8udHlwZV1cIj5cbiAgICAgIDxsYWJlbD5MYWJlbCBJZDwvbGFiZWw+XG4gICAgICA8ZGl2XG4gICAgICAgIHN0eWxlPVwiZm9udC1zaXplOiAxM3B4OyBwYWRkaW5nOiAxMXB4OyBib3JkZXItcmFkaXVzOiA1cHg7IGJhY2tncm91bmQtY29sb3I6ICNmOGY4Zjg7IGJvcmRlcjogMXB4IHNvbGlkICNkZGQ7XCI+XG4gICAgICAgIHt7IGhlYWRlclNlbGVjdCA/IGJvb2tJZCA6IHNlbGVjdGVkRWxlbWVudC5pZCB9fTwvZGl2PlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcHJvcCBvZiBlbGVtZW50UHJvcGVydGllc1tzZWxlY3RlZEVsZW1lbnQ/LnR5cGUgPT09ICdUYWJsZScgJiYgc2VsZWN0Q29sdW1uICE9PSAnJyAmJiBzZWxlY3RDb2x1bW4gIT09IG51bGwgPyAnVGFibGVDb2x1bW4nIDogc2VsZWN0ZWRFbGVtZW50Py50eXBlXS5maWVsZFByb3BzXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwidGV4dC1zbVwiPnt7ICBwcm9wLmxhYmVsUGF0aCB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6IHByb3AubGFiZWwgIH19PC9sYWJlbD5cblxuICAgICAgICAgIDwhLS0gU0tTMjFNQVIyNSBUb2dnbGUgR3JvdXAgLS0+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cInByb3AudHlwZSA9PT0gJ3RvZ2dsZUdyb3VwJ1wiIGNsYXNzPVwidG9nZ2xlLWdyb3VwXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidG9nZ2xlLWl0ZW1cIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwidG9nZ2xlLWxhYmVsXCI+XG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIC8+XG4gICAgICAgICAgICAgICAgRGlzYWJsZWRcbiAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPCEtLSAgLSBoYW5kbGVkIG9wdGlvbnMgd2l0aCBVVUlEIC0tPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICpuZ0lmPVwicHJvcC50eXBlID09PSAnZHJvcGRvd24nIHx8IHByb3AudHlwZSA9PT0gJ2NoZWNrYm94JyB8fCBwcm9wLnR5cGUgPT09ICdyYWRpbycgJiYgcHJvcC5rZXkgPT09ICdvcHRpb25zJ1wiXG4gICAgICAgICAgICBjbGFzcz1cIm9wdGlvbnMtY29udGFpbmVyXCI+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJvcHRpb24tbGlzdFwiIChkcmFnb3Zlcik9XCJvbkRyYWdPdmVyKCRldmVudClcIiAoZHJvcCk9XCJvbkRyb3AoJGV2ZW50LCBwcm9wLmtleSlcIj5cbiAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIHNlbGVjdGVkRWxlbWVudFtwcm9wLmtleV1cIiBjbGFzcz1cIm9wdGlvbi1pdGVtc1wiIFthdHRyLmRhdGEtaWRdPVwib3B0aW9uLmlkXCJcbiAgICAgICAgICAgICAgICBkcmFnZ2FibGU9XCJ0cnVlXCIgKGRyYWdzdGFydCk9XCJvbkRyYWdTdGFydCgkZXZlbnQsIG9wdGlvbi5pZClcIj5cblxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwib3B0aW9uLnZhbHVlXCIgcGxhY2Vob2xkZXI9XCJPcHRpb25cIiBjbGFzcz1cIm9wdGlvbnNcIiAvPlxuICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiLi4vYXNzZXRzL2ljb25zL1RyYXNoLnN2Z1wiIChjbGljayk9XCJyZW1vdmVPcHRpb24oc2VsZWN0ZWRFbGVtZW50W3Byb3Aua2V5XSwgb3B0aW9uLmlkKVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZHJhZy1oYW5kbGVcIj7imLA8L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cImFkZE9wdGlvbihzZWxlY3RlZEVsZW1lbnRbcHJvcC5rZXldKVwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWRkLXZhcmllbnRcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbGdcIj4rPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuPkFkZDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxpbnB1dCAqbmdJZj1cInByb3AudHlwZSA9PT0gJ3RleHQnXCIgdHlwZT1cInRleHRcIiBbcGxhY2Vob2xkZXJdPVwicHJvcC5wbGFjZWhvbGRlclwiXG4gICAgICAgICAgICBbdmFsdWVdPVwiaGVhZGVyU2VsZWN0ID8gcGRmLnRpdGxlIDogKHNlbGVjdGVkRWxlbWVudD8udHlwZSA9PT0gJ1RhYmxlJyA/IChwcm9wLnRhcmdldEFycmF5ID8gZ2V0VmFsdWVCeUFycmF5UGF0aChwcm9wLnRhcmdldEFycmF5LCBwcm9wLnRhcmdldEFycmF5S2V5LCBzZWxlY3RDb2x1bW4sIHByb3Aua2V5ICkgOiBnZXRWYWx1ZUJ5UGF0aChwcm9wLmtleSkgKSA6ICBnZXRWYWx1ZUJ5UGF0aChwcm9wLmtleSkpXCJcbiAgICAgICAgICAgIChpbnB1dCk9XCJoZWFkZXJTZWxlY3QgPyB1cGRhdGVUaXRsZSgkZXZlbnQudGFyZ2V0LnZhbHVlKSA6IChzZWxlY3RlZEVsZW1lbnQ/LnR5cGUgPT09ICdUYWJsZScgPyAocHJvcC50YXJnZXRBcnJheSA/IHVwZGF0ZVZhbHVlQnlBcnJheVBhdGgocHJvcC50YXJnZXRBcnJheSwgcHJvcC50YXJnZXRBcnJheUtleSwgc2VsZWN0Q29sdW1uLCBwcm9wLmtleSwgJGV2ZW50KSA6IHNldFZhbHVlQnlQYXRoKHByb3Aua2V5LCAkZXZlbnQudGFyZ2V0LnZhbHVlKSApIDogc2V0VmFsdWVCeVBhdGgocHJvcC5rZXksICRldmVudC50YXJnZXQudmFsdWUpKVwiXG4gICAgICAgICAgICBbY2xhc3MucmVhZC1vbmx5XT1cInNlbGVjdGVkRWxlbWVudC5yZWFkT25seVwiIFtyZWFkb25seV09XCJzZWxlY3RlZEVsZW1lbnQucmVhZE9ubHlcIiAvPlxuXG4gICAgICAgICAgPCEtLSBTdWIgUXVlc3Rpb25zIFRvZ2dsZSAtLT5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwicHJvcC50eXBlID09PSAnc3ViUXVlc3Rpb24nXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3R5bGUtdG9nZ2xlLWhlYWRlclwiIChjbGljayk9XCJ0b2dnbGVTdWJRdWVzdGlvbihwcm9wKVwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZC1lbGVtZW50c1wiPlN1YiBUZXh0PC9kaXY+XG4gICAgICAgICAgICAgIDxpbWcgW3NyY109XCJwcm9wLmlzRXhwYW5kZWQgPyAnLi4vYXNzZXRzL2ljb25zL2Fycm93LWRvd24uc3ZnJyA6ICcuLi9hc3NldHMvaWNvbnMvYXJyb3ctcmlnaHQuc3ZnJ1wiXG4gICAgICAgICAgICAgICAgYWx0PVwiVG9nZ2xlIEFycm93XCIgY2xhc3M9XCJhcnJvdy1pY29uXCI+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSBSZW5kZXIgc3VicXVlc3Rpb25zIHdoZW4gYXJyb3cgaXMgZG93biAtLT5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJwcm9wLmlzRXhwYW5kZWRcIiBzdHlsZT1cImJvcmRlcjogMXB4IHNvbGlkICNkZGQ7IHBhZGRpbmc6IDhweDsgYm9yZGVyLXJhZGl1czogNHB4O1wiPlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBzdWJQcm9wIG9mIHByb3Auc3ViUXVlc3Rpb25cIiBjbGFzcz1cInN1Yi1xdWVzdGlvbi1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7IHN1YlByb3AubGFiZWxQYXRoIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogc3ViUHJvcC5sYWJlbCB9fTwvbGFiZWw+XG5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCAqbmdJZj1cInN1YlByb3AudHlwZSA9PT0gJ3RleHQnXCIgdHlwZT1cInRleHRcIiBbcGxhY2Vob2xkZXJdPVwic3ViUHJvcC5wbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJnZXRWYWx1ZUJ5UGF0aChzdWJQcm9wLmtleSlcIiAoaW5wdXQpPVwic2V0VmFsdWVCeVBhdGgoc3ViUHJvcC5rZXksICRldmVudC50YXJnZXQudmFsdWUpXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICA8IS0tICBSZW5kZXIgaW5wdXQgZmllbGQgb25seSBpZiBzdWJQcm9wLnR5cGUgaXMgJ2FycmF5JyAtLT5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCAqbmdJZj1cInN1YlByb3AudHlwZSA9PT0gJ2FycmF5J1wiIHR5cGU9XCJ0ZXh0XCIgW3BsYWNlaG9sZGVyXT1cInN1YlByb3AucGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiZ2V0VmFsdWVCeVBhdGgoc3ViUHJvcC5rZXkpXCIgKGlucHV0KT1cInNldFZhbHVlQnlQYXRoKHN1YlByb3Aua2V5LCAkZXZlbnQudGFyZ2V0LnZhbHVlKVwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gPGlucHV0IHR5cGU9XCJ0ZXh0XCIgW25nTW9kZWxdPVwiZmllbGRBc1N0cmluZ1wiIChuZ01vZGVsQ2hhbmdlKT1cInVwZGF0ZUZpZWxkKCRldmVudClcIiAvPiAtLT5cblxuICAgICAgICAgICAgICAgICAgPGlucHV0ICpuZ0lmPVwic3ViUHJvcC50eXBlID09PSAnYm9vbGVhbidcIiB0eXBlPVwiY2hlY2tib3hcIiBbY2hlY2tlZF09XCJnZXRWYWx1ZUJ5UGF0aChzdWJQcm9wLmtleSlcIlxuICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInNldFZhbHVlQnlQYXRoKHN1YlByb3Aua2V5LCAkZXZlbnQudGFyZ2V0LmNoZWNrZWQpXCIgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJwcm9wLnR5cGUgPT09ICdjaGVja2JveCdcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidG9nZ2xlLWxhYmVsXCIgc3R5bGU9XCJwYWRkaW5nLXJpZ2h0OiAxMHB4O1wiPnt7ICBwcm9wLmxhYmVsUGF0aCB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6IHByb3AubGFiZWwgIH19PC9zcGFuPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgIFtjaGVja2VkXT1cInNlbGVjdGVkRWxlbWVudC50eXBlID09PSAnVGFibGUnID8gKHByb3AudGFyZ2V0QXJyYXkgPyBnZXRWYWx1ZUJ5QXJyYXlQYXRoKHByb3AudGFyZ2V0QXJyYXksIHByb3AudGFyZ2V0QXJyYXlLZXksIHNlbGVjdENvbHVtbiwgcHJvcC5rZXkgKSA6IGdldFZhbHVlQnlQYXRoKHByb3Aua2V5KSApOiAgZ2V0VmFsdWVCeVBhdGgocHJvcC5rZXkpIFwiXG4gICAgICAgICAgICAgIChjaGFuZ2UpPVwiIHNlbGVjdGVkRWxlbWVudC50eXBlID09PSAnVGFibGUnID8gKHByb3AudGFyZ2V0QXJyYXkgPyB1cGRhdGVWYWx1ZUJ5QXJyYXlQYXRoKHByb3AudGFyZ2V0QXJyYXksIHByb3AudGFyZ2V0QXJyYXlLZXksIHNlbGVjdENvbHVtbiwgcHJvcC5rZXksICRldmVudCkgOiBvblRvZ2dsZUNoYW5nZShwcm9wLmtleSwgJGV2ZW50KSApIDogb25Ub2dnbGVDaGFuZ2UocHJvcC5rZXksICRldmVudClcIiAvPlxuXG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBTS1MyMU1BUjI1IE1vdmUgU3R5bGUgT3V0c2lkZSB0aGUgTG9vcCAtLT5cbiAgICAgIDwhLS0gU3R5bGUgVG9nZ2xlIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInN0eWxlLXRvZ2dsZS1oZWFkZXJcIiAoY2xpY2spPVwidG9nZ2xlU3R5bGVTZWN0aW9uKClcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImhlYWQtZWxlbWVudHNcIj5TdHlsZTwvZGl2PlxuICAgICAgICA8aW1nIFtzcmNdPVwiaXNTdHlsZUV4cGFuZGVkID8gJy4uL2Fzc2V0cy9pY29ucy9hcnJvdy1kb3duLnN2ZycgOiAnLi4vYXNzZXRzL2ljb25zL2Fycm93LXJpZ2h0LnN2ZydcIlxuICAgICAgICAgIGFsdD1cIlRvZ2dsZSBBcnJvd1wiIGNsYXNzPVwiYXJyb3ctaWNvblwiPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgKm5nSWY9XCJpc1N0eWxlRXhwYW5kZWRcIiBzdHlsZT1cImJvcmRlcjogMXB4IHNvbGlkICNkZGQ7IHBhZGRpbmc6IDhweDsgYm9yZGVyLXJhZGl1czogNHB4O1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGtleSBvZiBnZXRTdHlsZUtleXMoKVwiPlxuICAgICAgICAgICAgPGxhYmVsPnt7IGtleSB9fTwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cInNlbGVjdGVkRWxlbWVudC5zdHlsZVtrZXldXCJcbiAgICAgICAgICAgICAgKGlucHV0KT1cInNldFZhbHVlQnlQYXRoKCdzdHlsZS4nICsga2V5LCAkZXZlbnQudGFyZ2V0LnZhbHVlKVwiIHBsYWNlaG9sZGVyPVwiRW50ZXIge3sga2V5IH19XCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cInRhYi1jb250ZW50XCIgKm5nSWY9XCJhY3RpdmVUYWIgPT09ICdhcHBlYXJhbmNlJ1wiPlxuICAgIDxkaXYgKm5nSWY9XCJlbGVtZW50UHJvcGVydGllc1tzZWxlY3RlZEVsZW1lbnQ/LnR5cGUgPT09ICdUYWJsZScgJiYgc2VsZWN0Q29sdW1uICE9PSAnJyAmJiBzZWxlY3RDb2x1bW4gIT09IG51bGwgPyAnVGFibGVDb2x1bW4nIDogc2VsZWN0ZWRFbGVtZW50Py50eXBlXVwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcHJvcCBvZiBlbGVtZW50UHJvcGVydGllc1tzZWxlY3RlZEVsZW1lbnQ/LnR5cGUgPT09ICdUYWJsZScgJiYgc2VsZWN0Q29sdW1uICE9PSAnJyAmJiBzZWxlY3RDb2x1bW4gIT09IG51bGwgPyAnVGFibGVDb2x1bW4nIDogc2VsZWN0ZWRFbGVtZW50Py50eXBlXS5hcHBlYXJhbmNlXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwidGV4dC1zbVwiPnt7ICBwcm9wLmxhYmVsUGF0aCB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6IHByb3AubGFiZWwgIH19PC9sYWJlbD5cbiAgICAgICAgICA8IS0tIEZvbnQgU2VsZWN0aW9uIC0tPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJwcm9wLmtleSA9PT0gJ2ZvbnQnXCI+XG4gICAgICAgICAgICA8c2VsZWN0ICpuZ0lmPVwicHJvcC50eXBlID09PSAnc2VsZWN0J1wiIGNsYXNzPVwic2VsZWN0LWNvbnRhaW5lclwiIFsobmdNb2RlbCldPVwic2VsZWN0ZWRFbGVtZW50LmZvbnRcIlxuICAgICAgICAgICAgICAoY2hhbmdlKT1cInNldFZhbHVlQnlQYXRoKCdmb250JywgJGV2ZW50LnRhcmdldC52YWx1ZSlcIj5cbiAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIHByb3Aub3B0aW9uc1wiIFt2YWx1ZV09XCJvcHRpb25cIj5cbiAgICAgICAgICAgICAgICB7eyBvcHRpb24gfX1cbiAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8IS0tIElucHV0IEJveCAtLT5cbiAgICAgICAgICA8aW5wdXQgKm5nSWY9XCJwcm9wLnR5cGUgPT09ICd0ZXh0J1wiIHR5cGU9XCJ0ZXh0XCIgW3BsYWNlaG9sZGVyXT1cInByb3AucGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgW3ZhbHVlXT1cInNlbGVjdGVkRWxlbWVudFtwcm9wLmtleV1cIiAoaW5wdXQpPVwic2V0VmFsdWVCeVBhdGgocHJvcC5rZXksICRldmVudC50YXJnZXQudmFsdWUpXCIgLz5cblxuICAgICAgICAgIDwhLS0gRm9udCBTaXplIC0tPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJwcm9wLmtleSA9PT0gJ2ZvbnRTaXplJyAmJiBwcm9wLnR5cGUgPT09ICdudW1iZXInXCI+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIG1pbj1cIjFcIiBtYXg9XCIxMDBcIiBzdGVwPVwiMVwiXG4gICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInNlbGVjdGVkRWxlbWVudC5mb250U2l6ZVwiXG4gICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInNldFZhbHVlQnlQYXRoKCdmb250U2l6ZScsIHNlbGVjdGVkRWxlbWVudC5mb250U2l6ZSlcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwhLS0gRm9udCBXZWlnaHQgU2VsZWN0aW9uIC0tPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJwcm9wLmtleSA9PT0gJ2ZvbnRXZWlnaHQnXCI+XG4gICAgICAgICAgICA8c2VsZWN0ICpuZ0lmPVwicHJvcC50eXBlID09PSAnc2VsZWN0J1wiIFsobmdNb2RlbCldPVwic2VsZWN0ZWRFbGVtZW50W3Byb3Aua2V5XVwiXG4gICAgICAgICAgICAgIChjaGFuZ2UpPVwic2V0VmFsdWVCeVBhdGgocHJvcC5rZXksICRldmVudC50YXJnZXQudmFsdWUpXCI+XG4gICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBwcm9wLm9wdGlvbnNcIiBbdmFsdWVdPVwib3B0aW9uLnZhbHVlXCI+XG4gICAgICAgICAgICAgICAge3sgb3B0aW9uLmxhYmVsUGF0aCB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6IG9wdGlvbi5sYWJlbCAgfX1cbiAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPCEtLSBEcm9wZG93biBCb3ggLS0+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicHJvcC50eXBlID09PSAnZHJvcGRvd24nXCIgY2xhc3M9XCJpbnB1dC1ib3gtZmllbGRcIj5cbiAgICAgICAgICAgICAgPHNlbGVjdCBbKG5nTW9kZWwpXT1cInNlbGVjdGVkRWxlbWVudFtwcm9wLmtleV1cIiAoY2hhbmdlKT1cInNldFZhbHVlQnlQYXRoKHByb3Aua2V5LCAkZXZlbnQudGFyZ2V0LnZhbHVlKVwiPlxuICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBwcm9wLm9wdGlvbnNcIiBbdmFsdWVdPVwib3B0aW9uXCI+XG4gICAgICAgICAgICAgICAgICB7eyBvcHRpb24gfX1cbiAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSBDb2xvciBQaWNrZXIgLS0+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicHJvcC50eXBlID09PSAnY29sb3InXCIgY2xhc3M9XCJjb2xvci1zZWxlY3RvclwiPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNvbG9yXCIgWyhuZ01vZGVsKV09XCJzZWxlY3RlZEVsZW1lbnQuZm9udENvbG9yXCJcbiAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInNldFZhbHVlQnlQYXRoKCdmb250Q29sb3InLCAkZXZlbnQudGFyZ2V0LnZhbHVlKVwiPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gSEVYIElucHV0IEJveCAtLT5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJwcm9wLnR5cGUgPT09ICdjb2xvcidcIiBjbGFzcz1cImhleC1pbnB1dC1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgPHNwYW4+SEVYIENvZGU8L3NwYW4+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwic2VsZWN0ZWRFbGVtZW50W3Byb3Aua2V5XVwiXG4gICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJzZXRWYWx1ZUJ5UGF0aChwcm9wLmtleSwgJGV2ZW50LnRhcmdldC52YWx1ZSlcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIEZvbnQgU3R5bGUgLS0+XG48ZGl2ICpuZ0lmPVwicHJvcC5rZXkgPT09ICdmb250U3R5bGUnXCI+XG4gIDxzZWxlY3QgWyhuZ01vZGVsKV09XCJzZWxlY3RlZEVsZW1lbnQuZm9udFN0eWxlXCJcbiAgICAgICAgICAoY2hhbmdlKT1cInNldFZhbHVlQnlQYXRoKCdmb250U3R5bGUnLCAkZXZlbnQudGFyZ2V0LnZhbHVlKVwiPlxuICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBwcm9wLm9wdGlvbnNcIiBbdmFsdWVdPVwib3B0aW9uLnZhbHVlXCI+XG4gICAgICB7eyBvcHRpb24ubGFiZWxQYXRoIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogb3B0aW9uLmxhYmVsICB9fVxuICAgIDwvb3B0aW9uPlxuICA8L3NlbGVjdD5cbjwvZGl2PlxuXG48IS0tIG1hcmdpbjogWzAsIDEwLCAwLCAwXSAvLyBbIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSBdIC0tPlxuPGRpdiAqbmdJZj1cInByb3Aua2V5ID09PSAnbWFyZ2luJyYmIHNlbGVjdGVkRWxlbWVudD8ubWFyZ2luXCI+XG4gIDxkaXYgY2xhc3M9XCJtYXJnaW4taW5wdXRzXCI+XG4gICAgPGRpdj5cbiAgICAgIDxsYWJlbD5SaWdodDwvbGFiZWw+XG4gICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIFsobmdNb2RlbCldPVwic2VsZWN0ZWRFbGVtZW50Lm1hcmdpblsxXVwiXG4gICAgICAgICAgICAgKGNoYW5nZSk9XCJzZXRWYWx1ZUJ5UGF0aCgnbWFyZ2luJywgc2VsZWN0ZWRFbGVtZW50Lm1hcmdpbilcIiAvPlxuICAgIDwvZGl2PlxuICAgIDxkaXY+XG4gICAgICA8bGFiZWw+Qm90dG9tPC9sYWJlbD5cbiAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgWyhuZ01vZGVsKV09XCJzZWxlY3RlZEVsZW1lbnQubWFyZ2luWzJdXCJcbiAgICAgICAgICAgICAoY2hhbmdlKT1cInNldFZhbHVlQnlQYXRoKCdtYXJnaW4nLCBzZWxlY3RlZEVsZW1lbnQubWFyZ2luKVwiIC8+XG4gICAgPC9kaXY+XG4gICAgPGRpdj5cbiAgICAgIDxsYWJlbD5MZWZ0PC9sYWJlbD5cbiAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgWyhuZ01vZGVsKV09XCJzZWxlY3RlZEVsZW1lbnQubWFyZ2luWzNdXCJcbiAgICAgICAgICAgICAoY2hhbmdlKT1cInNldFZhbHVlQnlQYXRoKCdtYXJnaW4nLCBzZWxlY3RlZEVsZW1lbnQubWFyZ2luKVwiIC8+XG4gICAgPC9kaXY+XG4gICAgPGRpdj5cbiAgICAgIDxsYWJlbD5Ub3A8L2xhYmVsPlxuICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBbKG5nTW9kZWwpXT1cInNlbGVjdGVkRWxlbWVudC5tYXJnaW5bMF1cIlxuICAgICAgICAgICAgIChjaGFuZ2UpPVwic2V0VmFsdWVCeVBhdGgoJ21hcmdpbicsIHNlbGVjdGVkRWxlbWVudC5tYXJnaW4pXCIgLz5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cblxuICAgICAgICAgIDwhLS0gVGV4dEFsaWduIC0tPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJwcm9wLmtleSA9PT0gJ2FsaWduSXRlbXMnXCI+XG4gICAgICAgICAgICA8c2VsZWN0IFsobmdNb2RlbCldPVwic2VsZWN0ZWRFbGVtZW50LmFsaWduSXRlbXNcIlxuICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInNldFZhbHVlQnlQYXRoKCdhbGlnbkl0ZW1zJywgJGV2ZW50LnRhcmdldC52YWx1ZSlcIj5cbiAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIHByb3Aub3B0aW9uc1wiIFt2YWx1ZV09XCJvcHRpb24udmFsdWVcIj5cbiAgICAgICAgICAgICAgICB7eyBvcHRpb24ubGFiZWxQYXRoIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogb3B0aW9uLmxhYmVsICB9fVxuICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgIDwvZGl2PiAgICAgICAgICBcblxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuPCEtLSBEZWZhdWx0IFNhdmUgQnV0dG9uIC0tPlxuPGRpdiBjbGFzcz1cImJ1dHRvbi1jb250YWluZXJcIiAqbmdJZj1cIiF0ZW1wbGF0ZVNlbGVjdGVkXCI+XG4gIDxidXR0b24gY2xhc3M9XCJjYW5jZWwtYnRuXCIgKGNsaWNrKT1cIm9uQ2FuY2VsKClcIj5DYW5jZWw8L2J1dHRvbj5cbiAgPGJ1dHRvbiBjbGFzcz1cInNhdmUtYnRuXCIgKGNsaWNrKT1cImhhbmRsZUJ1dHRvbkNsaWNrKClcIj5TYXZlPC9idXR0b24+XG48L2Rpdj5cbjwvZGl2PlxuIl19
|