@skyux/modals 11.21.0 → 11.23.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 (50) hide show
  1. package/documentation.json +492 -417
  2. package/esm2022/lib/modules/shared/sky-modals-resources.module.mjs +3 -21
  3. package/esm2022/testing/legacy/modal-fixture.mjs +143 -0
  4. package/esm2022/testing/modules/confirm/confirm-button-harness-filters.mjs +2 -0
  5. package/esm2022/testing/modules/confirm/confirm-button-harness.mjs +52 -0
  6. package/esm2022/testing/modules/confirm/confirm-harness.mjs +90 -0
  7. package/esm2022/testing/modules/confirm/confirm-testing.controller.mjs +7 -0
  8. package/esm2022/testing/{confirm → modules/confirm}/confirm-testing.module.mjs +1 -1
  9. package/esm2022/testing/modules/confirm/confirm-testing.service.mjs +101 -0
  10. package/esm2022/testing/modules/confirm/provide-confirm-testing.mjs +20 -0
  11. package/esm2022/testing/modules/modal/controller/modal-testing.controller.mjs +8 -0
  12. package/esm2022/testing/{modal → modules/modal}/controller/modal-testing.module.mjs +1 -1
  13. package/esm2022/testing/modules/modal/controller/modal-testing.service.mjs +60 -0
  14. package/esm2022/testing/modules/modal/controller/provide-modal-testing.mjs +20 -0
  15. package/esm2022/testing/modules/modal/modal-harness-filters.mjs +2 -0
  16. package/esm2022/testing/modules/modal/modal-harness.mjs +110 -0
  17. package/esm2022/testing/public-api.mjs +9 -9
  18. package/fesm2022/skyux-modals-testing.mjs +22 -16
  19. package/fesm2022/skyux-modals-testing.mjs.map +1 -1
  20. package/fesm2022/skyux-modals.mjs +2 -20
  21. package/fesm2022/skyux-modals.mjs.map +1 -1
  22. package/lib/modules/shared/sky-modals-resources.module.d.ts +0 -4
  23. package/package.json +7 -7
  24. package/testing/public-api.d.ts +10 -10
  25. package/esm2022/testing/confirm/confirm-button-harness-filters.mjs +0 -2
  26. package/esm2022/testing/confirm/confirm-button-harness.mjs +0 -46
  27. package/esm2022/testing/confirm/confirm-harness.mjs +0 -90
  28. package/esm2022/testing/confirm/confirm-testing.controller.mjs +0 -7
  29. package/esm2022/testing/confirm/confirm-testing.service.mjs +0 -101
  30. package/esm2022/testing/confirm/provide-confirm-testing.mjs +0 -20
  31. package/esm2022/testing/modal/controller/modal-testing.controller.mjs +0 -8
  32. package/esm2022/testing/modal/controller/modal-testing.service.mjs +0 -60
  33. package/esm2022/testing/modal/controller/provide-modal-testing.mjs +0 -20
  34. package/esm2022/testing/modal/modal-harness-filters.mjs +0 -2
  35. package/esm2022/testing/modal/modal-harness.mjs +0 -110
  36. package/esm2022/testing/modal-fixture.mjs +0 -143
  37. /package/testing/{modal-fixture.d.ts → legacy/modal-fixture.d.ts} +0 -0
  38. /package/testing/{confirm → modules/confirm}/confirm-button-harness-filters.d.ts +0 -0
  39. /package/testing/{confirm → modules/confirm}/confirm-button-harness.d.ts +0 -0
  40. /package/testing/{confirm → modules/confirm}/confirm-harness.d.ts +0 -0
  41. /package/testing/{confirm → modules/confirm}/confirm-testing.controller.d.ts +0 -0
  42. /package/testing/{confirm → modules/confirm}/confirm-testing.module.d.ts +0 -0
  43. /package/testing/{confirm → modules/confirm}/confirm-testing.service.d.ts +0 -0
  44. /package/testing/{confirm → modules/confirm}/provide-confirm-testing.d.ts +0 -0
  45. /package/testing/{modal → modules/modal}/controller/modal-testing.controller.d.ts +0 -0
  46. /package/testing/{modal → modules/modal}/controller/modal-testing.module.d.ts +0 -0
  47. /package/testing/{modal → modules/modal}/controller/modal-testing.service.d.ts +0 -0
  48. /package/testing/{modal → modules/modal}/controller/provide-modal-testing.d.ts +0 -0
  49. /package/testing/{modal → modules/modal}/modal-harness-filters.d.ts +0 -0
  50. /package/testing/{modal → modules/modal}/modal-harness.d.ts +0 -0
@@ -1,143 +0,0 @@
1
- /**
2
- * Allows interaction with a SKY UX modal component.
3
- * @internal
4
- */
5
- export class SkyModalFixture {
6
- #modalElement;
7
- #fixture;
8
- constructor(fixture, skyTestId) {
9
- this.#fixture = fixture;
10
- const modalElement = document.querySelector('sky-modal[data-sky-id="' + skyTestId + '"]');
11
- if (!modalElement) {
12
- throw new Error(`No element was found with a \`data-sky-id\` value of "${skyTestId}".`);
13
- }
14
- this.#modalElement = modalElement;
15
- }
16
- /**
17
- * The modal component's ARIA describedby attribute.
18
- */
19
- get ariaDescribedBy() {
20
- const modalDialogElement = this.#getModalDialogElement();
21
- /* Non-null assertion as our component has a default for if the user does not provide this attribute or if they provide "undefined" */
22
- const describedByAttribute =
23
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
24
- modalDialogElement.getAttribute('aria-describedby');
25
- return describedByAttribute;
26
- }
27
- /**
28
- * The modal component's ARIA labelledby attribute.
29
- */
30
- get ariaLabelledBy() {
31
- const modalDialogElement = this.#getModalDialogElement();
32
- /* Non-null assertion as our component has a default for if the user does not provide this attribute or if they provide "undefined" */
33
- const labelledByAttribute =
34
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
35
- modalDialogElement.getAttribute('aria-labelledby');
36
- return labelledByAttribute;
37
- }
38
- /**
39
- * The modal component's role attribute.
40
- */
41
- get ariaRole() {
42
- const modalDialogElement = this.#getModalDialogElement();
43
- /* Non-null assertion as our component has a default for if the user does not provide this attribute or if they provide "undefined" */
44
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
45
- const roleAttribute = modalDialogElement.getAttribute('role');
46
- return roleAttribute;
47
- }
48
- /**
49
- * Whether or not the modal is a full page modal.
50
- */
51
- get fullPage() {
52
- const modalDivElement = this.getModalDiv();
53
- return modalDivElement.classList.contains('sky-modal-full-page');
54
- }
55
- /**
56
- * The size of the modal.
57
- */
58
- get size() {
59
- const modalDivElement = this.getModalDiv();
60
- const possibleSizes = ['small', 'medium', 'large'];
61
- for (const size of possibleSizes) {
62
- if (modalDivElement.classList.contains('sky-modal-' + size)) {
63
- return size;
64
- }
65
- }
66
- return;
67
- }
68
- /**
69
- * Whether or not the modal is set up for tiled content.
70
- */
71
- get tiledBody() {
72
- const modalDivElement = this.getModalDiv();
73
- return modalDivElement.classList.contains('sky-modal-tiled');
74
- }
75
- /**
76
- * Clicks the modal header's "close" button.
77
- */
78
- clickHeaderCloseButton() {
79
- this.#checkModalElement();
80
- const closeButton = this.#modalElement.querySelector('.sky-modal .sky-modal-btn-close');
81
- if (closeButton &&
82
- window.getComputedStyle(closeButton).display !== 'none') {
83
- closeButton.click();
84
- this.#fixture.detectChanges();
85
- }
86
- else {
87
- throw new Error(`No header close button exists.`);
88
- }
89
- }
90
- /**
91
- * Clicks the modal header's "help" button.
92
- */
93
- clickHelpButton() {
94
- this.#checkModalElement();
95
- const helpButton = this.#modalElement.querySelector('.sky-modal .sky-modal-header-buttons button[name="help-button"]');
96
- if (helpButton && window.getComputedStyle(helpButton).display !== 'none') {
97
- helpButton.click();
98
- this.#fixture.detectChanges();
99
- }
100
- else {
101
- throw new Error(`No help button exists.`);
102
- }
103
- }
104
- /**
105
- * Returns the main modal element.
106
- */
107
- getModalDiv() {
108
- this.#checkModalElement();
109
- return this.#modalElement.querySelector('.sky-modal');
110
- }
111
- /**
112
- * Returns the modal's content element.
113
- */
114
- getModalContentEl() {
115
- this.#checkModalElement();
116
- return this.#modalElement.querySelector('.sky-modal-content');
117
- }
118
- /**
119
- * Returns the modal's footer element.
120
- */
121
- getModalFooterEl() {
122
- this.#checkModalElement();
123
- return this.#modalElement.querySelector('.sky-modal-footer');
124
- }
125
- /**
126
- * Returns the modal's header element.
127
- */
128
- getModalHeaderEl() {
129
- this.#checkModalElement();
130
- return this.#modalElement.querySelector('.sky-modal-header');
131
- }
132
- #checkModalElement() {
133
- if (!document.contains(this.#modalElement)) {
134
- throw new Error('Modal element no longer exists. Was the modal closed?');
135
- }
136
- }
137
- #getModalDialogElement() {
138
- this.#checkModalElement();
139
- // We can always know that the dialog element will exist if the modal is open and exists.
140
- return this.#modalElement.querySelector('.sky-modal-dialog');
141
- }
142
- }
143
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYWwtZml4dHVyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tcG9uZW50cy9tb2RhbHMvdGVzdGluZy9zcmMvbW9kYWwtZml4dHVyZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQTs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sZUFBZTtJQUMxQixhQUFhLENBQWM7SUFFM0IsUUFBUSxDQUE0QjtJQUVwQyxZQUFZLE9BQWtDLEVBQUUsU0FBaUI7UUFDL0QsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUM7UUFDeEIsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FDekMseUJBQXlCLEdBQUcsU0FBUyxHQUFHLElBQUksQ0FDOUIsQ0FBQztRQUVqQixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDbEIsTUFBTSxJQUFJLEtBQUssQ0FDYix5REFBeUQsU0FBUyxJQUFJLENBQ3ZFLENBQUM7UUFDSixDQUFDO1FBRUQsSUFBSSxDQUFDLGFBQWEsR0FBRyxZQUFZLENBQUM7SUFDcEMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBVyxlQUFlO1FBQ3hCLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFDekQsc0lBQXNJO1FBQ3RJLE1BQU0sb0JBQW9CO1FBQ3hCLG9FQUFvRTtRQUNwRSxrQkFBa0IsQ0FBQyxZQUFZLENBQUMsa0JBQWtCLENBQUUsQ0FBQztRQUN2RCxPQUFPLG9CQUFvQixDQUFDO0lBQzlCLENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcsY0FBYztRQUN2QixNQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQ3pELHNJQUFzSTtRQUN0SSxNQUFNLG1CQUFtQjtRQUN2QixvRUFBb0U7UUFDcEUsa0JBQWtCLENBQUMsWUFBWSxDQUFDLGlCQUFpQixDQUFFLENBQUM7UUFFdEQsT0FBTyxtQkFBbUIsQ0FBQztJ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QUMsa0JBQWtCLEVBQUUsQ0FBQztRQUMxQixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVEOztPQUVHO0lBQ0ksZ0JBQWdCO1FBQ3JCLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzFCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBRUQsa0JBQWtCO1FBQ2hCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDO1lBQzNDLE1BQU0sSUFBSSxLQUFLLENBQUMsdURBQXVELENBQUMsQ0FBQztRQUMzRSxDQUFDO0lBQ0gsQ0FBQztJQUVELHNCQUFzQjtRQUNwQixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUMxQix5RkFBeUY7UUFDekYsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxtQkFBbUIsQ0FBRSxDQUFDO0lBQ2hFLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudEZpeHR1cmUgfSBmcm9tICdAYW5ndWxhci9jb3JlL3Rlc3RpbmcnO1xuXG4vKipcbiAqIEFsbG93cyBpbnRlcmFjdGlvbiB3aXRoIGEgU0tZIFVYIG1vZGFsIGNvbXBvbmVudC5cbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgU2t5TW9kYWxGaXh0dXJlIHtcbiAgI21vZGFsRWxlbWVudDogSFRNTEVsZW1lbnQ7XG5cbiAgI2ZpeHR1cmU6IENvbXBvbmVudEZpeHR1cmU8dW5rbm93bj47XG5cbiAgY29uc3RydWN0b3IoZml4dHVyZTogQ29tcG9uZW50Rml4dHVyZTx1bmtub3duPiwgc2t5VGVzdElkOiBzdHJpbmcpIHtcbiAgICB0aGlzLiNmaXh0dXJlID0gZml4dHVyZTtcbiAgICBjb25zdCBtb2RhbEVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFxuICAgICAgJ3NreS1tb2RhbFtkYXRhLXNreS1pZD1cIicgKyBza3lUZXN0SWQgKyAnXCJdJyxcbiAgICApIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgaWYgKCFtb2RhbEVsZW1lbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYE5vIGVsZW1lbnQgd2FzIGZvdW5kIHdpdGggYSBcXGBkYXRhLXNreS1pZFxcYCB2YWx1ZSBvZiBcIiR7c2t5VGVzdElkfVwiLmAsXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuI21vZGFsRWxlbWVudCA9IG1vZGFsRWxlbWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbW9kYWwgY29tcG9uZW50J3MgQVJJQSBkZXNjcmliZWRieSBhdHRyaWJ1dGUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGFyaWFEZXNjcmliZWRCeSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IG1vZGFsRGlhbG9nRWxlbWVudCA9IHRoaXMuI2dldE1vZGFsRGlhbG9nRWxlbWVudCgpO1xuICAgIC8qIE5vbi1udWxsIGFzc2VydGlvbiBhcyBvdXIgY29tcG9uZW50IGhhcyBhIGRlZmF1bHQgZm9yIGlmIHRoZSB1c2VyIGRvZXMgbm90IHByb3ZpZGUgdGhpcyBhdHRyaWJ1dGUgb3IgaWYgdGhleSBwcm92aWRlIFwidW5kZWZpbmVkXCIgKi9cbiAgICBjb25zdCBkZXNjcmliZWRCeUF0dHJpYnV0ZSA9XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5vbi1udWxsLWFzc2VydGlvblxuICAgICAgbW9kYWxEaWFsb2dFbGVtZW50LmdldEF0dHJpYnV0ZSgnYXJpYS1kZXNjcmliZWRieScpITtcbiAgICByZXR1cm4gZGVzY3JpYmVkQnlBdHRyaWJ1dGU7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG1vZGFsIGNvbXBvbmVudCdzIEFSSUEgbGFiZWxsZWRieSBhdHRyaWJ1dGUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGFyaWFMYWJlbGxlZEJ5KCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgbW9kYWxEaWFsb2dFbGVtZW50ID0gdGhpcy4jZ2V0TW9kYWxEaWFsb2dFbGVtZW50KCk7XG4gICAgLyogTm9uLW51bGwgYXNzZXJ0aW9uIGFzIG91ciBjb21wb25lbnQgaGFzIGEgZGVmYXVsdCBmb3IgaWYgdGhlIHVzZXIgZG9lcyBub3QgcHJvdmlkZSB0aGlzIGF0dHJpYnV0ZSBvciBpZiB0aGV5IHByb3ZpZGUgXCJ1bmRlZmluZWRcIiAqL1xuICAgIGNvbnN0IGxhYmVsbGVkQnlBdHRyaWJ1dGUgPVxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb25cbiAgICAgIG1vZGFsRGlhbG9nRWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWxsZWRieScpITtcblxuICAgIHJldHVybiBsYWJlbGxlZEJ5QXR0cmlidXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBtb2RhbCBjb21wb25lbnQncyByb2xlIGF0dHJpYnV0ZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgYXJpYVJvbGUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBtb2RhbERpYWxvZ0VsZW1lbnQgPSB0aGlzLiNnZXRNb2RhbERpYWxvZ0VsZW1lbnQoKTtcbiAgICAvKiBOb24tbnVsbCBhc3NlcnRpb24gYXMgb3VyIGNvbXBvbmVudCBoYXMgYSBkZWZhdWx0IGZvciBpZiB0aGUgdXNlciBkb2VzIG5vdCBwcm92aWRlIHRoaXMgYXR0cmlidXRlIG9yIGlmIHRoZXkgcHJvdmlkZSBcInVuZGVmaW5lZFwiICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb25cbiAgICBjb25zdCByb2xlQXR0cmlidXRlID0gbW9kYWxEaWFsb2dFbGVtZW50LmdldEF0dHJpYnV0ZSgncm9sZScpITtcbiAgICByZXR1cm4gcm9sZUF0dHJpYnV0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgbW9kYWwgaXMgYSBmdWxsIHBhZ2UgbW9kYWwuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGZ1bGxQYWdlKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IG1vZGFsRGl2RWxlbWVudCA9IHRoaXMuZ2V0TW9kYWxEaXYoKTtcbiAgICByZXR1cm4gbW9kYWxEaXZFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnc2t5LW1vZGFsLWZ1bGwtcGFnZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBzaXplIG9mIHRoZSBtb2RhbC5cbiAgICovXG4gIHB1YmxpYyBnZXQgc2l6ZSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IG1vZGFsRGl2RWxlbWVudCA9IHRoaXMuZ2V0TW9kYWxEaXYoKTtcbiAgICBjb25zdCBwb3NzaWJsZVNpemVzID0gWydzbWFsbCcsICdtZWRpdW0nLCAnbGFyZ2UnXTtcblxuICAgIGZvciAoY29uc3Qgc2l6ZSBvZiBwb3NzaWJsZVNpemVzKSB7XG4gICAgICBpZiAobW9kYWxEaXZFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnc2t5LW1vZGFsLScgKyBzaXplKSkge1xuICAgICAgICByZXR1cm4gc2l6ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdGhlIG1vZGFsIGlzIHNldCB1cCBmb3IgdGlsZWQgY29udGVudC5cbiAgICovXG4gIHB1YmxpYyBnZXQgdGlsZWRCb2R5KCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IG1vZGFsRGl2RWxlbWVudCA9IHRoaXMuZ2V0TW9kYWxEaXYoKTtcbiAgICByZXR1cm4gbW9kYWxEaXZFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnc2t5LW1vZGFsLXRpbGVkJyk7XG4gIH1cblxuICAvKipcbiAgICogQ2xpY2tzIHRoZSBtb2RhbCBoZWFkZXIncyBcImNsb3NlXCIgYnV0dG9uLlxuICAgKi9cbiAgcHVibGljIGNsaWNrSGVhZGVyQ2xvc2VCdXR0b24oKTogdm9pZCB7XG4gICAgdGhpcy4jY2hlY2tNb2RhbEVsZW1lbnQoKTtcbiAgICBjb25zdCBjbG9zZUJ1dHRvbjogSFRNTEVsZW1lbnQgfCBudWxsID0gdGhpcy4jbW9kYWxFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAnLnNreS1tb2RhbCAuc2t5LW1vZGFsLWJ0bi1jbG9zZScsXG4gICAgKTtcblxuICAgIGlmIChcbiAgICAgIGNsb3NlQnV0dG9uICYmXG4gICAgICB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShjbG9zZUJ1dHRvbikuZGlzcGxheSAhPT0gJ25vbmUnXG4gICAgKSB7XG4gICAgICBjbG9zZUJ1dHRvbi5jbGljaygpO1xuICAgICAgdGhpcy4jZml4dHVyZS5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gaGVhZGVyIGNsb3NlIGJ1dHRvbiBleGlzdHMuYCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsaWNrcyB0aGUgbW9kYWwgaGVhZGVyJ3MgXCJoZWxwXCIgYnV0dG9uLlxuICAgKi9cbiAgcHVibGljIGNsaWNrSGVscEJ1dHRvbigpOiB2b2lkIHtcbiAgICB0aGlzLiNjaGVja01vZGFsRWxlbWVudCgpO1xuICAgIGNvbnN0IGhlbHBCdXR0b246IEhUTUxFbGVtZW50IHwgbnVsbCA9IHRoaXMuI21vZGFsRWxlbWVudC5xdWVyeVNlbGVjdG9yKFxuICAgICAgJy5za3ktbW9kYWwgLnNreS1tb2RhbC1oZWFkZXItYnV0dG9ucyBidXR0b25bbmFtZT1cImhlbHAtYnV0dG9uXCJdJyxcbiAgICApO1xuXG4gICAgaWYgKGhlbHBCdXR0b24gJiYgd2luZG93LmdldENvbXB1dGVkU3R5bGUoaGVscEJ1dHRvbikuZGlzcGxheSAhPT0gJ25vbmUnKSB7XG4gICAgICBoZWxwQnV0dG9uLmNsaWNrKCk7XG4gICAgICB0aGlzLiNmaXh0dXJlLmRldGVjdENoYW5nZXMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBoZWxwIGJ1dHRvbiBleGlzdHMuYCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG1haW4gbW9kYWwgZWxlbWVudC5cbiAgICovXG4gIHB1YmxpYyBnZXRNb2RhbERpdigpOiBhbnkge1xuICAgIHRoaXMuI2NoZWNrTW9kYWxFbGVtZW50KCk7XG4gICAgcmV0dXJuIHRoaXMuI21vZGFsRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuc2t5LW1vZGFsJyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbW9kYWwncyBjb250ZW50IGVsZW1lbnQuXG4gICAqL1xuICBwdWJsaWMgZ2V0TW9kYWxDb250ZW50RWwoKTogYW55IHtcbiAgICB0aGlzLiNjaGVja01vZGFsRWxlbWVudCgpO1xuICAgIHJldHVybiB0aGlzLiNtb2RhbEVsZW1lbnQucXVlcnlTZWxlY3RvcignLnNreS1tb2RhbC1jb250ZW50Jyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbW9kYWwncyBmb290ZXIgZWxlbWVudC5cbiAgICovXG4gIHB1YmxpYyBnZXRNb2RhbEZvb3RlckVsKCk6IGFueSB7XG4gICAgdGhpcy4jY2hlY2tNb2RhbEVsZW1lbnQoKTtcbiAgICByZXR1cm4gdGhpcy4jbW9kYWxFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5za3ktbW9kYWwtZm9vdGVyJyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbW9kYWwncyBoZWFkZXIgZWxlbWVudC5cbiAgICovXG4gIHB1YmxpYyBnZXRNb2RhbEhlYWRlckVsKCk6IGFueSB7XG4gICAgdGhpcy4jY2hlY2tNb2RhbEVsZW1lbnQoKTtcbiAgICByZXR1cm4gdGhpcy4jbW9kYWxFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5za3ktbW9kYWwtaGVhZGVyJyk7XG4gIH1cblxuICAjY2hlY2tNb2RhbEVsZW1lbnQoKTogdm9pZCB7XG4gICAgaWYgKCFkb2N1bWVudC5jb250YWlucyh0aGlzLiNtb2RhbEVsZW1lbnQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01vZGFsIGVsZW1lbnQgbm8gbG9uZ2VyIGV4aXN0cy4gV2FzIHRoZSBtb2RhbCBjbG9zZWQ/Jyk7XG4gICAgfVxuICB9XG5cbiAgI2dldE1vZGFsRGlhbG9nRWxlbWVudCgpOiBIVE1MRWxlbWVudCB7XG4gICAgdGhpcy4jY2hlY2tNb2RhbEVsZW1lbnQoKTtcbiAgICAvLyBXZSBjYW4gYWx3YXlzIGtub3cgdGhhdCB0aGUgZGlhbG9nIGVsZW1lbnQgd2lsbCBleGlzdCBpZiB0aGUgbW9kYWwgaXMgb3BlbiBhbmQgZXhpc3RzLlxuICAgIHJldHVybiB0aGlzLiNtb2RhbEVsZW1lbnQucXVlcnlTZWxlY3RvcignLnNreS1tb2RhbC1kaWFsb2cnKSE7XG4gIH1cbn1cbiJdfQ==