@smartbit4all/ng-client 4.2.70 → 4.2.72

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (128) hide show
  1. package/esm2022/lib/smart-client/smart-component-api-client.mjs +15 -1
  2. package/esm2022/lib/smart-client/smart.component.mjs +9 -2
  3. package/esm2022/lib/smart-component-layout/api/model/componentWidgetType.mjs +2 -1
  4. package/esm2022/lib/smart-component-layout/api/model/layoutDefinitionDescriptor.mjs +2 -0
  5. package/esm2022/lib/smart-component-layout/api/model/models.mjs +2 -1
  6. package/esm2022/lib/smart-component-layout/api/model/smartComponentLayoutDefinition.mjs +1 -1
  7. package/esm2022/lib/smart-component-layout/smart-component-layout-utility.mjs +18 -1
  8. package/esm2022/lib/smart-component-layout/smart-component-layout.component.mjs +33 -3
  9. package/esm2022/lib/smart-component-layout/smart-component-layout.module.mjs +7 -3
  10. package/esm2022/lib/smart-diagram/api/api/api.mjs +4 -0
  11. package/esm2022/lib/smart-diagram/api/api/diagramService.service.mjs +141 -0
  12. package/esm2022/lib/smart-diagram/api/api.module.mjs +40 -0
  13. package/esm2022/lib/smart-diagram/api/configuration.mjs +91 -0
  14. package/esm2022/lib/smart-diagram/api/encoder.mjs +19 -0
  15. package/esm2022/lib/smart-diagram/api/index.mjs +7 -0
  16. package/esm2022/lib/smart-diagram/api/model/diagramColor.mjs +13 -0
  17. package/esm2022/lib/smart-diagram/api/model/diagramDataContainer.mjs +2 -0
  18. package/esm2022/lib/smart-diagram/api/model/diagramDataItem.mjs +13 -0
  19. package/esm2022/lib/smart-diagram/api/model/diagramDataSet.mjs +2 -0
  20. package/esm2022/lib/smart-diagram/api/model/diagramDescriptor.mjs +2 -0
  21. package/esm2022/lib/smart-diagram/api/model/diagramModel.mjs +2 -0
  22. package/esm2022/lib/smart-diagram/api/model/diagramShape.mjs +2 -0
  23. package/esm2022/lib/smart-diagram/api/model/drawTime.mjs +18 -0
  24. package/esm2022/lib/smart-diagram/api/model/labelText.mjs +2 -0
  25. package/esm2022/lib/smart-diagram/api/model/models.mjs +10 -0
  26. package/esm2022/lib/smart-diagram/api/param.mjs +2 -0
  27. package/esm2022/lib/smart-diagram/api/variables.mjs +9 -0
  28. package/esm2022/lib/smart-diagram/component/default-smart-diagram-options.provider.mjs +289 -0
  29. package/esm2022/lib/smart-diagram/component/smart-diagram.component.mjs +341 -0
  30. package/esm2022/lib/smart-diagram/component/smart-diagram.module.mjs +39 -0
  31. package/esm2022/lib/smart-diagram/component/smart-diagram.util.mjs +10 -0
  32. package/esm2022/lib/smart-diagram/projects.mjs +5 -0
  33. package/esm2022/lib/smart-form/services/smartform.service.mjs +4 -1
  34. package/esm2022/lib/smart-form/widgets/smartformwidget/smartformwidget.component.mjs +3 -3
  35. package/esm2022/lib/smart-grid/api/grid-api/model/gridExportDescriptor.mjs +1 -12
  36. package/esm2022/lib/smart-grid/api/grid-api/model/gridModel.mjs +1 -1
  37. package/esm2022/lib/smart-grid/smart-grid.component.mjs +4 -3
  38. package/esm2022/lib/smart-table/tables/material-table/material-table.component.mjs +3 -3
  39. package/esm2022/lib/smart-table/tables/table.mjs +1 -1
  40. package/esm2022/projects.mjs +2 -1
  41. package/fesm2022/smartbit4all-ng-client.mjs +1233 -179
  42. package/fesm2022/smartbit4all-ng-client.mjs.map +1 -1
  43. package/lib/smart-client/smart-component-api-client.d.ts +4 -1
  44. package/lib/smart-client/smart.component.d.ts +3 -0
  45. package/lib/smart-component-layout/api/model/componentWidgetType.d.ts +2 -1
  46. package/lib/smart-component-layout/api/model/layoutDefinitionDescriptor.d.ts +19 -0
  47. package/lib/smart-component-layout/api/model/models.d.ts +1 -0
  48. package/lib/smart-component-layout/api/model/smartComponentLayoutDefinition.d.ts +2 -0
  49. package/lib/smart-component-layout/smart-component-layout-utility.d.ts +2 -0
  50. package/lib/smart-component-layout/smart-component-layout.component.d.ts +7 -0
  51. package/lib/smart-component-layout/smart-component-layout.module.d.ts +2 -1
  52. package/lib/smart-diagram/api/api/api.d.ts +3 -0
  53. package/lib/smart-diagram/api/api/diagramService.service.d.ts +36 -0
  54. package/lib/smart-diagram/api/encoder.d.ts +11 -0
  55. package/{src/lib/smart-chart/smart-chart/smart-chart2 → lib/smart-diagram}/api/model/diagramColor.d.ts +2 -2
  56. package/{src/lib/smart-chart/smart-chart/smart-chart2 → lib/smart-diagram}/api/model/diagramDataContainer.d.ts +2 -3
  57. package/{src/lib/smart-chart/smart-chart/smart-chart2 → lib/smart-diagram}/api/model/diagramDataItem.d.ts +3 -3
  58. package/{src/lib/smart-chart/smart-chart/smart-chart2 → lib/smart-diagram}/api/model/diagramDataSet.d.ts +4 -4
  59. package/{src/lib/smart-chart/smart-chart/smart-chart2 → lib/smart-diagram}/api/model/diagramDescriptor.d.ts +10 -9
  60. package/{src/lib/smart-chart/smart-chart/smart-chart2/api/model/diagramUiModel.d.ts → lib/smart-diagram/api/model/diagramModel.d.ts} +5 -4
  61. package/{src/lib/smart-chart/smart-chart/smart-chart2 → lib/smart-diagram}/api/model/diagramShape.d.ts +2 -2
  62. package/{src/lib/smart-chart/smart-chart/smart-chart2 → lib/smart-diagram}/api/model/drawTime.d.ts +2 -2
  63. package/{src/lib/smart-chart/smart-chart/smart-chart2 → lib/smart-diagram}/api/model/labelText.d.ts +2 -2
  64. package/{src/lib/smart-chart/smart-chart/smart-chart2 → lib/smart-diagram}/api/model/models.d.ts +1 -2
  65. package/lib/smart-diagram/component/default-smart-diagram-options.provider.d.ts +32 -0
  66. package/lib/smart-diagram/component/smart-diagram.component.d.ts +40 -0
  67. package/lib/smart-diagram/component/smart-diagram.module.d.ts +11 -0
  68. package/lib/smart-diagram/component/smart-diagram.util.d.ts +1 -0
  69. package/lib/smart-diagram/projects.d.ts +4 -0
  70. package/lib/smart-grid/api/grid-api/model/gridExportDescriptor.d.ts +2 -2
  71. package/lib/smart-grid/api/grid-api/model/gridModel.d.ts +1 -0
  72. package/lib/smart-table/tables/table.d.ts +1 -1
  73. package/package.json +1 -7
  74. package/projects.d.ts +1 -0
  75. package/smartbit4all-ng-client-4.2.72.tgz +0 -0
  76. package/esm2022/src/lib/smart-chart/smart-chart/api/model/chartData.mjs +0 -2
  77. package/esm2022/src/lib/smart-chart/smart-chart/api/model/chartDescriptor.mjs +0 -2
  78. package/esm2022/src/lib/smart-chart/smart-chart/api/model/chartOrientation.mjs +0 -16
  79. package/esm2022/src/lib/smart-chart/smart-chart/api/model/chartType.mjs +0 -21
  80. package/esm2022/src/lib/smart-chart/smart-chart/api/model/chartValue.mjs +0 -13
  81. package/esm2022/src/lib/smart-chart/smart-chart/api/model/models.mjs +0 -7
  82. package/esm2022/src/lib/smart-chart/smart-chart/api/model/pieChartLegendPosition.mjs +0 -16
  83. package/esm2022/src/lib/smart-chart/smart-chart/default-chart-options.provider.mjs +0 -233
  84. package/esm2022/src/lib/smart-chart/smart-chart/smart-chart.component.mjs +0 -285
  85. package/esm2022/src/lib/smart-chart/smart-chart/smart-chart.module.mjs +0 -39
  86. package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/api/api.mjs +0 -2
  87. package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/api.module.mjs +0 -40
  88. package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/configuration.mjs +0 -91
  89. package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/index.mjs +0 -7
  90. package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/model/diagramColor.mjs +0 -13
  91. package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/model/diagramDataContainer.mjs +0 -2
  92. package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/model/diagramDataItem.mjs +0 -13
  93. package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/model/diagramDataSet.mjs +0 -2
  94. package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/model/diagramDataSetConstructionInstruction.mjs +0 -13
  95. package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/model/diagramDescriptor.mjs +0 -2
  96. package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/model/diagramShape.mjs +0 -2
  97. package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/model/diagramUiModel.mjs +0 -2
  98. package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/model/drawTime.mjs +0 -18
  99. package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/model/labelText.mjs +0 -2
  100. package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/model/models.mjs +0 -11
  101. package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/param.mjs +0 -2
  102. package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/variables.mjs +0 -9
  103. package/esm2022/src/lib/smart-chart/smart-chart-projects.mjs +0 -9
  104. package/esm2022/src/lib/smart-chart/smartbit4all-ng-client-src-lib-smart-chart.mjs +0 -5
  105. package/esm2022/src/lib/smart-chart/view-context/utility/componentLibrary.mjs +0 -9
  106. package/fesm2022/smartbit4all-ng-client-src-lib-smart-chart.mjs +0 -686
  107. package/fesm2022/smartbit4all-ng-client-src-lib-smart-chart.mjs.map +0 -1
  108. package/smartbit4all-ng-client-4.2.70.tgz +0 -0
  109. package/src/lib/smart-chart/index.d.ts +0 -5
  110. package/src/lib/smart-chart/smart-chart/api/model/chartData.d.ts +0 -16
  111. package/src/lib/smart-chart/smart-chart/api/model/chartDescriptor.d.ts +0 -37
  112. package/src/lib/smart-chart/smart-chart/api/model/chartOrientation.d.ts +0 -16
  113. package/src/lib/smart-chart/smart-chart/api/model/chartType.d.ts +0 -21
  114. package/src/lib/smart-chart/smart-chart/api/model/chartValue.d.ts +0 -16
  115. package/src/lib/smart-chart/smart-chart/api/model/models.d.ts +0 -6
  116. package/src/lib/smart-chart/smart-chart/api/model/pieChartLegendPosition.d.ts +0 -16
  117. package/src/lib/smart-chart/smart-chart/default-chart-options.provider.d.ts +0 -31
  118. package/src/lib/smart-chart/smart-chart/smart-chart.component.d.ts +0 -33
  119. package/src/lib/smart-chart/smart-chart/smart-chart.module.d.ts +0 -11
  120. package/src/lib/smart-chart/smart-chart/smart-chart2/api/api/api.d.ts +0 -1
  121. package/src/lib/smart-chart/smart-chart/smart-chart2/api/model/diagramDataSetConstructionInstruction.d.ts +0 -21
  122. package/src/lib/smart-chart/smart-chart-projects.d.ts +0 -5
  123. package/src/lib/smart-chart/view-context/utility/componentLibrary.d.ts +0 -6
  124. /package/{src/lib/smart-chart/smart-chart/smart-chart2 → lib/smart-diagram}/api/api.module.d.ts +0 -0
  125. /package/{src/lib/smart-chart/smart-chart/smart-chart2 → lib/smart-diagram}/api/configuration.d.ts +0 -0
  126. /package/{src/lib/smart-chart/smart-chart/smart-chart2 → lib/smart-diagram}/api/index.d.ts +0 -0
  127. /package/{src/lib/smart-chart/smart-chart/smart-chart2 → lib/smart-diagram}/api/param.d.ts +0 -0
  128. /package/{src/lib/smart-chart/smart-chart/smart-chart2 → lib/smart-diagram}/api/variables.d.ts +0 -0
@@ -0,0 +1,289 @@
1
+ import { Injectable, InjectionToken, Optional, Inject } from '@angular/core';
2
+ import { deepMerge } from './smart-diagram.util';
3
+ import * as i0 from "@angular/core";
4
+ export const CUSTOM_DIAGRAM_OPTIONS = new InjectionToken('CUSTOM_DIAGRAM_OPTIONS');
5
+ export function transformDataToBasicDataSets(chartData) {
6
+ return {
7
+ labels: chartData.labels,
8
+ datasets: chartData.items.map((dataset) => {
9
+ const color = dataset.color || generateRandomColor();
10
+ return {
11
+ data: dataset.items.map((item) => item.xValue),
12
+ label: dataset.label,
13
+ backgroundColor: color,
14
+ borderColor: color,
15
+ };
16
+ }),
17
+ };
18
+ }
19
+ export function transformDataToBarLikeDataSet(chartData) {
20
+ return {
21
+ labels: chartData.labels,
22
+ datasets: chartData.items.map((dataset) => {
23
+ return {
24
+ data: dataset.items.map((item) => item.xValue),
25
+ label: dataset.label,
26
+ backgroundColor: dataset.items.map((item) => item.itemColor || generateRandomColor()),
27
+ borderColor: dataset.items.map((item) => item.itemColor || generateRandomColor()),
28
+ };
29
+ }),
30
+ };
31
+ }
32
+ export function transformDataToScatter(chartData) {
33
+ return {
34
+ datasets: chartData.items.map((dataset) => {
35
+ const color = dataset.color || generateRandomColor();
36
+ return {
37
+ label: dataset.label,
38
+ data: dataset.items.map((item) => ({
39
+ x: item.xValue,
40
+ y: item.yValue,
41
+ })),
42
+ backgroundColor: color,
43
+ borderColor: color,
44
+ };
45
+ }),
46
+ };
47
+ }
48
+ export function transformDataToBubble(chartData) {
49
+ return {
50
+ datasets: chartData.items.map((dataset) => {
51
+ const color = dataset.color || generateRandomColor();
52
+ return {
53
+ label: dataset.label,
54
+ data: dataset.items.map((item) => ({
55
+ x: item.xValue,
56
+ y: item.yValue,
57
+ r: item.rValue ?? 5,
58
+ })),
59
+ backgroundColor: color,
60
+ borderColor: color,
61
+ };
62
+ }),
63
+ };
64
+ }
65
+ export function createBasicOptions() {
66
+ return {
67
+ scales: {
68
+ y: {
69
+ beginAtZero: true,
70
+ grace: '5%',
71
+ },
72
+ },
73
+ aspectRatio: 1.78,
74
+ responsive: true,
75
+ maintainAspectRatio: true,
76
+ };
77
+ }
78
+ export const barChart = {
79
+ chartType: 'bar',
80
+ chartJsType: 'bar',
81
+ createOptions: createBasicOptions,
82
+ transformData: transformDataToBarLikeDataSet,
83
+ };
84
+ export const horizontalBarChart = {
85
+ chartType: 'horizontalBar',
86
+ chartJsType: 'bar',
87
+ createOptions: () => deepMerge(createBasicOptions(), {
88
+ indexAxis: 'y',
89
+ layout: {
90
+ padding: {
91
+ right: 5,
92
+ },
93
+ },
94
+ }),
95
+ transformData: transformDataToBarLikeDataSet,
96
+ };
97
+ export const stackedBarChart = {
98
+ chartType: 'stackedBar',
99
+ chartJsType: 'bar',
100
+ createOptions: () => deepMerge(createBasicOptions(), {
101
+ scales: {
102
+ x: { stacked: true },
103
+ y: { stacked: true },
104
+ },
105
+ }),
106
+ transformData: transformDataToBasicDataSets,
107
+ };
108
+ export const pieChart = {
109
+ chartType: 'pie',
110
+ chartJsType: 'pie',
111
+ createOptions: () => {
112
+ return {
113
+ radius: '95%',
114
+ layout: {
115
+ padding: 0,
116
+ },
117
+ aspectRatio: 1,
118
+ responsive: true,
119
+ maintainAspectRatio: true,
120
+ };
121
+ },
122
+ transformData: transformDataToBarLikeDataSet,
123
+ };
124
+ export const doughnutChart = {
125
+ chartType: 'doughnut',
126
+ chartJsType: 'doughnut',
127
+ createOptions: () => {
128
+ return {
129
+ radius: '95%',
130
+ layout: {
131
+ padding: 0,
132
+ },
133
+ aspectRatio: 1,
134
+ responsive: true,
135
+ maintainAspectRatio: true,
136
+ };
137
+ },
138
+ transformData: transformDataToBarLikeDataSet,
139
+ };
140
+ export const polarAreaChart = {
141
+ chartType: 'polarArea',
142
+ chartJsType: 'polarArea',
143
+ createOptions: () => {
144
+ return {
145
+ radius: '95%',
146
+ layout: {
147
+ padding: 0,
148
+ },
149
+ aspectRatio: 1,
150
+ responsive: true,
151
+ maintainAspectRatio: true,
152
+ };
153
+ },
154
+ transformData: (chartData) => {
155
+ return {
156
+ labels: chartData.labels,
157
+ datasets: chartData.items.map((dataset) => ({
158
+ data: dataset.items.map((item) => item.xValue),
159
+ label: dataset.label,
160
+ borderColor: dataset.items.map((item) => item.itemColor),
161
+ backgroundColor: dataset.items.map((item) => item.itemColor),
162
+ })),
163
+ };
164
+ },
165
+ };
166
+ export const radarChart = {
167
+ chartType: 'radar',
168
+ chartJsType: 'radar',
169
+ createOptions: () => {
170
+ return {
171
+ aspectRatio: 1,
172
+ responsive: true,
173
+ maintainAspectRatio: true,
174
+ };
175
+ },
176
+ transformData: (chartData) => {
177
+ return {
178
+ labels: chartData.labels,
179
+ datasets: chartData.items.map((dataset) => ({
180
+ data: dataset.items.map((item) => item.xValue),
181
+ label: dataset.label,
182
+ borderColor: dataset.color,
183
+ pointBackgroundColor: dataset.color,
184
+ pointBorderColor: dataset.color,
185
+ pointHoverBackgroundColor: '#000000',
186
+ pointHoverBorderColor: dataset.color,
187
+ })),
188
+ };
189
+ },
190
+ };
191
+ export const scatterChart = {
192
+ chartType: 'scatter',
193
+ chartJsType: 'scatter',
194
+ createOptions: () => deepMerge(createBasicOptions(), {
195
+ scales: {
196
+ y: {
197
+ beginAtZero: true,
198
+ grace: '5%',
199
+ },
200
+ x: {
201
+ beginAtZero: true,
202
+ grace: '5%',
203
+ },
204
+ },
205
+ }),
206
+ transformData: transformDataToScatter,
207
+ };
208
+ export const bubbleChart = {
209
+ chartType: 'bubble',
210
+ chartJsType: 'bubble',
211
+ createOptions: () => deepMerge(createBasicOptions(), {
212
+ scales: {
213
+ y: {
214
+ beginAtZero: true,
215
+ grace: '5%',
216
+ },
217
+ x: {
218
+ beginAtZero: true,
219
+ grace: '5%',
220
+ },
221
+ },
222
+ }),
223
+ transformData: transformDataToBubble,
224
+ };
225
+ export const multiAxisLineChart = {
226
+ chartType: 'multiAxisLine',
227
+ chartJsType: 'line',
228
+ createOptions: (chartData) => {
229
+ const yAxes = chartData.items.map((dataset, index) => ({
230
+ id: `y${index == 1 ? '' : index}`,
231
+ type: 'linear',
232
+ position: index % 2 === 0 ? 'left' : 'right',
233
+ }));
234
+ return {
235
+ scales: {
236
+ ...yAxes.reduce((acc, axis) => {
237
+ acc[axis.id] = axis;
238
+ return acc;
239
+ }, {}),
240
+ },
241
+ aspectRatio: 1.78,
242
+ responsive: true,
243
+ maintainAspectRatio: true,
244
+ };
245
+ },
246
+ transformData: (chartData) => {
247
+ return {
248
+ labels: chartData.labels,
249
+ datasets: chartData.items.map((dataset, index) => ({
250
+ data: dataset.items.map((item) => item.xValue),
251
+ label: dataset.label,
252
+ yAxisID: `y${index == 1 ? '' : index}`,
253
+ backgroundColor: dataset.color,
254
+ borderColor: dataset.color,
255
+ })),
256
+ };
257
+ },
258
+ };
259
+ export class DefaultChartOptionsProvider {
260
+ constructor(factories) {
261
+ this.factoriesByType = new Map(factories?.map((f) => [f.chartType, f]) ?? []);
262
+ }
263
+ getFactory(chartType) {
264
+ return (this.factoriesByType.get(chartType) ?? {
265
+ chartType: chartType,
266
+ chartJsType: chartType,
267
+ transformData: transformDataToBasicDataSets,
268
+ createOptions: createBasicOptions,
269
+ });
270
+ }
271
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: DefaultChartOptionsProvider, deps: [{ token: CUSTOM_DIAGRAM_OPTIONS, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
272
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: DefaultChartOptionsProvider, providedIn: 'root' }); }
273
+ }
274
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: DefaultChartOptionsProvider, decorators: [{
275
+ type: Injectable,
276
+ args: [{
277
+ providedIn: 'root',
278
+ }]
279
+ }], ctorParameters: () => [{ type: undefined, decorators: [{
280
+ type: Inject,
281
+ args: [CUSTOM_DIAGRAM_OPTIONS]
282
+ }, {
283
+ type: Optional
284
+ }] }] });
285
+ function generateRandomColor() {
286
+ const random = Math.floor(Math.random() * 16777215).toString(16);
287
+ return `#${'000000'.substring(0, 6 - random.length) + random}`;
288
+ }
289
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdC1zbWFydC1kaWFncmFtLW9wdGlvbnMucHJvdmlkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC1uZy1jbGllbnQvc3JjL2xpYi9zbWFydC1kaWFncmFtL2NvbXBvbmVudC9kZWZhdWx0LXNtYXJ0LWRpYWdyYW0tb3B0aW9ucy5wcm92aWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTdFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7QUFJakQsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsSUFBSSxjQUFjLENBQWlCLHdCQUF3QixDQUFDLENBQUM7QUFTbkcsTUFBTSxVQUFVLDRCQUE0QixDQUFDLFNBQStCO0lBQzFFLE9BQU87UUFDTCxNQUFNLEVBQUUsU0FBUyxDQUFDLE1BQU07UUFDeEIsUUFBUSxFQUFFLFNBQVMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDeEMsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssSUFBSSxtQkFBbUIsRUFBRSxDQUFDO1lBQ3JELE9BQU87Z0JBQ0wsSUFBSSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO2dCQUM5QyxLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUs7Z0JBQ3BCLGVBQWUsRUFBRSxLQUFLO2dCQUN0QixXQUFXLEVBQUUsS0FBSzthQUNuQixDQUFDO1FBQ0osQ0FBQyxDQUFDO0tBQ0gsQ0FBQztBQUNKLENBQUM7QUFFRCxNQUFNLFVBQVUsNkJBQTZCLENBQUMsU0FBK0I7SUFDM0UsT0FBTztRQUNMLE1BQU0sRUFBRSxTQUFT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RixDQUFDO0lBRUQsVUFBVSxDQUFDLFNBQWlCO1FBQzFCLE9BQU8sQ0FDTCxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFBSTtZQUNyQyxTQUFTLEVBQUUsU0FBUztZQUNwQixXQUFXLEVBQUUsU0FBUztZQUN0QixhQUFhLEVBQUUsNEJBQTRCO1lBQzNDLGFBQWEsRUFBRSxrQkFBa0I7U0FDbEMsQ0FDRixDQUFDO0lBQ0osQ0FBQzsrR0FuQlUsMkJBQTJCLGtCQUc1QixzQkFBc0I7bUhBSHJCLDJCQUEyQixjQUYxQixNQUFNOzs0RkFFUCwyQkFBMkI7a0JBSHZDLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25COzswQkFJSSxNQUFNOzJCQUFDLHNCQUFzQjs7MEJBQzdCLFFBQVE7O0FBa0JiLFNBQVMsbUJBQW1CO0lBQzFCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLFFBQVEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNqRSxPQUFPLElBQUksUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxNQUFNLEVBQUUsQ0FBQztBQUNqRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0aW9uVG9rZW4sIE9wdGlvbmFsLCBJbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRGlhZ3JhbURhdGFDb250YWluZXIgfSBmcm9tICcuLi9hcGknO1xyXG5pbXBvcnQgeyBkZWVwTWVyZ2UgfSBmcm9tICcuL3NtYXJ0LWRpYWdyYW0udXRpbCc7XHJcbmltcG9ydCB7IFggfSBmcm9tICdAYW5ndWxhci9jZGsva2V5Y29kZXMnO1xyXG5pbXBvcnQgeyBsYXlvdXRzIH0gZnJvbSAnY2hhcnQuanMnO1xyXG5cclxuZXhwb3J0IGNvbnN0IENVU1RPTV9ESUFHUkFNX09QVElPTlMgPSBuZXcgSW5qZWN0aW9uVG9rZW48RGlhZ3JhbUZhY3Rvcnk+KCdDVVNUT01fRElBR1JBTV9PUFRJT05TJyk7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIERpYWdyYW1GYWN0b3J5IHtcclxuICByZWFkb25seSBjaGFydFR5cGU6IHN0cmluZztcclxuICByZWFkb25seSBjaGFydEpzVHlwZTogc3RyaW5nO1xyXG4gIGNyZWF0ZU9wdGlvbnMoY2hhcnREYXRhOiBEaWFncmFtRGF0YUNvbnRhaW5lcik6IGFueTtcclxuICB0cmFuc2Zvcm1EYXRhKGNoYXJ0RGF0YTogRGlhZ3JhbURhdGFDb250YWluZXIpOiBhbnk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1EYXRhVG9CYXNpY0RhdGFTZXRzKGNoYXJ0RGF0YTogRGlhZ3JhbURhdGFDb250YWluZXIpOiBhbnkge1xyXG4gIHJldHVybiB7XHJcbiAgICBsYWJlbHM6IGNoYXJ0RGF0YS5sYWJlbHMsXHJcbiAgICBkYXRhc2V0czogY2hhcnREYXRhLml0ZW1zLm1hcCgoZGF0YXNldCkgPT4ge1xyXG4gICAgICBjb25zdCBjb2xvciA9IGRhdGFzZXQuY29sb3IgfHwgZ2VuZXJhdGVSYW5kb21Db2xvcigpO1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIGRhdGE6IGRhdGFzZXQuaXRlbXMubWFwKChpdGVtKSA9PiBpdGVtLnhWYWx1ZSksXHJcbiAgICAgICAgbGFiZWw6IGRhdGFzZXQubGFiZWwsXHJcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBjb2xvcixcclxuICAgICAgICBib3JkZXJDb2xvcjogY29sb3IsXHJcbiAgICAgIH07XHJcbiAgICB9KSxcclxuICB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNmb3JtRGF0YVRvQmFyTGlrZURhdGFTZXQoY2hhcnREYXRhOiBEaWFncmFtRGF0YUNvbnRhaW5lcik6IGFueSB7XHJcbiAgcmV0dXJuIHtcclxuICAgIGxhYmVsczogY2hhcnREYXRhLmxhYmVscyxcclxuICAgIGRhdGFzZXRzOiBjaGFydERhdGEuaXRlbXMubWFwKChkYXRhc2V0KSA9PiB7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgZGF0YTogZGF0YXNldC5pdGVtcy5tYXAoKGl0ZW0pID0+IGl0ZW0ueFZhbHVlKSxcclxuICAgICAgICBsYWJlbDogZGF0YXNldC5sYWJlbCxcclxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IGRhdGFzZXQuaXRlbXMubWFwKChpdGVtKSA9PiBpdGVtLml0ZW1Db2xvciB8fCBnZW5lcmF0ZVJhbmRvbUNvbG9yKCkpLFxyXG4gICAgICAgIGJvcmRlckNvbG9yOiBkYXRhc2V0Lml0ZW1zLm1hcCgoaXRlbSkgPT4gaXRlbS5pdGVtQ29sb3IgfHwgZ2VuZXJhdGVSYW5kb21Db2xvcigpKSxcclxuICAgICAgfTtcclxuICAgIH0pLFxyXG4gIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1EYXRhVG9TY2F0dGVyKGNoYXJ0RGF0YTogRGlhZ3JhbURhdGFDb250YWluZXIpOiBhbnkge1xyXG4gIHJldHVybiB7XHJcbiAgICBkYXRhc2V0czogY2hhcnREYXRhLml0ZW1zLm1hcCgoZGF0YXNldCkgPT4ge1xyXG4gICAgICBjb25zdCBjb2xvciA9IGRhdGFzZXQuY29sb3IgfHwgZ2VuZXJhdGVSYW5kb21Db2xvcigpO1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIGxhYmVsOiBkYXRhc2V0LmxhYmVsLFxyXG4gICAgICAgIGRhdGE6IGRhdGFzZXQuaXRlbXMubWFwKChpdGVtKSA9PiAoe1xyXG4gICAgICAgICAgeDogaXRlbS54VmFsdWUsXHJcbiAgICAgICAgICB5OiBpdGVtLnlWYWx1ZSxcclxuICAgICAgICB9KSksXHJcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBjb2xvcixcclxuICAgICAgICBib3JkZXJDb2xvcjogY29sb3IsXHJcbiAgICAgIH07XHJcbiAgICB9KSxcclxuICB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNmb3JtRGF0YVRvQnViYmxlKGNoYXJ0RGF0YTogRGlhZ3JhbURhdGFDb250YWluZXIpOiBhbnkge1xyXG4gIHJldHVybiB7XHJcbiAgICBkYXRhc2V0czogY2hhcnREYXRhLml0ZW1zLm1hcCgoZGF0YXNldCkgPT4ge1xyXG4gICAgICBjb25zdCBjb2xvciA9IGRhdGFzZXQuY29sb3IgfHwgZ2VuZXJhdGVSYW5kb21Db2xvcigpO1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIGxhYmVsOiBkYXRhc2V0LmxhYmVsLFxyXG4gICAgICAgIGRhdGE6IGRhdGFzZXQuaXRlbXMubWFwKChpdGVtKSA9PiAoe1xyXG4gICAgICAgICAgeDogaXRlbS54VmFsdWUsXHJcbiAgICAgICAgICB5OiBpdGVtLnlWYWx1ZSxcclxuICAgICAgICAgIHI6IGl0ZW0uclZhbHVlID8/IDUsXHJcbiAgICAgICAgfSkpLFxyXG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogY29sb3IsXHJcbiAgICAgICAgYm9yZGVyQ29sb3I6IGNvbG9yLFxyXG4gICAgICB9O1xyXG4gICAgfSksXHJcbiAgfTtcclxufVxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQmFzaWNPcHRpb25zKCk6IGFueSB7XHJcbiAgcmV0dXJuIHtcclxuICAgIHNjYWxlczoge1xyXG4gICAgICB5OiB7XHJcbiAgICAgICAgYmVnaW5BdFplcm86IHRydWUsXHJcbiAgICAgICAgZ3JhY2U6ICc1JScsXHJcbiAgICAgIH0sXHJcbiAgICB9LFxyXG4gICAgYXNwZWN0UmF0aW86IDEuNzgsXHJcbiAgICByZXNwb25zaXZlOiB0cnVlLFxyXG4gICAgbWFpbnRhaW5Bc3BlY3RSYXRpbzogdHJ1ZSxcclxuICB9O1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgYmFyQ2hhcnQ6IERpYWdyYW1GYWN0b3J5ID0ge1xyXG4gIGNoYXJ0VHlwZTogJ2JhcicsXHJcbiAgY2hhcnRKc1R5cGU6ICdiYXInLFxyXG4gIGNyZWF0ZU9wdGlvbnM6IGNyZWF0ZUJhc2ljT3B0aW9ucyxcclxuICB0cmFuc2Zvcm1EYXRhOiB0cmFuc2Zvcm1EYXRhVG9CYXJMaWtlRGF0YVNldCxcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBob3Jpem9udGFsQmFyQ2hhcnQ6IERpYWdyYW1GYWN0b3J5ID0ge1xyXG4gIGNoYXJ0VHlwZTogJ2hvcml6b250YWxCYXInLFxyXG4gIGNoYXJ0SnNUeXBlOiAnYmFyJyxcclxuICBjcmVhdGVPcHRpb25zOiAoKSA9PlxyXG4gICAgZGVlcE1lcmdlKGNyZWF0ZUJhc2ljT3B0aW9ucygpLCB7XHJcbiAgICAgIGluZGV4QXhpczogJ3knLFxyXG4gICAgICBsYXlvdXQ6IHtcclxuICAgICAgICBwYWRkaW5nOiB7XHJcbiAgICAgICAgICByaWdodDogNSxcclxuICAgICAgICB9LFxyXG4gICAgICB9LFxyXG4gICAgfSksXHJcbiAgdHJhbnNmb3JtRGF0YTogdHJhbnNmb3JtRGF0YVRvQmFyTGlrZURhdGFTZXQsXHJcbn07XHJcblxyXG5leHBvcnQgY29uc3Qgc3RhY2tlZEJhckNoYXJ0OiBEaWFncmFtRmFjdG9yeSA9IHtcclxuICBjaGFydFR5cGU6ICdzdGFja2VkQmFyJyxcclxuICBjaGFydEpzVHlwZTogJ2JhcicsXHJcbiAgY3JlYXRlT3B0aW9uczogKCkgPT5cclxuICAgIGRlZXBNZXJnZShjcmVhdGVCYXNpY09wdGlvbnMoKSwge1xyXG4gICAgICBzY2FsZXM6IHtcclxuICAgICAgICB4OiB7IHN0YWNrZWQ6IHRydWUgfSxcclxuICAgICAgICB5OiB7IHN0YWNrZWQ6IHRydWUgfSxcclxuICAgICAgfSxcclxuICAgIH0pLFxyXG4gIHRyYW5zZm9ybURhdGE6IHRyYW5zZm9ybURhdGFUb0Jhc2ljRGF0YVNldHMsXHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgcGllQ2hhcnQ6IERpYWdyYW1GYWN0b3J5ID0ge1xyXG4gIGNoYXJ0VHlwZTogJ3BpZScsXHJcbiAgY2hhcnRKc1R5cGU6ICdwaWUnLFxyXG4gIGNyZWF0ZU9wdGlvbnM6ICgpID0+IHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHJhZGl1czogJzk1JScsXHJcbiAgICAgIGxheW91dDoge1xyXG4gICAgICAgIHBhZGRpbmc6IDAsXHJcbiAgICAgIH0sXHJcbiAgICAgIGFzcGVjdFJhdGlvOiAxLFxyXG4gICAgICByZXNwb25zaXZlOiB0cnVlLFxyXG4gICAgICBtYWludGFpbkFzcGVjdFJhdGlvOiB0cnVlLFxyXG4gICAgfTtcclxuICB9LFxyXG4gIHRyYW5zZm9ybURhdGE6IHRyYW5zZm9ybURhdGFUb0Jhckxpa2VEYXRhU2V0LFxyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IGRvdWdobnV0Q2hhcnQ6IERpYWdyYW1GYWN0b3J5ID0ge1xyXG4gIGNoYXJ0VHlwZTogJ2RvdWdobnV0JyxcclxuICBjaGFydEpzVHlwZTogJ2RvdWdobnV0JyxcclxuICBjcmVhdGVPcHRpb25zOiAoKSA9PiB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICByYWRpdXM6ICc5NSUnLFxyXG4gICAgICBsYXlvdXQ6IHtcclxuICAgICAgICBwYWRkaW5nOiAwLFxyXG4gICAgICB9LFxyXG4gICAgICBhc3BlY3RSYXRpbzogMSxcclxuICAgICAgcmVzcG9uc2l2ZTogdHJ1ZSxcclxuICAgICAgbWFpbnRhaW5Bc3BlY3RSYXRpbzogdHJ1ZSxcclxuICAgIH07XHJcbiAgfSxcclxuICB0cmFuc2Zvcm1EYXRhOiB0cmFuc2Zvcm1EYXRhVG9CYXJMaWtlRGF0YVNldCxcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBwb2xhckFyZWFDaGFydDogRGlhZ3JhbUZhY3RvcnkgPSB7XHJcbiAgY2hhcnRUeXBlOiAncG9sYXJBcmVhJyxcclxuICBjaGFydEpzVHlwZTogJ3BvbGFyQXJlYScsXHJcbiAgY3JlYXRlT3B0aW9uczogKCkgPT4ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgcmFkaXVzOiAnOTUlJyxcclxuICAgICAgbGF5b3V0OiB7XHJcbiAgICAgICAgcGFkZGluZzogMCxcclxuICAgICAgfSxcclxuICAgICAgYXNwZWN0UmF0aW86IDEsXHJcbiAgICAgIHJlc3BvbnNpdmU6IHRydWUsXHJcbiAgICAgIG1haW50YWluQXNwZWN0UmF0aW86IHRydWUsXHJcbiAgICB9O1xyXG4gIH0sXHJcbiAgdHJhbnNmb3JtRGF0YTogKGNoYXJ0RGF0YTogRGlhZ3JhbURhdGFDb250YWluZXIpOiBhbnkgPT4ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgbGFiZWxzOiBjaGFydERhdGEubGFiZWxzLFxyXG4gICAgICBkYXRhc2V0czogY2hhcnREYXRhLml0ZW1zLm1hcCgoZGF0YXNldCkgPT4gKHtcclxuICAgICAgICBkYXRhOiBkYXRhc2V0Lml0ZW1zLm1hcCgoaXRlbSkgPT4gaXRlbS54VmFsdWUpLFxyXG4gICAgICAgIGxhYmVsOiBkYXRhc2V0LmxhYmVsLFxyXG4gICAgICAgIGJvcmRlckNvbG9yOiBkYXRhc2V0Lml0ZW1zLm1hcCgoaXRlbSkgPT4gaXRlbS5pdGVtQ29sb3IpLFxyXG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogZGF0YXNldC5pdGVtcy5tYXAoKGl0ZW0pID0+IGl0ZW0uaXRlbUNvbG9yKSxcclxuICAgICAgfSkpLFxyXG4gICAgfTtcclxuICB9LFxyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IHJhZGFyQ2hhcnQ6IERpYWdyYW1GYWN0b3J5ID0ge1xyXG4gIGNoYXJ0VHlwZTogJ3JhZGFyJyxcclxuICBjaGFydEpzVHlwZTogJ3JhZGFyJyxcclxuICBjcmVhdGVPcHRpb25zOiAoKSA9PiB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBhc3BlY3RSYXRpbzogMSxcclxuICAgICAgcmVzcG9uc2l2ZTogdHJ1ZSxcclxuICAgICAgbWFpbnRhaW5Bc3BlY3RSYXRpbzogdHJ1ZSxcclxuICAgIH07XHJcbiAgfSxcclxuICB0cmFuc2Zvcm1EYXRhOiAoY2hhcnREYXRhOiBEaWFncmFtRGF0YUNvbnRhaW5lcik6IGFueSA9PiB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBsYWJlbHM6IGNoYXJ0RGF0YS5sYWJlbHMsXHJcbiAgICAgIGRhdGFzZXRzOiBjaGFydERhdGEuaXRlbXMubWFwKChkYXRhc2V0KSA9PiAoe1xyXG4gICAgICAgIGRhdGE6IGRhdGFzZXQuaXRlbXMubWFwKChpdGVtKSA9PiBpdGVtLnhWYWx1ZSksXHJcbiAgICAgICAgbGFiZWw6IGRhdGFzZXQubGFiZWwsXHJcbiAgICAgICAgYm9yZGVyQ29sb3I6IGRhdGFzZXQuY29sb3IsXHJcbiAgICAgICAgcG9pbnRCYWNrZ3JvdW5kQ29sb3I6IGRhdGFzZXQuY29sb3IsXHJcbiAgICAgICAgcG9pbnRCb3JkZXJDb2xvcjogZGF0YXNldC5jb2xvcixcclxuICAgICAgICBwb2ludEhvdmVyQmFja2dyb3VuZENvbG9yOiAnIzAwMDAwMCcsXHJcbiAgICAgICAgcG9pbnRIb3ZlckJvcmRlckNvbG9yOiBkYXRhc2V0LmNvbG9yLFxyXG4gICAgICB9KSksXHJcbiAgICB9O1xyXG4gIH0sXHJcbn07XHJcblxyXG5leHBvcnQgY29uc3Qgc2NhdHRlckNoYXJ0OiBEaWFncmFtRmFjdG9yeSA9IHtcclxuICBjaGFydFR5cGU6ICdzY2F0dGVyJyxcclxuICBjaGFydEpzVHlwZTogJ3NjYXR0ZXInLFxyXG4gIGNyZWF0ZU9wdGlvbnM6ICgpID0+XHJcbiAgICBkZWVwTWVyZ2UoY3JlYXRlQmFzaWNPcHRpb25zKCksIHtcclxuICAgICAgc2NhbGVzOiB7XHJcbiAgICAgICAgeToge1xyXG4gICAgICAgICAgYmVnaW5BdFplcm86IHRydWUsXHJcbiAgICAgICAgICBncmFjZTogJzUlJyxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHg6IHtcclxuICAgICAgICAgIGJlZ2luQXRaZXJvOiB0cnVlLFxyXG4gICAgICAgICAgZ3JhY2U6ICc1JScsXHJcbiAgICAgICAgfSxcclxuICAgICAgfSxcclxuICAgIH0pLFxyXG4gIHRyYW5zZm9ybURhdGE6IHRyYW5zZm9ybURhdGFUb1NjYXR0ZXIsXHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgYnViYmxlQ2hhcnQ6IERpYWdyYW1GYWN0b3J5ID0ge1xyXG4gIGNoYXJ0VHlwZTogJ2J1YmJsZScsXHJcbiAgY2hhcnRKc1R5cGU6ICdidWJibGUnLFxyXG4gIGNyZWF0ZU9wdGlvbnM6ICgpID0+XHJcbiAgICBkZWVwTWVyZ2UoY3JlYXRlQmFzaWNPcHRpb25zKCksIHtcclxuICAgICAgc2NhbGVzOiB7XHJcbiAgICAgICAgeToge1xyXG4gICAgICAgICAgYmVnaW5BdFplcm86IHRydWUsXHJcbiAgICAgICAgICBncmFjZTogJzUlJyxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHg6IHtcclxuICAgICAgICAgIGJlZ2luQXRaZXJvOiB0cnVlLFxyXG4gICAgICAgICAgZ3JhY2U6ICc1JScsXHJcbiAgICAgICAgfSxcclxuICAgICAgfSxcclxuICAgIH0pLFxyXG4gIHRyYW5zZm9ybURhdGE6IHRyYW5zZm9ybURhdGFUb0J1YmJsZSxcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBtdWx0aUF4aXNMaW5lQ2hhcnQ6IERpYWdyYW1GYWN0b3J5ID0ge1xyXG4gIGNoYXJ0VHlwZTogJ211bHRpQXhpc0xpbmUnLFxyXG4gIGNoYXJ0SnNUeXBlOiAnbGluZScsXHJcbiAgY3JlYXRlT3B0aW9uczogKGNoYXJ0RGF0YTogRGlhZ3JhbURhdGFDb250YWluZXIpOiBhbnkgPT4ge1xyXG4gICAgY29uc3QgeUF4ZXMgPSBjaGFydERhdGEuaXRlbXMubWFwKChkYXRhc2V0LCBpbmRleCkgPT4gKHtcclxuICAgICAgaWQ6IGB5JHtpbmRleCA9PSAxID8gJycgOiBpbmRleH1gLFxyXG4gICAgICB0eXBlOiAnbGluZWFyJyxcclxuICAgICAgcG9zaXRpb246IGluZGV4ICUgMiA9PT0gMCA/ICdsZWZ0JyA6ICdyaWdodCcsXHJcbiAgICB9KSk7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBzY2FsZXM6IHtcclxuICAgICAgICAuLi55QXhlcy5yZWR1Y2UoKGFjYzogYW55LCBheGlzKSA9PiB7XHJcbiAgICAgICAgICBhY2NbYXhpcy5pZF0gPSBheGlzO1xyXG4gICAgICAgICAgcmV0dXJuIGFjYztcclxuICAgICAgICB9LCB7fSksXHJcbiAgICAgIH0sXHJcbiAgICAgIGFzcGVjdFJhdGlvOiAxLjc4LFxyXG4gICAgICByZXNwb25zaXZlOiB0cnVlLFxyXG4gICAgICBtYWludGFpbkFzcGVjdFJhdGlvOiB0cnVlLFxyXG4gICAgfTtcclxuICB9LFxyXG4gIHRyYW5zZm9ybURhdGE6IChjaGFydERhdGE6IERpYWdyYW1EYXRhQ29udGFpbmVyKTogYW55ID0+IHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGxhYmVsczogY2hhcnREYXRhLmxhYmVscyxcclxuICAgICAgZGF0YXNldHM6IGNoYXJ0RGF0YS5pdGVtcy5tYXAoKGRhdGFzZXQsIGluZGV4KSA9PiAoe1xyXG4gICAgICAgIGRhdGE6IGRhdGFzZXQuaXRlbXMubWFwKChpdGVtKSA9PiBpdGVtLnhWYWx1ZSksXHJcbiAgICAgICAgbGFiZWw6IGRhdGFzZXQubGFiZWwsXHJcbiAgICAgICAgeUF4aXNJRDogYHkke2luZGV4ID09IDEgPyAnJyA6IGluZGV4fWAsXHJcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBkYXRhc2V0LmNvbG9yLFxyXG4gICAgICAgIGJvcmRlckNvbG9yOiBkYXRhc2V0LmNvbG9yLFxyXG4gICAgICB9KSksXHJcbiAgICB9O1xyXG4gIH0sXHJcbn07XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgRGVmYXVsdENoYXJ0T3B0aW9uc1Byb3ZpZGVyIHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGZhY3Rvcmllc0J5VHlwZTogTWFwPHN0cmluZywgRGlhZ3JhbUZhY3Rvcnk+O1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgQEluamVjdChDVVNUT01fRElBR1JBTV9PUFRJT05TKVxyXG4gICAgQE9wdGlvbmFsKClcclxuICAgIGZhY3RvcmllczogRGlhZ3JhbUZhY3RvcnlbXSB8IHVuZGVmaW5lZFxyXG4gICkge1xyXG4gICAgdGhpcy5mYWN0b3JpZXNCeVR5cGUgPSBuZXcgTWFwKGZhY3Rvcmllcz8ubWFwKChmKSA9PiBbZi5jaGFydFR5cGUsIGZdKSA/PyBbXSk7XHJcbiAgfVxyXG5cclxuICBnZXRGYWN0b3J5KGNoYXJ0VHlwZTogc3RyaW5nKTogRGlhZ3JhbUZhY3Rvcnkge1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgdGhpcy5mYWN0b3JpZXNCeVR5cGUuZ2V0KGNoYXJ0VHlwZSkgPz8ge1xyXG4gICAgICAgIGNoYXJ0VHlwZTogY2hhcnRUeXBlLFxyXG4gICAgICAgIGNoYXJ0SnNUeXBlOiBjaGFydFR5cGUsXHJcbiAgICAgICAgdHJhbnNmb3JtRGF0YTogdHJhbnNmb3JtRGF0YVRvQmFzaWNEYXRhU2V0cyxcclxuICAgICAgICBjcmVhdGVPcHRpb25zOiBjcmVhdGVCYXNpY09wdGlvbnMsXHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBnZW5lcmF0ZVJhbmRvbUNvbG9yKCk6IHN0cmluZyB7XHJcbiAgY29uc3QgcmFuZG9tID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMTY3NzcyMTUpLnRvU3RyaW5nKDE2KTtcclxuICByZXR1cm4gYCMkeycwMDAwMDAnLnN1YnN0cmluZygwLCA2IC0gcmFuZG9tLmxlbmd0aCkgKyByYW5kb219YDtcclxufVxyXG4iXX0=