openrxiv-utils 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,419 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { getFolderStructure, normalizeBatch } from './folder-structure.js';
3
+ describe('Content Structure Utilities', () => {
4
+ describe('normalizeBatch', () => {
5
+ describe('bioRxiv server (default)', () => {
6
+ it.each([
7
+ // Number inputs
8
+ [1, 'Batch_01'],
9
+ [5, 'Batch_05'],
10
+ [10, 'Batch_10'],
11
+ [25, 'Batch_25'],
12
+ [100, 'Batch_100'],
13
+ // String inputs with various formats
14
+ ['1', 'Batch_01'],
15
+ ['5', 'Batch_05'],
16
+ ['10', 'Batch_10'],
17
+ ['01', 'Batch_01'],
18
+ ['05', 'Batch_05'],
19
+ // With "batch" prefix
20
+ ['batch1', 'Batch_01'],
21
+ ['batch-1', 'Batch_01'],
22
+ ['batch_1', 'Batch_01'],
23
+ ['Batch1', 'Batch_01'],
24
+ ['BATCH-1', 'Batch_01'],
25
+ ['BATCH_1', 'Batch_01'],
26
+ // With leading zeros
27
+ ['001', 'Batch_01'],
28
+ ['005', 'Batch_05'],
29
+ ['010', 'Batch_10'],
30
+ ['batch001', 'Batch_01'],
31
+ ['batch-001', 'Batch_01'],
32
+ ['batch_001', 'Batch_01'],
33
+ // Edge cases
34
+ ['batch-01', 'Batch_01'],
35
+ ['batch_01', 'Batch_01'],
36
+ ['Batch_01', 'Batch_01'],
37
+ ['BATCH_01', 'Batch_01'],
38
+ ])('should normalize "%s" to "%s" for bioRxiv', (input, expected) => {
39
+ expect(normalizeBatch(input, 'biorxiv')).toBe(expected);
40
+ });
41
+ it.each([
42
+ ['0', 'Invalid batch format: 0. Expected a positive number or batch identifier.'],
43
+ ['-1', 'Invalid batch format: -1. Expected a positive number or batch identifier.'],
44
+ ['abc', 'Invalid batch format: abc. Expected a positive number or batch identifier.'],
45
+ [
46
+ 'batch-abc',
47
+ 'Invalid batch format: batch-abc. Expected a positive number or batch identifier.',
48
+ ],
49
+ ['', 'Invalid batch format: . Expected a positive number or batch identifier.'],
50
+ ['batch-', 'Invalid batch format: batch-. Expected a positive number or batch identifier.'],
51
+ ['batch_', 'Invalid batch format: batch_. Expected a positive number or batch identifier.'],
52
+ ])('should throw error for invalid input "%s" for bioRxiv', (input, expectedError) => {
53
+ expect(() => normalizeBatch(input, 'biorxiv')).toThrow(expectedError);
54
+ });
55
+ it.each([
56
+ [0, 'Invalid batch format: 0. Expected a positive number or batch identifier.'],
57
+ [-1, 'Invalid batch format: -1. Expected a positive number or batch identifier.'],
58
+ [-100, 'Invalid batch format: -100. Expected a positive number or batch identifier.'],
59
+ ])('should throw error for invalid number input %d for bioRxiv', (input, expectedError) => {
60
+ expect(() => normalizeBatch(input, 'biorxiv')).toThrow(expectedError);
61
+ });
62
+ });
63
+ describe('medRxiv server', () => {
64
+ it.each([
65
+ // Number inputs
66
+ [1, 'medRxiv_Batch_01'],
67
+ [5, 'medRxiv_Batch_05'],
68
+ [10, 'medRxiv_Batch_10'],
69
+ [25, 'medRxiv_Batch_25'],
70
+ [100, 'medRxiv_Batch_100'],
71
+ // String inputs with various formats
72
+ ['1', 'medRxiv_Batch_01'],
73
+ ['5', 'medRxiv_Batch_05'],
74
+ ['10', 'medRxiv_Batch_10'],
75
+ ['01', 'medRxiv_Batch_01'],
76
+ ['05', 'medRxiv_Batch_05'],
77
+ // With "batch" prefix
78
+ ['batch1', 'medRxiv_Batch_01'],
79
+ ['batch-1', 'medRxiv_Batch_01'],
80
+ ['batch_1', 'medRxiv_Batch_01'],
81
+ ['Batch1', 'medRxiv_Batch_01'],
82
+ ['BATCH-1', 'medRxiv_Batch_01'],
83
+ ['BATCH_1', 'medRxiv_Batch_01'],
84
+ // With "medrxiv" prefix
85
+ ['medrxiv-batch1', 'medRxiv_Batch_01'],
86
+ ['medrxiv-batch-1', 'medRxiv_Batch_01'],
87
+ ['medrxiv_batch_1', 'medRxiv_Batch_01'],
88
+ ['MedRxiv-Batch1', 'medRxiv_Batch_01'],
89
+ ['MEDRXIV-BATCH-1', 'medRxiv_Batch_01'],
90
+ ['MEDRXIV_BATCH_1', 'medRxiv_Batch_01'],
91
+ // With leading zeros
92
+ ['001', 'medRxiv_Batch_01'],
93
+ ['005', 'medRxiv_Batch_05'],
94
+ ['010', 'medRxiv_Batch_10'],
95
+ ['batch001', 'medRxiv_Batch_01'],
96
+ ['batch-001', 'medRxiv_Batch_01'],
97
+ ['batch_001', 'medRxiv_Batch_01'],
98
+ ['medrxiv-batch001', 'medRxiv_Batch_01'],
99
+ ['medrxiv-batch-001', 'medRxiv_Batch_01'],
100
+ ['medrxiv_batch_001', 'medRxiv_Batch_01'],
101
+ // Edge cases
102
+ ['batch-01', 'medRxiv_Batch_01'],
103
+ ['batch_01', 'medRxiv_Batch_01'],
104
+ ['Batch_01', 'medRxiv_Batch_01'],
105
+ ['BATCH_01', 'medRxiv_Batch_01'],
106
+ ['medrxiv-batch-01', 'medRxiv_Batch_01'],
107
+ ['medrxiv_batch_01', 'medRxiv_Batch_01'],
108
+ ['MedRxiv_Batch_01', 'medRxiv_Batch_01'],
109
+ ['MEDRXIV_BATCH_01', 'medRxiv_Batch_01'],
110
+ ])('should normalize "%s" to "%s" for medRxiv', (input, expected) => {
111
+ expect(normalizeBatch(input, 'medrxiv')).toBe(expected);
112
+ });
113
+ it.each([
114
+ ['0', 'Invalid batch format: 0. Expected a positive number or batch identifier.'],
115
+ ['-1', 'Invalid batch format: -1. Expected a positive number or batch identifier.'],
116
+ ['abc', 'Invalid batch format: abc. Expected a positive number or batch identifier.'],
117
+ [
118
+ 'batch-abc',
119
+ 'Invalid batch format: batch-abc. Expected a positive number or batch identifier.',
120
+ ],
121
+ [
122
+ 'medrxiv-batch-abc',
123
+ 'Invalid batch format: medrxiv-batch-abc. Expected a positive number or batch identifier.',
124
+ ],
125
+ ['', 'Invalid batch format: . Expected a positive number or batch identifier.'],
126
+ ['batch-', 'Invalid batch format: batch-. Expected a positive number or batch identifier.'],
127
+ ['batch_', 'Invalid batch format: batch_. Expected a positive number or batch identifier.'],
128
+ [
129
+ 'medrxiv-batch-',
130
+ 'Invalid batch format: medrxiv-batch-. Expected a positive number or batch identifier.',
131
+ ],
132
+ [
133
+ 'medrxiv_batch_',
134
+ 'Invalid batch format: medrxiv_batch_. Expected a positive number or batch identifier.',
135
+ ],
136
+ ])('should throw error for invalid input "%s" for medRxiv', (input, expectedError) => {
137
+ expect(() => normalizeBatch(input, 'medrxiv')).toThrow(expectedError);
138
+ });
139
+ it.each([
140
+ [0, 'Invalid batch format: 0. Expected a positive number or batch identifier.'],
141
+ [-1, 'Invalid batch format: -1. Expected a positive number or batch identifier.'],
142
+ [-100, 'Invalid batch format: -100. Expected a positive number or batch identifier.'],
143
+ ])('should throw error for invalid number input %d for medRxiv', (input, expectedError) => {
144
+ expect(() => normalizeBatch(input, 'medrxiv')).toThrow(expectedError);
145
+ });
146
+ });
147
+ describe('default behavior (no server specified)', () => {
148
+ it('should default to bioRxiv format when no server specified', () => {
149
+ expect(normalizeBatch(1)).toBe('Batch_01');
150
+ expect(normalizeBatch('5')).toBe('Batch_05');
151
+ expect(normalizeBatch('batch-10')).toBe('Batch_10');
152
+ });
153
+ });
154
+ describe('case insensitive server names', () => {
155
+ it('should handle case insensitive server names', () => {
156
+ expect(normalizeBatch(1, 'BIORXIV')).toBe('Batch_01');
157
+ expect(normalizeBatch(1, 'BioRxiv')).toBe('Batch_01');
158
+ expect(normalizeBatch(1, 'MEDRXIV')).toBe('medRxiv_Batch_01');
159
+ expect(normalizeBatch(1, 'MedRxiv')).toBe('medRxiv_Batch_01');
160
+ });
161
+ });
162
+ });
163
+ describe('getFolderStructure', () => {
164
+ describe('with batch option', () => {
165
+ describe('bioRxiv server', () => {
166
+ it.each([
167
+ ['1', 'Back_Content/Batch_01/'],
168
+ ['5', 'Back_Content/Batch_05/'],
169
+ ['10', 'Back_Content/Batch_10/'],
170
+ ['batch1', 'Back_Content/Batch_01/'],
171
+ ['batch-1', 'Back_Content/Batch_01/'],
172
+ ['batch_1', 'Back_Content/Batch_01/'],
173
+ ['Batch_01', 'Back_Content/Batch_01/'],
174
+ ['BATCH_01', 'Back_Content/Batch_01/'],
175
+ ])('should create Back_Content structure for batch "%s" on bioRxiv', (batch, expectedPrefix) => {
176
+ const result = getFolderStructure({ batch, server: 'biorxiv' });
177
+ expect(result.type).toBe('back');
178
+ expect(result.prefix).toBe(expectedPrefix);
179
+ expect(result.batch).toBe(`Batch_${batch.replace(/\D/g, '').padStart(2, '0')}`);
180
+ });
181
+ });
182
+ describe('medRxiv server', () => {
183
+ it.each([
184
+ ['1', 'Back_Content/medRxiv_Batch_01/'],
185
+ ['5', 'Back_Content/medRxiv_Batch_05/'],
186
+ ['10', 'Back_Content/medRxiv_Batch_10/'],
187
+ ['batch1', 'Back_Content/medRxiv_Batch_01/'],
188
+ ['batch-1', 'Back_Content/medRxiv_Batch_01/'],
189
+ ['batch_1', 'Back_Content/medRxiv_Batch_01/'],
190
+ ['medrxiv-batch1', 'Back_Content/medRxiv_Batch_01/'],
191
+ ['medrxiv-batch-1', 'Back_Content/medRxiv_Batch_01/'],
192
+ ['medrxiv_batch_1', 'Back_Content/medRxiv_Batch_01/'],
193
+ ['MedRxiv_Batch_01', 'Back_Content/medRxiv_Batch_01/'],
194
+ ])('should create Back_Content structure for batch "%s" on medRxiv', (batch, expectedPrefix) => {
195
+ const result = getFolderStructure({ batch, server: 'medrxiv' });
196
+ expect(result.type).toBe('back');
197
+ expect(result.prefix).toBe(expectedPrefix);
198
+ expect(result.batch).toBe(`medRxiv_Batch_${batch.replace(/\D/g, '').padStart(2, '0')}`);
199
+ });
200
+ });
201
+ describe('default server (bioRxiv)', () => {
202
+ it.each([
203
+ ['1', 'Back_Content/Batch_01/'],
204
+ ['5', 'Back_Content/Batch_05/'],
205
+ ['10', 'Back_Content/Batch_10/'],
206
+ ])('should create Back_Content structure for batch "%s" with default server', (batch, expectedPrefix) => {
207
+ const result = getFolderStructure({ batch });
208
+ expect(result.type).toBe('back');
209
+ expect(result.prefix).toBe(expectedPrefix);
210
+ expect(result.batch).toBe(`Batch_${batch.replace(/\D/g, '').padStart(2, '0')}`);
211
+ });
212
+ });
213
+ });
214
+ describe('with month option - Current Content period', () => {
215
+ describe('bioRxiv server', () => {
216
+ it.each([
217
+ ['2019-01', 'Current_Content/January_2019/', 'January_2019'],
218
+ ['2019-06', 'Current_Content/June_2019/', 'June_2019'],
219
+ ['2019-12', 'Current_Content/December_2019/', 'December_2019'],
220
+ ['2020-01', 'Current_Content/January_2020/', 'January_2020'],
221
+ ['2024-01', 'Current_Content/January_2024/', 'January_2024'],
222
+ ['2025-01', 'Current_Content/January_2025/', 'January_2025'],
223
+ ['January_2019', 'Current_Content/January_2019/', 'January_2019'],
224
+ ['June_2019', 'Current_Content/June_2019/', 'June_2019'],
225
+ ['December_2019', 'Current_Content/December_2019/', 'December_2019'],
226
+ ['dec-2019', 'Current_Content/December_2019/', 'December_2019'],
227
+ ['December-2019', 'Current_Content/December_2019/', 'December_2019'],
228
+ ])('should create Current_Content structure for month "%s" on bioRxiv', (month, expectedPrefix, batch) => {
229
+ const result = getFolderStructure({ month, server: 'biorxiv' });
230
+ expect(result.type).toBe('current');
231
+ expect(result.prefix).toBe(expectedPrefix);
232
+ expect(result.batch).toBe(batch);
233
+ });
234
+ });
235
+ describe('medRxiv server', () => {
236
+ it.each([
237
+ ['2019-01', 'Current_Content/January_2019/', 'January_2019'],
238
+ ['2019-06', 'Current_Content/June_2019/', 'June_2019'],
239
+ ['2019-12', 'Current_Content/December_2019/', 'December_2019'],
240
+ ['2020-01', 'Current_Content/January_2020/', 'January_2020'],
241
+ ['2024-01', 'Current_Content/January_2024/', 'January_2024'],
242
+ ['2025-01', 'Current_Content/January_2025/', 'January_2025'],
243
+ ['January_2019', 'Current_Content/January_2019/', 'January_2019'],
244
+ ['June_2019', 'Current_Content/June_2019/', 'June_2019'],
245
+ ['December_2019', 'Current_Content/December_2019/', 'December_2019'],
246
+ ])('should create Current_Content structure for month "%s" on medRxiv', (month, expectedPrefix, batch) => {
247
+ const result = getFolderStructure({ month, server: 'medrxiv' });
248
+ expect(result.type).toBe('current');
249
+ expect(result.prefix).toBe(expectedPrefix);
250
+ expect(result.batch).toBe(batch);
251
+ });
252
+ });
253
+ describe('default server (bioRxiv)', () => {
254
+ it.each([
255
+ ['2019-01', 'Current_Content/January_2019/', 'January_2019'],
256
+ ['2024-01', 'Current_Content/January_2024/', 'January_2024'],
257
+ ])('should create Current_Content structure for month "%s" with default server', (month, expectedPrefix, batch) => {
258
+ const result = getFolderStructure({ month });
259
+ expect(result.type).toBe('current');
260
+ expect(result.prefix).toBe(expectedPrefix);
261
+ expect(result.batch).toBe(batch);
262
+ });
263
+ });
264
+ });
265
+ describe('with month option - Back Content period', () => {
266
+ describe('bioRxiv server', () => {
267
+ it.each([
268
+ [
269
+ '2018-11',
270
+ "Date 2018-11 is in the Back_Content period. Please specify a batch using --batch option. Available batches can be listed with 'biorxiv list' command.",
271
+ ],
272
+ [
273
+ '2018-10',
274
+ "Date 2018-10 is in the Back_Content period. Please specify a batch using --batch option. Available batches can be listed with 'biorxiv list' command.",
275
+ ],
276
+ [
277
+ '2018-01',
278
+ "Date 2018-01 is in the Back_Content period. Please specify a batch using --batch option. Available batches can be listed with 'biorxiv list' command.",
279
+ ],
280
+ [
281
+ '2017-12',
282
+ "Date 2017-12 is in the Back_Content period. Please specify a batch using --batch option. Available batches can be listed with 'biorxiv list' command.",
283
+ ],
284
+ [
285
+ '2015-06',
286
+ "Date 2015-06 is in the Back_Content period. Please specify a batch using --batch option. Available batches can be listed with 'biorxiv list' command.",
287
+ ],
288
+ [
289
+ 'November_2018',
290
+ "Date November_2018 is in the Back_Content period. Please specify a batch using --batch option. Available batches can be listed with 'biorxiv list' command.",
291
+ ],
292
+ [
293
+ 'October_2018',
294
+ "Date October_2018 is in the Back_Content period. Please specify a batch using --batch option. Available batches can be listed with 'biorxiv list' command.",
295
+ ],
296
+ ])('should throw error for Back_Content period month "%s" on bioRxiv', (month, expectedError) => {
297
+ expect(() => getFolderStructure({ month, server: 'biorxiv' })).toThrow(expectedError);
298
+ });
299
+ });
300
+ describe('medRxiv server', () => {
301
+ it.each([
302
+ [
303
+ '2018-11',
304
+ "Date 2018-11 is in the Back_Content period. Please specify a batch using --batch option. Available batches can be listed with 'biorxiv list' command.",
305
+ ],
306
+ [
307
+ '2018-10',
308
+ "Date 2018-10 is in the Back_Content period. Please specify a batch using --batch option. Available batches can be listed with 'biorxiv list' command.",
309
+ ],
310
+ [
311
+ '2018-01',
312
+ "Date 2018-01 is in the Back_Content period. Please specify a batch using --batch option. Available batches can be listed with 'biorxiv list' command.",
313
+ ],
314
+ ])('should throw error for Back_Content period month "%s" on medRxiv', (month, expectedError) => {
315
+ expect(() => getFolderStructure({ month, server: 'medrxiv' })).toThrow(expectedError);
316
+ });
317
+ });
318
+ describe('default server (bioRxiv)', () => {
319
+ it.each([
320
+ [
321
+ '2018-11',
322
+ "Date 2018-11 is in the Back_Content period. Please specify a batch using --batch option. Available batches can be listed with 'biorxiv list' command.",
323
+ ],
324
+ ])('should throw error for Back_Content period month "%s" with default server', (month, expectedError) => {
325
+ expect(() => getFolderStructure({ month })).toThrow(expectedError);
326
+ });
327
+ });
328
+ });
329
+ describe('with invalid inputs', () => {
330
+ it.each([
331
+ [{}, 'Either month or batch must be specified'],
332
+ [{ month: undefined, batch: undefined }, 'Either month or batch must be specified'],
333
+ [{ month: '', batch: '' }, 'Either month or batch must be specified'],
334
+ [
335
+ { month: 'invalid-month' },
336
+ 'Invalid month format: invalid-month. Expected YYYY-MM or Month_YYYY format.',
337
+ ],
338
+ [
339
+ { month: '2024-13' },
340
+ 'Invalid month format: 2024-13. Expected YYYY-MM or Month_YYYY format.',
341
+ ],
342
+ [
343
+ { month: '2024-00' },
344
+ 'Invalid month format: 2024-00. Expected YYYY-MM or Month_YYYY format.',
345
+ ],
346
+ [
347
+ { month: 'InvalidMonth_2024' },
348
+ 'Invalid month format: InvalidMonth_2024. Expected YYYY-MM or Month_YYYY format.',
349
+ ],
350
+ ])('should throw error for invalid input %o', (input, expectedError) => {
351
+ expect(() => getFolderStructure(input)).toThrow(expectedError);
352
+ });
353
+ });
354
+ describe('edge cases', () => {
355
+ describe('bioRxiv server', () => {
356
+ it('should handle December 2018 as Current Content (cutoff date)', () => {
357
+ const result = getFolderStructure({ month: '2018-12', server: 'biorxiv' });
358
+ expect(result.type).toBe('current');
359
+ expect(result.prefix).toBe('Current_Content/December_2018/');
360
+ expect(result.batch).toBe('December_2018');
361
+ });
362
+ it('should handle January 2019 as Current Content (after cutoff)', () => {
363
+ const result = getFolderStructure({ month: '2019-01', server: 'biorxiv' });
364
+ expect(result.type).toBe('current');
365
+ expect(result.prefix).toBe('Current_Content/January_2019/');
366
+ expect(result.batch).toBe('January_2019');
367
+ });
368
+ it('should handle November 2018 as Back Content (before cutoff)', () => {
369
+ expect(() => getFolderStructure({ month: '2018-11', server: 'biorxiv' })).toThrow('Date 2018-11 is in the Back_Content period. Please specify a batch using --batch option.');
370
+ });
371
+ });
372
+ describe('medRxiv server', () => {
373
+ it('should handle December 2018 as Current Content (cutoff date)', () => {
374
+ const result = getFolderStructure({ month: '2018-12', server: 'medrxiv' });
375
+ expect(result.type).toBe('current');
376
+ expect(result.prefix).toBe('Current_Content/December_2018/');
377
+ expect(result.batch).toBe('December_2018');
378
+ });
379
+ it('should handle January 2019 as Current Content (after cutoff)', () => {
380
+ const result = getFolderStructure({ month: '2019-01', server: 'medrxiv' });
381
+ expect(result.type).toBe('current');
382
+ expect(result.prefix).toBe('Current_Content/January_2019/');
383
+ expect(result.batch).toBe('January_2019');
384
+ });
385
+ it('should handle November 2018 as Back Content (before cutoff)', () => {
386
+ expect(() => getFolderStructure({ month: '2018-11', server: 'medrxiv' })).toThrow('Date 2018-11 is in the Back_Content period. Please specify a batch using --batch option.');
387
+ });
388
+ });
389
+ describe('default server (bioRxiv)', () => {
390
+ it('should handle December 2018 as Current Content (cutoff date)', () => {
391
+ const result = getFolderStructure({ month: '2018-12' });
392
+ expect(result.type).toBe('current');
393
+ expect(result.prefix).toBe('Current_Content/December_2018/');
394
+ expect(result.batch).toBe('December_2018');
395
+ });
396
+ it('should handle January 2019 as Current Content (after cutoff)', () => {
397
+ const result = getFolderStructure({ month: '2019-01' });
398
+ expect(result.type).toBe('current');
399
+ expect(result.prefix).toBe('Current_Content/January_2019/');
400
+ expect(result.batch).toBe('January_2019');
401
+ });
402
+ it('should handle November 2018 as Back Content (before cutoff)', () => {
403
+ expect(() => getFolderStructure({ month: '2018-11' })).toThrow('Date 2018-11 is in the Back_Content period. Please specify a batch using --batch option.');
404
+ });
405
+ });
406
+ });
407
+ describe('server validation', () => {
408
+ it('should not allow both month and batch to be specified', () => {
409
+ expect(() => getFolderStructure({ month: '2024-01', batch: '1' })).toThrow('Either month or batch must be specified, not both');
410
+ expect(() => getFolderStructure({ month: '2024-01', batch: '1', server: 'medrxiv' })).toThrow('Either month or batch must be specified, not both');
411
+ });
412
+ it('should require either month or batch', () => {
413
+ expect(() => getFolderStructure({ server: 'biorxiv' })).toThrow('Either month or batch must be specified');
414
+ expect(() => getFolderStructure({ server: 'medrxiv' })).toThrow('Either month or batch must be specified');
415
+ });
416
+ });
417
+ });
418
+ });
419
+ //# sourceMappingURL=folder-structure.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"folder-structure.test.js","sourceRoot":"","sources":["../src/folder-structure.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE3E,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;IAC3C,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;YACxC,EAAE,CAAC,IAAI,CAAC;gBACN,gBAAgB;gBAChB,CAAC,CAAC,EAAE,UAAU,CAAC;gBACf,CAAC,CAAC,EAAE,UAAU,CAAC;gBACf,CAAC,EAAE,EAAE,UAAU,CAAC;gBAChB,CAAC,EAAE,EAAE,UAAU,CAAC;gBAChB,CAAC,GAAG,EAAE,WAAW,CAAC;gBAElB,qCAAqC;gBACrC,CAAC,GAAG,EAAE,UAAU,CAAC;gBACjB,CAAC,GAAG,EAAE,UAAU,CAAC;gBACjB,CAAC,IAAI,EAAE,UAAU,CAAC;gBAClB,CAAC,IAAI,EAAE,UAAU,CAAC;gBAClB,CAAC,IAAI,EAAE,UAAU,CAAC;gBAElB,sBAAsB;gBACtB,CAAC,QAAQ,EAAE,UAAU,CAAC;gBACtB,CAAC,SAAS,EAAE,UAAU,CAAC;gBACvB,CAAC,SAAS,EAAE,UAAU,CAAC;gBACvB,CAAC,QAAQ,EAAE,UAAU,CAAC;gBACtB,CAAC,SAAS,EAAE,UAAU,CAAC;gBACvB,CAAC,SAAS,EAAE,UAAU,CAAC;gBAEvB,qBAAqB;gBACrB,CAAC,KAAK,EAAE,UAAU,CAAC;gBACnB,CAAC,KAAK,EAAE,UAAU,CAAC;gBACnB,CAAC,KAAK,EAAE,UAAU,CAAC;gBACnB,CAAC,UAAU,EAAE,UAAU,CAAC;gBACxB,CAAC,WAAW,EAAE,UAAU,CAAC;gBACzB,CAAC,WAAW,EAAE,UAAU,CAAC;gBAEzB,aAAa;gBACb,CAAC,UAAU,EAAE,UAAU,CAAC;gBACxB,CAAC,UAAU,EAAE,UAAU,CAAC;gBACxB,CAAC,UAAU,EAAE,UAAU,CAAC;gBACxB,CAAC,UAAU,EAAE,UAAU,CAAC;aACzB,CAAC,CAAC,2CAA2C,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE;gBAClE,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC1D,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,IAAI,CAAC;gBACN,CAAC,GAAG,EAAE,0EAA0E,CAAC;gBACjF,CAAC,IAAI,EAAE,2EAA2E,CAAC;gBACnF,CAAC,KAAK,EAAE,4EAA4E,CAAC;gBACrF;oBACE,WAAW;oBACX,kFAAkF;iBACnF;gBACD,CAAC,EAAE,EAAE,yEAAyE,CAAC;gBAC/E,CAAC,QAAQ,EAAE,+EAA+E,CAAC;gBAC3F,CAAC,QAAQ,EAAE,+EAA+E,CAAC;aAC5F,CAAC,CAAC,uDAAuD,EAAE,CAAC,KAAK,EAAE,aAAa,EAAE,EAAE;gBACnF,MAAM,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;YACxE,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,IAAI,CAAC;gBACN,CAAC,CAAC,EAAE,0EAA0E,CAAC;gBAC/E,CAAC,CAAC,CAAC,EAAE,2EAA2E,CAAC;gBACjF,CAAC,CAAC,GAAG,EAAE,6EAA6E,CAAC;aACtF,CAAC,CAAC,4DAA4D,EAAE,CAAC,KAAK,EAAE,aAAa,EAAE,EAAE;gBACxF,MAAM,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;YACxE,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;YAC9B,EAAE,CAAC,IAAI,CAAC;gBACN,gBAAgB;gBAChB,CAAC,CAAC,EAAE,kBAAkB,CAAC;gBACvB,CAAC,CAAC,EAAE,kBAAkB,CAAC;gBACvB,CAAC,EAAE,EAAE,kBAAkB,CAAC;gBACxB,CAAC,EAAE,EAAE,kBAAkB,CAAC;gBACxB,CAAC,GAAG,EAAE,mBAAmB,CAAC;gBAE1B,qCAAqC;gBACrC,CAAC,GAAG,EAAE,kBAAkB,CAAC;gBACzB,CAAC,GAAG,EAAE,kBAAkB,CAAC;gBACzB,CAAC,IAAI,EAAE,kBAAkB,CAAC;gBAC1B,CAAC,IAAI,EAAE,kBAAkB,CAAC;gBAC1B,CAAC,IAAI,EAAE,kBAAkB,CAAC;gBAE1B,sBAAsB;gBACtB,CAAC,QAAQ,EAAE,kBAAkB,CAAC;gBAC9B,CAAC,SAAS,EAAE,kBAAkB,CAAC;gBAC/B,CAAC,SAAS,EAAE,kBAAkB,CAAC;gBAC/B,CAAC,QAAQ,EAAE,kBAAkB,CAAC;gBAC9B,CAAC,SAAS,EAAE,kBAAkB,CAAC;gBAC/B,CAAC,SAAS,EAAE,kBAAkB,CAAC;gBAE/B,wBAAwB;gBACxB,CAAC,gBAAgB,EAAE,kBAAkB,CAAC;gBACtC,CAAC,iBAAiB,EAAE,kBAAkB,CAAC;gBACvC,CAAC,iBAAiB,EAAE,kBAAkB,CAAC;gBACvC,CAAC,gBAAgB,EAAE,kBAAkB,CAAC;gBACtC,CAAC,iBAAiB,EAAE,kBAAkB,CAAC;gBACvC,CAAC,iBAAiB,EAAE,kBAAkB,CAAC;gBAEvC,qBAAqB;gBACrB,CAAC,KAAK,EAAE,kBAAkB,CAAC;gBAC3B,CAAC,KAAK,EAAE,kBAAkB,CAAC;gBAC3B,CAAC,KAAK,EAAE,kBAAkB,CAAC;gBAC3B,CAAC,UAAU,EAAE,kBAAkB,CAAC;gBAChC,CAAC,WAAW,EAAE,kBAAkB,CAAC;gBACjC,CAAC,WAAW,EAAE,kBAAkB,CAAC;gBACjC,CAAC,kBAAkB,EAAE,kBAAkB,CAAC;gBACxC,CAAC,mBAAmB,EAAE,kBAAkB,CAAC;gBACzC,CAAC,mBAAmB,EAAE,kBAAkB,CAAC;gBAEzC,aAAa;gBACb,CAAC,UAAU,EAAE,kBAAkB,CAAC;gBAChC,CAAC,UAAU,EAAE,kBAAkB,CAAC;gBAChC,CAAC,UAAU,EAAE,kBAAkB,CAAC;gBAChC,CAAC,UAAU,EAAE,kBAAkB,CAAC;gBAChC,CAAC,kBAAkB,EAAE,kBAAkB,CAAC;gBACxC,CAAC,kBAAkB,EAAE,kBAAkB,CAAC;gBACxC,CAAC,kBAAkB,EAAE,kBAAkB,CAAC;gBACxC,CAAC,kBAAkB,EAAE,kBAAkB,CAAC;aACzC,CAAC,CAAC,2CAA2C,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE;gBAClE,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC1D,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,IAAI,CAAC;gBACN,CAAC,GAAG,EAAE,0EAA0E,CAAC;gBACjF,CAAC,IAAI,EAAE,2EAA2E,CAAC;gBACnF,CAAC,KAAK,EAAE,4EAA4E,CAAC;gBACrF;oBACE,WAAW;oBACX,kFAAkF;iBACnF;gBACD;oBACE,mBAAmB;oBACnB,0FAA0F;iBAC3F;gBACD,CAAC,EAAE,EAAE,yEAAyE,CAAC;gBAC/E,CAAC,QAAQ,EAAE,+EAA+E,CAAC;gBAC3F,CAAC,QAAQ,EAAE,+EAA+E,CAAC;gBAC3F;oBACE,gBAAgB;oBAChB,uFAAuF;iBACxF;gBACD;oBACE,gBAAgB;oBAChB,uFAAuF;iBACxF;aACF,CAAC,CAAC,uDAAuD,EAAE,CAAC,KAAK,EAAE,aAAa,EAAE,EAAE;gBACnF,MAAM,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;YACxE,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,IAAI,CAAC;gBACN,CAAC,CAAC,EAAE,0EAA0E,CAAC;gBAC/E,CAAC,CAAC,CAAC,EAAE,2EAA2E,CAAC;gBACjF,CAAC,CAAC,GAAG,EAAE,6EAA6E,CAAC;aACtF,CAAC,CAAC,4DAA4D,EAAE,CAAC,KAAK,EAAE,aAAa,EAAE,EAAE;gBACxF,MAAM,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;YACxE,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,wCAAwC,EAAE,GAAG,EAAE;YACtD,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;gBACnE,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBAC3C,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBAC7C,MAAM,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACtD,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;YAC7C,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;gBACrD,MAAM,CAAC,cAAc,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBACtD,MAAM,CAAC,cAAc,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBACtD,MAAM,CAAC,cAAc,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;gBAC9D,MAAM,CAAC,cAAc,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YAChE,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAClC,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;YACjC,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;gBAC9B,EAAE,CAAC,IAAI,CAAC;oBACN,CAAC,GAAG,EAAE,wBAAwB,CAAC;oBAC/B,CAAC,GAAG,EAAE,wBAAwB,CAAC;oBAC/B,CAAC,IAAI,EAAE,wBAAwB,CAAC;oBAChC,CAAC,QAAQ,EAAE,wBAAwB,CAAC;oBACpC,CAAC,SAAS,EAAE,wBAAwB,CAAC;oBACrC,CAAC,SAAS,EAAE,wBAAwB,CAAC;oBACrC,CAAC,UAAU,EAAE,wBAAwB,CAAC;oBACtC,CAAC,UAAU,EAAE,wBAAwB,CAAC;iBACvC,CAAC,CACA,gEAAgE,EAChE,CAAC,KAAK,EAAE,cAAc,EAAE,EAAE;oBACxB,MAAM,MAAM,GAAG,kBAAkB,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;oBAEhE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBACjC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;oBAC3C,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;gBAClF,CAAC,CACF,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;gBAC9B,EAAE,CAAC,IAAI,CAAC;oBACN,CAAC,GAAG,EAAE,gCAAgC,CAAC;oBACvC,CAAC,GAAG,EAAE,gCAAgC,CAAC;oBACvC,CAAC,IAAI,EAAE,gCAAgC,CAAC;oBACxC,CAAC,QAAQ,EAAE,gCAAgC,CAAC;oBAC5C,CAAC,SAAS,EAAE,gCAAgC,CAAC;oBAC7C,CAAC,SAAS,EAAE,gCAAgC,CAAC;oBAC7C,CAAC,gBAAgB,EAAE,gCAAgC,CAAC;oBACpD,CAAC,iBAAiB,EAAE,gCAAgC,CAAC;oBACrD,CAAC,iBAAiB,EAAE,gCAAgC,CAAC;oBACrD,CAAC,kBAAkB,EAAE,gCAAgC,CAAC;iBACvD,CAAC,CACA,gEAAgE,EAChE,CAAC,KAAK,EAAE,cAAc,EAAE,EAAE;oBACxB,MAAM,MAAM,GAAG,kBAAkB,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;oBAEhE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBACjC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;oBAC3C,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,iBAAiB,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;gBAC1F,CAAC,CACF,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;gBACxC,EAAE,CAAC,IAAI,CAAC;oBACN,CAAC,GAAG,EAAE,wBAAwB,CAAC;oBAC/B,CAAC,GAAG,EAAE,wBAAwB,CAAC;oBAC/B,CAAC,IAAI,EAAE,wBAAwB,CAAC;iBACjC,CAAC,CACA,yEAAyE,EACzE,CAAC,KAAK,EAAE,cAAc,EAAE,EAAE;oBACxB,MAAM,MAAM,GAAG,kBAAkB,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;oBAE7C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBACjC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;oBAC3C,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;gBAClF,CAAC,CACF,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,4CAA4C,EAAE,GAAG,EAAE;YAC1D,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;gBAC9B,EAAE,CAAC,IAAI,CAAC;oBACN,CAAC,SAAS,EAAE,+BAA+B,EAAE,cAAc,CAAC;oBAC5D,CAAC,SAAS,EAAE,4BAA4B,EAAE,WAAW,CAAC;oBACtD,CAAC,SAAS,EAAE,gCAAgC,EAAE,eAAe,CAAC;oBAC9D,CAAC,SAAS,EAAE,+BAA+B,EAAE,cAAc,CAAC;oBAC5D,CAAC,SAAS,EAAE,+BAA+B,EAAE,cAAc,CAAC;oBAC5D,CAAC,SAAS,EAAE,+BAA+B,EAAE,cAAc,CAAC;oBAC5D,CAAC,cAAc,EAAE,+BAA+B,EAAE,cAAc,CAAC;oBACjE,CAAC,WAAW,EAAE,4BAA4B,EAAE,WAAW,CAAC;oBACxD,CAAC,eAAe,EAAE,gCAAgC,EAAE,eAAe,CAAC;oBACpE,CAAC,UAAU,EAAE,gCAAgC,EAAE,eAAe,CAAC;oBAC/D,CAAC,eAAe,EAAE,gCAAgC,EAAE,eAAe,CAAC;iBACrE,CAAC,CACA,mEAAmE,EACnE,CAAC,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,EAAE;oBAC/B,MAAM,MAAM,GAAG,kBAAkB,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;oBAEhE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;oBACpC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;oBAC3C,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACnC,CAAC,CACF,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;gBAC9B,EAAE,CAAC,IAAI,CAAC;oBACN,CAAC,SAAS,EAAE,+BAA+B,EAAE,cAAc,CAAC;oBAC5D,CAAC,SAAS,EAAE,4BAA4B,EAAE,WAAW,CAAC;oBACtD,CAAC,SAAS,EAAE,gCAAgC,EAAE,eAAe,CAAC;oBAC9D,CAAC,SAAS,EAAE,+BAA+B,EAAE,cAAc,CAAC;oBAC5D,CAAC,SAAS,EAAE,+BAA+B,EAAE,cAAc,CAAC;oBAC5D,CAAC,SAAS,EAAE,+BAA+B,EAAE,cAAc,CAAC;oBAC5D,CAAC,cAAc,EAAE,+BAA+B,EAAE,cAAc,CAAC;oBACjE,CAAC,WAAW,EAAE,4BAA4B,EAAE,WAAW,CAAC;oBACxD,CAAC,eAAe,EAAE,gCAAgC,EAAE,eAAe,CAAC;iBACrE,CAAC,CACA,mEAAmE,EACnE,CAAC,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,EAAE;oBAC/B,MAAM,MAAM,GAAG,kBAAkB,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;oBAEhE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;oBACpC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;oBAC3C,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACnC,CAAC,CACF,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;gBACxC,EAAE,CAAC,IAAI,CAAC;oBACN,CAAC,SAAS,EAAE,+BAA+B,EAAE,cAAc,CAAC;oBAC5D,CAAC,SAAS,EAAE,+BAA+B,EAAE,cAAc,CAAC;iBAC7D,CAAC,CACA,4EAA4E,EAC5E,CAAC,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,EAAE;oBAC/B,MAAM,MAAM,GAAG,kBAAkB,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;oBAE7C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;oBACpC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;oBAC3C,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACnC,CAAC,CACF,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,yCAAyC,EAAE,GAAG,EAAE;YACvD,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;gBAC9B,EAAE,CAAC,IAAI,CAAC;oBACN;wBACE,SAAS;wBACT,uJAAuJ;qBACxJ;oBACD;wBACE,SAAS;wBACT,uJAAuJ;qBACxJ;oBACD;wBACE,SAAS;wBACT,uJAAuJ;qBACxJ;oBACD;wBACE,SAAS;wBACT,uJAAuJ;qBACxJ;oBACD;wBACE,SAAS;wBACT,uJAAuJ;qBACxJ;oBACD;wBACE,eAAe;wBACf,6JAA6J;qBAC9J;oBACD;wBACE,cAAc;wBACd,4JAA4J;qBAC7J;iBACF,CAAC,CACA,kEAAkE,EAClE,CAAC,KAAK,EAAE,aAAa,EAAE,EAAE;oBACvB,MAAM,CAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;gBACxF,CAAC,CACF,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;gBAC9B,EAAE,CAAC,IAAI,CAAC;oBACN;wBACE,SAAS;wBACT,uJAAuJ;qBACxJ;oBACD;wBACE,SAAS;wBACT,uJAAuJ;qBACxJ;oBACD;wBACE,SAAS;wBACT,uJAAuJ;qBACxJ;iBACF,CAAC,CACA,kEAAkE,EAClE,CAAC,KAAK,EAAE,aAAa,EAAE,EAAE;oBACvB,MAAM,CAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;gBACxF,CAAC,CACF,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;gBACxC,EAAE,CAAC,IAAI,CAAC;oBACN;wBACE,SAAS;wBACT,uJAAuJ;qBACxJ;iBACF,CAAC,CACA,2EAA2E,EAC3E,CAAC,KAAK,EAAE,aAAa,EAAE,EAAE;oBACvB,MAAM,CAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;gBACrE,CAAC,CACF,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;YACnC,EAAE,CAAC,IAAI,CAAC;gBACN,CAAC,EAAE,EAAE,yCAAyC,CAAC;gBAC/C,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,yCAAyC,CAAC;gBACnF,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,yCAAyC,CAAC;gBACrE;oBACE,EAAE,KAAK,EAAE,eAAe,EAAE;oBAC1B,6EAA6E;iBAC9E;gBACD;oBACE,EAAE,KAAK,EAAE,SAAS,EAAE;oBACpB,uEAAuE;iBACxE;gBACD;oBACE,EAAE,KAAK,EAAE,SAAS,EAAE;oBACpB,uEAAuE;iBACxE;gBACD;oBACE,EAAE,KAAK,EAAE,mBAAmB,EAAE;oBAC9B,iFAAiF;iBAClF;aACF,CAAC,CAAC,yCAAyC,EAAE,CAAC,KAAK,EAAE,aAAa,EAAE,EAAE;gBACrE,MAAM,CAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;YACjE,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;YAC1B,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;gBAC9B,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;oBACtE,MAAM,MAAM,GAAG,kBAAkB,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;oBAE3E,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;oBACpC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;oBAC7D,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;gBAC7C,CAAC,CAAC,CAAC;gBAEH,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;oBACtE,MAAM,MAAM,GAAG,kBAAkB,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;oBAE3E,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;oBACpC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;oBAC5D,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;gBAC5C,CAAC,CAAC,CAAC;gBAEH,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;oBACrE,MAAM,CAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,OAAO,CAC/E,0FAA0F,CAC3F,CAAC;gBACJ,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;gBAC9B,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;oBACtE,MAAM,MAAM,GAAG,kBAAkB,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;oBAE3E,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;oBACpC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;oBAC7D,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;gBAC7C,CAAC,CAAC,CAAC;gBAEH,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;oBACtE,MAAM,MAAM,GAAG,kBAAkB,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;oBAE3E,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;oBACpC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;oBAC5D,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;gBAC5C,CAAC,CAAC,CAAC;gBAEH,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;oBACrE,MAAM,CAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,OAAO,CAC/E,0FAA0F,CAC3F,CAAC;gBACJ,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;gBACxC,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;oBACtE,MAAM,MAAM,GAAG,kBAAkB,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;oBAExD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;oBACpC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;oBAC7D,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;gBAC7C,CAAC,CAAC,CAAC;gBAEH,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;oBACtE,MAAM,MAAM,GAAG,kBAAkB,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;oBAExD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;oBACpC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;oBAC5D,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;gBAC5C,CAAC,CAAC,CAAC;gBAEH,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;oBACrE,MAAM,CAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,OAAO,CAC5D,0FAA0F,CAC3F,CAAC;gBACJ,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;YACjC,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;gBAC/D,MAAM,CAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,CACxE,mDAAmD,CACpD,CAAC;gBACF,MAAM,CAAC,GAAG,EAAE,CACV,kBAAkB,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CACxE,CAAC,OAAO,CAAC,mDAAmD,CAAC,CAAC;YACjE,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;gBAC9C,MAAM,CAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,OAAO,CAC7D,yCAAyC,CAC1C,CAAC;gBACF,MAAM,CAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,OAAO,CAC7D,yCAAyC,CAC1C,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from './biorxiv-parser.js';
2
+ export * from './folder-structure.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,4 @@
1
+ // Export all utility functions
2
+ export * from './biorxiv-parser.js';
3
+ export * from './folder-structure.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC"}
package/package.json ADDED
@@ -0,0 +1,42 @@
1
+ {
2
+ "name": "openrxiv-utils",
3
+ "version": "0.0.0",
4
+ "description": "Utility functions for bioRxiv operations including URL parsing and DOI handling",
5
+ "main": "dist/index.js",
6
+ "type": "module",
7
+ "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js",
12
+ "default": "./dist/index.js"
13
+ }
14
+ },
15
+ "scripts": {
16
+ "build": "tsc",
17
+ "dev": "tsc --watch",
18
+ "test": "vitest run",
19
+ "test:watch": "vitest watch"
20
+ },
21
+ "keywords": [
22
+ "biorxiv",
23
+ "utils",
24
+ "doi",
25
+ "url-parsing",
26
+ "validation"
27
+ ],
28
+ "author": "Your Name",
29
+ "license": "MIT",
30
+ "engines": {
31
+ "node": ">=18.0.0"
32
+ },
33
+ "devDependencies": {},
34
+ "repository": {
35
+ "type": "git",
36
+ "url": "https://github.com/yourusername/biorxiv-meca.git"
37
+ },
38
+ "bugs": {
39
+ "url": "https://github.com/yourusername/biorxiv-meca/issues"
40
+ },
41
+ "homepage": "https://github.com/yourusername/biorxiv-meca#readme"
42
+ }