@lucaismyname/ginger 0.0.17 → 0.0.21
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/README.md +76 -0
- package/dist/client.cjs +1 -1
- package/dist/client.js +2 -2
- package/dist/client.test.d.ts +2 -0
- package/dist/client.test.d.ts.map +1 -0
- package/dist/components/controls/Controls.d.ts +26 -13
- package/dist/components/controls/Controls.d.ts.map +1 -1
- package/dist/experimental-gapless/index.cjs.map +1 -1
- package/dist/experimental-gapless/index.d.ts +3 -1
- package/dist/experimental-gapless/index.d.ts.map +1 -1
- package/dist/experimental-gapless/index.js.map +1 -1
- package/dist/{ginger-F4UDi2Qf.js → ginger-8x4WzVmw.js} +196 -144
- package/dist/ginger-8x4WzVmw.js.map +1 -0
- package/dist/ginger-CMbd3s8C.cjs +2 -0
- package/dist/ginger-CMbd3s8C.cjs.map +1 -0
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +44 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/testing/helpers.d.ts +29 -0
- package/dist/testing/helpers.d.ts.map +1 -1
- package/dist/testing/helpers.test.d.ts +2 -0
- package/dist/testing/helpers.test.d.ts.map +1 -0
- package/dist/testing/index.cjs +48 -43
- package/dist/testing/index.cjs.map +1 -1
- package/dist/testing/index.d.ts +1 -1
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +6888 -3749
- package/dist/testing/index.js.map +1 -1
- package/dist/testing/index.test.d.ts +2 -0
- package/dist/testing/index.test.d.ts.map +1 -0
- package/dist/testing/renderGinger.d.ts.map +1 -1
- package/dist/{useNextTrackPrefetch-BeAKS3SR.cjs → useNextTrackPrefetch-CFoUynDv.cjs} +2 -2
- package/dist/{useNextTrackPrefetch-BeAKS3SR.cjs.map → useNextTrackPrefetch-CFoUynDv.cjs.map} +1 -1
- package/dist/{useNextTrackPrefetch-gKls_h_N.js → useNextTrackPrefetch-CV1khU0h.js} +2 -2
- package/dist/{useNextTrackPrefetch-gKls_h_N.js.map → useNextTrackPrefetch-CV1khU0h.js.map} +1 -1
- package/package.json +9 -1
- package/dist/ginger-DWOyCog6.cjs +0 -2
- package/dist/ginger-DWOyCog6.cjs.map +0 -1
- package/dist/ginger-F4UDi2Qf.js.map +0 -1
package/README.md
CHANGED
|
@@ -1,3 +1,79 @@
|
|
|
1
|
+
# @lucaismyname/ginger
|
|
2
|
+
|
|
3
|
+
Headless React audio player primitives for building custom music and podcast UIs.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @lucaismyname/ginger
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Peer dependencies:
|
|
12
|
+
|
|
13
|
+
- `react >= 18`
|
|
14
|
+
- `react-dom >= 18`
|
|
15
|
+
|
|
16
|
+
## Quick Start
|
|
17
|
+
|
|
18
|
+
```tsx
|
|
19
|
+
import { Ginger } from "@lucaismyname/ginger";
|
|
20
|
+
|
|
21
|
+
const tracks = [{ id: "a", title: "Track A", fileUrl: "/audio/a.mp3" }];
|
|
22
|
+
|
|
23
|
+
export function Player() {
|
|
24
|
+
return (
|
|
25
|
+
<Ginger.Provider initialTracks={tracks}>
|
|
26
|
+
<Ginger.Player />
|
|
27
|
+
<Ginger.Control.PlayPause />
|
|
28
|
+
<Ginger.Control.Previous />
|
|
29
|
+
<Ginger.Control.Next />
|
|
30
|
+
<Ginger.Control.SeekBar />
|
|
31
|
+
<Ginger.Control.Volume />
|
|
32
|
+
<Ginger.Current.Title fallback="No track" />
|
|
33
|
+
</Ginger.Provider>
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Documentation
|
|
39
|
+
|
|
40
|
+
- Getting started: [`docs/getting-started.md`](./docs/getting-started.md)
|
|
41
|
+
- Testing guide: [`docs/guides/testing.md`](./docs/guides/testing.md)
|
|
42
|
+
- Recipes: [`docs/guides/recipes.md`](./docs/guides/recipes.md)
|
|
43
|
+
- Accessibility checklist: [`docs/guides/accessibility.md`](./docs/guides/accessibility.md)
|
|
44
|
+
- Streaming adapters: [`docs/guides/streaming-adapters.md`](./docs/guides/streaming-adapters.md)
|
|
45
|
+
- Components reference: [`docs/reference/components.md`](./docs/reference/components.md)
|
|
46
|
+
- Hooks reference: [`docs/reference/hooks.md`](./docs/reference/hooks.md)
|
|
47
|
+
- Subpath exports: [`docs/reference/subpaths.md`](./docs/reference/subpaths.md)
|
|
48
|
+
- Generated API docs: [`docs/api/index.html`](./docs/api/index.html)
|
|
49
|
+
|
|
50
|
+
## Subpath Exports
|
|
51
|
+
|
|
52
|
+
- `@lucaismyname/ginger/client`
|
|
53
|
+
- `@lucaismyname/ginger/testing`
|
|
54
|
+
- `@lucaismyname/ginger/waveform`
|
|
55
|
+
- `@lucaismyname/ginger/experimental-gapless`
|
|
56
|
+
|
|
57
|
+
### Experimental Notice
|
|
58
|
+
|
|
59
|
+
`@lucaismyname/ginger/experimental-gapless` is intentionally non-production.
|
|
60
|
+
It currently provides capability metadata only and does not alter playback behavior.
|
|
61
|
+
|
|
62
|
+
## Release Process
|
|
63
|
+
|
|
64
|
+
- Changelog: [`CHANGELOG.md`](./CHANGELOG.md)
|
|
65
|
+
- Release note template: [`../../.github/release-template.md`](../../.github/release-template.md)
|
|
66
|
+
|
|
67
|
+
Before publishing:
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
npm run build
|
|
71
|
+
npm run test
|
|
72
|
+
npm run typecheck
|
|
73
|
+
npm run lint
|
|
74
|
+
npm run docs:api
|
|
75
|
+
```
|
|
76
|
+
|
|
1
77
|
# ginger
|
|
2
78
|
|
|
3
79
|
**`@lucaismyname/ginger`** is a headless React audio player built on the native **`<audio>`** element. It gives you a provider, a hidden media element, a typed state/control hook, and composable React components for transport controls, track metadata, queue metadata, and playlists.
|
package/dist/client.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./ginger-
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./ginger-CMbd3s8C.cjs"),r=require("./useNextTrackPrefetch-CFoUynDv.cjs"),a=require("./GingerSplitContexts-C7puo0M7.cjs");exports.Chapters=e.Chapters;exports.Ginger=e.Ginger;exports.LyricsSynced=e.LyricsSynced;exports.clampPlaybackRate=e.clampPlaybackRate;exports.clampVolume=e.clampVolume;exports.defaultGingerLocale=e.defaultGingerLocale;exports.derivePlaybackUiState=e.derivePlaybackUiState;exports.parseLrc=e.parseLrc;exports.useGingerChapters=e.useGingerChapters;exports.useGingerLocale=e.useGingerLocale;exports.useGingerLyricsSync=e.useGingerLyricsSync;exports.usePlayPauseBinding=e.usePlayPauseBinding;exports.useSeekBarBinding=e.useSeekBarBinding;exports.useVolumeSlider=e.useVolumeSlider;exports.attachLiveAnalyser=r.attachLiveAnalyser;exports.detachLiveAnalyser=r.detachLiveAnalyser;exports.useGinger=r.useGinger;exports.useGingerDebugLog=r.useGingerDebugLog;exports.useGingerKeyboardShortcuts=r.useGingerKeyboardShortcuts;exports.useGingerLiveAnalyzer=r.useGingerLiveAnalyzer;exports.useGingerSleepTimer=r.useGingerSleepTimer;exports.useNextTrackPrefetch=r.useNextTrackPrefetch;exports.useSeekDrag=r.useSeekDrag;exports.gingerStateFromContextValues=a.gingerStateFromContextValues;exports.gingerStateFromContexts=a.gingerStateFromContexts;exports.useGingerMedia=a.useGingerMedia;exports.useGingerPlayback=a.useGingerPlayback;exports.useGingerState=a.useGingerState;
|
|
2
2
|
//# sourceMappingURL=client.cjs.map
|
package/dist/client.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { C as s, G as r, L as i, c as n, a as t, d as u, b as g, p as c, u as l, e as o, f as G, g as y, h as d, i as S } from "./ginger-
|
|
2
|
-
import { a as p, d as L, u as b, b as h, c as f, e as k, f as x, g as P, h as C } from "./useNextTrackPrefetch-
|
|
1
|
+
import { C as s, G as r, L as i, c as n, a as t, d as u, b as g, p as c, u as l, e as o, f as G, g as y, h as d, i as S } from "./ginger-8x4WzVmw.js";
|
|
2
|
+
import { a as p, d as L, u as b, b as h, c as f, e as k, f as x, g as P, h as C } from "./useNextTrackPrefetch-CV1khU0h.js";
|
|
3
3
|
import { g as A, a as B, u as V, b as D, c as F } from "./GingerSplitContexts-BzBExb95.js";
|
|
4
4
|
export {
|
|
5
5
|
s as Chapters,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.test.d.ts","sourceRoot":"","sources":["../src/client.test.ts"],"names":[],"mappings":""}
|
|
@@ -7,62 +7,75 @@ export type PlayPauseProps = ButtonHTMLAttributes<HTMLButtonElement> & {
|
|
|
7
7
|
playAriaLabel?: string;
|
|
8
8
|
/** Screen-reader label when playing (action would pause); defaults to match `pauseLabel` when it is a string */
|
|
9
9
|
pauseAriaLabel?: string;
|
|
10
|
+
children?: ReactNode;
|
|
10
11
|
};
|
|
11
|
-
export declare function PlayPause({ playLabel, pauseLabel, playAriaLabel, pauseAriaLabel, type, onClick, ...rest }: PlayPauseProps): import("react/jsx-runtime").JSX.Element;
|
|
12
|
+
export declare function PlayPause({ playLabel, pauseLabel, playAriaLabel, pauseAriaLabel, children, type, onClick, ...rest }: PlayPauseProps): import("react/jsx-runtime").JSX.Element;
|
|
12
13
|
export declare namespace PlayPause {
|
|
13
14
|
var displayName: string;
|
|
14
15
|
}
|
|
15
|
-
export type RepeatProps = ButtonHTMLAttributes<HTMLButtonElement
|
|
16
|
-
|
|
16
|
+
export type RepeatProps = ButtonHTMLAttributes<HTMLButtonElement> & {
|
|
17
|
+
ariaLabel?: string;
|
|
18
|
+
};
|
|
19
|
+
export declare function Repeat({ type, ariaLabel, onClick, ...rest }: RepeatProps): import("react/jsx-runtime").JSX.Element;
|
|
17
20
|
export declare namespace Repeat {
|
|
18
21
|
var displayName: string;
|
|
19
22
|
}
|
|
20
|
-
export type NextProps = ButtonHTMLAttributes<HTMLButtonElement
|
|
21
|
-
|
|
23
|
+
export type NextProps = ButtonHTMLAttributes<HTMLButtonElement> & {
|
|
24
|
+
ariaLabel?: string;
|
|
25
|
+
};
|
|
26
|
+
export declare function Next({ type, children, ariaLabel, onClick, ...rest }: NextProps): import("react/jsx-runtime").JSX.Element;
|
|
22
27
|
export declare namespace Next {
|
|
23
28
|
var displayName: string;
|
|
24
29
|
}
|
|
25
|
-
export type PreviousProps = ButtonHTMLAttributes<HTMLButtonElement
|
|
26
|
-
|
|
30
|
+
export type PreviousProps = ButtonHTMLAttributes<HTMLButtonElement> & {
|
|
31
|
+
ariaLabel?: string;
|
|
32
|
+
};
|
|
33
|
+
export declare function Previous({ type, children, ariaLabel, onClick, ...rest }: PreviousProps): import("react/jsx-runtime").JSX.Element;
|
|
27
34
|
export declare namespace Previous {
|
|
28
35
|
var displayName: string;
|
|
29
36
|
}
|
|
30
|
-
export type ShuffleProps = ButtonHTMLAttributes<HTMLButtonElement
|
|
31
|
-
|
|
37
|
+
export type ShuffleProps = ButtonHTMLAttributes<HTMLButtonElement> & {
|
|
38
|
+
ariaLabel?: string;
|
|
39
|
+
};
|
|
40
|
+
export declare function Shuffle({ type, children, ariaLabel, onClick, ...rest }: ShuffleProps): import("react/jsx-runtime").JSX.Element;
|
|
32
41
|
export declare namespace Shuffle {
|
|
33
42
|
var displayName: string;
|
|
34
43
|
}
|
|
35
44
|
export type SeekBarProps = Omit<InputHTMLAttributes<HTMLInputElement>, "type" | "value" | "onChange" | "onInput" | "min" | "max" | "step"> & {
|
|
36
45
|
/** Remove default width style for fully custom styling. */
|
|
37
46
|
unstyled?: boolean;
|
|
47
|
+
ariaLabel?: string;
|
|
38
48
|
inputStyle?: CSSProperties;
|
|
39
49
|
};
|
|
40
|
-
export declare function SeekBar({ inputStyle, style, unstyled, ...rest }: SeekBarProps): import("react/jsx-runtime").JSX.Element;
|
|
50
|
+
export declare function SeekBar({ inputStyle, style, unstyled, ariaLabel, ...rest }: SeekBarProps): import("react/jsx-runtime").JSX.Element;
|
|
41
51
|
export declare namespace SeekBar {
|
|
42
52
|
var displayName: string;
|
|
43
53
|
}
|
|
44
54
|
export type VolumeProps = Omit<InputHTMLAttributes<HTMLInputElement>, "type" | "value" | "onChange" | "onInput" | "min" | "max" | "step"> & {
|
|
45
55
|
/** Remove default width style for fully custom styling. */
|
|
46
56
|
unstyled?: boolean;
|
|
57
|
+
ariaLabel?: string;
|
|
47
58
|
inputStyle?: CSSProperties;
|
|
48
59
|
};
|
|
49
|
-
export declare function Volume({ inputStyle, style, unstyled, ...rest }: VolumeProps): import("react/jsx-runtime").JSX.Element;
|
|
60
|
+
export declare function Volume({ inputStyle, style, unstyled, ariaLabel, ...rest }: VolumeProps): import("react/jsx-runtime").JSX.Element;
|
|
50
61
|
export declare namespace Volume {
|
|
51
62
|
var displayName: string;
|
|
52
63
|
}
|
|
53
64
|
export type MuteProps = ButtonHTMLAttributes<HTMLButtonElement> & {
|
|
65
|
+
ariaLabel?: string;
|
|
54
66
|
muteLabel?: ReactNode;
|
|
55
67
|
unmuteLabel?: ReactNode;
|
|
56
68
|
};
|
|
57
|
-
export declare function Mute({ muteLabel, unmuteLabel, type, onClick, ...rest }: MuteProps): import("react/jsx-runtime").JSX.Element;
|
|
69
|
+
export declare function Mute({ ariaLabel, muteLabel, unmuteLabel, type, onClick, ...rest }: MuteProps): import("react/jsx-runtime").JSX.Element;
|
|
58
70
|
export declare namespace Mute {
|
|
59
71
|
var displayName: string;
|
|
60
72
|
}
|
|
61
73
|
export type PlaybackRateProps = Omit<SelectHTMLAttributes<HTMLSelectElement>, "value" | "onChange"> & {
|
|
62
74
|
/** Playback speed options (default: 0.5 … 2) */
|
|
63
75
|
rates?: readonly number[];
|
|
76
|
+
ariaLabel?: string;
|
|
64
77
|
};
|
|
65
|
-
export declare function PlaybackRate({ rates, style, ...rest }: PlaybackRateProps): import("react/jsx-runtime").JSX.Element;
|
|
78
|
+
export declare function PlaybackRate({ rates, style, ariaLabel, ...rest }: PlaybackRateProps): import("react/jsx-runtime").JSX.Element;
|
|
66
79
|
export declare namespace PlaybackRate {
|
|
67
80
|
var displayName: string;
|
|
68
81
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Controls.d.ts","sourceRoot":"","sources":["../../../src/components/controls/Controls.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,oBAAoB,EACpB,aAAa,EACb,mBAAmB,EACnB,SAAS,EACT,oBAAoB,EACrB,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"Controls.d.ts","sourceRoot":"","sources":["../../../src/components/controls/Controls.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../src/experimental-gapless/index.ts"],"sourcesContent":["import { useMemo } from \"react\";\nimport { useGingerPlayback } from \"../context/GingerSplitContexts\";\n\nexport type ExperimentalGaplessState = {\n supported: false;\n reason: string;\n preloadedTrackIds: string[];\n};\n\n/**\n * Experimental-only helper surface.\n * This does not alter Ginger playback behavior.\n */\nexport function useExperimentalGapless(): ExperimentalGaplessState {\n const { tracks } = useGingerPlayback();\n return useMemo(\n () => ({\n supported: false as const,\n reason: \"Gapless playback requires dedicated Web Audio graph orchestration.\",\n preloadedTrackIds: tracks.map((track) => track.id ?? track.fileUrl),\n }),\n [tracks],\n );\n}\n"],"names":["useExperimentalGapless","tracks","useGingerPlayback","useMemo","track"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../src/experimental-gapless/index.ts"],"sourcesContent":["import { useMemo } from \"react\";\nimport { useGingerPlayback } from \"../context/GingerSplitContexts\";\n\nexport type ExperimentalGaplessState = {\n supported: false;\n reason: string;\n preloadedTrackIds: string[];\n};\n\n/**\n * Experimental-only helper surface.\n *\n * @deprecated This export is intentionally non-production and currently reports capabilities only.\n * It does not alter Ginger playback behavior.\n */\nexport function useExperimentalGapless(): ExperimentalGaplessState {\n const { tracks } = useGingerPlayback();\n return useMemo(\n () => ({\n supported: false as const,\n reason: \"Gapless playback requires dedicated Web Audio graph orchestration.\",\n preloadedTrackIds: tracks.map((track) => track.id ?? track.fileUrl),\n }),\n [tracks],\n );\n}\n"],"names":["useExperimentalGapless","tracks","useGingerPlayback","useMemo","track"],"mappings":"0JAeO,SAASA,GAAmD,CACjE,KAAM,CAAE,OAAAC,CAAA,EAAWC,oBAAA,EACnB,OAAOC,EAAAA,QACL,KAAO,CACL,UAAW,GACX,OAAQ,qEACR,kBAAmBF,EAAO,IAAKG,GAAUA,EAAM,IAAMA,EAAM,OAAO,CAAA,GAEpE,CAACH,CAAM,CAAA,CAEX"}
|
|
@@ -5,7 +5,9 @@ export type ExperimentalGaplessState = {
|
|
|
5
5
|
};
|
|
6
6
|
/**
|
|
7
7
|
* Experimental-only helper surface.
|
|
8
|
-
*
|
|
8
|
+
*
|
|
9
|
+
* @deprecated This export is intentionally non-production and currently reports capabilities only.
|
|
10
|
+
* It does not alter Ginger playback behavior.
|
|
9
11
|
*/
|
|
10
12
|
export declare function useExperimentalGapless(): ExperimentalGaplessState;
|
|
11
13
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/experimental-gapless/index.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,wBAAwB,GAAG;IACrC,SAAS,EAAE,KAAK,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,iBAAiB,EAAE,MAAM,EAAE,CAAC;CAC7B,CAAC;AAEF
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/experimental-gapless/index.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,wBAAwB,GAAG;IACrC,SAAS,EAAE,KAAK,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,iBAAiB,EAAE,MAAM,EAAE,CAAC;CAC7B,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,sBAAsB,IAAI,wBAAwB,CAUjE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../src/experimental-gapless/index.ts"],"sourcesContent":["import { useMemo } from \"react\";\nimport { useGingerPlayback } from \"../context/GingerSplitContexts\";\n\nexport type ExperimentalGaplessState = {\n supported: false;\n reason: string;\n preloadedTrackIds: string[];\n};\n\n/**\n * Experimental-only helper surface.\n * This does not alter Ginger playback behavior.\n */\nexport function useExperimentalGapless(): ExperimentalGaplessState {\n const { tracks } = useGingerPlayback();\n return useMemo(\n () => ({\n supported: false as const,\n reason: \"Gapless playback requires dedicated Web Audio graph orchestration.\",\n preloadedTrackIds: tracks.map((track) => track.id ?? track.fileUrl),\n }),\n [tracks],\n );\n}\n"],"names":["useExperimentalGapless","tracks","useGingerPlayback","useMemo","track"],"mappings":";;
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/experimental-gapless/index.ts"],"sourcesContent":["import { useMemo } from \"react\";\nimport { useGingerPlayback } from \"../context/GingerSplitContexts\";\n\nexport type ExperimentalGaplessState = {\n supported: false;\n reason: string;\n preloadedTrackIds: string[];\n};\n\n/**\n * Experimental-only helper surface.\n *\n * @deprecated This export is intentionally non-production and currently reports capabilities only.\n * It does not alter Ginger playback behavior.\n */\nexport function useExperimentalGapless(): ExperimentalGaplessState {\n const { tracks } = useGingerPlayback();\n return useMemo(\n () => ({\n supported: false as const,\n reason: \"Gapless playback requires dedicated Web Audio graph orchestration.\",\n preloadedTrackIds: tracks.map((track) => track.id ?? track.fileUrl),\n }),\n [tracks],\n );\n}\n"],"names":["useExperimentalGapless","tracks","useGingerPlayback","useMemo","track"],"mappings":";;AAeO,SAASA,IAAmD;AACjE,QAAM,EAAE,QAAAC,EAAA,IAAWC,EAAA;AACnB,SAAOC;AAAA,IACL,OAAO;AAAA,MACL,WAAW;AAAA,MACX,QAAQ;AAAA,MACR,mBAAmBF,EAAO,IAAI,CAACG,MAAUA,EAAM,MAAMA,EAAM,OAAO;AAAA,IAAA;AAAA,IAEpE,CAACH,CAAM;AAAA,EAAA;AAEX;"}
|