@aigamo/hydrangean-diva 0.0.1-alpha.4
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/LICENSE +93 -0
- package/dist/App.d.ts +3 -0
- package/dist/AppRoutes.d.ts +4 -0
- package/dist/common/components/Compose.d.ts +7 -0
- package/dist/favicon.svg +39 -0
- package/dist/features/media-player/components/AddVideoButton.d.ts +7 -0
- package/dist/features/media-player/components/BottomBar.d.ts +12 -0
- package/dist/features/media-player/components/Header.d.ts +2 -0
- package/dist/features/media-player/components/HydrangeanDiva.d.ts +11 -0
- package/dist/features/media-player/components/MediaPlayerLayout.d.ts +8 -0
- package/dist/features/media-player/components/MiniPlayer.d.ts +15 -0
- package/dist/features/media-player/components/PlayQueueStoreContext.d.ts +8 -0
- package/dist/features/media-player/components/PlayQueueTable.d.ts +9 -0
- package/dist/features/media-player/components/PlayerStoreContext.d.ts +8 -0
- package/dist/features/media-player/components/index.d.ts +6 -0
- package/dist/features/media-player/index.d.ts +2 -0
- package/dist/features/media-player/pages/PlayQueuePage.d.ts +2 -0
- package/dist/features/media-player/stores/IObservableStateProvider.d.ts +4 -0
- package/dist/features/media-player/stores/IPlayQueueItemStore.d.ts +33 -0
- package/dist/features/media-player/stores/IPlayQueueStore.d.ts +15 -0
- package/dist/features/media-player/stores/MobXObservableStateProvider.d.ts +5 -0
- package/dist/features/media-player/stores/ObservableStateProvider.d.ts +5 -0
- package/dist/features/media-player/stores/PlayQueueItemStore.d.ts +39 -0
- package/dist/features/media-player/stores/PlayQueueLocalStorageState.d.ts +10 -0
- package/dist/features/media-player/stores/PlayQueueStore.d.ts +55 -0
- package/dist/features/media-player/stores/PlayerStore.d.ts +15 -0
- package/dist/features/media-player/stores/RepeatMode.d.ts +5 -0
- package/dist/features/media-player/stores/getOrAddSchema.d.ts +2 -0
- package/dist/features/media-player/stores/index.d.ts +6 -0
- package/dist/icons.d.ts +1 -0
- package/dist/index.cjs.js +2 -0
- package/dist/index.cjs.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.es.js +1322 -0
- package/dist/index.es.js.map +1 -0
- package/dist/main.d.ts +1 -0
- package/dist/sw.d.ts +1 -0
- package/package.json +109 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.es.js","sources":["../src/features/media-player/stores/RepeatMode.ts","../src/features/media-player/components/BottomBar.tsx","../src/features/media-player/components/AddVideoButton.tsx","../src/features/media-player/components/PlayQueueTable.tsx","../src/features/media-player/components/HydrangeanDiva.tsx","../src/features/media-player/components/MiniPlayer.tsx","../src/features/media-player/stores/MobXObservableStateProvider.ts","../src/features/media-player/stores/PlayQueueItemStore.ts","../src/features/media-player/stores/getOrAddSchema.ts","../src/features/media-player/stores/PlayQueueLocalStorageState.ts","../src/features/media-player/stores/PlayQueueStore.ts","../src/features/media-player/components/PlayQueueStoreContext.tsx","../src/features/media-player/components/MediaPlayerLayout.tsx","../src/features/media-player/stores/PlayerStore.ts","../src/features/media-player/components/PlayerStoreContext.tsx","../src/features/media-player/stores/ObservableStateProvider.ts"],"sourcesContent":["export enum RepeatMode {\n\tOff = 'Off',\n\tAll = 'All',\n\tOne = 'One',\n}\n","import { useNostalgicDiva } from '@aigamo/nostalgic-diva';\nimport {\n\tEuiBottomBar,\n\tEuiButtonIcon,\n\tEuiContextMenu,\n\tEuiContextMenuPanelDescriptor,\n\tEuiFlexGroup,\n\tEuiFlexItem,\n\tEuiFormRow,\n\tEuiIcon,\n\tEuiPopover,\n\tEuiRange,\n\tIconType,\n} from '@elastic/eui';\nimport { _SingleRangeChangeEvent } from '@elastic/eui/src/components/form/range/types';\nimport {\n\tArrowRepeat1Filled,\n\tArrowRepeatAllFilled,\n\tArrowRepeatAllOffFilled,\n\tArrowShuffleFilled,\n\tArrowShuffleOffFilled,\n\tDismissRegular,\n\tMoreHorizontalFilled,\n\tNextFilled,\n\tPauseFilled,\n\tPlayFilled,\n\tPreviousFilled,\n\tSkipBack10Regular,\n\tSkipForward30Regular,\n\tSpeaker2Regular,\n\tTopSpeedRegular,\n} from '@fluentui/react-icons';\nimport { observer } from 'mobx-react-lite';\nimport React, {\n\tmemo,\n\tReactElement,\n\tReactNode,\n\tuseCallback,\n\tuseLayoutEffect,\n\tuseMemo,\n\tuseState,\n} from 'react';\n\nimport { PlayerStore } from '@/features/media-player/stores/PlayerStore';\nimport { PlayQueueStore } from '@/features/media-player/stores/PlayQueueStore';\nimport { RepeatMode } from '@/features/media-player/stores/RepeatMode';\n\nexport const bottomBarHeight = 80;\n\ninterface SeekBarProps {\n\tplayerStore: PlayerStore;\n}\n\nconst SeekBar = observer(({ playerStore }: SeekBarProps): ReactElement => {\n\tconst diva = useNostalgicDiva();\n\n\tconst handleChange = useCallback(\n\t\t(e: _SingleRangeChangeEvent) => {\n\t\t\tconst percent = Number(e.currentTarget.value) / 100;\n\t\t\tplayerStore.setPercent(percent);\n\t\t},\n\t\t[playerStore],\n\t);\n\n\tconst handleMouseDown = useCallback(\n\t\t(e: React.MouseEvent<HTMLInputElement>) => {\n\t\t\tif (e.button === 0) {\n\t\t\t\tplayerStore.setSeeking(true);\n\t\t\t}\n\t\t},\n\t\t[playerStore],\n\t);\n\n\tconst handleMouseUp = useCallback(\n\t\tasync (e: React.MouseEvent<HTMLInputElement>) => {\n\t\t\tif (e.button === 0) {\n\t\t\t\tconst percent = Number(e.currentTarget.value) / 100;\n\n\t\t\t\tplayerStore.setSeeking(false);\n\n\t\t\t\tconst duration = await diva.getDuration();\n\t\t\t\tif (duration !== undefined) {\n\t\t\t\t\tawait diva.setCurrentTime(duration * percent);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t[playerStore, diva],\n\t);\n\n\treturn (\n\t\t<EuiRange\n\t\t\tmin={0}\n\t\t\tmax={100}\n\t\t\tstep={0.0000001}\n\t\t\tvalue={playerStore.percent * 100}\n\t\t\tonChange={handleChange}\n\t\t\tonMouseDown={handleMouseDown}\n\t\t\tonMouseUp={handleMouseUp}\n\t\t\tfullWidth\n\t\t\tshowRange\n\t\t\tcss={{ blockSize: 32 }}\n\t\t/>\n\t);\n});\n\ninterface VolumePopoverProps {\n\tbutton?: NonNullable<ReactNode>;\n\tisOpen: boolean;\n\tclosePopover: () => void;\n}\n\nconst VolumePopover = memo(\n\t({ button, isOpen, closePopover }: VolumePopoverProps): ReactElement => {\n\t\tconst [value, setValue] = useState('0');\n\n\t\tconst diva = useNostalgicDiva();\n\n\t\tuseLayoutEffect(() => {\n\t\t\tif (isOpen) {\n\t\t\t\tvoid diva.getVolume().then((volume) => {\n\t\t\t\t\tif (volume !== undefined) {\n\t\t\t\t\t\tsetValue(Math.floor(volume * 100).toString());\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}, [isOpen, diva]);\n\n\t\tconst handleChange = useCallback(\n\t\t\tasync (e: _SingleRangeChangeEvent): Promise<void> => {\n\t\t\t\tsetValue(e.currentTarget.value);\n\n\t\t\t\tawait diva.setVolume(Number(e.currentTarget.value) / 100);\n\t\t\t},\n\t\t\t[diva],\n\t\t);\n\n\t\treturn (\n\t\t\t<EuiPopover\n\t\t\t\tbutton={button}\n\t\t\t\tisOpen={isOpen}\n\t\t\t\tclosePopover={closePopover}\n\t\t\t\tanchorPosition=\"upRight\"\n\t\t\t>\n\t\t\t\t<EuiFormRow>\n\t\t\t\t\t<EuiFlexGroup\n\t\t\t\t\t\tresponsive={false}\n\t\t\t\t\t\tgutterSize=\"s\"\n\t\t\t\t\t\tjustifyContent=\"center\"\n\t\t\t\t\t\talignItems=\"center\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<EuiButtonIcon\n\t\t\t\t\t\t\ttitle=\"Mute\" /* LOC */\n\t\t\t\t\t\t\taria-label=\"Mute\" /* LOC */\n\t\t\t\t\t\t\ticonType={Speaker2Regular}\n\t\t\t\t\t\t\tsize=\"s\"\n\t\t\t\t\t\t\ticonSize=\"l\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<EuiRange\n\t\t\t\t\t\t\tmin={0}\n\t\t\t\t\t\t\tmax={100}\n\t\t\t\t\t\t\tstep={1}\n\t\t\t\t\t\t\tvalue={value}\n\t\t\t\t\t\t\tonChange={handleChange}\n\t\t\t\t\t\t\tcss={{ blockSize: 32 }}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</EuiFlexGroup>\n\t\t\t\t</EuiFormRow>\n\t\t\t</EuiPopover>\n\t\t);\n\t},\n);\n\ninterface MoreOptionsContextMenuProps {\n\tplayQueueStore: PlayQueueStore;\n\tclosePopover: () => void;\n}\n\nconst MoreOptionsContextMenu = memo(\n\t({\n\t\tplayQueueStore,\n\t\tclosePopover,\n\t}: MoreOptionsContextMenuProps): ReactElement => {\n\t\tconst diva = useNostalgicDiva();\n\n\t\tconst handleClickSkipBack10 = useCallback(async () => {\n\t\t\tconst currentTime = await diva.getCurrentTime();\n\n\t\t\tif (currentTime !== undefined) {\n\t\t\t\tawait diva.setCurrentTime(currentTime - 10);\n\t\t\t}\n\n\t\t\tclosePopover();\n\t\t}, [diva, closePopover]);\n\n\t\tconst handleClickSkipForward30 = useCallback(async () => {\n\t\t\tconst currentTime = await diva.getCurrentTime();\n\n\t\t\tif (currentTime !== undefined) {\n\t\t\t\tawait diva.setCurrentTime(currentTime + 30);\n\t\t\t}\n\n\t\t\tclosePopover();\n\t\t}, [diva, closePopover]);\n\n\t\tconst handleClickPlaybackRate = useCallback(\n\t\t\tasync (playbackRate: number): Promise<void> => {\n\t\t\t\tawait diva.setPlaybackRate(playbackRate);\n\n\t\t\t\tclosePopover();\n\t\t\t},\n\t\t\t[diva, closePopover],\n\t\t);\n\n\t\tconst handleClickRemoveFromPlayQueue =\n\t\t\tuseCallback(async (): Promise<void> => {\n\t\t\t\tif (playQueueStore.currentItem !== undefined) {\n\t\t\t\t\tawait playQueueStore.removeItems([\n\t\t\t\t\t\tplayQueueStore.currentItem,\n\t\t\t\t\t]);\n\t\t\t\t}\n\n\t\t\t\tclosePopover();\n\t\t\t}, [playQueueStore, closePopover]);\n\n\t\tconst [playbackRate] = useState<number>();\n\n\t\tconst panels = useMemo(\n\t\t\t(): EuiContextMenuPanelDescriptor[] => [\n\t\t\t\t{\n\t\t\t\t\tid: 0,\n\t\t\t\t\titems: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tname: 'Speed' /* LOC */,\n\t\t\t\t\t\t\ticon: <EuiIcon type={TopSpeedRegular} size=\"m\" />,\n\t\t\t\t\t\t\tpanel: 1,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tname: 'Skip back 10 seconds' /* LOC */,\n\t\t\t\t\t\t\ticon: <EuiIcon type={SkipBack10Regular} size=\"m\" />,\n\t\t\t\t\t\t\tonClick: handleClickSkipBack10,\n\t\t\t\t\t\t\tdisabled: playQueueStore.isEmpty,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tname: 'Skip forward 30 seconds' /* LOC */,\n\t\t\t\t\t\t\ticon: (\n\t\t\t\t\t\t\t\t<EuiIcon type={SkipForward30Regular} size=\"m\" />\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tonClick: handleClickSkipForward30,\n\t\t\t\t\t\t\tdisabled: playQueueStore.isEmpty,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tisSeparator: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tname: 'Remove from play queue' /* LOC */,\n\t\t\t\t\t\t\ticon: <EuiIcon type={DismissRegular} size=\"m\" />,\n\t\t\t\t\t\t\tonClick: handleClickRemoveFromPlayQueue,\n\t\t\t\t\t\t\tdisabled: playQueueStore.isEmpty,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: 1,\n\t\t\t\t\ttitle: 'Speed' /* LOC */,\n\t\t\t\t\titems: [0.25, 0.5, 0.75, 1, 1.25, 1.5, 1.75, 2].map(\n\t\t\t\t\t\t(value) => ({\n\t\t\t\t\t\t\tname: value.toString(),\n\t\t\t\t\t\t\tonClick: (): Promise<void> =>\n\t\t\t\t\t\t\t\thandleClickPlaybackRate(value),\n\t\t\t\t\t\t\ticon: value === playbackRate ? 'check' : 'empty',\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\t},\n\t\t\t],\n\t\t\t[\n\t\t\t\tplayQueueStore,\n\t\t\t\thandleClickSkipBack10,\n\t\t\t\thandleClickSkipForward30,\n\t\t\t\thandleClickRemoveFromPlayQueue,\n\t\t\t\thandleClickPlaybackRate,\n\t\t\t\tplaybackRate,\n\t\t\t],\n\t\t);\n\n\t\treturn <EuiContextMenu initialPanelId={0} panels={panels} />;\n\t},\n);\n\ninterface MoreOptionsPopoverProps {\n\tplayQueueStore: PlayQueueStore;\n\tbutton?: NonNullable<ReactNode>;\n\tisOpen: boolean;\n\tclosePopover: () => void;\n}\n\nconst MoreOptionsPopover = memo(\n\t({\n\t\tplayQueueStore,\n\t\tbutton,\n\t\tisOpen,\n\t\tclosePopover,\n\t}: MoreOptionsPopoverProps): ReactElement => {\n\t\treturn (\n\t\t\t<EuiPopover\n\t\t\t\tbutton={button}\n\t\t\t\tisOpen={isOpen}\n\t\t\t\tclosePopover={closePopover}\n\t\t\t\tpanelPaddingSize=\"none\"\n\t\t\t\tanchorPosition=\"upRight\"\n\t\t\t>\n\t\t\t\t<MoreOptionsContextMenu\n\t\t\t\t\tplayQueueStore={playQueueStore}\n\t\t\t\t\tclosePopover={closePopover}\n\t\t\t\t/>\n\t\t\t</EuiPopover>\n\t\t);\n\t},\n);\n\nconst repeatIconTypes: Record<RepeatMode, IconType> = {\n\t[RepeatMode.Off]: ArrowRepeatAllOffFilled,\n\t[RepeatMode.All]: ArrowRepeatAllFilled,\n\t[RepeatMode.One]: ArrowRepeat1Filled,\n};\n\ninterface BottomBarCenterControlsProps {\n\tplayerStore: PlayerStore;\n\tplayQueueStore: PlayQueueStore;\n}\n\nconst BottomBarCenterControls = observer(\n\t({\n\t\tplayerStore,\n\t\tplayQueueStore,\n\t}: BottomBarCenterControlsProps): ReactElement => {\n\t\tconst diva = useNostalgicDiva();\n\n\t\tconst handlePrevious = useCallback(async () => {\n\t\t\tif (playQueueStore.hasPreviousItem) {\n\t\t\t\tconst currentTime = await diva.getCurrentTime();\n\t\t\t\tif (currentTime === undefined || currentTime < 5) {\n\t\t\t\t\tawait playQueueStore.previous();\n\t\t\t\t} else {\n\t\t\t\t\tawait diva.setCurrentTime(0);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tawait diva.setCurrentTime(0);\n\t\t\t}\n\t\t}, [playQueueStore, diva]);\n\n\t\treturn (\n\t\t\t<EuiFlexGroup\n\t\t\t\tresponsive={false}\n\t\t\t\tgutterSize=\"s\"\n\t\t\t\tjustifyContent=\"center\"\n\t\t\t\talignItems=\"center\"\n\t\t\t>\n\t\t\t\t<EuiButtonIcon\n\t\t\t\t\ttitle={\n\t\t\t\t\t\t`Shuffle: ${\n\t\t\t\t\t\t\tplayQueueStore.shuffle ? 'On' : 'Off'\n\t\t\t\t\t\t}` /* LOC */\n\t\t\t\t\t}\n\t\t\t\t\taria-label={\n\t\t\t\t\t\t`Shuffle: ${\n\t\t\t\t\t\t\tplayQueueStore.shuffle ? 'On' : 'Off'\n\t\t\t\t\t\t}` /* LOC */\n\t\t\t\t\t}\n\t\t\t\t\ticonType={\n\t\t\t\t\t\tplayQueueStore.shuffle\n\t\t\t\t\t\t\t? ArrowShuffleFilled\n\t\t\t\t\t\t\t: ArrowShuffleOffFilled\n\t\t\t\t\t}\n\t\t\t\t\tsize=\"s\"\n\t\t\t\t\ticonSize=\"l\"\n\t\t\t\t\tonClick={playQueueStore.toggleShuffle}\n\t\t\t\t\tdisabled /* TODO: remove */\n\t\t\t\t/>\n\t\t\t\t<EuiButtonIcon\n\t\t\t\t\ttitle=\"Previous\" /* LOC */\n\t\t\t\t\taria-label=\"Previous\" /* LOC */\n\t\t\t\t\ticonType={PreviousFilled}\n\t\t\t\t\tsize=\"s\"\n\t\t\t\t\ticonSize=\"l\"\n\t\t\t\t\tonClick={handlePrevious}\n\t\t\t\t\tdisabled={playQueueStore.isEmpty}\n\t\t\t\t/>\n\t\t\t\t{playerStore.playing ? (\n\t\t\t\t\t<EuiButtonIcon\n\t\t\t\t\t\ttitle=\"Pause\" /* LOC */\n\t\t\t\t\t\taria-label=\"Pause\" /* LOC */\n\t\t\t\t\t\ticonType={PauseFilled}\n\t\t\t\t\t\tsize=\"s\"\n\t\t\t\t\t\ticonSize=\"l\"\n\t\t\t\t\t\tonClick={(): Promise<void> => diva.pause()}\n\t\t\t\t\t\tdisabled={!playQueueStore.canPlay}\n\t\t\t\t\t/>\n\t\t\t\t) : (\n\t\t\t\t\t<EuiButtonIcon\n\t\t\t\t\t\ttitle=\"Play\" /* LOC */\n\t\t\t\t\t\taria-label=\"Play\" /* LOC */\n\t\t\t\t\t\ticonType={PlayFilled}\n\t\t\t\t\t\tsize=\"s\"\n\t\t\t\t\t\ticonSize=\"l\"\n\t\t\t\t\t\tonClick={(): Promise<void> => diva.play()}\n\t\t\t\t\t\tdisabled={!playQueueStore.canPlay}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t\t<EuiButtonIcon\n\t\t\t\t\ttitle=\"Next\" /* LOC */\n\t\t\t\t\taria-label=\"Next\" /* LOC */\n\t\t\t\t\ticonType={NextFilled}\n\t\t\t\t\tsize=\"s\"\n\t\t\t\t\ticonSize=\"l\"\n\t\t\t\t\tonClick={playQueueStore.next}\n\t\t\t\t\tdisabled={!playQueueStore.hasNextItem}\n\t\t\t\t/>\n\t\t\t\t<EuiButtonIcon\n\t\t\t\t\ttitle={\n\t\t\t\t\t\t`Repeat: ${\n\t\t\t\t\t\t\tplayQueueStore.repeat === RepeatMode.All\n\t\t\t\t\t\t\t\t? 'All'\n\t\t\t\t\t\t\t\t: playQueueStore.repeat === RepeatMode.One\n\t\t\t\t\t\t\t\t\t? 'One'\n\t\t\t\t\t\t\t\t\t: 'Off'\n\t\t\t\t\t\t}` /* LOC */\n\t\t\t\t\t}\n\t\t\t\t\taria-label={\n\t\t\t\t\t\t`Repeat: ${\n\t\t\t\t\t\t\tplayQueueStore.repeat === RepeatMode.All\n\t\t\t\t\t\t\t\t? 'All'\n\t\t\t\t\t\t\t\t: playQueueStore.repeat === RepeatMode.One\n\t\t\t\t\t\t\t\t\t? 'One'\n\t\t\t\t\t\t\t\t\t: 'Off'\n\t\t\t\t\t\t}` /* LOC */\n\t\t\t\t\t}\n\t\t\t\t\ticonType={repeatIconTypes[playQueueStore.repeat]}\n\t\t\t\t\tsize=\"s\"\n\t\t\t\t\ticonSize=\"l\"\n\t\t\t\t\tonClick={playQueueStore.toggleRepeat}\n\t\t\t\t/>\n\t\t\t</EuiFlexGroup>\n\t\t);\n\t},\n);\n\nconst VolumeButton = memo((): ReactElement => {\n\tconst [isVolumePopoverOpen, setIsVolumePopoverOpen] = useState(false);\n\n\tconst toggleVolumePopover = (): void =>\n\t\tsetIsVolumePopoverOpen(!isVolumePopoverOpen);\n\n\treturn (\n\t\t<VolumePopover\n\t\t\tbutton={\n\t\t\t\t<EuiButtonIcon\n\t\t\t\t\ttitle=\"Volume\" /* LOC */\n\t\t\t\t\taria-label=\"Volume\" /* LOC */\n\t\t\t\t\ticonType={Speaker2Regular}\n\t\t\t\t\tsize=\"s\"\n\t\t\t\t\ticonSize=\"l\"\n\t\t\t\t\tonClick={toggleVolumePopover}\n\t\t\t\t/>\n\t\t\t}\n\t\t\tisOpen={isVolumePopoverOpen}\n\t\t\tclosePopover={(): void => setIsVolumePopoverOpen(false)}\n\t\t/>\n\t);\n});\n\ninterface MoreOptionsButtonProps {\n\tplayQueueStore: PlayQueueStore;\n}\n\nconst MoreOptionsButton = memo(\n\t({ playQueueStore }: MoreOptionsButtonProps): ReactElement => {\n\t\tconst [isMoreOptionsPopoverOpen, setIsMoreOptionsPopoverOpen] =\n\t\t\tuseState(false);\n\n\t\tconst toggleMoreOptionsPopover = (): void =>\n\t\t\tsetIsMoreOptionsPopoverOpen(!isMoreOptionsPopoverOpen);\n\n\t\treturn (\n\t\t\t<MoreOptionsPopover\n\t\t\t\tplayQueueStore={playQueueStore}\n\t\t\t\tbutton={\n\t\t\t\t\t<EuiButtonIcon\n\t\t\t\t\t\ttitle=\"More options\" /* LOC */\n\t\t\t\t\t\taria-label=\"More options\" /* LOC */\n\t\t\t\t\t\ticonType={MoreHorizontalFilled}\n\t\t\t\t\t\tsize=\"s\"\n\t\t\t\t\t\ticonSize=\"l\"\n\t\t\t\t\t\tonClick={toggleMoreOptionsPopover}\n\t\t\t\t\t/>\n\t\t\t\t}\n\t\t\t\tisOpen={isMoreOptionsPopoverOpen}\n\t\t\t\tclosePopover={(): void => setIsMoreOptionsPopoverOpen(false)}\n\t\t\t/>\n\t\t);\n\t},\n);\n\ninterface BottomBarRightControlsProps {\n\tplayQueueStore: PlayQueueStore;\n}\n\nconst BottomBarRightControls = memo(\n\t({ playQueueStore }: BottomBarRightControlsProps): ReactElement => {\n\t\treturn (\n\t\t\t<EuiFlexGroup\n\t\t\t\tresponsive={false}\n\t\t\t\tgutterSize=\"s\"\n\t\t\t\tjustifyContent=\"flexEnd\"\n\t\t\t\talignItems=\"center\"\n\t\t\t>\n\t\t\t\t<VolumeButton />\n\t\t\t\t<MoreOptionsButton playQueueStore={playQueueStore} />\n\t\t\t</EuiFlexGroup>\n\t\t);\n\t},\n);\n\ninterface BottomBarProps {\n\tplayerStore: PlayerStore;\n\tplayQueueStore: PlayQueueStore;\n}\n\nexport const BottomBar = observer(\n\t({ playerStore, playQueueStore }: BottomBarProps): ReactElement => {\n\t\treturn (\n\t\t\t<EuiBottomBar paddingSize=\"s\">\n\t\t\t\t<EuiFlexGroup direction=\"column\" gutterSize=\"none\">\n\t\t\t\t\t<EuiFlexItem>\n\t\t\t\t\t\t<SeekBar playerStore={playerStore} />\n\t\t\t\t\t</EuiFlexItem>\n\t\t\t\t\t<EuiFlexItem>\n\t\t\t\t\t\t<EuiFlexGroup responsive={false}>\n\t\t\t\t\t\t\t<EuiFlexItem css={{ width: 'calc(100% / 3)' }} />\n\t\t\t\t\t\t\t<EuiFlexItem css={{ width: 'calc(100% / 3)' }}>\n\t\t\t\t\t\t\t\t<BottomBarCenterControls\n\t\t\t\t\t\t\t\t\tplayerStore={playerStore}\n\t\t\t\t\t\t\t\t\tplayQueueStore={playQueueStore}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</EuiFlexItem>\n\t\t\t\t\t\t\t<EuiFlexItem css={{ width: 'calc(100% / 3)' }}>\n\t\t\t\t\t\t\t\t<BottomBarRightControls\n\t\t\t\t\t\t\t\t\tplayQueueStore={playQueueStore}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</EuiFlexItem>\n\t\t\t\t\t\t</EuiFlexGroup>\n\t\t\t\t\t</EuiFlexItem>\n\t\t\t\t</EuiFlexGroup>\n\t\t\t</EuiBottomBar>\n\t\t);\n\t},\n);\n","import { findVideoService } from '@aigamo/nostalgic-diva';\nimport {\n\tEuiButton,\n\tEuiButtonEmpty,\n\tEuiFieldText,\n\tEuiForm,\n\tEuiFormRow,\n\tEuiModal,\n\tEuiModalBody,\n\tEuiModalFooter,\n\tEuiModalHeader,\n\tEuiModalHeaderTitle,\n} from '@elastic/eui';\nimport { AddRegular } from '@fluentui/react-icons';\nimport { memo, ReactElement, useCallback, useState } from 'react';\n\nimport { PlayQueueStore } from '@/features/media-player/stores/PlayQueueStore';\n\ninterface AddVideoModalProps {\n\tonCancel: () => void;\n\tonSave: (e: { url: string; title: string }) => Promise<void>;\n}\n\nconst AddVideoModal = ({\n\tonCancel,\n\tonSave,\n}: AddVideoModalProps): ReactElement => {\n\tconst [url, setUrl] = useState('');\n\tconst [title, setTitle] = useState('');\n\tconst [loading, setLoading] = useState(false);\n\n\treturn (\n\t\t<EuiModal onClose={onCancel} initialFocus=\"[name=url]\">\n\t\t\t<EuiModalHeader>\n\t\t\t\t<EuiModalHeaderTitle>Add video{/* LOC */}</EuiModalHeaderTitle>\n\t\t\t</EuiModalHeader>\n\n\t\t\t<EuiModalBody>\n\t\t\t\t<EuiForm component=\"form\">\n\t\t\t\t\t<EuiFormRow label=\"URL\" /* LOC */>\n\t\t\t\t\t\t<EuiFieldText\n\t\t\t\t\t\t\tname=\"url\"\n\t\t\t\t\t\t\tvalue={url}\n\t\t\t\t\t\t\tonChange={(e): void => setUrl(e.target.value)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</EuiFormRow>\n\n\t\t\t\t\t<EuiFormRow label=\"Title\">\n\t\t\t\t\t\t<EuiFieldText\n\t\t\t\t\t\t\tname=\"title\"\n\t\t\t\t\t\t\tvalue={title}\n\t\t\t\t\t\t\tonChange={(e): void => setTitle(e.target.value)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</EuiFormRow>\n\t\t\t\t</EuiForm>\n\t\t\t</EuiModalBody>\n\n\t\t\t<EuiModalFooter>\n\t\t\t\t<EuiButtonEmpty onClick={onCancel}>\n\t\t\t\t\tCancel{/* LOC */}\n\t\t\t\t</EuiButtonEmpty>\n\n\t\t\t\t<EuiButton\n\t\t\t\t\ttype=\"submit\"\n\t\t\t\t\tonClick={async (): Promise<void> => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tsetLoading(true);\n\n\t\t\t\t\t\t\tawait onSave({ url, title });\n\t\t\t\t\t\t} finally {\n\t\t\t\t\t\t\tsetLoading(false);\n\t\t\t\t\t\t}\n\t\t\t\t\t}}\n\t\t\t\t\tfill\n\t\t\t\t\tdisabled={url.trim().length === 0}\n\t\t\t\t\tisLoading={loading}\n\t\t\t\t>\n\t\t\t\t\tSave{/* LOC */}\n\t\t\t\t</EuiButton>\n\t\t\t</EuiModalFooter>\n\t\t</EuiModal>\n\t);\n};\n\ninterface NoembedResult {\n\ttitle: string;\n}\n\nfunction isNoembedResult(value: any): value is NoembedResult {\n\treturn (\n\t\tvalue !== null &&\n\t\ttypeof value === 'object' &&\n\t\t'title' in value &&\n\t\ttypeof value.title === 'string'\n\t);\n}\n\ninterface AddVideoButtonProps {\n\tplayQueueStore: PlayQueueStore;\n}\n\nexport const AddVideoButton = memo(\n\t({ playQueueStore }: AddVideoButtonProps): ReactElement => {\n\t\tconst [addVideoModalOpen, setAddVideoModalOpen] = useState(false);\n\n\t\tconst handleSave = useCallback(\n\t\t\tasync (e: { url: string; title: string }): Promise<void> => {\n\t\t\t\tconst videoService = findVideoService(e.url);\n\t\t\t\tif (videoService !== undefined) {\n\t\t\t\t\tconst videoId = videoService.extractVideoId(e.url);\n\t\t\t\t\tif (videoId !== undefined) {\n\t\t\t\t\t\tconst response = await fetch(\n\t\t\t\t\t\t\t`https://noembed.com/embed?url=${encodeURIComponent(\n\t\t\t\t\t\t\t\te.url,\n\t\t\t\t\t\t\t)}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst jsonData = await response.json();\n\n\t\t\t\t\t\tawait playQueueStore.addItems([\n\t\t\t\t\t\t\tplayQueueStore.createItem({\n\t\t\t\t\t\t\t\turl: e.url,\n\t\t\t\t\t\t\t\ttype: videoService.type,\n\t\t\t\t\t\t\t\tvideoId: videoId,\n\t\t\t\t\t\t\t\ttitle:\n\t\t\t\t\t\t\t\t\te.title ||\n\t\t\t\t\t\t\t\t\t(isNoembedResult(jsonData)\n\t\t\t\t\t\t\t\t\t\t? jsonData.title\n\t\t\t\t\t\t\t\t\t\t: videoId),\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t]);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tsetAddVideoModalOpen(false);\n\t\t\t},\n\t\t\t[playQueueStore],\n\t\t);\n\n\t\treturn (\n\t\t\t<>\n\t\t\t\t<EuiButton\n\t\t\t\t\tonClick={(): void => setAddVideoModalOpen(true)}\n\t\t\t\t\ticonType={AddRegular}\n\t\t\t\t\tcolor=\"primary\"\n\t\t\t\t>\n\t\t\t\t\tAdd video{/* LOC */}\n\t\t\t\t</EuiButton>\n\n\t\t\t\t{addVideoModalOpen && (\n\t\t\t\t\t<AddVideoModal\n\t\t\t\t\t\tonCancel={(): void => setAddVideoModalOpen(false)}\n\t\t\t\t\t\tonSave={handleSave}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</>\n\t\t);\n\t},\n);\n","import { PlayerType, useNostalgicDiva } from '@aigamo/nostalgic-diva';\nimport {\n\tCommonProps,\n\tEuiButton,\n\tEuiButtonIcon,\n\tEuiCheckbox,\n\tEuiContextMenuItem,\n\tEuiContextMenuItemProps,\n\tEuiContextMenuPanel,\n\tEuiHorizontalRule,\n\tEuiIcon,\n\tEuiLink,\n\tEuiPopover,\n\tEuiTable,\n\tEuiTableHeader,\n\tEuiTableHeaderCell,\n\tEuiTableHeaderCellCheckbox,\n\tEuiTableRow,\n\tEuiTableRowCell,\n\tEuiTableRowCellCheckbox,\n\tuseEuiTheme,\n} from '@elastic/eui';\nimport {\n\tAddRegular,\n\tArrowDownloadRegular,\n\tArrowUploadRegular,\n\tDismissRegular,\n\tMoreHorizontalFilled,\n\tPlayRegular,\n} from '@fluentui/react-icons';\nimport { observer } from 'mobx-react-lite';\nimport React, {\n\tButtonHTMLAttributes,\n\tmemo,\n\tReactElement,\n\tuseCallback,\n\tuseState,\n} from 'react';\nimport { ReactSortable } from 'react-sortablejs';\n\nimport { IPlayQueueItemStore } from '@/features/media-player/stores/IPlayQueueItemStore';\nimport { PlayQueueStore } from '@/features/media-player/stores/PlayQueueStore';\n\ninterface PlayQueueTableHeaderProps {\n\tplayQueueStore: PlayQueueStore;\n}\n\nconst PlayQueueTableHeader = observer(\n\t({ playQueueStore }: PlayQueueTableHeaderProps): ReactElement => {\n\t\tconst { euiTheme } = useEuiTheme();\n\n\t\treturn (\n\t\t\t<EuiTableHeader\n\t\t\t\tstyle={{\n\t\t\t\t\tposition: 'sticky',\n\t\t\t\t\ttop: 48 + 40 + 24,\n\t\t\t\t\tzIndex: 998,\n\t\t\t\t\tbackground: euiTheme.colors.backgroundBasePlain,\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<EuiTableHeaderCellCheckbox>\n\t\t\t\t\t<EuiCheckbox\n\t\t\t\t\t\tid=\"\" // TODO\n\t\t\t\t\t\tchecked={playQueueStore.allItemsSelected}\n\t\t\t\t\t\tonChange={(e): void => {\n\t\t\t\t\t\t\tplayQueueStore.allItemsSelected = e.target.checked;\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t</EuiTableHeaderCellCheckbox>\n\t\t\t\t<EuiTableHeaderCell width={24} />\n\t\t\t\t<EuiTableHeaderCell>Title{/* LOC */}</EuiTableHeaderCell>\n\t\t\t\t<EuiTableHeaderCell />\n\t\t\t</EuiTableHeader>\n\t\t);\n\t},\n);\n\ninterface PlayQueueTableRowContextMenuPanelProps {\n\titem: IPlayQueueItemStore;\n\tclosePopover: () => void;\n}\n\nconst PlayQueueTableRowContextMenuPanel = memo(\n\t({\n\t\titem,\n\t\tclosePopover,\n\t}: PlayQueueTableRowContextMenuPanelProps): ReactElement => {\n\t\tconst ContextMenuItem = memo(\n\t\t\t({\n\t\t\t\tonClick,\n\t\t\t\t...props\n\t\t\t}: CommonProps &\n\t\t\t\tOmit<\n\t\t\t\t\tButtonHTMLAttributes<HTMLButtonElement>,\n\t\t\t\t\t'onClick' | 'disabled' | 'type'\n\t\t\t\t> &\n\t\t\t\tEuiContextMenuItemProps): ReactElement => {\n\t\t\t\tconst handleClick = useCallback(\n\t\t\t\t\t(e: React.MouseEvent) => {\n\t\t\t\t\t\tclosePopover();\n\n\t\t\t\t\t\tonClick?.(e);\n\t\t\t\t\t},\n\t\t\t\t\t[onClick],\n\t\t\t\t);\n\n\t\t\t\treturn <EuiContextMenuItem {...props} onClick={handleClick} />;\n\t\t\t},\n\t\t);\n\n\t\treturn (\n\t\t\t<EuiContextMenuPanel>\n\t\t\t\t<ContextMenuItem\n\t\t\t\t\ticon={<EuiIcon type=\"\" />}\n\t\t\t\t\tonClick={item.playFirst}\n\t\t\t\t>\n\t\t\t\t\tPlay first{/* LOC */}\n\t\t\t\t</ContextMenuItem>\n\t\t\t\t<ContextMenuItem\n\t\t\t\t\ticon={<EuiIcon type=\"\" />}\n\t\t\t\t\tonClick={item.playNext}\n\t\t\t\t>\n\t\t\t\t\tPlay next{/* LOC */}\n\t\t\t\t</ContextMenuItem>\n\t\t\t\t<ContextMenuItem\n\t\t\t\t\ticon={<EuiIcon type={AddRegular} />}\n\t\t\t\t\tonClick={item.addToPlayQueue}\n\t\t\t\t>\n\t\t\t\t\tAdd to play queue{/* LOC */}\n\t\t\t\t</ContextMenuItem>\n\t\t\t\t<EuiHorizontalRule margin=\"none\" />\n\t\t\t\t<ContextMenuItem\n\t\t\t\t\ticon={<EuiIcon type={ArrowUploadRegular} />}\n\t\t\t\t\tonClick={item.moveToTop}\n\t\t\t\t\tdisabled={!item.canMoveToTop}\n\t\t\t\t>\n\t\t\t\t\tMove to the top{/* LOC */}\n\t\t\t\t</ContextMenuItem>\n\t\t\t\t<ContextMenuItem\n\t\t\t\t\ticon={<EuiIcon type={ArrowDownloadRegular} />}\n\t\t\t\t\tonClick={item.moveToBottom}\n\t\t\t\t\tdisabled={!item.canMoveToBottom}\n\t\t\t\t>\n\t\t\t\t\tMove to the bottom{/* LOC */}\n\t\t\t\t</ContextMenuItem>\n\t\t\t\t<EuiHorizontalRule margin=\"none\" />\n\t\t\t\t<ContextMenuItem\n\t\t\t\t\ticon={<EuiIcon type=\"\" />}\n\t\t\t\t\tonClick={item.removeToTop}\n\t\t\t\t\tdisabled={!item.canRemoveToTop}\n\t\t\t\t>\n\t\t\t\t\tRemove to the top{/* LOC */}\n\t\t\t\t</ContextMenuItem>\n\t\t\t\t<ContextMenuItem\n\t\t\t\t\ticon={<EuiIcon type=\"\" />}\n\t\t\t\t\tonClick={item.removeOthers}\n\t\t\t\t\tdisabled={!item.canRemoveOthers}\n\t\t\t\t>\n\t\t\t\t\tRemove others{/* LOC */}\n\t\t\t\t</ContextMenuItem>\n\t\t\t</EuiContextMenuPanel>\n\t\t);\n\t},\n);\n\ninterface PlayQueueTableRowPopoverProps {\n\titem: IPlayQueueItemStore;\n}\n\nconst PlayQueueTableRowPopover = memo(\n\t({ item }: PlayQueueTableRowPopoverProps): ReactElement => {\n\t\tconst [isOpen, setIsOpen] = useState(false);\n\n\t\tconst togglePopover = useCallback(() => setIsOpen(!isOpen), [isOpen]);\n\t\tconst closePopover = useCallback(() => setIsOpen(false), []);\n\n\t\treturn (\n\t\t\t<EuiPopover\n\t\t\t\tbutton={\n\t\t\t\t\t<EuiButtonIcon\n\t\t\t\t\t\ttitle=\"More options\"\n\t\t\t\t\t\taria-label=\"More options\"\n\t\t\t\t\t\ticonType={MoreHorizontalFilled}\n\t\t\t\t\t\tsize=\"s\"\n\t\t\t\t\t\tcolor=\"text\"\n\t\t\t\t\t\tonClick={togglePopover}\n\t\t\t\t\t/>\n\t\t\t\t}\n\t\t\t\tisOpen={isOpen}\n\t\t\t\tclosePopover={closePopover}\n\t\t\t\tpanelPaddingSize=\"none\"\n\t\t\t\tanchorPosition=\"leftCenter\"\n\t\t\t>\n\t\t\t\t<PlayQueueTableRowContextMenuPanel\n\t\t\t\t\titem={item}\n\t\t\t\t\tclosePopover={closePopover}\n\t\t\t\t/>\n\t\t\t</EuiPopover>\n\t\t);\n\t},\n);\n\ninterface PlayQueueTableRowActionsCellProps {\n\titem: IPlayQueueItemStore;\n}\n\nconst PlayQueueTableRowActionsCell = observer(\n\t({ item }: PlayQueueTableRowActionsCellProps): ReactElement => {\n\t\tconst diva = useNostalgicDiva();\n\n\t\treturn (\n\t\t\t<EuiTableRowCell textOnly={false} hasActions align=\"right\">\n\t\t\t\t<EuiButton\n\t\t\t\t\ticonType={PlayRegular}\n\t\t\t\t\tsize=\"s\"\n\t\t\t\t\tonClick={async (): Promise<void> => {\n\t\t\t\t\t\tif (item.isCurrent) {\n\t\t\t\t\t\t\tawait diva.setCurrentTime(0);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\titem.play();\n\t\t\t\t\t\t}\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\tPlay{/* LOC */}\n\t\t\t\t</EuiButton>\n\t\t\t\t<EuiButton\n\t\t\t\t\ticonType={DismissRegular}\n\t\t\t\t\tsize=\"s\"\n\t\t\t\t\tonClick={item.remove}\n\t\t\t\t>\n\t\t\t\t\tRemove{/* LOC */}\n\t\t\t\t</EuiButton>\n\t\t\t\t<PlayQueueTableRowPopover item={item} />\n\t\t\t</EuiTableRowCell>\n\t\t);\n\t},\n);\n\nconst videoServiceIcons: Record<PlayerType, string> = {\n\tAudio: '' /* TODO */,\n\tDailymotion: 'https://www.dailymotion.com/favicon.ico',\n\tNiconico: 'https://www.nicovideo.jp/favicon.ico',\n\tSoundCloud: 'https://soundcloud.com/favicon.ico',\n\tTwitch: 'https://www.twitch.tv/favicon.ico',\n\tVimeo: 'https://vimeo.com/favicon.ico',\n\tYouTube: 'https://www.youtube.com/favicon.ico',\n};\n\ninterface PlayQueueTableRowProps {\n\titem: IPlayQueueItemStore;\n}\n\nconst PlayQueueTableRow = observer(\n\t({ item }: PlayQueueTableRowProps): ReactElement => {\n\t\tconst diva = useNostalgicDiva();\n\n\t\treturn (\n\t\t\t<EuiTableRow key={item.id} isSelected={item.isCurrent}>\n\t\t\t\t<EuiTableRowCellCheckbox>\n\t\t\t\t\t<EuiCheckbox\n\t\t\t\t\t\tid={item.id.toString() /* TODO */}\n\t\t\t\t\t\tchecked={item.isSelected}\n\t\t\t\t\t\tonChange={item.toggleSelected}\n\t\t\t\t\t/>\n\t\t\t\t</EuiTableRowCellCheckbox>\n\t\t\t\t<EuiTableRowCell textOnly={false}>\n\t\t\t\t\t<img\n\t\t\t\t\t\tsrc={videoServiceIcons[item.type]}\n\t\t\t\t\t\twidth={16}\n\t\t\t\t\t\theight={16}\n\t\t\t\t\t\talt={item.type /* TODO */}\n\t\t\t\t\t/>\n\t\t\t\t</EuiTableRowCell>\n\t\t\t\t<EuiTableRowCell>\n\t\t\t\t\t<EuiLink\n\t\t\t\t\t\thref={item.url}\n\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\texternal\n\t\t\t\t\t\tonClick={(): Promise<void> => diva.pause()}\n\t\t\t\t\t>\n\t\t\t\t\t\t{item.title}\n\t\t\t\t\t</EuiLink>\n\t\t\t\t</EuiTableRowCell>\n\t\t\t\t<PlayQueueTableRowActionsCell item={item} />\n\t\t\t</EuiTableRow>\n\t\t);\n\t},\n);\n\ninterface PlayQueueTableBodyProps {\n\tplayQueueStore: PlayQueueStore;\n}\n\nconst PlayQueueTableBody = observer(\n\t({ playQueueStore }: PlayQueueTableBodyProps): ReactElement => {\n\t\treturn (\n\t\t\t<ReactSortable\n\t\t\t\ttag=\"tbody\"\n\t\t\t\tlist={playQueueStore.items}\n\t\t\t\tsetList={(items): void => playQueueStore.setItems(items)}\n\t\t\t>\n\t\t\t\t{playQueueStore.items.map((item) => (\n\t\t\t\t\t<PlayQueueTableRow key={item.id} item={item} />\n\t\t\t\t))}\n\t\t\t</ReactSortable>\n\t\t);\n\t},\n);\n\ninterface PlayQueueTableProps {\n\tplayQueueStore: PlayQueueStore;\n}\n\nexport const PlayQueueTable = observer(\n\t({ playQueueStore }: PlayQueueTableProps): ReactElement => {\n\t\treturn (\n\t\t\t<EuiTable>\n\t\t\t\t<PlayQueueTableHeader playQueueStore={playQueueStore} />\n\t\t\t\t<PlayQueueTableBody playQueueStore={playQueueStore} />\n\t\t\t</EuiTable>\n\t\t);\n\t},\n);\n","import {\n\tEuiButton,\n\tEuiCodeBlock,\n\tEuiFlexGroup,\n\tEuiFlexItem,\n\tEuiFlyout,\n\tEuiPageTemplate,\n\tEuiSpacer,\n\tuseEuiTheme,\n} from '@elastic/eui';\nimport {\n\tAddRegular,\n\tDeleteRegular,\n\tDismissRegular,\n} from '@fluentui/react-icons';\nimport { observer } from 'mobx-react-lite';\nimport { ReactElement, useState } from 'react';\n\nimport { AddVideoButton } from '@/features/media-player/components/AddVideoButton';\nimport { PlayQueueTable } from '@/features/media-player/components/PlayQueueTable';\nimport { PlayerStore } from '@/features/media-player/stores/PlayerStore';\nimport { PlayQueueStore } from '@/features/media-player/stores/PlayQueueStore';\n\ninterface DeveloperToolsButtonProps {\n\tplayQueueStore: PlayQueueStore;\n}\n\nconst DeveloperToolsButton = observer(\n\t({ playQueueStore }: DeveloperToolsButtonProps): ReactElement => {\n\t\tconst [isFlyoutVisible, setIsFlyoutVisible] = useState(false);\n\n\t\treturn (\n\t\t\t<>\n\t\t\t\t{isFlyoutVisible && (\n\t\t\t\t\t<EuiFlyout\n\t\t\t\t\t\ttype=\"push\"\n\t\t\t\t\t\tsize=\"s\"\n\t\t\t\t\t\tonClose={(): void => setIsFlyoutVisible(false)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<div style={{ blockSize: '100%' }}>\n\t\t\t\t\t\t\t<EuiCodeBlock\n\t\t\t\t\t\t\t\tlanguage=\"json\"\n\t\t\t\t\t\t\t\toverflowHeight=\"100%\"\n\t\t\t\t\t\t\t\tisCopyable\n\t\t\t\t\t\t\t\tisVirtualized\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{JSON.stringify(\n\t\t\t\t\t\t\t\t\tplayQueueStore.localStorageState,\n\t\t\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t\t\t2,\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</EuiCodeBlock>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</EuiFlyout>\n\t\t\t\t)}\n\n\t\t\t\t<AddVideoButton playQueueStore={playQueueStore} />\n\t\t\t</>\n\t\t);\n\t},\n);\n\ninterface PlayQueueProps {\n\tplayerStore: PlayerStore;\n\tplayQueueStore: PlayQueueStore;\n}\n\nconst PlayQueue = observer(\n\t({ playerStore, playQueueStore }: PlayQueueProps): ReactElement => {\n\t\tconst { euiTheme } = useEuiTheme();\n\n\t\treturn (\n\t\t\t<>\n\t\t\t\t<EuiFlexGroup\n\t\t\t\t\talignItems=\"center\"\n\t\t\t\t\tgutterSize=\"m\"\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tposition: 'sticky',\n\t\t\t\t\t\ttop: 48,\n\t\t\t\t\t\tzIndex: 998,\n\t\t\t\t\t\tbackground: euiTheme.colors.backgroundBasePlain,\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<EuiFlexItem grow={false}>\n\t\t\t\t\t\t<EuiButton\n\t\t\t\t\t\t\tdisabled={\n\t\t\t\t\t\t\t\tplayQueueStore.isEmpty ||\n\t\t\t\t\t\t\t\tplayQueueStore.selectedItems.length === 0\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tonClick={playQueueStore.playSelectedItemsNext}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tPlay next{/* LOC */}\n\t\t\t\t\t\t</EuiButton>\n\t\t\t\t\t</EuiFlexItem>\n\t\t\t\t\t<EuiFlexItem grow={false}>\n\t\t\t\t\t\t<EuiButton\n\t\t\t\t\t\t\ticonType={AddRegular}\n\t\t\t\t\t\t\tonClick={playQueueStore.addSelectedItems}\n\t\t\t\t\t\t\tdisabled={\n\t\t\t\t\t\t\t\tplayQueueStore.isEmpty ||\n\t\t\t\t\t\t\t\tplayQueueStore.selectedItems.length === 0\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tAdd to play queue{/* LOC */}\n\t\t\t\t\t\t</EuiButton>\n\t\t\t\t\t</EuiFlexItem>\n\t\t\t\t\t<EuiFlexItem grow={false}>\n\t\t\t\t\t\t<EuiButton\n\t\t\t\t\t\t\ticonType={DismissRegular}\n\t\t\t\t\t\t\tonClick={playQueueStore.removeSelectedItems}\n\t\t\t\t\t\t\tdisabled={\n\t\t\t\t\t\t\t\tplayQueueStore.isEmpty ||\n\t\t\t\t\t\t\t\tplayQueueStore.selectedItems.length === 0\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tRemove{/* LOC */}\n\t\t\t\t\t\t</EuiButton>\n\t\t\t\t\t</EuiFlexItem>\n\t\t\t\t\t<EuiFlexItem grow={false}>\n\t\t\t\t\t\t<EuiButton\n\t\t\t\t\t\t\ticonType={DeleteRegular}\n\t\t\t\t\t\t\tonClick={playQueueStore.clear}\n\t\t\t\t\t\t\tdisabled={playQueueStore.isEmpty}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tClear{/* LOC */}\n\t\t\t\t\t\t</EuiButton>\n\t\t\t\t\t</EuiFlexItem>\n\t\t\t\t\t<EuiFlexItem grow={true} />\n\t\t\t\t\t<EuiFlexItem grow={false}>\n\t\t\t\t\t\t<DeveloperToolsButton playQueueStore={playQueueStore} />\n\t\t\t\t\t</EuiFlexItem>\n\t\t\t\t</EuiFlexGroup>\n\n\t\t\t\t{!playQueueStore.isEmpty && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<EuiSpacer\n\t\t\t\t\t\t\tsize=\"l\"\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\tposition: 'sticky',\n\t\t\t\t\t\t\t\ttop: 48 + 40,\n\t\t\t\t\t\t\t\tzIndex: 998,\n\t\t\t\t\t\t\t\tbackground: euiTheme.colors.backgroundBasePlain,\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\n\t\t\t\t\t\t<PlayQueueTable playQueueStore={playQueueStore} />\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t</>\n\t\t);\n\t},\n);\n\ninterface HydrangeanDivaProps {\n\tplayerStore: PlayerStore;\n\tplayQueueStore: PlayQueueStore;\n}\n\nexport const HydrangeanDiva = observer(\n\t({ playerStore, playQueueStore }: HydrangeanDivaProps): ReactElement => {\n\t\treturn (\n\t\t\t<>\n\t\t\t\t<EuiPageTemplate.Header\n\t\t\t\t\tpageTitle=\"Play queue\" /* LOC */\n\t\t\t\t\trightSideItems={[]}\n\t\t\t\t/>\n\n\t\t\t\t<EuiPageTemplate.Section>\n\t\t\t\t\t<PlayQueue\n\t\t\t\t\t\tplayerStore={playerStore}\n\t\t\t\t\t\tplayQueueStore={playQueueStore}\n\t\t\t\t\t/>\n\t\t\t\t</EuiPageTemplate.Section>\n\t\t\t</>\n\t\t);\n\t},\n);\n","import {\n\tNostalgicDiva,\n\tPlayerOptions,\n\tuseNostalgicDiva,\n} from '@aigamo/nostalgic-diva';\nimport { observer } from 'mobx-react-lite';\nimport { ReactElement, useCallback, useMemo } from 'react';\n\nimport { bottomBarHeight } from '@/features/media-player/components/BottomBar';\nimport { PlayerStore } from '@/features/media-player/stores/PlayerStore';\nimport { PlayQueueStore } from '@/features/media-player/stores/PlayQueueStore';\nimport { RepeatMode } from '@/features/media-player/stores/RepeatMode';\n\nexport const miniPlayerSize = {\n\twidth: 16 * 25,\n\theight: 9 * 25,\n} as const;\n\ninterface MiniPlayerProps {\n\tplayerStore: PlayerStore;\n\tplayQueueStore: PlayQueueStore;\n}\n\nexport const MiniPlayer = observer(\n\t({ playerStore, playQueueStore }: MiniPlayerProps): ReactElement => {\n\t\tconst diva = useNostalgicDiva();\n\n\t\tconst handleLoaded = useCallback(async (): Promise<void> => {\n\t\t\tif (!playQueueStore.interacted) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tawait diva.play();\n\t\t}, [playQueueStore, diva]);\n\n\t\tconst handleEnded = useCallback(async (): Promise<void> => {\n\t\t\tswitch (playQueueStore.repeat) {\n\t\t\t\tcase RepeatMode.One:\n\t\t\t\t\tawait diva.setCurrentTime(0);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase RepeatMode.Off:\n\t\t\t\tcase RepeatMode.All:\n\t\t\t\t\tif (playQueueStore.isLastItem) {\n\t\t\t\t\t\tswitch (playQueueStore.repeat) {\n\t\t\t\t\t\t\tcase RepeatMode.Off:\n\t\t\t\t\t\t\t\tplayerStore.onEnded();\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase RepeatMode.All:\n\t\t\t\t\t\t\t\tif (playQueueStore.hasMultipleItems) {\n\t\t\t\t\t\t\t\t\tawait playQueueStore.goToFirst();\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tawait diva.setCurrentTime(0);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tawait playQueueStore.next();\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}, [playQueueStore, playerStore, diva]);\n\n\t\tconst options = useMemo(\n\t\t\t(): PlayerOptions => ({\n\t\t\t\tonLoaded: handleLoaded,\n\t\t\t\tonPlay: playerStore.onPlay,\n\t\t\t\tonPause: playerStore.onPause,\n\t\t\t\tonEnded: handleEnded,\n\t\t\t\tonTimeUpdate: playerStore.onTimeUpdate,\n\t\t\t}),\n\t\t\t[playerStore, handleLoaded, handleEnded],\n\t\t);\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tcss={{\n\t\t\t\t\tposition: 'fixed',\n\t\t\t\t\tright: 0,\n\t\t\t\t\tbottom: bottomBarHeight,\n\t\t\t\t\twidth: miniPlayerSize.width,\n\t\t\t\t\theight: miniPlayerSize.height,\n\t\t\t\t\tzIndex: 998,\n\t\t\t\t\tbackgroundColor: 'rgb(39, 39, 39)',\n\t\t\t\t\tdisplay: 'flex',\n\t\t\t\t\tflexDirection: 'column',\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<div css={{ flexGrow: 1, backgroundColor: 'black' }}>\n\t\t\t\t\t{playQueueStore.currentItem && (\n\t\t\t\t\t\t<NostalgicDiva\n\t\t\t\t\t\t\tsrc={playQueueStore.currentItem.url}\n\t\t\t\t\t\t\toptions={options}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t);\n\t},\n);\n","import { AnnotationsMap, makeObservable } from 'mobx';\n\nimport { IObservableStateProvider } from '@/features/media-player/stores/IObservableStateProvider';\n\nexport class MobXObservableStateProvider implements IObservableStateProvider {\n\tmakeObservable<\n\t\tT extends object,\n\t\tAdditionalKeys extends PropertyKey = never,\n\t>(target: T, annotations?: AnnotationsMap<T, AdditionalKeys>): T {\n\t\treturn makeObservable(target, annotations);\n\t}\n}\n","import { PlayerType } from '@aigamo/nostalgic-diva';\nimport { action, computed, observable } from 'mobx';\n\nimport { IObservableStateProvider } from '@/features/media-player/stores/IObservableStateProvider';\nimport {\n\tIPlayQueueItemStore,\n\tPlayQueueItemDto,\n} from '@/features/media-player/stores/IPlayQueueItemStore';\nimport { IPlayQueueStore } from '@/features/media-player/stores/IPlayQueueStore';\nimport { PlayQueueStore } from '@/features/media-player/stores/PlayQueueStore';\n\nexport class PlayQueueItemStore implements IPlayQueueItemStore {\n\tstatic nextId = 1;\n\n\treadonly id: number;\n\tisSelected = false;\n\n\tconstructor(\n\t\treadonly observableStateProvider: IObservableStateProvider,\n\t\treadonly playQueueStore: IPlayQueueStore,\n\t\treadonly dto: PlayQueueItemDto,\n\t) {\n\t\tthis.id = PlayQueueItemStore.nextId++;\n\n\t\tobservableStateProvider.makeObservable(this, {\n\t\t\tisSelected: observable,\n\t\t\tisCurrent: computed,\n\t\t\tindex: computed,\n\t\t\tisFirst: computed,\n\t\t\tisLast: computed,\n\t\t\tcanMoveToTop: computed,\n\t\t\tcanMoveToBottom: computed,\n\t\t\tcanRemoveToTop: computed,\n\t\t\tcanRemoveOthers: computed,\n\t\t\tunselect: action,\n\t\t\ttoggleSelected: action.bound,\n\t\t\tplay: action,\n\t\t\tremove: action.bound,\n\t\t\tplayFirst: action.bound,\n\t\t\tplayNext: action.bound,\n\t\t\taddToPlayQueue: action.bound,\n\t\t\tmoveToTop: action.bound,\n\t\t\tmoveToBottom: action.bound,\n\t\t\tremoveToTop: action.bound,\n\t\t\tremoveOthers: action.bound,\n\t\t});\n\t}\n\n\tstatic fromDto(\n\t\tobservableStateProvider: IObservableStateProvider,\n\t\tplayQueueStore: PlayQueueStore,\n\t\tdto: PlayQueueItemDto,\n\t): IPlayQueueItemStore {\n\t\treturn new PlayQueueItemStore(\n\t\t\tobservableStateProvider,\n\t\t\tplayQueueStore,\n\t\t\tdto,\n\t\t);\n\t}\n\n\tget url(): string {\n\t\treturn this.dto.url;\n\t}\n\n\tget type(): PlayerType {\n\t\treturn this.dto.type;\n\t}\n\n\tget videoId(): string {\n\t\treturn this.dto.videoId;\n\t}\n\n\tget title(): string {\n\t\treturn this.dto.title;\n\t}\n\n\tget isCurrent(): boolean {\n\t\treturn this.playQueueStore.currentItem === this;\n\t}\n\n\tget index(): number {\n\t\treturn this.playQueueStore.items.indexOf(this);\n\t}\n\n\tget isFirst(): boolean {\n\t\treturn this.index === 0;\n\t}\n\n\tget isLast(): boolean {\n\t\treturn this.index === this.playQueueStore.items.length - 1;\n\t}\n\n\tget canMoveToTop(): boolean {\n\t\treturn !this.isFirst;\n\t}\n\n\tget canMoveToBottom(): boolean {\n\t\treturn !this.isLast;\n\t}\n\n\tget canRemoveToTop(): boolean {\n\t\treturn !this.isFirst;\n\t}\n\n\tget canRemoveOthers(): boolean {\n\t\treturn this.playQueueStore.hasMultipleItems;\n\t}\n\n\tclone(): IPlayQueueItemStore {\n\t\treturn this.playQueueStore.createItem(this.dto);\n\t}\n\n\tunselect(): void {\n\t\tthis.isSelected = false;\n\t}\n\n\ttoggleSelected(): void {\n\t\tthis.isSelected = !this.isSelected;\n\t}\n\n\tplay(): void {\n\t\tthis.playQueueStore.setCurrentItem(this);\n\t}\n\n\tremove(): Promise<void> {\n\t\treturn this.playQueueStore.removeItems([this]);\n\t}\n\n\tasync playFirst(): Promise<void> {\n\t\tawait this.playQueueStore.playFirst([this.clone()]);\n\t}\n\n\tasync playNext(): Promise<void> {\n\t\tawait this.playQueueStore.playNext([this.clone()]);\n\t}\n\n\tasync addToPlayQueue(): Promise<void> {\n\t\tawait this.playQueueStore.addItems([this.clone()]);\n\t}\n\n\tmoveToTop(): void {\n\t\tthis.playQueueStore.moveItem(this, 0);\n\t}\n\n\tmoveToBottom(): void {\n\t\tthis.playQueueStore.moveItem(\n\t\t\tthis,\n\t\t\tthis.playQueueStore.items.length - 1,\n\t\t);\n\t}\n\n\tremoveToTop(): Promise<void> {\n\t\treturn this.playQueueStore.removeItemsAbove(this);\n\t}\n\n\tremoveOthers(): Promise<void> {\n\t\treturn this.playQueueStore.removeOtherItems(this);\n\t}\n}\n","import Ajv, { JSONSchemaType, ValidateFunction } from 'ajv';\n\nconst ajv = new Ajv({\n\tcoerceTypes: true,\n});\n\nexport function getOrAddSchema<T>(\n\tschema: JSONSchemaType<T>,\n\tkeyRef: string,\n): ValidateFunction<T> {\n\t// https://ajv.js.org/guide/managing-schemas.html#pre-adding-all-schemas-vs-adding-on-demand\n\tlet validate: ValidateFunction<T> | undefined;\n\tvalidate = ajv.getSchema(keyRef);\n\tif (validate === undefined) {\n\t\tajv.addSchema(schema, keyRef);\n\t\tvalidate = ajv.getSchema(keyRef);\n\t}\n\n\tif (validate === undefined || validate.schema !== schema) {\n\t\tthrow new Error(\n\t\t\t`Invalid schema. Expected: '${JSON.stringify(\n\t\t\t\tschema,\n\t\t\t)}', but got '${JSON.stringify(validate?.schema)}'.`,\n\t\t);\n\t}\n\n\treturn validate;\n}\n","import { JSONSchemaType } from 'ajv';\n\nimport { getOrAddSchema } from '@/features/media-player/stores/getOrAddSchema';\nimport { PlayQueueItemDto } from '@/features/media-player/stores/IPlayQueueItemStore';\nimport { RepeatMode } from '@/features/media-player/stores/RepeatMode';\n\nexport interface PlayQueueLocalStorageState {\n\tversion?: '1.0';\n\trepeat?: RepeatMode;\n\tshuffle?: boolean;\n\titems?: PlayQueueItemDto[];\n\tcurrentIndex?: number;\n}\n\nconst PlayQueueLocalStorageStateSchema: JSONSchemaType<PlayQueueLocalStorageState> =\n\t{\n\t\ttype: 'object',\n\t\tproperties: {\n\t\t\tversion: {\n\t\t\t\ttype: 'string',\n\t\t\t\tnullable: true,\n\t\t\t},\n\t\t\trepeat: {\n\t\t\t\ttype: 'string',\n\t\t\t\tenum: Object.values(RepeatMode),\n\t\t\t\tnullable: true,\n\t\t\t},\n\t\t\tshuffle: {\n\t\t\t\ttype: 'boolean',\n\t\t\t\tnullable: true,\n\t\t\t},\n\t\t\titems: {\n\t\t\t\ttype: 'array',\n\t\t\t\tnullable: true,\n\t\t\t\titems: {\n\t\t\t\t\ttype: 'object',\n\t\t\t\t\tproperties: {\n\t\t\t\t\t\turl: {\n\t\t\t\t\t\t\ttype: 'string',\n\t\t\t\t\t\t},\n\t\t\t\t\t\ttype: {\n\t\t\t\t\t\t\ttype: 'string',\n\t\t\t\t\t\t},\n\t\t\t\t\t\tvideoId: {\n\t\t\t\t\t\t\ttype: 'string',\n\t\t\t\t\t\t},\n\t\t\t\t\t\ttitle: {\n\t\t\t\t\t\t\ttype: 'string',\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\trequired: ['url', 'type', 'videoId', 'title'],\n\t\t\t\t},\n\t\t\t},\n\t\t\tcurrentIndex: {\n\t\t\t\ttype: 'integer',\n\t\t\t\tnullable: true,\n\t\t\t},\n\t\t},\n\t};\n\nexport const validatePlayQueueLocalStorageState = getOrAddSchema(\n\tPlayQueueLocalStorageStateSchema,\n\t'PlayQueueStore',\n);\n","import { LocalStorageStateStore } from '@aigamo/route-sphere';\nimport { pull } from 'lodash-es';\nimport { action, computed, observable } from 'mobx';\n\nimport { IObservableStateProvider } from '@/features/media-player/stores/IObservableStateProvider';\nimport {\n\tIPlayQueueItemStore,\n\tPlayQueueItemDto,\n} from '@/features/media-player/stores/IPlayQueueItemStore';\nimport { IPlayQueueStore } from '@/features/media-player/stores/IPlayQueueStore';\nimport { PlayQueueItemStore } from '@/features/media-player/stores/PlayQueueItemStore';\nimport {\n\tPlayQueueLocalStorageState,\n\tvalidatePlayQueueLocalStorageState,\n} from '@/features/media-player/stores/PlayQueueLocalStorageState';\nimport { RepeatMode } from '@/features/media-player/stores/RepeatMode';\n\nexport class PlayQueueStore\n\timplements\n\t\tIPlayQueueStore,\n\t\tLocalStorageStateStore<PlayQueueLocalStorageState>\n{\n\tinteracted = false;\n\titems: IPlayQueueItemStore[] = [];\n\tcurrentId: number | undefined;\n\trepeat = RepeatMode.Off;\n\tshuffle = false;\n\n\tconstructor(readonly observableStateProvider: IObservableStateProvider) {\n\t\tobservableStateProvider.makeObservable(this, {\n\t\t\tinteracted: observable,\n\t\t\titems: observable,\n\t\t\tcurrentId: observable,\n\t\t\trepeat: observable,\n\t\t\tshuffle: observable,\n\t\t\tlocalStorageState: computed.struct,\n\t\t\tisEmpty: computed,\n\t\t\tcurrentItem: computed,\n\t\t\tcanPlay: computed,\n\t\t\tcanPause: computed,\n\t\t\thasMultipleItems: computed,\n\t\t\tcurrentIndex: computed,\n\t\t\thasPreviousItem: computed,\n\t\t\thasNextItem: computed,\n\t\t\tisLastItem: computed,\n\t\t\tselectedItems: computed,\n\t\t\tallItemsSelected: computed,\n\t\t\tselectedItemsOrAllItems: computed,\n\t\t\tsetItems: action,\n\t\t\tinteract: action,\n\t\t\tclear: action.bound,\n\t\t\tunselectAll: action,\n\t\t\tsetCurrentItem: action,\n\t\t\tsetNextItems: action,\n\t\t\tclearAndSetItems: action,\n\t\t\tplayNext: action,\n\t\t\tplaySelectedItemsNext: action.bound,\n\t\t\taddItems: action,\n\t\t\taddSelectedItems: action.bound,\n\t\t\tplayFirst: action,\n\t\t\tmoveItem: action,\n\t\t\tremoveItems: action,\n\t\t\tremoveSelectedItems: action.bound,\n\t\t\tremoveOtherItems: action,\n\t\t\tremoveItemsAbove: action,\n\t\t\ttoggleRepeat: action.bound,\n\t\t\ttoggleShuffle: action.bound,\n\t\t\tprevious: action,\n\t\t\tnext: action.bound,\n\t\t\tgoToFirst: action,\n\t\t});\n\t}\n\n\tcreateItem(dto: PlayQueueItemDto): IPlayQueueItemStore {\n\t\treturn PlayQueueItemStore.fromDto(\n\t\t\tthis.observableStateProvider,\n\t\t\tthis,\n\t\t\tdto,\n\t\t);\n\t}\n\n\tget localStorageState(): PlayQueueLocalStorageState {\n\t\treturn {\n\t\t\tversion: '1.0',\n\t\t\trepeat: this.repeat,\n\t\t\tshuffle: this.shuffle,\n\t\t\titems: this.items.map((item) => item.dto),\n\t\t\tcurrentIndex: this.currentIndex,\n\t\t};\n\t}\n\tset localStorageState(value: PlayQueueLocalStorageState) {\n\t\tthis.repeat = value.repeat ?? RepeatMode.Off;\n\t\tthis.shuffle = value.shuffle ?? false;\n\t\tthis.items = value.items?.map((item) => this.createItem(item)) ?? [];\n\t\tthis.currentIndex = value.currentIndex;\n\t}\n\n\tvalidateLocalStorageState(\n\t\tlocalStorageState: any,\n\t): localStorageState is PlayQueueLocalStorageState {\n\t\treturn validatePlayQueueLocalStorageState(localStorageState);\n\t}\n\n\tget isEmpty(): boolean {\n\t\treturn this.items.length === 0;\n\t}\n\n\tget currentItem(): IPlayQueueItemStore | undefined {\n\t\treturn this.items.find((item) => item.id === this.currentId);\n\t}\n\n\tget canPlay(): boolean {\n\t\treturn this.currentItem !== undefined;\n\t}\n\n\tget canPause(): boolean {\n\t\treturn this.currentItem !== undefined;\n\t}\n\n\tget hasMultipleItems(): boolean {\n\t\treturn this.items.length > 1;\n\t}\n\n\tget currentIndex(): number | undefined {\n\t\treturn this.currentId !== undefined\n\t\t\t? this.items.findIndex((item) => item.id === this.currentId)\n\t\t\t: undefined;\n\t}\n\tset currentIndex(value: number | undefined) {\n\t\tthis.currentId =\n\t\t\tvalue !== undefined ? this.items.at(value)?.id : undefined;\n\t}\n\n\tget hasPreviousItem(): boolean {\n\t\treturn (\n\t\t\tthis.hasMultipleItems &&\n\t\t\tthis.currentIndex !== undefined &&\n\t\t\tthis.currentIndex > 0\n\t\t);\n\t}\n\n\tget hasNextItem(): boolean {\n\t\treturn (\n\t\t\tthis.hasMultipleItems &&\n\t\t\tthis.currentIndex !== undefined &&\n\t\t\tthis.currentIndex < this.items.length - 1\n\t\t);\n\t}\n\n\tget isLastItem(): boolean {\n\t\treturn (\n\t\t\tthis.currentIndex !== undefined &&\n\t\t\tthis.currentIndex === this.items.length - 1\n\t\t);\n\t}\n\n\tget selectedItems(): IPlayQueueItemStore[] {\n\t\treturn this.items.filter((item) => item.isSelected);\n\t}\n\n\tget allItemsSelected(): boolean {\n\t\treturn this.selectedItems.length === this.items.length;\n\t}\n\tset allItemsSelected(value: boolean) {\n\t\tfor (const item of this.items) {\n\t\t\titem.isSelected = value;\n\t\t}\n\t}\n\n\tget selectedItemsOrAllItems(): IPlayQueueItemStore[] {\n\t\treturn this.selectedItems.length > 0 ? this.selectedItems : this.items;\n\t}\n\n\tsetItems(value: IPlayQueueItemStore[]): void {\n\t\tthis.items = value;\n\t}\n\n\tinteract(): void {\n\t\tthis.interacted = true;\n\t}\n\n\tclear(): void {\n\t\tthis.interact();\n\n\t\tthis.currentIndex = undefined;\n\t\tthis.items = [];\n\t}\n\n\tunselectAll(): void {\n\t\tfor (const item of this.items) {\n\t\t\titem.unselect();\n\t\t}\n\t}\n\n\tsetCurrentItem(item: IPlayQueueItemStore | undefined): void {\n\t\tthis.interact();\n\n\t\tthis.currentId = item?.id;\n\t}\n\n\tsetNextItems(items: IPlayQueueItemStore[]): void {\n\t\tif (this.currentIndex === undefined) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.items.splice(this.currentIndex + 1, 0, ...items);\n\t}\n\n\tclearAndSetItems(items: IPlayQueueItemStore[]): void {\n\t\tthis.clear();\n\n\t\tthis.setCurrentItem(items[0]);\n\n\t\tthis.setNextItems(items);\n\t}\n\n\tasync playNext(items: IPlayQueueItemStore[]): Promise<void> {\n\t\tif (this.isEmpty) {\n\t\t\tthis.clearAndSetItems(items);\n\t\t\treturn;\n\t\t}\n\n\t\tthis.setNextItems(items);\n\t}\n\n\tasync playSelectedItemsNext(): Promise<void> {\n\t\tawait this.playNext(\n\t\t\tthis.selectedItemsOrAllItems.map((item) => item.clone()),\n\t\t);\n\n\t\tthis.unselectAll();\n\t}\n\n\tasync addItems(items: IPlayQueueItemStore[]): Promise<void> {\n\t\tif (this.isEmpty) {\n\t\t\tthis.clearAndSetItems(items);\n\t\t\treturn;\n\t\t}\n\n\t\tthis.items.push(...items);\n\t}\n\n\tasync addSelectedItems(): Promise<void> {\n\t\tawait this.addItems(\n\t\t\tthis.selectedItemsOrAllItems.map((item) => item.clone()),\n\t\t);\n\n\t\tthis.unselectAll();\n\t}\n\n\tasync playFirst(items: IPlayQueueItemStore[]): Promise<void> {\n\t\tif (this.isEmpty) {\n\t\t\tthis.clearAndSetItems(items);\n\t\t\treturn;\n\t\t}\n\n\t\tconst { currentIndex } = this;\n\t\tif (currentIndex === undefined) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.interact();\n\n\t\tthis.items.splice(currentIndex, 0, ...items);\n\t\tthis.currentIndex = currentIndex;\n\t}\n\n\tmoveItem(item: IPlayQueueItemStore, index: number): void {\n\t\tconst element = this.items.splice(this.items.indexOf(item), 1)[0];\n\t\tthis.items.splice(index, 0, element);\n\t}\n\n\tasync removeItems(items: IPlayQueueItemStore[]): Promise<void> {\n\t\t// Note: We need to remove the current (if any) and other (previous and/or next) items separately,\n\t\t// so that the current index can be set properly even if the current item was removed.\n\n\t\t// Capture the current item.\n\t\tconst { currentItem } = this;\n\n\t\t// First, remove items that are not equal to the current one.\n\t\tpull(this.items, ...items.filter((item) => item !== currentItem));\n\n\t\t// Capture the current index.\n\t\tconst { currentIndex, isLastItem } = this;\n\n\t\t// Then, remove the current item if any.\n\t\tpull(\n\t\t\tthis.items,\n\t\t\titems.find((item) => item === currentItem),\n\t\t);\n\n\t\t// If the current item differs from the captured one, then it means that the current item was removed from the play queue.\n\t\tif (this.currentItem !== currentItem) {\n\t\t\tthis.interact();\n\n\t\t\tif (isLastItem) {\n\t\t\t\t// Start over the playlist from the beginning.\n\t\t\t\tawait this.goToFirst();\n\t\t\t} else {\n\t\t\t\t// Set the current index to the captured one.\n\t\t\t\tthis.currentIndex = currentIndex;\n\t\t\t}\n\t\t}\n\t}\n\n\tasync removeSelectedItems(): Promise<void> {\n\t\tawait this.removeItems(this.selectedItemsOrAllItems);\n\n\t\tthis.unselectAll();\n\t}\n\n\tasync removeOtherItems(item: IPlayQueueItemStore): Promise<void> {\n\t\tconst itemId = item.id;\n\t\treturn this.removeItems(\n\t\t\tthis.items.filter((item) => item.id !== itemId),\n\t\t);\n\t}\n\n\tasync removeItemsAbove(item: IPlayQueueItemStore): Promise<void> {\n\t\tconst itemIndex = this.items.indexOf(item);\n\t\treturn this.removeItems(\n\t\t\tthis.items.filter((_, index) => index < itemIndex),\n\t\t);\n\t}\n\n\ttoggleRepeat(): void {\n\t\tswitch (this.repeat) {\n\t\t\tcase RepeatMode.Off:\n\t\t\t\tthis.repeat = RepeatMode.All;\n\t\t\t\tbreak;\n\t\t\tcase RepeatMode.All:\n\t\t\t\tthis.repeat = RepeatMode.One;\n\t\t\t\tbreak;\n\t\t\tcase RepeatMode.One:\n\t\t\t\tthis.repeat = RepeatMode.Off;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\ttoggleShuffle(): void {\n\t\tthis.shuffle = !this.shuffle;\n\t}\n\n\tasync previous(): Promise<void> {\n\t\tif (this.currentIndex === undefined) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!this.hasPreviousItem) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.interact();\n\n\t\tthis.currentIndex--;\n\t}\n\n\tasync next(): Promise<void> {\n\t\tif (this.currentIndex === undefined) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!this.hasNextItem) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.interact();\n\n\t\tthis.currentIndex++;\n\t}\n\n\tasync goToFirst(): Promise<void> {\n\t\tif (this.currentIndex === undefined) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.currentIndex = 0;\n\t}\n}\n","import { useNostalgicDiva } from '@aigamo/nostalgic-diva';\nimport { reaction } from 'mobx';\nimport {\n\tcreateContext,\n\tReactElement,\n\tReactNode,\n\tuseContext,\n\tuseEffect,\n\tuseState,\n} from 'react';\n\nimport { MobXObservableStateProvider } from '@/features/media-player/stores/MobXObservableStateProvider';\nimport { PlayQueueStore } from '@/features/media-player/stores/PlayQueueStore';\n\n// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\nconst PlayQueueStoreContext = createContext<PlayQueueStore>(undefined!);\n\ninterface PlayQueueStoreProviderProps {\n\tchildren?: ReactNode;\n}\n\nexport const PlayQueueStoreProvider = ({\n\tchildren,\n}: PlayQueueStoreProviderProps): ReactElement => {\n\tconst [playQueueStore] = useState(\n\t\t() => new PlayQueueStore(new MobXObservableStateProvider()),\n\t);\n\n\tconst diva = useNostalgicDiva();\n\n\tuseEffect(() => {\n\t\treturn reaction(\n\t\t\t() => playQueueStore.currentItem,\n\t\t\tasync (currentItem, previousItem) => {\n\t\t\t\tif (currentItem === undefined || previousItem === undefined) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\tcurrentItem.type === previousItem.type &&\n\t\t\t\t\tcurrentItem.videoId === previousItem.videoId\n\t\t\t\t) {\n\t\t\t\t\tawait diva.setCurrentTime(0);\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\t}, [playQueueStore, diva]);\n\n\treturn (\n\t\t<PlayQueueStoreContext.Provider value={playQueueStore}>\n\t\t\t{children}\n\t\t</PlayQueueStoreContext.Provider>\n\t);\n};\n\nexport const usePlayQueueStore = (): PlayQueueStore => {\n\treturn useContext(PlayQueueStoreContext);\n};\n","import { EuiPageTemplate, EuiSpacer } from '@elastic/eui';\nimport { observer } from 'mobx-react-lite';\nimport { ReactElement, ReactNode } from 'react';\n\nimport { bottomBarHeight } from '@/features/media-player/components/BottomBar';\nimport { miniPlayerSize } from '@/features/media-player/components/MiniPlayer';\nimport { usePlayQueueStore } from '@/features/media-player/components/PlayQueueStoreContext';\n\ninterface MediaPlayerLayoutProps {\n\tchildren?: ReactNode;\n}\n\nexport const MediaPlayerLayout = observer(\n\t({ children }: MediaPlayerLayoutProps): ReactElement => {\n\t\tconst playQueueStore = usePlayQueueStore();\n\n\t\treturn (\n\t\t\t<EuiPageTemplate\n\t\t\t\tpanelled\n\t\t\t\tstyle={{\n\t\t\t\t\tminBlockSize: `max(460px, 100vh - ${bottomBarHeight}px)`,\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t{children}\n\n\t\t\t\t{!playQueueStore.isEmpty && (\n\t\t\t\t\t<EuiSpacer style={{ blockSize: miniPlayerSize.height }} />\n\t\t\t\t)}\n\t\t\t</EuiPageTemplate>\n\t\t);\n\t},\n);\n","import { TimeEvent } from '@aigamo/nostalgic-diva';\nimport { action, observable } from 'mobx';\n\nimport { IObservableStateProvider } from '@/features/media-player/stores/IObservableStateProvider';\n\nexport class PlayerStore {\n\tplaying = false;\n\tpercent = 0;\n\tseeking = false;\n\n\tconstructor(observableStateProvider: IObservableStateProvider) {\n\t\tobservableStateProvider.makeObservable(this, {\n\t\t\tplaying: observable,\n\t\t\tpercent: observable,\n\t\t\tseeking: observable,\n\t\t\tsetPlaying: action,\n\t\t\tsetPercent: action,\n\t\t\tsetSeeking: action,\n\t\t\tonPlay: action.bound,\n\t\t\tonPause: action.bound,\n\t\t\tonEnded: action.bound,\n\t\t\tonTimeUpdate: action.bound,\n\t\t});\n\t}\n\n\tsetPlaying(value: boolean): void {\n\t\tthis.playing = value;\n\t}\n\n\tsetPercent(value: number): void {\n\t\tthis.percent = value;\n\t}\n\n\tsetSeeking(value: boolean): void {\n\t\tthis.seeking = value;\n\t}\n\n\tonPlay(): void {\n\t\tthis.playing = true;\n\t}\n\n\tonPause(): void {\n\t\tthis.playing = false;\n\t}\n\n\tonEnded(): void {\n\t\tthis.playing = false;\n\t}\n\n\tonTimeUpdate({ percent }: TimeEvent): void {\n\t\tif (percent !== undefined) {\n\t\t\tif (!this.seeking) {\n\t\t\t\tthis.percent = percent;\n\t\t\t}\n\t\t}\n\n\t\t// TODO\n\t}\n}\n","import {\n\tcreateContext,\n\tReactElement,\n\tReactNode,\n\tuseContext,\n\tuseState,\n} from 'react';\n\nimport { MobXObservableStateProvider } from '@/features/media-player/stores/MobXObservableStateProvider';\nimport { PlayerStore } from '@/features/media-player/stores/PlayerStore';\n\n// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\nconst PlayerStoreContext = createContext<PlayerStore>(undefined!);\n\ninterface PlayerStoreProviderProps {\n\tchildren?: ReactNode;\n}\n\nexport const PlayerStoreProvider = ({\n\tchildren,\n}: PlayerStoreProviderProps): ReactElement => {\n\tconst [playerStore] = useState(\n\t\t() => new PlayerStore(new MobXObservableStateProvider()),\n\t);\n\n\treturn (\n\t\t<PlayerStoreContext.Provider value={playerStore}>\n\t\t\t{children}\n\t\t</PlayerStoreContext.Provider>\n\t);\n};\n\nexport const usePlayerStore = (): PlayerStore => {\n\treturn useContext(PlayerStoreContext);\n};\n","import { AnnotationsMap } from 'mobx';\n\nimport { IObservableStateProvider } from '@/features/media-player/stores/IObservableStateProvider';\n\nexport class ObservableStateProvider implements IObservableStateProvider {\n\tmakeObservable<\n\t\tT extends object,\n\t\tAdditionalKeys extends PropertyKey = never,\n\t>(target: T, annotations?: AnnotationsMap<T, AdditionalKeys>): T {\n\t\treturn target;\n\t}\n}\n"],"names":["RepeatMode","bottomBarHeight","SeekBar","observer","playerStore","diva","useNostalgicDiva","handleChange","useCallback","e","percent","handleMouseDown","handleMouseUp","duration","React","EuiRange","VolumePopover","memo","button","isOpen","closePopover","value","setValue","useState","useLayoutEffect","volume","EuiPopover","EuiFormRow","EuiFlexGroup","EuiButtonIcon","Speaker2Regular","MoreOptionsContextMenu","playQueueStore","handleClickSkipBack10","currentTime","handleClickSkipForward30","handleClickPlaybackRate","playbackRate","handleClickRemoveFromPlayQueue","panels","useMemo","EuiIcon","TopSpeedRegular","SkipBack10Regular","SkipForward30Regular","DismissRegular","EuiContextMenu","MoreOptionsPopover","repeatIconTypes","ArrowRepeatAllOffFilled","ArrowRepeatAllFilled","ArrowRepeat1Filled","BottomBarCenterControls","handlePrevious","ArrowShuffleFilled","ArrowShuffleOffFilled","PreviousFilled","PauseFilled","PlayFilled","NextFilled","VolumeButton","isVolumePopoverOpen","setIsVolumePopoverOpen","toggleVolumePopover","MoreOptionsButton","isMoreOptionsPopoverOpen","setIsMoreOptionsPopoverOpen","toggleMoreOptionsPopover","MoreHorizontalFilled","BottomBarRightControls","BottomBar","EuiBottomBar","EuiFlexItem","AddVideoModal","onCancel","onSave","url","setUrl","title","setTitle","loading","setLoading","EuiModal","EuiModalHeader","EuiModalHeaderTitle","EuiModalBody","EuiForm","EuiFieldText","EuiModalFooter","EuiButtonEmpty","EuiButton","isNoembedResult","AddVideoButton","addVideoModalOpen","setAddVideoModalOpen","handleSave","videoService","findVideoService","videoId","jsonData","AddRegular","PlayQueueTableHeader","euiTheme","useEuiTheme","EuiTableHeader","EuiTableHeaderCellCheckbox","EuiCheckbox","EuiTableHeaderCell","PlayQueueTableRowContextMenuPanel","item","ContextMenuItem","onClick","props","handleClick","EuiContextMenuItem","EuiContextMenuPanel","EuiHorizontalRule","ArrowUploadRegular","ArrowDownloadRegular","PlayQueueTableRowPopover","setIsOpen","togglePopover","PlayQueueTableRowActionsCell","EuiTableRowCell","PlayRegular","videoServiceIcons","PlayQueueTableRow","EuiTableRow","EuiTableRowCellCheckbox","EuiLink","PlayQueueTableBody","ReactSortable","items","PlayQueueTable","EuiTable","DeveloperToolsButton","isFlyoutVisible","setIsFlyoutVisible","EuiFlyout","EuiCodeBlock","PlayQueue","DeleteRegular","EuiSpacer","HydrangeanDiva","EuiPageTemplate","miniPlayerSize","MiniPlayer","handleLoaded","handleEnded","options","NostalgicDiva","MobXObservableStateProvider","target","annotations","makeObservable","_PlayQueueItemStore","observableStateProvider","dto","__publicField","observable","computed","action","PlayQueueItemStore","ajv","Ajv","getOrAddSchema","schema","keyRef","validate","PlayQueueLocalStorageStateSchema","validatePlayQueueLocalStorageState","PlayQueueStore","_a","localStorageState","currentIndex","index","element","currentItem","pull","isLastItem","itemId","itemIndex","_","PlayQueueStoreContext","createContext","PlayQueueStoreProvider","children","useEffect","reaction","previousItem","usePlayQueueStore","useContext","MediaPlayerLayout","PlayerStore","PlayerStoreContext","PlayerStoreProvider","usePlayerStore","ObservableStateProvider"],"mappings":";;;;;;;;;;;;AAAY,IAAAA,sBAAAA,OACXA,EAAA,MAAM,OACNA,EAAA,MAAM,OACNA,EAAA,MAAM,OAHKA,IAAAA,KAAA,CAAA,CAAA;AC+CL,MAAMC,IAAkB,IAMzBC,KAAUC,EAAS,CAAC,EAAE,aAAAC,QAA8C;AACzE,QAAMC,IAAOC,EAAiB,GAExBC,IAAeC;AAAA,IACpB,CAACC,MAA+B;AAC/B,YAAMC,IAAU,OAAOD,EAAE,cAAc,KAAK,IAAI;AAChD,MAAAL,EAAY,WAAWM,CAAO;AAAA,IAC/B;AAAA,IACA,CAACN,CAAW;AAAA,EACb,GAEMO,IAAkBH;AAAA,IACvB,CAACC,MAA0C;AACtC,MAAAA,EAAE,WAAW,KAChBL,EAAY,WAAW,EAAI;AAAA,IAE7B;AAAA,IACA,CAACA,CAAW;AAAA,EACb,GAEMQ,IAAgBJ;AAAA,IACrB,OAAOC,MAA0C;AAC5C,UAAAA,EAAE,WAAW,GAAG;AACnB,cAAMC,IAAU,OAAOD,EAAE,cAAc,KAAK,IAAI;AAEhD,QAAAL,EAAY,WAAW,EAAK;AAEtB,cAAAS,IAAW,MAAMR,EAAK,YAAY;AACxC,QAAIQ,MAAa,UACV,MAAAR,EAAK,eAAeQ,IAAWH,CAAO;AAAA,MAC7C;AAAA,IAEF;AAAA,IACA,CAACN,GAAaC,CAAI;AAAA,EACnB;AAGC,SAAAS,gBAAAA,EAAA;AAAA,IAACC;AAAA,IAAA;AAAA,MACA,KAAK;AAAA,MACL,KAAK;AAAA,MACL,MAAM;AAAA,MACN,OAAOX,EAAY,UAAU;AAAA,MAC7B,UAAUG;AAAA,MACV,aAAaI;AAAA,MACb,WAAWC;AAAA,MACX,WAAS;AAAA,MACT,WAAS;AAAA,MACT,KAAK,EAAE,WAAW,GAAG;AAAA,IAAA;AAAA,EACtB;AAEF,CAAC,GAQKI,KAAgBC;AAAA,EACrB,CAAC,EAAE,QAAAC,GAAQ,QAAAC,GAAQ,cAAAC,QAAqD;AACvE,UAAM,CAACC,GAAOC,CAAQ,IAAIC,EAAS,GAAG,GAEhClB,IAAOC,EAAiB;AAE9B,IAAAkB,GAAgB,MAAM;AACrB,MAAIL,KACEd,EAAK,UAAA,EAAY,KAAK,CAACoB,MAAW;AACtC,QAAIA,MAAW,UACdH,EAAS,KAAK,MAAMG,IAAS,GAAG,EAAE,UAAU;AAAA,MAC7C,CACA;AAAA,IACF,GACE,CAACN,GAAQd,CAAI,CAAC;AAEjB,UAAME,IAAeC;AAAA,MACpB,OAAOC,MAA8C;AAC3C,QAAAa,EAAAb,EAAE,cAAc,KAAK,GAE9B,MAAMJ,EAAK,UAAU,OAAOI,EAAE,cAAc,KAAK,IAAI,GAAG;AAAA,MACzD;AAAA,MACA,CAACJ,CAAI;AAAA,IACN;AAGC,WAAAS,gBAAAA,EAAA;AAAA,MAACY;AAAA,MAAA;AAAA,QACA,QAAAR;AAAA,QACA,QAAAC;AAAA,QACA,cAAAC;AAAA,QACA,gBAAe;AAAA,MAAA;AAAA,sCAEdO,GACA,MAAAb,gBAAAA,EAAA;AAAA,QAACc;AAAA,QAAA;AAAA,UACA,YAAY;AAAA,UACZ,YAAW;AAAA,UACX,gBAAe;AAAA,UACf,YAAW;AAAA,QAAA;AAAA,QAEXd,gBAAAA,EAAA;AAAA,UAACe;AAAA,UAAA;AAAA,YACA,OAAM;AAAA,YACN,cAAW;AAAA,YACX,UAAUC;AAAA,YACV,MAAK;AAAA,YACL,UAAS;AAAA,UAAA;AAAA,QACV;AAAA,QACAhB,gBAAAA,EAAA;AAAA,UAACC;AAAA,UAAA;AAAA,YACA,KAAK;AAAA,YACL,KAAK;AAAA,YACL,MAAM;AAAA,YACN,OAAAM;AAAA,YACA,UAAUd;AAAA,YACV,KAAK,EAAE,WAAW,GAAG;AAAA,UAAA;AAAA,QAAA;AAAA,MAGxB,CAAA;AAAA,IACD;AAAA,EAAA;AAGH,GAOMwB,KAAyBd;AAAA,EAC9B,CAAC;AAAA,IACA,gBAAAe;AAAA,IACA,cAAAZ;AAAA,EAAA,MACgD;AAChD,UAAMf,IAAOC,EAAiB,GAExB2B,IAAwBzB,EAAY,YAAY;AAC/C,YAAA0B,IAAc,MAAM7B,EAAK,eAAe;AAE9C,MAAI6B,MAAgB,UACb,MAAA7B,EAAK,eAAe6B,IAAc,EAAE,GAG9Bd,EAAA;AAAA,IAAA,GACX,CAACf,GAAMe,CAAY,CAAC,GAEjBe,IAA2B3B,EAAY,YAAY;AAClD,YAAA0B,IAAc,MAAM7B,EAAK,eAAe;AAE9C,MAAI6B,MAAgB,UACb,MAAA7B,EAAK,eAAe6B,IAAc,EAAE,GAG9Bd,EAAA;AAAA,IAAA,GACX,CAACf,GAAMe,CAAY,CAAC,GAEjBgB,IAA0B5B;AAAA,MAC/B,OAAO6B,MAAwC;AACxC,cAAAhC,EAAK,gBAAgBgC,CAAY,GAE1BjB,EAAA;AAAA,MACd;AAAA,MACA,CAACf,GAAMe,CAAY;AAAA,IACpB,GAEMkB,IACL9B,EAAY,YAA2B;AAClC,MAAAwB,EAAe,gBAAgB,UAClC,MAAMA,EAAe,YAAY;AAAA,QAChCA,EAAe;AAAA,MAAA,CACf,GAGWZ,EAAA;AAAA,IAAA,GACX,CAACY,GAAgBZ,CAAY,CAAC,GAE5B,CAACiB,CAAY,IAAId,EAAiB,GAElCgB,IAASC;AAAA,MACd,MAAuC;AAAA,QACtC;AAAA,UACC,IAAI;AAAA,UACJ,OAAO;AAAA,YACN;AAAA,cACC,MAAM;AAAA,cACN,MAAO1B,gBAAAA,EAAA,cAAA2B,GAAA,EAAQ,MAAMC,IAAiB,MAAK,KAAI;AAAA,cAC/C,OAAO;AAAA,YACR;AAAA,YACA;AAAA,cACC,MAAM;AAAA,cACN,MAAO5B,gBAAAA,EAAA,cAAA2B,GAAA,EAAQ,MAAME,IAAmB,MAAK,KAAI;AAAA,cACjD,SAASV;AAAA,cACT,UAAUD,EAAe;AAAA,YAC1B;AAAA,YACA;AAAA,cACC,MAAM;AAAA,cACN,MACElB,gBAAAA,EAAA,cAAA2B,GAAA,EAAQ,MAAMG,IAAsB,MAAK,KAAI;AAAA,cAE/C,SAAST;AAAA,cACT,UAAUH,EAAe;AAAA,YAC1B;AAAA,YACA;AAAA,cACC,aAAa;AAAA,YACd;AAAA,YACA;AAAA,cACC,MAAM;AAAA,cACN,MAAOlB,gBAAAA,EAAA,cAAA2B,GAAA,EAAQ,MAAMI,GAAgB,MAAK,KAAI;AAAA,cAC9C,SAASP;AAAA,cACT,UAAUN,EAAe;AAAA,YAAA;AAAA,UAC1B;AAAA,QAEF;AAAA,QACA;AAAA,UACC,IAAI;AAAA,UACJ,OAAO;AAAA,UACP,OAAO,CAAC,MAAM,KAAK,MAAM,GAAG,MAAM,KAAK,MAAM,CAAC,EAAE;AAAA,YAC/C,CAACX,OAAW;AAAA,cACX,MAAMA,EAAM,SAAS;AAAA,cACrB,SAAS,MACRe,EAAwBf,CAAK;AAAA,cAC9B,MAAMA,MAAUgB,IAAe,UAAU;AAAA,YAC1C;AAAA,UAAA;AAAA,QACD;AAAA,MAEF;AAAA,MACA;AAAA,QACCL;AAAA,QACAC;AAAA,QACAE;AAAA,QACAG;AAAA,QACAF;AAAA,QACAC;AAAA,MAAA;AAAA,IAEF;AAEA,WAAQvB,gBAAAA,EAAA,cAAAgC,IAAA,EAAe,gBAAgB,GAAG,QAAAP,GAAgB;AAAA,EAAA;AAE5D,GASMQ,KAAqB9B;AAAA,EAC1B,CAAC;AAAA,IACA,gBAAAe;AAAA,IACA,QAAAd;AAAA,IACA,QAAAC;AAAA,IACA,cAAAC;AAAA,EAAA,MAGCN,gBAAAA,EAAA;AAAA,IAACY;AAAA,IAAA;AAAA,MACA,QAAAR;AAAA,MACA,QAAAC;AAAA,MACA,cAAAC;AAAA,MACA,kBAAiB;AAAA,MACjB,gBAAe;AAAA,IAAA;AAAA,IAEfN,gBAAAA,EAAA;AAAA,MAACiB;AAAA,MAAA;AAAA,QACA,gBAAAC;AAAA,QACA,cAAAZ;AAAA,MAAA;AAAA,IAAA;AAAA,EAEF;AAGH,GAEM4B,KAAgD;AAAA,EACrD,CAAChD,EAAW,GAAG,GAAGiD;AAAA,EAClB,CAACjD,EAAW,GAAG,GAAGkD;AAAA,EAClB,CAAClD,EAAW,GAAG,GAAGmD;AACnB,GAOMC,KAA0BjD;AAAA,EAC/B,CAAC;AAAA,IACA,aAAAC;AAAA,IACA,gBAAA4B;AAAA,EAAA,MACiD;AACjD,UAAM3B,IAAOC,EAAiB,GAExB+C,IAAiB7C,EAAY,YAAY;AAC9C,UAAIwB,EAAe,iBAAiB;AAC7B,cAAAE,IAAc,MAAM7B,EAAK,eAAe;AAC1C,QAAA6B,MAAgB,UAAaA,IAAc,IAC9C,MAAMF,EAAe,SAAS,IAExB,MAAA3B,EAAK,eAAe,CAAC;AAAA,MAC5B;AAEM,cAAAA,EAAK,eAAe,CAAC;AAAA,IAC5B,GACE,CAAC2B,GAAgB3B,CAAI,CAAC;AAGxB,WAAAS,gBAAAA,EAAA;AAAA,MAACc;AAAA,MAAA;AAAA,QACA,YAAY;AAAA,QACZ,YAAW;AAAA,QACX,gBAAe;AAAA,QACf,YAAW;AAAA,MAAA;AAAA,MAEXd,gBAAAA,EAAA;AAAA,QAACe;AAAA,QAAA;AAAA,UACA,OACC,YACCG,EAAe,UAAU,OAAO,KACjC;AAAA,UAED,cACC,YACCA,EAAe,UAAU,OAAO,KACjC;AAAA,UAED,UACCA,EAAe,UACZsB,KACAC;AAAA,UAEJ,MAAK;AAAA,UACL,UAAS;AAAA,UACT,SAASvB,EAAe;AAAA,UACxB,UAAQ;AAAA,QAAA;AAAA,MACT;AAAA,MACAlB,gBAAAA,EAAA;AAAA,QAACe;AAAA,QAAA;AAAA,UACA,OAAM;AAAA,UACN,cAAW;AAAA,UACX,UAAU2B;AAAA,UACV,MAAK;AAAA,UACL,UAAS;AAAA,UACT,SAASH;AAAA,UACT,UAAUrB,EAAe;AAAA,QAAA;AAAA,MAC1B;AAAA,MACC5B,EAAY,UACZU,gBAAAA,EAAA;AAAA,QAACe;AAAA,QAAA;AAAA,UACA,OAAM;AAAA,UACN,cAAW;AAAA,UACX,UAAU4B;AAAA,UACV,MAAK;AAAA,UACL,UAAS;AAAA,UACT,SAAS,MAAqBpD,EAAK,MAAM;AAAA,UACzC,UAAU,CAAC2B,EAAe;AAAA,QAAA;AAAA,MAG3B,IAAAlB,gBAAAA,EAAA;AAAA,QAACe;AAAA,QAAA;AAAA,UACA,OAAM;AAAA,UACN,cAAW;AAAA,UACX,UAAU6B;AAAA,UACV,MAAK;AAAA,UACL,UAAS;AAAA,UACT,SAAS,MAAqBrD,EAAK,KAAK;AAAA,UACxC,UAAU,CAAC2B,EAAe;AAAA,QAAA;AAAA,MAC3B;AAAA,MAEDlB,gBAAAA,EAAA;AAAA,QAACe;AAAA,QAAA;AAAA,UACA,OAAM;AAAA,UACN,cAAW;AAAA,UACX,UAAU8B;AAAA,UACV,MAAK;AAAA,UACL,UAAS;AAAA,UACT,SAAS3B,EAAe;AAAA,UACxB,UAAU,CAACA,EAAe;AAAA,QAAA;AAAA,MAC3B;AAAA,MACAlB,gBAAAA,EAAA;AAAA,QAACe;AAAA,QAAA;AAAA,UACA,OACC,WACCG,EAAe,WAAWhC,EAAW,MAClC,QACAgC,EAAe,WAAWhC,EAAW,MACpC,QACA,KACL;AAAA,UAED,cACC,WACCgC,EAAe,WAAWhC,EAAW,MAClC,QACAgC,EAAe,WAAWhC,EAAW,MACpC,QACA,KACL;AAAA,UAED,UAAUgD,GAAgBhB,EAAe,MAAM;AAAA,UAC/C,MAAK;AAAA,UACL,UAAS;AAAA,UACT,SAASA,EAAe;AAAA,QAAA;AAAA,MAAA;AAAA,IAE1B;AAAA,EAAA;AAGH,GAEM4B,KAAe3C,EAAK,MAAoB;AAC7C,QAAM,CAAC4C,GAAqBC,CAAsB,IAAIvC,EAAS,EAAK,GAE9DwC,IAAsB,MAC3BD,EAAuB,CAACD,CAAmB;AAG3C,SAAA/C,gBAAAA,EAAA;AAAA,IAACE;AAAA,IAAA;AAAA,MACA,QACCF,gBAAAA,EAAA;AAAA,QAACe;AAAA,QAAA;AAAA,UACA,OAAM;AAAA,UACN,cAAW;AAAA,UACX,UAAUC;AAAA,UACV,MAAK;AAAA,UACL,UAAS;AAAA,UACT,SAASiC;AAAA,QAAA;AAAA,MACV;AAAA,MAED,QAAQF;AAAA,MACR,cAAc,MAAYC,EAAuB,EAAK;AAAA,IAAA;AAAA,EACvD;AAEF,CAAC,GAMKE,KAAoB/C;AAAA,EACzB,CAAC,EAAE,gBAAAe,EAAA,MAA2D;AAC7D,UAAM,CAACiC,GAA0BC,CAA2B,IAC3D3C,EAAS,EAAK,GAET4C,IAA2B,MAChCD,EAA4B,CAACD,CAAwB;AAGrD,WAAAnD,gBAAAA,EAAA;AAAA,MAACiC;AAAA,MAAA;AAAA,QACA,gBAAAf;AAAA,QACA,QACClB,gBAAAA,EAAA;AAAA,UAACe;AAAA,UAAA;AAAA,YACA,OAAM;AAAA,YACN,cAAW;AAAA,YACX,UAAUuC;AAAA,YACV,MAAK;AAAA,YACL,UAAS;AAAA,YACT,SAASD;AAAA,UAAA;AAAA,QACV;AAAA,QAED,QAAQF;AAAA,QACR,cAAc,MAAYC,EAA4B,EAAK;AAAA,MAAA;AAAA,IAC5D;AAAA,EAAA;AAGH,GAMMG,KAAyBpD;AAAA,EAC9B,CAAC,EAAE,gBAAAe,EAAA,MAEDlB,gBAAAA,EAAA;AAAA,IAACc;AAAA,IAAA;AAAA,MACA,YAAY;AAAA,MACZ,YAAW;AAAA,MACX,gBAAe;AAAA,MACf,YAAW;AAAA,IAAA;AAAA,oCAEVgC,IAAa,IAAA;AAAA,IACd9C,gBAAAA,EAAA,cAACkD,MAAkB,gBAAAhC,EAAgC,CAAA;AAAA,EACpD;AAGH,GAOasC,KAAYnE;AAAA,EACxB,CAAC,EAAE,aAAAC,GAAa,gBAAA4B,wCAEbuC,IAAa,EAAA,aAAY,OACzBzD,gBAAAA,EAAA,cAACc,KAAa,WAAU,UAAS,YAAW,OAAA,mCAC1C4C,GACA,MAAA1D,gBAAAA,EAAA,cAACZ,IAAQ,EAAA,aAAAE,GAA0B,CACpC,GACAU,gBAAAA,EAAA,cAAC0D,GACA,MAAA1D,gBAAAA,EAAA,cAACc,KAAa,YAAY,GAAA,GACxBd,gBAAAA,EAAA,cAAA0D,GAAA,EAAY,KAAK,EAAE,OAAO,mBAAoB,CAAA,GAC9C1D,gBAAAA,EAAA,cAAA0D,GAAA,EAAY,KAAK,EAAE,OAAO,mBAC1B,GAAA1D,gBAAAA,EAAA;AAAA,IAACsC;AAAA,IAAA;AAAA,MACA,aAAAhD;AAAA,MACA,gBAAA4B;AAAA,IAAA;AAAA,EAEF,CAAA,GACClB,gBAAAA,EAAA,cAAA0D,GAAA,EAAY,KAAK,EAAE,OAAO,sBAC1B1D,gBAAAA,EAAA;AAAA,IAACuD;AAAA,IAAA;AAAA,MACA,gBAAArC;AAAA,IAAA;AAAA,EAAA,CAEF,CACD,CACD,CACD,CACD;AAGH,GCphBMyC,KAAgB,CAAC;AAAA,EACtB,UAAAC;AAAA,EACA,QAAAC;AACD,MAAwC;AACvC,QAAM,CAACC,GAAKC,CAAM,IAAItD,EAAS,EAAE,GAC3B,CAACuD,GAAOC,CAAQ,IAAIxD,EAAS,EAAE,GAC/B,CAACyD,GAASC,CAAU,IAAI1D,EAAS,EAAK;AAG3C,SAAA,sBAAA,cAAC2D,MAAS,SAASR,GAAU,cAAa,aACzC,GAAA,sBAAA,cAACS,IACA,MAAA,sBAAA,cAACC,IAAoB,MAAA,WAAoB,CAC1C,GAEA,sBAAA,cAACC,UACC,sBAAA,cAAAC,IAAA,EAAQ,WAAU,OAClB,GAAA,sBAAA,cAAC3D,GAAW,EAAA,OAAM,MACjB,GAAA,sBAAA;AAAA,IAAC4D;AAAA,IAAA;AAAA,MACA,MAAK;AAAA,MACL,OAAOX;AAAA,MACP,UAAU,CAACnE,MAAYoE,EAAOpE,EAAE,OAAO,KAAK;AAAA,IAAA;AAAA,EAAA,CAE9C,GAEC,sBAAA,cAAAkB,GAAA,EAAW,OAAM,QACjB,GAAA,sBAAA;AAAA,IAAC4D;AAAA,IAAA;AAAA,MACA,MAAK;AAAA,MACL,OAAOT;AAAA,MACP,UAAU,CAACrE,MAAYsE,EAAStE,EAAE,OAAO,KAAK;AAAA,IAAA;AAAA,EAAA,CAEhD,CACD,CACD,GAEA,sBAAA,cAAC+E,IACA,MAAA,sBAAA,cAACC,IAAe,EAAA,SAASf,EAAU,GAAA,QAEnC,GAEA,sBAAA;AAAA,IAACgB;AAAA,IAAA;AAAA,MACA,MAAK;AAAA,MACL,SAAS,YAA2B;AAC/B,YAAA;AACH,UAAAT,EAAW,EAAI,GAEf,MAAMN,EAAO,EAAE,KAAAC,GAAK,OAAAE,GAAO;AAAA,QAAA,UAC1B;AACD,UAAAG,EAAW,EAAK;AAAA,QAAA;AAAA,MAElB;AAAA,MACA,MAAI;AAAA,MACJ,UAAUL,EAAI,KAAK,EAAE,WAAW;AAAA,MAChC,WAAWI;AAAA,IAAA;AAAA,IACX;AAAA,EAAA,CAGF,CACD;AAEF;AAMA,SAASW,GAAgBtE,GAAoC;AAE3D,SAAAA,MAAU,QACV,OAAOA,KAAU,YACjB,WAAWA,KACX,OAAOA,EAAM,SAAU;AAEzB;AAMO,MAAMuE,KAAiB3E;AAAA,EAC7B,CAAC,EAAE,gBAAAe,EAAA,MAAwD;AAC1D,UAAM,CAAC6D,GAAmBC,CAAoB,IAAIvE,EAAS,EAAK,GAE1DwE,IAAavF;AAAA,MAClB,OAAOC,MAAqD;AACrD,cAAAuF,IAAeC,GAAiBxF,EAAE,GAAG;AAC3C,YAAIuF,MAAiB,QAAW;AAC/B,gBAAME,IAAUF,EAAa,eAAevF,EAAE,GAAG;AACjD,cAAIyF,MAAY,QAAW;AAMpB,kBAAAC,IAAW,OALA,MAAM;AAAA,cACtB,iCAAiC;AAAA,gBAChC1F,EAAE;AAAA,cAAA,CACF;AAAA,YACF,GACgC,KAAK;AAErC,kBAAMuB,EAAe,SAAS;AAAA,cAC7BA,EAAe,WAAW;AAAA,gBACzB,KAAKvB,EAAE;AAAA,gBACP,MAAMuF,EAAa;AAAA,gBACnB,SAAAE;AAAA,gBACA,OACCzF,EAAE,UACDkF,GAAgBQ,CAAQ,IACtBA,EAAS,QACTD;AAAA,cACJ,CAAA;AAAA,YAAA,CACD;AAAA,UAAA;AAAA,QACF;AAGD,QAAAJ,EAAqB,EAAK;AAAA,MAC3B;AAAA,MACA,CAAC9D,CAAc;AAAA,IAChB;AAEA,WAEE,sBAAA,cAAA,MAAA,UAAA,MAAA,sBAAA;AAAA,MAAC0D;AAAA,MAAA;AAAA,QACA,SAAS,MAAYI,EAAqB,EAAI;AAAA,QAC9C,UAAUM;AAAA,QACV,OAAM;AAAA,MAAA;AAAA,MACN;AAAA,IAAA,GAIAP,KACA,sBAAA;AAAA,MAACpB;AAAA,MAAA;AAAA,QACA,UAAU,MAAYqB,EAAqB,EAAK;AAAA,QAChD,QAAQC;AAAA,MAAA;AAAA,IAAA,CAGX;AAAA,EAAA;AAGH,GC9GMM,KAAuBlG;AAAA,EAC5B,CAAC,EAAE,gBAAA6B,EAAA,MAA8D;AAC1D,UAAA,EAAE,UAAAsE,EAAS,IAAIC,EAAY;AAGhC,WAAAzF,gBAAAA,EAAA;AAAA,MAAC0F;AAAA,MAAA;AAAA,QACA,OAAO;AAAA,UACN,UAAU;AAAA,UACV,KAAK;AAAA,UACL,QAAQ;AAAA,UACR,YAAYF,EAAS,OAAO;AAAA,QAAA;AAAA,MAC7B;AAAA,sCAECG,IACA,MAAA3F,gBAAAA,EAAA;AAAA,QAAC4F;AAAA,QAAA;AAAA,UACA,IAAG;AAAA,UACH,SAAS1E,EAAe;AAAA,UACxB,UAAU,CAACvB,MAAY;AACP,YAAAuB,EAAA,mBAAmBvB,EAAE,OAAO;AAAA,UAAA;AAAA,QAC5C;AAAA,MAAA,CAEF;AAAA,MACAK,gBAAAA,EAAA,cAAC6F,GAAmB,EAAA,OAAO,GAAI,CAAA;AAAA,MAC/B7F,gBAAAA,EAAA,cAAC6F,SAAmB,OAAgB;AAAA,sCACnCA,GAAmB,IAAA;AAAA,IACrB;AAAA,EAAA;AAGH,GAOMC,KAAoC3F;AAAA,EACzC,CAAC;AAAA,IACA,MAAA4F;AAAA,IACA,cAAAzF;AAAA,EAAA,MAC2D;AAC3D,UAAM0F,IAAkB7F;AAAA,MACvB,CAAC;AAAA,QACA,SAAA8F;AAAA,QACA,GAAGC;AAAA,MAAA,MAMuC;AAC1C,cAAMC,IAAczG;AAAA,UACnB,CAACC,MAAwB;AACX,YAAAW,EAAA,GAEb2F,KAAA,QAAAA,EAAUtG;AAAA,UACX;AAAA,UACA,CAACsG,CAAO;AAAA,QACT;AAEA,eAAQjG,gBAAAA,EAAA,cAAAoG,IAAA,EAAoB,GAAGF,GAAO,SAASC,GAAa;AAAA,MAAA;AAAA,IAE9D;AAEA,2CACEE,IACA,MAAArG,gBAAAA,EAAA;AAAA,MAACgG;AAAA,MAAA;AAAA,QACA,MAAMhG,gBAAAA,EAAA,cAAC2B,GAAQ,EAAA,MAAK,IAAG;AAAA,QACvB,SAASoE,EAAK;AAAA,MAAA;AAAA,MACd;AAAA,IAGD,GAAA/F,gBAAAA,EAAA;AAAA,MAACgG;AAAA,MAAA;AAAA,QACA,MAAMhG,gBAAAA,EAAA,cAAC2B,GAAQ,EAAA,MAAK,IAAG;AAAA,QACvB,SAASoE,EAAK;AAAA,MAAA;AAAA,MACd;AAAA,IAGD,GAAA/F,gBAAAA,EAAA;AAAA,MAACgG;AAAA,MAAA;AAAA,QACA,MAAMhG,gBAAAA,EAAA,cAAC2B,GAAQ,EAAA,MAAM2D,GAAY;AAAA,QACjC,SAASS,EAAK;AAAA,MAAA;AAAA,MACd;AAAA,IAAA,GAGD/F,gBAAAA,EAAA,cAACsG,GAAkB,EAAA,QAAO,OAAO,CAAA,GACjCtG,gBAAAA,EAAA;AAAA,MAACgG;AAAA,MAAA;AAAA,QACA,MAAMhG,gBAAAA,EAAA,cAAC2B,GAAQ,EAAA,MAAM4E,IAAoB;AAAA,QACzC,SAASR,EAAK;AAAA,QACd,UAAU,CAACA,EAAK;AAAA,MAAA;AAAA,MAChB;AAAA,IAGD,GAAA/F,gBAAAA,EAAA;AAAA,MAACgG;AAAA,MAAA;AAAA,QACA,MAAMhG,gBAAAA,EAAA,cAAC2B,GAAQ,EAAA,MAAM6E,IAAsB;AAAA,QAC3C,SAAST,EAAK;AAAA,QACd,UAAU,CAACA,EAAK;AAAA,MAAA;AAAA,MAChB;AAAA,IAAA,GAGD/F,gBAAAA,EAAA,cAACsG,GAAkB,EAAA,QAAO,OAAO,CAAA,GACjCtG,gBAAAA,EAAA;AAAA,MAACgG;AAAA,MAAA;AAAA,QACA,MAAMhG,gBAAAA,EAAA,cAAC2B,GAAQ,EAAA,MAAK,IAAG;AAAA,QACvB,SAASoE,EAAK;AAAA,QACd,UAAU,CAACA,EAAK;AAAA,MAAA;AAAA,MAChB;AAAA,IAGD,GAAA/F,gBAAAA,EAAA;AAAA,MAACgG;AAAA,MAAA;AAAA,QACA,MAAMhG,gBAAAA,EAAA,cAAC2B,GAAQ,EAAA,MAAK,IAAG;AAAA,QACvB,SAASoE,EAAK;AAAA,QACd,UAAU,CAACA,EAAK;AAAA,MAAA;AAAA,MAChB;AAAA,IAAA,CAGF;AAAA,EAAA;AAGH,GAMMU,KAA2BtG;AAAA,EAChC,CAAC,EAAE,MAAA4F,EAAA,MAAwD;AAC1D,UAAM,CAAC1F,GAAQqG,CAAS,IAAIjG,EAAS,EAAK,GAEpCkG,IAAgBjH,EAAY,MAAMgH,EAAU,CAACrG,CAAM,GAAG,CAACA,CAAM,CAAC,GAC9DC,IAAeZ,EAAY,MAAMgH,EAAU,EAAK,GAAG,CAAA,CAAE;AAG1D,WAAA1G,gBAAAA,EAAA;AAAA,MAACY;AAAA,MAAA;AAAA,QACA,QACCZ,gBAAAA,EAAA;AAAA,UAACe;AAAA,UAAA;AAAA,YACA,OAAM;AAAA,YACN,cAAW;AAAA,YACX,UAAUuC;AAAA,YACV,MAAK;AAAA,YACL,OAAM;AAAA,YACN,SAASqD;AAAA,UAAA;AAAA,QACV;AAAA,QAED,QAAAtG;AAAA,QACA,cAAAC;AAAA,QACA,kBAAiB;AAAA,QACjB,gBAAe;AAAA,MAAA;AAAA,MAEfN,gBAAAA,EAAA;AAAA,QAAC8F;AAAA,QAAA;AAAA,UACA,MAAAC;AAAA,UACA,cAAAzF;AAAA,QAAA;AAAA,MAAA;AAAA,IAEF;AAAA,EAAA;AAGH,GAMMsG,KAA+BvH;AAAA,EACpC,CAAC,EAAE,MAAA0G,EAAA,MAA4D;AAC9D,UAAMxG,IAAOC,EAAiB;AAE9B,2CACEqH,GAAgB,EAAA,UAAU,IAAO,YAAU,IAAC,OAAM,QAClD,GAAA7G,gBAAAA,EAAA;AAAA,MAAC4E;AAAA,MAAA;AAAA,QACA,UAAUkC;AAAA,QACV,MAAK;AAAA,QACL,SAAS,YAA2B;AACnC,UAAIf,EAAK,YACF,MAAAxG,EAAK,eAAe,CAAC,IAE3BwG,EAAK,KAAK;AAAA,QACX;AAAA,MACD;AAAA,MACA;AAAA,IAGD,GAAA/F,gBAAAA,EAAA;AAAA,MAAC4E;AAAA,MAAA;AAAA,QACA,UAAU7C;AAAA,QACV,MAAK;AAAA,QACL,SAASgE,EAAK;AAAA,MAAA;AAAA,MACd;AAAA,IAGD,GAAA/F,gBAAAA,EAAA,cAACyG,IAAyB,EAAA,MAAAV,EAAY,CAAA,CACvC;AAAA,EAAA;AAGH,GAEMgB,KAAgD;AAAA,EACrD,OAAO;AAAA,EACP,aAAa;AAAA,EACb,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,SAAS;AACV,GAMMC,KAAoB3H;AAAA,EACzB,CAAC,EAAE,MAAA0G,EAAA,MAAiD;AACnD,UAAMxG,IAAOC,EAAiB;AAG7B,WAAAQ,gBAAAA,EAAA,cAACiH,MAAY,KAAKlB,EAAK,IAAI,YAAYA,EAAK,UAC3C,GAAA/F,gBAAAA,EAAA,cAACkH,IACA,MAAAlH,gBAAAA,EAAA;AAAA,MAAC4F;AAAA,MAAA;AAAA,QACA,IAAIG,EAAK,GAAG,SAAS;AAAA,QACrB,SAASA,EAAK;AAAA,QACd,UAAUA,EAAK;AAAA,MAAA;AAAA,IAAA,CAEjB,GACC/F,gBAAAA,EAAA,cAAA6G,GAAA,EAAgB,UAAU,GAC1B,GAAA7G,gBAAAA,EAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACA,KAAK+G,GAAkBhB,EAAK,IAAI;AAAA,QAChC,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,KAAKA,EAAK;AAAA,MAAA;AAAA,IAAA,CAEZ,GACA/F,gBAAAA,EAAA,cAAC6G,GACA,MAAA7G,gBAAAA,EAAA;AAAA,MAACmH;AAAA,MAAA;AAAA,QACA,MAAMpB,EAAK;AAAA,QACX,QAAO;AAAA,QACP,UAAQ;AAAA,QACR,SAAS,MAAqBxG,EAAK,MAAM;AAAA,MAAA;AAAA,MAExCwG,EAAK;AAAA,IAAA,CAER,GACC/F,gBAAAA,EAAA,cAAA4G,IAAA,EAA6B,MAAAb,EAAY,CAAA,CAC3C;AAAA,EAAA;AAGH,GAMMqB,KAAqB/H;AAAA,EAC1B,CAAC,EAAE,gBAAA6B,EAAA,MAEDlB,gBAAAA,EAAA;AAAA,IAACqH;AAAA,IAAA;AAAA,MACA,KAAI;AAAA,MACJ,MAAMnG,EAAe;AAAA,MACrB,SAAS,CAACoG,MAAgBpG,EAAe,SAASoG,CAAK;AAAA,IAAA;AAAA,IAEtDpG,EAAe,MAAM,IAAI,CAAC6E,MACzB/F,gBAAAA,EAAA,cAAAgH,IAAA,EAAkB,KAAKjB,EAAK,IAAI,MAAAA,EAAA,CAAY,CAC7C;AAAA,EACF;AAGH,GAMawB,KAAiBlI;AAAA,EAC7B,CAAC,EAAE,gBAAA6B,EAAA,MAEDlB,gBAAAA,EAAA,cAACwH,UACCxH,gBAAAA,EAAA,cAAAuF,IAAA,EAAqB,gBAAArE,EAAgC,CAAA,GACtDlB,gBAAAA,EAAA,cAACoH,IAAmB,EAAA,gBAAAlG,EAAA,CAAgC,CACrD;AAGH,GCvSMuG,KAAuBpI;AAAA,EAC5B,CAAC,EAAE,gBAAA6B,EAAA,MAA8D;AAChE,UAAM,CAACwG,GAAiBC,CAAkB,IAAIlH,EAAS,EAAK;AAE5D,qEAEGiH,KACA,sBAAA;AAAA,MAACE;AAAA,MAAA;AAAA,QACA,MAAK;AAAA,QACL,MAAK;AAAA,QACL,SAAS,MAAYD,EAAmB,EAAK;AAAA,MAAA;AAAA,0CAE5C,OAAI,EAAA,OAAO,EAAE,WAAW,YACxB,sBAAA;AAAA,QAACE;AAAA,QAAA;AAAA,UACA,UAAS;AAAA,UACT,gBAAe;AAAA,UACf,YAAU;AAAA,UACV,eAAa;AAAA,QAAA;AAAA,QAEZ,KAAK;AAAA,UACL3G,EAAe;AAAA,UACf;AAAA,UACA;AAAA,QAAA;AAAA,MAGH,CAAA;AAAA,IAIF,GAAA,sBAAA,cAAC4D,IAAe,EAAA,gBAAA5D,EAAgC,CAAA,CACjD;AAAA,EAAA;AAGH,GAOM4G,KAAYzI;AAAA,EACjB,CAAC,EAAE,aAAAC,GAAa,gBAAA4B,QAAmD;AAC5D,UAAA,EAAE,UAAAsE,EAAS,IAAIC,EAAY;AAEjC,WAEE,sBAAA,cAAA,MAAA,UAAA,MAAA,sBAAA;AAAA,MAAC3E;AAAA,MAAA;AAAA,QACA,YAAW;AAAA,QACX,YAAW;AAAA,QACX,OAAO;AAAA,UACN,UAAU;AAAA,UACV,KAAK;AAAA,UACL,QAAQ;AAAA,UACR,YAAY0E,EAAS,OAAO;AAAA,QAAA;AAAA,MAC7B;AAAA,MAEA,sBAAA,cAAC9B,GAAY,EAAA,MAAM,GAClB,GAAA,sBAAA;AAAA,QAACkB;AAAA,QAAA;AAAA,UACA,UACC1D,EAAe,WACfA,EAAe,cAAc,WAAW;AAAA,UAEzC,SAASA,EAAe;AAAA,QAAA;AAAA,QACxB;AAAA,MAAA,CAGF;AAAA,MACA,sBAAA,cAACwC,GAAY,EAAA,MAAM,GAClB,GAAA,sBAAA;AAAA,QAACkB;AAAA,QAAA;AAAA,UACA,UAAUU;AAAA,UACV,SAASpE,EAAe;AAAA,UACxB,UACCA,EAAe,WACfA,EAAe,cAAc,WAAW;AAAA,QAAA;AAAA,QAEzC;AAAA,MAAA,CAGF;AAAA,MACA,sBAAA,cAACwC,GAAY,EAAA,MAAM,GAClB,GAAA,sBAAA;AAAA,QAACkB;AAAA,QAAA;AAAA,UACA,UAAU7C;AAAA,UACV,SAASb,EAAe;AAAA,UACxB,UACCA,EAAe,WACfA,EAAe,cAAc,WAAW;AAAA,QAAA;AAAA,QAEzC;AAAA,MAAA,CAGF;AAAA,MACA,sBAAA,cAACwC,GAAY,EAAA,MAAM,GAClB,GAAA,sBAAA;AAAA,QAACkB;AAAA,QAAA;AAAA,UACA,UAAUmD;AAAA,UACV,SAAS7G,EAAe;AAAA,UACxB,UAAUA,EAAe;AAAA,QAAA;AAAA,QACzB;AAAA,MAAA,CAGF;AAAA,MACA,sBAAA,cAACwC,GAAY,EAAA,MAAM,GAAM,CAAA;AAAA,0CACxBA,GAAY,EAAA,MAAM,MACjB,sBAAA,cAAA+D,IAAA,EAAqB,gBAAAvG,GAAgC,CACvD;AAAA,IAAA,GAGA,CAACA,EAAe,WAEf,sBAAA,cAAA,MAAA,UAAA,MAAA,sBAAA;AAAA,MAAC8G;AAAA,MAAA;AAAA,QACA,MAAK;AAAA,QACL,OAAO;AAAA,UACN,UAAU;AAAA,UACV,KAAK;AAAA,UACL,QAAQ;AAAA,UACR,YAAYxC,EAAS,OAAO;AAAA,QAAA;AAAA,MAC7B;AAAA,IAAA,GAGD,sBAAA,cAAC+B,IAAe,EAAA,gBAAArG,EAAA,CAAgC,CACjD,CAEF;AAAA,EAAA;AAGH,GAOa+G,KAAiB5I;AAAA,EAC7B,CAAC,EAAE,aAAAC,GAAa,gBAAA4B,QAGb,sBAAA,cAAA,MAAA,UAAA,MAAA,sBAAA;AAAA,IAACgH,EAAgB;AAAA,IAAhB;AAAA,MACA,WAAU;AAAA,MACV,gBAAgB,CAAA;AAAA,IAAC;AAAA,EAAA,GAGlB,sBAAA,cAACA,EAAgB,SAAhB,MACA,sBAAA;AAAA,IAACJ;AAAA,IAAA;AAAA,MACA,aAAAxI;AAAA,MACA,gBAAA4B;AAAA,IAAA;AAAA,EAAA,CAEF,CACD;AAGH,GCnKaiH,IAAiB;AAAA,EAC7B,OAAO,KAAK;AAAA,EACZ,QAAQ,IAAI;AACb,GAOaC,KAAa/I;AAAA,EACzB,CAAC,EAAE,aAAAC,GAAa,gBAAA4B,QAAoD;AACnE,UAAM3B,IAAOC,EAAiB,GAExB6I,IAAe3I,EAAY,YAA2B;AACvD,MAACwB,EAAe,cAIpB,MAAM3B,EAAK,KAAK;AAAA,IAAA,GACd,CAAC2B,GAAgB3B,CAAI,CAAC,GAEnB+I,IAAc5I,EAAY,YAA2B;AAC1D,cAAQwB,EAAe,QAAQ;AAAA,QAC9B,KAAKhC,EAAW;AACT,gBAAAK,EAAK,eAAe,CAAC;AAC3B;AAAA,QAED,KAAKL,EAAW;AAAA,QAChB,KAAKA,EAAW;AACf,cAAIgC,EAAe;AAClB,oBAAQA,EAAe,QAAQ;AAAA,cAC9B,KAAKhC,EAAW;AACf,gBAAAI,EAAY,QAAQ;AACpB;AAAA,cAED,KAAKJ,EAAW;AACf,gBAAIgC,EAAe,mBAClB,MAAMA,EAAe,UAAU,IAEzB,MAAA3B,EAAK,eAAe,CAAC;AAE5B;AAAA,YAAA;AAAA;AAGF,kBAAM2B,EAAe,KAAK;AAE3B;AAAA,MAAA;AAAA,IAEA,GAAA,CAACA,GAAgB5B,GAAaC,CAAI,CAAC,GAEhCgJ,IAAU7G;AAAA,MACf,OAAsB;AAAA,QACrB,UAAU2G;AAAA,QACV,QAAQ/I,EAAY;AAAA,QACpB,SAASA,EAAY;AAAA,QACrB,SAASgJ;AAAA,QACT,cAAchJ,EAAY;AAAA,MAAA;AAAA,MAE3B,CAACA,GAAa+I,GAAcC,CAAW;AAAA,IACxC;AAGC,WAAA,sBAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACA,KAAK;AAAA,UACJ,UAAU;AAAA,UACV,OAAO;AAAA,UACP,QAAQnJ;AAAA,UACR,OAAOgJ,EAAe;AAAA,UACtB,QAAQA,EAAe;AAAA,UACvB,QAAQ;AAAA,UACR,iBAAiB;AAAA,UACjB,SAAS;AAAA,UACT,eAAe;AAAA,QAAA;AAAA,MAChB;AAAA,MAEA,sBAAA,cAAC,OAAI,EAAA,KAAK,EAAE,UAAU,GAAG,iBAAiB,QAAA,EACxC,GAAAjH,EAAe,eACf,sBAAA;AAAA,QAACsH;AAAA,QAAA;AAAA,UACA,KAAKtH,EAAe,YAAY;AAAA,UAChC,SAAAqH;AAAA,QAAA;AAAA,MAGH,CAAA;AAAA,IACD;AAAA,EAAA;AAGH;AChGO,MAAME,EAAgE;AAAA,EAC5E,eAGEC,GAAWC,GAAoD;AACzD,WAAAC,GAAeF,GAAQC,CAAW;AAAA,EAAA;AAE3C;ACAO,MAAME,IAAN,MAAMA,EAAkD;AAAA,EAM9D,YACUC,GACA5H,GACA6H,GACR;AAPO,IAAAC,EAAA;AACT,IAAAA,EAAA,oBAAa;AAGH,SAAA,0BAAAF,GACA,KAAA,iBAAA5H,GACA,KAAA,MAAA6H,GAET,KAAK,KAAKF,EAAmB,UAE7BC,EAAwB,eAAe,MAAM;AAAA,MAC5C,YAAYG;AAAA,MACZ,WAAWC;AAAA,MACX,OAAOA;AAAA,MACP,SAASA;AAAA,MACT,QAAQA;AAAA,MACR,cAAcA;AAAA,MACd,iBAAiBA;AAAA,MACjB,gBAAgBA;AAAA,MAChB,iBAAiBA;AAAA,MACjB,UAAUC;AAAA,MACV,gBAAgBA,EAAO;AAAA,MACvB,MAAMA;AAAA,MACN,QAAQA,EAAO;AAAA,MACf,WAAWA,EAAO;AAAA,MAClB,UAAUA,EAAO;AAAA,MACjB,gBAAgBA,EAAO;AAAA,MACvB,WAAWA,EAAO;AAAA,MAClB,cAAcA,EAAO;AAAA,MACrB,aAAaA,EAAO;AAAA,MACpB,cAAcA,EAAO;AAAA,IAAA,CACrB;AAAA,EAAA;AAAA,EAGF,OAAO,QACNL,GACA5H,GACA6H,GACsB;AACtB,WAAO,IAAIF;AAAA,MACVC;AAAA,MACA5H;AAAA,MACA6H;AAAA,IACD;AAAA,EAAA;AAAA,EAGD,IAAI,MAAc;AACjB,WAAO,KAAK,IAAI;AAAA,EAAA;AAAA,EAGjB,IAAI,OAAmB;AACtB,WAAO,KAAK,IAAI;AAAA,EAAA;AAAA,EAGjB,IAAI,UAAkB;AACrB,WAAO,KAAK,IAAI;AAAA,EAAA;AAAA,EAGjB,IAAI,QAAgB;AACnB,WAAO,KAAK,IAAI;AAAA,EAAA;AAAA,EAGjB,IAAI,YAAqB;AACjB,WAAA,KAAK,eAAe,gBAAgB;AAAA,EAAA;AAAA,EAG5C,IAAI,QAAgB;AACnB,WAAO,KAAK,eAAe,MAAM,QAAQ,IAAI;AAAA,EAAA;AAAA,EAG9C,IAAI,UAAmB;AACtB,WAAO,KAAK,UAAU;AAAA,EAAA;AAAA,EAGvB,IAAI,SAAkB;AACrB,WAAO,KAAK,UAAU,KAAK,eAAe,MAAM,SAAS;AAAA,EAAA;AAAA,EAG1D,IAAI,eAAwB;AAC3B,WAAO,CAAC,KAAK;AAAA,EAAA;AAAA,EAGd,IAAI,kBAA2B;AAC9B,WAAO,CAAC,KAAK;AAAA,EAAA;AAAA,EAGd,IAAI,iBAA0B;AAC7B,WAAO,CAAC,KAAK;AAAA,EAAA;AAAA,EAGd,IAAI,kBAA2B;AAC9B,WAAO,KAAK,eAAe;AAAA,EAAA;AAAA,EAG5B,QAA6B;AAC5B,WAAO,KAAK,eAAe,WAAW,KAAK,GAAG;AAAA,EAAA;AAAA,EAG/C,WAAiB;AAChB,SAAK,aAAa;AAAA,EAAA;AAAA,EAGnB,iBAAuB;AACjB,SAAA,aAAa,CAAC,KAAK;AAAA,EAAA;AAAA,EAGzB,OAAa;AACP,SAAA,eAAe,eAAe,IAAI;AAAA,EAAA;AAAA,EAGxC,SAAwB;AACvB,WAAO,KAAK,eAAe,YAAY,CAAC,IAAI,CAAC;AAAA,EAAA;AAAA,EAG9C,MAAM,YAA2B;AAChC,UAAM,KAAK,eAAe,UAAU,CAAC,KAAK,MAAA,CAAO,CAAC;AAAA,EAAA;AAAA,EAGnD,MAAM,WAA0B;AAC/B,UAAM,KAAK,eAAe,SAAS,CAAC,KAAK,MAAA,CAAO,CAAC;AAAA,EAAA;AAAA,EAGlD,MAAM,iBAAgC;AACrC,UAAM,KAAK,eAAe,SAAS,CAAC,KAAK,MAAA,CAAO,CAAC;AAAA,EAAA;AAAA,EAGlD,YAAkB;AACZ,SAAA,eAAe,SAAS,MAAM,CAAC;AAAA,EAAA;AAAA,EAGrC,eAAqB;AACpB,SAAK,eAAe;AAAA,MACnB;AAAA,MACA,KAAK,eAAe,MAAM,SAAS;AAAA,IACpC;AAAA,EAAA;AAAA,EAGD,cAA6B;AACrB,WAAA,KAAK,eAAe,iBAAiB,IAAI;AAAA,EAAA;AAAA,EAGjD,eAA8B;AACtB,WAAA,KAAK,eAAe,iBAAiB,IAAI;AAAA,EAAA;AAElD;AAlJCC,EADYH,GACL,UAAS;AADV,IAAMO,IAANP;ACTP,MAAMQ,IAAM,IAAIC,GAAI;AAAA,EACnB,aAAa;AACd,CAAC;AAEe,SAAAC,GACfC,GACAC,GACsB;AAElB,MAAAC;AAOJ,MANWA,IAAAL,EAAI,UAAUI,CAAM,GAC3BC,MAAa,WACZL,EAAA,UAAUG,GAAQC,CAAM,GACjBC,IAAAL,EAAI,UAAUI,CAAM,IAG5BC,MAAa,UAAaA,EAAS,WAAWF;AACjD,UAAM,IAAI;AAAA,MACT,8BAA8B,KAAK;AAAA,QAClCA;AAAA,MAAA,CACA,eAAe,KAAK,UAAUE,KAAA,gBAAAA,EAAU,MAAM,CAAC;AAAA,IACjD;AAGM,SAAAA;AACR;ACbA,MAAMC,KACL;AAAA,EACC,MAAM;AAAA,EACN,YAAY;AAAA,IACX,SAAS;AAAA,MACR,MAAM;AAAA,MACN,UAAU;AAAA,IACX;AAAA,IACA,QAAQ;AAAA,MACP,MAAM;AAAA,MACN,MAAM,OAAO,OAAOzK,CAAU;AAAA,MAC9B,UAAU;AAAA,IACX;AAAA,IACA,SAAS;AAAA,MACR,MAAM;AAAA,MACN,UAAU;AAAA,IACX;AAAA,IACA,OAAO;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,OAAO;AAAA,QACN,MAAM;AAAA,QACN,YAAY;AAAA,UACX,KAAK;AAAA,YACJ,MAAM;AAAA,UACP;AAAA,UACA,MAAM;AAAA,YACL,MAAM;AAAA,UACP;AAAA,UACA,SAAS;AAAA,YACR,MAAM;AAAA,UACP;AAAA,UACA,OAAO;AAAA,YACN,MAAM;AAAA,UAAA;AAAA,QAER;AAAA,QACA,UAAU,CAAC,OAAO,QAAQ,WAAW,OAAO;AAAA,MAAA;AAAA,IAE9C;AAAA,IACA,cAAc;AAAA,MACb,MAAM;AAAA,MACN,UAAU;AAAA,IAAA;AAAA,EACX;AAEF,GAEY0K,KAAqCL;AAAA,EACjDI;AAAA,EACA;AACD;AC9CO,MAAME,GAIb;AAAA,EAOC,YAAqBf,GAAmD;AANxE,IAAAE,EAAA,oBAAa;AACb,IAAAA,EAAA,eAA+B,CAAC;AAChC,IAAAA,EAAA;AACA,IAAAA,EAAA,gBAAS9J,EAAW;AACpB,IAAA8J,EAAA,iBAAU;AAEW,SAAA,0BAAAF,GACpBA,EAAwB,eAAe,MAAM;AAAA,MAC5C,YAAYG;AAAA,MACZ,OAAOA;AAAA,MACP,WAAWA;AAAA,MACX,QAAQA;AAAA,MACR,SAASA;AAAA,MACT,mBAAmBC,EAAS;AAAA,MAC5B,SAASA;AAAA,MACT,aAAaA;AAAA,MACb,SAASA;AAAA,MACT,UAAUA;AAAA,MACV,kBAAkBA;AAAA,MAClB,cAAcA;AAAA,MACd,iBAAiBA;AAAA,MACjB,aAAaA;AAAA,MACb,YAAYA;AAAA,MACZ,eAAeA;AAAA,MACf,kBAAkBA;AAAA,MAClB,yBAAyBA;AAAA,MACzB,UAAUC;AAAA,MACV,UAAUA;AAAA,MACV,OAAOA,EAAO;AAAA,MACd,aAAaA;AAAA,MACb,gBAAgBA;AAAA,MAChB,cAAcA;AAAA,MACd,kBAAkBA;AAAA,MAClB,UAAUA;AAAA,MACV,uBAAuBA,EAAO;AAAA,MAC9B,UAAUA;AAAA,MACV,kBAAkBA,EAAO;AAAA,MACzB,WAAWA;AAAA,MACX,UAAUA;AAAA,MACV,aAAaA;AAAA,MACb,qBAAqBA,EAAO;AAAA,MAC5B,kBAAkBA;AAAA,MAClB,kBAAkBA;AAAA,MAClB,cAAcA,EAAO;AAAA,MACrB,eAAeA,EAAO;AAAA,MACtB,UAAUA;AAAA,MACV,MAAMA,EAAO;AAAA,MACb,WAAWA;AAAA,IAAA,CACX;AAAA,EAAA;AAAA,EAGF,WAAWJ,GAA4C;AACtD,WAAOK,EAAmB;AAAA,MACzB,KAAK;AAAA,MACL;AAAA,MACAL;AAAA,IACD;AAAA,EAAA;AAAA,EAGD,IAAI,oBAAgD;AAC5C,WAAA;AAAA,MACN,SAAS;AAAA,MACT,QAAQ,KAAK;AAAA,MACb,SAAS,KAAK;AAAA,MACd,OAAO,KAAK,MAAM,IAAI,CAAChD,MAASA,EAAK,GAAG;AAAA,MACxC,cAAc,KAAK;AAAA,IACpB;AAAA,EAAA;AAAA,EAED,IAAI,kBAAkBxF,GAAmC;;AACnD,SAAA,SAASA,EAAM,UAAUrB,EAAW,KACpC,KAAA,UAAUqB,EAAM,WAAW,IAC3B,KAAA,UAAQuJ,IAAAvJ,EAAM,UAAN,gBAAAuJ,EAAa,IAAI,CAAC/D,MAAS,KAAK,WAAWA,CAAI,OAAM,CAAC,GACnE,KAAK,eAAexF,EAAM;AAAA,EAAA;AAAA,EAG3B,0BACCwJ,GACkD;AAClD,WAAOH,GAAmCG,CAAiB;AAAA,EAAA;AAAA,EAG5D,IAAI,UAAmB;AACf,WAAA,KAAK,MAAM,WAAW;AAAA,EAAA;AAAA,EAG9B,IAAI,cAA+C;AAC3C,WAAA,KAAK,MAAM,KAAK,CAAChE,MAASA,EAAK,OAAO,KAAK,SAAS;AAAA,EAAA;AAAA,EAG5D,IAAI,UAAmB;AACtB,WAAO,KAAK,gBAAgB;AAAA,EAAA;AAAA,EAG7B,IAAI,WAAoB;AACvB,WAAO,KAAK,gBAAgB;AAAA,EAAA;AAAA,EAG7B,IAAI,mBAA4B;AACxB,WAAA,KAAK,MAAM,SAAS;AAAA,EAAA;AAAA,EAG5B,IAAI,eAAmC;AACtC,WAAO,KAAK,cAAc,SACvB,KAAK,MAAM,UAAU,CAACA,MAASA,EAAK,OAAO,KAAK,SAAS,IACzD;AAAA,EAAA;AAAA,EAEJ,IAAI,aAAaxF,GAA2B;;AACtC,SAAA,YACJA,MAAU,UAAYuJ,IAAA,KAAK,MAAM,GAAGvJ,CAAK,MAAnB,gBAAAuJ,EAAsB,KAAK;AAAA,EAAA;AAAA,EAGnD,IAAI,kBAA2B;AAC9B,WACC,KAAK,oBACL,KAAK,iBAAiB,UACtB,KAAK,eAAe;AAAA,EAAA;AAAA,EAItB,IAAI,cAAuB;AAEzB,WAAA,KAAK,oBACL,KAAK,iBAAiB,UACtB,KAAK,eAAe,KAAK,MAAM,SAAS;AAAA,EAAA;AAAA,EAI1C,IAAI,aAAsB;AACzB,WACC,KAAK,iBAAiB,UACtB,KAAK,iBAAiB,KAAK,MAAM,SAAS;AAAA,EAAA;AAAA,EAI5C,IAAI,gBAAuC;AAC1C,WAAO,KAAK,MAAM,OAAO,CAAC/D,MAASA,EAAK,UAAU;AAAA,EAAA;AAAA,EAGnD,IAAI,mBAA4B;AAC/B,WAAO,KAAK,cAAc,WAAW,KAAK,MAAM;AAAA,EAAA;AAAA,EAEjD,IAAI,iBAAiBxF,GAAgB;AACzB,eAAAwF,KAAQ,KAAK;AACvB,MAAAA,EAAK,aAAaxF;AAAA,EACnB;AAAA,EAGD,IAAI,0BAAiD;AACpD,WAAO,KAAK,cAAc,SAAS,IAAI,KAAK,gBAAgB,KAAK;AAAA,EAAA;AAAA,EAGlE,SAASA,GAAoC;AAC5C,SAAK,QAAQA;AAAA,EAAA;AAAA,EAGd,WAAiB;AAChB,SAAK,aAAa;AAAA,EAAA;AAAA,EAGnB,QAAc;AACb,SAAK,SAAS,GAEd,KAAK,eAAe,QACpB,KAAK,QAAQ,CAAC;AAAA,EAAA;AAAA,EAGf,cAAoB;AACR,eAAAwF,KAAQ,KAAK;AACvB,MAAAA,EAAK,SAAS;AAAA,EACf;AAAA,EAGD,eAAeA,GAA6C;AAC3D,SAAK,SAAS,GAEd,KAAK,YAAYA,KAAA,gBAAAA,EAAM;AAAA,EAAA;AAAA,EAGxB,aAAauB,GAAoC;AAC5C,IAAA,KAAK,iBAAiB,UAI1B,KAAK,MAAM,OAAO,KAAK,eAAe,GAAG,GAAG,GAAGA,CAAK;AAAA,EAAA;AAAA,EAGrD,iBAAiBA,GAAoC;AACpD,SAAK,MAAM,GAEN,KAAA,eAAeA,EAAM,CAAC,CAAC,GAE5B,KAAK,aAAaA,CAAK;AAAA,EAAA;AAAA,EAGxB,MAAM,SAASA,GAA6C;AAC3D,QAAI,KAAK,SAAS;AACjB,WAAK,iBAAiBA,CAAK;AAC3B;AAAA,IAAA;AAGD,SAAK,aAAaA,CAAK;AAAA,EAAA;AAAA,EAGxB,MAAM,wBAAuC;AAC5C,UAAM,KAAK;AAAA,MACV,KAAK,wBAAwB,IAAI,CAACvB,MAASA,EAAK,MAAO,CAAA;AAAA,IACxD,GAEA,KAAK,YAAY;AAAA,EAAA;AAAA,EAGlB,MAAM,SAASuB,GAA6C;AAC3D,QAAI,KAAK,SAAS;AACjB,WAAK,iBAAiBA,CAAK;AAC3B;AAAA,IAAA;AAGI,SAAA,MAAM,KAAK,GAAGA,CAAK;AAAA,EAAA;AAAA,EAGzB,MAAM,mBAAkC;AACvC,UAAM,KAAK;AAAA,MACV,KAAK,wBAAwB,IAAI,CAACvB,MAASA,EAAK,MAAO,CAAA;AAAA,IACxD,GAEA,KAAK,YAAY;AAAA,EAAA;AAAA,EAGlB,MAAM,UAAUuB,GAA6C;AAC5D,QAAI,KAAK,SAAS;AACjB,WAAK,iBAAiBA,CAAK;AAC3B;AAAA,IAAA;AAGK,UAAA,EAAE,cAAA0C,MAAiB;AACzB,IAAIA,MAAiB,WAIrB,KAAK,SAAS,GAEd,KAAK,MAAM,OAAOA,GAAc,GAAG,GAAG1C,CAAK,GAC3C,KAAK,eAAe0C;AAAA,EAAA;AAAA,EAGrB,SAASjE,GAA2BkE,GAAqB;AAClD,UAAAC,IAAU,KAAK,MAAM,OAAO,KAAK,MAAM,QAAQnE,CAAI,GAAG,CAAC,EAAE,CAAC;AAChE,SAAK,MAAM,OAAOkE,GAAO,GAAGC,CAAO;AAAA,EAAA;AAAA,EAGpC,MAAM,YAAY5C,GAA6C;AAKxD,UAAA,EAAE,aAAA6C,MAAgB;AAGnB,IAAAC,EAAA,KAAK,OAAO,GAAG9C,EAAM,OAAO,CAACvB,MAASA,MAASoE,CAAW,CAAC;AAG1D,UAAA,EAAE,cAAAH,GAAc,YAAAK,EAAA,IAAe;AAGrC,IAAAD;AAAA,MACC,KAAK;AAAA,MACL9C,EAAM,KAAK,CAACvB,MAASA,MAASoE,CAAW;AAAA,IAC1C,GAGI,KAAK,gBAAgBA,MACxB,KAAK,SAAS,GAEVE,IAEH,MAAM,KAAK,UAAU,IAGrB,KAAK,eAAeL;AAAA,EAEtB;AAAA,EAGD,MAAM,sBAAqC;AACpC,UAAA,KAAK,YAAY,KAAK,uBAAuB,GAEnD,KAAK,YAAY;AAAA,EAAA;AAAA,EAGlB,MAAM,iBAAiBjE,GAA0C;AAChE,UAAMuE,IAASvE,EAAK;AACpB,WAAO,KAAK;AAAA,MACX,KAAK,MAAM,OAAO,CAACA,MAASA,EAAK,OAAOuE,CAAM;AAAA,IAC/C;AAAA,EAAA;AAAA,EAGD,MAAM,iBAAiBvE,GAA0C;AAChE,UAAMwE,IAAY,KAAK,MAAM,QAAQxE,CAAI;AACzC,WAAO,KAAK;AAAA,MACX,KAAK,MAAM,OAAO,CAACyE,GAAGP,MAAUA,IAAQM,CAAS;AAAA,IAClD;AAAA,EAAA;AAAA,EAGD,eAAqB;AACpB,YAAQ,KAAK,QAAQ;AAAA,MACpB,KAAKrL,EAAW;AACf,aAAK,SAASA,EAAW;AACzB;AAAA,MACD,KAAKA,EAAW;AACf,aAAK,SAASA,EAAW;AACzB;AAAA,MACD,KAAKA,EAAW;AACf,aAAK,SAASA,EAAW;AACzB;AAAA,IAAA;AAAA,EACF;AAAA,EAGD,gBAAsB;AAChB,SAAA,UAAU,CAAC,KAAK;AAAA,EAAA;AAAA,EAGtB,MAAM,WAA0B;AAC3B,IAAA,KAAK,iBAAiB,UAIrB,KAAK,oBAIV,KAAK,SAAS,GAET,KAAA;AAAA,EAAA;AAAA,EAGN,MAAM,OAAsB;AACvB,IAAA,KAAK,iBAAiB,UAIrB,KAAK,gBAIV,KAAK,SAAS,GAET,KAAA;AAAA,EAAA;AAAA,EAGN,MAAM,YAA2B;AAC5B,IAAA,KAAK,iBAAiB,WAI1B,KAAK,eAAe;AAAA,EAAA;AAEtB;AC3WA,MAAMuL,IAAwBC,EAA8B,MAAU,GAMzDC,KAAyB,CAAC;AAAA,EACtC,UAAAC;AACD,MAAiD;AAC1C,QAAA,CAAC1J,CAAc,IAAIT;AAAA,IACxB,MAAM,IAAIoJ,GAAe,IAAIpB,EAA6B,CAAA;AAAA,EAC3D,GAEMlJ,IAAOC,EAAiB;AAE9B,SAAAqL,GAAU,MACFC;AAAA,IACN,MAAM5J,EAAe;AAAA,IACrB,OAAOiJ,GAAaY,MAAiB;AAChC,MAAAZ,MAAgB,UAAaY,MAAiB,UAKjDZ,EAAY,SAASY,EAAa,QAClCZ,EAAY,YAAYY,EAAa,WAE/B,MAAAxL,EAAK,eAAe,CAAC;AAAA,IAC5B;AAAA,EAEF,GACE,CAAC2B,GAAgB3B,CAAI,CAAC,uCAGvBkL,EAAsB,UAAtB,EAA+B,OAAOvJ,KACrC0J,CACF;AAEF,GAEaI,KAAoB,MACzBC,EAAWR,CAAqB,GC5C3BS,KAAoB7L;AAAA,EAChC,CAAC,EAAE,UAAAuL,EAAA,MAAqD;AACvD,UAAM1J,IAAiB8J,GAAkB;AAGxC,WAAA,sBAAA;AAAA,MAAC9C;AAAA,MAAA;AAAA,QACA,UAAQ;AAAA,QACR,OAAO;AAAA,UACN,cAAc,sBAAsB/I,CAAe;AAAA,QAAA;AAAA,MACpD;AAAA,MAECyL;AAAA,MAEA,CAAC1J,EAAe,WACf,sBAAA,cAAA8G,GAAA,EAAU,OAAO,EAAE,WAAWG,EAAe,OAAA,EAAU,CAAA;AAAA,IAE1D;AAAA,EAAA;AAGH;AC1BO,MAAMgD,GAAY;AAAA,EAKxB,YAAYrC,GAAmD;AAJ/D,IAAAE,EAAA,iBAAU;AACV,IAAAA,EAAA,iBAAU;AACV,IAAAA,EAAA,iBAAU;AAGT,IAAAF,EAAwB,eAAe,MAAM;AAAA,MAC5C,SAASG;AAAA,MACT,SAASA;AAAA,MACT,SAASA;AAAA,MACT,YAAYE;AAAA,MACZ,YAAYA;AAAA,MACZ,YAAYA;AAAA,MACZ,QAAQA,EAAO;AAAA,MACf,SAASA,EAAO;AAAA,MAChB,SAASA,EAAO;AAAA,MAChB,cAAcA,EAAO;AAAA,IAAA,CACrB;AAAA,EAAA;AAAA,EAGF,WAAW5I,GAAsB;AAChC,SAAK,UAAUA;AAAA,EAAA;AAAA,EAGhB,WAAWA,GAAqB;AAC/B,SAAK,UAAUA;AAAA,EAAA;AAAA,EAGhB,WAAWA,GAAsB;AAChC,SAAK,UAAUA;AAAA,EAAA;AAAA,EAGhB,SAAe;AACd,SAAK,UAAU;AAAA,EAAA;AAAA,EAGhB,UAAgB;AACf,SAAK,UAAU;AAAA,EAAA;AAAA,EAGhB,UAAgB;AACf,SAAK,UAAU;AAAA,EAAA;AAAA,EAGhB,aAAa,EAAE,SAAAX,KAA4B;AAC1C,IAAIA,MAAY,WACV,KAAK,YACT,KAAK,UAAUA;AAAA,EAEjB;AAIF;AC9CA,MAAMwL,IAAqBV,EAA2B,MAAU,GAMnDW,KAAsB,CAAC;AAAA,EACnC,UAAAT;AACD,MAA8C;AACvC,QAAA,CAACtL,CAAW,IAAImB;AAAA,IACrB,MAAM,IAAI0K,GAAY,IAAI1C,EAA6B,CAAA;AAAA,EACxD;AAEA,6CACE2C,EAAmB,UAAnB,EAA4B,OAAO9L,KAClCsL,CACF;AAEF,GAEaU,KAAiB,MACtBL,EAAWG,CAAkB;AC7B9B,MAAMG,GAA4D;AAAA,EACxE,eAGE7C,GAAWC,GAAoD;AACzD,WAAAD;AAAA,EAAA;AAET;"}
|
package/dist/main.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/dist/sw.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/package.json
ADDED
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@aigamo/hydrangean-diva",
|
|
3
|
+
"version": "0.0.1-alpha.4",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"dependencies": {
|
|
6
|
+
"@aigamo/nostalgic-diva": "^1.14.2",
|
|
7
|
+
"@aigamo/route-sphere": "^2.0.2",
|
|
8
|
+
"@elastic/datemath": "^5.0.3",
|
|
9
|
+
"@elastic/eui": "^101.2.0",
|
|
10
|
+
"@emotion/cache": "^11.14.0",
|
|
11
|
+
"@emotion/css": "^11.13.5",
|
|
12
|
+
"@emotion/react": "^11.14.0",
|
|
13
|
+
"@fluentui/react-icons": "^2.0.266",
|
|
14
|
+
"ajv": "^8.17.1",
|
|
15
|
+
"lodash-es": "^4.17.21",
|
|
16
|
+
"mobx": "^6.13.5",
|
|
17
|
+
"mobx-react-lite": "^4.0.7",
|
|
18
|
+
"moment": "^2.30.1",
|
|
19
|
+
"prop-types": "^15.8.1",
|
|
20
|
+
"qs": "^6.13.1",
|
|
21
|
+
"react": "^18.3.1",
|
|
22
|
+
"react-dom": "^18.3.1",
|
|
23
|
+
"react-router-dom": "^6.28.0",
|
|
24
|
+
"react-sortablejs": "^6.1.4",
|
|
25
|
+
"sortablejs": "^1.15.6",
|
|
26
|
+
"utility-types": "^3.11.0"
|
|
27
|
+
},
|
|
28
|
+
"devDependencies": {
|
|
29
|
+
"@types/lodash-es": "^4.17.12",
|
|
30
|
+
"@types/node": "^22.10.1",
|
|
31
|
+
"@types/qs": "^6.9.17",
|
|
32
|
+
"@types/react": "^18.3.14",
|
|
33
|
+
"@types/react-dom": "^18.3.2",
|
|
34
|
+
"@typescript-eslint/eslint-plugin": "^5.62.0",
|
|
35
|
+
"@typescript-eslint/parser": "^5.62.0",
|
|
36
|
+
"@vite-pwa/assets-generator": "^0.2.6",
|
|
37
|
+
"@vitejs/plugin-react": "^4.3.4",
|
|
38
|
+
"eslint": "^8.57.1",
|
|
39
|
+
"eslint-config-prettier": "^9.1.0",
|
|
40
|
+
"eslint-config-react-app": "^7.0.1",
|
|
41
|
+
"eslint-plugin-flowtype": "^8.0.3",
|
|
42
|
+
"eslint-plugin-import": "^2.31.0",
|
|
43
|
+
"eslint-plugin-jsx-a11y": "^6.10.2",
|
|
44
|
+
"eslint-plugin-prettier": "^5.2.1",
|
|
45
|
+
"eslint-plugin-react": "^7.37.2",
|
|
46
|
+
"eslint-plugin-react-hooks": "^4.6.2",
|
|
47
|
+
"eslint-plugin-simple-import-sort": "^12.1.1",
|
|
48
|
+
"jsdom": "^25.0.1",
|
|
49
|
+
"prettier": "^3.4.2",
|
|
50
|
+
"typescript": "^5.7.2",
|
|
51
|
+
"vite": "^5.4.19",
|
|
52
|
+
"vite-plugin-dts": "^4.5.4",
|
|
53
|
+
"vite-plugin-pwa": "^0.20.5",
|
|
54
|
+
"vitest": "^2.1.9",
|
|
55
|
+
"workbox-core": "^7.3.0",
|
|
56
|
+
"workbox-precaching": "^7.3.0",
|
|
57
|
+
"workbox-routing": "^7.3.0"
|
|
58
|
+
},
|
|
59
|
+
"peerDependencies": {
|
|
60
|
+
"react": "^18.3.1",
|
|
61
|
+
"react-dom": "^18.3.1"
|
|
62
|
+
},
|
|
63
|
+
"files": [
|
|
64
|
+
"dist"
|
|
65
|
+
],
|
|
66
|
+
"main": "./dist/index.cjs.js",
|
|
67
|
+
"module": "./dist/index.es.js",
|
|
68
|
+
"types": "./dist/index.d.ts",
|
|
69
|
+
"exports": {
|
|
70
|
+
".": {
|
|
71
|
+
"import": {
|
|
72
|
+
"types": "./dist/index.d.ts",
|
|
73
|
+
"default": "./dist/index.es.js"
|
|
74
|
+
},
|
|
75
|
+
"require": {
|
|
76
|
+
"types": "./dist/index.d.ts",
|
|
77
|
+
"default": "./dist/index.cjs.js"
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
},
|
|
81
|
+
"description": "An open-source online media player that can be deployed to and hosted on GitHub pages.",
|
|
82
|
+
"license": "",
|
|
83
|
+
"repository": {
|
|
84
|
+
"type": "git",
|
|
85
|
+
"url": "git+https://github.com/ycanardeau/hydrangean-diva.git"
|
|
86
|
+
},
|
|
87
|
+
"keywords": [
|
|
88
|
+
"react",
|
|
89
|
+
"player",
|
|
90
|
+
"audio",
|
|
91
|
+
"dailymotion",
|
|
92
|
+
"niconico",
|
|
93
|
+
"soundcloud",
|
|
94
|
+
"twitch",
|
|
95
|
+
"vimeo",
|
|
96
|
+
"youtube"
|
|
97
|
+
],
|
|
98
|
+
"author": "Aigamo <51428094+ycanardeau@users.noreply.github.com>",
|
|
99
|
+
"bugs": {
|
|
100
|
+
"url": "https://github.com/ycanardeau/hydrangean-diva/issues"
|
|
101
|
+
},
|
|
102
|
+
"scripts": {
|
|
103
|
+
"dev": "vite",
|
|
104
|
+
"build": "tsc && vite build",
|
|
105
|
+
"build:lib": "tsc && vite build --config vite.config.lib.ts",
|
|
106
|
+
"preview": "vite preview",
|
|
107
|
+
"test": "vitest --environment=jsdom"
|
|
108
|
+
}
|
|
109
|
+
}
|