@libs-ui/components-spreadsheet 0.2.356-43

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.
@@ -0,0 +1,204 @@
1
+ import { BooleanNumber } from '@univerjs/core';
2
+ /** Style mặc định cho cột đã map: nền xanh, chữ trắng, bold, canh giữa. */
3
+ const DEFAULT_MAPPED_STYLE = {
4
+ bg: { rgb: '#389E0D' },
5
+ cl: { rgb: '#FFFFFF' },
6
+ bl: BooleanNumber.TRUE,
7
+ ht: 2,
8
+ vt: 2,
9
+ fs: 11,
10
+ };
11
+ /**
12
+ * Config mặc định của lib — consumer có thể dùng trực tiếp hoặc spread-override:
13
+ * `{ ...defaultMappingIndicatorConfig(), prefix: '★ ' }`.
14
+ */
15
+ export const defaultMappingIndicatorConfig = () => ({
16
+ mappedStyleId: 'm',
17
+ mappedStyle: { ...DEFAULT_MAPPED_STYLE },
18
+ defaultHeaderStyleId: 'h',
19
+ prefix: '● ',
20
+ headerRowIndex: 0,
21
+ autoResize: true,
22
+ charWidth: 7.5,
23
+ padding: 16,
24
+ });
25
+ const DEFAULT_PREFIX = '● ';
26
+ const DEFAULT_CHAR_W = 7.5;
27
+ const DEFAULT_PADDING = 16;
28
+ const DEFAULT_COL_W = 80;
29
+ const DEFAULT_MAPPED_STYLE_ID = 'm';
30
+ const DEFAULT_HEADER_STYLE_ID = 'h';
31
+ /** Workbook snapshot là plain JSON — clone an toàn nhất bằng JSON. */
32
+ const cloneSnapshot = (snapshot) => JSON.parse(JSON.stringify(snapshot));
33
+ const resolveOpts = (config) => ({
34
+ mappedStyleId: config.mappedStyleId ?? DEFAULT_MAPPED_STYLE_ID,
35
+ mappedStyle: config.mappedStyle ?? DEFAULT_MAPPED_STYLE,
36
+ defaultHeaderStyleId: config.defaultHeaderStyleId ?? DEFAULT_HEADER_STYLE_ID,
37
+ prefix: config.prefix ?? DEFAULT_PREFIX,
38
+ headerRowKey: String(config.headerRowIndex ?? 0),
39
+ autoResize: config.autoResize ?? true,
40
+ charWidth: config.charWidth ?? DEFAULT_CHAR_W,
41
+ padding: config.padding ?? DEFAULT_PADDING,
42
+ });
43
+ const estimateWidth = (text, opts) => Math.ceil(text.length * opts.charWidth + opts.padding);
44
+ /** Mở rộng width cột cho vừa text (không thu nhỏ hơn width hiện tại). */
45
+ const expandColWidth = (sheet, colKey, text, opts) => {
46
+ const colData = sheet.columnData;
47
+ if (!colData)
48
+ return;
49
+ const current = colData[colKey]?.w ?? DEFAULT_COL_W;
50
+ colData[colKey] = { ...(colData[colKey] ?? {}), w: Math.max(current, estimateWidth(text, opts)) };
51
+ };
52
+ /**
53
+ * Dọn header row của 1 sheet: revert style về mặc định, xóa prefix, khôi phục width.
54
+ * @param onlyMapped true → chỉ revert ô đang là `mappedStyleId`; false → revert mọi ô có style.
55
+ */
56
+ const resetHeaderRow = (sheet, opts, onlyMapped) => {
57
+ const headerRow = sheet?.cellData?.[opts.headerRowKey];
58
+ if (!headerRow || !sheet)
59
+ return;
60
+ for (const colKey of Object.keys(headerRow)) {
61
+ const cell = headerRow[colKey];
62
+ if (!cell)
63
+ continue;
64
+ if (onlyMapped) {
65
+ if (cell.s === opts.mappedStyleId)
66
+ cell.s = opts.defaultHeaderStyleId;
67
+ }
68
+ else if (cell.s) {
69
+ cell.s = opts.defaultHeaderStyleId;
70
+ }
71
+ if (typeof cell.v === 'string' && cell.v.startsWith(opts.prefix)) {
72
+ const original = cell.v.slice(opts.prefix.length);
73
+ cell.v = original;
74
+ if (opts.autoResize && sheet.columnData?.[colKey]) {
75
+ sheet.columnData[colKey].w = estimateWidth(original, opts);
76
+ }
77
+ }
78
+ }
79
+ };
80
+ // ─────────────────────────────────────────────────────────────────────────────
81
+ // Public API
82
+ // ─────────────────────────────────────────────────────────────────────────────
83
+ /**
84
+ * Đánh dấu header các cột đã map: gắn style `mappedStyleId`, thêm prefix icon và
85
+ * (tùy chọn) tự nới width. Tự reset các sheet trong scope trước để mapping cũ không sót lại.
86
+ *
87
+ * @param snapshot Workbook snapshot (plain JSON). Không bị mutate — trả về bản clone.
88
+ * @param targets Danh sách cột cần đánh dấu (`{ sheetId, colIndex }`).
89
+ * @param config Cấu hình style / prefix / scope. Bỏ trống = dùng default của lib.
90
+ */
91
+ export const applyMappingIndicators = (snapshot, targets, config = {}) => {
92
+ const data = cloneSnapshot(snapshot);
93
+ const opts = resolveOpts(config);
94
+ const styles = data['styles'];
95
+ if (styles && !styles[opts.mappedStyleId]) {
96
+ styles[opts.mappedStyleId] = { ...opts.mappedStyle };
97
+ }
98
+ const sheets = data['sheets'];
99
+ if (!sheets)
100
+ return data;
101
+ const scope = config.scopeSheetIds ?? Object.keys(sheets);
102
+ for (const sheetId of scope) {
103
+ resetHeaderRow(sheets[sheetId], opts, false);
104
+ }
105
+ for (const target of targets) {
106
+ const sheet = sheets[target.sheetId];
107
+ const cell = sheet?.cellData?.[opts.headerRowKey]?.[String(target.colIndex)];
108
+ if (!cell || !sheet)
109
+ continue;
110
+ cell.s = opts.mappedStyleId;
111
+ if (typeof cell.v === 'string' && !cell.v.startsWith(opts.prefix)) {
112
+ const withIcon = `${opts.prefix}${cell.v}`;
113
+ cell.v = withIcon;
114
+ if (opts.autoResize)
115
+ expandColWidth(sheet, String(target.colIndex), withIcon, opts);
116
+ }
117
+ }
118
+ return data;
119
+ };
120
+ /**
121
+ * Gỡ toàn bộ indicator ('m' → default style, xóa prefix, khôi phục width) khỏi snapshot
122
+ * — dùng trước khi gửi workbook lên server để data sạch, không chứa style UI nội bộ.
123
+ *
124
+ * @param snapshot Workbook snapshot (plain JSON). Không bị mutate — trả về bản clone.
125
+ * @param config Dùng chung config với `applyMappingIndicators` để gỡ đúng style/prefix.
126
+ * Bỏ trống = dùng default của lib.
127
+ */
128
+ export const stripMappingIndicators = (snapshot, config = {}) => {
129
+ const data = cloneSnapshot(snapshot);
130
+ const opts = resolveOpts(config);
131
+ const sheets = data['sheets'];
132
+ if (!sheets)
133
+ return data;
134
+ const scope = config.scopeSheetIds ?? Object.keys(sheets);
135
+ for (const sheetId of scope) {
136
+ resetHeaderRow(sheets[sheetId], opts, true);
137
+ }
138
+ return data;
139
+ };
140
+ /** Chuyển colIndex (0-based) → chữ cái cột kiểu Excel: 0→'A', 25→'Z', 26→'AA'… */
141
+ export const toColumnLetter = (index) => {
142
+ let letter = '';
143
+ let n = index;
144
+ do {
145
+ letter = String.fromCharCode(65 + (n % 26)) + letter;
146
+ n = Math.floor(n / 26) - 1;
147
+ } while (n >= 0);
148
+ return letter;
149
+ };
150
+ /** Tính index mới của 1 cột sau thao tác; trả null nếu cột đó bị xóa. */
151
+ const shiftColumnIndex = (col, change) => {
152
+ const { type, startColumn: start, count } = change;
153
+ if (type === 'insert')
154
+ return col >= start ? col + count : col;
155
+ if (type === 'remove') {
156
+ if (col >= start && col < start + count)
157
+ return null; // cột nằm trong vùng bị xóa
158
+ return col >= start + count ? col - count : col;
159
+ }
160
+ // move: khối [start, start+count) chèn TRƯỚC toColumn (toạ độ gốc) = rút khối rồi chèn lại.
161
+ const end = start + count;
162
+ const dest = change.toColumn ?? start;
163
+ const newStart = dest <= start ? dest : dest - count;
164
+ if (col >= start && col < end)
165
+ return newStart + (col - start); // cột thuộc khối di chuyển
166
+ let shifted = col >= end ? col - count : col; // bước rút khối
167
+ if (shifted >= newStart)
168
+ shifted += count; // bước chèn lại
169
+ return shifted;
170
+ };
171
+ /**
172
+ * Remap colIndex của danh sách mapping theo 1 `T_columnStructureChange`.
173
+ * - Item khác `sheetId` giữ nguyên.
174
+ * - Item nằm trong vùng cột bị XÓA → loại khỏi kết quả.
175
+ * - Các item còn lại được dịch index cho khớp vị trí mới.
176
+ *
177
+ * Tự cập nhật cả `colLetter` (nếu item có field này) cho khớp `colIndex` mới — consumer
178
+ * không cần map lại thủ công.
179
+ *
180
+ * @example
181
+ * this.mappings.update((list) => remapColumnIndexes(list, change));
182
+ */
183
+ export const remapColumnIndexes = (items, change) => {
184
+ const result = [];
185
+ for (const item of items) {
186
+ if (item.sheetId !== change.sheetId) {
187
+ result.push(item);
188
+ continue;
189
+ }
190
+ const next = shiftColumnIndex(item.colIndex, change);
191
+ if (next === null)
192
+ continue;
193
+ if (next === item.colIndex) {
194
+ result.push(item);
195
+ continue;
196
+ }
197
+ const updated = { ...item, colIndex: next };
198
+ if (typeof item.colLetter === 'string')
199
+ updated.colLetter = toColumnLetter(next);
200
+ result.push(updated);
201
+ }
202
+ return result;
203
+ };
204
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ByZWFkc2hlZXQuaW5kaWNhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL3NwcmVhZHNoZWV0L3NyYy9zcHJlYWRzaGVldC5pbmRpY2F0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBa0UvQywyRUFBMkU7QUFDM0UsTUFBTSxvQkFBb0IsR0FBcUI7SUFDN0MsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRTtJQUN0QixFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFO0lBQ3RCLEVBQUUsRUFBRSxhQUFhLENBQUMsSUFBSTtJQUN0QixFQUFFLEVBQUUsQ0FBQztJQUNMLEVBQUUsRUFBRSxDQUFDO0lBQ0wsRUFBRSxFQUFFLEVBQUU7Q0FDUCxDQUFDO0FBRUY7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sNkJBQTZCLEdBQUcsR0FBNkIsRUFBRSxDQUFDLENBQUM7SUFDNUUsYUFBYSxFQUFFLEdBQUc7SUFDbEIsV0FBVyxFQUFFLEVBQUUsR0FBRyxvQkFBb0IsRUFBRTtJQUN4QyxvQkFBb0IsRUFBRSxHQUFHO0lBQ3pCLE1BQU0sRUFBRSxJQUFJO0lBQ1osY0FBYyxFQUFFLENBQUM7SUFDakIsVUFBVSxFQUFFLElBQUk7SUFDaEIsU0FBUyxFQUFFLEdBQUc7SUFDZCxPQUFPLEVBQUUsRUFBRTtDQUNaLENBQUMsQ0FBQztBQXNCSCxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUM7QUFDNUIsTUFBTSxjQUFjLEdBQUcsR0FBRyxDQUFDO0FBQzNCLE1BQU0sZUFBZSxHQUFHLEVBQUUsQ0FBQztBQUMzQixNQUFNLGFBQWEsR0FBRyxFQUFFLENBQUM7QUFDekIsTUFBTSx1QkFBdUIsR0FBRyxHQUFHLENBQUM7QUFDcEMsTUFBTSx1QkFBdUIsR0FBRyxHQUFHLENBQUM7QUFFcEMs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QUErQixFQUMxQixFQUFFO0lBQ1AsTUFBTSxNQUFNLEdBQVEsRUFBRSxDQUFDO0lBQ3ZCLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFLENBQUM7UUFDekIsSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNwQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2xCLFNBQVM7UUFDWCxDQUFDO1FBQ0QsTUFBTSxJQUFJLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNyRCxJQUFJLElBQUksS0FBSyxJQUFJO1lBQUUsU0FBUztRQUM1QixJQUFJLElBQUksS0FBSyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDM0IsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNsQixTQUFTO1FBQ1gsQ0FBQztRQUNELE1BQU0sT0FBTyxHQUFNLEVBQUUsR0FBRyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDO1FBQy9DLElBQUksT0FBTyxJQUFJLENBQUMsU0FBUyxLQUFLLFFBQVE7WUFBRSxPQUFPLENBQUMsU0FBUyxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqRixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3ZCLENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCb29sZWFuTnVtYmVyIH0gZnJvbSAnQHVuaXZlcmpzL2NvcmUnO1xuXG4vKipcbiAqIE1hcHBpbmcgSW5kaWNhdG9ycyDigJQgxJHDoW5oIGThuqV1IChoaWdobGlnaHQpIGhlYWRlciBj4bunYSBjw6FjIGPhu5l0IMSRw6MgxJHGsOG7o2MgXCJtYXBcIiB0aGVvXG4gKiBt4buZdCBuZ2hp4buHcCB24bulIGLhuqV0IGvhu7MsIMSR4buDIG5nxrDhu51pIGTDuW5nIG5ow6xuIHRo4bqleSBuZ2F5IGPhu5l0IG7DoG8gxJFhbmcgZ+G6r24gduG7m2kgZmllbGQgbsOgby5cbiAqXG4gKiBUb8OgbiBi4buZIGxvZ2ljIGNo4bqheSB0csOqbiB3b3JrYm9vayBzbmFwc2hvdCAocGxhaW4gSlNPTiBj4bunYSBVbml2ZXIpIOKAlCBLSMOUTkcgcGjhu6UgdGh14buZY1xuICogdsOgbyBpbnN0YW5jZSBVbml2ZXIgxJFhbmcgY2jhuqF5LiBWw6wgduG6rXkgY8OzIHRo4buDIGfhu41pIHRyxrDhu5tjIGtoaSBsb2FkLCBob+G6t2MgdHLDqm4gZGF0YSDEkcOjIHNhdmUuXG4gKlxuICogQ8OhY2ggZMO5bmc6IHThu7EgxJHhu4tuaCBuZ2jEqWEgMSBgVF9tYXBwaW5nSW5kaWNhdG9yQ29uZmlnYCAoc3R5bGUsIHByZWZpeCwgc2NvcGXigKYpIHLhu5NpXG4gKiB0cnV54buBbiB2w6BvIGPhuqMgYGFwcGx5TWFwcGluZ0luZGljYXRvcnNgICjEkeG7gyBoaeG7h24pIHbDoCBgc3RyaXBNYXBwaW5nSW5kaWNhdG9yc2AgKMSR4buDIGThu41uXG4gKiB0csaw4bubYyBraGkgZ+G7rWkgc2VydmVyKS4gS2jDtG5nIGPhuqduIHZp4bq/dCBs4bqhaSBsb2dpYyBoaWdobGlnaHQgY2hvIHThu6tuZyBuZ2hp4buHcCB24bulLlxuICovXG5cbi8qKiBN4buZdCBj4buZdCBj4bqnbiDEkcOhbmggZOG6pXUg4oCUIGNo4buJIGPhuqduIGJp4bq/dCBzaGVldCB2w6AgduG7iyB0csOtIGPhu5l0ICgwLWluZGV4ZWQpLiAqL1xuZXhwb3J0IHR5cGUgVF9pbmRpY2F0b3JUYXJnZXQgPSB7XG4gIHNoZWV0SWQ6IHN0cmluZztcbiAgY29sSW5kZXg6IG51bWJlcjtcbn07XG5cbi8qKiDEkOG7i25oIG5naMSpYSBzdHlsZSBoaWdobGlnaHQgKMSRw7puZyBzaGFwZSBzdHlsZSBvYmplY3QgY+G7p2EgVW5pdmVyKS4gKi9cbmV4cG9ydCB0eXBlIFRfaW5kaWNhdG9yU3R5bGUgPSB7XG4gIC8qKiBNw6B1IG7hu4FuIOKAlCB2ZCBgeyByZ2I6ICcjMzg5RTBEJyB9YCAqL1xuICBiZz86IHsgcmdiOiBzdHJpbmcgfTtcbiAgLyoqIE3DoHUgY2jhu68g4oCUIHZkIGB7IHJnYjogJyNGRkZGRkYnIH1gICovXG4gIGNsPzogeyByZ2I6IHN0cmluZyB9O1xuICAvKiogQm9sZCAqL1xuICBibD86IEJvb2xlYW5OdW1iZXI7XG4gIC8qKiBIb3Jpem9udGFsIGFsaWduICgwIGxlZnQsIDEgcmlnaHQsIDIgY2VudGVyKSAqL1xuICBodD86IG51bWJlcjtcbiAgLyoqIFZlcnRpY2FsIGFsaWduICgwIHRvcCwgMSBib3R0b20sIDIgbWlkZGxlKSAqL1xuICB2dD86IG51bWJlcjtcbiAgLyoqIEZvbnQgc2l6ZSAqL1xuICBmcz86IG51bWJlcjtcbn07XG5cbi8qKlxuICogQ+G6pXUgaMOsbmggY8OhY2ggaGlnaGxpZ2h0IGPhu5l0IMSRw6MgbWFwLiBN4buMSSBmaWVsZCDEkeG7gXUgb3B0aW9uYWwg4oCUIGxpYiBjw7MgZGVmYXVsdCBz4bq1blxuICogKHhlbSBgZGVmYXVsdE1hcHBpbmdJbmRpY2F0b3JDb25maWdgKSwgY29uc3VtZXIgY2jhu4kgb3ZlcnJpZGUgcGjhuqduIGPhuqduLiBEw7luZyBjaHVuZyBjaG9cbiAqIGPhuqMgYXBwbHkgJiBzdHJpcCDEkeG7gyDEkeG6o20gYuG6o28gxJHhu5FpIHjhu6luZyAoxJHDoW5oIGThuqV1IHLhu5NpIGfhu6EgxJHDum5nIHN0eWxlL3ByZWZpeCDEkcOjIHRow6ptKS5cbiAqL1xuZXhwb3J0IHR5cGUgVF9tYXBwaW5nSW5kaWNhdG9yQ29uZmlnID0ge1xuICAvKiogS2V5IHN0eWxlIMSRw6FuaCBk4bqldSBj4buZdCDEkcOjIG1hcC4gVOG7sSBpbmplY3QgdsOgbyBgc3R5bGVzYCBu4bq/dSBjaMawYSBjw7MuIEBkZWZhdWx0ICdtJyAqL1xuICBtYXBwZWRTdHlsZUlkPzogc3RyaW5nO1xuICAvKiogxJDhu4tuaCBuZ2jEqWEgc3R5bGUgY2hvIGBtYXBwZWRTdHlsZUlkYCDigJQgY2jhu4kgZMO5bmcga2hpIGPhuqduIGluamVjdCBs4bqnbiDEkeG6p3UuIEBkZWZhdWx0IHhhbmggIzM4OUUwRCwgY2jhu68gdHLhuq9uZywgYm9sZCAqL1xuICBtYXBwZWRTdHlsZT86IFRfaW5kaWNhdG9yU3R5bGU7XG4gIC8qKiBLZXkgc3R5bGUgaGVhZGVyIG3hurdjIMSR4buLbmggxJHhu4MgcmV2ZXJ0IHbhu4Ega2hpIGfhu6EgxJHDoW5oIGThuqV1LiBAZGVmYXVsdCAnaCcgKi9cbiAgZGVmYXVsdEhlYWRlclN0eWxlSWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBQaOG6oW0gdmkgc2hlZXQgeOG7rSBsw70gKHJlc2V0IHRyxrDhu5tjIGtoaSDEkcOhbmggZOG6pXUgLyBk4buNbikuIELhu48gdHLhu5FuZyA9IMSR4buNYyB04burIGThu68gbGnhu4d1OlxuICAgKiB44butIGzDvSBU4bqkVCBD4bqiIHNoZWV0IGPDsyB0cm9uZyBzbmFwc2hvdC4gQ2jhu4kgdHJ1eeG7gW4ga2hpIG114buRbiBnaeG7m2kgaOG6oW4gxJHhu4MgdOG7kWkgxrB1LlxuICAgKiBAZGVmYXVsdCBt4buNaSBzaGVldCB0cm9uZyBzbmFwc2hvdFxuICAgKi9cbiAgc2NvcGVTaGVldElkcz86IHN0cmluZ1tdO1xuICAvKiogUHJlZml4IGljb24gdGjDqm0gdsOgbyDEkeG6p3UgaGVhZGVyIGPhu6dhIGPhu5l0IMSRw6MgbWFwLiBAZGVmYXVsdCAn4pePICcgKi9cbiAgcHJlZml4Pzogc3RyaW5nO1xuICAvKiogUm93IGluZGV4IGPhu6dhIGhlYWRlci4gQGRlZmF1bHQgMCAqL1xuICBoZWFkZXJSb3dJbmRleD86IG51bWJlcjtcbiAgLyoqIFThu7EgY28gZ2nDo24gd2lkdGggY+G7mXQgdGhlbyDEkeG7mSBkw6BpIHRleHQgKGfhu5NtIHByZWZpeCkuIEBkZWZhdWx0IHRydWUgKi9cbiAgYXV0b1Jlc2l6ZT86IGJvb2xlYW47XG4gIC8qKiBQeCB0cnVuZyBiw6xuaCBt4buXaSBrw70gdOG7sSBraGkgYXV0by1yZXNpemUuIEBkZWZhdWx0IDcuNSAqL1xuICBjaGFyV2lkdGg/OiBudW1iZXI7XG4gIC8qKiBQYWRkaW5nIDIgYsOqbiAocHgpIGtoaSBhdXRvLXJlc2l6ZS4gQGRlZmF1bHQgMTYgKi9cbiAgcGFkZGluZz86IG51bWJlcjtcbn07XG5cbi8qKiBTdHlsZSBt4bq3YyDEkeG7i25oIGNobyBj4buZdCDEkcOjIG1hcDogbuG7gW4geGFuaCwgY2jhu68gdHLhuq9uZywgYm9sZCwgY2FuaCBnaeG7r2EuICovXG5jb25zdCBERUZBVUxUX01BUFBFRF9TVFlMRTogVF9pbmRpY2F0b3JTdHlsZSA9IHtcbiAgYmc6IHsgcmdiOiAnIzM4OUUwRCcgfSxcbiAgY2w6IHsgcmdiOiAnI0ZGRkZGRicgfSxcbiAgYmw6IEJvb2xlYW5OdW1iZXIuVFJVRSxcbiAgaHQ6IDIsXG4gIHZ0OiAyLFxuICBmczogMTEsXG59O1xuXG4vKipcbiAqIENvbmZpZyBt4bq3YyDEkeG7i25oIGPhu6dhIGxpYiDigJQgY29uc3VtZXIgY8OzIHRo4buDIGTDuW5nIHRy4buxYyB0aeG6v3AgaG/hurdjIHNwcmVhZC1vdmVycmlkZTpcbiAqIGB7IC4uLmRlZmF1bHRNYXBwaW5nSW5kaWNhdG9yQ29uZmlnKCksIHByZWZpeDogJ+KYhSAnIH1gLlxuICovXG5leHBvcnQgY29uc3QgZGVmYXVsdE1hcHBpbmdJbmRpY2F0b3JDb25maWcgPSAoKTogVF9tYXBwaW5nSW5kaWNhdG9yQ29uZmlnID0+ICh7XG4gIG1hcHBlZFN0eWxlSWQ6ICdtJyxcbiAgbWFwcGVkU3R5bGU6IHsgLi4uREVGQVVMVF9NQVBQRURfU1RZTEUgfSxcbiAgZGVmYXVsdEhlYWRlclN0eWxlSWQ6ICdoJyxcbiAgcHJlZml4OiAn4pePICcsXG4gIGhlYWRlclJvd0luZGV4OiAwLFxuICBhdXRvUmVzaXplOiB0cnVlLFxuICBjaGFyV2lkdGg6IDcuNSxcbiAgcGFkZGluZzogMTYsXG59KTtcblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBJbnRlcm5hbCB0eXBlcyAmIGhlbHBlcnNcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG50eXBlIFRfY2VsbCA9IHsgdj86IHVua25vd247IHM/OiBzdHJpbmcgfTtcbnR5cGUgVF9jb2xEYXRhID0gUmVjb3JkPHN0cmluZywgeyB3PzogbnVtYmVyIH0+O1xudHlwZSBUX3NoZWV0ID0geyBjZWxsRGF0YT86IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIFRfY2VsbD4+OyBjb2x1bW5EYXRhPzogVF9jb2xEYXRhIH07XG50eXBlIFRfc2hlZXRNYXAgPSBSZWNvcmQ8c3RyaW5nLCBUX3NoZWV0PjtcblxudHlwZSBUX3Jlc29sdmVkT3B0cyA9IHtcbiAgbWFwcGVkU3R5bGVJZDogc3RyaW5nO1xuICBtYXBwZWRTdHlsZTogVF9pbmRpY2F0b3JTdHlsZTtcbiAgZGVmYXVsdEhlYWRlclN0eWxlSWQ6IHN0cmluZztcbiAgcHJlZml4OiBzdHJpbmc7XG4gIGhlYWRlclJvd0tleTogc3RyaW5nO1xuICBhdXRvUmVzaXplOiBib29sZWFuO1xuICBjaGFyV2lkdGg6IG51bWJlcjtcbiAgcGFkZGluZzogbnVtYmVyO1xufTtcblxuY29uc3QgREVGQVVMVF9QUkVGSVggPSAn4pePICc7XG5jb25zdCBERUZBVUxUX0NIQVJfVyA9IDcuNTtcbmNvbnN0IERFRkFVTFRfUEFERElORyA9IDE2O1xuY29uc3QgREVGQVVMVF9DT0xfVyA9IDgwO1xuY29uc3QgREVGQVVMVF9NQVBQRURfU1RZTEVfSUQgPSAnbSc7XG5jb25zdCBERUZBVUxUX0hFQURFUl9TVFlMRV9JRCA9ICdoJztcblxuLyoqIFdvcmtib29rIHNuYXBzaG90IGzDoCBwbGFpbiBKU09OIOKAlCBjbG9uZSBhbiB0b8OgbiBuaOG6pXQgYuG6sW5nIEpTT04uICovXG5jb25zdCBjbG9uZVNuYXBzaG90ID0gKHNuYXBzaG90OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+XG4gIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoc25hcHNob3QpKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuY29uc3QgcmVzb2x2ZU9wdHMgPSAoY29uZmlnOiBUX21hcHBpbmdJbmRpY2F0b3JDb25maWcpOiBUX3Jlc29sdmVkT3B0cyA9PiAoe1xuICBtYXBwZWRTdHlsZUlkOiBjb25maWcubWFwcGVkU3R5bGVJZCA/PyBERUZBVUxUX01BUFBFRF9TVFlMRV9JRCxcbiAgbWFwcGVkU3R5bGU6IGNvbmZpZy5tYXBwZWRTdHlsZSA/PyBERUZBVUxUX01BUFBFRF9TVFlMRSxcbiAgZGVmYXVsdEhlYWRlclN0eWxlSWQ6IGNvbmZpZy5kZWZhdWx0SGVhZGVyU3R5bGVJZCA/PyBERUZBVUxUX0hFQURFUl9TVFlMRV9JRCxcbiAgcHJlZml4OiBjb25maWcucHJlZml4ID8/IERFRkFVTFRfUFJFRklYLFxuICBoZWFkZXJSb3dLZXk6IFN0cmluZyhjb25maWcuaGVhZGVyUm93SW5kZXggPz8gMCksXG4gIGF1dG9SZXNpemU6IGNvbmZpZy5hdXRvUmVzaXplID8/IHRydWUsXG4gIGNoYXJXaWR0aDogY29uZmlnLmNoYXJXaWR0aCA/PyBERUZBVUxUX0NIQVJfVyxcbiAgcGFkZGluZzogY29uZmlnLnBhZGRpbmcgPz8gREVGQVVMVF9QQURESU5HLFxufSk7XG5cbmNvbnN0IGVzdGltYXRlV2lkdGggPSAodGV4dDogc3RyaW5nLCBvcHRzOiBUX3Jlc29sdmVkT3B0cyk6IG51bWJlciA9PlxuICBNYXRoLmNlaWwodGV4dC5sZW5ndGggKiBvcHRzLmNoYXJXaWR0aCArIG9wdHMucGFkZGluZyk7XG5cbi8qKiBN4bufIHLhu5luZyB3aWR0aCBj4buZdCBjaG8gduG7q2EgdGV4dCAoa2jDtG5nIHRodSBuaOG7jyBoxqFuIHdpZHRoIGhp4buHbiB04bqhaSkuICovXG5jb25zdCBleHBhbmRDb2xXaWR0aCA9IChzaGVldDogVF9zaGVldCwgY29sS2V5OiBzdHJpbmcsIHRleHQ6IHN0cmluZywgb3B0czogVF9yZXNvbHZlZE9wdHMpOiB2b2lkID0+IHtcbiAgY29uc3QgY29sRGF0YSA9IHNoZWV0LmNvbHVtbkRhdGE7XG4gIGlmICghY29sRGF0YSkgcmV0dXJuO1xuICBjb25zdCBjdXJyZW50ID0gY29sRGF0YVtjb2xLZXldPy53ID8/IERFRkFVTFRfQ09MX1c7XG4gIGNvbERhdGFbY29sS2V5XSA9IHsgLi4uKGNvbERhdGFbY29sS2V5XSA/PyB7fSksIHc6IE1hdGgubWF4KGN1cnJlbnQsIGVzdGltYXRlV2lkdGgodGV4dCwgb3B0cykpIH07XG59O1xuXG4vKipcbiAqIEThu41uIGhlYWRlciByb3cgY+G7p2EgMSBzaGVldDogcmV2ZXJ0IHN0eWxlIHbhu4EgbeG6t2MgxJHhu4tuaCwgeMOzYSBwcmVmaXgsIGtow7RpIHBo4bulYyB3aWR0aC5cbiAqIEBwYXJhbSBvbmx5TWFwcGVkIHRydWUg4oaSIGNo4buJIHJldmVydCDDtCDEkWFuZyBsw6AgYG1hcHBlZFN0eWxlSWRgOyBmYWxzZSDihpIgcmV2ZXJ0IG3hu41pIMO0IGPDsyBzdHlsZS5cbiAqL1xuY29uc3QgcmVzZXRIZWFkZXJSb3cgPSAoc2hlZXQ6IFRfc2hlZXQgfCB1bmRlZmluZWQsIG9wdHM6IFRfcmVzb2x2ZWRPcHRzLCBvbmx5TWFwcGVkOiBib29sZWFuKTogdm9pZCA9PiB7XG4gIGNvbnN0IGhlYWRlclJvdyA9IHNoZWV0Py5jZWxsRGF0YT8uW29wdHMuaGVhZGVyUm93S2V5XTtcbiAgaWYgKCFoZWFkZXJSb3cgfHwgIXNoZWV0KSByZXR1cm47XG4gIGZvciAoY29uc3QgY29sS2V5IG9mIE9iamVjdC5rZXlzKGhlYWRlclJvdykpIHtcbiAgICBjb25zdCBjZWxsID0gaGVhZGVyUm93W2NvbEtleV07XG4gICAgaWYgKCFjZWxsKSBjb250aW51ZTtcbiAgICBpZiAob25seU1hcHBlZCkge1xuICAgICAgaWYgKGNlbGwucyA9PT0gb3B0cy5tYXBwZWRTdHlsZUlkKSBjZWxsLnMgPSBvcHRzLmRlZmF1bHRIZWFkZXJTdHlsZUlkO1xuICAgIH0gZWxzZSBpZiAoY2VsbC5zKSB7XG4gICAgICBjZWxsLnMgPSBvcHRzLmRlZmF1bHRIZWFkZXJTdHlsZUlkO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGNlbGwudiA9PT0gJ3N0cmluZycgJiYgY2VsbC52LnN0YXJ0c1dpdGgob3B0cy5wcmVmaXgpKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbCA9IGNlbGwudi5zbGljZShvcHRzLnByZWZpeC5sZW5ndGgpO1xuICAgICAgY2VsbC52ID0gb3JpZ2luYWw7XG4gICAgICBpZiAob3B0cy5hdXRvUmVzaXplICYmIHNoZWV0LmNvbHVtbkRhdGE/Lltjb2xLZXldKSB7XG4gICAgICAgIHNoZWV0LmNvbHVtbkRhdGFbY29sS2V5XS53ID0gZXN0aW1hdGVXaWR0aChvcmlnaW5hbCwgb3B0cyk7XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIFB1YmxpYyBBUElcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIMSQw6FuaCBk4bqldSBoZWFkZXIgY8OhYyBj4buZdCDEkcOjIG1hcDogZ+G6r24gc3R5bGUgYG1hcHBlZFN0eWxlSWRgLCB0aMOqbSBwcmVmaXggaWNvbiB2w6BcbiAqICh0w7l5IGNo4buNbikgdOG7sSBu4bubaSB3aWR0aC4gVOG7sSByZXNldCBjw6FjIHNoZWV0IHRyb25nIHNjb3BlIHRyxrDhu5tjIMSR4buDIG1hcHBpbmcgY8WpIGtow7RuZyBzw7N0IGzhuqFpLlxuICpcbiAqIEBwYXJhbSBzbmFwc2hvdCBXb3JrYm9vayBzbmFwc2hvdCAocGxhaW4gSlNPTikuIEtow7RuZyBi4buLIG11dGF0ZSDigJQgdHLhuqMgduG7gSBi4bqjbiBjbG9uZS5cbiAqIEBwYXJhbSB0YXJnZXRzICBEYW5oIHPDoWNoIGPhu5l0IGPhuqduIMSRw6FuaCBk4bqldSAoYHsgc2hlZXRJZCwgY29sSW5kZXggfWApLlxuICogQHBhcmFtIGNvbmZpZyAgIEPhuqV1IGjDrG5oIHN0eWxlIC8gcHJlZml4IC8gc2NvcGUuIELhu48gdHLhu5FuZyA9IGTDuW5nIGRlZmF1bHQgY+G7p2EgbGliLlxuICovXG5leHBvcnQgY29uc3QgYXBwbHlNYXBwaW5nSW5kaWNhdG9ycyA9IChcbiAgc25hcHNob3Q6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICB0YXJnZXRzOiBUX2luZGljYXRvclRhcmdldFtdLFxuICBjb25maWc6IFRfbWFwcGluZ0luZGljYXRvckNvbmZpZyA9IHt9LFxuKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT4ge1xuICBjb25zdCBkYXRhID0gY2xvbmVTbmFwc2hvdChzbmFwc2hvdCk7XG4gIGNvbnN0IG9wdHMgPSByZXNvbHZlT3B0cyhjb25maWcpO1xuXG4gIGNvbnN0IHN0eWxlcyA9IGRhdGFbJ3N0eWxlcyddIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICBpZiAoc3R5bGVzICYmICFzdHlsZXNbb3B0cy5tYXBwZWRTdHlsZUlkXSkge1xuICAgIHN0eWxlc1tvcHRzLm1hcHBlZFN0eWxlSWRdID0geyAuLi5vcHRzLm1hcHBlZFN0eWxlIH07XG4gIH1cblxuICBjb25zdCBzaGVldHMgPSBkYXRhWydzaGVldHMnXSBhcyBUX3NoZWV0TWFwIHwgdW5kZWZpbmVkO1xuICBpZiAoIXNoZWV0cykgcmV0dXJuIGRhdGE7XG5cbiAgY29uc3Qgc2NvcGUgPSBjb25maWcuc2NvcGVTaGVldElkcyA/PyBPYmplY3Qua2V5cyhzaGVldHMpO1xuICBmb3IgKGNvbnN0IHNoZWV0SWQgb2Ygc2NvcGUpIHtcbiAgICByZXNldEhlYWRlclJvdyhzaGVldHNbc2hlZXRJZF0sIG9wdHMsIGZhbHNlKTtcbiAgfVxuXG4gIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldHMpIHtcbiAgICBjb25zdCBzaGVldCA9IHNoZWV0c1t0YXJnZXQuc2hlZXRJZF07XG4gICAgY29uc3QgY2VsbCA9IHNoZWV0Py5jZWxsRGF0YT8uW29wdHMuaGVhZGVyUm93S2V5XT8uW1N0cmluZyh0YXJnZXQuY29sSW5kZXgpXTtcbiAgICBpZiAoIWNlbGwgfHwgIXNoZWV0KSBjb250aW51ZTtcbiAgICBjZWxsLnMgPSBvcHRzLm1hcHBlZFN0eWxlSWQ7XG4gICAgaWYgKHR5cGVvZiBjZWxsLnYgPT09ICdzdHJpbmcnICYmICFjZWxsLnYuc3RhcnRzV2l0aChvcHRzLnByZWZpeCkpIHtcbiAgICAgIGNvbnN0IHdpdGhJY29uID0gYCR7b3B0cy5wcmVmaXh9JHtjZWxsLnZ9YDtcbiAgICAgIGNlbGwudiA9IHdpdGhJY29uO1xuICAgICAgaWYgKG9wdHMuYXV0b1Jlc2l6ZSkgZXhwYW5kQ29sV2lkdGgoc2hlZXQsIFN0cmluZyh0YXJnZXQuY29sSW5kZXgpLCB3aXRoSWNvbiwgb3B0cyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRhdGE7XG59O1xuXG4vKipcbiAqIEfhu6EgdG/DoG4gYuG7mSBpbmRpY2F0b3IgKCdtJyDihpIgZGVmYXVsdCBzdHlsZSwgeMOzYSBwcmVmaXgsIGtow7RpIHBo4bulYyB3aWR0aCkga2jhu49pIHNuYXBzaG90XG4gKiDigJQgZMO5bmcgdHLGsOG7m2Mga2hpIGfhu61pIHdvcmtib29rIGzDqm4gc2VydmVyIMSR4buDIGRhdGEgc+G6oWNoLCBraMO0bmcgY2jhu6lhIHN0eWxlIFVJIG7hu5lpIGLhu5kuXG4gKlxuICogQHBhcmFtIHNuYXBzaG90IFdvcmtib29rIHNuYXBzaG90IChwbGFpbiBKU09OKS4gS2jDtG5nIGLhu4sgbXV0YXRlIOKAlCB0cuG6oyB24buBIGLhuqNuIGNsb25lLlxuICogQHBhcmFtIGNvbmZpZyAgIETDuW5nIGNodW5nIGNvbmZpZyB24bubaSBgYXBwbHlNYXBwaW5nSW5kaWNhdG9yc2AgxJHhu4MgZ+G7oSDEkcO6bmcgc3R5bGUvcHJlZml4LlxuICogICAgICAgICAgICAgICAgIELhu48gdHLhu5FuZyA9IGTDuW5nIGRlZmF1bHQgY+G7p2EgbGliLlxuICovXG5leHBvcnQgY29uc3Qgc3RyaXBNYXBwaW5nSW5kaWNhdG9ycyA9IChcbiAgc25hcHNob3Q6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBjb25maWc6IFRfbWFwcGluZ0luZGljYXRvckNvbmZpZyA9IHt9LFxuKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT4ge1xuICBjb25zdCBkYXRhID0gY2xvbmVTbmFwc2hvdChzbmFwc2hvdCk7XG4gIGNvbnN0IG9wdHMgPSByZXNvbHZlT3B0cyhjb25maWcpO1xuXG4gIGNvbnN0IHNoZWV0cyA9IGRhdGFbJ3NoZWV0cyddIGFzIFRfc2hlZXRNYXAgfCB1bmRlZmluZWQ7XG4gIGlmICghc2hlZXRzKSByZXR1cm4gZGF0YTtcblxuICBjb25zdCBzY29wZSA9IGNvbmZpZy5zY29wZVNoZWV0SWRzID8/IE9iamVjdC5rZXlzKHNoZWV0cyk7XG4gIGZvciAoY29uc3Qgc2hlZXRJZCBvZiBzY29wZSkge1xuICAgIHJlc2V0SGVhZGVyUm93KHNoZWV0c1tzaGVldElkXSwgb3B0cywgdHJ1ZSk7XG4gIH1cblxuICByZXR1cm4gZGF0YTtcbn07XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gQ29sdW1uIHN0cnVjdHVyZSBjaGFuZ2Ug4oCUIHJlbWFwIG1hcHBpbmcga2hpIHVzZXIgaW5zZXJ0IC8gcmVtb3ZlIC8gbW92ZSBj4buZdFxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogTcO0IHThuqMgMSB0aGFvIHTDoWMgY+G6pXUgdHLDumMgY+G7mXQgKGRvIGNvbXBvbmVudCBwaMOhdCBxdWEgYG91dENvbHVtblN0cnVjdHVyZUNoYW5nZWApLlxuICogYGNvdW50YCDEkcOjIGfhu5lwIHRyxrDhu51uZyBo4bujcCBjaOG7jW4gTkhJ4buAVSBj4buZdCBjw7luZyBsw7pjIChyYW5nZSBzcGFuKS5cbiAqL1xuZXhwb3J0IHR5cGUgVF9jb2x1bW5TdHJ1Y3R1cmVDaGFuZ2UgPSB7XG4gIC8qKiBTaGVldCB44bqjeSByYSB0aGFvIHTDoWMuICovXG4gIHNoZWV0SWQ6IHN0cmluZztcbiAgLyoqIExv4bqhaSB0aGFvIHTDoWMuICovXG4gIHR5cGU6ICdpbnNlcnQnIHwgJ3JlbW92ZScgfCAnbW92ZSc7XG4gIC8qKiBD4buZdCBi4bqvdCDEkeG6p3UgYuG7iyB0w6FjIMSR4buZbmcgKDAtaW5kZXhlZCkuIFbhu5tpIGBtb3ZlYCA9IGPhuqFuaCB0csOhaSBraOG7kWkgbmd14buTbi4gKi9cbiAgc3RhcnRDb2x1bW46IG51bWJlcjtcbiAgLyoqIFPhu5EgY+G7mXQgYuG7iyB0w6FjIMSR4buZbmcgKOKJpSAxOyA+MSBraGkgY2jhu41uIG5oaeG7gXUgY+G7mXQpLiAqL1xuICBjb3VudDogbnVtYmVyO1xuICAvKiogQ+G7mXQgxJHDrWNoIChj4bqhbmggdHLDoWksIHRv4bqhIMSR4buZIEfhu5BDIHRyxrDhu5tjIGtoaSBk4budaSkg4oCUIENI4buIIGPDsyB24bubaSBgbW92ZWAuICovXG4gIHRvQ29sdW1uPzogbnVtYmVyO1xufTtcblxuLyoqIENodXnhu4NuIGNvbEluZGV4ICgwLWJhc2VkKSDihpIgY2jhu68gY8OhaSBj4buZdCBraeG7g3UgRXhjZWw6IDDihpInQScsIDI14oaSJ1onLCAyNuKGkidBQSfigKYgKi9cbmV4cG9ydCBjb25zdCB0b0NvbHVtbkxldHRlciA9IChpbmRleDogbnVtYmVyKTogc3RyaW5nID0+IHtcbiAgbGV0IGxldHRlciA9ICcnO1xuICBsZXQgbiA9IGluZGV4O1xuICBkbyB7XG4gICAgbGV0dGVyID0gU3RyaW5nLmZyb21DaGFyQ29kZSg2NSArIChuICUgMjYpKSArIGxldHRlcjtcbiAgICBuID0gTWF0aC5mbG9vcihuIC8gMjYpIC0gMTtcbiAgfSB3aGlsZSAobiA+PSAwKTtcbiAgcmV0dXJuIGxldHRlcjtcbn07XG5cbi8qKiBUw61uaCBpbmRleCBt4bubaSBj4bunYSAxIGPhu5l0IHNhdSB0aGFvIHTDoWM7IHRy4bqjIG51bGwgbuG6v3UgY+G7mXQgxJHDsyBi4buLIHjDs2EuICovXG5jb25zdCBzaGlmdENvbHVtbkluZGV4ID0gKGNvbDogbnVtYmVyLCBjaGFuZ2U6IFRfY29sdW1uU3RydWN0dXJlQ2hhbmdlKTogbnVtYmVyIHwgbnVsbCA9PiB7XG4gIGNvbnN0IHsgdHlwZSwgc3RhcnRDb2x1bW46IHN0YXJ0LCBjb3VudCB9ID0gY2hhbmdlO1xuICBpZiAodHlwZSA9PT0gJ2luc2VydCcpIHJldHVybiBjb2wgPj0gc3RhcnQgPyBjb2wgKyBjb3VudCA6IGNvbDtcbiAgaWYgKHR5cGUgPT09ICdyZW1vdmUnKSB7XG4gICAgaWYgKGNvbCA+PSBzdGFydCAmJiBjb2wgPCBzdGFydCArIGNvdW50KSByZXR1cm4gbnVsbDsgLy8gY+G7mXQgbuG6sW0gdHJvbmcgdsO5bmcgYuG7iyB4w7NhXG4gICAgcmV0dXJuIGNvbCA+PSBzdGFydCArIGNvdW50ID8gY29sIC0gY291bnQgOiBjb2w7XG4gIH1cbiAgLy8gbW92ZToga2jhu5FpIFtzdGFydCwgc3RhcnQrY291bnQpIGNow6huIFRSxq/hu5pDIHRvQ29sdW1uICh0b+G6oSDEkeG7mSBn4buRYykgPSByw7p0IGto4buRaSBy4buTaSBjaMOobiBs4bqhaS5cbiAgY29uc3QgZW5kID0gc3RhcnQgKyBjb3VudDtcbiAgY29uc3QgZGVzdCA9IGNoYW5nZS50b0NvbHVtbiA/PyBzdGFydDtcbiAgY29uc3QgbmV3U3RhcnQgPSBkZXN0IDw9IHN0YXJ0ID8gZGVzdCA6IGRlc3QgLSBjb3VudDtcbiAgaWYgKGNvbCA+PSBzdGFydCAmJiBjb2wgPCBlbmQpIHJldHVybiBuZXdTdGFydCArIChjb2wgLSBzdGFydCk7IC8vIGPhu5l0IHRodeG7mWMga2jhu5FpIGRpIGNodXnhu4NuXG4gIGxldCBzaGlmdGVkID0gY29sID49IGVuZCA/IGNvbCAtIGNvdW50IDogY29sOyAvLyBixrDhu5tjIHLDunQga2jhu5FpXG4gIGlmIChzaGlmdGVkID49IG5ld1N0YXJ0KSBzaGlmdGVkICs9IGNvdW50OyAvLyBixrDhu5tjIGNow6huIGzhuqFpXG4gIHJldHVybiBzaGlmdGVkO1xufTtcblxuLyoqXG4gKiBSZW1hcCBjb2xJbmRleCBj4bunYSBkYW5oIHPDoWNoIG1hcHBpbmcgdGhlbyAxIGBUX2NvbHVtblN0cnVjdHVyZUNoYW5nZWAuXG4gKiAtIEl0ZW0ga2jDoWMgYHNoZWV0SWRgIGdp4buvIG5ndXnDqm4uXG4gKiAtIEl0ZW0gbuG6sW0gdHJvbmcgdsO5bmcgY+G7mXQgYuG7iyBYw5NBIOKGkiBsb+G6oWkga2jhu49pIGvhur90IHF14bqjLlxuICogLSBDw6FjIGl0ZW0gY8OybiBs4bqhaSDEkcaw4bujYyBk4buLY2ggaW5kZXggY2hvIGto4bubcCB24buLIHRyw60gbeG7m2kuXG4gKlxuICogVOG7sSBj4bqtcCBuaOG6rXQgY+G6oyBgY29sTGV0dGVyYCAobuG6v3UgaXRlbSBjw7MgZmllbGQgbsOgeSkgY2hvIGto4bubcCBgY29sSW5kZXhgIG3hu5tpIOKAlCBjb25zdW1lclxuICoga2jDtG5nIGPhuqduIG1hcCBs4bqhaSB0aOG7pyBjw7RuZy5cbiAqXG4gKiBAZXhhbXBsZVxuICogdGhpcy5tYXBwaW5ncy51cGRhdGUoKGxpc3QpID0+IHJlbWFwQ29sdW1uSW5kZXhlcyhsaXN0LCBjaGFuZ2UpKTtcbiAqL1xuZXhwb3J0IGNvbnN0IHJlbWFwQ29sdW1uSW5kZXhlcyA9IDxUIGV4dGVuZHMgeyBzaGVldElkOiBzdHJpbmc7IGNvbEluZGV4OiBudW1iZXI7IGNvbExldHRlcj86IHN0cmluZyB9PihcbiAgaXRlbXM6IFRbXSxcbiAgY2hhbmdlOiBUX2NvbHVtblN0cnVjdHVyZUNoYW5nZSxcbik6IFRbXSA9PiB7XG4gIGNvbnN0IHJlc3VsdDogVFtdID0gW107XG4gIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgIGlmIChpdGVtLnNoZWV0SWQgIT09IGNoYW5nZS5zaGVldElkKSB7XG4gICAgICByZXN1bHQucHVzaChpdGVtKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBuZXh0ID0gc2hpZnRDb2x1bW5JbmRleChpdGVtLmNvbEluZGV4LCBjaGFuZ2UpO1xuICAgIGlmIChuZXh0ID09PSBudWxsKSBjb250aW51ZTtcbiAgICBpZiAobmV4dCA9PT0gaXRlbS5jb2xJbmRleCkge1xuICAgICAgcmVzdWx0LnB1c2goaXRlbSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgdXBkYXRlZDogVCA9IHsgLi4uaXRlbSwgY29sSW5kZXg6IG5leHQgfTtcbiAgICBpZiAodHlwZW9mIGl0ZW0uY29sTGV0dGVyID09PSAnc3RyaW5nJykgdXBkYXRlZC5jb2xMZXR0ZXIgPSB0b0NvbHVtbkxldHRlcihuZXh0KTtcbiAgICByZXN1bHQucHVzaCh1cGRhdGVkKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcbiJdfQ==
@@ -0,0 +1,67 @@
1
+ import { Tools } from '@univerjs/core';
2
+ import DesignEnUS from '@univerjs/design/lib/locale/en-US.json';
3
+ import DesignViVN from '@univerjs/design/lib/locale/vi-VN.json';
4
+ import DocsUIEnUS from '@univerjs/docs-ui/lib/locale/en-US.json';
5
+ import DocsUIViVN from '@univerjs/docs-ui/lib/locale/vi-VN.json';
6
+ import SheetsEnUS from '@univerjs/sheets/lib/locale/en-US.json';
7
+ import SheetsViVN from '@univerjs/sheets/lib/locale/vi-VN.json';
8
+ import SheetsFormulaUIEnUS from '@univerjs/sheets-formula-ui/lib/locale/en-US.json';
9
+ import SheetsFormulaUIViVN from '@univerjs/sheets-formula-ui/lib/locale/vi-VN.json';
10
+ import SheetsUIEnUS from '@univerjs/sheets-ui/lib/locale/en-US.json';
11
+ import SheetsUIViVN from '@univerjs/sheets-ui/lib/locale/vi-VN.json';
12
+ import UIEnUS from '@univerjs/ui/lib/locale/en-US.json';
13
+ import UIViVN from '@univerjs/ui/lib/locale/vi-VN.json';
14
+ // Numfmt locale embedded directly — avoids TS module resolution issues with JSON in package exports
15
+ const sheetsNumfmtLocaleEn = {
16
+ sheet: {
17
+ numfmt: {
18
+ percent: 'Percentage', title: 'Number format', numfmtType: 'Format types',
19
+ cancel: 'Cancel', confirm: 'Confirm', general: 'General',
20
+ accounting: 'Accounting', text: 'Text', number: 'Number',
21
+ currency: 'Currency', date: 'Date', time: 'Time',
22
+ thousandthPercentile: 'Thousands separator', preview: 'Preview',
23
+ dateTime: 'Date and time', decimalLength: 'Decimal places',
24
+ currencyType: 'Currency Symbol', moreFmt: 'Formats',
25
+ financialValue: 'Financial value', roundingCurrency: 'Rounding up the currency',
26
+ timeDuration: 'Duration Time', addDecimal: 'Increase decimal places',
27
+ subtractDecimal: 'Decreasing decimal places', customFormat: 'Custom Format',
28
+ // Additional keys from en-US.json
29
+ negType: 'A negative number type',
30
+ currencyDes: 'The currency format is used to represent general currency values. The accounting format aligns a column of values with decimal points.',
31
+ accountingDes: 'The accounting number format aligns a column of values with currency symbols and decimal points.',
32
+ dateType: 'Date Type',
33
+ dateDes: 'The date format presents date and time series values as date values.',
34
+ generalDes: 'The regular format does not contain any specific number format.',
35
+ thousandthPercentileDes: 'The percentile format is used for the representation of ordinary numbers.',
36
+ customFormatDes: 'Generate custom number formats based on existing formats.',
37
+ },
38
+ },
39
+ };
40
+ // Numfmt locale tiếng Việt — nhúng trực tiếp cùng lý do như bản en ở trên
41
+ const sheetsNumfmtLocaleVi = {
42
+ sheet: {
43
+ numfmt: {
44
+ percent: 'Phần trăm', title: 'Định dạng số', numfmtType: 'Loại định dạng',
45
+ cancel: 'Hủy bỏ', confirm: 'Xác nhận', general: 'Chung',
46
+ accounting: 'Kế toán', text: 'Văn bản', number: 'Số',
47
+ currency: 'Tiền tệ', date: 'Ngày', time: 'Thời gian',
48
+ thousandthPercentile: 'Phân vị phần nghìn', preview: 'Xem trước',
49
+ dateTime: 'Ngày giờ', decimalLength: 'Số chữ số thập phân',
50
+ currencyType: 'Loại tiền tệ', moreFmt: 'Nhiều định dạng hơn',
51
+ financialValue: 'Giá trị tài chính', roundingCurrency: 'Tiền tệ làm tròn',
52
+ timeDuration: 'Thời lượng', addDecimal: 'Thêm chữ số thập phân',
53
+ subtractDecimal: 'Giảm chữ số thập phân', customFormat: 'Định dạng tùy chỉnh',
54
+ negType: 'Loại số âm',
55
+ currencyDes: 'Định dạng tiền tệ được sử dụng để biểu thị các giá trị tiền tệ thông thường. Định dạng kế toán có thể căn chỉnh các giá trị trong một cột với dấu thập phân.',
56
+ accountingDes: 'Định dạng số kế toán có thể căn chỉnh các ký hiệu tiền tệ và dấu thập phân trong một cột các giá trị.',
57
+ dateType: 'Loại ngày',
58
+ dateDes: 'Định dạng ngày biểu thị các giá trị chuỗi ngày và thời gian dưới dạng giá trị ngày.',
59
+ generalDes: 'Định dạng chung không chứa bất kỳ định dạng số cụ thể nào.',
60
+ thousandthPercentileDes: 'Định dạng phân vị phần nghìn được sử dụng để biểu thị các số thông thường.',
61
+ customFormatDes: 'Tạo định dạng số tùy chỉnh dựa trên các định dạng hiện có.',
62
+ },
63
+ },
64
+ };
65
+ export const univerLocaleEn = Tools.deepMerge(SheetsEnUS, DocsUIEnUS, SheetsUIEnUS, SheetsFormulaUIEnUS, sheetsNumfmtLocaleEn, UIEnUS, DesignEnUS);
66
+ export const univerLocaleVi = Tools.deepMerge(SheetsViVN, DocsUIViVN, SheetsUIViVN, SheetsFormulaUIViVN, sheetsNumfmtLocaleVi, UIViVN, DesignViVN);
67
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ByZWFkc2hlZXQubG9jYWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL3NwcmVhZHNoZWV0L3NyYy9zcHJlYWRzaGVldC5sb2NhbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZDLE9BQU8sVUFBVSxNQUFNLHdDQUF3QyxDQUFDO0FBQ2hFLE9BQU8sVUFBVSxNQUFNLHdDQUF3QyxDQUFDO0FBQ2hFLE9BQU8sVUFBVSxNQUFNLHlDQUF5QyxDQUFDO0FBQ2pFLE9BQU8sVUFBVSxNQUFNLHlDQUF5QyxDQUFDO0FBQ2pFLE9BQU8sVUFBVSxNQUFNLHdDQUF3QyxDQUFDO0FBQ2hFLE9BQU8sVUFBVSxNQUFNLHdDQUF3QyxDQUFDO0FBQ2hFLE9BQU8sbUJBQW1CLE1BQU0sbURBQW1ELENBQUM7QUFDcEYsT0FBTyxtQkFBbUIsTUFBTSxtREFBbUQsQ0FBQztBQUNwRixPQUFPLFlBQVksTUFBTSwyQ0FBMkMsQ0FBQztBQUNyRSxPQUFPLFlBQVksTUFBTSwyQ0FBMkMsQ0FBQztBQUNyRSxPQUFPLE1BQU0sTUFBTSxvQ0FBb0MsQ0FBQztBQUN4RCxPQUFPLE1BQU0sTUFBTSxvQ0FBb0MsQ0FBQztBQUV4RCxvR0FBb0c7QUFDcEcsTUFBTSxvQkFBb0IsR0FBRztJQUMzQixLQUFLLEVBQUU7UUFDTCxNQUFNLEVBQUU7WUFDTixPQUFPLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxlQUFlLEVBQUUsVUFBVSxFQUFFLGNBQWM7WUFDekUsTUFBTSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxTQUFTO1lBQ3hELFVBQVUsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsUUFBUTtZQUN4RCxRQUFRLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU07WUFDaEQsb0JBQW9CLEVBQUUscUJBQXFCLEVBQUUsT0FBTyxFQUFFLFNBQVM7WUFDL0QsUUFBUSxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsZ0JBQWdCO1lBQzFELFlBQVksRUFBRSxpQkFBaUIsRUFBRSxPQUFPLEVBQUUsU0FBUztZQUNuRCxjQUFjLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsMEJBQTBCO1lBQy9FLFlBQVksRUFBRSxlQUFlLEVBQUUsVUFBVSxFQUFFLHlCQUF5QjtZQUNwRSxlQUFlLEVBQUUsMkJBQTJCLEVBQUUsWUFBWSxFQUFFLGVBQWU7WUFDM0Usa0NBQWtDO1lBQ2xDLE9BQU8sRUFBRSx3QkFBd0I7WUFDakMsV0FBVyxFQUFFLHdJQUF3STtZQUNySixhQUFhLEVBQUUsa0dBQWtHO1lBQ2pILFFBQVEsRUFBRSxXQUFXO1lBQ3JCLE9BQU8sRUFBRSxzRUFBc0U7WUFDL0UsVUFBVSxFQUFFLGlFQUFpRTtZQUM3RSx1QkFBdUIsRUFBRSwyRUFBMkU7WUFDcEcsZUFBZSxFQUFFLDJEQUEyRDtTQUM3RTtLQUNGO0NBQ0YsQ0FBQztBQUVGLDBFQUEwRTtBQUMxRSxNQUFNLG9CQUFvQixHQUFHO0lBQzNCLEtBQUssRUFBRTtRQUNMLE1BQU0sRUFBRTtZQUNOLE9BQU8sRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLGNBQWMsRUFBRSxVQUFVLEVBQUUsZ0JBQWdCO1lBQ3pFLE1BQU0sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsT0FBTztZQUN2RCxVQUFVLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLElBQUk7WUFDcEQsUUFBUSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxXQUFXO1lBQ3BELG9CQUFvQixFQUFFLG9CQUFvQixFQUFFLE9BQU8sRUFBRSxXQUFXO1lBQ2hFLFFBQVEsRUFBRSxVQUFVLEVBQUUsYUFBYSxFQUFFLHFCQUFxQjtZQUMxRCxZQUFZLEVBQUUsY0FBYyxFQUFFLE9BQU8sRUFBRSxxQkFBcUI7WUFDNUQsY0FBYyxFQUFFLG1CQUFtQixFQUFFLGdCQUFnQixFQUFFLGtCQUFrQjtZQUN6RSxZQUFZLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSx1QkFBdUI7WUFDL0QsZUFBZSxFQUFFLHVCQUF1QixFQUFFLFlBQVksRUFBRSxxQkFBcUI7WUFDN0UsT0FBTyxFQUFFLFlBQVk7WUFDckIsV0FBVyxFQUFFLDhKQUE4SjtZQUMzSyxhQUFhLEVBQUUsdUdBQXVHO1lBQ3RILFFBQVEsRUFBRSxXQUFXO1lBQ3JCLE9BQU8sRUFBRSxxRkFBcUY7WUFDOUYsVUFBVSxFQUFFLDREQUE0RDtZQUN4RSx1QkFBdUIsRUFBRSw0RUFBNEU7WUFDckcsZUFBZSxFQUFFLDREQUE0RDtTQUM5RTtLQUNGO0NBQ0YsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUMzQyxVQUFVLEVBQ1YsVUFBVSxFQUNWLFlBQVksRUFDWixtQkFBbUIsRUFDbkIsb0JBQW9CLEVBQ3BCLE1BQU0sRUFDTixVQUFVLENBQ1gsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUMzQyxVQUFVLEVBQ1YsVUFBVSxFQUNWLFlBQVksRUFDWixtQkFBbUIsRUFDbkIsb0JBQW9CLEVBQ3BCLE1BQU0sRUFDTixVQUFVLENBQ1gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRvb2xzIH0gZnJvbSAnQHVuaXZlcmpzL2NvcmUnO1xuaW1wb3J0IERlc2lnbkVuVVMgZnJvbSAnQHVuaXZlcmpzL2Rlc2lnbi9saWIvbG9jYWxlL2VuLVVTLmpzb24nO1xuaW1wb3J0IERlc2lnblZpVk4gZnJvbSAnQHVuaXZlcmpzL2Rlc2lnbi9saWIvbG9jYWxlL3ZpLVZOLmpzb24nO1xuaW1wb3J0IERvY3NVSUVuVVMgZnJvbSAnQHVuaXZlcmpzL2RvY3MtdWkvbGliL2xvY2FsZS9lbi1VUy5qc29uJztcbmltcG9ydCBEb2NzVUlWaVZOIGZyb20gJ0B1bml2ZXJqcy9kb2NzLXVpL2xpYi9sb2NhbGUvdmktVk4uanNvbic7XG5pbXBvcnQgU2hlZXRzRW5VUyBmcm9tICdAdW5pdmVyanMvc2hlZXRzL2xpYi9sb2NhbGUvZW4tVVMuanNvbic7XG5pbXBvcnQgU2hlZXRzVmlWTiBmcm9tICdAdW5pdmVyanMvc2hlZXRzL2xpYi9sb2NhbGUvdmktVk4uanNvbic7XG5pbXBvcnQgU2hlZXRzRm9ybXVsYVVJRW5VUyBmcm9tICdAdW5pdmVyanMvc2hlZXRzLWZvcm11bGEtdWkvbGliL2xvY2FsZS9lbi1VUy5qc29uJztcbmltcG9ydCBTaGVldHNGb3JtdWxhVUlWaVZOIGZyb20gJ0B1bml2ZXJqcy9zaGVldHMtZm9ybXVsYS11aS9saWIvbG9jYWxlL3ZpLVZOLmpzb24nO1xuaW1wb3J0IFNoZWV0c1VJRW5VUyBmcm9tICdAdW5pdmVyanMvc2hlZXRzLXVpL2xpYi9sb2NhbGUvZW4tVVMuanNvbic7XG5pbXBvcnQgU2hlZXRzVUlWaVZOIGZyb20gJ0B1bml2ZXJqcy9zaGVldHMtdWkvbGliL2xvY2FsZS92aS1WTi5qc29uJztcbmltcG9ydCBVSUVuVVMgZnJvbSAnQHVuaXZlcmpzL3VpL2xpYi9sb2NhbGUvZW4tVVMuanNvbic7XG5pbXBvcnQgVUlWaVZOIGZyb20gJ0B1bml2ZXJqcy91aS9saWIvbG9jYWxlL3ZpLVZOLmpzb24nO1xuXG4vLyBOdW1mbXQgbG9jYWxlIGVtYmVkZGVkIGRpcmVjdGx5IOKAlCBhdm9pZHMgVFMgbW9kdWxlIHJlc29sdXRpb24gaXNzdWVzIHdpdGggSlNPTiBpbiBwYWNrYWdlIGV4cG9ydHNcbmNvbnN0IHNoZWV0c051bWZtdExvY2FsZUVuID0ge1xuICBzaGVldDoge1xuICAgIG51bWZtdDoge1xuICAgICAgcGVyY2VudDogJ1BlcmNlbnRhZ2UnLCB0aXRsZTogJ051bWJlciBmb3JtYXQnLCBudW1mbXRUeXBlOiAnRm9ybWF0IHR5cGVzJyxcbiAgICAgIGNhbmNlbDogJ0NhbmNlbCcsIGNvbmZpcm06ICdDb25maXJtJywgZ2VuZXJhbDogJ0dlbmVyYWwnLFxuICAgICAgYWNjb3VudGluZzogJ0FjY291bnRpbmcnLCB0ZXh0OiAnVGV4dCcsIG51bWJlcjogJ051bWJlcicsXG4gICAgICBjdXJyZW5jeTogJ0N1cnJlbmN5JywgZGF0ZTogJ0RhdGUnLCB0aW1lOiAnVGltZScsXG4gICAgICB0aG91c2FuZHRoUGVyY2VudGlsZTogJ1Rob3VzYW5kcyBzZXBhcmF0b3InLCBwcmV2aWV3OiAnUHJldmlldycsXG4gICAgICBkYXRlVGltZTogJ0RhdGUgYW5kIHRpbWUnLCBkZWNpbWFsTGVuZ3RoOiAnRGVjaW1hbCBwbGFjZXMnLFxuICAgICAgY3VycmVuY3lUeXBlOiAnQ3VycmVuY3kgU3ltYm9sJywgbW9yZUZtdDogJ0Zvcm1hdHMnLFxuICAgICAgZmluYW5jaWFsVmFsdWU6ICdGaW5hbmNpYWwgdmFsdWUnLCByb3VuZGluZ0N1cnJlbmN5OiAnUm91bmRpbmcgdXAgdGhlIGN1cnJlbmN5JyxcbiAgICAgIHRpbWVEdXJhdGlvbjogJ0R1cmF0aW9uIFRpbWUnLCBhZGREZWNpbWFsOiAnSW5jcmVhc2UgZGVjaW1hbCBwbGFjZXMnLFxuICAgICAgc3VidHJhY3REZWNpbWFsOiAnRGVjcmVhc2luZyBkZWNpbWFsIHBsYWNlcycsIGN1c3RvbUZvcm1hdDogJ0N1c3RvbSBGb3JtYXQnLFxuICAgICAgLy8gQWRkaXRpb25hbCBrZXlzIGZyb20gZW4tVVMuanNvblxuICAgICAgbmVnVHlwZTogJ0EgbmVnYXRpdmUgbnVtYmVyIHR5cGUnLFxuICAgICAgY3VycmVuY3lEZXM6ICdUaGUgY3VycmVuY3kgZm9ybWF0IGlzIHVzZWQgdG8gcmVwcmVzZW50IGdlbmVyYWwgY3VycmVuY3kgdmFsdWVzLiBUaGUgYWNjb3VudGluZyBmb3JtYXQgYWxpZ25zIGEgY29sdW1uIG9mIHZhbHVlcyB3aXRoIGRlY2ltYWwgcG9pbnRzLicsXG4gICAgICBhY2NvdW50aW5nRGVzOiAnVGhlIGFjY291bnRpbmcgbnVtYmVyIGZvcm1hdCBhbGlnbnMgYSBjb2x1bW4gb2YgdmFsdWVzIHdpdGggY3VycmVuY3kgc3ltYm9scyBhbmQgZGVjaW1hbCBwb2ludHMuJyxcbiAgICAgIGRhdGVUeXBlOiAnRGF0ZSBUeXBlJyxcbiAgICAgIGRhdGVEZXM6ICdUaGUgZGF0ZSBmb3JtYXQgcHJlc2VudHMgZGF0ZSBhbmQgdGltZSBzZXJpZXMgdmFsdWVzIGFzIGRhdGUgdmFsdWVzLicsXG4gICAgICBnZW5lcmFsRGVzOiAnVGhlIHJlZ3VsYXIgZm9ybWF0IGRvZXMgbm90IGNvbnRhaW4gYW55IHNwZWNpZmljIG51bWJlciBmb3JtYXQuJyxcbiAgICAgIHRob3VzYW5kdGhQZXJjZW50aWxlRGVzOiAnVGhlIHBlcmNlbnRpbGUgZm9ybWF0IGlzIHVzZWQgZm9yIHRoZSByZXByZXNlbnRhdGlvbiBvZiBvcmRpbmFyeSBudW1iZXJzLicsXG4gICAgICBjdXN0b21Gb3JtYXREZXM6ICdHZW5lcmF0ZSBjdXN0b20gbnVtYmVyIGZvcm1hdHMgYmFzZWQgb24gZXhpc3RpbmcgZm9ybWF0cy4nLFxuICAgIH0sXG4gIH0sXG59O1xuXG4vLyBOdW1mbXQgbG9jYWxlIHRp4bq/bmcgVmnhu4d0IOKAlCBuaMO6bmcgdHLhu7FjIHRp4bq/cCBjw7luZyBsw70gZG8gbmjGsCBi4bqjbiBlbiDhu58gdHLDqm5cbmNvbnN0IHNoZWV0c051bWZtdExvY2FsZVZpID0ge1xuICBzaGVldDoge1xuICAgIG51bWZtdDoge1xuICAgICAgcGVyY2VudDogJ1Bo4bqnbiB0csSDbScsIHRpdGxlOiAnxJDhu4tuaCBk4bqhbmcgc+G7kScsIG51bWZtdFR5cGU6ICdMb+G6oWkgxJHhu4tuaCBk4bqhbmcnLFxuICAgICAgY2FuY2VsOiAnSOG7p3kgYuG7jycsIGNvbmZpcm06ICdYw6FjIG5o4bqtbicsIGdlbmVyYWw6ICdDaHVuZycsXG4gICAgICBhY2NvdW50aW5nOiAnS+G6vyB0b8OhbicsIHRleHQ6ICdWxINuIGLhuqNuJywgbnVtYmVyOiAnU+G7kScsXG4gICAgICBjdXJyZW5jeTogJ1Rp4buBbiB04buHJywgZGF0ZTogJ05nw6B5JywgdGltZTogJ1Ro4budaSBnaWFuJyxcbiAgICAgIHRob3VzYW5kdGhQZXJjZW50aWxlOiAnUGjDom4gduG7iyBwaOG6p24gbmdow6xuJywgcHJldmlldzogJ1hlbSB0csaw4bubYycsXG4gICAgICBkYXRlVGltZTogJ05nw6B5IGdp4budJywgZGVjaW1hbExlbmd0aDogJ1Phu5EgY2jhu68gc+G7kSB0aOG6rXAgcGjDom4nLFxuICAgICAgY3VycmVuY3lUeXBlOiAnTG/huqFpIHRp4buBbiB04buHJywgbW9yZUZtdDogJ05oaeG7gXUgxJHhu4tuaCBk4bqhbmcgaMahbicsXG4gICAgICBmaW5hbmNpYWxWYWx1ZTogJ0dpw6EgdHLhu4sgdMOgaSBjaMOtbmgnLCByb3VuZGluZ0N1cnJlbmN5OiAnVGnhu4FuIHThu4cgbMOgbSB0csOybicsXG4gICAgICB0aW1lRHVyYXRpb246ICdUaOG7nWkgbMaw4bujbmcnLCBhZGREZWNpbWFsOiAnVGjDqm0gY2jhu68gc+G7kSB0aOG6rXAgcGjDom4nLFxuICAgICAgc3VidHJhY3REZWNpbWFsOiAnR2nhuqNtIGNo4buvIHPhu5EgdGjhuq1wIHBow6JuJywgY3VzdG9tRm9ybWF0OiAnxJDhu4tuaCBk4bqhbmcgdMO5eSBjaOG7iW5oJyxcbiAgICAgIG5lZ1R5cGU6ICdMb+G6oWkgc+G7kSDDom0nLFxuICAgICAgY3VycmVuY3lEZXM6ICfEkOG7i25oIGThuqFuZyB0aeG7gW4gdOG7hyDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyBiaeG7g3UgdGjhu4sgY8OhYyBnacOhIHRy4buLIHRp4buBbiB04buHIHRow7RuZyB0aMaw4budbmcuIMSQ4buLbmggZOG6oW5nIGvhur8gdG/DoW4gY8OzIHRo4buDIGPEg24gY2jhu4luaCBjw6FjIGdpw6EgdHLhu4sgdHJvbmcgbeG7mXQgY+G7mXQgduG7m2kgZOG6pXUgdGjhuq1wIHBow6JuLicsXG4gICAgICBhY2NvdW50aW5nRGVzOiAnxJDhu4tuaCBk4bqhbmcgc+G7kSBr4bq/IHRvw6FuIGPDsyB0aOG7gyBjxINuIGNo4buJbmggY8OhYyBrw70gaGnhu4d1IHRp4buBbiB04buHIHbDoCBk4bqldSB0aOG6rXAgcGjDom4gdHJvbmcgbeG7mXQgY+G7mXQgY8OhYyBnacOhIHRy4buLLicsXG4gICAgICBkYXRlVHlwZTogJ0xv4bqhaSBuZ8OgeScsXG4gICAgICBkYXRlRGVzOiAnxJDhu4tuaCBk4bqhbmcgbmfDoHkgYmnhu4N1IHRo4buLIGPDoWMgZ2nDoSB0cuG7iyBjaHXhu5dpIG5nw6B5IHbDoCB0aOG7nWkgZ2lhbiBkxrDhu5tpIGThuqFuZyBnacOhIHRy4buLIG5nw6B5LicsXG4gICAgICBnZW5lcmFsRGVzOiAnxJDhu4tuaCBk4bqhbmcgY2h1bmcga2jDtG5nIGNo4bupYSBi4bqldCBr4buzIMSR4buLbmggZOG6oW5nIHPhu5EgY+G7pSB0aOG7gyBuw6BvLicsXG4gICAgICB0aG91c2FuZHRoUGVyY2VudGlsZURlczogJ8SQ4buLbmggZOG6oW5nIHBow6JuIHbhu4sgcGjhuqduIG5naMOsbiDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyBiaeG7g3UgdGjhu4sgY8OhYyBz4buRIHRow7RuZyB0aMaw4budbmcuJyxcbiAgICAgIGN1c3RvbUZvcm1hdERlczogJ1ThuqFvIMSR4buLbmggZOG6oW5nIHPhu5EgdMO5eSBjaOG7iW5oIGThu7FhIHRyw6puIGPDoWMgxJHhu4tuaCBk4bqhbmcgaGnhu4duIGPDsy4nLFxuICAgIH0sXG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgdW5pdmVyTG9jYWxlRW4gPSBUb29scy5kZWVwTWVyZ2UoXG4gIFNoZWV0c0VuVVMsXG4gIERvY3NVSUVuVVMsXG4gIFNoZWV0c1VJRW5VUyxcbiAgU2hlZXRzRm9ybXVsYVVJRW5VUyxcbiAgc2hlZXRzTnVtZm10TG9jYWxlRW4sXG4gIFVJRW5VUyxcbiAgRGVzaWduRW5VUyxcbik7XG5cbmV4cG9ydCBjb25zdCB1bml2ZXJMb2NhbGVWaSA9IFRvb2xzLmRlZXBNZXJnZShcbiAgU2hlZXRzVmlWTixcbiAgRG9jc1VJVmlWTixcbiAgU2hlZXRzVUlWaVZOLFxuICBTaGVldHNGb3JtdWxhVUlWaVZOLFxuICBzaGVldHNOdW1mbXRMb2NhbGVWaSxcbiAgVUlWaVZOLFxuICBEZXNpZ25WaVZOLFxuKTsiXX0=
@@ -0,0 +1,209 @@
1
+ import { getPatternPreview } from '@univerjs/sheets-numfmt';
2
+ import { fromEvent } from 'rxjs';
3
+ /**
4
+ * Giá trị mẫu MẶC ĐỊNH để sinh preview = 2021-03-14 13:45:30 (Excel serial).
5
+ * Chọn ngày 14 (>12) để phân biệt dd↔mm, giờ 13 để phân biệt 24h↔AM/PM, có cả giây.
6
+ * CHỈ dùng khi ô đang chọn không có giá trị ngày hợp lệ — nếu có, ưu tiên giá trị THỰC của ô
7
+ * để label option khớp đúng dữ liệu hiển thị trong cột (giống Excel).
8
+ */
9
+ const SAMPLE_SERIAL = 44269 + 49530 / 86400;
10
+ /**
11
+ * Danh sách định dạng ngày/giờ kiểu Excel (ordered: Ngày → Ngày+Giờ → Giờ).
12
+ * Label hiển thị cho người dùng là PREVIEW của SAMPLE (vd 'dd/mm/yyyy' → "14/03/2021"),
13
+ * trực quan giống hộp "Type" của Excel; pattern thực được lưu ở data-pattern để áp.
14
+ */
15
+ const CUSTOM_DATE_PATTERNS = [
16
+ // ── Ngày ──
17
+ 'dd/mm/yyyy',
18
+ 'd/m/yyyy',
19
+ 'dd/mm/yy',
20
+ 'mm/dd/yyyy',
21
+ 'yyyy-mm-dd',
22
+ 'dd-mmm-yyyy',
23
+ 'dd-mmm-yy',
24
+ 'd mmmm yyyy',
25
+ 'mmm yyyy',
26
+ 'mmmm yyyy',
27
+ 'dddd, d mmmm yyyy',
28
+ // ── Ngày + giờ ──
29
+ 'dd/mm/yyyy hh:mm',
30
+ 'dd/mm/yyyy h:mm AM/PM',
31
+ 'dd/mm/yyyy hh:mm:ss',
32
+ 'yyyy-mm-dd hh:mm:ss',
33
+ // ── Giờ ──
34
+ 'hh:mm',
35
+ 'hh:mm:ss',
36
+ 'h:mm AM/PM',
37
+ 'h:mm:ss AM/PM',
38
+ 'mm:ss',
39
+ '[h]:mm:ss',
40
+ ];
41
+ /** Sinh chuỗi preview (giá trị mẫu đã format) cho 1 pattern; fallback về pattern nếu lỗi. */
42
+ const previewOf = (pattern, sample) => {
43
+ try {
44
+ return getPatternPreview(pattern, sample).result || pattern;
45
+ }
46
+ catch {
47
+ return pattern;
48
+ }
49
+ };
50
+ /**
51
+ * Re-assert highlight cho option đang chọn sau khi Univer re-render panel (React có thể xoá class).
52
+ * Dựa trên cờ data-numfmt-selected (do setActive đặt) — không suy diễn từ DOM label.
53
+ */
54
+ export const syncActiveNumfmtHighlight = () => {
55
+ const panel = document.querySelector('.numfmt-panel');
56
+ if (!panel)
57
+ return;
58
+ panel.querySelectorAll('.univer-numfmt-custom-item').forEach((item) => {
59
+ item.classList.toggle('univer-numfmt-active', item.hasAttribute('data-numfmt-selected'));
60
+ });
61
+ };
62
+ /**
63
+ * Thay danh sách định dạng ngày mặc định của Univer bằng các option custom (CUSTOM_DATE_PATTERNS),
64
+ * hiển thị dưới dạng PREVIEW trực quan. Univer render panel numfmt bằng React và không expose API
65
+ * nên phải thao tác DOM trực tiếp.
66
+ *
67
+ * @param getSnapshot Lấy vùng chọn hiện tại (để áp numfmt).
68
+ * @param executeCmd Chạy Univer command.
69
+ * @param onPatternSelected Báo component pattern vừa chọn (Confirm) hoặc null (Cancel) để đồng bộ.
70
+ * @param getActiveCellFormat Đọc pattern hiện tại của cell — dùng highlight option khớp khi mở.
71
+ * @param clearPreview Xoá live-preview overlay của Univer để canvas vẽ đúng model ngay.
72
+ * @param getSampleValue Lấy giá trị THỰC (serial) của ô đại diện để label preview khớp dữ liệu cột;
73
+ * null → dùng SAMPLE_SERIAL mặc định.
74
+ * @returns hàm cleanup (gỡ mọi listener) — gọi khi teardown hoặc trước lần inject mới.
75
+ */
76
+ export const injectCustomDateFormats = (getSnapshot, executeCmd, onPatternSelected, getActiveCellFormat, clearPreview, getSampleValue, onConfirm) => {
77
+ const panel = document.querySelector('.numfmt-panel');
78
+ if (!panel)
79
+ return;
80
+ // Guard: chỉ inject 1 lần / phiên (component xoá data-custom-dates khi đóng panel để reopen re-inject).
81
+ const listContainer = panel.querySelector('ul.univer-select-list');
82
+ if (!listContainer || listContainer.hasAttribute('data-custom-dates'))
83
+ return;
84
+ // Nhận diện panel Date theo 2 trường hợp:
85
+ // 1. Univer vừa render list ngày GỐC (li dạng yyyy-mm-dd) — lần đầu chọn Type=Date.
86
+ // 2. Univer TÁI DÙNG DOM panel cũ (reopen) → list đang chứa sẵn custom item của ta từ phiên trước.
87
+ const hasUniverDateItems = Array.from(listContainer.querySelectorAll('li')).some((el) => /^\d{4}[-/]\d{2}[-/]\d{2}$/.test(el.textContent?.trim() ?? ''));
88
+ const hasOurItems = !!listContainer.querySelector('.univer-numfmt-custom-item');
89
+ if (!hasUniverDateItems && !hasOurItems)
90
+ return;
91
+ listContainer.setAttribute('data-custom-dates', 'true');
92
+ const itemTemplate = listContainer.querySelector('li');
93
+ const defaultItems = Array.from(listContainer.children);
94
+ const applyFormat = (pattern) => {
95
+ const snap = getSnapshot();
96
+ if (!snap)
97
+ return;
98
+ const values = [];
99
+ const maxRow = Math.min(snap.endRow, snap.startRow + 499);
100
+ for (let r = snap.startRow; r <= maxRow; r++) {
101
+ for (let c = snap.startColumn; c <= snap.endColumn; c++) {
102
+ values.push({ pattern, row: r, col: c });
103
+ }
104
+ }
105
+ if (!values.length)
106
+ return;
107
+ executeCmd('sheet.command.numfmt.set.numfmt', { unitId: snap.unitId, subUnitId: snap.subUnitId, values });
108
+ // Univer giữ live-preview overlay (NumfmtController._previewPattern) che hiển thị model của
109
+ // vùng chọn khi panel mở. Ta đã ghi model trực tiếp nên phải xoá preview để canvas vẽ đúng ngay.
110
+ clearPreview?.();
111
+ };
112
+ let pendingPattern = null;
113
+ let activeItem = null;
114
+ const setActive = (item) => {
115
+ if (activeItem) {
116
+ activeItem.classList.remove('univer-numfmt-active');
117
+ activeItem.removeAttribute('data-numfmt-selected');
118
+ }
119
+ item.classList.add('univer-numfmt-active');
120
+ item.setAttribute('data-numfmt-selected', 'true');
121
+ activeItem = item;
122
+ };
123
+ const subs = [];
124
+ const cleanup = () => {
125
+ subs.forEach((s) => s.unsubscribe());
126
+ subs.length = 0;
127
+ };
128
+ // Nhận diện nút theo CLASS (không phụ thuộc ngôn ngữ): Univer render Confirm = button-primary,
129
+ // Cancel = button-default. KHÔNG match theo text ('Confirm'/'Cancel') vì sẽ vỡ khi locale là tiếng Việt.
130
+ const panelButtons = Array.from(panel.querySelectorAll('button'));
131
+ const confirmBtn = panelButtons.find((b) => b.classList.contains('univer-button-primary'));
132
+ const cancelBtn = panelButtons.find((b) => b.classList.contains('univer-button-default'));
133
+ // Capture phase: chạy trước Univer handler. KHÔNG cleanup() trong handler vì Univer tái dùng DOM panel —
134
+ // gỡ listener sẽ làm option không click được khi mở lại. cleanup chỉ chạy khi teardown thật.
135
+ if (confirmBtn) {
136
+ subs.push(fromEvent(confirmBtn, 'click', { capture: true }).subscribe(() => {
137
+ // Đánh dấu Confirm → component GIỮ format. Cancel/X/click-ngoài KHÔNG gọi → mặc định revert.
138
+ onConfirm?.();
139
+ if (!pendingPattern)
140
+ return;
141
+ applyFormat(pendingPattern);
142
+ onPatternSelected?.(pendingPattern);
143
+ }));
144
+ }
145
+ if (cancelBtn) {
146
+ subs.push(fromEvent(cancelBtn, 'click', { capture: true }).subscribe(() => {
147
+ if (activeItem) {
148
+ activeItem.classList.remove('univer-numfmt-active');
149
+ activeItem.removeAttribute('data-numfmt-selected');
150
+ activeItem = null;
151
+ }
152
+ // pendingPattern = null → component khôi phục numfmt gốc từng ô (xem close.numfmt.panel handler).
153
+ pendingPattern = null;
154
+ onPatternSelected?.(null);
155
+ }));
156
+ }
157
+ for (const pattern of CUSTOM_DATE_PATTERNS) {
158
+ const item = (itemTemplate ?? document.createElement('div')).cloneNode(false);
159
+ // Khi reopen, itemTemplate là custom item cũ → xoá cờ highlight/selected sao chép theo để tránh stale.
160
+ item.removeAttribute('data-numfmt-selected');
161
+ item.classList.remove('univer-numfmt-active');
162
+ item.textContent = previewOf(pattern, getSampleValue?.() ?? SAMPLE_SERIAL);
163
+ item.dataset['pattern'] = pattern;
164
+ item.style.cursor = 'pointer';
165
+ item.classList.add('univer-numfmt-custom-item');
166
+ subs.push(fromEvent(item, 'mousedown').subscribe((e) => e.preventDefault()));
167
+ subs.push(fromEvent(item, 'click').subscribe((e) => {
168
+ e.stopPropagation();
169
+ setActive(item);
170
+ pendingPattern = pattern;
171
+ applyFormat(pattern);
172
+ onPatternSelected?.(pattern);
173
+ }));
174
+ listContainer.appendChild(item);
175
+ }
176
+ defaultItems.forEach((el) => el.remove());
177
+ /**
178
+ * Đồng bộ panel theo vùng chọn HIỆN TẠI (getSnapshot/getActiveCellFormat/getSampleValue đọc fresh):
179
+ * 1. Sinh lại label preview theo giá trị THỰC của ô đại diện cột mới (khớp dữ liệu, giống Excel).
180
+ * 2. Highlight option khớp format hiện có; nếu cột chưa có format → chọn option ĐẦU TIÊN.
181
+ * 3. ÁP LUÔN pattern đó lên cả vùng → dữ liệu đổi hiển thị ngay; set pending để Confirm giữ.
182
+ * Gọi khi mở panel VÀ mỗi khi user đổi cột/cell trên grid lúc panel đang mở.
183
+ * Cancel / X → component khôi phục giá trị gốc (originalCellFormats đã chụp/tích luỹ khi mở/đổi vùng).
184
+ */
185
+ const resync = () => {
186
+ const sample = getSampleValue?.() ?? SAMPLE_SERIAL;
187
+ const items = Array.from(listContainer.querySelectorAll('.univer-numfmt-custom-item'));
188
+ items.forEach((el) => { el.textContent = previewOf(el.dataset['pattern'] ?? '', sample); });
189
+ const activeFmt = (getActiveCellFormat?.() ?? '').toLowerCase();
190
+ const matched = activeFmt && activeFmt !== 'general'
191
+ ? items.find((el) => (el.dataset['pattern'] ?? '').toLowerCase() === activeFmt)
192
+ : undefined;
193
+ const initial = matched ?? items[0];
194
+ if (!initial)
195
+ return;
196
+ setActive(initial);
197
+ pendingPattern = initial.dataset['pattern'] ?? null;
198
+ if (!pendingPattern)
199
+ return;
200
+ applyFormat(pendingPattern);
201
+ onPatternSelected?.(pendingPattern);
202
+ };
203
+ resync();
204
+ // Net chống race: nếu Univer set lại preview overlay NGAY SAU khi panel render (sau applyFormat ở trên),
205
+ // xoá lần nữa sau 1 nhịp để canvas hiển thị numfmt THẬT của model. (applyFormat đã clearPreview đồng bộ.)
206
+ setTimeout(() => clearPreview?.(), 60);
207
+ return { cleanup, resync };
208
+ };
209
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ByZWFkc2hlZXQubnVtZm10LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL3NwcmVhZHNoZWV0L3NyYy9zcHJlYWRzaGVldC5udW1mbXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDNUQsT0FBTyxFQUFnQixTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFJL0M7Ozs7O0dBS0c7QUFDSCxNQUFNLGFBQWEsR0FBRyxLQUFLLEdBQUcsS0FBSyxHQUFHLEtBQUssQ0FBQztBQUU1Qzs7OztHQUlHO0FBQ0gsTUFBTSxvQkFBb0IsR0FBYTtJQUNyQyxhQUFhO0lBQ2IsWUFBWTtJQUNaLFVBQVU7SUFDVixVQUFVO0lBQ1YsWUFBWTtJQUNaLFlBQVk7SUFDWixhQUFhO0lBQ2IsV0FBVztJQUNYLGFBQWE7SUFDYixVQUFVO0lBQ1YsV0FBVztJQUNYLG1CQUFtQjtJQUNuQixtQkFBbUI7SUFDbkIsa0JBQWtCO0lBQ2xCLHVCQUF1QjtJQUN2QixxQkFBcUI7SUFDckIscUJBQXFCO0lBQ3JCLFlBQVk7SUFDWixPQUFPO0lBQ1AsVUFBVTtJQUNWLFlBQVk7SUFDWixlQUFlO0lBQ2YsT0FBTztJQUNQLFdBQVc7Q0FDWixDQUFDO0FBRUYsNkZBQTZGO0FBQzdGLE1BQU0sU0FBUyxHQUFHLENBQUMsT0FBZSxFQUFFLE1BQWMsRUFBVSxFQUFFO0lBQzVELElBQUksQ0FBQztRQUNILE9BQU8saUJBQWlCLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDLE1BQU0sSUFBSSxPQUFPLENBQUM7SUFDOUQsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7QUFDSCxDQUFDLENBQUM7QUFFRjs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBRyxHQUFHLEVBQUU7SUFD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LENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLElBQUksQ0FBQztRQUNwRCxJQUFJLENBQUMsY0FBYztZQUFFLE9BQU87UUFDNUIsV0FBVyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQzVCLGlCQUFpQixFQUFFLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDdEMsQ0FBQyxDQUFDO0lBRUYsTUFBTSxFQUFFLENBQUM7SUFFVCx5R0FBeUc7SUFDekcsMEdBQTBHO0lBQzFHLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxZQUFZLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBRXZDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUM7QUFDN0IsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZ2V0UGF0dGVyblByZXZpZXcgfSBmcm9tICdAdW5pdmVyanMvc2hlZXRzLW51bWZtdCc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24sIGZyb21FdmVudCB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgdHlwZSB7IFRfcmFuZ2VTbmFwc2hvdCB9IGZyb20gJy4vc3ByZWFkc2hlZXQudHlwZSc7XG5cbi8qKlxuICogR2nDoSB0cuG7iyBt4bqrdSBN4bq2QyDEkOG7ik5IIMSR4buDIHNpbmggcHJldmlldyA9IDIwMjEtMDMtMTQgMTM6NDU6MzAgKEV4Y2VsIHNlcmlhbCkuXG4gKiBDaOG7jW4gbmfDoHkgMTQgKD4xMikgxJHhu4MgcGjDom4gYmnhu4d0IGRk4oaUbW0sIGdp4budIDEzIMSR4buDIHBow6JuIGJp4buHdCAyNGjihpRBTS9QTSwgY8OzIGPhuqMgZ2nDonkuXG4gKiBDSOG7iCBkw7luZyBraGkgw7QgxJFhbmcgY2jhu41uIGtow7RuZyBjw7MgZ2nDoSB0cuG7iyBuZ8OgeSBo4bujcCBs4buHIOKAlCBu4bq/dSBjw7MsIMawdSB0acOqbiBnacOhIHRy4buLIFRI4buwQyBj4bunYSDDtFxuICogxJHhu4MgbGFiZWwgb3B0aW9uIGto4bubcCDEkcO6bmcgZOG7ryBsaeG7h3UgaGnhu4NuIHRo4buLIHRyb25nIGPhu5l0IChnaeG7kW5nIEV4Y2VsKS5cbiAqL1xuY29uc3QgU0FNUExFX1NFUklBTCA9IDQ0MjY5ICsgNDk1MzAgLyA4NjQwMDtcblxuLyoqXG4gKiBEYW5oIHPDoWNoIMSR4buLbmggZOG6oW5nIG5nw6B5L2dp4budIGtp4buDdSBFeGNlbCAob3JkZXJlZDogTmfDoHkg4oaSIE5nw6B5K0dp4budIOKGkiBHaeG7nSkuXG4gKiBMYWJlbCBoaeG7g24gdGjhu4sgY2hvIG5nxrDhu51pIGTDuW5nIGzDoCBQUkVWSUVXIGPhu6dhIFNBTVBMRSAodmQgJ2RkL21tL3l5eXknIOKGkiBcIjE0LzAzLzIwMjFcIiksXG4gKiB0cuG7sWMgcXVhbiBnaeG7kW5nIGjhu5lwIFwiVHlwZVwiIGPhu6dhIEV4Y2VsOyBwYXR0ZXJuIHRo4buxYyDEkcaw4bujYyBsxrB1IOG7nyBkYXRhLXBhdHRlcm4gxJHhu4Mgw6FwLlxuICovXG5jb25zdCBDVVNUT01fREFURV9QQVRURVJOUzogc3RyaW5nW10gPSBbXG4gIC8vIOKUgOKUgCBOZ8OgeSDilIDilIBcbiAgJ2RkL21tL3l5eXknLFxuICAnZC9tL3l5eXknLFxuICAnZGQvbW0veXknLFxuICAnbW0vZGQveXl5eScsXG4gICd5eXl5LW1tLWRkJyxcbiAgJ2RkLW1tbS15eXl5JyxcbiAgJ2RkLW1tbS15eScsXG4gICdkIG1tbW0geXl5eScsXG4gICdtbW0geXl5eScsXG4gICdtbW1tIHl5eXknLFxuICAnZGRkZCwgZCBtbW1tIHl5eXknLFxuICAvLyDilIDilIAgTmfDoHkgKyBnaeG7nSDilIDilIBcbiAgJ2RkL21tL3l5eXkgaGg6bW0nLFxuICAnZGQvbW0veXl5eSBoOm1tIEFNL1BNJyxcbiAgJ2RkL21tL3l5eXkgaGg6bW06c3MnLFxuICAneXl5eS1tbS1kZCBoaDptbTpzcycsXG4gIC8vIOKUgOKUgCBHaeG7nSDilIDilIBcbiAgJ2hoOm1tJyxcbiAgJ2hoOm1tOnNzJyxcbiAgJ2g6bW0gQU0vUE0nLFxuICAnaDptbTpzcyBBTS9QTScsXG4gICdtbTpzcycsXG4gICdbaF06bW06c3MnLFxuXTtcblxuLyoqIFNpbmggY2h14buXaSBwcmV2aWV3IChnacOhIHRy4buLIG3huqt1IMSRw6MgZm9ybWF0KSBjaG8gMSBwYXR0ZXJuOyBmYWxsYmFjayB24buBIHBhdHRlcm4gbuG6v3UgbOG7l2kuICovXG5jb25zdCBwcmV2aWV3T2YgPSAocGF0dGVybjogc3RyaW5nLCBzYW1wbGU6IG51bWJlcik6IHN0cmluZyA9PiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGdldFBhdHRlcm5QcmV2aWV3KHBhdHRlcm4sIHNhbXBsZSkucmVzdWx0IHx8IHBhdHRlcm47XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBwYXR0ZXJuO1xuICB9XG59O1xuXG4vKipcbiAqIFJlLWFzc2VydCBoaWdobGlnaHQgY2hvIG9wdGlvbiDEkWFuZyBjaOG7jW4gc2F1IGtoaSBVbml2ZXIgcmUtcmVuZGVyIHBhbmVsIChSZWFjdCBjw7MgdGjhu4MgeG/DoSBjbGFzcykuXG4gKiBE4buxYSB0csOqbiBj4budIGRhdGEtbnVtZm10LXNlbGVjdGVkIChkbyBzZXRBY3RpdmUgxJHhurd0KSDigJQga2jDtG5nIHN1eSBkaeG7hW4gdOG7qyBET00gbGFiZWwuXG4gKi9cbmV4cG9ydCBjb25zdCBzeW5jQWN0aXZlTnVtZm10SGlnaGxpZ2h0ID0gKCkgPT4ge1xuICBjb25zdCBwYW5lbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5udW1mbXQtcGFuZWwnKTtcbiAgaWYgKCFwYW5lbCkgcmV0dXJuO1xuICBwYW5lbC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PignLnVuaXZlci1udW1mbXQtY3VzdG9tLWl0ZW0nKS5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgaXRlbS5jbGFzc0xpc3QudG9nZ2xlKCd1bml2ZXItbnVtZm10LWFjdGl2ZScsIGl0ZW0uaGFzQXR0cmlidXRlKCdkYXRhLW51bWZtdC1zZWxlY3RlZCcpKTtcbiAgfSk7XG59O1xuXG4vKipcbiAqIFRoYXkgZGFuaCBzw6FjaCDEkeG7i25oIGThuqFuZyBuZ8OgeSBt4bq3YyDEkeG7i25oIGPhu6dhIFVuaXZlciBi4bqxbmcgY8OhYyBvcHRpb24gY3VzdG9tIChDVVNUT01fREFURV9QQVRURVJOUyksXG4gKiBoaeG7g24gdGjhu4sgZMaw4bubaSBk4bqhbmcgUFJFVklFVyB0cuG7sWMgcXVhbi4gVW5pdmVyIHJlbmRlciBwYW5lbCBudW1mbXQgYuG6sW5nIFJlYWN0IHbDoCBraMO0bmcgZXhwb3NlIEFQSVxuICogbsOqbiBwaOG6o2kgdGhhbyB0w6FjIERPTSB0cuG7sWMgdGnhur9wLlxuICpcbiAqIEBwYXJhbSBnZXRTbmFwc2hvdCAgICAgICAgIEzhuqV5IHbDuW5nIGNo4buNbiBoaeG7h24gdOG6oWkgKMSR4buDIMOhcCBudW1mbXQpLlxuICogQHBhcmFtIGV4ZWN1dGVDbWQgICAgICAgICAgQ2jhuqF5IFVuaXZlciBjb21tYW5kLlxuICogQHBhcmFtIG9uUGF0dGVyblNlbGVjdGVkICAgQsOhbyBjb21wb25lbnQgcGF0dGVybiB24burYSBjaOG7jW4gKENvbmZpcm0pIGhv4bq3YyBudWxsIChDYW5jZWwpIMSR4buDIMSR4buTbmcgYuG7mS5cbiAqIEBwYXJhbSBnZXRBY3RpdmVDZWxsRm9ybWF0IMSQ4buNYyBwYXR0ZXJuIGhp4buHbiB04bqhaSBj4bunYSBjZWxsIOKAlCBkw7luZyBoaWdobGlnaHQgb3B0aW9uIGto4bubcCBraGkgbeG7ny5cbiAqIEBwYXJhbSBjbGVhclByZXZpZXcgICAgICAgIFhvw6EgbGl2ZS1wcmV2aWV3IG92ZXJsYXkgY+G7p2EgVW5pdmVyIMSR4buDIGNhbnZhcyB24bq9IMSRw7puZyBtb2RlbCBuZ2F5LlxuICogQHBhcmFtIGdldFNhbXBsZVZhbHVlICAgICAgTOG6pXkgZ2nDoSB0cuG7iyBUSOG7sEMgKHNlcmlhbCkgY+G7p2Egw7QgxJHhuqFpIGRp4buHbiDEkeG7gyBsYWJlbCBwcmV2aWV3IGto4bubcCBk4buvIGxp4buHdSBj4buZdDtcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwg4oaSIGTDuW5nIFNBTVBMRV9TRVJJQUwgbeG6t2MgxJHhu4tuaC5cbiAqIEByZXR1cm5zIGjDoG0gY2xlYW51cCAoZ+G7oSBt4buNaSBsaXN0ZW5lcikg4oCUIGfhu41pIGtoaSB0ZWFyZG93biBob+G6t2MgdHLGsOG7m2MgbOG6p24gaW5qZWN0IG3hu5tpLlxuICovXG5leHBvcnQgY29uc3QgaW5qZWN0Q3VzdG9tRGF0ZUZvcm1hdHMgPSAoXG4gIGdldFNuYXBzaG90OiAoKSA9PiBUX3JhbmdlU25hcHNob3QgfCBudWxsLFxuICBleGVjdXRlQ21kOiAoY21kSWQ6IHN0cmluZywgcGFyYW1zOiB1bmtub3duKSA9PiB2b2lkLFxuICBvblBhdHRlcm5TZWxlY3RlZD86IChwYXR0ZXJuOiBzdHJpbmcgfCBudWxsKSA9PiB2b2lkLFxuICBnZXRBY3RpdmVDZWxsRm9ybWF0PzogKCkgPT4gc3RyaW5nLFxuICBjbGVhclByZXZpZXc/OiAoKSA9PiB2b2lkLFxuICBnZXRTYW1wbGVWYWx1ZT86ICgpID0+IG51bWJlciB8IG51bGwsXG4gIG9uQ29uZmlybT86ICgpID0+IHZvaWRcbikgPT4ge1xuICBjb25zdCBwYW5lbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCcubnVtZm10LXBhbmVsJyk7XG4gIGlmICghcGFuZWwpIHJldHVybjtcblxuICAvLyBHdWFyZDogY2jhu4kgaW5qZWN0IDEgbOG6p24gLyBwaGnDqm4gKGNvbXBvbmVudCB4b8OhIGRhdGEtY3VzdG9tLWRhdGVzIGtoaSDEkcOzbmcgcGFuZWwgxJHhu4MgcmVvcGVuIHJlLWluamVjdCkuXG4gIGNvbnN0IGxpc3RDb250YWluZXIgPSBwYW5lbC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PigndWwudW5pdmVyLXNlbGVjdC1saXN0Jyk7XG4gIGlmICghbGlzdENvbnRhaW5lciB8fCBsaXN0Q29udGFpbmVyLmhhc0F0dHJpYnV0ZSgnZGF0YS1jdXN0b20tZGF0ZXMnKSkgcmV0dXJuO1xuICAvLyBOaOG6rW4gZGnhu4duIHBhbmVsIERhdGUgdGhlbyAyIHRyxrDhu51uZyBo4bujcDpcbiAgLy8gICAxLiBVbml2ZXIgduG7q2EgcmVuZGVyIGxpc3QgbmfDoHkgR+G7kEMgKGxpIGThuqFuZyB5eXl5LW1tLWRkKSDigJQgbOG6p24gxJHhuqd1IGNo4buNbiBUeXBlPURhdGUuXG4gIC8vICAgMi4gVW5pdmVyIFTDgUkgRMOZTkcgRE9NIHBhbmVsIGPFqSAocmVvcGVuKSDihpIgbGlzdCDEkWFuZyBjaOG7qWEgc+G6tW4gY3VzdG9tIGl0ZW0gY+G7p2EgdGEgdOG7qyBwaGnDqm4gdHLGsOG7m2MuXG4gIGNvbnN0IGhhc1VuaXZlckRhdGVJdGVtcyA9IEFycmF5LmZyb20obGlzdENvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PignbGknKSkuc29tZSgoZWwpID0+IC9eXFxkezR9Wy0vXVxcZHsyfVstL11cXGR7Mn0kLy50ZXN0KGVsLnRleHRDb250ZW50Py50cmltKCkgPz8gJycpKTtcbiAgY29uc3QgaGFzT3VySXRlbXMgPSAhIWxpc3RDb250YWluZXIucXVlcnlTZWxlY3RvcignLnVuaXZlci1udW1mbXQtY3VzdG9tLWl0ZW0nKTtcbiAgaWYgKCFoYXNVbml2ZXJEYXRlSXRlbXMgJiYgIWhhc091ckl0ZW1zKSByZXR1cm47XG5cbiAgbGlzdENvbnRhaW5lci5zZXRBdHRyaWJ1dGUoJ2RhdGEtY3VzdG9tLWRhdGVzJywgJ3RydWUnKTtcbiAgY29uc3QgaXRlbVRlbXBsYXRlID0gbGlzdENvbnRhaW5lci5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PignbGknKTtcbiAgY29uc3QgZGVmYXVsdEl0ZW1zID0gQXJyYXkuZnJvbShsaXN0Q29udGFpbmVyLmNoaWxkcmVuKTtcblxuICBjb25zdCBhcHBseUZvcm1hdCA9IChwYXR0ZXJuOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBzbmFwID0gZ2V0U25hcHNob3QoKTtcbiAgICBpZiAoIXNuYXApIHJldHVybjtcbiAgICBjb25zdCB2YWx1ZXM6IHsgcGF0dGVybjogc3RyaW5nOyByb3c6IG51bWJlcjsgY29sOiBudW1iZXIgfVtdID0gW107XG4gICAgY29uc3QgbWF4Um93ID0gTWF0aC5taW4oc25hcC5lbmRSb3csIHNuYXAuc3RhcnRSb3cgKyA0OTkpO1xuICAgIGZvciAobGV0IHIgPSBzbmFwLnN0YXJ0Um93OyByIDw9IG1heFJvdzsgcisrKSB7XG4gICAgICBmb3IgKGxldCBjID0gc25hcC5zdGFydENvbHVtbjsgYyA8PSBzbmFwLmVuZENvbHVtbjsgYysrKSB7XG4gICAgICAgIHZhbHVlcy5wdXNoKHsgcGF0dGVybiwgcm93OiByLCBjb2w6IGMgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghdmFsdWVzLmxlbmd0aCkgcmV0dXJuO1xuICAgIGV4ZWN1dGVDbWQoJ3NoZWV0LmNvbW1hbmQubnVtZm10LnNldC5udW1mbXQnLCB7IHVuaXRJZDogc25hcC51bml0SWQsIHN1YlVuaXRJZDogc25hcC5zdWJVbml0SWQsIHZhbHVlcyB9KTtcbiAgICAvLyBVbml2ZXIgZ2nhu68gbGl2ZS1wcmV2aWV3IG92ZXJsYXkgKE51bWZtdENvbnRyb2xsZXIuX3ByZXZpZXdQYXR0ZXJuKSBjaGUgaGnhu4NuIHRo4buLIG1vZGVsIGPhu6dhXG4gICAgLy8gdsO5bmcgY2jhu41uIGtoaSBwYW5lbCBt4bufLiBUYSDEkcOjIGdoaSBtb2RlbCB0cuG7sWMgdGnhur9wIG7Dqm4gcGjhuqNpIHhvw6EgcHJldmlldyDEkeG7gyBjYW52YXMgduG6vSDEkcO6bmcgbmdheS5cbiAgICBjbGVhclByZXZpZXc/LigpO1xuICB9O1xuXG4gIGxldCBwZW5kaW5nUGF0dGVybjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIGxldCBhY3RpdmVJdGVtOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0IHNldEFjdGl2ZSA9IChpdGVtOiBIVE1MRWxlbWVudCkgPT4ge1xuICAgIGlmIChhY3RpdmVJdGVtKSB7XG4gICAgICBhY3RpdmVJdGVtLmNsYXNzTGlzdC5yZW1vdmUoJ3VuaXZlci1udW1mbXQtYWN0aXZlJyk7XG4gICAgICBhY3RpdmVJdGVtLnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1udW1mbXQtc2VsZWN0ZWQnKTtcbiAgICB9XG4gICAgaXRlbS5jbGFzc0xpc3QuYWRkKCd1bml2ZXItbnVtZm10LWFjdGl2ZScpO1xuICAgIGl0ZW0uc2V0QXR0cmlidXRlKCdkYXRhLW51bWZtdC1zZWxlY3RlZCcsICd0cnVlJyk7XG4gICAgYWN0aXZlSXRlbSA9IGl0ZW07XG4gIH07XG5cbiAgY29uc3Qgc3ViczogU3Vic2NyaXB0aW9uW10gPSBbXTtcbiAgY29uc3QgY2xlYW51cCA9ICgpID0+IHtcbiAgICBzdWJzLmZvckVhY2goKHMpID0+IHMudW5zdWJzY3JpYmUoKSk7XG4gICAgc3Vicy5sZW5ndGggPSAwO1xuICB9O1xuXG4gIC8vIE5o4bqtbiBkaeG7h24gbsO6dCB0aGVvIENMQVNTIChraMO0bmcgcGjhu6UgdGh14buZYyBuZ8O0biBuZ+G7ryk6IFVuaXZlciByZW5kZXIgQ29uZmlybSA9IGJ1dHRvbi1wcmltYXJ5LFxuICAvLyBDYW5jZWwgPSBidXR0b24tZGVmYXVsdC4gS0jDlE5HIG1hdGNoIHRoZW8gdGV4dCAoJ0NvbmZpcm0nLydDYW5jZWwnKSB2w6wgc+G6vSB24buhIGtoaSBsb2NhbGUgbMOgIHRp4bq/bmcgVmnhu4d0LlxuICBjb25zdCBwYW5lbEJ1dHRvbnMgPSBBcnJheS5mcm9tKHBhbmVsLnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KCdidXR0b24nKSk7XG4gIGNvbnN0IGNvbmZpcm1CdG4gPSBwYW5lbEJ1dHRvbnMuZmluZCgoYikgPT4gYi5jbGFzc0xpc3QuY29udGFpbnMoJ3VuaXZlci1idXR0b24tcHJpbWFyeScpKTtcbiAgY29uc3QgY2FuY2VsQnRuID0gcGFuZWxCdXR0b25zLmZpbmQoKGIpID0+IGIuY2xhc3NMaXN0LmNvbnRhaW5zKCd1bml2ZXItYnV0dG9uLWRlZmF1bHQnKSk7XG5cbiAgLy8gQ2FwdHVyZSBwaGFzZTogY2jhuqF5IHRyxrDhu5tjIFVuaXZlciBoYW5kbGVyLiBLSMOUTkcgY2xlYW51cCgpIHRyb25nIGhhbmRsZXIgdsOsIFVuaXZlciB0w6FpIGTDuW5nIERPTSBwYW5lbCDigJRcbiAgLy8gZ+G7oSBsaXN0ZW5lciBz4bq9IGzDoG0gb3B0aW9uIGtow7RuZyBjbGljayDEkcaw4bujYyBraGkgbeG7nyBs4bqhaS4gY2xlYW51cCBjaOG7iSBjaOG6oXkga2hpIHRlYXJkb3duIHRo4bqtdC5cbiAgaWYgKGNvbmZpcm1CdG4pIHtcbiAgICBzdWJzLnB1c2goXG4gICAgICBmcm9tRXZlbnQ8TW91c2VFdmVudD4oY29uZmlybUJ0biwgJ2NsaWNrJywgeyBjYXB0dXJlOiB0cnVlIH0pLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIC8vIMSQw6FuaCBk4bqldSBDb25maXJtIOKGkiBjb21wb25lbnQgR0nhu64gZm9ybWF0LiBDYW5jZWwvWC9jbGljay1uZ2/DoGkgS0jDlE5HIGfhu41pIOKGkiBt4bq3YyDEkeG7i25oIHJldmVydC5cbiAgICAgICAgb25Db25maXJtPy4oKTtcbiAgICAgICAgaWYgKCFwZW5kaW5nUGF0dGVybikgcmV0dXJuO1xuICAgICAgICBhcHBseUZvcm1hdChwZW5kaW5nUGF0dGVybik7XG4gICAgICAgIG9uUGF0dGVyblNlbGVjdGVkPy4ocGVuZGluZ1BhdHRlcm4pO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgaWYgKGNhbmNlbEJ0bikge1xuICAgIHN1YnMucHVzaChcbiAgICAgIGZyb21FdmVudDxNb3VzZUV2ZW50PihjYW5jZWxCdG4sICdjbGljaycsIHsgY2FwdHVyZTogdHJ1ZSB9KS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICBpZiAoYWN0aXZlSXRlbSkge1xuICAgICAgICAgIGFjdGl2ZUl0ZW0uY2xhc3NMaXN0LnJlbW92ZSgndW5pdmVyLW51bWZtdC1hY3RpdmUnKTtcbiAgICAgICAgICBhY3RpdmVJdGVtLnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1udW1mbXQtc2VsZWN0ZWQnKTtcbiAgICAgICAgICBhY3RpdmVJdGVtID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICAvLyBwZW5kaW5nUGF0dGVybiA9IG51bGwg4oaSIGNvbXBvbmVudCBraMO0aSBwaOG7pWMgbnVtZm10IGfhu5FjIHThu6tuZyDDtCAoeGVtIGNsb3NlLm51bWZtdC5wYW5lbCBoYW5kbGVyKS5cbiAgICAgICAgcGVuZGluZ1BhdHRlcm4gPSBudWxsO1xuICAgICAgICBvblBhdHRlcm5TZWxlY3RlZD8uKG51bGwpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIENVU1RPTV9EQVRFX1BBVFRFUk5TKSB7XG4gICAgY29uc3QgaXRlbSA9IChpdGVtVGVtcGxhdGUgPz8gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpLmNsb25lTm9kZShmYWxzZSkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgLy8gS2hpIHJlb3BlbiwgaXRlbVRlbXBsYXRlIGzDoCBjdXN0b20gaXRlbSBjxakg4oaSIHhvw6EgY+G7nSBoaWdobGlnaHQvc2VsZWN0ZWQgc2FvIGNow6lwIHRoZW8gxJHhu4MgdHLDoW5oIHN0YWxlLlxuICAgIGl0ZW0ucmVtb3ZlQXR0cmlidXRlKCdkYXRhLW51bWZtdC1zZWxlY3RlZCcpO1xuICAgIGl0ZW0uY2xhc3NMaXN0LnJlbW92ZSgndW5pdmVyLW51bWZtdC1hY3RpdmUnKTtcbiAgICBpdGVtLnRleHRDb250ZW50ID0gcHJldmlld09mKHBhdHRlcm4sIGdldFNhbXBsZVZhbHVlPy4oKSA/PyBTQU1QTEVfU0VSSUFMKTtcbiAgICBpdGVtLmRhdGFzZXRbJ3BhdHRlcm4nXSA9IHBhdHRlcm47XG4gICAgaXRlbS5zdHlsZS5jdXJzb3IgPSAncG9pbnRlcic7XG4gICAgaXRlbS5jbGFzc0xpc3QuYWRkKCd1bml2ZXItbnVtZm10LWN1c3RvbS1pdGVtJyk7XG5cbiAgICBzdWJzLnB1c2goZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KGl0ZW0sICdtb3VzZWRvd24nKS5zdWJzY3JpYmUoKGUpID0+IGUucHJldmVudERlZmF1bHQoKSkpO1xuICAgIHN1YnMucHVzaChcbiAgICAgIGZyb21FdmVudDxNb3VzZUV2ZW50PihpdGVtLCAnY2xpY2snKS5zdWJzY3JpYmUoKGUpID0+IHtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgc2V0QWN0aXZlKGl0ZW0pO1xuICAgICAgICBwZW5kaW5nUGF0dGVybiA9IHBhdHRlcm47XG4gICAgICAgIGFwcGx5Rm9ybWF0KHBhdHRlcm4pO1xuICAgICAgICBvblBhdHRlcm5TZWxlY3RlZD8uKHBhdHRlcm4pO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgbGlzdENvbnRhaW5lci5hcHBlbmRDaGlsZChpdGVtKTtcbiAgfVxuXG4gIGRlZmF1bHRJdGVtcy5mb3JFYWNoKChlbCkgPT4gZWwucmVtb3ZlKCkpO1xuXG4gIC8qKlxuICAgKiDEkOG7k25nIGLhu5kgcGFuZWwgdGhlbyB2w7luZyBjaOG7jW4gSEnhu4ZOIFThuqBJIChnZXRTbmFwc2hvdC9nZXRBY3RpdmVDZWxsRm9ybWF0L2dldFNhbXBsZVZhbHVlIMSR4buNYyBmcmVzaCk6XG4gICAqICAgMS4gU2luaCBs4bqhaSBsYWJlbCBwcmV2aWV3IHRoZW8gZ2nDoSB0cuG7iyBUSOG7sEMgY+G7p2Egw7QgxJHhuqFpIGRp4buHbiBj4buZdCBt4bubaSAoa2jhu5twIGThu68gbGnhu4d1LCBnaeG7kW5nIEV4Y2VsKS5cbiAgICogICAyLiBIaWdobGlnaHQgb3B0aW9uIGto4bubcCBmb3JtYXQgaGnhu4duIGPDszsgbuG6v3UgY+G7mXQgY2jGsGEgY8OzIGZvcm1hdCDihpIgY2jhu41uIG9wdGlvbiDEkOG6plUgVEnDik4uXG4gICAqICAgMy4gw4FQIExVw5ROIHBhdHRlcm4gxJHDsyBsw6puIGPhuqMgdsO5bmcg4oaSIGThu68gbGnhu4d1IMSR4buVaSBoaeG7g24gdGjhu4sgbmdheTsgc2V0IHBlbmRpbmcgxJHhu4MgQ29uZmlybSBnaeG7ry5cbiAgICogR+G7jWkga2hpIG3hu58gcGFuZWwgVsOAIG3hu5dpIGtoaSB1c2VyIMSR4buVaSBj4buZdC9jZWxsIHRyw6puIGdyaWQgbMO6YyBwYW5lbCDEkWFuZyBt4bufLlxuICAgKiBDYW5jZWwgLyBYIOKGkiBjb21wb25lbnQga2jDtGkgcGjhu6VjIGdpw6EgdHLhu4sgZ+G7kWMgKG9yaWdpbmFsQ2VsbEZvcm1hdHMgxJHDoyBjaOG7pXAvdMOtY2ggbHXhu7kga2hpIG3hu58vxJHhu5VpIHbDuW5nKS5cbiAgICovXG4gIGNvbnN0IHJlc3luYyA9ICgpID0+IHtcbiAgICBjb25zdCBzYW1wbGUgPSBnZXRTYW1wbGVWYWx1ZT8uKCkgPz8gU0FNUExFX1NFUklBTDtcbiAgICBjb25zdCBpdGVtcyA9IEFycmF5LmZyb20obGlzdENvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PignLnVuaXZlci1udW1mbXQtY3VzdG9tLWl0ZW0nKSk7XG4gICAgaXRlbXMuZm9yRWFjaCgoZWwpID0+IHsgZWwudGV4dENvbnRlbnQgPSBwcmV2aWV3T2YoZWwuZGF0YXNldFsncGF0dGVybiddID8/ICcnLCBzYW1wbGUpOyB9KTtcblxuICAgIGNvbnN0IGFjdGl2ZUZtdCA9IChnZXRBY3RpdmVDZWxsRm9ybWF0Py4oKSA/PyAnJykudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBtYXRjaGVkID0gYWN0aXZlRm10ICYmIGFjdGl2ZUZtdCAhPT0gJ2dlbmVyYWwnXG4gICAgICA/IGl0ZW1zLmZpbmQoKGVsKSA9PiAoZWwuZGF0YXNldFsncGF0dGVybiddID8/ICcnKS50b0xvd2VyQ2FzZSgpID09PSBhY3RpdmVGbXQpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBpbml0aWFsID0gbWF0Y2hlZCA/PyBpdGVtc1swXTtcbiAgICBpZiAoIWluaXRpYWwpIHJldHVybjtcbiAgICBzZXRBY3RpdmUoaW5pdGlhbCk7XG4gICAgcGVuZGluZ1BhdHRlcm4gPSBpbml0aWFsLmRhdGFzZXRbJ3BhdHRlcm4nXSA/PyBudWxsO1xuICAgIGlmICghcGVuZGluZ1BhdHRlcm4pIHJldHVybjtcbiAgICBhcHBseUZvcm1hdChwZW5kaW5nUGF0dGVybik7XG4gICAgb25QYXR0ZXJuU2VsZWN0ZWQ/LihwZW5kaW5nUGF0dGVybik7XG4gIH07XG5cbiAgcmVzeW5jKCk7XG5cbiAgLy8gTmV0IGNo4buRbmcgcmFjZTogbuG6v3UgVW5pdmVyIHNldCBs4bqhaSBwcmV2aWV3IG92ZXJsYXkgTkdBWSBTQVUga2hpIHBhbmVsIHJlbmRlciAoc2F1IGFwcGx5Rm9ybWF0IOG7nyB0csOqbiksXG4gIC8vIHhvw6EgbOG6p24gbuG7r2Egc2F1IDEgbmjhu4twIMSR4buDIGNhbnZhcyBoaeG7g24gdGjhu4sgbnVtZm10IFRI4bqsVCBj4bunYSBtb2RlbC4gKGFwcGx5Rm9ybWF0IMSRw6MgY2xlYXJQcmV2aWV3IMSR4buTbmcgYuG7mS4pXG4gIHNldFRpbWVvdXQoKCkgPT4gY2xlYXJQcmV2aWV3Py4oKSwgNjApO1xuXG4gIHJldHVybiB7IGNsZWFudXAsIHJlc3luYyB9O1xufTtcbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ByZWFkc2hlZXQudHlwZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMtdWkvY29tcG9uZW50cy9zcHJlYWRzaGVldC9zcmMvc3ByZWFkc2hlZXQudHlwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiLyoqIE5nw7RuIG5n4buvIGhp4buDbiB0aOG7iyBj4bunYSBzcHJlYWRzaGVldCAodG9vbGJhciwgbWVudSwgbnVtZm10IHBhbmVsKS4gKi9cbmV4cG9ydCB0eXBlIFRfc3ByZWFkc2hlZXRfbG9jYWxlID0gJ2VuJyB8ICd2aSc7XG5cbmV4cG9ydCB0eXBlIFRfY2VsbEZvcm1hdFJlc3VsdCA9IHtcbiAgc2hlZXQ6IHN0cmluZztcbiAgY29sOiBzdHJpbmc7XG4gIGNvbEluZGV4OiBudW1iZXI7XG4gIGhlYWRlcjogc3RyaW5nO1xuICBudW1mbXQ6IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIFRfcmFuZ2VTbmFwc2hvdCA9IHtcbiAgdW5pdElkOiBzdHJpbmc7XG4gIHN1YlVuaXRJZDogc3RyaW5nO1xuICBzdGFydFJvdzogbnVtYmVyO1xuICBlbmRSb3c6IG51bWJlcjtcbiAgc3RhcnRDb2x1bW46IG51bWJlcjtcbiAgZW5kQ29sdW1uOiBudW1iZXI7XG59O1xuXG4vKipcbiAqIElEIGPhu6dhIHThu6tuZyB0b29sYmFyIGl0ZW0gdHJvbmcgVW5pdmVyLlxuICogRMO5bmcgbMOgbSBrZXkgdHJvbmcgVF90b29sYmFyX21lbnVfY29uZmlnIMSR4buDIOG6qW4vdsO0IGhp4buHdSBob8OhIGl0ZW0uXG4gKiBUw6xtIElEIHRo4buxYyB04bq/IGLhurFuZyBjw6FjaCBpbnNwZWN0IGF0dHJpYnV0ZSBgZGF0YS11LWNvbW1hbmRgIHRyw6puIERPTSBlbGVtZW50LlxuICovXG5leHBvcnQgdHlwZSBUX3Rvb2xiYXJfaXRlbV9pZCA9XG4gIC8vIOKUgOKUgCBIaXN0b3J5IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICB8ICd1bml2ZXIuY29tbWFuZC51bmRvJ1xuICB8ICd1bml2ZXIuY29tbWFuZC5yZWRvJ1xuICAvLyDilIDilIAgRm9ybWF0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICB8ICdzaGVldC5jb21tYW5kLnNldC1vbmNlLWZvcm1hdC1wYWludGVyJ1xuICB8ICdzaGVldC5jb21tYW5kLnNldC1yYW5nZS1ib2xkJ1xuICB8ICdzaGVldC5jb21tYW5kLnNldC1yYW5nZS1pdGFsaWMnXG4gIHwgJ3NoZWV0LmNvbW1hbmQuc2V0LXJhbmdlLXVuZGVybGluZSdcbiAgfCAnc2hlZXQuY29tbWFuZC5zZXQtcmFuZ2Utc3Ryb2tlJ1xuICB8ICdzaGVldC5jb21tYW5kLnNldC1yYW5nZS1mb250LWZhbWlseSdcbiAgfCAnc2hlZXQuY29tbWFuZC5zZXQtcmFuZ2UtZm9udHNpemUnXG4gIHwgJ3NoZWV0LmNvbW1hbmQuc2V0LXJhbmdlLXRleHQtY29sb3InXG4gIHwgJ3NoZWV0LmNvbW1hbmQuc2V0LWJhY2tncm91bmQtY29sb3InXG4gIHwgJ3NoZWV0LmNvbW1hbmQuc2V0LWJvcmRlci1iYXNpYydcbiAgfCAnc2hlZXQuY29tbWFuZC5zZXQtaG9yaXpvbnRhbC10ZXh0LWFsaWduJ1xuICB8ICdzaGVldC5jb21tYW5kLnNldC12ZXJ0aWNhbC10ZXh0LWFsaWduJ1xuICB8ICdzaGVldC5jb21tYW5kLnNldC10ZXh0LXdyYXAnXG4gIHwgJ3NoZWV0LmNvbW1hbmQuc2V0LXRleHQtcm90YXRpb24nXG4gIC8vIOKUgOKUgCBNZXJnZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgfCAnc2hlZXQuY29tbWFuZC5hZGQtd29ya3NoZWV0LW1lcmdlJ1xuICB8ICdzaGVldC5jb21tYW5kLmFkZC13b3Jrc2hlZXQtbWVyZ2UtYWxsJ1xuICB8ICdzaGVldC5jb21tYW5kLmFkZC13b3Jrc2hlZXQtbWVyZ2UtdmVydGljYWwnXG4gIHwgJ3NoZWV0LmNvbW1hbmQuYWRkLXdvcmtzaGVldC1tZXJnZS1ob3Jpem9udGFsJ1xuICB8ICdzaGVldC5jb21tYW5kLnJlbW92ZS13b3Jrc2hlZXQtbWVyZ2UnXG4gIC8vIOKUgOKUgCBOdW1iZXIgZm9ybWF0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICB8ICdzaGVldC5jb21tYW5kLm51bWZtdC5zZXQuY3VycmVuY3knXG4gIHwgJ3NoZWV0LmNvbW1hbmQubnVtZm10LmFkZC5kZWNpbWFsLmNvbW1hbmQnXG4gIHwgJ3NoZWV0LmNvbW1hbmQubnVtZm10LnN1YnRyYWN0LmRlY2ltYWwuY29tbWFuZCdcbiAgfCAnc2hlZXQuY29tbWFuZC5udW1mbXQuc2V0LnBlcmNlbnQnXG4gIHwgJ3NoZWV0Lm9wZXJhdGlvbi5vcGVuLm51bWZtdC5wYW5lbCdcbiAgLy8g4pSA4pSAIEZvcm11bGEgLyBGdW5jdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgfCAnZm9ybXVsYS11aS5vcGVyYXRpb24uaW5zZXJ0LWZ1bmN0aW9uJ1xuICB8ICdmb3JtdWxhLXVpLm9wZXJhdGlvbi5tb3JlLWZ1bmN0aW9ucydcbiAgLy8g4pSA4pSAIFNvcnQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIHwgJ3NoZWV0Lm1lbnUuc2hlZXRzLXNvcnQnXG4gIHwgJ3NoZWV0LmNvbW1hbmQuc29ydC1yYW5nZS1hc2MnXG4gIHwgJ3NoZWV0LmNvbW1hbmQuc29ydC1yYW5nZS1hc2MtZXh0J1xuICB8ICdzaGVldC5jb21tYW5kLnNvcnQtcmFuZ2UtZGVzYydcbiAgfCAnc2hlZXQuY29tbWFuZC5zb3J0LXJhbmdlLWRlc2MtZXh0J1xuICB8ICdzaGVldC5jb21tYW5kLnNvcnQtcmFuZ2UtY3VzdG9tJ1xuICAvLyDilIDilIAgRmlsdGVyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICB8ICdzaGVldC5jb21tYW5kLnNtYXJ0LXRvZ2dsZS1maWx0ZXInXG4gIHwgJ3NoZWV0LmNvbW1hbmQuY2xlYXItZmlsdGVyLWNyaXRlcmlhJ1xuICB8ICdzaGVldC5jb21tYW5kLnJlLWNhbGMtZmlsdGVyJ1xuICAvLyDilIDilIAgRGF0YSB2YWxpZGF0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICB8ICdzaGVldC5tZW51LmRhdGEtdmFsaWRhdGlvbidcbiAgfCAnZGF0YS12YWxpZGF0aW9uLm9wZXJhdGlvbi5vcGVuLXZhbGlkYXRpb24tcGFuZWwnXG4gIHwgJ2RhdGEtdmFsaWRhdGlvbi5jb21tYW5kLmFkZFJ1bGVBbmRPcGVuJ1xuICAvLyDilIDilIAgQ29uZGl0aW9uYWwgZm9ybWF0dGluZyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgfCAnc2hlZXQub3BlcmF0aW9uLm9wZW4uY29uZGl0aW9uYWwuZm9ybWF0dGluZy5wYW5lbCdcbiAgLy8g4pSA4pSAIEltYWdlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICB8ICdzaGVldC5tZW51LmltYWdlJ1xuICB8ICdzaGVldC5jb21tYW5kLmluc2VydC1mbG9hdC1pbWFnZSdcbiAgfCAnc2hlZXQuY29tbWFuZC5pbnNlcnQtY2VsbC1pbWFnZSdcbiAgLy8g4pSA4pSAIFByaW50IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICB8ICdzaGVldC5tZW51LnByaW50J1xuICB8ICdzaGVldC5vcGVyYXRpb24ucHJpbnQtb3BlbidcbiAgfCAnc2hlZXQub3BlcmF0aW9uLm9wZW4tcHJpbnQtZ3JpZC1zaWRlYmFyJ1xuICAvLyDilIDilIAgRmlsZSAoaW1wb3J0L2V4cG9ydCkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIHwgJ3NoZWV0cy1leGNoYW5nZS1jbGllbnQub3BlcmF0aW9uLmV4Y2hhbmdlJ1xuICB8ICdleGNoYW5nZS1jbGllbnQub3BlcmF0aW9uLmltcG9ydC14bHN4J1xuICB8ICdleGNoYW5nZS1jbGllbnQub3BlcmF0aW9uLmV4cG9ydC14bHN4J1xuICAvLyDilIDilIAgTWlzYyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgfCAnc2hlZXQuY29tbWFuZC5hZGQtcmFuZ2UtcHJvdGVjdGlvbi1mcm9tLXRvb2xiYXInXG4gIHwgJ3NoZWV0Lm9wZXJhdGlvbi50b2dnbGUtY29tbWVudC1wYW5lbCdcbiAgfCAnc2hlZXQub3BlcmF0aW9uLmluc2VydC1oeXBlci1saW5rLXRvb2xiYXInXG4gIHwgJ3VpLm9wZXJhdGlvbi5vcGVuLWZpbmQtZGlhbG9nJ1xuICB8ICdiYXNlLXVpLm9wZXJhdGlvbi50b2dnbGUtc2hvcnRjdXQtcGFuZWwnXG4gIHwgJ3NoZWV0LnRvb2xiYXIudGV4dC10by1udW1iZXInO1xuXG4vKipcbiAqIEPhuqV1IGjDrG5oIOG6qW4gLyB2w7QgaGnhu4d1IGhvw6EgdOG7q25nIHRvb2xiYXIgaXRlbS5cbiAqIEBleGFtcGxlXG4gKiAvLyDhuqhuIGJvbGQsIGl0YWxpYzsgdsO0IGhp4buHdSBob8OhIHNvcnRcbiAqIGNvbnN0IGNvbmZpZzogVF90b29sYmFyX21lbnVfY29uZmlnID0ge1xuICogICAnc2hlZXQuY29tbWFuZC5zZXQtcmFuZ2UtYm9sZCc6ICB7IGhpZGRlbjogdHJ1ZSB9LFxuICogICAnc2hlZXQuY29tbWFuZC5zZXQtcmFuZ2UtaXRhbGljJzogeyBoaWRkZW46IHRydWUgfSxcbiAqICAgJ3NoZWV0Lm1lbnUuc2hlZXRzLXNvcnQnOiAgICAgICAgeyBkaXNhYmxlZDogdHJ1ZSB9LFxuICogfTtcbiAqL1xuLyoqXG4gKiBDb21wYXRpYmxlIHbhu5tpIFVuaXZlcidzIE1lbnVDb25maWcgPSBSZWNvcmQ8c3RyaW5nLCBNZW51SXRlbUNvbmZpZz4uXG4gKiBEw7luZyBUX3Rvb2xiYXJfaXRlbV9pZCBsw6BtIHJlZmVyZW5jZSDEkeG7gyBiaeG6v3QgY8OhYyBJRCBo4bujcCBs4buHLlxuICovXG5leHBvcnQgdHlwZSBUX3Rvb2xiYXJfbWVudV9jb25maWcgPSBSZWNvcmQ8c3RyaW5nLCB7XG4gIC8qKiDhuqhuIGhvw6BuIHRvw6BuIGl0ZW0ga2jhu49pIHRvb2xiYXIgKi9cbiAgaGlkZGVuPzogYm9vbGVhbjtcbiAgLyoqIFbDtCBoaeG7h3UgaG/DoSBpdGVtIChoaeG7g24gdGjhu4sgbmjGsG5nIGtow7RuZyBjbGljayDEkcaw4bujYykgKi9cbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xufT47XG4iXX0=