@bravura/ui 5.2.4 → 6.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (137) hide show
  1. package/CHANGELOG.md +630 -620
  2. package/README.md +56 -56
  3. package/_index.scss +5 -5
  4. package/fesm2022/bravura-ui-alert-testing.mjs.map +1 -1
  5. package/fesm2022/bravura-ui-alert.mjs +13 -13
  6. package/fesm2022/bravura-ui-alert.mjs.map +1 -1
  7. package/fesm2022/bravura-ui-behavior.mjs +25 -21
  8. package/fesm2022/bravura-ui-behavior.mjs.map +1 -1
  9. package/fesm2022/bravura-ui-clip-note.mjs +15 -14
  10. package/fesm2022/bravura-ui-clip-note.mjs.map +1 -1
  11. package/fesm2022/bravura-ui-common.mjs +5 -5
  12. package/fesm2022/bravura-ui-common.mjs.map +1 -1
  13. package/fesm2022/bravura-ui-currency-input.mjs +10 -9
  14. package/fesm2022/bravura-ui-currency-input.mjs.map +1 -1
  15. package/fesm2022/bravura-ui-decimal-input.mjs +10 -9
  16. package/fesm2022/bravura-ui-decimal-input.mjs.map +1 -1
  17. package/fesm2022/bravura-ui-discrete-input.mjs +9 -9
  18. package/fesm2022/bravura-ui-discrete-input.mjs.map +1 -1
  19. package/fesm2022/bravura-ui-file-upload.mjs +12 -12
  20. package/fesm2022/bravura-ui-file-upload.mjs.map +1 -1
  21. package/fesm2022/bravura-ui-form-field.mjs +14 -13
  22. package/fesm2022/bravura-ui-form-field.mjs.map +1 -1
  23. package/fesm2022/bravura-ui-icon-font.mjs +10 -9
  24. package/fesm2022/bravura-ui-icon-font.mjs.map +1 -1
  25. package/fesm2022/bravura-ui-panel.mjs +18 -17
  26. package/fesm2022/bravura-ui-panel.mjs.map +1 -1
  27. package/fesm2022/bravura-ui-phone-number.mjs +20 -17
  28. package/fesm2022/bravura-ui-phone-number.mjs.map +1 -1
  29. package/fesm2022/bravura-ui-radio-panel-testing.mjs.map +1 -1
  30. package/fesm2022/bravura-ui-radio-panel.mjs +14 -14
  31. package/fesm2022/bravura-ui-radio-panel.mjs.map +1 -1
  32. package/fesm2022/bravura-ui-selection-panel.mjs +14 -13
  33. package/fesm2022/bravura-ui-selection-panel.mjs.map +1 -1
  34. package/fesm2022/bravura-ui-skeletons.mjs +18 -13
  35. package/fesm2022/bravura-ui-skeletons.mjs.map +1 -1
  36. package/fesm2022/bravura-ui-stepper.mjs +22 -20
  37. package/fesm2022/bravura-ui-stepper.mjs.map +1 -1
  38. package/fesm2022/bravura-ui-tooltip.mjs +14 -13
  39. package/fesm2022/bravura-ui-tooltip.mjs.map +1 -1
  40. package/m3-theme.scss +155 -155
  41. package/package.json +12 -52
  42. package/radio-panel/_radio-panel-theme.scss +11 -11
  43. package/selection-panel/_selection-panel-theme.scss +33 -33
  44. package/stepper/_stepper-theme.scss +20 -20
  45. package/theme/_ui-theme-legacy.scss +112 -112
  46. package/theme/_ui-theme.scss +101 -101
  47. package/esm2022/alert/alert-container.component.mjs +0 -207
  48. package/esm2022/alert/alert-message.component.mjs +0 -101
  49. package/esm2022/alert/alert.module.mjs +0 -22
  50. package/esm2022/alert/bravura-ui-alert.mjs +0 -5
  51. package/esm2022/alert/public-api.mjs +0 -2
  52. package/esm2022/alert/testing/bravura-ui-alert-testing.mjs +0 -5
  53. package/esm2022/alert/testing/test-api.mjs +0 -44
  54. package/esm2022/behavior/await.directive.mjs +0 -133
  55. package/esm2022/behavior/behavior.module.mjs +0 -37
  56. package/esm2022/behavior/bravura-ui-behavior.mjs +0 -5
  57. package/esm2022/behavior/observe-content-class.directive.mjs +0 -63
  58. package/esm2022/behavior/public-api.mjs +0 -6
  59. package/esm2022/behavior/sizing-monitor.directive.mjs +0 -31
  60. package/esm2022/behavior/sizing.directive.mjs +0 -256
  61. package/esm2022/bravura-ui.mjs +0 -5
  62. package/esm2022/clip-note/bravura-ui-clip-note.mjs +0 -5
  63. package/esm2022/clip-note/clip-note.component.mjs +0 -216
  64. package/esm2022/clip-note/clip-note.directive.mjs +0 -141
  65. package/esm2022/clip-note/clip-note.module.mjs +0 -32
  66. package/esm2022/clip-note/public-api.mjs +0 -2
  67. package/esm2022/common/bravura-ui-common.mjs +0 -5
  68. package/esm2022/common/common-utils.mjs +0 -34
  69. package/esm2022/common/common.module.mjs +0 -53
  70. package/esm2022/common/public-api.mjs +0 -3
  71. package/esm2022/currency-input/bravura-ui-currency-input.mjs +0 -5
  72. package/esm2022/currency-input/currency-input.directive.mjs +0 -276
  73. package/esm2022/currency-input/currency-input.module.mjs +0 -19
  74. package/esm2022/currency-input/public-api.mjs +0 -2
  75. package/esm2022/decimal-input/bravura-ui-decimal-input.mjs +0 -5
  76. package/esm2022/decimal-input/decimal-input.directive.mjs +0 -122
  77. package/esm2022/decimal-input/decimal-input.module.mjs +0 -19
  78. package/esm2022/decimal-input/public-api.mjs +0 -2
  79. package/esm2022/discrete-input/bravura-ui-discrete-input.mjs +0 -5
  80. package/esm2022/discrete-input/discrete-input.component.mjs +0 -337
  81. package/esm2022/discrete-input/discrete-input.module.mjs +0 -21
  82. package/esm2022/discrete-input/public-api.mjs +0 -3
  83. package/esm2022/file-upload/bravura-ui-file-upload.mjs +0 -5
  84. package/esm2022/file-upload/file-upload.component.mjs +0 -400
  85. package/esm2022/file-upload/file-upload.module.mjs +0 -44
  86. package/esm2022/file-upload/file-upload.service.mjs +0 -29
  87. package/esm2022/file-upload/public-api.mjs +0 -7
  88. package/esm2022/form-field/bravura-ui-form-field.mjs +0 -5
  89. package/esm2022/form-field/form-field.component.mjs +0 -82
  90. package/esm2022/form-field/form-field.module.mjs +0 -33
  91. package/esm2022/form-field/public-api.mjs +0 -3
  92. package/esm2022/icon-font/bravura-ui-icon-font.mjs +0 -5
  93. package/esm2022/icon-font/icon-font.module.mjs +0 -22
  94. package/esm2022/icon-font/icon.directive.mjs +0 -102
  95. package/esm2022/icon-font/public-api.mjs +0 -4
  96. package/esm2022/icon-font/utilities.mjs +0 -51
  97. package/esm2022/panel/bravura-ui-panel.mjs +0 -5
  98. package/esm2022/panel/panel-section.component.mjs +0 -41
  99. package/esm2022/panel/panel.component.mjs +0 -87
  100. package/esm2022/panel/panel.module.mjs +0 -23
  101. package/esm2022/panel/public-api.mjs +0 -2
  102. package/esm2022/panel/tinted.directive.mjs +0 -60
  103. package/esm2022/phone-number/bravura-ui-phone-number.mjs +0 -5
  104. package/esm2022/phone-number/phone-number.directive.mjs +0 -188
  105. package/esm2022/phone-number/phone-number.module.mjs +0 -24
  106. package/esm2022/phone-number/phone-number.pipe.mjs +0 -47
  107. package/esm2022/phone-number/phone-number.validator.mjs +0 -64
  108. package/esm2022/phone-number/public-api.mjs +0 -2
  109. package/esm2022/public-api.mjs +0 -2
  110. package/esm2022/radio-panel/bravura-ui-radio-panel.mjs +0 -5
  111. package/esm2022/radio-panel/public-api.mjs +0 -4
  112. package/esm2022/radio-panel/radio-panel-item.component.mjs +0 -93
  113. package/esm2022/radio-panel/radio-panel.component.mjs +0 -81
  114. package/esm2022/radio-panel/radio-panel.module.mjs +0 -25
  115. package/esm2022/radio-panel/testing/bravura-ui-radio-panel-testing.mjs +0 -5
  116. package/esm2022/radio-panel/testing/test-api.mjs +0 -46
  117. package/esm2022/selection-panel/bravura-ui-selection-panel.mjs +0 -5
  118. package/esm2022/selection-panel/public-api.mjs +0 -4
  119. package/esm2022/selection-panel/selection-panel-item.component.mjs +0 -163
  120. package/esm2022/selection-panel/selection-panel.directive.mjs +0 -119
  121. package/esm2022/selection-panel/selection-panel.module.mjs +0 -23
  122. package/esm2022/skeletons/bravura-ui-skeletons.mjs +0 -5
  123. package/esm2022/skeletons/public-api.mjs +0 -4
  124. package/esm2022/skeletons/skeleton-loader-presets.directive.mjs +0 -83
  125. package/esm2022/skeletons/skeleton-loader.component.mjs +0 -76
  126. package/esm2022/skeletons/skeletons.module.mjs +0 -35
  127. package/esm2022/stepper/bravura-ui-stepper.mjs +0 -5
  128. package/esm2022/stepper/public-api.mjs +0 -4
  129. package/esm2022/stepper/step-label-top.directive.mjs +0 -40
  130. package/esm2022/stepper/stepper-animation.mjs +0 -23
  131. package/esm2022/stepper/stepper.component.mjs +0 -178
  132. package/esm2022/stepper/stepper.module.mjs +0 -53
  133. package/esm2022/tooltip/bravura-ui-tooltip.mjs +0 -5
  134. package/esm2022/tooltip/public-api.mjs +0 -4
  135. package/esm2022/tooltip/tooltip.component.mjs +0 -63
  136. package/esm2022/tooltip/tooltip.directive.mjs +0 -150
  137. package/esm2022/tooltip/tooltip.module.mjs +0 -25
@@ -1,256 +0,0 @@
1
- import { coerceBooleanProperty } from '@angular/cdk/coercion';
2
- import { DOCUMENT } from '@angular/common';
3
- import { Directive, EventEmitter, Inject, Input, Optional, Output } from '@angular/core';
4
- import { debounceTime, take } from 'rxjs/operators';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "./sizing-monitor.directive";
7
- /**
8
- * This directive monitors the changes in the width of the `sizingBy` target, and apply specified style
9
- * classes and/or inline styles to the current element dynamically.
10
- *
11
- * In order for the layout engine to efficiently calculate and stabilize the dimensions, the effective style property
12
- * `box-sizing` of the `sizingBy` target element must be set to `border-box`.
13
- *
14
- * The directive uses [ResizeObserver API](https://developer.mozilla.org/en-US/docs/Web/API/Resize_Observer_API)
15
- * to capture the events of element resizing. Please use a polyfill if you want to support older browsers
16
- * that do not implement ResizeObserver API.
17
- *
18
- * Examples:
19
- *
20
- * ```html
21
- * <div #parentElement>
22
- * <div [buiSizing]="{'400': 'small', '800': 'medium', '~': 'large'}" [buiSizingBy]="parentElement"></div>
23
- * <div [buiSizing]="['small', 'medium', 'large']" [buiSizingBy]="'root'"></div>
24
- * <div [buiSizing]="{'650': 'border-color: #28569', '~': 'bg-muted; border-style: dotted'}" [buiSizingBy]="parentElement"></div>
25
- * </div>
26
- * ```
27
- */
28
- export class SizingDirective {
29
- /**
30
- * @ignore
31
- */
32
- static { this.defaultSizingBreakpoints = ['400', '800', '~']; }
33
- /**
34
- * Designate an element to be monitored for recalculating the style classes of the current element.
35
- *
36
- * - `root` specifies the document root or the enclosing shadow host. This is the default value.
37
- * - `parent` specifies the parent element.
38
- *
39
- * @default 'root'
40
- * @alias sizingBy
41
- */
42
- get buiSizingBy() {
43
- return this.sizingBy;
44
- }
45
- set buiSizingBy(target) {
46
- this.sizingBy = target;
47
- }
48
- constructor(_doc, _defaultTarget, elemRef, _zone) {
49
- this._doc = _doc;
50
- this._defaultTarget = _defaultTarget;
51
- this._zone = _zone;
52
- /**
53
- * Specifies the breakpoint widths and the style classes.
54
- *
55
- * The sizing spec `{"400": "small", "800": "medium", "~": "large"}` tells the directive to apply
56
- * a style class `small` when the width of the monitored target is smaller than 400 pixels,
57
- * `medium` when the width is between 400 and 800 pixels, and `large` when above.
58
- *
59
- * @example {'400': 'small', '800': 'medium', '~': 'large'}
60
- */
61
- this.buiSizing = {};
62
- /**
63
- * The alias of `buiSizingBy`.
64
- * @default 'root'
65
- * @deprecated
66
- * @ignore
67
- */
68
- this.sizingBy = 'root';
69
- /**
70
- * Emits `{width, height}` when the monitor target element resizes.
71
- *
72
- * Note that the dimensions emitted are of the [sizingBy] target, but not the current element.
73
- */
74
- this.buiResized = new EventEmitter();
75
- /**
76
- * Recalculate the height of this element according to the height of the monitored target.
77
- */
78
- this.buiFixedHeight = false;
79
- this._sizingSpec = {};
80
- this._width = 0;
81
- this._height = 0;
82
- this._reflowFrameCount = 0;
83
- this._frameHandlerId = 0;
84
- this._element = elemRef.nativeElement;
85
- this._monitorTarget = this._element;
86
- }
87
- ngOnChanges(_) {
88
- const disconnected = this._element.getRootNode() instanceof HTMLElement;
89
- if (disconnected) {
90
- // defer shadow detection till dom connection event
91
- this._zone.onStable.pipe(debounceTime(10), take(1)).subscribe(() => this._initOrReset());
92
- }
93
- else {
94
- this._initOrReset();
95
- }
96
- }
97
- ngOnDestroy() {
98
- this._tearDownNodeMonitor();
99
- }
100
- _initOrReset() {
101
- const originalTarget = this._monitorTarget;
102
- if (this.buiSizingBy instanceof HTMLElement) {
103
- this._monitorTarget = this.buiSizingBy;
104
- }
105
- else if (this._defaultTarget) {
106
- this._monitorTarget = this._defaultTarget.element.nativeElement;
107
- }
108
- else if (this.buiSizingBy === 'root') {
109
- const root = this._element.getRootNode();
110
- if (root instanceof ShadowRoot) {
111
- this._monitorTarget = root.host;
112
- }
113
- else {
114
- this._monitorTarget = this._doc.documentElement;
115
- }
116
- }
117
- else {
118
- this._monitorTarget = this._element.parentElement;
119
- }
120
- if (this._monitorTarget != originalTarget) {
121
- this._setUpNodeMonitor();
122
- }
123
- this._sizingSpec = {};
124
- let spec = this.buiSizing;
125
- if (typeof spec === 'string') {
126
- spec = spec.split(',').map(k => k.trim());
127
- }
128
- if (Array.isArray(spec)) {
129
- spec.forEach((c, i) => {
130
- this._sizingSpec[SizingDirective.defaultSizingBreakpoints[i] || '~'] = c;
131
- });
132
- }
133
- else if (spec) {
134
- this._sizingSpec = spec;
135
- }
136
- this.buiFixedHeight = coerceBooleanProperty(this.buiFixedHeight);
137
- this._calculateSize();
138
- }
139
- _setUpNodeMonitor() {
140
- this._tearDownNodeMonitor();
141
- if (this._monitorTarget) {
142
- this._observer = new ResizeObserver(() => this._runWithObserver(this._calculateSize.bind(this)));
143
- this._observer.observe(this._monitorTarget, { box: 'border-box' });
144
- }
145
- }
146
- _tearDownNodeMonitor() {
147
- cancelAnimationFrame(this._frameHandlerId);
148
- this._runWithObserver(() => {
149
- this._observer.disconnect();
150
- this._observer = undefined;
151
- });
152
- }
153
- _runWithObserver(func) {
154
- if (this._observer) {
155
- return func();
156
- }
157
- return undefined;
158
- }
159
- _calculateSize() {
160
- const widthChanged = this._width !== this._monitorTarget.clientWidth;
161
- const heightChanged = this._height !== this._monitorTarget.clientHeight;
162
- if (widthChanged) {
163
- this._width = this._monitorTarget.clientWidth;
164
- const bks = Object.keys(this._sizingSpec).sort((a, b) => this._toNumber(a) - this._toNumber(b));
165
- let found = false;
166
- for (const key of bks) {
167
- const classesOrStyles = this._sizingSpec[key].split(/;+/).filter(c => c);
168
- this._removeClassesOrStyles(classesOrStyles);
169
- const expectedWidth = this._toNumber(key);
170
- if (this._width <= expectedWidth && !found) {
171
- this._applyClassesOrStyles(classesOrStyles);
172
- found = true;
173
- }
174
- }
175
- }
176
- if (widthChanged || heightChanged) {
177
- this._height = this._monitorTarget.clientHeight;
178
- if (this.buiFixedHeight) {
179
- this._reflowFrameCount = 0;
180
- this._reflowHeight();
181
- }
182
- setTimeout(() => this._zone.run(() => this.buiResized.emit({ width: this._width, height: this._height })));
183
- }
184
- }
185
- _applyClassesOrStyles(clsOrStyles) {
186
- clsOrStyles.forEach(s => {
187
- if (s.includes(':')) {
188
- const [prop, val] = s.split(':');
189
- this._element.style.setProperty(prop.trim(), val.trim());
190
- }
191
- else {
192
- const classes = s.split(/\s+/).filter(c => c);
193
- if (classes.length) {
194
- this._element.classList.add(...classes);
195
- }
196
- }
197
- });
198
- }
199
- _removeClassesOrStyles(clsOrStyles) {
200
- clsOrStyles.forEach(s => {
201
- if (s.includes(':')) {
202
- const [prop] = s.split(':');
203
- this._element.style.removeProperty(prop);
204
- }
205
- else {
206
- const classes = s.split(/\s+/).filter(c => c);
207
- if (classes.length) {
208
- this._element.classList.remove(...classes);
209
- }
210
- }
211
- });
212
- }
213
- _reflowHeight() {
214
- const cnt = this._reflowFrameCount;
215
- if (cnt < 15) {
216
- cancelAnimationFrame(this._frameHandlerId);
217
- this._frameHandlerId = requestAnimationFrame(this._reflowHeight.bind(this));
218
- if (cnt === 0) {
219
- this._element.style.height = '0';
220
- }
221
- else if (cnt === 14) {
222
- const gt = parseInt(getComputedStyle(this._monitorTarget).getPropertyValue('padding-top').replace(/px$/, '') || '0', 10);
223
- const gb = parseInt(getComputedStyle(this._monitorTarget).getPropertyValue('padding-bottom').replace(/px$/, '') || '0', 10);
224
- this._element.style.height = `${this._height - gt - gb - 5}px`;
225
- }
226
- }
227
- this._reflowFrameCount++;
228
- }
229
- _toNumber(s) {
230
- return (s === '~' ? Infinity : Number(s)) || -Infinity;
231
- }
232
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.2", ngImport: i0, type: SizingDirective, deps: [{ token: DOCUMENT }, { token: i1.SizingMonitorDirective, optional: true }, { token: i0.ElementRef }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Directive }); }
233
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.2", type: SizingDirective, selector: "[buiSizing],[buiResized],[buiSizingBy],[buiFixedHeight]", inputs: { buiSizing: "buiSizing", sizingBy: "sizingBy", buiSizingBy: "buiSizingBy", buiFixedHeight: "buiFixedHeight" }, outputs: { buiResized: "buiResized" }, usesOnChanges: true, ngImport: i0 }); }
234
- }
235
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.2", ngImport: i0, type: SizingDirective, decorators: [{
236
- type: Directive,
237
- args: [{
238
- selector: '[buiSizing],[buiResized],[buiSizingBy],[buiFixedHeight]'
239
- }]
240
- }], ctorParameters: () => [{ type: Document, decorators: [{
241
- type: Inject,
242
- args: [DOCUMENT]
243
- }] }, { type: i1.SizingMonitorDirective, decorators: [{
244
- type: Optional
245
- }] }, { type: i0.ElementRef }, { type: i0.NgZone }], propDecorators: { buiSizing: [{
246
- type: Input
247
- }], sizingBy: [{
248
- type: Input
249
- }], buiSizingBy: [{
250
- type: Input
251
- }], buiResized: [{
252
- type: Output
253
- }], buiFixedHeight: [{
254
- type: Input
255
- }] } });
256
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2l6aW5nLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3VpL2JlaGF2aW9yL3NpemluZy5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDOUQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFDTixTQUFTLEVBRVQsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBSUwsUUFBUSxFQUNSLE1BQU0sRUFFTixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7QUFHcEQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBSUgsTUFBTSxPQUFPLGVBQWU7SUFDM0I7O09BRUc7YUFDSSw2QkFBd0IsR0FBRyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLEFBQXRCLENBQXVCO0lBdUJ0RDs7Ozs7Ozs7T0FRRztJQUNILElBQ0ksV0FBVztRQUNkLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN0QixDQUFDO0lBQ0QsSUFBSSxXQUFXLENBQUMsTUFBdUM7UUFDdEQsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUM7SUFDeEIsQ0FBQztJQXlCRCxZQUMyQixJQUFjLEVBQ3BCLGNBQXNDLEVBQzFELE9BQWdDLEVBQ3hCLEtBQWE7UUFISyxTQUFJLEdBQUosSUFBSSxDQUFVO1FBQ3BCLG1CQUFjLEdBQWQsY0FBYyxDQUF3QjtRQUVsRCxVQUFLLEdBQUwsS0FBSyxDQUFRO1FBakV0Qjs7Ozs7Ozs7V0FRRztRQUVILGNBQVMsR0FBdUQsRUFBRSxDQUFDO1FBRW5FOzs7OztXQUtHO1FBRUgsYUFBUSxHQUFvQyxNQUFNLENBQUM7UUFtQm5EOzs7O1dBSUc7UUFFSCxlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQXFDLENBQUM7UUFFbkU7O1dBRUc7UUFFSCxtQkFBYyxHQUFHLEtBQUssQ0FBQztRQUlmLGdCQUFXLEdBQThCLEVBQUUsQ0FBQztRQUM1QyxXQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ1gsWUFBTyxHQUFHLENBQUMsQ0FBQztRQUNaLHNCQUFpQixHQUFHLENBQUMsQ0FBQztRQUV0QixvQkFBZSxHQUFHLENBQUMsQ0FBQztRQVEzQixJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUM7UUFDdEMsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3JDLENBQUM7SUFFRCxXQUFXLENBQUMsQ0FBZ0I7UUFDM0IsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsWUFBWSxXQUFXLENBQUM7UUFDeEUsSUFBSSxZQUFZLEVBQUUsQ0FBQztZQUNsQixtREFBbUQ7WUFDbkQsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUM7UUFDMUYsQ0FBQzthQUFNLENBQUM7WUFDUCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDckIsQ0FBQztJQUNGLENBQUM7SUFFRCxXQUFXO1FBQ1YsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVPLFlBQVk7UUFDbkIsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQztRQUMzQyxJQUFJLElBQUksQ0FBQyxXQUFXLFlBQVksV0FBVyxFQUFFLENBQUM7WUFDN0MsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQ3hDLENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUNoQyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQztRQUNqRSxDQUFDO2FBQU0sSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLE1BQU0sRUFBRSxDQUFDO1lBQ3hDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDekMsSUFBSSxJQUFJLFlBQVksVUFBVSxFQUFFLENBQUM7Z0JBQ2hDLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLElBQW1CLENBQUM7WUFDaEQsQ0FBQztpQkFBTSxDQUFDO2dCQUNQLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUM7WUFDakQsQ0FBQztRQUNGLENBQUM7YUFBTSxDQUFDO1lBQ1AsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQW9CLENBQUM7UUFDMUQsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLGNBQWMsSUFBSSxjQUFjLEVBQUUsQ0FBQztZQUMzQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUMxQixDQUFDO1FBRUQsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFDdEIsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUMxQixJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzlCLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzNDLENBQUM7UUFFRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUNyQixJQUFJLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDMUUsQ0FBQyxDQUFDLENBQUM7UUFDSixDQUFDO2FBQU0sSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNqQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUN6QixDQUFDO1FBRUQsSUFBSSxDQUFDLGNBQWMsR0FBRyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFFakUsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFFTyxpQkFBaUI7UUFDeEIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDNUIsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDekIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLGNBQWMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRWpHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsRUFBRSxHQUFHLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQztRQUNwRSxDQUFDO0lBQ0YsQ0FBQztJQUVPLG9CQUFvQjtRQUMzQixvQkFBb0IsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsRUFBRTtZQUMxQixJQUFJLENBQUMsU0FBVSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQzdCLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQzVCLENBQUMsQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQUVPLGdCQUFnQixDQUFJLElBQWE7UUFDeEMsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDcEIsT0FBTyxJQUFJLEVBQUUsQ0FBQztRQUNmLENBQUM7UUFDRCxPQUFPLFNBQVMsQ0FBQztJQUNsQixDQUFDO0lBRU8sY0FBYztRQUNyQixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDO1FBQ3JFLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUM7UUFDeEUsSUFBSSxZQUFZLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDO1lBRTlDLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2hHLElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQztZQUNsQixLQUFLLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO2dCQUN2QixNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDekUsSUFBSSxDQUFDLHNCQUFzQixDQUFDLGVBQWUsQ0FBQyxDQUFDO2dCQUM3QyxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUMxQyxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksYUFBYSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7b0JBQzVDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxlQUFlLENBQUMsQ0FBQztvQkFDNUMsS0FBSyxHQUFHLElBQUksQ0FBQztnQkFDZCxDQUFDO1lBQ0YsQ0FBQztRQUNGLENBQUM7UUFFRCxJQUFJLFlBQVksSUFBSSxhQUFhLEVBQUUsQ0FBQztZQUNuQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDO1lBQ2hELElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUN6QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsQ0FBQyxDQUFDO2dCQUMzQixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDdEIsQ0FBQztZQUNELFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUcsQ0FBQztJQUNGLENBQUM7SUFFTyxxQkFBcUIsQ0FBQyxXQUFxQjtRQUNsRCxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ3ZCLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNyQixNQUFNLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ2pDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7WUFDMUQsQ0FBQztpQkFBTSxDQUFDO2dCQUNQLE1BQU0sT0FBTyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzlDLElBQUksT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO29CQUNwQixJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQztnQkFDekMsQ0FBQztZQUNGLENBQUM7UUFDRixDQUFDLENBQUMsQ0FBQztJQUNKLENBQUM7SUFFTyxzQkFBc0IsQ0FBQyxXQUFxQjtRQUNuRCxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ3ZCLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNyQixNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDNUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzFDLENBQUM7aUJBQU0sQ0FBQztnQkFDUCxNQUFNLE9BQU8sR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM5QyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztvQkFDcEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUM7Z0JBQzVDLENBQUM7WUFDRixDQUFDO1FBQ0YsQ0FBQyxDQUFDLENBQUM7SUFDSixDQUFDO0lBRU8sYUFBYTtRQUNwQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUM7UUFDbkMsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUM7WUFDZCxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDM0MsSUFBSSxDQUFDLGVBQWUsR0FBRyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBRTVFLElBQUksR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUNmLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUM7WUFDbEMsQ0FBQztpQkFBTSxJQUFJLEdBQUcsS0FBSyxFQUFFLEVBQUUsQ0FBQztnQkFDdkIsTUFBTSxFQUFFLEdBQUcsUUFBUSxDQUNsQixnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsSUFBSSxHQUFHLEVBQy9GLEVBQUUsQ0FDRixDQUFDO2dCQUNGLE1BQU0sRUFBRSxHQUFHLFFBQVEsQ0FDbEIsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsSUFBSSxHQUFHLEVBQ2xHLEVBQUUsQ0FDRixDQUFDO2dCQUNGLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQztZQUNoRSxDQUFDO1FBQ0YsQ0FBQztRQUNELElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFTyxTQUFTLENBQUMsQ0FBUztRQUMxQixPQUFPLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN4RCxDQUFDOzhHQTdPVyxlQUFlLGtCQW9FbEIsUUFBUTtrR0FwRUwsZUFBZTs7MkZBQWYsZUFBZTtrQkFIM0IsU0FBUzttQkFBQztvQkFDVixRQUFRLEVBQUUseURBQXlEO2lCQUNuRTs7MEJBcUVFLE1BQU07MkJBQUMsUUFBUTs7MEJBQ2YsUUFBUTt1RkFyRFYsU0FBUztzQkFEUixLQUFLO2dCQVVOLFFBQVE7c0JBRFAsS0FBSztnQkFhRixXQUFXO3NCQURkLEtBQUs7Z0JBY04sVUFBVTtzQkFEVCxNQUFNO2dCQU9QLGNBQWM7c0JBRGIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2VyY2lvbic7XHJcbmltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHtcclxuXHREaXJlY3RpdmUsXHJcblx0RWxlbWVudFJlZixcclxuXHRFdmVudEVtaXR0ZXIsXHJcblx0SW5qZWN0LFxyXG5cdElucHV0LFxyXG5cdE5nWm9uZSxcclxuXHRPbkNoYW5nZXMsXHJcblx0T25EZXN0cm95LFxyXG5cdE9wdGlvbmFsLFxyXG5cdE91dHB1dCxcclxuXHRTaW1wbGVDaGFuZ2VzXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgdGFrZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgU2l6aW5nTW9uaXRvckRpcmVjdGl2ZSB9IGZyb20gJy4vc2l6aW5nLW1vbml0b3IuZGlyZWN0aXZlJztcclxuXHJcbi8qKlxyXG4gKiBUaGlzIGRpcmVjdGl2ZSBtb25pdG9ycyB0aGUgY2hhbmdlcyBpbiB0aGUgd2lkdGggb2YgdGhlIGBzaXppbmdCeWAgdGFyZ2V0LCBhbmQgYXBwbHkgc3BlY2lmaWVkIHN0eWxlXHJcbiAqICBjbGFzc2VzIGFuZC9vciBpbmxpbmUgc3R5bGVzIHRvIHRoZSBjdXJyZW50IGVsZW1lbnQgZHluYW1pY2FsbHkuXHJcbiAqXHJcbiAqIEluIG9yZGVyIGZvciB0aGUgbGF5b3V0IGVuZ2luZSB0byBlZmZpY2llbnRseSBjYWxjdWxhdGUgYW5kIHN0YWJpbGl6ZSB0aGUgZGltZW5zaW9ucywgdGhlIGVmZmVjdGl2ZSBzdHlsZSBwcm9wZXJ0eVxyXG4gKiBgYm94LXNpemluZ2Agb2YgdGhlIGBzaXppbmdCeWAgdGFyZ2V0IGVsZW1lbnQgbXVzdCBiZSBzZXQgdG8gYGJvcmRlci1ib3hgLlxyXG4gKlxyXG4gKiBUaGUgZGlyZWN0aXZlIHVzZXMgW1Jlc2l6ZU9ic2VydmVyIEFQSV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1Jlc2l6ZV9PYnNlcnZlcl9BUEkpXHJcbiAqIHRvIGNhcHR1cmUgdGhlIGV2ZW50cyBvZiBlbGVtZW50IHJlc2l6aW5nLiBQbGVhc2UgdXNlIGEgcG9seWZpbGwgaWYgeW91IHdhbnQgdG8gc3VwcG9ydCBvbGRlciBicm93c2Vyc1xyXG4gKiB0aGF0IGRvIG5vdCBpbXBsZW1lbnQgUmVzaXplT2JzZXJ2ZXIgQVBJLlxyXG4gKlxyXG4gKiBFeGFtcGxlczpcclxuICpcclxuICogYGBgaHRtbFxyXG4gKiA8ZGl2ICNwYXJlbnRFbGVtZW50PlxyXG4gKiAgIDxkaXYgW2J1aVNpemluZ109XCJ7JzQwMCc6ICdzbWFsbCcsICc4MDAnOiAnbWVkaXVtJywgJ34nOiAnbGFyZ2UnfVwiIFtidWlTaXppbmdCeV09XCJwYXJlbnRFbGVtZW50XCI+PC9kaXY+XHJcbiAqICAgPGRpdiBbYnVpU2l6aW5nXT1cIlsnc21hbGwnLCAnbWVkaXVtJywgJ2xhcmdlJ11cIiBbYnVpU2l6aW5nQnldPVwiJ3Jvb3QnXCI+PC9kaXY+XHJcbiAqICAgPGRpdiBbYnVpU2l6aW5nXT1cInsnNjUwJzogJ2JvcmRlci1jb2xvcjogIzI4NTY5JywgJ34nOiAnYmctbXV0ZWQ7IGJvcmRlci1zdHlsZTogZG90dGVkJ31cIiBbYnVpU2l6aW5nQnldPVwicGFyZW50RWxlbWVudFwiPjwvZGl2PlxyXG4gKiA8L2Rpdj5cclxuICogYGBgXHJcbiAqL1xyXG5ARGlyZWN0aXZlKHtcclxuXHRzZWxlY3RvcjogJ1tidWlTaXppbmddLFtidWlSZXNpemVkXSxbYnVpU2l6aW5nQnldLFtidWlGaXhlZEhlaWdodF0nXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTaXppbmdEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XHJcblx0LyoqXHJcblx0ICogQGlnbm9yZVxyXG5cdCAqL1xyXG5cdHN0YXRpYyBkZWZhdWx0U2l6aW5nQnJlYWtwb2ludHMgPSBbJzQwMCcsICc4MDAnLCAnfiddO1xyXG5cclxuXHQvKipcclxuXHQgKiBTcGVjaWZpZXMgdGhlIGJyZWFrcG9pbnQgd2lkdGhzIGFuZCB0aGUgc3R5bGUgY2xhc3Nlcy5cclxuXHQgKlxyXG5cdCAqIFRoZSBzaXppbmcgc3BlYyBge1wiNDAwXCI6IFwic21hbGxcIiwgXCI4MDBcIjogXCJtZWRpdW1cIiwgXCJ+XCI6IFwibGFyZ2VcIn1gIHRlbGxzIHRoZSBkaXJlY3RpdmUgdG8gYXBwbHlcclxuXHQgKiBhIHN0eWxlIGNsYXNzIGBzbWFsbGAgd2hlbiB0aGUgd2lkdGggb2YgdGhlIG1vbml0b3JlZCB0YXJnZXQgaXMgc21hbGxlciB0aGFuIDQwMCBwaXhlbHMsXHJcblx0ICogYG1lZGl1bWAgd2hlbiB0aGUgd2lkdGggaXMgYmV0d2VlbiA0MDAgYW5kIDgwMCBwaXhlbHMsIGFuZCBgbGFyZ2VgIHdoZW4gYWJvdmUuXHJcblx0ICpcclxuXHQgKiBAZXhhbXBsZSB7JzQwMCc6ICdzbWFsbCcsICc4MDAnOiAnbWVkaXVtJywgJ34nOiAnbGFyZ2UnfVxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0YnVpU2l6aW5nOiBzdHJpbmcgfCBBcnJheTxzdHJpbmc+IHwgeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9O1xyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgYWxpYXMgb2YgYGJ1aVNpemluZ0J5YC5cclxuXHQgKiBAZGVmYXVsdCAncm9vdCdcclxuXHQgKiBAZGVwcmVjYXRlZFxyXG5cdCAqIEBpZ25vcmVcclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHNpemluZ0J5OiAncm9vdCcgfCAncGFyZW50JyB8IEhUTUxFbGVtZW50ID0gJ3Jvb3QnO1xyXG5cclxuXHQvKipcclxuXHQgKiBEZXNpZ25hdGUgYW4gZWxlbWVudCB0byBiZSBtb25pdG9yZWQgZm9yIHJlY2FsY3VsYXRpbmcgdGhlIHN0eWxlIGNsYXNzZXMgb2YgdGhlIGN1cnJlbnQgZWxlbWVudC5cclxuXHQgKlxyXG5cdCAqIC0gYHJvb3RgIHNwZWNpZmllcyB0aGUgZG9jdW1lbnQgcm9vdCBvciB0aGUgZW5jbG9zaW5nIHNoYWRvdyBob3N0LiBUaGlzIGlzIHRoZSBkZWZhdWx0IHZhbHVlLlxyXG5cdCAqIC0gYHBhcmVudGAgc3BlY2lmaWVzIHRoZSBwYXJlbnQgZWxlbWVudC5cclxuXHQgKlxyXG5cdCAqIEBkZWZhdWx0ICdyb290J1xyXG5cdCAqIEBhbGlhcyBzaXppbmdCeVxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0Z2V0IGJ1aVNpemluZ0J5KCk6ICdyb290JyB8ICdwYXJlbnQnIHwgSFRNTEVsZW1lbnQge1xyXG5cdFx0cmV0dXJuIHRoaXMuc2l6aW5nQnk7XHJcblx0fVxyXG5cdHNldCBidWlTaXppbmdCeSh0YXJnZXQ6ICdyb290JyB8ICdwYXJlbnQnIHwgSFRNTEVsZW1lbnQpIHtcclxuXHRcdHRoaXMuc2l6aW5nQnkgPSB0YXJnZXQ7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBFbWl0cyBge3dpZHRoLCBoZWlnaHR9YCB3aGVuIHRoZSBtb25pdG9yIHRhcmdldCBlbGVtZW50IHJlc2l6ZXMuXHJcblx0ICpcclxuXHQgKiBOb3RlIHRoYXQgdGhlIGRpbWVuc2lvbnMgZW1pdHRlZCBhcmUgb2YgdGhlIFtzaXppbmdCeV0gdGFyZ2V0LCBidXQgbm90IHRoZSBjdXJyZW50IGVsZW1lbnQuXHJcblx0ICovXHJcblx0QE91dHB1dCgpXHJcblx0YnVpUmVzaXplZCA9IG5ldyBFdmVudEVtaXR0ZXI8eyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9PigpO1xyXG5cclxuXHQvKipcclxuXHQgKiBSZWNhbGN1bGF0ZSB0aGUgaGVpZ2h0IG9mIHRoaXMgZWxlbWVudCBhY2NvcmRpbmcgdG8gdGhlIGhlaWdodCBvZiB0aGUgbW9uaXRvcmVkIHRhcmdldC5cclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdGJ1aUZpeGVkSGVpZ2h0ID0gZmFsc2U7XHJcblxyXG5cdHByaXZhdGUgX21vbml0b3JUYXJnZXQ6IEhUTUxFbGVtZW50O1xyXG5cdHByaXZhdGUgX29ic2VydmVyOiBSZXNpemVPYnNlcnZlciB8IHVuZGVmaW5lZDtcclxuXHRwcml2YXRlIF9zaXppbmdTcGVjOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge307XHJcblx0cHJpdmF0ZSBfd2lkdGggPSAwO1xyXG5cdHByaXZhdGUgX2hlaWdodCA9IDA7XHJcblx0cHJpdmF0ZSBfcmVmbG93RnJhbWVDb3VudCA9IDA7XHJcblx0cHJpdmF0ZSBfZWxlbWVudDogSFRNTEVsZW1lbnQ7XHJcblx0cHJpdmF0ZSBfZnJhbWVIYW5kbGVySWQgPSAwO1xyXG5cclxuXHRjb25zdHJ1Y3RvcihcclxuXHRcdEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgX2RvYzogRG9jdW1lbnQsXHJcblx0XHRAT3B0aW9uYWwoKSBwcml2YXRlIF9kZWZhdWx0VGFyZ2V0OiBTaXppbmdNb25pdG9yRGlyZWN0aXZlLFxyXG5cdFx0ZWxlbVJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXHJcblx0XHRwcml2YXRlIF96b25lOiBOZ1pvbmVcclxuXHQpIHtcclxuXHRcdHRoaXMuX2VsZW1lbnQgPSBlbGVtUmVmLm5hdGl2ZUVsZW1lbnQ7XHJcblx0XHR0aGlzLl9tb25pdG9yVGFyZ2V0ID0gdGhpcy5fZWxlbWVudDtcclxuXHR9XHJcblxyXG5cdG5nT25DaGFuZ2VzKF86IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuXHRcdGNvbnN0IGRpc2Nvbm5lY3RlZCA9IHRoaXMuX2VsZW1lbnQuZ2V0Um9vdE5vZGUoKSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50O1xyXG5cdFx0aWYgKGRpc2Nvbm5lY3RlZCkge1xyXG5cdFx0XHQvLyBkZWZlciBzaGFkb3cgZGV0ZWN0aW9uIHRpbGwgZG9tIGNvbm5lY3Rpb24gZXZlbnRcclxuXHRcdFx0dGhpcy5fem9uZS5vblN0YWJsZS5waXBlKGRlYm91bmNlVGltZSgxMCksIHRha2UoMSkpLnN1YnNjcmliZSgoKSA9PiB0aGlzLl9pbml0T3JSZXNldCgpKTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHRoaXMuX2luaXRPclJlc2V0KCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuXHRcdHRoaXMuX3RlYXJEb3duTm9kZU1vbml0b3IoKTtcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgX2luaXRPclJlc2V0KCkge1xyXG5cdFx0Y29uc3Qgb3JpZ2luYWxUYXJnZXQgPSB0aGlzLl9tb25pdG9yVGFyZ2V0O1xyXG5cdFx0aWYgKHRoaXMuYnVpU2l6aW5nQnkgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xyXG5cdFx0XHR0aGlzLl9tb25pdG9yVGFyZ2V0ID0gdGhpcy5idWlTaXppbmdCeTtcclxuXHRcdH0gZWxzZSBpZiAodGhpcy5fZGVmYXVsdFRhcmdldCkge1xyXG5cdFx0XHR0aGlzLl9tb25pdG9yVGFyZ2V0ID0gdGhpcy5fZGVmYXVsdFRhcmdldC5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XHJcblx0XHR9IGVsc2UgaWYgKHRoaXMuYnVpU2l6aW5nQnkgPT09ICdyb290Jykge1xyXG5cdFx0XHRjb25zdCByb290ID0gdGhpcy5fZWxlbWVudC5nZXRSb290Tm9kZSgpO1xyXG5cdFx0XHRpZiAocm9vdCBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QpIHtcclxuXHRcdFx0XHR0aGlzLl9tb25pdG9yVGFyZ2V0ID0gcm9vdC5ob3N0IGFzIEhUTUxFbGVtZW50O1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHRoaXMuX21vbml0b3JUYXJnZXQgPSB0aGlzLl9kb2MuZG9jdW1lbnRFbGVtZW50O1xyXG5cdFx0XHR9XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHR0aGlzLl9tb25pdG9yVGFyZ2V0ID0gdGhpcy5fZWxlbWVudC5wYXJlbnRFbGVtZW50IGFzIGFueTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAodGhpcy5fbW9uaXRvclRhcmdldCAhPSBvcmlnaW5hbFRhcmdldCkge1xyXG5cdFx0XHR0aGlzLl9zZXRVcE5vZGVNb25pdG9yKCk7XHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5fc2l6aW5nU3BlYyA9IHt9O1xyXG5cdFx0bGV0IHNwZWMgPSB0aGlzLmJ1aVNpemluZztcclxuXHRcdGlmICh0eXBlb2Ygc3BlYyA9PT0gJ3N0cmluZycpIHtcclxuXHRcdFx0c3BlYyA9IHNwZWMuc3BsaXQoJywnKS5tYXAoayA9PiBrLnRyaW0oKSk7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKEFycmF5LmlzQXJyYXkoc3BlYykpIHtcclxuXHRcdFx0c3BlYy5mb3JFYWNoKChjLCBpKSA9PiB7XHJcblx0XHRcdFx0dGhpcy5fc2l6aW5nU3BlY1tTaXppbmdEaXJlY3RpdmUuZGVmYXVsdFNpemluZ0JyZWFrcG9pbnRzW2ldIHx8ICd+J10gPSBjO1xyXG5cdFx0XHR9KTtcclxuXHRcdH0gZWxzZSBpZiAoc3BlYykge1xyXG5cdFx0XHR0aGlzLl9zaXppbmdTcGVjID0gc3BlYztcclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLmJ1aUZpeGVkSGVpZ2h0ID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHRoaXMuYnVpRml4ZWRIZWlnaHQpO1xyXG5cclxuXHRcdHRoaXMuX2NhbGN1bGF0ZVNpemUoKTtcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgX3NldFVwTm9kZU1vbml0b3IoKSB7XHJcblx0XHR0aGlzLl90ZWFyRG93bk5vZGVNb25pdG9yKCk7XHJcblx0XHRpZiAodGhpcy5fbW9uaXRvclRhcmdldCkge1xyXG5cdFx0XHR0aGlzLl9vYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiB0aGlzLl9ydW5XaXRoT2JzZXJ2ZXIodGhpcy5fY2FsY3VsYXRlU2l6ZS5iaW5kKHRoaXMpKSk7XHJcblxyXG5cdFx0XHR0aGlzLl9vYnNlcnZlci5vYnNlcnZlKHRoaXMuX21vbml0b3JUYXJnZXQsIHsgYm94OiAnYm9yZGVyLWJveCcgfSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIF90ZWFyRG93bk5vZGVNb25pdG9yKCkge1xyXG5cdFx0Y2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fZnJhbWVIYW5kbGVySWQpO1xyXG5cdFx0dGhpcy5fcnVuV2l0aE9ic2VydmVyKCgpID0+IHtcclxuXHRcdFx0dGhpcy5fb2JzZXJ2ZXIhLmRpc2Nvbm5lY3QoKTtcclxuXHRcdFx0dGhpcy5fb2JzZXJ2ZXIgPSB1bmRlZmluZWQ7XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgX3J1bldpdGhPYnNlcnZlcjxUPihmdW5jOiAoKSA9PiBUKTogVCB8IHVuZGVmaW5lZCB7XHJcblx0XHRpZiAodGhpcy5fb2JzZXJ2ZXIpIHtcclxuXHRcdFx0cmV0dXJuIGZ1bmMoKTtcclxuXHRcdH1cclxuXHRcdHJldHVybiB1bmRlZmluZWQ7XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIF9jYWxjdWxhdGVTaXplKCkge1xyXG5cdFx0Y29uc3Qgd2lkdGhDaGFuZ2VkID0gdGhpcy5fd2lkdGggIT09IHRoaXMuX21vbml0b3JUYXJnZXQuY2xpZW50V2lkdGg7XHJcblx0XHRjb25zdCBoZWlnaHRDaGFuZ2VkID0gdGhpcy5faGVpZ2h0ICE9PSB0aGlzLl9tb25pdG9yVGFyZ2V0LmNsaWVudEhlaWdodDtcclxuXHRcdGlmICh3aWR0aENoYW5nZWQpIHtcclxuXHRcdFx0dGhpcy5fd2lkdGggPSB0aGlzLl9tb25pdG9yVGFyZ2V0LmNsaWVudFdpZHRoO1xyXG5cclxuXHRcdFx0Y29uc3QgYmtzID0gT2JqZWN0LmtleXModGhpcy5fc2l6aW5nU3BlYykuc29ydCgoYSwgYikgPT4gdGhpcy5fdG9OdW1iZXIoYSkgLSB0aGlzLl90b051bWJlcihiKSk7XHJcblx0XHRcdGxldCBmb3VuZCA9IGZhbHNlO1xyXG5cdFx0XHRmb3IgKGNvbnN0IGtleSBvZiBia3MpIHtcclxuXHRcdFx0XHRjb25zdCBjbGFzc2VzT3JTdHlsZXMgPSB0aGlzLl9zaXppbmdTcGVjW2tleV0uc3BsaXQoLzsrLykuZmlsdGVyKGMgPT4gYyk7XHJcblx0XHRcdFx0dGhpcy5fcmVtb3ZlQ2xhc3Nlc09yU3R5bGVzKGNsYXNzZXNPclN0eWxlcyk7XHJcblx0XHRcdFx0Y29uc3QgZXhwZWN0ZWRXaWR0aCA9IHRoaXMuX3RvTnVtYmVyKGtleSk7XHJcblx0XHRcdFx0aWYgKHRoaXMuX3dpZHRoIDw9IGV4cGVjdGVkV2lkdGggJiYgIWZvdW5kKSB7XHJcblx0XHRcdFx0XHR0aGlzLl9hcHBseUNsYXNzZXNPclN0eWxlcyhjbGFzc2VzT3JTdHlsZXMpO1xyXG5cdFx0XHRcdFx0Zm91bmQgPSB0cnVlO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdGlmICh3aWR0aENoYW5nZWQgfHwgaGVpZ2h0Q2hhbmdlZCkge1xyXG5cdFx0XHR0aGlzLl9oZWlnaHQgPSB0aGlzLl9tb25pdG9yVGFyZ2V0LmNsaWVudEhlaWdodDtcclxuXHRcdFx0aWYgKHRoaXMuYnVpRml4ZWRIZWlnaHQpIHtcclxuXHRcdFx0XHR0aGlzLl9yZWZsb3dGcmFtZUNvdW50ID0gMDtcclxuXHRcdFx0XHR0aGlzLl9yZWZsb3dIZWlnaHQoKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRzZXRUaW1lb3V0KCgpID0+IHRoaXMuX3pvbmUucnVuKCgpID0+IHRoaXMuYnVpUmVzaXplZC5lbWl0KHsgd2lkdGg6IHRoaXMuX3dpZHRoLCBoZWlnaHQ6IHRoaXMuX2hlaWdodCB9KSkpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBfYXBwbHlDbGFzc2VzT3JTdHlsZXMoY2xzT3JTdHlsZXM6IHN0cmluZ1tdKSB7XHJcblx0XHRjbHNPclN0eWxlcy5mb3JFYWNoKHMgPT4ge1xyXG5cdFx0XHRpZiAocy5pbmNsdWRlcygnOicpKSB7XHJcblx0XHRcdFx0Y29uc3QgW3Byb3AsIHZhbF0gPSBzLnNwbGl0KCc6Jyk7XHJcblx0XHRcdFx0dGhpcy5fZWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eShwcm9wLnRyaW0oKSwgdmFsLnRyaW0oKSk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0Y29uc3QgY2xhc3NlcyA9IHMuc3BsaXQoL1xccysvKS5maWx0ZXIoYyA9PiBjKTtcclxuXHRcdFx0XHRpZiAoY2xhc3Nlcy5sZW5ndGgpIHtcclxuXHRcdFx0XHRcdHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZCguLi5jbGFzc2VzKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBfcmVtb3ZlQ2xhc3Nlc09yU3R5bGVzKGNsc09yU3R5bGVzOiBzdHJpbmdbXSkge1xyXG5cdFx0Y2xzT3JTdHlsZXMuZm9yRWFjaChzID0+IHtcclxuXHRcdFx0aWYgKHMuaW5jbHVkZXMoJzonKSkge1xyXG5cdFx0XHRcdGNvbnN0IFtwcm9wXSA9IHMuc3BsaXQoJzonKTtcclxuXHRcdFx0XHR0aGlzLl9lbGVtZW50LnN0eWxlLnJlbW92ZVByb3BlcnR5KHByb3ApO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGNvbnN0IGNsYXNzZXMgPSBzLnNwbGl0KC9cXHMrLykuZmlsdGVyKGMgPT4gYyk7XHJcblx0XHRcdFx0aWYgKGNsYXNzZXMubGVuZ3RoKSB7XHJcblx0XHRcdFx0XHR0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoLi4uY2xhc3Nlcyk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgX3JlZmxvd0hlaWdodCgpIHtcclxuXHRcdGNvbnN0IGNudCA9IHRoaXMuX3JlZmxvd0ZyYW1lQ291bnQ7XHJcblx0XHRpZiAoY250IDwgMTUpIHtcclxuXHRcdFx0Y2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fZnJhbWVIYW5kbGVySWQpO1xyXG5cdFx0XHR0aGlzLl9mcmFtZUhhbmRsZXJJZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLl9yZWZsb3dIZWlnaHQuYmluZCh0aGlzKSk7XHJcblxyXG5cdFx0XHRpZiAoY250ID09PSAwKSB7XHJcblx0XHRcdFx0dGhpcy5fZWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnMCc7XHJcblx0XHRcdH0gZWxzZSBpZiAoY250ID09PSAxNCkge1xyXG5cdFx0XHRcdGNvbnN0IGd0ID0gcGFyc2VJbnQoXHJcblx0XHRcdFx0XHRnZXRDb21wdXRlZFN0eWxlKHRoaXMuX21vbml0b3JUYXJnZXQpLmdldFByb3BlcnR5VmFsdWUoJ3BhZGRpbmctdG9wJykucmVwbGFjZSgvcHgkLywgJycpIHx8ICcwJyxcclxuXHRcdFx0XHRcdDEwXHJcblx0XHRcdFx0KTtcclxuXHRcdFx0XHRjb25zdCBnYiA9IHBhcnNlSW50KFxyXG5cdFx0XHRcdFx0Z2V0Q29tcHV0ZWRTdHlsZSh0aGlzLl9tb25pdG9yVGFyZ2V0KS5nZXRQcm9wZXJ0eVZhbHVlKCdwYWRkaW5nLWJvdHRvbScpLnJlcGxhY2UoL3B4JC8sICcnKSB8fCAnMCcsXHJcblx0XHRcdFx0XHQxMFxyXG5cdFx0XHRcdCk7XHJcblx0XHRcdFx0dGhpcy5fZWxlbWVudC5zdHlsZS5oZWlnaHQgPSBgJHt0aGlzLl9oZWlnaHQgLSBndCAtIGdiIC0gNX1weGA7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdHRoaXMuX3JlZmxvd0ZyYW1lQ291bnQrKztcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgX3RvTnVtYmVyKHM6IHN0cmluZykge1xyXG5cdFx0cmV0dXJuIChzID09PSAnficgPyBJbmZpbml0eSA6IE51bWJlcihzKSkgfHwgLUluZmluaXR5O1xyXG5cdH1cclxufVxyXG4iXX0=
@@ -1,5 +0,0 @@
1
- /**
2
- * Generated bundle index. Do not edit.
3
- */
4
- export * from './public-api';
5
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJhdnVyYS11aS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL3VpL2JyYXZ1cmEtdWkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWMtYXBpJztcbiJdfQ==
@@ -1,5 +0,0 @@
1
- /**
2
- * Generated bundle index. Do not edit.
3
- */
4
- export * from './public-api';
5
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJhdnVyYS11aS1jbGlwLW5vdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy91aS9jbGlwLW5vdGUvYnJhdnVyYS11aS1jbGlwLW5vdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWMtYXBpJztcbiJdfQ==
@@ -1,216 +0,0 @@
1
- import { animate, animateChild, group, query, state, style, transition, trigger } from '@angular/animations';
2
- import { ChangeDetectionStrategy, Component, ElementRef, EventEmitter, Host, TemplateRef, ViewChild, ViewContainerRef } from '@angular/core';
3
- import { Subject, takeUntil } from 'rxjs';
4
- import * as i0 from "@angular/core";
5
- import * as i1 from "@angular/cdk/bidi";
6
- import * as i2 from "@angular/material/button";
7
- import * as i3 from "@angular/material/icon";
8
- import * as i4 from "@angular/cdk/observers";
9
- import * as i5 from "@bravura/ui/icon-font";
10
- export class ClipNoteComponent {
11
- get buttonState() {
12
- if (this._hovering || this.panelState === 'open') {
13
- return 'active';
14
- }
15
- return 'inactive';
16
- }
17
- get buttonIconState() {
18
- if (this.panelState === 'open') {
19
- return `open-${this.direction}`;
20
- }
21
- if (this.buttonState === 'active') {
22
- return `active-${this.direction}`;
23
- }
24
- return 'inactive';
25
- }
26
- constructor(_cd, _dir, _elemRef) {
27
- this._cd = _cd;
28
- this._dir = _dir;
29
- this._elemRef = _elemRef;
30
- this.buttonText = '';
31
- this.panelState = 'closed-ltr';
32
- this.direction = 'ltr';
33
- this._buttonAnimating = false;
34
- this._hasContent = false;
35
- this.opened = new EventEmitter();
36
- this.closed = new EventEmitter();
37
- this._hovering = false;
38
- this._destroyed$ = new Subject();
39
- this._toggleQueue = [];
40
- }
41
- ngOnInit() {
42
- const changeDir = () => {
43
- this.direction = this._dir.value;
44
- this.panelState = `closed-${this.direction}`;
45
- this._cd.markForCheck();
46
- };
47
- this._dir.change.pipe(takeUntil(this._destroyed$)).subscribe(changeDir);
48
- changeDir();
49
- }
50
- ngOnDestroy() {
51
- this._destroyed$.next();
52
- this._destroyed$.complete();
53
- }
54
- _mouseOverButton(hovering) {
55
- if (this._hovering !== hovering) {
56
- this._hovering = hovering;
57
- this._cd.markForCheck();
58
- }
59
- }
60
- toggle() {
61
- this.panelState = this.panelState === `closed-${this.direction}` ? 'open' : `closed-${this.direction}`;
62
- this._cd.markForCheck();
63
- }
64
- _scheduleToggle() {
65
- if (this._buttonAnimating) {
66
- this._toggleQueue.push(true);
67
- }
68
- else {
69
- this.toggle();
70
- }
71
- }
72
- _checkToggle() {
73
- if (this._toggleQueue.pop()) {
74
- this.toggle();
75
- }
76
- }
77
- open() {
78
- this.panelState = 'open';
79
- this._cd.markForCheck();
80
- this._emit();
81
- }
82
- close() {
83
- this.panelState = `closed-${this.direction}`;
84
- this._cd.markForCheck();
85
- this._emit();
86
- }
87
- _emit() {
88
- if (this.panelState === 'open') {
89
- this.opened.emit();
90
- }
91
- else {
92
- this.closed.emit();
93
- }
94
- }
95
- _contentChanged(content) {
96
- let template;
97
- if (content instanceof TemplateRef) {
98
- template = content;
99
- }
100
- else {
101
- template = this._fallbackTemplate;
102
- this._content = content;
103
- }
104
- this._noteViewRef.clear();
105
- const context = {};
106
- this._contentView = this._noteViewRef.createEmbeddedView(template, context);
107
- this._checkContent(true);
108
- }
109
- _checkContent(initial) {
110
- this._contentView?.detectChanges();
111
- this._hasContent = !!this._viewDiv.nativeElement.textContent?.trim();
112
- const classList = this._elemRef.nativeElement.classList;
113
- const cls = 'bui-clip-note-hidden';
114
- const cls1 = 'bui-clip-note-reveal';
115
- if (this._hasContent) {
116
- classList.remove(cls);
117
- if (!initial && this.panelState !== 'open') {
118
- classList.add(cls1);
119
- }
120
- this._elemRef.nativeElement.scrollIntoView({ block: 'nearest', behavior: 'smooth' });
121
- }
122
- else {
123
- classList.add(cls);
124
- classList.remove(cls1);
125
- this.close();
126
- }
127
- }
128
- _assignColor(color) {
129
- this._color = color;
130
- this._cd.markForCheck();
131
- }
132
- _assignButtonText(text) {
133
- this.buttonText = text;
134
- this._cd.markForCheck();
135
- }
136
- _assignButtonIcon(icon) {
137
- this._icon = icon;
138
- this._cd.markForCheck();
139
- }
140
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.2", ngImport: i0, type: ClipNoteComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.Directionality }, { token: i0.ElementRef, host: true }], target: i0.ɵɵFactoryTarget.Component }); }
141
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.2", type: ClipNoteComponent, selector: "bui-clip-note", host: { classAttribute: "bui-clip-note bui-host" }, viewQueries: [{ propertyName: "_viewDiv", first: true, predicate: ["viewDiv"], descendants: true, read: ElementRef, static: true }, { propertyName: "_noteViewRef", first: true, predicate: ["noteViewRef"], descendants: true, read: ViewContainerRef, static: true }, { propertyName: "_fallbackTemplate", first: true, predicate: ["fallbackTemplate"], descendants: true, static: true }], ngImport: i0, template: "<div class=\"bui-clip-note-wrapper\">\r\n\t<div\r\n\t\tclass=\"bui-clip-note-content bui-border-{{ _color }} mat-elevation-z3\"\r\n\t\t[@panelAnimation]=\"panelState\"\r\n\t\t#viewDiv\r\n\t\t(cdkObserveContent)=\"_checkContent()\"\r\n\t>\r\n\t\t<ng-container #noteViewRef></ng-container>\r\n\t</div>\r\n\r\n\t<button\r\n\t\tmat-raised-button\r\n\t\tclass=\"bui-clip-note-trigger bui-clip-note-trigger-{{ buttonIconState }}\"\r\n\t\t[color]=\"_color\"\r\n\t\t[@buttonAnimation]=\"buttonState\"\r\n\t\t(mouseenter)=\"_mouseOverButton(true)\"\r\n\t\t(mouseleave)=\"_mouseOverButton(false)\"\r\n\t\t(click)=\"_scheduleToggle()\"\r\n\t>\r\n\t\t<mat-icon\r\n\t\t\t[@buttonIconAnimation]=\"_icon ? 'disabled' : buttonIconState\"\r\n\t\t\t(@buttonIconAnimation.start)=\"_buttonAnimating = true\"\r\n\t\t\t(@buttonIconAnimation.done)=\"_buttonAnimating = false; _checkToggle()\"\r\n\t\t\t[buiIcon]=\"_icon || (direction === 'rtl' ? 'chevron_right' : 'chevron_left')\"\r\n\t\t\tstyle=\"margin: 0\"\r\n\t\t>\r\n\t\t</mat-icon>\r\n\t\t<span [@buttonTextAnimation]=\"buttonState\" class=\"bui-clip-note-button-text\">&nbsp; {{ buttonText }}</span>\r\n\t</button>\r\n</div>\r\n\r\n<ng-template #fallbackTemplate>\r\n\t<div [innerHTML]=\"_content\"></div>\r\n</ng-template>\r\n", styles: [":host{position:absolute;top:2rem;box-sizing:border-box;z-index:var(--bui-clip-note-z-index, 100)}:host(.bui-clip-note-hidden){display:none}:host-context(:not([dir=rtl])){right:0}:host-context(:not([dir=rtl])) .bui-clip-note-trigger{right:-18px}:host-context([dir=rtl]){left:0;right:unset}:host-context([dir=rtl]) .bui-clip-note-trigger{left:-18px;right:unset}.bui-clip-note-trigger{border-radius:18px;overflow:hidden;position:absolute;top:-1rem}.bui-clip-note-button-text{display:inline-block;overflow:hidden;white-space:nowrap;vertical-align:middle}.bui-clip-note-wrapper{position:relative}.bui-clip-note-content{max-width:320px;min-width:150px;background-color:var(--bui-bg-body);border-radius:6px;border-width:1px;border-style:solid;padding:1rem;overflow-y:hidden}@keyframes rubber-band{0%{transform:scaleZ(1)}30%{transform:scale3d(1.25,.75,1)}40%{transform:scale3d(.75,1.25,1)}50%{transform:scale3d(1.15,.85,1)}65%{transform:scale3d(.95,1.05,1)}75%{transform:scale3d(1.05,.95,1)}to{transform:scaleZ(1)}}:host(.bui-clip-note-reveal) .bui-clip-note-trigger{animation:rubber-band .8s ease}\n"], dependencies: [{ kind: "component", type: i2.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i4.CdkObserveContent, selector: "[cdkObserveContent]", inputs: ["cdkObserveContentDisabled", "debounce"], outputs: ["cdkObserveContent"], exportAs: ["cdkObserveContent"] }, { kind: "directive", type: i5.IconDirective, selector: "[buiIcon]", inputs: ["buiIcon", "size", "variant"] }], animations: [
142
- trigger('buttonAnimation', [
143
- state('*', style({ width: '36px', minWidth: 0, padding: 0 })),
144
- state('active', style({})),
145
- transition('inactive <=> active', [
146
- group([animate('250ms cubic-bezier(.56,.14,.18,.91)'), query('@buttonTextAnimation', animateChild())]),
147
- query('@buttonIconAnimation', animateChild())
148
- ])
149
- ]),
150
- trigger('buttonTextAnimation', [
151
- state('inactive', style({ opacity: 0, width: 0 })),
152
- state('active', style({ opacity: 1 })),
153
- transition('inactive => active', animate('250ms cubic-bezier(.88,.15,.63,.61)')),
154
- transition('active => inactive', animate('250ms cubic-bezier(.05,.72,.44,.92)'))
155
- ]),
156
- trigger('buttonIconAnimation', [
157
- state('active-ltr', style({ transform: 'rotate(-90deg)' })),
158
- state('active-rtl', style({ transform: 'rotate(90deg)' })),
159
- state('open-ltr', style({ transform: 'rotate(90deg)' })),
160
- state('open-rtl', style({ transform: 'rotate(270deg)' })),
161
- state('inactive', style({})),
162
- transition('inactive <=> *, * <=> open-ltr, * <=> open-rtl', animate('250ms cubic-bezier(0.25, 0.8, 0.25, 1)'))
163
- ]),
164
- trigger('panelAnimation', [
165
- state('open', style({})),
166
- state('closed-rtl', style({ transform: 'scale(0) translate(-80%, -70%)', padding: 0, opacity: 0 })),
167
- state('closed-ltr', style({ transform: 'scale(0) translate(80%, -70%)', padding: 0, opacity: 0 })),
168
- transition('open <=> *', animate('300ms cubic-bezier(.69,.12,.6,.62)'))
169
- ])
170
- ], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
171
- }
172
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.2", ngImport: i0, type: ClipNoteComponent, decorators: [{
173
- type: Component,
174
- args: [{ selector: 'bui-clip-note', host: { class: 'bui-clip-note bui-host' }, animations: [
175
- trigger('buttonAnimation', [
176
- state('*', style({ width: '36px', minWidth: 0, padding: 0 })),
177
- state('active', style({})),
178
- transition('inactive <=> active', [
179
- group([animate('250ms cubic-bezier(.56,.14,.18,.91)'), query('@buttonTextAnimation', animateChild())]),
180
- query('@buttonIconAnimation', animateChild())
181
- ])
182
- ]),
183
- trigger('buttonTextAnimation', [
184
- state('inactive', style({ opacity: 0, width: 0 })),
185
- state('active', style({ opacity: 1 })),
186
- transition('inactive => active', animate('250ms cubic-bezier(.88,.15,.63,.61)')),
187
- transition('active => inactive', animate('250ms cubic-bezier(.05,.72,.44,.92)'))
188
- ]),
189
- trigger('buttonIconAnimation', [
190
- state('active-ltr', style({ transform: 'rotate(-90deg)' })),
191
- state('active-rtl', style({ transform: 'rotate(90deg)' })),
192
- state('open-ltr', style({ transform: 'rotate(90deg)' })),
193
- state('open-rtl', style({ transform: 'rotate(270deg)' })),
194
- state('inactive', style({})),
195
- transition('inactive <=> *, * <=> open-ltr, * <=> open-rtl', animate('250ms cubic-bezier(0.25, 0.8, 0.25, 1)'))
196
- ]),
197
- trigger('panelAnimation', [
198
- state('open', style({})),
199
- state('closed-rtl', style({ transform: 'scale(0) translate(-80%, -70%)', padding: 0, opacity: 0 })),
200
- state('closed-ltr', style({ transform: 'scale(0) translate(80%, -70%)', padding: 0, opacity: 0 })),
201
- transition('open <=> *', animate('300ms cubic-bezier(.69,.12,.6,.62)'))
202
- ])
203
- ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"bui-clip-note-wrapper\">\r\n\t<div\r\n\t\tclass=\"bui-clip-note-content bui-border-{{ _color }} mat-elevation-z3\"\r\n\t\t[@panelAnimation]=\"panelState\"\r\n\t\t#viewDiv\r\n\t\t(cdkObserveContent)=\"_checkContent()\"\r\n\t>\r\n\t\t<ng-container #noteViewRef></ng-container>\r\n\t</div>\r\n\r\n\t<button\r\n\t\tmat-raised-button\r\n\t\tclass=\"bui-clip-note-trigger bui-clip-note-trigger-{{ buttonIconState }}\"\r\n\t\t[color]=\"_color\"\r\n\t\t[@buttonAnimation]=\"buttonState\"\r\n\t\t(mouseenter)=\"_mouseOverButton(true)\"\r\n\t\t(mouseleave)=\"_mouseOverButton(false)\"\r\n\t\t(click)=\"_scheduleToggle()\"\r\n\t>\r\n\t\t<mat-icon\r\n\t\t\t[@buttonIconAnimation]=\"_icon ? 'disabled' : buttonIconState\"\r\n\t\t\t(@buttonIconAnimation.start)=\"_buttonAnimating = true\"\r\n\t\t\t(@buttonIconAnimation.done)=\"_buttonAnimating = false; _checkToggle()\"\r\n\t\t\t[buiIcon]=\"_icon || (direction === 'rtl' ? 'chevron_right' : 'chevron_left')\"\r\n\t\t\tstyle=\"margin: 0\"\r\n\t\t>\r\n\t\t</mat-icon>\r\n\t\t<span [@buttonTextAnimation]=\"buttonState\" class=\"bui-clip-note-button-text\">&nbsp; {{ buttonText }}</span>\r\n\t</button>\r\n</div>\r\n\r\n<ng-template #fallbackTemplate>\r\n\t<div [innerHTML]=\"_content\"></div>\r\n</ng-template>\r\n", styles: [":host{position:absolute;top:2rem;box-sizing:border-box;z-index:var(--bui-clip-note-z-index, 100)}:host(.bui-clip-note-hidden){display:none}:host-context(:not([dir=rtl])){right:0}:host-context(:not([dir=rtl])) .bui-clip-note-trigger{right:-18px}:host-context([dir=rtl]){left:0;right:unset}:host-context([dir=rtl]) .bui-clip-note-trigger{left:-18px;right:unset}.bui-clip-note-trigger{border-radius:18px;overflow:hidden;position:absolute;top:-1rem}.bui-clip-note-button-text{display:inline-block;overflow:hidden;white-space:nowrap;vertical-align:middle}.bui-clip-note-wrapper{position:relative}.bui-clip-note-content{max-width:320px;min-width:150px;background-color:var(--bui-bg-body);border-radius:6px;border-width:1px;border-style:solid;padding:1rem;overflow-y:hidden}@keyframes rubber-band{0%{transform:scaleZ(1)}30%{transform:scale3d(1.25,.75,1)}40%{transform:scale3d(.75,1.25,1)}50%{transform:scale3d(1.15,.85,1)}65%{transform:scale3d(.95,1.05,1)}75%{transform:scale3d(1.05,.95,1)}to{transform:scaleZ(1)}}:host(.bui-clip-note-reveal) .bui-clip-note-trigger{animation:rubber-band .8s ease}\n"] }]
204
- }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.Directionality }, { type: i0.ElementRef, decorators: [{
205
- type: Host
206
- }] }], propDecorators: { _viewDiv: [{
207
- type: ViewChild,
208
- args: ['viewDiv', { static: true, read: ElementRef }]
209
- }], _noteViewRef: [{
210
- type: ViewChild,
211
- args: ['noteViewRef', { static: true, read: ViewContainerRef }]
212
- }], _fallbackTemplate: [{
213
- type: ViewChild,
214
- args: ['fallbackTemplate', { static: true }]
215
- }] } });
216
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpcC1ub3RlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3VpL2NsaXAtbm90ZS9jbGlwLW5vdGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vcHJvamVjdHMvdWkvY2xpcC1ub3RlL2NsaXAtbm90ZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRTdHLE9BQU8sRUFDTix1QkFBdUIsRUFFdkIsU0FBUyxFQUNULFVBQVUsRUFFVixZQUFZLEVBQ1osSUFBSSxFQUdKLFdBQVcsRUFDWCxTQUFTLEVBQ1QsZ0JBQWdCLEVBQ2hCLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7Ozs7O0FBdUMxQyxNQUFNLE9BQU8saUJBQWlCO0lBRzdCLElBQUksV0FBVztRQUNkLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLE1BQU0sRUFBRSxDQUFDO1lBQ2xELE9BQU8sUUFBUSxDQUFDO1FBQ2pCLENBQUM7UUFDRCxPQUFPLFVBQVUsQ0FBQztJQUNuQixDQUFDO0lBRUQsSUFBSSxlQUFlO1FBQ2xCLElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxNQUFNLEVBQUUsQ0FBQztZQUNoQyxPQUFPLFFBQVEsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2pDLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDbkMsT0FBTyxVQUFVLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNuQyxDQUFDO1FBQ0QsT0FBTyxVQUFVLENBQUM7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Q0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDOzRCQUN4QixLQUFLLENBQUMsWUFBWSxFQUFFLEtBQUssQ0FBQyxFQUFFLFNBQVMsRUFBRSxnQ0FBZ0MsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDOzRCQUNuRyxLQUFLLENBQUMsWUFBWSxFQUFFLEtBQUssQ0FBQyxFQUFFLFNBQVMsRUFBRSwrQkFBK0IsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDOzRCQUNsRyxVQUFVLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO3lCQUN2RSxDQUFDO3FCQUNGLG1CQUNnQix1QkFBdUIsQ0FBQyxNQUFNOzswQkFtRDdDLElBQUk7eUNBWEUsUUFBUTtzQkFEZixTQUFTO3VCQUFDLFNBQVMsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRTtnQkFJaEQsWUFBWTtzQkFEbkIsU0FBUzt1QkFBQyxhQUFhLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRTtnQkFJMUQsaUJBQWlCO3NCQUR4QixTQUFTO3VCQUFDLGtCQUFrQixFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGFuaW1hdGUsIGFuaW1hdGVDaGlsZCwgZ3JvdXAsIHF1ZXJ5LCBzdGF0ZSwgc3R5bGUsIHRyYW5zaXRpb24sIHRyaWdnZXIgfSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJztcclxuaW1wb3J0IHsgRGlyZWN0aW9uYWxpdHkgfSBmcm9tICdAYW5ndWxhci9jZGsvYmlkaSc7XHJcbmltcG9ydCB7XHJcblx0Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXHJcblx0Q2hhbmdlRGV0ZWN0b3JSZWYsXHJcblx0Q29tcG9uZW50LFxyXG5cdEVsZW1lbnRSZWYsXHJcblx0RW1iZWRkZWRWaWV3UmVmLFxyXG5cdEV2ZW50RW1pdHRlcixcclxuXHRIb3N0LFxyXG5cdE9uRGVzdHJveSxcclxuXHRPbkluaXQsXHJcblx0VGVtcGxhdGVSZWYsXHJcblx0Vmlld0NoaWxkLFxyXG5cdFZpZXdDb250YWluZXJSZWZcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgVGhlbWVQYWxldHRlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY29yZSc7XHJcbmltcG9ydCB7IFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcblx0c2VsZWN0b3I6ICdidWktY2xpcC1ub3RlJyxcclxuXHR0ZW1wbGF0ZVVybDogJy4vY2xpcC1ub3RlLmNvbXBvbmVudC5odG1sJyxcclxuXHRzdHlsZVVybHM6IFsnLi9jbGlwLW5vdGUuY29tcG9uZW50LnNjc3MnXSxcclxuXHRob3N0OiB7IGNsYXNzOiAnYnVpLWNsaXAtbm90ZSBidWktaG9zdCcgfSxcclxuXHRhbmltYXRpb25zOiBbXHJcblx0XHR0cmlnZ2VyKCdidXR0b25BbmltYXRpb24nLCBbXHJcblx0XHRcdHN0YXRlKCcqJywgc3R5bGUoeyB3aWR0aDogJzM2cHgnLCBtaW5XaWR0aDogMCwgcGFkZGluZzogMCB9KSksXHJcblx0XHRcdHN0YXRlKCdhY3RpdmUnLCBzdHlsZSh7fSkpLFxyXG5cdFx0XHR0cmFuc2l0aW9uKCdpbmFjdGl2ZSA8PT4gYWN0aXZlJywgW1xyXG5cdFx0XHRcdGdyb3VwKFthbmltYXRlKCcyNTBtcyBjdWJpYy1iZXppZXIoLjU2LC4xNCwuMTgsLjkxKScpLCBxdWVyeSgnQGJ1dHRvblRleHRBbmltYXRpb24nLCBhbmltYXRlQ2hpbGQoKSldKSxcclxuXHRcdFx0XHRxdWVyeSgnQGJ1dHRvbkljb25BbmltYXRpb24nLCBhbmltYXRlQ2hpbGQoKSlcclxuXHRcdFx0XSlcclxuXHRcdF0pLFxyXG5cdFx0dHJpZ2dlcignYnV0dG9uVGV4dEFuaW1hdGlvbicsIFtcclxuXHRcdFx0c3RhdGUoJ2luYWN0aXZlJywgc3R5bGUoeyBvcGFjaXR5OiAwLCB3aWR0aDogMCB9KSksXHJcblx0XHRcdHN0YXRlKCdhY3RpdmUnLCBzdHlsZSh7IG9wYWNpdHk6IDEgfSkpLFxyXG5cdFx0XHR0cmFuc2l0aW9uKCdpbmFjdGl2ZSA9PiBhY3RpdmUnLCBhbmltYXRlKCcyNTBtcyBjdWJpYy1iZXppZXIoLjg4LC4xNSwuNjMsLjYxKScpKSxcclxuXHRcdFx0dHJhbnNpdGlvbignYWN0aXZlID0+IGluYWN0aXZlJywgYW5pbWF0ZSgnMjUwbXMgY3ViaWMtYmV6aWVyKC4wNSwuNzIsLjQ0LC45MiknKSlcclxuXHRcdF0pLFxyXG5cdFx0dHJpZ2dlcignYnV0dG9uSWNvbkFuaW1hdGlvbicsIFtcclxuXHRcdFx0c3RhdGUoJ2FjdGl2ZS1sdHInLCBzdHlsZSh7IHRyYW5zZm9ybTogJ3JvdGF0ZSgtOTBkZWcpJyB9KSksXHJcblx0XHRcdHN0YXRlKCdhY3RpdmUtcnRsJywgc3R5bGUoeyB0cmFuc2Zvcm06ICdyb3RhdGUoOTBkZWcpJyB9KSksXHJcblx0XHRcdHN0YXRlKCdvcGVuLWx0cicsIHN0eWxlKHsgdHJhbnNmb3JtOiAncm90YXRlKDkwZGVnKScgfSkpLFxyXG5cdFx0XHRzdGF0ZSgnb3Blbi1ydGwnLCBzdHlsZSh7IHRyYW5zZm9ybTogJ3JvdGF0ZSgyNzBkZWcpJyB9KSksXHJcblx0XHRcdHN0YXRlKCdpbmFjdGl2ZScsIHN0eWxlKHt9KSksXHJcblx0XHRcdHRyYW5zaXRpb24oJ2luYWN0aXZlIDw9PiAqLCAqIDw9PiBvcGVuLWx0ciwgKiA8PT4gb3Blbi1ydGwnLCBhbmltYXRlKCcyNTBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKScpKVxyXG5cdFx0XSksXHJcblx0XHR0cmlnZ2VyKCdwYW5lbEFuaW1hdGlvbicsIFtcclxuXHRcdFx0c3RhdGUoJ29wZW4nLCBzdHlsZSh7fSkpLFxyXG5cdFx0XHRzdGF0ZSgnY2xvc2VkLXJ0bCcsIHN0eWxlKHsgdHJhbnNmb3JtOiAnc2NhbGUoMCkgdHJhbnNsYXRlKC04MCUsIC03MCUpJywgcGFkZGluZzogMCwgb3BhY2l0eTogMCB9KSksXHJcblx0XHRcdHN0YXRlKCdjbG9zZWQtbHRyJywgc3R5bGUoeyB0cmFuc2Zvcm06ICdzY2FsZSgwKSB0cmFuc2xhdGUoODAlLCAtNzAlKScsIHBhZGRpbmc6IDAsIG9wYWNpdHk6IDAgfSkpLFxyXG5cdFx0XHR0cmFuc2l0aW9uKCdvcGVuIDw9PiAqJywgYW5pbWF0ZSgnMzAwbXMgY3ViaWMtYmV6aWVyKC42OSwuMTIsLjYsLjYyKScpKVxyXG5cdFx0XSlcclxuXHRdLFxyXG5cdGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDbGlwTm90ZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuXHRidXR0b25UZXh0ID0gJyc7XHJcblxyXG5cdGdldCBidXR0b25TdGF0ZSgpOiBzdHJpbmcge1xyXG5cdFx0aWYgKHRoaXMuX2hvdmVyaW5nIHx8IHRoaXMucGFuZWxTdGF0ZSA9PT0gJ29wZW4nKSB7XHJcblx0XHRcdHJldHVybiAnYWN0aXZlJztcclxuXHRcdH1cclxuXHRcdHJldHVybiAnaW5hY3RpdmUnO1xyXG5cdH1cclxuXHJcblx0Z2V0IGJ1dHRvbkljb25TdGF0ZSgpOiBzdHJpbmcge1xyXG5cdFx0aWYgKHRoaXMucGFuZWxTdGF0ZSA9PT0gJ29wZW4nKSB7XHJcblx0XHRcdHJldHVybiBgb3Blbi0ke3RoaXMuZGlyZWN0aW9ufWA7XHJcblx0XHR9XHJcblx0XHRpZiAodGhpcy5idXR0b25TdGF0ZSA9PT0gJ2FjdGl2ZScpIHtcclxuXHRcdFx0cmV0dXJuIGBhY3RpdmUtJHt0aGlzLmRpcmVjdGlvbn1gO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuICdpbmFjdGl2ZSc7XHJcblx0fVxyXG5cclxuXHRwYW5lbFN0YXRlOiAnb3BlbicgfCAnY2xvc2VkLWx0cicgfCAnY2xvc2VkLXJ0bCcgPSAnY2xvc2VkLWx0cic7XHJcblxyXG5cdGRpcmVjdGlvbiA9ICdsdHInO1xyXG5cdF9jb250ZW50Vmlldz86IEVtYmVkZGVkVmlld1JlZjxhbnk+O1xyXG5cdF9jb250ZW50Pzogc3RyaW5nO1xyXG5cdF9jb2xvcjogVGhlbWVQYWxldHRlO1xyXG5cdF9idXR0b25BbmltYXRpbmcgPSBmYWxzZTtcclxuXHRfaWNvbj86IHN0cmluZztcclxuXHRfaGFzQ29udGVudCA9IGZhbHNlO1xyXG5cclxuXHRyZWFkb25seSBvcGVuZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcblx0cmVhZG9ubHkgY2xvc2VkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG5cclxuXHRwcml2YXRlIF9ob3ZlcmluZyA9IGZhbHNlO1xyXG5cdHByaXZhdGUgX2Rlc3Ryb3llZCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cdHByaXZhdGUgX3RvZ2dsZVF1ZXVlOiBib29sZWFuW10gPSBbXTtcclxuXHJcblx0QFZpZXdDaGlsZCgndmlld0RpdicsIHsgc3RhdGljOiB0cnVlLCByZWFkOiBFbGVtZW50UmVmIH0pXHJcblx0cHJpdmF0ZSBfdmlld0RpdiE6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xyXG5cclxuXHRAVmlld0NoaWxkKCdub3RlVmlld1JlZicsIHsgc3RhdGljOiB0cnVlLCByZWFkOiBWaWV3Q29udGFpbmVyUmVmIH0pXHJcblx0cHJpdmF0ZSBfbm90ZVZpZXdSZWYhOiBWaWV3Q29udGFpbmVyUmVmO1xyXG5cclxuXHRAVmlld0NoaWxkKCdmYWxsYmFja1RlbXBsYXRlJywgeyBzdGF0aWM6IHRydWUgfSlcclxuXHRwcml2YXRlIF9mYWxsYmFja1RlbXBsYXRlITogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcblx0Y29uc3RydWN0b3IoXHJcblx0XHRwcml2YXRlIF9jZDogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcblx0XHRwcml2YXRlIF9kaXI6IERpcmVjdGlvbmFsaXR5LFxyXG5cdFx0QEhvc3QoKSBwcml2YXRlIF9lbGVtUmVmOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PlxyXG5cdCkge31cclxuXHJcblx0bmdPbkluaXQoKTogdm9pZCB7XHJcblx0XHRjb25zdCBjaGFuZ2VEaXIgPSAoKSA9PiB7XHJcblx0XHRcdHRoaXMuZGlyZWN0aW9uID0gdGhpcy5fZGlyLnZhbHVlO1xyXG5cdFx0XHR0aGlzLnBhbmVsU3RhdGUgPSBgY2xvc2VkLSR7dGhpcy5kaXJlY3Rpb259YCBhcyBhbnk7XHJcblx0XHRcdHRoaXMuX2NkLm1hcmtGb3JDaGVjaygpO1xyXG5cdFx0fTtcclxuXHRcdHRoaXMuX2Rpci5jaGFuZ2UucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveWVkJCkpLnN1YnNjcmliZShjaGFuZ2VEaXIpO1xyXG5cdFx0Y2hhbmdlRGlyKCk7XHJcblx0fVxyXG5cclxuXHRuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuXHRcdHRoaXMuX2Rlc3Ryb3llZCQubmV4dCgpO1xyXG5cdFx0dGhpcy5fZGVzdHJveWVkJC5jb21wbGV0ZSgpO1xyXG5cdH1cclxuXHJcblx0X21vdXNlT3ZlckJ1dHRvbihob3ZlcmluZzogYm9vbGVhbikge1xyXG5cdFx0aWYgKHRoaXMuX2hvdmVyaW5nICE9PSBob3ZlcmluZykge1xyXG5cdFx0XHR0aGlzLl9ob3ZlcmluZyA9IGhvdmVyaW5nO1xyXG5cdFx0XHR0aGlzLl9jZC5tYXJrRm9yQ2hlY2soKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHRvZ2dsZSgpIHtcclxuXHRcdHRoaXMucGFuZWxTdGF0ZSA9IHRoaXMucGFuZWxTdGF0ZSA9PT0gYGNsb3NlZC0ke3RoaXMuZGlyZWN0aW9ufWAgPyAnb3BlbicgOiAoYGNsb3NlZC0ke3RoaXMuZGlyZWN0aW9ufWAgYXMgYW55KTtcclxuXHRcdHRoaXMuX2NkLm1hcmtGb3JDaGVjaygpO1xyXG5cdH1cclxuXHJcblx0X3NjaGVkdWxlVG9nZ2xlKCkge1xyXG5cdFx0aWYgKHRoaXMuX2J1dHRvbkFuaW1hdGluZykge1xyXG5cdFx0XHR0aGlzLl90b2dnbGVRdWV1ZS5wdXNoKHRydWUpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0dGhpcy50b2dnbGUoKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdF9jaGVja1RvZ2dsZSgpIHtcclxuXHRcdGlmICh0aGlzLl90b2dnbGVRdWV1ZS5wb3AoKSkge1xyXG5cdFx0XHR0aGlzLnRvZ2dsZSgpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0b3BlbigpIHtcclxuXHRcdHRoaXMucGFuZWxTdGF0ZSA9ICdvcGVuJztcclxuXHRcdHRoaXMuX2NkLm1hcmtGb3JDaGVjaygpO1xyXG5cdFx0dGhpcy5fZW1pdCgpO1xyXG5cdH1cclxuXHJcblx0Y2xvc2UoKSB7XHJcblx0XHR0aGlzLnBhbmVsU3RhdGUgPSBgY2xvc2VkLSR7dGhpcy5kaXJlY3Rpb259YCBhcyBhbnk7XHJcblx0XHR0aGlzLl9jZC5tYXJrRm9yQ2hlY2soKTtcclxuXHRcdHRoaXMuX2VtaXQoKTtcclxuXHR9XHJcblxyXG5cdF9lbWl0KCkge1xyXG5cdFx0aWYgKHRoaXMucGFuZWxTdGF0ZSA9PT0gJ29wZW4nKSB7XHJcblx0XHRcdHRoaXMub3BlbmVkLmVtaXQoKTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHRoaXMuY2xvc2VkLmVtaXQoKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdF9jb250ZW50Q2hhbmdlZChjb250ZW50Pzogc3RyaW5nIHwgVGVtcGxhdGVSZWY8YW55Pikge1xyXG5cdFx0bGV0IHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuXHRcdGlmIChjb250ZW50IGluc3RhbmNlb2YgVGVtcGxhdGVSZWYpIHtcclxuXHRcdFx0dGVtcGxhdGUgPSBjb250ZW50O1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0dGVtcGxhdGUgPSB0aGlzLl9mYWxsYmFja1RlbXBsYXRlO1xyXG5cdFx0XHR0aGlzLl9jb250ZW50ID0gY29udGVudDtcclxuXHRcdH1cclxuXHRcdHRoaXMuX25vdGVWaWV3UmVmLmNsZWFyKCk7XHJcblx0XHRjb25zdCBjb250ZXh0ID0ge307XHJcblx0XHR0aGlzLl9jb250ZW50VmlldyA9IHRoaXMuX25vdGVWaWV3UmVmLmNyZWF0ZUVtYmVkZGVkVmlldyh0ZW1wbGF0ZSwgY29udGV4dCk7XHJcblx0XHR0aGlzLl9jaGVja0NvbnRlbnQodHJ1ZSk7XHJcblx0fVxyXG5cclxuXHRfY2hlY2tDb250ZW50KGluaXRpYWw/OiBib29sZWFuKSB7XHJcblx0XHR0aGlzLl9jb250ZW50Vmlldz8uZGV0ZWN0Q2hhbmdlcygpO1xyXG5cdFx0dGhpcy5faGFzQ29udGVudCA9ICEhdGhpcy5fdmlld0Rpdi5uYXRpdmVFbGVtZW50LnRleHRDb250ZW50Py50cmltKCk7XHJcblx0XHRjb25zdCBjbGFzc0xpc3QgPSB0aGlzLl9lbGVtUmVmLm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0O1xyXG5cdFx0Y29uc3QgY2xzID0gJ2J1aS1jbGlwLW5vdGUtaGlkZGVuJztcclxuXHRcdGNvbnN0IGNsczEgPSAnYnVpLWNsaXAtbm90ZS1yZXZlYWwnO1xyXG5cdFx0aWYgKHRoaXMuX2hhc0NvbnRlbnQpIHtcclxuXHRcdFx0Y2xhc3NMaXN0LnJlbW92ZShjbHMpO1xyXG5cdFx0XHRpZiAoIWluaXRpYWwgJiYgdGhpcy5wYW5lbFN0YXRlICE9PSAnb3BlbicpIHtcclxuXHRcdFx0XHRjbGFzc0xpc3QuYWRkKGNsczEpO1xyXG5cdFx0XHR9XHJcblx0XHRcdHRoaXMuX2VsZW1SZWYubmF0aXZlRWxlbWVudC5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnbmVhcmVzdCcsIGJlaGF2aW9yOiAnc21vb3RoJyB9KTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdGNsYXNzTGlzdC5hZGQoY2xzKTtcclxuXHRcdFx0Y2xhc3NMaXN0LnJlbW92ZShjbHMxKTtcclxuXHRcdFx0dGhpcy5jbG9zZSgpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0X2Fzc2lnbkNvbG9yKGNvbG9yOiBUaGVtZVBhbGV0dGUpIHtcclxuXHRcdHRoaXMuX2NvbG9yID0gY29sb3I7XHJcblx0XHR0aGlzLl9jZC5tYXJrRm9yQ2hlY2soKTtcclxuXHR9XHJcblxyXG5cdF9hc3NpZ25CdXR0b25UZXh0KHRleHQ6IHN0cmluZykge1xyXG5cdFx0dGhpcy5idXR0b25UZXh0ID0gdGV4dDtcclxuXHRcdHRoaXMuX2NkLm1hcmtGb3JDaGVjaygpO1xyXG5cdH1cclxuXHJcblx0X2Fzc2lnbkJ1dHRvbkljb24oaWNvbj86IHN0cmluZykge1xyXG5cdFx0dGhpcy5faWNvbiA9IGljb247XHJcblx0XHR0aGlzLl9jZC5tYXJrRm9yQ2hlY2soKTtcclxuXHR9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImJ1aS1jbGlwLW5vdGUtd3JhcHBlclwiPlxyXG5cdDxkaXZcclxuXHRcdGNsYXNzPVwiYnVpLWNsaXAtbm90ZS1jb250ZW50IGJ1aS1ib3JkZXIte3sgX2NvbG9yIH19IG1hdC1lbGV2YXRpb24tejNcIlxyXG5cdFx0W0BwYW5lbEFuaW1hdGlvbl09XCJwYW5lbFN0YXRlXCJcclxuXHRcdCN2aWV3RGl2XHJcblx0XHQoY2RrT2JzZXJ2ZUNvbnRlbnQpPVwiX2NoZWNrQ29udGVudCgpXCJcclxuXHQ+XHJcblx0XHQ8bmctY29udGFpbmVyICNub3RlVmlld1JlZj48L25nLWNvbnRhaW5lcj5cclxuXHQ8L2Rpdj5cclxuXHJcblx0PGJ1dHRvblxyXG5cdFx0bWF0LXJhaXNlZC1idXR0b25cclxuXHRcdGNsYXNzPVwiYnVpLWNsaXAtbm90ZS10cmlnZ2VyIGJ1aS1jbGlwLW5vdGUtdHJpZ2dlci17eyBidXR0b25JY29uU3RhdGUgfX1cIlxyXG5cdFx0W2NvbG9yXT1cIl9jb2xvclwiXHJcblx0XHRbQGJ1dHRvbkFuaW1hdGlvbl09XCJidXR0b25TdGF0ZVwiXHJcblx0XHQobW91c2VlbnRlcik9XCJfbW91c2VPdmVyQnV0dG9uKHRydWUpXCJcclxuXHRcdChtb3VzZWxlYXZlKT1cIl9tb3VzZU92ZXJCdXR0b24oZmFsc2UpXCJcclxuXHRcdChjbGljayk9XCJfc2NoZWR1bGVUb2dnbGUoKVwiXHJcblx0PlxyXG5cdFx0PG1hdC1pY29uXHJcblx0XHRcdFtAYnV0dG9uSWNvbkFuaW1hdGlvbl09XCJfaWNvbiA/ICdkaXNhYmxlZCcgOiBidXR0b25JY29uU3RhdGVcIlxyXG5cdFx0XHQoQGJ1dHRvbkljb25BbmltYXRpb24uc3RhcnQpPVwiX2J1dHRvbkFuaW1hdGluZyA9IHRydWVcIlxyXG5cdFx0XHQoQGJ1dHRvbkljb25BbmltYXRpb24uZG9uZSk9XCJfYnV0dG9uQW5pbWF0aW5nID0gZmFsc2U7IF9jaGVja1RvZ2dsZSgpXCJcclxuXHRcdFx0W2J1aUljb25dPVwiX2ljb24gfHwgKGRpcmVjdGlvbiA9PT0gJ3J0bCcgPyAnY2hldnJvbl9yaWdodCcgOiAnY2hldnJvbl9sZWZ0JylcIlxyXG5cdFx0XHRzdHlsZT1cIm1hcmdpbjogMFwiXHJcblx0XHQ+XHJcblx0XHQ8L21hdC1pY29uPlxyXG5cdFx0PHNwYW4gW0BidXR0b25UZXh0QW5pbWF0aW9uXT1cImJ1dHRvblN0YXRlXCIgY2xhc3M9XCJidWktY2xpcC1ub3RlLWJ1dHRvbi10ZXh0XCI+Jm5ic3A7IHt7IGJ1dHRvblRleHQgfX08L3NwYW4+XHJcblx0PC9idXR0b24+XHJcbjwvZGl2PlxyXG5cclxuPG5nLXRlbXBsYXRlICNmYWxsYmFja1RlbXBsYXRlPlxyXG5cdDxkaXYgW2lubmVySFRNTF09XCJfY29udGVudFwiPjwvZGl2PlxyXG48L25nLXRlbXBsYXRlPlxyXG4iXX0=