@gravitee/ui-components 3.24.5-renovate-github-markdown-css-5-x-6cd8067 → 3.25.1

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 (115) hide show
  1. package/assets/css/github-markdown-css/github-markdown.css +545 -500
  2. package/assets/i18n/en.json +3 -0
  3. package/assets/i18n/fr.json +3 -0
  4. package/assets/icons/design.svg +1 -1
  5. package/package.json +2 -9
  6. package/src/atoms/gv-autocomplete.js +132 -156
  7. package/src/atoms/gv-button.js +73 -248
  8. package/src/atoms/gv-checkbox.js +45 -103
  9. package/src/atoms/gv-date-picker-calendar.js +312 -393
  10. package/src/atoms/gv-date-picker-cell.js +57 -81
  11. package/src/atoms/gv-date-picker.js +180 -319
  12. package/src/atoms/gv-file-upload.js +85 -195
  13. package/src/atoms/gv-icon.js +13 -34
  14. package/src/atoms/gv-image.js +31 -66
  15. package/src/atoms/gv-input-message.js +12 -37
  16. package/src/atoms/gv-input.js +117 -148
  17. package/src/atoms/gv-link.js +47 -125
  18. package/src/atoms/gv-message.js +18 -69
  19. package/src/atoms/gv-metric.js +19 -68
  20. package/src/atoms/gv-relative-time.js +67 -38
  21. package/src/atoms/gv-select-native.js +96 -215
  22. package/src/atoms/gv-select.js +110 -230
  23. package/src/atoms/gv-spinner.js +5 -26
  24. package/src/atoms/gv-state.js +25 -66
  25. package/src/atoms/gv-switch.js +40 -160
  26. package/src/atoms/gv-tag.js +26 -78
  27. package/src/atoms/gv-text.js +22 -83
  28. package/src/charts/gv-chart-bar.js +22 -18
  29. package/src/charts/gv-chart-gauge.js +28 -31
  30. package/src/charts/gv-chart-histogram.js +18 -10
  31. package/src/charts/gv-chart-line.js +70 -59
  32. package/src/charts/gv-chart-map.js +44 -42
  33. package/src/charts/gv-chart-pie.js +18 -14
  34. package/src/index.js +1 -0
  35. package/src/lib/cron-expression.js +40 -35
  36. package/src/lib/date.js +10 -1
  37. package/src/lib/events.js +3 -1
  38. package/src/lib/http-client-schema-form.js +13 -12
  39. package/src/lib/http.js +57 -56
  40. package/src/lib/i18n.js +30 -22
  41. package/src/lib/item.js +13 -12
  42. package/src/lib/properties.js +77 -42
  43. package/src/lib/schema-form.js +4 -5
  44. package/src/lib/studio.js +13 -60
  45. package/src/lib/style.js +8 -8
  46. package/src/lib/text-format.js +14 -7
  47. package/src/lib/theme.js +8 -5
  48. package/src/lib/utils.js +17 -18
  49. package/src/mixins/chart-element.js +31 -54
  50. package/src/mixins/input-element.js +60 -47
  51. package/src/mixins/item-resource.js +34 -32
  52. package/src/mixins/keyboard-element.js +6 -5
  53. package/src/mixins/update-after-browser.js +4 -1
  54. package/src/mixins/with-resize-observer.js +23 -13
  55. package/src/mixins/with-skeleton-attribute.js +54 -48
  56. package/src/molecules/gv-card-full.js +26 -147
  57. package/src/molecules/gv-card-list.js +13 -42
  58. package/src/molecules/gv-card.js +17 -91
  59. package/src/molecules/gv-category-list.js +6 -17
  60. package/src/molecules/gv-category.js +23 -103
  61. package/src/molecules/gv-code.js +81 -143
  62. package/src/molecules/gv-confirm.js +41 -71
  63. package/src/molecules/gv-cron-editor.js +143 -389
  64. package/src/molecules/gv-dropdown-menu.js +14 -46
  65. package/src/molecules/gv-expandable.js +31 -59
  66. package/src/molecules/gv-expression-language.js +176 -138
  67. package/src/molecules/gv-identity-picture.js +42 -65
  68. package/src/molecules/gv-list.js +42 -134
  69. package/src/molecules/gv-metrics.js +37 -49
  70. package/src/molecules/gv-modal.js +28 -95
  71. package/src/molecules/gv-nav.js +49 -75
  72. package/src/molecules/gv-option.js +57 -130
  73. package/src/molecules/gv-plans.js +86 -209
  74. package/src/molecules/gv-popover.js +57 -177
  75. package/src/molecules/gv-promote.js +28 -146
  76. package/src/molecules/gv-rating-list.js +69 -195
  77. package/src/molecules/gv-rating.js +52 -105
  78. package/src/molecules/gv-row-expandable.js +5 -11
  79. package/src/molecules/gv-row.js +21 -147
  80. package/src/molecules/gv-stats.js +23 -48
  81. package/src/molecules/gv-stepper.js +43 -187
  82. package/src/molecules/gv-table.js +199 -309
  83. package/src/molecules/gv-tree.js +33 -156
  84. package/src/organisms/gv-documentation.js +45 -128
  85. package/src/organisms/gv-header.js +37 -195
  86. package/src/organisms/gv-http-client.js +32 -168
  87. package/src/organisms/gv-menu.js +37 -158
  88. package/src/organisms/gv-newsletter-subscription.js +48 -189
  89. package/src/organisms/gv-pagination.js +49 -77
  90. package/src/organisms/gv-properties.js +271 -492
  91. package/src/organisms/gv-resizable-views.js +41 -259
  92. package/src/organisms/gv-resources.js +168 -275
  93. package/src/organisms/gv-schema-form-array.js +49 -159
  94. package/src/organisms/gv-schema-form-control-object.js +59 -73
  95. package/src/organisms/gv-schema-form-control.js +107 -134
  96. package/src/organisms/gv-schema-form.js +219 -280
  97. package/src/organisms/gv-tabs.js +66 -98
  98. package/src/organisms/gv-user-menu.js +36 -201
  99. package/src/organisms/gv-vertical-menu.js +20 -61
  100. package/src/policy-studio/gv-flow-step.js +106 -245
  101. package/src/policy-studio/gv-flow.js +125 -304
  102. package/src/policy-studio/gv-policy-studio-menu.js +157 -471
  103. package/src/policy-studio/gv-policy-studio.js +714 -760
  104. package/src/styles/empty.js +3 -20
  105. package/src/styles/input.js +3 -247
  106. package/src/styles/link.js +3 -16
  107. package/src/styles/shapes.js +1 -0
  108. package/src/styles/skeleton.js +3 -37
  109. package/src/styles/zoom.js +3 -24
  110. package/src/theme/gv-theme.js +21 -60
  111. package/CHANGELOG.md +0 -1260
  112. package/LICENSE.txt +0 -202
  113. package/README.md +0 -195
  114. package/src/.eslintrc.js +0 -19
  115. package/src/theme/definition.json +0 -1762
@@ -19,7 +19,6 @@ import { pickedCompletion, startCompletion } from '@codemirror/autocomplete';
19
19
  import { keymap } from '@codemirror/view';
20
20
  import { EditorSelection, Prec } from '@codemirror/state';
21
21
  import { get } from 'object-path';
22
-
23
22
  /**
24
23
  * Expression Language component
25
24
  *
@@ -41,17 +40,21 @@ import { get } from 'object-path';
41
40
  * @attr {Boolean} [autofocus=false] - true to put the focus on the input
42
41
  * @attr {Boolean} [readonly=false] - true if field is readonly mode
43
42
  */
43
+
44
44
  export class GvExpressionLanguage extends GvCode {
45
45
  static get properties() {
46
- return {
47
- ...super.properties,
48
- grammar: { type: Object },
46
+ return { ...super.properties,
47
+ grammar: {
48
+ type: Object
49
+ }
49
50
  };
50
51
  }
51
52
 
52
53
  firstUpdated() {
53
54
  super.firstUpdated();
54
- dispatchCustomEvent(this, 'ready', { currentTarget: this });
55
+ dispatchCustomEvent(this, 'ready', {
56
+ currentTarget: this
57
+ });
55
58
  }
56
59
 
57
60
  getExtensions() {
@@ -59,29 +62,35 @@ export class GvExpressionLanguage extends GvCode {
59
62
  }
60
63
 
61
64
  insertELKeymap() {
62
- return keymap.of([
63
- {
64
- key: 'Ctrl-Shift-e',
65
- mac: 'Cmd-Shift-e',
66
- run(view) {
67
- view.dispatch(
68
- view.state.changeByRange((range) => ({
69
- changes: [{ from: range.from, to: range.to, insert: '{#}' }],
70
- range: EditorSelection.range(range.from + 2, range.from + 2),
71
- })),
72
- );
73
- startCompletion(view);
74
- return true;
75
- },
76
- },
77
- ]);
65
+ return keymap.of([{
66
+ key: 'Ctrl-Shift-e',
67
+ mac: 'Cmd-Shift-e',
68
+
69
+ run(view) {
70
+ view.dispatch(view.state.changeByRange(range => ({
71
+ changes: [{
72
+ from: range.from,
73
+ to: range.to,
74
+ insert: '{#}'
75
+ }],
76
+ range: EditorSelection.range(range.from + 2, range.from + 2)
77
+ })));
78
+ startCompletion(view);
79
+ return true;
80
+ }
81
+
82
+ }]);
78
83
  }
79
84
 
80
85
  buildMethods(type) {
81
86
  const modelType = this.getModelType(type);
82
- return modelType.methods.map(({ name, params = [], returnType }) => {
87
+ return modelType.methods.map(({
88
+ name,
89
+ params = [],
90
+ returnType
91
+ }) => {
83
92
  const command = `${name}()`;
84
- const displayParams = params.map((p) => `${p.type} ${p.name}`);
93
+ const displayParams = params.map(p => `${p.type} ${p.name}`);
85
94
  const label = `${name}(${displayParams.join(', ')})`;
86
95
  const detail = `return ${returnType}`;
87
96
  return {
@@ -90,32 +99,42 @@ export class GvExpressionLanguage extends GvCode {
90
99
  apply: (view, completion, from, to) => {
91
100
  const anchor = from + name.length + 1;
92
101
  view.dispatch({
93
- changes: { from, to, insert: completion.command },
94
- selection: { anchor },
102
+ changes: {
103
+ from,
104
+ to,
105
+ insert: completion.command
106
+ },
107
+ selection: {
108
+ anchor
109
+ },
95
110
  userEvent: 'input.complete',
96
- annotations: pickedCompletion.of(view),
111
+ annotations: pickedCompletion.of(view)
97
112
  });
98
113
  },
99
114
  label,
100
- detail,
115
+ detail
101
116
  };
102
117
  });
103
118
  }
104
119
 
105
120
  findBestAutocompleteHandler(completionContext) {
106
- return this.expressionLanguageCompletionHandlers
107
- .filter((handler) => (this.grammar != null && handler.supportEL === true) || handler.supportEL !== true)
108
- .map((handler) => {
109
- const match = handler.expr ? completionContext.matchBefore(handler.expr) : true;
110
- return { handler, match };
111
- })
112
- .find(({ match, expr }) => match);
121
+ return this.expressionLanguageCompletionHandlers.filter(handler => this.grammar != null && handler.supportEL === true || handler.supportEL !== true).map(handler => {
122
+ const match = handler.expr ? completionContext.matchBefore(handler.expr) : true;
123
+ return {
124
+ handler,
125
+ match
126
+ };
127
+ }).find(({
128
+ match,
129
+ expr
130
+ }) => match);
113
131
  }
114
132
 
115
133
  getModelType(typeId) {
116
134
  if (this.grammar != null) {
117
135
  return get(this.grammar, `_types.${typeId}`);
118
136
  }
137
+
119
138
  return null;
120
139
  }
121
140
 
@@ -127,12 +146,14 @@ export class GvExpressionLanguage extends GvCode {
127
146
  if (this.grammar != null) {
128
147
  return get(this.grammar, `_enums.${typeId}`);
129
148
  }
149
+
130
150
  return [''];
131
151
  }
132
152
 
133
153
  convertType(type) {
134
154
  if (type) {
135
155
  const lowerType = type.toLowerCase();
156
+
136
157
  if (lowerType === 'string') {
137
158
  return 'text';
138
159
  } else if (lowerType === 'httpheaders' || lowerType === 'multivaluemap') {
@@ -143,128 +164,145 @@ export class GvExpressionLanguage extends GvCode {
143
164
  return 'enum';
144
165
  }
145
166
  }
167
+
146
168
  return 'variable';
147
169
  }
148
170
 
149
171
  get expressionLanguageCompletionHandlers() {
150
- return [
151
- {
152
- expr: /{#[a-z]*/,
153
- supportEL: true,
154
- run(completionContext, match) {
155
- const prefix = match.text.replaceAll('{#', '');
156
- const from = completionContext.pos - prefix.length;
157
- const options = Object.keys(this.grammar)
158
- .filter((command) => !command.startsWith('_') && command.startsWith(prefix))
159
- .map((command) => {
172
+ return [{
173
+ expr: /{#[a-z]*/,
174
+ supportEL: true,
175
+
176
+ run(completionContext, match) {
177
+ const prefix = match.text.replaceAll('{#', '');
178
+ const from = completionContext.pos - prefix.length;
179
+ const options = Object.keys(this.grammar).filter(command => !command.startsWith('_') && command.startsWith(prefix)).map(command => {
180
+ return {
181
+ type: 'variable',
182
+ command,
183
+ apply: command,
184
+ label: command
185
+ };
186
+ });
187
+ return {
188
+ from,
189
+ options
190
+ };
191
+ }
192
+
193
+ }, {
194
+ expr: /{#[a-z]*.[a-zA-Z]*/,
195
+ supportEL: true,
196
+
197
+ run(completionContext, match) {
198
+ const tokens = match.text.split('.');
199
+ const key = tokens[0].replaceAll('{#', '');
200
+ const prefix = tokens[1];
201
+ let candidate = this.grammar[key][prefix];
202
+ let options = [];
203
+ let from = completionContext.pos;
204
+
205
+ if (candidate) {
206
+ if (this.isMap(candidate._type)) {
207
+ options = this.getEnum(candidate._type).map(value => {
208
+ const type = this.convertType(candidate._type);
209
+ const command = `['${value}'][0]`;
160
210
  return {
161
- type: 'variable',
211
+ type,
162
212
  command,
163
213
  apply: command,
164
- label: command,
214
+ label: value
215
+ };
216
+ });
217
+ }
218
+ } else {
219
+ from -= prefix.length;
220
+ candidate = this.grammar[key];
221
+
222
+ if (candidate._type) {
223
+ options = this.buildMethods(candidate._type);
224
+ } else {
225
+ options = Object.keys(candidate).filter(command => !command.startsWith('_') && command.startsWith(prefix)).map(command => ({
226
+ type: this.convertType(candidate[command]._type),
227
+ command,
228
+ apply: command,
229
+ label: command
230
+ }));
231
+ }
232
+ }
233
+
234
+ return {
235
+ from,
236
+ options
237
+ };
238
+ }
239
+
240
+ }, {
241
+ expr: /{#[a-z]*.[a-zA-Z]*.[a-zA-Z]*/,
242
+ supportEL: true,
243
+
244
+ run(completionContext, match) {
245
+ const tokens = match.text.split('.');
246
+ const key = tokens[0].replaceAll('{#', '');
247
+ const word = tokens[1];
248
+ const prefix = tokens[2];
249
+ const candidate = this.grammar[key][word];
250
+ let options = [];
251
+ let from = completionContext.pos;
252
+
253
+ if (candidate) {
254
+ if (this.isMap(candidate._type)) {
255
+ options = this.getEnum(candidate._type).filter(command => !command.startsWith('_') && command.startsWith(prefix)).map(label => {
256
+ const type = this.convertType(candidate._type);
257
+ return {
258
+ type,
259
+ command: `['${label}'][0]`,
260
+
261
+ apply(view, completion, _from, to) {
262
+ from = _from - prefix.length - 1;
263
+ view.dispatch({
264
+ changes: {
265
+ from,
266
+ to,
267
+ insert: completion.command
268
+ },
269
+ selection: {
270
+ anchor: from + completion.command.length
271
+ },
272
+ userEvent: 'input.complete',
273
+ annotations: pickedCompletion.of(view)
274
+ });
275
+ },
276
+
277
+ label
165
278
  };
166
279
  });
167
- return { from, options };
168
- },
169
- },
170
- {
171
- expr: /{#[a-z]*.[a-zA-Z]*/,
172
- supportEL: true,
173
- run(completionContext, match) {
174
- const tokens = match.text.split('.');
175
- const key = tokens[0].replaceAll('{#', '');
176
- const prefix = tokens[1];
177
- let candidate = this.grammar[key][prefix];
178
- let options = [];
179
- let from = completionContext.pos;
180
- if (candidate) {
181
- if (this.isMap(candidate._type)) {
182
- options = this.getEnum(candidate._type).map((value) => {
183
- const type = this.convertType(candidate._type);
184
- const command = `['${value}'][0]`;
185
- return {
186
- type,
187
- command,
188
- apply: command,
189
- label: value,
190
- };
191
- });
192
- }
193
280
  } else {
194
- from -= prefix.length;
195
- candidate = this.grammar[key];
196
281
  if (candidate._type) {
197
282
  options = this.buildMethods(candidate._type);
198
283
  } else {
199
- options = Object.keys(candidate)
200
- .filter((command) => !command.startsWith('_') && command.startsWith(prefix))
201
- .map((command) => ({
284
+ from -= prefix.length;
285
+ options = Object.keys(candidate).filter(command => command.startsWith(prefix)).map(command => {
286
+ return {
202
287
  type: this.convertType(candidate[command]._type),
203
288
  command,
204
289
  apply: command,
205
- label: command,
206
- }));
207
- }
208
- }
209
- return { from, options };
210
- },
211
- },
212
- {
213
- expr: /{#[a-z]*.[a-zA-Z]*.[a-zA-Z]*/,
214
- supportEL: true,
215
- run(completionContext, match) {
216
- const tokens = match.text.split('.');
217
- const key = tokens[0].replaceAll('{#', '');
218
- const word = tokens[1];
219
- const prefix = tokens[2];
220
- const candidate = this.grammar[key][word];
221
- let options = [];
222
- let from = completionContext.pos;
223
- if (candidate) {
224
- if (this.isMap(candidate._type)) {
225
- options = this.getEnum(candidate._type)
226
- .filter((command) => !command.startsWith('_') && command.startsWith(prefix))
227
- .map((label) => {
228
- const type = this.convertType(candidate._type);
229
- return {
230
- type,
231
- command: `['${label}'][0]`,
232
- apply(view, completion, _from, to) {
233
- from = _from - prefix.length - 1;
234
- view.dispatch({
235
- changes: { from, to, insert: completion.command },
236
- selection: { anchor: from + completion.command.length },
237
- userEvent: 'input.complete',
238
- annotations: pickedCompletion.of(view),
239
- });
240
- },
241
- label,
242
- };
243
- });
244
- } else {
245
- if (candidate._type) {
246
- options = this.buildMethods(candidate._type);
247
- } else {
248
- from -= prefix.length;
249
- options = Object.keys(candidate)
250
- .filter((command) => command.startsWith(prefix))
251
- .map((command) => {
252
- return {
253
- type: this.convertType(candidate[command]._type),
254
- command,
255
- apply: command,
256
- label: command,
257
- };
258
- });
259
- }
290
+ label: command
291
+ };
292
+ });
260
293
  }
261
294
  }
262
- return { from, options };
263
- },
264
- },
265
- this.defaultCompletionHandler,
266
- ];
295
+ }
296
+
297
+ return {
298
+ from,
299
+ options
300
+ };
301
+ }
302
+
303
+ }, this.defaultCompletionHandler];
267
304
  }
268
- }
269
305
 
306
+ }
270
307
  window.customElements.define('gv-expression-language', GvExpressionLanguage);
308
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4vbm9kZV9tb2R1bGVzL0BncmF2aXRlZS91aS1jb21wb25lbnRzL21vbGVjdWxlcy9ndi1leHByZXNzaW9uLWxhbmd1YWdlLmpzIl0sIm5hbWVzIjpbIkd2Q29kZSIsImRpc3BhdGNoQ3VzdG9tRXZlbnQiLCJwaWNrZWRDb21wbGV0aW9uIiwic3RhcnRDb21wbGV0aW9uIiwia2V5bWFwIiwiRWRpdG9yU2VsZWN0aW9uIiwiUHJlYyIsImdldCIsIkd2RXhwcmVzc2lvbkxhbmd1YWdlIiwicHJvcGVydGllcyIsImdyYW1tYXIiLCJ0eXBlIiwiT2JqZWN0IiwiZmlyc3RVcGRhdGVkIiwiY3VycmVudFRhcmdldCIsImdldEV4dGVuc2lvbnMiLCJoaWdoIiwiaW5zZXJ0RUxLZXltYXAiLCJvZiIsImtleSIsIm1hYyIsInJ1biIsInZpZXciLCJkaXNwYXRjaCIsInN0YXRlIiwiY2hhbmdlQnlSYW5nZSIsInJhbmdlIiwiY2hhbmdlcyIsImZyb20iLCJ0byIsImluc2VydCIsImJ1aWxkTWV0aG9kcyIsIm1vZGVsVHlwZSIsImdldE1vZGVsVHlwZSIsIm1ldGhvZHMiLCJtYXAiLCJuYW1lIiwicGFyYW1zIiwicmV0dXJuVHlwZSIsImNvbW1hbmQiLCJkaXNwbGF5UGFyYW1zIiwicCIsImxhYmVsIiwiam9pbiIsImRldGFpbCIsImFwcGx5IiwiY29tcGxldGlvbiIsImFuY2hvciIsImxlbmd0aCIsInNlbGVjdGlvbiIsInVzZXJFdmVudCIsImFubm90YXRpb25zIiwiZmluZEJlc3RBdXRvY29tcGxldGVIYW5kbGVyIiwiY29tcGxldGlvbkNvbnRleHQiLCJleHByZXNzaW9uTGFuZ3VhZ2VDb21wbGV0aW9uSGFuZGxlcnMiLCJmaWx0ZXIiLCJoYW5kbGVyIiwic3VwcG9ydEVMIiwibWF0Y2giLCJleHByIiwibWF0Y2hCZWZvcmUiLCJmaW5kIiwidHlwZUlkIiwiaXNNYXAiLCJpbmNsdWRlcyIsImdldEVudW0iLCJjb252ZXJ0VHlwZSIsImxvd2VyVHlwZSIsInRvTG93ZXJDYXNlIiwicHJlZml4IiwidGV4dCIsInJlcGxhY2VBbGwiLCJwb3MiLCJvcHRpb25zIiwia2V5cyIsInN0YXJ0c1dpdGgiLCJ0b2tlbnMiLCJzcGxpdCIsImNhbmRpZGF0ZSIsIl90eXBlIiwidmFsdWUiLCJ3b3JkIiwiX2Zyb20iLCJkZWZhdWx0Q29tcGxldGlvbkhhbmRsZXIiLCJ3aW5kb3ciLCJjdXN0b21FbGVtZW50cyIsImRlZmluZSJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBU0EsTUFBVCxRQUF1QixzQkFBdkI7QUFDQSxTQUFTQyxtQkFBVCxRQUFvQyxlQUFwQztBQUNBLFNBQVNDLGdCQUFULEVBQTJCQyxlQUEzQixRQUFrRCwwQkFBbEQ7QUFDQSxTQUFTQyxNQUFULFFBQXVCLGtCQUF2QjtBQUNBLFNBQVNDLGVBQVQsRUFBMEJDLElBQTFCLFFBQXNDLG1CQUF0QztBQUNBLFNBQVNDLEdBQVQsUUFBb0IsYUFBcEI7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0EsT0FBTyxNQUFNQyxvQkFBTixTQUFtQ1IsTUFBbkMsQ0FBMEM7QUFDMUIsYUFBVlMsVUFBVSxHQUFHO0FBQ3RCLFdBQU8sRUFDTCxHQUFHLE1BQU1BLFVBREo7QUFFTEMsTUFBQUEsT0FBTyxFQUFFO0FBQUVDLFFBQUFBLElBQUksRUFBRUM7QUFBUjtBQUZKLEtBQVA7QUFJRDs7QUFFREMsRUFBQUEsWUFBWSxHQUFHO0FBQ2IsVUFBTUEsWUFBTjtBQUNBWixJQUFBQSxtQkFBbUIsQ0FBQyxJQUFELEVBQU8sT0FBUCxFQUFnQjtBQUFFYSxNQUFBQSxhQUFhLEVBQUU7QUFBakIsS0FBaEIsQ0FBbkI7QUFDRDs7QUFFREMsRUFBQUEsYUFBYSxHQUFH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QUFBRVgsVUFBQUEsSUFBRjtBQUFRNkMsVUFBQUE7QUFBUixTQUFQO0FBQ0Q7O0FBbkRILEtBOURLLEVBbUhMLEtBQUtVLHdCQW5IQSxDQUFQO0FBcUhEOztBQS9OOEM7QUFrT2pEQyxNQUFNLENBQUNDLGNBQVAsQ0FBc0JDLE1BQXRCLENBQTZCLHdCQUE3QixFQUF1RDlFLG9CQUF2RCIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEdyYXZpdGVlIHRlYW0gKGh0dHA6Ly9ncmF2aXRlZS5pbylcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQgeyBHdkNvZGUgfSBmcm9tICcuLi9tb2xlY3VsZXMvZ3YtY29kZSc7XG5pbXBvcnQgeyBkaXNwYXRjaEN1c3RvbUV2ZW50IH0gZnJvbSAnLi4vbGliL2V2ZW50cyc7XG5pbXBvcnQgeyBwaWNrZWRDb21wbGV0aW9uLCBzdGFydENvbXBsZXRpb24gfSBmcm9tICdAY29kZW1pcnJvci9hdXRvY29tcGxldGUnO1xuaW1wb3J0IHsga2V5bWFwIH0gZnJvbSAnQGNvZGVtaXJyb3Ivdmlldyc7XG5pbXBvcnQgeyBFZGl0b3JTZWxlY3Rpb24sIFByZWMgfSBmcm9tICdAY29kZW1pcnJvci9zdGF0ZSc7XG5pbXBvcnQgeyBnZXQgfSBmcm9tICdvYmplY3QtcGF0aCc7XG5cbi8qKlxuICogRXhwcmVzc2lvbiBMYW5ndWFnZSBjb21wb25lbnRcbiAqXG4gKiBAZmlyZXMgZ3YtZXhwcmVzc2lvbi1sYW5ndWFnZTppbnB1dCAtIGlucHV0IGV2ZW50cyB3aXRoIHRoZSBgdmFsdWVgIG9uIGBkZXRhaWxgXG4gKiBAZmlyZXMgZ3YtZXhwcmVzc2lvbi1sYW5ndWFnZTpyZWFkeSAtIGV2ZW50IGRpc3BhdGNoIHdoZW4gY29tcG9uZW50IGlzIHJlYWR5XG4gKiBAZmlyZXMgZ3YtZXhwcmVzc2lvbi1sYW5ndWFnZTpjbGlwYm9hcmQtY29weSAtIGV2ZW50IGRpc3BhdGNoIHdoZW4gY29tcG9uZW50IHRoZSBgdmFsdWVgIGhhcyBiZWVuIGNvcGllZCB0byBjbGlwYm9hcmRcbiAqXG4gKiBAYXR0ciB7U3RyaW5nfSBsYWJlbCAtIGNvZGUgbGFuZ3VhZ2VcbiAqIEBhdHRyIHtTdHJpbmd9IHZhbHVlIC0gY29kZSBjb250ZW50IHRvIGJlIGhpZ2hsaWdodGVkXG4gKiBAYXR0ciB7b3B0aW9uc30gT2JqZWN0IC0gb3B0aW9ucyBiYXNlZCBvbiBjb2RlbWlycm9yXG4gKiBAYXR0ciB7U3RyaW5nfSBwbGFjZWhvbGRlciAtIGFuIGV4YW1wbGUgdmFsdWUgdG8gZGlzcGxheSBpbiB0aGUgaW5wdXQgd2hlbiBlbXB0eVxuICogQGF0dHIge051bWJlcn0gcm93cyAtIG51bWJlciBvZiByb3dzIG9mIHRoZSB0ZXh0IGVsZW1lbnRcbiAqIEBhdHRyIHtCb29sZWFufSBsYXJnZSAtIGZvciBhIGxhcmdlIGlucHV0IChvbmx5IGlmIHRoZSBmaWVsZCBoYXMgb25lIHJvdylcbiAqIEBhdHRyIHtCb29sZWFufSBtZWRpdW0gLSBmb3IgYSBtZWRpdW0gaW5wdXQgKG9ubHkgaWYgdGhlIGZpZWxkIGhhcyBvbmUgcm93KSAoRGVmYXVsdClcbiAqIEBhdHRyIHtCb29sZWFufSBzbWFsbCAtIGZvciBhIHNtYWxsIGlucHV0IChvbmx5IGlmIHRoZSBmaWVsZCBoYXMgb25lIHJvdylcbiAqIEBhdHRyIHtPYmplY3R9IGdyYW1tYXIgLSBUaGUgZ3JhbW1hciBmb3IgRXhwcmVzc2lvbiBMYW5ndWFnZSBzdXBwb3J0XG4gKlxuICogQGF0dHIge0Jvb2xlYW59IFtjbGlwYm9hcmQ9ZmFsc2VdLSB0cnVlIGlmIGZpZWxkIGhhcyBjbGlwYm9hcmQgYnV0dG9uXG4gKiBAYXR0ciB7Qm9vbGVhbn0gW2F1dG9mb2N1cz1mYWxzZV0gLSB0cnVlIHRvIHB1dCB0aGUgZm9jdXMgb24gdGhlIGlucHV0XG4gKiBAYXR0ciB7Qm9vbGVhbn0gW3JlYWRvbmx5PWZhbHNlXSAtIHRydWUgaWYgZmllbGQgaXMgcmVhZG9ubHkgbW9kZVxuICovXG5leHBvcnQgY2xhc3MgR3ZFeHByZXNzaW9uTGFuZ3VhZ2UgZXh0ZW5kcyBHdkNvZGUge1xuICBzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN1cGVyLnByb3BlcnRpZXMsXG4gICAgICBncmFtbWFyOiB7IHR5cGU6IE9iamVjdCB9LFxuICAgIH07XG4gIH1cblxuICBmaXJzdFVwZGF0ZWQoKSB7XG4gICAgc3VwZXIuZmlyc3RVcGRhdGVkKCk7XG4gICAgZGlzcGF0Y2hDdXN0b21FdmVudCh0aGlzLCAncmVhZHknLCB7IGN1cnJlbnRUYXJnZXQ6IHRoaXMgfSk7XG4gIH1cblxuICBnZXRFeHRlbnNpb25zKCkge1xuICAgIHJldHVybiBbUHJlYy5oaWdoKHRoaXMuaW5zZXJ0RUxLZXltYXAoKSldO1xuICB9XG5cbiAgaW5zZXJ0RUxLZXltYXAoKSB7XG4gICAgcmV0dXJuIGtleW1hcC5vZihbXG4gICAgICB7XG4gICAgICAgIGtleTogJ0N0cmwtU2hpZnQtZScsXG4gICAgICAgIG1hYzogJ0NtZC1TaGlmdC1lJyxcbiAgICAgICAgcnVuKHZpZXcpIHtcbiAgICAgICAgICB2aWV3LmRpc3BhdGNoKFxuICAgICAgICAgICAgdmlldy5zdGF0ZS5jaGFuZ2VCeVJhbmdlKChyYW5nZSkgPT4gKHtcbiAgICAgICAgICAgICAgY2hhbmdlczogW3sgZnJvbTogcmFuZ2UuZnJvbSwgdG86IHJhbmdlLnRvLCBpbnNlcnQ6ICd7I30nIH1dLFxuICAgICAgICAgICAgICByYW5nZTogRWRpdG9yU2VsZWN0aW9uLnJhbmdlKHJhbmdlLmZyb20gKyAyLCByYW5nZS5mcm9tICsgMiksXG4gICAgICAgICAgICB9KSksXG4gICAgICAgICAgKTtcbiAgICAgICAgICBzdGFydENvbXBsZXRpb24odmlldyk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIF0pO1xuICB9XG5cbiAgYnVpbGRNZXRob2RzKHR5cGUpIHtcbiAgICBjb25zdCBtb2RlbFR5cGUgPSB0aGlzLmdldE1vZGVsVHlwZSh0eXBlKTtcbiAgICByZXR1cm4gbW9kZWxUeXBlLm1ldGhvZHMubWFwKCh7IG5hbWUsIHBhcmFtcyA9IFtdLCByZXR1cm5UeXBlIH0pID0+IHtcbiAgICAgIGNvbnN0IGNvbW1hbmQgPSBgJHtuYW1lfSgpYDtcbiAgICAgIGNvbnN0IGRpc3BsYXlQYXJhbXMgPSBwYXJhbXMubWFwKChwKSA9PiBgJHtwLnR5cGV9ICR7cC5uYW1lfWApO1xuICAgICAgY29uc3QgbGFiZWwgPSBgJHtuYW1lfSgke2Rpc3BsYXlQYXJhbXMuam9pbignLCAnKX0pYDtcbiAgICAgIGNvbnN0IGRldGFpbCA9IGByZXR1cm4gJHtyZXR1cm5UeXBlfWA7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiAnbWV0aG9kJyxcbiAgICAgICAgY29tbWFuZCxcbiAgICAgICAgYXBwbHk6ICh2aWV3LCBjb21wbGV0aW9uLCBmcm9tLCB0bykgPT4ge1xuICAgICAgICAgIGNvbnN0IGFuY2hvciA9IGZyb20gKyBuYW1lLmxlbmd0aCArIDE7XG4gICAgICAgICAgdmlldy5kaXNwYXRjaCh7XG4gICAgICAgICAgICBjaGFuZ2VzOiB7IGZyb20sIHRvLCBpbnNlcnQ6IGNvbXBsZXRpb24uY29tbWFuZCB9LFxuICAgICAgICAgICAgc2VsZWN0aW9uOiB7IGFuY2hvciB9LFxuICAgICAgICAgICAgdXNlckV2ZW50OiAnaW5wdXQuY29tcGxldGUnLFxuICAgICAgICAgICAgYW5ub3RhdGlvbnM6IHBpY2tlZENvbXBsZXRpb24ub2YodmlldyksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIGxhYmVsLFxuICAgICAgICBkZXRhaWwsXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgZmluZEJlc3RBdXRvY29tcGxldGVIYW5kbGVyKGNvbXBsZXRpb25Db250ZXh0KSB7XG4gICAgcmV0dXJuIHRoaXMuZXhwcmVzc2lvbkxhbmd1YWdlQ29tcGxldGlvbkhhbmRsZXJzXG4gICAgICAuZmlsdGVyKChoYW5kbGVyKSA9PiAodGhpcy5ncmFtbWFyICE9IG51bGwgJiYgaGFuZGxlci5zdXBwb3J0RUwgPT09IHRydWUpIHx8IGhhbmRsZXIuc3VwcG9ydEVMICE9PSB0cnVlKVxuICAgICAgLm1hcCgoaGFuZGxlcikgPT4ge1xuICAgICAgICBjb25zdCBtYXRjaCA9IGhhbmRsZXIuZXhwciA/IGNvbXBsZXRpb25Db250ZXh0Lm1hdGNoQmVmb3JlKGhhbmRsZXIuZXhwcikgOiB0cnVlO1xuICAgICAgICByZXR1cm4geyBoYW5kbGVyLCBtYXRjaCB9O1xuICAgICAgfSlcbiAgICAgIC5maW5kKCh7IG1hdGNoLCBleHByIH0pID0+IG1hdGNoKTtcbiAgfVxuXG4gIGdldE1vZGVsVHlwZSh0eXBlSWQpIHtcbiAgICBpZiAodGhpcy5ncmFtbWFyICE9IG51bGwpIHtcbiAgICAgIHJldHVybiBnZXQodGhpcy5ncmFtbWFyLCBgX3R5cGVzLiR7dHlwZUlkfWApO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlzTWFwKHR5cGVJZCkge1xuICAgIHJldHVybiBbJ01hcCcsICdIdHRwSGVhZGVycycsICdNdWx0aVZhbHVlTWFwJ10uaW5jbHVkZXModHlwZUlkKTtcbiAgfVxuXG4gIGdldEVudW0odHlwZUlkKSB7XG4gICAgaWYgKHRoaXMuZ3JhbW1hciAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gZ2V0KHRoaXMuZ3JhbW1hciwgYF9lbnVtcy4ke3R5cGVJZH1gKTtcbiAgICB9XG4gICAgcmV0dXJuIFsnJ107XG4gIH1cblxuICBjb252ZXJ0VHlwZSh0eXBlKSB7XG4gICAgaWYgKHR5cGUpIHtcbiAgICAgIGNvbnN0IGxvd2VyVHlwZSA9IHR5cGUudG9Mb3dlckNhc2UoKTtcbiAgICAgIGlmIChsb3dlclR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiAndGV4dCc7XG4gICAgICB9IGVsc2UgaWYgKGxvd2VyVHlwZSA9PT0gJ2h0dHBoZWFkZXJzJyB8fCBsb3dlclR5cGUgPT09ICdtdWx0aXZhbHVlbWFwJykge1xuICAgICAgICByZXR1cm4gJ3R5cGUnO1xuICAgICAgfSBlbHNlIGlmIChsb3dlclR5cGUgPT09ICdpbnQnIHx8IGxvd2VyVHlwZSA9PT0gJ2xvbmcnKSB7XG4gICAgICAgIHJldHVybiAndmFyaWFibGUnO1xuICAgICAgfSBlbHNlIGlmIChsb3dlclR5cGUuaW5jbHVkZXMoJ1tdJykpIHtcbiAgICAgICAgcmV0dXJuICdlbnVtJztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuICd2YXJpYWJsZSc7XG4gIH1cblxuICBnZXQgZXhwcmVzc2lvbkxhbmd1YWdlQ29tcGxldGlvbkhhbmRsZXJzKCkge1xuICAgIHJldHVybiBbXG4gICAgICB7XG4gICAgICAgIGV4cHI6IC97I1thLXpdKi8sXG4gICAgICAgIHN1cHBvcnRFTDogdHJ1ZSxcbiAgICAgICAgcnVuKGNvbXBsZXRpb25Db250ZXh0LCBtYXRjaCkge1xuICAgICAgICAgIGNvbnN0IHByZWZpeCA9IG1hdGNoLnRleHQucmVwbGFjZUFsbCgneyMnLCAnJyk7XG4gICAgICAgICAgY29uc3QgZnJvbSA9IGNvbXBsZXRpb25Db250ZXh0LnBvcyAtIHByZWZpeC5sZW5ndGg7XG4gICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IE9iamVjdC5rZXlzKHRoaXMuZ3JhbW1hcilcbiAgICAgICAgICAgIC5maWx0ZXIoKGNvbW1hbmQpID0+ICFjb21tYW5kLnN0YXJ0c1dpdGgoJ18nKSAmJiBjb21tYW5kLnN0YXJ0c1dpdGgocHJlZml4KSlcbiAgICAgICAgICAgIC5tYXAoKGNvbW1hbmQpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAndmFyaWFibGUnLFxuICAgICAgICAgICAgICAgIGNvbW1hbmQsXG4gICAgICAgICAgICAgICAgYXBwbHk6IGNvbW1hbmQsXG4gICAgICAgICAgICAgICAgbGFiZWw6IGNvbW1hbmQsXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4geyBmcm9tLCBvcHRpb25zIH07XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBleHByOiAveyNbYS16XSouW2EtekEtWl0qLyxcbiAgICAgICAgc3VwcG9ydEVMOiB0cnVlLFxuICAgICAgICBydW4oY29tcGxldGlvbkNvbnRleHQsIG1hdGNoKSB7XG4gICAgICAgICAgY29uc3QgdG9rZW5zID0gbWF0Y2gudGV4dC5zcGxpdCgnLicpO1xuICAgICAgICAgIGNvbnN0IGtleSA9IHRva2Vuc1swXS5yZXBsYWNlQWxsKCd7IycsICcnKTtcbiAgICAgICAgICBjb25zdCBwcmVmaXggPSB0b2tlbnNbMV07XG4gICAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHRoaXMuZ3JhbW1hcltrZXldW3ByZWZpeF07XG4gICAgICAgICAgbGV0IG9wdGlvbnMgPSBbXTtcbiAgICAgICAgICBsZXQgZnJvbSA9IGNvbXBsZXRpb25Db250ZXh0LnBvcztcbiAgICAgICAgICBpZiAoY2FuZGlkYXRlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pc01hcChjYW5kaWRhdGUuX3R5cGUpKSB7XG4gICAgICAgICAgICAgIG9wdGlvbnMgPSB0aGlzLmdldEVudW0oY2FuZGlkYXRlLl90eXBlKS5tYXAoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdHlwZSA9IHRoaXMuY29udmVydFR5cGUoY2FuZGlkYXRlLl90eXBlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjb21tYW5kID0gYFsnJHt2YWx1ZX0nXVswXWA7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICAgICAgICBjb21tYW5kLFxuICAgICAgICAgICAgICAgICAgYXBwbHk6IGNvbW1hbmQsXG4gICAgICAgICAgICAgICAgICBsYWJlbDogdmFsdWUsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZyb20gLT0gcHJlZml4Lmxlbmd0aDtcbiAgICAgICAgICAgIGNhbmRpZGF0ZSA9IHRoaXMuZ3JhbW1hcltrZXldO1xuICAgICAgICAgICAgaWYgKGNhbmRpZGF0ZS5fdHlwZSkge1xuICAgICAgICAgICAgICBvcHRpb25zID0gdGhpcy5idWlsZE1ldGhvZHMoY2FuZGlkYXRlLl90eXBlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG9wdGlvbnMgPSBPYmplY3Qua2V5cyhjYW5kaWRhdGUpXG4gICAgICAgICAgICAgICAgLmZpbHRlcigoY29tbWFuZCkgPT4gIWNvbW1hbmQuc3RhcnRzV2l0aCgnXycpICYmIGNvbW1hbmQuc3RhcnRzV2l0aChwcmVmaXgpKVxuICAgICAgICAgICAgICAgIC5tYXAoKGNvbW1hbmQpID0+ICh7XG4gICAgICAgICAgICAgICAgICB0eXBlOiB0aGlzLmNvbnZlcnRUeXBlKGNhbmRpZGF0ZVtjb21tYW5kXS5fdHlwZSksXG4gICAgICAgICAgICAgICAgICBjb21tYW5kLFxuICAgICAgICAgICAgICAgICAgYXBwbHk6IGNvbW1hbmQsXG4gICAgICAgICAgICAgICAgICBsYWJlbDogY29tbWFuZCxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB7IGZyb20sIG9wdGlvbnMgfTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGV4cHI6IC97I1thLXpdKi5bYS16QS1aXSouW2EtekEtWl0qLyxcbiAgICAgICAgc3VwcG9ydEVMOiB0cnVlLFxuICAgICAgICBydW4oY29tcGxldGlvbkNvbnRleHQsIG1hdGNoKSB7XG4gICAgICAgICAgY29uc3QgdG9rZW5zID0gbWF0Y2gudGV4dC5zcGxpdCgnLicpO1xuICAgICAgICAgIGNvbnN0IGtleSA9IHRva2Vuc1swXS5yZXBsYWNlQWxsKCd7IycsICcnKTtcbiAgICAgICAgICBjb25zdCB3b3JkID0gdG9rZW5zWzFdO1xuICAgICAgICAgIGNvbnN0IHByZWZpeCA9IHRva2Vuc1syXTtcbiAgICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB0aGlzLmdyYW1tYXJba2V5XVt3b3JkXTtcbiAgICAgICAgICBsZXQgb3B0aW9ucyA9IFtdO1xuICAgICAgICAgIGxldCBmcm9tID0gY29tcGxldGlvbkNvbnRleHQucG9zO1xuICAgICAgICAgIGlmIChjYW5kaWRhdGUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzTWFwKGNhbmRpZGF0ZS5fdHlwZSkpIHtcbiAgICAgICAgICAgICAgb3B0aW9ucyA9IHRoaXMuZ2V0RW51bShjYW5kaWRhdGUuX3R5cGUpXG4gICAgICAgICAgICAgICAgLmZpbHRlcigoY29tbWFuZCkgPT4gIWNvbW1hbmQuc3RhcnRzV2l0aCgnXycpICYmIGNvbW1hbmQuc3RhcnRzV2l0aChwcmVmaXgpKVxuICAgICAgICAgICAgICAgIC5tYXAoKGxhYmVsKSA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCB0eXBlID0gdGhpcy5jb252ZXJ0VHlwZShjYW5kaWRhdGUuX3R5cGUpO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogYFsnJHtsYWJlbH0nXVswXWAsXG4gICAgICAgICAgICAgICAgICAgIGFwcGx5KHZpZXcsIGNvbXBsZXRpb24sIF9mcm9tLCB0bykge1xuICAgICAgICAgICAgICAgICAgICAgIGZyb20gPSBfZnJvbSAtIHByZWZpeC5sZW5ndGggLSAxO1xuICAgICAgICAgICAgICAgICAgICAgIHZpZXcuZGlzcGF0Y2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlczogeyBmcm9tLCB0bywgaW5zZXJ0OiBjb21wbGV0aW9uLmNvbW1hbmQgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogeyBhbmNob3I6IGZyb20gKyBjb21wbGV0aW9uLmNvbW1hbmQubGVuZ3RoIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VyRXZlbnQ6ICdpbnB1dC5jb21wbGV0ZScsXG4gICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uczogcGlja2VkQ29tcGxldGlvbi5vZih2aWV3KSxcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaWYgKGNhbmRpZGF0ZS5fdHlwZSkge1xuICAgICAgICAgICAgICAgIG9wdGlvbnMgPSB0aGlzLmJ1aWxkTWV0aG9kcyhjYW5kaWRhdGUuX3R5cGUpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZyb20gLT0gcHJlZml4Lmxlbmd0aDtcbiAgICAgICAgICAgICAgICBvcHRpb25zID0gT2JqZWN0LmtleXMoY2FuZGlkYXRlKVxuICAgICAgICAgICAgICAgICAgLmZpbHRlcigoY29tbWFuZCkgPT4gY29tbWFuZC5zdGFydHNXaXRoKHByZWZpeCkpXG4gICAgICAgICAgICAgICAgICAubWFwKChjb21tYW5kKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgdHlwZTogdGhpcy5jb252ZXJ0VHlwZShjYW5kaWRhdGVbY29tbWFuZF0uX3R5cGUpLFxuICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQsXG4gICAgICAgICAgICAgICAgICAgICAgYXBwbHk6IGNvbW1hbmQsXG4gICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGNvbW1hbmQsXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4geyBmcm9tLCBvcHRpb25zIH07XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgdGhpcy5kZWZhdWx0Q29tcGxldGlvbkhhbmRsZXIsXG4gICAgXTtcbiAgfVxufVxuXG53aW5kb3cuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdndi1leHByZXNzaW9uLWxhbmd1YWdlJywgR3ZFeHByZXNzaW9uTGFuZ3VhZ2UpO1xuIl19
@@ -18,7 +18,6 @@ import { toSvg } from 'jdenticon';
18
18
  import { skeleton } from '../styles/skeleton';
19
19
  import { styleMap } from 'lit/directives/style-map';
20
20
  import '../atoms/gv-image';
21
-
22
21
  /**
23
22
  * Identity picture component
24
23
  *
@@ -32,64 +31,36 @@ import '../atoms/gv-image';
32
31
  *
33
32
  * @cssprop {Color} [--gv-identity-picture-notification--bgc=var(--gv-theme-color-light, #86c3d0)] - Notification background color
34
33
  */
34
+
35
35
  export class GvIdentityPicture extends LitElement {
36
36
  static get properties() {
37
37
  return {
38
- picture: { type: String },
39
- display_name: { type: String },
40
- _error: { type: Boolean, attribute: false },
41
- notification: { type: Boolean },
42
- rounded: { type: Boolean, reflect: true },
43
- skeleton: { type: Boolean },
38
+ picture: {
39
+ type: String
40
+ },
41
+ display_name: {
42
+ type: String
43
+ },
44
+ _error: {
45
+ type: Boolean,
46
+ attribute: false
47
+ },
48
+ notification: {
49
+ type: Boolean
50
+ },
51
+ rounded: {
52
+ type: Boolean,
53
+ reflect: true
54
+ },
55
+ skeleton: {
56
+ type: Boolean
57
+ }
44
58
  };
45
59
  }
46
60
 
47
61
  static get styles() {
48
- return [
49
- skeleton,
50
- // language=CSS
51
- css`
52
- :host {
53
- display: block;
54
- position: relative;
55
- }
56
-
57
- div {
58
- text-align: center;
59
- }
60
-
61
- svg,
62
- .skeleton {
63
- width: auto;
64
- height: auto;
65
- max-width: 100%;
66
- max-height: 100%;
67
- }
68
-
69
- gv-image {
70
- width: 100%;
71
- height: 100%;
72
- --gv-image--of: contain;
73
- }
74
-
75
- :host([rounded]) gv-image,
76
- :host([rounded]) svg {
77
- border: 2px solid var(--gv-theme-neutral-color-lighter, #fafafa);
78
- border-radius: 50%;
79
- box-sizing: border-box;
80
- --gv-image--of: cover;
81
- }
82
-
83
- .notification {
84
- position: absolute;
85
- width: 8px;
86
- height: 8px;
87
- background-clip: padding-box;
88
- border-radius: 50%;
89
- background-color: var(--gv-identity-picture-notification--bgc, var(--gv-theme-color-light, #86c3d0));
90
- }
91
- `,
92
- ];
62
+ return [skeleton, // language=CSS
63
+ css`:host{display:block;position:relative}div{text-align:center}.skeleton,svg{width:auto;height:auto;max-width:100%;max-height:100%}gv-image{width:100%;height:100%;--gv-image--of:contain}:host([rounded]) gv-image,:host([rounded]) svg{border:2px solid var(--gv-theme-neutral-color-lighter,#fafafa);border-radius:50%;box-sizing:border-box;--gv-image--of:cover}.notification{position:absolute;width:8px;height:8px;background-clip:padding-box;border-radius:50%;background-color:var(--gv-identity-picture-notification--bgc,var(--gv-theme-color-light,#86c3d0))}`];
93
64
  }
94
65
 
95
66
  _onError() {
@@ -115,34 +86,40 @@ export class GvIdentityPicture extends LitElement {
115
86
  }
116
87
 
117
88
  render() {
118
- const { width, height } = window.getComputedStyle(this);
89
+ const {
90
+ width,
91
+ height
92
+ } = window.getComputedStyle(this);
93
+
119
94
  if ((!this.picture || this._error) && width && height) {
120
95
  const size = this._getMaxSize(width, height);
96
+
121
97
  const container = document.createElement('div');
98
+
122
99
  if (this.skeleton) {
123
100
  container.classList.add('skeleton');
124
101
  }
102
+
125
103
  container.title = this.display_name;
126
- container.innerHTML = toSvg(this.display_name, size, { backColor: '#FFF' });
104
+ container.innerHTML = toSvg(this.display_name, size, {
105
+ backColor: '#FFF'
106
+ });
107
+
127
108
  if (this.notification) {
128
109
  const notification = document.createElement('span');
129
110
  notification.className = 'notification';
130
111
  notification.style.left = width;
131
112
  container.appendChild(notification);
132
113
  }
114
+
133
115
  return html`${container}`;
134
116
  }
135
- return html`
136
- <gv-image
137
- src="${this.picture}"
138
- alt="${this.display_name}"
139
- title="${this.display_name}"
140
- @error="${this._onError}"
141
- @gv-image:loaded="${this._onLoaded}"
142
- ></gv-image>
143
- ${this.notification ? html`<span class="notification" style="${styleMap({ left: width })}"></span>` : ''}
144
- `;
117
+
118
+ return html` <gv-image src="${this.picture}" alt="${this.display_name}" title="${this.display_name}" @error="${this._onError}" @gv-image:loaded="${this._onLoaded}"></gv-image> ${this.notification ? html`<span class="notification" style="${styleMap({
119
+ left: width
120
+ })}"></span>` : ''} `;
145
121
  }
146
- }
147
122
 
123
+ }
148
124
  window.customElements.define('gv-identity-picture', GvIdentityPicture);
125
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4vbm9kZV9tb2R1bGVzL0BncmF2aXRlZS91aS1jb21wb25lbnRzL21vbGVjdWxlcy9ndi1pZGVudGl0eS1waWN0dXJlLmpzIl0sIm5hbWVzIjpbImNzcyIsIkxpdEVsZW1lbnQiLCJodG1sIiwidG9TdmciLCJza2VsZXRvbiIsInN0eWxlTWFwIiwiR3ZJZGVudGl0eVBpY3R1cmUiLCJwcm9wZXJ0aWVzIiwicGljdHVyZSIsInR5cGUiLCJTdHJpbmciLCJkaXNwbGF5X25hbWUiLCJfZXJyb3IiLCJCb29sZWFuIiwiYXR0cmlidXRlIiwibm90aWZpY2F0aW9uIiwicm91bmRlZCIsInJlZmxlY3QiLCJzdHlsZXMiLCJfb25FcnJvciIsIl90b051bWJlciIsInNpemUiLCJwYXJzZUludCIsInJlcGxhY2UiLCJfb25Mb2FkZWQiLCJfZ2V0TWF4U2l6ZSIsIndpZHRoIiwiaGVpZ2h0IiwiTWF0aCIsIm1pbiIsInVwZGF0ZWQiLCJoYXMiLCJyZW5kZXIiLCJ3aW5kb3ciLCJnZXRDb21wdXRlZFN0eWxlIiwiY29udGFpbmVyIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiY2xhc3NMaXN0IiwiYWRkIiwidGl0bGUiLCJpbm5lckhUTUwiLCJiYWNrQ29sb3IiLCJjbGFzc05hbWUiLCJzdHlsZSIsImxlZnQiLCJhcHBlbmRDaGlsZCIsImN1c3RvbUVsZW1lbnRzIiwiZGVmaW5lIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTQSxHQUFULEVBQWNDLFVBQWQsRUFBMEJDLElBQTFCLFFBQXNDLEtBQXRDO0FBQ0EsU0FBU0MsS0FBVCxRQUFzQixXQUF0QjtBQUNBLFNBQVNDLFFBQVQsUUFBeUIsb0JBQXpCO0FBQ0EsU0FBU0MsUUFBVCxRQUF5QiwwQkFBekI7QUFDQSxPQUFPLG1CQUFQO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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LFFBQUFBLFlBQVksQ0FBQzZCLEtBQWIsQ0FBbUJDLElBQW5CLEdBQTBCbkIsS0FBMUI7QUFDQVMsUUFBQUEsU0FBUyxDQUFDVyxXQUFWLENBQXNCL0IsWUFBdEI7QUFDRDs7QUFDRCxhQUFPYixJQUFJLEdBQUdpQyxTQUFILEVBQVg7QUFDRDs7QUFDRCxXQUFPakMsSUFBSSxtQkFFQSxLQUFLTSxPQUZMLFVBR0EsS0FBS0csWUFITCxZQUlFLEtBQUtBLFlBSlAsYUFLRyxLQUFLUSxRQUxSLHVCQU1hLEtBQUtLLFNBTmxCLGlCQVFQLEtBQUtULFlBQUwsR0FBb0JiLElBQUkscUNBQXFDRyxRQUFRLENBQUM7QUFBRXdDLE1BQUFBLElBQUksRUFBRW5CO0FBQVIsS0FBRCxDQUE3QyxXQUF4QixHQUFvRyxFQVI3RixHQUFYO0FBVUQ7O0FBOUcrQztBQWlIbERPLE1BQU0sQ0FBQ2MsY0FBUCxDQUFzQkMsTUFBdEIsQ0FBNkIscUJBQTdCLEVBQW9EMUMsaUJBQXBEIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgR3Jhdml0ZWUgdGVhbSAoaHR0cDovL2dyYXZpdGVlLmlvKVxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCB7IGNzcywgTGl0RWxlbWVudCwgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyB0b1N2ZyB9IGZyb20gJ2pkZW50aWNvbic7XG5pbXBvcnQgeyBza2VsZXRvbiB9IGZyb20gJy4uL3N0eWxlcy9za2VsZXRvbic7XG5pbXBvcnQgeyBzdHlsZU1hcCB9IGZyb20gJ2xpdC9kaXJlY3RpdmVzL3N0eWxlLW1hcCc7XG5pbXBvcnQgJy4uL2F0b21zL2d2LWltYWdlJztcblxuLyoqXG4gKiBJZGVudGl0eSBwaWN0dXJlIGNvbXBvbmVudFxuICpcbiAqICMjIERldGFpbHNcbiAqICogaGFzIEB0aGVtZSBmYWNldFxuICpcbiAqIEBhdHRyIHtTdHJpbmd9IHBpY3R1cmUgLSB0aGUgcGljdHVyZVxuICogQGF0dHIge1N0cmluZ30gZGlzcGxheV9uYW1lIC0gdGhlIGRpc3BsYXlfbmFtZSBvZiB0aGUgcGljdHVyZVxuICogQGF0dHIge0Jvb2xlYW59IG5vdGlmaWNhdGlvbiAtIHRydWUgdG8gZGlzcGxheSBhIG5vdGlmaWNhdGlvbiBpbmZvXG4gKiBAYXR0ciB7Qm9vbGVhbn0gcm91bmRlZCAtIHRydWUgZm9yIHJvdW5kZWQgaW1hZ2UvaWNvblxuICpcbiAqIEBjc3Nwcm9wIHtDb2xvcn0gWy0tZ3YtaWRlbnRpdHktcGljdHVyZS1ub3RpZmljYXRpb24tLWJnYz12YXIoLS1ndi10aGVtZS1jb2xvci1saWdodCwgIzg2YzNkMCldIC0gTm90aWZpY2F0aW9uIGJhY2tncm91bmQgY29sb3JcbiAqL1xuZXhwb3J0IGNsYXNzIEd2SWRlbnRpdHlQaWN0dXJlIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIHN0YXRpYyBnZXQgcHJvcGVydGllcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcGljdHVyZTogeyB0eXBlOiBTdHJpbmcgfSxcbiAgICAgIGRpc3BsYXlfbmFtZTogeyB0eXBlOiBTdHJpbmcgfSxcbiAgICAgIF9lcnJvcjogeyB0eXBlOiBCb29sZWFuLCBhdHRyaWJ1dGU6IGZhbHNlIH0sXG4gICAgICBub3RpZmljYXRpb246IHsgdHlwZTogQm9vbGVhbiB9LFxuICAgICAgcm91bmRlZDogeyB0eXBlOiBCb29sZWFuLCByZWZsZWN0OiB0cnVlIH0sXG4gICAgICBza2VsZXRvbjogeyB0eXBlOiBCb29sZWFuIH0sXG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgc3R5bGVzKCkge1xuICAgIHJldHVybiBbXG4gICAgICBza2VsZXRvbixcbiAgICAgIC8vIGxhbmd1YWdlPUNTU1xuICAgICAgY3NzYFxuICAgICAgICA6aG9zdCB7XG4gICAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICB9XG5cbiAgICAgICAgZGl2IHtcbiAgICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgICAgIH1cblxuICAgICAgICBzdmcsXG4gICAgICAgIC5za2VsZXRvbiB7XG4gICAgICAgICAgd2lkdGg6IGF1dG87XG4gICAgICAgICAgaGVpZ2h0OiBhdXRvO1xuICAgICAgICAgIG1heC13aWR0aDogMTAwJTtcbiAgICAgICAgICBtYXgtaGVpZ2h0OiAxMDAlO1xuICAgICAgICB9XG5cbiAgICAgICAgZ3YtaW1hZ2Uge1xuICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgICAgICAtLWd2LWltYWdlLS1vZjogY29udGFpbjtcbiAgICAgICAgfVxuXG4gICAgICAgIDpob3N0KFtyb3VuZGVkXSkgZ3YtaW1hZ2UsXG4gICAgICAgIDpob3N0KFtyb3VuZGVkXSkgc3ZnIHtcbiAgICAgICAgICBib3JkZXI6IDJweCBzb2xpZCB2YXIoLS1ndi10aGVtZS1uZXV0cmFsLWNvbG9yLWxpZ2h0ZXIsICNmYWZhZmEpO1xuICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICAgIC0tZ3YtaW1hZ2UtLW9mOiBjb3ZlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIC5ub3RpZmljYXRpb24ge1xuICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgICB3aWR0aDogOHB4O1xuICAgICAgICAgIGhlaWdodDogOHB4O1xuICAgICAgICAgIGJhY2tncm91bmQtY2xpcDogcGFkZGluZy1ib3g7XG4gICAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlO1xuICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWd2LWlkZW50aXR5LXBpY3R1cmUtbm90aWZpY2F0aW9uLS1iZ2MsIHZhcigtLWd2LXRoZW1lLWNvbG9yLWxpZ2h0LCAjODZjM2QwKSk7XG4gICAgICAgIH1cbiAgICAgIGAsXG4gICAgXTtcbiAgfVxuXG4gIF9vbkVycm9yKCkge1xuICAgIHRoaXMuX2Vycm9yID0gdHJ1ZTtcbiAgfVxuXG4gIF90b051bWJlcihzaXplKSB7XG4gICAgcmV0dXJuIHBhcnNlSW50KHNpemUucmVwbGFjZSgncHgnLCAnJyksIDEwKTtcbiAgfVxuXG4gIF9vbkxvYWRlZCgpIHtcbiAgICB0aGlzLl9lcnJvciA9IGZhbHNlO1xuICB9XG5cbiAgX2dldE1heFNpemUod2lkdGgsIGhlaWdodCkge1xuICAgIHJldHVybiBNYXRoLm1pbih0aGlzLl90b051bWJlcih3aWR0aCksIHRoaXMuX3RvTnVtYmVyKGhlaWdodCkpO1xuICB9XG5cbiAgdXBkYXRlZChwcm9wZXJ0aWVzKSB7XG4gICAgaWYgKHByb3BlcnRpZXMuaGFzKCdwaWN0dXJlJykpIHtcbiAgICAgIHRoaXMuX2Vycm9yID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcyk7XG4gICAgaWYgKCghdGhpcy5waWN0dXJlIHx8IHRoaXMuX2Vycm9yKSAmJiB3aWR0aCAmJiBoZWlnaHQpIHtcbiAgICAgIGNvbnN0IHNpemUgPSB0aGlzLl9nZXRNYXhTaXplKHdpZHRoLCBoZWlnaHQpO1xuICAgICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBpZiAodGhpcy5za2VsZXRvbikge1xuICAgICAgICBjb250YWluZXIuY2xhc3NMaXN0LmFkZCgnc2tlbGV0b24nKTtcbiAgICAgIH1cbiAgICAgIGNvbnRhaW5lci50aXRsZSA9IHRoaXMuZGlzcGxheV9uYW1lO1xuICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9IHRvU3ZnKHRoaXMuZGlzcGxheV9uYW1lLCBzaXplLCB7IGJhY2tDb2xvcjogJyNGRkYnIH0pO1xuICAgICAgaWYgKHRoaXMubm90aWZpY2F0aW9uKSB7XG4gICAgICAgIGNvbnN0IG5vdGlmaWNhdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICAgICAgbm90aWZpY2F0aW9uLmNsYXNzTmFtZSA9ICdub3RpZmljYXRpb24nO1xuICAgICAgICBub3RpZmljYXRpb24uc3R5bGUubGVmdCA9IHdpZHRoO1xuICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQobm90aWZpY2F0aW9uKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBodG1sYCR7Y29udGFpbmVyfWA7XG4gICAgfVxuICAgIHJldHVybiBodG1sYFxuICAgICAgPGd2LWltYWdlXG4gICAgICAgIHNyYz1cIiR7dGhpcy5waWN0dXJlfVwiXG4gICAgICAgIGFsdD1cIiR7dGhpcy5kaXNwbGF5X25hbWV9XCJcbiAgICAgICAgdGl0bGU9XCIke3RoaXMuZGlzcGxheV9uYW1lfVwiXG4gICAgICAgIEBlcnJvcj1cIiR7dGhpcy5fb25FcnJvcn1cIlxuICAgICAgICBAZ3YtaW1hZ2U6bG9hZGVkPVwiJHt0aGlzLl9vbkxvYWRlZH1cIlxuICAgICAgPjwvZ3YtaW1hZ2U+XG4gICAgICAke3RoaXMubm90aWZpY2F0aW9uID8gaHRtbGA8c3BhbiBjbGFzcz1cIm5vdGlmaWNhdGlvblwiIHN0eWxlPVwiJHtzdHlsZU1hcCh7IGxlZnQ6IHdpZHRoIH0pfVwiPjwvc3Bhbj5gIDogJyd9XG4gICAgYDtcbiAgfVxufVxuXG53aW5kb3cuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdndi1pZGVudGl0eS1waWN0dXJlJywgR3ZJZGVudGl0eVBpY3R1cmUpO1xuIl19