@c8y/ngx-components 1021.63.2 → 1021.67.0

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 (197) hide show
  1. package/auth-configuration/sso-configuration/template-parts/signature-configuration.component.d.ts +7 -2
  2. package/auth-configuration/sso-configuration/template-parts/signature-configuration.component.d.ts.map +1 -1
  3. package/core/bottom-drawer/bottom-drawer-ref.d.ts +4 -0
  4. package/core/bottom-drawer/bottom-drawer-ref.d.ts.map +1 -1
  5. package/core/breadcrumb/breadcrumb-item.component.d.ts +1 -1
  6. package/core/breadcrumb/breadcrumb-item.component.d.ts.map +1 -1
  7. package/core/breadcrumb/breadcrumb-outlet.component.d.ts +1 -1
  8. package/core/breadcrumb/breadcrumb-outlet.component.d.ts.map +1 -1
  9. package/core/breadcrumb/breadcrumb.component.d.ts +1 -1
  10. package/core/breadcrumb/breadcrumb.component.d.ts.map +1 -1
  11. package/core/breadcrumb/breadcrumb.module.d.ts +7 -7
  12. package/core/breadcrumb/breadcrumb.module.d.ts.map +1 -1
  13. package/core/common/common.module.d.ts +38 -38
  14. package/core/common/date-format.service.d.ts +30 -0
  15. package/core/common/date-format.service.d.ts.map +1 -0
  16. package/core/common/date.pipe.d.ts +7 -3
  17. package/core/common/date.pipe.d.ts.map +1 -1
  18. package/core/common/index.d.ts +1 -0
  19. package/core/common/index.d.ts.map +1 -1
  20. package/core/common/outlet.directive.d.ts +1 -1
  21. package/core/common/outlet.directive.d.ts.map +1 -1
  22. package/core/common/user-preferences/user-preferences-store-current-user.d.ts +11 -0
  23. package/core/common/user-preferences/user-preferences-store-current-user.d.ts.map +1 -0
  24. package/core/common/user-preferences/user-preferences.service.d.ts +40 -1
  25. package/core/common/user-preferences/user-preferences.service.d.ts.map +1 -1
  26. package/core/date-picker/date-picker.component.d.ts +3 -1
  27. package/core/date-picker/date-picker.component.d.ts.map +1 -1
  28. package/core/date-time-picker/date-time-picker.component.d.ts +6 -3
  29. package/core/date-time-picker/date-time-picker.component.d.ts.map +1 -1
  30. package/core/dynamic-forms/date/date.type.component.d.ts +3 -0
  31. package/core/dynamic-forms/date/date.type.component.d.ts.map +1 -1
  32. package/core/plugins/plugins.model.d.ts +1 -0
  33. package/core/plugins/plugins.model.d.ts.map +1 -1
  34. package/core/plugins/plugins.service.d.ts +7 -2
  35. package/core/plugins/plugins.service.d.ts.map +1 -1
  36. package/core/time-interval/time-interval.component.d.ts +4 -2
  37. package/core/time-interval/time-interval.component.d.ts.map +1 -1
  38. package/ecosystem/application-plugins/application-plugin-readme.component.d.ts +15 -0
  39. package/ecosystem/application-plugins/application-plugin-readme.component.d.ts.map +1 -0
  40. package/ecosystem/application-plugins/application-plugins.component.d.ts +4 -2
  41. package/ecosystem/application-plugins/application-plugins.component.d.ts.map +1 -1
  42. package/ecosystem/application-plugins/application-plugins.module.d.ts +4 -3
  43. package/ecosystem/application-plugins/application-plugins.module.d.ts.map +1 -1
  44. package/ecosystem/application-plugins/install-plugin.component.d.ts +8 -4
  45. package/ecosystem/application-plugins/install-plugin.component.d.ts.map +1 -1
  46. package/ecosystem/application-plugins/plugin-list.component.d.ts +10 -26
  47. package/ecosystem/application-plugins/plugin-list.component.d.ts.map +1 -1
  48. package/ecosystem/application-plugins/plugin-list.service.d.ts +27 -0
  49. package/ecosystem/application-plugins/plugin-list.service.d.ts.map +1 -0
  50. package/ecosystem/ecosystem.module.d.ts +2 -1
  51. package/ecosystem/ecosystem.module.d.ts.map +1 -1
  52. package/ecosystem/packages/package-changelog-tab/package-changelog-tab.component.d.ts +15 -0
  53. package/ecosystem/packages/package-changelog-tab/package-changelog-tab.component.d.ts.map +1 -0
  54. package/ecosystem/packages/package-changelog.guard.d.ts +10 -0
  55. package/ecosystem/packages/package-changelog.guard.d.ts.map +1 -0
  56. package/ecosystem/packages/package-details/package-details.component.d.ts +7 -9
  57. package/ecosystem/packages/package-details/package-details.component.d.ts.map +1 -1
  58. package/ecosystem/packages/package-versions/package-contents/contents-plugins/contents-plugins.component.d.ts +5 -1
  59. package/ecosystem/packages/package-versions/package-contents/contents-plugins/contents-plugins.component.d.ts.map +1 -1
  60. package/ecosystem/packages/package-versions/package-contents/packages-contents.component.d.ts +8 -3
  61. package/ecosystem/packages/package-versions/package-contents/packages-contents.component.d.ts.map +1 -1
  62. package/ecosystem/packages/package-versions/packages-versions.component.d.ts +9 -2
  63. package/ecosystem/packages/package-versions/packages-versions.component.d.ts.map +1 -1
  64. package/ecosystem/shared/index.d.ts +1 -0
  65. package/ecosystem/shared/index.d.ts.map +1 -1
  66. package/ecosystem/shared/package-changelog/package-changelog.component.d.ts +24 -0
  67. package/ecosystem/shared/package-changelog/package-changelog.component.d.ts.map +1 -0
  68. package/ecosystem/shared/shared-ecosystem.module.d.ts +2 -1
  69. package/ecosystem/shared/shared-ecosystem.module.d.ts.map +1 -1
  70. package/esm2022/auth-configuration/sso-configuration/template-parts/signature-configuration.component.mjs +11 -7
  71. package/esm2022/core/bottom-drawer/bottom-drawer-ref.mjs +9 -3
  72. package/esm2022/core/breadcrumb/breadcrumb-item.component.mjs +3 -3
  73. package/esm2022/core/breadcrumb/breadcrumb-outlet.component.mjs +19 -9
  74. package/esm2022/core/breadcrumb/breadcrumb.component.mjs +3 -3
  75. package/esm2022/core/breadcrumb/breadcrumb.module.mjs +16 -5
  76. package/esm2022/core/common/common.module.mjs +6 -6
  77. package/esm2022/core/common/date-format.service.mjs +81 -0
  78. package/esm2022/core/common/date.pipe.mjs +29 -6
  79. package/esm2022/core/common/index.mjs +2 -1
  80. package/esm2022/core/common/outlet.directive.mjs +4 -3
  81. package/esm2022/core/common/user-preferences/user-preferences-store-current-user.mjs +22 -0
  82. package/esm2022/core/common/user-preferences/user-preferences.service.mjs +106 -16
  83. package/esm2022/core/date-picker/date-picker.component.mjs +11 -4
  84. package/esm2022/core/date-time-picker/date-time-picker.component.mjs +20 -11
  85. package/esm2022/core/dynamic-forms/date/date.type.component.mjs +12 -4
  86. package/esm2022/core/plugins/plugins.model.mjs +1 -1
  87. package/esm2022/core/plugins/plugins.service.mjs +31 -5
  88. package/esm2022/core/time-interval/time-interval.component.mjs +9 -2
  89. package/esm2022/ecosystem/application-plugins/application-plugin-readme.component.mjs +26 -0
  90. package/esm2022/ecosystem/application-plugins/application-plugins.component.mjs +29 -14
  91. package/esm2022/ecosystem/application-plugins/application-plugins.module.mjs +6 -3
  92. package/esm2022/ecosystem/application-plugins/install-plugin.component.mjs +21 -15
  93. package/esm2022/ecosystem/application-plugins/plugin-list-item.component.mjs +3 -3
  94. package/esm2022/ecosystem/application-plugins/plugin-list.component.mjs +26 -202
  95. package/esm2022/ecosystem/application-plugins/plugin-list.service.mjs +200 -0
  96. package/esm2022/ecosystem/application-plugins/update-plugin-of-app/update-plugin-of-app.component.mjs +3 -3
  97. package/esm2022/ecosystem/application-properties/update-application-modal/update-application-modal.component.mjs +1 -1
  98. package/esm2022/ecosystem/ecosystem.module.mjs +21 -5
  99. package/esm2022/ecosystem/packages/package-changelog-tab/package-changelog-tab.component.mjs +33 -0
  100. package/esm2022/ecosystem/packages/package-changelog.guard.mjs +22 -0
  101. package/esm2022/ecosystem/packages/package-details/package-details.component.mjs +25 -44
  102. package/esm2022/ecosystem/packages/package-versions/package-contents/contents-plugins/contents-plugins.component.mjs +14 -4
  103. package/esm2022/ecosystem/packages/package-versions/package-contents/packages-contents.component.mjs +27 -8
  104. package/esm2022/ecosystem/packages/package-versions/packages-versions.component.mjs +22 -8
  105. package/esm2022/ecosystem/shared/index.mjs +2 -1
  106. package/esm2022/ecosystem/shared/list-filters/list-filters.component.mjs +3 -3
  107. package/esm2022/ecosystem/shared/package-changelog/package-changelog.component.mjs +82 -0
  108. package/esm2022/ecosystem/shared/package-version-select/package-version-select.component.mjs +3 -3
  109. package/esm2022/ecosystem/shared/shared-ecosystem.module.mjs +12 -6
  110. package/esm2022/operations/bulk-operation-scheduler/operation-scheduler.component.mjs +9 -7
  111. package/esm2022/operations/bulk-operations-list/bulk-operations-list.component.mjs +1 -1
  112. package/esm2022/upgrade/ng1/downgraded.services.mjs +3 -2
  113. package/esm2022/upgrade/ng1/index.mjs +3 -2
  114. package/esm2022/widgets/cockpit/index.mjs +3 -1
  115. package/esm2022/widgets/cockpit-exports/index.mjs +8 -1
  116. package/esm2022/widgets/definitions/index.mjs +2 -1
  117. package/esm2022/widgets/definitions/radial-gauge/c8y-ngx-components-widgets-definitions-radial-gauge.mjs +5 -0
  118. package/esm2022/widgets/definitions/radial-gauge/index.mjs +33 -0
  119. package/esm2022/widgets/implementations/info-gauge/index.mjs +2 -2
  120. package/esm2022/widgets/implementations/info-gauge/info-gauge-widget-config/gauge.model.mjs +295 -0
  121. package/esm2022/widgets/implementations/info-gauge/info-gauge-widget-config/info-gauge-widget-config.component.mjs +141 -11
  122. package/esm2022/widgets/implementations/info-gauge/info-gauge-widget-config/preset-preview/preset-preview.component.mjs +67 -0
  123. package/esm2022/widgets/implementations/info-gauge/info-gauge-widget-view/info-gauge-widget-view.component.mjs +34 -6
  124. package/esm2022/widgets/implementations/info-gauge/info-gauge-widget.module.mjs +9 -4
  125. package/esm2022/widgets/implementations/info-gauge/radial-gauge/radial-gauge.component.mjs +97 -0
  126. package/esm2022/widgets/implementations/info-gauge/radial-gauge/radial-gauge.service.mjs +369 -0
  127. package/fesm2022/c8y-ngx-components-auth-configuration.mjs +9 -5
  128. package/fesm2022/c8y-ngx-components-auth-configuration.mjs.map +1 -1
  129. package/fesm2022/c8y-ngx-components-ecosystem-application-plugins.mjs +209 -142
  130. package/fesm2022/c8y-ngx-components-ecosystem-application-plugins.mjs.map +1 -1
  131. package/fesm2022/c8y-ngx-components-ecosystem-shared.mjs +96 -13
  132. package/fesm2022/c8y-ngx-components-ecosystem-shared.mjs.map +1 -1
  133. package/fesm2022/c8y-ngx-components-ecosystem.mjs +336 -186
  134. package/fesm2022/c8y-ngx-components-ecosystem.mjs.map +1 -1
  135. package/fesm2022/c8y-ngx-components-operations-bulk-operation-scheduler.mjs +7 -5
  136. package/fesm2022/c8y-ngx-components-operations-bulk-operation-scheduler.mjs.map +1 -1
  137. package/fesm2022/c8y-ngx-components-operations-bulk-operations-list.mjs +1 -1
  138. package/fesm2022/c8y-ngx-components-operations-bulk-operations-list.mjs.map +1 -1
  139. package/fesm2022/c8y-ngx-components-upgrade.mjs +3 -1
  140. package/fesm2022/c8y-ngx-components-upgrade.mjs.map +1 -1
  141. package/fesm2022/c8y-ngx-components-widgets-cockpit-exports.mjs +7 -0
  142. package/fesm2022/c8y-ngx-components-widgets-cockpit-exports.mjs.map +1 -1
  143. package/fesm2022/c8y-ngx-components-widgets-cockpit.mjs +2 -0
  144. package/fesm2022/c8y-ngx-components-widgets-cockpit.mjs.map +1 -1
  145. package/fesm2022/c8y-ngx-components-widgets-definitions-radial-gauge.mjs +40 -0
  146. package/fesm2022/c8y-ngx-components-widgets-definitions-radial-gauge.mjs.map +1 -0
  147. package/fesm2022/c8y-ngx-components-widgets-definitions.mjs +1 -0
  148. package/fesm2022/c8y-ngx-components-widgets-definitions.mjs.map +1 -1
  149. package/fesm2022/c8y-ngx-components-widgets-implementations-info-gauge.mjs +991 -28
  150. package/fesm2022/c8y-ngx-components-widgets-implementations-info-gauge.mjs.map +1 -1
  151. package/fesm2022/c8y-ngx-components.mjs +833 -550
  152. package/fesm2022/c8y-ngx-components.mjs.map +1 -1
  153. package/locales/de.po +45 -6
  154. package/locales/es.po +45 -6
  155. package/locales/fr.po +45 -6
  156. package/locales/ja_JP.po +45 -6
  157. package/locales/ko.po +45 -6
  158. package/locales/locales.pot +73 -10
  159. package/locales/nl.po +45 -6
  160. package/locales/pl.po +45 -6
  161. package/locales/pt_BR.po +45 -6
  162. package/locales/zh_CN.po +45 -6
  163. package/locales/zh_TW.po +45 -6
  164. package/operations/bulk-operation-scheduler/operation-scheduler.component.d.ts +4 -2
  165. package/operations/bulk-operation-scheduler/operation-scheduler.component.d.ts.map +1 -1
  166. package/package.json +1 -1
  167. package/upgrade/ng1/downgraded.services.d.ts +1 -0
  168. package/upgrade/ng1/downgraded.services.d.ts.map +1 -1
  169. package/upgrade/ng1/index.d.ts.map +1 -1
  170. package/widgets/cockpit/index.d.ts +29 -0
  171. package/widgets/cockpit/index.d.ts.map +1 -1
  172. package/widgets/cockpit-exports/index.d.ts +6 -0
  173. package/widgets/cockpit-exports/index.d.ts.map +1 -1
  174. package/widgets/definitions/index.d.ts +1 -0
  175. package/widgets/definitions/index.d.ts.map +1 -1
  176. package/widgets/definitions/radial-gauge/c8y-ngx-components-widgets-definitions-radial-gauge.d.ts.map +1 -0
  177. package/widgets/definitions/radial-gauge/index.d.ts +33 -0
  178. package/widgets/definitions/radial-gauge/index.d.ts.map +1 -0
  179. package/widgets/implementations/info-gauge/index.d.ts +1 -1
  180. package/widgets/implementations/info-gauge/index.d.ts.map +1 -1
  181. package/widgets/implementations/info-gauge/info-gauge-widget-config/gauge.model.d.ts +339 -0
  182. package/widgets/implementations/info-gauge/info-gauge-widget-config/gauge.model.d.ts.map +1 -0
  183. package/widgets/implementations/info-gauge/info-gauge-widget-config/info-gauge-widget-config.component.d.ts +27 -7
  184. package/widgets/implementations/info-gauge/info-gauge-widget-config/info-gauge-widget-config.component.d.ts.map +1 -1
  185. package/widgets/implementations/info-gauge/info-gauge-widget-config/preset-preview/preset-preview.component.d.ts +33 -0
  186. package/widgets/implementations/info-gauge/info-gauge-widget-config/preset-preview/preset-preview.component.d.ts.map +1 -0
  187. package/widgets/implementations/info-gauge/info-gauge-widget-view/info-gauge-widget-view.component.d.ts +7 -3
  188. package/widgets/implementations/info-gauge/info-gauge-widget-view/info-gauge-widget-view.component.d.ts.map +1 -1
  189. package/widgets/implementations/info-gauge/info-gauge-widget.module.d.ts +2 -1
  190. package/widgets/implementations/info-gauge/info-gauge-widget.module.d.ts.map +1 -1
  191. package/widgets/implementations/info-gauge/radial-gauge/radial-gauge.component.d.ts +37 -0
  192. package/widgets/implementations/info-gauge/radial-gauge/radial-gauge.component.d.ts.map +1 -0
  193. package/widgets/implementations/info-gauge/radial-gauge/radial-gauge.service.d.ts +146 -0
  194. package/widgets/implementations/info-gauge/radial-gauge/radial-gauge.service.d.ts.map +1 -0
  195. package/esm2022/widgets/implementations/info-gauge/info-gauge.model.mjs +0 -2
  196. package/widgets/implementations/info-gauge/info-gauge.model.d.ts +0 -7
  197. package/widgets/implementations/info-gauge/info-gauge.model.d.ts.map +0 -1
@@ -0,0 +1,369 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { DatePipe } from '@c8y/ngx-components';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "@c8y/ngx-components";
5
+ export class RadialGaugeService {
6
+ constructor(c8yDatePipe) {
7
+ this.c8yDatePipe = c8yDatePipe;
8
+ this.containerSize = 400;
9
+ }
10
+ setChart(chart) {
11
+ this.chart = chart;
12
+ }
13
+ getChartOptions(gaugeOptions, activeDatapointGauge, selectedPresetId, gaugeOptionsColors, rangeColors, measurement, fractionSize) {
14
+ const colorArray = this.getColorArray(activeDatapointGauge, rangeColors);
15
+ return {
16
+ series: [
17
+ {
18
+ type: 'gauge',
19
+ radius: gaugeOptions?.radius || '90%',
20
+ center: gaugeOptions?.center || ['50%', '50%'],
21
+ startAngle: gaugeOptions?.startAngle || 240,
22
+ endAngle: gaugeOptions?.endAngle || 300,
23
+ min: activeDatapointGauge?.min || 0,
24
+ max: activeDatapointGauge?.max !== undefined && activeDatapointGauge?.max !== null
25
+ ? activeDatapointGauge.max
26
+ : 100,
27
+ // Split properties
28
+ splitNumber: gaugeOptions?.splitNumber || 10,
29
+ splitLine: {
30
+ distance: gaugeOptions?.splitLineDistanceRatio
31
+ ? this.containerSize *
32
+ gaugeOptions?.axisLineWidthRatio *
33
+ gaugeOptions?.splitLineDistanceRatio
34
+ : gaugeOptions?.splitLineDistance || -30,
35
+ length: gaugeOptions?.splitLineLengthRatio
36
+ ? this.containerSize *
37
+ gaugeOptions?.axisLineWidthRatio *
38
+ gaugeOptions?.splitLineLengthRatio
39
+ : gaugeOptions?.splitLineLength || 30,
40
+ lineStyle: {
41
+ color: selectedPresetId === 'custom' || selectedPresetId === 'grade-rating'
42
+ ? gaugeOptions?.splitLineColor
43
+ : gaugeOptionsColors?.splitLineColor || '#fff',
44
+ width: gaugeOptions?.splitLineWidth || 4
45
+ }
46
+ },
47
+ // Tick properties
48
+ axisTick: {
49
+ show: gaugeOptions?.tickShow || false,
50
+ distance: gaugeOptions?.tickDistanceRatio
51
+ ? this.containerSize *
52
+ gaugeOptions?.axisLineWidthRatio *
53
+ gaugeOptions?.tickDistanceRatio
54
+ : gaugeOptions?.tickDistance || -30,
55
+ length: gaugeOptions?.tickLengthRatio
56
+ ? this.containerSize *
57
+ gaugeOptions?.axisLineWidthRatio *
58
+ gaugeOptions?.tickLengthRatio
59
+ : gaugeOptions?.tickLength || 8,
60
+ lineStyle: {
61
+ color: selectedPresetId === 'custom' || selectedPresetId === 'grade-rating'
62
+ ? gaugeOptions.tickColor
63
+ : gaugeOptionsColors?.tickColor || '#fff',
64
+ width: gaugeOptions?.tickWidth || 2
65
+ }
66
+ },
67
+ // Axis properties
68
+ axisLine: {
69
+ lineStyle: {
70
+ width: gaugeOptions?.axisLineWidthRatio
71
+ ? this.containerSize * gaugeOptions?.axisLineWidthRatio
72
+ : gaugeOptions?.axisLineWidth || 30,
73
+ color: colorArray
74
+ }
75
+ },
76
+ axisLabel: {
77
+ color: selectedPresetId === 'custom' || selectedPresetId === 'grade-rating'
78
+ ? gaugeOptions.axisLabelColor
79
+ : gaugeOptionsColors?.axisLabelColor || 'inherit',
80
+ distance: gaugeOptions?.axisLabelDistanceRatio
81
+ ? this.containerSize *
82
+ gaugeOptions?.axisLineWidthRatio *
83
+ gaugeOptions?.axisLabelDistanceRatio
84
+ : gaugeOptions?.axisLabelDistance || 40,
85
+ fontSize: gaugeOptions?.axisLabelFontSizeRatio
86
+ ? this.clampRelative(gaugeOptions?.axisLabelFontSizeRatio, gaugeOptions?.axisLabelFontSizeMin, gaugeOptions?.axisLabelFontSizeMax)
87
+ : gaugeOptions?.axisLabelFontSize || 16,
88
+ fontWeight: 'bold',
89
+ fontFamily: gaugeOptionsColors?.fontFamily
90
+ },
91
+ // pointer properties
92
+ pointer: {
93
+ ...(gaugeOptions?.pointerStyle !== 'default' && {
94
+ icon: gaugeOptions?.pointerStyle
95
+ }),
96
+ show: gaugeOptions?.showPointer || false,
97
+ length: gaugeOptions?.pointerLengthRatio
98
+ ? gaugeOptions?.pointerLengthRatio *
99
+ (this.containerSize * gaugeOptions?.axisLineWidthRatio)
100
+ : gaugeOptions?.pointerLength || '65%',
101
+ width: gaugeOptions?.pointerWidthRatio
102
+ ? this.containerSize *
103
+ gaugeOptions?.axisLineWidthRatio *
104
+ gaugeOptions?.pointerWidthRatio
105
+ : gaugeOptions?.pointerWidth || 40,
106
+ offsetCenter: selectedPresetId === 'default'
107
+ ? [0, this.containerSize * gaugeOptions?.axisLineWidthRatio * -1]
108
+ : [0, gaugeOptions?.pointerOffset || -30],
109
+ itemStyle: {
110
+ color: selectedPresetId === 'custom'
111
+ ? gaugeOptions.pointerColor
112
+ : gaugeOptionsColors?.pointerColor || 'inherit'
113
+ }
114
+ },
115
+ // Progress bar properties
116
+ progress: {
117
+ show: gaugeOptions?.progressBar || false,
118
+ roundCap: gaugeOptions?.progressBarRoundCap || false,
119
+ width: gaugeOptions?.progressBarWidthRatio
120
+ ? this.containerSize *
121
+ gaugeOptions?.axisLineWidthRatio *
122
+ gaugeOptions?.progressBarWidthRatio
123
+ : gaugeOptions?.progressBarWidth || 18,
124
+ itemStyle: {
125
+ color: selectedPresetId === 'custom'
126
+ ? gaugeOptions.progressBarColor
127
+ : gaugeOptionsColors?.progressBarColor || 'inherit'
128
+ }
129
+ },
130
+ // Anchor properties
131
+ anchor: gaugeOptions?.anchor
132
+ ? {
133
+ ...gaugeOptions.anchor,
134
+ size: gaugeOptions?.anchor?.sizeRatio
135
+ ? this.containerSize * gaugeOptions?.anchor?.sizeRatio
136
+ : gaugeOptions?.anchor?.size || 45,
137
+ itemStyle: {
138
+ color: selectedPresetId === 'custom'
139
+ ? gaugeOptions.pointerColor
140
+ : gaugeOptionsColors?.pointerColor
141
+ }
142
+ }
143
+ : undefined,
144
+ // Detail properties
145
+ detail: {
146
+ show: gaugeOptions?.showDetail || false,
147
+ valueAnimation: true,
148
+ offsetCenter: gaugeOptions?.detailOffsetCenterYRatio
149
+ ? [0, gaugeOptions?.detailOffsetCenterYRatio * this.containerSize]
150
+ : gaugeOptions?.detailOffsetCenter || [0, 0],
151
+ formatter: () => {
152
+ const value = measurement?.value.toFixed(fractionSize) || 0;
153
+ const unit = activeDatapointGauge?.unit || measurement?.unit || '';
154
+ const date = new Date(measurement?.date);
155
+ const formattedDate = this.c8yDatePipe.transform(date);
156
+ return `{value|${value}}{unit|${unit}} \n {date|${formattedDate}} `;
157
+ },
158
+ color: 'inherit',
159
+ lineHeight: gaugeOptions?.measurementValueFontRatio
160
+ ? this.clampRelative(gaugeOptions?.measurementValueFontRatio * 0.9, gaugeOptions?.measurementValueFontSizeMin, gaugeOptions?.measurementValueFontSizeMax)
161
+ : gaugeOptions?.measurementValueFontSize || 32,
162
+ rich: {
163
+ value: {
164
+ fontSize: gaugeOptions?.measurementValueFontRatio
165
+ ? this.clampRelative(fractionSize > 5 || measurement?.value > 9999
166
+ ? gaugeOptions?.measurementValueFontRatio * 0.5
167
+ : gaugeOptions?.measurementValueFontRatio, gaugeOptions?.measurementValueFontSizeMin, gaugeOptions?.measurementValueFontSizeMax)
168
+ : gaugeOptions?.measurementValueFontSize || 32,
169
+ fontWeight: 'bolder',
170
+ fontFamily: gaugeOptionsColors?.fontFamily,
171
+ color: selectedPresetId === 'custom'
172
+ ? gaugeOptions.measurementValueColor
173
+ : gaugeOptionsColors?.measurementValueColor || '#777'
174
+ },
175
+ unit: {
176
+ fontSize: gaugeOptions?.unitFontRatio
177
+ ? this.clampRelative(gaugeOptions?.unitFontRatio, gaugeOptions?.unitFontMin, gaugeOptions?.unitFontMax)
178
+ : gaugeOptions?.unitFontSize || 20,
179
+ fontFamily: gaugeOptionsColors?.fontFamily,
180
+ color: selectedPresetId === 'custom'
181
+ ? gaugeOptions?.unitColor
182
+ : gaugeOptionsColors?.unitColor || '#999'
183
+ },
184
+ date: {
185
+ fontSize: gaugeOptions?.dateFontRatio
186
+ ? this.clampRelative(gaugeOptions?.dateFontRatio, gaugeOptions?.dateFontSizeMin, gaugeOptions?.dateFontSizeMax)
187
+ : gaugeOptions?.dateFontSize || 12,
188
+ fontFamily: gaugeOptionsColors?.fontFamily,
189
+ color: selectedPresetId === 'custom'
190
+ ? gaugeOptions?.dateColor
191
+ : gaugeOptionsColors?.dateColor || '#555'
192
+ }
193
+ }
194
+ },
195
+ markPoint: {
196
+ symbolSize: 0,
197
+ offsetCenter: gaugeOptions?.detailOffsetCenter || [0, 0],
198
+ data: [
199
+ {
200
+ x: '50%',
201
+ y: '50%',
202
+ label: {
203
+ show: gaugeOptions?.showMarkPoint,
204
+ formatter: () => {
205
+ const value = measurement?.value.toFixed(fractionSize) || 0;
206
+ const unit = activeDatapointGauge?.unit || measurement?.unit || '';
207
+ const date = new Date(measurement?.date);
208
+ const formattedDate = this.c8yDatePipe.transform(date);
209
+ return `{value|${value}}{unit|${unit}} \n {date|${formattedDate}} `;
210
+ },
211
+ color: '#fff',
212
+ align: 'center',
213
+ rich: {
214
+ value: {
215
+ fontSize: gaugeOptions?.measurementValueFontRatio
216
+ ? this.clampRelative(fractionSize > 5
217
+ ? gaugeOptions?.measurementValueFontRatio * 0.5
218
+ : gaugeOptions?.measurementValueFontRatio, fractionSize > 5
219
+ ? gaugeOptions.measurementValueFontMin * 0.5
220
+ : gaugeOptions?.measurementValueFontSizeMin, gaugeOptions?.measurementValueFontSizeMax)
221
+ : gaugeOptions?.measurementValueFontSize || 32,
222
+ fontFamily: gaugeOptionsColors?.fontFamily,
223
+ fontWeight: 'bolder',
224
+ color: gaugeOptionsColors?.knobFontColor || '#777'
225
+ },
226
+ unit: {
227
+ fontSize: gaugeOptions?.unitFontRatio
228
+ ? this.clampRelative(gaugeOptions?.unitFontRatio, gaugeOptions?.unitFontSizeMin, gaugeOptions?.unitFontSizeMax)
229
+ : gaugeOptions?.unitFontSize || 20,
230
+ fontFamily: gaugeOptionsColors?.fontFamily,
231
+ color: gaugeOptionsColors?.knobFontColor || '#999'
232
+ },
233
+ date: {
234
+ fontSize: gaugeOptions?.dateFontRatio
235
+ ? this.clampRelative(gaugeOptions?.dateFontRatio, gaugeOptions?.dateFontSizeMin, gaugeOptions?.dateFontSizeMax)
236
+ : gaugeOptions?.dateFontSize || 12,
237
+ fontFamily: gaugeOptionsColors?.fontFamily,
238
+ color: gaugeOptionsColors?.knobFontColor || '#555'
239
+ }
240
+ }
241
+ }
242
+ }
243
+ ]
244
+ },
245
+ data: [
246
+ {
247
+ value: 0 || measurement?.value
248
+ }
249
+ ]
250
+ }
251
+ ]
252
+ };
253
+ }
254
+ updateRangeColors() {
255
+ if (!this.chart) {
256
+ return;
257
+ }
258
+ return {
259
+ default: getComputedStyle(this.chart.nativeElement).getPropertyValue('--c8y-form-control-border-color-default'),
260
+ yellow: getComputedStyle(this.chart.nativeElement).getPropertyValue('--c8y-palette-status-warning'),
261
+ red: getComputedStyle(this.chart.nativeElement).getPropertyValue('--c8y-palette-status-danger')
262
+ };
263
+ }
264
+ updateGaugeOptionsColors() {
265
+ if (!this.chart) {
266
+ return;
267
+ }
268
+ return {
269
+ splitLineColor: getComputedStyle(this.chart.nativeElement).getPropertyValue('--c8y-root-component-background-default'),
270
+ tickColor: getComputedStyle(this.chart.nativeElement).getPropertyValue('--c8y-root-component-background-default'),
271
+ axisLabelColor: getComputedStyle(this.chart.nativeElement).getPropertyValue('--c8y-root-component-color-default'),
272
+ pointerColor: getComputedStyle(this.chart.nativeElement).getPropertyValue('--c8y-root-component-color-default'),
273
+ knobColor: getComputedStyle(this.chart.nativeElement).getPropertyValue('--c8y-root-component-color-default'),
274
+ knobFontColor: getComputedStyle(this.chart.nativeElement).getPropertyValue('--c8y-root-component-background-default'),
275
+ measurementValueColor: getComputedStyle(this.chart.nativeElement).getPropertyValue('--c8y-root-component-color-default'),
276
+ unitColor: getComputedStyle(this.chart.nativeElement).getPropertyValue('--c8y-root-component-color-default'),
277
+ dateColor: getComputedStyle(this.chart.nativeElement).getPropertyValue('--c8y-root-component-text-muted'),
278
+ progressBarColor: getComputedStyle(this.chart.nativeElement).getPropertyValue('--c8y-root-component-brand-primary'),
279
+ fontFamily: getComputedStyle(document.body).getPropertyValue('font-family')
280
+ };
281
+ }
282
+ getColorArray(activeDatapointGauge, rangeColors) {
283
+ const min = activeDatapointGauge?.min ?? 0;
284
+ const max = activeDatapointGauge?.max ?? 100;
285
+ const range = max - min;
286
+ const yellowMin = activeDatapointGauge?.yellowRangeMin;
287
+ const yellowMax = activeDatapointGauge?.yellowRangeMax;
288
+ const redMin = activeDatapointGauge?.redRangeMin;
289
+ const redMax = activeDatapointGauge?.redRangeMax;
290
+ const ranges = [];
291
+ // First add red range
292
+ if (redMin != null && redMax != null && redMin < redMax) {
293
+ ranges.push({ start: redMin, end: redMax, color: rangeColors.red });
294
+ }
295
+ // Then add yellow, but clip out any overlap with red
296
+ if (yellowMin != null && yellowMax != null && yellowMin < yellowMax) {
297
+ const redRange = ranges.find(r => r.color === rangeColors.red);
298
+ if (!redRange ||
299
+ yellowMax <= redRange.start || // yellow ends before red
300
+ yellowMin >= redRange.end // yellow starts after red
301
+ ) {
302
+ // no overlap
303
+ ranges.push({ start: yellowMin, end: yellowMax, color: rangeColors.yellow });
304
+ }
305
+ else {
306
+ // partial overlap – split yellow into non-overlapping parts
307
+ if (yellowMin < redRange.start) {
308
+ ranges.push({
309
+ start: yellowMin,
310
+ end: Math.min(yellowMax, redRange.start),
311
+ color: rangeColors.yellow
312
+ });
313
+ }
314
+ if (yellowMax > redRange.end) {
315
+ ranges.push({
316
+ start: Math.max(yellowMin, redRange.end),
317
+ end: yellowMax,
318
+ color: rangeColors.yellow
319
+ });
320
+ }
321
+ }
322
+ }
323
+ // Sort by start position
324
+ ranges.sort((a, b) => a.start - b.start);
325
+ // Build segments
326
+ const segments = [];
327
+ let current = min;
328
+ for (const { start, end, color } of ranges) {
329
+ if (start > current) {
330
+ // Default fill before this range
331
+ segments.push([(start - min) / range, rangeColors.default]);
332
+ }
333
+ // Start color
334
+ segments.push([(start - min) / range, color]);
335
+ // End color
336
+ segments.push([(end - min) / range, color]);
337
+ current = Math.max(current, end);
338
+ }
339
+ // Fill remaining with default
340
+ if (current < max) {
341
+ segments.push([(current - min) / range, rangeColors.default]);
342
+ }
343
+ if (segments.length === 0 || segments[segments.length - 1][0] < 1) {
344
+ segments.push([1, rangeColors.default]);
345
+ }
346
+ return segments;
347
+ }
348
+ clampRelative(ratio, min, max) {
349
+ const clampedValue = this.containerSize * ratio;
350
+ if (clampedValue < min) {
351
+ return min;
352
+ }
353
+ else if (clampedValue > max) {
354
+ return max;
355
+ }
356
+ else {
357
+ return clampedValue;
358
+ }
359
+ }
360
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RadialGaugeService, deps: [{ token: i1.DatePipe }], target: i0.ɵɵFactoryTarget.Injectable }); }
361
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RadialGaugeService, providedIn: 'root' }); }
362
+ }
363
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RadialGaugeService, decorators: [{
364
+ type: Injectable,
365
+ args: [{
366
+ providedIn: 'root'
367
+ }]
368
+ }], ctorParameters: () => [{ type: i1.DatePipe }] });
369
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFkaWFsLWdhdWdlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi93aWRnZXRzL2ltcGxlbWVudGF0aW9ucy9pbmZvLWdhdWdlL3JhZGlhbC1nYXVnZS9yYWRpYWwtZ2F1Z2Uuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWMsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBSXZELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7O0FBSy9DLE1BQU0sT0FBTyxrQkFBa0I7SUFJN0IsWUFBb0IsV0FBcUI7UUFBckIsZ0JBQVcsR0FBWCxXQUFXLENBQVU7UUFGekMsa0JBQWEsR0FBRyxHQUFHLENBQUM7SUFFd0IsQ0FBQztJQUU3QyxRQUFRLENBQUMsS0FBaUI7UUFDeEIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7SUFDckIsQ0FBQztJQUVELGVBQWUsQ0FDYixZQUEwQixFQUMxQixvQkFBZ0MsRUFDaEMsZ0JBQXdCLEVBQ3hCLGtCQUFzQyxFQUN0QyxXQUE2RCxFQUM3RCxXQUE4QixFQUM5QixZQUFvQjtRQUVwQixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLG9CQUFvQixFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBRXpFLE9BQU87WUFDTCxNQUFNLEVBQUU7Z0JBQ047b0JBQ0UsSUFBSSxFQUFFLE9BQU87b0JBQ2IsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLElBQUksS0FBSztvQkFDckMsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDO29CQUM5QyxVQUFVLEVBQUUsWUFBWSxFQUFFLFVBQVUsSUFBSSxHQUFHO29CQUMzQyxRQUFRLEVBQUUsWUFBWSxFQUFFLFFBQVEsSUFBSSxHQUFHO29CQUN2QyxHQUFHLEVBQUUsb0JBQW9CLEVBQUUsR0FBRyxJQUFJLENBQUM7b0JB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QUcsQ0FBQztRQUNiLENBQUM7YUFBTSxJQUFJLFlBQVksR0FBRyxHQUFHLEVBQUUsQ0FBQztZQUM5QixPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxZQUFZLENBQUM7UUFDdEIsQ0FBQztJQUNILENBQUM7K0dBbGRVLGtCQUFrQjttSEFBbEIsa0JBQWtCLGNBRmpCLE1BQU07OzRGQUVQLGtCQUFrQjtrQkFIOUIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbGVtZW50UmVmLCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBLUElEZXRhaWxzIH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cy9kYXRhcG9pbnQtc2VsZWN0b3InO1xuaW1wb3J0IHsgR2F1Z2VPcHRpb25zLCBHYXVnZU9wdGlvbnNDb2xvcnMgfSBmcm9tICcuLi9pbmZvLWdhdWdlLXdpZGdldC1jb25maWcvZ2F1Z2UubW9kZWwnO1xuaW1wb3J0IHsgSU1lYXN1cmVtZW50VmFsdWUgfSBmcm9tICdAYzh5L2NsaWVudCc7XG5pbXBvcnQgeyBEYXRlUGlwZSB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBSYWRpYWxHYXVnZVNlcnZpY2Uge1xuICBwcml2YXRlIGNoYXJ0OiBFbGVtZW50UmVmO1xuICBjb250YWluZXJTaXplID0gNDAwO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgYzh5RGF0ZVBpcGU6IERhdGVQaXBlKSB7fVxuXG4gIHNldENoYXJ0KGNoYXJ0OiBFbGVtZW50UmVmKTogdm9pZCB7XG4gICAgdGhpcy5jaGFydCA9IGNoYXJ0O1xuICB9XG5cbiAgZ2V0Q2hhcnRPcHRpb25zKFxuICAgIGdhdWdlT3B0aW9uczogR2F1Z2VPcHRpb25zLFxuICAgIGFjdGl2ZURhdGFwb2ludEdhdWdlOiBLUElEZXRhaWxzLFxuICAgIHNlbGVjdGVkUHJlc2V0SWQ6IHN0cmluZyxcbiAgICBnYXVnZU9wdGlvbnNDb2xvcnM6IEdhdWdlT3B0aW9uc0NvbG9ycyxcbiAgICByYW5nZUNvbG9yczogeyBkZWZhdWx0OiBzdHJpbmc7IHllbGxvdzogc3RyaW5nOyByZWQ6IHN0cmluZyB9LFxuICAgIG1lYXN1cmVtZW50OiBJTWVhc3VyZW1lbnRWYWx1ZSxcbiAgICBmcmFjdGlvblNpemU6IG51bWJlclxuICApIHtcbiAgICBjb25zdCBjb2xvckFycmF5ID0gdGhpcy5nZXRDb2xvckFycmF5KGFjdGl2ZURhdGFwb2ludEdhdWdlLCByYW5nZUNvbG9ycyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgc2VyaWVzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnZ2F1Z2UnLFxuICAgICAgICAgIHJhZGl1czogZ2F1Z2VPcHRpb25zPy5yYWRpdXMgfHwgJzkwJScsXG4gICAgICAgICAgY2VudGVyOiBnYXVnZU9wdGlvbnM/LmNlbnRlciB8fCBbJzUwJScsICc1MCUnXSxcbiAgICAgICAgICBzdGFydEFuZ2xlOiBnYXVnZU9wdGlvbnM/LnN0YXJ0QW5nbGUgfHwgMjQwLFxuICAgICAgICAgIGVuZEFuZ2xlOiBnYXVnZU9wdGlvbnM/LmVuZEFuZ2xlIHx8IDMwMCxcbiAgICAgICAgICBtaW46IGFjdGl2ZURhdGFwb2ludEdhdWdlPy5taW4gfHwgMCxcbiAgICAgICAgICBtYXg6XG4gICAgICAgICAgICBhY3RpdmVEYXRhcG9pbnRHYXVnZT8ubWF4ICE9PSB1bmRlZmluZWQgJiYgYWN0aXZlRGF0YXBvaW50R2F1Z2U/Lm1heCAhPT0gbnVsbFxuICAgICAgICAgICAgICA/IGFjdGl2ZURhdGFwb2ludEdhdWdlLm1heFxuICAgICAgICAgICAgICA6IDEwMCxcblxuICAgICAgICAgIC8vIFNwbGl0IHByb3BlcnRpZXNcbiAgICAgICAgICBzcGxpdE51bWJlcjogZ2F1Z2VPcHRpb25zPy5zcGxpdE51bWJlciB8fCAxMCxcbiAgICAgICAgICBzcGxpdExpbmU6IHtcbiAgICAgICAgICAgIGRpc3RhbmNlOiBnYXVnZU9wdGlvbnM/LnNwbGl0TGluZURpc3RhbmNlUmF0aW9cbiAgICAgICAgICAgICAgPyB0aGlzLmNvbnRhaW5lclNpemUgKlxuICAgICAgICAgICAgICAgIGdhdWdlT3B0aW9ucz8uYXhpc0xpbmVXaWR0aFJhdGlvICpcbiAgICAgICAgICAgICAgICBnYXVnZU9wdGlvbnM/LnNwbGl0TGluZURpc3RhbmNlUmF0aW9cbiAgICAgICAgICAgICAgOiBnYXVnZU9wdGlvbnM/LnNwbGl0TGluZURpc3RhbmNlIHx8IC0zMCxcblxuICAgICAgICAgICAgbGVuZ3RoOiBnYXVnZU9wdGlvbnM/LnNwbGl0TGluZUxlbmd0aFJhdGlvXG4gICAgICAgICAgICAgID8gdGhpcy5jb250YWluZXJTaXplICpcbiAgICAgICAgICAgICAgICBnYXVnZU9wdGlvbnM/LmF4aXNMaW5lV2lkdGhSYXRpbyAqXG4gICAgICAgICAgICAgICAgZ2F1Z2VPcHRpb25zPy5zcGxpdExpbmVMZW5ndGhSYXRpb1xuICAgICAgICAgICAgICA6IGdhdWdlT3B0aW9ucz8uc3BsaXRMaW5lTGVuZ3RoIHx8IDMwLFxuXG4gICAgICAgICAgICBsaW5lU3R5bGU6IHtcbiAgICAgICAgICAgICAgY29sb3I6XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRQcmVzZXRJZCA9PT0gJ2N1c3RvbScgfHwgc2VsZWN0ZWRQcmVzZXRJZCA9PT0gJ2dyYWRlLXJhdGluZydcbiAgICAgICAgICAgICAgICAgID8gZ2F1Z2VPcHRpb25zPy5zcGxpdExpbmVDb2xvclxuICAgICAgICAgICAgICAgICAgOiBnYXVnZU9wdGlvbnNDb2xvcnM/LnNwbGl0TGluZUNvbG9yIHx8ICcjZmZmJyxcbiAgICAgICAgICAgICAgd2lkdGg6IGdhdWdlT3B0aW9ucz8uc3BsaXRMaW5lV2lkdGggfHwgNFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG5cbiAgICAgICAgICAvLyBUaWNrIHByb3BlcnRpZXNcbiAgICAgICAgICBheGlzVGljazoge1xuICAgICAgICAgICAgc2hvdzogZ2F1Z2VPcHRpb25zPy50aWNrU2hvdyB8fCBmYWxzZSxcbiAgICAgICAgICAgIGRpc3RhbmNlOiBnYXVnZU9wdGlvbnM/LnRpY2tEaXN0YW5jZVJhdGlvXG4gICAgICAgICAgICAgID8gdGhpcy5jb250YWluZXJTaXplICpcbiAgICAgICAgICAgICAgICBnYXVnZU9wdGlvbnM/LmF4aXNMaW5lV2lkdGhSYXRpbyAqXG4gICAgICAgICAgICAgICAgZ2F1Z2VPcHRpb25zPy50aWNrRGlzdGFuY2VSYXRpb1xuICAgICAgICAgICAgICA6IGdhdWdlT3B0aW9ucz8udGlja0Rpc3RhbmNlIHx8IC0zMCxcbiAgICAgICAgICAgIGxlbmd0aDogZ2F1Z2VPcHRpb25zPy50aWNrTGVuZ3RoUmF0aW9cbiAgICAgICAgICAgICAgPyB0aGlzLmNvbnRhaW5lclNpemUgKlxuICAgICAgICAgICAgICAgIGdhdWdlT3B0aW9ucz8uYXhpc0xpbmVXaWR0aFJhdGlvICpcbiAgICAgICAgICAgICAgICBnYXVnZU9wdGlvbnM/LnRpY2tMZW5ndGhSYXRpb1xuICAgICAgICAgICAgICA6IGdhdWdlT3B0aW9ucz8udGlja0xlbmd0aCB8fCA4LFxuICAgICAgICAgICAgbGluZVN0eWxlOiB7XG4gICAgICAgICAgICAgIGNvbG9yOlxuICAgICAgICAgICAgICAgIHNlbGVjdGVkUHJlc2V0SWQgPT09ICdjdXN0b20nIHx8IHNlbGVjdGVkUHJlc2V0SWQgPT09ICdncmFkZS1yYXRpbmcnXG4gICAgICAgICAgICAgICAgICA/IGdhdWdlT3B0aW9ucy50aWNrQ29sb3JcbiAgICAgICAgICAgICAgICAgIDogZ2F1Z2VPcHRpb25zQ29sb3JzPy50aWNrQ29sb3IgfHwgJyNmZmYnLFxuICAgICAgICAgICAgICB3aWR0aDogZ2F1Z2VPcHRpb25zPy50aWNrV2lkdGggfHwgMlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG5cbiAgICAgICAgICAvLyBBeGlzIHByb3BlcnRpZXNcbiAgICAgICAgICBheGlzTGluZToge1xuICAgICAgICAgICAgbGluZVN0eWxlOiB7XG4gICAgICAgICAgICAgIHdpZHRoOiBnYXVnZU9wdGlvbnM/LmF4aXNMaW5lV2lkdGhSYXRpb1xuICAgICAgICAgICAgICAgID8gdGhpcy5jb250YWluZXJTaXplICogZ2F1Z2VPcHRpb25zPy5heGlzTGluZVdpZHRoUmF0aW9cbiAgICAgICAgICAgICAgICA6IGdhdWdlT3B0aW9ucz8uYXhpc0xpbmVXaWR0aCB8fCAzMCxcbiAgICAgICAgICAgICAgY29sb3I6IGNvbG9yQXJyYXlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgYXhpc0xhYmVsOiB7XG4gICAgICAgICAgICBjb2xvcjpcbiAgICAgICAgICAgICAgc2VsZWN0ZWRQcmVzZXRJZCA9PT0gJ2N1c3RvbScgfHwgc2VsZWN0ZWRQcmVzZXRJZCA9PT0gJ2dyYWRlLXJhdGluZydcbiAgICAgICAgICAgICAgICA/IGdhdWdlT3B0aW9ucy5heGlzTGFiZWxDb2xvclxuICAgICAgICAgICAgICAgIDogZ2F1Z2VPcHRpb25zQ29sb3JzPy5heGlzTGFiZWxDb2xvciB8fCAnaW5oZXJpdCcsXG4gICAgICAgICAgICBkaXN0YW5jZTogZ2F1Z2VPcHRpb25zPy5heGlzTGFiZWxEaXN0YW5jZVJhdGlvXG4gICAgICAgICAgICAgID8gdGhpcy5jb250YWluZXJTaXplICpcbiAgICAgICAgICAgICAgICBnYXVnZU9wdGlvbnM/LmF4aXNMaW5lV2lkdGhSYXRpbyAqXG4gICAgICAgICAgICAgICAgZ2F1Z2VPcHRpb25zPy5heGlzTGFiZWxEaXN0YW5jZVJhdGlvXG4gICAgICAgICAgICAgIDogZ2F1Z2VPcHRpb25zPy5heGlzTGFiZWxEaXN0YW5jZSB8fCA0MCxcbiAgICAgICAgICAgIGZvbnRTaXplOiBnYXVnZU9wdGlvbnM/LmF4aXNMYWJlbEZvbnRTaXplUmF0aW9cbiAgICAgICAgICAgICAgPyB0aGlzLmNsYW1wUmVsYXRpdmUoXG4gICAgICAgICAgICAgICAgICBnYXVnZU9wdGlvbnM/LmF4aXNMYWJlbEZvbnRTaXplUmF0aW8sXG4gICAgICAgICAgICAgICAgICBnYXVnZU9wdGlvbnM/LmF4aXNMYWJlbEZvbnRTaXplTWluLFxuICAgICAgICAgICAgICAgICAgZ2F1Z2VPcHRpb25zPy5heGlzTGFiZWxGb250U2l6ZU1heFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgOiBnYXVnZU9wdGlvbnM/LmF4aXNMYWJlbEZvbnRTaXplIHx8IDE2LFxuICAgICAgICAgICAgZm9udFdlaWdodDogJ2JvbGQnLFxuICAgICAgICAgICAgZm9udEZhbWlseTogZ2F1Z2VPcHRpb25zQ29sb3JzPy5mb250RmFtaWx5XG4gICAgICAgICAgfSxcblxuICAgICAgICAgIC8vIHBvaW50ZXIgcHJvcGVydGllc1xuICAgICAgICAgIHBvaW50ZXI6IHtcbiAgICAgICAgICAgIC4uLihnYXVnZU9wdGlvbnM/LnBvaW50ZXJTdHlsZSAhPT0gJ2RlZmF1bHQnICYmIHtcbiAgICAgICAgICAgICAgaWNvbjogZ2F1Z2VPcHRpb25zPy5wb2ludGVyU3R5bGVcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgc2hvdzogZ2F1Z2VPcHRpb25zPy5zaG93UG9pbnRlciB8fCBmYWxzZSxcbiAgICAgICAgICAgIGxlbmd0aDogZ2F1Z2VPcHRpb25zPy5wb2ludGVyTGVuZ3RoUmF0aW9cbiAgICAgICAgICAgICAgPyBnYXVnZU9wdGlvbnM/LnBvaW50ZXJMZW5ndGhSYXRpbyAqXG4gICAgICAgICAgICAgICAgKHRoaXMuY29udGFpbmVyU2l6ZSAqIGdhdWdlT3B0aW9ucz8uYXhpc0xpbmVXaWR0aFJhdGlvKVxuICAgICAgICAgICAgICA6IGdhdWdlT3B0aW9ucz8ucG9pbnRlckxlbmd0aCB8fCAnNjUlJyxcbiAgICAgICAgICAgIHdpZHRoOiBnYXVnZU9wdGlvbnM/LnBvaW50ZXJXaWR0aFJhdGlvXG4gICAgICAgICAgICAgID8gdGhpcy5jb250YWluZXJTaXplICpcbiAgICAgICAgICAgICAgICBnYXVnZU9wdGlvbnM/LmF4aXNMaW5lV2lkdGhSYXRpbyAqXG4gICAgICAgICAgICAgICAgZ2F1Z2VPcHRpb25zPy5wb2ludGVyV2lkdGhSYXRpb1xuICAgICAgICAgICAgICA6IGdhdWdlT3B0aW9ucz8ucG9pbnRlcldpZHRoIHx8IDQwLFxuICAgICAgICAgICAgb2Zmc2V0Q2VudGVyOlxuICAgICAgICAgICAgICBzZWxlY3RlZFByZXNldElkID09PSAnZGVmYXVsdCdcbiAgICAgICAgICAgICAgICA/IFswLCB0aGlzLmNvbnRhaW5lclNpemUgKiBnYXVnZU9wdGlvbnM/LmF4aXNMaW5lV2lkdGhSYXRpbyAqIC0xXVxuICAgICAgICAgICAgICAgIDogWzAsIGdhdWdlT3B0aW9ucz8ucG9pbnRlck9mZnNldCB8fCAtMzBdLFxuICAgICAgICAgICAgaXRlbVN0eWxlOiB7XG4gICAgICAgICAgICAgIGNvbG9yOlxuICAgICAgICAgICAgICAgIHNlbGVjdGVkUHJlc2V0SWQgPT09ICdjdXN0b20nXG4gICAgICAgICAgICAgICAgICA/IGdhdWdlT3B0aW9ucy5wb2ludGVyQ29sb3JcbiAgICAgICAgICAgICAgICAgIDogZ2F1Z2VPcHRpb25zQ29sb3JzPy5wb2ludGVyQ29sb3IgfHwgJ2luaGVyaXQnXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcblxuICAgICAgICAgIC8vIFByb2dyZXNzIGJhciBwcm9wZXJ0aWVzXG4gICAgICAgICAgcHJvZ3Jlc3M6IHtcbiAgICAgICAgICAgIHNob3c6IGdhdWdlT3B0aW9ucz8ucHJvZ3Jlc3NCYXIgfHwgZmFsc2UsXG4gICAgICAgICAgICByb3VuZENhcDogZ2F1Z2VPcHRpb25zPy5wcm9ncmVzc0JhclJvdW5kQ2FwIHx8IGZhbHNlLFxuICAgICAgICAgICAgd2lkdGg6IGdhdWdlT3B0aW9ucz8ucHJvZ3Jlc3NCYXJXaWR0aFJhdGlvXG4gICAgICAgICAgICAgID8gdGhpcy5jb250YWluZXJTaXplICpcbiAgICAgICAgICAgICAgICBnYXVnZU9wdGlvbnM/LmF4aXNMaW5lV2lkdGhSYXRpbyAqXG4gICAgICAgICAgICAgICAgZ2F1Z2VPcHRpb25zPy5wcm9ncmVzc0JhcldpZHRoUmF0aW9cbiAgICAgICAgICAgICAgOiBnYXVnZU9wdGlvbnM/LnByb2dyZXNzQmFyV2lkdGggfHwgMTgsXG4gICAgICAgICAgICBpdGVtU3R5bGU6IHtcbiAgICAgICAgICAgICAgY29sb3I6XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRQcmVzZXRJZCA9PT0gJ2N1c3RvbSdcbiAgICAgICAgICAgICAgICAgID8gZ2F1Z2VPcHRpb25zLnByb2dyZXNzQmFyQ29sb3JcbiAgICAgICAgICAgICAgICAgIDogZ2F1Z2VPcHRpb25zQ29sb3JzPy5wcm9ncmVzc0JhckNvbG9yIHx8ICdpbmhlcml0J1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG5cbiAgICAgICAgICAvLyBBbmNob3IgcHJvcGVydGllc1xuICAgICAgICAgIGFuY2hvcjogZ2F1Z2VPcHRpb25zPy5hbmNob3JcbiAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgIC4uLmdhdWdlT3B0aW9ucy5hbmNob3IsXG4gICAgICAgICAgICAgICAgc2l6ZTogZ2F1Z2VPcHRpb25zPy5hbmNob3I/LnNpemVSYXRpb1xuICAgICAgICAgICAgICAgICAgPyB0aGlzLmNvbnRhaW5lclNpemUgKiBnYXVnZU9wdGlvbnM/LmFuY2hvcj8uc2l6ZVJhdGlvXG4gICAgICAgICAgICAgICAgICA6IGdhdWdlT3B0aW9ucz8uYW5jaG9yPy5zaXplIHx8IDQ1LFxuICAgICAgICAgICAgICAgIGl0ZW1TdHlsZToge1xuICAgICAgICAgICAgICAgICAgY29sb3I6XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkUHJlc2V0SWQgPT09ICdjdXN0b20nXG4gICAgICAgICAgICAgICAgICAgICAgPyBnYXVnZU9wdGlvbnMucG9pbnRlckNvbG9yXG4gICAgICAgICAgICAgICAgICAgICAgOiBnYXVnZU9wdGlvbnNDb2xvcnM/LnBvaW50ZXJDb2xvclxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiB1bmRlZmluZWQsXG5cbiAgICAgICAgICAvLyBEZXRhaWwgcHJvcGVydGllc1xuICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgc2hvdzogZ2F1Z2VPcHRpb25zPy5zaG93RGV0YWlsIHx8IGZhbHNlLFxuICAgICAgICAgICAgdmFsdWVBbmltYXRpb246IHRydWUsXG4gICAgICAgICAgICBvZmZzZXRDZW50ZXI6IGdhdWdlT3B0aW9ucz8uZGV0YWlsT2Zmc2V0Q2VudGVyWVJhdGlvXG4gICAgICAgICAgICAgID8gWzAsIGdhdWdlT3B0aW9ucz8uZGV0YWlsT2Zmc2V0Q2VudGVyWVJhdGlvICogdGhpcy5jb250YWluZXJTaXplXVxuICAgICAgICAgICAgICA6IGdhdWdlT3B0aW9ucz8uZGV0YWlsT2Zmc2V0Q2VudGVyIHx8IFswLCAwXSxcblxuICAgICAgICAgICAgZm9ybWF0dGVyOiAoKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gbWVhc3VyZW1lbnQ/LnZhbHVlLnRvRml4ZWQoZnJhY3Rpb25TaXplKSB8fCAwO1xuICAgICAgICAgICAgICBjb25zdCB1bml0ID0gYWN0aXZlRGF0YXBvaW50R2F1Z2U/LnVuaXQgfHwgbWVhc3VyZW1lbnQ/LnVuaXQgfHwgJyc7XG4gICAgICAgICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShtZWFzdXJlbWVudD8uZGF0ZSk7XG4gICAgICAgICAgICAgIGNvbnN0IGZvcm1hdHRlZERhdGUgPSB0aGlzLmM4eURhdGVQaXBlLnRyYW5zZm9ybShkYXRlKTtcbiAgICAgICAgICAgICAgcmV0dXJuIGB7dmFsdWV8JHt2YWx1ZX19e3VuaXR8JHt1bml0fX0gXFxuIHtkYXRlfCR7Zm9ybWF0dGVkRGF0ZX19IGA7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29sb3I6ICdpbmhlcml0JyxcbiAgICAgICAgICAgIGxpbmVIZWlnaHQ6IGdhdWdlT3B0aW9ucz8ubWVhc3VyZW1lbnRWYWx1ZUZvbnRSYXRpb1xuICAgICAgICAgICAgICA/IHRoaXMuY2xhbXBSZWxhdGl2ZShcbiAgICAgICAgICAgICAgICAgIGdhdWdlT3B0aW9ucz8ubWVhc3VyZW1lbnRWYWx1ZUZvbnRSYXRpbyAqIDAuOSxcbiAgICAgICAgICAgICAgICAgIGdhdWdlT3B0aW9ucz8ubWVhc3VyZW1lbnRWYWx1ZUZvbnRTaXplTWluLFxuICAgICAgICAgICAgICAgICAgZ2F1Z2VPcHRpb25zPy5tZWFzdXJlbWVudFZhbHVlRm9udFNpemVNYXhcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIDogZ2F1Z2VPcHRpb25zPy5tZWFzdXJlbWVudFZhbHVlRm9udFNpemUgfHwgMzIsXG4gICAgICAgICAgICByaWNoOiB7XG4gICAgICAgICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgICAgICAgZm9udFNpemU6IGdhdWdlT3B0aW9ucz8ubWVhc3VyZW1lbnRWYWx1ZUZvbnRSYXRpb1xuICAgICAgICAgICAgICAgICAgPyB0aGlzLmNsYW1wUmVsYXRpdmUoXG4gICAgICAgICAgICAgICAgICAgICAgZnJhY3Rpb25TaXplID4gNSB8fCBtZWFzdXJlbWVudD8udmFsdWUgPiA5OTk5XG4gICAgICAgICAgICAgICAgICAgICAgICA/IGdhdWdlT3B0aW9ucz8ubWVhc3VyZW1lbnRWYWx1ZUZvbnRSYXRpbyAqIDAuNVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBnYXVnZU9wdGlvbnM/Lm1lYXN1cmVtZW50VmFsdWVGb250UmF0aW8sXG4gICAgICAgICAgICAgICAgICAgICAgZ2F1Z2VPcHRpb25zPy5tZWFzdXJlbWVudFZhbHVlRm9udFNpemVNaW4sXG4gICAgICAgICAgICAgICAgICAgICAgZ2F1Z2VPcHRpb25zPy5tZWFzdXJlbWVudFZhbHVlRm9udFNpemVNYXhcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgOiBnYXVnZU9wdGlvbnM/Lm1lYXN1cmVtZW50VmFsdWVGb250U2l6ZSB8fCAzMixcbiAgICAgICAgICAgICAgICBmb250V2VpZ2h0OiAnYm9sZGVyJyxcbiAgICAgICAgICAgICAgICBmb250RmFtaWx5OiBnYXVnZU9wdGlvbnNDb2xvcnM/LmZvbnRGYW1pbHksXG4gICAgICAgICAgICAgICAgY29sb3I6XG4gICAgICAgICAgICAgICAgICBzZWxlY3RlZFByZXNldElkID09PSAnY3VzdG9tJ1xuICAgICAgICAgICAgICAgICAgICA/IGdhdWdlT3B0aW9ucy5tZWFzdXJlbWVudFZhbHVlQ29sb3JcbiAgICAgICAgICAgICAgICAgICAgOiBnYXVnZU9wdGlvbnNDb2xvcnM/Lm1lYXN1cmVtZW50VmFsdWVDb2xvciB8fCAnIzc3NydcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgdW5pdDoge1xuICAgICAgICAgICAgICAgIGZvbnRTaXplOiBnYXVnZU9wdGlvbnM/LnVuaXRGb250UmF0aW9cbiAgICAgICAgICAgICAgICAgID8gdGhpcy5jbGFtcFJlbGF0aXZlKFxuICAgICAgICAgICAgICAgICAgICAgIGdhdWdlT3B0aW9ucz8udW5pdEZvbnRSYXRpbyxcbiAgICAgICAgICAgICAgICAgICAgICBnYXVnZU9wdGlvbnM/LnVuaXRGb250TWluLFxuICAgICAgICAgICAgICAgICAgICAgIGdhdWdlT3B0aW9ucz8udW5pdEZvbnRNYXhcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgOiBnYXVnZU9wdGlvbnM/LnVuaXRGb250U2l6ZSB8fCAyMCxcbiAgICAgICAgICAgICAgICBmb250RmFtaWx5OiBnYXVnZU9wdGlvbnNDb2xvcnM/LmZvbnRGYW1pbHksXG4gICAgICAgICAgICAgICAgY29sb3I6XG4gICAgICAgICAgICAgICAgICBzZWxlY3RlZFByZXNldElkID09PSAnY3VzdG9tJ1xuICAgICAgICAgICAgICAgICAgICA/IGdhdWdlT3B0aW9ucz8udW5pdENvbG9yXG4gICAgICAgICAgICAgICAgICAgIDogZ2F1Z2VPcHRpb25zQ29sb3JzPy51bml0Q29sb3IgfHwgJyM5OTknXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGRhdGU6IHtcbiAgICAgICAgICAgICAgICBmb250U2l6ZTogZ2F1Z2VPcHRpb25zPy5kYXRlRm9udFJhdGlvXG4gICAgICAgICAgICAgICAgICA/IHRoaXMuY2xhbXBSZWxhdGl2ZShcbiAgICAgICAgICAgICAgICAgICAgICBnYXVnZU9wdGlvbnM/LmRhdGVGb250UmF0aW8sXG4gICAgICAgICAgICAgICAgICAgICAgZ2F1Z2VPcHRpb25zPy5kYXRlRm9udFNpemVNaW4sXG4gICAgICAgICAgICAgICAgICAgICAgZ2F1Z2VPcHRpb25zPy5kYXRlRm9udFNpemVNYXhcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgOiBnYXVnZU9wdGlvbnM/LmRhdGVGb250U2l6ZSB8fCAxMixcbiAgICAgICAgICAgICAgICBmb250RmFtaWx5OiBnYXVnZU9wdGlvbnNDb2xvcnM/LmZvbnRGYW1pbHksXG4gICAgICAgICAgICAgICAgY29sb3I6XG4gICAgICAgICAgICAgICAgICBzZWxlY3RlZFByZXNldElkID09PSAnY3VzdG9tJ1xuICAgICAgICAgICAgICAgICAgICA/IGdhdWdlT3B0aW9ucz8uZGF0ZUNvbG9yXG4gICAgICAgICAgICAgICAgICAgIDogZ2F1Z2VPcHRpb25zQ29sb3JzPy5kYXRlQ29sb3IgfHwgJyM1NTUnXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIG1hcmtQb2ludDoge1xuICAgICAgICAgICAgc3ltYm9sU2l6ZTogMCxcbiAgICAgICAgICAgIG9mZnNldENlbnRlcjogZ2F1Z2VPcHRpb25zPy5kZXRhaWxPZmZzZXRDZW50ZXIgfHwgWzAsIDBdLFxuICAgICAgICAgICAgZGF0YTogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgeDogJzUwJScsXG4gICAgICAgICAgICAgICAgeTogJzUwJScsXG4gICAgICAgICAgICAgICAgbGFiZWw6IHtcbiAgICAgICAgICAgICAgICAgIHNob3c6IGdhdWdlT3B0aW9ucz8uc2hvd01hcmtQb2ludCxcbiAgICAgICAgICAgICAgICAgIGZvcm1hdHRlcjogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IG1lYXN1cmVtZW50Py52YWx1ZS50b0ZpeGVkKGZyYWN0aW9uU2l6ZSkgfHwgMDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5pdCA9IGFjdGl2ZURhdGFwb2ludEdhdWdlPy51bml0IHx8IG1lYXN1cmVtZW50Py51bml0IHx8ICcnO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUobWVhc3VyZW1lbnQ/LmRhdGUpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmb3JtYXR0ZWREYXRlID0gdGhpcy5jOHlEYXRlUGlwZS50cmFuc2Zvcm0oZGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBge3ZhbHVlfCR7dmFsdWV9fXt1bml0fCR7dW5pdH19IFxcbiB7ZGF0ZXwke2Zvcm1hdHRlZERhdGV9fSBgO1xuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIGNvbG9yOiAnI2ZmZicsXG4gICAgICAgICAgICAgICAgICBhbGlnbjogJ2NlbnRlcicsXG4gICAgICAgICAgICAgICAgICByaWNoOiB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgZm9udFNpemU6IGdhdWdlT3B0aW9ucz8ubWVhc3VyZW1lbnRWYWx1ZUZvbnRSYXRpb1xuICAgICAgICAgICAgICAgICAgICAgICAgPyB0aGlzLmNsYW1wUmVsYXRpdmUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhY3Rpb25TaXplID4gNVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBnYXVnZU9wdGlvbnM/Lm1lYXN1cmVtZW50VmFsdWVGb250UmF0aW8gKiAwLjVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZ2F1Z2VPcHRpb25zPy5tZWFzdXJlbWVudFZhbHVlRm9udFJhdGlvLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYWN0aW9uU2l6ZSA+IDVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZ2F1Z2VPcHRpb25zLm1lYXN1cmVtZW50VmFsdWVGb250TWluICogMC41XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGdhdWdlT3B0aW9ucz8ubWVhc3VyZW1lbnRWYWx1ZUZvbnRTaXplTWluLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhdWdlT3B0aW9ucz8ubWVhc3VyZW1lbnRWYWx1ZUZvbnRTaXplTWF4XG4gICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIDogZ2F1Z2VPcHRpb25zPy5tZWFzdXJlbWVudFZhbHVlRm9udFNpemUgfHwgMzIsXG4gICAgICAgICAgICAgICAgICAgICAgZm9udEZhbWlseTogZ2F1Z2VPcHRpb25zQ29sb3JzPy5mb250RmFtaWx5LFxuICAgICAgICAgICAgICAgICAgICAgIGZvbnRXZWlnaHQ6ICdib2xkZXInLFxuICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBnYXVnZU9wdGlvbnNDb2xvcnM/Lmtub2JGb250Q29sb3IgfHwgJyM3NzcnXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHVuaXQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICBmb250U2l6ZTogZ2F1Z2VPcHRpb25zPy51bml0Rm9udFJhdGlvXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHRoaXMuY2xhbXBSZWxhdGl2ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYXVnZU9wdGlvbnM/LnVuaXRGb250UmF0aW8sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2F1Z2VPcHRpb25zPy51bml0Rm9udFNpemVNaW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2F1Z2VPcHRpb25zPy51bml0Rm9udFNpemVNYXhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBnYXVnZU9wdGlvbnM/LnVuaXRGb250U2l6ZSB8fCAyMCxcbiAgICAgICAgICAgICAgICAgICAgICBmb250RmFtaWx5OiBnYXVnZU9wdGlvbnNDb2xvcnM/LmZvbnRGYW1pbHksXG4gICAgICAgICAgICAgICAgICAgICAgY29sb3I6IGdhdWdlT3B0aW9uc0NvbG9ycz8ua25vYkZvbnRDb2xvciB8fCAnIzk5OSdcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgZGF0ZToge1xuICAgICAgICAgICAgICAgICAgICAgIGZvbnRTaXplOiBnYXVnZU9wdGlvbnM/LmRhdGVGb250UmF0aW9cbiAgICAgICAgICAgICAgICAgICAgICAgID8gdGhpcy5jbGFtcFJlbGF0aXZlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhdWdlT3B0aW9ucz8uZGF0ZUZvbnRSYXRpbyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYXVnZU9wdGlvbnM/LmRhdGVGb250U2l6ZU1pbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYXVnZU9wdGlvbnM/LmRhdGVGb250U2l6ZU1heFxuICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGdhdWdlT3B0aW9ucz8uZGF0ZUZvbnRTaXplIHx8IDEyLFxuICAgICAgICAgICAgICAgICAgICAgIGZvbnRGYW1pbHk6IGdhdWdlT3B0aW9uc0NvbG9ycz8uZm9udEZhbWlseSxcbiAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogZ2F1Z2VPcHRpb25zQ29sb3JzPy5rbm9iRm9udENvbG9yIHx8ICcjNTU1J1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBkYXRhOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHZhbHVlOiAwIHx8IG1lYXN1cmVtZW50Py52YWx1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIF1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH07XG4gIH1cblxuICB1cGRhdGVSYW5nZUNvbG9ycygpOiBhbnkge1xuICAgIGlmICghdGhpcy5jaGFydCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBkZWZhdWx0OiBnZXRDb21wdXRlZFN0eWxlKHRoaXMuY2hhcnQubmF0aXZlRWxlbWVudCkuZ2V0UHJvcGVydHlWYWx1ZShcbiAgICAgICAgJy0tYzh5LWZvcm0tY29udHJvbC1ib3JkZXItY29sb3ItZGVmYXVsdCdcbiAgICAgICksXG4gICAgICB5ZWxsb3c6IGdldENvbXB1dGVkU3R5bGUodGhpcy5jaGFydC5uYXRpdmVFbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKFxuICAgICAgICAnLS1jOHktcGFsZXR0ZS1zdGF0dXMtd2FybmluZydcbiAgICAgICksXG4gICAgICByZWQ6IGdldENvbXB1dGVkU3R5bGUodGhpcy5jaGFydC5uYXRpdmVFbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKFxuICAgICAgICAnLS1jOHktcGFsZXR0ZS1zdGF0dXMtZGFuZ2VyJ1xuICAgICAgKVxuICAgIH07XG4gIH1cblxuICB1cGRhdGVHYXVnZU9wdGlvbnNDb2xvcnMoKTogYW55IHtcbiAgICBpZiAoIXRoaXMuY2hhcnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3BsaXRMaW5lQ29sb3I6IGdldENvbXB1dGVkU3R5bGUodGhpcy5jaGFydC5uYXRpdmVFbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKFxuICAgICAgICAnLS1jOHktcm9vdC1jb21wb25lbnQtYmFja2dyb3VuZC1kZWZhdWx0J1xuICAgICAgKSxcbiAgICAgIHRpY2tDb2xvcjogZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmNoYXJ0Lm5hdGl2ZUVsZW1lbnQpLmdldFByb3BlcnR5VmFsdWUoXG4gICAgICAgICctLWM4eS1yb290LWNvbXBvbmVudC1iYWNrZ3JvdW5kLWRlZmF1bHQnXG4gICAgICApLFxuICAgICAgYXhpc0xhYmVsQ29sb3I6IGdldENvbXB1dGVkU3R5bGUodGhpcy5jaGFydC5uYXRpdmVFbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKFxuICAgICAgICAnLS1jOHktcm9vdC1jb21wb25lbnQtY29sb3ItZGVmYXVsdCdcbiAgICAgICksXG4gICAgICBwb2ludGVyQ29sb3I6IGdldENvbXB1dGVkU3R5bGUodGhpcy5jaGFydC5uYXRpdmVFbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKFxuICAgICAgICAnLS1jOHktcm9vdC1jb21wb25lbnQtY29sb3ItZGVmYXVsdCdcbiAgICAgICksXG4gICAgICBrbm9iQ29sb3I6IGdldENvbXB1dGVkU3R5bGUodGhpcy5jaGFydC5uYXRpdmVFbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKFxuICAgICAgICAnLS1jOHktcm9vdC1jb21wb25lbnQtY29sb3ItZGVmYXVsdCdcbiAgICAgICksXG4gICAgICBrbm9iRm9udENvbG9yOiBnZXRDb21wdXRlZFN0eWxlKHRoaXMuY2hhcnQubmF0aXZlRWxlbWVudCkuZ2V0UHJvcGVydHlWYWx1ZShcbiAgICAgICAgJy0tYzh5LXJvb3QtY29tcG9uZW50LWJhY2tncm91bmQtZGVmYXVsdCdcbiAgICAgICksXG4gICAgICBtZWFzdXJlbWVudFZhbHVlQ29sb3I6IGdldENvbXB1dGVkU3R5bGUodGhpcy5jaGFydC5uYXRpdmVFbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKFxuICAgICAgICAnLS1jOHktcm9vdC1jb21wb25lbnQtY29sb3ItZGVmYXVsdCdcbiAgICAgICksXG4gICAgICB1bml0Q29sb3I6IGdldENvbXB1dGVkU3R5bGUodGhpcy5jaGFydC5uYXRpdmVFbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKFxuICAgICAgICAnLS1jOHktcm9vdC1jb21wb25lbnQtY29sb3ItZGVmYXVsdCdcbiAgICAgICksXG4gICAgICBkYXRlQ29sb3I6IGdldENvbXB1dGVkU3R5bGUodGhpcy5jaGFydC5uYXRpdmVFbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKFxuICAgICAgICAnLS1jOHktcm9vdC1jb21wb25lbnQtdGV4dC1tdXRlZCdcbiAgICAgICksXG4gICAgICBwcm9ncmVzc0JhckNvbG9yOiBnZXRDb21wdXRlZFN0eWxlKHRoaXMuY2hhcnQubmF0aXZlRWxlbWVudCkuZ2V0UHJvcGVydHlWYWx1ZShcbiAgICAgICAgJy0tYzh5LXJvb3QtY29tcG9uZW50LWJyYW5kLXByaW1hcnknXG4gICAgICApLFxuICAgICAgZm9udEZhbWlseTogZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5ib2R5KS5nZXRQcm9wZXJ0eVZhbHVlKCdmb250LWZhbWlseScpXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q29sb3JBcnJheShcbiAgICBhY3RpdmVEYXRhcG9pbnRHYXVnZTogS1BJRGV0YWlscyxcbiAgICByYW5nZUNvbG9yczogeyBkZWZhdWx0OiBzdHJpbmc7IHllbGxvdzogc3RyaW5nOyByZWQ6IHN0cmluZyB9XG4gICk6IFtudW1iZXIsIHN0cmluZ11bXSB7XG4gICAgY29uc3QgbWluID0gYWN0aXZlRGF0YXBvaW50R2F1Z2U/Lm1pbiA/PyAwO1xuICAgIGNvbnN0IG1heCA9IGFjdGl2ZURhdGFwb2ludEdhdWdlPy5tYXggPz8gMTAwO1xuICAgIGNvbnN0IHJhbmdlID0gbWF4IC0gbWluO1xuXG4gICAgY29uc3QgeWVsbG93TWluID0gYWN0aXZlRGF0YXBvaW50R2F1Z2U/LnllbGxvd1JhbmdlTWluO1xuICAgIGNvbnN0IHllbGxvd01heCA9IGFjdGl2ZURhdGFwb2ludEdhdWdlPy55ZWxsb3dSYW5nZU1heDtcbiAgICBjb25zdCByZWRNaW4gPSBhY3RpdmVEYXRhcG9pbnRHYXVnZT8ucmVkUmFuZ2VNaW47XG4gICAgY29uc3QgcmVkTWF4ID0gYWN0aXZlRGF0YXBvaW50R2F1Z2U/LnJlZFJhbmdlTWF4O1xuXG4gICAgdHlwZSBSYW5nZSA9IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXI7IGNvbG9yOiBzdHJpbmcgfTtcblxuICAgIGNvbnN0IHJhbmdlczogUmFuZ2VbXSA9IFtdO1xuXG4gICAgLy8gRmlyc3QgYWRkIHJlZCByYW5nZVxuICAgIGlmIChyZWRNaW4gIT0gbnVsbCAmJiByZWRNYXggIT0gbnVsbCAmJiByZWRNaW4gPCByZWRNYXgpIHtcbiAgICAgIHJhbmdlcy5wdXNoKHsgc3RhcnQ6IHJlZE1pbiwgZW5kOiByZWRNYXgsIGNvbG9yOiByYW5nZUNvbG9ycy5yZWQgfSk7XG4gICAgfVxuXG4gICAgLy8gVGhlbiBhZGQgeWVsbG93LCBidXQgY2xpcCBvdXQgYW55IG92ZXJsYXAgd2l0aCByZWRcbiAgICBpZiAoeWVsbG93TWluICE9IG51bGwgJiYgeWVsbG93TWF4ICE9IG51bGwgJiYgeWVsbG93TWluIDwgeWVsbG93TWF4KSB7XG4gICAgICBjb25zdCByZWRSYW5nZSA9IHJhbmdlcy5maW5kKHIgPT4gci5jb2xvciA9PT0gcmFuZ2VDb2xvcnMucmVkKTtcblxuICAgICAgaWYgKFxuICAgICAgICAhcmVkUmFuZ2UgfHxcbiAgICAgICAgeWVsbG93TWF4IDw9IHJlZFJhbmdlLnN0YXJ0IHx8IC8vIHllbGxvdyBlbmRzIGJlZm9yZSByZWRcbiAgICAgICAgeWVsbG93TWluID49IHJlZFJhbmdlLmVuZCAvLyB5ZWxsb3cgc3RhcnRzIGFmdGVyIHJlZFxuICAgICAgKSB7XG4gICAgICAgIC8vIG5vIG92ZXJsYXBcbiAgICAgICAgcmFuZ2VzLnB1c2goeyBzdGFydDogeWVsbG93TWluLCBlbmQ6IHllbGxvd01heCwgY29sb3I6IHJhbmdlQ29sb3JzLnllbGxvdyB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHBhcnRpYWwgb3ZlcmxhcCDigJMgc3BsaXQgeWVsbG93IGludG8gbm9uLW92ZXJsYXBwaW5nIHBhcnRzXG4gICAgICAgIGlmICh5ZWxsb3dNaW4gPCByZWRSYW5nZS5zdGFydCkge1xuICAgICAgICAgIHJhbmdlcy5wdXNoKHtcbiAgICAgICAgICAgIHN0YXJ0OiB5ZWxsb3dNaW4sXG4gICAgICAgICAgICBlbmQ6IE1hdGgubWluKHllbGxvd01heCwgcmVkUmFuZ2Uuc3RhcnQpLFxuICAgICAgICAgICAgY29sb3I6IHJhbmdlQ29sb3JzLnllbGxvd1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh5ZWxsb3dNYXggPiByZWRSYW5nZS5lbmQpIHtcbiAgICAgICAgICByYW5nZXMucHVzaCh7XG4gICAgICAgICAgICBzdGFydDogTWF0aC5tYXgoeWVsbG93TWluLCByZWRSYW5nZS5lbmQpLFxuICAgICAgICAgICAgZW5kOiB5ZWxsb3dNYXgsXG4gICAgICAgICAgICBjb2xvcjogcmFuZ2VDb2xvcnMueWVsbG93XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTb3J0IGJ5IHN0YXJ0IHBvc2l0aW9uXG4gICAgcmFuZ2VzLnNvcnQoKGEsIGIpID0+IGEuc3RhcnQgLSBiLnN0YXJ0KTtcblxuICAgIC8vIEJ1aWxkIHNlZ21lbnRzXG4gICAgY29uc3Qgc2VnbWVudHM6IFtudW1iZXIsIHN0cmluZ11bXSA9IFtdO1xuICAgIGxldCBjdXJyZW50ID0gbWluO1xuXG4gICAgZm9yIChjb25zdCB7IHN0YXJ0LCBlbmQsIGNvbG9yIH0gb2YgcmFuZ2VzKSB7XG4gICAgICBpZiAoc3RhcnQgPiBjdXJyZW50KSB7XG4gICAgICAgIC8vIERlZmF1bHQgZmlsbCBiZWZvcmUgdGhpcyByYW5nZVxuICAgICAgICBzZWdtZW50cy5wdXNoKFsoc3RhcnQgLSBtaW4pIC8gcmFuZ2UsIHJhbmdlQ29sb3JzLmRlZmF1bHRdKTtcbiAgICAgIH1cbiAgICAgIC8vIFN0YXJ0IGNvbG9yXG4gICAgICBzZWdtZW50cy5wdXNoKFsoc3RhcnQgLSBtaW4pIC8gcmFuZ2UsIGNvbG9yXSk7XG4gICAgICAvLyBFbmQgY29sb3JcbiAgICAgIHNlZ21lbnRzLnB1c2goWyhlbmQgLSBtaW4pIC8gcmFuZ2UsIGNvbG9yXSk7XG5cbiAgICAgIGN1cnJlbnQgPSBNYXRoLm1heChjdXJyZW50LCBlbmQpO1xuICAgIH1cblxuICAgIC8vIEZpbGwgcmVtYWluaW5nIHdpdGggZGVmYXVsdFxuICAgIGlmIChjdXJyZW50IDwgbWF4KSB7XG4gICAgICBzZWdtZW50cy5wdXNoKFsoY3VycmVudCAtIG1pbikgLyByYW5nZSwgcmFuZ2VDb2xvcnMuZGVmYXVsdF0pO1xuICAgIH1cblxuICAgIGlmIChzZWdtZW50cy5sZW5ndGggPT09IDAgfHwgc2VnbWVudHNbc2VnbWVudHMubGVuZ3RoIC0gMV1bMF0gPCAxKSB7XG4gICAgICBzZWdtZW50cy5wdXNoKFsxLCByYW5nZUNvbG9ycy5kZWZhdWx0XSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlZ21lbnRzO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGFtcFJlbGF0aXZlKHJhdGlvOiBudW1iZXIsIG1pbjogbnVtYmVyLCBtYXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3QgY2xhbXBlZFZhbHVlID0gdGhpcy5jb250YWluZXJTaXplICogcmF0aW87XG4gICAgaWYgKGNsYW1wZWRWYWx1ZSA8IG1pbikge1xuICAgICAgcmV0dXJuIG1pbjtcbiAgICB9IGVsc2UgaWYgKGNsYW1wZWRWYWx1ZSA+IG1heCkge1xuICAgICAgcmV0dXJuIG1heDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGNsYW1wZWRWYWx1ZTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==