@bookjane2/bookjane-design-library 9.0.6 → 9.0.9
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.
- package/lib/components/BKJAddressInput/BKJAddressInput.stories.d.ts +36 -1
- package/lib/components/BKJAddressInput/BKJAddressInput.stories.d.ts.map +1 -1
- package/lib/components/BKJAddressInput/BKJAddressInput.stories.js +33 -3
- package/lib/components/BKJAddressInput/BKJAddressInput.stories.js.map +1 -1
- package/lib/components/BKJAddressInput/BKJAddressInput.test.d.ts +2 -0
- package/lib/components/BKJAddressInput/BKJAddressInput.test.d.ts.map +1 -0
- package/lib/components/BKJAddressInput/BKJAddressInput.test.js +198 -0
- package/lib/components/BKJAddressInput/BKJAddressInput.test.js.map +1 -0
- package/lib/components/BKJCheckboxListItem/BKJCheckboxListItem.d.ts.map +1 -1
- package/lib/components/BKJCheckboxListItem/BKJCheckboxListItem.js +23 -9
- package/lib/components/BKJCheckboxListItem/BKJCheckboxListItem.js.map +1 -1
- package/lib/components/BKJCheckboxListItem/BKJCheckboxListItem.stories.d.ts +2 -0
- package/lib/components/BKJCheckboxListItem/BKJCheckboxListItem.stories.d.ts.map +1 -1
- package/lib/components/BKJCheckboxListItem/BKJCheckboxListItem.stories.js +7 -3
- package/lib/components/BKJCheckboxListItem/BKJCheckboxListItem.stories.js.map +1 -1
- package/lib/components/BKJCheckboxListItem/BKJCheckboxListItem.styled.d.ts +2 -0
- package/lib/components/BKJCheckboxListItem/BKJCheckboxListItem.styled.d.ts.map +1 -0
- package/lib/components/BKJCheckboxListItem/BKJCheckboxListItem.styled.js +6 -0
- package/lib/components/BKJCheckboxListItem/BKJCheckboxListItem.styled.js.map +1 -0
- package/lib/components/BKJCheckboxListItem/BKJCheckboxListItem.test.d.ts +2 -0
- package/lib/components/BKJCheckboxListItem/BKJCheckboxListItem.test.d.ts.map +1 -0
- package/lib/components/BKJCheckboxListItem/BKJCheckboxListItem.test.js +114 -0
- package/lib/components/BKJCheckboxListItem/BKJCheckboxListItem.test.js.map +1 -0
- package/lib/components/BKJComboBoxAsync/BKJComboBoxAsync.d.ts +1 -1
- package/lib/components/BKJComboBoxAsync/BKJComboBoxAsync.d.ts.map +1 -1
- package/lib/components/BKJComboBoxAsync/BKJComboBoxAsync.js +2 -2
- package/lib/components/BKJComboBoxAsync/BKJComboBoxAsync.js.map +1 -1
- package/lib/components/BKJComboBoxAsync/BKJComboBoxAsync.stories.d.ts +3 -1
- package/lib/components/BKJComboBoxAsync/BKJComboBoxAsync.stories.d.ts.map +1 -1
- package/lib/components/BKJComboBoxAsync/BKJComboBoxAsync.stories.js +48 -0
- package/lib/components/BKJComboBoxAsync/BKJComboBoxAsync.stories.js.map +1 -1
- package/lib/components/BKJComboBoxAsync/BKJComboBoxAsync.test.d.ts +22 -0
- package/lib/components/BKJComboBoxAsync/BKJComboBoxAsync.test.d.ts.map +1 -0
- package/lib/components/BKJComboBoxAsync/BKJComboBoxAsync.test.js +561 -0
- package/lib/components/BKJComboBoxAsync/BKJComboBoxAsync.test.js.map +1 -0
- package/lib/components/BKJComboBoxAsync/BKJComboBoxAsync.types.d.ts +41 -0
- package/lib/components/BKJComboBoxAsync/BKJComboBoxAsync.types.d.ts.map +1 -1
- package/lib/components/BKJComboBoxAsync/BKJComboBoxAsync.utils.d.ts +6 -0
- package/lib/components/BKJComboBoxAsync/BKJComboBoxAsync.utils.d.ts.map +1 -1
- package/lib/components/BKJComboBoxAsync/BKJComboBoxAsync.utils.js +14 -0
- package/lib/components/BKJComboBoxAsync/BKJComboBoxAsync.utils.js.map +1 -1
- package/lib/components/BKJComboBoxAsync/src/BKJComboBoxAsync.context.d.ts.map +1 -1
- package/lib/components/BKJComboBoxAsync/src/BKJComboBoxAsync.context.hooks.d.ts +48 -0
- package/lib/components/BKJComboBoxAsync/src/BKJComboBoxAsync.context.hooks.d.ts.map +1 -1
- package/lib/components/BKJComboBoxAsync/src/BKJComboBoxAsync.context.hooks.js +99 -1
- package/lib/components/BKJComboBoxAsync/src/BKJComboBoxAsync.context.hooks.js.map +1 -1
- package/lib/components/BKJComboBoxAsync/src/BKJComboBoxAsync.context.js +107 -26
- package/lib/components/BKJComboBoxAsync/src/BKJComboBoxAsync.context.js.map +1 -1
- package/lib/components/BKJComboBoxAsync/src/BKJComboBoxAsyncInput.d.ts.map +1 -1
- package/lib/components/BKJComboBoxAsync/src/BKJComboBoxAsyncInput.js +29 -3
- package/lib/components/BKJComboBoxAsync/src/BKJComboBoxAsyncInput.js.map +1 -1
- package/lib/components/BKJComboBoxAsync/src/BKJComboBoxAsyncItem.d.ts.map +1 -1
- package/lib/components/BKJComboBoxAsync/src/BKJComboBoxAsyncItem.js +7 -1
- package/lib/components/BKJComboBoxAsync/src/BKJComboBoxAsyncItem.js.map +1 -1
- package/lib/components/BKJComboBoxAsync/src/BKJComboBoxAsyncOptions.d.ts.map +1 -1
- package/lib/components/BKJComboBoxAsync/src/BKJComboBoxAsyncOptions.js +25 -6
- package/lib/components/BKJComboBoxAsync/src/BKJComboBoxAsyncOptions.js.map +1 -1
- package/lib/components/BKJComboBoxAsync/src/BKJComboBoxAsyncOptionsMapper.d.ts.map +1 -1
- package/lib/components/BKJComboBoxAsync/src/BKJComboBoxAsyncOptionsMapper.js +6 -1
- package/lib/components/BKJComboBoxAsync/src/BKJComboBoxAsyncOptionsMapper.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,561 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* BKJComboBoxAsync.test.tsx
|
|
4
|
+
*
|
|
5
|
+
* WEB-4815 — BKJComboBoxAsync Accessibility (WCAG 2.1 Level A)
|
|
6
|
+
*
|
|
7
|
+
* Asserts:
|
|
8
|
+
* - Accessibility (axe): clean closed / loading / loaded-with-results /
|
|
9
|
+
* empty states (FR-007; T019, T027, T042a).
|
|
10
|
+
* - Async busy state and loading announcement (FR-002, FR-003, FR-005,
|
|
11
|
+
* FR-006; I-A01, I-A02, I-A03; T014–T018).
|
|
12
|
+
* - Empty and results-count (FR-004; I-A04, I-A05; T023–T028).
|
|
13
|
+
* - Inherited combobox ARIA and keyboard (FR-001; I-01..I-12 from WEB-4811;
|
|
14
|
+
* T034–T042 + T040 stale-fetch/SC-004, T041 close-during-fetch).
|
|
15
|
+
* - Error state (I-11 inherited; T042).
|
|
16
|
+
* - No-regression smoke (SC-006; T045–T047).
|
|
17
|
+
*
|
|
18
|
+
* T003 / Phase 1 finding: WEB-4811 did NOT extract a shared combobox-ARIA
|
|
19
|
+
* helper. Its patterns are inlined per-component; WEB-4815 replicates the
|
|
20
|
+
* same patterns in BKJComboBoxAsync rather than importing a helper.
|
|
21
|
+
*/
|
|
22
|
+
// jsdom does not implement ResizeObserver / IntersectionObserver;
|
|
23
|
+
// react-virtual, react-popper, and InfiniteScrollLoading rely on them.
|
|
24
|
+
class ResizeObserverMock {
|
|
25
|
+
observe() { }
|
|
26
|
+
unobserve() { }
|
|
27
|
+
disconnect() { }
|
|
28
|
+
}
|
|
29
|
+
globalThis.ResizeObserver =
|
|
30
|
+
ResizeObserverMock;
|
|
31
|
+
class IntersectionObserverMock {
|
|
32
|
+
constructor(_cb) {
|
|
33
|
+
Object.defineProperty(this, "root", {
|
|
34
|
+
enumerable: true,
|
|
35
|
+
configurable: true,
|
|
36
|
+
writable: true,
|
|
37
|
+
value: null
|
|
38
|
+
});
|
|
39
|
+
Object.defineProperty(this, "rootMargin", {
|
|
40
|
+
enumerable: true,
|
|
41
|
+
configurable: true,
|
|
42
|
+
writable: true,
|
|
43
|
+
value: ''
|
|
44
|
+
});
|
|
45
|
+
Object.defineProperty(this, "thresholds", {
|
|
46
|
+
enumerable: true,
|
|
47
|
+
configurable: true,
|
|
48
|
+
writable: true,
|
|
49
|
+
value: []
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
observe() { }
|
|
53
|
+
unobserve() { }
|
|
54
|
+
disconnect() { }
|
|
55
|
+
takeRecords() {
|
|
56
|
+
return [];
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
globalThis.IntersectionObserver =
|
|
60
|
+
IntersectionObserverMock;
|
|
61
|
+
import { createContext, useState } from 'react';
|
|
62
|
+
import { act, render, screen, fireEvent } from '@testing-library/react';
|
|
63
|
+
import userEvent from '@testing-library/user-event';
|
|
64
|
+
import { renderAndCheckA11y } from '../../test-utils/index.js';
|
|
65
|
+
import { BKJThemeProvider } from '../../providers/BKJThemeProvider/index.js';
|
|
66
|
+
import { BKJComboBoxAsync } from './BKJComboBoxAsync.js';
|
|
67
|
+
import { resolveResultsCountLabel } from './BKJComboBoxAsync.utils.js';
|
|
68
|
+
const SAMPLE_OPTIONS = [
|
|
69
|
+
{ id: 'ac', value: 'ac', label: 'Acme Corp' },
|
|
70
|
+
{ id: 'ao', value: 'ao', label: 'Acorn Ltd' },
|
|
71
|
+
{ id: 'av', value: 'av', label: 'Activision' },
|
|
72
|
+
];
|
|
73
|
+
const FIVE_OPTIONS = [
|
|
74
|
+
{ id: 'a1', value: 'a1', label: 'Alpha' },
|
|
75
|
+
{ id: 'a2', value: 'a2', label: 'Bravo' },
|
|
76
|
+
{ id: 'a3', value: 'a3', label: 'Charlie' },
|
|
77
|
+
{ id: 'a4', value: 'a4', label: 'Delta' },
|
|
78
|
+
{ id: 'a5', value: 'a5', label: 'Echo' },
|
|
79
|
+
];
|
|
80
|
+
const makeContextValue = (overrides = {}) => ({
|
|
81
|
+
__typename: 'GraphQLAPI',
|
|
82
|
+
loadMore: () => undefined,
|
|
83
|
+
data: { pageInfo: { hasNextPage: false } },
|
|
84
|
+
status: 'READY',
|
|
85
|
+
fetch: () => undefined,
|
|
86
|
+
values: {},
|
|
87
|
+
isLoading: false,
|
|
88
|
+
...overrides,
|
|
89
|
+
});
|
|
90
|
+
/**
|
|
91
|
+
* Renders BKJComboBoxAsync with a mock GQL context, exposing setters so
|
|
92
|
+
* tests can toggle `isLoading`, `options`, `status` between renders
|
|
93
|
+
* without remounting.
|
|
94
|
+
*/
|
|
95
|
+
function renderWithMockContext(props, initialContextValue = {}) {
|
|
96
|
+
const Context = createContext(makeContextValue(initialContextValue));
|
|
97
|
+
let setContextValueExternal = () => undefined;
|
|
98
|
+
let setOptionsExternal = () => undefined;
|
|
99
|
+
let setSearchValueExternal = () => undefined;
|
|
100
|
+
const onChangeSpy = jest.fn();
|
|
101
|
+
const Harness = () => {
|
|
102
|
+
const [contextValue, setContextValueState] = useState(makeContextValue(initialContextValue));
|
|
103
|
+
const [options, setOptionsState] = useState(props.options ?? []);
|
|
104
|
+
const [searchValue, setSearchValueState] = useState(props.searchValue ?? '');
|
|
105
|
+
setContextValueExternal = (next) => setContextValueState((prev) => ({ ...prev, ...next }));
|
|
106
|
+
setOptionsExternal = (next) => setOptionsState(next);
|
|
107
|
+
setSearchValueExternal = (next) => setSearchValueState(next);
|
|
108
|
+
return (_jsx(Context.Provider, { value: contextValue, children: _jsx(BKJComboBoxAsync, { label: "Company", name: "company", type: "Single", action: "OpenToggle", value: undefined, searchKey: "label", onSearchChange: (evt) => setSearchValueExternal(evt.target.value), ...props, options: options, searchValue: searchValue, onChange: onChangeSpy, context: Context }) }));
|
|
109
|
+
};
|
|
110
|
+
const renderResult = render(_jsx(BKJThemeProvider, { children: _jsx(Harness, {}) }));
|
|
111
|
+
return {
|
|
112
|
+
renderResult,
|
|
113
|
+
setContextValue: (next) => act(() => {
|
|
114
|
+
setContextValueExternal(next);
|
|
115
|
+
}),
|
|
116
|
+
setOptions: (next) => act(() => {
|
|
117
|
+
setOptionsExternal(next);
|
|
118
|
+
}),
|
|
119
|
+
setSearchValue: (next) => act(() => {
|
|
120
|
+
setSearchValueExternal(next);
|
|
121
|
+
}),
|
|
122
|
+
onChangeSpy,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
const openDropdown = async (input) => {
|
|
126
|
+
await act(async () => {
|
|
127
|
+
input.focus();
|
|
128
|
+
await Promise.resolve();
|
|
129
|
+
});
|
|
130
|
+
};
|
|
131
|
+
const getInput = (container) => container.querySelector('input[role="combobox"]');
|
|
132
|
+
const getLiveRegion = () => document.querySelector('[data-testid="bkj-combobox-async-live-region"]');
|
|
133
|
+
afterEach(() => {
|
|
134
|
+
document.querySelectorAll('#dropdown-root').forEach((el) => el.remove());
|
|
135
|
+
});
|
|
136
|
+
describe('BKJComboBoxAsync', () => {
|
|
137
|
+
describe('Accessibility (axe)', () => {
|
|
138
|
+
it('T042a: has no axe violations in closed state', async () => {
|
|
139
|
+
// Renders the component without opening the dropdown. Validates
|
|
140
|
+
// FR-007's "dropdown closed" scenario and SC-001.
|
|
141
|
+
const Context = createContext(makeContextValue({ status: 'READY', isLoading: false }));
|
|
142
|
+
const { axeResults, renderResult } = await renderAndCheckA11y(_jsx(Context.Provider, { value: makeContextValue({ status: 'READY', isLoading: false }), children: _jsx(BKJComboBoxAsync, { label: "Company", name: "company", type: "Single", action: "OpenToggle", value: undefined, searchValue: "", searchKey: "label", options: SAMPLE_OPTIONS, onChange: jest.fn(), onSearchChange: jest.fn(), context: Context }) }));
|
|
143
|
+
expect(axeResults).toHaveNoViolations();
|
|
144
|
+
expect(renderResult.container.querySelectorAll('[role="combobox"]')).toHaveLength(1);
|
|
145
|
+
// Confirm dropdown is genuinely closed.
|
|
146
|
+
expect(document.querySelector('[role="listbox"]')?.getAttribute('aria-hidden') !== 'false'
|
|
147
|
+
|| screen.queryByRole('listbox') === null).toBeTruthy();
|
|
148
|
+
});
|
|
149
|
+
it('T019: has no axe violations in loading state', async () => {
|
|
150
|
+
const Context = createContext(makeContextValue({ status: 'LOADING', isLoading: true }));
|
|
151
|
+
const { axeResults } = await renderAndCheckA11y(_jsx(Context.Provider, { value: makeContextValue({ status: 'LOADING', isLoading: true }), children: _jsx(BKJComboBoxAsync, { label: "Company", name: "company", type: "Single", action: "OpenToggle", value: undefined, searchValue: "ac", searchKey: "label", options: [], onChange: jest.fn(), onSearchChange: jest.fn(), context: Context }) }));
|
|
152
|
+
expect(axeResults).toHaveNoViolations();
|
|
153
|
+
});
|
|
154
|
+
it('T027: has no axe violations in loaded-with-results state', async () => {
|
|
155
|
+
const Context = createContext(makeContextValue({ status: 'READY', isLoading: false }));
|
|
156
|
+
const { axeResults, renderResult } = await renderAndCheckA11y(_jsx(Context.Provider, { value: makeContextValue({ status: 'READY', isLoading: false }), children: _jsx(BKJComboBoxAsync, { label: "Company", name: "company", type: "Single", action: "OpenToggle", value: undefined, searchValue: "", searchKey: "label", options: SAMPLE_OPTIONS, onChange: jest.fn(), onSearchChange: jest.fn(), context: Context }) }));
|
|
157
|
+
const input = getInput(renderResult.container);
|
|
158
|
+
await openDropdown(input);
|
|
159
|
+
// Re-run axe after open (renderAndCheckA11y ran on initial render only).
|
|
160
|
+
const { axe } = await import('jest-axe');
|
|
161
|
+
const results = await axe(renderResult.container);
|
|
162
|
+
expect(results).toHaveNoViolations();
|
|
163
|
+
expect(axeResults).toHaveNoViolations();
|
|
164
|
+
});
|
|
165
|
+
it('T027: has no axe violations in empty state', async () => {
|
|
166
|
+
const Context = createContext(makeContextValue({ status: 'READY', isLoading: false }));
|
|
167
|
+
const { renderResult } = await renderAndCheckA11y(_jsx(Context.Provider, { value: makeContextValue({ status: 'READY', isLoading: false }), children: _jsx(BKJComboBoxAsync, { label: "Company", name: "company", type: "Single", action: "OpenToggle", value: undefined, searchValue: "zzzz", searchKey: "label", options: [], onChange: jest.fn(), onSearchChange: jest.fn(), context: Context }) }));
|
|
168
|
+
const input = getInput(renderResult.container);
|
|
169
|
+
await openDropdown(input);
|
|
170
|
+
const { axe } = await import('jest-axe');
|
|
171
|
+
const results = await axe(renderResult.container);
|
|
172
|
+
expect(results).toHaveNoViolations();
|
|
173
|
+
});
|
|
174
|
+
});
|
|
175
|
+
describe('Async — busy state and loading announcement', () => {
|
|
176
|
+
it('T014: lists listbox as aria-busy while isLoading; clears when false', async () => {
|
|
177
|
+
const { renderResult, setContextValue } = renderWithMockContext({ options: [], searchValue: 'ac' }, { status: 'LOADING', isLoading: true });
|
|
178
|
+
const input = getInput(renderResult.container);
|
|
179
|
+
await openDropdown(input);
|
|
180
|
+
const listbox = document.querySelector('[role="listbox"]');
|
|
181
|
+
expect(listbox).toBeTruthy();
|
|
182
|
+
expect(listbox.getAttribute('aria-busy')).toBe('true');
|
|
183
|
+
// Transition to settled.
|
|
184
|
+
setContextValue({ status: 'READY', isLoading: false });
|
|
185
|
+
const listboxAfter = document.querySelector('[role="listbox"]');
|
|
186
|
+
expect(listboxAfter.getAttribute('aria-busy')).not.toBe('true');
|
|
187
|
+
});
|
|
188
|
+
it('T015: does NOT announce Loading for a sub-1-second fetch', async () => {
|
|
189
|
+
jest.useFakeTimers();
|
|
190
|
+
try {
|
|
191
|
+
const { renderResult, setContextValue, setOptions } = renderWithMockContext({ options: [], searchValue: 'ac' }, { status: 'READY', isLoading: false });
|
|
192
|
+
const input = getInput(renderResult.container);
|
|
193
|
+
await openDropdown(input);
|
|
194
|
+
// Start a fetch.
|
|
195
|
+
setContextValue({ status: 'LOADING', isLoading: true });
|
|
196
|
+
act(() => {
|
|
197
|
+
jest.advanceTimersByTime(500);
|
|
198
|
+
});
|
|
199
|
+
expect(getLiveRegion()?.textContent ?? '').toBe('');
|
|
200
|
+
// Resolve before 1s.
|
|
201
|
+
setOptions(SAMPLE_OPTIONS);
|
|
202
|
+
setContextValue({ status: 'READY', isLoading: false });
|
|
203
|
+
// Final message: results-count only; no "Loading results…" ever written.
|
|
204
|
+
expect(getLiveRegion()?.textContent).toBe(resolveResultsCountLabel(undefined, SAMPLE_OPTIONS.length));
|
|
205
|
+
}
|
|
206
|
+
finally {
|
|
207
|
+
jest.useRealTimers();
|
|
208
|
+
}
|
|
209
|
+
});
|
|
210
|
+
it('T016: announces Loading at the 1-second threshold, once', async () => {
|
|
211
|
+
jest.useFakeTimers();
|
|
212
|
+
try {
|
|
213
|
+
const { renderResult, setContextValue } = renderWithMockContext({ options: [], searchValue: 'ac' }, { status: 'READY', isLoading: false });
|
|
214
|
+
const input = getInput(renderResult.container);
|
|
215
|
+
await openDropdown(input);
|
|
216
|
+
setContextValue({ status: 'LOADING', isLoading: true });
|
|
217
|
+
act(() => {
|
|
218
|
+
jest.advanceTimersByTime(999);
|
|
219
|
+
});
|
|
220
|
+
expect(getLiveRegion()?.textContent ?? '').toBe('');
|
|
221
|
+
act(() => {
|
|
222
|
+
jest.advanceTimersByTime(1);
|
|
223
|
+
});
|
|
224
|
+
expect(getLiveRegion()?.textContent).toBe('Loading results…');
|
|
225
|
+
// Continue holding isLoading true past the threshold — no re-fire.
|
|
226
|
+
act(() => {
|
|
227
|
+
jest.advanceTimersByTime(2000);
|
|
228
|
+
});
|
|
229
|
+
expect(getLiveRegion()?.textContent).toBe('Loading results…');
|
|
230
|
+
}
|
|
231
|
+
finally {
|
|
232
|
+
jest.useRealTimers();
|
|
233
|
+
}
|
|
234
|
+
});
|
|
235
|
+
it('T017: announces Loading exactly once across a 2-second steady-typing burst', async () => {
|
|
236
|
+
jest.useFakeTimers();
|
|
237
|
+
try {
|
|
238
|
+
const { renderResult, setContextValue, setSearchValue } = renderWithMockContext({ options: [], searchValue: '' }, { status: 'READY', isLoading: false });
|
|
239
|
+
const input = getInput(renderResult.container);
|
|
240
|
+
await openDropdown(input);
|
|
241
|
+
setContextValue({ status: 'LOADING', isLoading: true });
|
|
242
|
+
const writes = [];
|
|
243
|
+
// Every 200ms, simulate the consumer updating searchValue (new
|
|
244
|
+
// keystroke) while keeping isLoading=true (stale fetch + new
|
|
245
|
+
// fetch in flight).
|
|
246
|
+
for (let i = 0; i < 10; i++) {
|
|
247
|
+
act(() => {
|
|
248
|
+
setSearchValue(`q${i}`);
|
|
249
|
+
jest.advanceTimersByTime(200);
|
|
250
|
+
});
|
|
251
|
+
const text = getLiveRegion()?.textContent ?? '';
|
|
252
|
+
if (text.length > 0 && !writes.includes(text))
|
|
253
|
+
writes.push(text);
|
|
254
|
+
}
|
|
255
|
+
// Exactly one loading-message write across the 2-second burst.
|
|
256
|
+
expect(writes).toEqual(['Loading results…']);
|
|
257
|
+
}
|
|
258
|
+
finally {
|
|
259
|
+
jest.useRealTimers();
|
|
260
|
+
}
|
|
261
|
+
});
|
|
262
|
+
it('T018: Loader row has role=option, aria-disabled, aria-hidden; not addressable by activedescendant', async () => {
|
|
263
|
+
const { renderResult } = renderWithMockContext({ options: [], searchValue: 'ac' }, { status: 'LOADING', isLoading: true });
|
|
264
|
+
const input = getInput(renderResult.container);
|
|
265
|
+
await openDropdown(input);
|
|
266
|
+
// Loader row is present inside the listbox, hidden from AT.
|
|
267
|
+
const loader = document.querySelector('[role="listbox"] [aria-hidden="true"][role="option"]');
|
|
268
|
+
expect(loader).toBeTruthy();
|
|
269
|
+
expect(loader?.getAttribute('aria-disabled')).toBe('true');
|
|
270
|
+
// aria-activedescendant must not point at the Loader's id.
|
|
271
|
+
const active = input.getAttribute('aria-activedescendant');
|
|
272
|
+
if (active && loader?.id) {
|
|
273
|
+
expect(active).not.toBe(loader.id);
|
|
274
|
+
}
|
|
275
|
+
});
|
|
276
|
+
});
|
|
277
|
+
describe('Async — empty and results-count', () => {
|
|
278
|
+
it('T023: renders in-listbox No results option with role=option and aria-disabled', async () => {
|
|
279
|
+
const { renderResult } = renderWithMockContext({ options: [], searchValue: 'zzzz' }, { status: 'READY', isLoading: false });
|
|
280
|
+
const input = getInput(renderResult.container);
|
|
281
|
+
await openDropdown(input);
|
|
282
|
+
const noResults = document.querySelector('[role="listbox"] [role="option"][aria-disabled="true"]');
|
|
283
|
+
expect(noResults).toBeTruthy();
|
|
284
|
+
// It's the sole option (nothing else in the listbox).
|
|
285
|
+
const allOptions = document.querySelectorAll('[role="listbox"] [role="option"]');
|
|
286
|
+
// Loader may or may not also render depending on hasNextPage; in this
|
|
287
|
+
// fixture we set hasNextPage=false + isLoading=false, so only
|
|
288
|
+
// NoResults is expected.
|
|
289
|
+
expect(allOptions.length).toBe(1);
|
|
290
|
+
});
|
|
291
|
+
it('T024: does NOT write a live-region No results announcement', async () => {
|
|
292
|
+
const { renderResult, setContextValue, setOptions } = renderWithMockContext({ options: [], searchValue: 'ac' }, { status: 'LOADING', isLoading: true });
|
|
293
|
+
const input = getInput(renderResult.container);
|
|
294
|
+
await openDropdown(input);
|
|
295
|
+
// Resolve empty.
|
|
296
|
+
setOptions([]);
|
|
297
|
+
setContextValue({ status: 'READY', isLoading: false });
|
|
298
|
+
// Live region must not contain a "No results" announcement — the
|
|
299
|
+
// empty state is the in-listbox option element alone.
|
|
300
|
+
const liveText = getLiveRegion()?.textContent ?? '';
|
|
301
|
+
expect(liveText.toLowerCase()).not.toContain('no results');
|
|
302
|
+
});
|
|
303
|
+
it('T025: ArrowDown / ArrowUp do not move activedescendant onto NoResults; Enter no-op', async () => {
|
|
304
|
+
const { renderResult, onChangeSpy } = renderWithMockContext({ options: [], searchValue: 'zzzz' }, { status: 'READY', isLoading: false });
|
|
305
|
+
const input = getInput(renderResult.container);
|
|
306
|
+
const user = userEvent.setup();
|
|
307
|
+
await openDropdown(input);
|
|
308
|
+
const noResults = document.querySelector('[role="listbox"] [role="option"][aria-disabled="true"]');
|
|
309
|
+
expect(noResults).toBeTruthy();
|
|
310
|
+
await user.keyboard('{ArrowDown}');
|
|
311
|
+
const active = input.getAttribute('aria-activedescendant');
|
|
312
|
+
if (active && noResults?.id) {
|
|
313
|
+
expect(active).not.toBe(noResults.id);
|
|
314
|
+
}
|
|
315
|
+
await user.keyboard('{Enter}');
|
|
316
|
+
expect(onChangeSpy).not.toHaveBeenCalled();
|
|
317
|
+
});
|
|
318
|
+
it('T026: empty state clears when a subsequent fetch resolves with options', async () => {
|
|
319
|
+
const { renderResult, setOptions } = renderWithMockContext({ options: [], searchValue: 'zzzz' }, { status: 'READY', isLoading: false });
|
|
320
|
+
const input = getInput(renderResult.container);
|
|
321
|
+
await openDropdown(input);
|
|
322
|
+
// Initially NoResults is rendered.
|
|
323
|
+
expect(document.querySelector('[role="listbox"] [role="option"][aria-disabled="true"]')).toBeTruthy();
|
|
324
|
+
// New query lands with real options.
|
|
325
|
+
setOptions(SAMPLE_OPTIONS);
|
|
326
|
+
// NoResults row gone; 3 real options rendered.
|
|
327
|
+
const options = document.querySelectorAll('[role="listbox"] [role="option"]');
|
|
328
|
+
expect(options.length).toBe(SAMPLE_OPTIONS.length);
|
|
329
|
+
const noResultsGone = !document.querySelector('[role="listbox"] [role="option"][aria-disabled="true"]');
|
|
330
|
+
expect(noResultsGone).toBe(true);
|
|
331
|
+
});
|
|
332
|
+
it('T028: results-count announcement fires on every non-superseded resolve, including cache-hit', async () => {
|
|
333
|
+
jest.useFakeTimers();
|
|
334
|
+
try {
|
|
335
|
+
const { renderResult, setContextValue, setOptions } = renderWithMockContext({ options: [], searchValue: 'al' }, { status: 'READY', isLoading: false });
|
|
336
|
+
const input = getInput(renderResult.container);
|
|
337
|
+
await openDropdown(input);
|
|
338
|
+
// First resolve: 5 options.
|
|
339
|
+
setContextValue({ status: 'LOADING', isLoading: true });
|
|
340
|
+
act(() => {
|
|
341
|
+
jest.advanceTimersByTime(100);
|
|
342
|
+
});
|
|
343
|
+
setOptions(FIVE_OPTIONS);
|
|
344
|
+
setContextValue({ status: 'READY', isLoading: false });
|
|
345
|
+
expect(getLiveRegion()?.textContent).toBe(resolveResultsCountLabel(undefined, 5));
|
|
346
|
+
// Second resolve with the same options (cache-hit): must re-fire.
|
|
347
|
+
setContextValue({ status: 'LOADING', isLoading: true });
|
|
348
|
+
act(() => {
|
|
349
|
+
jest.advanceTimersByTime(100);
|
|
350
|
+
});
|
|
351
|
+
// Intentionally use the same array reference.
|
|
352
|
+
setOptions(FIVE_OPTIONS);
|
|
353
|
+
setContextValue({ status: 'READY', isLoading: false });
|
|
354
|
+
expect(getLiveRegion()?.textContent).toBe(resolveResultsCountLabel(undefined, 5));
|
|
355
|
+
}
|
|
356
|
+
finally {
|
|
357
|
+
jest.useRealTimers();
|
|
358
|
+
}
|
|
359
|
+
});
|
|
360
|
+
});
|
|
361
|
+
describe('Inherited — combobox ARIA and keyboard', () => {
|
|
362
|
+
it('T034: has exactly one role=combobox per instance', async () => {
|
|
363
|
+
const { renderResult } = renderWithMockContext({ options: SAMPLE_OPTIONS, searchValue: '' }, { status: 'READY', isLoading: false });
|
|
364
|
+
expect(renderResult.container.querySelectorAll('[role="combobox"]')).toHaveLength(1);
|
|
365
|
+
});
|
|
366
|
+
it('T035: listbox id matches input aria-controls; stable across re-render', async () => {
|
|
367
|
+
const { renderResult, setContextValue } = renderWithMockContext({ options: SAMPLE_OPTIONS, searchValue: '' }, { status: 'READY', isLoading: false });
|
|
368
|
+
const input = getInput(renderResult.container);
|
|
369
|
+
await openDropdown(input);
|
|
370
|
+
const listbox = document.querySelector('[role="listbox"]');
|
|
371
|
+
const controls = input.getAttribute('aria-controls');
|
|
372
|
+
const idPre = listbox.id;
|
|
373
|
+
expect(controls).toBe(idPre);
|
|
374
|
+
// Trigger a benign re-render (non-structural change).
|
|
375
|
+
setContextValue({ data: { pageInfo: { hasNextPage: false } } });
|
|
376
|
+
const listboxAfter = document.querySelector('[role="listbox"]');
|
|
377
|
+
expect(listboxAfter.id).toBe(idPre);
|
|
378
|
+
expect(getInput(renderResult.container).getAttribute('aria-controls')).toBe(idPre);
|
|
379
|
+
});
|
|
380
|
+
it('T036: ArrowDown opens and highlights first option; DOM focus on input', async () => {
|
|
381
|
+
const { renderResult } = renderWithMockContext({ options: SAMPLE_OPTIONS, searchValue: '' }, { status: 'READY', isLoading: false });
|
|
382
|
+
const input = getInput(renderResult.container);
|
|
383
|
+
await openDropdown(input);
|
|
384
|
+
expect(document.activeElement).toBe(input);
|
|
385
|
+
// Initial-highlight rule: first real option is active on open.
|
|
386
|
+
const firstOption = document.querySelectorAll('[role="listbox"] [role="option"]')[0];
|
|
387
|
+
expect(input.getAttribute('aria-activedescendant')).toBe(firstOption.id);
|
|
388
|
+
});
|
|
389
|
+
it('T037: Enter selects highlighted option, closes dropdown, returns focus, fires onChange', async () => {
|
|
390
|
+
const { renderResult, onChangeSpy } = renderWithMockContext({ options: SAMPLE_OPTIONS, searchValue: '' }, { status: 'READY', isLoading: false });
|
|
391
|
+
const input = getInput(renderResult.container);
|
|
392
|
+
const user = userEvent.setup();
|
|
393
|
+
await openDropdown(input);
|
|
394
|
+
await user.keyboard('{Enter}');
|
|
395
|
+
expect(onChangeSpy).toHaveBeenCalled();
|
|
396
|
+
// Dropdown closed; aria-expanded reflects closed.
|
|
397
|
+
expect(input.getAttribute('aria-expanded')).toBe('false');
|
|
398
|
+
});
|
|
399
|
+
it('T038: Escape closes without selection change', async () => {
|
|
400
|
+
const { renderResult, onChangeSpy } = renderWithMockContext({ options: SAMPLE_OPTIONS, searchValue: '' }, { status: 'READY', isLoading: false });
|
|
401
|
+
const input = getInput(renderResult.container);
|
|
402
|
+
const user = userEvent.setup();
|
|
403
|
+
await openDropdown(input);
|
|
404
|
+
expect(input.getAttribute('aria-expanded')).toBe('true');
|
|
405
|
+
await user.keyboard('{Escape}');
|
|
406
|
+
expect(input.getAttribute('aria-expanded')).toBe('false');
|
|
407
|
+
expect(onChangeSpy).not.toHaveBeenCalled();
|
|
408
|
+
});
|
|
409
|
+
it('T039: aria-activedescendant always resolves to a rendered element during navigation', async () => {
|
|
410
|
+
const { renderResult } = renderWithMockContext({ options: SAMPLE_OPTIONS, searchValue: '' }, { status: 'READY', isLoading: false });
|
|
411
|
+
const input = getInput(renderResult.container);
|
|
412
|
+
const user = userEvent.setup();
|
|
413
|
+
await openDropdown(input);
|
|
414
|
+
// Navigate through all three options; each activedescendant must resolve.
|
|
415
|
+
for (let i = 0; i < SAMPLE_OPTIONS.length; i++) {
|
|
416
|
+
const active = input.getAttribute('aria-activedescendant');
|
|
417
|
+
expect(active).toBeTruthy();
|
|
418
|
+
expect(document.getElementById(active)).not.toBeNull();
|
|
419
|
+
await user.keyboard('{ArrowDown}');
|
|
420
|
+
}
|
|
421
|
+
});
|
|
422
|
+
it('T040: rapid typing (5 chars in <500ms) produces ≤ 1 results-count announcement on final resolve', async () => {
|
|
423
|
+
jest.useFakeTimers();
|
|
424
|
+
try {
|
|
425
|
+
const { renderResult, setContextValue, setOptions, setSearchValue } = renderWithMockContext({ options: [], searchValue: '' }, { status: 'READY', isLoading: false });
|
|
426
|
+
const input = getInput(renderResult.container);
|
|
427
|
+
await openDropdown(input);
|
|
428
|
+
// Burst: 5 keystrokes at 100ms each. Each update keeps isLoading
|
|
429
|
+
// high and swaps the current query string.
|
|
430
|
+
setContextValue({ status: 'LOADING', isLoading: true });
|
|
431
|
+
for (let i = 0; i < 5; i++) {
|
|
432
|
+
act(() => {
|
|
433
|
+
setSearchValue(`q${i}`);
|
|
434
|
+
jest.advanceTimersByTime(100);
|
|
435
|
+
});
|
|
436
|
+
}
|
|
437
|
+
// During the burst, no results-count write yet.
|
|
438
|
+
const liveDuringBurst = getLiveRegion()?.textContent ?? '';
|
|
439
|
+
const hasResultsCountDuringBurst = /\bresults?\b/i.test(liveDuringBurst) && !/Loading/i.test(liveDuringBurst);
|
|
440
|
+
expect(hasResultsCountDuringBurst).toBe(false);
|
|
441
|
+
// Final fetch resolves.
|
|
442
|
+
setOptions(FIVE_OPTIONS);
|
|
443
|
+
setContextValue({ status: 'READY', isLoading: false });
|
|
444
|
+
act(() => {
|
|
445
|
+
jest.advanceTimersByTime(0);
|
|
446
|
+
});
|
|
447
|
+
expect(getLiveRegion()?.textContent).toBe(resolveResultsCountLabel(undefined, 5));
|
|
448
|
+
}
|
|
449
|
+
finally {
|
|
450
|
+
jest.useRealTimers();
|
|
451
|
+
}
|
|
452
|
+
});
|
|
453
|
+
it('T041: dropdown close during fetch suppresses pending announcement and unmounts live region', async () => {
|
|
454
|
+
jest.useFakeTimers();
|
|
455
|
+
try {
|
|
456
|
+
// Empty searchValue so Escape closes on first press (the async
|
|
457
|
+
// component's "first Escape clears search, second closes" UX
|
|
458
|
+
// requires an empty search to close on a single press).
|
|
459
|
+
const { renderResult, setContextValue } = renderWithMockContext({ options: [], searchValue: '' }, { status: 'READY', isLoading: false });
|
|
460
|
+
const input = getInput(renderResult.container);
|
|
461
|
+
await openDropdown(input);
|
|
462
|
+
setContextValue({ status: 'LOADING', isLoading: true });
|
|
463
|
+
// Arm the 1s timer, then close before it fires.
|
|
464
|
+
act(() => {
|
|
465
|
+
jest.advanceTimersByTime(500);
|
|
466
|
+
});
|
|
467
|
+
// Close via Escape (wrapped in act, fake-timer-safe).
|
|
468
|
+
act(() => {
|
|
469
|
+
fireEvent.keyDown(input, { key: 'Escape' });
|
|
470
|
+
});
|
|
471
|
+
// Advance past the 1s mark.
|
|
472
|
+
act(() => {
|
|
473
|
+
jest.advanceTimersByTime(2000);
|
|
474
|
+
});
|
|
475
|
+
// Live region unmounted with the dropdown; nothing announced.
|
|
476
|
+
expect(getLiveRegion()).toBeNull();
|
|
477
|
+
// aria-busy no longer on any listbox (dropdown is closed).
|
|
478
|
+
const listbox = document.querySelector('[role="listbox"]');
|
|
479
|
+
expect(listbox === null || listbox.getAttribute('aria-busy') !== 'true').toBe(true);
|
|
480
|
+
}
|
|
481
|
+
finally {
|
|
482
|
+
jest.useRealTimers();
|
|
483
|
+
}
|
|
484
|
+
});
|
|
485
|
+
});
|
|
486
|
+
describe('Error state', () => {
|
|
487
|
+
it('T042: wires aria-invalid and aria-describedby when error prop is truthy', async () => {
|
|
488
|
+
const Context = createContext(makeContextValue({ status: 'READY', isLoading: false }));
|
|
489
|
+
const { container } = render(_jsx(BKJThemeProvider, { children: _jsx(Context.Provider, { value: makeContextValue({ status: 'READY', isLoading: false }), children: _jsx(BKJComboBoxAsync, { label: "Company", name: "company", type: "Single", action: "OpenToggle", value: undefined, searchValue: "", searchKey: "label", options: SAMPLE_OPTIONS, onChange: jest.fn(), onSearchChange: jest.fn(), context: Context, error: "Company is required" }) }) }));
|
|
490
|
+
const input = getInput(container);
|
|
491
|
+
expect(input.getAttribute('aria-invalid')).toBe('true');
|
|
492
|
+
const describedBy = input.getAttribute('aria-describedby');
|
|
493
|
+
expect(describedBy).toBeTruthy();
|
|
494
|
+
const errorNode = document.getElementById(describedBy);
|
|
495
|
+
expect(errorNode?.textContent).toContain('Company is required');
|
|
496
|
+
});
|
|
497
|
+
});
|
|
498
|
+
describe('No-regression smoke', () => {
|
|
499
|
+
it('T045: sync BKJComboBox axe baseline is unchanged or improved', async () => {
|
|
500
|
+
const { BKJComboBox } = await import('../BKJComboBox/index.js');
|
|
501
|
+
const { axeResults } = await renderAndCheckA11y(_jsx(BKJComboBox, { label: "Country", name: "country", type: "Single", action: "OpenToggle", filter: "AnyMatch", value: [], options: SAMPLE_OPTIONS, onChange: jest.fn() }));
|
|
502
|
+
// Sync was remediated in WEB-4811 — expect zero violations.
|
|
503
|
+
expect(axeResults).toHaveNoViolations();
|
|
504
|
+
});
|
|
505
|
+
it('T045: async multi-select axe baseline is unchanged or improved', async () => {
|
|
506
|
+
const Context = createContext(makeContextValue({ status: 'READY', isLoading: false }));
|
|
507
|
+
const { axeResults } = await renderAndCheckA11y(_jsx(Context.Provider, { value: makeContextValue({ status: 'READY', isLoading: false }), children: _jsx(BKJComboBoxAsync, { label: "Company", name: "company", type: "Multiple", action: "OpenToggle", value: undefined, searchValue: "", searchKey: "label", options: SAMPLE_OPTIONS, onChange: jest.fn(), onSearchChange: jest.fn(), context: Context }) }));
|
|
508
|
+
// Multi-select a11y is deferred to P1-F13/F14. Must not introduce
|
|
509
|
+
// new critical/serious violations.
|
|
510
|
+
const severe = (axeResults.violations || []).filter((v) => v.impact === 'critical' || v.impact === 'serious');
|
|
511
|
+
expect(severe).toEqual([]);
|
|
512
|
+
});
|
|
513
|
+
it('T046: non-breaking default — noResultsLabel falls back to i18next when unset', async () => {
|
|
514
|
+
// i18next is initialised in jest.setup.ts. Its test-env fallback
|
|
515
|
+
// for `translations:NO_RESULTS` is whatever the mock resolves — we
|
|
516
|
+
// assert the NoResults row's text matches exactly that, not a
|
|
517
|
+
// hardcoded English string.
|
|
518
|
+
const { default: i18next } = await import('i18next');
|
|
519
|
+
const expectedFallback = i18next.t('translations:NO_RESULTS');
|
|
520
|
+
const { renderResult } = renderWithMockContext({ options: [], searchValue: 'zzzz' }, { status: 'READY', isLoading: false });
|
|
521
|
+
const input = getInput(renderResult.container);
|
|
522
|
+
await openDropdown(input);
|
|
523
|
+
const noResults = document.querySelector('[role="listbox"] [role="option"][aria-disabled="true"]');
|
|
524
|
+
expect(noResults).toBeTruthy();
|
|
525
|
+
expect(noResults?.textContent).toContain(String(expectedFallback));
|
|
526
|
+
});
|
|
527
|
+
it('T046: noResultsLabel prop overrides the i18next fallback when supplied', async () => {
|
|
528
|
+
const { renderResult } = renderWithMockContext({
|
|
529
|
+
options: [],
|
|
530
|
+
searchValue: 'zzzz',
|
|
531
|
+
noResultsLabel: 'Aucun résultat',
|
|
532
|
+
}, { status: 'READY', isLoading: false });
|
|
533
|
+
const input = getInput(renderResult.container);
|
|
534
|
+
await openDropdown(input);
|
|
535
|
+
const noResults = document.querySelector('[role="listbox"] [role="option"][aria-disabled="true"]');
|
|
536
|
+
expect(noResults?.textContent).toContain('Aucun résultat');
|
|
537
|
+
});
|
|
538
|
+
it('T047: non-breaking defaults — loadingLabel / resultsCountLabel defaults', async () => {
|
|
539
|
+
jest.useFakeTimers();
|
|
540
|
+
try {
|
|
541
|
+
// Default loadingLabel.
|
|
542
|
+
const { renderResult, setContextValue } = renderWithMockContext({ options: [], searchValue: 'ac' }, { status: 'READY', isLoading: false });
|
|
543
|
+
const input = getInput(renderResult.container);
|
|
544
|
+
await openDropdown(input);
|
|
545
|
+
setContextValue({ status: 'LOADING', isLoading: true });
|
|
546
|
+
act(() => {
|
|
547
|
+
jest.advanceTimersByTime(1000);
|
|
548
|
+
});
|
|
549
|
+
expect(getLiveRegion()?.textContent).toBe('Loading results…');
|
|
550
|
+
}
|
|
551
|
+
finally {
|
|
552
|
+
jest.useRealTimers();
|
|
553
|
+
}
|
|
554
|
+
// Default resultsCountLabel — singular.
|
|
555
|
+
expect(resolveResultsCountLabel(undefined, 1)).toBe('1 result found');
|
|
556
|
+
// Default resultsCountLabel — plural.
|
|
557
|
+
expect(resolveResultsCountLabel(undefined, 5)).toBe('5 results found');
|
|
558
|
+
});
|
|
559
|
+
});
|
|
560
|
+
});
|
|
561
|
+
//# sourceMappingURL=BKJComboBoxAsync.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BKJComboBoxAsync.test.js","sourceRoot":"","sources":["../../../src/components/BKJComboBoxAsync/BKJComboBoxAsync.test.tsx"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,kEAAkE;AAClE,uEAAuE;AACvE,MAAM,kBAAkB;IACtB,OAAO,KAAU,CAAC;IAClB,SAAS,KAAU,CAAC;IACpB,UAAU,KAAU,CAAC;CACtB;AACA,UAAuE,CAAC,cAAc;IACrF,kBAAkB,CAAC;AACrB,MAAM,wBAAwB;IAC5B,YAAY,GAAiC;QAO7C;;;;mBAAuB,IAAI;WAAC;QAC5B;;;;mBAAa,EAAE;WAAC;QAChB;;;;mBAAoC,EAAE;WAAC;IATS,CAAC;IACjD,OAAO,KAAU,CAAC;IAClB,SAAS,KAAU,CAAC;IACpB,UAAU,KAAU,CAAC;IACrB,WAAW;QACT,OAAO,EAAE,CAAC;IACZ,CAAC;CAIF;AACA,UAAmF,CAAC,oBAAoB;IACvG,wBAAwB,CAAC;AAE3B,OAAO,EAAE,aAAa,EAAM,QAAQ,EAAE,MAAM,OAAO,CAAC;AACpD,OAAO,EAAE,GAAG,EAAE,MAAM,EAAgB,MAAM,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACtF,OAAO,SAAS,MAAM,6BAA6B,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AAEpE,MAAM,cAAc,GAAG;IACrB,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE;IAC7C,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE;IAC7C,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,YAAY,EAAE;CAC/C,CAAC;AAEF,MAAM,YAAY,GAAG;IACnB,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE;IACzC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE;IACzC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE;IAC3C,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE;IACzC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE;CACzC,CAAC;AAYF,MAAM,gBAAgB,GAAG,CAAC,YAAuC,EAAE,EAAoB,EAAE,CAAC,CAAC;IACzF,UAAU,EAAE,YAAY;IACxB,QAAQ,EAAE,GAAG,EAAE,CAAC,SAAS;IACzB,IAAI,EAAE,EAAE,QAAQ,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,EAAE;IAC1C,MAAM,EAAE,OAAO;IACf,KAAK,EAAE,GAAG,EAAE,CAAC,SAAS;IACtB,MAAM,EAAE,EAAE;IACV,SAAS,EAAE,KAAK;IAChB,GAAG,SAAS;CACb,CAAC,CAAC;AAEH;;;;GAIG;AACH,SAAS,qBAAqB,CAC5B,KAAsC,EACtC,sBAAiD,EAAE;IAQnD,MAAM,OAAO,GAAG,aAAa,CAAmB,gBAAgB,CAAC,mBAAmB,CAAC,CAAC,CAAC;IACvF,IAAI,uBAAuB,GAA8C,GAAG,EAAE,CAAC,SAAS,CAAC;IACzF,IAAI,kBAAkB,GAAsD,GAAG,EAAE,CAAC,SAAS,CAAC;IAC5F,IAAI,sBAAsB,GAA2B,GAAG,EAAE,CAAC,SAAS,CAAC;IACrE,MAAM,WAAW,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;IAE9B,MAAM,OAAO,GAAO,GAAG,EAAE;QACvB,MAAM,CAAC,YAAY,EAAE,oBAAoB,CAAC,GAAG,QAAQ,CACnD,gBAAgB,CAAC,mBAAmB,CAAC,CACtC,CAAC;QACF,MAAM,CAAC,OAAO,EAAE,eAAe,CAAC,GAAG,QAAQ,CACzC,KAAK,CAAC,OAAO,IAAI,EAAE,CACpB,CAAC;QACF,MAAM,CAAC,WAAW,EAAE,mBAAmB,CAAC,GAAG,QAAQ,CAAS,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;QACrF,uBAAuB,GAAG,CAAC,IAAI,EAAE,EAAE,CACjC,oBAAoB,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC;QACzD,kBAAkB,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QACrD,sBAAsB,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;QAC7D,OAAO,CACL,KAAC,OAAO,CAAC,QAAQ,IAAC,KAAK,EAAE,YAAY,YACnC,KAAC,gBAAgB,IACf,KAAK,EAAC,SAAS,EACf,IAAI,EAAC,SAAS,EACd,IAAI,EAAC,QAAQ,EACb,MAAM,EAAC,YAAY,EACnB,KAAK,EAAE,SAAS,EAChB,SAAS,EAAC,OAAO,EACjB,cAAc,EAAE,CAAC,GAAQ,EAAE,EAAE,CAAC,sBAAsB,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,KAClE,KAAK,EACT,OAAO,EAAE,OAAO,EAChB,WAAW,EAAE,WAAW,EACxB,QAAQ,EAAE,WAAW,EACrB,OAAO,EAAE,OAAc,GACvB,GACe,CACpB,CAAC;IACJ,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,MAAM,CACzB,KAAC,gBAAgB,cACf,KAAC,OAAO,KAAG,GACM,CACpB,CAAC;IAEF,OAAO;QACL,YAAY;QACZ,eAAe,EAAE,CAAC,IAAI,EAAE,EAAE,CACxB,GAAG,CAAC,GAAG,EAAE;YACP,uBAAuB,CAAC,IAAI,CAAC,CAAC;QAChC,CAAC,CAAC;QACJ,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE,CACnB,GAAG,CAAC,GAAG,EAAE;YACP,kBAAkB,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC,CAAC;QACJ,cAAc,EAAE,CAAC,IAAI,EAAE,EAAE,CACvB,GAAG,CAAC,GAAG,EAAE;YACP,sBAAsB,CAAC,IAAI,CAAC,CAAC;QAC/B,CAAC,CAAC;QACJ,WAAW;KACZ,CAAC;AACJ,CAAC;AAED,MAAM,YAAY,GAAG,KAAK,EAAE,KAAuB,EAAE,EAAE;IACrD,MAAM,GAAG,CAAC,KAAK,IAAI,EAAE;QACnB,KAAK,CAAC,KAAK,EAAE,CAAC;QACd,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;IAC1B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,QAAQ,GAAG,CAAC,SAAsB,EAAoB,EAAE,CAC5D,SAAS,CAAC,aAAa,CAAC,wBAAwB,CAAqB,CAAC;AAExE,MAAM,aAAa,GAAG,GAAuB,EAAE,CAC7C,QAAQ,CAAC,aAAa,CAAC,gDAAgD,CAAuB,CAAC;AAEjG,SAAS,CAAC,GAAG,EAAE;IACb,QAAQ,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC;AAC3E,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;QACnC,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;YAC5D,gEAAgE;YAChE,kDAAkD;YAClD,MAAM,OAAO,GAAG,aAAa,CAAC,gBAAgB,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;YACvF,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,GAAG,MAAM,kBAAkB,CAC3D,KAAC,OAAO,CAAC,QAAQ,IAAC,KAAK,EAAE,gBAAgB,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,YAC9E,KAAC,gBAAgB,IACf,KAAK,EAAC,SAAS,EACf,IAAI,EAAC,SAAS,EACd,IAAI,EAAC,QAAQ,EACb,MAAM,EAAC,YAAY,EACnB,KAAK,EAAE,SAAS,EAChB,WAAW,EAAC,EAAE,EACd,SAAS,EAAC,OAAO,EACjB,OAAO,EAAE,cAAqB,EAC9B,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE,EACnB,cAAc,EAAE,IAAI,CAAC,EAAE,EAAE,EACzB,OAAO,EAAE,OAAc,GACvB,GACe,CACpB,CAAC;YACF,MAAM,CAAC,UAAU,CAAC,CAAC,kBAAkB,EAAE,CAAC;YACxC,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,gBAAgB,CAAC,mBAAmB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACrF,wCAAwC;YACxC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,kBAAkB,CAAC,EAAE,YAAY,CAAC,aAAa,CAAC,KAAK,OAAO;mBACrF,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC;QAC5D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;YAC5D,MAAM,OAAO,GAAG,aAAa,CAC3B,gBAAgB,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CACzD,CAAC;YACF,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,kBAAkB,CAC7C,KAAC,OAAO,CAAC,QAAQ,IAAC,KAAK,EAAE,gBAAgB,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,YAC/E,KAAC,gBAAgB,IACf,KAAK,EAAC,SAAS,EACf,IAAI,EAAC,SAAS,EACd,IAAI,EAAC,QAAQ,EACb,MAAM,EAAC,YAAY,EACnB,KAAK,EAAE,SAAS,EAChB,WAAW,EAAC,IAAI,EAChB,SAAS,EAAC,OAAO,EACjB,OAAO,EAAE,EAAE,EACX,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE,EACnB,cAAc,EAAE,IAAI,CAAC,EAAE,EAAE,EACzB,OAAO,EAAE,OAAc,GACvB,GACe,CACpB,CAAC;YACF,MAAM,CAAC,UAAU,CAAC,CAAC,kBAAkB,EAAE,CAAC;QAC1C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;YACxE,MAAM,OAAO,GAAG,aAAa,CAAC,gBAAgB,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;YACvF,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,GAAG,MAAM,kBAAkB,CAC3D,KAAC,OAAO,CAAC,QAAQ,IAAC,KAAK,EAAE,gBAAgB,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,YAC9E,KAAC,gBAAgB,IACf,KAAK,EAAC,SAAS,EACf,IAAI,EAAC,SAAS,EACd,IAAI,EAAC,QAAQ,EACb,MAAM,EAAC,YAAY,EACnB,KAAK,EAAE,SAAS,EAChB,WAAW,EAAC,EAAE,EACd,SAAS,EAAC,OAAO,EACjB,OAAO,EAAE,cAAqB,EAC9B,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE,EACnB,cAAc,EAAE,IAAI,CAAC,EAAE,EAAE,EACzB,OAAO,EAAE,OAAc,GACvB,GACe,CACpB,CAAC;YACF,MAAM,KAAK,GAAG,QAAQ,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;YAC/C,MAAM,YAAY,CAAC,KAAK,CAAC,CAAC;YAC1B,yEAAyE;YACzE,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;YACzC,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;YAClD,MAAM,CAAC,OAAO,CAAC,CAAC,kBAAkB,EAAE,CAAC;YACrC,MAAM,CAAC,UAAU,CAAC,CAAC,kBAAkB,EAAE,CAAC;QAC1C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;YAC1D,MAAM,OAAO,GAAG,aAAa,CAAC,gBAAgB,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;YACvF,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,kBAAkB,CAC/C,KAAC,OAAO,CAAC,QAAQ,IAAC,KAAK,EAAE,gBAAgB,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,YAC9E,KAAC,gBAAgB,IACf,KAAK,EAAC,SAAS,EACf,IAAI,EAAC,SAAS,EACd,IAAI,EAAC,QAAQ,EACb,MAAM,EAAC,YAAY,EACnB,KAAK,EAAE,SAAS,EAChB,WAAW,EAAC,MAAM,EAClB,SAAS,EAAC,OAAO,EACjB,OAAO,EAAE,EAAE,EACX,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE,EACnB,cAAc,EAAE,IAAI,CAAC,EAAE,EAAE,EACzB,OAAO,EAAE,OAAc,GACvB,GACe,CACpB,CAAC;YACF,MAAM,KAAK,GAAG,QAAQ,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;YAC/C,MAAM,YAAY,CAAC,KAAK,CAAC,CAAC;YAC1B,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;YACzC,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;YAClD,MAAM,CAAC,OAAO,CAAC,CAAC,kBAAkB,EAAE,CAAC;QACvC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,6CAA6C,EAAE,GAAG,EAAE;QAC3D,EAAE,CAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;YACnF,MAAM,EAAE,YAAY,EAAE,eAAe,EAAE,GAAG,qBAAqB,CAC7D,EAAE,OAAO,EAAE,EAAS,EAAE,WAAW,EAAE,IAAI,EAAE,EACzC,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,CACvC,CAAC;YACF,MAAM,KAAK,GAAG,QAAQ,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;YAC/C,MAAM,YAAY,CAAC,KAAK,CAAC,CAAC;YAC1B,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,kBAAkB,CAAgB,CAAC;YAC1E,MAAM,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,CAAC;YAC7B,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACvD,yBAAyB;YACzB,eAAe,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;YACvD,MAAM,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC,kBAAkB,CAAgB,CAAC;YAC/E,MAAM,CAAC,YAAY,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;YACxE,IAAI,CAAC,aAAa,EAAE,CAAC;YACrB,IAAI,CAAC;gBACH,MAAM,EAAE,YAAY,EAAE,eAAe,EAAE,UAAU,EAAE,GAAG,qBAAqB,CACzE,EAAE,OAAO,EAAE,EAAS,EAAE,WAAW,EAAE,IAAI,EAAE,EACzC,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CACtC,CAAC;gBACF,MAAM,KAAK,GAAG,QAAQ,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;gBAC/C,MAAM,YAAY,CAAC,KAAK,CAAC,CAAC;gBAC1B,iBAAiB;gBACjB,eAAe,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBACxD,GAAG,CAAC,GAAG,EAAE;oBACP,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;gBAChC,CAAC,CAAC,CAAC;gBACH,MAAM,CAAC,aAAa,EAAE,EAAE,WAAW,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACpD,qBAAqB;gBACrB,UAAU,CAAC,cAAqB,CAAC,CAAC;gBAClC,eAAe,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;gBACvD,yEAAyE;gBACzE,MAAM,CAAC,aAAa,EAAE,EAAE,WAAW,CAAC,CAAC,IAAI,CACvC,wBAAwB,CAAC,SAAS,EAAE,cAAc,CAAC,MAAM,CAAC,CAC3D,CAAC;YACJ,CAAC;oBAAS,CAAC;gBACT,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;YACvE,IAAI,CAAC,aAAa,EAAE,CAAC;YACrB,IAAI,CAAC;gBACH,MAAM,EAAE,YAAY,EAAE,eAAe,EAAE,GAAG,qBAAqB,CAC7D,EAAE,OAAO,EAAE,EAAS,EAAE,WAAW,EAAE,IAAI,EAAE,EACzC,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CACtC,CAAC;gBACF,MAAM,KAAK,GAAG,QAAQ,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;gBAC/C,MAAM,YAAY,CAAC,KAAK,CAAC,CAAC;gBAC1B,eAAe,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBACxD,GAAG,CAAC,GAAG,EAAE;oBACP,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;gBAChC,CAAC,CAAC,CAAC;gBACH,MAAM,CAAC,aAAa,EAAE,EAAE,WAAW,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACpD,GAAG,CAAC,GAAG,EAAE;oBACP,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;gBAC9B,CAAC,CAAC,CAAC;gBACH,MAAM,CAAC,aAAa,EAAE,EAAE,WAAW,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;gBAC9D,mEAAmE;gBACnE,GAAG,CAAC,GAAG,EAAE;oBACP,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;gBACjC,CAAC,CAAC,CAAC;gBACH,MAAM,CAAC,aAAa,EAAE,EAAE,WAAW,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YAChE,CAAC;oBAAS,CAAC;gBACT,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4EAA4E,EAAE,KAAK,IAAI,EAAE;YAC1F,IAAI,CAAC,aAAa,EAAE,CAAC;YACrB,IAAI,CAAC;gBACH,MAAM,EAAE,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,GAAG,qBAAqB,CAC7E,EAAE,OAAO,EAAE,EAAS,EAAE,WAAW,EAAE,EAAE,EAAE,EACvC,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CACtC,CAAC;gBACF,MAAM,KAAK,GAAG,QAAQ,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;gBAC/C,MAAM,YAAY,CAAC,KAAK,CAAC,CAAC;gBAC1B,eAAe,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBACxD,MAAM,MAAM,GAAa,EAAE,CAAC;gBAC5B,+DAA+D;gBAC/D,6DAA6D;gBAC7D,oBAAoB;gBACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC5B,GAAG,CAAC,GAAG,EAAE;wBACP,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;wBACxB,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;oBAChC,CAAC,CAAC,CAAC;oBACH,MAAM,IAAI,GAAG,aAAa,EAAE,EAAE,WAAW,IAAI,EAAE,CAAC;oBAChD,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;wBAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACnE,CAAC;gBACD,+DAA+D;gBAC/D,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC;YAC/C,CAAC;oBAAS,CAAC;gBACT,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mGAAmG,EAAE,KAAK,IAAI,EAAE;YACjH,MAAM,EAAE,YAAY,EAAE,GAAG,qBAAqB,CAC5C,EAAE,OAAO,EAAE,EAAS,EAAE,WAAW,EAAE,IAAI,EAAE,EACzC,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,CACvC,CAAC;YACF,MAAM,KAAK,GAAG,QAAQ,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;YAC/C,MAAM,YAAY,CAAC,KAAK,CAAC,CAAC;YAC1B,4DAA4D;YAC5D,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CACnC,sDAAsD,CACjC,CAAC;YACxB,MAAM,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,CAAC;YAC5B,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC3D,2DAA2D;YAC3D,MAAM,MAAM,GAAG,KAAK,CAAC,YAAY,CAAC,uBAAuB,CAAC,CAAC;YAC3D,IAAI,MAAM,IAAI,MAAM,EAAE,EAAE,EAAE,CAAC;gBACzB,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACrC,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;QAC/C,EAAE,CAAC,+EAA+E,EAAE,KAAK,IAAI,EAAE;YAC7F,MAAM,EAAE,YAAY,EAAE,GAAG,qBAAqB,CAC5C,EAAE,OAAO,EAAE,EAAS,EAAE,WAAW,EAAE,MAAM,EAAE,EAC3C,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CACtC,CAAC;YACF,MAAM,KAAK,GAAG,QAAQ,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;YAC/C,MAAM,YAAY,CAAC,KAAK,CAAC,CAAC;YAC1B,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAa,CACtC,wDAAwD,CACnC,CAAC;YACxB,MAAM,CAAC,SAAS,CAAC,CAAC,UAAU,EAAE,CAAC;YAC/B,sDAAsD;YACtD,MAAM,UAAU,GAAG,QAAQ,CAAC,gBAAgB,CAAC,kCAAkC,CAAC,CAAC;YACjF,sEAAsE;YACtE,8DAA8D;YAC9D,yBAAyB;YACzB,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;YAC1E,MAAM,EAAE,YAAY,EAAE,eAAe,EAAE,UAAU,EAAE,GAAG,qBAAqB,CACzE,EAAE,OAAO,EAAE,EAAS,EAAE,WAAW,EAAE,IAAI,EAAE,EACzC,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,CACvC,CAAC;YACF,MAAM,KAAK,GAAG,QAAQ,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;YAC/C,MAAM,YAAY,CAAC,KAAK,CAAC,CAAC;YAC1B,iBAAiB;YACjB,UAAU,CAAC,EAAE,CAAC,CAAC;YACf,eAAe,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;YACvD,iEAAiE;YACjE,sDAAsD;YACtD,MAAM,QAAQ,GAAG,aAAa,EAAE,EAAE,WAAW,IAAI,EAAE,CAAC;YACpD,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oFAAoF,EAAE,KAAK,IAAI,EAAE;YAClG,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,GAAG,qBAAqB,CACzD,EAAE,OAAO,EAAE,EAAS,EAAE,WAAW,EAAE,MAAM,EAAE,EAC3C,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CACtC,CAAC;YACF,MAAM,KAAK,GAAG,QAAQ,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;YAC/C,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC;YAC/B,MAAM,YAAY,CAAC,KAAK,CAAC,CAAC;YAC1B,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAa,CACtC,wDAAwD,CACnC,CAAC;YACxB,MAAM,CAAC,SAAS,CAAC,CAAC,UAAU,EAAE,CAAC;YAC/B,MAAM,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;YACnC,MAAM,MAAM,GAAG,KAAK,CAAC,YAAY,CAAC,uBAAuB,CAAC,CAAC;YAC3D,IAAI,MAAM,IAAI,SAAS,EAAE,EAAE,EAAE,CAAC;gBAC5B,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YACxC,CAAC;YACD,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;YAC/B,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wEAAwE,EAAE,KAAK,IAAI,EAAE;YACtF,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,GAAG,qBAAqB,CACxD,EAAE,OAAO,EAAE,EAAS,EAAE,WAAW,EAAE,MAAM,EAAE,EAC3C,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CACtC,CAAC;YACF,MAAM,KAAK,GAAG,QAAQ,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;YAC/C,MAAM,YAAY,CAAC,KAAK,CAAC,CAAC;YAC1B,mCAAmC;YACnC,MAAM,CACJ,QAAQ,CAAC,aAAa,CAAC,wDAAwD,CAAC,CACjF,CAAC,UAAU,EAAE,CAAC;YACf,qCAAqC;YACrC,UAAU,CAAC,cAAqB,CAAC,CAAC;YAClC,+CAA+C;YAC/C,MAAM,OAAO,GAAG,QAAQ,CAAC,gBAAgB,CAAC,kCAAkC,CAAC,CAAC;YAC9E,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;YACnD,MAAM,aAAa,GAAG,CAAC,QAAQ,CAAC,aAAa,CAC3C,wDAAwD,CACzD,CAAC;YACF,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6FAA6F,EAAE,KAAK,IAAI,EAAE;YAC3G,IAAI,CAAC,aAAa,EAAE,CAAC;YACrB,IAAI,CAAC;gBACH,MAAM,EAAE,YAAY,EAAE,eAAe,EAAE,UAAU,EAAE,GAAG,qBAAqB,CACzE,EAAE,OAAO,EAAE,EAAS,EAAE,WAAW,EAAE,IAAI,EAAE,EACzC,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CACtC,CAAC;gBACF,MAAM,KAAK,GAAG,QAAQ,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;gBAC/C,MAAM,YAAY,CAAC,KAAK,CAAC,CAAC;gBAC1B,4BAA4B;gBAC5B,eAAe,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBACxD,GAAG,CAAC,GAAG,EAAE;oBACP,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;gBAChC,CAAC,CAAC,CAAC;gBACH,UAAU,CAAC,YAAmB,CAAC,CAAC;gBAChC,eAAe,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;gBACvD,MAAM,CAAC,aAAa,EAAE,EAAE,WAAW,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC;gBAClF,kEAAkE;gBAClE,eAAe,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBACxD,GAAG,CAAC,GAAG,EAAE;oBACP,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;gBAChC,CAAC,CAAC,CAAC;gBACH,8CAA8C;gBAC9C,UAAU,CAAC,YAAmB,CAAC,CAAC;gBAChC,eAAe,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;gBACvD,MAAM,CAAC,aAAa,EAAE,EAAE,WAAW,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC;YACpF,CAAC;oBAAS,CAAC;gBACT,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,wCAAwC,EAAE,GAAG,EAAE;QACtD,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;YAChE,MAAM,EAAE,YAAY,EAAE,GAAG,qBAAqB,CAC5C,EAAE,OAAO,EAAE,cAAqB,EAAE,WAAW,EAAE,EAAE,EAAE,EACnD,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CACtC,CAAC;YACF,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,gBAAgB,CAAC,mBAAmB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACvF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uEAAuE,EAAE,KAAK,IAAI,EAAE;YACrF,MAAM,EAAE,YAAY,EAAE,eAAe,EAAE,GAAG,qBAAqB,CAC7D,EAAE,OAAO,EAAE,cAAqB,EAAE,WAAW,EAAE,EAAE,EAAE,EACnD,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CACtC,CAAC;YACF,MAAM,KAAK,GAAG,QAAQ,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;YAC/C,MAAM,YAAY,CAAC,KAAK,CAAC,CAAC;YAC1B,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,kBAAkB,CAAgB,CAAC;YAC1E,MAAM,QAAQ,GAAG,KAAK,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC;YACrD,MAAM,KAAK,GAAG,OAAO,CAAC,EAAE,CAAC;YACzB,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC7B,sDAAsD;YACtD,eAAe,CAAC,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;YAChE,MAAM,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC,kBAAkB,CAAgB,CAAC;YAC/E,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACpC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uEAAuE,EAAE,KAAK,IAAI,EAAE;YACrF,MAAM,EAAE,YAAY,EAAE,GAAG,qBAAqB,CAC5C,EAAE,OAAO,EAAE,cAAqB,EAAE,WAAW,EAAE,EAAE,EAAE,EACnD,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CACtC,CAAC;YACF,MAAM,KAAK,GAAG,QAAQ,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;YAC/C,MAAM,YAAY,CAAC,KAAK,CAAC,CAAC;YAC1B,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC3C,+DAA+D;YAC/D,MAAM,WAAW,GAAG,QAAQ,CAAC,gBAAgB,CAAC,kCAAkC,CAAC,CAAC,CAAC,CAAC,CAAC;YACrF,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,uBAAuB,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QAC3E,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wFAAwF,EAAE,KAAK,IAAI,EAAE;YACtG,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,GAAG,qBAAqB,CACzD,EAAE,OAAO,EAAE,cAAqB,EAAE,WAAW,EAAE,EAAE,EAAE,EACnD,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CACtC,CAAC;YACF,MAAM,KAAK,GAAG,QAAQ,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;YAC/C,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC;YAC/B,MAAM,YAAY,CAAC,KAAK,CAAC,CAAC;YAC1B,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;YAC/B,MAAM,CAAC,WAAW,CAAC,CAAC,gBAAgB,EAAE,CAAC;YACvC,kDAAkD;YAClD,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;YAC5D,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,GAAG,qBAAqB,CACzD,EAAE,OAAO,EAAE,cAAqB,EAAE,WAAW,EAAE,EAAE,EAAE,EACnD,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CACtC,CAAC;YACF,MAAM,KAAK,GAAG,QAAQ,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;YAC/C,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC;YAC/B,MAAM,YAAY,CAAC,KAAK,CAAC,CAAC;YAC1B,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACzD,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YAChC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC1D,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qFAAqF,EAAE,KAAK,IAAI,EAAE;YACnG,MAAM,EAAE,YAAY,EAAE,GAAG,qBAAqB,CAC5C,EAAE,OAAO,EAAE,cAAqB,EAAE,WAAW,EAAE,EAAE,EAAE,EACnD,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CACtC,CAAC;YACF,MAAM,KAAK,GAAG,QAAQ,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;YAC/C,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC;YAC/B,MAAM,YAAY,CAAC,KAAK,CAAC,CAAC;YAC1B,0EAA0E;YAC1E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC/C,MAAM,MAAM,GAAG,KAAK,CAAC,YAAY,CAAC,uBAAuB,CAAC,CAAC;gBAC3D,MAAM,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,CAAC;gBAC5B,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,MAAgB,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;gBACjE,MAAM,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;YACrC,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iGAAiG,EAAE,KAAK,IAAI,EAAE;YAC/G,IAAI,CAAC,aAAa,EAAE,CAAC;YACrB,IAAI,CAAC;gBACH,MAAM,EAAE,YAAY,EAAE,eAAe,EAAE,UAAU,EAAE,cAAc,EAAE,GACjE,qBAAqB,CACnB,EAAE,OAAO,EAAE,EAAS,EAAE,WAAW,EAAE,EAAE,EAAE,EACvC,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CACtC,CAAC;gBACJ,MAAM,KAAK,GAAG,QAAQ,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;gBAC/C,MAAM,YAAY,CAAC,KAAK,CAAC,CAAC;gBAC1B,iEAAiE;gBACjE,2CAA2C;gBAC3C,eAAe,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBACxD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC3B,GAAG,CAAC,GAAG,EAAE;wBACP,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;wBACxB,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;oBAChC,CAAC,CAAC,CAAC;gBACL,CAAC;gBACD,gDAAgD;gBAChD,MAAM,eAAe,GAAG,aAAa,EAAE,EAAE,WAAW,IAAI,EAAE,CAAC;gBAC3D,MAAM,0BAA0B,GAAG,eAAe,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;gBAC9G,MAAM,CAAC,0BAA0B,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC/C,wBAAwB;gBACxB,UAAU,CAAC,YAAmB,CAAC,CAAC;gBAChC,eAAe,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;gBACvD,GAAG,CAAC,GAAG,EAAE;oBACP,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;gBAC9B,CAAC,CAAC,CAAC;gBACH,MAAM,CAAC,aAAa,EAAE,EAAE,WAAW,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC;YACpF,CAAC;oBAAS,CAAC;gBACT,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4FAA4F,EAAE,KAAK,IAAI,EAAE;YAC1G,IAAI,CAAC,aAAa,EAAE,CAAC;YACrB,IAAI,CAAC;gBACH,+DAA+D;gBAC/D,6DAA6D;gBAC7D,wDAAwD;gBACxD,MAAM,EAAE,YAAY,EAAE,eAAe,EAAE,GAAG,qBAAqB,CAC7D,EAAE,OAAO,EAAE,EAAS,EAAE,WAAW,EAAE,EAAE,EAAE,EACvC,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CACtC,CAAC;gBACF,MAAM,KAAK,GAAG,QAAQ,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;gBAC/C,MAAM,YAAY,CAAC,KAAK,CAAC,CAAC;gBAC1B,eAAe,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBACxD,gDAAgD;gBAChD,GAAG,CAAC,GAAG,EAAE;oBACP,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;gBAChC,CAAC,CAAC,CAAC;gBACH,sDAAsD;gBACtD,GAAG,CAAC,GAAG,EAAE;oBACP,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC;gBAC9C,CAAC,CAAC,CAAC;gBACH,4BAA4B;gBAC5B,GAAG,CAAC,GAAG,EAAE;oBACP,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;gBACjC,CAAC,CAAC,CAAC;gBACH,8DAA8D;gBAC9D,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;gBACnC,2DAA2D;gBAC3D,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,kBAAkB,CAAC,CAAC;gBAC3D,MAAM,CAAC,OAAO,KAAK,IAAI,IAAI,OAAO,CAAC,YAAY,CAAC,WAAW,CAAC,KAAK,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtF,CAAC;oBAAS,CAAC;gBACT,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;QAC3B,EAAE,CAAC,yEAAyE,EAAE,KAAK,IAAI,EAAE;YACvF,MAAM,OAAO,GAAG,aAAa,CAAC,gBAAgB,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;YACvF,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAC1B,KAAC,gBAAgB,cACf,KAAC,OAAO,CAAC,QAAQ,IAAC,KAAK,EAAE,gBAAgB,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,YAC9E,KAAC,gBAAgB,IACf,KAAK,EAAC,SAAS,EACf,IAAI,EAAC,SAAS,EACd,IAAI,EAAC,QAAQ,EACb,MAAM,EAAC,YAAY,EACnB,KAAK,EAAE,SAAS,EAChB,WAAW,EAAC,EAAE,EACd,SAAS,EAAC,OAAO,EACjB,OAAO,EAAE,cAAqB,EAC9B,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE,EACnB,cAAc,EAAE,IAAI,CAAC,EAAE,EAAE,EACzB,OAAO,EAAE,OAAc,EACvB,KAAK,EAAC,qBAAqB,GAC3B,GACe,GACF,CACpB,CAAC;YACF,MAAM,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;YAClC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACxD,MAAM,WAAW,GAAG,KAAK,CAAC,YAAY,CAAC,kBAAkB,CAAC,CAAC;YAC3D,MAAM,CAAC,WAAW,CAAC,CAAC,UAAU,EAAE,CAAC;YACjC,MAAM,SAAS,GAAG,QAAQ,CAAC,cAAc,CAAC,WAAqB,CAAC,CAAC;YACjE,MAAM,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;QACnC,EAAE,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;YAC5E,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;YACvD,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,kBAAkB,CAC7C,KAAC,WAAW,IACV,KAAK,EAAC,SAAS,EACf,IAAI,EAAC,SAAS,EACd,IAAI,EAAC,QAAQ,EACb,MAAM,EAAC,YAAY,EACnB,MAAM,EAAC,UAAU,EACjB,KAAK,EAAE,EAAE,EACT,OAAO,EAAE,cAAqB,EAC9B,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE,GACnB,CACH,CAAC;YACF,4DAA4D;YAC5D,MAAM,CAAC,UAAU,CAAC,CAAC,kBAAkB,EAAE,CAAC;QAC1C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;YAC9E,MAAM,OAAO,GAAG,aAAa,CAAC,gBAAgB,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;YACvF,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,kBAAkB,CAC7C,KAAC,OAAO,CAAC,QAAQ,IAAC,KAAK,EAAE,gBAAgB,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,YAC9E,KAAC,gBAAgB,IACf,KAAK,EAAC,SAAS,EACf,IAAI,EAAC,SAAS,EACd,IAAI,EAAC,UAAU,EACf,MAAM,EAAC,YAAY,EACnB,KAAK,EAAE,SAAS,EAChB,WAAW,EAAC,EAAE,EACd,SAAS,EAAC,OAAO,EACjB,OAAO,EAAE,cAAqB,EAC9B,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE,EACnB,cAAc,EAAE,IAAI,CAAC,EAAE,EAAE,EACzB,OAAO,EAAE,OAAc,GACvB,GACe,CACpB,CAAC;YACF,kEAAkE;YAClE,mCAAmC;YACnC,MAAM,MAAM,GAAG,CAAC,UAAU,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,MAAM,CACjD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,UAAU,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS,CACzD,CAAC;YACF,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8EAA8E,EAAE,KAAK,IAAI,EAAE;YAC5F,iEAAiE;YACjE,mEAAmE;YACnE,8DAA8D;YAC9D,4BAA4B;YAC5B,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;YACrD,MAAM,gBAAgB,GAAG,OAAO,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC;YAC9D,MAAM,EAAE,YAAY,EAAE,GAAG,qBAAqB,CAC5C,EAAE,OAAO,EAAE,EAAS,EAAE,WAAW,EAAE,MAAM,EAAE,EAC3C,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CACtC,CAAC;YACF,MAAM,KAAK,GAAG,QAAQ,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;YAC/C,MAAM,YAAY,CAAC,KAAK,CAAC,CAAC;YAC1B,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAa,CACtC,wDAAwD,CACnC,CAAC;YACxB,MAAM,CAAC,SAAS,CAAC,CAAC,UAAU,EAAE,CAAC;YAC/B,MAAM,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC;QACrE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wEAAwE,EAAE,KAAK,IAAI,EAAE;YACtF,MAAM,EAAE,YAAY,EAAE,GAAG,qBAAqB,CAC5C;gBACE,OAAO,EAAE,EAAS;gBAClB,WAAW,EAAE,MAAM;gBACnB,cAAc,EAAE,gBAAgB;aACjC,EACD,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CACtC,CAAC;YACF,MAAM,KAAK,GAAG,QAAQ,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;YAC/C,MAAM,YAAY,CAAC,KAAK,CAAC,CAAC;YAC1B,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAa,CACtC,wDAAwD,CACnC,CAAC;YACxB,MAAM,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yEAAyE,EAAE,KAAK,IAAI,EAAE;YACvF,IAAI,CAAC,aAAa,EAAE,CAAC;YACrB,IAAI,CAAC;gBACH,wBAAwB;gBACxB,MAAM,EAAE,YAAY,EAAE,eAAe,EAAE,GAAG,qBAAqB,CAC7D,EAAE,OAAO,EAAE,EAAS,EAAE,WAAW,EAAE,IAAI,EAAE,EACzC,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CACtC,CAAC;gBACF,MAAM,KAAK,GAAG,QAAQ,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;gBAC/C,MAAM,YAAY,CAAC,KAAK,CAAC,CAAC;gBAC1B,eAAe,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBACxD,GAAG,CAAC,GAAG,EAAE;oBACP,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;gBACjC,CAAC,CAAC,CAAC;gBACH,MAAM,CAAC,aAAa,EAAE,EAAE,WAAW,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YAChE,CAAC;oBAAS,CAAC;gBACT,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,CAAC;YACD,wCAAwC;YACxC,MAAM,CAAC,wBAAwB,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YACtE,sCAAsC;YACtC,MAAM,CAAC,wBAAwB,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACzE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|