jaml-ui 2.5.1 → 3.0.1
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 +38 -225
- package/dist/chunks/Layer-B5y9UIAt.js +19 -0
- package/dist/chunks/Layer-B5y9UIAt.js.map +1 -0
- package/dist/chunks/motelySprite-BYsaes3N.js +753 -0
- package/dist/chunks/motelySprite-BYsaes3N.js.map +1 -0
- package/dist/chunks/spriteMapper-BiDkbZrD.js +480 -0
- package/dist/chunks/spriteMapper-BiDkbZrD.js.map +1 -0
- package/dist/components/DeckSprite.d.ts +1 -1
- package/dist/components/GameCard.d.ts +5 -4
- package/dist/components/JamlyzerView.d.ts +9 -0
- package/dist/components/StandardCard.d.ts +4 -3
- package/dist/core.d.ts +0 -1
- package/dist/core.js +38 -26
- package/dist/core.js.map +1 -1
- package/dist/decode/motelyItemDecoder.d.ts +5 -0
- package/dist/index.d.ts +5 -28
- package/dist/index.js +3176 -27604
- package/dist/index.js.map +1 -1
- package/dist/json-render/catalog.d.ts +26 -1
- package/dist/json-render/components/domain.d.ts +8 -8
- package/dist/json-render/components/game.d.ts +3 -7
- package/dist/json-render/components/layout.d.ts +2 -1
- package/dist/json-render/components/mascot.d.ts +22 -0
- package/dist/json-render/components/reference.d.ts +7 -7
- package/dist/json-render/engine.d.ts +4 -4
- package/dist/json-render/index.d.ts +2 -0
- package/dist/motely.d.ts +2 -5
- package/dist/motely.js +22 -173
- package/dist/motely.js.map +1 -1
- package/dist/render/CanvasRenderer.d.ts +2 -1
- package/dist/render/useJamlCardRenderer.d.ts +15 -0
- package/dist/ui/jimbo.css +1 -2
- package/dist/ui.d.ts +0 -39
- package/dist/ui.js +58 -3
- package/dist/ui.js.map +1 -0
- package/package.json +13 -53
- package/dist/assets/searchPoolWorker-DA5uFkl3.js +0 -2
- package/dist/assets/searchPoolWorker-DA5uFkl3.js.map +0 -1
- package/dist/chunks/jamlSeeds-CRthre97.js +0 -69
- package/dist/chunks/jamlSeeds-CRthre97.js.map +0 -1
- package/dist/chunks/runtime-D7eHq1kP.js +0 -2060
- package/dist/chunks/runtime-D7eHq1kP.js.map +0 -1
- package/dist/chunks/searchPoolWorker-649yzf3l.js +0 -11
- package/dist/chunks/searchPoolWorker-649yzf3l.js.map +0 -1
- package/dist/chunks/spriteMapper-BqG15k6f.js +0 -2496
- package/dist/chunks/spriteMapper-BqG15k6f.js.map +0 -1
- package/dist/chunks/ui-DwggmAYr.js +0 -3399
- package/dist/chunks/ui-DwggmAYr.js.map +0 -1
- package/dist/components/CardFan.d.ts +0 -13
- package/dist/components/JamlAestheticSelector.d.ts +0 -12
- package/dist/components/JamlCodeEditor.d.ts +0 -7
- package/dist/components/JamlCurator.d.ts +0 -1
- package/dist/components/JamlIde.d.ts +0 -44
- package/dist/components/JamlIdeToolbar.d.ts +0 -14
- package/dist/components/JamlIdeVisual.d.ts +0 -30
- package/dist/components/JamlMapPreview.d.ts +0 -11
- package/dist/components/JamlSeedInput.d.ts +0 -24
- package/dist/components/JamlSeedSpinner.d.ts +0 -9
- package/dist/components/JamlSpeedometer.d.ts +0 -16
- package/dist/components/Jamlyzer.d.ts +0 -8
- package/dist/components/JimmolateEditor.d.ts +0 -47
- package/dist/components/MotelyHello.d.ts +0 -5
- package/dist/components/MotelyVersionBadge.d.ts +0 -28
- package/dist/components/PaginatedFilterBrowser.d.ts +0 -26
- package/dist/components/RunConfigModal.d.ts +0 -8
- package/dist/components/SeedFinderApp.d.ts +0 -7
- package/dist/components/jamlMap/CategoryPicker.d.ts +0 -32
- package/dist/components/jamlMap/JamlMapEditor.d.ts +0 -14
- package/dist/components/jamlMap/JokerPicker.d.ts +0 -8
- package/dist/components/jamlMap/MysterySlot.d.ts +0 -37
- package/dist/components/jamlMap/index.d.ts +0 -4
- package/dist/components/jamlMap/jokerRarity.d.ts +0 -6
- package/dist/components/jamlSeedUtils.d.ts +0 -1
- package/dist/hooks/searchPoolWorker.d.ts +0 -61
- package/dist/hooks/searchWorker.d.ts +0 -1
- package/dist/hooks/useAnalyzer.d.ts +0 -10
- package/dist/hooks/useIntersectionObserver.d.ts +0 -14
- package/dist/hooks/useJamlLibrary.d.ts +0 -13
- package/dist/hooks/useSearch.d.ts +0 -31
- package/dist/hooks/useSearchPool.d.ts +0 -43
- package/dist/hooks/useShopStream.d.ts +0 -22
- package/dist/lib/SpriteMapper.d.ts +0 -10
- package/dist/lib/cardParser.d.ts +0 -8
- package/dist/lib/classes/BuyMetaData.d.ts +0 -11
- package/dist/lib/config.d.ts +0 -13
- package/dist/lib/const.d.ts +0 -70
- package/dist/lib/data/constants.d.ts +0 -11
- package/dist/lib/hooks/useDragScroll.d.ts +0 -4
- package/dist/lib/hooks/useJamlFilter.d.ts +0 -48
- package/dist/lib/hooks/useSeedAnalyzer.d.ts +0 -5
- package/dist/lib/jaml/jamlCompletion.d.ts +0 -12
- package/dist/lib/jaml/jamlData.d.ts +0 -4
- package/dist/lib/jaml/jamlLangCodemirror.d.ts +0 -13
- package/dist/lib/jaml/jamlObjectives.d.ts +0 -13
- package/dist/lib/jaml/jamlParser.d.ts +0 -14
- package/dist/lib/jaml/jamlPresets.d.ts +0 -8
- package/dist/lib/jaml/jamlSchema.d.ts +0 -19
- package/dist/lib/jaml/jamlSeeds.d.ts +0 -7
- package/dist/lib/motely/runtime.d.ts +0 -40
- package/dist/lib/parseDailyRitual.d.ts +0 -45
- package/dist/lib/tts/getRevealPos.d.ts +0 -5
- package/dist/lib/tts/splitTtsDisplay.d.ts +0 -19
- package/dist/lib/types.d.ts +0 -122
- package/dist/lib/utils.d.ts +0 -2
- package/dist/motelyDisplay.d.ts +0 -10
- package/dist/ui/JimboBadge.d.ts +0 -12
- package/dist/ui/JimboBalatroFooter.d.ts +0 -16
- package/dist/ui/JimboCopyButton.d.ts +0 -27
- package/dist/ui/JimboDeckAndStakeSelectorModal.d.ts +0 -30
- package/dist/ui/JimboDualChip.d.ts +0 -17
- package/dist/ui/JimboIconButton.d.ts +0 -15
- package/dist/ui/JimboInlineEdit.d.ts +0 -16
- package/dist/ui/JimboInputModal.d.ts +0 -13
- package/dist/ui/JimboListItem.d.ts +0 -11
- package/dist/ui/JimboPanelSpinner.d.ts +0 -15
- package/dist/ui/JimboPanelSplitter.d.ts +0 -8
- package/dist/ui/JimboPicker.d.ts +0 -28
- package/dist/ui/JimboSeedCopyChip.d.ts +0 -16
- package/dist/ui/JimboSelect.d.ts +0 -30
- package/dist/ui/JimboSlider.d.ts +0 -11
- package/dist/ui/JimboSpinner.d.ts +0 -18
- package/dist/ui/JimboStepper.d.ts +0 -22
- package/dist/ui/JimboTextInput.d.ts +0 -5
- package/dist/ui/JimboToggleList.d.ts +0 -12
- package/dist/ui/JimboValueBadge.d.ts +0 -19
- package/dist/ui/codeBlock.d.ts +0 -11
- package/dist/ui/hooks.d.ts +0 -126
- package/dist/ui/ide/JamlEditor.d.ts +0 -7
- package/dist/ui/jimboApp.d.ts +0 -9
- package/dist/ui/jimboBackground.d.ts +0 -17
- package/dist/ui/jimboCopyRow.d.ts +0 -9
- package/dist/ui/jimboFilterBar.d.ts +0 -22
- package/dist/ui/jimboFlankNav.d.ts +0 -17
- package/dist/ui/jimboInfoCard.d.ts +0 -31
- package/dist/ui/jimboInset.d.ts +0 -9
- package/dist/ui/jimboLayout.d.ts +0 -25
- package/dist/ui/jimboLink.d.ts +0 -12
- package/dist/ui/jimboSectionHeader.d.ts +0 -11
- package/dist/ui/jimboStatGrid.d.ts +0 -13
- package/dist/ui/jimboTabs.d.ts +0 -21
- package/dist/ui/jimboText.d.ts +0 -25
- package/dist/ui/jimboTooltip.d.ts +0 -33
- package/dist/ui/jimboWordmark.d.ts +0 -10
- package/dist/ui/mascot/JammySpeechBox.d.ts +0 -9
- package/dist/ui/mascot/SeedMascot.d.ts +0 -37
- package/dist/ui/mascot/index.d.ts +0 -3
- package/dist/ui/mascot/menuConfig.d.ts +0 -102
- package/dist/ui/panel.d.ts +0 -32
- package/dist/ui/radial/RadialBadge.d.ts +0 -16
- package/dist/ui/radial/RadialBreadcrumb.d.ts +0 -12
- package/dist/ui/radial/RadialButton.d.ts +0 -60
- package/dist/ui/radial/RadialMenu.d.ts +0 -38
- package/dist/ui/radial/RadialPill.d.ts +0 -17
- package/dist/ui/radial/index.d.ts +0 -16
- package/dist/ui/radial/radialMenuStore.d.ts +0 -31
- package/dist/ui/radial/radialMenuViewport.d.ts +0 -6
- package/dist/ui/radial/useRadialMenu.d.ts +0 -35
- package/dist/ui/showcase.d.ts +0 -38
- package/dist/ui/sprites.d.ts +0 -25
- package/dist/utils/jamlMapPreview.d.ts +0 -12
- package/dist/utils/jamlVisualFilter.d.ts +0 -3
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import { default as React } from 'react';
|
|
2
|
-
export interface CardFanProps {
|
|
3
|
-
/** Total number of cards to render (used when `cards` is not provided). */
|
|
4
|
-
count?: number;
|
|
5
|
-
/** Array of cards as "rank_suit" strings (e.g. ["2_C", "10_H", "A_S"]). Takes priority over `count`. */
|
|
6
|
-
cards?: string[];
|
|
7
|
-
/** Optional label below the fan. */
|
|
8
|
-
label?: string;
|
|
9
|
-
showLabel?: boolean;
|
|
10
|
-
className?: string;
|
|
11
|
-
style?: React.CSSProperties;
|
|
12
|
-
}
|
|
13
|
-
export declare function CardFan({ count, cards, className, style, label, showLabel }: CardFanProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { JamlAesthetic } from 'motely-wasm';
|
|
2
|
-
export interface JamlAestheticSelectorProps {
|
|
3
|
-
value?: JamlAesthetic | null;
|
|
4
|
-
onChange: (aesthetic: JamlAesthetic | null) => void;
|
|
5
|
-
className?: string;
|
|
6
|
-
style?: React.CSSProperties;
|
|
7
|
-
}
|
|
8
|
-
/**
|
|
9
|
-
* Spinner-style aesthetic selector for seed filters.
|
|
10
|
-
* Uses left/right controls plus a centered badge value display.
|
|
11
|
-
*/
|
|
12
|
-
export declare function JamlAestheticSelector({ value, onChange, className, style }: JamlAestheticSelectorProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
export interface JamlCodeEditorProps {
|
|
2
|
-
value: string;
|
|
3
|
-
onChange: (value: string) => void;
|
|
4
|
-
placeholder?: string;
|
|
5
|
-
minHeight?: number;
|
|
6
|
-
}
|
|
7
|
-
export declare function JamlCodeEditor({ value, onChange, placeholder, minHeight, }: JamlCodeEditorProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare function JamlCurator(): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import { default as React } from 'react';
|
|
2
|
-
import { JamlIdeMode } from './JamlIdeToolbar.js';
|
|
3
|
-
import { JamlVisualFilter } from './JamlIdeVisual.js';
|
|
4
|
-
export interface JamlIdeSearchResult {
|
|
5
|
-
seed: string;
|
|
6
|
-
score?: number;
|
|
7
|
-
tallyColumns?: number[];
|
|
8
|
-
tallyLabels?: string[];
|
|
9
|
-
}
|
|
10
|
-
export interface JamlIdeProps {
|
|
11
|
-
/** Controlled value. When provided alongside `onChange`, the editor is fully controlled. */
|
|
12
|
-
jaml?: string;
|
|
13
|
-
/** Initial value for uncontrolled mode. Ignored when `jaml` is provided on first render. */
|
|
14
|
-
defaultJaml?: string;
|
|
15
|
-
/** Subscriber for every edit. Optional — the editor still works without it. */
|
|
16
|
-
onChange?: (jaml: string) => void;
|
|
17
|
-
defaultMode?: JamlIdeMode;
|
|
18
|
-
searchResults?: JamlIdeSearchResult[];
|
|
19
|
-
className?: string;
|
|
20
|
-
style?: React.CSSProperties;
|
|
21
|
-
title?: string;
|
|
22
|
-
subtitle?: React.ReactNode;
|
|
23
|
-
compactHeader?: boolean;
|
|
24
|
-
actions?: React.ReactNode;
|
|
25
|
-
codePlaceholder?: string;
|
|
26
|
-
onSearch?: () => void;
|
|
27
|
-
isSearching?: boolean;
|
|
28
|
-
/**
|
|
29
|
-
* Shows a "Load File" button in the toolbar and loads the selected file into the editor.
|
|
30
|
-
* When `onLoadFile` is provided, that callback is used (for example, a mounted library flow).
|
|
31
|
-
* Otherwise the component falls back to a browser file picker.
|
|
32
|
-
*/
|
|
33
|
-
showLoadFileButton?: boolean;
|
|
34
|
-
onLoadFile?: () => Promise<string | null> | string | null;
|
|
35
|
-
/**
|
|
36
|
-
* Controlled visual filter. When provided alongside `onVisualFilterChange`, the Visual tab
|
|
37
|
-
* is fully controlled by the parent. When absent, the Visual tab auto-derives from the text.
|
|
38
|
-
*/
|
|
39
|
-
visualFilter?: JamlVisualFilter;
|
|
40
|
-
onVisualFilterChange?: (filter: JamlVisualFilter) => void;
|
|
41
|
-
}
|
|
42
|
-
export type { JamlVisualFilter } from './JamlIdeVisual.js';
|
|
43
|
-
export type { JamlVisualClause, JamlZone } from './JamlIdeVisual.js';
|
|
44
|
-
export declare function JamlIde({ jaml, defaultJaml, onChange, defaultMode, searchResults, className, style, title, subtitle, compactHeader, actions, codePlaceholder, onSearch, isSearching, showLoadFileButton, onLoadFile, visualFilter, onVisualFilterChange, }: JamlIdeProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
export type JamlIdeMode = "visual" | "code" | "map" | "results" | "jamlyzer";
|
|
2
|
-
export interface JamlIdeToolbarProps {
|
|
3
|
-
mode: JamlIdeMode;
|
|
4
|
-
onModeChange: (mode: JamlIdeMode) => void;
|
|
5
|
-
resultCount?: number;
|
|
6
|
-
showResultsTab?: boolean;
|
|
7
|
-
showJamlyzerTab?: boolean;
|
|
8
|
-
className?: string;
|
|
9
|
-
onSearch?: () => void;
|
|
10
|
-
isSearching?: boolean;
|
|
11
|
-
onLoadFile?: () => void;
|
|
12
|
-
isLoadingFile?: boolean;
|
|
13
|
-
}
|
|
14
|
-
export declare function JamlIdeToolbar({ mode, onModeChange, resultCount, showResultsTab, showJamlyzerTab, className, onSearch, isSearching, onLoadFile, isLoadingFile, }: JamlIdeToolbarProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
export type JamlZone = "must" | "should" | "mustnot";
|
|
2
|
-
export interface JamlVisualClause {
|
|
3
|
-
id: string;
|
|
4
|
-
type: string;
|
|
5
|
-
value: string;
|
|
6
|
-
label?: string;
|
|
7
|
-
antes?: number[];
|
|
8
|
-
boosterPacks?: number[];
|
|
9
|
-
score?: number;
|
|
10
|
-
edition?: string;
|
|
11
|
-
}
|
|
12
|
-
export interface JamlVisualFilter {
|
|
13
|
-
name?: string;
|
|
14
|
-
author?: string;
|
|
15
|
-
description?: string;
|
|
16
|
-
deck?: string;
|
|
17
|
-
stake?: string;
|
|
18
|
-
must: JamlVisualClause[];
|
|
19
|
-
should: JamlVisualClause[];
|
|
20
|
-
mustnot: JamlVisualClause[];
|
|
21
|
-
}
|
|
22
|
-
export interface JamlIdeVisualProps {
|
|
23
|
-
filter: JamlVisualFilter;
|
|
24
|
-
onChange: (filter: JamlVisualFilter) => void;
|
|
25
|
-
/** Tap a clause to edit it (Pass 2 wires this to the cascade picker). */
|
|
26
|
-
onEditClause?: (zone: JamlZone, clause: JamlVisualClause) => void;
|
|
27
|
-
/** Tap the "?" mystery tile to add a new clause to a zone (Pass 2 wires this to the cascade picker). */
|
|
28
|
-
onAddClause?: (zone: JamlZone) => void;
|
|
29
|
-
}
|
|
30
|
-
export declare function JamlIdeVisual({ filter, onChange, onEditClause, onAddClause }: JamlIdeVisualProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
export interface JamlMapPreviewProps {
|
|
2
|
-
/** The raw JAML string to parse and visualize. */
|
|
3
|
-
jaml: string;
|
|
4
|
-
className?: string;
|
|
5
|
-
emptyMessage?: string;
|
|
6
|
-
tallyColumns?: number[];
|
|
7
|
-
tallyLabels?: string[];
|
|
8
|
-
/** Reduces padding and sizes for sidebar/explorer usage. */
|
|
9
|
-
compact?: boolean;
|
|
10
|
-
}
|
|
11
|
-
export declare function JamlMapPreview({ jaml, className, emptyMessage, tallyColumns, tallyLabels, compact, }: JamlMapPreviewProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import { default as React } from 'react';
|
|
2
|
-
export type JamlSeedInputVariant = "normal" | "dark" | "alt";
|
|
3
|
-
export interface JamlSeedInputProps {
|
|
4
|
-
value?: string;
|
|
5
|
-
onChange?: (seed: string) => void;
|
|
6
|
-
placeholder?: string;
|
|
7
|
-
label?: React.ReactNode;
|
|
8
|
-
variant?: JamlSeedInputVariant;
|
|
9
|
-
className?: string;
|
|
10
|
-
style?: React.CSSProperties;
|
|
11
|
-
autoFocus?: boolean;
|
|
12
|
-
onKeyDown?: React.KeyboardEventHandler<HTMLInputElement>;
|
|
13
|
-
onBlur?: React.FocusEventHandler<HTMLInputElement>;
|
|
14
|
-
onFocus?: React.FocusEventHandler<HTMLInputElement>;
|
|
15
|
-
disabled?: boolean;
|
|
16
|
-
name?: string;
|
|
17
|
-
id?: string;
|
|
18
|
-
title?: string;
|
|
19
|
-
"aria-label"?: string;
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* Balatro-style seed input constrained to the real 8-character format.
|
|
23
|
-
*/
|
|
24
|
-
export declare const JamlSeedInput: React.ForwardRefExoticComponent<JamlSeedInputProps & React.RefAttributes<HTMLInputElement>>;
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { JamlSeedInputProps } from './JamlSeedInput.js';
|
|
2
|
-
export interface JamlSeedSpinnerProps extends Omit<JamlSeedInputProps, "onChange"> {
|
|
3
|
-
seeds?: string[];
|
|
4
|
-
onChange?: (seed: string) => void;
|
|
5
|
-
onCopy?: (seed: string) => void;
|
|
6
|
-
/** When true, center field is editable. Default false — browse + copy chip. */
|
|
7
|
-
editable?: boolean;
|
|
8
|
-
}
|
|
9
|
-
export declare function JamlSeedSpinner({ seeds, value, onChange, onCopy, editable, label, placeholder, variant, className, style, ...inputProps }: JamlSeedSpinnerProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { default as React } from 'react';
|
|
2
|
-
export type JamlSpeedometerStatus = "idle" | "booting" | "running" | "completed" | "cancelled" | "error";
|
|
3
|
-
export interface JamlSpeedometerProps {
|
|
4
|
-
seedsPerSecond: number;
|
|
5
|
-
totalSearched: bigint | number;
|
|
6
|
-
matchingSeeds: bigint | number;
|
|
7
|
-
status: JamlSpeedometerStatus;
|
|
8
|
-
className?: string;
|
|
9
|
-
style?: React.CSSProperties;
|
|
10
|
-
}
|
|
11
|
-
/**
|
|
12
|
-
* Compact live-search stats strip — NOT a car speedometer.
|
|
13
|
-
* Three stat cells in a row: speed | searched | matches.
|
|
14
|
-
* Uses j-stat-grid CSS class from jimbo.css.
|
|
15
|
-
*/
|
|
16
|
-
export declare function JamlSpeedometer({ seedsPerSecond, totalSearched, matchingSeeds, status, className, style, }: JamlSpeedometerProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import { default as React } from 'react';
|
|
2
|
-
export interface JamlyzerProps {
|
|
3
|
-
/** Full JAML document. Seeds come from the top-level `seeds:` array via Motely. */
|
|
4
|
-
jaml: string;
|
|
5
|
-
className?: string;
|
|
6
|
-
style?: React.CSSProperties;
|
|
7
|
-
}
|
|
8
|
-
export declare function Jamlyzer({ jaml, className, style }: JamlyzerProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* A Jimmolate predicate: per-seed JavaScript that runs INSIDE the Motely search
|
|
3
|
-
* loop (bound to `Jimmolate.findSeed` pre-boot — see lib/motely/runtime.ts),
|
|
4
|
-
* layered on top of the JAML must/should/mustNot clauses. Return `true` to keep
|
|
5
|
-
* a seed, `false` to reject it.
|
|
6
|
-
*/
|
|
7
|
-
export type JimmolatePredicate = (seed: string, deck?: number, stake?: number) => boolean;
|
|
8
|
-
/** Result of compiling the predicate source. */
|
|
9
|
-
export interface JimmolateCompileResult {
|
|
10
|
-
predicate: JimmolatePredicate | null;
|
|
11
|
-
error: string | null;
|
|
12
|
-
}
|
|
13
|
-
/**
|
|
14
|
-
* Compile a Jimmolate source body into a callable predicate. The body runs with
|
|
15
|
-
* `seed`, `deck`, and `stake` in scope and is expected to `return` a boolean.
|
|
16
|
-
*
|
|
17
|
-
* NOTE: this evaluates user-authored JavaScript via `new Function` BY DESIGN —
|
|
18
|
-
* Jimmolate is "bring your own filter". It runs only on the author's machine
|
|
19
|
-
* against their own seeds, exactly like the C#-side probe it feeds.
|
|
20
|
-
*/
|
|
21
|
-
export declare function compileJimmolate(source: string): JimmolateCompileResult;
|
|
22
|
-
export interface JimmolateEditorProps {
|
|
23
|
-
/** Initial predicate source (uncontrolled). Defaults to a worked example. */
|
|
24
|
-
defaultValue?: string;
|
|
25
|
-
/** Fired whenever the source text changes. */
|
|
26
|
-
onChange?: (source: string) => void;
|
|
27
|
-
/** Fired whenever the source compiles (or fails to). */
|
|
28
|
-
onPredicateChange?: (result: JimmolateCompileResult) => void;
|
|
29
|
-
/** Initial enabled state (uncontrolled). Defaults to true. */
|
|
30
|
-
defaultEnabled?: boolean;
|
|
31
|
-
/** Fired when the enable toggle flips. */
|
|
32
|
-
onEnabledChange?: (enabled: boolean) => void;
|
|
33
|
-
/** Seed prefilled into the test row. */
|
|
34
|
-
testSeed?: string;
|
|
35
|
-
/** Min height of the code area in px. */
|
|
36
|
-
minHeight?: number;
|
|
37
|
-
className?: string;
|
|
38
|
-
}
|
|
39
|
-
/**
|
|
40
|
-
* JimmolateEditor — author, compile, and smoke-test a Jimmolate predicate.
|
|
41
|
-
*
|
|
42
|
-
* Emits the compiled predicate via `onPredicateChange`; wire that into
|
|
43
|
-
* `useSearch().startAesthetic(jaml, aesthetic, predicate)` (or the seedlist /
|
|
44
|
-
* random variants) when enabled. Purely an authoring surface — it does not boot
|
|
45
|
-
* Motely or run a search itself.
|
|
46
|
-
*/
|
|
47
|
-
export declare function JimmolateEditor({ defaultValue, onChange, onPredicateChange, defaultEnabled, onEnabledChange, testSeed, minHeight, className, }: JimmolateEditorProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import { default as React } from 'react';
|
|
2
|
-
export interface MotelyCapabilities {
|
|
3
|
-
version: string;
|
|
4
|
-
simd?: boolean;
|
|
5
|
-
threads?: boolean;
|
|
6
|
-
}
|
|
7
|
-
export interface MotelyVersionBadgeProps {
|
|
8
|
-
/**
|
|
9
|
-
* Runtime capabilities from `motely.getCapabilities()`. If omitted, the
|
|
10
|
-
* consumer can pass a static `version` (typically from motely-wasm's
|
|
11
|
-
* own package.json) and the component will render without the SIMD /
|
|
12
|
-
* threads indicators.
|
|
13
|
-
*/
|
|
14
|
-
caps?: MotelyCapabilities | null;
|
|
15
|
-
/** Static fallback version when `caps` is null/undefined. */
|
|
16
|
-
version?: string;
|
|
17
|
-
/** Compact single-line badge instead of the labelled chip. Default false. */
|
|
18
|
-
minimal?: boolean;
|
|
19
|
-
/** Loading placeholder (shown while caps are being fetched). */
|
|
20
|
-
loading?: boolean;
|
|
21
|
-
className?: string;
|
|
22
|
-
style?: React.CSSProperties;
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* Badge showing the loaded motely-wasm version + optional SIMD / threads
|
|
26
|
-
* capability indicators. All styling via jimbo.css `.j-motely-badge`.
|
|
27
|
-
*/
|
|
28
|
-
export declare function MotelyVersionBadge({ caps, version, minimal, loading, className, style, }: MotelyVersionBadgeProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
export interface FilterItem {
|
|
2
|
-
id: string;
|
|
3
|
-
name: string;
|
|
4
|
-
description: string;
|
|
5
|
-
deckText?: string;
|
|
6
|
-
stakeText?: string;
|
|
7
|
-
targetItems?: string[];
|
|
8
|
-
authorText?: string;
|
|
9
|
-
dateText?: string;
|
|
10
|
-
statsText?: string;
|
|
11
|
-
}
|
|
12
|
-
export interface PaginatedFilterBrowserProps {
|
|
13
|
-
filters: FilterItem[];
|
|
14
|
-
itemsPerPage?: number;
|
|
15
|
-
onSelectFilter?: (filter: FilterItem) => void;
|
|
16
|
-
onMainAction?: (filter: FilterItem) => void;
|
|
17
|
-
onSecondaryAction?: (filter: FilterItem) => void;
|
|
18
|
-
onDeleteFilter?: (filter: FilterItem) => void;
|
|
19
|
-
mainActionText?: string;
|
|
20
|
-
secondaryActionText?: string;
|
|
21
|
-
showSecondary?: boolean;
|
|
22
|
-
showDelete?: boolean;
|
|
23
|
-
emptyText?: string;
|
|
24
|
-
}
|
|
25
|
-
export declare function PaginatedFilterBrowser({ filters, itemsPerPage, // matching Balatro challenges layout pages
|
|
26
|
-
onSelectFilter, onMainAction, onSecondaryAction, onDeleteFilter, mainActionText, secondaryActionText, showSecondary, showDelete, emptyText, }: PaginatedFilterBrowserProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
export interface RunConfigModalProps {
|
|
2
|
-
open: boolean;
|
|
3
|
-
onClose: () => void;
|
|
4
|
-
deck: string;
|
|
5
|
-
stake: string;
|
|
6
|
-
onChange: (deck: string, stake: string) => void;
|
|
7
|
-
}
|
|
8
|
-
export declare function RunConfigModal({ open, onClose, deck, stake, onChange, }: RunConfigModalProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import { MotelyDeck, MotelyStake } from 'motely-wasm';
|
|
2
|
-
export interface SeedFinderAppProps {
|
|
3
|
-
initialJaml?: string;
|
|
4
|
-
initialDeck?: keyof typeof MotelyDeck;
|
|
5
|
-
initialStake?: keyof typeof MotelyStake;
|
|
6
|
-
}
|
|
7
|
-
export declare function SeedFinderApp({ initialJaml, initialDeck, initialStake, }: SeedFinderAppProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import { SpriteEntry } from '../../sprites/spriteData.js';
|
|
2
|
-
import { SpriteSheetType } from '../../sprites/spriteMapper.js';
|
|
3
|
-
import { SlotSelection, SlotCategory } from './MysterySlot.js';
|
|
4
|
-
export interface CategoryPickerConfig {
|
|
5
|
-
/** Display title, e.g. "Vouchers" */
|
|
6
|
-
title: string;
|
|
7
|
-
/** The SlotCategory value */
|
|
8
|
-
category: SlotCategory;
|
|
9
|
-
/** JAML clause key emitted on select, e.g. "voucher" */
|
|
10
|
-
clauseKey: string;
|
|
11
|
-
/** Which sprite sheet to render from */
|
|
12
|
-
sheet: SpriteSheetType;
|
|
13
|
-
/** Full list of items for the grid */
|
|
14
|
-
items: SpriteEntry[];
|
|
15
|
-
/** Accent color for the header/buttons */
|
|
16
|
-
accent: string;
|
|
17
|
-
/** Optional tooltip hint shown in the "Any" button area */
|
|
18
|
-
hint?: string;
|
|
19
|
-
}
|
|
20
|
-
export interface CategoryPickerProps {
|
|
21
|
-
config: CategoryPickerConfig;
|
|
22
|
-
onSelect: (selection: SlotSelection) => void;
|
|
23
|
-
onCancel?: () => void;
|
|
24
|
-
}
|
|
25
|
-
export declare function CategoryPicker({ config, onSelect }: CategoryPickerProps): import("react/jsx-runtime").JSX.Element;
|
|
26
|
-
export declare const VOUCHER_PICKER_CONFIG: CategoryPickerConfig;
|
|
27
|
-
export declare const TAG_PICKER_CONFIG: CategoryPickerConfig;
|
|
28
|
-
export declare const BOSS_PICKER_CONFIG: CategoryPickerConfig;
|
|
29
|
-
export declare const TAROT_PICKER_CONFIG: CategoryPickerConfig;
|
|
30
|
-
export declare const PLANET_PICKER_CONFIG: CategoryPickerConfig;
|
|
31
|
-
export declare const SPECTRAL_PICKER_CONFIG: CategoryPickerConfig;
|
|
32
|
-
export declare const PACK_PICKER_CONFIG: CategoryPickerConfig;
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import { SlotSelection, JamlZone, SlotCategory } from './MysterySlot.js';
|
|
2
|
-
export interface JamlMapEditorProps {
|
|
3
|
-
/** Initial zone for the demo. */
|
|
4
|
-
zone?: JamlZone;
|
|
5
|
-
/** Callback when selections change. Returns JAML string. */
|
|
6
|
-
onChange?: (jamlString: string) => void;
|
|
7
|
-
}
|
|
8
|
-
export interface MapSlotSelection extends SlotSelection {
|
|
9
|
-
zone: JamlZone;
|
|
10
|
-
}
|
|
11
|
-
export declare function JamlMapEditor({ zone: initialZone, onChange, }: JamlMapEditorProps): import("react/jsx-runtime").JSX.Element;
|
|
12
|
-
export declare function CategoryMenu({ onSelect, }: {
|
|
13
|
-
onSelect: (cat: SlotCategory) => void;
|
|
14
|
-
}): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import { JokerRarityTier } from './jokerRarity.js';
|
|
2
|
-
import { SlotSelection } from './MysterySlot.js';
|
|
3
|
-
export type JokerRarity = JokerRarityTier;
|
|
4
|
-
export interface JokerPickerProps {
|
|
5
|
-
onSelect: (selection: SlotSelection) => void;
|
|
6
|
-
onCancel?: () => void;
|
|
7
|
-
}
|
|
8
|
-
export declare function JokerPicker({ onSelect }: JokerPickerProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import { default as React } from 'react';
|
|
2
|
-
import { JokerRarityTier } from './jokerRarity.js';
|
|
3
|
-
import { SpriteSheetType } from '../../sprites/spriteMapper.js';
|
|
4
|
-
export type JamlZone = "must" | "should" | "mustnot";
|
|
5
|
-
/** The item category that can appear in a slot. */
|
|
6
|
-
export type SlotCategory = "joker" | "voucher" | "tag" | "boss" | "tarot" | "spectral" | "planet" | "pack";
|
|
7
|
-
/** Result of selecting a specific item in a slot. */
|
|
8
|
-
export interface SlotSelection {
|
|
9
|
-
category: SlotCategory;
|
|
10
|
-
/** The specific item name, or "Any" for wildcards. */
|
|
11
|
-
value: string;
|
|
12
|
-
/** JAML clause key (e.g. "commonJoker", "legendaryJoker", "voucher"). */
|
|
13
|
-
clauseKey: string;
|
|
14
|
-
/** Optional selected pack display name for pack slots. */
|
|
15
|
-
packName?: string;
|
|
16
|
-
/** Optional source pack indices for pack-derived item clauses. */
|
|
17
|
-
boosterPacks?: number[];
|
|
18
|
-
/** Optional rarity for jokers. */
|
|
19
|
-
rarity?: JokerRarityTier;
|
|
20
|
-
}
|
|
21
|
-
export interface MysterySlotProps {
|
|
22
|
-
/** Which zone this slot belongs to — determines border color. */
|
|
23
|
-
zone: JamlZone;
|
|
24
|
-
/** What sheet type to render mystery card from. */
|
|
25
|
-
sheetType: SpriteSheetType;
|
|
26
|
-
/** Current selection, if any. */
|
|
27
|
-
selection?: SlotSelection;
|
|
28
|
-
/** Width of the card sprite. */
|
|
29
|
-
width?: number;
|
|
30
|
-
/** Called when the slot is tapped (to open a picker). */
|
|
31
|
-
onTap?: () => void;
|
|
32
|
-
/** Called when the selection is cleared. */
|
|
33
|
-
onClear?: () => void;
|
|
34
|
-
/** Additional inline styles. */
|
|
35
|
-
style?: React.CSSProperties;
|
|
36
|
-
}
|
|
37
|
-
export declare function MysterySlot({ zone, sheetType, selection, width, onTap, onClear, style, }: MysterySlotProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
export { MysterySlot, type MysterySlotProps, type SlotSelection, type SlotCategory, type JamlZone } from './MysterySlot.js';
|
|
2
|
-
export { JokerPicker, type JokerPickerProps, type JokerRarity } from './JokerPicker.js';
|
|
3
|
-
export { JamlMapEditor, CategoryMenu, type JamlMapEditorProps } from './JamlMapEditor.js';
|
|
4
|
-
export { CategoryPicker, type CategoryPickerConfig, type CategoryPickerProps, VOUCHER_PICKER_CONFIG, TAG_PICKER_CONFIG, BOSS_PICKER_CONFIG, TAROT_PICKER_CONFIG, PLANET_PICKER_CONFIG, SPECTRAL_PICKER_CONFIG, PACK_PICKER_CONFIG, } from './CategoryPicker.js';
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare function normalizeJamlSeed(seed: string): string;
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
export type PoolSearchMode = "random" | "seedlist" | "sequential" | "aesthetic";
|
|
2
|
-
export interface PoolStartMessage {
|
|
3
|
-
type: "start";
|
|
4
|
-
workerIndex: number;
|
|
5
|
-
workerCount: number;
|
|
6
|
-
mode: PoolSearchMode;
|
|
7
|
-
jaml: string;
|
|
8
|
-
count?: number;
|
|
9
|
-
seeds?: string[];
|
|
10
|
-
batchCharacterCount?: number;
|
|
11
|
-
startBatchIndex?: string;
|
|
12
|
-
endBatchIndex?: string;
|
|
13
|
-
aesthetic?: number;
|
|
14
|
-
deck?: number;
|
|
15
|
-
stake?: number;
|
|
16
|
-
predicateStr?: string;
|
|
17
|
-
}
|
|
18
|
-
export interface PoolStopMessage {
|
|
19
|
-
type: "stop";
|
|
20
|
-
}
|
|
21
|
-
export type PoolInboundMessage = PoolStartMessage | PoolStopMessage;
|
|
22
|
-
export interface PoolReadyMessage {
|
|
23
|
-
type: "ready";
|
|
24
|
-
}
|
|
25
|
-
export interface PoolResultMessage {
|
|
26
|
-
type: "result";
|
|
27
|
-
workerIndex: number;
|
|
28
|
-
seed: string;
|
|
29
|
-
score: number;
|
|
30
|
-
tallyColumns: number[];
|
|
31
|
-
}
|
|
32
|
-
export interface PoolMatchMessage {
|
|
33
|
-
type: "match";
|
|
34
|
-
workerIndex: number;
|
|
35
|
-
seed: string;
|
|
36
|
-
}
|
|
37
|
-
export interface PoolProgressMessage {
|
|
38
|
-
type: "progress";
|
|
39
|
-
workerIndex: number;
|
|
40
|
-
searched: number;
|
|
41
|
-
matching: number;
|
|
42
|
-
percent: number;
|
|
43
|
-
seedsPerMs: number;
|
|
44
|
-
}
|
|
45
|
-
export interface PoolCompleteMessage {
|
|
46
|
-
type: "complete";
|
|
47
|
-
workerIndex: number;
|
|
48
|
-
status: "Completed" | "Cancelled";
|
|
49
|
-
total: number;
|
|
50
|
-
matched: number;
|
|
51
|
-
}
|
|
52
|
-
export interface PoolCancelledMessage {
|
|
53
|
-
type: "cancelled";
|
|
54
|
-
workerIndex: number;
|
|
55
|
-
}
|
|
56
|
-
export interface PoolErrorMessage {
|
|
57
|
-
type: "error";
|
|
58
|
-
workerIndex: number;
|
|
59
|
-
message: string;
|
|
60
|
-
}
|
|
61
|
-
export type PoolOutboundMessage = PoolReadyMessage | PoolResultMessage | PoolMatchMessage | PoolProgressMessage | PoolCompleteMessage | PoolCancelledMessage | PoolErrorMessage;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
export type AnalyzerStatus = "idle" | "running" | "done" | "error";
|
|
2
|
-
export declare function useAnalyzer(): {
|
|
3
|
-
score: number | null;
|
|
4
|
-
status: AnalyzerStatus;
|
|
5
|
-
error: string | null;
|
|
6
|
-
analyze: (seed: string, jaml: string) => void;
|
|
7
|
-
clearError: () => void;
|
|
8
|
-
tallyLabels: string[];
|
|
9
|
-
rawAnalysis: any;
|
|
10
|
-
};
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
export interface UseIntersectionObserverOptions extends IntersectionObserverInit {
|
|
2
|
-
freezeOnceVisible?: boolean;
|
|
3
|
-
}
|
|
4
|
-
/**
|
|
5
|
-
* Encapsulates IntersectionObserver logic.
|
|
6
|
-
*/
|
|
7
|
-
export declare function useIntersectionObserver({ root, rootMargin, threshold, freezeOnceVisible, }?: UseIntersectionObserverOptions): {
|
|
8
|
-
ref: (node: Element | null) => void;
|
|
9
|
-
entry: IntersectionObserverEntry | null;
|
|
10
|
-
};
|
|
11
|
-
/**
|
|
12
|
-
* Specialization for infinite scroll / sentinel patterns.
|
|
13
|
-
*/
|
|
14
|
-
export declare function useInfiniteScroll(onVisible: () => void, options?: IntersectionObserverInit, active?: boolean): (node: Element | null) => void;
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
export type JamlLibraryStatus = "idle" | "unsupported" | "mounting" | "ready" | "error";
|
|
2
|
-
export interface UseJamlLibraryState {
|
|
3
|
-
status: JamlLibraryStatus;
|
|
4
|
-
rootId: string | null;
|
|
5
|
-
files: string[];
|
|
6
|
-
error: string | null;
|
|
7
|
-
mount: () => Promise<void>;
|
|
8
|
-
unmount: () => Promise<void>;
|
|
9
|
-
loadFile: (uri: string) => Promise<string>;
|
|
10
|
-
saveFile: (uri: string, content: string) => Promise<void>;
|
|
11
|
-
refresh: () => void;
|
|
12
|
-
}
|
|
13
|
-
export declare function useJamlLibrary(): UseJamlLibraryState;
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
export interface SearchResult {
|
|
2
|
-
seed: string;
|
|
3
|
-
score: number;
|
|
4
|
-
tallyColumns?: number[];
|
|
5
|
-
}
|
|
6
|
-
export type SearchMode = "aesthetic" | "seedlist" | "random";
|
|
7
|
-
export type SearchStatus = "idle" | "running" | "completed" | "cancelled" | "error";
|
|
8
|
-
export interface UseSearchState {
|
|
9
|
-
results: SearchResult[];
|
|
10
|
-
totalSearched: bigint;
|
|
11
|
-
matchingSeeds: bigint;
|
|
12
|
-
status: SearchStatus;
|
|
13
|
-
error: string | null;
|
|
14
|
-
seedsPerSecond: number;
|
|
15
|
-
tallyLabels: string[];
|
|
16
|
-
}
|
|
17
|
-
export declare function useSearch(): {
|
|
18
|
-
startAesthetic: (jaml: string, aesthetic: number, predicate?: (seed: string, deck?: number, stake?: number) => boolean) => Promise<void>;
|
|
19
|
-
startSeedList: (jaml: string, seeds: string[], predicate?: (seed: string, deck?: number, stake?: number) => boolean) => Promise<void>;
|
|
20
|
-
startRandom: (jaml: string, count: number, predicate?: (seed: string, deck?: number, stake?: number) => boolean) => Promise<void>;
|
|
21
|
-
cancel: () => void;
|
|
22
|
-
reset: () => void;
|
|
23
|
-
clearError: () => void;
|
|
24
|
-
results: SearchResult[];
|
|
25
|
-
totalSearched: bigint;
|
|
26
|
-
matchingSeeds: bigint;
|
|
27
|
-
status: SearchStatus;
|
|
28
|
-
error: string | null;
|
|
29
|
-
seedsPerSecond: number;
|
|
30
|
-
tallyLabels: string[];
|
|
31
|
-
};
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import { JamlAesthetic } from 'motely-wasm';
|
|
2
|
-
import { SearchResult, SearchStatus } from './useSearch.js';
|
|
3
|
-
export interface UseSearchPoolState {
|
|
4
|
-
results: SearchResult[];
|
|
5
|
-
totalSearched: bigint;
|
|
6
|
-
matchingSeeds: bigint;
|
|
7
|
-
status: SearchStatus;
|
|
8
|
-
error: string | null;
|
|
9
|
-
seedsPerSecond: number;
|
|
10
|
-
tallyLabels: string[];
|
|
11
|
-
workerCount: number;
|
|
12
|
-
}
|
|
13
|
-
export interface UseSearchPoolOptions {
|
|
14
|
-
workerCount?: number;
|
|
15
|
-
resultCap?: number;
|
|
16
|
-
terminationGraceMs?: number;
|
|
17
|
-
}
|
|
18
|
-
export interface StartPoolOptions {
|
|
19
|
-
aesthetic?: number;
|
|
20
|
-
seeds?: string[];
|
|
21
|
-
count?: number;
|
|
22
|
-
batchCharacterCount?: number;
|
|
23
|
-
deck?: number;
|
|
24
|
-
stake?: number;
|
|
25
|
-
predicateStr?: string;
|
|
26
|
-
}
|
|
27
|
-
export declare function useSearchPool(options?: UseSearchPoolOptions): {
|
|
28
|
-
startRandom: (jaml: string, count: number, opts?: StartPoolOptions) => Promise<void>;
|
|
29
|
-
startSeedList: (jaml: string, seeds: string[], opts?: StartPoolOptions) => Promise<void>;
|
|
30
|
-
startSequential: (jaml: string, batchCharacterCount: number, opts?: StartPoolOptions) => Promise<void>;
|
|
31
|
-
startAesthetic: (jaml: string, aesthetic: JamlAesthetic | number, opts?: StartPoolOptions) => Promise<void>;
|
|
32
|
-
cancel: () => void;
|
|
33
|
-
reset: () => void;
|
|
34
|
-
clearError: () => void;
|
|
35
|
-
results: SearchResult[];
|
|
36
|
-
totalSearched: bigint;
|
|
37
|
-
matchingSeeds: bigint;
|
|
38
|
-
status: SearchStatus;
|
|
39
|
-
error: string | null;
|
|
40
|
-
seedsPerSecond: number;
|
|
41
|
-
tallyLabels: string[];
|
|
42
|
-
workerCount: number;
|
|
43
|
-
};
|