@gravitee/ui-components 3.24.5 → 3.25.0-fix-gvcode-15ce1d2

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 (114) hide show
  1. package/CHANGELOG.md +1270 -0
  2. package/LICENSE.txt +202 -0
  3. package/README.md +195 -0
  4. package/assets/i18n/en.json +3 -0
  5. package/assets/i18n/fr.json +3 -0
  6. package/assets/icons/design.svg +1 -1
  7. package/package.json +1 -1
  8. package/src/.eslintrc.js +19 -0
  9. package/src/atoms/gv-autocomplete.js +156 -132
  10. package/src/atoms/gv-button.js +248 -73
  11. package/src/atoms/gv-checkbox.js +103 -45
  12. package/src/atoms/gv-date-picker-calendar.js +393 -312
  13. package/src/atoms/gv-date-picker-cell.js +81 -57
  14. package/src/atoms/gv-date-picker.js +319 -180
  15. package/src/atoms/gv-file-upload.js +195 -85
  16. package/src/atoms/gv-icon.js +34 -13
  17. package/src/atoms/gv-image.js +66 -31
  18. package/src/atoms/gv-input-message.js +37 -12
  19. package/src/atoms/gv-input.js +148 -117
  20. package/src/atoms/gv-link.js +125 -47
  21. package/src/atoms/gv-message.js +69 -18
  22. package/src/atoms/gv-metric.js +68 -19
  23. package/src/atoms/gv-relative-time.js +38 -67
  24. package/src/atoms/gv-select-native.js +215 -96
  25. package/src/atoms/gv-select.js +230 -110
  26. package/src/atoms/gv-spinner.js +26 -5
  27. package/src/atoms/gv-state.js +66 -25
  28. package/src/atoms/gv-switch.js +160 -40
  29. package/src/atoms/gv-tag.js +78 -26
  30. package/src/atoms/gv-text.js +83 -22
  31. package/src/charts/gv-chart-bar.js +18 -22
  32. package/src/charts/gv-chart-gauge.js +31 -28
  33. package/src/charts/gv-chart-histogram.js +10 -18
  34. package/src/charts/gv-chart-line.js +59 -70
  35. package/src/charts/gv-chart-map.js +42 -44
  36. package/src/charts/gv-chart-pie.js +14 -18
  37. package/src/index.js +0 -1
  38. package/src/lib/cron-expression.js +35 -40
  39. package/src/lib/date.js +1 -10
  40. package/src/lib/events.js +1 -3
  41. package/src/lib/http-client-schema-form.js +12 -13
  42. package/src/lib/http.js +56 -57
  43. package/src/lib/i18n.js +22 -30
  44. package/src/lib/item.js +12 -13
  45. package/src/lib/properties.js +42 -77
  46. package/src/lib/schema-form.js +5 -4
  47. package/src/lib/studio.js +60 -13
  48. package/src/lib/style.js +8 -8
  49. package/src/lib/text-format.js +7 -14
  50. package/src/lib/theme.js +5 -8
  51. package/src/lib/utils.js +18 -17
  52. package/src/mixins/chart-element.js +54 -31
  53. package/src/mixins/input-element.js +47 -60
  54. package/src/mixins/item-resource.js +32 -34
  55. package/src/mixins/keyboard-element.js +5 -6
  56. package/src/mixins/update-after-browser.js +1 -4
  57. package/src/mixins/with-resize-observer.js +13 -23
  58. package/src/mixins/with-skeleton-attribute.js +48 -54
  59. package/src/molecules/gv-card-full.js +147 -26
  60. package/src/molecules/gv-card-list.js +42 -13
  61. package/src/molecules/gv-card.js +91 -17
  62. package/src/molecules/gv-category-list.js +17 -6
  63. package/src/molecules/gv-category.js +103 -23
  64. package/src/molecules/gv-code.js +143 -81
  65. package/src/molecules/gv-confirm.js +71 -41
  66. package/src/molecules/gv-cron-editor.js +389 -143
  67. package/src/molecules/gv-dropdown-menu.js +46 -14
  68. package/src/molecules/gv-expandable.js +59 -31
  69. package/src/molecules/gv-expression-language.js +138 -176
  70. package/src/molecules/gv-identity-picture.js +65 -42
  71. package/src/molecules/gv-list.js +134 -42
  72. package/src/molecules/gv-metrics.js +49 -37
  73. package/src/molecules/gv-modal.js +95 -28
  74. package/src/molecules/gv-nav.js +75 -49
  75. package/src/molecules/gv-option.js +130 -57
  76. package/src/molecules/gv-plans.js +209 -86
  77. package/src/molecules/gv-popover.js +177 -57
  78. package/src/molecules/gv-promote.js +146 -28
  79. package/src/molecules/gv-rating-list.js +195 -69
  80. package/src/molecules/gv-rating.js +105 -52
  81. package/src/molecules/gv-row-expandable.js +11 -5
  82. package/src/molecules/gv-row.js +147 -21
  83. package/src/molecules/gv-stats.js +48 -23
  84. package/src/molecules/gv-stepper.js +187 -43
  85. package/src/molecules/gv-table.js +309 -199
  86. package/src/molecules/gv-tree.js +156 -33
  87. package/src/organisms/gv-documentation.js +128 -45
  88. package/src/organisms/gv-header.js +195 -37
  89. package/src/organisms/gv-http-client.js +168 -32
  90. package/src/organisms/gv-menu.js +158 -37
  91. package/src/organisms/gv-newsletter-subscription.js +189 -48
  92. package/src/organisms/gv-pagination.js +77 -49
  93. package/src/organisms/gv-properties.js +492 -271
  94. package/src/organisms/gv-resizable-views.js +259 -41
  95. package/src/organisms/gv-resources.js +275 -168
  96. package/src/organisms/gv-schema-form-array.js +159 -49
  97. package/src/organisms/gv-schema-form-control-object.js +73 -59
  98. package/src/organisms/gv-schema-form-control.js +134 -107
  99. package/src/organisms/gv-schema-form.js +324 -195
  100. package/src/organisms/gv-tabs.js +98 -66
  101. package/src/organisms/gv-user-menu.js +201 -36
  102. package/src/organisms/gv-vertical-menu.js +61 -20
  103. package/src/policy-studio/gv-flow-step.js +266 -105
  104. package/src/policy-studio/gv-flow.js +304 -125
  105. package/src/policy-studio/gv-policy-studio-menu.js +471 -157
  106. package/src/policy-studio/gv-policy-studio.js +777 -686
  107. package/src/styles/empty.js +20 -3
  108. package/src/styles/input.js +247 -3
  109. package/src/styles/link.js +16 -3
  110. package/src/styles/shapes.js +0 -1
  111. package/src/styles/skeleton.js +37 -3
  112. package/src/styles/zoom.js +24 -3
  113. package/src/theme/definition.json +1762 -0
  114. package/src/theme/gv-theme.js +60 -21
@@ -14,6 +14,7 @@
14
14
  * limitations under the License.
15
15
  */
16
16
  import { css, html, LitElement } from 'lit';
17
+
17
18
  import './gv-schema-form';
18
19
  import './gv-resizable-views';
19
20
  import '../molecules/gv-table';
@@ -29,6 +30,7 @@ import { i18n } from '../lib/i18n';
29
30
  import { classMap } from 'lit/directives/class-map';
30
31
  import { KeyboardElement, KEYS } from '../mixins/keyboard-element';
31
32
  import { empty } from '../styles/empty';
33
+
32
34
  /**
33
35
  * A component to manage properties
34
36
  *
@@ -44,72 +46,26 @@ import { empty } from '../styles/empty';
44
46
  *
45
47
  * @cssprop {Length} [--gv-properties-table--colmg=0.2rem] - Table cells margin
46
48
  */
47
-
48
49
  export class GvProperties extends KeyboardElement(LitElement) {
49
50
  static get properties() {
50
51
  return {
51
- dynamicPropertySchema: {
52
- type: Object
53
- },
54
- properties: {
55
- type: Array
56
- },
57
- _properties: {
58
- type: Array,
59
- attribute: false
60
- },
61
- provider: {
62
- type: Object
63
- },
64
- providers: {
65
- type: Array
66
- },
67
- _propertySchemaForm: {
68
- type: Object,
69
- attribute: false
70
- },
71
- expert: {
72
- type: Boolean
73
- },
74
- _formattedErrors: {
75
- type: Array,
76
- attributes: false
77
- },
78
- _filter: {
79
- type: String
80
- },
81
- _paginationData: {
82
- type: Object,
83
- attribute: false
84
- },
85
- _pageSize: {
86
- type: Number,
87
- attribute: false
88
- },
89
- _newItem: {
90
- type: Object,
91
- attribute: false
92
- },
93
- _providerDocumentation: {
94
- type: Boolean,
95
- attribute: false
96
- },
97
- _showDocumentation: {
98
- type: Boolean,
99
- attribute: false
100
- },
101
- _textRows: {
102
- type: Number,
103
- attribute: false
104
- },
105
- readonly: {
106
- type: Boolean,
107
- reflect: true
108
- },
109
- encryptable: {
110
- type: Boolean,
111
- reflect: true
112
- }
52
+ dynamicPropertySchema: { type: Object },
53
+ properties: { type: Array },
54
+ _properties: { type: Array, attribute: false },
55
+ provider: { type: Object },
56
+ providers: { type: Array },
57
+ _propertySchemaForm: { type: Object, attribute: false },
58
+ expert: { type: Boolean },
59
+ _formattedErrors: { type: Array, attributes: false },
60
+ _filter: { type: String },
61
+ _paginationData: { type: Object, attribute: false },
62
+ _pageSize: { type: Number, attribute: false },
63
+ _newItem: { type: Object, attribute: false },
64
+ _providerDocumentation: { type: Boolean, attribute: false },
65
+ _showDocumentation: { type: Boolean, attribute: false },
66
+ _textRows: { type: Number, attribute: false },
67
+ readonly: { type: Boolean, reflect: true },
68
+ encryptable: { type: Boolean, reflect: true },
113
69
  };
114
70
  }
115
71
 
@@ -121,11 +77,7 @@ export class GvProperties extends KeyboardElement(LitElement) {
121
77
  this._currentResource = null;
122
78
  this._formattedErrors = [];
123
79
  this._showDocumentation = true;
124
- this._newItem = {
125
- key: '',
126
- value: '',
127
- _new: true
128
- };
80
+ this._newItem = { key: '', value: '', _new: true };
129
81
  this._pageSize = 10;
130
82
  this._textRows = 10;
131
83
  this._pageSizes = [5, 10, 25, 50, 100];
@@ -136,10 +88,8 @@ export class GvProperties extends KeyboardElement(LitElement) {
136
88
  if (this.isPressed(KEYS.Esc)) {
137
89
  this._onClosePropertySchemaForm();
138
90
  }
139
-
140
91
  if (this.isPressed(KEYS.Shift, KEYS.Ctrl, KEYS.Space)) {
141
92
  const search = this.shadowRoot.querySelector('#search-property');
142
-
143
93
  if (search) {
144
94
  search.focus();
145
95
  }
@@ -147,13 +97,14 @@ export class GvProperties extends KeyboardElement(LitElement) {
147
97
  }
148
98
 
149
99
  set properties(properties) {
150
- this._properties = properties.sort((a, b) => a.key.localeCompare(b.key)).map(property => {
151
- if (property.encrypted) {
152
- property.encryptable = true;
153
- }
154
-
155
- return property;
156
- });
100
+ this._properties = properties
101
+ .sort((a, b) => a.key.localeCompare(b.key))
102
+ .map((property) => {
103
+ if (property.encrypted) {
104
+ property.encryptable = true;
105
+ }
106
+ return property;
107
+ });
157
108
  }
158
109
 
159
110
  get properties() {
@@ -166,7 +117,6 @@ export class GvProperties extends KeyboardElement(LitElement) {
166
117
 
167
118
  _maximizeTopView() {
168
119
  const views = this._getResizableViews();
169
-
170
120
  if (views) {
171
121
  views.maximizeTop(95, 5);
172
122
  }
@@ -174,7 +124,6 @@ export class GvProperties extends KeyboardElement(LitElement) {
174
124
 
175
125
  _maximizeBottomView() {
176
126
  const views = this._getResizableViews();
177
-
178
127
  if (views) {
179
128
  views.resize(30, 70);
180
129
  }
@@ -182,7 +131,6 @@ export class GvProperties extends KeyboardElement(LitElement) {
182
131
 
183
132
  _splitMainViews() {
184
133
  const views = this._getResizableViews();
185
-
186
134
  if (views) {
187
135
  views.split();
188
136
  }
@@ -195,19 +143,15 @@ export class GvProperties extends KeyboardElement(LitElement) {
195
143
  _onInputNew(name, event) {
196
144
  const target = event.target;
197
145
  this._newItem[name] = event.detail;
198
- const {
199
- errors
200
- } = parseRaw(toNameEqualsValueString([...this.properties, this._newItem]));
146
+ const { errors } = parseRaw(toNameEqualsValueString([...this.properties, this._newItem]));
201
147
  this._errors = errors;
202
148
  setTimeout(() => {
203
149
  const btn = this.shadowRoot.querySelector('gv-button#add-property');
204
-
205
150
  if (errors.length > 0 || this._disabledNewLine(this._newItem)) {
206
151
  btn.setAttribute('disabled', true);
207
152
  } else {
208
153
  btn.removeAttribute('disabled');
209
154
  }
210
-
211
155
  if (name === 'key') {
212
156
  if (errors.length === 0) {
213
157
  target.removeAttribute('invalid');
@@ -221,9 +165,7 @@ export class GvProperties extends KeyboardElement(LitElement) {
221
165
  }
222
166
 
223
167
  _onInput() {
224
- dispatchCustomEvent(this, 'change', {
225
- properties: this.properties
226
- });
168
+ dispatchCustomEvent(this, 'change', { properties: this.properties });
227
169
  }
228
170
 
229
171
  _onSwitchEncrypted(item) {
@@ -233,32 +175,19 @@ export class GvProperties extends KeyboardElement(LitElement) {
233
175
  item.encryptionWarning = i18n('gv-properties.infos.overwrite-encryption');
234
176
  this.requestUpdate();
235
177
  }
236
-
237
- dispatchCustomEvent(this, 'switch-encrypted', {
238
- properties: this.properties
239
- });
178
+ dispatchCustomEvent(this, 'switch-encrypted', { properties: this.properties });
240
179
  }
241
180
 
242
181
  _addProperty(item) {
243
182
  delete item._new;
244
183
  this.properties = [item, ...this._properties];
245
- this._newItem = {
246
- key: '',
247
- value: '',
248
- _new: true,
249
- encryptable: false,
250
- encrypted: false
251
- };
252
- dispatchCustomEvent(this, 'change', {
253
- properties: this.properties
254
- });
184
+ this._newItem = { key: '', value: '', _new: true, encryptable: false, encrypted: false };
185
+ dispatchCustomEvent(this, 'change', { properties: this.properties });
255
186
  }
256
187
 
257
188
  _removeProperty(item) {
258
- this._properties = this._properties.filter(property => property.key !== item.key);
259
- dispatchCustomEvent(this, 'change', {
260
- properties: this.properties
261
- });
189
+ this._properties = this._properties.filter((property) => property.key !== item.key);
190
+ dispatchCustomEvent(this, 'change', { properties: this.properties });
262
191
  }
263
192
 
264
193
  _disabledNewLine(item) {
@@ -271,43 +200,33 @@ export class GvProperties extends KeyboardElement(LitElement) {
271
200
  }
272
201
  }
273
202
 
274
- _onExpertModeTextInput({
275
- detail
276
- }) {
203
+ _onExpertModeTextInput({ detail }) {
277
204
  this._handleExpertModeInput(detail);
278
205
  }
279
206
 
280
207
  _handleExpertModeInput(expertModeInputString) {
281
208
  let allProperties = this._properties;
282
209
  const providerEnabled = this.provider && this.provider.enabled;
283
- const dynamicProperties = allProperties.filter(prop => providerEnabled && prop.dynamic);
284
- const encryptedProperties = allProperties.filter(prop => prop.encrypted);
285
- const allPropertiesString = `${expertModeInputString}\n${toNameEqualsValueString(dynamicProperties)}\n${toNameEqualsValueString(encryptedProperties)}`;
286
- const {
287
- errors
288
- } = parseRaw(allPropertiesString);
289
- this._errors = errors;
210
+ const dynamicProperties = allProperties.filter((prop) => providerEnabled && prop.dynamic);
211
+ const encryptedProperties = allProperties.filter((prop) => prop.encrypted);
290
212
 
213
+ const allPropertiesString = `${expertModeInputString}\n${toNameEqualsValueString(dynamicProperties)}\n${toNameEqualsValueString(
214
+ encryptedProperties,
215
+ )}`;
216
+ const { errors } = parseRaw(allPropertiesString);
217
+ this._errors = errors;
291
218
  if (errors.length === 0) {
292
- const {
293
- variables
294
- } = parseRaw(expertModeInputString);
219
+ const { variables } = parseRaw(expertModeInputString);
295
220
  allProperties = [...variables, ...dynamicProperties, ...encryptedProperties];
296
- dispatchCustomEvent(this, 'change', {
297
- properties: allProperties
298
- });
221
+ dispatchCustomEvent(this, 'change', { properties: allProperties });
299
222
  }
300
223
 
301
224
  return allProperties;
302
225
  }
303
226
 
304
- _onSubmitPropertyForm({
305
- detail
306
- }) {
227
+ _onSubmitPropertyForm({ detail }) {
307
228
  const provider = detail.values;
308
- dispatchCustomEvent(this, 'save-provider', {
309
- provider
310
- });
229
+ dispatchCustomEvent(this, 'save-provider', { provider });
311
230
  this.requestUpdate();
312
231
  }
313
232
 
@@ -320,8 +239,7 @@ export class GvProperties extends KeyboardElement(LitElement) {
320
239
  }
321
240
 
322
241
  _onSubmit() {
323
- const invalidControls = [...this.shadowRoot.querySelectorAll('form .control')].find(control => control.invalid);
324
-
242
+ const invalidControls = [...this.shadowRoot.querySelectorAll('form .control')].find((control) => control.invalid);
325
243
  if (invalidControls == null) {
326
244
  this._addProperty(this._newItem);
327
245
  }
@@ -334,20 +252,21 @@ export class GvProperties extends KeyboardElement(LitElement) {
334
252
  map[provider.id] = provider.key;
335
253
  return map;
336
254
  }, {});
255
+
337
256
  const providersEnum = Object.keys(providersTitleMap);
338
257
  this.dynamicPropertySchema = {
339
258
  properties: {
340
259
  enabled: {
341
260
  type: 'boolean',
342
261
  title: 'Enabled',
343
- description: ' This service is requiring an API deployment. Do not forget to deploy API to start dynamic-properties service.'
262
+ description: ' This service is requiring an API deployment. Do not forget to deploy API to start dynamic-properties service.',
344
263
  },
345
264
  schedule: {
346
265
  type: 'string',
347
266
  title: 'Schedule',
348
267
  'x-schema-form': {
349
- 'cron-expression': true
350
- }
268
+ 'cron-expression': true,
269
+ },
351
270
  },
352
271
  provider: {
353
272
  type: 'string',
@@ -355,43 +274,36 @@ export class GvProperties extends KeyboardElement(LitElement) {
355
274
  enum: providersEnum,
356
275
  default: providersEnum[0],
357
276
  'x-schema-form': {
358
- titleMap: providersTitleMap
359
- }
360
- }
277
+ titleMap: providersTitleMap,
278
+ },
279
+ },
361
280
  },
362
- required: ['schedule', 'provider']
281
+ required: ['schedule', 'provider'],
363
282
  };
364
283
  }
365
284
 
366
285
  const defaultProvider = this.providers[0];
286
+
367
287
  this._propertySchemaForm = {
368
- properties: { ...this.dynamicPropertySchema.properties,
369
- configuration: defaultProvider.schema
370
- },
371
- required: this.dynamicPropertySchema.required
288
+ properties: { ...this.dynamicPropertySchema.properties, configuration: defaultProvider.schema },
289
+ required: this.dynamicPropertySchema.required,
372
290
  };
373
291
  this._providerDocumentation = defaultProvider.documentation;
374
-
375
292
  this._maximizeBottomView();
376
293
  }
377
294
 
378
295
  _onClosePropertySchemaForm() {
379
296
  this._propertySchemaForm = null;
380
-
381
297
  this._maximizeTopView();
382
298
  }
383
299
 
384
- _onSearchProperty({
385
- detail
386
- }) {
300
+ _onSearchProperty({ detail }) {
387
301
  this._filter = detail;
388
-
389
302
  this._onClosePropertySchemaForm();
390
303
  }
391
304
 
392
305
  _onClearProperty() {
393
306
  this._filter = null;
394
-
395
307
  this._onClosePropertySchemaForm();
396
308
  }
397
309
 
@@ -400,114 +312,116 @@ export class GvProperties extends KeyboardElement(LitElement) {
400
312
  }
401
313
 
402
314
  set _errors(rawErrors) {
403
- this._formattedErrors = rawErrors.map(({
404
- type,
405
- key,
406
- pos
407
- }) => {
315
+ this._formattedErrors = rawErrors.map(({ type, key, pos }) => {
408
316
  if (type === ERROR_TYPES.INVALID_NAME) {
409
317
  return {
410
318
  line: pos.line,
411
- msg: i18n('gv-properties.errors.invalid-key', {
412
- key
413
- })
319
+ msg: i18n('gv-properties.errors.invalid-key', { key }),
414
320
  };
415
321
  }
416
-
417
322
  if (type === ERROR_TYPES.DUPLICATED_NAME) {
418
323
  return {
419
324
  line: pos.line,
420
- msg: i18n('gv-properties.errors.duplicated-key', {
421
- key
422
- })
325
+ msg: i18n('gv-properties.errors.duplicated-key', { key }),
423
326
  };
424
327
  }
425
-
426
328
  if (type === ERROR_TYPES.INVALID_LINE) {
427
329
  return {
428
330
  line: pos.line,
429
- msg: i18n('gv-properties.errors.invalid-line')
331
+ msg: i18n('gv-properties.errors.invalid-line'),
430
332
  };
431
333
  }
432
-
433
334
  if (type === ERROR_TYPES.INVALID_VALUE) {
434
335
  return {
435
336
  line: pos.line,
436
- msg: i18n('gv-properties.errors.invalid-value')
337
+ msg: i18n('gv-properties.errors.invalid-value'),
437
338
  };
438
339
  }
439
-
440
- return {
441
- line: '?',
442
- msg: i18n('gv-properties.errors.unknown')
443
- };
340
+ return { line: '?', msg: i18n('gv-properties.errors.unknown') };
444
341
  });
445
342
  }
446
343
 
447
344
  _renderErrors(withLine = false) {
448
345
  if (this._formattedErrors.length > 0) {
449
- return html`<div class="${classMap({
450
- 'add-form-error': true,
451
- 'add-form-error_expert': this.expert
452
- })}"> <div></div> <div class="error-list"> ${this._formattedErrors.map(({
453
- line,
454
- msg
455
- }) => html` <gv-input-message>${withLine ? html`<strong .innerHTML="${i18n('gv-properties.errors.line')} ${line}:&nbsp;"></strong>` : ''} <span .innerHTML="${msg}"></span></gv-input-message> `)} </div> </div>`;
346
+ return html`<div class="${classMap({ 'add-form-error': true, 'add-form-error_expert': this.expert })}">
347
+ <div></div>
348
+ <div class="error-list">
349
+ ${this._formattedErrors.map(
350
+ ({ line, msg }) => html`
351
+ <gv-input-message
352
+ >${withLine ? html`<strong .innerHTML="${i18n('gv-properties.errors.line')} ${line}:&nbsp;"></strong>` : ''}
353
+ <span .innerHTML="${msg}"></span
354
+ ></gv-input-message>
355
+ `,
356
+ )}
357
+ </div>
358
+ </div>`;
456
359
  }
457
-
458
360
  return html``;
459
361
  }
460
362
 
461
363
  _renderTable() {
462
364
  const providerEnabled = this.provider && this.provider.enabled;
463
-
464
365
  if (this.expert) {
465
366
  this._computeTextRows();
466
367
 
467
- const staticProperties = providerEnabled ? this._properties.filter(prop => !(providerEnabled && prop.dynamic)) : this._properties;
468
- const expertProperties = staticProperties.filter(prop => !prop.encrypted);
469
- const content = expertProperties.map(prop => `${prop.key}="${prop.value}"`).join('\n');
470
- return html`<gv-text id="expert-input" placeholder="${i18n('gv-properties.placeholder.input')}" @gv-text:input="${this._onExpertModeTextInput}" .value="${content}" ?readonly="${this.readonly}" .rows="${this._textRows}"></gv-text> ${this._renderErrors(true)}`;
368
+ const staticProperties = providerEnabled ? this._properties.filter((prop) => !(providerEnabled && prop.dynamic)) : this._properties;
369
+ const expertProperties = staticProperties.filter((prop) => !prop.encrypted);
370
+ const content = expertProperties.map((prop) => `${prop.key}="${prop.value}"`).join('\n');
371
+
372
+ return html`<gv-text
373
+ id="expert-input"
374
+ placeholder="${i18n('gv-properties.placeholder.input')}"
375
+ @gv-text:input="${this._onExpertModeTextInput}"
376
+ .value="${content}"
377
+ ?readonly="${this.readonly}"
378
+ .rows="${this._textRows}"
379
+ ></gv-text>
380
+ ${this._renderErrors(true)}`;
471
381
  } else {
472
382
  const options = {
473
- data: [{
474
- field: 'dynamic',
475
- label: 'Dynamic',
476
- width: '40px',
477
- type: item => item.dynamic && providerEnabled ? 'gv-icon' : 'div',
478
- attributes: {
479
- shape: item => item.dynamic && providerEnabled ? 'code:time-schedule' : '',
480
- title: item => item.dynamic && providerEnabled ? 'Dynamic properties service is actually in running' : '',
481
- style: 'justify-content: center; align-items: center; height: 100%;'
482
- }
483
- }, {
484
- field: 'key',
485
- label: 'Key',
486
- type: 'gv-input',
487
- attributes: {
488
- clipboard: true,
489
- placeholder: i18n('gv-properties.placeholder.key'),
490
- name: 'key',
491
- required: true,
492
- readonly: this.readonly
493
- }
494
- }, {
495
- field: 'value',
496
- label: 'Value',
497
- type: 'gv-input',
498
- attributes: {
499
- name: 'value',
500
- placeholder: 'Property value',
501
- required: true,
502
- readonly: this.readonly,
503
- disabled: item => item.dynamic && providerEnabled || item.encrypted,
504
- type: item => item.encrypted ? 'password' : 'text',
505
- title: item => item.encrypted ? i18n('gv-properties.infos.encrypted-value') : '',
506
- description: item => item.encryptionWarning,
507
- icon: null,
508
- 'ongv-input:input': this._onInput.bind(this)
509
- }
510
- }]
383
+ data: [
384
+ {
385
+ field: 'dynamic',
386
+ label: 'Dynamic',
387
+ width: '40px',
388
+ type: (item) => (item.dynamic && providerEnabled ? 'gv-icon' : 'div'),
389
+ attributes: {
390
+ shape: (item) => (item.dynamic && providerEnabled ? 'code:time-schedule' : ''),
391
+ title: (item) => (item.dynamic && providerEnabled ? 'Dynamic properties service is actually in running' : ''),
392
+ style: 'justify-content: center; align-items: center; height: 100%;',
393
+ },
394
+ },
395
+ {
396
+ field: 'key',
397
+ label: 'Key',
398
+ type: 'gv-input',
399
+ attributes: {
400
+ clipboard: true,
401
+ placeholder: i18n('gv-properties.placeholder.key'),
402
+ name: 'key',
403
+ required: true,
404
+ readonly: this.readonly,
405
+ },
406
+ },
407
+ {
408
+ field: 'value',
409
+ label: 'Value',
410
+ type: 'gv-input',
411
+ attributes: {
412
+ name: 'value',
413
+ placeholder: 'Property value',
414
+ required: true,
415
+ readonly: this.readonly,
416
+ disabled: (item) => (item.dynamic && providerEnabled) || item.encrypted,
417
+ type: (item) => (item.encrypted ? 'password' : 'text'),
418
+ title: (item) => (item.encrypted ? i18n('gv-properties.infos.encrypted-value') : ''),
419
+ description: (item) => item.encryptionWarning,
420
+ icon: null,
421
+ 'ongv-input:input': this._onInput.bind(this),
422
+ },
423
+ },
424
+ ],
511
425
  };
512
426
 
513
427
  if (this.encryptable === true) {
@@ -520,10 +434,10 @@ export class GvProperties extends KeyboardElement(LitElement) {
520
434
  description: i18n('gv-properties.encrypted-toggle'),
521
435
  required: true,
522
436
  readonly: this.readonly,
523
- disabled: item => item.dynamic && providerEnabled,
437
+ disabled: (item) => item.dynamic && providerEnabled,
524
438
  'ongv-switch:input': this._onSwitchEncrypted.bind(this),
525
- style: 'display: inline-flex; font-size: 12px; height: 40px;'
526
- }
439
+ style: 'display: inline-flex; font-size: 12px; height: 40px;',
440
+ },
527
441
  });
528
442
  }
529
443
 
@@ -534,19 +448,21 @@ export class GvProperties extends KeyboardElement(LitElement) {
534
448
  attributes: {
535
449
  'ongv-button:click': (item, event, target) => this._removeProperty(item, target),
536
450
  title: 'Remove',
537
- disabled: item => item.dynamic && providerEnabled,
451
+ disabled: (item) => item.dynamic && providerEnabled,
538
452
  danger: true,
539
453
  outlined: true,
540
- icon: 'home:trash'
541
- }
454
+ icon: 'home:trash',
455
+ },
542
456
  });
543
457
  }
544
458
 
545
- const filteredProperties = this._filter != null ? this._properties.filter(prop => {
546
- return (prop.key.toLowerCase() + prop.value.toLowerCase()).includes(this._filter);
547
- }) : this._properties;
459
+ const filteredProperties =
460
+ this._filter != null
461
+ ? this._properties.filter((prop) => {
462
+ return (prop.key.toLowerCase() + prop.value.toLowerCase()).includes(this._filter);
463
+ })
464
+ : this._properties;
548
465
  let properties = [...filteredProperties];
549
-
550
466
  if (this._paginationData) {
551
467
  this._paginationData.last = Math.ceil(filteredProperties.length / this._pageSize);
552
468
  this._paginationData.total = filteredProperties.length;
@@ -556,34 +472,63 @@ export class GvProperties extends KeyboardElement(LitElement) {
556
472
  }
557
473
 
558
474
  const addPropertyFormGridClass = this.encryptable ? 'add-form-grid-with-encrypted-toggle' : 'add-form-grid';
559
- const addPropertyForm = this.readonly !== true ? html`<form id="add-property-form" class="add-form ${addPropertyFormGridClass}" @submit="${this._onSubmit}"> <div></div> <gv-input class="control" placeholder="${i18n('gv-properties.placeholder.key')}" required @gv-input:input="${this._onInputNew.bind(this, 'key')}" value="${this._newItem.key}"></gv-input> <gv-input class="control" placeholder="${i18n('gv-properties.placeholder.value')}" required @gv-input:input="${this._onInputNew.bind(this, 'value')}" .value="${this._newItem.value}"></gv-input> ${this.encryptable ? html` <gv-switch class="control" required description="${i18n('gv-properties.encrypted-toggle')}" @gv-switch:input="${this._onInputNew.bind(this, 'encryptable')}" .value="${this._newItem.encryptable}"></gv-switch>` : ''} <gv-button id="add-property" icon="code:plus" outlined disabled="disabled" @gv-button:click="${this._addProperty.bind(this, this._newItem)}" title="${i18n('gv-properties.add')}"></gv-button> </form> ${this._renderErrors()} <hr>` : '';
560
- return html` ${addPropertyForm} <gv-table .options="${options}" .items="${properties}" noheader nosort order="key" rowheight="57px"></gv-table>`;
475
+
476
+ const addPropertyForm =
477
+ this.readonly !== true
478
+ ? html`<form id="add-property-form" class="add-form ${addPropertyFormGridClass}" @submit="${this._onSubmit}">
479
+ <div></div>
480
+ <gv-input
481
+ class="control"
482
+ placeholder="${i18n('gv-properties.placeholder.key')}"
483
+ required
484
+ @gv-input:input="${this._onInputNew.bind(this, 'key')}"
485
+ value="${this._newItem.key}"
486
+ ></gv-input>
487
+ <gv-input
488
+ class="control"
489
+ placeholder="${i18n('gv-properties.placeholder.value')}"
490
+ required
491
+ @gv-input:input="${this._onInputNew.bind(this, 'value')}"
492
+ .value="${this._newItem.value}"
493
+ ></gv-input>
494
+ ${this.encryptable
495
+ ? html` <gv-switch
496
+ class="control"
497
+ required
498
+ description="${i18n('gv-properties.encrypted-toggle')}"
499
+ @gv-switch:input="${this._onInputNew.bind(this, 'encryptable')}"
500
+ .value="${this._newItem.encryptable}"
501
+ ></gv-switch>`
502
+ : ''}
503
+ <gv-button
504
+ id="add-property"
505
+ icon="code:plus"
506
+ outlined
507
+ disabled
508
+ @gv-button:click="${this._addProperty.bind(this, this._newItem)}"
509
+ title="${i18n('gv-properties.add')}"
510
+ ></gv-button>
511
+ </form>
512
+ ${this._renderErrors()}
513
+ <hr />`
514
+ : '';
515
+
516
+ return html` ${addPropertyForm}
517
+ <gv-table .options="${options}" .items="${properties}" noheader nosort order="key" rowheight="57px"></gv-table>`;
561
518
  }
562
519
  }
563
520
 
564
- _onChangeMode({
565
- detail
566
- }) {
521
+ _onChangeMode({ detail }) {
567
522
  this._submitExpertMode();
568
-
569
523
  this.expert = detail;
570
524
  this._errors = [];
571
- this._newItem = {
572
- key: '',
573
- value: '',
574
- _new: true
575
- };
576
-
525
+ this._newItem = { key: '', value: '', _new: true };
577
526
  this._onClosePropertySchemaForm();
578
527
  }
579
528
 
580
- _onPaginate({
581
- detail
582
- }) {
529
+ _onPaginate({ detail }) {
583
530
  this._paginationData.current_page = detail.page;
584
-
585
531
  this._onClosePropertySchemaForm();
586
-
587
532
  this.requestUpdate();
588
533
  }
589
534
 
@@ -594,21 +539,53 @@ export class GvProperties extends KeyboardElement(LitElement) {
594
539
  last: Math.ceil(this._properties.length / this._pageSize),
595
540
  total: this._properties.length,
596
541
  current_page: 1,
597
- total_pages: Math.ceil(this._properties.length / this._pageSize)
542
+ total_pages: Math.ceil(this._properties.length / this._pageSize),
598
543
  };
599
544
  }
600
545
  }
601
546
 
602
- _onChangePageSize({
603
- detail
604
- }) {
547
+ _onChangePageSize({ detail }) {
605
548
  this._pageSize = Number(detail).valueOf();
606
-
607
549
  this._onClosePropertySchemaForm();
608
550
  }
609
551
 
610
552
  _renderTableForm() {
611
- return html`<div class="container"> <div class="header"> <div class="title">Manage global properties <span>(${this._properties ? this._properties.length : 0})</span></div> <gv-switch small .description="${this.expert ? 'Expert' : 'Simple'}" .value="${this.expert}" @gv-switch:input="${this._onChangeMode}"></gv-switch> <gv-input id="search-property" placeholder="Filter properties (Shift + Ctrl + Space)" type="search" small class="search-input" .disabled="${this.expert}" @gv-input:input="${this._onSearchProperty}" @gv-input:clear="${this._onClearProperty}"></gv-input> <gv-select class="page-size__select" @gv-select:input="${this._onChangePageSize}" small .options="${this._pageSizes}" .value="${this._pageSize}" .disabled="${this.expert || this._paginationData == null}"></gv-select> <gv-pagination @gv-pagination:paginate="${this._onPaginate}" .disabled="${this.expert || this._paginationData == null}" .data="${this._paginationData}" widget></gv-pagination> </div> <div class="content"><div class="form-content">${this._renderTable()}</div></div> </div>`;
553
+ return html`<div class="container">
554
+ <div class="header">
555
+ <div class="title">Manage global properties <span>(${this._properties ? this._properties.length : 0})</span></div>
556
+ <gv-switch
557
+ small
558
+ .description="${this.expert ? 'Expert' : 'Simple'}"
559
+ .value="${this.expert}"
560
+ @gv-switch:input="${this._onChangeMode}"
561
+ ></gv-switch>
562
+ <gv-input
563
+ id="search-property"
564
+ placeholder="Filter properties (Shift + Ctrl + Space)"
565
+ type="search"
566
+ small
567
+ class="search-input"
568
+ .disabled="${this.expert}"
569
+ @gv-input:input="${this._onSearchProperty}"
570
+ @gv-input:clear="${this._onClearProperty}"
571
+ ></gv-input>
572
+ <gv-select
573
+ class="page-size__select"
574
+ @gv-select:input="${this._onChangePageSize}"
575
+ small
576
+ .options="${this._pageSizes}"
577
+ .value="${this._pageSize}"
578
+ .disabled="${this.expert || this._paginationData == null}"
579
+ ></gv-select>
580
+ <gv-pagination
581
+ @gv-pagination:paginate="${this._onPaginate}"
582
+ .disabled="${this.expert || this._paginationData == null}"
583
+ .data="${this._paginationData}"
584
+ widget
585
+ ></gv-pagination>
586
+ </div>
587
+ <div class="content"><div class="form-content">${this._renderTable()}</div></div>
588
+ </div>`;
612
589
  }
613
590
 
614
591
  _fetchDocumentation() {
@@ -626,21 +603,54 @@ export class GvProperties extends KeyboardElement(LitElement) {
626
603
 
627
604
  confirm() {
628
605
  const form = this.shadowRoot.querySelector('gv-schema-form');
629
-
630
606
  if (form) {
631
607
  return form.confirm().then(() => this._onClosePropertySchemaForm());
632
608
  }
633
-
634
609
  return Promise.resolve();
635
610
  }
636
611
 
637
612
  _renderForm() {
638
- return html`<gv-schema-form slot="top" scrollable .schema="${this._propertySchemaForm}" .values="${this.provider}" .icon="design:edit" has-header ?readonly="${this.readonly}" @gv-schema-form:submit="${this._onSubmitPropertyForm}"> <div slot="title" class="properties-title">Configure dynamic properties</div> <gv-button slot="header-left" icon="general:close" outlined small @gv-button:click="${this._onClosePropertySchemaForm}" title="Close (esc)"></gv-button> <gv-button slot="header-left" icon="home:book" ?disabled="${this._showDocumentation}" outlined small @gv-button:click="${this._fetchDocumentation}" title="Open documentation"></gv-button> </gv-schema-form>`;
613
+ return html`<gv-schema-form
614
+ slot="top"
615
+ scrollable
616
+ .schema="${this._propertySchemaForm}"
617
+ .values="${this.provider}"
618
+ .icon="design:edit"
619
+ has-header
620
+ ?readonly="${this.readonly}"
621
+ @gv-schema-form:submit="${this._onSubmitPropertyForm}"
622
+ >
623
+ <div slot="title" class="properties-title">Configure dynamic properties</div>
624
+ <gv-button
625
+ slot="header-left"
626
+ icon="general:close"
627
+ outlined
628
+ small
629
+ @gv-button:click="${this._onClosePropertySchemaForm}"
630
+ title="Close (esc)"
631
+ ></gv-button>
632
+ <gv-button
633
+ slot="header-left"
634
+ icon="home:book"
635
+ ?disabled="${this._showDocumentation}"
636
+ outlined
637
+ small
638
+ @gv-button:click="${this._fetchDocumentation}"
639
+ title="Open documentation"
640
+ ></gv-button>
641
+ </gv-schema-form>`;
639
642
  }
640
643
 
641
644
  _renderBottom() {
642
645
  if (this._propertySchemaForm && this._showDocumentation) {
643
- return html`<gv-resizable-views no-overflow direction="horizontal"> ${this._renderForm()} <gv-documentation slot="bottom" .text="${this._providerDocumentation}" @gv-documentation:close="${this._hideDocumentation}"></gv-documentation> </gv-resizable-views>`;
646
+ return html`<gv-resizable-views no-overflow direction="horizontal">
647
+ ${this._renderForm()}
648
+ <gv-documentation
649
+ slot="bottom"
650
+ .text="${this._providerDocumentation}"
651
+ @gv-documentation:close="${this._hideDocumentation}"
652
+ ></gv-documentation>
653
+ </gv-resizable-views>`;
644
654
  } else if (this._propertySchemaForm) {
645
655
  return this._renderForm();
646
656
  } else {
@@ -650,14 +660,24 @@ export class GvProperties extends KeyboardElement(LitElement) {
650
660
 
651
661
  _renderDynamicConfiguration() {
652
662
  const hasDynamicConfiguration = this.provider && this.provider.enabled;
653
- let configureAction = '';
654
663
 
664
+ let configureAction = '';
655
665
  if (hasDynamicConfiguration || this.readonly !== true) {
656
- configureAction = html`<gv-button icon="tools:tools" @gv-button:click="${this._onConfigureDynamicProperties}" outlined .disabled="${this.expert}">Configure dynamic properties</gv-button>`;
666
+ configureAction = html`<gv-button
667
+ icon="tools:tools"
668
+ @gv-button:click="${this._onConfigureDynamicProperties}"
669
+ outlined
670
+ .disabled="${this.expert}"
671
+ >Configure dynamic properties</gv-button
672
+ >`;
657
673
  }
658
674
 
659
675
  if (hasDynamicConfiguration) {
660
- return html`<div class="properties-message"> Dynamic properties service is actually in <code>running</code> state and run with cron expression <code>${this.provider.schedule}</code> using <code>${this.provider.provider}</code> provider. </div> ${configureAction}`;
676
+ return html`<div class="properties-message">
677
+ Dynamic properties service is actually in <code>running</code> state and run with cron expression
678
+ <code>${this.provider.schedule}</code> using <code>${this.provider.provider}</code> provider.
679
+ </div>
680
+ ${configureAction}`;
661
681
  } else if (this.readonly) {
662
682
  return html`<div class="empty">No dynamic properties service configured</div>`;
663
683
  } else {
@@ -671,29 +691,230 @@ export class GvProperties extends KeyboardElement(LitElement) {
671
691
 
672
692
  _computeTextRows() {
673
693
  const parent = this.shadowRoot.querySelector('.content');
674
-
675
694
  if (parent) {
676
- const {
677
- height
678
- } = parent.getBoundingClientRect(); // --gv-text--lh=30px
679
-
695
+ const { height } = parent.getBoundingClientRect();
696
+ // --gv-text--lh=30px
680
697
  this._textRows = Math.round(Math.round(height - 20) / 30) - 2;
681
698
  }
682
699
  }
683
700
 
684
701
  render() {
685
702
  if (this.providers && this.providers.length > 0) {
686
- return html`<div class="properties"> <gv-resizable-views no-overflow @gv-resizable-views:move="${this._onMove}" @gv-resizable-views:resize="${this._onMove}"> <div slot="top" class="box">${this._renderTableForm()}</div> <div slot="bottom">${this._renderBottom()}</div> </gv-resizable-views> </div>`;
703
+ return html`<div class="properties">
704
+ <gv-resizable-views no-overflow @gv-resizable-views:move="${this._onMove}" @gv-resizable-views:resize="${this._onMove}">
705
+ <div slot="top" class="box">${this._renderTableForm()}</div>
706
+ <div slot="bottom">${this._renderBottom()}</div>
707
+ </gv-resizable-views>
708
+ </div>`;
687
709
  } else {
688
- return html`<div class="properties"> <div class="table-box">${this._renderTableForm()}</div> </div>`;
710
+ return html`<div class="properties">
711
+ <div class="table-box">${this._renderTableForm()}</div>
712
+ </div>`;
689
713
  }
690
714
  }
691
715
 
692
716
  static get styles() {
693
- return [empty, // language=CSS
694
- css`:host{box-sizing:border-box;height:100%;width:100%;display:block}.properties{display:flex;height:100%;width:100%}gv-resizable-views{height:100%;width:100%}gv-schema-form{margin:0}.table-box{width:100%;border-left:1px solid #bfbfbf;display:flex}gv-table{height:auto;flex:1;margin-top:10px;margin-right:50px;--gv-table-rows--ov:none;--gv-table--colmg:var(--gv-properties-table--colmg, 0.2rem);--gv-table-cell--d:inline;--gv-table-row--ai:flex-start;--gv-table-row--ac:flex-start;--gv-table-hover--bgc:var(--gv-theme-neutral-color-lightest)}.properties-title{text-transform:uppercase;letter-spacing:.2rem}.properties-bottom-container{display:flex;justify-content:center;align-items:center;height:100%;flex-direction:column}.header{border-bottom:1px solid #d9d9d9;display:flex;min-height:45px;align-items:center;margin-bottom:.5rem;padding:0 .5rem}.header .title{color:#28444f;font-size:18px;display:flex;align-items:flex-end;flex:1}.header .title span{font-size:12px;margin-left:8px;opacity:.7}.box{position:absolute;display:flex;flex-direction:column;width:100%;top:0;bottom:0;left:0}.container{flex-grow:1;display:flex;flex-direction:column;min-height:0;height:100%}.content{background:#fff;flex-grow:1;overflow:auto;min-height:0;padding:.5rem;display:flex;flex-direction:column;align-items:center}gv-text{--gv-text--fz:20px;--gv-text--lh:25px}gv-switch{--gv-switch--ta:right}.header gv-input{margin:0 1rem}.add-form,.add-form-error{display:grid;margin:auto 50px auto 0;box-sizing:border-box}.add-form{column-gap:var(--gv-properties-table--colmg,.2rem);border-right:solid thick transparent;height:50px}.add-form gv-input,gv-button,gv-switch{margin:auto 0}.add-form gv-switch{font-size:12px}.add-form-grid{grid-template-columns:40px auto auto 40px}.add-form-grid-with-encrypted-toggle{grid-template-columns:40px auto auto 105px 40px}.add-form-error_expert{display:flex}.add-form-error{grid-template-columns:40px 1fr}code{color:var(--gv-theme-color-warning-dark,#f57c00)}.form-content{display:flex;flex-direction:column;width:100%}.properties-message{margin-bottom:.5rem;font-size:14px}.page-size__select{max-width:50px}.search-input{width:300px}hr{background-color:var(--gv-theme-neutral-color);border:0;width:100%;height:2px}`];
695
- }
717
+ return [
718
+ empty,
719
+ // language=CSS
720
+ css`
721
+ :host {
722
+ box-sizing: border-box;
723
+ height: 100%;
724
+ width: 100%;
725
+ display: block;
726
+ }
727
+
728
+ .properties {
729
+ display: flex;
730
+ height: 100%;
731
+ width: 100%;
732
+ }
733
+
734
+ gv-resizable-views {
735
+ height: 100%;
736
+ width: 100%;
737
+ }
738
+
739
+ gv-schema-form {
740
+ margin: 0;
741
+ }
742
+
743
+ .table-box {
744
+ width: 100%;
745
+ border-left: 1px solid #bfbfbf;
746
+ display: flex;
747
+ }
748
+
749
+ gv-table {
750
+ height: auto;
751
+ flex: 1;
752
+ margin-top: 10px;
753
+ margin-right: 50px;
754
+ --gv-table-rows--ov: none;
755
+ --gv-table--colmg: var(--gv-properties-table--colmg, 0.2rem);
756
+ --gv-table-cell--d: inline;
757
+ --gv-table-row--ai: flex-start;
758
+ --gv-table-row--ac: flex-start;
759
+ --gv-table-hover--bgc: var(--gv-theme-neutral-color-lightest);
760
+ }
761
+
762
+ .properties-title {
763
+ text-transform: uppercase;
764
+ letter-spacing: 0.2rem;
765
+ }
766
+
767
+ .properties-bottom-container {
768
+ display: flex;
769
+ justify-content: center;
770
+ align-items: center;
771
+ height: 100%;
772
+ flex-direction: column;
773
+ }
774
+
775
+ .header {
776
+ border-bottom: 1px solid #d9d9d9;
777
+ display: flex;
778
+ min-height: 45px;
779
+ align-items: center;
780
+ margin-bottom: 0.5rem;
781
+ padding: 0 0.5rem;
782
+ }
783
+
784
+ .header .title {
785
+ color: #28444f;
786
+ font-size: 18px;
787
+ display: flex;
788
+ align-items: flex-end;
789
+ flex: 1;
790
+ }
791
+
792
+ .header .title span {
793
+ font-size: 12px;
794
+ margin-left: 8px;
795
+ opacity: 0.7;
796
+ }
797
+
798
+ .box {
799
+ position: absolute;
800
+ display: flex;
801
+ flex-direction: column;
802
+ width: 100%;
803
+ top: 0;
804
+ bottom: 0;
805
+ left: 0;
806
+ }
807
+
808
+ .container {
809
+ flex-grow: 1;
810
+
811
+ display: flex;
812
+ flex-direction: column;
813
+
814
+ /* for Firefox */
815
+ min-height: 0;
816
+ height: 100%;
817
+ }
818
+
819
+ .content {
820
+ background: white;
821
+ flex-grow: 1;
822
+
823
+ overflow: auto;
824
+
825
+ /* for Firefox */
826
+ min-height: 0;
827
+ padding: 0.5rem;
828
+
829
+ display: flex;
830
+ flex-direction: column;
831
+ align-items: center;
832
+ }
833
+
834
+ gv-text {
835
+ --gv-text--fz: 20px;
836
+ --gv-text--lh: 25px;
837
+ }
838
+
839
+ gv-switch {
840
+ --gv-switch--ta: right;
841
+ }
842
+
843
+ .header gv-input {
844
+ margin: 0 1rem;
845
+ }
846
+
847
+ .add-form,
848
+ .add-form-error {
849
+ display: grid;
850
+ margin: auto 50px auto 0;
851
+ box-sizing: border-box;
852
+ }
853
+
854
+ .add-form {
855
+ column-gap: var(--gv-properties-table--colmg, 0.2rem);
856
+ border-right: solid thick transparent;
857
+ height: 50px;
858
+ }
859
+
860
+ .add-form gv-input,
861
+ gv-button,
862
+ gv-switch {
863
+ margin: auto 0;
864
+ }
865
+
866
+ .add-form gv-switch {
867
+ font-size: 12px;
868
+ }
869
+
870
+ .add-form-grid {
871
+ grid-template-columns: 40px auto auto 40px;
872
+ }
873
+
874
+ .add-form-grid-with-encrypted-toggle {
875
+ grid-template-columns: 40px auto auto 105px 40px;
876
+ }
696
877
 
878
+ .add-form-error_expert {
879
+ display: flex;
880
+ }
881
+
882
+ .add-form-error {
883
+ grid-template-columns: 40px 1fr;
884
+ }
885
+
886
+ code {
887
+ color: var(--gv-theme-color-warning-dark, #f57c00);
888
+ }
889
+
890
+ .form-content {
891
+ display: flex;
892
+ flex-direction: column;
893
+ width: 100%;
894
+ }
895
+
896
+ .properties-message {
897
+ margin-bottom: 0.5rem;
898
+ font-size: 14px;
899
+ }
900
+
901
+ .page-size__select {
902
+ max-width: 50px;
903
+ }
904
+
905
+ .search-input {
906
+ width: 300px;
907
+ }
908
+
909
+ hr {
910
+ background-color: var(--gv-theme-neutral-color);
911
+ border: 0;
912
+ width: 100%;
913
+ height: 2px;
914
+ }
915
+ `,
916
+ ];
917
+ }
697
918
  }
919
+
698
920
  window.customElements.define('gv-properties', GvProperties);
699
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4vbm9kZV9tb2R1bGVzL0BncmF2aXRlZS91aS1jb21wb25lbnRzL29yZ2FuaXNtcy9ndi1wcm9wZXJ0aWVzLmpzIl0sIm5hbWVzIjpbImNzcyIsImh0bWwiLCJMaXRFbGVtZW50IiwiZGlzcGF0Y2hDdXN0b21FdmVudCIsIkVSUk9SX1RZUEVTIiwicGFyc2VSYXciLCJ0b05hbWVFcXVhbHNWYWx1ZVN0cmluZyIsImkxOG4iLCJjbGFzc01hcCIsIktleWJvYXJkRWxlbWVudCIsIktFWVMiLCJlbXB0eSIsIkd2UHJvcGVydGllcyIsInByb3BlcnRpZXMiLCJkeW5hbWljUHJvcGVydHlTY2hlbWEiLCJ0eXBlIiwiT2JqZWN0IiwiQXJyYXkiLCJfcHJvcGVydGllcyIsImF0dHJpYnV0ZSIsInByb3ZpZGVyIiwicHJvdmlkZXJzIiwiX3Byb3BlcnR5U2NoZW1hRm9ybSIsImV4cGVydCIsIkJvb2xlYW4iLCJfZm9ybWF0dGVkRXJyb3JzIiwiYXR0cmlidXRlcyIsIl9maWx0ZXIiLCJTdHJpbmciLCJfcGFnaW5hdGlvbkRhdGEiLCJfcGFnZVNpemUiLCJOdW1iZXIiLCJfbmV3SXRlbSIsIl9wcm92aWRlckRvY3VtZW50YXRpb24iLCJfc2hvd0RvY3VtZW50YXRpb24iLCJfdGV4dFJvd3MiLCJyZWFkb25seSIsInJlZmxlY3QiLCJlbmNyeXB0YWJsZSIsImNvbnN0cnVjdG9yIiwidHlwZXMiLCJfY3VycmVudFJlc291cmNlIiwia2V5IiwidmFsdWUiLCJfbmV3IiwiX3BhZ2VTaXplcyIsIl9lcnJvcnMiLCJvbktleWJvYXJkIiwiaXNQcmVzc2VkIiwiRXNjIiwiX29uQ2xvc2VQcm9wZXJ0eVNjaGVtYUZvcm0iLCJTaGlmdCIsIkN0cmwiLCJTcGFjZSIsInNlYXJjaCIsInNoYWRvd1Jvb3QiLCJxdWVyeVNlbGVjdG9yIiwiZm9jdXMiLCJzb3J0IiwiYSIsImIiLCJsb2NhbGVDb21wYXJlIiwibWFwIiwicHJvcGVydHkiLCJlbmNyeXB0ZWQiLCJfZ2V0UmVzaXphYmxlVmlld3MiLCJfbWF4aW1pemVUb3BWaWV3Iiwidmlld3MiLCJtYXhpbWl6ZVRvcCIsIl9tYXhpbWl6ZUJvdHRvbVZpZXciLCJyZXNpemUiLCJfc3BsaXRNYWluVmlld3MiLCJzcGxpdCIsIl9pc05ld0xpbmVUYWJsZSIsImxpbmUiLCJfb25JbnB1dE5ldyIsIm5hbWUiLCJldmVudCIsInRhcmdldCIsImRldGFpbCIsImVycm9ycyIsInNldFRpbWVvdXQiLCJidG4iLCJsZW5ndGgiLCJfZGlzYWJsZWROZXdMaW5lIiwic2V0QXR0cmlidXRlIiwicmVtb3ZlQXR0cmlidXRlIiwiX29uSW5wdXQiLCJfb25Td2l0Y2hFbmNyeXB0ZWQiLCJpdGVtIiwiZW5jcnlwdGlvbldhcm5pbmciLCJyZXF1ZXN0VXBkYXRlIiwiX2FkZFByb3BlcnR5IiwiX3JlbW92ZVByb3BlcnR5IiwiZmlsdGVyIiwidHJpbSIsIl9zdWJtaXRFeHBlcnRNb2RlIiwiX2hhbmRsZUV4cGVydE1vZGVJbnB1dCIsIl9vbkV4cGVydE1vZGVUZXh0SW5wdXQiLCJleHBlcnRNb2RlSW5wdXRTdHJpbmciLCJhbGxQcm9wZXJ0aWVzIiwicHJvdmlkZXJFbmFibGVkIiwiZW5hYmxlZCIsImR5bmFtaWNQcm9wZXJ0aWVzIiwicHJvcCIsImR5bmFtaWMiLCJlbmNyeXB0ZWRQcm9wZXJ0aWVzIiwiYWxsUHJvcGVydGllc1N0cmluZyIsInZhcmlhYmxlcyIsIl9vblN1Ym1pdFByb3BlcnR5Rm9ybSIsInZhbHVlcyIsInN1Ym1pdCIsIl9vblN1Ym1pdCIsImludmFsaWRDb250cm9scyIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJmaW5kIiwiY29udHJvbCIsImludmFsaWQiLCJfb25Db25maWd1cmVEeW5hbWljUHJvcGVydGllcyIsInByb3ZpZGVyc1RpdGxlTWFwIiwicmVkdWNlIiwiaWQiLCJwcm92aWRlcnNFbnVtIiwia2V5cyIsInRpdGxlIiwiZGVzY3JpcHRpb24iLCJzY2hlZHVsZSIsImVudW0iLCJkZWZhdWx0IiwidGl0bGVNYXAiLCJyZXF1aXJlZCIsImRlZmF1bHRQcm92aWRlciIsImNvbmZpZ3VyYXRpb24iLCJzY2hlbWEiLCJkb2N1bWVudGF0aW9uIiwiX29uU2VhcmNoUHJvcGVydHkiLCJfb25DbGVhclByb3BlcnR5IiwicmF3RXJyb3JzIiwicG9zIiwiSU5WQUxJRF9OQU1FIiwibXNnIiwiRFVQTElDQVRFRF9OQU1FIiwiSU5WQUxJRF9MSU5FIiwiSU5WQUxJRF9WQUxVRSIsIl9yZW5kZXJFcnJvcnMiLCJ3aXRoTGluZSIsIl9yZW5kZXJUYWJsZSIsIl9jb21wdXRlVGV4dFJvd3MiLCJzdGF0aWNQcm9wZXJ0aWVzIiwiZXhwZXJ0UHJvcGVydGllcyIsImNvbnRlbnQiLCJqb2luIiwib3B0aW9ucyIsImRhdGEiLCJmaWVsZCIsImxhYmVsIiwid2lkdGgiLCJzaGFwZSIsInN0eWxlIiwiY2xpcGJvYXJkIiwicGxhY2Vob2xkZXIiLCJkaXNhYmxlZCIsImljb24iLCJiaW5kIiwicHVzaCIsImRhbmdlciIsIm91dGxpbmVkIiwiZmlsdGVyZWRQcm9wZXJ0aWVzIiwidG9Mb3dlckNhc2UiLCJpbmNsdWRlcyIsImxhc3QiLCJNYXRoIiwiY2VpbCIsInRvdGFsIiwidG90YWxfcGFnZXMiLCJpbmRleCIsImN1cnJlbnRfcGFnZSIsInNwbGljZSIsImFkZFByb3BlcnR5Rm9ybUdyaWRDbGFzcyIsImFkZFByb3BlcnR5Rm9ybSIsIl9vbkNoYW5nZU1vZGUiLCJfb25QYWdpbmF0ZSIsInBhZ2UiLCJ1cGRhdGVkIiwicHJvcHMiLCJoYXMiLCJmaXJzdCIsIl9vbkNoYW5nZVBhZ2VTaXplIiwidmFsdWVPZiIsIl9yZW5kZXJUYWJsZUZvcm0iLCJfZmV0Y2hEb2N1bWVudGF0aW9uIiwiX2hpZGVEb2N1bWVudGF0aW9uIiwiZGlydHkiLCJmb3JtIiwiY29uZmlybSIsInRoZW4iLCJQcm9taXNlIiwicmVzb2x2ZSIsIl9yZW5kZXJGb3JtIiwiX3JlbmRlckJvdHRvbSIsIl9yZW5kZXJEeW5hbWljQ29uZmlndXJhdGlvbiIsImhhc0R5bmFtaWNDb25maWd1cmF0aW9uIiwiY29uZmlndXJlQWN0aW9uIiwiX29uTW92ZSIsInBhcmVudCIsImhlaWdodCIsImdldEJvdW5kaW5nQ2xpZW50UmVjdCIsInJvdW5kIiwicmVuZGVyIiwic3R5bGVzIiwid2luZG93IiwiY3VzdG9tRWxlbWVudHMiLCJkZWZpbmUiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVNBLEdBQVQsRUFBY0MsSUFBZCxFQUFvQkMsVUFBcEIsUUFBc0MsS0FBdEM7QUFFQSxPQUFPLGtCQUFQO0FBQ0EsT0FBTyxzQkFBUDtBQUNBLE9BQU8sdUJBQVA7QUFDQSxPQUFPLG9CQUFQO0FBQ0EsT0FBTyxtQkFBUDtBQUNBLE9BQU8sa0JBQVA7QUFDQSxPQUFPLGtCQUFQO0FBQ0EsT0FBTywyQkFBUDtBQUNBLE9BQU8sb0JBQVA7QUFDQSxTQUFTQyxtQkFBVCxRQUFvQyxlQUFwQztBQUNBLFNBQVNDLFdBQVQsRUFBc0JDLFFBQXRCLEVBQWdDQyx1QkFBaEMsUUFBK0QsbUJBQS9EO0FBQ0EsU0FBU0MsSUFBVCxRQUFxQixhQUFyQjtBQUNBLFNBQVNDLFFBQVQsUUFBeUIsMEJBQXpCO0FBQ0EsU0FBU0MsZUFBVCxFQUEwQkMsSUFBMUIsUUFBc0MsNEJBQXRDO0FBQ0EsU0FBU0MsS0FBVCxRQUFzQixpQkFBdEI7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0EsT0FBTyxNQUFNQyxZQUFOLFNBQTJCSCxlQUFlLENBQUNQLFVBQUQsQ0FBMUMsQ0FBdUQ7QUFDdkMsYUFBVlcsVUFBVSxHQUFHO0FBQ3RCLFdBQU87QUFDTEMsTUFBQUEscUJBQXFCLEVBQUU7QUFBRUMsUUFBQUEsSUFBSSxFQUFFQztBQUFSLE9BRGxCO0FBRUxILE1BQUFBLFVBQVUsRUFBRTtBQUFFRSxRQUFBQSxJQUFJLEVBQUVFO0FB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Y2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBHcmF2aXRlZSB0ZWFtIChodHRwOi8vZ3Jhdml0ZWUuaW8pXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcblxuaW1wb3J0ICcuL2d2LXNjaGVtYS1mb3JtJztcbmltcG9ydCAnLi9ndi1yZXNpemFibGUtdmlld3MnO1xuaW1wb3J0ICcuLi9tb2xlY3VsZXMvZ3YtdGFibGUnO1xuaW1wb3J0ICcuLi9hdG9tcy9ndi1idXR0b24nO1xuaW1wb3J0ICcuLi9hdG9tcy9ndi1pbnB1dCc7XG5pbXBvcnQgJy4uL2F0b21zL2d2LWljb24nO1xuaW1wb3J0ICcuLi9hdG9tcy9ndi10ZXh0JztcbmltcG9ydCAnLi4vYXRvbXMvZ3YtaW5wdXQtbWVzc2FnZSc7XG5pbXBvcnQgJy4uL2F0b21zL2d2LXNlbGVjdCc7XG5pbXBvcnQgeyBkaXNwYXRjaEN1c3RvbUV2ZW50IH0gZnJvbSAnLi4vbGliL2V2ZW50cyc7XG5pbXBvcnQgeyBFUlJPUl9UWVBFUywgcGFyc2VSYXcsIHRvTmFtZUVxdWFsc1ZhbHVlU3RyaW5nIH0gZnJvbSAnLi4vbGliL3Byb3BlcnRpZXMnO1xuaW1wb3J0IHsgaTE4biB9IGZyb20gJy4uL2xpYi9pMThuJztcbmltcG9ydCB7IGNsYXNzTWFwIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvY2xhc3MtbWFwJztcbmltcG9ydCB7IEtleWJvYXJkRWxlbWVudCwgS0VZUyB9IGZyb20gJy4uL21peGlucy9rZXlib2FyZC1lbGVtZW50JztcbmltcG9ydCB7IGVtcHR5IH0gZnJvbSAnLi4vc3R5bGVzL2VtcHR5JztcblxuLyoqXG4gKiBBIGNvbXBvbmVudCB0byBtYW5hZ2UgcHJvcGVydGllc1xuICpcbiAqIEBmaXJlcyBndi1wcm9wZXJ0aWVzOmNoYW5nZSAtIFdoZW4gbGlzdCBvZiBwcm9wZXJ0aWVzIGNoYW5nZVxuICogQGZpcmVzIGd2LXByb3BlcnRpZXM6c2F2ZS1wcm92aWRlciAtIFdoZW4gdXNlciB2YWxpZGF0ZXMgcHJvdmlkZXIgY29uZmlndXJhdGlvblxuICogQGZpcmVzIGd2LXByb3BlcnRpZXM6c3dpdGNoLWVuY3J5cHRlZCAtIFdoZW4gdXNlciBzd2l0Y2hlcyBlbmNyeXB0aW9uIHRvZ2dsZVxuICpcbiAqIEBhdHRyIHtBcnJheX0gcHJvcGVydGllcyAtIEFycmF5IG9mIFByb3BlcnRpZXMge2tleSwgdmFsdWUsIGR5bmFtaWM/fVxuICogQGF0dHIge09iamVjdH0gcHJvdmlkZXIgLSBDb25maWd1cmF0aW9uIG9mIHByb3ZpZGVyXG4gKiBAYXR0ciB7QXJyYXl9IHByb3ZpZGVycyAtIExpc3Qgb2YgYXZhaWxhYmxlIHByb3ZpZGVycyAob25seSBodHRwIGZvciB0aGUgbW9tZW50KVxuICogQGF0dHIge0Jvb2xlYW59IGV4cGVydCAtIEZvciBkaXNwbGF5IGV4cGVydCBtb2RlIGJ5IGRlZmF1bHRcbiAqIEBhdHRyIHtCb29sZWFufSBlbmNyeXB0YWJsZSAtIFRvIGRpc3BsYXkgdGhlICdlbmNyeXB0ZWQnIHRvZ2dsZSBvbiBlYWNoIHByb3BlcnR5XG4gKlxuICogQGNzc3Byb3Age0xlbmd0aH0gWy0tZ3YtcHJvcGVydGllcy10YWJsZS0tY29sbWc9MC4ycmVtXSAtIFRhYmxlIGNlbGxzIG1hcmdpblxuICovXG5leHBvcnQgY2xhc3MgR3ZQcm9wZXJ0aWVzIGV4dGVuZHMgS2V5Ym9hcmRFbGVtZW50KExpdEVsZW1lbnQpIHtcbiAgc3RhdGljIGdldCBwcm9wZXJ0aWVzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBkeW5hbWljUHJvcGVydHlTY2hlbWE6IHsgdHlwZTogT2JqZWN0IH0sXG4gICAgICBwcm9wZXJ0aWVzOiB7IHR5cGU6IEFycmF5IH0sXG4gICAgICBfcHJvcGVydGllczogeyB0eXBlOiBBcnJheSwgYXR0cmlidXRlOiBmYWxzZSB9LFxuICAgICAgcHJvdmlkZXI6IHsgdHlwZTogT2JqZWN0IH0sXG4gICAgICBwcm92aWRlcnM6IHsgdHlwZTogQXJyYXkgfSxcbiAgICAgIF9wcm9wZXJ0eVNjaGVtYUZvcm06IHsgdHlwZTogT2JqZWN0LCBhdHRyaWJ1dGU6IGZhbHNlIH0sXG4gICAgICBleHBlcnQ6IHsgdHlwZTogQm9vbGVhbiB9LFxuICAgICAgX2Zvcm1hdHRlZEVycm9yczogeyB0eXBlOiBBcnJheSwgYXR0cmlidXRlczogZmFsc2UgfSxcbiAgICAgIF9maWx0ZXI6IHsgdHlwZTogU3RyaW5nIH0sXG4gICAgICBfcGFnaW5hdGlvbkRhdGE6IHsgdHlwZTogT2JqZWN0LCBhdHRyaWJ1dGU6IGZhbHNlIH0sXG4gICAgICBfcGFnZVNpemU6IHsgdHlwZTogTnVtYmVyLCBhdHRyaWJ1dGU6IGZhbHNlIH0sXG4gICAgICBfbmV3SXRlbTogeyB0eXBlOiBPYmplY3QsIGF0dHJpYnV0ZTogZmFsc2UgfSxcbiAgICAgIF9wcm92aWRlckRvY3VtZW50YXRpb246IHsgdHlwZTogQm9vbGVhbiwgYXR0cmlidXRlOiBmYWxzZSB9LFxuICAgICAgX3Nob3dEb2N1bWVudGF0aW9uOiB7IHR5cGU6IEJvb2xlYW4sIGF0dHJpYnV0ZTogZmFsc2UgfSxcbiAgICAgIF90ZXh0Um93czogeyB0eXBlOiBOdW1iZXIsIGF0dHJpYnV0ZTogZmFsc2UgfSxcbiAgICAgIHJlYWRvbmx5OiB7IHR5cGU6IEJvb2xlYW4sIHJlZmxlY3Q6IHRydWUgfSxcbiAgICAgIGVuY3J5cHRhYmxlOiB7IHR5cGU6IEJvb2xlYW4sIHJlZmxlY3Q6IHRydWUgfSxcbiAgICB9O1xuICB9XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnByb3BlcnRpZXMgPSBbXTtcbiAgICB0aGlzLnR5cGVzID0gW107XG4gICAgdGhpcy5wcm92aWRlciA9IHt9O1xuICAgIHRoaXMuX2N1cnJlbnRSZXNvdXJjZSA9IG51bGw7XG4gICAgdGhpcy5fZm9ybWF0dGVkRXJyb3JzID0gW107XG4gICAgdGhpcy5fc2hvd0RvY3VtZW50YXRpb24gPSB0cnVlO1xuICAgIHRoaXMuX25ld0l0ZW0gPSB7IGtleTogJycsIHZhbHVlOiAnJywgX25ldzogdHJ1ZSB9O1xuICAgIHRoaXMuX3BhZ2VTaXplID0gMTA7XG4gICAgdGhpcy5fdGV4dFJvd3MgPSAxMDtcbiAgICB0aGlzLl9wYWdlU2l6ZXMgPSBbNSwgMTAsIDI1LCA1MCwgMTAwXTtcbiAgICB0aGlzLl9lcnJvcnMgPSBbXTtcbiAgfVxuXG4gIG9uS2V5Ym9hcmQoKSB7XG4gICAgaWYgKHRoaXMuaXNQcmVzc2VkKEtFWVMuRXNjKSkge1xuICAgICAgdGhpcy5fb25DbG9zZVByb3BlcnR5U2NoZW1hRm9ybSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc1ByZXNzZWQoS0VZUy5TaGlmdCwgS0VZUy5DdHJsLCBLRVlTLlNwYWNlKSkge1xuICAgICAgY29uc3Qgc2VhcmNoID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJyNzZWFyY2gtcHJvcGVydHknKTtcbiAgICAgIGlmIChzZWFyY2gpIHtcbiAgICAgICAgc2VhcmNoLmZvY3VzKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc2V0IHByb3BlcnRpZXMocHJvcGVydGllcykge1xuICAgIHRoaXMuX3Byb3BlcnRpZXMgPSBwcm9wZXJ0aWVzXG4gICAgICAuc29ydCgoYSwgYikgPT4gYS5rZXkubG9jYWxlQ29tcGFyZShiLmtleSkpXG4gICAgICAubWFwKChwcm9wZXJ0eSkgPT4ge1xuICAgICAgICBpZiAocHJvcGVydHkuZW5jcnlwdGVkKSB7XG4gICAgICAgICAgcHJvcGVydHkuZW5jcnlwdGFibGUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9wZXJ0eTtcbiAgICAgIH0pO1xuICB9XG5cbiAgZ2V0IHByb3BlcnRpZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Byb3BlcnRpZXM7XG4gIH1cblxuICBfZ2V0UmVzaXphYmxlVmlld3MoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCdndi1yZXNpemFibGUtdmlld3MnKTtcbiAgfVxuXG4gIF9tYXhpbWl6ZVRvcFZpZXcoKSB7XG4gICAgY29uc3Qgdmlld3MgPSB0aGlzLl9nZXRSZXNpemFibGVWaWV3cygpO1xuICAgIGlmICh2aWV3cykge1xuICAgICAgdmlld3MubWF4aW1pemVUb3AoOTUsIDUpO1xuICAgIH1cbiAgfVxuXG4gIF9tYXhpbWl6ZUJvdHRvbVZpZXcoKSB7XG4gICAgY29uc3Qgdmlld3MgPSB0aGlzLl9nZXRSZXNpemFibGVWaWV3cygpO1xuICAgIGlmICh2aWV3cykge1xuICAgICAgdmlld3MucmVzaXplKDMwLCA3MCk7XG4gICAgfVxuICB9XG5cbiAgX3NwbGl0TWFpblZpZXdzKCkge1xuICAgIGNvbnN0IHZpZXdzID0gdGhpcy5fZ2V0UmVzaXphYmxlVmlld3MoKTtcbiAgICBpZiAodmlld3MpIHtcbiAgICAgIHZpZXdzLnNwbGl0KCk7XG4gICAgfVxuICB9XG5cbiAgX2lzTmV3TGluZVRhYmxlKGxpbmUpIHtcbiAgICByZXR1cm4gbGluZS5fbmV3ID09PSB0cnVlO1xuICB9XG5cbiAgX29uSW5wdXROZXcobmFtZSwgZXZlbnQpIHtcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQ7XG4gICAgdGhpcy5fbmV3SXRlbVtuYW1lXSA9IGV2ZW50LmRldGFpbDtcbiAgICBjb25zdCB7IGVycm9ycyB9ID0gcGFyc2VSYXcodG9OYW1lRXF1YWxzVmFsdWVTdHJpbmcoWy4uLnRoaXMucHJvcGVydGllcywgdGhpcy5fbmV3SXRlbV0pKTtcbiAgICB0aGlzLl9lcnJvcnMgPSBlcnJvcnM7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjb25zdCBidG4gPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcignZ3YtYnV0dG9uI2FkZC1wcm9wZXJ0eScpO1xuICAgICAgaWYgKGVycm9ycy5sZW5ndGggPiAwIHx8IHRoaXMuX2Rpc2FibGVkTmV3TGluZSh0aGlzLl9uZXdJdGVtKSkge1xuICAgICAgICBidG4uc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsIHRydWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYnRuLnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKTtcbiAgICAgIH1cbiAgICAgIGlmIChuYW1lID09PSAna2V5Jykge1xuICAgICAgICBpZiAoZXJyb3JzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRhcmdldC5yZW1vdmVBdHRyaWJ1dGUoJ2ludmFsaWQnKTtcbiAgICAgICAgICB0YXJnZXQuc2V0QXR0cmlidXRlKCd2YWxpZCcsIHRydWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRhcmdldC5yZW1vdmVBdHRyaWJ1dGUoJ3ZhbGlkJyk7XG4gICAgICAgICAgdGFyZ2V0LnNldEF0dHJpYnV0ZSgnaW52YWxpZCcsIHRydWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgMCk7XG4gIH1cblxuICBfb25JbnB1dCgpIHtcbiAgICBkaXNwYXRjaEN1c3RvbUV2ZW50KHRoaXMsICdjaGFuZ2UnLCB7IHByb3BlcnRpZXM6IHRoaXMucHJvcGVydGllcyB9KTtcbiAgfVxuXG4gIF9vblN3aXRjaEVuY3J5cHRlZChpdGVtKSB7XG4gICAgaWYgKGl0ZW0uZW5jcnlwdGVkID09PSB0cnVlKSB7XG4gICAgICBpdGVtLnZhbHVlID0gJyc7XG4gICAgICBpdGVtLmVuY3J5cHRlZCA9IGZhbHNlO1xuICAgICAgaXRlbS5lbmNyeXB0aW9uV2FybmluZyA9IGkxOG4oJ2d2LXByb3BlcnRpZXMuaW5mb3Mub3ZlcndyaXRlLWVuY3J5cHRpb24nKTtcbiAgICAgIHRoaXMucmVxdWVzdFVwZGF0ZSgpO1xuICAgIH1cbiAgICBkaXNwYXRjaEN1c3RvbUV2ZW50KHRoaXMsICdzd2l0Y2gtZW5jcnlwdGVkJywgeyBwcm9wZXJ0aWVzOiB0aGlzLnByb3BlcnRpZXMgfSk7XG4gIH1cblxuICBfYWRkUHJvcGVydHkoaXRlbSkge1xuICAgIGRlbGV0ZSBpdGVtLl9uZXc7XG4gICAgdGhpcy5wcm9wZXJ0aWVzID0gW2l0ZW0sIC4uLnRoaXMuX3Byb3BlcnRpZXNdO1xuICAgIHRoaXMuX25ld0l0ZW0gPSB7IGtleTogJycsIHZhbHVlOiAnJywgX25ldzogdHJ1ZSwgZW5jcnlwdGFibGU6IGZhbHNlLCBlbmNyeXB0ZWQ6IGZhbHNlIH07XG4gICAgZGlzcGF0Y2hDdXN0b21FdmVudCh0aGlzLCAnY2hhbmdlJywgeyBwcm9wZXJ0aWVzOiB0aGlzLnByb3BlcnRpZXMgfSk7XG4gIH1cblxuICBfcmVtb3ZlUHJvcGVydHkoaXRlbSkge1xuICAgIHRoaXMuX3Byb3BlcnRpZXMgPSB0aGlzLl9wcm9wZXJ0aWVzLmZpbHRlcigocHJvcGVydHkpID0+IHByb3BlcnR5LmtleSAhPT0gaXRlbS5rZXkpO1xuICAgIGRpc3BhdGNoQ3VzdG9tRXZlbnQodGhpcywgJ2NoYW5nZScsIHsgcHJvcGVydGllczogdGhpcy5wcm9wZXJ0aWVzIH0pO1xuICB9XG5cbiAgX2Rpc2FibGVkTmV3TGluZShpdGVtKSB7XG4gICAgcmV0dXJuIGl0ZW0ua2V5ID09IG51bGwgfHwgaXRlbS52YWx1ZSA9PSBudWxsIHx8IGl0ZW0ua2V5LnRyaW0oKSA9PT0gJycgfHwgaXRlbS52YWx1ZS50cmltKCkgPT09ICcnO1xuICB9XG5cbiAgX3N1Ym1pdEV4cGVydE1vZGUoKSB7XG4gICAgaWYgKHRoaXMuZXhwZXJ0KSB7XG4gICAgICB0aGlzLnByb3BlcnRpZXMgPSB0aGlzLl9oYW5kbGVFeHBlcnRNb2RlSW5wdXQodGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJyNleHBlcnQtaW5wdXQnKS52YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgX29uRXhwZXJ0TW9kZVRleHRJbnB1dCh7IGRldGFpbCB9KSB7XG4gICAgdGhpcy5faGFuZGxlRXhwZXJ0TW9kZUlucHV0KGRldGFpbCk7XG4gIH1cblxuICBfaGFuZGxlRXhwZXJ0TW9kZUlucHV0KGV4cGVydE1vZGVJbnB1dFN0cmluZykge1xuICAgIGxldCBhbGxQcm9wZXJ0aWVzID0gdGhpcy5fcHJvcGVydGllcztcbiAgICBjb25zdCBwcm92aWRlckVuYWJsZWQgPSB0aGlzLnByb3ZpZGVyICYmIHRoaXMucHJvdmlkZXIuZW5hYmxlZDtcbiAgICBjb25zdCBkeW5hbWljUHJvcGVydGllcyA9IGFsbFByb3BlcnRpZXMuZmlsdGVyKChwcm9wKSA9PiBwcm92aWRlckVuYWJsZWQgJiYgcHJvcC5keW5hbWljKTtcbiAgICBjb25zdCBlbmNyeXB0ZWRQcm9wZXJ0aWVzID0gYWxsUHJvcGVydGllcy5maWx0ZXIoKHByb3ApID0+IHByb3AuZW5jcnlwdGVkKTtcblxuICAgIGNvbnN0IGFsbFByb3BlcnRpZXNTdHJpbmcgPSBgJHtleHBlcnRNb2RlSW5wdXRTdHJpbmd9XFxuJHt0b05hbWVFcXVhbHNWYWx1ZVN0cmluZyhkeW5hbWljUHJvcGVydGllcyl9XFxuJHt0b05hbWVFcXVhbHNWYWx1ZVN0cmluZyhcbiAgICAgIGVuY3J5cHRlZFByb3BlcnRpZXMsXG4gICAgKX1gO1xuICAgIGNvbnN0IHsgZXJyb3JzIH0gPSBwYXJzZVJhdyhhbGxQcm9wZXJ0aWVzU3RyaW5nKTtcbiAgICB0aGlzLl9lcnJvcnMgPSBlcnJvcnM7XG4gICAgaWYgKGVycm9ycy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnN0IHsgdmFyaWFibGVzIH0gPSBwYXJzZVJhdyhleHBlcnRNb2RlSW5wdXRTdHJpbmcpO1xuICAgICAgYWxsUHJvcGVydGllcyA9IFsuLi52YXJpYWJsZXMsIC4uLmR5bmFtaWNQcm9wZXJ0aWVzLCAuLi5lbmNyeXB0ZWRQcm9wZXJ0aWVzXTtcbiAgICAgIGRpc3BhdGNoQ3VzdG9tRXZlbnQodGhpcywgJ2NoYW5nZScsIHsgcHJvcGVydGllczogYWxsUHJvcGVydGllcyB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWxsUHJvcGVydGllcztcbiAgfVxuXG4gIF9vblN1Ym1pdFByb3BlcnR5Rm9ybSh7IGRldGFpbCB9KSB7XG4gICAgY29uc3QgcHJvdmlkZXIgPSBkZXRhaWwudmFsdWVzO1xuICAgIGRpc3BhdGNoQ3VzdG9tRXZlbnQodGhpcywgJ3NhdmUtcHJvdmlkZXInLCB7IHByb3ZpZGVyIH0pO1xuICAgIHRoaXMucmVxdWVzdFVwZGF0ZSgpO1xuICB9XG5cbiAgc3VibWl0KCkge1xuICAgIGlmICh0aGlzLmV4cGVydCkge1xuICAgICAgdGhpcy5fc3VibWl0RXhwZXJ0TW9kZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9vblN1Ym1pdCgpO1xuICAgIH1cbiAgfVxuXG4gIF9vblN1Ym1pdCgpIHtcbiAgICBjb25zdCBpbnZhbGlkQ29udHJvbHMgPSBbLi4udGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGwoJ2Zvcm0gLmNvbnRyb2wnKV0uZmluZCgoY29udHJvbCkgPT4gY29udHJvbC5pbnZhbGlkKTtcbiAgICBpZiAoaW52YWxpZENvbnRyb2xzID09IG51bGwpIHtcbiAgICAgIHRoaXMuX2FkZFByb3BlcnR5KHRoaXMuX25ld0l0ZW0pO1xuICAgIH1cbiAgfVxuXG4gIF9vbkNvbmZpZ3VyZUR5bmFtaWNQcm9wZXJ0aWVzKCkge1xuICAgIGlmICh0aGlzLmR5bmFtaWNQcm9wZXJ0eVNjaGVtYSA9PSBudWxsKSB7XG4gICAgICAvLyBkeW5hbWljUHJvcGVydHlTY2hlbWEgaGFzIGJlZW4gaW50cm9kdWNlZCB0byBlbnN1cmUgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIG9sZCB2ZXJzaW9ucy4gSWYgbm8gc2NoZW1hIGlzIHByb3ZpZGVkIGEgZGVmYXVsdCBzY2hlbWEgd2lsbCBiZSB1c2VkLlxuICAgICAgY29uc3QgcHJvdmlkZXJzVGl0bGVNYXAgPSB0aGlzLnByb3ZpZGVycy5yZWR1Y2UoKG1hcCwgcHJvdmlkZXIpID0+IHtcbiAgICAgICAgbWFwW3Byb3ZpZGVyLmlkXSA9IHByb3ZpZGVyLmtleTtcbiAgICAgICAgcmV0dXJuIG1hcDtcbiAgICAgIH0sIHt9KTtcblxuICAgICAgY29uc3QgcHJvdmlkZXJzRW51bSA9IE9iamVjdC5rZXlzKHByb3ZpZGVyc1RpdGxlTWFwKTtcbiAgICAgIHRoaXMuZHluYW1pY1Byb3BlcnR5U2NoZW1hID0ge1xuICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgZW5hYmxlZDoge1xuICAgICAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICAgICAgdGl0bGU6ICdFbmFibGVkJyxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnIFRoaXMgc2VydmljZSBpcyByZXF1aXJpbmcgYW4gQVBJIGRlcGxveW1lbnQuIERvIG5vdCBmb3JnZXQgdG8gZGVwbG95IEFQSSB0byBzdGFydCBkeW5hbWljLXByb3BlcnRpZXMgc2VydmljZS4nLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgc2NoZWR1bGU6IHtcbiAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgICAgdGl0bGU6ICdTY2hlZHVsZScsXG4gICAgICAgICAgICAneC1zY2hlbWEtZm9ybSc6IHtcbiAgICAgICAgICAgICAgJ2Nyb24tZXhwcmVzc2lvbic6IHRydWUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcHJvdmlkZXI6IHtcbiAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgICAgdGl0bGU6ICdQcm92aWRlciB0eXBlJyxcbiAgICAgICAgICAgIGVudW06IHByb3ZpZGVyc0VudW0sXG4gICAgICAgICAgICBkZWZhdWx0OiBwcm92aWRlcnNFbnVtWzBdLFxuICAgICAgICAgICAgJ3gtc2NoZW1hLWZvcm0nOiB7XG4gICAgICAgICAgICAgIHRpdGxlTWFwOiBwcm92aWRlcnNUaXRsZU1hcCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgcmVxdWlyZWQ6IFsnc2NoZWR1bGUnLCAncHJvdmlkZXInXSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgZGVmYXVsdFByb3ZpZGVyID0gdGhpcy5wcm92aWRlcnNbMF07XG5cbiAgICB0aGlzLl9wcm9wZXJ0eVNjaGVtYUZvcm0gPSB7XG4gICAgICBwcm9wZXJ0aWVzOiB7IC4uLnRoaXMuZHluYW1pY1Byb3BlcnR5U2NoZW1hLnByb3BlcnRpZXMsIGNvbmZpZ3VyYXRpb246IGRlZmF1bHRQcm92aWRlci5zY2hlbWEgfSxcbiAgICAgIHJlcXVpcmVkOiB0aGlzLmR5bmFtaWNQcm9wZXJ0eVNjaGVtYS5yZXF1aXJlZCxcbiAgICB9O1xuICAgIHRoaXMuX3Byb3ZpZGVyRG9jdW1lbnRhdGlvbiA9IGRlZmF1bHRQcm92aWRlci5kb2N1bWVudGF0aW9uO1xuICAgIHRoaXMuX21heGltaXplQm90dG9tVmlldygpO1xuICB9XG5cbiAgX29uQ2xvc2VQcm9wZXJ0eVNjaGVtYUZvcm0oKSB7XG4gICAgdGhpcy5fcHJvcGVydHlTY2hlbWFGb3JtID0gbnVsbDtcbiAgICB0aGlzLl9tYXhpbWl6ZVRvcFZpZXcoKTtcbiAgfVxuXG4gIF9vblNlYXJjaFByb3BlcnR5KHsgZGV0YWlsIH0pIHtcbiAgICB0aGlzLl9maWx0ZXIgPSBkZXRhaWw7XG4gICAgdGhpcy5fb25DbG9zZVByb3BlcnR5U2NoZW1hRm9ybSgpO1xuICB9XG5cbiAgX29uQ2xlYXJQcm9wZXJ0eSgpIHtcbiAgICB0aGlzLl9maWx0ZXIgPSBudWxsO1xuICAgIHRoaXMuX29uQ2xvc2VQcm9wZXJ0eVNjaGVtYUZvcm0oKTtcbiAgfVxuXG4gIGdldCBfZXJyb3JzKCkge1xuICAgIHJldHVybiB0aGlzLl9mb3JtYXR0ZWRFcnJvcnM7XG4gIH1cblxuICBzZXQgX2Vycm9ycyhyYXdFcnJvcnMpIHtcbiAgICB0aGlzLl9mb3JtYXR0ZWRFcnJvcnMgPSByYXdFcnJvcnMubWFwKCh7IHR5cGUsIGtleSwgcG9zIH0pID0+IHtcbiAgICAgIGlmICh0eXBlID09PSBFUlJPUl9UWVBFUy5JTlZBTElEX05BTUUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBsaW5lOiBwb3MubGluZSxcbiAgICAgICAgICBtc2c6IGkxOG4oJ2d2LXByb3BlcnRpZXMuZXJyb3JzLmludmFsaWQta2V5JywgeyBrZXkgfSksXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAodHlwZSA9PT0gRVJST1JfVFlQRVMuRFVQTElDQVRFRF9OQU1FKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbGluZTogcG9zLmxpbmUsXG4gICAgICAgICAgbXNnOiBpMThuKCdndi1wcm9wZXJ0aWVzLmVycm9ycy5kdXBsaWNhdGVkLWtleScsIHsga2V5IH0pLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKHR5cGUgPT09IEVSUk9SX1RZUEVTLklOVkFMSURfTElORSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGxpbmU6IHBvcy5saW5lLFxuICAgICAgICAgIG1zZzogaTE4bignZ3YtcHJvcGVydGllcy5lcnJvcnMuaW52YWxpZC1saW5lJyksXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAodHlwZSA9PT0gRVJST1JfVFlQRVMuSU5WQUxJRF9WQUxVRSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGxpbmU6IHBvcy5saW5lLFxuICAgICAgICAgIG1zZzogaTE4bignZ3YtcHJvcGVydGllcy5lcnJvcnMuaW52YWxpZC12YWx1ZScpLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgbGluZTogJz8nLCBtc2c6IGkxOG4oJ2d2LXByb3BlcnRpZXMuZXJyb3JzLnVua25vd24nKSB9O1xuICAgIH0pO1xuICB9XG5cbiAgX3JlbmRlckVycm9ycyh3aXRoTGluZSA9IGZhbHNlKSB7XG4gICAgaWYgKHRoaXMuX2Zvcm1hdHRlZEVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gaHRtbGA8ZGl2IGNsYXNzPVwiJHtjbGFzc01hcCh7ICdhZGQtZm9ybS1lcnJvcic6IHRydWUsICdhZGQtZm9ybS1lcnJvcl9leHBlcnQnOiB0aGlzLmV4cGVydCB9KX1cIj5cbiAgICAgICAgPGRpdj48L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImVycm9yLWxpc3RcIj5cbiAgICAgICAgICAke3RoaXMuX2Zvcm1hdHRlZEVycm9ycy5tYXAoXG4gICAgICAgICAgICAoeyBsaW5lLCBtc2cgfSkgPT4gaHRtbGBcbiAgICAgICAgICAgICAgPGd2LWlucHV0LW1lc3NhZ2VcbiAgICAgICAgICAgICAgICA+JHt3aXRoTGluZSA/IGh0bWxgPHN0cm9uZyAuaW5uZXJIVE1MPVwiJHtpMThuKCdndi1wcm9wZXJ0aWVzLmVycm9ycy5saW5lJyl9ICR7bGluZX06Jm5ic3A7XCI+PC9zdHJvbmc+YCA6ICcnfVxuICAgICAgICAgICAgICAgIDxzcGFuIC5pbm5lckhUTUw9XCIke21zZ31cIj48L3NwYW5cbiAgICAgICAgICAgICAgPjwvZ3YtaW5wdXQtbWVzc2FnZT5cbiAgICAgICAgICAgIGAsXG4gICAgICAgICAgKX1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5gO1xuICAgIH1cbiAgICByZXR1cm4gaHRtbGBgO1xuICB9XG5cbiAgX3JlbmRlclRhYmxlKCkge1xuICAgIGNvbnN0IHByb3ZpZGVyRW5hYmxlZCA9IHRoaXMucHJvdmlkZXIgJiYgdGhpcy5wcm92aWRlci5lbmFibGVkO1xuICAgIGlmICh0aGlzLmV4cGVydCkge1xuICAgICAgdGhpcy5fY29tcHV0ZVRleHRSb3dzKCk7XG5cbiAgICAgIGNvbnN0IHN0YXRpY1Byb3BlcnRpZXMgPSBwcm92aWRlckVuYWJsZWQgPyB0aGlzLl9wcm9wZXJ0aWVzLmZpbHRlcigocHJvcCkgPT4gIShwcm92aWRlckVuYWJsZWQgJiYgcHJvcC5keW5hbWljKSkgOiB0aGlzLl9wcm9wZXJ0aWVzO1xuICAgICAgY29uc3QgZXhwZXJ0UHJvcGVydGllcyA9IHN0YXRpY1Byb3BlcnRpZXMuZmlsdGVyKChwcm9wKSA9PiAhcHJvcC5lbmNyeXB0ZWQpO1xuICAgICAgY29uc3QgY29udGVudCA9IGV4cGVydFByb3BlcnRpZXMubWFwKChwcm9wKSA9PiBgJHtwcm9wLmtleX09XCIke3Byb3AudmFsdWV9XCJgKS5qb2luKCdcXG4nKTtcblxuICAgICAgcmV0dXJuIGh0bWxgPGd2LXRleHRcbiAgICAgICAgICBpZD1cImV4cGVydC1pbnB1dFwiXG4gICAgICAgICAgcGxhY2Vob2xkZXI9XCIke2kxOG4oJ2d2LXByb3BlcnRpZXMucGxhY2Vob2xkZXIuaW5wdXQnKX1cIlxuICAgICAgICAgIEBndi10ZXh0OmlucHV0PVwiJHt0aGlzLl9vbkV4cGVydE1vZGVUZXh0SW5wdXR9XCJcbiAgICAgICAgICAudmFsdWU9XCIke2NvbnRlbnR9XCJcbiAgICAgICAgICA/cmVhZG9ubHk9XCIke3RoaXMucmVhZG9ubHl9XCJcbiAgICAgICAgICAucm93cz1cIiR7dGhpcy5fdGV4dFJvd3N9XCJcbiAgICAgICAgPjwvZ3YtdGV4dD5cbiAgICAgICAgJHt0aGlzLl9yZW5kZXJFcnJvcnModHJ1ZSl9YDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgZGF0YTogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGZpZWxkOiAnZHluYW1pYycsXG4gICAgICAgICAgICBsYWJlbDogJ0R5bmFtaWMnLFxuICAgICAgICAgICAgd2lkdGg6ICc0MHB4JyxcbiAgICAgICAgICAgIHR5cGU6IChpdGVtKSA9PiAoaXRlbS5keW5hbWljICYmIHByb3ZpZGVyRW5hYmxlZCA/ICdndi1pY29uJyA6ICdkaXYnKSxcbiAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICAgICAgc2hhcGU6IChpdGVtKSA9PiAoaXRlbS5keW5hbWljICYmIHByb3ZpZGVyRW5hYmxlZCA/ICdjb2RlOnRpbWUtc2NoZWR1bGUnIDogJycpLFxuICAgICAgICAgICAgICB0aXRsZTogKGl0ZW0pID0+IChpdGVtLmR5bmFtaWMgJiYgcHJvdmlkZXJFbmFibGVkID8gJ0R5bmFtaWMgcHJvcGVydGllcyBzZXJ2aWNlIGlzIGFjdHVhbGx5IGluIHJ1bm5pbmcnIDogJycpLFxuICAgICAgICAgICAgICBzdHlsZTogJ2p1c3RpZnktY29udGVudDogY2VudGVyOyBhbGlnbi1pdGVtczogY2VudGVyOyBoZWlnaHQ6IDEwMCU7JyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBmaWVsZDogJ2tleScsXG4gICAgICAgICAgICBsYWJlbDogJ0tleScsXG4gICAgICAgICAgICB0eXBlOiAnZ3YtaW5wdXQnLFxuICAgICAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgICAgICBjbGlwYm9hcmQ6IHRydWUsXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyOiBpMThuKCdndi1wcm9wZXJ0aWVzLnBsYWNlaG9sZGVyLmtleScpLFxuICAgICAgICAgICAgICBuYW1lOiAna2V5JyxcbiAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgIHJlYWRvbmx5OiB0aGlzLnJlYWRvbmx5LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGZpZWxkOiAndmFsdWUnLFxuICAgICAgICAgICAgbGFiZWw6ICdWYWx1ZScsXG4gICAgICAgICAgICB0eXBlOiAnZ3YtaW5wdXQnLFxuICAgICAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgICAgICBuYW1lOiAndmFsdWUnLFxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcjogJ1Byb3BlcnR5IHZhbHVlJyxcbiAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgIHJlYWRvbmx5OiB0aGlzLnJlYWRvbmx5LFxuICAgICAgICAgICAgICBkaXNhYmxlZDogKGl0ZW0pID0+IChpdGVtLmR5bmFtaWMgJiYgcHJvdmlkZXJFbmFibGVkKSB8fCBpdGVtLmVuY3J5cHRlZCxcbiAgICAgICAgICAgICAgdHlwZTogKGl0ZW0pID0+IChpdGVtLmVuY3J5cHRlZCA/ICdwYXNzd29yZCcgOiAndGV4dCcpLFxuICAgICAgICAgICAgICB0aXRsZTogKGl0ZW0pID0+IChpdGVtLmVuY3J5cHRlZCA/IGkxOG4oJ2d2LXByb3BlcnRpZXMuaW5mb3MuZW5jcnlwdGVkLXZhbHVlJykgOiAnJyksXG4gICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAoaXRlbSkgPT4gaXRlbS5lbmNyeXB0aW9uV2FybmluZyxcbiAgICAgICAgICAgICAgaWNvbjogbnVsbCxcbiAgICAgICAgICAgICAgJ29uZ3YtaW5wdXQ6aW5wdXQnOiB0aGlzLl9vbklucHV0LmJpbmQodGhpcyksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuXG4gICAgICBpZiAodGhpcy5lbmNyeXB0YWJsZSA9PT0gdHJ1ZSkge1xuICAgICAgICBvcHRpb25zLmRhdGEucHVzaCh7XG4gICAgICAgICAgZmllbGQ6ICdlbmNyeXB0YWJsZScsXG4gICAgICAgICAgdHlwZTogJ2d2LXN3aXRjaCcsXG4gICAgICAgICAgc3R5bGU6ICctLWd2LXN3aXRjaC0tdGE6IHJpZ2h0OycsXG4gICAgICAgICAgd2lkdGg6ICcxMDVweCcsXG4gICAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgICAgZGVzY3JpcHRpb246IGkxOG4oJ2d2LXByb3BlcnRpZXMuZW5jcnlwdGVkLXRvZ2dsZScpLFxuICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICByZWFkb25seTogdGhpcy5yZWFkb25seSxcbiAgICAgICAgICAgIGRpc2FibGVkOiAoaXRlbSkgPT4gaXRlbS5keW5hbWljICYmIHByb3ZpZGVyRW5hYmxlZCxcbiAgICAgICAgICAgICdvbmd2LXN3aXRjaDppbnB1dCc6IHRoaXMuX29uU3dpdGNoRW5jcnlwdGVkLmJpbmQodGhpcyksXG4gICAgICAgICAgICBzdHlsZTogJ2Rpc3BsYXk6IGlubGluZS1mbGV4OyBmb250LXNpemU6IDEycHg7IGhlaWdodDogNDBweDsnLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5yZWFkb25seSAhPT0gdHJ1ZSkge1xuICAgICAgICBvcHRpb25zLmRhdGEucHVzaCh7XG4gICAgICAgICAgdHlwZTogJ2d2LWJ1dHRvbicsXG4gICAgICAgICAgd2lkdGg6ICc0MHB4JyxcbiAgICAgICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgICAgICAnb25ndi1idXR0b246Y2xpY2snOiAoaXRlbSwgZXZlbnQsIHRhcmdldCkgPT4gdGhpcy5fcmVtb3ZlUHJvcGVydHkoaXRlbSwgdGFyZ2V0KSxcbiAgICAgICAgICAgIHRpdGxlOiAnUmVtb3ZlJyxcbiAgICAgICAgICAgIGRpc2FibGVkOiAoaXRlbSkgPT4gaXRlbS5keW5hbWljICYmIHByb3ZpZGVyRW5hYmxlZCxcbiAgICAgICAgICAgIGRhbmdlcjogdHJ1ZSxcbiAgICAgICAgICAgIG91dGxpbmVkOiB0cnVlLFxuICAgICAgICAgICAgaWNvbjogJ2hvbWU6dHJhc2gnLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmaWx0ZXJlZFByb3BlcnRpZXMgPVxuICAgICAgICB0aGlzLl9maWx0ZXIgIT0gbnVsbFxuICAgICAgICAgID8gdGhpcy5fcHJvcGVydGllcy5maWx0ZXIoKHByb3ApID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIChwcm9wLmtleS50b0xvd2VyQ2FzZSgpICsgcHJvcC52YWx1ZS50b0xvd2VyQ2FzZSgpKS5pbmNsdWRlcyh0aGlzLl9maWx0ZXIpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICA6IHRoaXMuX3Byb3BlcnRpZXM7XG4gICAgICBsZXQgcHJvcGVydGllcyA9IFsuLi5maWx0ZXJlZFByb3BlcnRpZXNdO1xuICAgICAgaWYgKHRoaXMuX3BhZ2luYXRpb25EYXRhKSB7XG4gICAgICAgIHRoaXMuX3BhZ2luYXRpb25EYXRhLmxhc3QgPSBNYXRoLmNlaWwoZmlsdGVyZWRQcm9wZXJ0aWVzLmxlbmd0aCAvIHRoaXMuX3BhZ2VTaXplKTtcbiAgICAgICAgdGhpcy5fcGFnaW5hdGlvbkRhdGEudG90YWwgPSBmaWx0ZXJlZFByb3BlcnRpZXMubGVuZ3RoO1xuICAgICAgICB0aGlzLl9wYWdpbmF0aW9uRGF0YS50b3RhbF9wYWdlcyA9IE1hdGguY2VpbChmaWx0ZXJlZFByb3BlcnRpZXMubGVuZ3RoIC8gdGhpcy5fcGFnZVNpemUpO1xuICAgICAgICBjb25zdCBpbmRleCA9ICh0aGlzLl9wYWdpbmF0aW9uRGF0YS5jdXJyZW50X3BhZ2UgLSAxKSAqIHRoaXMuX3BhZ2VTaXplO1xuICAgICAgICBwcm9wZXJ0aWVzID0gWy4uLmZpbHRlcmVkUHJvcGVydGllc10uc3BsaWNlKGluZGV4LCB0aGlzLl9wYWdlU2l6ZSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFkZFByb3BlcnR5Rm9ybUdyaWRDbGFzcyA9IHRoaXMuZW5jcnlwdGFibGUgPyAnYWRkLWZvcm0tZ3JpZC13aXRoLWVuY3J5cHRlZC10b2dnbGUnIDogJ2FkZC1mb3JtLWdyaWQnO1xuXG4gICAgICBjb25zdCBhZGRQcm9wZXJ0eUZvcm0gPVxuICAgICAgICB0aGlzLnJlYWRvbmx5ICE9PSB0cnVlXG4gICAgICAgICAgPyBodG1sYDxmb3JtIGlkPVwiYWRkLXByb3BlcnR5LWZvcm1cIiBjbGFzcz1cImFkZC1mb3JtICR7YWRkUHJvcGVydHlGb3JtR3JpZENsYXNzfVwiIEBzdWJtaXQ9XCIke3RoaXMuX29uU3VibWl0fVwiPlxuICAgICAgICAgICAgICAgIDxkaXY+PC9kaXY+XG4gICAgICAgICAgICAgICAgPGd2LWlucHV0XG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbnRyb2xcIlxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCIke2kxOG4oJ2d2LXByb3BlcnRpZXMucGxhY2Vob2xkZXIua2V5Jyl9XCJcbiAgICAgICAgICAgICAgICAgIHJlcXVpcmVkXG4gICAgICAgICAgICAgICAgICBAZ3YtaW5wdXQ6aW5wdXQ9XCIke3RoaXMuX29uSW5wdXROZXcuYmluZCh0aGlzLCAna2V5Jyl9XCJcbiAgICAgICAgICAgICAgICAgIHZhbHVlPVwiJHt0aGlzLl9uZXdJdGVtLmtleX1cIlxuICAgICAgICAgICAgICAgID48L2d2LWlucHV0PlxuICAgICAgICAgICAgICAgIDxndi1pbnB1dFxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb250cm9sXCJcbiAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiJHtpMThuKCdndi1wcm9wZXJ0aWVzLnBsYWNlaG9sZGVyLnZhbHVlJyl9XCJcbiAgICAgICAgICAgICAgICAgIHJlcXVpcmVkXG4gICAgICAgICAgICAgICAgICBAZ3YtaW5wdXQ6aW5wdXQ9XCIke3RoaXMuX29uSW5wdXROZXcuYmluZCh0aGlzLCAndmFsdWUnKX1cIlxuICAgICAgICAgICAgICAgICAgLnZhbHVlPVwiJHt0aGlzLl9uZXdJdGVtLnZhbHVlfVwiXG4gICAgICAgICAgICAgICAgPjwvZ3YtaW5wdXQ+XG4gICAgICAgICAgICAgICAgJHt0aGlzLmVuY3J5cHRhYmxlXG4gICAgICAgICAgICAgICAgICA/IGh0bWxgIDxndi1zd2l0Y2hcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbnRyb2xcIlxuICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkXG4gICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249XCIke2kxOG4oJ2d2LXByb3BlcnRpZXMuZW5jcnlwdGVkLXRvZ2dsZScpfVwiXG4gICAgICAgICAgICAgICAgICAgICAgQGd2LXN3aXRjaDppbnB1dD1cIiR7dGhpcy5fb25JbnB1dE5ldy5iaW5kKHRoaXMsICdlbmNyeXB0YWJsZScpfVwiXG4gICAgICAgICAgICAgICAgICAgICAgLnZhbHVlPVwiJHt0aGlzLl9uZXdJdGVtLmVuY3J5cHRhYmxlfVwiXG4gICAgICAgICAgICAgICAgICAgID48L2d2LXN3aXRjaD5gXG4gICAgICAgICAgICAgICAgICA6ICcnfVxuICAgICAgICAgICAgICAgIDxndi1idXR0b25cbiAgICAgICAgICAgICAgICAgIGlkPVwiYWRkLXByb3BlcnR5XCJcbiAgICAgICAgICAgICAgICAgIGljb249XCJjb2RlOnBsdXNcIlxuICAgICAgICAgICAgICAgICAgb3V0bGluZWRcbiAgICAgICAgICAgICAgICAgIGRpc2FibGVkXG4gICAgICAgICAgICAgICAgICBAZ3YtYnV0dG9uOmNsaWNrPVwiJHt0aGlzLl9hZGRQcm9wZXJ0eS5iaW5kKHRoaXMsIHRoaXMuX25ld0l0ZW0pfVwiXG4gICAgICAgICAgICAgICAgICB0aXRsZT1cIiR7aTE4bignZ3YtcHJvcGVydGllcy5hZGQnKX1cIlxuICAgICAgICAgICAgICAgID48L2d2LWJ1dHRvbj5cbiAgICAgICAgICAgICAgPC9mb3JtPlxuICAgICAgICAgICAgICAke3RoaXMuX3JlbmRlckVycm9ycygpfVxuICAgICAgICAgICAgICA8aHIgLz5gXG4gICAgICAgICAgOiAnJztcblxuICAgICAgcmV0dXJuIGh0bWxgICR7YWRkUHJvcGVydHlGb3JtfVxuICAgICAgICA8Z3YtdGFibGUgLm9wdGlvbnM9XCIke29wdGlvbnN9XCIgLml0ZW1zPVwiJHtwcm9wZXJ0aWVzfVwiIG5vaGVhZGVyIG5vc29ydCBvcmRlcj1cImtleVwiIHJvd2hlaWdodD1cIjU3cHhcIj48L2d2LXRhYmxlPmA7XG4gICAgfVxuICB9XG5cbiAgX29uQ2hhbmdlTW9kZSh7IGRldGFpbCB9KSB7XG4gICAgdGhpcy5fc3VibWl0RXhwZXJ0TW9kZSgpO1xuICAgIHRoaXMuZXhwZXJ0ID0gZGV0YWlsO1xuICAgIHRoaXMuX2Vycm9ycyA9IFtdO1xuICAgIHRoaXMuX25ld0l0ZW0gPSB7IGtleTogJycsIHZhbHVlOiAnJywgX25ldzogdHJ1ZSB9O1xuICAgIHRoaXMuX29uQ2xvc2VQcm9wZXJ0eVNjaGVtYUZvcm0oKTtcbiAgfVxuXG4gIF9vblBhZ2luYXRlKHsgZGV0YWlsIH0pIHtcbiAgICB0aGlzLl9wYWdpbmF0aW9uRGF0YS5jdXJyZW50X3BhZ2UgPSBkZXRhaWwucGFnZTtcbiAgICB0aGlzLl9vbkNsb3NlUHJvcGVydHlTY2hlbWFGb3JtKCk7XG4gICAgdGhpcy5yZXF1ZXN0VXBkYXRlKCk7XG4gIH1cblxuICB1cGRhdGVkKHByb3BzKSB7XG4gICAgaWYgKHByb3BzLmhhcygnX3Byb3BlcnRpZXMnKSB8fCBwcm9wcy5oYXMoJ19wYWdlU2l6ZScpKSB7XG4gICAgICB0aGlzLl9wYWdpbmF0aW9uRGF0YSA9IHtcbiAgICAgICAgZmlyc3Q6IDEsXG4gICAgICAgIGxhc3Q6IE1hdGguY2VpbCh0aGlzLl9wcm9wZXJ0aWVzLmxlbmd0aCAvIHRoaXMuX3BhZ2VTaXplKSxcbiAgICAgICAgdG90YWw6IHRoaXMuX3Byb3BlcnRpZXMubGVuZ3RoLFxuICAgICAgICBjdXJyZW50X3BhZ2U6IDEsXG4gICAgICAgIHRvdGFsX3BhZ2VzOiBNYXRoLmNlaWwodGhpcy5fcHJvcGVydGllcy5sZW5ndGggLyB0aGlzLl9wYWdlU2l6ZSksXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIF9vbkNoYW5nZVBhZ2VTaXplKHsgZGV0YWlsIH0pIHtcbiAgICB0aGlzLl9wYWdlU2l6ZSA9IE51bWJlcihkZXRhaWwpLnZhbHVlT2YoKTtcbiAgICB0aGlzLl9vbkNsb3NlUHJvcGVydHlTY2hlbWFGb3JtKCk7XG4gIH1cblxuICBfcmVuZGVyVGFibGVGb3JtKCkge1xuICAgIHJldHVybiBodG1sYDxkaXYgY2xhc3M9XCJjb250YWluZXJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInRpdGxlXCI+TWFuYWdlIGdsb2JhbCBwcm9wZXJ0aWVzIDxzcGFuPigke3RoaXMuX3Byb3BlcnRpZXMgPyB0aGlzLl9wcm9wZXJ0aWVzLmxlbmd0aCA6IDB9KTwvc3Bhbj48L2Rpdj5cbiAgICAgICAgPGd2LXN3aXRjaFxuICAgICAgICAgIHNtYWxsXG4gICAgICAgICAgLmRlc2NyaXB0aW9uPVwiJHt0aGlzLmV4cGVydCA/ICdFeHBlcnQnIDogJ1NpbXBsZSd9XCJcbiAgICAgICAgICAudmFsdWU9XCIke3RoaXMuZXhwZXJ0fVwiXG4gICAgICAgICAgQGd2LXN3aXRjaDppbnB1dD1cIiR7dGhpcy5fb25DaGFuZ2VNb2RlfVwiXG4gICAgICAgID48L2d2LXN3aXRjaD5cbiAgICAgICAgPGd2LWlucHV0XG4gICAgICAgICAgaWQ9XCJzZWFyY2gtcHJvcGVydHlcIlxuICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRmlsdGVyIHByb3BlcnRpZXMgKFNoaWZ0ICsgQ3RybCArIFNwYWNlKVwiXG4gICAgICAgICAgdHlwZT1cInNlYXJjaFwiXG4gICAgICAgICAgc21hbGxcbiAgICAgICAgICBjbGFzcz1cInNlYXJjaC1pbnB1dFwiXG4gICAgICAgICAgLmRpc2FibGVkPVwiJHt0aGlzLmV4cGVydH1cIlxuICAgICAgICAgIEBndi1pbnB1dDppbnB1dD1cIiR7dGhpcy5fb25TZWFyY2hQcm9wZXJ0eX1cIlxuICAgICAgICAgIEBndi1pbnB1dDpjbGVhcj1cIiR7dGhpcy5fb25DbGVhclByb3BlcnR5fVwiXG4gICAgICAgID48L2d2LWlucHV0PlxuICAgICAgICA8Z3Ytc2VsZWN0XG4gICAgICAgICAgY2xhc3M9XCJwYWdlLXNpemVfX3NlbGVjdFwiXG4gICAgICAgICAgQGd2LXNlbGVjdDppbnB1dD1cIiR7dGhpcy5fb25DaGFuZ2VQYWdlU2l6ZX1cIlxuICAgICAgICAgIHNtYWxsXG4gICAgICAgICAgLm9wdGlvbnM9XCIke3RoaXMuX3BhZ2VTaXplc31cIlxuICAgICAgICAgIC52YWx1ZT1cIiR7dGhpcy5fcGFnZVNpemV9XCJcbiAgICAgICAgICAuZGlzYWJsZWQ9XCIke3RoaXMuZXhwZXJ0IHx8IHRoaXMuX3BhZ2luYXRpb25EYXRhID09IG51bGx9XCJcbiAgICAgICAgPjwvZ3Ytc2VsZWN0PlxuICAgICAgICA8Z3YtcGFnaW5hdGlvblxuICAgICAgICAgIEBndi1wYWdpbmF0aW9uOnBhZ2luYXRlPVwiJHt0aGlzLl9vblBhZ2luYXRlfVwiXG4gICAgICAgICAgLmRpc2FibGVkPVwiJHt0aGlzLmV4cGVydCB8fCB0aGlzLl9wYWdpbmF0aW9uRGF0YSA9PSBudWxsfVwiXG4gICAgICAgICAgLmRhdGE9XCIke3RoaXMuX3BhZ2luYXRpb25EYXRhfVwiXG4gICAgICAgICAgd2lkZ2V0XG4gICAgICAgID48L2d2LXBhZ2luYXRpb24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb250ZW50XCI+PGRpdiBjbGFzcz1cImZvcm0tY29udGVudFwiPiR7dGhpcy5fcmVuZGVyVGFibGUoKX08L2Rpdj48L2Rpdj5cbiAgICA8L2Rpdj5gO1xuICB9XG5cbiAgX2ZldGNoRG9jdW1lbnRhdGlvbigpIHtcbiAgICB0aGlzLl9zaG93RG9jdW1lbnRhdGlvbiA9IHRydWU7XG4gIH1cblxuICBfaGlkZURvY3VtZW50YXRpb24oKSB7XG4gICAgdGhpcy5fc2hvd0RvY3VtZW50YXRpb24gPSBmYWxzZTtcbiAgfVxuXG4gIGdldCBkaXJ0eSgpIHtcbiAgICBjb25zdCBmb3JtID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJ2d2LXNjaGVtYS1mb3JtJyk7XG4gICAgcmV0dXJuIGZvcm0gJiYgZm9ybS5kaXJ0eTtcbiAgfVxuXG4gIGNvbmZpcm0oKSB7XG4gICAgY29uc3QgZm9ybSA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCdndi1zY2hlbWEtZm9ybScpO1xuICAgIGlmIChmb3JtKSB7XG4gICAgICByZXR1cm4gZm9ybS5jb25maXJtKCkudGhlbigoKSA9PiB0aGlzLl9vbkNsb3NlUHJvcGVydHlTY2hlbWFGb3JtKCkpO1xuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cblxuICBfcmVuZGVyRm9ybSgpIHtcbiAgICByZXR1cm4gaHRtbGA8Z3Ytc2NoZW1hLWZvcm1cbiAgICAgIHNsb3Q9XCJ0b3BcIlxuICAgICAgc2Nyb2xsYWJsZVxuICAgICAgLnNjaGVtYT1cIiR7dGhpcy5fcHJvcGVydHlTY2hlbWFGb3JtfVwiXG4gICAgICAudmFsdWVzPVwiJHt0aGlzLnByb3ZpZGVyfVwiXG4gICAgICAuaWNvbj1cImRlc2lnbjplZGl0XCJcbiAgICAgIGhhcy1oZWFkZXJcbiAgICAgID9yZWFkb25seT1cIiR7dGhpcy5yZWFkb25seX1cIlxuICAgICAgQGd2LXNjaGVtYS1mb3JtOnN1Ym1pdD1cIiR7dGhpcy5fb25TdWJtaXRQcm9wZXJ0eUZvcm19XCJcbiAgICA+XG4gICAgICA8ZGl2IHNsb3Q9XCJ0aXRsZVwiIGNsYXNzPVwicHJvcGVydGllcy10aXRsZVwiPkNvbmZpZ3VyZSBkeW5hbWljIHByb3BlcnRpZXM8L2Rpdj5cbiAgICAgIDxndi1idXR0b25cbiAgICAgICAgc2xvdD1cImhlYWRlci1sZWZ0XCJcbiAgICAgICAgaWNvbj1cImdlbmVyYWw6Y2xvc2VcIlxuICAgICAgICBvdXRsaW5lZFxuICAgICAgICBzbWFsbFxuICAgICAgICBAZ3YtYnV0dG9uOmNsaWNrPVwiJHt0aGlzLl9vbkNsb3NlUHJvcGVydHlTY2hlbWFGb3JtfVwiXG4gICAgICAgIHRpdGxlPVwiQ2xvc2UgKGVzYylcIlxuICAgICAgPjwvZ3YtYnV0dG9uPlxuICAgICAgPGd2LWJ1dHRvblxuICAgICAgICBzbG90PVwiaGVhZGVyLWxlZnRcIlxuICAgICAgICBpY29uPVwiaG9tZTpib29rXCJcbiAgICAgICAgP2Rpc2FibGVkPVwiJHt0aGlzLl9zaG93RG9jdW1lbnRhdGlvbn1cIlxuICAgICAgICBvdXRsaW5lZFxuICAgICAgICBzbWFsbFxuICAgICAgICBAZ3YtYnV0dG9uOmNsaWNrPVwiJHt0aGlzLl9mZXRjaERvY3VtZW50YXRpb259XCJcbiAgICAgICAgdGl0bGU9XCJPcGVuIGRvY3VtZW50YXRpb25cIlxuICAgICAgPjwvZ3YtYnV0dG9uPlxuICAgIDwvZ3Ytc2NoZW1hLWZvcm0+YDtcbiAgfVxuXG4gIF9yZW5kZXJCb3R0b20oKSB7XG4gICAgaWYgKHRoaXMuX3Byb3BlcnR5U2NoZW1hRm9ybSAmJiB0aGlzLl9zaG93RG9jdW1lbnRhdGlvbikge1xuICAgICAgcmV0dXJuIGh0bWxgPGd2LXJlc2l6YWJsZS12aWV3cyBuby1vdmVyZmxvdyBkaXJlY3Rpb249XCJob3Jpem9udGFsXCI+XG4gICAgICAgICR7dGhpcy5fcmVuZGVyRm9ybSgpfVxuICAgICAgICA8Z3YtZG9jdW1lbnRhdGlvblxuICAgICAgICAgIHNsb3Q9XCJib3R0b21cIlxuICAgICAgICAgIC50ZXh0PVwiJHt0aGlzLl9wcm92aWRlckRvY3VtZW50YXRpb259XCJcbiAgICAgICAgICBAZ3YtZG9jdW1lbnRhdGlvbjpjbG9zZT1cIiR7dGhpcy5faGlkZURvY3VtZW50YXRpb259XCJcbiAgICAgICAgPjwvZ3YtZG9jdW1lbnRhdGlvbj5cbiAgICAgIDwvZ3YtcmVzaXphYmxlLXZpZXdzPmA7XG4gICAgfSBlbHNlIGlmICh0aGlzLl9wcm9wZXJ0eVNjaGVtYUZvcm0pIHtcbiAgICAgIHJldHVybiB0aGlzLl9yZW5kZXJGb3JtKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBodG1sYDxkaXYgY2xhc3M9XCJwcm9wZXJ0aWVzLWJvdHRvbS1jb250YWluZXJcIj4ke3RoaXMuX3JlbmRlckR5bmFtaWNDb25maWd1cmF0aW9uKCl9PC9kaXY+YDtcbiAgICB9XG4gIH1cblxuICBfcmVuZGVyRHluYW1pY0NvbmZpZ3VyYXRpb24oKSB7XG4gICAgY29uc3QgaGFzRHluYW1pY0NvbmZpZ3VyYXRpb24gPSB0aGlzLnByb3ZpZGVyICYmIHRoaXMucHJvdmlkZXIuZW5hYmxlZDtcblxuICAgIGxldCBjb25maWd1cmVBY3Rpb24gPSAnJztcbiAgICBpZiAoaGFzRHluYW1pY0NvbmZpZ3VyYXRpb24gfHwgdGhpcy5yZWFkb25seSAhPT0gdHJ1ZSkge1xuICAgICAgY29uZmlndXJlQWN0aW9uID0gaHRtbGA8Z3YtYnV0dG9uXG4gICAgICAgIGljb249XCJ0b29sczp0b29sc1wiXG4gICAgICAgIEBndi1idXR0b246Y2xpY2s9XCIke3RoaXMuX29uQ29uZmlndXJlRHluYW1pY1Byb3BlcnRpZXN9XCJcbiAgICAgICAgb3V0bGluZWRcbiAgICAgICAgLmRpc2FibGVkPVwiJHt0aGlzLmV4cGVydH1cIlxuICAgICAgICA+Q29uZmlndXJlIGR5bmFtaWMgcHJvcGVydGllczwvZ3YtYnV0dG9uXG4gICAgICA+YDtcbiAgICB9XG5cbiAgICBpZiAoaGFzRHluYW1pY0NvbmZpZ3VyYXRpb24pIHtcbiAgICAgIHJldHVybiBodG1sYDxkaXYgY2xhc3M9XCJwcm9wZXJ0aWVzLW1lc3NhZ2VcIj5cbiAgICAgICAgICBEeW5hbWljIHByb3BlcnRpZXMgc2VydmljZSBpcyBhY3R1YWxseSBpbiA8Y29kZT5ydW5uaW5nPC9jb2RlPiBzdGF0ZSBhbmQgcnVuIHdpdGggY3JvbiBleHByZXNzaW9uXG4gICAgICAgICAgPGNvZGU+JHt0aGlzLnByb3ZpZGVyLnNjaGVkdWxlfTwvY29kZT4gdXNpbmcgPGNvZGU+JHt0aGlzLnByb3ZpZGVyLnByb3ZpZGVyfTwvY29kZT4gcHJvdmlkZXIuXG4gICAgICAgIDwvZGl2PlxuICAgICAgICAke2NvbmZpZ3VyZUFjdGlvbn1gO1xuICAgIH0gZWxzZSBpZiAodGhpcy5yZWFkb25seSkge1xuICAgICAgcmV0dXJuIGh0bWxgPGRpdiBjbGFzcz1cImVtcHR5XCI+Tm8gZHluYW1pYyBwcm9wZXJ0aWVzIHNlcnZpY2UgY29uZmlndXJlZDwvZGl2PmA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBjb25maWd1cmVBY3Rpb247XG4gICAgfVxuICB9XG5cbiAgX29uTW92ZSgpIHtcbiAgICB0aGlzLl9jb21wdXRlVGV4dFJvd3MoKTtcbiAgfVxuXG4gIF9jb21wdXRlVGV4dFJvd3MoKSB7XG4gICAgY29uc3QgcGFyZW50ID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJy5jb250ZW50Jyk7XG4gICAgaWYgKHBhcmVudCkge1xuICAgICAgY29uc3QgeyBoZWlnaHQgfSA9IHBhcmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIC8vIC0tZ3YtdGV4dC0tbGg9MzBweFxuICAgICAgdGhpcy5fdGV4dFJvd3MgPSBNYXRoLnJvdW5kKE1hdGgucm91bmQoaGVpZ2h0IC0gMjApIC8gMzApIC0gMjtcbiAgICB9XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgaWYgKHRoaXMucHJvdmlkZXJzICYmIHRoaXMucHJvdmlkZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBodG1sYDxkaXYgY2xhc3M9XCJwcm9wZXJ0aWVzXCI+XG4gICAgICAgIDxndi1yZXNpemFibGUtdmlld3Mgbm8tb3ZlcmZsb3cgQGd2LXJlc2l6YWJsZS12aWV3czptb3ZlPVwiJHt0aGlzLl9vbk1vdmV9XCIgQGd2LXJlc2l6YWJsZS12aWV3czpyZXNpemU9XCIke3RoaXMuX29uTW92ZX1cIj5cbiAgICAgICAgICA8ZGl2IHNsb3Q9XCJ0b3BcIiBjbGFzcz1cImJveFwiPiR7dGhpcy5fcmVuZGVyVGFibGVGb3JtKCl9PC9kaXY+XG4gICAgICAgICAgPGRpdiBzbG90PVwiYm90dG9tXCI+JHt0aGlzLl9yZW5kZXJCb3R0b20oKX08L2Rpdj5cbiAgICAgICAgPC9ndi1yZXNpemFibGUtdmlld3M+XG4gICAgICA8L2Rpdj5gO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gaHRtbGA8ZGl2IGNsYXNzPVwicHJvcGVydGllc1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtYm94XCI+JHt0aGlzLl9yZW5kZXJUYWJsZUZvcm0oKX08L2Rpdj5cbiAgICAgIDwvZGl2PmA7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGdldCBzdHlsZXMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIGVtcHR5LFxuICAgICAgLy8gbGFuZ3VhZ2U9Q1NTXG4gICAgICBjc3NgXG4gICAgICAgIDpob3N0IHtcbiAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgfVxuXG4gICAgICAgIC5wcm9wZXJ0aWVzIHtcbiAgICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgfVxuXG4gICAgICAgIGd2LXJlc2l6YWJsZS12aWV3cyB7XG4gICAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICB9XG5cbiAgICAgICAgZ3Ytc2NoZW1hLWZvcm0ge1xuICAgICAgICAgIG1hcmdpbjogMDtcbiAgICAgICAgfVxuXG4gICAgICAgIC50YWJsZS1ib3gge1xuICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgI2JmYmZiZjtcbiAgICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICB9XG5cbiAgICAgICAgZ3YtdGFibGUge1xuICAgICAgICAgIGhlaWdodDogYXV0bztcbiAgICAgICAgICBmbGV4OiAxO1xuICAgICAgICAgIG1hcmdpbi10b3A6IDEwcHg7XG4gICAgICAgICAgbWFyZ2luLXJpZ2h0OiA1MHB4O1xuICAgICAgICAgIC0tZ3YtdGFibGUtcm93cy0tb3Y6IG5vbmU7XG4gICAgICAgICAgLS1ndi10YWJsZS0tY29sbWc6IHZhcigtLWd2LXByb3BlcnRpZXMtdGFibGUtLWNvbG1nLCAwLjJyZW0pO1xuICAgICAgICAgIC0tZ3YtdGFibGUtY2VsbC0tZDogaW5saW5lO1xuICAgICAgICAgIC0tZ3YtdGFibGUtcm93LS1haTogZmxleC1zdGFydDtcbiAgICAgICAgICAtLWd2LXRhYmxlLXJvdy0tYWM6IGZsZXgtc3RhcnQ7XG4gICAgICAgICAgLS1ndi10YWJsZS1ob3Zlci0tYmdjOiB2YXIoLS1ndi10aGVtZS1uZXV0cmFsLWNvbG9yLWxpZ2h0ZXN0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC5wcm9wZXJ0aWVzLXRpdGxlIHtcbiAgICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuICAgICAgICAgIGxldHRlci1zcGFjaW5nOiAwLjJyZW07XG4gICAgICAgIH1cblxuICAgICAgICAucHJvcGVydGllcy1ib3R0b20tY29udGFpbmVyIHtcbiAgICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIH1cblxuICAgICAgICAuaGVhZGVyIHtcbiAgICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2Q5ZDlkOTtcbiAgICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICAgIG1pbi1oZWlnaHQ6IDQ1cHg7XG4gICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAgICBtYXJnaW4tYm90dG9tOiAwLjVyZW07XG4gICAgICAgICAgcGFkZGluZzogMCAwLjVyZW07XG4gICAgICAgIH1cblxuICAgICAgICAuaGVhZGVyIC50aXRsZSB7XG4gICAgICAgICAgY29sb3I6ICMyODQ0NGY7XG4gICAgICAgICAgZm9udC1zaXplOiAxOHB4O1xuICAgICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgICAgYWxpZ24taXRlbXM6IGZsZXgtZW5kO1xuICAgICAgICAgIGZsZXg6IDE7XG4gICAgICAgIH1cblxuICAgICAgICAuaGVhZGVyIC50aXRsZSBzcGFuIHtcbiAgICAgICAgICBmb250LXNpemU6IDEycHg7XG4gICAgICAgICAgbWFyZ2luLWxlZnQ6IDhweDtcbiAgICAgICAgICBvcGFjaXR5OiAwLjc7XG4gICAgICAgIH1cblxuICAgICAgICAuYm94IHtcbiAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICAgIHRvcDogMDtcbiAgICAgICAgICBib3R0b206IDA7XG4gICAgICAgICAgbGVmdDogMDtcbiAgICAgICAgfVxuXG4gICAgICAgIC5jb250YWluZXIge1xuICAgICAgICAgIGZsZXgtZ3JvdzogMTtcblxuICAgICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcblxuICAgICAgICAgIC8qIGZvciBGaXJlZm94ICovXG4gICAgICAgICAgbWluLWhlaWdodDogMDtcbiAgICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICAgIH1cblxuICAgICAgICAuY29udGVudCB7XG4gICAgICAgICAgYmFja2dyb3VuZDogd2hpdGU7XG4gICAgICAgICAgZmxleC1ncm93OiAxO1xuXG4gICAgICAgICAgb3ZlcmZsb3c6IGF1dG87XG5cbiAgICAgICAgICAvKiBmb3IgRmlyZWZveCAqL1xuICAgICAgICAgIG1pbi1oZWlnaHQ6IDA7XG4gICAgICAgICAgcGFkZGluZzogMC41cmVtO1xuXG4gICAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIH1cblxuICAgICAgICBndi10ZXh0IHtcbiAgICAgICAgICAtLWd2LXRleHQtLWZ6OiAyMHB4O1xuICAgICAgICAgIC0tZ3YtdGV4dC0tbGg6IDI1cHg7XG4gICAgICAgIH1cblxuICAgICAgICBndi1zd2l0Y2gge1xuICAgICAgICAgIC0tZ3Ytc3dpdGNoLS10YTogcmlnaHQ7XG4gICAgICAgIH1cblxuICAgICAgICAuaGVhZGVyIGd2LWlucHV0IHtcbiAgICAgICAgICBtYXJnaW46IDAgMXJlbTtcbiAgICAgICAgfVxuXG4gICAgICAgIC5hZGQtZm9ybSxcbiAgICAgICAgLmFkZC1mb3JtLWVycm9yIHtcbiAgICAgICAgICBkaXNwbGF5OiBncmlkO1xuICAgICAgICAgIG1hcmdpbjogYXV0byA1MHB4IGF1dG8gMDtcbiAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICB9XG5cbiAgICAgICAgLmFkZC1mb3JtIHtcbiAgICAgICAgICBjb2x1bW4tZ2FwOiB2YXIoLS1ndi1wcm9wZXJ0aWVzLXRhYmxlLS1jb2xtZywgMC4ycmVtKTtcbiAgICAgICAgICBib3JkZXItcmlnaHQ6IHNvbGlkIHRoaWNrIHRyYW5zcGFyZW50O1xuICAgICAgICAgIGhlaWdodDogNTBweDtcbiAgICAgICAgfVxuXG4gICAgICAgIC5hZGQtZm9ybSBndi1pbnB1dCxcbiAgICAgICAgZ3YtYnV0dG9uLFxuICAgICAgICBndi1zd2l0Y2gge1xuICAgICAgICAgIG1hcmdpbjogYXV0byAwO1xuICAgICAgICB9XG5cbiAgICAgICAgLmFkZC1mb3JtIGd2LXN3aXRjaCB7XG4gICAgICAgICAgZm9udC1zaXplOiAxMnB4O1xuICAgICAgICB9XG5cbiAgICAgICAgLmFkZC1mb3JtLWdyaWQge1xuICAgICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogNDBweCBhdXRvIGF1dG8gNDBweDtcbiAgICAgICAgfVxuXG4gICAgICAgIC5hZGQtZm9ybS1ncmlkLXdpdGgtZW5jcnlwdGVkLXRvZ2dsZSB7XG4gICAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiA0MHB4IGF1dG8gYXV0byAxMDVweCA0MHB4O1xuICAgICAgICB9XG5cbiAgICAgICAgLmFkZC1mb3JtLWVycm9yX2V4cGVydCB7XG4gICAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgfVxuXG4gICAgICAgIC5hZGQtZm9ybS1lcnJvciB7XG4gICAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiA0MHB4IDFmcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvZGUge1xuICAgICAgICAgIGNvbG9yOiB2YXIoLS1ndi10aGVtZS1jb2xvci13YXJuaW5nLWRhcmssICNmNTdjMDApO1xuICAgICAgICB9XG5cbiAgICAgICAgLmZvcm0tY29udGVudCB7XG4gICAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICB9XG5cbiAgICAgICAgLnByb3BlcnRpZXMtbWVzc2FnZSB7XG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogMC41cmVtO1xuICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICAgICAgfVxuXG4gICAgICAgIC5wYWdlLXNpemVfX3NlbGVjdCB7XG4gICAgICAgICAgbWF4LXdpZHRoOiA1MHB4O1xuICAgICAgICB9XG5cbiAgICAgICAgLnNlYXJjaC1pbnB1dCB7XG4gICAgICAgICAgd2lkdGg6IDMwMHB4O1xuICAgICAgICB9XG5cbiAgICAgICAgaHIge1xuICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWd2LXRoZW1lLW5ldXRyYWwtY29sb3IpO1xuICAgICAgICAgIGJvcmRlcjogMDtcbiAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgICBoZWlnaHQ6IDJweDtcbiAgICAgICAgfVxuICAgICAgYCxcbiAgICBdO1xuICB9XG59XG5cbndpbmRvdy5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ2d2LXByb3BlcnRpZXMnLCBHdlByb3BlcnRpZXMpO1xuIl19