@tremolo-ui/functions 0.6.0 → 0.8.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.
package/dist/index.d.cts CHANGED
@@ -2,20 +2,20 @@
2
2
  /**
3
3
  * clamp value between min and max
4
4
  */
5
- declare function clamp(value: number, min: number, max: number): number;
5
+ export declare function clamp(value: number, min: number, max: number): number;
6
6
  /**
7
7
  * Normalize the value from 0 to 1, spreading the range evenly.
8
8
  *
9
9
  * This is the linear mapping and takes no curve of its own; a `Scale` builds
10
10
  * whatever curve it needs on top of it.
11
11
  */
12
- declare function normalizeValue(value: number, min: number, max: number): number;
12
+ export declare function normalizeValue(value: number, min: number, max: number): number;
13
13
  /**
14
14
  * Convert normalized values back to raw values, spreading the range evenly.
15
15
  *
16
16
  * The inverse of {@link normalizeValue}.
17
17
  */
18
- declare function rawValue(normalizedValue: number, min: number, max: number): number;
18
+ export declare function rawValue(normalizedValue: number, min: number, max: number): number;
19
19
  /**
20
20
  * Put a value on the grid the caller asked for, rounding a half step upwards.
21
21
  *
@@ -26,14 +26,8 @@ declare function rawValue(normalizedValue: number, min: number, max: number): nu
26
26
  * side the last bit happened to land on — 0.25 rounded up while 0.15 and 0.35
27
27
  * rounded down.
28
28
  */
29
- declare function stepValue(value: number, step: number): number;
30
- declare function toFixed(x: number, fractionDigits?: number): number;
31
- /**
32
- * The significant decimal digits a double actually carries. A double holds a
33
- * little under 16, so anything past this is the binary representation showing
34
- * through rather than information.
35
- */
36
- declare const SIGNIFICANT_DIGITS = 15;
29
+ export declare function stepValue(value: number, step: number): number;
30
+ export declare function toFixed(x: number, fractionDigits?: number): number;
37
31
  /**
38
32
  * Drop the binary artefact from a computed value.
39
33
  *
@@ -54,85 +48,12 @@ declare const SIGNIFICANT_DIGITS = 15;
54
48
  * @example
55
49
  * toPrecision(5.1 + 0.1) // 5.2, rather than 5.199999999999999
56
50
  */
57
- declare function toPrecision(x: number, significantDigits?: number): number;
58
- declare function integerPart(x: number | string): string | undefined;
59
- declare function decimalPart(x: number | string): string | undefined;
60
- declare function radian(degree: number): number;
61
- declare function degree(radian: number): number;
62
- declare function mapValue(value: number, inMin: number, inMax: number, outMin: number, outMax: number): number;
63
- declare function dbToGain(db: number): number;
64
- declare function gainToDb(gain: number): number;
65
- //#endregion
66
- //#region src/modifiers.d.ts
67
- /**
68
- * Options for setting the amount of keyboard and mouse wheel changes.
69
- */
70
- type InputEventOption = readonly ['normalized' | 'raw', number];
71
- /**
72
- * A modifier key that can carry an amount of its own.
73
- *
74
- * `ctrl` and `meta` are kept apart rather than folded into one "command" key:
75
- * a plugin UI that mirrors a desktop host usually wants the same physical key
76
- * on every platform, not the platform's own convention.
77
- */
78
- type Modifier = 'shift' | 'alt' | 'ctrl' | 'meta';
79
- /** The modifier flags of a `WheelEvent` or a `KeyboardEvent`. */
80
- interface ModifierState {
81
- shiftKey: boolean;
82
- altKey: boolean;
83
- ctrlKey: boolean;
84
- metaKey: boolean;
85
- }
86
- /** One setting per modifier key, with `default` for none of them. */
87
- type ModifierSetting = number | InputEventOption;
88
- type ModifierMap<T extends ModifierSetting> = {
89
- default: T;
90
- } & Partial<Record<Modifier, T>>;
91
- /**
92
- * A single setting, or one per modifier key.
93
- *
94
- * @example
95
- * ['raw', 1]
96
- * { default: ['raw', 1], shift: ['raw', 0.1] }
97
- */
98
- type ModifierValue<T extends ModifierSetting> = T | ModifierMap<T>;
99
- interface SelectedInputEvent {
100
- option: InputEventOption;
101
- /** Which modifier entry was chosen, or `null` for `default`. */
102
- modifier: Modifier | null;
103
- }
104
- /**
105
- * Pick the setting that applies, given the modifier keys being held.
106
- *
107
- * @example
108
- * selectModifier({ default: 1, shift: 0.1 }, event)
109
- */
110
- declare function selectModifier<T extends ModifierSetting>(options: ModifierValue<T>, modifiers?: ModifierState): {
111
- value: T;
112
- modifier: Modifier | null;
113
- };
114
- /**
115
- * Turn every entry of a setting into another kind of setting, keeping which
116
- * modifier each belongs to.
117
- *
118
- * A drag sensitivity is a number and a keyboard amount is a tuple, but the two
119
- * describe the same thing from the caller's side. This carries one over to the
120
- * other so that a component can hand a sensitivity to {@link applyDelta}
121
- * without unpicking the modifier map itself — which matters, since naming a
122
- * modifier is also what takes `step` out of the pipeline.
123
- *
124
- * @example
125
- * mapModifier({ default: 1, shift: 0.1 }, (f) => ['raw', step * f])
126
- * // { default: ['raw', 1], shift: ['raw', 0.1] }
127
- */
128
- declare function mapModifier<T extends ModifierSetting, U extends ModifierSetting>(options: ModifierValue<T>, fn: (value: T) => U): ModifierValue<U>;
129
- /**
130
- * Pick the amount that applies, given the modifier keys being held.
131
- *
132
- * @example
133
- * selectInputEvent({ default: ['raw', 1], shift: ['raw', 0.1] }, event)
134
- */
135
- declare function selectInputEvent(options: ModifierValue<InputEventOption>, modifiers?: ModifierState): SelectedInputEvent;
51
+ export declare function toPrecision(x: number, significantDigits?: number): number;
52
+ export declare function radian(degree: number): number;
53
+ export declare function degree(radian: number): number;
54
+ export declare function mapValue(value: number, inMin: number, inMax: number, outMin: number, outMax: number): number;
55
+ export declare function dbToGain(db: number): number;
56
+ export declare function gainToDb(gain: number): number;
136
57
  //#endregion
137
58
  //#region src/scales.d.ts
138
59
  /**
@@ -162,7 +83,7 @@ interface Scale {
162
83
  * The right default for anything already linear in perception: dB values,
163
84
  * pan, percentages, MIDI note numbers, semitones.
164
85
  */
165
- declare const linearScale: Scale;
86
+ export declare const linearScale: Scale;
166
87
  /**
167
88
  * The power law of JUCE's `NormalisableRange::skew`, applied to `value - min`.
168
89
  *
@@ -179,12 +100,12 @@ declare const linearScale: Scale;
179
100
  *
180
101
  * @param skew the JUCE skew factor
181
102
  */
182
- declare function skewScale(skew: number): Scale;
103
+ export declare function skewScale(skew: number): Scale;
183
104
  /**
184
105
  * The skew factor for {@link skewScale} that puts `centerValue` at the middle
185
106
  * of the travel — JUCE's `NormalisableRange::setSkewForCentre`.
186
107
  */
187
- declare function skewWithCenterValue(centerValue: number, min: number, max: number): number;
108
+ export declare function skewWithCenterValue(centerValue: number, min: number, max: number): number;
188
109
  /**
189
110
  * Equal travel gives an equal *ratio*, so an octave — or a percentage — takes
190
111
  * the same distance wherever it falls.
@@ -196,7 +117,7 @@ declare function skewWithCenterValue(centerValue: number, min: number, max: numb
196
117
  * ratio reaches zero or crosses it. Use {@link curveScale} for a range that
197
118
  * starts at 0.
198
119
  */
199
- declare const exponentialScale: Scale;
120
+ export declare const exponentialScale: Scale;
200
121
  /**
201
122
  * An exponential bend that still passes exactly through `min` and `max`, so
202
123
  * unlike {@link exponentialScale} it works on a range that starts at 0 or
@@ -218,7 +139,7 @@ declare const exponentialScale: Scale;
218
139
  *
219
140
  * @param curve how hard the curve bends, and in which direction
220
141
  */
221
- declare function curveScale(curve: number): Scale;
142
+ export declare function curveScale(curve: number): Scale;
222
143
  /**
223
144
  * {@link skewScale} mirrored about the middle of the range, so both halves
224
145
  * bend the same way — JUCE's `symmetricSkew`.
@@ -231,12 +152,12 @@ declare function curveScale(curve: number): Scale;
231
152
  *
232
153
  * @param skew the JUCE skew factor
233
154
  */
234
- declare function symmetricSkewScale(skew: number): Scale;
155
+ export declare function symmetricSkewScale(skew: number): Scale;
235
156
  /**
236
157
  * The curve for {@link curveScale} that puts `centerValue` at the middle of
237
158
  * the travel — the counterpart of {@link skewWithCenterValue}.
238
159
  */
239
- declare function curveWithCenterValue(centerValue: number, min: number, max: number): number;
160
+ export declare function curveWithCenterValue(centerValue: number, min: number, max: number): number;
240
161
  /**
241
162
  * How a value is scaled: the range it lives in, how it is rounded, and how it
242
163
  * is distributed across the travel.
@@ -258,35 +179,13 @@ interface ValueRange {
258
179
  */
259
180
  scale?: Scale;
260
181
  }
261
- /**
262
- * Move a value by an amount of input, as reported by a wheel or an arrow key.
263
- *
264
- * The pipeline matches `createDragValue` of `@tremolo-ui/dom`: scale, then
265
- * step, then clamp. Which key or which sign of `deltaY` counts as which
266
- * direction is left to the caller, since it differs per component.
267
- *
268
- * @param direction which way, and how many times, to apply the option. The
269
- * size of one step is `option[1]`, so this is normally `1` or `-1`.
270
- *
271
- * @param modifiers the event, for `options` that name a modifier key. See
272
- * {@link selectInputEvent}.
273
- *
274
- * @example
275
- * // ArrowDown on a slider whose keyboard option is ['raw', 1]
276
- * applyDelta(value, -1, keyboard, { min, max, step, scale })
277
- *
278
- * @example
279
- * // Shift+ArrowDown, where `keyboard` is { default: …, shift: ['raw', 0.1] }
280
- * applyDelta(value, -1, keyboard, range, event)
281
- */
282
- declare function applyDelta(value: number, direction: number, options: ModifierValue<InputEventOption>, { min, max, step, scale }: ValueRange, modifiers?: ModifierState): number;
283
182
  //#endregion
284
183
  //#region src/midi.d.ts
285
- declare const whiteKeys: readonly ["A", "B", "C", "D", "E", "F", "G"];
184
+ export declare const whiteKeys: readonly ["A", "B", "C", "D", "E", "F", "G"];
286
185
  type WhiteKey = (typeof whiteKeys)[number];
287
- declare const noteKeys: readonly ["C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"];
186
+ export declare const noteKeys: readonly ["C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"];
288
187
  type NoteKey = (typeof noteKeys)[number];
289
- declare function parseNoteName(noteName: string): {
188
+ export declare function parseNoteName(noteName: string): {
290
189
  letter: WhiteKey;
291
190
  accidental: "#" | "##" | "b" | "bb" | "";
292
191
  octave: number;
@@ -294,33 +193,33 @@ declare function parseNoteName(noteName: string): {
294
193
  /**
295
194
  * Convert noteName to noteNumber
296
195
  */
297
- declare function noteNumber(noteName: string): number;
196
+ export declare function noteNumber(noteName: string): number;
298
197
  /**
299
198
  * Convert noteNumber to noteName
300
199
  * C-1 = 0
301
200
  * G9 = 127
302
201
  * @param noteNumber noteNumber
303
202
  */
304
- declare function noteName(noteNumber: number): `${NoteKey}${number}`;
203
+ export declare function noteName(noteNumber: number): `${NoteKey}${number}`;
305
204
  /**
306
205
  * Convert noteNumber to noteKey
307
206
  */
308
- declare function noteKey(noteNumber: number): NoteKey;
207
+ export declare function noteKey(noteNumber: number): NoteKey;
309
208
  /**
310
209
  * @param note noteNumber: 0 ~ 127 or noteName e.g. 'C3'
311
210
  */
312
- declare function isWhiteKey(note: number | string): boolean;
211
+ export declare function isWhiteKey(note: number | string): boolean;
313
212
  /**
314
213
  * @param note noteNumber: 0 ~ 127 or noteName e.g. 'C3'
315
214
  */
316
- declare function isBlackKey(note: number | string): boolean;
215
+ export declare function isBlackKey(note: number | string): boolean;
317
216
  /**
318
217
  * @param note noteNumber: 0 ~ 127 or noteName e.g. 'C3'
319
218
  * @param detune [cent]
320
219
  * @param a4 A4 frequency [Hz]
321
220
  * @returns frequency [Hz]
322
221
  */
323
- declare function noteToFrequency(note: number | string, detune?: number, a4?: number): number;
222
+ export declare function noteToFrequency(note: number | string, detune?: number, a4?: number): number;
324
223
  /**
325
224
  * Semitones above the root, for each supported scale.
326
225
  *
@@ -332,7 +231,7 @@ declare function noteToFrequency(note: number | string, detune?: number, a4?: nu
332
231
  * spellings are here because both are what someone reaches for depending on
333
232
  * whether they are thinking in keys or in modes.
334
233
  */
335
- declare const scaleIntervals: {
234
+ export declare const scaleIntervals: {
336
235
  readonly major: readonly [0, 2, 4, 5, 7, 9, 11];
337
236
  readonly naturalMinor: readonly [0, 2, 3, 5, 7, 8, 10];
338
237
  readonly harmonicMinor: readonly [0, 2, 3, 5, 7, 8, 11];
@@ -362,7 +261,7 @@ type ScaleName = keyof typeof scaleIntervals;
362
261
  * inScale('F#4', 'D3', 'major') // true
363
262
  * ```
364
263
  */
365
- declare function inScale(note: number | string, root: number | string, name: ScaleName): boolean;
264
+ export declare function inScale(note: number | string, root: number | string, name: ScaleName): boolean;
366
265
  /**
367
266
  * The notes of a scale, ascending from `root`.
368
267
  *
@@ -377,71 +276,7 @@ declare function inScale(note: number | string, root: number | string, name: Sca
377
276
  * scaleNotes('C3', 'majorPentatonic') // [48, 50, 52, 55, 57]
378
277
  * ```
379
278
  */
380
- declare function scaleNotes(root: number | string, name: ScaleName, octaves?: number): number[];
381
- //#endregion
382
- //#region src/piano.d.ts
383
- type NoteRange = {
384
- first: number;
385
- last: number;
386
- };
387
- /**
388
- * `[noteRange.first, noteRange.first + 1, ..., noteRange.last]`
389
- */
390
- declare function getNoteRangeArray(noteRange: NoteRange): number[];
391
- /**
392
- * The geometry of a drawn keyboard.
393
- *
394
- * One description is shared by the drawing and the hit testing, so a key cannot
395
- * be drawn somewhere other than where it responds.
396
- */
397
- interface PianoLayout {
398
- noteRange: NoteRange;
399
- /** Width of a white key, excluding {@link PianoLayout.keyGap}. */
400
- whiteKeyWidth: number;
401
- /**
402
- * Space between two white keys. Part of the slot a white key occupies, so it
403
- * still belongs to one of the keys for the purpose of hit testing.
404
- *
405
- * @default 1
406
- */
407
- keyGap?: number;
408
- /**
409
- * Width of a black key, as a fraction of {@link PianoLayout.whiteKeyWidth}.
410
- *
411
- * @default 0.65
412
- */
413
- blackKeyWidthRatio?: number;
414
- /**
415
- * Height of a black key, as a fraction of the height of the keyboard.
416
- *
417
- * @default 0.6
418
- */
419
- blackKeyHeightRatio?: number;
420
- }
421
- /** Width of a black key in pixels. */
422
- declare function blackKeyWidth(layout: PianoLayout): number;
423
- /** Width of the whole keyboard in pixels. */
424
- declare function pianoWidth(layout: PianoLayout): number;
425
- /**
426
- * Offset of the left edge of a key from the left edge of the keyboard, in
427
- * pixels.
428
- *
429
- * Notes outside `noteRange` are placed too, so the value is negative below
430
- * `noteRange.first`.
431
- */
432
- declare function notePosition(note: number, layout: PianoLayout): number;
433
- /**
434
- * The note drawn at a point, or null where there is none.
435
- *
436
- * Black keys are tested first, so they win where they overlap a white one. A
437
- * white key covers its gap as well as its width, so the whole width of the
438
- * keyboard belongs to some key and a click cannot fall between two.
439
- *
440
- * @param x offset from the left edge of the keyboard, in pixels
441
- * @param y offset from its top edge, in pixels
442
- * @param height height of the keyboard, in pixels
443
- */
444
- declare function noteAt(x: number, y: number, height: number, layout: PianoLayout): number | null;
279
+ export declare function scaleNotes(root: number | string, name: ScaleName, octaves?: number): number[];
445
280
  //#endregion
446
281
  //#region src/unit.d.ts
447
282
  /**
@@ -503,11 +338,7 @@ interface UnitFormatter {
503
338
  * @example
504
339
  * <NumberInput.Root {...unitFormat('Hz', { digits: 2 })} value={v} onChange={setV}>
505
340
  */
506
- declare function unitFormat(unit: string, options?: UnitFormatOptions): UnitFormatter;
507
- //#endregion
508
- //#region src/util.d.ts
509
- declare function mod(n: number, m: number): number;
510
- declare function xor(a?: boolean, b?: boolean): boolean;
341
+ export declare function unitFormat(unit: string, options?: UnitFormatOptions): UnitFormatter;
511
342
  //#endregion
512
- export { type InputEventOption, type Modifier, type ModifierMap, type ModifierState, type ModifierValue, type NoteKey, type NoteRange, type PianoLayout, SIGNIFICANT_DIGITS, type SIPrefix, type Scale, type ScaleName, type SelectedInputEvent, type UnitFormatOptions, type UnitFormatter, type ValueRange, type WhiteKey, applyDelta, blackKeyWidth, clamp, curveScale, curveWithCenterValue, dbToGain, decimalPart, degree, exponentialScale, gainToDb, getNoteRangeArray, inScale, integerPart, isBlackKey, isWhiteKey, linearScale, mapModifier, mapValue, mod, normalizeValue, noteAt, noteKey, noteKeys, noteName, noteNumber, notePosition, noteToFrequency, parseNoteName, pianoWidth, radian, rawValue, scaleIntervals, scaleNotes, selectInputEvent, selectModifier, skewScale, skewWithCenterValue, stepValue, symmetricSkewScale, toFixed, toPrecision, unitFormat, whiteKeys, xor };
343
+ export type { NoteKey, SIPrefix, Scale, ScaleName, UnitFormatOptions, UnitFormatter, ValueRange, WhiteKey };
513
344
  //# sourceMappingURL=index.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.cts","names":[],"sources":["../src/math.ts","../src/modifiers.ts","../src/scales.ts","../src/midi.ts","../src/piano.ts","../src/unit.ts","../src/util.ts"],"mappings":";;;;iBAGgB,MAAM,eAAe,aAAa;;;;;;;iBAUlC,eAAe,eAAe,aAAa;;;;;;iBAU3C,SAAS,yBAAyB,aAAa;;;;;;;;;;;iBAe/C,UAAU,eAAe;iBAUzB,QAAQ,WAAW;;;;;;cAStB;;;;;;;;;;;;;;;;;;;;;iBAsBG,YAAY,WAAW;iBAUvB,YAAY;iBAOZ,YAAY;iBAIZ,OAAO;iBAIP,OAAO;iBAIP,SACd,eACA,eACA,eACA,gBACA;iBAKc,SAAS;iBAIT,SAAS;;;;;;KCvHb;;;;;;;;KASA;;UAGK;EACf;EACA;EACA;EACA;;;KAIG,2BAA2B;KAEpB,YAAY,UAAU;EAAqB,SAAS;IAAM,QACpE,OAAO,UAAU;;;;;;;;KAUP,cAAc,UAAU,mBAAmB,IAAI,YAAY;UAEtD;EACf,QAAQ;;EAER,UAAU;;;;;;;;iBAsCI,eAAe,UAAU,iBACvC,SAAS,cAAc,IACvB,YAAY;EACT,OAAO;EAAG,UAAU;;;;;;;;;;;;;;;;iBAiCT,YACd,UAAU,iBACV,UAAU,iBACV,SAAS,cAAc,IAAI,KAAK,OAAO,MAAM,IAAI,cAAc;;;;;;;iBAgBjD,iBACd,SAAS,cAAc,mBACvB,YAAY,gBACX;;;;;;;;;;;;;;;;;;UClHc;;EAEf,YAAY,eAAe,aAAa;;EAExC,cAAc,kBAAkB,aAAa;;;;;;;;cAmBlC,aAAa;;;;;;;;;;;;;;;;;iBAqBV,UAAU,eAAe;;;;;iBAsBzB,oBACd,qBACA,aACA;;;;;;;;;;;;cAmBW,kBAAkB;;;;;;;;;;;;;;;;;;;;;;iBAqDf,WAAW,gBAAgB;;;;;;;;;;;;;iBAmD3B,mBAAmB,eAAe;;;;;iBAiClC,qBACd,qBACA,aACA;;;;;;;;UAkBe;EACf;EACA;;;;EAIA;;;;;;EAMA,QAAQ;;;;;;;;;;;;;;;;;;;;;;;iBAwBM,WACd,eACA,mBACA,SAAS,cAAc,qBACrB,KAAK,KAAK,MAAM,SAAuB,YACzC,YAAY;;;cCpTD;KAED,mBAAmB;cAElB;KAeD,kBAAkB;iBAQd,cAAc;EAOY,QAAA;EACZ;;;;;;iBAQd,WAAW;;;;;;;iBAeX,SAAS,wBAAwB;;;;iBAUjC,QAAQ,qBAAqB;;;;iBAQ7B,WAAW;;;;iBAiBX,WAAW;;;;;;;iBAUX,gBAAgB,uBAAuB,iBAAY;;;;;;;;;;;;cAiBtD;;;;;;;;;;;;;;;;;;KAsBD,yBAAyB;;;;;;;;;;;;iBAarB,QACd,uBACA,uBACA,MAAM;;;;;;;;;;;;;;;iBAuBQ,WACd,uBACA,MAAM,WACN;;;KCxLU;EACV;EACA;;;;;iBAMc,kBAAkB,WAAW;;;;;;;UAa5B;EACf,WAAW;;EAGX;;;;;;;EAQA;;;;;;EAOA;;;;;;EAOA;;;iBA8Bc,cAAc,QAAQ;;iBA0CtB,WAAW,QAAQ;;;;;;;;iBAYnB,aAAa,cAAc,QAAQ;;;;;;;;;;;;iBAenC,OACd,WACA,WACA,gBACA,QAAQ;;;;;;;;;;KC/IE;UAwBK;;;;;;;;;EASf,OAAO;;;;;;;;;;EAUP;;;;EAIA;;;;;EAKA;;;UAIe;EACf,SAAS;EACT,QAAQ;;;;;;;;;;;;;;;;;;iBAiCM,WACd,cACA,UAAS,oBACR;;;iBCvGa,IAAI,WAAW;iBAIf,IAAI,aAAW"}
1
+ {"version":3,"file":"index.d.cts","names":[],"sources":["../src/math.ts","../src/scales.ts","../src/midi.ts","../src/unit.ts"],"mappings":";;;;wBAGgB,MAAM,eAAe,aAAa;;;;;;;wBAUlC,eAAe,eAAe,aAAa;;;;;;wBAU3C,SAAS,yBAAyB,aAAa;;;;;;;;;;;wBAe/C,UAAU,eAAe;wBAUzB,QAAQ,WAAW;;;;;;;;;;;;;;;;;;;;;wBA+BnB,YAAY,WAAW;wBAUvB,OAAO;wBAIP,OAAO;wBAIP,SACd,eACA,eACA,eACA,gBACA;wBAKc,SAAS;wBAIT,SAAS;;;;;;;;;;;;;;;;;;UC9FR;;EAEf,YAAY,eAAe,aAAa;;EAExC,cAAc,kBAAkB,aAAa;;;;;;;;qBAmBlC,aAAa;;;;;;;;;;;;;;;;;wBAqBV,UAAU,eAAe;;;;;wBAsBzB,oBACd,qBACA,aACA;;;;;;;;;;;;qBAmBW,kBAAkB;;;;;;;;;;;;;;;;;;;;;;wBAqDf,WAAW,gBAAgB;;;;;;;;;;;;;wBAmD3B,mBAAmB,eAAe;;;;;wBAiClC,qBACd,qBACA,aACA;;;;;;;;UAkBe;EACf;EACA;;;;EAIA;;;;;;EAMA,QAAQ;;;;qBCxQG;KAED,mBAAmB;qBAElB;KAeD,kBAAkB;wBAQd,cAAc;EAOY,QAAA;EACZ;;;;;;wBAQd,WAAW;;;;;;;wBAeX,SAAS,wBAAwB;;;;wBAUjC,QAAQ,qBAAqB;;;;wBAQ7B,WAAW;;;;wBAiBX,WAAW;;;;;;;wBAUX,gBAAgB,uBAAuB,iBAAY;;;;;;;;;;;;qBAiBtD;;;;;;;;;;;;;;;;;;KAsBD,yBAAyB;;;;;;;;;;;;wBAarB,QACd,uBACA,uBACA,MAAM;;;;;;;;;;;;;;;wBAuBQ,WACd,uBACA,MAAM,WACN;;;;;;;;;;KC1LU;UAwBK;;;;;;;;;EASf,OAAO;;;;;;;;;;EAUP;;;;EAIA;;;;;EAKA;;;UAIe;EACf,SAAS;EACT,QAAQ;;;;;;;;;;;;;;;;;;wBAiCM,WACd,cACA,UAAS,oBACR"}