@villedemontreal/angular-ui 18.0.0 → 19.0.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 (102) hide show
  1. package/fesm2022/villedemontreal-angular-ui.mjs +421 -372
  2. package/fesm2022/villedemontreal-angular-ui.mjs.map +1 -1
  3. package/lib/dropdown-menu/dropdown-menu.component.d.ts +16 -9
  4. package/lib/modal/modal-container.d.ts +1 -1
  5. package/lib/modal/modal.d.ts +1 -1
  6. package/package.json +5 -7
  7. package/esm2022/lib/alert/alert.component.mjs +0 -169
  8. package/esm2022/lib/alert/index.mjs +0 -8
  9. package/esm2022/lib/alert/module.mjs +0 -41
  10. package/esm2022/lib/avatar/avatar.component.mjs +0 -102
  11. package/esm2022/lib/avatar/index.mjs +0 -8
  12. package/esm2022/lib/avatar/module.mjs +0 -24
  13. package/esm2022/lib/badge/badge.component.mjs +0 -27
  14. package/esm2022/lib/badge/index.mjs +0 -8
  15. package/esm2022/lib/badge/module.mjs +0 -24
  16. package/esm2022/lib/bao.module.mjs +0 -124
  17. package/esm2022/lib/breadcrumb/breadcrumb.component.mjs +0 -36
  18. package/esm2022/lib/breadcrumb/index.mjs +0 -8
  19. package/esm2022/lib/breadcrumb/module.mjs +0 -25
  20. package/esm2022/lib/button/button.component.mjs +0 -100
  21. package/esm2022/lib/button/index.mjs +0 -8
  22. package/esm2022/lib/button/module.mjs +0 -25
  23. package/esm2022/lib/card/card.component.mjs +0 -94
  24. package/esm2022/lib/card/index.mjs +0 -8
  25. package/esm2022/lib/card/module.mjs +0 -38
  26. package/esm2022/lib/checkbox/checkbox-group.component.mjs +0 -58
  27. package/esm2022/lib/checkbox/checkbox.component.mjs +0 -304
  28. package/esm2022/lib/checkbox/index.mjs +0 -9
  29. package/esm2022/lib/checkbox/module.mjs +0 -35
  30. package/esm2022/lib/common-components/error-text/errorText.component.mjs +0 -16
  31. package/esm2022/lib/common-components/guiding-text/guidingText.component.mjs +0 -16
  32. package/esm2022/lib/common-components/index.mjs +0 -11
  33. package/esm2022/lib/common-components/label-text/labelText.component.mjs +0 -22
  34. package/esm2022/lib/common-components/module.mjs +0 -38
  35. package/esm2022/lib/common-components/title-text/titleText.component.mjs +0 -16
  36. package/esm2022/lib/core/breakpoints.mjs +0 -13
  37. package/esm2022/lib/core/colors.mjs +0 -25
  38. package/esm2022/lib/core/index.mjs +0 -8
  39. package/esm2022/lib/dropdown-menu/dropdown-menu.component.mjs +0 -573
  40. package/esm2022/lib/dropdown-menu/index.mjs +0 -8
  41. package/esm2022/lib/dropdown-menu/module.mjs +0 -47
  42. package/esm2022/lib/file/file-input.component.mjs +0 -320
  43. package/esm2022/lib/file/file-intl.mjs +0 -65
  44. package/esm2022/lib/file/file-preview.component.mjs +0 -96
  45. package/esm2022/lib/file/index.mjs +0 -10
  46. package/esm2022/lib/file/module.mjs +0 -56
  47. package/esm2022/lib/header-info/header-info.component.mjs +0 -104
  48. package/esm2022/lib/header-info/index.mjs +0 -8
  49. package/esm2022/lib/header-info/module.mjs +0 -41
  50. package/esm2022/lib/hyperlink/hyperlink.component.mjs +0 -84
  51. package/esm2022/lib/hyperlink/index.mjs +0 -8
  52. package/esm2022/lib/hyperlink/module.mjs +0 -24
  53. package/esm2022/lib/icon/bao-icon-registry.mjs +0 -47
  54. package/esm2022/lib/icon/icon.component.mjs +0 -158
  55. package/esm2022/lib/icon/icons-dictionary.mjs +0 -129
  56. package/esm2022/lib/icon/index.mjs +0 -8
  57. package/esm2022/lib/icon/module.mjs +0 -24
  58. package/esm2022/lib/list/index.mjs +0 -8
  59. package/esm2022/lib/list/list.component.mjs +0 -73
  60. package/esm2022/lib/list/module.mjs +0 -38
  61. package/esm2022/lib/message-bar/index.mjs +0 -8
  62. package/esm2022/lib/message-bar/message-bar.component.mjs +0 -87
  63. package/esm2022/lib/message-bar/module.mjs +0 -26
  64. package/esm2022/lib/modal/index.mjs +0 -12
  65. package/esm2022/lib/modal/modal-config.mjs +0 -73
  66. package/esm2022/lib/modal/modal-container.mjs +0 -240
  67. package/esm2022/lib/modal/modal-directives.mjs +0 -84
  68. package/esm2022/lib/modal/modal-ref.mjs +0 -226
  69. package/esm2022/lib/modal/modal.mjs +0 -344
  70. package/esm2022/lib/modal/module.mjs +0 -29
  71. package/esm2022/lib/pagination/index.mjs +0 -8
  72. package/esm2022/lib/pagination/module.mjs +0 -25
  73. package/esm2022/lib/pagination/pagination.component.mjs +0 -217
  74. package/esm2022/lib/radio/index.mjs +0 -9
  75. package/esm2022/lib/radio/module.mjs +0 -54
  76. package/esm2022/lib/radio/radio-group.component.mjs +0 -247
  77. package/esm2022/lib/radio/radio.component.mjs +0 -291
  78. package/esm2022/lib/shared/enum/display-mode.mjs +0 -2
  79. package/esm2022/lib/shared/index.mjs +0 -7
  80. package/esm2022/lib/snack-bar/index.mjs +0 -12
  81. package/esm2022/lib/snack-bar/module.mjs +0 -51
  82. package/esm2022/lib/snack-bar/simple-snack-bar.component.mjs +0 -92
  83. package/esm2022/lib/snack-bar/snack-bar-animations.mjs +0 -28
  84. package/esm2022/lib/snack-bar/snack-bar-config.mjs +0 -37
  85. package/esm2022/lib/snack-bar/snack-bar-container.mjs +0 -277
  86. package/esm2022/lib/snack-bar/snack-bar-ref.mjs +0 -75
  87. package/esm2022/lib/snack-bar/snack-bar.mjs +0 -251
  88. package/esm2022/lib/summary/index.mjs +0 -9
  89. package/esm2022/lib/summary/list-summary.component.mjs +0 -30
  90. package/esm2022/lib/summary/module.mjs +0 -37
  91. package/esm2022/lib/summary/summary.component.mjs +0 -93
  92. package/esm2022/lib/system-header/index.mjs +0 -8
  93. package/esm2022/lib/system-header/module.mjs +0 -33
  94. package/esm2022/lib/system-header/system-header.component.mjs +0 -130
  95. package/esm2022/lib/tabs/index.mjs +0 -8
  96. package/esm2022/lib/tabs/module.mjs +0 -35
  97. package/esm2022/lib/tabs/tabs.component.mjs +0 -295
  98. package/esm2022/lib/tag/index.mjs +0 -8
  99. package/esm2022/lib/tag/module.mjs +0 -24
  100. package/esm2022/lib/tag/tag.component.mjs +0 -75
  101. package/esm2022/public-api.mjs +0 -31
  102. package/esm2022/villedemontreal-angular-ui.mjs +0 -5
@@ -1,226 +0,0 @@
1
- import { ESCAPE, hasModifierKey } from '@angular/cdk/keycodes';
2
- import { GlobalPositionStrategy } from '@angular/cdk/overlay';
3
- import { filter, Subject, take } from 'rxjs';
4
- // Counter for unique modal ids.
5
- let uniqueId = 0;
6
- /**
7
- * Reference to a modal opened via the BaoModalService.
8
- */
9
- export class BaoModalRef {
10
- constructor(_overlayRef, _containerInstance,
11
- /** Id of the modal. */
12
- id = `bao-modal-${uniqueId++}`) {
13
- this._overlayRef = _overlayRef;
14
- this._containerInstance = _containerInstance;
15
- this.id = id;
16
- /** Whether the user is allowed to close the modal. */
17
- this.disableClose = this._containerInstance._config.disableClose;
18
- /** Subject for notifying the user that the modal has finished opening. */
19
- this._afterOpened = new Subject();
20
- /** Subject for notifying the user that the modal has finished closing. */
21
- this._afterClosed = new Subject();
22
- /** Subject for notifying the user that the modal has started closing. */
23
- this._beforeClosed = new Subject();
24
- /** Current state of the modal. */
25
- this._state = 0 /* BaoModalState.OPEN */;
26
- // Pass the id along to the container.
27
- _containerInstance._id = id;
28
- // Emit when opening animation completes
29
- _containerInstance._animationStateChanged
30
- .pipe(filter(event => event.state === 'opened'), take(1))
31
- .subscribe(() => {
32
- this._afterOpened.next();
33
- this._afterOpened.complete();
34
- });
35
- // Dispose overlay when closing animation is complete
36
- _containerInstance._animationStateChanged
37
- .pipe(filter(event => event.state === 'closed'), take(1))
38
- .subscribe(() => {
39
- clearTimeout(this._closeFallbackTimeout);
40
- this._finishModalClose();
41
- });
42
- _overlayRef.detachments().subscribe(() => {
43
- this._beforeClosed.next(this._result);
44
- this._beforeClosed.complete();
45
- this._afterClosed.next(this._result);
46
- this._afterClosed.complete();
47
- this.componentInstance = null;
48
- this._overlayRef.dispose();
49
- });
50
- _overlayRef
51
- .keydownEvents()
52
- .pipe(filter(event => {
53
- return (event.keyCode === ESCAPE &&
54
- !this.disableClose &&
55
- !hasModifierKey(event));
56
- }))
57
- .subscribe(event => {
58
- event.preventDefault();
59
- _closeModalVia(this, 'keyboard');
60
- });
61
- _overlayRef.backdropClick().subscribe(async () => {
62
- if (this.disableClose) {
63
- await this._containerInstance._recaptureFocus();
64
- }
65
- else {
66
- _closeModalVia(this, 'mouse');
67
- }
68
- });
69
- }
70
- /**
71
- * Close the modal.
72
- * @param modalResult Optional result to return to the modal opener.
73
- */
74
- close(modalResult) {
75
- this._result = modalResult;
76
- // Transition the backdrop in parallel to the modal.
77
- this._containerInstance._animationStateChanged
78
- .pipe(filter(event => event.state === 'closing'), take(1))
79
- .subscribe(event => {
80
- this._beforeClosed.next(modalResult);
81
- this._beforeClosed.complete();
82
- this._overlayRef.detachBackdrop();
83
- // The logic that disposes of the overlay depends on the exit animation completing, however
84
- // it isn't guaranteed if the parent view is destroyed while it's running. Add a fallback
85
- // timeout which will clean everything up if the animation hasn't fired within the specified
86
- // amount of time plus 100ms. We don't need to run this outside the NgZone, because for the
87
- // vast majority of cases the timeout will have been cleared before it has the chance to fire.
88
- this._closeFallbackTimeout = setTimeout(() => this._finishModalClose(), event.totalTime + 100);
89
- });
90
- this._state = 1 /* BaoModalState.CLOSING */;
91
- this._containerInstance._startExitAnimation();
92
- }
93
- startOpenAnimation() {
94
- this._containerInstance._startOpenAnimation();
95
- }
96
- /**
97
- * Gets an observable that is notified when the modal is finished opening.
98
- */
99
- afterOpened() {
100
- return this._afterOpened;
101
- }
102
- /**
103
- * Gets an observable that is notified when the modal is finished closing.
104
- */
105
- afterClosed() {
106
- return this._afterClosed;
107
- }
108
- /**
109
- * Gets an observable that is notified when the modal has started closing.
110
- */
111
- beforeClosed() {
112
- return this._beforeClosed;
113
- }
114
- /**
115
- * Gets an observable that emits when the overlay's backdrop has been clicked.
116
- */
117
- backdropClick() {
118
- return this._overlayRef.backdropClick();
119
- }
120
- /**
121
- * Gets an observable that emits when keydown events are targeted on the overlay.
122
- */
123
- keydownEvents() {
124
- return this._overlayRef.keydownEvents();
125
- }
126
- /**
127
- * Updates the dialog's position.
128
- */
129
- updatePosition(position) {
130
- const strategy = this._getPositionStrategy();
131
- // Only apply custom position for GlobalPositionStrategy
132
- if (strategy instanceof GlobalPositionStrategy) {
133
- if (position && (position.left || position.right)) {
134
- this.applyPositionStrategy(position, strategy, 'horizontal');
135
- }
136
- else {
137
- strategy.centerHorizontally();
138
- }
139
- if (position && (position.top || position.bottom)) {
140
- this.applyPositionStrategy(position, strategy, 'vertical');
141
- }
142
- else {
143
- strategy.centerVertically();
144
- }
145
- }
146
- this._overlayRef.updatePosition();
147
- return this;
148
- }
149
- /**
150
- * Updates the modal's width and height.
151
- */
152
- updateSize(width = '', height = '') {
153
- this._overlayRef.updateSize({ width, height });
154
- this._overlayRef.updatePosition();
155
- return this;
156
- }
157
- /** Add a CSS class or an array of classes to the overlay pane. */
158
- addPanelClass(classes) {
159
- this._overlayRef.addPanelClass(classes);
160
- return this;
161
- }
162
- /** Remove a CSS class or an array of classes from the overlay pane. */
163
- removePanelClass(classes) {
164
- this._overlayRef.removePanelClass(classes);
165
- return this;
166
- }
167
- /** Gets the current state of the modal's lifecycle. */
168
- getState() {
169
- return this._state;
170
- }
171
- /**
172
- * Finishes the modal close by updating the state of the modal
173
- * and disposing the overlay.
174
- */
175
- _finishModalClose() {
176
- this._state = 2 /* BaoModalState.CLOSED */;
177
- this._overlayRef.dispose();
178
- }
179
- /** Fetches the position strategy object from the overlay ref. */
180
- _getPositionStrategy() {
181
- return this._overlayRef.getConfig().positionStrategy;
182
- }
183
- /**
184
- * Applies the position strategy to the overlay.
185
- *
186
- * This method sets the position of the modal based on the provided `position` configuration.
187
- * It determines whether to apply the position to the vertical or horizontal axis based on the
188
- * `axis` parameter.
189
- *
190
- * @param position The position configuration for the modal.
191
- * @param strategy The position strategy to be applied.
192
- * @param axis The axis to apply the position (`'horizontal' | 'vertical'`)
193
- */
194
- applyPositionStrategy(position, strategy, axis) {
195
- if (axis === 'vertical') {
196
- if (position.top) {
197
- strategy.top(position.top);
198
- }
199
- else {
200
- strategy.bottom(position.bottom);
201
- }
202
- }
203
- else {
204
- if (position.left) {
205
- strategy.left(position.left);
206
- }
207
- else {
208
- strategy.right(position.right);
209
- }
210
- }
211
- }
212
- }
213
- /**
214
- * Closes the modal with the specified interaction type. This is currently not part of
215
- * `BaoModalRef` as that would conflict with custom modal ref mocks provided in tests.
216
- * More details. See: https://github.com/angular/components/pull/9257#issuecomment-651342226.
217
- */
218
- export function _closeModalVia(ref, interactionType, result) {
219
- // Some mock modal ref instances in tests do not have the `_containerInstance` property.
220
- // For those, we keep the behavior as is and do not deal with the interaction type.
221
- if (ref._containerInstance !== undefined) {
222
- ref._containerInstance._closeInteractionType = interactionType;
223
- }
224
- return ref.close(result);
225
- }
226
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYWwtcmVmLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci11aS9zcmMvbGliL21vZGFsL21vZGFsLXJlZi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFNQSxPQUFPLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQy9ELE9BQU8sRUFFTCxzQkFBc0IsRUFFdkIsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQUUsTUFBTSxFQUFjLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFJekQsZ0NBQWdDO0FBQ2hDLElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQztBQVNqQjs7R0FFRztBQUNILE1BQU0sT0FBTyxXQUFXO0lBMEJ0QixZQUNVLFdBQXVCLEVBQ3hCLGtCQUEwQztJQUNqRCx1QkFBdUI7SUFDZCxLQUFLLGFBQWEsUUFBUSxFQUFFLEVBQUU7UUFIL0IsZ0JBQVcsR0FBWCxXQUFXLENBQVk7UUFDeEIsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUF3QjtRQUV4QyxPQUFFLEdBQUYsRUFBRSxDQUE0QjtRQTFCekMsc0RBQXNEO1FBQy9DLGlCQUFZLEdBQ2pCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDO1FBRS9DLDBFQUEwRTtRQUN6RCxpQkFBWSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFFcEQsMEVBQTBFO1FBQ3pELGlCQUFZLEdBQUcsSUFBSSxPQUFPLEVBQWlCLENBQUM7UUFFN0QseUVBQXlFO1FBQ3hELGtCQUFhLEdBQUcsSUFBSSxPQUFPLEVBQWlCLENBQUM7UUFROUQsa0NBQWtDO1FBQzFCLFdBQU0sOEJBQXNCO1FBUWxDLHNDQUFzQztRQUN0QyxrQkFBa0IsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBRTVCLHdDQUF3QztRQUN4QyxrQkFBa0IsQ0FBQyxzQkFBc0I7YUFDdEMsSUFB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ZSxDQUFDO0lBQ2pFLENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDM0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjYgVmlsbGUgZGUgTW9udHJlYWwuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4gKiBTZWUgTElDRU5TRSBmaWxlIGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqL1xuaW1wb3J0IHsgRm9jdXNPcmlnaW4gfSBmcm9tICdAYW5ndWxhci9jZGsvYTExeSc7XG5pbXBvcnQgeyBFU0NBUEUsIGhhc01vZGlmaWVyS2V5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2tleWNvZGVzJztcbmltcG9ydCB7XG4gIEZsZXhpYmxlQ29ubmVjdGVkUG9zaXRpb25TdHJhdGVneSxcbiAgR2xvYmFsUG9zaXRpb25TdHJhdGVneSxcbiAgT3ZlcmxheVJlZlxufSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQgeyBmaWx0ZXIsIE9ic2VydmFibGUsIFN1YmplY3QsIHRha2UgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE1vZGFsUG9zaXRpb24gfSBmcm9tICcuL21vZGFsLWNvbmZpZyc7XG5pbXBvcnQgeyBfQmFvTW9kYWxDb250YWluZXJCYXNlIH0gZnJvbSAnLi9tb2RhbC1jb250YWluZXInO1xuXG4vLyBDb3VudGVyIGZvciB1bmlxdWUgbW9kYWwgaWRzLlxubGV0IHVuaXF1ZUlkID0gMDtcblxuLyoqIFBvc3NpYmxlIHN0YXRlcyBvZiB0aGUgbGlmZWN5Y2xlIG9mIGEgbW9kYWwuICovXG5leHBvcnQgY29uc3QgZW51bSBCYW9Nb2RhbFN0YXRlIHtcbiAgT1BFTixcbiAgQ0xPU0lORyxcbiAgQ0xPU0VEXG59XG5cbi8qKlxuICogUmVmZXJlbmNlIHRvIGEgbW9kYWwgb3BlbmVkIHZpYSB0aGUgQmFvTW9kYWxTZXJ2aWNlLlxuICovXG5leHBvcnQgY2xhc3MgQmFvTW9kYWxSZWY8VCwgUiA9IHVua25vd24+IHtcbiAgLyoqIFRoZSBpbnN0YW5jZSBvZiBjb21wb25lbnQgb3BlbmVkIGludG8gdGhlIG1vZGFsLiAqL1xuICBwdWJsaWMgY29tcG9uZW50SW5zdGFuY2U6IFQ7XG5cbiAgLyoqIFdoZXRoZXIgdGhlIHVzZXIgaXMgYWxsb3dlZCB0byBjbG9zZSB0aGUgbW9kYWwuICovXG4gIHB1YmxpYyBkaXNhYmxlQ2xvc2U6IGJvb2xlYW4gfCB1bmRlZmluZWQgPVxuICAgIHRoaXMuX2NvbnRhaW5lckluc3RhbmNlLl9jb25maWcuZGlzYWJsZUNsb3NlO1xuXG4gIC8qKiBTdWJqZWN0IGZvciBub3RpZnlpbmcgdGhlIHVzZXIgdGhhdCB0aGUgbW9kYWwgaGFzIGZpbmlzaGVkIG9wZW5pbmcuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX2FmdGVyT3BlbmVkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAvKiogU3ViamVjdCBmb3Igbm90aWZ5aW5nIHRoZSB1c2VyIHRoYXQgdGhlIG1vZGFsIGhhcyBmaW5pc2hlZCBjbG9zaW5nLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9hZnRlckNsb3NlZCA9IG5ldyBTdWJqZWN0PFIgfCB1bmRlZmluZWQ+KCk7XG5cbiAgLyoqIFN1YmplY3QgZm9yIG5vdGlmeWluZyB0aGUgdXNlciB0aGF0IHRoZSBtb2RhbCBoYXMgc3RhcnRlZCBjbG9zaW5nLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9iZWZvcmVDbG9zZWQgPSBuZXcgU3ViamVjdDxSIHwgdW5kZWZpbmVkPigpO1xuXG4gIC8qKiBSZXN1bHQgdG8gYmUgcGFzc2VkIHRvIGFmdGVyQ2xvc2VkLiAqL1xuICBwcml2YXRlIF9yZXN1bHQ6IFIgfCB1bmRlZmluZWQ7XG5cbiAgLyoqIEhhbmRsZSB0byB0aGUgdGltZW91dCB0aGF0J3MgcnVubmluZyBhcyBhIGZhbGxiYWNrIGluIGNhc2UgdGhlIGV4aXQgYW5pbWF0aW9uIGRvZXNuJ3QgZmlyZS4gKi9cbiAgcHJpdmF0ZSBfY2xvc2VGYWxsYmFja1RpbWVvdXQ6IGFueTtcblxuICAvKiogQ3VycmVudCBzdGF0ZSBvZiB0aGUgbW9kYWwuICovXG4gIHByaXZhdGUgX3N0YXRlID0gQmFvTW9kYWxTdGF0ZS5PUEVOO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX292ZXJsYXlSZWY6IE92ZXJsYXlSZWYsXG4gICAgcHVibGljIF9jb250YWluZXJJbnN0YW5jZTogX0Jhb01vZGFsQ29udGFpbmVyQmFzZSxcbiAgICAvKiogSWQgb2YgdGhlIG1vZGFsLiAqL1xuICAgIHJlYWRvbmx5IGlkID0gYGJhby1tb2RhbC0ke3VuaXF1ZUlkKyt9YFxuICApIHtcbiAgICAvLyBQYXNzIHRoZSBpZCBhbG9uZyB0byB0aGUgY29udGFpbmVyLlxuICAgIF9jb250YWluZXJJbnN0YW5jZS5faWQgPSBpZDtcblxuICAgIC8vIEVtaXQgd2hlbiBvcGVuaW5nIGFuaW1hdGlvbiBjb21wbGV0ZXNcbiAgICBfY29udGFpbmVySW5zdGFuY2UuX2FuaW1hdGlvblN0YXRlQ2hhbmdlZFxuICAgICAgLnBpcGUoXG4gICAgICAgIGZpbHRlcihldmVudCA9PiBldmVudC5zdGF0ZSA9PT0gJ29wZW5lZCcpLFxuICAgICAgICB0YWtlKDEpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5fYWZ0ZXJPcGVuZWQubmV4dCgpO1xuICAgICAgICB0aGlzLl9hZnRlck9wZW5lZC5jb21wbGV0ZSgpO1xuICAgICAgfSk7XG5cbiAgICAvLyBEaXNwb3NlIG92ZXJsYXkgd2hlbiBjbG9zaW5nIGFuaW1hdGlvbiBpcyBjb21wbGV0ZVxuICAgIF9jb250YWluZXJJbnN0YW5jZS5fYW5pbWF0aW9uU3RhdGVDaGFuZ2VkXG4gICAgICAucGlwZShcbiAgICAgICAgZmlsdGVyKGV2ZW50ID0+IGV2ZW50LnN0YXRlID09PSAnY2xvc2VkJyksXG4gICAgICAgIHRha2UoMSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fY2xvc2VGYWxsYmFja1RpbWVvdXQpO1xuICAgICAgICB0aGlzLl9maW5pc2hNb2RhbENsb3NlKCk7XG4gICAgICB9KTtcblxuICAgIF9vdmVybGF5UmVmLmRldGFjaG1lbnRzKCkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuX2JlZm9yZUNsb3NlZC5uZXh0KHRoaXMuX3Jlc3VsdCk7XG4gICAgICB0aGlzLl9iZWZvcmVDbG9zZWQuY29tcGxldGUoKTtcbiAgICAgIHRoaXMuX2FmdGVyQ2xvc2VkLm5leHQodGhpcy5fcmVzdWx0KTtcbiAgICAgIHRoaXMuX2FmdGVyQ2xvc2VkLmNvbXBsZXRlKCk7XG4gICAgICB0aGlzLmNvbXBvbmVudEluc3RhbmNlID0gbnVsbDtcbiAgICAgIHRoaXMuX292ZXJsYXlSZWYuZGlzcG9zZSgpO1xuICAgIH0pO1xuXG4gICAgX292ZXJsYXlSZWZcbiAgICAgIC5rZXlkb3duRXZlbnRzKClcbiAgICAgIC5waXBlKFxuICAgICAgICBmaWx0ZXIoZXZlbnQgPT4ge1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBldmVudC5rZXlDb2RlID09PSBFU0NBUEUgJiZcbiAgICAgICAgICAgICF0aGlzLmRpc2FibGVDbG9zZSAmJlxuICAgICAgICAgICAgIWhhc01vZGlmaWVyS2V5KGV2ZW50KVxuICAgICAgICAgICk7XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKGV2ZW50ID0+IHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgX2Nsb3NlTW9kYWxWaWEodGhpcywgJ2tleWJvYXJkJyk7XG4gICAgICB9KTtcblxuICAgIF9vdmVybGF5UmVmLmJhY2tkcm9wQ2xpY2soKS5zdWJzY3JpYmUoYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuZGlzYWJsZUNsb3NlKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuX2NvbnRhaW5lckluc3RhbmNlLl9yZWNhcHR1cmVGb2N1cygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX2Nsb3NlTW9kYWxWaWEodGhpcywgJ21vdXNlJyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2UgdGhlIG1vZGFsLlxuICAgKiBAcGFyYW0gbW9kYWxSZXN1bHQgT3B0aW9uYWwgcmVzdWx0IHRvIHJldHVybiB0byB0aGUgbW9kYWwgb3BlbmVyLlxuICAgKi9cbiAgcHVibGljIGNsb3NlKG1vZGFsUmVzdWx0PzogUik6IHZvaWQge1xuICAgIHRoaXMuX3Jlc3VsdCA9IG1vZGFsUmVzdWx0O1xuXG4gICAgLy8gVHJhbnNpdGlvbiB0aGUgYmFja2Ryb3AgaW4gcGFyYWxsZWwgdG8gdGhlIG1vZGFsLlxuICAgIHRoaXMuX2NvbnRhaW5lckluc3RhbmNlLl9hbmltYXRpb25TdGF0ZUNoYW5nZWRcbiAgICAgIC5waXBlKFxuICAgICAgICBmaWx0ZXIoZXZlbnQgPT4gZXZlbnQuc3RhdGUgPT09ICdjbG9zaW5nJyksXG4gICAgICAgIHRha2UoMSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoZXZlbnQgPT4ge1xuICAgICAgICB0aGlzLl9iZWZvcmVDbG9zZWQubmV4dChtb2RhbFJlc3VsdCk7XG4gICAgICAgIHRoaXMuX2JlZm9yZUNsb3NlZC5jb21wbGV0ZSgpO1xuICAgICAgICB0aGlzLl9vdmVybGF5UmVmLmRldGFjaEJhY2tkcm9wKCk7XG4gICAgICAgIC8vIFRoZSBsb2dpYyB0aGF0IGRpc3Bvc2VzIG9mIHRoZSBvdmVybGF5IGRlcGVuZHMgb24gdGhlIGV4aXQgYW5pbWF0aW9uIGNvbXBsZXRpbmcsIGhvd2V2ZXJcbiAgICAgICAgLy8gaXQgaXNuJ3QgZ3VhcmFudGVlZCBpZiB0aGUgcGFyZW50IHZpZXcgaXMgZGVzdHJveWVkIHdoaWxlIGl0J3MgcnVubmluZy4gQWRkIGEgZmFsbGJhY2tcbiAgICAgICAgLy8gdGltZW91dCB3aGljaCB3aWxsIGNsZWFuIGV2ZXJ5dGhpbmcgdXAgaWYgdGhlIGFuaW1hdGlvbiBoYXNuJ3QgZmlyZWQgd2l0aGluIHRoZSBzcGVjaWZpZWRcbiAgICAgICAgLy8gYW1vdW50IG9mIHRpbWUgcGx1cyAxMDBtcy4gV2UgZG9uJ3QgbmVlZCB0byBydW4gdGhpcyBvdXRzaWRlIHRoZSBOZ1pvbmUsIGJlY2F1c2UgZm9yIHRoZVxuICAgICAgICAvLyB2YXN0IG1ham9yaXR5IG9mIGNhc2VzIHRoZSB0aW1lb3V0IHdpbGwgaGF2ZSBiZWVuIGNsZWFyZWQgYmVmb3JlIGl0IGhhcyB0aGUgY2hhbmNlIHRvIGZpcmUuXG4gICAgICAgIHRoaXMuX2Nsb3NlRmFsbGJhY2tUaW1lb3V0ID0gc2V0VGltZW91dChcbiAgICAgICAgICAoKSA9PiB0aGlzLl9maW5pc2hNb2RhbENsb3NlKCksXG4gICAgICAgICAgZXZlbnQudG90YWxUaW1lICsgMTAwXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgIHRoaXMuX3N0YXRlID0gQmFvTW9kYWxTdGF0ZS5DTE9TSU5HO1xuICAgIHRoaXMuX2NvbnRhaW5lckluc3RhbmNlLl9zdGFydEV4aXRBbmltYXRpb24oKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGFydE9wZW5BbmltYXRpb24oKTogdm9pZCB7XG4gICAgdGhpcy5fY29udGFpbmVySW5zdGFuY2UuX3N0YXJ0T3BlbkFuaW1hdGlvbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYW4gb2JzZXJ2YWJsZSB0aGF0IGlzIG5vdGlmaWVkIHdoZW4gdGhlIG1vZGFsIGlzIGZpbmlzaGVkIG9wZW5pbmcuXG4gICAqL1xuICBwdWJsaWMgYWZ0ZXJPcGVuZWQoKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FmdGVyT3BlbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYW4gb2JzZXJ2YWJsZSB0aGF0IGlzIG5vdGlmaWVkIHdoZW4gdGhlIG1vZGFsIGlzIGZpbmlzaGVkIGNsb3NpbmcuXG4gICAqL1xuICBwdWJsaWMgYWZ0ZXJDbG9zZWQoKTogT2JzZXJ2YWJsZTxSIHwgdW5kZWZpbmVkPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FmdGVyQ2xvc2VkO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYW4gb2JzZXJ2YWJsZSB0aGF0IGlzIG5vdGlmaWVkIHdoZW4gdGhlIG1vZGFsIGhhcyBzdGFydGVkIGNsb3NpbmcuXG4gICAqL1xuICBwdWJsaWMgYmVmb3JlQ2xvc2VkKCk6IE9ic2VydmFibGU8UiB8IHVuZGVmaW5lZD4ge1xuICAgIHJldHVybiB0aGlzLl9iZWZvcmVDbG9zZWQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhbiBvYnNlcnZhYmxlIHRoYXQgZW1pdHMgd2hlbiB0aGUgb3ZlcmxheSdzIGJhY2tkcm9wIGhhcyBiZWVuIGNsaWNrZWQuXG4gICAqL1xuICBwdWJsaWMgYmFja2Ryb3BDbGljaygpOiBPYnNlcnZhYmxlPE1vdXNlRXZlbnQ+IHtcbiAgICByZXR1cm4gdGhpcy5fb3ZlcmxheVJlZi5iYWNrZHJvcENsaWNrKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhbiBvYnNlcnZhYmxlIHRoYXQgZW1pdHMgd2hlbiBrZXlkb3duIGV2ZW50cyBhcmUgdGFyZ2V0ZWQgb24gdGhlIG92ZXJsYXkuXG4gICAqL1xuICBwdWJsaWMga2V5ZG93bkV2ZW50cygpOiBPYnNlcnZhYmxlPEtleWJvYXJkRXZlbnQ+IHtcbiAgICByZXR1cm4gdGhpcy5fb3ZlcmxheVJlZi5rZXlkb3duRXZlbnRzKCk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgZGlhbG9nJ3MgcG9zaXRpb24uXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlUG9zaXRpb24ocG9zaXRpb24/OiBNb2RhbFBvc2l0aW9uKTogdGhpcyB7XG4gICAgY29uc3Qgc3RyYXRlZ3kgPSB0aGlzLl9nZXRQb3NpdGlvblN0cmF0ZWd5KCk7XG5cbiAgICAvLyBPbmx5IGFwcGx5IGN1c3RvbSBwb3NpdGlvbiBmb3IgR2xvYmFsUG9zaXRpb25TdHJhdGVneVxuICAgIGlmIChzdHJhdGVneSBpbnN0YW5jZW9mIEdsb2JhbFBvc2l0aW9uU3RyYXRlZ3kpIHtcbiAgICAgIGlmIChwb3NpdGlvbiAmJiAocG9zaXRpb24ubGVmdCB8fCBwb3NpdGlvbi5yaWdodCkpIHtcbiAgICAgICAgdGhpcy5hcHBseVBvc2l0aW9uU3RyYXRlZ3kocG9zaXRpb24sIHN0cmF0ZWd5LCAnaG9yaXpvbnRhbCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RyYXRlZ3kuY2VudGVySG9yaXpvbnRhbGx5KCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChwb3NpdGlvbiAmJiAocG9zaXRpb24udG9wIHx8IHBvc2l0aW9uLmJvdHRvbSkpIHtcbiAgICAgICAgdGhpcy5hcHBseVBvc2l0aW9uU3RyYXRlZ3kocG9zaXRpb24sIHN0cmF0ZWd5LCAndmVydGljYWwnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0cmF0ZWd5LmNlbnRlclZlcnRpY2FsbHkoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl9vdmVybGF5UmVmLnVwZGF0ZVBvc2l0aW9uKCk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSBtb2RhbCdzIHdpZHRoIGFuZCBoZWlnaHQuXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlU2l6ZSh3aWR0aCA9ICcnLCBoZWlnaHQgPSAnJyk6IHRoaXMge1xuICAgIHRoaXMuX292ZXJsYXlSZWYudXBkYXRlU2l6ZSh7IHdpZHRoLCBoZWlnaHQgfSk7XG4gICAgdGhpcy5fb3ZlcmxheVJlZi51cGRhdGVQb3NpdGlvbigpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqIEFkZCBhIENTUyBjbGFzcyBvciBhbiBhcnJheSBvZiBjbGFzc2VzIHRvIHRoZSBvdmVybGF5IHBhbmUuICovXG4gIHB1YmxpYyBhZGRQYW5lbENsYXNzKGNsYXNzZXM6IHN0cmluZyB8IHN0cmluZ1tdKTogdGhpcyB7XG4gICAgdGhpcy5fb3ZlcmxheVJlZi5hZGRQYW5lbENsYXNzKGNsYXNzZXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqIFJlbW92ZSBhIENTUyBjbGFzcyBvciBhbiBhcnJheSBvZiBjbGFzc2VzIGZyb20gdGhlIG92ZXJsYXkgcGFuZS4gKi9cbiAgcHVibGljIHJlbW92ZVBhbmVsQ2xhc3MoY2xhc3Nlczogc3RyaW5nIHwgc3RyaW5nW10pOiB0aGlzIHtcbiAgICB0aGlzLl9vdmVybGF5UmVmLnJlbW92ZVBhbmVsQ2xhc3MoY2xhc3Nlcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKiogR2V0cyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgbW9kYWwncyBsaWZlY3ljbGUuICovXG4gIHB1YmxpYyBnZXRTdGF0ZSgpOiBCYW9Nb2RhbFN0YXRlIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGU7XG4gIH1cblxuICAvKipcbiAgICogRmluaXNoZXMgdGhlIG1vZGFsIGNsb3NlIGJ5IHVwZGF0aW5nIHRoZSBzdGF0ZSBvZiB0aGUgbW9kYWxcbiAgICogYW5kIGRpc3Bvc2luZyB0aGUgb3ZlcmxheS5cbiAgICovXG4gIHByaXZhdGUgX2ZpbmlzaE1vZGFsQ2xvc2UoKSB7XG4gICAgdGhpcy5fc3RhdGUgPSBCYW9Nb2RhbFN0YXRlLkNMT1NFRDtcbiAgICB0aGlzLl9vdmVybGF5UmVmLmRpc3Bvc2UoKTtcbiAgfVxuXG4gIC8qKiBGZXRjaGVzIHRoZSBwb3NpdGlvbiBzdHJhdGVneSBvYmplY3QgZnJvbSB0aGUgb3ZlcmxheSByZWYuICovXG4gIHByaXZhdGUgX2dldFBvc2l0aW9uU3RyYXRlZ3koKTpcbiAgICB8IEdsb2JhbFBvc2l0aW9uU3RyYXRlZ3lcbiAgICB8IEZsZXhpYmxlQ29ubmVjdGVkUG9zaXRpb25TdHJhdGVneSB7XG4gICAgcmV0dXJuIHRoaXMuX292ZXJsYXlSZWYuZ2V0Q29uZmlnKCkucG9zaXRpb25TdHJhdGVneSBhc1xuICAgICAgfCBHbG9iYWxQb3NpdGlvblN0cmF0ZWd5XG4gICAgICB8IEZsZXhpYmxlQ29ubmVjdGVkUG9zaXRpb25TdHJhdGVneTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBsaWVzIHRoZSBwb3NpdGlvbiBzdHJhdGVneSB0byB0aGUgb3ZlcmxheS5cbiAgICpcbiAgICogVGhpcyBtZXRob2Qgc2V0cyB0aGUgcG9zaXRpb24gb2YgdGhlIG1vZGFsIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBgcG9zaXRpb25gIGNvbmZpZ3VyYXRpb24uXG4gICAqIEl0IGRldGVybWluZXMgd2hldGhlciB0byBhcHBseSB0aGUgcG9zaXRpb24gdG8gdGhlIHZlcnRpY2FsIG9yIGhvcml6b250YWwgYXhpcyBiYXNlZCBvbiB0aGVcbiAgICogYGF4aXNgIHBhcmFtZXRlci5cbiAgICpcbiAgICogQHBhcmFtIHBvc2l0aW9uIFRoZSBwb3NpdGlvbiBjb25maWd1cmF0aW9uIGZvciB0aGUgbW9kYWwuXG4gICAqIEBwYXJhbSBzdHJhdGVneSBUaGUgcG9zaXRpb24gc3RyYXRlZ3kgdG8gYmUgYXBwbGllZC5cbiAgICogQHBhcmFtIGF4aXMgVGhlIGF4aXMgdG8gYXBwbHkgdGhlIHBvc2l0aW9uIChgJ2hvcml6b250YWwnIHwgJ3ZlcnRpY2FsJ2ApXG4gICAqL1xuICBwcml2YXRlIGFwcGx5UG9zaXRpb25TdHJhdGVneShcbiAgICBwb3NpdGlvbjogTW9kYWxQb3NpdGlvbixcbiAgICBzdHJhdGVneTogR2xvYmFsUG9zaXRpb25TdHJhdGVneSxcbiAgICBheGlzOiAnaG9yaXpvbnRhbCcgfCAndmVydGljYWwnXG4gICk6IHZvaWQge1xuICAgIGlmIChheGlzID09PSAndmVydGljYWwnKSB7XG4gICAgICBpZiAocG9zaXRpb24udG9wKSB7XG4gICAgICAgIHN0cmF0ZWd5LnRvcChwb3NpdGlvbi50b3ApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RyYXRlZ3kuYm90dG9tKHBvc2l0aW9uLmJvdHRvbSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChwb3NpdGlvbi5sZWZ0KSB7XG4gICAgICAgIHN0cmF0ZWd5LmxlZnQocG9zaXRpb24ubGVmdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdHJhdGVneS5yaWdodChwb3NpdGlvbi5yaWdodCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQ2xvc2VzIHRoZSBtb2RhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZXJhY3Rpb24gdHlwZS4gVGhpcyBpcyBjdXJyZW50bHkgbm90IHBhcnQgb2ZcbiAqIGBCYW9Nb2RhbFJlZmAgYXMgdGhhdCB3b3VsZCBjb25mbGljdCB3aXRoIGN1c3RvbSBtb2RhbCByZWYgbW9ja3MgcHJvdmlkZWQgaW4gdGVzdHMuXG4gKiBNb3JlIGRldGFpbHMuIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvY29tcG9uZW50cy9wdWxsLzkyNTcjaXNzdWVjb21tZW50LTY1MTM0MjIyNi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9jbG9zZU1vZGFsVmlhPFI+KFxuICByZWY6IEJhb01vZGFsUmVmPFI+LFxuICBpbnRlcmFjdGlvblR5cGU6IEZvY3VzT3JpZ2luLFxuICByZXN1bHQ/OiBSXG4pIHtcbiAgLy8gU29tZSBtb2NrIG1vZGFsIHJlZiBpbnN0YW5jZXMgaW4gdGVzdHMgZG8gbm90IGhhdmUgdGhlIGBfY29udGFpbmVySW5zdGFuY2VgIHByb3BlcnR5LlxuICAvLyBGb3IgdGhvc2UsIHdlIGtlZXAgdGhlIGJlaGF2aW9yIGFzIGlzIGFuZCBkbyBub3QgZGVhbCB3aXRoIHRoZSBpbnRlcmFjdGlvbiB0eXBlLlxuICBpZiAocmVmLl9jb250YWluZXJJbnN0YW5jZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmVmLl9jb250YWluZXJJbnN0YW5jZS5fY2xvc2VJbnRlcmFjdGlvblR5cGUgPSBpbnRlcmFjdGlvblR5cGU7XG4gIH1cbiAgcmV0dXJuIHJlZi5jbG9zZShyZXN1bHQpO1xufVxuIl19