From 4c0345ffab68cfecd92db05ae160c6ddf8bd6415 Mon Sep 17 00:00:00 2001 From: Radiquum Date: Tue, 8 Apr 2025 01:04:21 +0500 Subject: [PATCH 01/58] move selectors into player --- .../ReleasePlayer/EpisodeSelector.tsx | 5 +- .../ReleasePlayer/ReleasePlayerCustom.tsx | 114 ++++++++++++------ .../ReleasePlayer/SourceSelector.tsx | 8 +- .../ReleasePlayer/VoiceoverSelector.tsx | 8 +- 4 files changed, 88 insertions(+), 47 deletions(-) diff --git a/app/components/ReleasePlayer/EpisodeSelector.tsx b/app/components/ReleasePlayer/EpisodeSelector.tsx index 958555a..752bfbf 100644 --- a/app/components/ReleasePlayer/EpisodeSelector.tsx +++ b/app/components/ReleasePlayer/EpisodeSelector.tsx @@ -57,7 +57,7 @@ export const EpisodeSelector = (props: { } return ( -
+
@@ -82,7 +83,7 @@ export const EpisodeSelector = (props: { + ); + }) + : ""} +
+ ); +}; diff --git a/package-lock.json b/package-lock.json index 0af315f..0758888 100644 --- a/package-lock.json +++ b/package-lock.json @@ -41,6 +41,7 @@ "eslint-config-next": "14.2.5", "eslint-plugin-react-refresh": "^0.4.19", "postcss": "^8", + "tailwind-scrollbar": "^3.1.0", "tailwindcss": "^3.4.1" } }, @@ -6664,6 +6665,19 @@ "url": "https://github.com/sponsors/dcastil" } }, + "node_modules/tailwind-scrollbar": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/tailwind-scrollbar/-/tailwind-scrollbar-3.1.0.tgz", + "integrity": "sha512-pmrtDIZeHyu2idTejfV59SbaJyvp1VRjYxAjZBH0jnyrPRo6HL1kD5Glz8VPagasqr6oAx6M05+Tuw429Z8jxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.13.0" + }, + "peerDependencies": { + "tailwindcss": "3.x" + } + }, "node_modules/tailwindcss": { "version": "3.4.17", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz", diff --git a/package.json b/package.json index 35d5b6e..3b6982f 100644 --- a/package.json +++ b/package.json @@ -42,6 +42,7 @@ "eslint-config-next": "14.2.5", "eslint-plugin-react-refresh": "^0.4.19", "postcss": "^8", + "tailwind-scrollbar": "^3.1.0", "tailwindcss": "^3.4.1" } } diff --git a/tailwind.config.js b/tailwind.config.js index 1864db8..d3ac4d9 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -15,7 +15,8 @@ module.exports = { ], plugins: [ addIconSelectors(["mdi", "material-symbols", "twemoji", "fa6-brands"]), - flowbiteReact + flowbiteReact, + require("tailwind-scrollbar") ], darkMode: "selector", theme: { From 0168daa6cc6c66864ac25b47c7e448fd7eb5e70c Mon Sep 17 00:00:00 2001 From: Radiquum Date: Wed, 9 Apr 2025 06:24:08 +0500 Subject: [PATCH 06/58] add label --- .../ReleasePlayer/MediaPlayer.module.css | 2 +- .../ReleasePlayer/VoiceoverSelectorMenu.tsx | 73 ++++++++++--------- 2 files changed, 39 insertions(+), 36 deletions(-) diff --git a/app/components/ReleasePlayer/MediaPlayer.module.css b/app/components/ReleasePlayer/MediaPlayer.module.css index e772ab0..082e3c5 100644 --- a/app/components/ReleasePlayer/MediaPlayer.module.css +++ b/app/components/ReleasePlayer/MediaPlayer.module.css @@ -116,7 +116,7 @@ --media-settings-menu-min-width: calc(10 * var(--base)); --media-menu-transform-in: translateY(0) scale(1); --media-menu-transform-out: translateY(20px) rotate(3deg) scale(1); - background: rgb(30 30 30 / .8); + background: rgb(30 30 30 / .6); min-width: var(--media-settings-menu-min-width, 170px); position: absolute; right: 10px; diff --git a/app/components/ReleasePlayer/VoiceoverSelectorMenu.tsx b/app/components/ReleasePlayer/VoiceoverSelectorMenu.tsx index de208e7..2d6b357 100644 --- a/app/components/ReleasePlayer/VoiceoverSelectorMenu.tsx +++ b/app/components/ReleasePlayer/VoiceoverSelectorMenu.tsx @@ -63,43 +63,46 @@ export const VoiceoverSelectorMenu = ({ }, [release_id, token]); return ( -
- {voiceoverList && voiceoverList.length > 0 ? - voiceoverList.map((vo: Voiceover) => { - return ( - - ); - }) - : ""} + + ); + }) + : ""} +
); }; From 0a5b8a59e6aa2186f8ca730b5d41fe2ddbd60080 Mon Sep 17 00:00:00 2001 From: Radiquum Date: Wed, 9 Apr 2025 14:48:16 +0500 Subject: [PATCH 07/58] return source selection --- .../ReleasePlayer/ReleasePlayerCustom.tsx | 48 ++------ .../ReleasePlayer/SourceSelector.tsx | 76 ------------ .../ReleasePlayer/SourceSelectorMenu.tsx | 115 ++++++++++++++++++ .../ReleasePlayer/VoiceoverSelector.tsx | 104 ---------------- .../ReleasePlayer/VoiceoverSelectorMenu.tsx | 9 +- 5 files changed, 128 insertions(+), 224 deletions(-) delete mode 100644 app/components/ReleasePlayer/SourceSelector.tsx create mode 100644 app/components/ReleasePlayer/SourceSelectorMenu.tsx delete mode 100644 app/components/ReleasePlayer/VoiceoverSelector.tsx diff --git a/app/components/ReleasePlayer/ReleasePlayerCustom.tsx b/app/components/ReleasePlayer/ReleasePlayerCustom.tsx index 5b04cbf..22ee72a 100644 --- a/app/components/ReleasePlayer/ReleasePlayerCustom.tsx +++ b/app/components/ReleasePlayer/ReleasePlayerCustom.tsx @@ -42,6 +42,7 @@ import { MediaSettingsMenuItem, } from "media-chrome/react/menu"; import { VoiceoverSelectorMenu } from "./VoiceoverSelectorMenu"; +import { SourceSelectorMenu } from "./SourceSelectorMenu"; export const ReleasePlayerCustom = (props: { id: number; @@ -70,45 +71,6 @@ export const ReleasePlayerCustom = (props: { // const [isErrorDetailsOpen, setIsErrorDetailsOpen] = useState(false); // const [isLoading, setIsLoading] = useState(true); - // const playerPreferenceStore = useUserPlayerPreferencesStore(); - // const preferredVO = playerPreferenceStore.getPreferredVoiceover(props.id); - // const preferredSource = playerPreferenceStore.getPreferredPlayer(props.id); - - // old info fetching - - // useEffect(() => { - // const __getInfo = async () => { - // let url = `${ENDPOINTS.release.episode}/${props.id}/${voiceover.selected.id}`; - // const src = await _fetchAPI( - // url, - // "Не удалось получить информацию о источниках" - // ); - // if (src) { - // const selectedSrc = - // src.sources.find((source: any) => source.name === preferredSource) || - // src.sources[0]; - // if (selectedSrc.episodes_count == 0) { - // const remSources = src.sources.filter( - // (source: any) => source.id !== selectedSrc.id - // ); - // setSource({ - // selected: remSources[0], - // available: remSources, - // }); - // return; - // } - // setSource({ - // selected: selectedSrc, - // available: src.sources, - // }); - // } - // }; - // if (voiceover.selected) { - // __getInfo(); - // } - // // eslint-disable-next-line react-hooks/exhaustive-deps - // }, [voiceover.selected]); - // useEffect(() => { // const __getInfo = async () => { // let url = `${ENDPOINTS.release.episode}/${props.id}/${voiceover.selected.id}/${source.selected.id}`; @@ -364,6 +326,14 @@ export const ReleasePlayerCustom = (props: { setVoiceover={setVoiceover} setPlayerError={setPlayerError} /> + diff --git a/app/components/ReleasePlayer/SourceSelector.tsx b/app/components/ReleasePlayer/SourceSelector.tsx deleted file mode 100644 index f79e327..0000000 --- a/app/components/ReleasePlayer/SourceSelector.tsx +++ /dev/null @@ -1,76 +0,0 @@ -"use client"; - -import { Dropdown, DropdownItem } from "flowbite-react"; -import { numberDeclension } from "#/api/utils"; -import { useUserPlayerPreferencesStore } from "#/store/player"; - -interface Source { - id: number; - name: string; - episodes_count: number; -} - -const DropdownTrigger = ({ name }: Source) => { - return ( -
- -

{name}

- -
- ); -}; - -const DropdownItemInternal = ({ name, episodes_count }: Source) => { - return ( -
-
-

{name}

-
-
-

- {episodes_count}{" "} - {numberDeclension(episodes_count, "серия", "серии", "серий")} -

-
-
- ); -}; - -export const SourceSelector = (props: { - availableSource: Source[]; - source: Source; - setSource: any; - release_id: any; -}) => { - const playerPreferenceStore = useUserPlayerPreferencesStore(); - - return ( - ( - - - - )} - > - {props.availableSource.map((source: Source) => ( - { - playerPreferenceStore.setPreferredPlayer( - props.release_id, - source.name - ); - props.setSource({ - selected: source, - available: props.availableSource, - }); - }} - > - - - ))} - - ); -}; diff --git a/app/components/ReleasePlayer/SourceSelectorMenu.tsx b/app/components/ReleasePlayer/SourceSelectorMenu.tsx new file mode 100644 index 0000000..ab5f10e --- /dev/null +++ b/app/components/ReleasePlayer/SourceSelectorMenu.tsx @@ -0,0 +1,115 @@ +"use client"; + +import { ENDPOINTS } from "#/api/config"; +import { useEffect } from "react"; +import { _fetchAPI } from "./PlayerParsing"; +import { useUserPlayerPreferencesStore } from "#/store/player"; +import { numberDeclension } from "#/api/utils"; +import { Voiceover } from "./VoiceoverSelectorMenu"; + +export interface Source { + id: number; + name: string; + episodes_count: number; +} + +interface SourceSelectorMenuProps { + release_id: number; + setSource: (state) => void; + voiceover: Voiceover; + source: Source; + sourceList: Source[]; + setPlayerError: (state) => void; +} + +export const SourceSelectorMenu = ({ + release_id, + setSource, + voiceover, + source, + sourceList, + setPlayerError, +}: SourceSelectorMenuProps) => { + const playerPreferenceStore = useUserPlayerPreferencesStore(); + const preferredSource = playerPreferenceStore.getPreferredPlayer(release_id); + + useEffect(() => { + const __getInfo = async () => { + let url = `${ENDPOINTS.release.episode}/${release_id}/${voiceover.id}`; + const src = await _fetchAPI( + url, + "Не удалось получить информацию о источниках", + setPlayerError + ); + if (src) { + const selectedSrc = + src.sources.find( + (source: Source) => source.name === preferredSource + ) || src.sources[0]; + if (selectedSrc.episodes_count == 0) { + const remSources = src.sources.filter( + (source: any) => source.id !== selectedSrc.id + ); + setSource({ + selected: remSources[0], + available: remSources, + }); + return; + } + setSource({ + selected: selectedSrc, + available: src.sources, + }); + } + }; + if (voiceover) { + __getInfo(); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [voiceover]); + + return ( +
+

Источник

+
+ {sourceList && sourceList.length > 0 ? + sourceList.map((src: Source) => { + return ( + + ); + }) + : ""} +
+
+ ); +}; diff --git a/app/components/ReleasePlayer/VoiceoverSelector.tsx b/app/components/ReleasePlayer/VoiceoverSelector.tsx deleted file mode 100644 index 203ceb1..0000000 --- a/app/components/ReleasePlayer/VoiceoverSelector.tsx +++ /dev/null @@ -1,104 +0,0 @@ -"use client"; - -import { Dropdown, DropdownItem } from "flowbite-react"; -import { numberDeclension } from "#/api/utils"; -import { useUserPlayerPreferencesStore } from "#/store/player"; - -interface Voiceover { - id: number; - name: string; - icon: string; - episodes_count: number; - view_count: number; - pinned: boolean; -} - -const DropdownTrigger = ({ icon, name, pinned }: Voiceover) => { - return ( -
- {/* eslint-disable-next-line @next/next/no-img-element */} - {icon && } -

{name}

- {pinned && ( - - )} - -
- ); -}; - -const DropdownItemInternal = ({ - icon, - name, - pinned, - episodes_count, - view_count, -}: Voiceover) => { - return ( -
-
- {/* eslint-disable-next-line @next/next/no-img-element */} - {icon && } -

{name}

- {pinned && ( - - )} -
-
-

- {episodes_count}{" "} - {numberDeclension(episodes_count, "серия", "серии", "серий")} -

-

- {view_count}{" "} - {numberDeclension(view_count, "просмотр", "просмотра", "просмотров")} -

-
-
- ); -}; - -const DropdownTheme = { - content: "md:grid md:grid-cols-2 xl:grid-cols-4 gap-2 w-full container", -}; - -export const VoiceoverSelector = (props: { - availableVoiceover: Voiceover[]; - voiceover: Voiceover; - setVoiceover: any; - release_id: number; -}) => { - const playerPreferenceStore = useUserPlayerPreferencesStore(); - - return ( - ( - - - - )} - > - {props.availableVoiceover.map((voiceover: Voiceover) => ( - { - playerPreferenceStore.setPreferredVoiceover( - props.release_id, - voiceover.name - ); - props.setVoiceover({ - selected: voiceover, - available: props.availableVoiceover, - }); - }} - > - - - ))} - - ); -}; diff --git a/app/components/ReleasePlayer/VoiceoverSelectorMenu.tsx b/app/components/ReleasePlayer/VoiceoverSelectorMenu.tsx index 2d6b357..1fd76df 100644 --- a/app/components/ReleasePlayer/VoiceoverSelectorMenu.tsx +++ b/app/components/ReleasePlayer/VoiceoverSelectorMenu.tsx @@ -4,10 +4,9 @@ import { ENDPOINTS } from "#/api/config"; import { useEffect } from "react"; import { _fetchAPI } from "./PlayerParsing"; import { useUserPlayerPreferencesStore } from "#/store/player"; -import { Button } from "flowbite-react"; import { numberDeclension } from "#/api/utils"; -interface Voiceover { +export interface Voiceover { id: number; name: string; icon: string; @@ -50,7 +49,7 @@ export const VoiceoverSelectorMenu = ({ ); if (vo) { const selectedVO = - vo.types.find((voiceover: any) => voiceover.name === preferredVO) || + vo.types.find((voiceover: Voiceover) => voiceover.name === preferredVO) || vo.types[0]; setVoiceover({ selected: selectedVO, @@ -64,8 +63,8 @@ export const VoiceoverSelectorMenu = ({ return (
-

Озвучка

-
+

Озвучка

+
{voiceoverList && voiceoverList.length > 0 ? voiceoverList.map((vo: Voiceover) => { return ( From 5264534693bc101218096b6543407582886f051b Mon Sep 17 00:00:00 2001 From: Radiquum Date: Wed, 9 Apr 2025 17:11:08 +0500 Subject: [PATCH 08/58] feat: add a menu for selecting voiceover, source and episode inside of a player --- .../ReleasePlayer/EpisodeSelectorMenu.tsx | 131 +++++++++ .../ReleasePlayer/MediaPlayer.module.css | 9 +- .../ReleasePlayer/ReleasePlayerCustom.tsx | 260 +++++++++--------- .../ReleasePlayer/SourceSelectorMenu.tsx | 2 +- .../ReleasePlayer/VoiceoverSelectorMenu.tsx | 6 +- 5 files changed, 266 insertions(+), 142 deletions(-) diff --git a/app/components/ReleasePlayer/EpisodeSelectorMenu.tsx b/app/components/ReleasePlayer/EpisodeSelectorMenu.tsx index e69de29..e694cb4 100644 --- a/app/components/ReleasePlayer/EpisodeSelectorMenu.tsx +++ b/app/components/ReleasePlayer/EpisodeSelectorMenu.tsx @@ -0,0 +1,131 @@ +"use client"; + +import { ENDPOINTS } from "#/api/config"; +import { useEffect, useState } from "react"; +import { _fetchAPI } from "./PlayerParsing"; + +import { Voiceover } from "./VoiceoverSelectorMenu"; +import { Source } from "./SourceSelectorMenu"; +import { getAnonEpisodesWatched } from "./ReleasePlayer"; + +export interface Episode { + position: number; + name: string; + is_watched: boolean; +} +interface EpisodeSelectorMenuProps { + release_id: number; + voiceover: Voiceover; + source: Source; + token: string | null; + setEpisode: (state) => void; + episode: Episode; + episodeList: Episode[]; + setPlayerError: (state) => void; +} + +export const EpisodeSelectorMenu = ({ + release_id, + token, + voiceover, + source, + setEpisode, + episode, + episodeList, + setPlayerError, +}: EpisodeSelectorMenuProps) => { + const [watchedEpisodes, setWatchedEpisodes] = useState([]); + useEffect(() => { + const __getInfo = async () => { + let url = `${ENDPOINTS.release.episode}/${release_id}/${voiceover.id}/${source.id}`; + if (token) { + url += `?token=${token}`; + } + const episodes = await _fetchAPI( + url, + "Не удалось получить информацию о эпизодах", + setPlayerError + ); + if (episodes) { + let anonEpisodesWatched = getAnonEpisodesWatched( + release_id, + source.id, + voiceover.id + ); + let lastEpisodeWatched = Math.max.apply( + 0, + Object.keys(anonEpisodesWatched[release_id][source.id][voiceover.id]) + ); + let selectedEpisode = + episodes.episodes.find( + (episode: Episode) => episode.position == lastEpisodeWatched + ) || episodes.episodes[0]; + + setEpisode({ + selected: selectedEpisode, + available: episodes.episodes, + }); + } + }; + if (source) { + __getInfo(); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [source]); + + useEffect(() => { + if (release_id && source && voiceover) { + const anonEpisodesWatched = getAnonEpisodesWatched( + release_id, + source.id, + voiceover.id + ); + setWatchedEpisodes( + anonEpisodesWatched[release_id][source.id][voiceover.id] + ); + } + }, [release_id, source, voiceover]); + + return ( +
+

Эпизод

+
+ {episodeList && episodeList.length > 0 ? + episodeList.map((epis: Episode) => { + return ( + + ); + }) + : ""} +
+
+ ); +}; diff --git a/app/components/ReleasePlayer/MediaPlayer.module.css b/app/components/ReleasePlayer/MediaPlayer.module.css index 082e3c5..f10fa20 100644 --- a/app/components/ReleasePlayer/MediaPlayer.module.css +++ b/app/components/ReleasePlayer/MediaPlayer.module.css @@ -12,7 +12,7 @@ --media-primary-color: #fff; --media-secondary-color: transparent; - --media-menu-background: rgba(28, 28, 28, 0.6); + --media-menu-background: rgba(28, 28, 28, 0.8); --media-text-color: var(--_primary-color); --media-control-hover-background: var(--media-secondary-color); @@ -116,11 +116,12 @@ --media-settings-menu-min-width: calc(10 * var(--base)); --media-menu-transform-in: translateY(0) scale(1); --media-menu-transform-out: translateY(20px) rotate(3deg) scale(1); - background: rgb(30 30 30 / .6); + background: rgba(28, 28, 28, 0.8); min-width: var(--media-settings-menu-min-width, 170px); position: absolute; right: 10px; bottom: calc(3 * var(--base)); + padding: 0; padding-block: calc(0.15 * var(--base)); padding-inline: calc(0.6 * var(--base)); margin-right: 10px; @@ -131,6 +132,10 @@ max-height: 50%; } +.media-controller media-chrome-dialog > div { + word-wrap: normal !important; +} + .media-settings-menu[hidden] { display: block; visibility: visible; diff --git a/app/components/ReleasePlayer/ReleasePlayerCustom.tsx b/app/components/ReleasePlayer/ReleasePlayerCustom.tsx index 22ee72a..b038e32 100644 --- a/app/components/ReleasePlayer/ReleasePlayerCustom.tsx +++ b/app/components/ReleasePlayer/ReleasePlayerCustom.tsx @@ -43,6 +43,12 @@ import { } from "media-chrome/react/menu"; import { VoiceoverSelectorMenu } from "./VoiceoverSelectorMenu"; import { SourceSelectorMenu } from "./SourceSelectorMenu"; +import { + _fetchAnilibriaManifest, + _fetchKodikManifest, + _fetchSibnetManifest, +} from "./PlayerParsing"; +import { EpisodeSelectorMenu } from "./EpisodeSelectorMenu"; export const ReleasePlayerCustom = (props: { id: number; @@ -60,120 +66,87 @@ export const ReleasePlayerCustom = (props: { selected: null, available: null, }); - const [playerProps, SetPlayerProps] = useState({ + const [playerProps, SetPlayerProps] = useState<{ + src: string | null; + poster: string | null; + type: "hls" | "mp4" | null; + }>({ src: null, poster: null, type: null, - useCustom: false, }); const [playerError, setPlayerError] = useState(null); - // const [playbackRate, setPlaybackRate] = useState(1); + const [playbackRate, setPlaybackRate] = useState(1); // const [isErrorDetailsOpen, setIsErrorDetailsOpen] = useState(false); - // const [isLoading, setIsLoading] = useState(true); + const [isLoading, setIsLoading] = useState(true); - // useEffect(() => { - // const __getInfo = async () => { - // let url = `${ENDPOINTS.release.episode}/${props.id}/${voiceover.selected.id}/${source.selected.id}`; - // if (props.token) { - // url += `?token=${props.token}`; - // } - // const episodes = await _fetchAPI( - // url, - // "Не удалось получить информацию о эпизодах" - // ); - // if (episodes) { - // let anonEpisodesWatched = getAnonEpisodesWatched( - // props.id, - // source.selected.id, - // voiceover.selected.id - // ); - // let lastEpisodeWatched = Math.max.apply( - // 0, - // Object.keys( - // anonEpisodesWatched[props.id][source.selected.id][ - // voiceover.selected.id - // ] - // ) - // ); - // let selectedEpisode = - // episodes.episodes.find( - // (episode: any) => episode.position == lastEpisodeWatched - // ) || episodes.episodes[0]; + useEffect(() => { + const __getInfo = async () => { + if (source.selected.name == "Kodik") { + const { manifest, poster } = await _fetchKodikManifest( + episode.selected.url, + setPlayerError + ); + if (manifest) { + SetPlayerProps({ + src: manifest, + poster: poster, + type: "hls", + }); + setIsLoading(false); + } + return; + } + if (source.selected.name == "Libria") { + const { manifest, poster } = await _fetchAnilibriaManifest( + episode.selected.url, + setPlayerError + ); + if (manifest) { + SetPlayerProps({ + src: manifest, + poster: poster, + type: "hls", + }); + setIsLoading(false); + } + return; + } + if (source.selected.name == "Sibnet") { + const { manifest, poster } = await _fetchSibnetManifest( + episode.selected.url, + setPlayerError + ); + if (manifest) { + SetPlayerProps({ + src: manifest, + poster: poster, + type: "mp4", + }); + setIsLoading(false); + } + return; + } + SetPlayerProps({ + src: episode.selected.url, + poster: null, + type: null, + }); + setIsLoading(false); + }; + if (episode.selected) { + setIsLoading(true); + setPlayerError(null); + __getInfo(); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [episode.selected]); - // setEpisode({ - // selected: selectedEpisode, - // available: episodes.episodes, - // }); - // } - // }; - // if (source.selected) { - // __getInfo(); - // } - // // eslint-disable-next-line react-hooks/exhaustive-deps - // }, [source.selected]); - - // useEffect(() => { - // const __getInfo = async () => { - // if (source.selected.name == "Kodik") { - // const { manifest, poster } = await _fetchKodikManifest( - // episode.selected.url - // ); - // if (manifest) { - // SetPlayerProps({ - // src: manifest, - // poster: poster, - // useCustom: true, - // type: "hls", - // }); - // setIsLoading(false); - // } - // return; - // } - // if (source.selected.name == "Libria") { - // const { manifest, poster } = await _fetchAnilibriaManifest( - // episode.selected.url - // ); - // if (manifest) { - // SetPlayerProps({ - // src: manifest, - // poster: poster, - // useCustom: true, - // type: "hls", - // }); - // setIsLoading(false); - // } - // return; - // } - // if (source.selected.name == "Sibnet") { - // const { manifest, poster } = await _fetchSibnetManifest( - // episode.selected.url - // ); - // if (manifest) { - // SetPlayerProps({ - // src: manifest, - // poster: poster, - // useCustom: true, - // type: "mp4", - // }); - // setIsLoading(false); - // } - // return; - // } - // SetPlayerProps({ - // src: episode.selected.url, - // poster: null, - // useCustom: false, - // type: null, - // }); - // setIsLoading(false); - // }; - // if (episode.selected) { - // setIsLoading(true); - // setPlayerError(null); - // __getInfo(); - // } - // // eslint-disable-next-line react-hooks/exhaustive-deps - // }, [episode.selected]); + useEffect(() => { + if (document && document.querySelector("media-chrome-dialog")) { + document.querySelector("media-chrome-dialog").shadowRoot.querySelector("slot").style.width = "100%"; + } + }, []) return ( @@ -255,35 +228,40 @@ export const ReleasePlayerCustom = (props: { defaultStreamType="on-demand" className={`relative w-full overflow-hidden ${Styles["media-controller"]}`} > - {/*
- {voiceover.selected && ( - - )} - {source.selected && ( - - )} -
*/} - { - // // @ts-ignore - // setPlaybackRate(e.target.playbackRate || 1); - // }} - /> + {playerProps.type == "hls" && ( + { + // @ts-ignore + setPlaybackRate(e.target.playbackRate || 1); + }} + /> + )} + {playerProps.type == "mp4" && ( + { + // @ts-ignore + setPlaybackRate(e.target.playbackRate || 1); + }} + > + )} + {(playerProps.type == null || playerProps.src == null) && ( + + )}
+ /> +
diff --git a/app/components/ReleasePlayer/SourceSelectorMenu.tsx b/app/components/ReleasePlayer/SourceSelectorMenu.tsx index ab5f10e..ac23c7f 100644 --- a/app/components/ReleasePlayer/SourceSelectorMenu.tsx +++ b/app/components/ReleasePlayer/SourceSelectorMenu.tsx @@ -77,7 +77,7 @@ export const SourceSelectorMenu = ({ return ( ))}
- )} + } ); }; diff --git a/app/components/ReleasePlayer/ReleasePlayerCustom.tsx b/app/components/ReleasePlayer/ReleasePlayerCustom.tsx index 66e646d..3d58d7e 100644 --- a/app/components/ReleasePlayer/ReleasePlayerCustom.tsx +++ b/app/components/ReleasePlayer/ReleasePlayerCustom.tsx @@ -40,7 +40,10 @@ import { Episode, EpisodeSelectorMenu } from "./EpisodeSelectorMenu"; import HlsVideo from "hls-video-element/react"; import VideoJS from "videojs-video-element/react"; import { ENDPOINTS } from "#/api/config"; -import { saveAnonEpisodeWatched } from "./ReleasePlayer"; +import { + getAnonEpisodesWatched, + saveAnonEpisodeWatched, +} from "./ReleasePlayer"; import { usePreferencesStore } from "#/store/preferences"; export const ReleasePlayerCustom = (props: { @@ -147,33 +150,44 @@ export const ReleasePlayerCustom = (props: { }, []); function saveEpisodeToHistory() { - if ( - preferenceStore.flags.saveWatchHistory && - episode.selected && - !episode.selected.is_watched - ) { - const objectToReplace = episode.available.find( - (arrayItem: Episode) => arrayItem.position === episode.selected.position - ); - const newObject = { - ...episode.selected, - is_watched: true, - }; - Object.assign(objectToReplace, newObject); - - saveAnonEpisodeWatched( + if (props.id && source.selected && voiceover.selected && episode.selected) { + const anonEpisodesWatched = getAnonEpisodesWatched( props.id, source.selected.id, - voiceover.selected.id, - episode.selected.position + voiceover.selected.id ); - if (props.token) { - fetch( - `${ENDPOINTS.statistic.addHistory}/${props.id}/${source.selected.id}/${episode.selected.position}?token=${props.token}` + if ( + preferenceStore.flags.saveWatchHistory && + !episode.selected.is_watched && + !Object.keys( + anonEpisodesWatched[props.id][source.selected.id][ + voiceover.selected.id + ] + ).includes(episode.selected.position.toString()) + ) { + const objectToReplace = episode.available.find( + (arrayItem: Episode) => + arrayItem.position === episode.selected.position ); - fetch( - `${ENDPOINTS.statistic.markWatched}/${props.id}/${source.selected.id}/${episode.selected.position}?token=${props.token}` + const newObject = { + ...episode.selected, + is_watched: true, + }; + Object.assign(objectToReplace, newObject); + saveAnonEpisodeWatched( + props.id, + source.selected.id, + voiceover.selected.id, + episode.selected.position ); + if (props.token) { + fetch( + `${ENDPOINTS.statistic.addHistory}/${props.id}/${source.selected.id}/${episode.selected.position}?token=${props.token}` + ); + fetch( + `${ENDPOINTS.statistic.markWatched}/${props.id}/${source.selected.id}/${episode.selected.position}?token=${props.token}` + ); + } } } } From da6639d799a14b7f96aa790ca0079581310838a5 Mon Sep 17 00:00:00 2001 From: Radiquum Date: Sat, 12 Apr 2025 21:28:46 +0500 Subject: [PATCH 30/58] fix: episode changing via buttons --- app/components/ReleasePlayer/ReleasePlayerCustom.tsx | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/app/components/ReleasePlayer/ReleasePlayerCustom.tsx b/app/components/ReleasePlayer/ReleasePlayerCustom.tsx index 3d58d7e..d85368a 100644 --- a/app/components/ReleasePlayer/ReleasePlayerCustom.tsx +++ b/app/components/ReleasePlayer/ReleasePlayerCustom.tsx @@ -75,6 +75,7 @@ export const ReleasePlayerCustom = (props: { const [playerError, setPlayerError] = useState(null); const [playbackRate, setPlaybackRate] = useState(1); const [isErrorDetailsOpen, setIsErrorDetailsOpen] = useState(false); + const [isEpLoadingTimeout, setIsEpLoadingTimeout] = useState(null); const [retryCount, setRetryCount] = useState(0); @@ -130,13 +131,20 @@ export const ReleasePlayerCustom = (props: { }); }; if (episode.selected) { + if (isEpLoadingTimeout) { + clearTimeout(isEpLoadingTimeout); + } + setPlayerError(null); SetPlayerProps({ src: null, poster: null, type: null, }); - setPlayerError(null); - __getInfo(); + setIsEpLoadingTimeout( + setTimeout(() => { + __getInfo(); + }, 250) + ); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [episode.selected, retryCount]); From 73fb51d9149ae906c08441a1e3f779e154e40768 Mon Sep 17 00:00:00 2001 From: Radiquum Date: Sun, 13 Apr 2025 02:18:52 +0500 Subject: [PATCH 31/58] fix: parsing of kodik manifest --- app/components/ReleasePlayer/PlayerParsing.ts | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/app/components/ReleasePlayer/PlayerParsing.ts b/app/components/ReleasePlayer/PlayerParsing.ts index 8b57b7f..5fca19b 100644 --- a/app/components/ReleasePlayer/PlayerParsing.ts +++ b/app/components/ReleasePlayer/PlayerParsing.ts @@ -84,15 +84,18 @@ export const _fetchKodikManifest = async ( } if (lowQualityLink.includes("https://")) { - // string the https prefix, since we add it manually + // strip the https prefix, since we add it manually lowQualityLink = lowQualityLink.replace("https://", "//"); } let manifest = `https:${lowQualityLink.replace("360.mp4:hls:", "")}`; let poster = `https:${lowQualityLink.replace("360.mp4:hls:manifest.m3u8", "thumb001.jpg")}`; - if (lowQualityLink.includes("animetvseries")) { - // if link includes "animetvseries" we need to construct manifest ourselves + if ( + lowQualityLink.includes("animetvseries") || + lowQualityLink.includes("tvseries") + ) { + // if link includes "animetvseries" or "tvseries" we need to construct manifest ourselves let blobTxt = "#EXTM3U\n"; if (data.links.hasOwnProperty("240")) { @@ -139,7 +142,7 @@ export const _fetchAnilibriaManifest = async ( ) => { const id = url.split("?id=")[1].split("&ep=")[0]; const epid = url.split("?id=")[1].split("&ep=")[1]; - const _url = `https://api.anilibria.tv/v3/title?id=${id}` + const _url = `https://api.anilibria.tv/v3/title?id=${id}`; const data = await _fetchPlayer( `https://anix-player.wah.su/?url=${_url}&player=libria`, setPlayerError From 42d838a497a57828b3ca5811801807ed78f421d4 Mon Sep 17 00:00:00 2001 From: Radiquum Date: Sun, 13 Apr 2025 02:43:32 +0500 Subject: [PATCH 32/58] fix: manual kodik manifest parsing --- app/components/ReleasePlayer/PlayerParsing.ts | 97 +++++++++++++++---- 1 file changed, 79 insertions(+), 18 deletions(-) diff --git a/app/components/ReleasePlayer/PlayerParsing.ts b/app/components/ReleasePlayer/PlayerParsing.ts index 5fca19b..bb87f33 100644 --- a/app/components/ReleasePlayer/PlayerParsing.ts +++ b/app/components/ReleasePlayer/PlayerParsing.ts @@ -61,6 +61,15 @@ export async function _fetchPlayer( return data; } +function decryptKodikLink(enc: string) { + const decryptedBase64 = enc.replace(/[a-zA-Z]/g, (e: any) => { + return String.fromCharCode( + (e <= "Z" ? 90 : 122) >= (e = e.charCodeAt(0) + 18) ? e : e - 26 + ); + }); + return atob(decryptedBase64); +} + export const _fetchKodikManifest = async ( url: string, setPlayerError: (state) => void @@ -75,12 +84,7 @@ export const _fetchKodikManifest = async ( if (!lowQualityLink.includes("//")) { // check if link is encrypted, else do nothing - const decryptedBase64 = lowQualityLink.replace(/[a-zA-Z]/g, (e) => { - return String.fromCharCode( - (e <= "Z" ? 90 : 122) >= (e = e.charCodeAt(0) + 18) ? e : e - 26 - ); - }); - lowQualityLink = atob(decryptedBase64); + lowQualityLink = decryptKodikLink(lowQualityLink); } if (lowQualityLink.includes("https://")) { @@ -100,30 +104,87 @@ export const _fetchKodikManifest = async ( if (data.links.hasOwnProperty("240")) { blobTxt += "#EXT-X-STREAM-INF:RESOLUTION=427x240,BANDWIDTH=200000\n"; - !data.links["240"][0].src.startsWith("https:") ? - (blobTxt += `https:${data.links["240"][0].src}\n`) - : (blobTxt += `${data.links["240"][0].src}\n`); + let link = data.links["240"][0].src; + let dec = null; + link.includes("//") ? + link.startsWith("https:") ? + (blobTxt += `${link}\n`) + : (blobTxt += `https:${link}\n`) + : (dec = decryptKodikLink(link)); + + dec ? + dec.startsWith("https:") ? + (blobTxt += `${dec}\n`) + : (blobTxt += `https:${dec}\n`) + : null; } if (data.links.hasOwnProperty("360")) { blobTxt += "#EXT-X-STREAM-INF:RESOLUTION=578x360,BANDWIDTH=400000\n"; - !data.links["360"][0].src.startsWith("https:") ? - (blobTxt += `https:${data.links["360"][0].src}\n`) - : (blobTxt += `${data.links["360"][0].src}\n`); + let link = data.links["360"][0].src; + let dec = null; + link.includes("//") ? + link.startsWith("https:") ? + (blobTxt += `${link}\n`) + : (blobTxt += `https:${link}\n`) + : (dec = decryptKodikLink(link)); + + dec ? + dec.startsWith("https:") ? + (blobTxt += `${dec}\n`) + : (blobTxt += `https:${dec}\n`) + : null; } if (data.links.hasOwnProperty("480")) { blobTxt += "#EXT-X-STREAM-INF:RESOLUTION=854x480,BANDWIDTH=596000\n"; - !data.links["480"][0].src.startsWith("https:") ? - (blobTxt += `https:${data.links["480"][0].src}\n`) - : (blobTxt += `${data.links["480"][0].src}\n`); + let link = data.links["480"][0].src; + let dec = null; + link.includes("//") ? + link.startsWith("https:") ? + (blobTxt += `${link}\n`) + : (blobTxt += `https:${link}\n`) + : (dec = decryptKodikLink(link)); + + dec ? + dec.startsWith("https:") ? + (blobTxt += `${dec}\n`) + : (blobTxt += `https:${dec}\n`) + : null; } if (data.links.hasOwnProperty("720")) { blobTxt += "#EXT-X-STREAM-INF:RESOLUTION=1280x720,BANDWIDTH=1280000\n"; - !data.links["720"][0].src.startsWith("https:") ? - (blobTxt += `https:${data.links["720"][0].src}\n`) - : (blobTxt += `${data.links["720"][0].src}\n`); + let link = data.links["720"][0].src; + let dec = null; + link.includes("//") ? + link.startsWith("https:") ? + (blobTxt += `${link}\n`) + : (blobTxt += `https:${link}\n`) + : (dec = decryptKodikLink(link)); + + dec ? + dec.startsWith("https:") ? + (blobTxt += `${dec}\n`) + : (blobTxt += `https:${dec}\n`) + : null; + } + + if (data.links.hasOwnProperty("1080")) { + blobTxt += "#EXT-X-STREAM-INF:RESOLUTION=1920x1080,BANDWIDTH=2560000\n"; + let link = data.links["1080"][0].src; + let dec = null; + link.includes("//") ? + link.startsWith("https:") ? + (blobTxt += `${link}\n`) + : (blobTxt += `https:${link}\n`) + : (dec = decryptKodikLink(link)); + + dec ? + dec.startsWith("https:") ? + (blobTxt += `${dec}\n`) + : (blobTxt += `https:${dec}\n`) + : null; } let file = new File([blobTxt], "manifest.m3u8", { From c2fc45340686dfd2fd8f402368b126467d7b790b Mon Sep 17 00:00:00 2001 From: Radiquum Date: Thu, 29 May 2025 15:04:42 +0500 Subject: [PATCH 33/58] remove github workflow --- .github/workflows/DeployPreviewToVercel.yml | 28 --------------------- .github/workflows/DeployTagToVercel.yml | 28 --------------------- vercel.json | 6 ----- 3 files changed, 62 deletions(-) delete mode 100644 .github/workflows/DeployPreviewToVercel.yml delete mode 100644 .github/workflows/DeployTagToVercel.yml diff --git a/.github/workflows/DeployPreviewToVercel.yml b/.github/workflows/DeployPreviewToVercel.yml deleted file mode 100644 index d9e97fa..0000000 --- a/.github/workflows/DeployPreviewToVercel.yml +++ /dev/null @@ -1,28 +0,0 @@ -name: V3 Preview Deployment -env: - VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }} - VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }} -on: - push: - # Pattern matched against refs/tags - branches: - - 'V3' - paths-ignore: - - '**/README.md' - - '**/LICENSE' - - '**/TODO.md' - - '**/docs/**' - - '**/extension/**' -jobs: - Deploy-Preview: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - name: Install Vercel CLI - run: npm install --global vercel@latest - - name: Pull Vercel Environment Information - run: vercel pull --yes --environment=preview --token=${{ secrets.VERCEL_TOKEN }} - - name: Build Project Artifacts - run: vercel build --token=${{ secrets.VERCEL_TOKEN }} - - name: Deploy Project Artifacts to Vercel - run: vercel deploy --prebuilt --token=${{ secrets.VERCEL_TOKEN }} \ No newline at end of file diff --git a/.github/workflows/DeployTagToVercel.yml b/.github/workflows/DeployTagToVercel.yml deleted file mode 100644 index fc7ea21..0000000 --- a/.github/workflows/DeployTagToVercel.yml +++ /dev/null @@ -1,28 +0,0 @@ -name: Production Tag Deployment -env: - VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }} - VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }} -on: - push: - # Pattern matched against refs/tags - tags: - - '*' # Push events to every tag not containing / - paths-ignore: - - '**/README.md' - - '**/LICENSE' - - '**/TODO.md' - - '**/docs/**' - - '**/extension/**' -jobs: - Deploy-Production: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - name: Install Vercel CLI - run: npm install --global vercel@latest - - name: Pull Vercel Environment Information - run: vercel pull --yes --environment=production --token=${{ secrets.VERCEL_TOKEN }} - - name: Build Project Artifacts - run: vercel build --prod --token=${{ secrets.VERCEL_TOKEN }} - - name: Deploy Project Artifacts to Vercel - run: vercel deploy --prebuilt --prod --token=${{ secrets.VERCEL_TOKEN }} \ No newline at end of file diff --git a/vercel.json b/vercel.json index 4197322..78bf024 100644 --- a/vercel.json +++ b/vercel.json @@ -1,10 +1,4 @@ { - "git": { - "deploymentEnabled": { - "V3": false, - "V2": false - } - }, "headers": [ { "source": "/bookmarks/:slug*", From 88064f05c47d16af18694cf7bf2a6bf3bf022088 Mon Sep 17 00:00:00 2001 From: Radiquum Date: Thu, 29 May 2025 15:12:53 +0500 Subject: [PATCH 34/58] remove analytics --- app/App.tsx | 9 --------- app/components/SettingsModal/SettingsModal.tsx | 17 ----------------- app/store/preferences.ts | 2 -- next.config.js | 5 +---- package-lock.json | 15 --------------- package.json | 1 - 6 files changed, 1 insertion(+), 48 deletions(-) diff --git a/app/App.tsx b/app/App.tsx index 3733cd1..5940207 100644 --- a/app/App.tsx +++ b/app/App.tsx @@ -7,7 +7,6 @@ import { useEffect, useState } from "react"; import { Button, Modal, ModalBody, ModalFooter, ModalHeader } from "flowbite-react"; import { Spinner } from "./components/Spinner/Spinner"; import { ChangelogModal } from "#/components/ChangelogModal/ChangelogModal"; -import PlausibleProvider from "next-plausible"; import { Bounce, ToastContainer } from "react-toastify"; const inter = Inter({ subsets: ["latin"] }); @@ -104,14 +103,6 @@ export const App = (props) => { - {preferencesStore.flags.enableAnalytics && ( - - )} { checked={preferenceStore.flags.saveWatchHistory} />
-
-
-

Отправка аналитики

-

- Требуется перезагрузка для применения -

-
- - preferenceStore.setFlags({ - enableAnalytics: !preferenceStore.flags.enableAnalytics, - }) - } - checked={preferenceStore.flags.enableAnalytics} - /> -

diff --git a/app/store/preferences.ts b/app/store/preferences.ts index c1e4e74..1225c2d 100644 --- a/app/store/preferences.ts +++ b/app/store/preferences.ts @@ -9,7 +9,6 @@ interface preferencesState { // saveSearchHistory: boolean; saveWatchHistory?: boolean; showChangelog?: boolean; - enableAnalytics?: boolean; showNavbarTitles?: "always" | "links" | "selected" | "never"; showFifthButton?: null | 3 | 4 | 5; }; @@ -43,7 +42,6 @@ export const usePreferencesStore = create()( // saveSearchHistory: true, saveWatchHistory: true, showChangelog: true, - enableAnalytics: true, showNavbarTitles: "always", showFifthButton: null, }, diff --git a/next.config.js b/next.config.js index bdba023..bd4aa44 100644 --- a/next.config.js +++ b/next.config.js @@ -1,4 +1,3 @@ -const { withPlausibleProxy } = require("next-plausible"); const withFlowbiteReact = require("flowbite-react/plugin/nextjs"); /** @type {import('next').NextConfig} */ const NextConfig = { @@ -75,8 +74,6 @@ const NextConfig = { }, }; -const config = withPlausibleProxy({ - customDomain: "https://analytics.wah.su", -})(withFlowbiteReact(NextConfig)); +const config = withFlowbiteReact(NextConfig); module.exports = config; diff --git a/package-lock.json b/package-lock.json index 42763d4..1e17799 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,7 +17,6 @@ "markdown-to-jsx": "^7.4.7", "media-chrome": "^4.9.0", "next": "^14.2.26", - "next-plausible": "^3.12.1", "prettier": "^3.5.3", "react": "^18", "react-cropper": "^2.3.3", @@ -4956,20 +4955,6 @@ } } }, - "node_modules/next-plausible": { - "version": "3.12.4", - "resolved": "https://registry.npmjs.org/next-plausible/-/next-plausible-3.12.4.tgz", - "integrity": "sha512-cD3+ixJxf8yBYvsideTxqli3fvrB7R4BXcvsNJz8Sm2X1QN039WfiXjCyNWkub4h5++rRs6fHhchUMnOuJokcg==", - "license": "MIT", - "funding": { - "url": "https://github.com/4lejandrito/next-plausible?sponsor=1" - }, - "peerDependencies": { - "next": "^11.1.0 || ^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0 ", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, "node_modules/next/node_modules/postcss": { "version": "8.4.31", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", diff --git a/package.json b/package.json index cd174cc..786c656 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,6 @@ "markdown-to-jsx": "^7.4.7", "media-chrome": "^4.9.0", "next": "^14.2.26", - "next-plausible": "^3.12.1", "prettier": "^3.5.3", "react": "^18", "react-cropper": "^2.3.3", From f5caefdc490b121d355baa77b5f336f7df13f3ed Mon Sep 17 00:00:00 2001 From: Radiquum Date: Thu, 29 May 2025 15:20:54 +0500 Subject: [PATCH 35/58] chore: update about page --- app/pages/About.tsx | 31 ++++++------------------------- 1 file changed, 6 insertions(+), 25 deletions(-) diff --git a/app/pages/About.tsx b/app/pages/About.tsx index 7f6ce53..62e8486 100644 --- a/app/pages/About.tsx +++ b/app/pages/About.tsx @@ -45,8 +45,8 @@ export const AboutPage = () => { }); return ( -
- +
+
{

AniX - это неофициальный веб-клиент для Android-приложения Anixart. Он позволяет вам получать доступ к своей учетной записи - Anixart и управлять ею из веб-браузера. Так-же можно - синхронизировать и управлять списками и избранным. И самое главное - смотреть все доступные аниме из базы Anixart. + Anixart и управлять ею из веб-браузера компьютера или телефона. + В клиенте доступна синхронизация с аккаунтом и управление его списками и избранным. + А самое главное - это возможность смотреть все доступные аниме из базы Anixart даже недоступные на территории РФ.

- - -
- developer image -
-

Radiquum

-

- Разработчик -

-
-
-
-
@@ -114,7 +95,7 @@ export const AboutPage = () => {
- +

Список изменений

{current.changelog} From 743f756920b28bbe800a4e52f1e4c1037011d413 Mon Sep 17 00:00:00 2001 From: Radiquum Date: Thu, 29 May 2025 15:45:07 +0500 Subject: [PATCH 36/58] refactor: move parser domains to environment --- .env.sample | 5 +++ .gitignore | 3 +- app/components/ReleasePlayer/PlayerParsing.ts | 33 +++++++++++++++---- 3 files changed, 34 insertions(+), 7 deletions(-) create mode 100644 .env.sample diff --git a/.env.sample b/.env.sample new file mode 100644 index 0000000..c2f5243 --- /dev/null +++ b/.env.sample @@ -0,0 +1,5 @@ +# пример заполнения: example.com +NEXT_PUBLIC_KODIK_PARSER_DOMAIN= # Домен парсера кодика, требуется для просмотра с данного источника +NEXT_PUBLIC_ANILIBRIA_PARSER_DOMAIN= # Домен парсера анилибрии, если не заполнено, используется официальное апи +NEXT_PUBLIC_SIBNET_PARSER_DOMAIN= # Домен парсера сибнет, требуется для просмотра с данного источника +# --- \ No newline at end of file diff --git a/.gitignore b/.gitignore index 8595241..1775543 100644 --- a/.gitignore +++ b/.gitignore @@ -60,4 +60,5 @@ videos/* !videos/*.ts public/_next-video -API-Trace/* \ No newline at end of file +API-Trace/* +.env \ No newline at end of file diff --git a/app/components/ReleasePlayer/PlayerParsing.ts b/app/components/ReleasePlayer/PlayerParsing.ts index bb87f33..3d40092 100644 --- a/app/components/ReleasePlayer/PlayerParsing.ts +++ b/app/components/ReleasePlayer/PlayerParsing.ts @@ -75,8 +75,16 @@ export const _fetchKodikManifest = async ( setPlayerError: (state) => void ) => { // Fetch episode links via edge function + if (!process.env.NEXT_PUBLIC_KODIK_PARSER_DOMAIN) { + setPlayerError({ + message: "Источник не настроен", + detail: "переменная 'NEXT_PUBLIC_KODIK_PARSER_DOMAIN' не обнаружена", + }); + return { manifest: null, poster: null }; + } + const data = await _fetchPlayer( - `https://anix-player.wah.su/?url=${url}&player=kodik`, + `https://${process.env.NEXT_PUBLIC_KODIK_PARSER_DOMAIN}/?url=${url}&player=kodik`, setPlayerError ); if (data) { @@ -204,10 +212,16 @@ export const _fetchAnilibriaManifest = async ( const id = url.split("?id=")[1].split("&ep=")[0]; const epid = url.split("?id=")[1].split("&ep=")[1]; const _url = `https://api.anilibria.tv/v3/title?id=${id}`; - const data = await _fetchPlayer( - `https://anix-player.wah.su/?url=${_url}&player=libria`, - setPlayerError - ); + let data = null; + if (process.env.NEXT_PUBLIC_ANILIBRIA_PARSER_DOMAIN) { + data = await _fetchPlayer( + `https://${process.env.NEXT_PUBLIC_ANILIBRIA_PARSER_DOMAIN}/?url=${_url}&player=libria`, + setPlayerError + ); + } else { + data = await _fetchPlayer(_url, setPlayerError); + } + if (data) { const host = `https://${data.player.host}`; const ep = data.player.list[epid]; @@ -229,8 +243,15 @@ export const _fetchSibnetManifest = async ( setPlayerError: (state) => void ) => { // Fetch data via cloud endpoint + if (!process.env.NEXT_PUBLIC_SIBNET_PARSER_DOMAIN) { + setPlayerError({ + message: "Источник не настроен", + detail: "переменная 'NEXT_PUBLIC_SIBNET_PARSER_DOMAIN' не обнаружена", + }); + return { manifest: null, poster: null }; + } const data = await _fetchPlayer( - `https://sibnet.anix-player.wah.su/?url=${url}`, + `https://${process.env.NEXT_PUBLIC_SIBNET_PARSER_DOMAIN}/?url=${url}`, setPlayerError ); if (data) { From 990b3c1736a1fc2cbde92625e49b6632b1bde5b0 Mon Sep 17 00:00:00 2001 From: Radiquum Date: Thu, 29 May 2025 22:36:44 +0500 Subject: [PATCH 37/58] feat: rewrite player parsing to js and add it them to repo --- .env.sample | 8 +- app/components/ReleasePlayer/PlayerParsing.ts | 16 +- package-lock.json | 1034 ++++++++++++++++- package.json | 2 + player-parsers/index.ts | 45 + player-parsers/kodik.ts | 95 ++ player-parsers/libria.ts | 17 + player-parsers/shared.ts | 33 + player-parsers/sibnet.ts | 59 + 9 files changed, 1275 insertions(+), 34 deletions(-) create mode 100644 player-parsers/index.ts create mode 100644 player-parsers/kodik.ts create mode 100644 player-parsers/libria.ts create mode 100644 player-parsers/shared.ts create mode 100644 player-parsers/sibnet.ts diff --git a/.env.sample b/.env.sample index c2f5243..dcb7e8b 100644 --- a/.env.sample +++ b/.env.sample @@ -1,5 +1,5 @@ -# пример заполнения: example.com -NEXT_PUBLIC_KODIK_PARSER_DOMAIN= # Домен парсера кодика, требуется для просмотра с данного источника -NEXT_PUBLIC_ANILIBRIA_PARSER_DOMAIN= # Домен парсера анилибрии, если не заполнено, используется официальное апи -NEXT_PUBLIC_SIBNET_PARSER_DOMAIN= # Домен парсера сибнет, требуется для просмотра с данного источника +# пример заполнения: https://example.com, http://0.0.0.0:80 +NEXT_PUBLIC_KODIK_PARSER_URL= # Домен парсера кодика, требуется для просмотра с данного источника +NEXT_PUBLIC_ANILIBRIA_PARSER_URL= # Домен парсера анилибрии, если не заполнено, используется официальное апи +NEXT_PUBLIC_SIBNET_PARSER_URL= # Домен парсера сибнет, требуется для просмотра с данного источника # --- \ No newline at end of file diff --git a/app/components/ReleasePlayer/PlayerParsing.ts b/app/components/ReleasePlayer/PlayerParsing.ts index 3d40092..a9e711e 100644 --- a/app/components/ReleasePlayer/PlayerParsing.ts +++ b/app/components/ReleasePlayer/PlayerParsing.ts @@ -75,16 +75,16 @@ export const _fetchKodikManifest = async ( setPlayerError: (state) => void ) => { // Fetch episode links via edge function - if (!process.env.NEXT_PUBLIC_KODIK_PARSER_DOMAIN) { + if (!process.env.NEXT_PUBLIC_KODIK_PARSER_URL) { setPlayerError({ message: "Источник не настроен", - detail: "переменная 'NEXT_PUBLIC_KODIK_PARSER_DOMAIN' не обнаружена", + detail: "переменная 'NEXT_PUBLIC_KODIK_PARSER_URL' не обнаружена", }); return { manifest: null, poster: null }; } const data = await _fetchPlayer( - `https://${process.env.NEXT_PUBLIC_KODIK_PARSER_DOMAIN}/?url=${url}&player=kodik`, + `${process.env.NEXT_PUBLIC_KODIK_PARSER_URL}/?url=${url}&player=kodik`, setPlayerError ); if (data) { @@ -213,9 +213,9 @@ export const _fetchAnilibriaManifest = async ( const epid = url.split("?id=")[1].split("&ep=")[1]; const _url = `https://api.anilibria.tv/v3/title?id=${id}`; let data = null; - if (process.env.NEXT_PUBLIC_ANILIBRIA_PARSER_DOMAIN) { + if (process.env.NEXT_PUBLIC_ANILIBRIA_PARSER_URL) { data = await _fetchPlayer( - `https://${process.env.NEXT_PUBLIC_ANILIBRIA_PARSER_DOMAIN}/?url=${_url}&player=libria`, + `${process.env.NEXT_PUBLIC_ANILIBRIA_PARSER_URL}/?url=${_url}&player=libria`, setPlayerError ); } else { @@ -243,15 +243,15 @@ export const _fetchSibnetManifest = async ( setPlayerError: (state) => void ) => { // Fetch data via cloud endpoint - if (!process.env.NEXT_PUBLIC_SIBNET_PARSER_DOMAIN) { + if (!process.env.NEXT_PUBLIC_SIBNET_PARSER_URL) { setPlayerError({ message: "Источник не настроен", - detail: "переменная 'NEXT_PUBLIC_SIBNET_PARSER_DOMAIN' не обнаружена", + detail: "переменная 'NEXT_PUBLIC_SIBNET_PARSER_URL' не обнаружена", }); return { manifest: null, poster: null }; } const data = await _fetchPlayer( - `https://${process.env.NEXT_PUBLIC_SIBNET_PARSER_DOMAIN}/?url=${url}`, + `${process.env.NEXT_PUBLIC_SIBNET_PARSER_URL}/?url=${url}&player=sibnet`, setPlayerError ); if (data) { diff --git a/package-lock.json b/package-lock.json index 1e17799..97dc195 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,6 +11,7 @@ "dependencies": { "apexcharts": "^3.52.0", "deepmerge-ts": "^7.1.0", + "express": "^5.1.0", "flowbite": "^2.4.1", "flowbite-react": "^0.11.7", "hls-video-element": "^1.5.0", @@ -24,6 +25,7 @@ "react-toastify": "^11.0.5", "swiper": "^11.1.4", "swr": "^2.2.5", + "tsx": "^4.19.4", "videojs-video-element": "^1.4.1", "zustand": "^4.5.4" }, @@ -91,6 +93,406 @@ "tslib": "^2.4.0" } }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.5.tgz", + "integrity": "sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.5.tgz", + "integrity": "sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.5.tgz", + "integrity": "sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.5.tgz", + "integrity": "sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.5.tgz", + "integrity": "sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.5.tgz", + "integrity": "sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.5.tgz", + "integrity": "sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.5.tgz", + "integrity": "sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.5.tgz", + "integrity": "sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.5.tgz", + "integrity": "sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.5.tgz", + "integrity": "sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.5.tgz", + "integrity": "sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.5.tgz", + "integrity": "sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.5.tgz", + "integrity": "sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.5.tgz", + "integrity": "sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.5.tgz", + "integrity": "sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.5.tgz", + "integrity": "sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.5.tgz", + "integrity": "sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.5.tgz", + "integrity": "sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.5.tgz", + "integrity": "sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.5.tgz", + "integrity": "sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.5.tgz", + "integrity": "sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.5.tgz", + "integrity": "sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.5.tgz", + "integrity": "sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.5.tgz", + "integrity": "sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.5.1", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.5.1.tgz", @@ -1424,6 +1826,40 @@ "integrity": "sha512-FQXkOta0XBSUPHndIKON2Y9JeQz5ZeMqLYZVVK93FliNBFm7LNMIZmY6FrMEB9XPcDbE2bekMbZD6kzDkxwYjA==", "license": "MIT" }, + "node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "license": "MIT", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/acorn": { "version": "8.14.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", @@ -1856,6 +2292,26 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/body-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", + "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.0", + "http-errors": "^2.0.0", + "iconv-lite": "^0.6.3", + "on-finished": "^2.4.1", + "qs": "^6.14.0", + "raw-body": "^3.0.0", + "type-is": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -1932,6 +2388,15 @@ "node": ">=10.16.0" } }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/call-bind": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", @@ -1955,7 +2420,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -1969,7 +2433,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -2144,6 +2607,45 @@ "dev": true, "license": "MIT" }, + "node_modules/content-disposition": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", + "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, "node_modules/copy-webpack-plugin": { "version": "12.0.2", "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-12.0.2.tgz", @@ -2371,6 +2873,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/dequal": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", @@ -2432,7 +2943,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.1", @@ -2449,6 +2959,12 @@ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "license": "MIT" }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, "node_modules/electron-to-chromium": { "version": "1.5.131", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.131.tgz", @@ -2463,6 +2979,15 @@ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "license": "MIT" }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/enhanced-resolve": { "version": "5.18.1", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", @@ -2548,7 +3073,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -2558,7 +3082,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -2604,7 +3127,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0" @@ -2660,6 +3182,46 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/esbuild": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.5.tgz", + "integrity": "sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.5", + "@esbuild/android-arm": "0.25.5", + "@esbuild/android-arm64": "0.25.5", + "@esbuild/android-x64": "0.25.5", + "@esbuild/darwin-arm64": "0.25.5", + "@esbuild/darwin-x64": "0.25.5", + "@esbuild/freebsd-arm64": "0.25.5", + "@esbuild/freebsd-x64": "0.25.5", + "@esbuild/linux-arm": "0.25.5", + "@esbuild/linux-arm64": "0.25.5", + "@esbuild/linux-ia32": "0.25.5", + "@esbuild/linux-loong64": "0.25.5", + "@esbuild/linux-mips64el": "0.25.5", + "@esbuild/linux-ppc64": "0.25.5", + "@esbuild/linux-riscv64": "0.25.5", + "@esbuild/linux-s390x": "0.25.5", + "@esbuild/linux-x64": "0.25.5", + "@esbuild/netbsd-arm64": "0.25.5", + "@esbuild/netbsd-x64": "0.25.5", + "@esbuild/openbsd-arm64": "0.25.5", + "@esbuild/openbsd-x64": "0.25.5", + "@esbuild/sunos-x64": "0.25.5", + "@esbuild/win32-arm64": "0.25.5", + "@esbuild/win32-ia32": "0.25.5", + "@esbuild/win32-x64": "0.25.5" + } + }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -2671,6 +3233,12 @@ "node": ">=6" } }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -3160,6 +3728,15 @@ "node": ">=0.10.0" } }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", @@ -3171,6 +3748,69 @@ "node": ">=0.8.x" } }, + "node_modules/express": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", + "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.0", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -3286,6 +3926,23 @@ "node": ">=8" } }, + "node_modules/finalhandler": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", + "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -3521,6 +4178,24 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -3586,7 +4261,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -3611,7 +4285,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "dev": true, "license": "MIT", "dependencies": { "dunder-proto": "^1.0.1", @@ -3643,7 +4316,6 @@ "version": "4.10.0", "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.0.tgz", "integrity": "sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==", - "dev": true, "license": "MIT", "dependencies": { "resolve-pkg-maps": "^1.0.0" @@ -3786,7 +4458,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -3873,7 +4544,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -3927,6 +4597,34 @@ "integrity": "sha512-AlW8ymcDKZuKtzXCUmEy4nOcHRkebnShH6t6hC2+QJQP0WXlTUSSO9Kp22uSEYdCgpwkXEJsfOhqxrgO2tDctQ==", "license": "Apache-2.0" }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -3980,7 +4678,6 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true, "license": "ISC" }, "node_modules/internal-slot": { @@ -3998,6 +4695,15 @@ "node": ">= 0.4" } }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, "node_modules/is-array-buffer": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", @@ -4274,6 +4980,12 @@ "node": ">=8" } }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "license": "MIT" + }, "node_modules/is-regex": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", @@ -4726,7 +5438,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -4747,6 +5458,27 @@ "integrity": "sha512-9P2FuUHnZZ3iji+2RQk7Zkh5AmZTnOG5fODACnjhCVveX1McY3jmCRHofIEI+yTBqplz7LXy48c7fQ3Uigp88w==", "license": "MIT" }, + "node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -4897,6 +5629,15 @@ "dev": true, "license": "MIT" }, + "node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", @@ -5022,7 +5763,6 @@ "version": "1.13.4", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -5131,11 +5871,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, "license": "ISC", "dependencies": { "wrappy": "1" @@ -5228,6 +5979,15 @@ "node": ">=6" } }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -5279,6 +6039,15 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/path-to-regexp": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", + "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", + "license": "MIT", + "engines": { + "node": ">=16" + } + }, "node_modules/path-type": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-6.0.0.tgz", @@ -5518,6 +6287,19 @@ "react-is": "^16.13.1" } }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -5528,6 +6310,21 @@ "node": ">=6" } }, + "node_modules/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -5558,6 +6355,30 @@ "safe-buffer": "^5.1.0" } }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz", + "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.6.3", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/react": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", @@ -5750,7 +6571,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "dev": true, "license": "MIT", "funding": { "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" @@ -5805,6 +6625,22 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -5852,7 +6688,6 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, "funding": [ { "type": "github", @@ -5904,6 +6739,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, "node_modules/scheduler": { "version": "0.23.2", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", @@ -5982,6 +6823,49 @@ "node": ">=10" } }, + "node_modules/send": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", + "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.5", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "mime-types": "^3.0.1", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/send/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/send/node_modules/mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/serialize-javascript": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", @@ -5992,6 +6876,21 @@ "randombytes": "^2.1.0" } }, + "node_modules/serve-static": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + } + }, "node_modules/set-function-length": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", @@ -6041,6 +6940,12 @@ "node": ">= 0.4" } }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -6066,7 +6971,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -6086,7 +6990,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -6103,7 +7006,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -6122,7 +7024,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -6200,6 +7101,15 @@ "dev": true, "license": "MIT" }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/streamsearch": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", @@ -6909,6 +7819,15 @@ "node": ">=8.0" } }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, "node_modules/ts-api-utils": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", @@ -6947,6 +7866,25 @@ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "license": "0BSD" }, + "node_modules/tsx": { + "version": "4.19.4", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.4.tgz", + "integrity": "sha512-gK5GVzDkJK1SI1zwHf32Mqxf2tSJkNx+eYcNly5+nHvWqXUJYUkWBQtKauoESz3ymezAI++ZwT855x5p5eop+Q==", + "license": "MIT", + "dependencies": { + "esbuild": "~0.25.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -6973,6 +7911,41 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/type-is": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/type-is/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/type-is/node_modules/mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/typed-array-buffer": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", @@ -7104,6 +8077,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/unrs-resolver": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.3.3.tgz", @@ -7188,6 +8170,15 @@ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "license": "MIT" }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/videojs-video-element": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/videojs-video-element/-/videojs-video-element-1.4.1.tgz", @@ -7510,7 +8501,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true, "license": "ISC" }, "node_modules/yaml": { diff --git a/package.json b/package.json index 786c656..9532e1d 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "dependencies": { "apexcharts": "^3.52.0", "deepmerge-ts": "^7.1.0", + "express": "^5.1.0", "flowbite": "^2.4.1", "flowbite-react": "^0.11.7", "hls-video-element": "^1.5.0", @@ -25,6 +26,7 @@ "react-toastify": "^11.0.5", "swiper": "^11.1.4", "swr": "^2.2.5", + "tsx": "^4.19.4", "videojs-video-element": "^1.4.1", "zustand": "^4.5.4" }, diff --git a/player-parsers/index.ts b/player-parsers/index.ts new file mode 100644 index 0000000..d66c34a --- /dev/null +++ b/player-parsers/index.ts @@ -0,0 +1,45 @@ +import { asJSON } from "./shared"; +import { getAnilibriaURL } from "./libria"; +import { getSibnetURL } from "./sibnet"; +import { getKodikURL } from "./kodik"; + +import express from "express"; +const app = express(); + +const host = "0.0.0.0"; +const port = 7000; +const allowedPlayers = ["kodik", "libria", "sibnet"]; + +app.get("/", (req, res) => { + const url = req.query.url; + const player = req.query.player; + + if (!url) { + asJSON(res, { message: "no 'url' query provided" }, 400) + return + } + + if (!player) { + asJSON(res, { message: "no 'player' query provided" }, 400) + return + } + + switch (player) { + case "libria": + getAnilibriaURL(res, url) + return + case "sibnet": + getSibnetURL(res, url) + return + case "kodik": + getKodikURL(res, url) + return + default: + asJSON(res, { message: `player '${player}' is not supported. choose one of: ${allowedPlayers.join(", ")}` }, 400) + return + } +}); + +app.listen(port, host, function () { + console.log(`Server listens http://${host}:${port}`); +}); diff --git a/player-parsers/kodik.ts b/player-parsers/kodik.ts new file mode 100644 index 0000000..19b0ebd --- /dev/null +++ b/player-parsers/kodik.ts @@ -0,0 +1,95 @@ +import { asJSON, randomUA } from "./shared"; +const altDomains = ["kodik.info", "aniqit.com", "kodik.cc", "kodik.biz"]; + +export async function getKodikURL(res, url: string) { + const origDomain = url.replace("https://", "").split("/")[0]; + let domain = url.replace("https://", "").split("/")[0]; + + if (!altDomains.includes(domain)) { + asJSON(res, { message: "Wrong url provided for player kodik" }, 400); + return; + } + + let user_agent = randomUA(); + + let pageRes = await fetch(url, { + headers: { + "User-Agent": user_agent, + }, + }); + + if (!pageRes.ok) { + for (let i = 0; i < altDomains.length - 1; i++) { + if (url.includes(altDomains[i])) { + continue; + } + + user_agent = randomUA(); + const altDomain = altDomains[i]; + const altUrl = url.replace( + `https://${origDomain}/`, + `https://${altDomain}/` + ); + + domain = altDomain; + pageRes = await fetch(altUrl, { + headers: { + "User-Agent": user_agent, + }, + }); + + if (pageRes.ok) { + break; + } + } + } + + if (!pageRes.ok) { + asJSON(res, { message: "KODIK: failed to load page" }, 500); + return; + } + + const pageData = await pageRes.text(); + const urlParamsRe = /var urlParams = .*;$/m; + const urlParamsMatch = urlParamsRe.exec(pageData); + + if (!urlParamsMatch || urlParamsMatch.length == 0) { + asJSON(res, { message: `KODIK: failed to find data to parse` }, 500); + return; + } + + const urlParamsStr = urlParamsMatch[0] + .replace("var urlParams = '", "") + .replace("';", ""); + + const urlStr = url.replace(`https://${origDomain}/`, ""); + const type = urlStr.split("/")[0]; + const id = urlStr.split("/")[1]; + const hash = urlStr.split("/")[2]; + + const urlParams = JSON.parse(urlParamsStr); + urlParams["type"] = type; + urlParams["id"] = id; + urlParams["hash"] = hash; + + const formData = new FormData(); + for (const [key, value] of Object.entries(urlParams)) { + formData.append(key, value as any); + } + + const linksRes = await fetch(`https://${domain}/ftor`, { + method: "POST", + body: formData, + headers: { + "User-Agent": user_agent, + }, + }); + + if (!linksRes.ok) { + asJSON(res, { message: `KODIK: failed to get links` }, 500); + return; + } + + asJSON(res, await linksRes.json(), 200); + return; +} diff --git a/player-parsers/libria.ts b/player-parsers/libria.ts new file mode 100644 index 0000000..a907074 --- /dev/null +++ b/player-parsers/libria.ts @@ -0,0 +1,17 @@ +import { asJSON } from "./shared"; + +export async function getAnilibriaURL(res, url: string) { + + if (!url.includes("anilibria")) { + asJSON(res, { message: "Wrong url provided for player libria" }, 400); + return + } + + let apiRes = await fetch(url); + if (!apiRes.ok) { + asJSON(res, { message: "LIBRIA: failed to get api response" }, 500); + return + } + asJSON(res, await apiRes.json(), 200); + return +} diff --git a/player-parsers/shared.ts b/player-parsers/shared.ts new file mode 100644 index 0000000..3ce9203 --- /dev/null +++ b/player-parsers/shared.ts @@ -0,0 +1,33 @@ +export const corsHeaders = { + "Access-Control-Allow-Origin": "*", + "Access-Control-Allow-Methods": "GET,HEAD,POST,OPTIONS", + "Cache-Control": "no-cache", +}; + +export const resHeaders = { + ...corsHeaders, + "Content-Type": "application/json", +}; + +export const USERAGENTS = [ + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.5 Safari/605.1.15", + "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.53 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Windows; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.114 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/603.3.8 (KHTML, like Gecko) Version/10.1.2 Safari/603.3.8", + "Mozilla/5.0 (Windows NT 10.0; Windows; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.114 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Safari/605.1.15", + "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.53 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Safari/605.1.15", + "Mozilla/5.0 (Windows NT 10.0; Windows; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.114 Safari/537.36", + "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.53 Safari/537.36", +]; + +export function asJSON(res, object: any, status: number) { + res.status(status).type('application/json'); + res.set(corsHeaders) + res.send(JSON.stringify(object)); +} + +export function randomUA() { + return USERAGENTS[Math.floor(Math.random() * USERAGENTS.length - 1)] +} \ No newline at end of file diff --git a/player-parsers/sibnet.ts b/player-parsers/sibnet.ts new file mode 100644 index 0000000..5df85b8 --- /dev/null +++ b/player-parsers/sibnet.ts @@ -0,0 +1,59 @@ +import { asJSON, randomUA } from "./shared"; + +export async function getSibnetURL(res, url: string) { + + if (!url.includes("sibnet")) { + asJSON(res, { message: "Wrong url provided for player sibnet" }, 400); + return + } + + const user_agent = randomUA(); + + let pageRes = await fetch(url, { + headers: { + "User-Agent": user_agent, + }, + }); + if (!pageRes.ok) { + asJSON(res, { message: `SIBNET:${pageRes.status}: failed to load page` }, 500) + return + } + const pageData = await pageRes.text(); + const videoRe = /\/v\/.*?\.mp4/; + const videoMatch = videoRe.exec(pageData); + + if (!videoMatch || videoMatch.length == 0) { + asJSON(res, { message: `SIBNET: failed to find data to parse` }, 500) + return + } + + const posterRe = /\/upload\/cover\/.*?\.jpg/; + const posterMatch = posterRe.exec(pageData); + + const actualVideoRes = await fetch( + `https://video.sibnet.ru${videoMatch[0]}`, + { + headers: { + "User-Agent": user_agent, + Referer: url, + }, + redirect: "manual", + } + ); + + if (!actualVideoRes.headers.get("location")) { + asJSON(res, { message: `SIBNET: failed to get video link` }, 500) + return + } + + const video = actualVideoRes.headers.get("location"); + const poster = + posterMatch ? + posterMatch.length > 0 ? + `https://st.sibnet.ru${posterMatch[0]}` + : null + : null; + + asJSON(res, { video, poster }, 200) + return +} From 51a919e2b292bfeda454d54d5c0dcff0673abadf Mon Sep 17 00:00:00 2001 From: Radiquum Date: Thu, 29 May 2025 22:42:13 +0500 Subject: [PATCH 38/58] chore: move player-parsing deps to subfolder --- package-lock.json | 1034 +---------------------- package.json | 2 - player-parsers/package-lock.json | 1311 ++++++++++++++++++++++++++++++ player-parsers/package.json | 14 + 4 files changed, 1347 insertions(+), 1014 deletions(-) create mode 100644 player-parsers/package-lock.json create mode 100644 player-parsers/package.json diff --git a/package-lock.json b/package-lock.json index 97dc195..1e17799 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,6 @@ "dependencies": { "apexcharts": "^3.52.0", "deepmerge-ts": "^7.1.0", - "express": "^5.1.0", "flowbite": "^2.4.1", "flowbite-react": "^0.11.7", "hls-video-element": "^1.5.0", @@ -25,7 +24,6 @@ "react-toastify": "^11.0.5", "swiper": "^11.1.4", "swr": "^2.2.5", - "tsx": "^4.19.4", "videojs-video-element": "^1.4.1", "zustand": "^4.5.4" }, @@ -93,406 +91,6 @@ "tslib": "^2.4.0" } }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.5.tgz", - "integrity": "sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.5.tgz", - "integrity": "sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.5.tgz", - "integrity": "sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.5.tgz", - "integrity": "sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.5.tgz", - "integrity": "sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.5.tgz", - "integrity": "sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.5.tgz", - "integrity": "sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.5.tgz", - "integrity": "sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.5.tgz", - "integrity": "sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.5.tgz", - "integrity": "sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.5.tgz", - "integrity": "sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.5.tgz", - "integrity": "sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==", - "cpu": [ - "loong64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.5.tgz", - "integrity": "sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==", - "cpu": [ - "mips64el" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.5.tgz", - "integrity": "sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.5.tgz", - "integrity": "sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==", - "cpu": [ - "riscv64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.5.tgz", - "integrity": "sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==", - "cpu": [ - "s390x" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.5.tgz", - "integrity": "sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.5.tgz", - "integrity": "sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.5.tgz", - "integrity": "sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.5.tgz", - "integrity": "sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.5.tgz", - "integrity": "sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.5.tgz", - "integrity": "sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.5.tgz", - "integrity": "sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.5.tgz", - "integrity": "sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.5.tgz", - "integrity": "sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, "node_modules/@eslint-community/eslint-utils": { "version": "4.5.1", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.5.1.tgz", @@ -1826,40 +1424,6 @@ "integrity": "sha512-FQXkOta0XBSUPHndIKON2Y9JeQz5ZeMqLYZVVK93FliNBFm7LNMIZmY6FrMEB9XPcDbE2bekMbZD6kzDkxwYjA==", "license": "MIT" }, - "node_modules/accepts": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", - "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", - "license": "MIT", - "dependencies": { - "mime-types": "^3.0.0", - "negotiator": "^1.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/accepts/node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/accepts/node_modules/mime-types": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", - "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/acorn": { "version": "8.14.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", @@ -2292,26 +1856,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/body-parser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", - "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", - "license": "MIT", - "dependencies": { - "bytes": "^3.1.2", - "content-type": "^1.0.5", - "debug": "^4.4.0", - "http-errors": "^2.0.0", - "iconv-lite": "^0.6.3", - "on-finished": "^2.4.1", - "qs": "^6.14.0", - "raw-body": "^3.0.0", - "type-is": "^2.0.0" - }, - "engines": { - "node": ">=18" - } - }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -2388,15 +1932,6 @@ "node": ">=10.16.0" } }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/call-bind": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", @@ -2420,6 +1955,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -2433,6 +1969,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -2607,45 +2144,6 @@ "dev": true, "license": "MIT" }, - "node_modules/content-disposition": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", - "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", - "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", - "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", - "license": "MIT", - "engines": { - "node": ">=6.6.0" - } - }, "node_modules/copy-webpack-plugin": { "version": "12.0.2", "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-12.0.2.tgz", @@ -2873,15 +2371,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/dequal": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", @@ -2943,6 +2432,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.1", @@ -2959,12 +2449,6 @@ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "license": "MIT" }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "license": "MIT" - }, "node_modules/electron-to-chromium": { "version": "1.5.131", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.131.tgz", @@ -2979,15 +2463,6 @@ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "license": "MIT" }, - "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/enhanced-resolve": { "version": "5.18.1", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", @@ -3073,6 +2548,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -3082,6 +2558,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -3127,6 +2604,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0" @@ -3182,46 +2660,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/esbuild": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.5.tgz", - "integrity": "sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==", - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.5", - "@esbuild/android-arm": "0.25.5", - "@esbuild/android-arm64": "0.25.5", - "@esbuild/android-x64": "0.25.5", - "@esbuild/darwin-arm64": "0.25.5", - "@esbuild/darwin-x64": "0.25.5", - "@esbuild/freebsd-arm64": "0.25.5", - "@esbuild/freebsd-x64": "0.25.5", - "@esbuild/linux-arm": "0.25.5", - "@esbuild/linux-arm64": "0.25.5", - "@esbuild/linux-ia32": "0.25.5", - "@esbuild/linux-loong64": "0.25.5", - "@esbuild/linux-mips64el": "0.25.5", - "@esbuild/linux-ppc64": "0.25.5", - "@esbuild/linux-riscv64": "0.25.5", - "@esbuild/linux-s390x": "0.25.5", - "@esbuild/linux-x64": "0.25.5", - "@esbuild/netbsd-arm64": "0.25.5", - "@esbuild/netbsd-x64": "0.25.5", - "@esbuild/openbsd-arm64": "0.25.5", - "@esbuild/openbsd-x64": "0.25.5", - "@esbuild/sunos-x64": "0.25.5", - "@esbuild/win32-arm64": "0.25.5", - "@esbuild/win32-ia32": "0.25.5", - "@esbuild/win32-x64": "0.25.5" - } - }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -3233,12 +2671,6 @@ "node": ">=6" } }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "license": "MIT" - }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -3728,15 +3160,6 @@ "node": ">=0.10.0" } }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", @@ -3748,69 +3171,6 @@ "node": ">=0.8.x" } }, - "node_modules/express": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", - "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", - "license": "MIT", - "dependencies": { - "accepts": "^2.0.0", - "body-parser": "^2.2.0", - "content-disposition": "^1.0.0", - "content-type": "^1.0.5", - "cookie": "^0.7.1", - "cookie-signature": "^1.2.1", - "debug": "^4.4.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "finalhandler": "^2.1.0", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "merge-descriptors": "^2.0.0", - "mime-types": "^3.0.0", - "on-finished": "^2.4.1", - "once": "^1.4.0", - "parseurl": "^1.3.3", - "proxy-addr": "^2.0.7", - "qs": "^6.14.0", - "range-parser": "^1.2.1", - "router": "^2.2.0", - "send": "^1.1.0", - "serve-static": "^2.2.0", - "statuses": "^2.0.1", - "type-is": "^2.0.1", - "vary": "^1.1.2" - }, - "engines": { - "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/express/node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express/node_modules/mime-types": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", - "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -3926,23 +3286,6 @@ "node": ">=8" } }, - "node_modules/finalhandler": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", - "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", - "license": "MIT", - "dependencies": { - "debug": "^4.4.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "on-finished": "^2.4.1", - "parseurl": "^1.3.3", - "statuses": "^2.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -4178,24 +3521,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", - "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -4261,6 +3586,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -4285,6 +3611,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, "license": "MIT", "dependencies": { "dunder-proto": "^1.0.1", @@ -4316,6 +3643,7 @@ "version": "4.10.0", "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.0.tgz", "integrity": "sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==", + "dev": true, "license": "MIT", "dependencies": { "resolve-pkg-maps": "^1.0.0" @@ -4458,6 +3786,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -4544,6 +3873,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -4597,34 +3927,6 @@ "integrity": "sha512-AlW8ymcDKZuKtzXCUmEy4nOcHRkebnShH6t6hC2+QJQP0WXlTUSSO9Kp22uSEYdCgpwkXEJsfOhqxrgO2tDctQ==", "license": "Apache-2.0" }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "license": "MIT", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -4678,6 +3980,7 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, "license": "ISC" }, "node_modules/internal-slot": { @@ -4695,15 +3998,6 @@ "node": ">= 0.4" } }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, "node_modules/is-array-buffer": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", @@ -4980,12 +4274,6 @@ "node": ">=8" } }, - "node_modules/is-promise": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", - "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", - "license": "MIT" - }, "node_modules/is-regex": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", @@ -5438,6 +4726,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -5458,27 +4747,6 @@ "integrity": "sha512-9P2FuUHnZZ3iji+2RQk7Zkh5AmZTnOG5fODACnjhCVveX1McY3jmCRHofIEI+yTBqplz7LXy48c7fQ3Uigp88w==", "license": "MIT" }, - "node_modules/media-typer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/merge-descriptors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", - "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -5629,15 +4897,6 @@ "dev": true, "license": "MIT" }, - "node_modules/negotiator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", - "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", @@ -5763,6 +5022,7 @@ "version": "1.13.4", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -5871,22 +5131,11 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, "license": "ISC", "dependencies": { "wrappy": "1" @@ -5979,15 +5228,6 @@ "node": ">=6" } }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -6039,15 +5279,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/path-to-regexp": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", - "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", - "license": "MIT", - "engines": { - "node": ">=16" - } - }, "node_modules/path-type": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-6.0.0.tgz", @@ -6287,19 +5518,6 @@ "react-is": "^16.13.1" } }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "license": "MIT", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -6310,21 +5528,6 @@ "node": ">=6" } }, - "node_modules/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -6355,30 +5558,6 @@ "safe-buffer": "^5.1.0" } }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz", - "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.6.3", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/react": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", @@ -6571,6 +5750,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, "license": "MIT", "funding": { "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" @@ -6625,22 +5805,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/router": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", - "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", - "license": "MIT", - "dependencies": { - "debug": "^4.4.0", - "depd": "^2.0.0", - "is-promise": "^4.0.0", - "parseurl": "^1.3.3", - "path-to-regexp": "^8.0.0" - }, - "engines": { - "node": ">= 18" - } - }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -6688,6 +5852,7 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, "funding": [ { "type": "github", @@ -6739,12 +5904,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" - }, "node_modules/scheduler": { "version": "0.23.2", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", @@ -6823,49 +5982,6 @@ "node": ">=10" } }, - "node_modules/send": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", - "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", - "license": "MIT", - "dependencies": { - "debug": "^4.3.5", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "mime-types": "^3.0.1", - "ms": "^2.1.3", - "on-finished": "^2.4.1", - "range-parser": "^1.2.1", - "statuses": "^2.0.1" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/send/node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/send/node_modules/mime-types": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", - "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/serialize-javascript": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", @@ -6876,21 +5992,6 @@ "randombytes": "^2.1.0" } }, - "node_modules/serve-static": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", - "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", - "license": "MIT", - "dependencies": { - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "parseurl": "^1.3.3", - "send": "^1.2.0" - }, - "engines": { - "node": ">= 18" - } - }, "node_modules/set-function-length": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", @@ -6940,12 +6041,6 @@ "node": ">= 0.4" } }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "license": "ISC" - }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -6971,6 +6066,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -6990,6 +6086,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -7006,6 +6103,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -7024,6 +6122,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -7101,15 +6200,6 @@ "dev": true, "license": "MIT" }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/streamsearch": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", @@ -7819,15 +6909,6 @@ "node": ">=8.0" } }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, "node_modules/ts-api-utils": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", @@ -7866,25 +6947,6 @@ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "license": "0BSD" }, - "node_modules/tsx": { - "version": "4.19.4", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.4.tgz", - "integrity": "sha512-gK5GVzDkJK1SI1zwHf32Mqxf2tSJkNx+eYcNly5+nHvWqXUJYUkWBQtKauoESz3ymezAI++ZwT855x5p5eop+Q==", - "license": "MIT", - "dependencies": { - "esbuild": "~0.25.0", - "get-tsconfig": "^4.7.5" - }, - "bin": { - "tsx": "dist/cli.mjs" - }, - "engines": { - "node": ">=18.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - } - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -7911,41 +6973,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/type-is": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", - "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", - "license": "MIT", - "dependencies": { - "content-type": "^1.0.5", - "media-typer": "^1.1.0", - "mime-types": "^3.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/type-is/node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/type-is/node_modules/mime-types": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", - "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/typed-array-buffer": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", @@ -8077,15 +7104,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/unrs-resolver": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.3.3.tgz", @@ -8170,15 +7188,6 @@ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "license": "MIT" }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/videojs-video-element": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/videojs-video-element/-/videojs-video-element-1.4.1.tgz", @@ -8501,6 +7510,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, "license": "ISC" }, "node_modules/yaml": { diff --git a/package.json b/package.json index 9532e1d..786c656 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,6 @@ "dependencies": { "apexcharts": "^3.52.0", "deepmerge-ts": "^7.1.0", - "express": "^5.1.0", "flowbite": "^2.4.1", "flowbite-react": "^0.11.7", "hls-video-element": "^1.5.0", @@ -26,7 +25,6 @@ "react-toastify": "^11.0.5", "swiper": "^11.1.4", "swr": "^2.2.5", - "tsx": "^4.19.4", "videojs-video-element": "^1.4.1", "zustand": "^4.5.4" }, diff --git a/player-parsers/package-lock.json b/player-parsers/package-lock.json new file mode 100644 index 0000000..d628dca --- /dev/null +++ b/player-parsers/package-lock.json @@ -0,0 +1,1311 @@ +{ + "name": "player-parsers", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "player-parsers", + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "express": "^5.1.0", + "tsx": "^4.19.4" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.5.tgz", + "integrity": "sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.5.tgz", + "integrity": "sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.5.tgz", + "integrity": "sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.5.tgz", + "integrity": "sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.5.tgz", + "integrity": "sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.5.tgz", + "integrity": "sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.5.tgz", + "integrity": "sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.5.tgz", + "integrity": "sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.5.tgz", + "integrity": "sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.5.tgz", + "integrity": "sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.5.tgz", + "integrity": "sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.5.tgz", + "integrity": "sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.5.tgz", + "integrity": "sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.5.tgz", + "integrity": "sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.5.tgz", + "integrity": "sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.5.tgz", + "integrity": "sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.5.tgz", + "integrity": "sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.5.tgz", + "integrity": "sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.5.tgz", + "integrity": "sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.5.tgz", + "integrity": "sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.5.tgz", + "integrity": "sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.5.tgz", + "integrity": "sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.5.tgz", + "integrity": "sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.5.tgz", + "integrity": "sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.5.tgz", + "integrity": "sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "license": "MIT", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/body-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", + "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.0", + "http-errors": "^2.0.0", + "iconv-lite": "^0.6.3", + "on-finished": "^2.4.1", + "qs": "^6.14.0", + "raw-body": "^3.0.0", + "type-is": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/content-disposition": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", + "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.5.tgz", + "integrity": "sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.5", + "@esbuild/android-arm": "0.25.5", + "@esbuild/android-arm64": "0.25.5", + "@esbuild/android-x64": "0.25.5", + "@esbuild/darwin-arm64": "0.25.5", + "@esbuild/darwin-x64": "0.25.5", + "@esbuild/freebsd-arm64": "0.25.5", + "@esbuild/freebsd-x64": "0.25.5", + "@esbuild/linux-arm": "0.25.5", + "@esbuild/linux-arm64": "0.25.5", + "@esbuild/linux-ia32": "0.25.5", + "@esbuild/linux-loong64": "0.25.5", + "@esbuild/linux-mips64el": "0.25.5", + "@esbuild/linux-ppc64": "0.25.5", + "@esbuild/linux-riscv64": "0.25.5", + "@esbuild/linux-s390x": "0.25.5", + "@esbuild/linux-x64": "0.25.5", + "@esbuild/netbsd-arm64": "0.25.5", + "@esbuild/netbsd-x64": "0.25.5", + "@esbuild/openbsd-arm64": "0.25.5", + "@esbuild/openbsd-x64": "0.25.5", + "@esbuild/sunos-x64": "0.25.5", + "@esbuild/win32-arm64": "0.25.5", + "@esbuild/win32-ia32": "0.25.5", + "@esbuild/win32-x64": "0.25.5" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", + "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.0", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/finalhandler": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", + "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-tsconfig": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.1.tgz", + "integrity": "sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==", + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "license": "MIT" + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-to-regexp": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", + "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", + "license": "MIT", + "engines": { + "node": ">=16" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz", + "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.6.3", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/send": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", + "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.5", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "mime-types": "^3.0.1", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/serve-static": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tsx": { + "version": "4.19.4", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.4.tgz", + "integrity": "sha512-gK5GVzDkJK1SI1zwHf32Mqxf2tSJkNx+eYcNly5+nHvWqXUJYUkWBQtKauoESz3ymezAI++ZwT855x5p5eop+Q==", + "license": "MIT", + "dependencies": { + "esbuild": "~0.25.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/type-is": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + } + } +} diff --git a/player-parsers/package.json b/player-parsers/package.json new file mode 100644 index 0000000..d0fb9e2 --- /dev/null +++ b/player-parsers/package.json @@ -0,0 +1,14 @@ +{ + "name": "player-parsers", + "version": "1.0.0", + "description": "Player Parsing for AniX", + "scripts": { + "serve": "npx tsx ./index.ts" + }, + "author": "", + "license": "MIT", + "dependencies": { + "express": "^5.1.0", + "tsx": "^4.19.4" + } +} From 9a2a5472177456b3bc7500d8bbc5de79c7814c72 Mon Sep 17 00:00:00 2001 From: Radiquum Date: Thu, 29 May 2025 23:03:35 +0500 Subject: [PATCH 39/58] feat: add docker files for player-parsers --- player-parsers/.dockerignore | 2 ++ player-parsers/Dockerfile | 10 ++++++++++ 2 files changed, 12 insertions(+) create mode 100644 player-parsers/.dockerignore create mode 100644 player-parsers/Dockerfile diff --git a/player-parsers/.dockerignore b/player-parsers/.dockerignore new file mode 100644 index 0000000..4400aea --- /dev/null +++ b/player-parsers/.dockerignore @@ -0,0 +1,2 @@ +node_modules +README.md \ No newline at end of file diff --git a/player-parsers/Dockerfile b/player-parsers/Dockerfile new file mode 100644 index 0000000..0466a41 --- /dev/null +++ b/player-parsers/Dockerfile @@ -0,0 +1,10 @@ +FROM node:23-alpine + +WORKDIR /app + +COPY package.json package-lock.json ./ +RUN npm ci + +COPY *.ts ./ + +CMD ["npm", "run", "serve"] \ No newline at end of file From 8486e9eb82e5bf04c7021e4924ce1d3ffc7a2fc0 Mon Sep 17 00:00:00 2001 From: Radiquum Date: Thu, 29 May 2025 23:23:14 +0500 Subject: [PATCH 40/58] chore/player-parsers: Label docker image to github repo --- player-parsers/Dockerfile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/player-parsers/Dockerfile b/player-parsers/Dockerfile index 0466a41..871f0b2 100644 --- a/player-parsers/Dockerfile +++ b/player-parsers/Dockerfile @@ -1,5 +1,7 @@ FROM node:23-alpine +LABEL org.opencontainers.image.source=https://github.com/radiquum/anix + WORKDIR /app COPY package.json package-lock.json ./ From a55a6c93dc9983a99ea1afdfe786613d49c4d9d4 Mon Sep 17 00:00:00 2001 From: Radiquum Date: Fri, 30 May 2025 01:15:37 +0500 Subject: [PATCH 41/58] feat/player-parsers: add README --- player-parsers/README.RU.md | 115 ++++++++++++++++++++++++++++++++++++ player-parsers/README.md | 115 ++++++++++++++++++++++++++++++++++++ 2 files changed, 230 insertions(+) create mode 100644 player-parsers/README.RU.md create mode 100644 player-parsers/README.md diff --git a/player-parsers/README.RU.md b/player-parsers/README.RU.md new file mode 100644 index 0000000..e107277 --- /dev/null +++ b/player-parsers/README.RU.md @@ -0,0 +1,115 @@ +# AniX - Player Parsers + +Данный под-проект позволяет получить прямые ссылки на видеофайлы с источников Sibnet, Kodik, Libria + +Он может использоваться как для основного проекта AniX, так и как отдельный сервис. + +В основном проекте, парсеры используются для работы своего плеере, если вам не важна данная функция, вы можете не развёртывать данный суб-сервис. + +Лицензия: [MIT](../LICENSE) + +## Использование + +В строке веб-браузера необходимо ввести: + +`://<:port>/?url=&player=` + +где: + +- http|https - схема по которой будет осуществляться подключение к сервису +- ip|domain - IP адрес или домен на котором находится сервис +- :port - порт сервиса, опционально +- VIDEO_URL - ссылка на видео от источника +- PLAYER_SOURCE - источник, один из: kodik, sibnet, libria + +Ответ: + +- 500|400: произошла ошибка, подробнее в строке `message` в теле ответа +- 200: запрос прошёл успешно + +## Развёртывание + +> В связи с спецификой источников, рекомендуется использовать виртуальный сервер в россии или нидерландах, т.к. они могут быть недоступны из других стран. +> +> Из-за данной специфики, парсеры невозможно развернуть на edge сервисах, таких как CloudFlare Workers или Deno, а только на отдельном сервере. + +
+С помощью docker + +Требования: + +- [docker](https://docs.docker.com/engine/install/) + +### Пре-билд + +1. выполните комманду: + +`docker run -d --name anix-player -p 7000:7000 ghcr.io/radiquum/anix-player-parser:29-05-2025` + +### Ручной билд + +Доп. Требования: + +- [git](https://git-scm.com/) + +1. Клонируйте репозиторий `git clone https://github.com/Radiquum/AniX` +2. Переместитесь в директорию репозитория `cd AniX` +3. Переместитесь в директорию парсеров `cd player-parsers` +4. Выполните команду `docker build -t anix-player-parser .` +5. После окончания, выполните команду: `docker run -d --restart always --name anix-player -p 7000:7000 anix-player-parser` + +### Обозначения + +- -d - запустить контейнер в фоне +- --restart always - всегда запускать после перезагрузки сервера +- --name - название контейнера +- -p - порт контейнера который будет доступен из вне. ПОРТ:7000 + +### После развёртывания + +Сервис будет доступен по адресу: `http://<ВАШ IP><:ВАШ ПОРТ>/` + +### Примечание + +Для использования своего домена и поддержки протокола https, вы можете использовать traefik или другой reverse-proxy, с сертификатом SSL. + +Полезные ссылки: + +- [Конвертер из команды docker run в синтакс для docker compose](https://it-tools.tech/docker-run-to-docker-compose-converter) +- [Как настроить traefik + свой домен + SSL](https://letmegooglethat.com/?q=how+to+setup+traefik+with+custom+domain+and+ssl+certificate+from+lets+encrypt%3F) + +
+ +
+С помощью pm2 + +Требования: + +- [git](https://git-scm.com/) +- [nodejs 23+ с npm](http://nodejs.org/) +- [pm2](https://pm2.keymetrics.io/) + +Инструкция: + +1. Клонируйте репозиторий `git clone https://github.com/Radiquum/AniX` +2. Переместитесь в директорию репозитория `cd AniX` +3. Переместитесь в директорию парсеров `cd player-parsers` +4. Выполните команду `pm2 start index.ts -n anix-player-parser` + +### Обозначения + +- -n - название сервиса в pm2 + +### После развёртывания + +Сервис будет доступен по адресу: `http://<ВАШ IP>:7000/` + +### Примечание + +Для автоматического запуска приложения, рекомендуется настроить pm2 на автозапуск, с помощью команды: `pm2 startup` + +Полезные ссылки: + +- [PM2: подходим к вопросу процесс-менеджмента с умом @ Habr](https://habr.com/ru/articles/480670/) + +
\ No newline at end of file diff --git a/player-parsers/README.md b/player-parsers/README.md new file mode 100644 index 0000000..16b78d1 --- /dev/null +++ b/player-parsers/README.md @@ -0,0 +1,115 @@ +# AniX - Player Parsers + +This sub-project allows obtaining direct video file links from sources Sibnet, Kodik, Libria + +It can be used both for the main AniX project and as a standalone service. + +In the main project, the parsers are used to operate the internal player. If this function is not important to you, you may choose not to deploy this sub-service. + +License: [MIT](../LICENSE) + +## Usage + +In the web browser address bar, enter: + +`://<:port>/?url=&player=` + +where: + +- http|https - the scheme used to connect to the service +- ip|domain - IP address or domain where the service is hosted +- :port - service port, optional +- VIDEO_URL - the link to the video from the source +- PLAYER_SOURCE - the source, one of: kodik, sibnet, libria + +Response: + +- 500|400: an error occurred, see the `message` field in the response body for details +- 200: request was successful + +## Deployment + +> Due to the nature of the sources, it is recommended to use a virtual server in Russia or the Netherlands, as they may be inaccessible from other countries. +> +> Because of this specificity, the parsers cannot be deployed on edge services like CloudFlare Workers or Deno, only on a dedicated server. + +
+Using docker + +Requirements: + +- [docker](https://docs.docker.com/engine/install/) + +### Pre-built + +1. Run the command: + +`docker run -d --name anix-player -p 7000:7000 ghcr.io/radiquum/anix-player-parser:29-05-2025` + +### Manual build + +Additional Requirements: + +- [git](https://git-scm.com/) + +1. Clone the repository `git clone https://github.com/Radiquum/AniX` +2. Navigate to the repository directory `cd AniX` +3. Navigate to the parsers directory `cd player-parsers` +4. Run the command `docker build -t anix-player-parser .` +5. Once finished, run the command: `docker run -d --restart always --name anix-player -p 7000:7000 anix-player-parser` + +### Legend + +- -d - run the container in background +- --restart always - always restart after server reboot +- --name - container name +- -p - container port accessible externally. PORT:7000 + +### After deployment + +The service will be available at: `http://<:YOUR PORT>/` + +### Note + +To use your own domain and support the https protocol, you can use traefik or another reverse-proxy with an SSL certificate. + +Useful links: + +- [Docker run to docker compose syntax converter](https://it-tools.tech/docker-run-to-docker-compose-converter) +- [How to setup traefik + custom domain + SSL](https://letmegooglethat.com/?q=how+to+setup+traefik+with+custom+domain+and+ssl+certificate+from+lets+encrypt%3F) + +
+ +
+Using pm2 + +Requirements: + +- [git](https://git-scm.com/) +- [nodejs 23+ with npm](http://nodejs.org/) +- [pm2](https://pm2.keymetrics.io/) + +Instructions: + +1. Clone the repository `git clone https://github.com/Radiquum/AniX` +2. Navigate to the repository directory `cd AniX` +3. Navigate to the parsers directory `cd player-parsers` +4. Run the command `pm2 start index.ts -n anix-player-parser` + +### Legend + +- -n - service name in pm2 + +### After deployment + +The service will be available at: `http://:7000/` + +### Note + +To enable automatic application start, it is recommended to configure pm2 to start on boot with the command: `pm2 startup` + +Useful links: + +- [PM2: smart approach to process management @ Habr](https://habr.com/ru/articles/480670/) + +
From 631936b02206ac2f94aa4f1cae78d7614e941149 Mon Sep 17 00:00:00 2001 From: Radiquum Date: Fri, 30 May 2025 01:23:26 +0500 Subject: [PATCH 42/58] fix: build - exclude player-parsers directory from next build --- tsconfig.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tsconfig.json b/tsconfig.json index f8a929b..8fdb696 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -33,5 +33,5 @@ "**/*.tsx", "next.config.js" ], - "exclude": ["node_modules"] + "exclude": ["node_modules", "player-parsers"] } From 23da153e65564d9b976dbb0a96d173102cfc6303 Mon Sep 17 00:00:00 2001 From: Radiquum Date: Fri, 30 May 2025 01:25:12 +0500 Subject: [PATCH 43/58] chore/player-parsers: add missing step for pm2 --- player-parsers/README.RU.md | 3 ++- player-parsers/README.md | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/player-parsers/README.RU.md b/player-parsers/README.RU.md index e107277..0ee08cf 100644 --- a/player-parsers/README.RU.md +++ b/player-parsers/README.RU.md @@ -94,7 +94,8 @@ 1. Клонируйте репозиторий `git clone https://github.com/Radiquum/AniX` 2. Переместитесь в директорию репозитория `cd AniX` 3. Переместитесь в директорию парсеров `cd player-parsers` -4. Выполните команду `pm2 start index.ts -n anix-player-parser` +4. Выполните команду `npm install` +5. После окончания, Выполните команду `pm2 start index.ts -n anix-player-parser` ### Обозначения diff --git a/player-parsers/README.md b/player-parsers/README.md index 16b78d1..e78d539 100644 --- a/player-parsers/README.md +++ b/player-parsers/README.md @@ -94,7 +94,8 @@ Instructions: 1. Clone the repository `git clone https://github.com/Radiquum/AniX` 2. Navigate to the repository directory `cd AniX` 3. Navigate to the parsers directory `cd player-parsers` -4. Run the command `pm2 start index.ts -n anix-player-parser` +4. Run the command `npm install` +5. Once finished, Run the command `pm2 start index.ts -n anix-player-parser` ### Legend From 767121c77be657eb22296dedb06a34a1de38c779 Mon Sep 17 00:00:00 2001 From: Radiquum Date: Fri, 30 May 2025 01:32:57 +0500 Subject: [PATCH 44/58] delete/extension: extension is no longer compatible with self-hosted version --- extension/README.md | 20 ---- extension/chrome/icon-16x16.png | Bin 875 -> 0 bytes extension/chrome/icon-32x32.png | Bin 2628 -> 0 bytes extension/chrome/icon-48x48.png | Bin 5287 -> 0 bytes extension/chrome/icon-72x72.png | Bin 10291 -> 0 bytes extension/chrome/icon-96x96.png | Bin 16225 -> 0 bytes extension/chrome/main.js | 116 -------------------- extension/chrome/manifest.json | 27 ----- extension/chrome/watch-on-anix-chrome.zip | Bin 40519 -> 0 bytes extension/firefox/icon-16x16.png | Bin 875 -> 0 bytes extension/firefox/icon-32x32.png | Bin 2628 -> 0 bytes extension/firefox/icon-48x48.png | Bin 5287 -> 0 bytes extension/firefox/icon-72x72.png | Bin 10291 -> 0 bytes extension/firefox/icon-96x96.png | Bin 16225 -> 0 bytes extension/firefox/main.js | 116 -------------------- extension/firefox/manifest.json | 32 ------ extension/firefox/watch-on-anix-firefox.zip | Bin 40636 -> 0 bytes 17 files changed, 311 deletions(-) delete mode 100644 extension/README.md delete mode 100644 extension/chrome/icon-16x16.png delete mode 100644 extension/chrome/icon-32x32.png delete mode 100644 extension/chrome/icon-48x48.png delete mode 100644 extension/chrome/icon-72x72.png delete mode 100644 extension/chrome/icon-96x96.png delete mode 100644 extension/chrome/main.js delete mode 100644 extension/chrome/manifest.json delete mode 100644 extension/chrome/watch-on-anix-chrome.zip delete mode 100644 extension/firefox/icon-16x16.png delete mode 100644 extension/firefox/icon-32x32.png delete mode 100644 extension/firefox/icon-48x48.png delete mode 100644 extension/firefox/icon-72x72.png delete mode 100644 extension/firefox/icon-96x96.png delete mode 100644 extension/firefox/main.js delete mode 100644 extension/firefox/manifest.json delete mode 100644 extension/firefox/watch-on-anix-firefox.zip diff --git a/extension/README.md b/extension/README.md deleted file mode 100644 index e016101..0000000 --- a/extension/README.md +++ /dev/null @@ -1,20 +0,0 @@ -Это расширение для firefox и chrome для добавления кнопки Смотреть в Anix на сайт anixart.tv, а так-же найти в Anix на сайт кинопоиск, если обнаружен жанр аниме - -## Скачать - -Firefox: https://addons.mozilla.org/en-US/firefox/addon/watch-on-anix/ - -Chrome: https://github.com/Radiquum/anix/raw/V3/extension/chrome/watch-on-anix-chrome.zip - -## Установка - -Firefox: - -- Загрузите расширение из AMO - -Chrome: - -1. скачайте и распакуйте архив -2. зайдите в расширения браузера chrome://extensions/ -3. включите режим разработчика -4. нажмите "загрузить распакованное расширение" и выберите директорию куда вы распаковали архив diff --git a/extension/chrome/icon-16x16.png b/extension/chrome/icon-16x16.png deleted file mode 100644 index 7f26af42845d9a6e701b5d1c0f92336a5fb26a99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 875 zcmV-x1C;!UP)dLXo#%Iu58CQ<_zzc8af$fiK05()8f7#HM+ z#o7euGcw`r95b1a|7)0!91s6+7TbsOrMS|}AToxm^5KnT%$dU!y~rh6#dFyL?? zYgZbgG@;UTo6Uxtvj)iJ9C|E$sH%M_62d4Ug#-bbcZ8CN;?qarbUN|%+jq>IHU-Dd z8FA;Blx;YEFaw-ihVanwD7kSPx{NH5i*^z`Www3ZtXNJPKNIa8W}Gw>W9_me zsDcCG;Vy2&!`H_bYE=OC<($FNL@ly+ry+UA9@I8A50J>Xh4!Qc^EutR)r|Ff_-wIY zPRw-l_xFPr1lVnMD94O}@2HW;DY%G;P&F>(W+U@N9?B}84~QJRlexM^Jib{X%8XCF z7R1NSz~+pDxL%kCp68LAz87Z?XEOX>5X<1zzHEYa)p`h&K|nybAt5eS|EZ@JE0Yp2 z+SeQ9)wM|1Z9sfXG;ZI244+Y6D77SLsyOl9H=VtEQDm4)cdEP07 z8Al*4z@bwG$So)m{a;PFAyyu2;&9Jr{zzrmN$!E&k{?9F)G*Ta<(y`+wNMap33A)8 z&omS)(fPU>8{0g6S?G)OQ_s$kyaxn*&(&N!n74~U8~)4ZQN#LNQ+6#XcC$c zNysf}3&n_PU5CDiLAsoC_Icm)eaU5K?EB-_Ip;g?^E~hK|3CldIRZX*wXtudZiaC( zR6}LJjka}^Ww|vVKoC$3$Q5)|D2esi5Y-uYTK4Q?ObfsDlA(D!=XyaCEvwX10F^O0 z=Sz_3s_Aa_gZ^HYYE*)1pMfZ?s@0a={52o{I{;f-6IFvz44rtcEI`Aot5gDfhI`}i zv6EzzJhC8oGy=b*KW{G?^=g&0xk2@M86G@%^`SsM7=WRLol~94FinQwN@-=T;O^Fy zdkF9ugZVM5xh;Y~=U*`+(5=Mdp`{+6UCl_lZ*{`;;tn}R=-Veasv6rBhGi6yY z*X`%IP1+ELqd8|_XJvu(<0o;e?2axA`qVR1x{Ng9#G~Ya)2~`djZt`TtDtERZwFvu z?X=i6)X_U#ffY`;62pB&ajvm7?H~2HeE((WJ|KWI8Sp|)62#V}=jGH>v4(@{Eds0_6PQ@kzz9x~8w56O93=%wks=Yb_lATXmR(! zBTS#{i+~AZFxYn*{;?Rlxd$f1#_3Ge&t0;`zK%@)P`K&B3LN1H_Ll7&d4Cd`A!A&-bQf;OL2ysI9Fh zIK1HM?1ViB(sBNBA$Lj8CgJDOnF2`Rpb;KY=@{#2)Y+jU3=Ny1u;eDiB%!6LDMok> zM9B0hFflShzn(pGfC?zMT8yhVZz0HUJW5J$;c4|##BWPN&bfTNs;S{6DX~+%sRq86 zI97u?(MEuk)2CFk$#29&Kr@X20w+ztNbkWgYt<6B|8obszD>jBqN`ZFd?Dt1HcgjG zUiDl6nEk)6-Go(NZs)-UO!R@BwG}F>s&M3Z4!%8n6rw0Ll97>{Rv-o7xPvZ(6^nFh zZie(-32<|D(bca)Uzvnu-PS}bTeAs!wyeb`BuF~hpxPA4A?Q8Qk7vQ( zXC$|iuqy@8aT`!^=@eR-8X+WNG4`Y$rfjyw$_3#F`eY)JSj98dYxqPIm)=&OgIp!3 zZJZirPW4wC8yREFP*0een&1YJ$C-(0ocFPC}UyMsdCFta2kMzte^y%h`ecLvWO=}!Eb^@m_7ND90YWH_( zqM&K#(y(@Uw7R*85!`!pLlk@AR=*JD!RFJMq1J)e#%*&FTqdc6~vR#Sg~#s)D+~8DT#3J?ux=|CG`I~ zSIFqtcu^3n2?B{Apo|1e7>nJTSEKyyJsduMhOoECk*t%L7aWAIlfOgk!U%e`9>445 zjrn1r2oIUgRd3mvjY$0=3ne)jJb;kDF2SC(LzH$kiP%I^#ksJtH0NXOys2Q!GPXwNZ6f%%#&xZa$z{Sc5-g4hB7MWZbN)fPvxjvjD(Im$VM=4 znS}L(QA0`nHgM8hC$f~^y^9`QT+q(i8jmU~Dg9I7>f(a$6SvS7=3ZID{HJqRvJZSi z%x|GktdajRYKbT8^tpM|jd>BU3cs{=nQ7cy= z|H^gr?b#i-%PKerC;$>7CdG#8hax_pDM)SAQ+N;RkE_%p z!v8b_Y1ADrU%OT#*GeSCY*{(&G;h;t#*sZ=W03DuE=DHChPY5ri098=8nHJ~pX zI<#-1ZcWD?J)~?-1cxp+?=s2oQ?xZ}je+jH!0->8GaqLU?S~h^`0{ma5+1Q;#Fja= zIF)!UBJ__Mf%0~OSekoiAMXk8F5X7od&(XtQ!9TD>BWa?^V=+na$YnCn0nPE+b0Ohn|#@WEBn}QpsFdgk0 z*~c!}v@GK<3zp)+V=XM(nsJ3Bv5LpfO$QR@hDI_-CV3QutKQF+*yRWz{bxqr^c5MU zWi%IV+=lXd_jx?FR#sR*y5QEOlQJ5!fs%zwmtQ38z@oS>cvjdk$WSrVFW(=@_zoIM zss3mvg*h|9z5_PKEJet)0A6xRU8(T=mlvq5ujjKt0})ZAp26O4L&Rf3r0bvLJc*pg zD*-8`rlDDAN-N-bEyh7yi zSnQ-3Liu#yL#b94X)M?N+E}i)$1Nx_#7(MoHgxDdY>FX?eoarV-|%5V>o}omFo~gr&ZQG;ST-09ea8&P0_yX_g)Y8Ps?o}`$P zBqHbRMcgdE%QMBlCm`3*>Gu&iRQ?#cZY?NA8DGF5JjTM{?I%A-zyd m_Z4(msD_X&)`=hedH!Eq>nMwLxWwWB0000Px#1ZP1_K>z@;j|==^1poj532;bRa{vGf6951U69E94oEQKA6g){pK~!i%rCJAI zRmIZ&&bcKOLQMgZkVXxHh;&6dQUnwU3MwK}1XQpf`t%n?Y$!^3Ajp#@N>BtVf(S@a zx*#A(5E6P~2mzAZ+~l79zu9wd2ns&+jqEvRcV}m3W~c3q2L3mY^$vGTd~#{2qlI#q z&0rx_DHUfJDpCQVfJr2)fRAh_WWg}@8kTRTWqG$D_f!Vg`!uD02>(<76P2Q4O;>Ol z498H*FyajbCz<0*6E!FVyCBa7|C3P-^1&t(Rw>6bOv^XV>2oggasVJ(e4OsSwuVP3Y?gZ$zc)Fp?74_(0}&lep( zemXGuSHR(a|97aI7~!Z;@hP9fy;zy9X38+!95rp`6}sHi8pkrT$PqOzOv^(MgcbW! zMEbqPG$vaRTT`Fq814v*Fs<;QohT?M@#Fj{{EpsL!EnVSHMM+LLQ_e$H?);1+Ka0Z zgNp?P_)s5l3WHrt} z(Wb@qC@Ly|%jH67NHDkbvn0&x@A4o**>4*}_XLf{FF6frg4>0cn&u*BbiznZT$9gh zO&DfW?ZMyg9g6rEWYr?#`S%=v`3G2ZQ*t}I7AEyvsw__f25<}aFr^|a!04s z)62`jl>#tSa?d3s6DGvI)wTp`*)K84&-gbsO;9laFH0`p@yqnBi#Cr~ztJuZk*RA#iB^ z{bCzNr4pqUBPuG)9!NC#Z>LU5sxCGLIpfK zZVb{F%*Mng#$ezby$~M4N<{Cdg^;6YVj}!u|DcA;0@O&VMG3~y4te(Cw6^gIW=ici zOnLGDux8^HgaiknZtYkcJ$_vKMdQ>|y*ws5N;4&p5MK+AKQvUE-TuQz(6&_zbZOHP zdk-AK_=g|DvU$@{C$0uJw@)}D>jXO7eh&^FIg0c7myo{vOUzrk5*IEN1bEj?tdgQX zjhMt(85IZ!U>c>yOSCyT9?i8sxbZ{bU*kq2GcyyJr%t1L$970aPGHD%YqAY#_f;!a zgws*(FuBtcqlcmeO()}67LJj@xzk=nL|7=^m^laCJGIA-Z$8D8=bl7enxKno5B+)! zt-AEV2OqD%tf`Z6=!Z4<=-sz5;+`}FxtJWaa^yiCEyo1u$X5D6iQ){)+|N$9bS+yk z8b6_C4EAkajS-Jcz=tcoz^bM5X*TugygXjR(zp*kG6AWn_3-G>!Lo?|#PAH9&CNx- zUIWmgSrg2E`!($NX&?Fx9*wo1EJ9LzP1ylVlGuMR10R1z+H2S2Xy$47d?kpBtBKUa zL_|hMV*av~DDZeRz7VH!^WZ5-LVo6X;nP6%#3#t?D>MOHAP$NC<#~VqJ~V9$i$D1S zrF?@mg^N)rHYy4o+qcEwyZfVBwJKPWz8n)C8KrfkPfy8-uzu#L4IDleuf6y*S~Y2e zJv1YWOgE~ZjP;wo$HHZwVB_W;IFpwLlXM+4U9ZosumkK!Wotu#E7?MgMRvwCVzhG_ zktYvugmsRr@ykF&L6smN;VhI9q*A3y^Z_@uQH1k(7pR01R)Yrm_v%6)c@9+~D*6SG zM_^L}C8b_!+G4rEnvKI*Cr@J7*zx#o>u$2v0J+-F15}RIgeMZl@F8(h{7> z&c=VximUj)TH@m>5s+)aEQ$f_E0BQxFz2Wl9x#@)YG-7gUMaK+NYp!!-Uw^5wix`!QNI zZG=U$-a<{re_1MHWz6Ysg+q)S{U02|2$F>sO&VfV`U0L-u*T7fqC+dc0H@Amqiv6V zIQ3gTdbDqYdDC7;M0mKSS)Q(d^mp#vhXKPLLDuQBe%7x5i-Y|f2(QX`XEY~snrpjy z1RB?`i?7ocQ8N`#>@CLL{Ri>cs&BCBTXD4G2%=ka*Vy;V5h~ll zEex54TmSiJMdx(jyjvie)Af3UZ zkT{wYLEhTD4dX0~sFd|=7Mn7nk`0XoWJXC+fZ7Z^AR8lh;vCRxI`77mnKJ zG2Yst9iv1YOqld4UYs%==kg0+vQ`Oz=u;xn;bX@!`pIYU>WtZF)4Um4(&P%gC0b+R zbhhK!Fl*johHoeC=+O=FHEYl{ENZm~yMH=}6X(uj%+nLm?zS{++P>4jg51y=1a4=Q z+aNiS8|(0(wXbO_73VO*tGvWP-bVC{u6bU3YAn`#yFoi^7Zztc39MSSkmlh7Plje8 zRS@*iPo4A}cJ4WV+`Qj#eWO%-v1T2UoD;1W`*-}fj}Cc83qNV5ZT4&a)g_MK@ z)J;lYhKz%gp)!=QStbj;rFebXY%HT$Jp9Z=D9yZqWM;|`GJ26rh%Q1YY&f&CMB-8= zqQt~_^y}FfeY>`2_^qt-fCwhHwz6m=Z~td>R5je$s~gJ_76Tl=R9KAthYs75e)=iA zI3=<4NJ@x9Yz>;B<}fPxf=Q(jNfd5Q|v+6|lO;3=wkx7$@A9nz~E(xb9-a#VD^W-6#=eRcY5 zcA0Z#XJ@O(ghtB2HH}(#;yYOfi1;S0)jJE8*iJ2hfVAJ4w?GBck%OuwC^z{uqU$i= zkax!FY*B-kYV=Zl#r$5gVT)~Mgi#OPixN)>8q`h3#xIs((ahJdcIEr198m#39XyDk zycf#}NZY=1mv+2{EcQeZ6(&dc(%z$KLtML5e52IpexjPGyv(M$>i`DD2%r-?4o4guE z7L70IEyjPJ!DB%r^8lL}m84#H^(~r(n1)9c78I%zCr_)U9eS#o4O*y%H+54Rx9w0x z952$Q=28ECcfK;ClT~zs=IVU@MLkwrT&TRo_WX%cr&Ptb1}dmlJ+*q>ciN1^yw1=R z_a8i@_bH40m`uUfP zGQ0r&@_k8y(%zggThrBiQMo$V+Cumcnbeym))q`o|7Za`RyF)G;fFT&%dfo;n5Kf z;^rHgAm{u=bi92azFNCMheV;RjYFH9-9L9eALA#!g2x#y<<8(@WbDo>t$;2gpf1Aa z+%8KUh)mqeY*Rnf?J~A~y#lSf_0<_wVy@(an$@ddP+DKKXxapoSvBV8=VSYid$HuB zPjU1l6BVfpy0bTCyz&BXSN@DmXUaTz3N1VLMUU+L}zp0j;d$ZO_Q8VT&P)*x)S7v0QaxiQK>`>m)7r%*b+(vz{e5Ll2 z-ENAK8#1bYy+WJ9ae4rc%P?4_fjFL#mVQcfs{p0my2w3#O4eMik&ALKA*`B7=eXs&tvig0G?O8N2H>O5 zzDCyZ@vGb#+qhI){jUU{J-TxMC2>}#yxTxM8v^y3Z<=7pVS2Mj@Z~ zIN+SfE3&p)8mz(IXfl$BrC^$41<*dDf0D zOZ?6*ijg0Sr_GsBUUqHAO2OA1>lbY$XHa;oqR7OQFlO50&Z$^ z?$lRU1KG)nw>duTNqsVetdpnp2_)B!M^4^39a(BbMIrOV39XD|mcuq``L$AlTbMa- zA;wRdV$TFN73lyk<-7~053k_2tu;Sf{f~SFc?VFT>N$ROAt4?(pIlZ-X+B@Q7H(c- zT3p{){}3hHNVA<0yhVkhdX*}0GNDxn4MioIjr<&6g$b}qCHp6rGSEk%bRqcc8Unwu0+i8YZ&f`~SlG1pxx%`y4e#;NoyYFXo zV`>j_2XQ061N%)%PQx#c23e>1mPQm?2>Aeh%gsaDkTF=wU}3Q@Gd5@{ULudi*~9ZW z@CW7vt}TE_Uy!#QA(apDgr&x{woj@6KY!Fk1%#TO_E_+l>~`0qP1X`13fym$M{D_;yU@GhvwZ! zLF~WoNca0~JMr?=nb`3C4ixJuRJ5)yQJP713k;tz(F*m>C?6{S4F0+RHW>1U5ctfe zX$WcTRuTdHr=r22hEwY#qGz{GxUOM6l(LfCzI(5}Q60%T!5l!V6^^-ti^#anv*ii4pqj;wRiuAU9H=BI^&-eSzB-s_O z-~E5@^URZMHZz&`^M1?cTiy}kzc5^$fa222H4zw~nc8sgg zTP*Z0Le)cbJt0b~6}Km-W$7VBh&=Isa%3Apk)!)WmM5U7-f}IwxLCOKav}VEMXsl$ zS~WrwRg)$f*{K>)C`J^*dDX4dp%@l_?);DbP9IUIh6TEY;wfLLddend7YC|Euu8Z+ zL6N7I3C$bU^8GO-*BcgYPw4+QEJ9?PWg^E2h%Ap^Xx?%yuUHqVHz;z73Ol;IWg}I+ ze3fQcaR~@bo+p|RMl>#rXp3S*Tj_5_w~~q>4`D`A?-j$M|Fx>R)gtIRrj?KYOVCt3 z99O+%tFk;LBRlA21)4W33jI-`=@Bj06A-z@CBp3~``-hTqX$K<$ItJxjG)%3bH32L zWg^$(^|(DH(^NgQ%~^G!vosJ$t*RMIC}u1v3<4oauOM)Q9)Us!foNJ#=#b|p72SgB zjU)wwN1#O$iea@X47>%^2$NLN@nen=nOay9^JuyyyagRZwqB-*E<;4eBA>|i1phbS zDBd#R(t~s;ieYIvMyc==YHpV&I9by}yH!05ny@e2lt;3O&MLX}SfsVeQT`tjVTZxU;>bLNOy+mM5sVJVBxU*QKd6A{1Xp zxQ%ix+Xx7S45cSw(K(X{(^E zTDF?0-Ut*r`0qnVR2u*@B#Hpz&m*LQEu^NZ8HQUgpP!%I*_~~a3AYh;so}07Pjmg} zfYH1qB3myJ1ztm_M!75742cf@@=DE&tm7LZyCRKk1~5^mz6yv=r5H7S5;|A(z_Dju z2pWA)84l6Ggv(#iZsHCo5vihwkQ&uiBl&*^ASs0mtR9gxL4HPdDnZxNjPSZVe_3U& z84@nP<;pE87TMks;Wo?vO>m5Ik)`|Dg)2sd=JJ$@9B=t4njWr~6R}!I)NSu%i#vf6 zV{i@|bSjp=wF)BJi^((YVSrBf)d+|VKDYywnNrYReGV->Hb`kuZGdzOT3YI)G^K4+ z3j=FJ>T|uJQ?h)PaQUk=lBjH7M7RSL|2jZ!x`^%%54%*OoNUi1 zS{2(6644_t*xqE`7=2F0SLEuLI{Q8b=+djMgYbrM@L(-QU40#daO1^S-@uADRzu`? zptT3ck$?;y)mF;dsT@g`*_Jl2Crp1w5>RQg$bctR(}LR{z06Id(r39y02JdNWZsG% z5sGdJRgbtdJt8zcd@>O+x@lFn5@aM7 zCNcL2G&6!MzctkDiwMn(xKx8A%KAItc*6`3QFXT-5!rgAQq?2%(jM4ql`?=oCwpvr zI{0wL#aAGiWPEVt#G6@Cj4r((at&O0{Z#%u(VD;sXPgg_Z$e{_CgZZ)vMz83Dr9_S z|3=&ROn#4Fi_1{jy)W|0x*zb8Rnh|NpHiDI8Yh6ZI(@c`6 z*xx|NOVSfohydnzOR^L_vd%HcDVviazN}ItHMY$l@<(>%*(J**Ishi$Hj53mizeN< z6w6kwO8xKQ$DUx&Xi{vu^8M&H>|C6F;b@3F2^`xsGTih#86auwDNE3`-(akI?-QJL z=~!tWa}9{jB`k?#-`s&JxB^x3`evqCpzy~cN&2eDh`Dop6~bjk6<2BXp|R17h&Vo6 zBvd1!sjQQcc{VsL_G<>km#dl=h)5`wykDlo+`CR6L~?Q z97>8@Mp$UxkfwRdh3Y9EOuRz%Mo3>Bcj+LXHpV#y&cEUsoO9XL5Cx?W9Rs-Ns!4pa zbv3p8x^($Uh@vuxPC@iI@eIUUS{c0h+B*LKlsoT&$kCBiTFDYtam--U*Egd7X~Q8p zmavT)boNEit9#k}sVc4BELl-L@1u=_JC|)0 ztDX#c?ZZltQFrOq5SI}Zni17BUwhZ@2?>`T5}Ge4RMVHGc|#jCFMESlo7uADI4j31 z*)f2=r=E?v`Z^pr=rmp-n#}5tK9>O15o z@P;+v4Uw2lCLSSkFi|Ib$WW^oghx(f^A9_)?#~+_JmnCb%5da~r(?}0pW`pzeUC(I z3tHn%*uQTtDtey);VQzooA2ZaG|&VZo6%4&rRbqYA7^QFmsYd1z5e!l{P`Idj$%?- zSkVJJcJ4tM?vT?EMM^!pL_6N4UQuxAUZ&Z9EdC;rxCW3 z=|DL}Q(7d&h)xnlR0t!g@oR>0R>(jLPuQav)^3}!C)nzfVY7KgN_z54+;Q)GsUkD( zVoyY?egC76BYgA#jJ{zC|F5?8AirKP`dSE)he>w0(NI^x>wr^`Q&KIBc)s6RaEItp_JRK1E%c~Im{B3jsG@kILReNQ`G1W#fTCMd zZLw=%)iNYFWZ0xQlff)Q_^5%{x4#xG%}qG`_*2+Rg^xN8d-v7hqc6T>j?>!GjQYA7 zzR9PadkI41WkpSJJ7N1uIx^G098 zY~Pk7DMeb5ezQbP4 zWh-Bo;%G&Z57u^BB*%`8zgR=@wD1Sc z3_SB(OqxCm3xD@Cd%9_J=CV^Es*uWD+Nm00T0bggtiT3IA%HZ6r6+Q!Ej@9S=(z0) zg`H1kV^~;*z+uN=|G^sU-M0_N4m*b@(>Z!LF1+FzTry??Cf;%z7CrF{zWnl!snw=& z$u&13(7g|kNT#HxxrvTO2C3c#>9yD2VOvpt7CGhJFz!~{ zsN0{v_wi@gxobDS-@0WBrq22eD*7A;Q5=NG^|7ZE`2qH7WW2Kil{T}kWS&K@4(U8Z z5KJ1=Y6G-d6qgI7D5!8?s_4;bk{pK+I&NKQ7gA_shrAIcenjrrwUge{K`T?>WADOt zfc{@t#u8@rIu0+dc%3Ik(n2ntUL7fN-b-~On*@CK{T6)k#UFvz1ezMs;4%4}{|Jhs zhjUQO64JR$0+a8T($djhEc!nYL^IZgWJ))0n+~?GoUr40+y8GBKC4RjEVe;HF{2ag zTyWgZ>d8Ecp3dB{6wwcnN9*W^+aE)}Q-@>Xv{_j6%nNww&>}m;kBea=;*@@x6P6uwX_3?!AYwd*(f9u{9WQRY{(O>*uQTd&KNO@*)uODUAHiZ z>i#F;@*8f&{KuZb;-#-*@zPhYV9`?;bHfy7)%?Bu0E3i{<$jjUCLL?E+GS7 zj8Wq!lhcxbIChAQbt77uZR6e4#0K6ul8HDD?B9#NLr!OKNUaI*qXwUjC9kZIfd0ZD zJNU*st8v`0^B_9-*}kz!XqU3h&=xW=P>sk6)gKl@7?EPdi0rhJRGcr#Oppu5dli&G zukMMLSG<|}@%q|&)E=xwT}>UU0EG{=HMM-S##{J1+qZAW86!rsZOSU`0+C&e>!;0- z-mKA)qGpz!<_v%stfmIEG&dp{Z^0?&j^K!$LJd(=f?H?ajh1Hl8zhbN`$Qi|MagFI zD>G^t6Vjs0oxcc*H_WV^ZEE{0f#gM;?^2BDPGQ7~gwU%&?*Vr=gP}E>DxjlzK_m&tNst z1Z6xob;cZK)LBFZ3rq0OZ=aIt*Vx1{Un1Tr?N^ zb}1E(&urq@pBUpf$#=N;mP~=eNvjx(WKL-{-v9VZ{sEE>wj<3A%v+|W(; z&&O%!U5aZbPsejFEyM2Jd!&fBH1P`4IPHQ_sQ@(8qd)fT*@r|tE+xfQHOIR(Hc%Ln zWV+yTQYra9OtQ&leVvTwSeulos+ozso9z@ioO`kw2$1Mwy zsu{hK2;zJjy_PhqlmKaVSTXB?g|G_X*7_fn;66{a7f)F-btx%fN-1);8Z zdhtss)w_4zBa$W*hfs0M38<~BlTy}5swV9Yy{AmTrcImBp}bn&d~rFJzxlo`Jp?F8 zW&!+Xa`%K8lZLs24>RUI%s=+&+O^0DR-(N3v6whzdMX#pKopis0+yMZ?p%g0 z#|*|f6!*A0W8ySP`nK=b0i(-Nd}E|)E8l*Xmz<=iHQtPPycuH4updVpKNx+6 zo{dkw_!C}U`KHX%6b4!99JfiFiCpoEOJBt+Z@kB@e(dC1`Nqzp1RJ^Bd>`((_d#jX zS{kr#-yR%1xF5-6tNh-mu{HrM!L+*`vW>cwGLky-qT$2)b0&dPupI-km`J~!qocad ziFoc0%Tm(oa4$#AI1r`~geoV+H0Q7*QL=JlMz#<@jZC_V%aRmRb+WpnlXV1hjUne< z!WVjF<(rsv$83JT^tF``#U=Q5%eK@H6BnVIQ=M|MUG1RN>^Jlr{?0q^et=1L%4^)e zV3ABa6qlp_>E~n0opaD*;7~T);hqDSfXn371@b13HvC@s7JTygx(pc7qq$MKX~(_a zJmWWaSWo=ruUpwx9TFgt6g`5s-~EWM|CevS zMfEW!vXdbPLXLz~Y4OXiwaI7_dq328^7%g`Y0}iRC4)>ojKE=iu;8($d3A{r?A);ffBb44Zk>HM^2)ohWYFt| zP2Vv9Kz}~pV-%tT#1ZyU2Pr8yZ7VoWcw=6 zv8*e5Jy~%rXPVJt&}mq@;tf8xwK>kxg_tmPRw|yNWYtAiUyo~UxgBdhlT{4@ zqqJu~ELri66zjUW6v&rz*de{xl-c+4XQaYx8yeFy#->z<|FAxIaM6=|f6_SHd8Z6Fzu>VaSr~GH)tt7?A};5vAOkNsp&lVOA6ZEN zsdo9psghDUL*#gH-PD!h(Txl+FmG{sFWZIj)UF$@O7x% zOwyAd>WZ80oP(V^WnzsolIa+Y;ymI+WG<2zGF-L;GMl!$+w6WPyOM0ZMy2L?PNLpU zmN7`w0U?UYxbnGc=WfL9$a%pNPvbWW9>sT?x1iUcp%^w|B%XYJG2UCV25+o>7qcFi zkLvz|G4`hEsH<!kvQ?_ix%{NkGY@ki8s;rjowTQOu{;yk++tt1p47(92XUy82H=$QE|ngwummUDyo|UI z7am(%v1iX-Jow1(@XmYE6j0X$ITS~w+8<8t=;YxSaXd&Wm6=+$+ip12P>kppGSYn+ zAl*tR4nQ0|Q(fF{H}Qn<+8ghrOUg-UbSWLW^@nYE{P~yIM%?$vA}oLXP3+peJGElO zqi7{*Tsh%JS*Q0!(J|Bw8^77i6Os&7P6r$E@Mx? z6u!6|1y(nF@X@EK6(_xRKx#jzsw!`&K2_PcW6nJg9du+9C&|$<=l(}h6O|L80wSe8 zny_cj?vzWXamDz_Ts&kNp@;Cyi!yw0YW#E!r<5d9Ch~9qBKt|wN#hApaUzzKC8fC$ z-6*D5l1n~z5s|UjDRiqyP*=LDTPvM(BL%Evdn)>#Ak(EqO4;;kdlw0mddF2ZBuCwoZm@Bf<5EBRu_QKWK2feRHyh+{%If&b4-wjb1 zNR^Bug{u;jdUmAP%?7`#DE=EP4foyNGD36?@qyOpWVgG?TZlH1qo0I!_cJYhMzo=4s z=A~n7m6ree?z`_fRwI}1qBKRm4+Dk{$MVa1bvpeFaCIFpSS(rms^+ zS`~!bgQ<5tfV&@DNbi#_Uj-!$Ia#I{)&vHKYhs>YwJ;)arv7?3=`O8G{;+KaWKr*j=3K~t6M6H5aK!OLG4_TjcwpfoJp0lTJo)@fm^Jr7oHJ?+f`|8&#+5<| zIwwcRStG}wrltYO1gVc?wFD5kZiit^$)F_FroN&v}Hd#f<4D#0yzW=s)O-Y~3HjIKA_np4&_`R(Q(lAo;olBqr!$CJ*v z7&Gpf&*@iY+Qd{l2PFvfw{vi9Dj;>6jyxZ;YvN4Qme(3@mEnSIFC05T(nNM=)26@T z!%sewyy<84G6J>^lWw1doYE@EddXIDw}%t#(tS|yOZ7QfMU`bAAIxq?|6pjOUAnAU1R+qt}D3MK6|po#G_)@>Mf;}nz=*|P&pd1HPXAep}*ZqcRR5KNtOFSh;yDZCx#v zE?<$#F%7+NG+*n!d5_BA)L$950UD+Fs9tDkBsmI;l3{fernOBrDCmiC*H7U)z5Ahu z<-`k0G34A!Q@Xux-+rume+}+?coD|mayv#{eIqU(KbiB;L?+jK_5~U^y-A%I3Fap0 z1bVaGxZsqY+q&aab3?ntd%8+NK+5|#u>Szw{a_6qT=*C!Ot}*yuf747jlT&u-aZ=( zpZGmU3+imjK#Ngz%n35bL|tjixrCKG@vIAyqJx>>!lD`ZQT0U%R9{4>rlp9yLY-SZ zWH&=>8V6~fa7*V%cWl}EL$ax<8L{32N{E{)WPRV7jy=fc7GISeoGV1Gy^~%XRg*qn3 zOseMPu-tZ~=bx!n=J|GE(Jn5wXUDQ=n0XJ9s}WD4u;Yg9;PS;<$kN_b_ZF{r<&kjt_ zzW8!!xC=~X{xn8iGchS?OeO7cBlkZ^5GZ7O0#)e_JO+rH7%ZU%B5uWquD7=Zw30!) z`S#y1NE4>akTo!G1TU|Y4O1jJ>6>b=Mz-CsRU=(ymQg!Rk_CgMUerQ6eh6aWAR z*-1n}R3gb9O-yDF)Ace5nvB;RfSuoJ4-oep*`dX}g^zJ=h#2&|$DZcTE*W!8l0MV? z6?VBRwjn3f)14LQCRDRR2w!EpE_;&zifN>3iWxh}ZnI5rN;X$d4mfpq^1U^m;esnB zavWn+^};vbZkCc%-_U0AP7^|=G0s#gX-i~rkV-vmM>=$&MkxlW!I3n1Uh1%eTc;}| zQ)<(_Mjy-cZ$Swr-98&{zqT(kCJY^nBY=EEOZ1_K&S#7 zNXq7g7W5BPsiZ1 zMeDjx#xt2>U-0Y-wl60a|fcKY)tYRjEr(8G+pMANG z(<{;&+UnMv0Z>LG7MG+GNv``JKHwxKjojo(VN&NHG$Uq%!#lBQE?)_=(k*-y?5td+ zUBoXBHrBCJpRi&?D}`y*+jXw=9x;1E3kR{eI?lN0a*nMiKa&E<_Bxr9AZc_Wo;>P z7NS|Uz!1@-jONjUPv;W3i%LI{maRY9Al0QjRc5nhCg&lL2mpsiIa?GQ9z%b}+k?}F zOVQsADR9 zo2AsgynH2!tZsIPtpkqTm?_&@>^u)|vlvTTz7$VLa|NqKR`Bm^r2D0z`6`8KR0zdy zsj5j5WnIPzZfCz$O5Nlhc{YZHrJ%j7Gv_|UDGW#DQsIWP`edI{hTP^f?MPo{cF^Hi zvhYWxAt^P@jrF)``pgv5=Y`_!qmd-1kY%5xQ>CE$y-e{$gz$z`B~T^QKs&zkPXT0B z2-S!QMUUD0$Rd<|JVi0AdgoyR?Ah$bBU&v^WAer}F9x1|9(RVMdvzS*=Wv&FcdPSv z+c2Z8HzbMU_{-)_pML&1dQ&3I?cr_VOg~tKxH3VKLQj2gHmWqJX6#f=j|$Zj)f9iF zP<)lN-Cg`!Lm`7rTZ4=$wn?&WI8rGLYn{_ql+k>}n?oqY;Fg(5bSSC9wAph}%iE)* z+NC$MWJretoWr#3u!4+ylU*xw)M@YDJ-BK5EVzvjt2IBxLH0PyJz%y^yyp<4o|-hJ#5B~^;^9S4pq#qOs8^bE%j~I`df4Tv z1U>M8A2y&<%_}xf1Y>U7mAf>OnBc$p#D!lR{;&{sB1ti;d3Uttjhv(y*2Yw)sC*iO zvvR!W!%g7|?MUokpx24R@XX?+TsC$_OH+%TWUu9eK%?D4&e*$qHx@qrG!E-OSoT16 zDkWRPyhb{TXc`!2|Gr^uaO>6(PUDa*b%Jpxh4Eh-1`|kTokS=p=`TvV66>C%7|~rB zo%#ICAk8bcbJ9w?{IMiAdUh~T*=G=@&b*s9qR76%wxj0Ye!Tm^hZuj;bOgKik=qKW zA>D2h%uuJ)<8f@-u}3kjNg@z+yC`Hbqnc{Oct;Zh^uHLI5fxb_)k1VGC7sqppqlkr zHDVscj7?R{=#LI1;63-cMU_f^+LT5Ueo&q9Bl<=vw3& z@*q$OO8BWV^d0&xgTiWLKej?PTC}R($ZE~7Mu}3ZfO0u9GaAu|A^OY} zovLB2Q1!?J&4^a1Mdc(ZLXffz(SE{=T`A1iJYhs%Q_Se6ieYUQhE+#Ttdh?(v+9IlZ4svRsY2hOE(_DT zQZcRmsvaqF(Zg1#;7K7uQMp1}N`*hFh|;Ja*8iUz{||ve+rSm?t@r={002ovPDHLk FV1g`!(Juf1 diff --git a/extension/chrome/icon-96x96.png b/extension/chrome/icon-96x96.png deleted file mode 100644 index 6d16c650e5b8ef80f08e0c7ae95dfb677ab17236..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16225 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 LNkvXXu0mjfVT1KW diff --git a/extension/chrome/main.js b/extension/chrome/main.js deleted file mode 100644 index 8929809..0000000 --- a/extension/chrome/main.js +++ /dev/null @@ -1,116 +0,0 @@ -function determineHost() { - const url = new URL(window.location.href); - return { - host: url.host, - pathname: url.pathname, - }; -} - -function addButtonToAnixart(pathname) { - // find a container and an open in app link with button - const container = document.querySelector('div[style="text-align: center;"]'); - const openInAppLink = document.querySelector('a[href^="anixart"'); - const openInAppLinkButton = openInAppLink.querySelector("button"); - openInAppLinkButton.style = "margin-top: 0px !important;"; // disable default button margin - openInAppLinkButton.classList = "btn btn-secondary"; // change default button from primary to secondary - - // create a custom footer - const footer = document.createElement("div"); - footer.style = - "display: flex; flex-wrap: wrap; gap: 8px; justify-content: center; align-items: center; margin-top: 20px;"; - - // create and set custom link - const link = document.createElement("a"); - const button = document.createElement("button"); - button.style = "margin-top: 0px !important;"; - button.classList = "btn btn-primary"; - button.textContent = "Открыть в Anix"; - - const url = new URL(window.location.href); - link.href = `https://anix.wah.su${pathname}?ref=anixart.tv&source=extension`; - link.appendChild(button); - - // append link and open in app link to footer - footer.appendChild(link); - footer.appendChild(openInAppLink); - - // append footer to container - container.appendChild(footer); -} - -function kinopoiskIsAnimeGenrePresent() { - const genre = document.querySelector('a[href^="/lists/movies/genre--anime"]'); - - if (genre) { - return true; - } - return false; -} - -function addButtonToKinopoisk() { - let isAnime = kinopoiskIsAnimeGenrePresent(); - if (!isAnime) { - console.log("genre not found"); - return; - } - let title = document.querySelector('h1[itemprop="name"]'); - if (!title) { - console.log("title not found"); - return; - } - title = title.textContent.split(" (")[0]; - - const buttonStyle = ` - display: inline-block; - font-weight: 400; - text-align: center; - vertical-align: middle; - cursor: pointer; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - background-color: transparent; - border: 1px solid transparent; - font-size: 1.5rem; - line-height: 1.5; - border-radius: .25rem; - transition: color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out; - padding: 1rem 2rem; - color: #fff; - background-color: #F04E4E; - border-color: #F04E4E; - `; - - const buttonHoverStyle = ` - color: #fff !important; - background-color: #E23D3D !important; - border-color: #E23D3D !important; - ` - - const link = document.createElement("a"); - const button = document.createElement("button"); - - link.style = - "text-decoration: none; position: fixed; bottom: 0; right: 0; margin: 1.5rem; z-index: 1000;"; - link.href = "https://anix.wah.su/search?q=" + title + "&ref=kinopoisk.ru&source=extension"; - link.appendChild(button); - button.style = buttonStyle; - button.onmouseover = function () { - button.style = buttonStyle + buttonHoverStyle - } - button.onmouseout = function () { - button.style = buttonStyle; - } - button.textContent = "Найти в Anix"; - - document.body.appendChild(link); -} - -const { host, pathname } = determineHost(); - -if (host == "anixart.tv") { - addButtonToAnixart(pathname); -} else if (host == "www.kinopoisk.ru") { - addButtonToKinopoisk(); -} diff --git a/extension/chrome/manifest.json b/extension/chrome/manifest.json deleted file mode 100644 index 9c33721..0000000 --- a/extension/chrome/manifest.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "manifest_version": 3, - "version": "1.2", - "name": "Watch on Anix", - "description": "Adds a button to watch on Anix.", - "content_scripts": [ - { - "matches": [ - "https://anixart.tv/release/*", - "https://anixart.tv/collection/*", - "https://anixart.tv/profile/*", - "https://www.kinopoisk.ru/film/*", - "https://www.kinopoisk.ru/series/*" - ], - "js": [ - "main.js" - ] - } - ], - "icons": { - "16": "icon-16x16.png", - "32": "icon-32x32.png", - "48": "icon-48x48.png", - "72": "icon-72x72.png", - "96": "icon-96x96.png" - } -} \ No newline at end of file diff --git a/extension/chrome/watch-on-anix-chrome.zip b/extension/chrome/watch-on-anix-chrome.zip deleted file mode 100644 index 72a3f70d3a5d0a7bdfab5176081f93fee77abdd4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40519 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%0A?hKAf8FV``>J6lX&tE>L{ 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 diff --git a/extension/firefox/icon-16x16.png b/extension/firefox/icon-16x16.png deleted file mode 100644 index 7f26af42845d9a6e701b5d1c0f92336a5fb26a99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 875 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 FV1g`!(Juf1 diff --git a/extension/firefox/icon-96x96.png b/extension/firefox/icon-96x96.png deleted file mode 100644 index 6d16c650e5b8ef80f08e0c7ae95dfb677ab17236..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16225 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 LNkvXXu0mjfVT1KW diff --git a/extension/firefox/main.js b/extension/firefox/main.js deleted file mode 100644 index 8929809..0000000 --- a/extension/firefox/main.js +++ /dev/null @@ -1,116 +0,0 @@ -function determineHost() { - const url = new URL(window.location.href); - return { - host: url.host, - pathname: url.pathname, - }; -} - -function addButtonToAnixart(pathname) { - // find a container and an open in app link with button - const container = document.querySelector('div[style="text-align: center;"]'); - const openInAppLink = document.querySelector('a[href^="anixart"'); - const openInAppLinkButton = openInAppLink.querySelector("button"); - openInAppLinkButton.style = "margin-top: 0px !important;"; // disable default button margin - openInAppLinkButton.classList = "btn btn-secondary"; // change default button from primary to secondary - - // create a custom footer - const footer = document.createElement("div"); - footer.style = - "display: flex; flex-wrap: wrap; gap: 8px; justify-content: center; align-items: center; margin-top: 20px;"; - - // create and set custom link - const link = document.createElement("a"); - const button = document.createElement("button"); - button.style = "margin-top: 0px !important;"; - button.classList = "btn btn-primary"; - button.textContent = "Открыть в Anix"; - - const url = new URL(window.location.href); - link.href = `https://anix.wah.su${pathname}?ref=anixart.tv&source=extension`; - link.appendChild(button); - - // append link and open in app link to footer - footer.appendChild(link); - footer.appendChild(openInAppLink); - - // append footer to container - container.appendChild(footer); -} - -function kinopoiskIsAnimeGenrePresent() { - const genre = document.querySelector('a[href^="/lists/movies/genre--anime"]'); - - if (genre) { - return true; - } - return false; -} - -function addButtonToKinopoisk() { - let isAnime = kinopoiskIsAnimeGenrePresent(); - if (!isAnime) { - console.log("genre not found"); - return; - } - let title = document.querySelector('h1[itemprop="name"]'); - if (!title) { - console.log("title not found"); - return; - } - title = title.textContent.split(" (")[0]; - - const buttonStyle = ` - display: inline-block; - font-weight: 400; - text-align: center; - vertical-align: middle; - cursor: pointer; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - background-color: transparent; - border: 1px solid transparent; - font-size: 1.5rem; - line-height: 1.5; - border-radius: .25rem; - transition: color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out; - padding: 1rem 2rem; - color: #fff; - background-color: #F04E4E; - border-color: #F04E4E; - `; - - const buttonHoverStyle = ` - color: #fff !important; - background-color: #E23D3D !important; - border-color: #E23D3D !important; - ` - - const link = document.createElement("a"); - const button = document.createElement("button"); - - link.style = - "text-decoration: none; position: fixed; bottom: 0; right: 0; margin: 1.5rem; z-index: 1000;"; - link.href = "https://anix.wah.su/search?q=" + title + "&ref=kinopoisk.ru&source=extension"; - link.appendChild(button); - button.style = buttonStyle; - button.onmouseover = function () { - button.style = buttonStyle + buttonHoverStyle - } - button.onmouseout = function () { - button.style = buttonStyle; - } - button.textContent = "Найти в Anix"; - - document.body.appendChild(link); -} - -const { host, pathname } = determineHost(); - -if (host == "anixart.tv") { - addButtonToAnixart(pathname); -} else if (host == "www.kinopoisk.ru") { - addButtonToKinopoisk(); -} diff --git a/extension/firefox/manifest.json b/extension/firefox/manifest.json deleted file mode 100644 index 5a7cbb3..0000000 --- a/extension/firefox/manifest.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "manifest_version": 2, - "version": "1.2", - "name": "Watch on Anix", - "description": "Adds a button to watch on Anix.", - "browser_specific_settings": { - "gecko": { - "id": "{8c53d0c2-43ad-4498-b700-290bd2e1030f}" - } - }, - "content_scripts": [ - { - "matches": [ - "https://anixart.tv/release/*", - "https://anixart.tv/collection/*", - "https://anixart.tv/profile/*", - "https://www.kinopoisk.ru/film/*", - "https://www.kinopoisk.ru/series/*" - ], - "js": [ - "main.js" - ] - } - ], - "icons": { - "16": "icon-16x16.png", - "32": "icon-32x32.png", - "48": "icon-48x48.png", - "72": "icon-72x72.png", - "96": "icon-96x96.png" - } -} \ No newline at end of file diff --git a/extension/firefox/watch-on-anix-firefox.zip b/extension/firefox/watch-on-anix-firefox.zip deleted file mode 100644 index 1f286a2c0a141f1e269b5e01652eded12777ec0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40636 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%0A?hKAf8FV``>J6lX&tE>L{ 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 Date: Fri, 30 May 2025 13:35:46 +0500 Subject: [PATCH 45/58] feat: add Dockerfile --- .dockerignore | 68 +++++++++++++++++++ Dockerfile | 32 +++++++++ app/App.tsx | 8 ++- app/components/ReleasePlayer/PlayerParsing.ts | 16 +++-- app/layout.tsx | 2 + next.config.js | 6 ++ package-lock.json | 15 ++++ package.json | 1 + player-parsers/Dockerfile | 3 + 9 files changed, 144 insertions(+), 7 deletions(-) create mode 100644 .dockerignore create mode 100644 Dockerfile diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..2eff99b --- /dev/null +++ b/.dockerignore @@ -0,0 +1,68 @@ +# Python +__pycache__ +venv +.mypy_cache + +# VSCode +.VSCode +*.code-workspace + +# DetaSpace +.space + +# NextJS +## dependencies +standalone +node_modules +.pnp +.pnp.js +.yarn/install-state.gz + +## testing +coverage + +## next.js +.next +out + +## production +build + +## misc +.DS_Store +*.pem + +## debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +## local env files +.env*.local + +## vercel +.vercel + +## typescript +*.tsbuildinfo +next-env.d.ts + +# traefik +traefik/traefik + +old/ +#Trigger Vercel Prod Build + +# next-video +videos/* +!videos/*.json +!videos/*.js +!videos/*.ts +public/_next-video + +API-Trace/* +.env + +player-parsers +docs +.git \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..87783ac --- /dev/null +++ b/Dockerfile @@ -0,0 +1,32 @@ +FROM node:23-alpine AS base + + +FROM base AS deps +RUN apk add --no-cache libc6-compat +WORKDIR /app +COPY package.json package-lock.json ./ +RUN npm ci + + +FROM base AS builder +WORKDIR /app +COPY --from=deps /app/node_modules ./node_modules +COPY . . +RUN npm run build + + +FROM base AS runner +LABEL org.opencontainers.image.source=https://github.com/radiquum/anix +WORKDIR /app +ENV NODE_ENV=production +RUN addgroup --system --gid 1001 nodejs +RUN adduser --system --uid 1001 nextjs +COPY --from=builder --chown=nextjs:nodejs /app/public ./public +COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./ +COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static +USER nextjs + +EXPOSE 3000 +ENV PORT=3000 +ENV HOSTNAME="0.0.0.0" +CMD ["node", "server.js"] diff --git a/app/App.tsx b/app/App.tsx index 5940207..8cccbd0 100644 --- a/app/App.tsx +++ b/app/App.tsx @@ -4,7 +4,13 @@ import { usePreferencesStore } from "./store/preferences"; import { Navbar } from "./components/Navbar/NavbarUpdate"; import { Inter } from "next/font/google"; import { useEffect, useState } from "react"; -import { Button, Modal, ModalBody, ModalFooter, ModalHeader } from "flowbite-react"; +import { + Button, + Modal, + ModalBody, + ModalFooter, + ModalHeader, +} from "flowbite-react"; import { Spinner } from "./components/Spinner/Spinner"; import { ChangelogModal } from "#/components/ChangelogModal/ChangelogModal"; import { Bounce, ToastContainer } from "react-toastify"; diff --git a/app/components/ReleasePlayer/PlayerParsing.ts b/app/components/ReleasePlayer/PlayerParsing.ts index a9e711e..bd85ff4 100644 --- a/app/components/ReleasePlayer/PlayerParsing.ts +++ b/app/components/ReleasePlayer/PlayerParsing.ts @@ -1,4 +1,5 @@ import { tryCatchPlayer, tryCatchAPI } from "#/api/utils"; +import { env } from 'next-runtime-env'; export async function _fetchAPI( url: string, @@ -75,7 +76,8 @@ export const _fetchKodikManifest = async ( setPlayerError: (state) => void ) => { // Fetch episode links via edge function - if (!process.env.NEXT_PUBLIC_KODIK_PARSER_URL) { + const NEXT_PUBLIC_KODIK_PARSER_URL = env("NEXT_PUBLIC_KODIK_PARSER_URL") + if (!NEXT_PUBLIC_KODIK_PARSER_URL) { setPlayerError({ message: "Источник не настроен", detail: "переменная 'NEXT_PUBLIC_KODIK_PARSER_URL' не обнаружена", @@ -84,7 +86,7 @@ export const _fetchKodikManifest = async ( } const data = await _fetchPlayer( - `${process.env.NEXT_PUBLIC_KODIK_PARSER_URL}/?url=${url}&player=kodik`, + `${NEXT_PUBLIC_KODIK_PARSER_URL}/?url=${url}&player=kodik`, setPlayerError ); if (data) { @@ -213,9 +215,10 @@ export const _fetchAnilibriaManifest = async ( const epid = url.split("?id=")[1].split("&ep=")[1]; const _url = `https://api.anilibria.tv/v3/title?id=${id}`; let data = null; - if (process.env.NEXT_PUBLIC_ANILIBRIA_PARSER_URL) { + const NEXT_PUBLIC_ANILIBRIA_PARSER_URL = env("NEXT_PUBLIC_ANILIBRIA_PARSER_URL") + if (NEXT_PUBLIC_ANILIBRIA_PARSER_URL) { data = await _fetchPlayer( - `${process.env.NEXT_PUBLIC_ANILIBRIA_PARSER_URL}/?url=${_url}&player=libria`, + `${NEXT_PUBLIC_ANILIBRIA_PARSER_URL}/?url=${_url}&player=libria`, setPlayerError ); } else { @@ -243,7 +246,8 @@ export const _fetchSibnetManifest = async ( setPlayerError: (state) => void ) => { // Fetch data via cloud endpoint - if (!process.env.NEXT_PUBLIC_SIBNET_PARSER_URL) { + const NEXT_PUBLIC_SIBNET_PARSER_URL = env("NEXT_PUBLIC_SIBNET_PARSER_URL") + if (!NEXT_PUBLIC_SIBNET_PARSER_URL) { setPlayerError({ message: "Источник не настроен", detail: "переменная 'NEXT_PUBLIC_SIBNET_PARSER_URL' не обнаружена", @@ -251,7 +255,7 @@ export const _fetchSibnetManifest = async ( return { manifest: null, poster: null }; } const data = await _fetchPlayer( - `${process.env.NEXT_PUBLIC_SIBNET_PARSER_URL}/?url=${url}&player=sibnet`, + `${NEXT_PUBLIC_SIBNET_PARSER_URL}/?url=${url}&player=sibnet`, setPlayerError ); if (data) { diff --git a/app/layout.tsx b/app/layout.tsx index 7fe42a7..0c0415f 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -1,6 +1,7 @@ import "./globals.css"; import { App } from "./App"; import { ThemeModeScript } from "flowbite-react"; +import { PublicEnvScript } from 'next-runtime-env'; export const metadata = { metadataBase: new URL("https://anix.wah.su"), @@ -33,6 +34,7 @@ export default function RootLayout({ children }) { return ( + {children} diff --git a/next.config.js b/next.config.js index bd4aa44..24aa345 100644 --- a/next.config.js +++ b/next.config.js @@ -1,10 +1,16 @@ const withFlowbiteReact = require("flowbite-react/plugin/nextjs"); /** @type {import('next').NextConfig} */ const NextConfig = { + output: "standalone", reactStrictMode: false, images: { unoptimized: true, }, + env: { + NEXT_PUBLIC_KODIK_PARSER_URL: process.env.NEXT_PUBLIC_KODIK_PARSER_URL, + NEXT_PUBLIC_ANILIBRIA_PARSER_URL: process.env.NEXT_PUBLIC_ANILIBRIA_PARSER_URL, + NEXT_PUBLIC_SIBNET_PARSER_URL: process.env.NEXT_PUBLIC_SIBNET_PARSER_URL, + }, async headers() { return [ { diff --git a/package-lock.json b/package-lock.json index 1e17799..6309d00 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,6 +17,7 @@ "markdown-to-jsx": "^7.4.7", "media-chrome": "^4.9.0", "next": "^14.2.26", + "next-runtime-env": "^3.3.0", "prettier": "^3.5.3", "react": "^18", "react-cropper": "^2.3.3", @@ -4955,6 +4956,20 @@ } } }, + "node_modules/next-runtime-env": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/next-runtime-env/-/next-runtime-env-3.3.0.tgz", + "integrity": "sha512-JgKVnog9mNbjbjH9csVpMnz2tB2cT5sLF+7O47i6Ze/s/GoiKdV7dHhJHk1gwXpo6h5qPj5PTzryldtSjvrHuQ==", + "license": "MIT", + "dependencies": { + "next": "^14", + "react": "^18" + }, + "peerDependencies": { + "next": "^14", + "react": "^18" + } + }, "node_modules/next/node_modules/postcss": { "version": "8.4.31", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", diff --git a/package.json b/package.json index 786c656..ec1be21 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "markdown-to-jsx": "^7.4.7", "media-chrome": "^4.9.0", "next": "^14.2.26", + "next-runtime-env": "^3.3.0", "prettier": "^3.5.3", "react": "^18", "react-cropper": "^2.3.3", diff --git a/player-parsers/Dockerfile b/player-parsers/Dockerfile index 871f0b2..0963569 100644 --- a/player-parsers/Dockerfile +++ b/player-parsers/Dockerfile @@ -9,4 +9,7 @@ RUN npm ci COPY *.ts ./ +EXPOSE 7000 +ENV PORT=7000 +ENV HOSTNAME="0.0.0.0" CMD ["npm", "run", "serve"] \ No newline at end of file From 9f7a7b8fd243c30a6e0b0c1a80d88fac3c625303 Mon Sep 17 00:00:00 2001 From: Radiquum Date: Fri, 30 May 2025 13:45:12 +0500 Subject: [PATCH 46/58] chore/player-parsers: update docker tag --- player-parsers/README.RU.md | 2 +- player-parsers/README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/player-parsers/README.RU.md b/player-parsers/README.RU.md index 0ee08cf..9928930 100644 --- a/player-parsers/README.RU.md +++ b/player-parsers/README.RU.md @@ -44,7 +44,7 @@ 1. выполните комманду: -`docker run -d --name anix-player -p 7000:7000 ghcr.io/radiquum/anix-player-parser:29-05-2025` +`docker run -d --name anix-player -p 7000:7000 radiquum/anix-player-parser:latest` ### Ручной билд diff --git a/player-parsers/README.md b/player-parsers/README.md index e78d539..b575497 100644 --- a/player-parsers/README.md +++ b/player-parsers/README.md @@ -44,7 +44,7 @@ Requirements: 1. Run the command: -`docker run -d --name anix-player -p 7000:7000 ghcr.io/radiquum/anix-player-parser:29-05-2025` +`docker run -d --name anix-player -p 7000:7000 radiquum/anix-player-parser:latest` ### Manual build From a73c01e5bc84447e288bab7a23c68d9823b87fb9 Mon Sep 17 00:00:00 2001 From: Radiquum Date: Fri, 30 May 2025 14:42:33 +0500 Subject: [PATCH 47/58] chore/player-parsers: update readme --- player-parsers/README.RU.md | 2 +- player-parsers/README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/player-parsers/README.RU.md b/player-parsers/README.RU.md index 9928930..d695c06 100644 --- a/player-parsers/README.RU.md +++ b/player-parsers/README.RU.md @@ -29,7 +29,7 @@ ## Развёртывание -> В связи с спецификой источников, рекомендуется использовать виртуальный сервер в россии или нидерландах, т.к. они могут быть недоступны из других стран. +> В связи с спецификой источников, рекомендуется использовать виртуальный сервер в россии, т.к. они могут быть недоступны из других стран. > > Из-за данной специфики, парсеры невозможно развернуть на edge сервисах, таких как CloudFlare Workers или Deno, а только на отдельном сервере. diff --git a/player-parsers/README.md b/player-parsers/README.md index b575497..7f3f9ec 100644 --- a/player-parsers/README.md +++ b/player-parsers/README.md @@ -29,7 +29,7 @@ Response: ## Deployment -> Due to the nature of the sources, it is recommended to use a virtual server in Russia or the Netherlands, as they may be inaccessible from other countries. +> Due to the nature of the sources, it is recommended to use a virtual server in Russia, as they may be inaccessible from other countries. > > Because of this specificity, the parsers cannot be deployed on edge services like CloudFlare Workers or Deno, only on a dedicated server. From 79fb473998b8c6db64071237f9f50a00b02f4405 Mon Sep 17 00:00:00 2001 From: Radiquum Date: Fri, 30 May 2025 14:46:40 +0500 Subject: [PATCH 48/58] chore/player-parsers: update readme --- player-parsers/README.RU.md | 3 +++ player-parsers/README.md | 3 +++ 2 files changed, 6 insertions(+) diff --git a/player-parsers/README.RU.md b/player-parsers/README.RU.md index d695c06..99174b5 100644 --- a/player-parsers/README.RU.md +++ b/player-parsers/README.RU.md @@ -22,6 +22,9 @@ - VIDEO_URL - ссылка на видео от источника - PLAYER_SOURCE - источник, один из: kodik, sibnet, libria +>[!NOTE] +> Если используется источник libria, ссылка должна быть ссылкой на API anilibria, а не на плеер + Ответ: - 500|400: произошла ошибка, подробнее в строке `message` в теле ответа diff --git a/player-parsers/README.md b/player-parsers/README.md index 7f3f9ec..4e23446 100644 --- a/player-parsers/README.md +++ b/player-parsers/README.md @@ -22,6 +22,9 @@ where: - VIDEO_URL - the link to the video from the source - PLAYER_SOURCE - the source, one of: kodik, sibnet, libria +>[!NOTE] +> When using libria source, url should be the url to the anilibria api, not player directly + Response: - 500|400: an error occurred, see the `message` field in the response body for details From 97a70690bb81d87a08ebaac6e31db4c1854fc257 Mon Sep 17 00:00:00 2001 From: Radiquum Date: Fri, 30 May 2025 15:59:58 +0500 Subject: [PATCH 49/58] feat: add deploy instructions --- DEPLOYMENT.RU.md | 180 +++++++++++++++++++++++++++ DEPLOYMENT.md | 180 +++++++++++++++++++++++++++ docs/deploy/fork.png | Bin 0 -> 1499 bytes docs/deploy/netlify_env_1.png | Bin 0 -> 11417 bytes docs/deploy/netlify_env_2.png | Bin 0 -> 19382 bytes docs/deploy/netlify_import.png | Bin 0 -> 5963 bytes docs/deploy/netlify_new_project.png | Bin 0 -> 7184 bytes docs/deploy/netlify_project_name.png | Bin 0 -> 7154 bytes docs/deploy/netlify_provider.png | Bin 0 -> 19307 bytes docs/deploy/netlify_url.png | Bin 0 -> 40039 bytes docs/deploy/vercel_import.png | Bin 0 -> 13447 bytes docs/deploy/vercel_new_project.png | Bin 0 -> 9394 bytes docs/deploy/vercel_project.png | Bin 0 -> 49938 bytes docs/deploy/vercel_url.png | Bin 0 -> 72206 bytes player-parsers/README.RU.md | 20 ++- player-parsers/README.md | 20 ++- 16 files changed, 376 insertions(+), 24 deletions(-) create mode 100644 DEPLOYMENT.RU.md create mode 100644 DEPLOYMENT.md create mode 100644 docs/deploy/fork.png create mode 100644 docs/deploy/netlify_env_1.png create mode 100644 docs/deploy/netlify_env_2.png create mode 100644 docs/deploy/netlify_import.png create mode 100644 docs/deploy/netlify_new_project.png create mode 100644 docs/deploy/netlify_project_name.png create mode 100644 docs/deploy/netlify_provider.png create mode 100644 docs/deploy/netlify_url.png create mode 100644 docs/deploy/vercel_import.png create mode 100644 docs/deploy/vercel_new_project.png create mode 100644 docs/deploy/vercel_project.png create mode 100644 docs/deploy/vercel_url.png diff --git a/DEPLOYMENT.RU.md b/DEPLOYMENT.RU.md new file mode 100644 index 0000000..076a2f5 --- /dev/null +++ b/DEPLOYMENT.RU.md @@ -0,0 +1,180 @@ +# Развёртывание приложения AniX + +## Vercel + +Требования: + +- аккаунт GitHub +- аккаунт Vercel + +1. сделайте форк репозитория + + ![fork button](./docs/deploy/fork.png) + +2. Войдите в аккаунт vercel + + > [!IMPORTANT] + >Аккаунт Vercel должен быть связан с аккаунтом Github. + > + >Если у вас нет аккаунта vercel, то создайте его через вход с помощью Github. + +3. Нажмите кнопку создать новый проект + + ![vercel new project button](./docs/deploy/vercel_new_project.png) + +4. Нажмите кнопку импортировать напротив названия репозитория + + ![vercel import button](./docs/deploy/vercel_import.png) + +5. (опционально) добавьте переменные для использования своего плеере: + + - NEXT_PUBLIC_KODIK_PARSER_URL + - NEXT_PUBLIC_ANILIBRIA_PARSER_URL + - NEXT_PUBLIC_SIBNET_PARSER_URL + + на те которые вы получили, если развёртывали [anix-player-parsers](./player-parsers/README.RU.md) + + ![vercel project settings](./docs/deploy/vercel_project.png) + +6. нажмите кнопку "Deploy" и ожидайте пока не появиться подтверждение +7. нажмите кнопку "Continue to Dashboard" +8. клиент будет доступен по ссылке такого вида, нажмите на неё что-бы его открыть + ![vercel project url](./docs/deploy/vercel_url.png) + +## Netlify + +Требования: + +- аккаунт GitHub +- аккаунт Netlify + +1. сделайте форк репозитория + + ![fork button](./docs/deploy/fork.png) + +2. Войдите в аккаунт netlify + + > [!IMPORTANT] + >Аккаунт Netlify должен быть связан с аккаунтом Github. + > + >Если у вас нет аккаунта Netlify, то создайте его через вход с помощью Github. + +3. Нажмите кнопку создать новый проект + + ![netlify new project button](./docs/deploy/netlify_new_project.png) + +4. Нажмите кнопку GitHub + + ![netlify provider choice](./docs/deploy/netlify_provider.png) + +5. Нажмите на название репозитория + + ![netlify import button](./docs/deploy/netlify_import.png) + +6. (опционально) заполните название проекта + + ![netlify project name](./docs/deploy/netlify_project_name.png) + +7. (опционально) добавьте переменные для использования своего плеере: + + - NEXT_PUBLIC_KODIK_PARSER_URL + - NEXT_PUBLIC_ANILIBRIA_PARSER_URL + - NEXT_PUBLIC_SIBNET_PARSER_URL + + на те которые вы получили, если развёртывали [anix-player-parsers](./player-parsers/README.RU.md) + + 1. ![alt text](./docs/deploy/netlify_env_1.png) + + 2. ![alt text](./docs/deploy/netlify_env_2.png) + +8. нажмите кнопку "Deploy" и ожидайте пока не появиться подтверждение + +9. клиент будет доступен по ссылке такого вида, нажмите на неё что-бы его открыть + + ![netlify project url](./docs/deploy/netlify_url.png) + +## Docker + +Требования: + +- [docker](https://docs.docker.com/engine/install/) + +### Пре-билд + +1. выполните комманду: + +`docker run -d --name anix -p 3000:3000 radiquum/anix:latest` + +### Ручной билд + +Доп. Требования: + +- [git](https://git-scm.com/) + +1. Клонируйте репозиторий `git clone https://github.com/Radiquum/AniX` +2. Переместитесь в директорию репозитория `cd AniX` +3. Выполните команду `docker build -t anix .` +4. После окончания, выполните команду: `docker run -d --restart always --name anix -p 3000:3000 anix` + +### docker/Обозначения + +- -d - запустить контейнер в фоне +- --restart always - всегда запускать после перезагрузки сервера +- --name - название контейнера +- -p - порт контейнера который будет доступен из вне. ПОРТ:3000 + +>[!NOTE] +> для переменных которые вы получили, если развёртывали [anix-player-parsers](./player-parsers/README.RU.md), необходимо использовать `-e ПЕРЕМЕННАЯ=ЗНАЧЕНИЕ` до слова anix + +[команда docker run](https://docs.docker.com/reference/cli/docker/container/run/) + +### docker/После развёртывания + +Сервис будет доступен по адресу: `http://<ВАШ IP><:ВАШ ПОРТ>/` + +### docker/Примечание + +Для использования своего домена и поддержки протокола https, вы можете использовать traefik или другой reverse-proxy, с сертификатом SSL. + +Полезные ссылки: + +- [Конвертер из команды docker run в синтакс для docker compose](https://it-tools.tech/docker-run-to-docker-compose-converter) +- [Как настроить traefik + свой домен + SSL](https://letmegooglethat.com/?q=how+to+setup+traefik+with+custom+domain+and+ssl+certificate+from+lets+encrypt%3F) + +## pm2 + +Требования: + +- [git](https://git-scm.com/) +- [nodejs 23+ с npm](http://nodejs.org/) +- [pm2](https://pm2.keymetrics.io/) + +Инструкция: + +1. Клонируйте репозиторий `git clone https://github.com/Radiquum/AniX` +2. Переместитесь в директорию репозитория `cd AniX` +3. Выполните команду `npm install` +4. (опционально) скопируйте .env.sample как .env и заполните его переменными которые вы получили, если развёртывали [anix-player-parsers](./player-parsers/README.RU.md) +5. Выполните команду `npm run build` +6. создайте новую директорию +7. переместите в созданную директорию + - директорию `public` в `./новая/public` + - директорию `.next/static` в `./новая/.next/static` + - файлы из `.next/standalone` в `./новая` +8. Переместитесь в созданную директорию и выполните команду `pm2 start server.js -n anix` + +### pm2/Обозначения + +- -n - название сервиса в pm2 + +### pm2/После развёртывания + +Сервис будет доступен по адресу: `http://<ВАШ IP>:3000/` + +### pm2/Примечание + +Для автоматического запуска приложения, рекомендуется настроить pm2 на автозапуск, с помощью команды: `pm2 startup` + +Полезные ссылки: + +- [PM2: подходим к вопросу процесс-менеджмента с умом @ Habr](https://habr.com/ru/articles/480670/) diff --git a/DEPLOYMENT.md b/DEPLOYMENT.md new file mode 100644 index 0000000..4b2cbac --- /dev/null +++ b/DEPLOYMENT.md @@ -0,0 +1,180 @@ +# AniX Application Deployment + +## Vercel + +Requirements: + +- GitHub account +- Vercel account + +1. Fork the repository + + ![fork button](./docs/deploy/fork.png) + +2. Log in to your Vercel account + + > [!IMPORTANT] + >Your Vercel account must be linked with your GitHub account. + > + >If you don't have a Vercel account, create one by signing in with GitHub. + +3. Click the button to create a new project + + ![vercel new project button](./docs/deploy/vercel_new_project.png) + +4. Click the import button next to the repository name + + ![vercel import button](./docs/deploy/vercel_import.png) + +5. (optional) Add variables to use your own player: + + - NEXT_PUBLIC_KODIK_PARSER_URL + - NEXT_PUBLIC_ANILIBRIA_PARSER_URL + - NEXT_PUBLIC_SIBNET_PARSER_URL + + Use the ones you received if you deployed [anix-player-parsers](./player-parsers/README.md) + + ![vercel project settings](./docs/deploy/vercel_project.png) + +6. Click the "Deploy" button and wait until you see a confirmation +7. Click the "Continue to Dashboard" button +8. The client will be available at a link of this form, click it to open + ![vercel project url](./docs/deploy/vercel_url.png) + +## Netlify + +Requirements: + +- GitHub account +- Netlify account + +1. Fork the repository + + ![fork button](./docs/deploy/fork.png) + +2. Log in to your Netlify account + + > [!IMPORTANT] + >Your Netlify account must be linked with your GitHub account. + > + >If you don't have a Netlify account, create one by signing in with GitHub. + +3. Click the button to create a new project + + ![netlify new project button](./docs/deploy/netlify_new_project.png) + +4. Click the GitHub button + + ![netlify provider choice](./docs/deploy/netlify_provider.png) + +5. Click the repository name + + ![netlify import button](./docs/deploy/netlify_import.png) + +6. (optional) Fill in the project name + + ![netlify project name](./docs/deploy/netlify_project_name.png) + +7. (optional) Add variables to use your own player: + + - NEXT_PUBLIC_KODIK_PARSER_URL + - NEXT_PUBLIC_ANILIBRIA_PARSER_URL + - NEXT_PUBLIC_SIBNET_PARSER_URL + + Use the ones you received if you deployed [anix-player-parsers](./player-parsers/README.md) + + 1. ![alt text](./docs/deploy/netlify_env_1.png) + + 2. ![alt text](./docs/deploy/netlify_env_2.png) + +8. Click the "Deploy" button and wait until you see a confirmation + +9. The client will be available at a link of this form, click it to open + + ![netlify project url](./docs/deploy/netlify_url.png) + +## Docker + +Requirements: + +- [docker](https://docs.docker.com/engine/install/) + +### Pre-built + +1. Run the command: + +`docker run -d --name anix -p 3000:3000 radiquum/anix:latest` + +### Manual build + +Additional Requirements: + +- [git](https://git-scm.com/) + +1. Clone the repository `git clone https://github.com/Radiquum/AniX` +2. Navigate to the repository directory `cd AniX` +3. Run the command `docker build -t anix .` +4. Once finished, run the command: `docker run -d --restart always --name anix -p 3000:3000 anix` + +### docker/Flags + +- -d - run container in background +- --restart always - always restart after server reboot +- --name - container name +- -p - container port to be exposed externally. PORT:3000 + +>[!NOTE] +> For variables you received if you deployed [anix-player-parsers](./player-parsers/README.md), you need to use `-e VARIABLE=VALUE` before the word anix + +[docker run command](https://docs.docker.com/reference/cli/docker/container/run/) + +### docker/After deployment + +The service will be available at: `http://<:YOUR PORT>/` + +### docker/Note + +To use your own domain and support HTTPS protocol, you can use traefik or another reverse proxy with SSL certificate. + +Useful links: + +- [Converter from docker run command to docker compose syntax](https://it-tools.tech/docker-run-to-docker-compose-converter) +- [How to setup traefik + custom domain + SSL](https://letmegooglethat.com/?q=how+to+setup+traefik+with+custom+domain+and+ssl+certificate+from+lets+encrypt%3F) + +## pm2 + +Requirements: + +- [git](https://git-scm.com/) +- [nodejs 23+ with npm](http://nodejs.org/) +- [pm2](https://pm2.keymetrics.io/) + +Instructions: + +1. Clone the repository `git clone https://github.com/Radiquum/AniX` +2. Navigate to the repository directory `cd AniX` +3. Run the command `npm install` +4. (optional) copy `.env.sample` as `.env` and fill it with variables you received if you deployed [anix-player-parsers](./player-parsers/README.md) +5. Run the command `npm run build` +6. Create a new directory +7. Move into the new directory: + - move `public` directory to `./new/public` + - move `.next/static` directory to `./new/.next/static` + - move files from `.next/standalone` to `./new` +8. Move into the created directory and run the command `pm2 start server.js -n anix` + +### pm2/Flags + +- -n - service name in pm2 + +### pm2/After deployment + +The service will be available at: `http://:3000/` + +### pm2/Note + +To enable automatic application startup, it is recommended to configure pm2 to start on boot using the command: `pm2 startup` + +Useful links: + +- [PM2: managing processes smartly @ Habr](https://habr.com/ru/articles/480670/) diff --git a/docs/deploy/fork.png b/docs/deploy/fork.png new file mode 100644 index 0000000000000000000000000000000000000000..c1d2c68aa8a97b14310cbef1ef00c93d45743abb GIT binary patch literal 1499 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 a=g21BqfU=-SR$t!0P4y*O2rB=)c*m&^R_Jj literal 0 HcmV?d00001 diff --git a/docs/deploy/netlify_env_2.png b/docs/deploy/netlify_env_2.png new file mode 100644 index 0000000000000000000000000000000000000000..30e4cc6378fb40c76314824fa07fa665f7ca841a GIT binary patch literal 19382 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 RW)HNF!PC{xWt~$(69A<}gBJh* literal 0 HcmV?d00001 diff --git a/docs/deploy/netlify_import.png b/docs/deploy/netlify_import.png new file mode 100644 index 0000000000000000000000000000000000000000..e3b65e5bce3c1fbd29a6a6e7d87b2c11ae15564e GIT binary patch literal 5963 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 literal 0 HcmV?d00001 diff --git a/docs/deploy/netlify_project_name.png b/docs/deploy/netlify_project_name.png new file mode 100644 index 0000000000000000000000000000000000000000..516169fd3df9923a54dc40025e98f30de09e5831 GIT binary patch literal 7154 zcmd6MS2WyT)V3PkNVF(X5~52&qKqEBcOq&KgQzj120?V9cN4vL!stYlkmzPG7%h75 z-Mk~;&Aa}0-`#sNYu5SgbN1Q$dCor1+9zB~Ly?S_o)`-Yi%eNbP6rDMdl2(Kh!6+! zYk@PlgoVY>q%0?+=ZU=o9sXd_m)uvksqXw2JBW4R1)eBCAoA=`+U6mE?l%j{0w+A2 zG$3SzCEkK>Dda~04W-q6YtI^Xt1!Fw)@+t+*7Tzkvrlcu{R7<1Jo)l?)o7kJJPD+s z+w8m0hHaJl7dw~1F9TmxlgHJY@5mHd2)EGZvvVD5nlH#uCeiz3$NPsU|)M3o{I+0h0VL zQ=b1{(_>>$-))gWg>XC1H*D{_{fIopLyk`$)v2B+B%vM4hm#~l-EuRa3vcY&-p;pP zaDf{by!-Mw?>{9Zr3=siH(a{xYP{ba3c6xYaGP}UP2W4KYe%8iS1-qU+xq=tNYwG} zV%#MH=hl(v`o)PJEdKG%d+Yy3eD0>xw8C(?0IpDP7BJ*4Up3s{<${Uuo3tS?gE`H_ zR&T3*>>|#@&%P2>T!~7%ZD=rX)`QYyox{R)dK`VqP6m?*Jc#|JHuB$FHXv#8I_Jo9(Qk#e|S>lIwYdFIIf z#iS|6hu>!+oW)Fc;B3ogi$NuH%U_nBoD9!DfmR43XbLyFPv`pa^I|^y_9%=TAD^#e zc!w-jdrJlfW}rKnt}0O({2H_>NlD&$m&<=rMJYv&Mx`pcDkWRZ()km2XRH21L7C9S zB1fk1C^6kkekv*P3=xTHU`shR#U#;q`%N3zk_875(mK=il$-cufcGViP=;0|;zP|gXLTUrdEwG} zpA_5Q7v{puhFdY9TOYPH?{n8=kG$_%+dfVf5QARG)jYu@lyOb-oD9M*_3BvgS2RXDlYNI-ZMbqyU#If+*yCX3Lkx?8}eD}2<5m_WUTK3=Fy_BW@oa`14ilLhDI~8u0Ze(n5K8lRb_D^(mA>XK0Tf_ZG3x@HU?f?_Rnm) zWNGN2fvzksXRensT*_!Sd7rkO4Y$s1v*FR+ooXB$=sK@I>N7dsw&eo{hQXwmy$U$P zhqJ)#1K561QGE2KC@+o#ibzGGASaG9&oV2VyA&9m= zLC9SJGyFZ4dVjvUtu`F>#o;|@H;KG)z|duB=|mLG^<4py=Z^MoGYm@5@WjDkdH(sX zKz+%5w9uyos-gT>UKTkpK+$i5PuUNUJB-c%WxSPEWCT6((_=Nc;dTi+Lwq0K23e<=aTG=@hGc_ z1tfv~o9jRX&aTU&O4|0VOV<72Q&!?`{kWTf$7B1kiQk z@GuXFI2{7`UrTntW`3GFV$f-G87;X&oN8=rIfsOB;b7k-fHPoha^AslPh@TjZiF#{ zWK45Z&GSl?%KLW7-(3L@1#mEacCm5{jgd4!W4}|dpR>mYAJEd+3af0m%bime6^o^@ z_pky!DIa8lF2-t0vg_o!M>Vrw;V2*y6YWpMg^7*PwP$8SdpjtUFB|}cgi>`}U(W33 z$jM>8v&1Saq?r4=Z4y9xKurIZq{LB_2BEKyhQI6MOkxm`w%8|<1_>Iq-;+Anr@)iW zcE-!D8!@`u;jd&Yu#j=PukrI26qww1VlK+ppt~t7#yBI>4j1IxI3#_TMK2Zp7j)8~ zx|JCiJ|!*&FH&CYbzU&dUCwLSv7m#=d!78%E~NjroM6&H;2s@lb(gLY@__cu?VUNp zBcB!wWyB%g-yf}6;NB5S5!zWYo`)ICoS$iHyW&n^7CrBPo$lpg$asy~#ZaQV;I|_5 z(KW#x`tF2kCe5w&ZGs)JJ7oQX9gbjp;M0MnC5&ytq;oPe9C-i`y7TEWL4;w2gx8IY zpYz$kl4XWUbBEDCQn~s$PdeJEV(^vpvBKVLqp*nzGn)`zR6xEi$hf7>_4?BvNmieQFPnBff#9)1`rCMO%Wi#P^$-?dENoLS{c?v&XzS;A(DpDMC2nP1A3;{DORRhD{FlTuip2i#L z(6V-~8QbiitRe)MGkyK^$!^b2{?Y}ZD zrvGE~a||(0S+StOLzsg7S-JraiTHo|>eV$&k7;|qBpzrjtvzL zmj1r}dAR*dIRQ~VE^PMJ@eegQlOaRWYT5VkFyz5=%O_l_f5`QdEfY>3j`RCUiVXkp zdB`(aT2^Oe7vSMLM^UDx07=drpyp<65h~4^VY-d{ani8z#lh~mbeZaN z%E!d;q%uCY$rI`3cSufTFHfR1TbPG^CBJInRClD*n4_VK0PSGA7d&E0Nn>1NVD$6H z&qL%YmT!{{RfF0GzaVfo(qi|L67#uOK-C4<#!t;`0pq|?q4uV`b-K5gZB==MT%qa= z{ELe(E^DZ3q(QGX5%1|VWu&G~l|Uq)N?ESFeDW7!=q)|ED_sWByCQ+ke0(iNK67(e z5$gJLfA58nPy@#acj;~g9!>9c8IK~8>bzWNu=1s}MwfGBB z6R8xlVP$pfzD_Jbg_KIjsB^*0TKRXawQi|8vZ3Pq(i#bW-1-v2OA=kdKnk0lH^pW> zFF?#oI&=>DtWSs?F!H8MvltKB66~N+`7y{c&SEe#u_E?pM1A3g=ZoccK?ABBF{tC| zbbb_Ltg+RW*|dSP7VK|B3g9R&Mz3cmg4qH0$o@q&qsr-S##;6`ui=BhbQ(Y?zwLuZ z+JpopR4FDjoPV1FiCBSgxMb`|lQOusCV64t-+ND(-emja){y~~t5ZJ-sP$+eyDkmh zvo_mJdBxRwz5g-hi)@lPS&Qh@eArz4bT~{ISHJg-7lLVBPGa%#{-zbZj*KRMEL)n& z$12lTjgwB6p3d;F-jG6=mpUg~O0PeCPvf9)hCnO=hmsuf&_#>Y7{qB^W$8pHRnX(V zsq(pTveMz_v=)>HPEJnNkXRq|gNQ>-BunE*P<8c!GuR z^tlEbe}{-X%6UXcG8{*yuZ&wX1yDzmR*7WC{j#jT@(x?4mA*d0bmx%GqrKWU3)%l= zXh1LN@{cHkYk%WnOYI6bJ5(rlz1+TR&sj}2-FywCdP-qltl(mFrpJOE@bU_~5k(1o zuddh35=NF@^D&wvjF{c1@sF@YQR-nngvdtFN$DOU%Uae@y15*p96a>hmf<0fqy8d? zH>cj41LF{807qsGmr(fnaZK|F+)Tla@`x?U-BF2%Ev&ieYmfmp|FnL6d2BW%vVsAh zRO}_|etMCLcB>`%byuMoS5SRszS9#6LxfXn(Tz5!Uf84y#*N;D~O9|vN6VT?P8_@7(QLx{tJpg#xe-7V} z>##RvB^@vN_S5x@0=S`JHr=`UGQM#{`m)GkP&$W9-&BtZj|+e0&vA0#*ycd_g+HAJ zJG*uQvdtPWf%de6%h(Fo%%2C7sf19H_Yd{-x{64({2dUnjhB3!(Nm^mIoTt7pB;Li zfm&%yw%^eE=x24m3dpV>$$_-?PId0ocmc_7YMhR$QhIv0Da74Luj%-a<{11O-&b7X@>`0zn}wfj2O8I54^6*wE@gY|A=WO%F~r8Sa&FsRx|8pXTz3?N{mxD zJx|xnr96A0+JAe6kTYKGe6}rJj`Kr>0$F_Q>ifWjnwDUNM056oJ#{aqd;yJ}lx;JZ zyXtzZax9TC&c6UUAttjJyU(ZnVBlx9@@AMrucYlT?zRB97M30UN;jZbC7Fp+1{cgO z2z`Z51;-&rC6=gZLv$!>>ug$SzowT&61$F6LywHK`8C*RBc!U=y!dl^AP7V(YLc^0 z9J`L$I=Ggk9eAB9%cE~CbJHWMVJo+9l>%e{Shs$c&WfA}n=-y~eDV;CPW% z;cLn<16Dv*VFmd#ZIf#%sx8cB#M|~$wxDYZo9;A6dVVyg4U+71HV}FCNytyUz?K1E z#Q3F@^uG1}K56Z^5v*t-L(FKA>!Y#6uBo0|HOoEq?I`xSphzq`L1PN*pG)sSjm}E6 zZR|G>MSf-#q{x-#&~hL9!A>%xbis%n|NeqR_P%-VnTSbB0j94R40zl&c^nm}&l$B_ z2B77Dur+bbuE(eM2K!vP8r}!v$qrKot|#K=)4l~kHrZXhy9ca`aasoo^}?Xd3R;{+ z&0oM;Awhf$VrX2c6$y5lKo-uT_u&!h{Ccb)ZY60T z@`vwXpB$g*E8+034^yXuqu1H(KHzIXoYr6cF3xq75XbQ^pJ*BqDoD%cPRlo##I3h~ z&$wYiqDwnCiiZ~xB<=pzt@9gT>XS(Aa;``-Fk^~P?u%#Y;g>hkEE=5-yMN7|JB{z4 z)-7IpjYR7?TZzu1zUB^HGEg){ZZt%Z(@H211O(l$E~4a8)FIe1%3=V!8ty)doIPZo zEb$HlMn2-aYY8xtV3ep;-0HV&rx7B|weRs?@j6%GXN%Dc&(;3>;pg|KPiQbYXZOEi zqQ&@Tgcu`>Qwd4)hioo5_$%T;w}gS{^S2Bhr=a#t&1wio=)Sj$c+PNfMu)%{fFOG- z6pJG$M<2Wi$PMf`E-H}leu0~E568j#QK{lPinN@d=dnPs*uT#63(=sl*uJf7H57%~u2u^D}dJ%5c4Xt zOq{c4rT^ShR@0JkJ#P3IPik2RKzlTJ>;5jnk!?9S=hj=YM%lNN>8gsUg;r0=3SG4( zD9fuBchpR|kru=CdU--AX+~X{^tg*urbtasRL2n96FmM&Z;7|*0S>OKWI7IdUEVk| zoI^n&6NX!#-ee->{M}+w5DJqfMNGioKHx!d&x+Ejs9#(^@N!Z1m=6}2G3O5=gA ze!DGdfSpp6P$n3B@<6zD;nR_y3dugBlqngpGHb*3RZo-SsAn^` z&3}Gb)UAW=W!{K*!Oc5n@B()DL%R%7yRcTMg7_+j zY6_Y677imR)O>7V78z|l7?4|e{E}!PR@I$%bG+f?MSQ>(t8JO-z!D@B$RlXp{!8#! zl2tC zOu0lg_LNxqQ4zJF&_@Ewe(!t=RcNRN^l97a4Po%A9hx6Q(=J*!E8!0a=TzfxTbomJ z*p0#~yG&x$DDhUTb7w|0YYp4%`n<0$7l0W`72GLuUE;h}ny`Jav+BIMbPX3?NcxKp zP3a|7q=csSD)9@2ReU-He;ktlLX;ESyB!m9y7D?&@8CKnH1bDpyPULmTG&~goP5b0 zi(7Rhl-DR;vOY!ZVERm|7JKaxA@vI2h7vw8>1S$Ew_0H;T@JG8^!Kib2-Rao=myz- zCC<1K^d2bfIPve7a*3hP2V?f{$7YG>a4(vPBQ)mNHU>iv&3WhKpG9)LIdxvoRCASN zv_-3Y-H)00=1_OtW+?sV4+0Ca?<>zu!B;rw1%h4Rvzx9`CAArSpJi(3PhEmb9+g-v zM1g0-M}AZ?nt&)##?X@lzRc%T9eUQKTkmA83Y{M3>vu)1J?yBa5T%^Z5?y#oRQ2}& z7f*Hmcw@EHzA|2J^g<8chyDHPCqfeyxy7iT6yUWnq3?@Z$TwLD)iRW!7AoCv4no#y zXCEnsG$L`~U+fBVt>uRf%4#7abT(bjqSj`Go_|#=jbsgb8~s7oAl0;%a)y6Q_ZU+5 zRwoG%p5N$6Nh>Pj$~%xI2T2Rj0O@7|2rTIjR5aG1PQRJB^X>if#3%HB{1{04{H8RD z(`1%S9;na%i6>lMbmPytA!B136VziVl|Gk%)+f8p=JwZI8&QVFZkLkCyKruz)l`yj z`hok#y5wp+E#56^jlrW^K3!ASO2V|eYSBaa4rK+w5gjLjzADC$rH!}RCfaCqcdv0r zMX)|R5t1OKun4KP>&u@dbjmhKZ8z)DALjrhu7>Xj4#>cp&7SH`ezJN-XQ-O}mB;0k z30IF=z5aWPt0KmFH%Zl3*<*_Aa*(l8KZH}awINfMl}&FY;@Z;UxcMnN+h_@1zdSsL zD?i(2qI+>`z>I><$=bo-zDB6bmV}Q-I!?(`?3H|p)dmGG;UxOrU{kQryG*O>9-w3?}mnp@SS=h!; z=`|Uv!ug(5+w4YbyUlc^8Jz6Mh%CB2sZHDAC=QVZ&Ar}ncGwX^Zp+U4A2b*UWYt#V z_MAN(V7}oCh;NW1beFGz+1Th$nS+*9j7Onia(L6I9gM&Mwc+y9**Wp?tOV(P)GwAtiqZtxb!n=O_ktn6B$?GX;rx4^ z{W1zhb!VKT>SqU?A5QmhnI*wOd7I3uPAzbwGQuAq!O%3F&;957`|J6GkHmG3>wBK(cO1uYUBPN9a@VfVUpaH;%(WNtG8$*j zoEJTF=IpskB*bsN2+8xFIdkXC3z?@{o@dvmZn)hZ30TIDZ5xXvKDzk%{>#@N@2F6= zWO~+9qqkYml=xK3JKs^>L(*H& zGK!Pl_7dJI6)el_eYMC&t#NzIrmb6Hz;jT*MWw+N-QQ4MTWBzq<5-}8Tl)FQ19Vig zTT@-Q0YmHTGPlmL9^QR(hUC(nzkiuh?7#a$^>OQ;FHZke>UkL$h*0>?WtZ;Ue15h} zfz~dNHvG@#7F11ASkr)A{|+0iNjG zh5k8~)MstNSodn28a;b;u?Da3?#dc*1dbkG{4m9Edi5+BLcno>Iqoq(v{^ZUf z$?cadCUS7r`_NC?H=mpd_;Tqr$F8LMCL3`qJ}+YH7?G4XR^kkPQuW)NCth*(?_U{e zBo0I&aX2Ln`hes}**<2zv_77#w9f?GK+tK9#q&;M%Ohg!ERMgK6J zjP9GFXF5;+)AURL-<40=&3c>zz3|xE{|s~{;MwI*+MOJKH2r&7bJSkMF8*Qtn?`5L zt^hCmr|H@A%@3aFTsAM35y5M?{C(fVA+NCVbrqGlX}hn7I_+RtNsXryYK9su<~Nvc z?6Au9lZB^=ju^#Tc6%-bDxu^Qg*W`O_TFpnFN{&h?dgO>7r|_f1~%NO0txdgrCZZ*V!OK zAJXcFKv)}a`Dzy`iP=zWy)EMmamk?P3)3nhODLEaM)<1=ayf?hg@^DEp}GCT!z>YP zq=mSQby7nDMio)ImrH8WX|^vw5Qyuo27vZ=ekKl0!H|y7 zdJF@vM~dWO59K-;q;j2Ig&Fn&lVR_(X?@P9cSKa1;6B3JxI%ecQU_)7S@{6)Ux9nR zSX*k4i^-BR`6^D`Shw`+$xLKA!p3HWwX19P^U*nL6~fQb3a>5>n>&XT0f`UP4t~yu z7O&TCkLA*&qBgik`oXr|dyh&zUl;>fVZm2HJIOz8>wKkJbX&7@C*Ebug*Y8;eUm6I zzrzER0GRH+)JStrYUJ`>TlZi`djIR65lIf8Bl;=0@@Ro=5_14o2}K>R{N1(0p$DPMl9rJ#ew6MLLTeyBw=Mcon1hV>Nz;UedMVBd~4eebJmI zjplI4q22qfJ8D`1VeIvnBk*N4OH_cZB)t-|L0*@sxEHXG<`;;2{?3ImMlUuWz8=q? zadwg2q4o*~w`17#`YJ3SPW9g10NNtlbM%1bQvR2Pu`GNszlv33W7h5>)AmvIc>1l& z9ecgeqw96X8xousA*}sO4&zl1jBnMcgg+851t-&K^(>Nw+v>W=sFAx~3s3Wc?!rBT zP53S9y7cxFK3>WCkj{^=;{DDT(sPJy$@Q@NH5x2p+jfV?wWK7g10QV_wZKLej&-k+ z^6+`FR)7_hwl=9Oo9y+8ydKU}Tvxf2Z#1lT=o-0>5&kfkD(U@og6^D-`tGE&&&ToP zb=4_#)6k=}{aMW+^30HNBlFoyJ^BIS>AjDzFE_J#m8W?x^kPVMznQOwp${HV>$2QV ztJgFPC?!p+X}nIU=&9w~_R1(DK4uJs?$vb3c@UOh6fUCKGP>Xn7Tsy~&Rczy~A7IQ*Wf0uR|rDwny5^v_ySKk72vl_;OQ^}UM`_Clf6siYDNv5` zHzSDXa09(jCCsUO;)@>acsJ0LbTv;S22%2QfTEW{u)gNFEp31TFDnDw`5CG5@z}4; z{6l}5=#-J}QOzP~P10M>@Mpq)Z3vh@z;2M_hU2m3x?f%-2A*}#V`{2SyeKf?GRGMAbV?D%wLT0vBeN?x$Es0L3xeV~_Hb%LW zS~y!i4-=!H@#T<_5j7MCl$0s-M#}Z?)SJzia8k2s#CU4v-P~Rcb1^vCwgZ&keb!f7 zf0T32t-Z3m%pdCNupoq2vQKC8lX6kf9dE9Dkg1d1PypZ1&{eO{EUTBaA|5E*9@v|% zV$bsIa90=j`H{hsgYgFA^y#1~Bi|5W)Xl#7Q*vdeB~U`FfW@@uuvu38ttgGsj(Ld+5cT==AC}F0drg35j{JfydemH30ttv_wJk8u8!d;~q z&Us*8uNQk+P`MVx(mvT;2^o#vRb{j<4o?2uNq-KzvRYefWJU}5syAQ|FGZ;^892Dt z&f^>!3KUl5zb(c8jnk-W0G@u7pNre*t`n9TA4k`em|ZMRZ?L$I9<-`xf3r?#-$KVt z?@n&QKbHdzgBrxFWl|C!RPev_1Nis#+%@wwK=peUPuQ4^yFY_8B60cIeXi4^3h+e#N{wVX4@6f~O<&^Byt4G#u zsST}TT4a9Mo1%z#*5#Av`HAhzejf+^VdxzF+uep>k4w=X$ep<~X!xlCxFXN%37E4A z7*_;pD=UY=pX`-LL>Hfg|rdw#yk7?)Y!{cn?i>Py-r7kL6C*yqRuM-^4RqKSA73szQXk%P&;0^KV z;N&1w9ktrH9%{J!_;qz;J21lk=@WPyuOUT`N%h{ZWaQeMh-$0r`*?dFbqPsey_Z?z z*F_d9Ngl6PJFknUEn#0_HM&YzD?137e=E$$ypr1f#8rUWG-!uz)hevjhP&U( z3`=`){bL<=eOU&& zr2-_FfqMb@1BTf3dn+wpM{c#w>Zcf`XeY4WbvE|JzQ8McX;7N{5RDmgDg>>ekNXY= z>v6nn!kV9wl-wzYW0wYce1yYgDmCQK-@Fv?#^b(QM2gguvvWTAizfHSl|kw`jAN}9 zE?hAu9;oQv4YxTxc1$q}dGC5QazJ4HV_quxLP*i8S)ct89qy`TYoC#=%K75@h-@9} zgVCX{@SNx&34Hc8g)uJi8C(Z}5*h209j~g}D2~4h(E3<(Pq+Q*!#i@JU7!=6da37S zK*jc)mc30-M4MKT*m+5AVT!Zo@9|~~HfO_?uY2xue;*GuxoQEKOL6JsXmhHI883av zL~@Bz=gyBVms@f#9r7Q^og=38cU(y3Y~P^;WWUdwerbX2arl|4UI{dy2eQ6GbQ+Ud zK-Q#A9Il|!ozX6VJ8y+Zdg;zEzP{Tgy01xl(meSM{rLTK62Mq21T%|b8p*wgR;fBO zR#kmQPQOgy>`iIo4$2$_0Wy6H{V^X+iZz)0>yF&H!1%Dm6wWx(EL#@IGe#TMe6;;QdhWkMb_? zU&}kw?FWj||EbZ4Ma{ny&%tJ^IX!>WXp}ntR^A2nW^rBnpD~Hs?tjMo&xZL6UHRY6 z{0q8wO4(}&|sDi@HCsGXN`p2s@Vb)oBHnt-$)=$ z&DVU!#p>$x?V#Nw$%3T5yAg3LQ^73PlBt*L-A5c)R2ZC~eO@IGm<;|2E=tBPqk)!U zVmq57y+>9~*7bHE+09zNp;8+Q2p!U^ctv51al5oHX|8g_M&CtSad29U9@f|R99 zAwo^*Z)lPTBb_f-2#mQ`Ya0p-?9(SJfhuY0dR|g4x}c)wVA8+hmkZ6MWp{|Z=(i1Y zig;DSgDKvz#crLTNx$u64L^0sKpNK&!~;n$b^CyoSEY3Hs;RD$T|NzgMbR_-ci-_{ z{f&OUjJqVm1J$ZbGSOncA)&TFpA?bC3=B*IzCLZGps4e3YoK7XCVugEW^t1`Am0)) zp^t0Li1~)xZKF;(xt>*eCO*yNI?2$0ncy%Dko5zO14|zER}(&p^SQ!MEvK0nl(XD^mJ>YU#yM96ko(e*emh)%78P9 z4P3?|kp2kgFT1mkT#wQ>YUaG~@vx~OQ47aDPqS(^;PF_o|9Wu&uKemyO?K4`1-*-% zY#+53L(Pw3BSv2JS1P>-LVrE#@r@zDFfDIxC&`71LAW1ums`K4-}_9u>1br7JO$4H zmL7P1IZ*Snjd>F_U~>3j^3ML~>$#WVcqC23nfm9y^Q3?=Ha>S?j<17eiNWIGURW#7RP8qqfu2vjd=6V}7)FBRDQ1~sCrs3kq8ewIxm8F}( z;_ak290q)#`l=jSqU>;!~*Ys|${=@_3t0xL{CAwmxCj@g1tvo9JLam64wt{L38 zCYroXb0)>57S}6z_Rwy%a*1PNu=(1x%Z(S!scf=cK{+~aqV?LZ^fpjITIYZ|w$xmN z1~zJ5^>60+4)2T++N6syAHz4i{akH}^7Lt+t2T`ERZ=?w7L^)UIJ^93mf)(Tpxkyp2M*cnTHE2ATO&>kO#Ib5lNoycpnEHZUvEktY8sDUTth=nh84l;QtPJ6vSuts4gFn)x+`eN3nd9~_cFh;t#w)~IGxjA+~Ebx&)kt~E2$sM3j=Yo?+7oX#h&Sp=xn%LZpGN1X4!HgU}8JN&-|x;5;pjo_Q=*`ZyidRV5i0HhN`oSaTTz zUA2}ZD{s4--glrKjWGB4@I7aJo$xTR;_S24%*|f+X6-=GKJ=&^(@!Py(;CZwI4qZ6K|ps|&4TG9J*V_o)H^bkXH z9IT`BXi)r;vL#guU(k3J;_h3jLWv+(@^;v0S$_TB;WUw#j}<73b*bNLMKF6jx@Z8s zU%hrtc^Dn-cQ30^bjF#bP^(XyvDjP}K0$}c^z&+5s(gyK4V`8dS{}sA>6!D&IR={E zuLxyF=D~FVzI9bVM1c{uO3E2WRg@lyRiodEGJUqrMKC!09$=eGN8P%o)hf zQyH)*QrQ7nkLJ=mUa)@%%`9;M*#;2NhEuQg((1C(3!SL>m7(YDR~2?G3$cqOrxqB5 zuL`%zd5^DF6S3>})-Vnrhc0MxWk;*?n@S;BAt@G@yJMUYLRXf|TK$YLJr0C>cs<>v z9CJjMRs1N2H8`eNwx2=u)4|Nd%cL ztGm9+9A!!QYR7JoH(E0idLwYCma@)H-Ku~xelmDxaEtzL&yf0Lp*+MhWW%~z*n_N) z{UFJ&NekqM#cOM&zwppb-H087ZetHK%VyO6)&it#=p&_aJyaV(mrItkQR`ft{v<^N z^DHgV?Jf>}q4pklh#5%wn)LOVEp)vtYwWqMHRuDCam4gcYHt!Dy1z05=XU5k% zg$qJ|t<@-rW|a1VJjndVOLy&&Br-5`(WvUFw-IY;$OsxflF8I%Njv_FJssy!Yqpen zd0OS&kmwMTaHZO@+l#Fxq>@2tZlOzQ!=tg7?IVr)!Vxc>X!@(!a9y1#q@)GRFDj$pyPVrW)H!c@@IXYBsEMF#^3-+WkP4 zu}T<^8z{`JOIZv)A$?B+sXnoR< ztcY3vyZ9$wJGCjSTHP|H`zCzOVg}gnz680M67e6C&tX#>#kD}uYgy3-vwLJZUL(!l zy$4k=YFFiPZE>Y6;tg4mS~S4Am9fd^H6hcvkiK@?mg?K2PAaa`QJ~ShaZu;0WjI$B zJV69!P)}2))4gdkZzR-bHgX|+X8}1x~z8rxLs| zsm&sSSkphRKl}DmST-Y3C>0!&yeIwsY8dvi4KVstXx-lp}p@Pn18dT#=iMCsS|IH>aNpQj>fC$&MTVZS%C9iM*>KJ=pE&)5lf*x^d|*MfY?l zCueNjIi_g~WMZJR+!J@5-iqv?RSLhoqAHwD`ASveS%>|qleC%GCVFF=VuYLF1=s{e z8=G$;RL0URpV{Gk&oy(}uVc6s*!F9IpK8QV+x{LW-H|_}dx{a+Pf_Ealjn>0CbbO; z2@)T^@wt8OD%1o`b4_3*9eXvqM#wX-WC(PA`Y%aFzzX>TEgk-_VZGIqWf&o2H)hm3 z9&t$CU|u{YGOvH#eH8HO=f*oRlb?m@A!v-~myx_`_4My?aaepbF_rT@9|zbFJ0LSF zy|%EkYh8bP_MG|hXDH#a$zTeP`@;|-J{)xb&V`u*~_47uxh zVmc^yJGO_*)pvH&hi|(82)gJUhM-VM_dZ}Olm&W!YQ42lKlN=vO;I!H9;m3$B)&`S z@Z;wrgHM;&jUVp8jBRNQcCPe7sa61OS(O?-Io>`9FPO7%$6Jlrr+hZL2Xm}0KjSa_ z^b$_Gr2?h#a*cgevZPvsWxcMGjMj#_YL@~bg-3S8g}!V`8-!hdS1Xohbl?_Lnz*RU z7;9VB2b6_K~i;9Ce9}d?)XZpk4~htN~xlIBuEV7{U2TI#EeCdc@+5c5NvX%t{QSR?3tXH+YIE zFgz(y5;`%*p%2EL-mFsGsMHp@zb2xEc-Z6)>B5VzTbu6My^|8Mp%Oca7u)@`Qu19w zKkAiBqF1GqU;TYl!*iGk>WNUx_n_5awm>3w&}~ea*P&yzh^e4T>&Jn^MLRnKiaxG+^Okc);nUBo`ZzM@ zzpe$O!rWNpQZng-it`9@HP+@Mf#m(axbq0bUfx!bZIwRqWm5vBuNUKR(!o)&MTVu} z!P4%@JL;z6^fV;}lKJI(l_Mc%RRny+j0{|;4n@@^mulim z&gvsu3!fQ%ZszicDDE6D3FNGP#JGa;)HH9o>?GdrK-_b!14BHW*^yfsAZa=&BXIne z@<(;|h-G8;D#+LV@qmTVVy8H?^{C@b8&YI%fcp8uPA?&^_)lWS~Vy7gLf&9>N%&tl9P0`#tjSR=dN4pSoZ4W!|*bO~FCx<>vrowK3|K@v6)O>NRZGGc| zTUhw+&b}@)ZAF@Ij^x$500N0nj_3EGAzhv7JOkC2^vrHY74p~5 zN>3fxbKix$>hZ?=>*0|@^XVnl`v4WOqE~GbjCulp(;J_viR6e=S&C00v4@CtXC}P3 zRP@@bu|#ms=<6om=;#Br%Csu)?SfZrnjF*7c^zP7X*17BGOxrmY@D=VPfa+LY9#AF zoX!yM6P?6ku?+JQ0{YgTuw*9Z4`BIPYzm45f)!Ku-_a8~)kAGu%LPRvT{#5&wEB_mJQ_js_-tfoZp8v*0&Gp9C zzx&VKG}%-9i-54(Ua`lX_kX6m^gmPn?L7XHmi}Mal|MnLBk z!>_MrEu1h*+!O5JOQZFcJ{_BV+splO)bHN1yi5Ur;q#vCKIfIso>hD!`8Mv&8y>YL zNwa2uRCZbSTQp7T+Bzd6dUV8`Y1DEJ~fkr<09uLBUDiGWQF^o>6PRk<84m=aO(CxiH4!GP(M~5)#wU zFt83G3Rwj%r>w2_Iul+b7tMQG@3I&SO)sQhlF`q=MHMr4h`)0n@sZ&ZS-Mhw#z!W> z?n9Y!Lz4ye<84I-38?*aSt=(-qF7x$vrWLjz`z-46Je*Z>3t2&2yv#EyEpF!w8tln zvfR@$p{yJwStDKfS*?e~tVggx^o={3uJNhGwj*?fJLsXJt{-3&<39D(il4q{EhwLvpau zE<2^Z%}q9R@}D!k;!RwE+=7bI8J@pq7NYAP7e<^y$asAhM|lNHpOxx^PZ&qTVMd{u zW3sB@o6_2ZzA^h_XBGieP%he_qb|JyD}N# zd~;UQh~Jp{9zHuu-Fq)r_0Eh@b-uVQJTMWv!c5p>{<<)y*wFSM)zzj~4u*yIi{GU= zo$f7{^G=&mhbA4}>3lAS`0rToE>8gH9>?kQS?wQVY8T3qnGTxSY70H z;CeKzYIP)juyJr|<(?fCLU0X6ymD@wH_m95yFI=HJ~td<2awwHn~vP_%fs!GxA5WU zb(Y1mFgqg-W;T+$tnl z4dNfvVca`UCo+U3ywT56l?sH`d%`xKSnnczQ4~LXDAGTS{dD?Io&`? zg^I`9G3cmQ0`F4M^7QDh zfwDmZlg^v$Dt^{pz?I2sq*G8)PcZQ>su?fDQAvMeCx_Gnq`?6bO-OCll0m{s>ahWp zWuA_q0ilC=huR#&4E{yDb;881<#eR)4Dj%^=5mv~?PNjj@aSvZBl>bx9lw{~`P#i# z1uP)mQ5zp7s&G6=Jll~VEcjUE#30mu;ZdHFn7*aS^6q+G45CWiD%736)-?OMH@z@q zV$5x?F+UXvX-6qdj5cF^rJkMROuM~^!%q>Q!KVIMn)W4KaV^viez9po688JK?B zP6LHjwz!CCzieu8dq)rjsU4Ch#oor%F5Fa4Q9W4%D4R;Z<+tlZz}BhyujUdrk2n}N zBm(x|ayrH~g6o!6oKO-*+ivTT*9k+V>4)3(We12jFb>p+pE|F2tPGWBaYZN~oDK$C zMi`h%re9+i)AwH;1fBEWK0@p@R;-#s;h^q=u%bD6N*rN(>LB#g%xiK88A@1Z*1bR-AA;zr3j|y#Nx`V*M)^2RaWiY2=z_78-jVY z!a%PG=W+GCR07SWv1x7)-=a7@&t1ruS8Cr`>kriNHn@x}f$NWI%B#T`6cVf}xjUpf zIrDmIxf)KGH%VxmOPgpEdDQ^ktiO;*ojE<@%w?HgAZT=-%fIDIS+`oFM4le2f;$R! zU8VL5&K++L5r|KrM6I+f_OXZy`X*ER8nv-s(W*LebRi>YZx8oKc?qiMTiv{*7wfmv z*Vc)};{jOM2cV4!BOoY5Vj+FSdPAPJN)5>eBLUZPToF>6Mr8_CnIwLh*I_m5)xQt# zBNgxm(Qfqcm8chK2U&K)ehVB2)%eJgs_Fhm&y;wvtA0y4t)I`JAP0GB1Z;~V^9z!H|5Kt!3z2ja2?idyc2XDXX>OfjfTmgl0 z!&YuJ)NXjE11B}x=hE5%HH9}^!ucEI@2;yHyu4U><<#jmk&pt1W#gxRH7P=E!3T2M zK1*QiH-uE}>J+Ai!$A}Zcf~DPM~eVrQUslKfM4qnd|}7Pb91B9d+%&kTYbiD55~t? zq%&u}SHlDx&@PA82P%T^a&Co>2gZ&Fbp%~&k#`@_>N%XcOQbbVBF%Zs=#B_H9Tk($Gvp5J{kiO6ZG@71^o3IstN!rZ{#);Otp6=q{6xI5*d2gLWd>}z}=Di~3xT|hs)vF_& zfC29XMgaB?0fgDN{VVCYjVgAf2IE23Slr#>MaPiRnc8ftbFA(g;xxVL5k&DfeEwy+ zP?MEmIJ0J5@W?|#tzJ>oC-R@|*RBPdF4t{nIU$lfgYDwFacQw9{AKmW0WKl{aAQ|o zyi+aHIm>ehCNKD!Mji?~b=5YUsdM1I#OjxAApgp>t`aVE!%E|gqWwOYj_?dRD#|$v9@( zz$XUEi`*Zd=D9Ld-LGVc^#<7kzB@(QdSEm3>Mh)Rp8~gr)h0ZEUw+n~29U3N5x&Q} z%+$Pzy24<*xwt@Yh2;eJ6TaYJx_ z-3vV8F8%2dfcD zPNuoeIB-Lr@1fmdV*zDLlP}?zcx~8>u9UuZTJa|cul7qpy`xZ2DOB z8ItJt?2YJngAdX^$pGwMeI>k7)I1NAUEYKA?`D_wi343#GV1Oy6U1T7&L`JG3TQAjYmS&tVNsVsg;?_*&Y<= zOH17xP;_mthtwc=;fdyaK#2w6o2_5mmF+Zt^My}zT4o-OD}b{8F~1&zSBD|7Xj9GQ z5G49^>kQes3_z~NN%`UC#r>0VXw!>CD|c3g6w{?7O?7|==bS}Z5A?OU;I+W|*xove z#W>0EYs$zOa@Uj)_uv+?b7N&8wCrOqXKXbbQ-z-Qls5&u?_7}fKNnQVs64?_8QL}n zaS!Hip+(y{+1S4l6}V#@%E01ecZ*z6s3Fsvd)up+0DKc!|KCYk#_P_kLrQ5r6es2sdM2 zqcw)G?34Y^*4Q@TZ2a|RA3vpwP=&d)L583uM^n1%svR4>N!o)d>^h_f$1rRGV(RiX z*}E48Z(V=#!qiOsiXVMQOk7r}Q?$+(mtwvN5@dK+tUd5pm9nn=+-VN(!x>U~Xm?yF zX9c+dz3B_N!~~pmR-DLZl!6ww~4amNUHa%(qaTx-v|lKb#D-lwhk#mrC4m@P0nv*Gmg z=W9yCVH^7R5n^5w&ttNQpCL?(V~E*0D+g>Kac_I^ zTT+SI#PWcrb}0tgO2b==Z`dOgT1*v)nyeqS2(d5u9=wVR{219&66WgUm)Va)j%-xe zFg~M}m1qPWT==Cnaq;M0@W`vmzL*h{ik2W`c5xg);=TgkWYx%uu*0o>W$a-; zPY{^k#D)?7otwTA)Gwwo?*^IFWXu^fe)UL3+nSDtln|B-sAh1oZD4#`9jsIAVh^2# zWhA~(pu;d#yh?NCeRnS0x#cm)J}*Xut%qa9Cm_!cClNH=SX^kw!qAg9o5$N#pJL{B z_2m+U-DLdk`!jZ}F70RzY;aHc^w!0JVg`Rd%_1`txt+xc?p^HPQYOFg__QG1xtNG= zBz(3ckRo6PZY|Lt2;SSBA4k5g)qL>ZPR5H!Sxgzslo2Yq5K6wTHY<~5yzBU4JNiZg zg)%FMeLq(pFOk?ro6~yFajv$+%x@T#QSwNiwPIS8&2Z+m zxaCi$l0yBgBfrh^rL~p7NDFJbw^v*+Yp091#i8+y-G7-iz5%n;c-+*W42(ORWmomz zFM!_wjO={?5)b@xQ1y+^8=LYBuV2}sNqyBXHYBdV+FFqhf9QoHAEUIii?LYzkTs>l z2wZf!zQhqjgEw6F?M;QszJiUiIA$v`8CqXEQx0n}KpC`0tSL=EsFP40VQJn3zt&yL zr){gNwN*@L^c$^Ap10Ks)RkT_+Vyyq5=>ZlI5!YiP)krJjQDJ%5+gGv^cpf{X6i`t zfP$0wJRbuCVtgH7ZuPFF+P6+FxhMnJwlBB&^UDQQeE`ZVjB)gn|A5uTI2$`>_?m%% zShf9tNcki>9jZEq8@k?zq@!e2Pr(WLz07dC-%{MlOSAl<67gw&`jFP z*$qF9p5ZfRuF{{p7oeRk)SywuG-vU4S;)Z5+Ky9^^-rM4S%aCWZpB#6-pbKEWU?-A z_;Fl?T%|r>CF7VkIzruwC@5y|YKo?_gVIGYx@bBE~sIj)o?E z2(w$T;l@2h)%fY!^+75IUSOG3Uo)V=wxb{Bow--Yt^!AgaJ6_Bx2)(1m;(HaC3y8F zN$)XjzhrV*Z;$isrSq~xCQ&e~u?MZl+3PxzQ|KmUd8GP4%d~3qiisIqj;f(mbw3xs zUE@y&g$Z6RYC(UpDmYu3^WAqkUd0E)QYhCZ>XHJX^mA;D&gCAGm37)lBI^kvN<4J~ zbn7**-yN)(+gX%V-)lZpIVnahH6&N7r&sX{d5*X?UX|TF!ZV)y^@PiF4)f2r4!I&csz)@Vn*TV?*q%@z*&DgyN8atzsnYR+# z%^anNId*XT4P_z-BR?sL@xMMgS*AgB^2^oWKCa*po-swKazO81hT183^xhPg%1me) zMRj+iA9V&cEYe`(8jpMrMo|cm|KYisxMDN(UFVLEreTrS_9g%&X2%mE(8tToM1o_T zdycfenBv{`O+RN_dzguN>U)i&5A;b%6Zj9Ba~1{GRGa-W2HWr|CcERULqFemp3s`EcdO5I=an=rY32j zeQ|r7-LYG>v3eTbHA;8cYDQQ%ZtW(3ge8w=0%Cl>EF|)Y+ulczu^6V|2Hbhf9H2_@ zne@-ASjA)N@6Y#-PKc-#7ziodM$gq8_azOX9*TC)(9iYI|1>}(xS;)cK4|{Ylqp_+=XsGQk67M719rAar=sJ zxygA_{V7#7rpnhJFasJ^RUHo_0geDOZgj`G+!CahFs#f;5iH_rgmV&0Yb3;7(2+?r z@aWAnfbaBTKu7IK29l&bhkH&poJ25Ii3af86_hAZ-bQ=avAVd_4AWC@AjnmwSyQ8! zbSUgcp(e9k?&qw2xB;;*{to+xPX1Qk7F&ew-tW+$c=d-U)hm@wP6q;)Z^IsM0QTk)v9pgA?yM zWL)}aX|=s0dfjJ7QOqk&!rMA&je+(A#ANlMdxk5(tG^Ve?jgYDEe-rdV7O{mW_oYT zxvo)GSM~>uBZ1M}9==2o@j{p($Qt6A<6Gu21Lv^bQJmPgh`#(Xh(Gq#v~yN@ZQxu% z>s&l*8$R4;vY)GDba<5i671NkG_s?6W3pe(GDM$FEdhdDtS;W zFIapeo?u&d3jcbdh+(mQnOR$tD6lMJsU%8U!E7_o4tv|x|NVe3^4E<+ChVuG zteoe#aRU$A#?X7h7Gn`htsjppOr57ibzGB+yzQ*r?!{cWbrm&SxO_bnHah5EJ$+r* zhrVvz;9^i+Dx+`5Q|+~=Z+$_^*hRm}*EQH*@YBRF8^e6|_y{}U1U6q5S>%0|hFj!K z_uML|p79rN%1mIDAW4j@KPC;$+{izmW|J5)@$Je1)Dzy3Vj7p`6nUy_-JjUX{$+|}qoW~q=(U}@y&;A0&wQR1Irv#>lLK33t7P?2H z8$CN}k1(DKCex+%ex}q+1^!;2l&i`^Onj5bCyY-}-OH*o3DNHr@65bY|Np}05|)a| zg5U$6IKbBQVr2Hwo+N_#;n6TkF>VU%dJo-TwB*ew>Wr6pj{X`EIqlbnUc{)?rR%_U0J z-=x82cYiebgQ6!Vv4Yj`$XtPfI0k6`bd`dL;+&%2bV74nV$NMPiQf}!;{+%^&-ije zVtgy_4!la!JXD;0pGX4yXb!weBpHZ2NxEhd2J>MbaQt{iTTqfjmMTHh``}=EdE4lM zkIc!vQk^~FVJH_<=mTE*$ZS|%P19DvVyUY@or5T0 zM)ofd8Jrv;!CEmi=x9rD{7c^5?t6WYXQoHnq-M&QsVH%QEH<%lFv{- zgh*nDOxSR;mJX0eq!Gz5L!-;ufaGSS=frvJ5Ggw%{kHg(kgZ(x11C$Q!5BmxWYD^cqwV zfz3r7e3x5PB53>q50SAds}^Z`LW4=G@YelX3h%jGm^zA1{Xk~#iIlW{5sP%?f~)GTfOm-_Zp^Y$0**}Wk6 zK=ChO@`+^g&g#EDa_LQyd-w+#f70iFf1^%Je+Jjtzx1C(QDH#-)qi__b@g(>)<0T@ z(-#Q+%Nuo+q~4XC|C_NT&Oejq-=1I1XMfop`G*u>;omd^0taN>xBk*Ro(hX<|MmIR sv^Ng{e`p3`X#P!I@PEaahlHdkg&H6R@PqggturrVRb)z@y?pzB01NVnuK)l5 literal 0 HcmV?d00001 diff --git a/docs/deploy/netlify_url.png b/docs/deploy/netlify_url.png new file mode 100644 index 0000000000000000000000000000000000000000..659f3afdff8cd2ed4a755fbf0073a0dfd4b8e90b GIT binary patch literal 40039 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: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�^zXK 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 literal 0 HcmV?d00001 diff --git a/docs/deploy/vercel_new_project.png b/docs/deploy/vercel_new_project.png new file mode 100644 index 0000000000000000000000000000000000000000..ecfe0f143fcfbf80b6f5a2845f57cf10c9ad510c GIT binary patch literal 9394 zcmdUVWmME%_$}Qf(lrQzbb}x;H24A{QqnCTA)OB0l8S(INr?jp(#?Q?l!&wvgMgGU z3^7CAycdh&Ju30m))-O*yXFq%I=OpUuX;G4~km2CqQ2zH&-2nVIf$t6p9{6?J z&iILg!-?~sx{6T{?tTHKzTw}Ql4@QQ;ZaEI?Y(g52FwIbi0uJy0QB){rXkh0QW7*&qHb}y2%220lCTUqOmt0$o#kUU zf68~gA*{(uk12?`yHr0bhFEl~D+=s7$OwdYksgGs5xz|)a(Cez6HXl6XfPFGNjd$l zBf3EI1qsi#4jEZlDeAMWHx-i67MaFL8nhQv1VXl!i!$@HTgYg^JQ@%2u6S|2Gc+$6_-^yL% zNX`0>kp=RB=NA_pd1)TLTLGF{Y0mxjBP&ngJMyqrb`NixR@S?afj7lWV2>;{Yti5i1NptGqZ zB&}-be_T`%S&nKM=%=HlO!rDE>%IKQ{06!f&|+EE=W zu6@Mfbq8X0=T3n4;SCXSxFk;${5;@5Q`4`Bh>|as=BCM=+2;<&=6c3s=jKrbsWxg3Mt`2oJ{V8{paYtJu*qG>u25W*H+w%3%$PH%ww?0Ha0Pt z$dQcKECcVbEH^OwoZ|q~=X?9+4ehr(a#-2GzdvKi8HM!B%BJ|}UZJ-pEjr}8fAYY_ z&}Z=wZ`PbIbJk0vP6y8#H(=K(DXi?P>)EZX@+&aOFcbNJy;U?eI5=2}1>Vp=YocFm z6i*FVuD3(1A>wb&=X#J=T8|!$zpOAaG;|mb7h_7Evk7N!XOM*E=H{Lrtn}C+;(m1m z-j|Yck;)y-7G-2$xIRQsD@Pbs>SbnS;hmKkR69y6Y)@B~xMyVMD1}4w#!dL>*5$#3 zxy!uliy~b2G!x8;NHc46A|=2J4-ZEc;v?!?7aBcm?NGD5S;DEP5)nSJJPQYh_5N6L z4X)P))xW)DLA!D2K@*l?=tmR?22pE;@axNkM&}C*CgP;LzCK;G1hiG@8kOd|IYvrC z5<$~D0Y;ymg~i;`Qo(s5UoD>MxfF{6q^YS1y*ch6##HmPj*5~JEI?^#X|mX;5yvR$ z+Un}(DC8h`0`_mmLGO-c*_2T23orE{39?u`82R+r<9zwR)N!XqQ=z0krmSvwPzec% z-#*xjgC1(kyqn@0t~n!{`z<`ySSqwPdiwGBX28+!k%$PK9NpR3Szg*i1`*5o`T43T z7e@)^SXJB#4>z}^c7MS*yV%%R+eTV?dP3;&%*;$*U*9Z7Um%m2nHdJPsWw7l=R1Ra zO--4^{!>#^Gcq!Ab^V}SZrZkRKwv-HA|!z445TzW?cH4qQ&W;Lik<{NFp2{M>Ta+fGc#75LE;Ju z3f$ak)kaZQ{D+jEK7F!Dt@zi~swyzfuLkX@;>(N#&}ej7X{kw_bwO_K2a}p275rB5 z+hGkNZfzFQf#HI3=jEJ465A){KMp^8P5 z_cOe}+auDxef!ql{-Bt>RcWvT*K2g~8ee8|bo3>5BU?vX`w)h~Vq;govwC(uv9X~J z_{zh>Q(ax1ci&S)NGLfWLDqMZA|CMx<*xBFOvY6p^J{&*m`L`hQzHU_V2@BMo6_x# z&nYFft}UJRD7HmqAz+tc0imx)9C2}R!4hY=x*ML8o{sY~(Nu_vg5vUY$um+fjZF@3 zHX9O#xx>Y!dY2Z&8i=|2&`)bh$^~FF?ytZyMjZbxHr14uKP%^N`usU!qRy&g7W89w z7U1Lg$?n!0n^9l1}_2`zj+B|7Ppz$1+M)OORIvA27=}|5M z88Y_GvcE~9tNEVGojLjW6m0TBLc+o)Xf$|{t-~!=){9?(D+Ley1%!ks4slPp=*TpL z7^3$H=MkylH@H^-V)*&_OZ54e;v&x=@l@h8X6jrk&zZHF9>_fD=Wb= zi;0cp&(y9D0$CB~T3bg)O;uI<(TEWKMxcc6)w#dhV~l!8VFdMIm=F&SVGz}B-B3)> z9P(ft?TE5xl}hf}5QChw4n3{^R#92G?o9Pl&Bv#~9DaR?p1iue6r%vK@$#VSY!$t~ zF`At%VntR_Z$J3TxW;7R6vC3C2{*aN!=nQI;d%lxEv`6ITo-ymeom`rh(P9nSIZrS zB)gjae%0PT7>Y15jG8Ht6B zmFp)Q7<81C^{v>SHZ06CNeGH!M{PP0M2>~A zdqZ1R8ndL+58dzK-K#3w+7D%UGehEWA419Jjw0=t*b%&E7GJ5eMU~zZgrYYey>XkB zAMllffPq17Xyd_Mgv`vR-RMIq!(c~-zpDx~lh7(0f%gX_oemr** zBqhEzBRq;*Pi`73ALRu^AnshNJH+X!`7{Jga{QM2Nd!W~I}jER5Z#yWtz=!Nz0=F3 z?3SDTl~d1O0-4%Vg@^(#7bzC%f%qIb-_7IgX`2G+U6P`@;46Pt$DdZ8tI~&b>?8vB z<|Ak6?q}fU$2%i+o>c#6^WCy%I_)PHt#=wT)h-X~cMSV#-&a&_|c6M^ogsG#i zN-riVj1@gRJEJBeBcr5zCXoY$LiO^7ec1_!h@j+?s%29odK|`$I`~p7!ctOFVq)KX z83O!%GupraR7fyUbnqq%$QR=hMfW*M*uYR4S{@sT0lK`Be0;-^3#GhNE}VRP2_udn z{S#Cv%uGxP3i0?(0TrateL+wL76=4Fta@L*jO7P|3#XLSvD|!ZRHdk+P;pdl6|b$7kaDHt;u68%St_Z$jtctQ(0sMd35|Hp4mE1O&&!)Kq7IWS z!)<8szt-P&fOR8M39!^hN8*X`+BR18oWmtO{@l>v(V^cQ0-^qWc*LC~$msX5R;2#6 z;jLSz6AUQ3x-UPU6k(=PWlABYotb_13(~j)@m4!NTFsvPbVGEk-XsMI@MB#(J2%$^Kt0I)3D}HcT}Kp;>jk!i$bGR0a!J8 zOEFW#rKYBS{3sN)gR|vvc6^+m&V_uW{3ueHla8#-vbKv7b#hO^DCAE(1c&(PUE0nW zPme|Q{Iq*XjJIJ{n*}h-cEA4|wcFa-_V@QgLqnIEJrH?)nqlL)(gxL1A|ex->`5&H z_MaSV`<4^f1cbNHef&fzbzN~=h~;TfB$(<}8HweQc-4{!Up*ZifPI1j0sL-sND}si$ zS5*z;cCyJEv2YzdcL6V!W6^oE0q9nqv0(rmIriY59xur!Z zlEyao^#;d{*_JE8~Pshv?mHh$QSh5&y*a%z8r0z~Fni zPWExg)#?7y`ue)Oy!>R5(&NhMBD1REV&%HIt>3?K+>DKkj!#ZVV^v#q9iKfrIXm0h z+KMLI*w|21R8%cF?2W{KP(USfxtZtL-qB%bU|_4}wpmpFGg7TQJTd7)`p#O9=L*rp zddTzVTcsK_c&s@JRL-iwAcg5cHCrkXJ^l~aWw#g(?_`WbSksXW!Yx|3xVif_v>>7H zXIuv>2%2w6etL1);_$uv%M|8z781s{TDx7I3CT_T8$15>+{iJ;_8XFu=Qv9 z&o7fCKsX8 zH+&dO+O0M4U|Ap5ny3saY@FxI!a9m9$a>vee=^ zx9tZQw57;>aq&-0O~wEZ3GiGt-@ku`Bm2NLru-@-@n!^FAB`mQZ#`+0HfjS z>w9r=arXC@e93pXF=tTKaUCh?jjKBW>p$_fuaqU~*~0u~nM-i3(aG#Kz75p>U!EKl z?fJ2LqFIIl$w=uM!yR;w2pkrYm+xq4Vcc^HdHJ%ju`%+mkPICOK}t%><09zH?g>?= zHNN6)01`HVe{p2};Bc_K{X9GEUgNOF3O{)w={zyuYb$&Z3p368FzEB3pgZg;xE&p=0jV z`h3Zn4!*vP5r;N>Vxm5+@yYrOW& zLEuUg2w~~^XGxS$S1xW+5s_u=H6k?2Z~UPQRpuAS9m>f!97Wrysm*;_be{_N-?1G* zYQ-CTyW0QiZ;Kd0QGLP|#O=TB==PQNdWWP z%Ey6)6vb2nL%tD%LARW9zbAhprAw{b(LjEe7JxmgaMqxuE$|g=Z}qu%Mol zf}A`5?)+vIOE0v3SrA8$(VwyevvI~u^9_nUDp93I7M@Mex3v` zXjLs2C?$Q2kmYj~l}LTQkF~YkJ{#I5CJfo5iUE73hKAEXli7()qwF4wQy|czL93ZV=r9ih6x04X~KX^76>^iZqDQ?7Q#a$Yg=MR^_w?*OS1& zKxb!X4-dF@IiB6NxrK$Bt1A&Pah-LScIC86r%{*n%J=Wzr>5-0n3VtMT%MQe^Zi}v zxtV^fRG|3s^zW|@kcslZSB5A~j(jdg%PXGp7peL20X$<`ybai)ImmAnIIRUo* z^eM1S;_RM3f8N#AbBfBpLP@6R^;=5i-k@3(BHHQIvvnOY(5Xkib_4d5mh?xB54v1Cs3|G8{o1p#vNkuJ2I95SuR`_Xi#*pVAuyyg%OeX53rENIW)G(Uke{BN>69CA z!ElCw@{fQ4TL6XXs8)F6`;MAP3A@@C4U#l9hr;mq_@I~&KYulVzQrat?~3@oTss{e}kmgL=g_tL1J?|hF_e{j#P zfd4Bosj!OPYZ}P!&*WzBRblCaw7=itqg3=d(lrDIh|Ppl^yL0OIa#;C4TXjQ?64Hc z7Rn8SZXBvY!2%1oxeld4+5sx@v(1_Gt$#9q{c4(`URic zoy?cZC@idF7p1T{V%%Y@v*k$o0+4J86YDW508>YH#Xih2~i-b zJRKQEH+XE=-u`C4{9t6=E$ZJ&*Em2d{QzBMX$@0IJ-!pRea!mdlPN2x3@R; z;pEX&;islIuS!cx8%hzuv?C>@uU<)@SPWNWL*;vkp&t2aJoftNpv(OJ{t6jCglB7M;Gtfs|L z`_;x#Xf@&);@Y8g{9#Bi`c|;_X6f3|t5Wfec)?czLM(8n^L-o$UZgS~UH_1|NcP2k z%gWBlIe3`^Ks90#WsaU|cUri<4Ll>hwup1i}2GL^fBlmcY%H&89)Z9iB5Z_lDJaU3n5oyt^xBA52jYO2ptgS_| z8MoZ&HnI?8gTy>G$pKdR=+i&Gk2I!m|5Gs|e5fIpSj<-GKZL++EUy$$fXctznVvhoY2y+-E&T}1%@PBYlbb9H18(tJQcU@~K-z>W@G#~B^wrhoI zo>gvcw7w`^k}cIwqKWWM`e)p$S`kyO#5D7wctjoj`r>?R~jN zw;&m1TAuras5N+2L4NQZD6dx9@*+7BVIeFphgOB@rgC&OF%HDHmMsgUD4nD_!;9Z>1&Y6Y`Nzs9!-+!hoUaG)?YM$M5 zw&sS3S*AxtM}sK`o@eF*)cqu(38Jgel~VJcW`9(nhr@)##KZ&y^YY>Y@m(x=$LBAQ z`1Q1GYzl6(LP%d_7|mQ}l52Y=wK8dn)Af~!o39$obUJzIt70#4bl*G0mol#b^-FLW zDfd@EfFqnp4H}3@lj7?M#V`LZ@Dh!}aN4V8&!X-^fPdb+6^E&ZL+<}PxeEa$uTwQq zB!ZG)p2PkPCc&(cCv-HI=~9qdHFyaa0Cr13FIwgQgYB8@BtO`Ap{o1NxB(SFk6I(b zbEjSlhPo>Zb3)x&Cn*E9FzMx#;UAQ`-b-F%LNm>s2_`rr;WJ)5 zFgs64mtn8|aNrP`=T&yWBD|Ei@z%rE@H+-5W3S?qcckxq1xn3Adm(|4kWjUxzP+8rZ(_qIja`2B#}5JrINr?@ z0|R>#s<^l#hrlL%XeZmjI2Vm^EA z`oKAo2>NkQ>{n0t4I-Xe9;AA6^W%_EH#flq%J=$wVb|C#V8iU}xEAQmEiZ?Gqz;Nn z&CSik)Ew{N+?*fHbaayRDxnT@S8;Wk79l%0PG= z07*j@Ypc%`?fX4JpFbn3AUr=6#jIGK%^ z-t?IoR*17enhMTc=(+Ep-xBR9&E~gzNbTf4tN-?c5f)01gG1o)Z!f^N-%1?PkQKbh zJB2v|SNvhu>D0wGtm3*E85w5>D>gujh%tfs*eX7e94JNfekt~y-^YB4(3t-I9XJQL zg7t7+UO+c|+Sp>A!2geZ!UWNo7V6}3C;uIP$Fk_P(bK1uCN(N|QK0_yZ3|Q|e@#!9 z>GO@94~%Xrhs97Ix=VcdSKE|&t~U3_{>bGRJ7{k=wnkJiAC8kxlq)hgn7!Nf_^gXQRa7=C@Ns z?Zt!`QsJt{Uo{SfifiG6VuTx@7DRjLbC!C zNH-@PK6DUtqEL~1OtW&@^JnYS{5;?Pw%}4BN>rnBbvD$5kYl9I`UaX@2E=y z0;&pA#)&ueVPRE-owdSW#0ZN_|!(7OeI=+u>4G+&#A3ikUlZ0~9kjQu}N>6bInm6q8lA9(BcObZ zDBv??8->G)Z_*lE@Ff`A6RD4HG9BZ3v%%|2UG@85Vy3<@%NvVfk(4_Ma6h+c~a}_w!Fr!jF zdTVW2ufRqCvxb;XnAoH3HWQSuutLTNU@>=su_PoUpqxM1^s2~h4GRlXS0@Mtj#%>0 z`T_vNr!iV>hJG=r(4m})1%Q`r~?(6Ah40WUGB}& zyBi<0ERU_1x$)LU_v5+w27ZLOqSoG}R`>`G3>h_F5BO@qbU&6=TjC$0Zg2_SQZdNc THH(40NI3s#=&9GL+D82^jGJ7w literal 0 HcmV?d00001 diff --git a/docs/deploy/vercel_project.png b/docs/deploy/vercel_project.png new file mode 100644 index 0000000000000000000000000000000000000000..28bfde43f71780e87e092c0cbe503898cdbb9b74 GIT binary patch literal 49938 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

?6ahy3!InB@a9;QE^4%6LO0a7k*W=ahxonbOkNu zs$|V3COy4yGHmi4hP<9laMd^DtFnGpmv<}HB)oaNq|1?YHmyPQS_UbLt2E%qody-7np9Sv+pEgFSj*}l8LHSFIs<`28Rk@tUDf3sk<&*!t%pJ~dE4fbm%U*kD>=4g~=c&7p#3A^%+_o9sW6Qx=%(Z!WdNo1%UB+J( zTpoR!@xM+fS2lW)#kbcda@}t3M4wR7Ggl`S*kp5Jyie_gU&s0Rt(#BVDxNVowa$Hr z^}*=!QD`N171MeJOHRn0(1fe?`mj!khz9qcJj3mx*`XuQxiht*1$ibx>&bj}&-d7( zLn1R_{tDQQfM&V|^^;0Uf!qYQZ0Y;XAv0~H_=kP!r)ETIUpZeLTS+(=f0K( zjTt8#zNgB~;}IOl($$$QDqGZ;|E3q^hNs^UHoi91)^Np?{^MCQ`FJgQJ(Bz3*TzTK z>2XcB{xTG1{StlC48gPL1bz2C`3A@SNSy9UbbmK$IH=)=&YF)5amlZJl1kePS>nxg zMz2g?q-h5{CZMP>wCm&QAjbCh&{Bo@`l5lJ~qXjdUE z%c`(AX3Hhka?=-A>m+2=9*PN|Bvc~o7oR`xfGiR@1`6xo2=%e?I;#sX zt9G^+ZFSQcyYGQ$3lW|h>x zf55|DztvqfGA!1DwQuV6uYd1NzqS~%_JNOZ;GG?EWn+VL*+OPObiT)I&9Yw%CD{u5 zM4&~x*rVLAZzzJE1kuaUn^J52$H?5uhke-q0pY9sPuHwB$MVWE$%GGbEqGFaeh~~G0D;Nsaa_65KjDn=u!gWNzw->TnrQdM>Y=Xv;A5&zk^(e(%IFEnGk{_rQa`u@)C)KXzSEbAmR z%KG}0kI(Z-ARLq|@linzQPRqa4;yWKo39n}_-zck-EH&Pa|vPzvA8zH4CYim=-YFT z$B^C+kFHKm?4dwnw0os%{`kt$gP8qK3No=?^nd!j5H36odCsPy*#1ZIHj7T{C6wZQ z{;jyAH{{mG)eQBCO3m$z%(uHixZCI{$Bu-KWDt-QnS3x&xucZwf9HbKxK*rCzFJC0 zi+R$6tza++gZ#e49Ilpc-5MWI>_q@^u2>8P12Hy#kOA@V2>~b6y3^FIZx0+$908vbU`0YYK)Qup2wZz3ri=aT)ose=Q^it< z+E?FaVQW0GJT( zK3d@0{^or^=!^{KyR)P7R|=wb84j&gF59Eof*_=wK^d&SEf7I6Atv|oUfgy7M^G9p z^Uq?TzoMuBd^raKbEUofn|uD|&i?-nfEf_EN!efB+tG31@?{|VmSg9*y&6m`=In!| z?hf|$pHfm(ZrxUKybsfSeT@-ejgOD#Fjm`$pycJt|LEyiN&<0lm9-;c+)CSx zKm`0ge*Ac;ixv?PF%=qU_;1_aS!HEqE%V7=1Ww!ifIdS_*k3=h9iqFgeb3%rO!`Y~ zn#QYD3s+?K<*?xG@4eR=>CG{|cqEbp=;K%uwt#K;l8LP)K#|eE-6RbA!`huh=$J!5 zi`g-#ofgw8ba96z90v*3p0)b;o+_mjv8~)D76E?xd;4aR+$>*0%FiDu zK%Z_rxT7z0M?*1v^oxKpMfYw{;|{UdT3L|MUH{cK)~lo2T~gFwZ`8Z?RRz=!n}Nh_ z%Mn#-vDKaim3G@{af0e5khfW^Al_c*V2tf^!50vL2zx&W!QWpZ17t%JaJmr)gkuu} zhP=1R7Hr^s4FGoiS%QXp{KgNyO-Se_x`A*xwtN-8u&_|-K68mzTUS@t5z_@SZ?V6l zxY=5w6tBI4r9WS7i;_)#R+%6odG)H@CEhw{Yv~iRvx^H>C*uiqr7sSL1W*}3*tqy* z7Jy(oYPH|y`~m{K(ba~gEdf$;8K~L`u%DwD9F}-Sr=(RrqLvs+6soeE$`29lF! z)eMmB^evRK?0y|bSY4h?TM|(5&H@q$Pv*4|2nHg8rc*WFoIiW^thw&)13_aTV1I|i z5JaTUT!1KxojYfgFg!dA&^;RNY9P?rhXbqtv=49rCue6+$6^AcO?R7co{?h{@!Osf z(GTfSyV+V~{qB(f&UY6iu&b!lEHAr(>I6zkRePa6lJfG@ej7{<5=UcTaU0rft|ca( z>m&e80j)DMD6Ei*XOttIb}Kb7d;Hwa$J6sl*isOD6I7QU7+cgrAdn>wtpIkIjkz$R zs=7z;y)#QPsv&17#*D(j9pGB>Mp{n*w5vX&XE`!BY9KI{lJwOcqMeF*Eo2+XYEeyG- zjP1iM*7MyVp}|Ogioi7~pdP_*pliUudlbMTOv33`VX!u$+tDLO5*2)9^MjKwF*3tz zh1c)jwWagtm=^D5kvb{p+t4<)_><(J+z4nqKjl!^vOl3Z85X-Xz$9jXB~y>!KZqfN z8K#F2zBe};y&TsB58BF9y{t0Yo2n z2(luVBw$O|`Xa2r)}qSN=|X`hzY#b7{jj7qmf|v0>b^Q_l%wD5e3U|-rwC9y#^BdkUCI^%&9Lar z#Re=AC$Z-~K+V9Dzdg{|e<0_dRSuqf0E{$vD1)WwT9p3$O^3c*-wk4hdBrY(qYp7E z4NUiBb)GaW_g(>DKM*sJh}GncU=RrUg$1WQ|Fa<_I*MO=UDD^IFI|Et_vV_OtJp26 z%NfkYA}FcLvUsE7?NK~jcb4)0t<(AJ&bMQFpci+}&$vUu>VN7AfH}Lb?z7`!9N*px z8QHX`3)?omC1%GI9hMv2HinAd*@8C&+71-JtyY3wY#-V8(pg7e`hZIE==7flq1%4I z9W}-7c`pwjF)>Q6yQ9W=e5ZwY?qc^DeTI?KeziJgOt2ds9#Po3rQ$TZmbP{XXkX`5 z0WK#;e5GY%3!G!*U`Y9W{rZ*hOuQ2z_1RuJwvqAZ$+P+Gah?WeSz3qfb!vo-=uLo* zojrd(U^Aomm*A7F0s1YAfD2C160EO%YU@0W08SKdczRBblf6BMCcQJCRORsZy3|9U zZ@t~!dd9}a$!eQt+i7dx#Qv>bC^#uRZ^gvK^77_&B|V6!UupzpZ23sj4)Vl03W_L1 zVua5BMXjDH$})89be;aIhKK=JD(b&#h(sXujL|9Fjofj4P{8$BJN|EJgj8>^;1PHRv$dJ!&Y)Rl3no7j-wiXaKVlaeD$ISzp5E$N$X(Hw{5S2iA73eqz@&% z6sd}qVhx_!{&SQyD+|!WrTv1oSWBtV?ev5Gl{5t2g(9WD3K-u*V#tn3FF(LUIH*QzlxN&py zE)w`j;l^0UjT?kF#D!iey4>8Hc2`tTN#Wl;pC@QYq_`=-fGtLd;z~hJ@P$H5$;5G} zpK4SNHkn&q#y8Pvl2C5eBJaM{2lI@`9Wr*C)ZTOy5uO~7rWVY-CH#_`B&Ag7{*${Q z{M)f*M$={6)uTExPQ@jNrFWzhyWJfF;o*q$_;3U7@v}{m(7Bs8@4mQ!^x*Z4+k`j% zCw=>x!-rA7wQboh64rw7z}Ouvawy z`h0KRym3iXp^9XRk)(>WbGiNE1yy8+0TZ|!;UO#AH`h}g>X3G0p;K)Ihu01wA}nlZ zV33xXnYlnDO~}jZIZW{l)xEG*{t zUpVB0v0pSN@$@KQsLK$Cilq;%4QBEqx|nh3wKuo7+0a)-6%+u|^KN?MB2Vub&$XZbC?sv49m>6x(Wj(z=hGw{bd&#a!KKmg3-3M0`@-K>1%XU>i z6%3jQC|}>-79zHH%_R>NgJ5ALxvo6Lb@4lEyd@q$7QU99nJ6%*us5s!8S=|xeCCP1 z$Y;xj{*YMn=tF=bjD$fiX`b$ZlYh$>%@Kr922X5YV4zv+Vq57iSbc#>1=R-MgA-if zZ~L>%&Aaz+-Ar8V*ZM@Cj(FKi9SN(;dGqAIt^&><^Vs~MsSrzyBv{4C*%=rF^X-nC z1@Rx#KA?YqgR?3zj*U1a2H*LUv>+k98{Tyqqvj0|3X6^H$jF=LJO3h|(ry5gl6rLY zvNht*`RYEoO9*w-cznEgp#5k=wCVa(jiXiE!~(n|TQEgoJgU}{(CP6{O>?6tad&@( zN@Ei>18%WDJ#^=F&xTTw7YiQc>z{V@uIc^}CV`54n7kg8{fZ4&^B4W!qF(+AGjRGM zf=9dQOZa`RbyOq4ek8~bbb8ne4?-ZGJ$~iLgiwsPNnHOtmG-@lew*_W?c84wZc2Fs z=zn>&we}hjbV4ApR}gH?Ls-K*d**b=>S*2h2A1HTaCZ0U4*@%HMRCwB{BW2$FLtvz z8qrP7nW$1gHMv7juD)CT-8_BWiDP6{@tH_S;;?z{yJFbNLk7r4t@f zE@k4*V(Ja#7$90%+q*cPg~Q=z@~!y3*9UrhB!(_31FSYwJ0J)v z#nj@f!zF~~=;WBOx@h|do)$|4q@!$1cjuqovTq9fmL?QH>a;k{Hd(&bV_7PZc(j8{ zx7GVJpyACJ`R{{_N3QL7esXeh^%Kq?4@og>_P!YPmP+E&GGMHzu8w^yb$WKTGgEgq zZk&{!o*ocC9o>$Li>t1#zQ4bZjVk=|<+odTcMo$^cZNe#_#BMaKCiEv)oJS}Dhk1Q zcy9UJp`@Z3*f?Bj-q_jM`SF9pd3)*&G8z*3ixE{VE&NKQKB#;8syS?kK%?02aP+;^KdZ6L~5@;x|+0&Zwzf7#^7Y9Pi#AS9 zM?SYu$}Pqh;D*&25h|JCg_QjU9OWMuhYClET}JYSkFI^Y(>gMyNXEM8;^Tl+-jn{vM@LT=ved z*R&x`62{VNQJJGnt#LnUoka zl?P|Her1){C9i*O?ybaGhrtA+X(fz%;>BmQ8ocUiv-9&U+ryxE za9Y)`bKx?4RSs*AfG-9jVcUuB+f`^dbVI|#kx@}p*r@xDdlAda%Z`qYvmS`g_4G??H>DzsI4s{`Xq)`VeLNZVI~?j=L3@mtFd+LvmS%G3_~L$VU|v= zNHkj22Xo)v_VS%=?k&O_&bDiuXI%YPPX-1Cs;jF9Gi4MA5?A?u&b{5KKMUgJ9FM3p z?2M{&KL(#K=^_8xiKRq}n*b6@l0r&5XWucgOR*=;$0X>Vx(qQwyeRBqUQRE~DQB*gGM5c4{iG z-y}mOY5P2?hVi-lg1Y}vJciD4TQ~jhy_5z z>!ZY5{0hr+q0co^xHj)-3;Zqw3%8q%gC{GjXB)h)fLZLS;vY+{y>M}Hk&)>IF+;Ci zD<1k<8Bl#L2 zP()I}k~+06{nK`0rIqf-1^p(q;D+^{XWKJ%61lt;R?}t-PrxZNV{&h7(}Ie!5R6^J zg-K~U|J|3}YU;=KcD>y)%-!AH+IpwqVzR*&PxOs~sHmvEzP^e|v~;FMof|9M_R*t9 zBB@2Gsj0w)OG-*|a|2nXpjP1i-QC^!`T1ZMxx>YigkBtdggumU$+APEqZJhug{np0 zr|*5WU+vl6-sX1RE-ft$!LM~#lLxm`PzVQGb=p#Qa$*bY1CKpA>b%nRG-z>*Rar&l z_~5|7!9lamE%J4AbhJI*>bB6M9g&O!ST81Jzl)dWU7X@Qa|t~ndL176S_9mO%Uvfj zxb3>DuX$9O9bV@7>J|2z6vsE_JM{9@zTKE$cjqbl8f-X^OeD2``u3(v7^K2-Qdv>4)M~mKoY2!xBJy7ga&tF+{BYT8!Ql+jD7R44(9rPo ztP@B!F){hEwKd(~%`fh!Qm8$==HTn=YiMXFlDfCl9^OFu)K|dv^4#_9x39qVA3l5l z#|^5sEhrkQE+CJBywVr(+1TqVt@JdlKlXw3Ol_6Tyg>1X>S`|atrJkuKvuA}kwOKX z4M@m&CH@g&-(?I9p>W&r@o|vLy-zxI5?vMoCMG5}MhodRK=S1X^O1??c&WZB|4u57 z&C$szEJ9UV+lmD@_&G1k#>~v@+W$7x$3H!_0Zw6Il=@8YN_T$yHlZv?X{f$>APZVr zS}rv&auk5-ig&R!2^^+E;kKLKSM$7rg6)kB5Mu z`K_L8jM9!DoE~oQ^nzC63jA~%DY+!$5KR~H^^d$_R(vNdTKD+@~q7eR4+M@I)R7YOn&dA{tO1rDpp za?3k!lXG%%^78U3DvrU1L80yG>`XP!{MJ5SE#%z!3hmT@2o#6u>1p?)&GwFtYOf17 z1qB5=J0`9ApErL6`AyJ-h~a+t5ExifUF~(cmg#wR#OXYb==@wgtJ` zKBW)HC`0R-586UWyiW&{K8h@Y2l#>8f_WRa`4xSeU;m;sN}G!tacG3t72iN#U*Fi6 zn0i)NgV5$wRd`oeRMgRaC%yMUzbHtGWLme2%+vPq;69j*_%)zw#5t0&9W zB6_&JFE(^QQad|4o1B=?cHd&fbPU*zYI=Oo9z>&AxqGxV3A`Rebd~eYOp!i3-dVQm z$uBdRp|Hqb2%m9yE=Q^qXjbX5pe9f_IXHye2>}5xy5>+1iEWr1d-r+Z!;j)KdMx2MgmtgOt5D>uA3j*Hu!NYz7CiD=X6j!Y)mN@VPS-!vvDjKjz41ODFM3%|JhG zkA2VWeB}?}tfDJQPdA*db{y>v&dZ}=T3l!eL_EEgU;a0#&=9AV{(Ox-s#`z*nz!pftVVdU1MqbaZ4n zSw3B9n_5-H$;}KPq_QJHL7=uFO_ zmq&d+p3Z$|FBkgWf%#9CZ&2bPQe+Ae5}lyK4i694(1=Ooi`iwH`;r-v<+YZ#rTo}I z{En8n;MVx!Sp`4;oMS-B24tL0oR*T&c(Eoj(w~Q?Vp0ja)vC~Tov*F$E5CQz#riAn z-+0IqRnYx^W-{#HzuXH3RiwPU{OTm>%5}SHRjmDRSViZ$fayRUUhQ06(nF!bk^v(` zP&+*5lYPU1;sa2KK#KsSUyW;w6?Z_q6FgV+NpyCM+$WcM>jw? z*0-Ejx+07~(17>??l3Yr>ApUcJvF5n1`!{WjfJds#n>;lei|7W`SgsP4oslacJZmm zRl0?_xt%5~Vdi8lo5ctgF!r|)P&x^7J8d#NxewZr>$+Lzb_n1a5Rm3(X4t4L8rF5g zgM)~}Q5|~C%CBF)?t+|}RvmfJU+l0p0QyicdBjSR4U`4f%$T>aepsrs7%%ocEr}zt z1Ep(8HjMif9;aPed3ltBgy8l&P{baDL&Up}K%*NT7KVYxq08_DG`ZJdf3)wcIUwD0<_0?A|Jc~X7E_4sC}?c6LGoX(aB5OR>3@3IaE*8e(2ALNl3)!ZN`fYNr`7b zF1$98p>ppni+~tOad;X?8kZ-lAZd_=XE!ul?JswNo&-uO4ANO!!Xqg%EcdvY*{jQA ze0=;gvDCq}a_d=Xw@RWRAdV$SrX%n+`b z-0PC0jZf*s3=XSrcv$!W=yx~P*WYIfBxmL1tZ#3VS+5F43@i`5eDAA=4U2ig16lF`x)AVQ9S^;%Q*JLGC+Ij-zu zOb8HfeODYyZT+xZ?%w=vsrIr=KTu&2^AXzcO5N^SK|p<)kQ?m2Rih`&BXNtbRTlAK zun=`pa_E3iAw_GH)$jD8W{lQ4pUPpv?&EJ{R#ynkC6X7UP-o!UAcKJ9*AvSch%JLd zt1cwJ&>l{nE>B5Ya>@}B6{W1IDmIx=Jc>2ImbD2cKmaND*wfP(aP};YyNRMl4e+lN3rScD; zp&%Iz9Z+ko><^emzyI`o4Lad;X*EwMPnW=~ovYD+GcTr#dkPmlK$))6h2*|<*sMkc zEBW3kSV@))pf6Gj^m}m{9%k*l+Jy2MvSs~N&RaH%XX+=)3Z#Y2jb5~R@5!I%B}D_U zO`81L`3V9HG=oo>jY90!!MMtQ`EwCY;5}6}wm!>fu^j0gy}30Ywk+@MeMNA&i(bg2*3J=V-{&bMg6U7=2Ospzy$t13EBBW^)VE5N4p^ z6D#Q?#jcMAYtYmCd_zBLI-Tum;%m38XBC~?l8j3IQS4SF0}injkNH_`oWm+x*e9$i zS;;%UfxxeiUFOD{g435?RZsvI#cT>Ce&h!V{lbP(9T!CtMssc*+ClSQsGVJCui&;u zJPc-Ti60#Mc5ZfkgMN5aXYlE}AYWhqp3BxJ)%MSzVMI~^!buF#(zxr#B?++;>6+8y z(IHs=hrPUP&;N#B=X@KRLU@t1+`LSpcmAM{1#Z{q<2}>MpS^-G2j^V3PBV0sGV{?f zM;qp5N;%6>vXK`Pu}u7g0J-^$D&yIGq`D$?|Ibirhy356lNS#$X*+kpv;q;oEXZ*q zGgC8ST3?rmjOE5u!l~8BO;rjMREvIMKAI6>YTj|az$uAXWm@6=XKB6vc4>b)XqZm$ z&h$bBJH};l2 z5HK)@W+^P(`soCxBKpl_H0u7hcMOG~oTd7l{3%$-NU22bKjrr^e$@Vfe^=wK;a{@QF0xBvG%US7LW*%`?sl3yWiMhOc=A2J{Eeqm0YWSL*N`^=tDT*l&lqWV z$Ao#a&VHfQfmek3u;0xjA;5tZsUjuG5a}-0C_G_!JNV!KK;fB~m_Wh$shgTWFnak# z9<(nw0FofPeEX5|pT}f)5Yo8}OCN|{pj^R^e=VOK(Yd@J6Z+6Q?FLgNRzTNsexeYu zxTK`VN{sRO=fUTjDbE#Q9_!hewPx6amn6aeveYfCC(K6odl6aE2kEc*-n$wyJ?%y4 zw|;!+J$KDCv=R0Yb9Dl)As{+5w8*GC7A0=`yzB@i45H&Q?+bW~y(B%!dw+-|zfUh@ zWo0EL@4q3YwMTJ#K^ET9+o02--eLQ%3zy28p9QxC4s_x>Qp4*=yc*ExhD1!P`#ExdinAtBO@bIj0MMI_KTWsrWhJBG7$sW zcX0%JL_4BguSzKjgKA`S>_0#KN9gdPwh?U4B~er;4cYvfOFw@tB{MJ5a?X0g)mt2+ zaQQvY_CmuT!@u6C5Xr7eGg}d(P|xs7g>trH$Ff~-u?;byN4vZhCs69h}xz6%QEU(}>lFJHLA`;B`M0Uay|W zjcI*a)hh*u;W|^oG{y4_V_T~Yv&XWs7rIjEe#sMb;5>*xQwHENlyg0_zVIJ}>iHd? z%F4=l?dJQ!f*&V=^vraoowql>caME-0qcjra5 zPQM>L1;>*DEp$J0>snqoJEe}fdL&xaIR@jOqu-e>!`*r&EJ)liTfQpTyUk4W_*Zy5 zsYepyrjzKk>dYG1b)7Lnu4A6r7YO?rScRcNf5jP*S5dUg#7H)?)X+F-L zj#A6dv9VuUITLF;v*N&uo;#|Xl-JX+zesoML|AjZ4fT5zK0k1Yw?WRVdxa?sOXJSv zHr6pzt*qOZP2cr!)}K2bf{ATFK2;m#dgS&rcEsI3JiGM_Tl5tS?*ntU+sEJBWn=!0 zfuK&}vPq`gM-VHzX%B*@cTe8Gf6wcF1h|Ne!&3mJC2`tkq@|G(6MsL>Z-Jac!DedE zrHhc$b^2Sg@|CFb2&Ck$a_ys*0!xY^+%ID5mvWKv;%}v=*F~^W{tkm4rQ5NDA#yaL4Bh<&8-Yfrt!l= zOF3CoA8#9JtuLo5p*s!dR5uJO^Y!{Yo$x3smkg^uQ7j265SaCFa=wZFO__Mb+nKVT zNBr`e+eXh5GwoL^b~6gb2G!iNQQ|AniFHO=VY^j%g%d3q(iN2bh%OpJ$7}KD@Vyrvc>;i2onKUe?yu03dF-+-ShC z>U{K<3IO!N?VEYKbB}-UsDM!t=!3u%o-m6W%Xk?^PPtdLn#dd@IqP{m9YLuuww1)F zFCr!Nsog-m-h-2S#`QDaH$T5Ss};>3)qvs#AOHf%515M(EZauTKY4IJwcg|p#)AXu z08nX5%gaT^7~Gq+Hy7YPEAcAe(+aSNz9l1K%6_&z6=T!)jI5hDeC0*YaxYuc9-bxx z2~PC{lSYa7VJm-Wv9-G2!sDmLgU$`s$q$t4^SqI;^d26e_QXksi3PCfRT2 zXO@|Dx0YCz(~=1K`CT}i@!)G3MX#x^YvuW}#bj`AREoeKw>fdY!}$epy}tWik~{70 z*w~m$^LeGs{F`sOCf3$EWoD5zb_Rbm18*W+5Gzs(PU}OI3DTng102z?uChlk%n%iQ z{r-Gqe?31m0s@$u+2LVe?^UL>Px#zNz=Cdd+S!V3gmw(a4C$Q}CJgo`+pkHcySL9> zH#awjHUODZc>GnenuV>usOk9%{w^&+G;>yji3C!{#Ps)L657Bxu}@F4L$TH&_D4D? z5BvL0EtQs&VOv#h8ZGMPk?E}gA|&DM1}6EuN@}iIIpvW()CMpKf=rh6G4{4n%Uj}^ z5b=kfpk(0%^Lad3GB)H_$jdI^q^1uh?2+rEQOWX8Cfc@4QO6GGyOHs^n3x(+R~i zK0@TFx_K_10^=n9m0@sD}tf%u*TPR=vswsMJT^Bcf zl7VhceT%WL$t5KS0J;Netuu-i!0?0`k@4}G%F4>>>VQ9(t~tJz^uSPkiMhFJii_nl z2SdBm)YUss>HnWJ4fLvCUvJVQ1C-MJY^#EjaM&gqGX7M}HE0oJk_JY8@Ne(&OTe}* zEg5iKybWWIkpvKVMFl$_U*dK`(+fMh;(n8BE z)6*9+^S{UB{K9TMGqmPFE|W+~b07pI=MN}c;;8?*5O{XHL%zBTbVQmx((GNFVO!%R za1)k94%;`293OUe8TUdUy-EBsJyC!G{_1$Slr)#f)3$30|uEH;l@Q=Kh5;Pc@yCo|&E@bT*Y(LF9xn1EwJYJ*#0^vDBLy zGElh&gIvBGPto^E=_4kuX6Yp^FYlO-?6Ef#J!oP z04o(H#8P+#4P}@#ZLgDr4UL;2h6+bjk42qFv_xZBK30hb1ZfyfDsUULpLZBZFsqoC zJr9R$N&Se(7*QZC=gt)BKdY}9!NrQ1^w0ZZEO6mv-y~;d#l&i!uhg;boQH^&?1tw* z@-Lb+&qFtJ@MfrBdR*7prS6b+r23Q6R{IM>)N>}XCmP-^yT5c#x^1_GGVuN7vjvhl zyf4pz39i*fyN^FT-E?6)1U0xxm%+i=nVp^8+0hX&Zm6%@}kp2p`m z1190|MV~%h-+HFbU8BM(o$q!zfa=e78t7?gYVDR$#dE;#fQCy3puZrr-Q3;d;^H*G z0iB-q#B&NFhQaxHU!EA-rD)eUSptd=qog;6+2889`;YcEpjmKqc1{BBYxNQF4X81| zCszUGN8o*4R8w;XZV905MUL%m_F0xE_W>0FwxXq_#g%YP$2xd`++lCeoRB!32JmAb zxmg9c`$FNl!&yMdqr$axH@COnaBbUOja+;iAjz`SGv9iA(pZr0s9D<6w=Zr)3{R4X zLE@649FeJ|HCFH32D#XuVv;SSy7@St{hWCuYFwwcd`~fVxkF?lGTdRtN1nJ_nhau< zuR$3)Rvv!vLy*Kj`-Ee%vUJEzJacwh_G#OR+ zmg5s8^nI8ybTg1TGA6soy=~vTMg&UcwCy*vzh|??kiV-Ug(l3}%fZp{>3zRc(O|$O zlsky&-OAQCfDdw{$x^JZuXAy8vs+Fy+fD)UZDMj#IHP%CVWFU)AT|~kViEM57kJU} z)}$!XzzJft{U@L;j*gGRBgO#vKQVFIj3r}(cYJxabnzi++(K2S(O;)Hn z^rI~>1~Eb(=uUugiZgHf zlon_f8;EOY#7Sp@Uy^oviYLy3y&fEEDDpn>beSH$nTY#tq zY6x;Wzd_wr+bKZJgRg7RO3oQL7oc#7qEQpzqXdKnNw(4@(9PYybF1AHgoa3%8j!WL zxt6&fZv)p4#a`Xkb*-lZs;EVvkX+&j!fOT`RYXL@-zu5#9D(8za_RWCjt+2{nYlU1 zBG5y&1O)|wSOCptSatJtV-NV`x;jq~2%Bu~&z=5q)qIqJ`Kys$iF`+1$&Huh<}&*} z=_(hDhPIueoU4_Gr)A|O=9c4)oZS6xq~_xZBKT*r29vr7wlVDq-v=8w0T)*edhjg= zRh(|?j1}0~5@l%L7Rzu$ud<{X-E?U|h{!|#y^-T_zl0-hleq6*xj$Ot4)V+0qdr?F zzcLq>2nxLTSdI)Mg~Zkzu&xB+o2r)-yBF<1Vmb2@%U3d3v?kdmx8sxf4p(y3X(z?V z$}_U0Vl~G@QpV?$ZClL4qx+oql9hPv-{!UJ6C@3I+ z(gf(=TN8RfkdwTR#*NKK@?K4<77vD(0k*X6e7}>x^PnFnO4{WzI*G8p`Zu~dF`>u! z@)o+exn0W}WGUJ9xk;p3vpS5tcEvc8OyE7{Eu>ud1Bfi6)aWJDDnWLk~kBTX9lc zhL8=E#B8I|sOf1T{K-4qX+mc%x*813LaSvNxEt;m8^us)&3*mESfl%pD?Dv=924^q zj-L@?6;VUMzTxW9JydFL z3P1;Nk+f&yI_lA?ii!@PgHP=T3bXC6J9+nO&Nf|~TpA<9YL?UZ0P_j7#-I+Q34A`+ zP*PgH8B;49JxAF4T+jb6nFd0$-|KPR(cFxG!obB6Yq<|ptaasEcYSb&_t zc_Mg&+f!YAVpPX_8YmHf(tBlPrM#StK!G@40tgX-c)(lA?Bg^(O)q8Wxsopj3mC%w zk~r#}9c^(X6ac9fxCanZqQ*hS*V;9OQVR@)4G3V1LlJ_ER~7 zt4u6rL#ugDOiDS=HuY$Vq0gL#kja6Bj%}-ype8ns+EUuy;Rgw0w#N7)%fj+0aa$pG zrau|81s1e8YNhBCWI8NL<+BPju+k-2e=cNm7{fP8fVeRxL)$pgBzFMV&(q6-9U51M^e*W&`)lw z#}{9GyA~7toc9Nm4My^NEk5qe>#3QKcp8uCP90q+b}>-Ga&vQw=cAdD!BX&nEg@s` zFVlpO#E_`qwm>Ql1T;WKvl+x~aDP9F+qIathgLet>(q1ttM_dfxkh40$QR|@aeM=R zpn-9Ba}%4CcH-gQ)a}XObMq^iz6*4b7kk0pq|sr;-##u@-a^4RI5?2?Ru7bp798n( zj^yOHsm$5+-4+kXj8am*Pk+;6_e)5)4^qIzzUw>(9XIzGV5)0v7h8d9!fL9re`-o{ z;@bd!eV%GjN?l#T5nfz$G!VTk164B)4h{ebfV8z1bmObNNtxX_qf`qv(oRSTe_ooYw6L{b-ztsahyc*C352S zwK6qX+O>yuWv)#atnCh#XGTe&Zn1y#6b2IM0pI(cB|jn#*&b~dNF3HjgwO$!;J=|Jmmk;Nu6#tA^LGy0g=WC8gSZRE z=N5T03q*)uWC2<^Z!k2kZa{kDIR}S_L9HqPa05V`fTSQcHg-5yMMX&o=%K1513+N~ zQY)w>NiZI#ys~n+)7At4+CZ;*1wk9l*BAv#!BY&|QFruDUuvATfYgzgGSmTSEx8mn zW2a$M_WVVt6~@!In#LgCzZ7r;Juy%r)8ohV#4xXdb%9XpF#bPuK%Z$h!n3-{IUEZl zH2>1bPJ)&I$f>>~72{&$%Y&WR0V$aGNwl{u7QD!3RQ85tQ!?>#*|;lTtlFc_E3-0N?;Ki1dXw#r6-*tNmNBied;j+mDi z(BQV9YXveE&l$4a@r)Kq(^-hyGgJ2NY}|v_SEB$jw_L4$4QZDJf-g=xR4K46(m>f3)= z?$}_;G>h|6${b%xGWZK5U_!Ygld^wADl6Sz3BhDq&7c-WWnUAtB6xrbo4@>2>aDbM z#&NBJw;XaQ3sa*gNr=+W92*g^qBOm@W6wTw$~XCQFqw{#&3IAt;OH^gAZxziEerP! zheb*nnXEpNi-RHWO0g%eBmyKcQ;s~naQVocf7s+mM7*DMM%4G^4``h66gQmsZ?(B4 zL7)!v88@BAyVdW&0=Bsx>jgpX{6dazLLS68i9PI7r+at_a9a@flvTHLf!-Z-|KF!G z?)!nFB2YLAs(m;u>*cm{0}xCTuGwx+Re|va)B&Jhs;j#IuP@Ol5ZBO!w+qolP|?v@ znU_q-gF3v?=yNMgSIU~f2FTw*Mo-WtuW~zFk7KtEb38mg)~WY!1uL=KaCvf96K0?w z3JSvUtoN+7mu8jS@s*#k}{cS-KR7BLLI<)K>k zF5<1*i7!eDj80BUXvAC1*4L$`zKw4Lo#w?JoS>Zrj5`1T0DY(fN6-P4>_F}VZth85 z`m=fBXI(+I&R;t^JH=5HuSd%UAZ5I~^s06mASq}!Sl`(JiaC-)f8eensWzBz!LRJj zo(@d+gN6x+u-f1swrOf^rV$K*z7}MFo|iK|(e+?xN^LPul20L>RSzbeLM~eAJ1V0_ zWouASlG$Ol?ta%rODyTvFuX}mN1U*vy&4X;A3_4E4|+!um`X=# z8>)1DzbYxI2>Pk6B4=+=icXV?>@Av zwvQmg0ZbS}iW)y^ZFk^$WFkCY22+S0qUqHwq|xk%*Jnh z2qaI}(aA@Y*dN}!L1GK6Hjk1lr=q4dZ%la9aAC!7Tk5i<0V}QHPuA*rXa_To%zwjZ zdJL zPs?Sfy1Pj`wAwFcV7be4|D7p9qL-1D3dnH5dycphPa-qGtA*uXHZ^LHQ7e|eDA}+; zQ7tLa-WjS}(OG{IvOJ9JojmNP%5zsy@_dG+FbzI_O{jR5kGmx~cM72Am-&w{p`pJ3 zv#P_WS*bNPqj?c(;FLlv#L<|&LEf+eO+@P=xy%W!@3l5=jvX_y88Gf#t@O+iKE3A` zQ(%v4&r7bA`jrLvaKa~I47!B=`7Q@$zJ>$Ex*%S(wymdY7_WXw7aq9yJPdad)1jFe z(X66ItpVdxaNB!ZdvZcAp6s_kW^=k6b#GzSjvcx*-TrZN@78nY4f0;htIU-`iU+uY z1*#E?E+sFG)`~a-+YAs|nM7RKT<)Q+rpPC24)HZNtJmKMk2}e=P2bmR9Ym*iVxrJO z(=9XTGNnKUwZb0B>`@a461%)HBK?fqZq_uDBR{h%A&-j|PC&x5UCgii+VB^R?JE_t%!1xY;FtqjiFnU8k3@NdB5jL^vX>ospP!_r%Iek|gAq zWQ9RJLItkXl?fUA7lFl3DR9yIRaYQe4R05DWy~g@twVr>P>$s{u_!rv$$$uj{c#STV02M8X+sVB5x6O8!E4jVzFy8rxmH(eB!1r6!`Djqd5UWO3HRdC>a!5_4z^Szpt;0eYa8!yxs#YhX3y_ZWM+I zX{Df%e|+;_byW;pw>8s*hM++~g28pam6*SRbWY&^@Kp!tbbI}x1X5yRV!$LVf4hRb zf`Ys}1Oj>Pc_4?Q)A$7Wj}f24Zi06wY#alC>WGMlh>43$^*IzxseQ?e=daBD;&BdY zl&G)>oQ#yT&7jzS-~Yz5f3DsH58nK37z%#*&Q~;5=x>oR9rE|@saO!mX8r3uq(9EU z6M;l0zd*PS0rQ&NCy~Ws-FKmX8R*4r7F_h$M7{`q-!Y2ce(~4JFNdyI27e?4`}SX( zX?*)ylTOqzWm@Ke_V4_$D~k$@_BKmGQd~R~mj1j$#0BlId#1^o!eAYOCmOFm{bMh- z>!*F-7yw@0#e*l`{d>R9Z*v5Z%tn>(=-&VRg4PWme;HsnJRvP&`4oRUqM7R@Ufd3W z5Y!XAw0QVCkJDWno_`qH`Vmd;6Iu`ks?sMkIdMa|Z?B33)#UGE1fqj~P?h{CSQg)q z2rijr)5!Dj(TNpcgu#Qb5*eAQI?hSix88^PwxY^RU5Bj;$L&_%yT?OBI`}V>*T2Xr z*{ISy73a(R_B~V8(yP;MBVq3A6Q+SC6iy07S^@%gI#Rd1Lo_O(R~4$52(AXh%bbU7 zZ~1sFZpo(v>Ja^L)VX;qn^4GwT=Wwx>>Lb?zkp7mYJ#cWowzH=W`%UWQ#A65#Y){Z&c0dk4($WW)g$poc#oOsNY%-L84Ek34(@0o zCA=1r+GkSzsr+ytug3BP%;Trm?IPjd!CLtMY}K<+f?|J*ne?og0 zORE~5sMVe52-83!^=`t&N%;^Yr6fWYtDo5SqtO*+t50(nvncQmeYY0rZrC=z`bBa#kSX)Rda3k_f{UN!Fd%+9)4^rg=vxe9k3BBycJ=N0h- z>>TOOEc&pO+O?7u^M%Y<=FhPgWJLKLhWnoxmT#Z@tdzAMuvZC&3)O!H%V32uVTG3r zWOhF#h@l8aD+}$qT`tBsCpK|c`QbzUIkwxR(C1UJ1W6$ek{Dcj3U$W3WOI4d_tVU5 z_%$&VVA$p9OYPsbP*#2g#C?^U*@`)eR7zA}9u5c&PGT{Yx3jYo5J2ihn3Zt>?LGyC ziOEs7Fzi4=OV7cgqiY;(l~*pLVJ@lI&MW=>`{;K4cMT){IVbN-OYCsEHeaMK+5Hco?dZFXdtvwBd;ztK4U%pi)6JIg{s4k10%fj4nr& zdzeKPq*l7fmljXv`b?xWt6|~9Sj2kwO>MdKj|vAedJ^M9JIN&xUNkWaac`@;x<^NE5_7PHVeX&G|Pk?D_DX;Xw%qaJXNgo~VD-rg*|k$H67Z`LdEpEz1Ji?4(U^ z5t0ebG?anG0Y}aaNaCWj99jBUwesaj?ns)jkW57TFlD%LoH^5Cn`5y4+thYv>=Qkr zVeoCYw+rgS5hgYcE|&PwW*KyJoOM#TuMjoyf_Uoj17VsNZ88-UFcNeac+n{eH;g`? zKBA5>jG&=&Ue3seT3bvXEE$-0$1~aQ6*B9yR5gs39)1d2Ft%eI3D{Cdkqob~8{C1x zyedqgF{B>*gr_v)H(z48Vq47$%K^hvD(xrL+eYKT`Y`C^QwY`}%Zycss2)#`6Ma`1@SpK>UuuQSuBdk3OA7()BJp-L zM%(aV4>!I2`+Tn^4%86FJ=#yWUv*5uqjOoZOIGP(xOnL)q14pIFFTgT#VMJ=XSZvi z{YBZ}WMz_0-Vqb?ofQdtd@p@Ej%K$?8<4;Nb)FgMijmp9r?AD{_Aq4ygdK>vSBtE{ zB2YR_B6 zki^8PUl1#kbS(7J&do_u(`_A_22uY$B8Ip+! z@rhXJ($Wb$+*D*xuZ4qm;>;ig0DsPuj_D?s4E!Jto`Ic;%-6%S9S)b0Oo;p(5B6-U zyq(f#gMQLE`XEh6y1Z5>msXAV+^NmTf-7tIIrwv3?aykCmCb^;)vXE)x~3d7H_~}u z;~4Pm72^q-@=`Z_TTBTDweh#jDhVcIKIvE=WZxWx%)8<=bd34}@~uN_2;vlSvdqFFbsXalC z{h1AXdZ|Y%1z3#SdtBdD0%SRhIL7_sv!4NjgBg5}AI2~+yVnyF_e?De$wzarQtOZf zdnran#3v?jLD@MZnH^6T!4+W!@KTI-!g~gvl2VWblzi3dcM{4tXx+TVR!<7gl2D^(gxDp6X2aQ?(P@ zfWfYAHQ##qNV$N}b#Wrp?zGa)UD3tN-dKK1k(tyS@zC|9FS3Uui^P!d5^!`P@C@LU zz@u3xY27^x-mp+G8QMut48h6nDMgH9DHwNqdOXF!=45nS0V`z>BHA8JFu8Wg0(Wb3 zM)5suc{gl0(WGHV%j(NW?M%R1ZOI3ZA?Hx99vGleimDloy|AEU^eU4j;hbg4wdffE zxhHqAYH9V@tW!sfj34&BZJOFQrvg40F04(K(+~Fu*smFBg@-C|?c<_5@JhhHN zhCVs7cPEKI;uPePq5;khO1irnq`Nz$rKP*Or5hxrySp1{Y4{G{z3ct{ zcP-b#2j-bGvuDq5_dfm8{rdoJVrMWY@$g9V@I)wHe@L>P%h{PE$&T^mSBjZ1>XA<5 zZ`0=QVg)1tpu)t;@lX1V*+^;X3j_ZE#LrrP$gNSMl2Qk*B7n$Sl>YV0IR3&ZJG%$S5^kuVbAMJVeT;xRZdzKZA1D zv_SVkK)>4vezQh(4PZ#g$tR8q#!X&)rC{xAYr1jb zLIo7>0prPs(C$@pjqU$x1mFzCvzU;eho*jS>Vx5=(H0CD>3Za0H8RC8CJxOKkFD@u zPM=#0Yvt$_L!O{2oV&_k+*fsMGLTRIGfo20z z#AyMsom6J+pw7;tK)Mhd2Qy#%vkfyF6o+hv~VFTIuV7p-d{;NWBJ=2fuDU$!_^2X`47B^mgM13dbK)TJ5 z<&I-7!<-8uQVgRRr_etKZNA{RyxYorr0Dllw&TEPos{Z9d(cDT@Qad zE}$u`Bb}Y06o?eZ^y`F*BCyRoU`&`}Bf~z|_~Vtu`&( zsd#67RFW{^- z2)SI6Ea5($%OLVZmM0c1^cx%oDQb%O$C#*_Qe6L6(YO!$mT^;5V^!qfz{2>TAuU__ z>)+k(MUjK&>g(KC3}lO1kiad7#p3|PIwAGWCY~SVN+`?nIgMgd!Kw20LFQCIBQ8XA z+jk7x;l&Y(nE~5bGP#|BmV*QuUX*M`*+x!SGwV5BME9?z^tp)%<#Diq7xolwOJhRq zH&T1w-{+_wuk6yMrH|Yl>m9e1-P$r`d5{0D$FI@EqRbVvH0&2Q@~CVK!dwrZh}*HC zbWpT+xvvQLBV(BSKnqcera_CrKHyb*TsU?+yiQvqRQx^G~sJF3J=3*@S zZGh)OE4_67m+8q9%$3(80D6qFy{lU{F(94vX<+-zGd_=(PnsfL*TEF- zh|Wn?E|H6h`Rx}XC*;}_e zS8(JC6bKVZU*#IY%=cENdyk&dy?I`ARU!QY11B7IzpCVMjZO*$1P0#OUTXoqm?^S_ z08VxO&R4FLqg{JOFCg}U1KOqXw+Ne-#G%M%BenvcJbW9M3l{VGz9J)UB&rRg44_+m zR+r-%JeI^?K~!($q#x^o{pUv_WH<*i`TF9qvO59Xoj@uCi(V&K!buegP+Kk)JU-4} zLgvj4_<`DI$RZAqvucGwAzyS3Fdv|*Jk5)?^yBzG91@9t3Zq%=Ofz0c;=7pt_^y6I z1MNk{V#uRR3KXg4>-SzFakc8lK!(2fZx>9UW{XfFg~c>F=t+*7rej-!PM-JxIqJ`g z+Y*d_ZCx~&&Kri|zpZSu5Hm4QnqV9OH!2Vv2f9=OsX^i2zav&l)l^IY!S>K3?I9LG zukk)a_7j+Pc`4e%yaHt;ItS5ApxiOX|8H#LbPRIL%Y5mIts3ZzR;HX19c_2M)lZS( zAwLu-lgQwsNCCJE7$-xMdI83>*4ikf$0jCyi66;A1QC;k+=_Lwy!mo`kmxeUO+>Tp zRb*~}YLmFwSQ}iR(_0;oD8+~iR6H6a{h@O}twszo1*ivDk*3bx|JrAK_E}?Cw|eOk z3BTIu@}GMAUwcU3BO@t->A1L-Tq}UQZ{?CSUY!OpTPrKNB1MPvAw5Y015!035092E z4L`4aVzN8ggu-Lgr<#Su5%1$9Z`8+q(TGhz1rQTYWidtm zypo^?I2OkogR?@QF0rz|lZ@&L;ikV#EL_2N#+s0#BP=pXs)?WbP# zV<1C(---ulYenF7qi18o@Y}ZiQb%1`S(qYc(gqg;9sLvPzlmKInYnnT9$=v&5%41^ zUQl_Q3K5^c!jqV+iq{nLU%%Ke{&%Ca(s+FG^71w6$Eh6l>=7xPj>Q0}7{3N~u~=y7 z>uRI|bTN?#CJJ#mhlP(!Sbrn%dS@P}iS5C|Vj$x`ij0#m=$^2`qXOv=%Wa-O9p+0; z1p+Sn+IhtH%lKfQ<5nYJ%S7uasTnmzXaF3)gAB8Kmn#^g!_)H54<7c(=iQ0_I>`A} z48WAGOpJ`Lefn;Pt#Mb#=%>wCO>ME~KI_3Y(J``f!OOh5e{Cqf#qOQg!;$=p9p;GW zKHQvLV)G}U`N5+iAt9-kIRVMj>Sdppm?qY>>{^LiXKaBHBPg&|VWBJL;93cL<+}c7 zue(6R#Se;QZy=x=`scRBWCR5oOayWQaXX{-mrg}x%J;xwH>IiqbxvrXwdlHCb3

EOMZaTKRcLE-4`dX5)LZL(B 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 > Из-за данной специфики, парсеры невозможно развернуть на edge сервисах, таких как CloudFlare Workers или Deno, а только на отдельном сервере. -
-С помощью docker +### Docker Требования: @@ -61,18 +60,18 @@ 4. Выполните команду `docker build -t anix-player-parser .` 5. После окончания, выполните команду: `docker run -d --restart always --name anix-player -p 7000:7000 anix-player-parser` -### Обозначения +### docker/Обозначения - -d - запустить контейнер в фоне - --restart always - всегда запускать после перезагрузки сервера - --name - название контейнера - -p - порт контейнера который будет доступен из вне. ПОРТ:7000 -### После развёртывания +### docker/После развёртывания Сервис будет доступен по адресу: `http://<ВАШ IP><:ВАШ ПОРТ>/` -### Примечание +### docker/Примечание Для использования своего домена и поддержки протокола https, вы можете использовать traefik или другой reverse-proxy, с сертификатом SSL. @@ -83,8 +82,7 @@
-
-С помощью pm2 +### pm2 Требования: @@ -100,20 +98,18 @@ 4. Выполните команду `npm install` 5. После окончания, Выполните команду `pm2 start index.ts -n anix-player-parser` -### Обозначения +### pm2/Обозначения - -n - название сервиса в pm2 -### После развёртывания +### pm2/После развёртывания Сервис будет доступен по адресу: `http://<ВАШ IP>:7000/` -### Примечание +### pm2/Примечание Для автоматического запуска приложения, рекомендуется настроить pm2 на автозапуск, с помощью команды: `pm2 startup` Полезные ссылки: - [PM2: подходим к вопросу процесс-менеджмента с умом @ Habr](https://habr.com/ru/articles/480670/) - -
\ No newline at end of file diff --git a/player-parsers/README.md b/player-parsers/README.md index 4e23446..ab6d023 100644 --- a/player-parsers/README.md +++ b/player-parsers/README.md @@ -36,8 +36,7 @@ Response: > > Because of this specificity, the parsers cannot be deployed on edge services like CloudFlare Workers or Deno, only on a dedicated server. -
-Using docker +### Docker Requirements: @@ -61,18 +60,18 @@ Additional Requirements: 4. Run the command `docker build -t anix-player-parser .` 5. Once finished, run the command: `docker run -d --restart always --name anix-player -p 7000:7000 anix-player-parser` -### Legend +### docker/Legend - -d - run the container in background - --restart always - always restart after server reboot - --name - container name - -p - container port accessible externally. PORT:7000 -### After deployment +### docker/After deployment The service will be available at: `http://<:YOUR PORT>/` -### Note +### docker/Note To use your own domain and support the https protocol, you can use traefik or another reverse-proxy with an SSL certificate. @@ -83,8 +82,7 @@ Useful links:
-
-Using pm2 +### pm2 Requirements: @@ -100,20 +98,18 @@ Instructions: 4. Run the command `npm install` 5. Once finished, Run the command `pm2 start index.ts -n anix-player-parser` -### Legend +### pm2/Legend - -n - service name in pm2 -### After deployment +### pm2/After deployment The service will be available at: `http://:7000/` -### Note +### pm2/Note To enable automatic application start, it is recommended to configure pm2 to start on boot with the command: `pm2 startup` Useful links: - [PM2: smart approach to process management @ Habr](https://habr.com/ru/articles/480670/) - -
From 2cfdfcfb2800c17ca724afcf414dfbf8815bf3dc Mon Sep 17 00:00:00 2001 From: Radiquum Date: Fri, 30 May 2025 16:09:47 +0500 Subject: [PATCH 50/58] chore: update readme --- DEPLOYMENT.md | 6 +++--- README.md | 28 +++++++++++----------------- docs/REAME.RU.md => REAME.RU.md | 26 ++++++++++---------------- 3 files changed, 24 insertions(+), 36 deletions(-) rename docs/REAME.RU.md => REAME.RU.md (76%) diff --git a/DEPLOYMENT.md b/DEPLOYMENT.md index 4b2cbac..bbc8a74 100644 --- a/DEPLOYMENT.md +++ b/DEPLOYMENT.md @@ -111,9 +111,9 @@ Additional Requirements: - [git](https://git-scm.com/) -1. Clone the repository `git clone https://github.com/Radiquum/AniX` -2. Navigate to the repository directory `cd AniX` -3. Run the command `docker build -t anix .` +1. Clone the repository `git clone https://github.com/Radiquum/AniX` +2. Navigate to the repository directory `cd AniX` +3. Run the command `docker build -t anix .` 4. Once finished, run the command: `docker run -d --restart always --name anix -p 3000:3000 anix` ### docker/Flags diff --git a/README.md b/README.md index 65f6f84..1882b28 100644 --- a/README.md +++ b/README.md @@ -2,20 +2,20 @@ AniX is an unofficial web client for the Android application Anixart. It allows you to access and manage your Anixart account from a web browser on your desktop or laptop computer. -[Readme [RU]](./docs/REAME.RU.md) | [Browser Extension [RU]](./extension/README.md) - -## Changelog [RU] - -- [3.7.0](./public/changelog/3.7.0.md) -- [3.6.0](./public/changelog/3.6.0.md) -- [3.5.0](./public/changelog/3.5.0.md) - -[other versions](./public/changelog) - ## Disclaimer Please note that AniX is an unofficial project and is not affiliated with the developers of Anixart. It is recommended to use the official Anixart app for the most up-to-date features and functionality. +--- + +[[RU] ПРОЧТИ МЕНЯ](./REAME.RU.md) | [[EN] README](./REAME.md) + +[[RU] РАЗВЁРТЫВАНИЕ](./DEPLOYMENT.RU.md) | [[EN] DEPLOY](./DEPLOYMENT.md) + +[[RU] Changelogs](./public/changelog) + +--- + ## Screenshots
@@ -53,12 +53,6 @@ Please note that AniX is an unofficial project and is not affiliated with the de
-## Features - -1. Use your existing Anixart account -2. sync lists, watch history, collections and more -3. use almost all features of an android app - ## Contributing -We welcome contributions to this project! If you have any bug fixes, improvements, or new features, please feel free to create a pull request. \ No newline at end of file +We welcome contributions to this project! If you have any bug fixes, improvements, or new features, please feel free to create a pull request. diff --git a/docs/REAME.RU.md b/REAME.RU.md similarity index 76% rename from docs/REAME.RU.md rename to REAME.RU.md index 9859ca1..eacf219 100644 --- a/docs/REAME.RU.md +++ b/REAME.RU.md @@ -2,20 +2,20 @@ AniX - это неофициальный веб-клиент для Android-приложения Anixart. Он позволяет вам получать доступ к своей учетной записи Anixart и управлять ею из веб-браузера на вашем настольном компьютере или ноутбуке. -[Расширение для браузера](./extension/README.md) - -## Список изменений - -- [3.7.0](/public/changelog/3.7.0.md) -- [3.6.0](/public/changelog/3.6.0.md) -- [3.5.0](/public/changelog/3.5.0.md) - -[другие версии](/public/changelog) - ## Отказ от ответственности Пожалуйста, обратите внимание, что Anix является неофициальным проектом и не связан с разработчиками Anixart. Рекомендуется использовать официальное приложение Anixart для получения наиболее актуальных функций. +--- + +[[RU] ПРОЧТИ МЕНЯ](./REAME.RU.md) | [[EN] README](./REAME.md) + +[[RU] РАЗВЁРТЫВАНИЕ](./DEPLOYMENT.RU.md) | [[EN] DEPLOY](./DEPLOYMENT.md) + +[[RU] Списки изменений](./public/changelog) + +--- + ## Скриншоты
@@ -53,12 +53,6 @@ AniX - это неофициальный веб-клиент для Android-пр
-## Возможности - -1. Используйте свой существующий аккаунт на Anixart -2. Синхронизируйте списки, историю просмотров, коллекции и многое другое -3. используйте практически все функции приложения для Android - ## Внесение вклада Мы приветствуем вклад в этот проект! Если у вас есть какие-либо исправления ошибок, улучшения или новые функции, пожалуйста, не стесняйтесь отправлять запрос на обновление. From 43da1862ca3868c0b3331cd625385df3f782e53c Mon Sep 17 00:00:00 2001 From: Radiquum Date: Sat, 31 May 2025 12:04:28 +0500 Subject: [PATCH 51/58] fix: https://github.com/Radiquum/AniX/pull/6#discussion_r2115719901 --- player-parsers/shared.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/player-parsers/shared.ts b/player-parsers/shared.ts index 3ce9203..e42e77a 100644 --- a/player-parsers/shared.ts +++ b/player-parsers/shared.ts @@ -29,5 +29,5 @@ export function asJSON(res, object: any, status: number) { } export function randomUA() { - return USERAGENTS[Math.floor(Math.random() * USERAGENTS.length - 1)] + return USERAGENTS[Math.floor(Math.random() * USERAGENTS.length)] } \ No newline at end of file From 780c7b0f2717d7ce20bca4a3f38513bbf43c3afa Mon Sep 17 00:00:00 2001 From: Radiquum Date: Sat, 31 May 2025 12:14:15 +0500 Subject: [PATCH 52/58] fix/player-parsers: https://github.com/Radiquum/AniX/pull/6#discussion_r2115719912 --- player-parsers/shared.ts | 43 +++++++++++++++++++++++++++------------- 1 file changed, 29 insertions(+), 14 deletions(-) diff --git a/player-parsers/shared.ts b/player-parsers/shared.ts index e42e77a..fd3a955 100644 --- a/player-parsers/shared.ts +++ b/player-parsers/shared.ts @@ -10,24 +10,39 @@ export const resHeaders = { }; export const USERAGENTS = [ - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.5 Safari/605.1.15", - "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.53 Safari/537.36", - "Mozilla/5.0 (Windows NT 10.0; Windows; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.114 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/603.3.8 (KHTML, like Gecko) Version/10.1.2 Safari/603.3.8", - "Mozilla/5.0 (Windows NT 10.0; Windows; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.114 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Safari/605.1.15", - "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.53 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Safari/605.1.15", - "Mozilla/5.0 (Windows NT 10.0; Windows; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.114 Safari/537.36", - "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.53 Safari/537.36", + "Mozilla/5.0 (Linux; Android 12.0; LG G8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.2.7124.71 Mobile Safari/537.36", + "Mozilla/5.0 (Windows NT 11.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.5.1269.13 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:123.0) Gecko/123.0 Firefox/123.0", + "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:94.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.8.4576.73 Safari/537.36", + "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:121.0) Gecko/121.0 Firefox/121.0", + "Mozilla/5.0 (Linux; Android 11.0; OnePlus 10T Pro) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.8.1484.76 Mobile Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.9.9841.32 Safari/537.36", + "Mozilla/5.0 (Windows NT 11.0; Win64; x64; rv:124.0) Gecko/124.0 Firefox/124.0", + "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:94.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.3457.25 Safari/537.36", + "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:124.0) Gecko/124.0 Firefox/124.0", + "Mozilla/5.0 (Linux; Android 13.0; Pixel 3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.3.1166.27 Mobile Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.6.4126.27 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:130.0) Gecko/130.0 Firefox/130.0", + "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:94.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.3.4677.74 Safari/537.36", + "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:122.0) Gecko/122.0 Firefox/122.0", + "Mozilla/5.0 (Linux; Android 12.0; Xiaomi Redmi Note 9) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.6.3806.92 Mobile Safari/537.36", + "Mozilla/5.0 (Windows NT 11.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.3.9963.85 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:122.0) Gecko/122.0 Firefox/122.0", + "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:94.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.8.5618.48 Safari/537.36", + "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:126.0) Gecko/126.0 Firefox/126.0", + "Mozilla/5.0 (Linux; Android 12.0; Huawei Mate 40) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.6740.69 Mobile Safari/537.36", + "Mozilla/5.0 (Windows NT 11.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.9.2666.21 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:132.0) Gecko/132.0 Firefox/132.0", + "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:94.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.4804.4 Safari/537.36", + "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:128.0) Gecko/128.0 Firefox/128.0", ]; export function asJSON(res, object: any, status: number) { - res.status(status).type('application/json'); - res.set(corsHeaders) + res.status(status).type("application/json"); + res.set(corsHeaders); res.send(JSON.stringify(object)); } export function randomUA() { - return USERAGENTS[Math.floor(Math.random() * USERAGENTS.length)] -} \ No newline at end of file + return USERAGENTS[Math.floor(Math.random() * USERAGENTS.length)]; +} From e79d1e92b881441e3b9b5fd75b6be0ec93e60aa8 Mon Sep 17 00:00:00 2001 From: Radiquum Date: Sat, 31 May 2025 12:15:28 +0500 Subject: [PATCH 53/58] fix/player-parsers: https://github.com/Radiquum/AniX/pull/6#discussion_r2115719903 --- player-parsers/kodik.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/player-parsers/kodik.ts b/player-parsers/kodik.ts index 19b0ebd..e28444d 100644 --- a/player-parsers/kodik.ts +++ b/player-parsers/kodik.ts @@ -19,7 +19,7 @@ export async function getKodikURL(res, url: string) { }); if (!pageRes.ok) { - for (let i = 0; i < altDomains.length - 1; i++) { + for (let i = 0; i < altDomains.length; i++) { if (url.includes(altDomains[i])) { continue; } From f249cb85ec4566b9accb4f8ef40a84df46a40716 Mon Sep 17 00:00:00 2001 From: Radiquum Date: Sat, 31 May 2025 12:19:24 +0500 Subject: [PATCH 54/58] fix/player-parsers: https://github.com/Radiquum/AniX/pull/6#discussion_r2115719910 --- player-parsers/index.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/player-parsers/index.ts b/player-parsers/index.ts index d66c34a..e3b891f 100644 --- a/player-parsers/index.ts +++ b/player-parsers/index.ts @@ -11,8 +11,9 @@ const port = 7000; const allowedPlayers = ["kodik", "libria", "sibnet"]; app.get("/", (req, res) => { - const url = req.query.url; - const player = req.query.player; + const urlParams = new URLSearchParams(req.query) + const url = urlParams.get("url"); + const player = urlParams.get("player"); if (!url) { asJSON(res, { message: "no 'url' query provided" }, 400) From 3c5ec6c39fd098dc530794d0f943800eac9f2df8 Mon Sep 17 00:00:00 2001 From: Radiquum Date: Sat, 31 May 2025 12:21:07 +0500 Subject: [PATCH 55/58] chore/docs: fix spelling of README --- REAME.RU.md => README.RU.md | 2 +- README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename REAME.RU.md => README.RU.md (96%) diff --git a/REAME.RU.md b/README.RU.md similarity index 96% rename from REAME.RU.md rename to README.RU.md index eacf219..70ca94e 100644 --- a/REAME.RU.md +++ b/README.RU.md @@ -8,7 +8,7 @@ AniX - это неофициальный веб-клиент для Android-пр --- -[[RU] ПРОЧТИ МЕНЯ](./REAME.RU.md) | [[EN] README](./REAME.md) +[[RU] ПРОЧТИ МЕНЯ](./README.RU.md) | [[EN] README](./README.md) [[RU] РАЗВЁРТЫВАНИЕ](./DEPLOYMENT.RU.md) | [[EN] DEPLOY](./DEPLOYMENT.md) diff --git a/README.md b/README.md index 1882b28..0f965ed 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ Please note that AniX is an unofficial project and is not affiliated with the de --- -[[RU] ПРОЧТИ МЕНЯ](./REAME.RU.md) | [[EN] README](./REAME.md) +[[RU] ПРОЧТИ МЕНЯ](./README.RU.md) | [[EN] README](./README.md) [[RU] РАЗВЁРТЫВАНИЕ](./DEPLOYMENT.RU.md) | [[EN] DEPLOY](./DEPLOYMENT.md) From 038122fc2a38fa23e965da7e2f94e575c7b5f344 Mon Sep 17 00:00:00 2001 From: Radiquum Date: Sat, 31 May 2025 12:34:23 +0500 Subject: [PATCH 56/58] chore/docs: fix spelling in DEPLOYMENT --- DEPLOYMENT.RU.md | 48 ++++++++++++++++++++++++------------------------ DEPLOYMENT.md | 34 +++++++++++++++++----------------- 2 files changed, 41 insertions(+), 41 deletions(-) diff --git a/DEPLOYMENT.RU.md b/DEPLOYMENT.RU.md index 076a2f5..d7114be 100644 --- a/DEPLOYMENT.RU.md +++ b/DEPLOYMENT.RU.md @@ -7,16 +7,16 @@ - аккаунт GitHub - аккаунт Vercel -1. сделайте форк репозитория +1. Создайте форк репозитория ![fork button](./docs/deploy/fork.png) -2. Войдите в аккаунт vercel +2. Войдите в аккаунт Vercel > [!IMPORTANT] - >Аккаунт Vercel должен быть связан с аккаунтом Github. + > Аккаунт Vercel должен быть связан с аккаунтом GitHub. > - >Если у вас нет аккаунта vercel, то создайте его через вход с помощью Github. + > Если у вас нет аккаунта Vercel, то создайте его через вход с помощью GitHub. 3. Нажмите кнопку создать новый проект @@ -26,7 +26,7 @@ ![vercel import button](./docs/deploy/vercel_import.png) -5. (опционально) добавьте переменные для использования своего плеере: +5. (опционально) добавьте переменные для использования своего плеера: - NEXT_PUBLIC_KODIK_PARSER_URL - NEXT_PUBLIC_ANILIBRIA_PARSER_URL @@ -36,9 +36,9 @@ ![vercel project settings](./docs/deploy/vercel_project.png) -6. нажмите кнопку "Deploy" и ожидайте пока не появиться подтверждение +6. нажмите кнопку "Deploy" и ожидайте пока не появится подтверждение 7. нажмите кнопку "Continue to Dashboard" -8. клиент будет доступен по ссылке такого вида, нажмите на неё что-бы его открыть +8. клиент будет доступен по ссылке такого вида, нажмите на неё чтобы его открыть ![vercel project url](./docs/deploy/vercel_url.png) ## Netlify @@ -48,16 +48,16 @@ - аккаунт GitHub - аккаунт Netlify -1. сделайте форк репозитория +1. Создайте форк репозитория ![fork button](./docs/deploy/fork.png) -2. Войдите в аккаунт netlify +2. Войдите в аккаунт Netlify > [!IMPORTANT] - >Аккаунт Netlify должен быть связан с аккаунтом Github. + > Аккаунт Netlify должен быть связан с аккаунтом GitHub. > - >Если у вас нет аккаунта Netlify, то создайте его через вход с помощью Github. + > Если у вас нет аккаунта Netlify, то создайте его через вход с помощью GitHub. 3. Нажмите кнопку создать новый проект @@ -75,7 +75,7 @@ ![netlify project name](./docs/deploy/netlify_project_name.png) -7. (опционально) добавьте переменные для использования своего плеере: +7. (опционально) добавьте переменные для использования своего плеера: - NEXT_PUBLIC_KODIK_PARSER_URL - NEXT_PUBLIC_ANILIBRIA_PARSER_URL @@ -87,9 +87,9 @@ 2. ![alt text](./docs/deploy/netlify_env_2.png) -8. нажмите кнопку "Deploy" и ожидайте пока не появиться подтверждение +8. нажмите кнопку "Deploy" и ожидайте пока не появится подтверждение -9. клиент будет доступен по ссылке такого вида, нажмите на неё что-бы его открыть +9. клиент будет доступен по ссылке такого вида, нажмите на неё чтобы его открыть ![netlify project url](./docs/deploy/netlify_url.png) @@ -101,7 +101,7 @@ ### Пре-билд -1. выполните комманду: +1. выполните команду: `docker run -d --name anix -p 3000:3000 radiquum/anix:latest` @@ -121,9 +121,9 @@ - -d - запустить контейнер в фоне - --restart always - всегда запускать после перезагрузки сервера - --name - название контейнера -- -p - порт контейнера который будет доступен из вне. ПОРТ:3000 +- -p - порт контейнера который будет доступен извне. ПОРТ:3000 ->[!NOTE] +> [!NOTE] > для переменных которые вы получили, если развёртывали [anix-player-parsers](./player-parsers/README.RU.md), необходимо использовать `-e ПЕРЕМЕННАЯ=ЗНАЧЕНИЕ` до слова anix [команда docker run](https://docs.docker.com/reference/cli/docker/container/run/) @@ -134,12 +134,12 @@ ### docker/Примечание -Для использования своего домена и поддержки протокола https, вы можете использовать traefik или другой reverse-proxy, с сертификатом SSL. +Для использования своего домена и поддержки протокола HTTPS, вы можете использовать Traefik или другой reverse-proxy, с сертификатом SSL. Полезные ссылки: - [Конвертер из команды docker run в синтакс для docker compose](https://it-tools.tech/docker-run-to-docker-compose-converter) -- [Как настроить traefik + свой домен + SSL](https://letmegooglethat.com/?q=how+to+setup+traefik+with+custom+domain+and+ssl+certificate+from+lets+encrypt%3F) +- [Как настроить Traefik + свой домен + SSL](https://letmegooglethat.com/?q=how+to+setup+traefik+with+custom+domain+and+ssl+certificate+from+lets+encrypt%3F) ## pm2 @@ -156,11 +156,11 @@ 3. Выполните команду `npm install` 4. (опционально) скопируйте .env.sample как .env и заполните его переменными которые вы получили, если развёртывали [anix-player-parsers](./player-parsers/README.RU.md) 5. Выполните команду `npm run build` -6. создайте новую директорию -7. переместите в созданную директорию - - директорию `public` в `./новая/public` - - директорию `.next/static` в `./новая/.next/static` - - файлы из `.next/standalone` в `./новая` +6. создайте новую директорию (далее будем использовать `<имя_новой_директории>` как её имя) +7. переместите в созданную директорию (`<имя_новой_директории>`) + - директорию `public` в `<имя_новой_директории>/public` + - директорию `.next/static` в `<имя_новой_директории>/.next/static` + - файлы из `.next/standalone` в `<имя_новой_директории>` 8. Переместитесь в созданную директорию и выполните команду `pm2 start server.js -n anix` ### pm2/Обозначения diff --git a/DEPLOYMENT.md b/DEPLOYMENT.md index bbc8a74..46f5a97 100644 --- a/DEPLOYMENT.md +++ b/DEPLOYMENT.md @@ -14,9 +14,9 @@ Requirements: 2. Log in to your Vercel account > [!IMPORTANT] - >Your Vercel account must be linked with your GitHub account. + > Your Vercel account must be linked with your GitHub account. > - >If you don't have a Vercel account, create one by signing in with GitHub. + > If you don't have a Vercel account, create one by signing in with GitHub. 3. Click the button to create a new project @@ -36,9 +36,9 @@ Requirements: ![vercel project settings](./docs/deploy/vercel_project.png) -6. Click the "Deploy" button and wait until you see a confirmation -7. Click the "Continue to Dashboard" button -8. The client will be available at a link of this form, click it to open +6. Click the "Deploy" button and wait until you see a confirmation +7. Click the "Continue to Dashboard" button +8. The client will be available at a link of this form, click it to open ![vercel project url](./docs/deploy/vercel_url.png) ## Netlify @@ -55,9 +55,9 @@ Requirements: 2. Log in to your Netlify account > [!IMPORTANT] - >Your Netlify account must be linked with your GitHub account. + > Your Netlify account must be linked with your GitHub account. > - >If you don't have a Netlify account, create one by signing in with GitHub. + > If you don't have a Netlify account, create one by signing in with GitHub. 3. Click the button to create a new project @@ -118,12 +118,12 @@ Additional Requirements: ### docker/Flags -- -d - run container in background +- -d - run container in the background - --restart always - always restart after server reboot - --name - container name - -p - container port to be exposed externally. PORT:3000 ->[!NOTE] +> [!NOTE] > For variables you received if you deployed [anix-player-parsers](./player-parsers/README.md), you need to use `-e VARIABLE=VALUE` before the word anix [docker run command](https://docs.docker.com/reference/cli/docker/container/run/) @@ -134,12 +134,12 @@ The service will be available at: `http://<:YOUR PORT>/` ### docker/Note -To use your own domain and support HTTPS protocol, you can use traefik or another reverse proxy with SSL certificate. +To use your own domain and support HTTPS protocol, you can use Traefik or another reverse proxy with SSL certificate. Useful links: - [Converter from docker run command to docker compose syntax](https://it-tools.tech/docker-run-to-docker-compose-converter) -- [How to setup traefik + custom domain + SSL](https://letmegooglethat.com/?q=how+to+setup+traefik+with+custom+domain+and+ssl+certificate+from+lets+encrypt%3F) +- [How to setup Traefik + custom domain + SSL](https://letmegooglethat.com/?q=how+to+setup+traefik+with+custom+domain+and+ssl+certificate+from+lets+encrypt%3F) ## pm2 @@ -156,12 +156,12 @@ Instructions: 3. Run the command `npm install` 4. (optional) copy `.env.sample` as `.env` and fill it with variables you received if you deployed [anix-player-parsers](./player-parsers/README.md) 5. Run the command `npm run build` -6. Create a new directory -7. Move into the new directory: - - move `public` directory to `./new/public` - - move `.next/static` directory to `./new/.next/static` - - move files from `.next/standalone` to `./new` -8. Move into the created directory and run the command `pm2 start server.js -n anix` +6. Create a new directory (next we will be refer to its name as ``) +7. Move the following files into the new directory (``): + - move `public` directory to `/public` + - move `.next/static` directory to `/.next/static` + - move files from `.next/standalone` to `` +8. Move into the created directory () and run the command `pm2 start server.js -n anix` ### pm2/Flags From be01230d0a1369dd463a79a528354fc23bf744cf Mon Sep 17 00:00:00 2001 From: Radiquum Date: Sat, 31 May 2025 12:39:10 +0500 Subject: [PATCH 57/58] chore/docs/player-parsers: fix spelling in README --- player-parsers/README.RU.md | 21 ++++++++++----------- player-parsers/README.md | 13 ++++++------- 2 files changed, 16 insertions(+), 18 deletions(-) diff --git a/player-parsers/README.RU.md b/player-parsers/README.RU.md index d6cd9a0..d206410 100644 --- a/player-parsers/README.RU.md +++ b/player-parsers/README.RU.md @@ -1,10 +1,10 @@ # AniX - Player Parsers -Данный под-проект позволяет получить прямые ссылки на видеофайлы с источников Sibnet, Kodik, Libria +Данный под-проект позволяет получить прямые ссылки на видеофайлы с источников Sibnet, Kodik, Anilibria (источник: libria) Он может использоваться как для основного проекта AniX, так и как отдельный сервис. -В основном проекте, парсеры используются для работы своего плеере, если вам не важна данная функция, вы можете не развёртывать данный суб-сервис. +В основном проекте, парсеры используются для работы своего плеера, если вам не важна данная функция, вы можете не развёртывать данный суб-сервис. Лицензия: [MIT](../LICENSE) @@ -22,7 +22,7 @@ - VIDEO_URL - ссылка на видео от источника - PLAYER_SOURCE - источник, один из: kodik, sibnet, libria ->[!NOTE] +> [!NOTE] > Если используется источник libria, ссылка должна быть ссылкой на API anilibria, а не на плеер Ответ: @@ -32,9 +32,10 @@ ## Развёртывание +> [!IMPORTANT] > В связи с спецификой источников, рекомендуется использовать виртуальный сервер в россии, т.к. они могут быть недоступны из других стран. > -> Из-за данной специфики, парсеры невозможно развернуть на edge сервисах, таких как CloudFlare Workers или Deno, а только на отдельном сервере. +> Из-за данной специфики, парсеры невозможно развернуть на edge сервисах, таких как Cloudflare Workers или Deno, а только на отдельном сервере. ### Docker @@ -44,7 +45,7 @@ ### Пре-билд -1. выполните комманду: +1. выполните команду: `docker run -d --name anix-player -p 7000:7000 radiquum/anix-player-parser:latest` @@ -65,7 +66,7 @@ - -d - запустить контейнер в фоне - --restart always - всегда запускать после перезагрузки сервера - --name - название контейнера -- -p - порт контейнера который будет доступен из вне. ПОРТ:7000 +- -p - порт контейнера который будет доступен извне. ПОРТ:7000 ### docker/После развёртывания @@ -73,14 +74,12 @@ ### docker/Примечание -Для использования своего домена и поддержки протокола https, вы можете использовать traefik или другой reverse-proxy, с сертификатом SSL. +Для использования своего домена и поддержки протокола HTTPS, вы можете использовать Traefik или другой reverse-proxy, с сертификатом SSL. Полезные ссылки: - [Конвертер из команды docker run в синтакс для docker compose](https://it-tools.tech/docker-run-to-docker-compose-converter) -- [Как настроить traefik + свой домен + SSL](https://letmegooglethat.com/?q=how+to+setup+traefik+with+custom+domain+and+ssl+certificate+from+lets+encrypt%3F) - - +- [Как настроить Traefik + свой домен + SSL](https://letmegooglethat.com/?q=how+to+setup+traefik+with+custom+domain+and+ssl+certificate+from+lets+encrypt%3F) ### pm2 @@ -96,7 +95,7 @@ 2. Переместитесь в директорию репозитория `cd AniX` 3. Переместитесь в директорию парсеров `cd player-parsers` 4. Выполните команду `npm install` -5. После окончания, Выполните команду `pm2 start index.ts -n anix-player-parser` +5. После окончания и выполните команду `pm2 start index.ts -n anix-player-parser` ### pm2/Обозначения diff --git a/player-parsers/README.md b/player-parsers/README.md index ab6d023..c284ab0 100644 --- a/player-parsers/README.md +++ b/player-parsers/README.md @@ -32,9 +32,10 @@ Response: ## Deployment +> [!IMPORTANT] > Due to the nature of the sources, it is recommended to use a virtual server in Russia, as they may be inaccessible from other countries. > -> Because of this specificity, the parsers cannot be deployed on edge services like CloudFlare Workers or Deno, only on a dedicated server. +> Because of this specificity, the parsers cannot be deployed on edge services like Cloudflare Workers or Deno, only on a dedicated server. ### Docker @@ -62,7 +63,7 @@ Additional Requirements: ### docker/Legend -- -d - run the container in background +- -d - run container in the background - --restart always - always restart after server reboot - --name - container name - -p - container port accessible externally. PORT:7000 @@ -73,14 +74,12 @@ The service will be available at: `http://<:YOUR PORT>/` ### docker/Note -To use your own domain and support the https protocol, you can use traefik or another reverse-proxy with an SSL certificate. +To use your own domain and support the HTTPS protocol, you can use Traefik or another reverse-proxy with an SSL certificate. Useful links: - [Docker run to docker compose syntax converter](https://it-tools.tech/docker-run-to-docker-compose-converter) -- [How to setup traefik + custom domain + SSL](https://letmegooglethat.com/?q=how+to+setup+traefik+with+custom+domain+and+ssl+certificate+from+lets+encrypt%3F) - - +- [How to setup Traefik + custom domain + SSL](https://letmegooglethat.com/?q=how+to+setup+traefik+with+custom+domain+and+ssl+certificate+from+lets+encrypt%3F) ### pm2 @@ -96,7 +95,7 @@ Instructions: 2. Navigate to the repository directory `cd AniX` 3. Navigate to the parsers directory `cd player-parsers` 4. Run the command `npm install` -5. Once finished, Run the command `pm2 start index.ts -n anix-player-parser` +5. Once finished, run the command `pm2 start index.ts -n anix-player-parser` ### pm2/Legend From 9931962a6bb8bcedadacd32b45c43eb9ecda7896 Mon Sep 17 00:00:00 2001 From: Radiquum Date: Sat, 31 May 2025 12:46:20 +0500 Subject: [PATCH 58/58] chore/docs: update --- DEPLOYMENT.RU.md | 16 ++++++++-------- DEPLOYMENT.md | 16 ++++++++-------- player-parsers/README.md | 4 ++-- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/DEPLOYMENT.RU.md b/DEPLOYMENT.RU.md index d7114be..78f43a3 100644 --- a/DEPLOYMENT.RU.md +++ b/DEPLOYMENT.RU.md @@ -13,10 +13,10 @@ 2. Войдите в аккаунт Vercel - > [!IMPORTANT] - > Аккаунт Vercel должен быть связан с аккаунтом GitHub. - > - > Если у вас нет аккаунта Vercel, то создайте его через вход с помощью GitHub. +> [!IMPORTANT] +> Аккаунт Vercel должен быть связан с аккаунтом GitHub. +> +> Если у вас нет аккаунта Vercel, то создайте его через вход с помощью GitHub. 3. Нажмите кнопку создать новый проект @@ -54,10 +54,10 @@ 2. Войдите в аккаунт Netlify - > [!IMPORTANT] - > Аккаунт Netlify должен быть связан с аккаунтом GitHub. - > - > Если у вас нет аккаунта Netlify, то создайте его через вход с помощью GitHub. +> [!IMPORTANT] +> Аккаунт Netlify должен быть связан с аккаунтом GitHub. +> +> Если у вас нет аккаунта Netlify, то создайте его через вход с помощью GitHub. 3. Нажмите кнопку создать новый проект diff --git a/DEPLOYMENT.md b/DEPLOYMENT.md index 46f5a97..f7ae21b 100644 --- a/DEPLOYMENT.md +++ b/DEPLOYMENT.md @@ -13,10 +13,10 @@ Requirements: 2. Log in to your Vercel account - > [!IMPORTANT] - > Your Vercel account must be linked with your GitHub account. - > - > If you don't have a Vercel account, create one by signing in with GitHub. +> [!IMPORTANT] +> Your Vercel account must be linked with your GitHub account. +> +> If you don't have a Vercel account, create one by signing in with GitHub. 3. Click the button to create a new project @@ -54,10 +54,10 @@ Requirements: 2. Log in to your Netlify account - > [!IMPORTANT] - > Your Netlify account must be linked with your GitHub account. - > - > If you don't have a Netlify account, create one by signing in with GitHub. +> [!IMPORTANT] +> Your Netlify account must be linked with your GitHub account. +> +> If you don't have a Netlify account, create one by signing in with GitHub. 3. Click the button to create a new project diff --git a/player-parsers/README.md b/player-parsers/README.md index c284ab0..a0bc338 100644 --- a/player-parsers/README.md +++ b/player-parsers/README.md @@ -1,6 +1,6 @@ # AniX - Player Parsers -This sub-project allows obtaining direct video file links from sources Sibnet, Kodik, Libria +This sub-project allows obtaining direct video file links from sources Sibnet, Kodik, Anilibria (source: libria) It can be used both for the main AniX project and as a standalone service. @@ -22,7 +22,7 @@ where: - VIDEO_URL - the link to the video from the source - PLAYER_SOURCE - the source, one of: kodik, sibnet, libria ->[!NOTE] +> [!NOTE] > When using libria source, url should be the url to the anilibria api, not player directly Response: