Merge branch 'current' into feature/snapchat

Signed-off-by: Snazzah <7025343+Snazzah@users.noreply.github.com>
This commit is contained in:
Snazzah 2024-05-15 20:13:10 -05:00 committed by GitHub
commit 2110cae030
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
79 changed files with 1863 additions and 3074 deletions

View File

@ -1,11 +1,7 @@
version = 1
test_patterns = [
"src/test/test.js"
]
[[analyzers]]
name = "javascript"
enabled = true
[analyzers.meta]
environment = ["nodejs"]

View File

@ -1,14 +1,13 @@
FROM node:18-bullseye-slim
WORKDIR /app
RUN apt-get update
RUN apt-get install -y git
RUN rm -rf /var/lib/apt/lists/*
COPY package*.json ./
RUN npm install
RUN git clone -n https://github.com/wukko/cobalt.git --depth 1 && mv cobalt/.git ./ && rm -rf cobalt
RUN apt-get update && \
apt-get install -y git python3 build-essential && \
npm install && \
apt purge --autoremove -y python3 build-essential && \
rm -rf ~/.cache/ /var/lib/apt/lists/*
COPY . .
EXPOSE 9000

View File

@ -1,7 +1,7 @@
# cobalt
best way to save what you love: [cobalt.tools](https://cobalt.tools/)
![cobalt logo with repeated logo (double arrow) pattern background](https://raw.githubusercontent.com/wukko/cobalt/current/src/front/icons/pattern.png "cobalt logo with repeated logo (double arrow) pattern background")
![cobalt logo with repeated logo (double arrow) pattern background](/src/front/icons/pattern.png "cobalt logo with repeated logo (double arrow) pattern background")
## what's cobalt?
cobalt is a media downloader that doesn't piss you off. it's fast, friendly, and doesn't have any bullshit that modern web is filled with: ***no ads, trackers, or invasive analytics***.
@ -43,7 +43,7 @@ this list is not final and keeps expanding over time. if support for a service y
| service | notes or features |
| :-------- | :----- |
| instagram | supports photos, videos, and stories. lets you pick what to save from multi-media posts. |
| pinterest | supports videos and stories. |
| pinterest | supports photos, gifs, videos and stories. |
| reddit | supports gifs and videos. |
| snapchat | supports spotlights and stories. lets you pick what to save from stories. |
| soundcloud | supports private links. |
@ -53,12 +53,15 @@ this list is not final and keeps expanding over time. if support for a service y
| youtube | supports videos, music, and shorts. 8K, 4K, HDR, VR, and high FPS videos. rich metadata & dubs. h264/av1/vp9 codecs. |
## cobalt api
cobalt has an open api that you can use in projects *for completely free~*. it's easy and straightforward to use, [check out the docs](https://github.com/wukko/cobalt/blob/current/docs/api.md) to learn how to use it.
cobalt has an open api that you can use in your projects *for free~*. it's easy and straightforward to use, [check out the docs](/docs/api.md) to learn how to use it.
you can use the main api instance ([co.wuk.sh](https://co.wuk.sh/)) in your projects.
✅ you can use the main api instance ([co.wuk.sh](https://co.wuk.sh/)) in your **personal** projects.
❌ you cannot use the free api commercially (anywhere that's gated behind paywalls or ads). host your own instance for this.
we reserve the right to restrict abusive/excessive access to the main instance api.
## how to run your own instance
if you want to run your own instance for whatever purpose, [follow this guide](https://github.com/wukko/cobalt/blob/current/docs/run-an-instance.md).
if you want to run your own instance for whatever purpose, [follow this guide](/docs/run-an-instance.md).
it's *highly* recommended to use a docker compose method unless you run for developing/debugging purposes.
## sponsors
@ -70,7 +73,7 @@ cobalt is a tool for easing content downloads from internet and takes ***zero li
cobalt is ***NOT*** a piracy tool and cannot be used as such. it can only download free, publicly accessible content. such content can be easily downloaded through any browser's dev tools. pressing one button is easier, so i made a convenient, ad-less tool for such repeated actions.
## cobalt license
cobalt code is licensed under [AGPL-3.0](https://github.com/wukko/cobalt/blob/current/LICENSE).
cobalt code is licensed under [AGPL-3.0](/LICENSE).
cobalt branding, mascots, and other related assets included in the repo are ***copyrighted*** and not covered by the AGPL-3.0 license. you ***cannot*** use them under same terms.

View File

@ -32,7 +32,7 @@ Content-Type: application/json
| `dubLang` | `boolean` | `true / false` | `false` | backend uses Accept-Language header for youtube video audio tracks when `true`. |
| `disableMetadata` | `boolean` | `true / false` | `false` | disables file metadata when set to `true`. |
| `twitterGif` | `boolean` | `true / false` | `false` | changes whether twitter gifs are converted to .gif |
| `vimeoDash` | `boolean` | `true / false` | `false` | changes whether streamed file type is preferred for vimeo videos. |
| `tiktokH265` | `boolean` | `true / false` | `false` | changes whether 1080p h265 videos are preferred or not. |
### response body variables
| key | type | variables |
@ -59,7 +59,7 @@ from a successful call to `/api/json`. however, the parameters passed to it are
and **unmodifiable** from your (the api client's) perspective, and can change between versions.
therefore you don't need to worry about what they mean - but if you really want to know, you can
[read the source code](../src/modules/stream/manage.js).
[read the source code](/src/modules/stream/manage.js).
## GET: `/api/serverInfo`
returns current basic server info.

View File

@ -2,7 +2,13 @@
"instagram": [
"mid=<replace>; ig_did=<with>; csrftoken=<your>; ds_user_id=<own>; sessionid=<cookies>"
],
"instagram_bearer": [
"token=<token_with_no_bearer_in_front>", "token=IGT:2:<looks_like_this>"
],
"reddit": [
"client_id=<replace_this>; client_secret=<replace_this>; refresh_token=<replace_this>"
],
"twitter": [
"auth_token=<replace_this>; ct0=<replace_this>"
]
}

View File

@ -2,7 +2,7 @@ version: '3.5'
services:
cobalt-api:
image: ghcr.io/wukko/cobalt:7
image: ghcr.io/imputnet/cobalt:7
restart: unless-stopped
container_name: cobalt-api
@ -21,6 +21,8 @@ services:
API_URL: "https://co.wuk.sh/"
# replace eu-nl with your instance's distinctive name
API_NAME: "eu-nl"
# if you want to use cookies when fetching data from services, uncomment the next line and the lines under volume
# COOKIE_PATH: "/cookies.json"
# see docs/run-an-instance.md for more information
labels:
- com.centurylinklabs.watchtower.scope=cobalt
@ -30,7 +32,7 @@ services:
#- ./cookies.json:/cookies.json
cobalt-web:
image: ghcr.io/wukko/cobalt:7
image: ghcr.io/imputnet/cobalt:7
restart: unless-stopped
container_name: cobalt-web

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

View File

@ -18,7 +18,7 @@ if you need help with installing docker, follow *only the first step* of these t
```
i'm using `nano` in this example, it may not be available in your distro. you can use any other text editor.
3. copy and paste the [sample config from here](https://github.com/wukko/cobalt/blob/current/docs/examples/docker-compose.example.yml) for either web or api instance (or both, if you wish) and edit it to your needs.
3. copy and paste the [sample config from here](examples/docker-compose.example.yml) for either web or api instance (or both, if you wish) and edit it to your needs.
make sure to replace default URLs with your own or cobalt won't work correctly.
4. finally, start the cobalt container (from cobalt directory):
@ -26,7 +26,7 @@ if you need help with installing docker, follow *only the first step* of these t
docker compose up -d
```
if you want your instance to support services that require authentication to view public content, create `cookies.json` file in the same directory as `docker-compose.yml`. example cookies file [can be found here](https://github.com/wukko/cobalt/blob/current/docs/examples/cookies.example.json).
if you want your instance to support services that require authentication to view public content, create `cookies.json` file in the same directory as `docker-compose.yml`. example cookies file [can be found here](examples/cookies.example.json).
cobalt package will update automatically thanks to watchtower.
@ -53,6 +53,7 @@ sudo service nscd start
| variable name | default | example | description |
|:----------------------|:----------|:------------------------|:------------|
| `API_PORT` | `9000` | `9000` | changes port from which api server is accessible. |
| `API_LISTEN_ADDRESS` | `0.0.0.0` | `127.0.0.1` | changes address from which api server is accessible. **if you are using docker, you usually don't need to configure this.** |
| `API_URL` | | `https://co.wuk.sh/` | changes url from which api server is accessible. <br> ***REQUIRED TO RUN API***. |
| `API_NAME` | `unknown` | `ams-1` | api server name that is shown in `/api/serverInfo`. |
| `CORS_WILDCARD` | `1` | `0` | toggles cross-origin resource sharing. <br> `0`: disabled. `1`: enabled. |
@ -60,6 +61,7 @@ sudo service nscd start
| `COOKIE_PATH` | not used | `/cookies.json` | path for cookie file relative to main folder. |
| `PROCESSING_PRIORITY` | not used | `10` | changes `nice` value* for ffmpeg subprocess. available only on unix systems. |
| `TIKTOK_DEVICE_INFO` | | *see below* | device info (including `iid` and `device_id`) for tiktok functionality. required for tiktok to work. |
| `FREEBIND_CIDR` | | `2001:db8::/32` | IPv6 prefix used for randomly assigning addresses to cobalt requests. only supported on linux systems. for more info, see below. |
\* the higher the nice value, the lower the priority. [read more here](https://en.wikipedia.org/wiki/Nice_(Unix)).
@ -85,6 +87,12 @@ you can compress the json to save space. if you're using a `.env` file then the
TIKTOK_DEVICE_INFO='{"iid":"<install_id here>","device_id":"<device_id here>","channel":"googleplay","app_name":"musical_ly","version_code":"310503","device_platform":"android","device_type":"Redmi+7","os_version":"13"}'
```
#### FREEBIND_CIDR
setting a `FREEBIND_CIDR` allows cobalt to pick a random IP for every download and use it for all
requests it makes for that particular download. to use freebind in cobalt, you need to follow its [setup instructions](https://github.com/imputnet/freebind.js?tab=readme-ov-file#setup) first. if you configure this option while running cobalt
in a docker container, you also need to set the `API_LISTEN_ADDRESS` env to `127.0.0.1`, and set
`network_mode` for the container to `host`.
### variables for web
| variable name | default | example | description |
|:---------------------|:---------------------|:------------------------|:--------------------------------------------------------------------------------------|

View File

@ -5,29 +5,33 @@
if any issues occur while using cobalt, you can fix many of them yourself. this document aims to provide guides on how to fix most complicated of them.
use wiki navigation on right to jump between solutions.
## how to fix clipboard pasting in firefox
## how to fix clipboard pasting in older versions of firefox
```
🎉 firefox finally supports pasting by default starting from version 125.
👍 you don't need to follow this tutorial if you're on the latest version of firefox.
```
you can fix this issue by changing a single preference in `about:config`.
### steps to enable clipboard functionality
1. go to `about:config`:
![screenshot showing about:config entered into address bar](https://github.com/wukko/cobalt/assets/71202418/9ad78612-a372-4949-aeac-99dfc41e273c)
![screenshot showing about:config entered into address bar](images/troubleshooting/clipboard/config.png)
2. if asked, read what firefox has to say and press "accept the risk and continue".
⚠ tinkering with other preferences may break your browser. **do not** edit them unless you know what you're doing.
![screenshot showing about:config security warning that reads: "proceed with caution. changing advanced configuration preferences can impact firefox performance or security." lower there's a pre-checked checkbox that says: "warn me when i attempt to access these preferences". lowest element is a blue button that says "accept the risk and continue"](https://github.com/wukko/cobalt/assets/71202418/02328729-dbfe-4ea4-b2ca-7bcf1998c2ca)
![screenshot showing about:config security warning that reads: "proceed with caution. changing advanced configuration preferences can impact firefox performance or security." lower there's a pre-checked checkbox that says: "warn me when i attempt to access these preferences". lowest element is a blue button that says "accept the risk and continue"](images/troubleshooting/clipboard/risk.png)
3. search for `dom.events.asyncClipboard.readText`
![screenshot showing "dom.events.asyncclipboard.readtext" entered into search on about:config page](https://github.com/wukko/cobalt/assets/71202418/7c7f7e3c-6a6a-40df-8436-277489e72e0b)
![screenshot showing "dom.events.asyncclipboard.readtext" entered into search on about:config page](images/troubleshooting/clipboard/search.png)
4. press the toggle button on very right.
![screenshot showing "dom.events.asyncclipboard.readtext" preference on about:config page with highlighted toggle button on very right](https://github.com/wukko/cobalt/assets/71202418/b45db18e-f4bf-4f1c-9a8c-f13a63a21335)
![screenshot showing "dom.events.asyncclipboard.readtext" preference on about:config page with highlighted toggle button on very right](images/troubleshooting/clipboard/toggle.png)
5. "false" should change to "true".
![screenshot showing "dom.events.asyncclipboard.readtext" preference on about:config page, this one with "true" text highlighted](https://github.com/wukko/cobalt/assets/71202418/4869b4ff-8385-4cd3-ae59-aa2e03a58b5f)
![screenshot showing "dom.events.asyncclipboard.readtext" preference on about:config page, this one with "true" text highlighted](images/troubleshooting/clipboard/toggled.png)
6. go back to cobalt, reload the page, press `paste and download` button again. this time it works! enjoy simpler downloading experience :)
6. go back to cobalt, reload the page, press `paste` button again. this time it works! enjoy simpler downloading experience :)

View File

@ -1,8 +1,8 @@
{
"name": "cobalt",
"description": "save what you love",
"version": "7.12.4",
"author": "wukko",
"version": "7.13.3",
"author": "imput",
"exports": "./src/cobalt.js",
"type": "module",
"engines": {
@ -17,13 +17,13 @@
},
"repository": {
"type": "git",
"url": "git+https://github.com/wukko/cobalt.git"
"url": "git+https://github.com/imputnet/cobalt.git"
},
"license": "AGPL-3.0",
"bugs": {
"url": "https://github.com/wukko/cobalt/issues"
"url": "https://github.com/imputnet/cobalt/issues"
},
"homepage": "https://github.com/wukko/cobalt#readme",
"homepage": "https://github.com/imputnet/cobalt#readme",
"dependencies": {
"content-disposition-header": "0.6.0",
"cors": "^2.8.5",
@ -38,8 +38,11 @@
"node-cache": "^5.1.2",
"psl": "1.9.0",
"set-cookie-parser": "2.6.0",
"undici": "^6.7.0",
"undici": "^5.19.1",
"url-pattern": "1.0.3",
"youtubei.js": "^9.2.0"
"youtubei.js": "^9.3.0"
},
"optionalDependencies": {
"freebind": "^0.2.2"
}
}

View File

@ -6,6 +6,7 @@ import express from "express";
import { Bright, Green, Red } from "./modules/sub/consoleText.js";
import { getCurrentBranch, shortCommit } from "./modules/sub/currentCommit.js";
import { loadLoc } from "./localization/manager.js";
import { mode } from "./modules/config.js"
import path from 'path';
import { fileURLToPath } from 'url';
@ -22,13 +23,10 @@ app.disable('x-powered-by');
await loadLoc();
const apiMode = process.env.API_URL && !process.env.WEB_URL;
const webMode = process.env.WEB_URL && process.env.API_URL;
if (apiMode) {
if (mode === 'API') {
const { runAPI } = await import('./core/api.js');
runAPI(express, app, gitCommit, gitBranch, __dirname)
} else if (webMode) {
} else if (mode === 'WEB') {
const { runWeb } = await import('./core/web.js');
await runWeb(express, app, gitCommit, gitBranch, __dirname)
} else {

View File

@ -3,9 +3,6 @@
"maxVideoDuration": 10800000,
"genericUserAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36",
"authorInfo": {
"name": "wukko",
"link": "https://wukko.me/",
"contact": "https://wukko.me/contacts",
"support": {
"default": {
"email": {

View File

@ -4,18 +4,18 @@ import { randomBytes } from "crypto";
const ipSalt = randomBytes(64).toString('hex');
import { version } from "../modules/config.js";
import { env, version } from "../modules/config.js";
import { getJSON } from "../modules/api.js";
import { apiJSON, checkJSONPost, getIP, languageCode } from "../modules/sub/utils.js";
import { Bright, Cyan } from "../modules/sub/consoleText.js";
import stream from "../modules/stream/stream.js";
import loc from "../localization/manager.js";
import { generateHmac } from "../modules/sub/crypto.js";
import { verifyStream } from "../modules/stream/manage.js";
import { verifyStream, getInternalStream } from "../modules/stream/manage.js";
export function runAPI(express, app, gitCommit, gitBranch, __dirname) {
const corsConfig = process.env.CORS_WILDCARD === '0' ? {
origin: process.env.CORS_URL,
const corsConfig = !env.corsWildcard ? {
origin: env.corsURL,
optionsSuccessStatus: 200
} : {};
@ -25,7 +25,7 @@ export function runAPI(express, app, gitCommit, gitBranch, __dirname) {
standardHeaders: true,
legacyHeaders: false,
keyGenerator: req => generateHmac(getIP(req), ipSalt),
handler: (req, res, next, opt) => {
handler: (req, res) => {
return res.status(429).json({
"status": "rate-limit",
"text": loc(languageCode(req), 'ErrorRateLimit')
@ -38,7 +38,7 @@ export function runAPI(express, app, gitCommit, gitBranch, __dirname) {
standardHeaders: true,
legacyHeaders: false,
keyGenerator: req => generateHmac(getIP(req), ipSalt),
handler: (req, res, next, opt) => {
handler: (req, res) => {
return res.status(429).json({
"status": "rate-limit",
"text": loc(languageCode(req), 'ErrorRateLimit')
@ -123,42 +123,53 @@ export function runAPI(express, app, gitCommit, gitBranch, __dirname) {
app.get('/api/:type', (req, res) => {
try {
let j;
switch (req.params.type) {
case 'stream':
const q = req.query;
const checkQueries = q.t && q.e && q.h && q.s && q.i;
const checkBaseLength = q.t.length === 21 && q.e.length === 13;
const checkSafeLength = q.h.length === 43 && q.s.length === 43 && q.i.length === 22;
if (checkQueries && checkBaseLength && checkSafeLength) {
if (q.p) {
return res.status(200).json({
status: "continue"
})
}
let streamInfo = verifyStream(q.t, q.h, q.e, q.s, q.i);
if (streamInfo.error) {
return res.status(streamInfo.status).json(apiJSON(0, { t: streamInfo.error }).body);
}
if (q.p) {
return res.status(200).json({
status: "continue"
});
}
return stream(res, streamInfo);
} else {
let j = apiJSON(0, {
}
j = apiJSON(0, {
t: "bad request. stream link may be incomplete or corrupted."
})
return res.status(j.status).json(j.body);
}
case 'istream':
if (!req.ip.endsWith('127.0.0.1'))
return res.sendStatus(403);
if (('' + req.query.t).length !== 21)
return res.sendStatus(400);
let streamInfo = getInternalStream(req.query.t);
if (!streamInfo) return res.sendStatus(404);
streamInfo.headers = req.headers;
return stream(res, { type: 'internal', ...streamInfo });
case 'serverInfo':
return res.status(200).json({
version: version,
commit: gitCommit,
branch: gitBranch,
name: process.env.API_NAME || "unknown",
url: process.env.API_URL,
cors: process.env?.CORS_WILDCARD === "0" ? 0 : 1,
name: env.apiName,
url: env.apiURL,
cors: Number(env.corsWildcard),
startTime: `${startTimestamp}`
});
default:
let j = apiJSON(0, {
j = apiJSON(0, {
t: "unknown response type"
})
return res.status(j.status).json(j.body);
@ -183,12 +194,12 @@ export function runAPI(express, app, gitCommit, gitBranch, __dirname) {
res.redirect('/api/json')
});
app.listen(process.env.API_PORT || 9000, () => {
app.listen(env.apiPort, env.listenAddress, () => {
console.log(`\n` +
`${Cyan("cobalt")} API ${Bright(`v.${version}-${gitCommit} (${gitBranch})`)}\n` +
`Start time: ${Bright(`${startTime.toUTCString()} (${startTimestamp})`)}\n\n` +
`URL: ${Cyan(`${process.env.API_URL}`)}\n` +
`Port: ${process.env.API_PORT || 9000}\n`
`URL: ${Cyan(`${env.apiURL}`)}\n` +
`Port: ${env.apiPort}\n`
)
});
}

View File

@ -1,4 +1,4 @@
import { genericUserAgent, version } from "../modules/config.js";
import { version, env } from "../modules/config.js";
import { apiJSON, languageCode } from "../modules/sub/utils.js";
import { Bright, Cyan } from "../modules/sub/consoleText.js";
@ -67,7 +67,7 @@ export async function runWeb(express, app, gitCommit, gitBranch, __dirname) {
return res.status(200).end()
});
app.get("/", (req, res) => {
return res.sendFile(`${__dirname}/${findRendered(languageCode(req), req.header('user-agent') ? req.header('user-agent') : genericUserAgent)}`)
return res.sendFile(`${__dirname}/${findRendered(languageCode(req))}`)
});
app.get("/favicon.ico", (req, res) => {
return res.sendFile(`${__dirname}/src/front/icons/favicon.ico`)
@ -76,12 +76,12 @@ export async function runWeb(express, app, gitCommit, gitBranch, __dirname) {
return res.redirect('/')
});
app.listen(process.env.WEB_PORT || 9001, () => {
app.listen(env.webPort, () => {
console.log(`\n` +
`${Cyan("cobalt")} WEB ${Bright(`v.${version}-${gitCommit} (${gitBranch})`)}\n` +
`Start time: ${Bright(`${startTime.toUTCString()} (${startTimestamp})`)}\n\n` +
`URL: ${Cyan(`${process.env.WEB_URL}`)}\n` +
`Port: ${process.env.WEB_PORT || 9001}\n`
`URL: ${Cyan(`${env.webURL}`)}\n` +
`Port: ${env.webPort}\n`
)
})
}

View File

@ -6,47 +6,15 @@
--inset-focus: 0 0 0 0.1rem var(--accent) inset;
--inset-focus-inv: 0 0 0 0.15rem var(--background) inset;
--font-mono: 'Noto Sans Mono', 'Consolas', 'SF Mono', monospace;
--padding-1: 0.75rem;
--padding: 0.7rem;
--padding-small: 0.2rem;
--padding-dialog: 18px;
--line-height: 1.65rem;
--red: rgb(249, 47, 96);
--blue: rgb(47, 138, 249);
--gap: 0.5rem;
--gap-no-icon: 0.6rem;
}
@media (prefers-color-scheme: dark) {
:root {
--accent: rgb(225, 225, 225);
--accent-highlight: rgb(225, 225, 225, 4%);
--accent-subtext: rgb(110, 110, 110);
--accent-hover: rgb(30, 30, 30);
--accent-hover-elevated: rgb(48, 48, 48);
--accent-hover-transparent: rgba(48, 48, 48, 0.5);
--accent-button: rgb(25, 25, 25);
--accent-button-elevated: rgb(42, 42, 42);
--glass: rgba(25, 25, 25, 0.85);
--glass-lite: rgba(25, 25, 25, 0.98);
--subbackground: rgb(10, 10, 10);
--background: rgb(0, 0, 0);
--background-backdrop: rgba(0, 0, 0, 0.5);
}
}
@media (prefers-color-scheme: light) {
:root {
--accent: rgb(25, 25, 25);
--accent-highlight: rgb(25, 25, 25, 4%);
--accent-subtext: rgb(110, 110, 110);
--accent-hover: rgb(225, 225, 225);
--accent-hover-elevated: rgb(210, 210, 210);
--accent-hover-transparent: rgba(215, 215, 215, 0.5);
--accent-button: rgb(232, 232, 232);
--accent-button-elevated: rgb(215, 215, 215);
--glass: rgba(232, 232, 232, 0.85);
--glass-lite: rgba(232, 232, 232, 0.98);
--subbackground: rgb(240, 240, 240);
--background: rgb(255, 255, 255);
--background-backdrop: rgba(255, 255, 255, 0.5);
}
}
[data-theme="dark"] {
--accent: rgb(225, 225, 225);
--accent-highlight: rgb(225, 225, 225, 4%);
@ -79,6 +47,7 @@
}
html,
body {
height: calc(100% + env(safe-area-inset-top) / 2);
margin: 0;
background: var(--background);
color: var(--accent);
@ -89,7 +58,6 @@ body {
overflow: hidden;
-ms-overflow-style: none;
scrollbar-width: none;
height: calc(100% + env(safe-area-inset-top)/2);
}
#home {
position: fixed;
@ -118,10 +86,10 @@ a {
align-items: center;
flex-direction: row;
flex-wrap: nowrap;
padding: calc(var(--gap) - 0.1rem) calc(var(--gap)*2 - 0.2rem) calc(var(--gap) - 0.1rem) var(--gap);
padding: calc(var(--gap) - 0.1rem) calc(var(--gap)*2 - var(--padding-small)) calc(var(--gap) - 0.1rem) var(--gap);
width: auto;
margin-right: var(--padding-1);
margin-bottom: var(--padding-1);
margin-right: var(--padding);
margin-bottom: var(--padding);
background: var(--accent-button);
}
.checkbox-label {
@ -133,7 +101,7 @@ a {
width: 20px;
height: 20px;
z-index: 0;
margin-right: var(--padding-1);
margin-right: var(--padding);
border: 0.15rem solid var(--accent);
}
[type="checkbox"]::before {
@ -241,7 +209,7 @@ button:active,
background: none;
border: var(--border-15);
color: var(--accent);
padding: 0.3rem 0.75rem 0.5rem;
padding: 0.3rem var(--padding) 0.5rem;
font-size: 1rem;
}
.mono {
@ -307,7 +275,7 @@ button:active,
#url-clear {
height: 100%;
background: none;
padding: 0 1rem 0.2rem;
padding: 0 1rem var(--padding-small);
transform: none;
font-size: 1rem;
box-shadow: none!important;
@ -320,8 +288,8 @@ button:active,
display: flex;
position: absolute;
width: 20px;
padding-top: 0.2rem;
left: 0.7rem;
padding-top: var(--padding-small);
left: var(--padding);
flex-wrap: nowrap;
color: var(--accent-subtext);
}
@ -350,7 +318,7 @@ button:active,
position: absolute;
display: flex;
justify-content: center;
padding-bottom: calc(env(safe-area-inset-bottom)/2 + 2rem);
padding-bottom: 2rem;
font-size: 0.9rem;
text-align: center;
}
@ -412,7 +380,7 @@ button:active,
max-height: 95%;
opacity: 0;
transform: translate(-50%,-48%)scale(.95);
box-shadow: 0 0 0 0.2rem var(--glass) inset,
box-shadow: 0 0 0 var(--padding-small) var(--glass) inset,
0 0 20px 0 var(--accent-hover-transparent);
}
.popup.visible {
@ -442,15 +410,15 @@ button:active,
.popup.small {
width: 21rem;
box-shadow: 0px 0px 60px 0px var(--accent-hover);
padding: 18px;
transform: translate(-50%,-50%)scale(.95);
padding: var(--padding-dialog);
transform: translate(-50%, -50%)scale(.95);
pointer-events: all;
border-radius: 22px;
}
.popup.small .popup-content-inner {
display: flex;
flex-direction: column;
gap: 18px;
gap: var(--padding-dialog);
width: 100%;
}
.popup.small.visible {
@ -507,7 +475,7 @@ button:active,
width: 100%;
max-height: 300px;
min-height: 210px;
margin-bottom: 0.7rem;
margin-bottom: var(--padding);
float: left;
background: var(--accent-hover);
display: flex;
@ -521,13 +489,13 @@ button:active,
.changelog-tags {
display: inline-flex;
align-items: center;
gap: 0.7rem;
padding-bottom: 0.7rem;
gap: var(--padding);
padding-bottom: var(--padding);
flex-wrap: wrap;
}
.changelog-tag-version {
font-size: 1rem;
padding: 0.15rem 0.7rem;
padding: 0.15rem 0.5rem;
}
.changelog-tag-date {
color: var(--accent-subtext);
@ -540,11 +508,11 @@ button:active,
padding-top: 0!important;
}
.desc-padding {
padding-bottom: 0.7rem;
padding-bottom: var(--padding);
}
#popup-subtitle {
font-size: 1.1rem;
padding-bottom: var(--padding-1);
padding-bottom: var(--padding);
}
.popup-desc,
.desc-error,
@ -562,9 +530,9 @@ button:active,
}
.popup-title {
font-size: 1.5rem;
line-height: 1.2em;
display: flex;
align-items: center;
line-height: 1em;
margin-bottom: 0.4rem;
margin-top: 0.4rem;
}
@ -581,12 +549,12 @@ button:active,
.popup-content-inner,
.tab-content-settings,
#picker-holder {
padding-top: calc(env(safe-area-inset-top)/2 + 4.7rem);
padding-bottom: calc(env(safe-area-inset-bottom)/2 + 4.8rem);
padding-top: calc(var(--padding) + 4rem);
padding-bottom: 4.8rem;
}
.tab-content-settings,
#tab-about-about .popup-content-inner {
padding-top: calc(env(safe-area-inset-top)/2 + 6rem);;
padding-top: 6rem;
}
.bullpadding {
padding-left: 0.58rem;
@ -594,11 +562,11 @@ button:active,
.popup-header {
position: absolute;
z-index: 999;
padding-top: calc(env(safe-area-inset-top)/2 + 1.7rem);
padding-top: calc(var(--padding) + 1rem);
width: 100%;
}
.settings-category {
padding-bottom: 0.7rem;
padding-bottom: var(--padding);
}
.separator {
float: left;
@ -616,13 +584,13 @@ button:active,
line-height: var(--line-height);
}
.bottom-margin {
margin-bottom: var(--padding-1)!important;
margin-bottom: var(--padding)!important;
}
.top-margin {
margin-top: var(--padding-1)!important;
margin-top: var(--padding)!important;
}
.top-margin-only {
margin-top: var(--padding-1)!important;
margin-top: var(--padding)!important;
margin-bottom: 0!important;
}
.no-margin {
@ -668,7 +636,7 @@ button:active,
cursor: pointer;
}
.switch.space-right {
margin-right: var(--padding-1);
margin-right: var(--padding);
}
.switch:focus {
box-shadow: var(--inset-focus) inset;
@ -738,12 +706,12 @@ button:active,
bottom: 0;
position: absolute;
width: 100%;
padding-top: 0.2rem;
padding-bottom: 1.7rem;
padding-top: var(--padding-small);
padding-bottom: calc(var(--padding) + 1rem);
}
.popup-tabs-child {
width: 100%;
padding: 0 0.2rem;
padding: 0 var(--padding-small);
}
.emoji, svg {
user-select: none;
@ -773,10 +741,10 @@ button:active,
justify-content: start;
flex-wrap: wrap;
align-content: space-around;
padding-top: calc(env(safe-area-inset-top)/2 + 7.6rem);
padding-bottom: calc(env(safe-area-inset-bottom)/2 + 4.8rem);
padding-left: 0.2rem;
padding-right: 0.2rem;
padding-top: 7.6rem;
padding-bottom: 4.8rem;
padding-left: var(--padding-small);
padding-right: var(--padding-small);
}
.imageBlock {
width: 100%;
@ -795,7 +763,7 @@ button:active,
}
#popup-picker .explanation {
margin-top: 0!important;
margin-bottom: var(--padding-1);
margin-bottom: var(--padding);
}
#cobalt-main-box #bottom button {
width: auto;
@ -807,7 +775,7 @@ button:active,
-webkit-user-select: none;
}
.collapse-header {
padding: 0.5rem var(--padding-1);
padding: 0.5rem var(--padding);
font-size: 0.95rem;
display: flex;
flex-direction: row;
@ -816,7 +784,7 @@ button:active,
background: var(--accent-button);
}
.collapse-header .emoji {
margin-right: var(--padding-1);
margin-right: var(--padding);
}
.collapse-indicator {
display: flex;
@ -836,7 +804,7 @@ button:active,
}
.collapse-body {
display: none;
padding: var(--padding-1);
padding: var(--padding);
padding-bottom: 1rem;
user-select: text;
-webkit-user-select: text;
@ -863,7 +831,7 @@ button:active,
display: flex;
justify-content: center;
align-items: center;
padding-top: calc(env(safe-area-inset-top) + 1rem);
padding-top: 1rem;
}
.urgent-text {
display: flex;
@ -943,7 +911,7 @@ button:active,
display: flex;
justify-content: center;
flex-wrap: wrap;
gap: 0.2rem 1rem;
gap: var(--padding-small) 1rem;
margin-bottom: 1rem;
}
.sponsored-logo svg {
@ -963,7 +931,7 @@ button:active,
align-items: center;
justify-content: flex-start;
gap: 1rem;
padding: 0.5rem 0.7rem;
padding: 0.5rem var(--padding);
}
.filename-item.line {
border-bottom: 0.1rem solid var(--accent-button-elevated);
@ -1079,7 +1047,7 @@ button:active,
}
@media screen and (max-width: 660px) {
#cobalt-main-box {
width: calc(100% - (0.7rem * 2));
width: calc(100% - (var(--padding) * 2));
}
}
/* mobile page */
@ -1101,14 +1069,11 @@ button:active,
#cobalt-main-box #bottom #audioMode button, #audioMode {
width: 100%;
}
#footer {
padding-bottom: calc(env(safe-area-inset-bottom)/2 + 1.5rem);
}
#footer-buttons {
flex-direction: column;
align-items: stretch;
width: 100%;
padding: 0 0.7rem;
padding: 0 var(--padding);
}
.footer-pair .footer-button {
width: 100%!important;
@ -1125,9 +1090,6 @@ button:active,
flex-direction: column;
gap: var(--gap);
}
.urgent-notice {
padding-top: calc(env(safe-area-inset-bottom)/2 + 1rem);
}
.popup,
.popup-header .glass-bkg,
.popup-tabs .glass-bkg,
@ -1149,14 +1111,13 @@ button:active,
transform: unset;
}
.popup.small {
width: calc(100% - 18px * 2);
width: calc(100% - var(--padding-dialog) * 2);
height: auto;
top: unset;
bottom: 0;
left: 0;
transform: none;
position: absolute;
padding-bottom: calc(env(safe-area-inset-bottom)/2 + 1.7rem);
transform: translateY(30rem);
}
#popup-download .popout-meowbalt {
@ -1199,14 +1160,106 @@ button:active,
max-height: 100%;
box-shadow: none;
}
.popup-tabs {
padding-bottom: calc(env(safe-area-inset-bottom)/2 + 1.5rem);
}
.popup-content-inner,
.tab-content-settings,
.popup-tabs-child,
.popup-header-contents {
padding-left: 0.7rem;
padding-right: 0.7rem;
padding-left: var(--padding);
padding-right: var(--padding);
}
.popup-content-inner,
.tab-content-settings,
#picker-holder {
padding-bottom: calc(var(--padding) + 3.5rem);
padding-top: calc(var(--padding) + 3rem - var(--padding-small));
}
#footer,
.popup-tabs {
padding-bottom: var(--padding);
}
.popup.small {
padding-bottom: var(--padding-dialog)
}
.urgent-notice {
padding-top: 1rem;
}
.popup-title {
margin-top: var(--padding-small);
}
.popup-header {
padding-top: var(--padding);
}
.tab-content-settings,
#tab-about-about .popup-content-inner {
padding-top: calc(5rem - var(--padding-small));
}
}
@media screen and (max-width: 535px) and (display-mode: standalone) {
.popup-header {
padding-top: max(
calc(env(safe-area-inset-top)),
var(--padding) + 1rem
);
}
.urgent-notice {
padding-top: max(
calc(env(safe-area-inset-top) - var(--padding-small)),
var(--padding)
);
}
#footer,
.popup-tabs {
padding-bottom: max(
calc(env(safe-area-inset-bottom) + var(--padding-small)),
var(--padding)
);
}
.popup.small {
padding-bottom: max(
calc(env(safe-area-inset-bottom) + var(--padding-small)),
var(--padding-dialog)
);
}
.popup-content-inner,
.tab-content-settings {
padding-top: max(
calc(env(safe-area-inset-top) + var(--padding) + var(--padding-small) + 2rem),
calc(var(--padding) + 4rem - var(--padding-small))
);
padding-bottom: max(
calc(env(safe-area-inset-bottom) + var(--padding) + 3rem),
calc(var(--padding) + var(--padding-small) * 2 + 3rem)
);
}
.tab-content-settings,
#tab-about-about .popup-content-inner {
padding-top: max(
calc(env(safe-area-inset-top) + var(--padding) + var(--padding-small) * 2 + 3rem),
calc(var(--padding) + 5rem)
);
}
#picker-holder {
padding-top: max(
calc(env(safe-area-inset-top) + var(--padding) + 5rem),
calc(var(--padding) * 2 + 6rem)
);
padding-bottom: max(
calc(env(safe-area-inset-bottom) + var(--padding) + 2rem),
calc(4rem - var(--padding) + var(--padding-small))
);
}
.android .popup-header {
padding-top: var(--padding);
}
.android .popup-content-inner,
.android .tab-content-settings,
.android #picker-holder {
padding-bottom: calc(var(--padding) + 3.5rem);
padding-top: calc(var(--padding) + 3rem - var(--padding-small));
}
.android .tab-content-settings,
.android #tab-about-about .popup-content-inner {
padding-top: calc(5rem - var(--padding-small));
}
}

View File

@ -1,25 +1,19 @@
const version = 42;
const ua = navigator.userAgent.toLowerCase();
const isIOS = ua.match("iphone os");
const isMobile = ua.match("android") || ua.match("iphone os");
const isSafari = ua.match("safari/");
const isFirefox = ua.match("firefox/");
const isOldFirefox = ua.match("firefox/") && ua.split("firefox/")[1].split('.')[0] < 103;
const regex = new RegExp(/https:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()!@:%_\+.~#?&\/\/=]*)/);
const notification = `<span class="notification-dot"></span>`;
const isIOS = ua.includes("iphone os") || (ua.includes("mac os") && navigator.maxTouchPoints > 0);
const isAndroid = ua.includes("android");
const isMobile = ua.includes("android") || isIOS;
const isSafari = ua.includes("safari/");
const isFirefox = ua.includes("firefox/");
const isOldFirefox = ua.includes("firefox/") && ua.split("firefox/")[1].split('.')[0] < 103;
const switchers = {
"theme": ["auto", "light", "dark"],
"vCodec": ["h264", "av1", "vp9"],
"vQuality": ["1080", "max", "2160", "1440", "720", "480", "360"],
"vQuality": ["720", "max", "2160", "1440", "1080", "480", "360", "240", "144"],
"aFormat": ["mp3", "best", "ogg", "wav", "opus"],
"dubLang": ["original", "auto"],
"vimeoDash": ["false", "true"],
"audioMode": ["false", "true"],
"filenamePattern": ["classic", "pretty", "basic", "nerdy"]
};
}
const checkboxes = [
"alwaysVisibleButton",
"downloadPopup",
@ -29,111 +23,216 @@ const checkboxes = [
"disableAnimations",
"disableMetadata",
"twitterGif",
"plausible_ignore"
];
const exceptions = { // used for mobile devices
"vQuality": "720"
};
const bottomPopups = ["error", "download"];
const pageQuery = new URLSearchParams(window.location.search);
"plausible_ignore",
"ytDub",
"tiktokH265"
]
const bottomPopups = ["error", "download"]
let store = {};
function fixApiUrl(url) {
const validLink = (link) => {
try {
return /^https:/i.test(new URL(link).protocol);
} catch {
return false
}
}
const fixApiUrl = (url) => {
return url.endsWith('/') ? url.slice(0, -1) : url
}
let apiURL = fixApiUrl(defaultApiUrl);
function changeApi(url) {
const changeApi = (url) => {
apiURL = fixApiUrl(url);
return true
}
function eid(id) {
const eid = (id) => {
return document.getElementById(id)
}
function sGet(id) {
const sGet = (id) =>{
return localStorage.getItem(id)
}
function sSet(id, value) {
const sSet = (id, value) => {
localStorage.setItem(id, value)
}
function enable(id) {
eid(id).dataset.enabled = "true";
const lazyGet = (key) => {
const value = sGet(key);
if (key in switchers) {
if (switchers[key][0] !== value)
return value;
} else if (checkboxes.includes(key)) {
if (value === 'true')
return true;
}
}
function disable(id) {
eid(id).dataset.enabled = "false";
}
function vis(state) {
return (state === 1) ? "visible" : "hidden";
}
function opposite(state) {
return state === "true" ? "false" : "true";
}
function changeDownloadButton(action, text) {
const changeDownloadButton = (action, text) => {
switch (action) {
case 0:
case "hidden": // hidden, but only visible when alwaysVisibleButton is true
eid("download-button").disabled = true
if (sGet("alwaysVisibleButton") === "true") {
eid("download-button").value = text
eid("download-button").value = '>>'
eid("download-button").style.padding = '0 1rem'
} else {
eid("download-button").value = ''
eid("download-button").style.padding = '0'
}
break;
case 1:
eid("download-button").disabled = false
eid("download-button").value = text
eid("download-button").style.padding = '0 1rem'
break;
case 2:
case "disabled":
eid("download-button").disabled = true
eid("download-button").value = text
eid("download-button").style.padding = '0 1rem'
break;
}
}
document.addEventListener("keydown", (event) => {
if (event.key === "Tab") {
default:
eid("download-button").disabled = false
eid("download-button").value = '>>'
eid("download-button").style.padding = '0 1rem'
break;
}
})
function button() {
let regexTest = regex.test(eid("url-input-area").value);
}
const button = () => {
let regexTest = validLink(eid("url-input-area").value);
eid("url-clear").style.display = "none";
if ((eid("url-input-area").value).length > 0) {
eid("url-clear").style.display = "block";
} else {
eid("url-clear").style.display = "none";
}
regexTest ? changeDownloadButton(1, '>>') : changeDownloadButton(0, '>>');
if (regexTest) {
changeDownloadButton()
} else {
changeDownloadButton("hidden")
}
}
function clearInput() {
const clearInput = () => {
eid("url-input-area").value = '';
button();
}
function copy(id, data) {
let e = document.getElementById(id);
e.classList.add("text-backdrop");
setTimeout(() => { e.classList.remove("text-backdrop") }, 600);
data ? navigator.clipboard.writeText(data) : navigator.clipboard.writeText(e.innerText);
const copy = (id, data) => {
let target = document.getElementById(id);
target.classList.add("text-backdrop");
setTimeout(() => {
target.classList.remove("text-backdrop")
}, 600);
if (data) {
navigator.clipboard.writeText(data)
} else {
navigator.clipboard.writeText(e.innerText)
}
}
async function share(url) {
try { await navigator.share({url: url}) } catch (e) {}
}
function detectColorScheme() {
const share = url => navigator?.share({ url }).catch(() => {});
const preferredColorScheme = () => {
let theme = "auto";
let localTheme = sGet("theme");
let isLightPreferred = false;
if (localTheme) {
theme = localTheme;
} else if (!window.matchMedia) {
theme = "dark"
}
document.documentElement.setAttribute("data-theme", theme);
if (window.matchMedia) {
isLightPreferred = window.matchMedia('(prefers-color-scheme: light)').matches;
}
if (theme === "auto") {
theme = isLightPreferred ? "light" : "dark"
}
return theme
}
function changeTab(evnt, tabId, tabClass) {
const changeStatusBarColor = () => {
const theme = preferredColorScheme();
const colors = {
"dark": "#000000",
"light": "#ffffff",
"dark-popup": "#151515",
"light-popup": "#ebebeb"
}
let state = store.isPopupOpen ? "dark-popup" : "dark";
if (theme === "light") {
state = store.isPopupOpen ? "light-popup" : "light";
}
document.querySelector('meta[name="theme-color"]').setAttribute('content', colors[state]);
}
const detectColorScheme = () => {
document.documentElement.setAttribute("data-theme", preferredColorScheme());
changeStatusBarColor();
}
if (window.matchMedia) {
window.matchMedia('(prefers-color-scheme: light)').addEventListener('change', () => {
changeStatusBarColor()
detectColorScheme()
})
}
const updateFilenamePreview = () => {
let videoFilePreview = ``;
let audioFilePreview = ``;
let resMatch = {
"max": "3840x2160",
"2160": "3840x2160",
"1440": "2560x1440",
"1080": "1920x1080",
"720": "1280x720",
"480": "854x480",
"360": "640x360",
}
switch(sGet("filenamePattern")) {
case "classic":
videoFilePreview = `youtube_dQw4w9WgXcQ_${resMatch[sGet('vQuality')]}_${sGet('vCodec')}`
+ `${sGet("muteAudio") === "true" ? "_mute" : ""}`
+ `.${sGet('vCodec') === "vp9" ? 'webm' : 'mp4'}`;
audioFilePreview = `youtube_dQw4w9WgXcQ_audio`
+ `.${sGet('aFormat') !== "best" ? sGet('aFormat') : 'opus'}`;
break;
case "basic":
videoFilePreview = `${loc.FilenamePreviewVideoTitle} `
+ `(${sGet('vQuality') === "max" ? "2160p" : `${sGet('vQuality')}p`}, `
+ `${sGet('vCodec')}${sGet("muteAudio") === "true" ? ", mute" : ""})`
+ `.${sGet('vCodec') === "vp9" ? 'webm' : 'mp4'}`;
audioFilePreview = `${loc.FilenamePreviewAudioTitle} - ${loc.FilenamePreviewAudioAuthor}`
+ `.${sGet('aFormat') !== "best" ? sGet('aFormat') : 'opus'}`;
break;
case "pretty":
videoFilePreview = `${loc.FilenamePreviewVideoTitle} `
+ `(${sGet('vQuality') === "max" ? "2160p" : `${sGet('vQuality')}p`}, ${sGet('vCodec')}, `
+ `${sGet("muteAudio") === "true" ? "mute, " : ""}youtube)`
+ `.${sGet('vCodec') === "vp9" ? 'webm' : 'mp4'}`;
audioFilePreview = `${loc.FilenamePreviewAudioTitle} - ${loc.FilenamePreviewAudioAuthor} (soundcloud)`
+ `.${sGet('aFormat') !== "best" ? sGet('aFormat') : 'opus'}`;
break;
case "nerdy":
videoFilePreview = `${loc.FilenamePreviewVideoTitle} `
+ `(${sGet('vQuality') === "max" ? "2160p" : `${sGet('vQuality')}p`}, ${sGet('vCodec')}, `
+ `${sGet("muteAudio") === "true" ? "mute, " : ""}youtube, dQw4w9WgXcQ)`
+ `.${sGet('vCodec') === "vp9" ? 'webm' : 'mp4'}`;
audioFilePreview = `${loc.FilenamePreviewAudioTitle} - ${loc.FilenamePreviewAudioAuthor} `
+ `(soundcloud, 1242868615)`
+ `.${sGet('aFormat') !== "best" ? sGet('aFormat') : 'opus'}`;
break;
}
eid("video-filename-text").innerHTML = videoFilePreview
eid("audio-filename-text").innerHTML = audioFilePreview
}
const changeTab = (evnt, tabId, tabClass) => {
if (tabId === "tab-settings-other") updateFilenamePreview();
let tabcontent = document.getElementsByClassName(`tab-content-${tabClass}`);
@ -149,46 +248,15 @@ function changeTab(evnt, tabId, tabClass) {
evnt.currentTarget.dataset.enabled = "true";
eid(tabId).dataset.enabled = "true";
eid(tabId).parentElement.scrollTop = 0;
if (tabId === "tab-about-changelog" && sGet("changelogStatus") !== `${version}`) notificationCheck("changelog");
if (tabId === "tab-about-about" && !sGet("seenAbout")) notificationCheck("about");
}
function expandCollapsible(evnt) {
const expandCollapsible = (evnt) => {
let classlist = evnt.currentTarget.parentNode.classList;
let c = "expanded";
!classlist.contains(c) ? classlist.add(c) : classlist.remove(c);
}
function notificationCheck(type) {
let changed = true;
switch (type) {
case "about":
sSet("seenAbout", "true");
break;
case "changelog":
sSet("changelogStatus", version)
break;
default:
changed = false;
}
if (changed && sGet("changelogStatus") === `${version}`) {
setTimeout(() => {
eid("about-footer").innerHTML = eid("about-footer").innerHTML.replace(notification, '');
eid("tab-button-about-changelog").innerHTML = eid("tab-button-about-changelog").innerHTML.replace(notification, '')
}, 900)
}
if (!sGet("seenAbout") && !eid("about-footer").innerHTML.includes(notification)) {
eid("about-footer").innerHTML = `${notification}${eid("about-footer").innerHTML}`;
}
if (sGet("changelogStatus") !== `${version}`) {
if (!eid("about-footer").innerHTML.includes(notification)) {
eid("about-footer").innerHTML = `${notification}${eid("about-footer").innerHTML}`;
}
if (!eid("tab-button-about-changelog").innerHTML.includes(notification)) {
eid("tab-button-about-changelog").innerHTML = `${notification}${eid("tab-button-about-changelog").innerHTML}`;
}
}
}
function hideAllPopups() {
const hideAllPopups = () => {
let filter = document.getElementsByClassName('popup');
for (let i = 0; i < filter.length; i++) {
filter[i].classList.remove("visible");
@ -201,13 +269,17 @@ function hideAllPopups() {
eid("picker-download").href = '/';
eid("picker-download").classList.remove("visible");
}
function popup(type, action, text) {
const popup = (type, action, text) => {
if (action === 1) {
hideAllPopups(); // hide the previous popup before showing a new one
store.isPopupOpen = true;
// if not a small popup, update status bar color to match the popup header
if (!bottomPopups.includes(type)) changeStatusBarColor();
switch (type) {
case "about":
let tabId = sGet("changelogStatus") !== `${version}` ? "changelog" : "about";
let tabId = "about";
if (text) tabId = text;
eid(`tab-button-${type}-${tabId}`).click();
break;
@ -265,36 +337,54 @@ function popup(type, action, text) {
}
} else {
store.isPopupOpen = false;
// reset status bar to base color
changeStatusBarColor();
if (type === "picker") {
eid("picker-download").href = '/';
eid("picker-download").classList.remove("visible");
eid("picker-holder").innerHTML = ''
}
}
if (bottomPopups.includes(type)) eid(`popup-${type}-container`).classList.toggle("visible");
if (bottomPopups.includes(type)) {
eid(`popup-${type}-container`).classList.toggle("visible");
}
eid("popup-backdrop").classList.toggle("visible");
eid(`popup-${type}`).classList.toggle("visible");
eid(`popup-${type}`).focus();
}
function changeSwitcher(li, b) {
if (b) {
if (!switchers[li].includes(b)) b = switchers[li][0];
sSet(li, b);
for (let i in switchers[li]) {
(switchers[li][i] === b) ? enable(`${li}-${b}`) : disable(`${li}-${switchers[li][i]}`)
const changeSwitcher = (switcher, state) => {
if (state) {
if (!switchers[switcher].includes(state)) {
state = switchers[switcher][0];
}
if (li === "theme") detectColorScheme();
if (li === "filenamePattern") updateFilenamePreview();
sSet(switcher, state);
for (let i in switchers[switcher]) {
if (switchers[switcher][i] === state) {
eid(`${switcher}-${state}`).dataset.enabled = "true";
} else {
let pref = switchers[li][0];
if (isMobile && exceptions[li]) pref = exceptions[li];
sSet(li, pref);
for (let i in switchers[li]) {
(switchers[li][i] === pref) ? enable(`${li}-${pref}`) : disable(`${li}-${switchers[li][i]}`)
eid(`${switcher}-${switchers[switcher][i]}`).dataset.enabled = "false";
}
}
if (switcher === "theme") detectColorScheme();
if (switcher === "filenamePattern") updateFilenamePreview();
} else {
let defaultValue = switchers[switcher][0];
sSet(switcher, defaultValue);
for (let i in switchers[switcher]) {
if (switchers[switcher][i] === defaultValue) {
eid(`${switcher}-${defaultValue}`).dataset.enabled = "true";
} else {
eid(`${switcher}-${switchers[switcher][i]}`).dataset.enabled = "false";
}
}
}
}
function checkbox(action) {
const checkbox = (action) => {
sSet(action, !!eid(action).checked);
switch(action) {
case "alwaysVisibleButton": button(); break;
@ -302,43 +392,158 @@ function checkbox(action) {
case "disableAnimations": eid("cobalt-body").classList.toggle('no-animation'); break;
}
}
function changeButton(type, text) {
const changeButton = (type, text) => {
switch (type) {
case 0: //error
case "error": //error
eid("url-input-area").disabled = false
eid("url-clear").style.display = "block";
changeDownloadButton(2, '!!');
changeDownloadButton("disabled", '!!');
popup("error", 1, text);
setTimeout(() => { changeButton(1); }, 2500);
setTimeout(() => { changeButton("default") }, 2500);
break;
case 1: //enable back
changeDownloadButton(1, '>>');
case "default": //enable back
changeDownloadButton();
eid("url-clear").style.display = "block";
eid("url-input-area").disabled = false
break;
case 2: //enable back + information popup
case "error-default": //enable back + information popup
popup("error", 1, text);
changeDownloadButton(1, '>>');
changeDownloadButton();
eid("url-clear").style.display = "block";
eid("url-input-area").disabled = false
break;
}
}
function internetError() {
const internetError = () => {
eid("url-input-area").disabled = false
changeDownloadButton(2, '!!');
setTimeout(() => { changeButton(1); }, 2500);
changeDownloadButton("disabled", '!!');
setTimeout(() => { changeButton("default") }, 2500);
popup("error", 1, loc.ErrorNoInternet);
}
function resetSettings() {
const resetSettings = () => {
localStorage.clear();
window.location.reload();
}
async function pasteClipboard() {
const download = async(url) => {
changeDownloadButton("disabled", '...');
eid("url-clear").style.display = "none";
eid("url-input-area").disabled = true;
let req = {
url,
vCodec: lazyGet("vCodec"),
vQuality: lazyGet("vQuality"),
aFormat: lazyGet("aFormat"),
filenamePattern: lazyGet("filenamePattern"),
isAudioOnly: lazyGet("audioMode"),
isTTFullAudio: lazyGet("fullTikTokAudio"),
isAudioMuted: lazyGet("muteAudio"),
disableMetadata: lazyGet("disableMetadata"),
dubLang: lazyGet("ytDub"),
twitterGif: lazyGet("twitterGif"),
tiktokH265: lazyGet("tiktokH265"),
}
let j = await fetch(`${apiURL}/api/json`, {
method: "POST",
body: JSON.stringify(req),
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
}
}).then(r => r.json()).catch(() => {});
if (!j) {
internetError();
return;
}
if ((j.status === "error" || j.status === "rate-limit") && j && j.text) {
changeButton("error", j.text);
return;
}
if (j.text && (!j.url || !j.picker)) {
if (j.status === "success") {
changeButton("error-default", j.text)
} else {
changeButton("error", loc.ErrorNoUrlReturned);
}
}
switch (j.status) {
case "redirect":
changeDownloadButton("disabled", '>>>');
setTimeout(() => { changeButton("default") }, 1500);
if (sGet("downloadPopup") === "true") {
popup('download', 1, j.url)
} else {
window.open(j.url, '_blank')
}
break;
case "stream":
changeDownloadButton("disabled", '?..');
let probeStream = await fetch(`${j.url}&p=1`).then(r => r.json()).catch(() => {});
if (!probeStream) return internetError();
if (probeStream.status !== "continue") {
changeButton("error", probeStream.text);
return;
}
changeDownloadButton("disabled", '>>>');
if (sGet("downloadPopup") === "true") {
popup('download', 1, j.url)
} else {
if (isMobile || isSafari) {
window.location.href = j.url;
} else {
window.open(j.url, '_blank');
}
}
setTimeout(() => { changeButton("default") }, 2500);
break;
case "picker":
if (j.audio && j.picker) {
changeDownloadButton("disabled", '>>>');
popup('picker', 1, {
audio: j.audio,
arr: j.picker,
type: j.pickerType
});
setTimeout(() => { changeButton("default") }, 2500);
} else if (j.picker) {
changeDownloadButton("disabled", '>>>');
popup('picker', 1, {
arr: j.picker,
type: j.pickerType
});
setTimeout(() => { changeButton("default") }, 2500);
} else {
changeButton("error", loc.ErrorNoUrlReturned);
}
break;
case "success":
changeButton("error-default", j.text);
break;
default:
changeButton("error", loc.ErrorUnknownStatus);
break;
}
}
const pasteClipboard = async() => {
try {
let t = await navigator.clipboard.readText();
if (regex.test(t)) {
eid("url-input-area").value = t;
let clipboard = await navigator.clipboard.readText();
let onlyURL = clipboard.match(/https:\/\/[^\s]+/g)
if (onlyURL) {
eid("url-input-area").value = onlyURL;
download(eid("url-input-area").value);
}
} catch (e) {
@ -353,204 +558,58 @@ async function pasteClipboard() {
if (doError) popup("error", 1, errorMessage);
}
}
async function download(url) {
changeDownloadButton(2, '...');
eid("url-clear").style.display = "none";
eid("url-input-area").disabled = true;
let req = {
url,
aFormat: sGet("aFormat").slice(0, 4),
filenamePattern: sGet("filenamePattern"),
dubLang: false
}
if (sGet("dubLang") === "auto") {
req.dubLang = true
} else if (sGet("dubLang") === "custom") {
req.dubLang = true
}
if (sGet("vimeoDash") === "true") req.vimeoDash = true;
if (sGet("audioMode") === "true") {
req.isAudioOnly = true;
if (sGet("fullTikTokAudio") === "true") req.isTTFullAudio = true; // audio tiktok full
} else {
req.vQuality = sGet("vQuality").slice(0, 4);
if (sGet("muteAudio") === "true") req.isAudioMuted = true;
if (url.includes("youtube.com/") || url.includes("/youtu.be/")) req.vCodec = sGet("vCodec").slice(0, 4);
}
if (sGet("disableMetadata") === "true") req.disableMetadata = true;
if (sGet("twitterGif") === "true") req.twitterGif = true;
let j = await fetch(`${apiURL}/api/json`, {
method: "POST",
body: JSON.stringify(req),
headers: { 'Accept': 'application/json', 'Content-Type': 'application/json' }
}).then((r) => { return r.json() }).catch((e) => { return false });
if (!j) {
internetError();
return
}
if (j && j.status !== "error" && j.status !== "rate-limit") {
if (j.text && (!j.url || !j.picker)) {
if (j.status === "success") {
changeButton(2, j.text)
} else changeButton(0, loc.ErrorNoUrlReturned);
}
switch (j.status) {
case "redirect":
changeDownloadButton(2, '>>>');
setTimeout(() => { changeButton(1); }, 1500);
sGet("downloadPopup") === "true" ? popup('download', 1, j.url) : window.open(j.url, '_blank');
break;
case "picker":
if (j.audio && j.picker) {
changeDownloadButton(2, '>>>');
popup('picker', 1, { audio: j.audio, arr: j.picker, type: j.pickerType });
setTimeout(() => { changeButton(1) }, 2500);
} else if (j.picker) {
changeDownloadButton(2, '>>>');
popup('picker', 1, { arr: j.picker, type: j.pickerType });
setTimeout(() => { changeButton(1) }, 2500);
} else {
changeButton(0, loc.ErrorNoUrlReturned);
}
break;
case "stream":
changeDownloadButton(2, '?..')
fetch(`${j.url}&p=1`).then(async (res) => {
let jp = await res.json();
if (jp.status === "continue") {
changeDownloadButton(2, '>>>');
if (sGet("downloadPopup") === "true") {
popup('download', 1, j.url)
} else {
if (isMobile || isSafari) {
window.location.href = j.url;
} else window.open(j.url, '_blank');
}
setTimeout(() => { changeButton(1) }, 2500);
} else {
changeButton(0, jp.text);
}
}).catch((error) => internetError());
break;
case "success":
changeButton(2, j.text);
break;
default:
changeButton(0, loc.ErrorUnknownStatus);
break;
}
} else if (j && j.text) {
changeButton(0, j.text);
}
}
async function loadCelebrationsEmoji() {
let bac = eid("about-footer").innerHTML;
const loadCelebrationsEmoji = async() => {
let aboutButtonBackup = eid("about-footer").innerHTML;
try {
let j = await fetch(`/onDemand?blockId=1`).then((r) => { if (r.status === 200) { return r.json() } else { return false } }).catch(() => { return false });
let j = await fetch(`/onDemand?blockId=1`).then(r => r.json()).catch(() => {});
if (j && j.status === "success" && j.text) {
eid("about-footer").innerHTML = eid("about-footer").innerHTML.replace('<img class="emoji" draggable="false" height="22" width="22" alt="🐲" src="emoji/dragon_face.svg" loading="lazy">', j.text);
eid("about-footer").innerHTML = eid("about-footer").innerHTML.replace(
`<img class="emoji"
draggable="false"
height="22"
width="22
alt="🐲"
src="emoji/dragon_face.svg"
loading="lazy">`,
j.text
)
}
} catch (e) {
eid("about-footer").innerHTML = bac;
} catch {
eid("about-footer").innerHTML = aboutButtonBackup;
}
}
async function loadOnDemand(elementId, blockId) {
let j = {};
const loadOnDemand = async(elementId, blockId) => {
store.historyButton = eid(elementId).innerHTML;
eid(elementId).innerHTML = `<div class="loader">...</div>`;
try {
if (store.historyContent) {
j = store.historyContent;
} else {
await fetch(`/onDemand?blockId=${blockId}`).then(async(r) => {
j = await r.json();
if (j && j.status === "success") {
store.historyContent = j;
} else throw new Error();
}).catch(() => { throw new Error() });
if (!store.historyContent) {
let j = await fetch(`/onDemand?blockId=${blockId}`).then(r => r.json()).catch(() => {});
if (!j) throw new Error();
if (j.status === "success") {
store.historyContent = j.text
}
if (j.text) {
eid(elementId).innerHTML = `<button class="switch bottom-margin" onclick="restoreUpdateHistory()">${loc.ChangelogPressToHide}</button>${j.text}`;
} else throw new Error()
} catch (e) {
}
eid(elementId).innerHTML =
`<button class="switch bottom-margin" onclick="restoreUpdateHistory()">
${loc.ChangelogPressToHide}
</button>
${store.historyContent}`;
} catch {
eid(elementId).innerHTML = store.historyButton;
internetError()
}
}
function restoreUpdateHistory() {
const restoreUpdateHistory = () => {
eid("changelog-history").innerHTML = store.historyButton;
}
function unpackSettings(b64) {
let changed = null;
try {
let settingsToImport = JSON.parse(atob(b64));
let currentSettings = JSON.parse(JSON.stringify(localStorage));
for (let s in settingsToImport) {
if (checkboxes.includes(s) && (settingsToImport[s] === "true" || settingsToImport[s] === "false")
&& currentSettings[s] !== settingsToImport[s]) {
sSet(s, settingsToImport[s]);
changed = true
}
if (switchers[s] && switchers[s].includes(settingsToImport[s])
&& currentSettings[s] !== settingsToImport[s]) {
sSet(s, settingsToImport[s]);
changed = true
}
}
} catch (e) {
changed = false;
}
return changed
}
function updateFilenamePreview() {
let videoFilePreview = ``;
let audioFilePreview = ``;
let resMatch = {
"max": "3840x2160",
"2160": "3840x2160",
"1440": "2560x1440",
"1080": "1920x1080",
"720": "1280x720",
"480": "854x480",
"360": "640x360",
}
// "dubLang"
// sGet("muteAudio") === "true"
switch(sGet("filenamePattern")) {
case "classic":
videoFilePreview = `youtube_yPYZpwSpKmA_${resMatch[sGet('vQuality')]}_${sGet('vCodec')}`
+ `${sGet("muteAudio") === "true" ? "_mute" : ""}.${sGet('vCodec') === "vp9" ? 'webm' : 'mp4'}`;
audioFilePreview = `youtube_yPYZpwSpKmA_audio.${sGet('aFormat') !== "best" ? sGet('aFormat') : 'opus'}`;
break;
case "pretty":
videoFilePreview =
`${loc.FilenamePreviewVideoTitle} `
+ `(${sGet('vQuality') === "max" ? "2160p" : `${sGet('vQuality')}p`}, ${sGet('vCodec')}, `
+ `${sGet("muteAudio") === "true" ? "mute, " : ""}youtube).${sGet('vCodec') === "vp9" ? 'webm' : 'mp4'}`;
audioFilePreview = `${loc.FilenamePreviewAudioTitle} - ${loc.FilenamePreviewAudioAuthor} (soundcloud).${sGet('aFormat') !== "best" ? sGet('aFormat') : 'opus'}`;
break;
case "basic":
videoFilePreview =
`${loc.FilenamePreviewVideoTitle} `
+ `(${sGet('vQuality') === "max" ? "2160p" : `${sGet('vQuality')}p`}, ${sGet('vCodec')}${sGet("muteAudio") === "true" ? " mute" : ""}).${sGet('vCodec') === "vp9" ? 'webm' : 'mp4'}`;
audioFilePreview = `${loc.FilenamePreviewAudioTitle} - ${loc.FilenamePreviewAudioAuthor}.${sGet('aFormat') !== "best" ? sGet('aFormat') : 'opus'}`;
break;
case "nerdy":
videoFilePreview =
`${loc.FilenamePreviewVideoTitle} `
+ `(${sGet('vQuality') === "max" ? "2160p" : `${sGet('vQuality')}p`}, ${sGet('vCodec')}, `
+ `${sGet("muteAudio") === "true" ? "mute, " : ""}youtube, yPYZpwSpKmA).${sGet('vCodec') === "vp9" ? 'webm' : 'mp4'}`;
audioFilePreview = `${loc.FilenamePreviewAudioTitle} - ${loc.FilenamePreviewAudioAuthor} (soundcloud, 1242868615).${sGet('aFormat') !== "best" ? sGet('aFormat') : 'opus'}`;
break;
}
eid("video-filename-text").innerHTML = videoFilePreview
eid("audio-filename-text").innerHTML = audioFilePreview
}
function loadSettings() {
const loadSettings = () => {
if (sGet("alwaysVisibleButton") === "true") {
eid("alwaysVisibleButton").checked = true;
eid("download-button").value = '>>'
@ -565,6 +624,17 @@ function loadSettings() {
if (sGet("disableAnimations") === "true") {
eid("cobalt-body").classList.add('no-animation');
}
if (!isMobile) {
eid("cobalt-body").classList.add('desktop');
}
if (isAndroid) {
eid("cobalt-body").classList.add('android');
}
if (isIOS) {
eid("download-switcher")
.querySelector(".explanation")
.innerHTML = loc.DownloadPopupDescriptionIOS;
}
for (let i = 0; i < checkboxes.length; i++) {
try {
if (sGet(checkboxes[i]) === "true") eid(checkboxes[i]).checked = true;
@ -578,13 +648,14 @@ function loadSettings() {
}
updateFilenamePreview()
}
window.onload = () => {
loadCelebrationsEmoji();
loadSettings();
detectColorScheme();
changeDownloadButton(0, '>>');
changeDownloadButton("hidden");
eid("url-input-area").value = "";
if (isIOS) {
@ -595,37 +666,32 @@ window.onload = () => {
eid("home").style.visibility = 'visible';
eid("home").classList.toggle("visible");
if (pageQuery.has("u") && regex.test(pageQuery.get("u"))) {
const pageQuery = new URLSearchParams(window.location.search);
if (pageQuery.has("u") && validLink(pageQuery.get("u"))) {
eid("url-input-area").value = pageQuery.get("u");
button()
}
if (pageQuery.has("migration")) {
if (pageQuery.has("settingsData") && !sGet("migrated")) {
let setUn = unpackSettings(pageQuery.get("settingsData"));
if (setUn !== null) {
if (setUn) {
sSet("migrated", "true")
}
}
}
loadSettings();
detectColorScheme();
}
window.history.replaceState(null, '', window.location.pathname);
notificationCheck();
// fix for animations not working in Safari
if (isIOS) {
document.addEventListener('touchstart', () => {}, true);
}
}
eid("url-input-area").addEventListener("keydown", (e) => {
eid("url-input-area").addEventListener("keydown", () => {
button();
})
eid("url-input-area").addEventListener("keyup", (e) => {
if (e.key === 'Enter') eid("download-button").click();
})
document.addEventListener("keydown", (event) => {
if (event.key === "Tab") {
eid("download-button").value = '>>'
eid("download-button").style.padding = '0 1rem'
}
})
document.onkeydown = (e) => {
if (!store.isPopupOpen) {
if (e.metaKey || e.ctrlKey || e.key === "/") eid("url-input-area").focus();

View File

@ -1,382 +0,0 @@
<svg width="100%" height="100%" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M4 25.942C4 28.1739 5.76327 30 7.91837 30H24.0816C26.2367 30 28 28.0725 28 25.8406V6.4297C28 5.1297 26.4099 4.5297 25.5155 5.4297L20.9736 10H11.1617L6.5 5.4297C5.6 4.5297 4 5.1297 4 6.4297V25.942Z" fill="url(#paint0_linear_6905_5272)" />
<path d="M4 25.942C4 28.1739 5.76327 30 7.91837 30H24.0816C26.2367 30 28 28.0725 28 25.8406V6.4297C28 5.1297 26.4099 4.5297 25.5155 5.4297L20.9736 10H11.1617L6.5 5.4297C5.6 4.5297 4 5.1297 4 6.4297V25.942Z" fill="url(#paint1_linear_6905_5272)" />
<path d="M4 25.942C4 28.1739 5.76327 30 7.91837 30H24.0816C26.2367 30 28 28.0725 28 25.8406V6.4297C28 5.1297 26.4099 4.5297 25.5155 5.4297L20.9736 10H11.1617L6.5 5.4297C5.6 4.5297 4 5.1297 4 6.4297V25.942Z" fill="url(#paint2_linear_6905_5272)" />
<path d="M4 25.942C4 28.1739 5.76327 30 7.91837 30H24.0816C26.2367 30 28 28.0725 28 25.8406V6.4297C28 5.1297 26.4099 4.5297 25.5155 5.4297L20.9736 10H11.1617L6.5 5.4297C5.6 4.5297 4 5.1297 4 6.4297V25.942Z" fill="url(#paint3_linear_6905_5272)" />
<path d="M4 25.942C4 28.1739 5.76327 30 7.91837 30H24.0816C26.2367 30 28 28.0725 28 25.8406V6.4297C28 5.1297 26.4099 4.5297 25.5155 5.4297L20.9736 10H11.1617L6.5 5.4297C5.6 4.5297 4 5.1297 4 6.4297V25.942Z" fill="url(#paint4_linear_6905_5272)" />
<path d="M4 25.942C4 28.1739 5.76327 30 7.91837 30H24.0816C26.2367 30 28 28.0725 28 25.8406V6.4297C28 5.1297 26.4099 4.5297 25.5155 5.4297L20.9736 10H11.1617L6.5 5.4297C5.6 4.5297 4 5.1297 4 6.4297V25.942Z" fill="url(#paint5_radial_6905_5272)" />
<g filter="url(#filter0_f_6905_5272)">
<rect x="5.09634" y="21.1274" width="2.72692" height="3.69801" rx="1.36346" fill="#D67908" />
</g>
<g filter="url(#filter1_f_6905_5272)">
<path d="M26.0196 14.4614L27.0477 5.82727C27.1024 5.36633 26.3337 4.89183 25.4479 5.71436C25.4479 5.71436 22.068 9.03597 21.881 9.22018C19.5769 11.489 22.6425 12.468 26.0196 14.4614Z" fill="url(#paint6_linear_6905_5272)" />
</g>
<path d="M6.17485 12.8104L8.97485 10.2104C9.29485 9.91045 9.29485 9.43045 8.97485 9.14045L5.96016 6.46326C5.57735 6.12733 4.78485 6.2367 4.78485 7.07045V12.2704C4.78485 13.1039 5.66485 13.2904 6.17485 12.8104Z" fill="url(#paint7_linear_6905_5272)" />
<g filter="url(#filter2_f_6905_5272)">
<path d="M26.5331 5.30772C26.591 5.16404 26.7304 5.06995 26.8853 5.06995V5.06995C27.0951 5.06995 27.2652 5.23999 27.2652 5.44976V7.69495L25.8477 7.00745L26.5331 5.30772Z" fill="url(#paint8_linear_6905_5272)" />
</g>
<g filter="url(#filter3_f_6905_5272)">
<path d="M5.26547 5.62744L8.64043 8.84698C9.39455 9.56636 9.40868 10.7655 8.67172 11.5024V11.5024" stroke="#FFDF70" stroke-linecap="round" />
</g>
<g filter="url(#filter4_f_6905_5272)">
<path d="M14.8477 20.7882L14.912 20.7732C15.3856 20.6628 15.8788 20.6679 16.35 20.7882V20.7882C16.8711 20.8864 17.1822 21.4837 16.7422 21.9137L16.1914 22.5153C15.9214 22.7853 15.3286 22.7853 15.0586 22.5153L14.5156 21.9137C14.0664 21.4059 14.3477 20.8981 14.8477 20.7882Z" fill="url(#paint9_linear_6905_5272)" />
</g>
<g filter="url(#filter5_f_6905_5272)">
<path fill-rule="evenodd" clip-rule="evenodd" d="M15.654 22.274C16.0177 22.274 16.3126 22.5203 16.3126 22.824V25.574C16.3126 25.8778 16.0177 26.124 15.654 26.124C15.2903 26.124 14.9954 25.8778 14.9954 25.574V22.824C14.9954 22.5203 15.2903 22.274 15.654 22.274Z" fill="#DC8400" />
</g>
<path d="M13.1406 26.8846C14.0625 25.9731 16.3438 24.7361 18.875 26.8846" stroke="url(#paint10_radial_6905_5272)" stroke-width="1.1" stroke-linecap="round" />
<path d="M16 25.408V22.658" stroke="url(#paint11_linear_6905_5272)" stroke-width="1.1" stroke-linecap="round" />
<path d="M15.2688 20.3445L15.3331 20.3295C15.8067 20.219 16.2999 20.2242 16.7711 20.3445V20.3445C17.2922 20.4426 17.6033 21.04 17.1633 21.47L16.6125 22.0715C16.3425 22.3415 15.7497 22.3415 15.4797 22.0715L14.9367 21.47C14.4875 20.9622 14.7688 20.4543 15.2688 20.3445Z" fill="url(#paint12_radial_6905_5272)" />
<g filter="url(#filter6_f_6905_5272)">
<ellipse cx="16.3126" cy="20.8794" rx="0.761719" ry="0.274258" fill="url(#paint13_linear_6905_5272)" />
</g>
<g filter="url(#filter7_f_6905_5272)">
<path d="M24.8274 22.1993L28.632 20.3868" stroke="url(#paint14_linear_6905_5272)" stroke-width="1.2" stroke-miterlimit="10" stroke-linecap="round" />
</g>
<g filter="url(#filter8_f_6905_5272)">
<path d="M24.8274 24.2306L26.754 25.5962" stroke="url(#paint15_linear_6905_5272)" stroke-width="1.2" stroke-miterlimit="10" stroke-linecap="round" />
</g>
<path d="M25.6059 23.9764L29.4074 25.7954" stroke="url(#paint16_linear_6905_5272)" stroke-width="1.2" stroke-miterlimit="10" stroke-linecap="round" />
<g filter="url(#filter9_f_6905_5272)">
<path d="M26.2454 24.182L29.3422 25.6752" stroke="#FF8485" stroke-width="0.2" stroke-miterlimit="10" stroke-linecap="round" />
</g>
<g filter="url(#filter10_f_6905_5272)">
<ellipse cx="29.5827" cy="25.6753" rx="0.18384" ry="0.165827" transform="rotate(28.2981 29.5827 25.6753)" fill="#FFDD86" />
</g>
<g filter="url(#filter11_f_6905_5272)">
<path d="M9.90707 22.2647C9.90707 21.3498 9.1351 20.6246 8.22198 20.6817V20.6817C7.38474 20.7341 6.73308 21.4294 6.73498 22.2683L6.7415 25.1442C6.74349 26.0254 7.4648 26.7353 8.34593 26.7233V26.7233C9.21156 26.7114 9.90707 26.0064 9.90707 25.1406L9.90707 22.2647Z" fill="#CD7B00" />
</g>
<path d="M6.57037 23.9881L2.76881 25.8071" stroke="url(#paint17_linear_6905_5272)" stroke-width="1.2" stroke-miterlimit="10" stroke-linecap="round" />
<g filter="url(#filter12_f_6905_5272)">
<path d="M6.63558 23.868L2.83402 25.687" stroke="#FF8485" stroke-width="0.3" stroke-miterlimit="10" stroke-linecap="round" />
</g>
<g filter="url(#filter13_f_6905_5272)">
<ellipse rx="0.18384" ry="0.165827" transform="matrix(-0.942776 -0.333427 -0.333427 0.942776 6.68841 23.812)" fill="#FFDD86" />
</g>
<path d="M6.58199 21.8314L2.76842 20.0377" stroke="url(#paint18_linear_6905_5272)" stroke-width="1.2" stroke-miterlimit="10" stroke-linecap="round" />
<g filter="url(#filter14_f_6905_5272)">
<path d="M6.71627 21.8059L2.90269 20.0122" stroke="#FF8485" stroke-width="0.3" stroke-miterlimit="10" stroke-linecap="round" />
</g>
<g filter="url(#filter15_f_6905_5272)">
<ellipse rx="0.18384" ry="0.165827" transform="matrix(-0.338111 -0.941106 -0.941106 0.338111 6.79301 21.8114)" fill="#FFDD86" />
</g>
<g filter="url(#filter16_f_6905_5272)">
<rect x="22.1446" y="9.40869" width="4.5851" height="14.1857" fill="url(#paint19_linear_6905_5272)" />
</g>
<path d="M25.6086 21.8462L29.2923 20.1118" stroke="url(#paint20_linear_6905_5272)" stroke-width="1.2" stroke-miterlimit="10" stroke-linecap="round" />
<g filter="url(#filter17_f_6905_5272)">
<path d="M25.6086 22.0181L29.4133 20.2056" stroke="#FF5B5D" stroke-width="0.3" stroke-miterlimit="10" stroke-linecap="round" />
</g>
<path d="M25.8752 12.8104L23.0752 10.2104C22.7552 9.91045 22.7552 9.43045 23.0752 9.14045L26.0899 6.46326C26.4727 6.12733 27.2652 6.2367 27.2652 7.07045V12.2704C27.2652 13.1039 26.3852 13.2904 25.8752 12.8104Z" fill="#FFB915" />
<path d="M25.8752 12.8104L23.0752 10.2104C22.7552 9.91045 22.7552 9.43045 23.0752 9.14045L26.0899 6.46326C26.4727 6.12733 27.2652 6.2367 27.2652 7.07045V12.2704C27.2652 13.1039 26.3852 13.2904 25.8752 12.8104Z" fill="url(#paint21_linear_6905_5272)" />
<g filter="url(#filter18_f_6905_5272)">
<path d="M26.6758 6.67432L23.0508 9.79932L26.5977 12.6118L26.6758 6.67432Z" fill="url(#paint22_radial_6905_5272)" />
</g>
<g filter="url(#filter19_f_6905_5272)">
<path d="M23.7696 9.59619L26.3008 12.3306" stroke="url(#paint23_linear_6905_5272)" stroke-width="0.5" stroke-linecap="round" />
</g>
<g filter="url(#filter20_f_6905_5272)">
<path d="M5.26547 6.8064V12.7141L8.73422 9.62476L5.26547 6.8064Z" fill="#FEB33E" />
</g>
<g filter="url(#filter21_f_6905_5272)">
<path d="M5.26547 7.03369V12.2212" stroke="#FFE7A3" stroke-width="0.15" stroke-linecap="round" />
</g>
<g filter="url(#filter22_f_6905_5272)">
<ellipse rx="0.18384" ry="0.165827" transform="matrix(-0.922231 -0.386639 -0.386639 0.922231 2.85551 19.8876)" fill="#FFDD86" />
</g>
<g filter="url(#filter23_f_6905_5272)">
<ellipse cx="29.6481" cy="19.8876" rx="0.18384" ry="0.165827" transform="rotate(-22.7455 29.6481 19.8876)" fill="#FFDD86" />
</g>
<g filter="url(#filter24_f_6905_5272)">
<path fill-rule="evenodd" clip-rule="evenodd" d="M19.6151 18.5322C20.0849 19.5789 21.1066 19.653 21.5454 19.4797C21.8324 19.3663 22.1569 19.5071 22.2702 19.794C22.3836 20.081 22.2428 20.4055 21.9559 20.5188C21.0781 20.8655 19.3584 20.6886 18.5958 18.9898C18.4695 18.7083 18.5952 18.3777 18.8767 18.2514C19.1581 18.125 19.4887 18.2508 19.6151 18.5322Z" fill="url(#paint24_linear_6905_5272)" />
</g>
<g filter="url(#filter25_f_6905_5272)">
<path fill-rule="evenodd" clip-rule="evenodd" d="M12.2811 18.5689C11.8113 19.6155 10.7896 19.6896 10.3507 19.5163C10.0638 19.4029 9.73929 19.5437 9.62595 19.8306C9.51261 20.1176 9.65336 20.4421 9.94031 20.5554C10.8181 20.9021 12.5378 20.7252 13.3004 19.0264C13.4267 18.7449 13.301 18.4143 13.0195 18.288C12.738 18.1616 12.4074 18.2874 12.2811 18.5689Z" fill="url(#paint25_linear_6905_5272)" />
</g>
<path d="M12.8139 18.2284C12.5404 18.9471 11.392 19.9159 9.99355 19.3299" stroke="url(#paint26_radial_6905_5272)" stroke-width="1.1" stroke-linecap="round" />
<path d="M19.2706 18.2284C19.5441 18.9471 20.6925 19.9159 22.091 19.3299" stroke="url(#paint27_radial_6905_5272)" stroke-width="1.1" stroke-linecap="round" />
<path d="M11.5692 22.0531C11.5692 20.9995 10.6802 20.1644 9.62863 20.2302V20.2302C8.66448 20.2905 7.91404 21.0912 7.91623 22.0572L7.92373 25.3691C7.92603 26.3839 8.75668 27.2014 9.77137 27.1875V27.1875C10.7682 27.1739 11.5692 26.3619 11.5692 25.365L11.5692 22.0531Z" fill="url(#paint28_radial_6905_5272)" />
<path d="M11.5692 22.0531C11.5692 20.9995 10.6802 20.1644 9.62863 20.2302V20.2302C8.66448 20.2905 7.91404 21.0912 7.91623 22.0572L7.92373 25.3691C7.92603 26.3839 8.75668 27.2014 9.77137 27.1875V27.1875C10.7682 27.1739 11.5692 26.3619 11.5692 25.365L11.5692 22.0531Z" fill="url(#paint29_radial_6905_5272)" />
<path d="M11.5692 22.0531C11.5692 20.9995 10.6802 20.1644 9.62863 20.2302V20.2302C8.66448 20.2905 7.91404 21.0912 7.91623 22.0572L7.92373 25.3691C7.92603 26.3839 8.75668 27.2014 9.77137 27.1875V27.1875C10.7682 27.1739 11.5692 26.3619 11.5692 25.365L11.5692 22.0531Z" fill="url(#paint30_linear_6905_5272)" />
<g filter="url(#filter26_f_6905_5272)">
<path d="M10.3125 21.5879L10.3847 25.2051" stroke="#6BAFFF" stroke-linecap="round" />
</g>
<g filter="url(#filter27_f_6905_5272)">
<circle r="0.592704" transform="matrix(-0.724367 0.689414 0.724367 0.689414 9.75781 21.2884)" fill="#6BAFFF" />
</g>
<defs>
<filter id="filter0_f_6905_5272" x="3.59634" y="19.6274" width="5.72693" height="6.698" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.75" result="effect1_foregroundBlur_6905_5272" />
</filter>
<filter id="filter1_f_6905_5272" x="20.58" y="4.76599" width="6.97055" height="10.1954" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.25" result="effect1_foregroundBlur_6905_5272" />
</filter>
<filter id="filter2_f_6905_5272" x="24.8477" y="4.06995" width="3.41745" height="4.625" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.5" result="effect1_foregroundBlur_6905_5272" />
</filter>
<filter id="filter3_f_6905_5272" x="2.76547" y="3.12744" width="8.94989" height="10.7285" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="1" result="effect1_foregroundBlur_6905_5272" />
</filter>
<filter id="filter4_f_6905_5272" x="13.7905" y="20.194" width="3.66141" height="3.0238" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.25" result="effect1_foregroundBlur_6905_5272" />
</filter>
<filter id="filter5_f_6905_5272" x="14.4954" y="21.774" width="2.3172" height="4.84998" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.25" result="effect1_foregroundBlur_6905_5272" />
</filter>
<filter id="filter6_f_6905_5272" x="14.9508" y="20.0051" width="2.72344" height="1.74846" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.3" result="effect1_foregroundBlur_6905_5272" />
</filter>
<filter id="filter7_f_6905_5272" x="23.7272" y="19.2867" width="6.00494" height="4.0127" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.25" result="effect1_foregroundBlur_6905_5272" />
</filter>
<filter id="filter8_f_6905_5272" x="23.7273" y="23.1306" width="4.12671" height="3.56567" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.25" result="effect1_foregroundBlur_6905_5272" />
</filter>
<filter id="filter9_f_6905_5272" x="25.6454" y="23.582" width="4.29688" height="2.69324" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.25" result="effect1_foregroundBlur_6905_5272" />
</filter>
<filter id="filter10_f_6905_5272" x="28.9027" y="25.0052" width="1.35999" height="1.34009" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.25" result="effect1_foregroundBlur_6905_5272" />
</filter>
<filter id="filter11_f_6905_5272" x="5.73499" y="19.6786" width="5.17209" height="8.0448" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.5" result="effect1_foregroundBlur_6905_5272" />
</filter>
<filter id="filter12_f_6905_5272" x="2.18399" y="23.2179" width="5.10162" height="3.11914" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.25" result="effect1_foregroundBlur_6905_5272" />
</filter>
<filter id="filter13_f_6905_5272" x="6.00644" y="23.144" width="1.36395" height="1.33594" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.25" result="effect1_foregroundBlur_6905_5272" />
</filter>
<filter id="filter14_f_6905_5272" x="2.25266" y="19.3622" width="5.11365" height="3.09375" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.25" result="effect1_foregroundBlur_6905_5272" />
</filter>
<filter id="filter15_f_6905_5272" x="6.12497" y="21.1295" width="1.33606" height="1.36377" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.25" result="effect1_foregroundBlur_6905_5272" />
</filter>
<filter id="filter16_f_6905_5272" x="18.1446" y="5.40869" width="12.5851" height="22.1857" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="2" result="effect1_foregroundBlur_6905_5272" />
</filter>
<filter id="filter17_f_6905_5272" x="24.9586" y="19.5555" width="5.10474" height="3.11255" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.25" result="effect1_foregroundBlur_6905_5272" />
</filter>
<filter id="filter18_f_6905_5272" x="22.4508" y="6.07432" width="4.825" height="7.1375" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.3" result="effect1_foregroundBlur_6905_5272" />
</filter>
<filter id="filter19_f_6905_5272" x="22.7696" y="8.59619" width="4.53125" height="4.73438" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.375" result="effect1_foregroundBlur_6905_5272" />
</filter>
<filter id="filter20_f_6905_5272" x="4.76547" y="6.3064" width="4.46875" height="6.90771" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.25" result="effect1_foregroundBlur_6905_5272" />
</filter>
<filter id="filter21_f_6905_5272" x="4.69046" y="6.45874" width="1.15002" height="6.3374" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.25" result="effect1_foregroundBlur_6905_5272" />
</filter>
<filter id="filter22_f_6905_5272" x="2.17419" y="19.219" width="1.36264" height="1.33728" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.25" result="effect1_foregroundBlur_6905_5272" />
</filter>
<filter id="filter23_f_6905_5272" x="28.9668" y="19.219" width="1.36264" height="1.33728" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.25" result="effect1_foregroundBlur_6905_5272" />
</filter>
<filter id="filter24_f_6905_5272" x="18.0467" y="17.7023" width="4.76276" height="3.46326" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.25" result="effect1_foregroundBlur_6905_5272" />
</filter>
<filter id="filter25_f_6905_5272" x="9.08673" y="17.7389" width="4.76276" height="3.46326" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.25" result="effect1_foregroundBlur_6905_5272" />
</filter>
<filter id="filter26_f_6905_5272" x="7.80084" y="19.0999" width="5.09555" height="8.59326" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="1" result="effect1_foregroundBlur_6905_5272" />
</filter>
<filter id="filter27_f_6905_5272" x="7.15063" y="18.7106" width="5.21436" height="5.15576" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="1" result="effect1_foregroundBlur_6905_5272" />
</filter>
<linearGradient id="paint0_linear_6905_5272" x1="7.90668" y1="1.34978" x2="7.90668" y2="30.99" gradientUnits="userSpaceOnUse">
<stop offset="0.288159" stop-color="#F2CC26" />
<stop offset="0.762024" stop-color="#E99E20" />
<stop offset="0.9925" stop-color="#E3821D" />
<stop offset="1" stop-color="#E3801D" />
</linearGradient>
<linearGradient id="paint1_linear_6905_5272" x1="8.83102" y1="12.033" x2="1.16971" y2="12.033" gradientUnits="userSpaceOnUse">
<stop stop-color="#E99E20" stop-opacity="0" />
<stop offset="0.9925" stop-color="#E3821D" />
<stop offset="1" stop-color="#E3801D" />
</linearGradient>
<linearGradient id="paint2_linear_6905_5272" x1="26.7911" y1="12.033" x2="30.245" y2="12.033" gradientUnits="userSpaceOnUse">
<stop stop-color="#E99E20" stop-opacity="0" />
<stop offset="0.9925" stop-color="#E3821D" />
<stop offset="1" stop-color="#E3801D" />
</linearGradient>
<linearGradient id="paint3_linear_6905_5272" x1="16.001" y1="-1.59459" x2="16" y2="30.99" gradientUnits="userSpaceOnUse">
<stop offset="0.77079" stop-color="#F59639" stop-opacity="0" />
<stop offset="1" stop-color="#FF63C4" />
</linearGradient>
<linearGradient id="paint4_linear_6905_5272" x1="16" y1="11.2521" x2="16" y2="32.475" gradientUnits="userSpaceOnUse">
<stop offset="0.854227" stop-color="white" stop-opacity="0" />
<stop offset="0.985362" stop-color="white" />
</linearGradient>
<radialGradient id="paint5_radial_6905_5272" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(22.1755 4.47688) rotate(55.4547) scale(5.37104 10.6707)">
<stop stop-color="#FFA720" />
<stop offset="0.921158" stop-color="#FFA720" stop-opacity="0" />
</radialGradient>
<linearGradient id="paint6_linear_6905_5272" x1="21.9503" y1="6.1586" x2="28.2071" y2="13.0023" gradientUnits="userSpaceOnUse">
<stop stop-color="#FFA720" />
<stop offset="1" stop-color="#FFA720" stop-opacity="0" />
</linearGradient>
<linearGradient id="paint7_linear_6905_5272" x1="10.6446" y1="9.9242" x2="4.78485" y2="9.37733" gradientUnits="userSpaceOnUse">
<stop offset="0.437473" stop-color="#ED8C1B" />
<stop offset="1" stop-color="#FFB03A" />
</linearGradient>
<linearGradient id="paint8_linear_6905_5272" x1="27.0821" y1="4.61682" x2="26.486" y2="6.95827" gradientUnits="userSpaceOnUse">
<stop offset="0.28598" stop-color="#FFE792" />
<stop offset="1" stop-color="#FFDD65" stop-opacity="0" />
</linearGradient>
<linearGradient id="paint9_linear_6905_5272" x1="15.793" y1="22.4892" x2="15.1212" y2="23.5829" gradientUnits="userSpaceOnUse">
<stop stop-color="#E3900E" />
<stop offset="1" stop-color="#EA9D26" stop-opacity="0" />
</linearGradient>
<radialGradient id="paint10_radial_6905_5272" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(16.1985 27.2752) rotate(-90.1815) scale(5.21878 10.1877)">
<stop offset="0.191719" stop-color="#482641" />
<stop offset="0.311545" stop-color="#594253" />
<stop offset="0.386385" stop-color="#483334" />
</radialGradient>
<linearGradient id="paint11_linear_6905_5272" x1="18.1829" y1="24.447" x2="10.886" y2="24.447" gradientUnits="userSpaceOnUse">
<stop offset="0.135417" stop-color="#483637" />
<stop offset="0.276042" stop-color="#594253" />
<stop offset="0.411458" stop-color="#482641" />
</linearGradient>
<radialGradient id="paint12_radial_6905_5272" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(16.4883 21.3176) rotate(-153.246) scale(2.11729 2.12981)">
<stop stop-color="#EA088B" />
<stop offset="1" stop-color="#E61E27" />
</radialGradient>
<linearGradient id="paint13_linear_6905_5272" x1="17.2458" y1="20.8794" x2="15.7224" y2="20.8794" gradientUnits="userSpaceOnUse">
<stop stop-color="white" stop-opacity="0.9" />
<stop offset="1" stop-color="white" stop-opacity="0" />
</linearGradient>
<linearGradient id="paint14_linear_6905_5272" x1="24.3321" y1="22.5431" x2="28.0665" y2="20.6274" gradientUnits="userSpaceOnUse">
<stop stop-color="#E88105" />
<stop offset="1" stop-color="#E37D02" stop-opacity="0" />
</linearGradient>
<linearGradient id="paint15_linear_6905_5272" x1="24.3321" y1="23.8869" x2="28.0665" y2="25.8026" gradientUnits="userSpaceOnUse">
<stop offset="0.286458" stop-color="#DE7D07" />
<stop offset="0.817708" stop-color="#E37D02" stop-opacity="0" />
</linearGradient>
<linearGradient id="paint16_linear_6905_5272" x1="25.1161" y1="24.0168" x2="29.1887" y2="25.9722" gradientUnits="userSpaceOnUse">
<stop stop-color="#B9230F" />
<stop offset="0.364583" stop-color="#D64A38" />
<stop offset="1" stop-color="#FB7425" />
</linearGradient>
<linearGradient id="paint17_linear_6905_5272" x1="7.06012" y1="24.0285" x2="2.98751" y2="25.984" gradientUnits="userSpaceOnUse">
<stop offset="0.15625" stop-color="#D64A38" />
<stop offset="1" stop-color="#FB7425" />
</linearGradient>
<linearGradient id="paint18_linear_6905_5272" x1="6.8605" y1="22.2363" x2="2.7698" y2="20.3189" gradientUnits="userSpaceOnUse">
<stop offset="0.15625" stop-color="#D64A38" />
<stop offset="1" stop-color="#FB7425" />
</linearGradient>
<linearGradient id="paint19_linear_6905_5272" x1="23.3946" y1="10.1457" x2="22.998" y2="22.1962" gradientUnits="userSpaceOnUse">
<stop offset="0.548257" stop-color="#FFDD65" />
<stop offset="1" stop-color="#FFDD65" stop-opacity="0" />
</linearGradient>
<linearGradient id="paint20_linear_6905_5272" x1="25.3321" y1="22.2524" x2="29.4133" y2="20.3149" gradientUnits="userSpaceOnUse">
<stop offset="0.15625" stop-color="#C83F2D" />
<stop offset="1" stop-color="#E7671C" />
</linearGradient>
<linearGradient id="paint21_linear_6905_5272" x1="26.5821" y1="14.8148" x2="25.3321" y2="11.3461" gradientUnits="userSpaceOnUse">
<stop stop-color="#EF8A47" />
<stop offset="1" stop-color="#EF8A47" stop-opacity="0" />
</linearGradient>
<radialGradient id="paint22_radial_6905_5272" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(22.9102 7.08057) rotate(55.7389) scale(7.82686 9.38424)">
<stop stop-color="#FFDF70" />
<stop offset="1" stop-color="#FFDF70" stop-opacity="0" />
</radialGradient>
<linearGradient id="paint23_linear_6905_5272" x1="25.0977" y1="9.78369" x2="25.0977" y2="12.1274" gradientUnits="userSpaceOnUse">
<stop offset="0.432292" stop-color="#FFE7A3" />
<stop offset="1" stop-color="#FFDF83" stop-opacity="0" />
</linearGradient>
<linearGradient id="paint24_linear_6905_5272" x1="17.5468" y1="17.8246" x2="18.3832" y2="15.8011" gradientUnits="userSpaceOnUse">
<stop stop-color="#DE8D0F" />
<stop offset="1" stop-color="#EA9D26" stop-opacity="0" />
</linearGradient>
<linearGradient id="paint25_linear_6905_5272" x1="14.3494" y1="17.8613" x2="13.5129" y2="15.8378" gradientUnits="userSpaceOnUse">
<stop stop-color="#E69518" />
<stop offset="1" stop-color="#EA9D26" stop-opacity="0" />
</linearGradient>
<radialGradient id="paint26_radial_6905_5272" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(11.2201 18.4471) rotate(73.807) scale(3.48338 6.75247)">
<stop offset="0.135417" stop-color="#483637" />
<stop offset="0.276042" stop-color="#594253" />
<stop offset="0.411458" stop-color="#482641" />
</radialGradient>
<radialGradient id="paint27_radial_6905_5272" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(20.8644 18.4471) rotate(106.193) scale(3.48338 6.75247)">
<stop offset="0.135417" stop-color="#483637" />
<stop offset="0.276042" stop-color="#594253" />
<stop offset="0.411458" stop-color="#482641" />
</radialGradient>
<radialGradient id="paint28_radial_6905_5272" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(8.01037 27.3063) rotate(-48.5801) scale(8.69623 14.7041)">
<stop stop-color="#3D5BF1" />
<stop offset="1" stop-color="#5C98FF" />
</radialGradient>
<radialGradient id="paint29_radial_6905_5272" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(11.504 20.0466) rotate(111.857) scale(9.25859 6.48471)">
<stop offset="0.731957" stop-color="#1F2D75" stop-opacity="0" />
<stop offset="0.956392" stop-color="#1F2D75" stop-opacity="0.75" />
</radialGradient>
<linearGradient id="paint30_linear_6905_5272" x1="13.1496" y1="24.2645" x2="6.10698" y2="24.151" gradientUnits="userSpaceOnUse">
<stop offset="0.585153" stop-color="#1F2D75" stop-opacity="0" />
<stop offset="1" stop-color="#1F2D75" stop-opacity="0.75" />
</linearGradient>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 31 KiB

View File

@ -1,507 +0,0 @@
<svg width="100%" height="100%" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M27.9617 25.9948V6.35147C27.9617 4.91397 26.6257 4.21085 25.532 5.22647L21.5184 9.17869C21.3313 9.36291 21.0793 9.46616 20.8167 9.46616H11.2204C10.9578 9.46616 10.7058 9.36291 10.5188 9.17869L6.50513 5.22647C5.41138 4.21085 4.07544 4.91397 4.07544 6.35147V25.9948C4.07544 28.2066 5.83537 29.9999 8.00597 29.9999H24.0312C26.2018 29.9999 27.9617 28.2066 27.9617 25.9948Z" fill="url(#paint0_linear_6903_5272)" />
<path d="M27.9617 25.9948V6.35147C27.9617 4.91397 26.6257 4.21085 25.532 5.22647L21.5184 9.17869C21.3313 9.36291 21.0793 9.46616 20.8167 9.46616H11.2204C10.9578 9.46616 10.7058 9.36291 10.5188 9.17869L6.50513 5.22647C5.41138 4.21085 4.07544 4.91397 4.07544 6.35147V25.9948C4.07544 28.2066 5.83537 29.9999 8.00597 29.9999H24.0312C26.2018 29.9999 27.9617 28.2066 27.9617 25.9948Z" fill="url(#paint1_linear_6903_5272)" />
<path d="M27.9617 25.9948V6.35147C27.9617 4.91397 26.6257 4.21085 25.532 5.22647L21.5184 9.17869C21.3313 9.36291 21.0793 9.46616 20.8167 9.46616H11.2204C10.9578 9.46616 10.7058 9.36291 10.5188 9.17869L6.50513 5.22647C5.41138 4.21085 4.07544 4.91397 4.07544 6.35147V25.9948C4.07544 28.2066 5.83537 29.9999 8.00597 29.9999H24.0312C26.2018 29.9999 27.9617 28.2066 27.9617 25.9948Z" fill="url(#paint2_linear_6903_5272)" />
<path d="M27.9617 25.9948V6.35147C27.9617 4.91397 26.6257 4.21085 25.532 5.22647L21.5184 9.17869C21.3313 9.36291 21.0793 9.46616 20.8167 9.46616H11.2204C10.9578 9.46616 10.7058 9.36291 10.5188 9.17869L6.50513 5.22647C5.41138 4.21085 4.07544 4.91397 4.07544 6.35147V25.9948C4.07544 28.2066 5.83537 29.9999 8.00597 29.9999H24.0312C26.2018 29.9999 27.9617 28.2066 27.9617 25.9948Z" fill="url(#paint3_linear_6903_5272)" />
<path d="M27.9617 25.9948V6.35147C27.9617 4.91397 26.6257 4.21085 25.532 5.22647L21.5184 9.17869C21.3313 9.36291 21.0793 9.46616 20.8167 9.46616H11.2204C10.9578 9.46616 10.7058 9.36291 10.5188 9.17869L6.50513 5.22647C5.41138 4.21085 4.07544 4.91397 4.07544 6.35147V25.9948C4.07544 28.2066 5.83537 29.9999 8.00597 29.9999H24.0312C26.2018 29.9999 27.9617 28.2066 27.9617 25.9948Z" fill="url(#paint4_linear_6903_5272)" />
<path d="M27.9617 25.9948V6.35147C27.9617 4.91397 26.6257 4.21085 25.532 5.22647L21.5184 9.17869C21.3313 9.36291 21.0793 9.46616 20.8167 9.46616H11.2204C10.9578 9.46616 10.7058 9.36291 10.5188 9.17869L6.50513 5.22647C5.41138 4.21085 4.07544 4.91397 4.07544 6.35147V25.9948C4.07544 28.2066 5.83537 29.9999 8.00597 29.9999H24.0312C26.2018 29.9999 27.9617 28.2066 27.9617 25.9948Z" fill="url(#paint5_radial_6903_5272)" />
<g filter="url(#filter0_f_6903_5272)">
<rect x="5.05408" y="21.75" width="2.72692" height="3.69801" rx="1.36346" fill="#D67908" />
</g>
<g filter="url(#filter1_f_6903_5272)">
<path d="M20.5855 10.165C17.6023 10.2726 25.812 15.1188 25.812 15.1188L26.937 6.0563C26.9917 5.59537 26.5729 5.10279 25.6871 5.92532C25.6871 5.92532 21.8605 9.69333 21.6734 9.87754C21.4864 10.0618 21.2654 10.1265 20.9718 10.165C20.8222 10.1846 20.7363 10.1596 20.5855 10.165Z" fill="url(#paint6_linear_6903_5272)" />
</g>
<path d="M6.13255 13.4331L8.93255 10.8331C9.25255 10.5331 9.25255 10.0531 8.93255 9.76313L5.91787 7.08594C5.53505 6.75001 4.74255 6.85938 4.74255 7.69313V12.8931C4.74255 13.7266 5.62255 13.9131 6.13255 13.4331Z" fill="url(#paint7_linear_6903_5272)" />
<g filter="url(#filter2_f_6903_5272)">
<path d="M26.4909 5.58153C26.5488 5.43784 26.6882 5.34375 26.8431 5.34375V5.34375C27.0529 5.34375 27.2229 5.5138 27.2229 5.72356V7.96875L25.8055 7.28125L26.4909 5.58153Z" fill="url(#paint8_linear_6903_5272)" />
</g>
<g filter="url(#filter3_f_6903_5272)">
<path d="M5.40601 6.0625L8.78097 9.28203C9.53508 10.0014 9.54921 11.2005 8.81226 11.9375V11.9375" stroke="#FFDF70" stroke-linecap="round" />
</g>
<g filter="url(#filter4_f_6903_5272)">
<path d="M14.8054 19.5626L14.8697 19.5476C15.3433 19.4372 15.8365 19.4423 16.3077 19.5626V19.5626C16.8288 19.6608 17.1399 20.2581 16.6999 20.6881L16.1491 21.2897C15.8791 21.5597 15.2863 21.5597 15.0163 21.2897L14.4733 20.6881C14.0241 20.1803 14.3054 19.6725 14.8054 19.5626Z" fill="url(#paint9_linear_6903_5272)" />
</g>
<path d="M15.2265 19.1189L15.2908 19.1039C15.7644 18.9935 16.2577 18.9986 16.7289 19.1189V19.1189C17.25 19.217 17.561 19.8144 17.121 20.2444L16.5703 20.8459C16.3003 21.1159 15.7075 21.1159 15.4375 20.8459L14.8945 20.2444C14.4453 19.7366 14.7265 19.2288 15.2265 19.1189Z" fill="url(#paint10_radial_6903_5272)" />
<g filter="url(#filter5_f_6903_5272)">
<ellipse cx="16.2703" cy="19.6538" rx="0.761719" ry="0.274258" fill="url(#paint11_linear_6903_5272)" />
</g>
<g filter="url(#filter6_f_6903_5272)">
<path d="M24.7851 22.8219L28.5898 21.0094" stroke="url(#paint12_linear_6903_5272)" stroke-width="1.2" stroke-miterlimit="10" stroke-linecap="round" />
</g>
<g filter="url(#filter7_f_6903_5272)">
<path d="M24.7851 24.8532L26.7117 26.2188" stroke="url(#paint13_linear_6903_5272)" stroke-width="1.2" stroke-miterlimit="10" stroke-linecap="round" />
</g>
<path d="M25.5663 22.4688L29.371 20.6562" stroke="url(#paint14_linear_6903_5272)" stroke-width="1.2" stroke-miterlimit="10" stroke-linecap="round" />
<g filter="url(#filter8_f_6903_5272)">
<path d="M25.5663 22.6406L29.371 20.8281" stroke="#FF8485" stroke-width="0.3" stroke-miterlimit="10" stroke-linecap="round" />
</g>
<path d="M25.5636 24.5989L29.3652 26.418" stroke="url(#paint15_linear_6903_5272)" stroke-width="1.2" stroke-miterlimit="10" stroke-linecap="round" />
<g filter="url(#filter9_f_6903_5272)">
<path d="M25.4984 24.4788L29.3 26.2979" stroke="#FF8485" stroke-width="0.3" stroke-miterlimit="10" stroke-linecap="round" />
</g>
<path d="M6.5281 24.6106L2.72654 26.4297" stroke="url(#paint16_linear_6903_5272)" stroke-width="1.2" stroke-miterlimit="10" stroke-linecap="round" />
<g filter="url(#filter10_f_6903_5272)">
<path d="M6.59334 24.4905L2.79179 26.3096" stroke="#FF8485" stroke-width="0.3" stroke-miterlimit="10" stroke-linecap="round" />
</g>
<g filter="url(#filter11_f_6903_5272)">
<ellipse rx="0.18384" ry="0.165827" transform="matrix(-0.942776 -0.333427 -0.333427 0.942776 6.64614 24.4345)" fill="#FFDD86" />
</g>
<path d="M6.53969 22.454L2.72612 20.6602" stroke="url(#paint17_linear_6903_5272)" stroke-width="1.2" stroke-miterlimit="10" stroke-linecap="round" />
<g filter="url(#filter12_f_6903_5272)">
<path d="M6.67403 22.4284L2.86046 20.6347" stroke="#FF8485" stroke-width="0.3" stroke-miterlimit="10" stroke-linecap="round" />
</g>
<g filter="url(#filter13_f_6903_5272)">
<ellipse rx="0.18384" ry="0.165827" transform="matrix(-0.338111 -0.941106 -0.941106 0.338111 6.75078 22.434)" fill="#FFDD86" />
</g>
<g filter="url(#filter14_f_6903_5272)">
<rect x="22.1024" y="10.0312" width="4.5851" height="14.1857" fill="url(#paint18_linear_6903_5272)" />
</g>
<path d="M25.8329 13.4331L23.0329 10.8331C22.7129 10.5331 22.7129 10.0531 23.0329 9.76313L26.0476 7.08594C26.4304 6.75001 27.2229 6.85938 27.2229 7.69313V12.8931C27.2229 13.7266 26.3429 13.9131 25.8329 13.4331Z" fill="#FFB915" />
<path d="M25.8329 13.4331L23.0329 10.8331C22.7129 10.5331 22.7129 10.0531 23.0329 9.76313L26.0476 7.08594C26.4304 6.75001 27.2229 6.85938 27.2229 7.69313V12.8931C27.2229 13.7266 26.3429 13.9131 25.8329 13.4331Z" fill="url(#paint19_linear_6903_5272)" />
<g filter="url(#filter15_f_6903_5272)">
<path d="M26.6336 7.29688L23.0086 10.4219L26.5555 13.2344L26.6336 7.29688Z" fill="url(#paint20_radial_6903_5272)" />
</g>
<g filter="url(#filter16_f_6903_5272)">
<path d="M23.7274 10.2188L26.2586 12.9531" stroke="url(#paint21_linear_6903_5272)" stroke-width="0.5" stroke-linecap="round" />
</g>
<g filter="url(#filter17_f_6903_5272)">
<path d="M5.22321 7.42896V13.3367L8.69196 10.2473L5.22321 7.42896Z" fill="#FEB33E" />
</g>
<g filter="url(#filter18_f_6903_5272)">
<path d="M5.22321 7.65625V12.8438" stroke="#FFE7A3" stroke-width="0.15" stroke-linecap="round" />
</g>
<g filter="url(#filter19_f_6903_5272)">
<circle cx="22.3076" cy="24.9852" r="3.19081" fill="url(#paint22_linear_6903_5272)" />
</g>
<path d="M20.9883 23.7969C20.9883 21.5964 22.7721 19.8125 24.9727 19.8125V19.8125C27.1732 19.8125 28.957 21.5964 28.957 23.7969V30H20.9883V23.7969Z" fill="url(#paint23_linear_6903_5272)" />
<path d="M20.9883 23.7969C20.9883 21.5964 22.7721 19.8125 24.9727 19.8125V19.8125C27.1732 19.8125 28.957 21.5964 28.957 23.7969V30H20.9883V23.7969Z" fill="url(#paint24_linear_6903_5272)" />
<path d="M20.9883 23.7969C20.9883 21.5964 22.7721 19.8125 24.9727 19.8125V19.8125C27.1732 19.8125 28.957 21.5964 28.957 23.7969V30H20.9883V23.7969Z" fill="url(#paint25_linear_6903_5272)" />
<g filter="url(#filter20_f_6903_5272)">
<path d="M26.0507 20.3399C26.0507 20.2298 26.1399 20.1406 26.25 20.1406V20.1406C26.36 20.1406 26.4492 20.2298 26.4492 20.3399V23.0586C26.4492 23.1686 26.36 23.2578 26.25 23.2578V23.2578C26.1399 23.2578 26.0507 23.1686 26.0507 23.0586V20.3399Z" fill="#DA7600" fill-opacity="0.5" />
</g>
<g filter="url(#filter21_f_6903_5272)">
<path d="M22.9727 20.3437C22.9727 20.2316 23.0636 20.1406 23.1758 20.1406V20.1406C23.288 20.1406 23.3789 20.2316 23.3789 20.3438V22.9531C23.3789 23.0653 23.288 23.1563 23.1758 23.1563V23.1563C23.0636 23.1563 22.9727 23.0653 22.9727 22.9531V20.3437Z" fill="#DA7600" fill-opacity="0.75" />
</g>
<g filter="url(#filter22_f_6903_5272)">
<ellipse cx="27.1216" cy="22.2576" rx="0.846269" ry="1.35723" transform="rotate(-27.2088 27.1216 22.2576)" fill="#FDD659" />
</g>
<path d="M23.1133 20.0547C23.1133 19.8692 23.2637 19.7188 23.4492 19.7188V19.7188C23.6348 19.7188 23.7852 19.8692 23.7852 20.0547V22.8203C23.7852 23.0058 23.6348 23.1562 23.4492 23.1562V23.1562C23.2637 23.1562 23.1133 23.0058 23.1133 22.8203V20.0547Z" fill="url(#paint26_linear_6903_5272)" />
<path d="M23.1133 20.0547C23.1133 19.8692 23.2637 19.7188 23.4492 19.7188V19.7188C23.6348 19.7188 23.7852 19.8692 23.7852 20.0547V22.8203C23.7852 23.0058 23.6348 23.1562 23.4492 23.1562V23.1562C23.2637 23.1562 23.1133 23.0058 23.1133 22.8203V20.0547Z" fill="url(#paint27_linear_6903_5272)" />
<path d="M23.1133 20.0547C23.1133 19.8692 23.2637 19.7188 23.4492 19.7188V19.7188C23.6348 19.7188 23.7852 19.8692 23.7852 20.0547V22.8203C23.7852 23.0058 23.6348 23.1562 23.4492 23.1562V23.1562C23.2637 23.1562 23.1133 23.0058 23.1133 22.8203V20.0547Z" fill="url(#paint28_linear_6903_5272)" />
<path d="M26.1602 20.0547C26.1602 19.8692 26.3106 19.7188 26.4961 19.7188V19.7188C26.6816 19.7188 26.832 19.8692 26.832 20.0547V22.8203C26.832 23.0058 26.6816 23.1562 26.4961 23.1562V23.1562C26.3106 23.1562 26.1602 23.0058 26.1602 22.8203V20.0547Z" fill="url(#paint29_linear_6903_5272)" />
<path d="M26.1602 20.0547C26.1602 19.8692 26.3106 19.7188 26.4961 19.7188V19.7188C26.6816 19.7188 26.832 19.8692 26.832 20.0547V22.8203C26.832 23.0058 26.6816 23.1562 26.4961 23.1562V23.1562C26.3106 23.1562 26.1602 23.0058 26.1602 22.8203V20.0547Z" fill="url(#paint30_linear_6903_5272)" />
<path d="M26.1602 20.0547C26.1602 19.8692 26.3106 19.7188 26.4961 19.7188V19.7188C26.6816 19.7188 26.832 19.8692 26.832 20.0547V22.8203C26.832 23.0058 26.6816 23.1562 26.4961 23.1562V23.1562C26.3106 23.1562 26.1602 23.0058 26.1602 22.8203V20.0547Z" fill="url(#paint31_linear_6903_5272)" />
<g filter="url(#filter23_f_6903_5272)">
<path d="M26.6679 22.6797V20.4688" stroke="url(#paint32_linear_6903_5272)" stroke-width="0.2" stroke-linecap="round" />
</g>
<g filter="url(#filter24_f_6903_5272)">
<path d="M23.621 22.6797V20.4688" stroke="url(#paint33_linear_6903_5272)" stroke-width="0.2" stroke-linecap="round" />
</g>
<g filter="url(#filter25_f_6903_5272)">
<path d="M23.621 22.6797V20.4688" stroke="url(#paint34_linear_6903_5272)" stroke-width="0.2" stroke-linecap="round" />
</g>
<g filter="url(#filter26_f_6903_5272)">
<circle cx="11.082" cy="15.9766" r="3.49219" fill="url(#paint35_linear_6903_5272)" />
</g>
<g filter="url(#filter27_f_6903_5272)">
<circle cx="20.0898" cy="16.0904" r="3.28912" fill="url(#paint36_linear_6903_5272)" />
</g>
<circle cx="20.4844" cy="15.5781" r="3.49219" fill="white" />
<circle cx="11.5156" cy="15.5781" r="3.49219" fill="white" />
<rect x="13.8281" y="21.8359" width="4.34375" height="5.45312" rx="2.17188" fill="url(#paint37_radial_6903_5272)" />
<path d="M3.04297 23.7969C3.04297 21.5964 4.82683 19.8125 7.02734 19.8125V19.8125C9.22785 19.8125 11.0117 21.5964 11.0117 23.7969V30H3.04297V23.7969Z" fill="url(#paint38_linear_6903_5272)" />
<path d="M3.04297 23.7969C3.04297 21.5964 4.82683 19.8125 7.02734 19.8125V19.8125C9.22785 19.8125 11.0117 21.5964 11.0117 23.7969V30H3.04297V23.7969Z" fill="url(#paint39_linear_6903_5272)" />
<path d="M3.04297 23.7969C3.04297 21.5964 4.82683 19.8125 7.02734 19.8125V19.8125C9.22785 19.8125 11.0117 21.5964 11.0117 23.7969V30H3.04297V23.7969Z" fill="url(#paint40_linear_6903_5272)" />
<g filter="url(#filter28_f_6903_5272)">
<ellipse cx="9.1763" cy="22.2576" rx="0.846269" ry="1.35723" transform="rotate(-27.2088 9.1763 22.2576)" fill="#FDD659" />
</g>
<g filter="url(#filter29_f_6903_5272)">
<path d="M8.21484 20.3437C8.21484 20.2316 8.30579 20.1406 8.41797 20.1406V20.1406C8.53015 20.1406 8.62109 20.2316 8.62109 20.3438V22.9531C8.62109 23.0653 8.53015 23.1563 8.41797 23.1563V23.1563C8.30579 23.1563 8.21484 23.0653 8.21484 22.9531V20.3437Z" fill="#DA7600" fill-opacity="0.5" />
</g>
<g filter="url(#filter30_f_6903_5272)">
<path d="M5.09766 20.3437C5.09766 20.2316 5.1886 20.1406 5.30078 20.1406V20.1406C5.41296 20.1406 5.50391 20.2316 5.50391 20.3438V22.9531C5.50391 23.0653 5.41296 23.1563 5.30078 23.1563V23.1563C5.1886 23.1563 5.09766 23.0653 5.09766 22.9531V20.3437Z" fill="#DA7600" fill-opacity="0.75" />
</g>
<path d="M5.16797 20.0547C5.16797 19.8692 5.31837 19.7188 5.50391 19.7188V19.7188C5.68944 19.7188 5.83984 19.8692 5.83984 20.0547V22.8203C5.83984 23.0058 5.68944 23.1562 5.50391 23.1562V23.1562C5.31837 23.1562 5.16797 23.0058 5.16797 22.8203V20.0547Z" fill="url(#paint41_linear_6903_5272)" />
<path d="M5.16797 20.0547C5.16797 19.8692 5.31837 19.7188 5.50391 19.7188V19.7188C5.68944 19.7188 5.83984 19.8692 5.83984 20.0547V22.8203C5.83984 23.0058 5.68944 23.1562 5.50391 23.1562V23.1562C5.31837 23.1562 5.16797 23.0058 5.16797 22.8203V20.0547Z" fill="url(#paint42_linear_6903_5272)" />
<path d="M5.16797 20.0547C5.16797 19.8692 5.31837 19.7188 5.50391 19.7188V19.7188C5.68944 19.7188 5.83984 19.8692 5.83984 20.0547V22.8203C5.83984 23.0058 5.68944 23.1562 5.50391 23.1562V23.1562C5.31837 23.1562 5.16797 23.0058 5.16797 22.8203V20.0547Z" fill="url(#paint43_linear_6903_5272)" />
<path d="M8.21484 20.0547C8.21484 19.8692 8.36525 19.7188 8.55078 19.7188V19.7188C8.73631 19.7188 8.88672 19.8692 8.88672 20.0547V22.8203C8.88672 23.0058 8.73631 23.1562 8.55078 23.1562V23.1562C8.36525 23.1562 8.21484 23.0058 8.21484 22.8203V20.0547Z" fill="url(#paint44_linear_6903_5272)" />
<path d="M8.21484 20.0547C8.21484 19.8692 8.36525 19.7188 8.55078 19.7188V19.7188C8.73631 19.7188 8.88672 19.8692 8.88672 20.0547V22.8203C8.88672 23.0058 8.73631 23.1562 8.55078 23.1562V23.1562C8.36525 23.1562 8.21484 23.0058 8.21484 22.8203V20.0547Z" fill="url(#paint45_linear_6903_5272)" />
<path d="M8.21484 20.0547C8.21484 19.8692 8.36525 19.7188 8.55078 19.7188V19.7188C8.73631 19.7188 8.88672 19.8692 8.88672 20.0547V22.8203C8.88672 23.0058 8.73631 23.1562 8.55078 23.1562V23.1562C8.36525 23.1562 8.21484 23.0058 8.21484 22.8203V20.0547Z" fill="url(#paint46_linear_6903_5272)" />
<g filter="url(#filter31_f_6903_5272)">
<path d="M8.7226 22.6797V20.4688" stroke="url(#paint47_linear_6903_5272)" stroke-width="0.2" stroke-linecap="round" />
</g>
<g filter="url(#filter32_f_6903_5272)">
<path d="M5.67572 22.6797V20.4688" stroke="url(#paint48_linear_6903_5272)" stroke-width="0.2" stroke-linecap="round" />
</g>
<defs>
<filter id="filter0_f_6903_5272" x="3.55408" y="20.25" width="5.72693" height="6.698" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.75" result="effect1_foregroundBlur_6903_5272" />
</filter>
<filter id="filter1_f_6903_5272" x="18.9327" y="4.48315" width="9.00903" height="11.6356" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.5" result="effect1_foregroundBlur_6903_5272" />
</filter>
<filter id="filter2_f_6903_5272" x="24.8055" y="4.34375" width="3.41745" height="4.625" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.5" result="effect1_foregroundBlur_6903_5272" />
</filter>
<filter id="filter3_f_6903_5272" x="2.90601" y="3.5625" width="8.94989" height="10.7285" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="1" result="effect1_foregroundBlur_6903_5272" />
</filter>
<filter id="filter4_f_6903_5272" x="13.7482" y="18.9684" width="3.66141" height="3.0238" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.25" result="effect1_foregroundBlur_6903_5272" />
</filter>
<filter id="filter5_f_6903_5272" x="14.9086" y="18.7795" width="2.72344" height="1.74846" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.3" result="effect1_foregroundBlur_6903_5272" />
</filter>
<filter id="filter6_f_6903_5272" x="23.685" y="19.9093" width="6.00494" height="4.0127" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.25" result="effect1_foregroundBlur_6903_5272" />
</filter>
<filter id="filter7_f_6903_5272" x="23.6851" y="23.7532" width="4.12671" height="3.56567" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.25" result="effect1_foregroundBlur_6903_5272" />
</filter>
<filter id="filter8_f_6903_5272" x="24.9163" y="20.1781" width="5.10474" height="3.11255" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.25" result="effect1_foregroundBlur_6903_5272" />
</filter>
<filter id="filter9_f_6903_5272" x="24.8484" y="23.8287" width="5.10162" height="3.11914" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.25" result="effect1_foregroundBlur_6903_5272" />
</filter>
<filter id="filter10_f_6903_5272" x="2.14175" y="23.8405" width="5.10162" height="3.11914" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.25" result="effect1_foregroundBlur_6903_5272" />
</filter>
<filter id="filter11_f_6903_5272" x="5.96417" y="23.7666" width="1.36395" height="1.33594" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.25" result="effect1_foregroundBlur_6903_5272" />
</filter>
<filter id="filter12_f_6903_5272" x="2.21042" y="19.9847" width="5.11365" height="3.09375" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.25" result="effect1_foregroundBlur_6903_5272" />
</filter>
<filter id="filter13_f_6903_5272" x="6.08273" y="21.7521" width="1.33606" height="1.36377" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.25" result="effect1_foregroundBlur_6903_5272" />
</filter>
<filter id="filter14_f_6903_5272" x="18.1024" y="6.03125" width="12.5851" height="22.1857" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="2" result="effect1_foregroundBlur_6903_5272" />
</filter>
<filter id="filter15_f_6903_5272" x="22.4086" y="6.69687" width="4.825" height="7.1375" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.3" result="effect1_foregroundBlur_6903_5272" />
</filter>
<filter id="filter16_f_6903_5272" x="22.7274" y="9.21875" width="4.53125" height="4.73438" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.375" result="effect1_foregroundBlur_6903_5272" />
</filter>
<filter id="filter17_f_6903_5272" x="4.72321" y="6.92896" width="4.46875" height="6.90771" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.25" result="effect1_foregroundBlur_6903_5272" />
</filter>
<filter id="filter18_f_6903_5272" x="4.64819" y="7.0813" width="1.15002" height="6.3374" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.25" result="effect1_foregroundBlur_6903_5272" />
</filter>
<filter id="filter19_f_6903_5272" x="17.1168" y="19.7944" width="10.3816" height="10.3816" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="1" result="effect1_foregroundBlur_6903_5272" />
</filter>
<filter id="filter20_f_6903_5272" x="25.5507" y="19.6406" width="1.3985" height="4.11719" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.25" result="effect1_foregroundBlur_6903_5272" />
</filter>
<filter id="filter21_f_6903_5272" x="22.4727" y="19.6406" width="1.40625" height="4.01562" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.25" result="effect1_foregroundBlur_6903_5272" />
</filter>
<filter id="filter22_f_6903_5272" x="24.6461" y="19.4897" width="4.95099" height="5.53577" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.75" result="effect1_foregroundBlur_6903_5272" />
</filter>
<filter id="filter23_f_6903_5272" x="26.3679" y="20.1688" width="0.600012" height="2.81089" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.1" result="effect1_foregroundBlur_6903_5272" />
</filter>
<filter id="filter24_f_6903_5272" x="23.321" y="20.1688" width="0.600012" height="2.81089" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.1" result="effect1_foregroundBlur_6903_5272" />
</filter>
<filter id="filter25_f_6903_5272" x="23.321" y="20.1688" width="0.600012" height="2.81089" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.1" result="effect1_foregroundBlur_6903_5272" />
</filter>
<filter id="filter26_f_6903_5272" x="6.58978" y="11.4844" width="8.98438" height="8.98438" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.5" result="effect1_foregroundBlur_6903_5272" />
</filter>
<filter id="filter27_f_6903_5272" x="15.8007" y="11.8013" width="8.57825" height="8.57825" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.5" result="effect1_foregroundBlur_6903_5272" />
</filter>
<filter id="filter28_f_6903_5272" x="6.70081" y="19.4897" width="4.95099" height="5.53577" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.75" result="effect1_foregroundBlur_6903_5272" />
</filter>
<filter id="filter29_f_6903_5272" x="7.71484" y="19.6406" width="1.40625" height="4.01562" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.25" result="effect1_foregroundBlur_6903_5272" />
</filter>
<filter id="filter30_f_6903_5272" x="4.59766" y="19.6406" width="1.40625" height="4.01562" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.25" result="effect1_foregroundBlur_6903_5272" />
</filter>
<filter id="filter31_f_6903_5272" x="8.42259" y="20.1688" width="0.600012" height="2.81089" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.1" result="effect1_foregroundBlur_6903_5272" />
</filter>
<filter id="filter32_f_6903_5272" x="5.37571" y="20.1688" width="0.600012" height="2.81089" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.1" result="effect1_foregroundBlur_6903_5272" />
</filter>
<linearGradient id="paint0_linear_6903_5272" x1="7.96361" y1="1.05993" x2="7.96361" y2="30.9999" gradientUnits="userSpaceOnUse">
<stop offset="0.288159" stop-color="#F2CC26" />
<stop offset="0.762024" stop-color="#E99E20" />
<stop offset="0.9925" stop-color="#E3821D" />
<stop offset="1" stop-color="#E3801D" />
</linearGradient>
<linearGradient id="paint1_linear_6903_5272" x1="8.88356" y1="11.8512" x2="1.25856" y2="11.8512" gradientUnits="userSpaceOnUse">
<stop stop-color="#E99E20" stop-opacity="0" />
<stop offset="0.9925" stop-color="#E3821D" />
<stop offset="1" stop-color="#E3801D" />
</linearGradient>
<linearGradient id="paint2_linear_6903_5272" x1="26.7586" y1="11.8512" x2="30.1961" y2="11.8512" gradientUnits="userSpaceOnUse">
<stop stop-color="#E99E20" stop-opacity="0" />
<stop offset="0.9925" stop-color="#E3821D" />
<stop offset="1" stop-color="#E3801D" />
</linearGradient>
<linearGradient id="paint3_linear_6903_5272" x1="16.0195" y1="-1.91422" x2="16.0186" y2="30.5233" gradientUnits="userSpaceOnUse">
<stop offset="0.77079" stop-color="#F59639" stop-opacity="0" />
<stop offset="1" stop-color="#FF63C4" />
</linearGradient>
<linearGradient id="paint4_linear_6903_5272" x1="16.0186" y1="11.0624" x2="16.0186" y2="32.3358" gradientUnits="userSpaceOnUse">
<stop offset="0.854227" stop-color="white" stop-opacity="0" />
<stop offset="0.985362" stop-color="white" />
</linearGradient>
<radialGradient id="paint5_radial_6903_5272" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(22.1648 4.21866) rotate(55.8501) scale(5.39983 10.6704)">
<stop stop-color="#FFA720" />
<stop offset="0.921158" stop-color="#FFA720" stop-opacity="0" />
</radialGradient>
<linearGradient id="paint6_linear_6903_5272" x1="23.4373" y1="8.96438" x2="27.9996" y2="13.6597" gradientUnits="userSpaceOnUse">
<stop stop-color="#FFA720" />
<stop offset="1" stop-color="#FFA720" stop-opacity="0" />
</linearGradient>
<linearGradient id="paint7_linear_6903_5272" x1="10.6023" y1="10.5469" x2="4.74255" y2="10" gradientUnits="userSpaceOnUse">
<stop offset="0.437473" stop-color="#ED8C1B" />
<stop offset="1" stop-color="#FFB03A" />
</linearGradient>
<linearGradient id="paint8_linear_6903_5272" x1="27.0399" y1="4.89063" x2="26.4438" y2="7.23208" gradientUnits="userSpaceOnUse">
<stop offset="0.28598" stop-color="#FFE792" />
<stop offset="1" stop-color="#FFDD65" stop-opacity="0" />
</linearGradient>
<linearGradient id="paint9_linear_6903_5272" x1="15.7507" y1="21.2636" x2="15.0789" y2="22.3573" gradientUnits="userSpaceOnUse">
<stop stop-color="#E3900E" />
<stop offset="1" stop-color="#EA9D26" stop-opacity="0" />
</linearGradient>
<radialGradient id="paint10_radial_6903_5272" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(16.4461 20.092) rotate(-153.246) scale(2.11729 2.12981)">
<stop stop-color="#EA088B" />
<stop offset="1" stop-color="#E61E27" />
</radialGradient>
<linearGradient id="paint11_linear_6903_5272" x1="17.2036" y1="19.6538" x2="15.6801" y2="19.6538" gradientUnits="userSpaceOnUse">
<stop stop-color="white" stop-opacity="0.9" />
<stop offset="1" stop-color="white" stop-opacity="0" />
</linearGradient>
<linearGradient id="paint12_linear_6903_5272" x1="24.2898" y1="23.1656" x2="28.0242" y2="21.2499" gradientUnits="userSpaceOnUse">
<stop stop-color="#E88105" />
<stop offset="1" stop-color="#E37D02" stop-opacity="0" />
</linearGradient>
<linearGradient id="paint13_linear_6903_5272" x1="24.2898" y1="24.5095" x2="28.0242" y2="26.4252" gradientUnits="userSpaceOnUse">
<stop offset="0.286458" stop-color="#DE7D07" />
<stop offset="0.817708" stop-color="#E37D02" stop-opacity="0" />
</linearGradient>
<linearGradient id="paint14_linear_6903_5272" x1="25.2898" y1="22.875" x2="29.5273" y2="20.7422" gradientUnits="userSpaceOnUse">
<stop offset="0.75086" stop-color="#D64A38" />
<stop offset="1" stop-color="#FB7425" />
</linearGradient>
<linearGradient id="paint15_linear_6903_5272" x1="25.0739" y1="24.6393" x2="29.8242" y2="26.9765" gradientUnits="userSpaceOnUse">
<stop offset="0.792349" stop-color="#D64A38" />
<stop offset="1" stop-color="#FB7425" />
</linearGradient>
<linearGradient id="paint16_linear_6903_5272" x1="7.01785" y1="24.651" x2="2.02727" y2="27.1484" gradientUnits="userSpaceOnUse">
<stop offset="0.75156" stop-color="#D64A38" />
<stop offset="1" stop-color="#FB7425" />
</linearGradient>
<linearGradient id="paint17_linear_6903_5272" x1="6.8182" y1="22.8588" x2="2.72751" y2="20.9415" gradientUnits="userSpaceOnUse">
<stop offset="0.664576" stop-color="#D64A38" />
<stop offset="1" stop-color="#FB7425" />
</linearGradient>
<linearGradient id="paint18_linear_6903_5272" x1="23.3524" y1="10.7682" x2="22.9558" y2="22.8188" gradientUnits="userSpaceOnUse">
<stop offset="0.548257" stop-color="#FFDD65" />
<stop offset="1" stop-color="#FFDD65" stop-opacity="0" />
</linearGradient>
<linearGradient id="paint19_linear_6903_5272" x1="26.5398" y1="15.4375" x2="25.2898" y2="11.9688" gradientUnits="userSpaceOnUse">
<stop stop-color="#EF8A47" />
<stop offset="1" stop-color="#EF8A47" stop-opacity="0" />
</linearGradient>
<radialGradient id="paint20_radial_6903_5272" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(22.868 7.70313) rotate(55.7389) scale(7.82686 9.38424)">
<stop stop-color="#FFDF70" />
<stop offset="1" stop-color="#FFDF70" stop-opacity="0" />
</radialGradient>
<linearGradient id="paint21_linear_6903_5272" x1="25.0555" y1="10.4063" x2="25.0555" y2="12.75" gradientUnits="userSpaceOnUse">
<stop offset="0.432292" stop-color="#FFE7A3" />
<stop offset="1" stop-color="#FFDF83" stop-opacity="0" />
</linearGradient>
<linearGradient id="paint22_linear_6903_5272" x1="22.3076" y1="26.9378" x2="15.2054" y2="30.4582" gradientUnits="userSpaceOnUse">
<stop stop-color="#DA7600" />
<stop offset="1" stop-color="#DA8400" stop-opacity="0" />
</linearGradient>
<linearGradient id="paint23_linear_6903_5272" x1="28.957" y1="30.4034" x2="20.9883" y2="30.4034" gradientUnits="userSpaceOnUse">
<stop offset="0.160663" stop-color="#F2CC26" />
<stop offset="0.642165" stop-color="#E99E20" />
<stop offset="0.9925" stop-color="#E3821D" />
<stop offset="1" stop-color="#E3801D" />
</linearGradient>
<linearGradient id="paint24_linear_6903_5272" x1="28.957" y1="30.4034" x2="20.9883" y2="30.5625" gradientUnits="userSpaceOnUse">
<stop offset="0.865694" stop-color="#E3821D" stop-opacity="0" />
<stop offset="1" stop-color="#D37516" />
</linearGradient>
<linearGradient id="paint25_linear_6903_5272" x1="26.621" y1="30.4034" x2="34.8085" y2="30.4034" gradientUnits="userSpaceOnUse">
<stop stop-color="#E99E20" stop-opacity="0" />
<stop offset="1" stop-color="#E99E20" />
</linearGradient>
<linearGradient id="paint26_linear_6903_5272" x1="23.7852" y1="22" x2="22.8242" y2="22" gradientUnits="userSpaceOnUse">
<stop stop-color="#FFB445" />
<stop offset="1" stop-color="#E9A239" stop-opacity="0.921875" />
</linearGradient>
<linearGradient id="paint27_linear_6903_5272" x1="22.3398" y1="22.1094" x2="23.621" y2="22.0312" gradientUnits="userSpaceOnUse">
<stop offset="0.366667" stop-color="#D6850E" />
<stop offset="1" stop-color="#CC861F" stop-opacity="0" />
</linearGradient>
<linearGradient id="paint28_linear_6903_5272" x1="23.4492" y1="24.2188" x2="23.4492" y2="22.6484" gradientUnits="userSpaceOnUse">
<stop stop-color="#FF91B9" />
<stop offset="1" stop-color="#FD679E" stop-opacity="0" />
</linearGradient>
<linearGradient id="paint29_linear_6903_5272" x1="26.832" y1="22" x2="25.871" y2="22" gradientUnits="userSpaceOnUse">
<stop stop-color="#FFB445" />
<stop offset="1" stop-color="#E9A239" stop-opacity="0.921875" />
</linearGradient>
<linearGradient id="paint30_linear_6903_5272" x1="25.4335" y1="22.0469" x2="26.371" y2="22.0469" gradientUnits="userSpaceOnUse">
<stop offset="0.366667" stop-color="#D6850E" />
<stop offset="1" stop-color="#CC861F" stop-opacity="0" />
</linearGradient>
<linearGradient id="paint31_linear_6903_5272" x1="26.4961" y1="24.2188" x2="26.4961" y2="22.6484" gradientUnits="userSpaceOnUse">
<stop stop-color="#FF91B9" />
<stop offset="1" stop-color="#FD679E" stop-opacity="0" />
</linearGradient>
<linearGradient id="paint32_linear_6903_5272" x1="27.082" y1="23.3047" x2="26.5405" y2="18.9978" gradientUnits="userSpaceOnUse">
<stop stop-color="#FFC270" />
<stop offset="0.769643" stop-color="#FFE2BB" stop-opacity="0" />
</linearGradient>
<linearGradient id="paint33_linear_6903_5272" x1="24.0351" y1="23.3047" x2="23.4936" y2="18.9978" gradientUnits="userSpaceOnUse">
<stop stop-color="#FFC270" />
<stop offset="0.769643" stop-color="#FFE2BB" stop-opacity="0" />
</linearGradient>
<linearGradient id="paint34_linear_6903_5272" x1="24.0351" y1="23.3047" x2="23.4936" y2="18.9978" gradientUnits="userSpaceOnUse">
<stop stop-color="#FFC270" />
<stop offset="0.769643" stop-color="#FFE2BB" stop-opacity="0" />
</linearGradient>
<linearGradient id="paint35_linear_6903_5272" x1="16.7421" y1="17.596" x2="18.0686" y2="26.3006" gradientUnits="userSpaceOnUse">
<stop stop-color="#CF8209" />
<stop offset="1" stop-color="#C88216" stop-opacity="0" />
</linearGradient>
<linearGradient id="paint36_linear_6903_5272" x1="25.4208" y1="17.6157" x2="26.6701" y2="25.8141" gradientUnits="userSpaceOnUse">
<stop stop-color="#CF8209" />
<stop offset="1" stop-color="#C88216" stop-opacity="0" />
</linearGradient>
<radialGradient id="paint37_radial_6903_5272" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(16 28.5009) rotate(-90) scale(5.91493 9.37069)">
<stop stop-color="#F70A8D" />
<stop offset="1" stop-color="#89029C" />
</radialGradient>
<linearGradient id="paint38_linear_6903_5272" x1="11.0117" y1="30.4034" x2="3.04297" y2="30.4034" gradientUnits="userSpaceOnUse">
<stop offset="0.160663" stop-color="#F2CC26" />
<stop offset="0.642165" stop-color="#E99E20" />
<stop offset="0.9925" stop-color="#E3821D" />
<stop offset="1" stop-color="#E3801D" />
</linearGradient>
<linearGradient id="paint39_linear_6903_5272" x1="11.0117" y1="30.4034" x2="3.04297" y2="30.5625" gradientUnits="userSpaceOnUse">
<stop offset="0.865694" stop-color="#E3821D" stop-opacity="0" />
<stop offset="1" stop-color="#D37516" />
</linearGradient>
<linearGradient id="paint40_linear_6903_5272" x1="8.67572" y1="30.4034" x2="16.8632" y2="30.4034" gradientUnits="userSpaceOnUse">
<stop stop-color="#E99E20" stop-opacity="0" />
<stop offset="1" stop-color="#E99E20" />
</linearGradient>
<linearGradient id="paint41_linear_6903_5272" x1="5.83984" y1="22" x2="4.87885" y2="22" gradientUnits="userSpaceOnUse">
<stop stop-color="#FFB445" />
<stop offset="1" stop-color="#E9A239" stop-opacity="0.921875" />
</linearGradient>
<linearGradient id="paint42_linear_6903_5272" x1="4.39447" y1="22.1094" x2="5.67572" y2="22.0312" gradientUnits="userSpaceOnUse">
<stop offset="0.366667" stop-color="#D6850E" />
<stop offset="1" stop-color="#CC861F" stop-opacity="0" />
</linearGradient>
<linearGradient id="paint43_linear_6903_5272" x1="5.50391" y1="24.2188" x2="5.50391" y2="22.6484" gradientUnits="userSpaceOnUse">
<stop stop-color="#FF91B9" />
<stop offset="1" stop-color="#FD679E" stop-opacity="0" />
</linearGradient>
<linearGradient id="paint44_linear_6903_5272" x1="8.88672" y1="22" x2="7.92572" y2="22" gradientUnits="userSpaceOnUse">
<stop stop-color="#FFB445" />
<stop offset="1" stop-color="#E9A239" stop-opacity="0.921875" />
</linearGradient>
<linearGradient id="paint45_linear_6903_5272" x1="7.48822" y1="22.0469" x2="8.42572" y2="22.0469" gradientUnits="userSpaceOnUse">
<stop offset="0.366667" stop-color="#D6850E" />
<stop offset="1" stop-color="#CC861F" stop-opacity="0" />
</linearGradient>
<linearGradient id="paint46_linear_6903_5272" x1="8.55078" y1="24.2188" x2="8.55078" y2="22.6484" gradientUnits="userSpaceOnUse">
<stop stop-color="#FF91B9" />
<stop offset="1" stop-color="#FD679E" stop-opacity="0" />
</linearGradient>
<linearGradient id="paint47_linear_6903_5272" x1="9.13666" y1="23.3047" x2="8.59516" y2="18.9978" gradientUnits="userSpaceOnUse">
<stop stop-color="#FFC270" />
<stop offset="0.769643" stop-color="#FFE2BB" stop-opacity="0" />
</linearGradient>
<linearGradient id="paint48_linear_6903_5272" x1="6.08978" y1="23.3047" x2="5.54828" y2="18.9978" gradientUnits="userSpaceOnUse">
<stop stop-color="#FFC270" />
<stop offset="0.769643" stop-color="#FFE2BB" stop-opacity="0" />
</linearGradient>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 42 KiB

View File

@ -1,345 +0,0 @@
<svg width="100%" height="100%" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M4 25.942C4 28.1739 5.76327 30 7.91837 30H24.0816C26.2367 30 28 28.0725 28 25.8406V6.4297C28 5.1297 26.4099 4.5297 25.5155 5.4297L20.9736 10H11.1617L6.5 5.4297C5.6 4.5297 4 5.1297 4 6.4297V25.942Z" fill="url(#paint0_linear_6893_5267)" />
<path d="M4 25.942C4 28.1739 5.76327 30 7.91837 30H24.0816C26.2367 30 28 28.0725 28 25.8406V6.4297C28 5.1297 26.4099 4.5297 25.5155 5.4297L20.9736 10H11.1617L6.5 5.4297C5.6 4.5297 4 5.1297 4 6.4297V25.942Z" fill="url(#paint1_linear_6893_5267)" />
<path d="M4 25.942C4 28.1739 5.76327 30 7.91837 30H24.0816C26.2367 30 28 28.0725 28 25.8406V6.4297C28 5.1297 26.4099 4.5297 25.5155 5.4297L20.9736 10H11.1617L6.5 5.4297C5.6 4.5297 4 5.1297 4 6.4297V25.942Z" fill="url(#paint2_linear_6893_5267)" />
<path d="M4 25.942C4 28.1739 5.76327 30 7.91837 30H24.0816C26.2367 30 28 28.0725 28 25.8406V6.4297C28 5.1297 26.4099 4.5297 25.5155 5.4297L20.9736 10H11.1617L6.5 5.4297C5.6 4.5297 4 5.1297 4 6.4297V25.942Z" fill="url(#paint3_linear_6893_5267)" />
<path d="M4 25.942C4 28.1739 5.76327 30 7.91837 30H24.0816C26.2367 30 28 28.0725 28 25.8406V6.4297C28 5.1297 26.4099 4.5297 25.5155 5.4297L20.9736 10H11.1617L6.5 5.4297C5.6 4.5297 4 5.1297 4 6.4297V25.942Z" fill="url(#paint4_linear_6893_5267)" />
<path d="M4 25.942C4 28.1739 5.76327 30 7.91837 30H24.0816C26.2367 30 28 28.0725 28 25.8406V6.4297C28 5.1297 26.4099 4.5297 25.5155 5.4297L20.9736 10H11.1617L6.5 5.4297C5.6 4.5297 4 5.1297 4 6.4297V25.942Z" fill="url(#paint5_radial_6893_5267)" />
<g filter="url(#filter0_f_6893_5267)">
<rect x="5.05408" y="21.8203" width="2.72692" height="3.69801" rx="1.36346" fill="#D67908" />
</g>
<g filter="url(#filter1_f_6893_5267)">
<path d="M20.7508 10.2007C17.7675 10.3082 25.9773 15.1544 25.9773 15.1544L27.1023 6.09195C27.157 5.63101 26.7382 5.13844 25.8523 5.96097C25.8523 5.96097 22.0258 9.72898 21.8387 9.91319C21.6516 10.0974 21.4307 10.1621 21.1371 10.2007C20.9875 10.2203 20.9015 10.1952 20.7508 10.2007Z" fill="url(#paint6_linear_6893_5267)" />
</g>
<path d="M6.13258 13.5034L8.93258 10.9034C9.25258 10.6034 9.25258 10.1234 8.93258 9.83344L5.9179 7.15626C5.53508 6.82032 4.74258 6.9297 4.74258 7.76344V12.9634C4.74258 13.7969 5.62258 13.9834 6.13258 13.5034Z" fill="url(#paint7_linear_6893_5267)" />
<g filter="url(#filter2_f_6893_5267)">
<path d="M26.4909 5.65184C26.5488 5.50816 26.6882 5.41406 26.8431 5.41406V5.41406C27.0529 5.41406 27.2229 5.58411 27.2229 5.79388V8.03906L25.8055 7.35156L26.4909 5.65184Z" fill="url(#paint8_linear_6893_5267)" />
</g>
<g filter="url(#filter3_f_6893_5267)">
<path d="M5.44611 5.72656L8.82107 8.9461C9.57518 9.66548 9.58931 10.8646 8.85236 11.6016V11.6016" stroke="#FFDF70" stroke-linecap="round" />
</g>
<g filter="url(#filter4_f_6893_5267)">
<path d="M14.8054 20.6502L14.8697 20.6352C15.3433 20.5248 15.8366 20.5299 16.3077 20.6502V20.6502C16.8288 20.7484 17.1399 21.3457 16.6999 21.7757L16.1491 22.3773C15.8791 22.6473 15.2863 22.6473 15.0163 22.3773L14.4734 21.7757C14.0241 21.2679 14.3054 20.7601 14.8054 20.6502Z" fill="url(#paint9_linear_6893_5267)" />
</g>
<path d="M15.2265 20.2066L15.2908 20.1916C15.7644 20.0811 16.2577 20.0862 16.7289 20.2066V20.2066C17.25 20.3047 17.561 20.902 17.121 21.332L16.5703 21.9336C16.3003 22.2036 15.7075 22.2036 15.4375 21.9336L14.8945 21.332C14.4453 20.8242 14.7265 20.3164 15.2265 20.2066Z" fill="url(#paint10_radial_6893_5267)" />
<g filter="url(#filter5_f_6893_5267)">
<ellipse cx="16.2703" cy="20.7414" rx="0.761719" ry="0.274258" fill="url(#paint11_linear_6893_5267)" />
</g>
<g filter="url(#filter6_f_6893_5267)">
<path d="M24.7851 22.8923L28.5898 21.0798" stroke="url(#paint12_linear_6893_5267)" stroke-width="1.2" stroke-miterlimit="10" stroke-linecap="round" />
</g>
<g filter="url(#filter7_f_6893_5267)">
<path d="M24.7851 24.9235L26.7117 26.2891" stroke="url(#paint13_linear_6893_5267)" stroke-width="1.2" stroke-miterlimit="10" stroke-linecap="round" />
</g>
<path d="M25.5663 22.5391L29.371 20.7266" stroke="url(#paint14_linear_6893_5267)" stroke-width="1.2" stroke-miterlimit="10" stroke-linecap="round" />
<g filter="url(#filter8_f_6893_5267)">
<path d="M25.5663 22.7109L29.371 20.8984" stroke="#FF8485" stroke-width="0.3" stroke-miterlimit="10" stroke-linecap="round" />
</g>
<g filter="url(#filter9_f_6893_5267)">
<ellipse cx="29.6059" cy="20.5806" rx="0.18384" ry="0.165827" transform="rotate(-22.7455 29.6059 20.5806)" fill="#FFDD86" />
</g>
<path d="M25.5636 24.6692L29.3652 26.4883" stroke="url(#paint15_linear_6893_5267)" stroke-width="1.2" stroke-miterlimit="10" stroke-linecap="round" />
<g filter="url(#filter10_f_6893_5267)">
<path d="M25.4984 24.5491L29.3 26.3682" stroke="#FF8485" stroke-width="0.3" stroke-miterlimit="10" stroke-linecap="round" />
</g>
<g filter="url(#filter11_f_6893_5267)">
<ellipse cx="29.5404" cy="26.3682" rx="0.18384" ry="0.165827" transform="rotate(28.2981 29.5404 26.3682)" fill="#FFDD86" />
</g>
<path d="M6.5281 24.681L2.72654 26.5" stroke="url(#paint16_linear_6893_5267)" stroke-width="1.2" stroke-miterlimit="10" stroke-linecap="round" />
<g filter="url(#filter12_f_6893_5267)">
<path d="M6.59334 24.5608L2.79179 26.3799" stroke="#FF8485" stroke-width="0.3" stroke-miterlimit="10" stroke-linecap="round" />
</g>
<g filter="url(#filter13_f_6893_5267)">
<ellipse rx="0.18384" ry="0.165827" transform="matrix(-0.942776 -0.333427 -0.333427 0.942776 6.64614 24.5049)" fill="#FFDD86" />
</g>
<path d="M6.53973 22.5243L2.72615 20.7306" stroke="url(#paint17_linear_6893_5267)" stroke-width="1.2" stroke-miterlimit="10" stroke-linecap="round" />
<g filter="url(#filter14_f_6893_5267)">
<path d="M6.67403 22.4988L2.86046 20.7051" stroke="#FF8485" stroke-width="0.3" stroke-miterlimit="10" stroke-linecap="round" />
</g>
<g filter="url(#filter15_f_6893_5267)">
<ellipse rx="0.18384" ry="0.165827" transform="matrix(-0.338111 -0.941106 -0.941106 0.338111 6.75078 22.5043)" fill="#FFDD86" />
</g>
<path d="M20.4179 23.0547C20.4179 25.4947 18.436 27.3906 15.996 27.3906C13.556 27.3906 11.6835 25.4478 11.6835 23.0078C11.6835 23.0078 13.4882 25.1406 15.996 23.0078C18.3476 25.0859 20.4179 23.0547 20.4179 23.0547Z" fill="url(#paint18_linear_6893_5267)" />
<g filter="url(#filter16_f_6893_5267)">
<rect x="22.1024" y="10.1016" width="4.5851" height="14.1857" fill="url(#paint19_linear_6893_5267)" />
</g>
<path d="M25.8329 13.5034L23.0329 10.9034C22.7129 10.6034 22.7129 10.1234 23.0329 9.83344L26.0476 7.15626C26.4304 6.82032 27.2229 6.9297 27.2229 7.76344V12.9634C27.2229 13.7969 26.3429 13.9834 25.8329 13.5034Z" fill="#FFB915" />
<path d="M25.8329 13.5034L23.0329 10.9034C22.7129 10.6034 22.7129 10.1234 23.0329 9.83344L26.0476 7.15626C26.4304 6.82032 27.2229 6.9297 27.2229 7.76344V12.9634C27.2229 13.7969 26.3429 13.9834 25.8329 13.5034Z" fill="url(#paint20_linear_6893_5267)" />
<g filter="url(#filter17_f_6893_5267)">
<path d="M26.6336 7.36719L23.0086 10.4922L26.5555 13.3047L26.6336 7.36719Z" fill="url(#paint21_radial_6893_5267)" />
</g>
<g filter="url(#filter18_f_6893_5267)">
<path d="M23.7274 10.2891L26.2586 13.0234" stroke="url(#paint22_linear_6893_5267)" stroke-width="0.5" stroke-linecap="round" />
</g>
<g filter="url(#filter19_f_6893_5267)">
<path d="M5.22321 7.49927V13.407L8.69196 10.3176L5.22321 7.49927Z" fill="#FEB33E" />
</g>
<g filter="url(#filter20_f_6893_5267)">
<path d="M5.22321 7.72656V12.9141" stroke="#FFE7A3" stroke-width="0.15" stroke-linecap="round" />
</g>
<g filter="url(#filter21_f_6893_5267)">
<path fill-rule="evenodd" clip-rule="evenodd" d="M10.9757 19.2763C10.8347 19.4617 10.7771 19.6974 10.7723 19.8424C10.7623 20.1459 10.5081 20.3839 10.2045 20.3739C9.90093 20.3639 9.66293 20.1097 9.67294 19.8061C9.68379 19.4771 9.79655 19.0096 10.1001 18.6105C10.4221 18.187 10.9408 17.868 11.6758 17.868C12.4182 17.868 12.9418 18.203 13.2658 18.6309C13.572 19.0351 13.6947 19.5116 13.7022 19.8512C13.7089 20.1549 13.4681 20.4065 13.1644 20.4132C12.8607 20.4198 12.6091 20.1791 12.6025 19.8754C12.5995 19.741 12.5403 19.4948 12.3889 19.295C12.2553 19.1186 12.0458 18.968 11.6758 18.968C11.2983 18.968 11.0982 19.1151 10.9757 19.2763Z" fill="url(#paint23_linear_6893_5267)" />
</g>
<g filter="url(#filter22_f_6893_5267)">
<path fill-rule="evenodd" clip-rule="evenodd" d="M18.9445 19.2763C18.8035 19.4617 18.7459 19.6974 18.7411 19.8424C18.7311 20.1459 18.4769 20.3839 18.1733 20.3739C17.8697 20.3639 17.6317 20.1097 17.6417 19.8061C17.6526 19.4771 17.7653 19.0096 18.0688 18.6105C18.3909 18.187 18.9095 17.868 19.6445 17.868C20.387 17.868 20.9105 18.203 21.2346 18.6309C21.5407 19.0351 21.6635 19.5116 21.671 19.8512C21.6777 20.1549 21.4369 20.4065 21.1332 20.4132C20.8295 20.4198 20.5779 20.1791 20.5712 19.8754C20.5683 19.741 20.509 19.4948 20.3577 19.295C20.2241 19.1186 20.0146 18.968 19.6445 18.968C19.2671 18.968 19.067 19.1151 18.9445 19.2763Z" fill="url(#paint24_linear_6893_5267)" />
</g>
<path d="M10.5508 19.4141C10.5664 18.9401 10.8914 18.0078 12.0039 18.0078C13.1164 18.0078 13.4701 18.9792 13.4805 19.4531" stroke="url(#paint25_radial_6893_5267)" stroke-width="1.1" stroke-linecap="round" />
<path d="M10.5508 19.4141C10.5664 18.9401 10.8914 18.0078 12.0039 18.0078C13.1164 18.0078 13.4701 18.9792 13.4805 19.4531" stroke="url(#paint26_linear_6893_5267)" stroke-width="1.1" stroke-linecap="round" />
<path d="M18.5195 19.4141C18.5352 18.9401 18.8602 18.0078 19.9727 18.0078C21.0852 18.0078 21.4388 18.9792 21.4492 19.4531" stroke="url(#paint27_radial_6893_5267)" stroke-width="1.1" stroke-linecap="round" />
<path d="M18.5195 19.4141C18.5352 18.9401 18.8602 18.0078 19.9727 18.0078C21.0852 18.0078 21.4388 18.9792 21.4492 19.4531" stroke="url(#paint28_linear_6893_5267)" stroke-width="1.1" stroke-linecap="round" />
<g filter="url(#filter23_f_6893_5267)">
<ellipse cx="21.5391" cy="19.3672" rx="0.164062" ry="0.226562" fill="#715167" />
</g>
<g filter="url(#filter24_f_6893_5267)">
<ellipse cx="13.6445" cy="19.3672" rx="0.164062" ry="0.226562" fill="#715167" />
</g>
<defs>
<filter id="filter0_f_6893_5267" x="3.55408" y="20.3203" width="5.72693" height="6.698" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.75" result="effect1_foregroundBlur_6893_5267" />
</filter>
<filter id="filter1_f_6893_5267" x="19.098" y="4.5188" width="9.00903" height="11.6356" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.5" result="effect1_foregroundBlur_6893_5267" />
</filter>
<filter id="filter2_f_6893_5267" x="24.8055" y="4.41406" width="3.41745" height="4.625" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.5" result="effect1_foregroundBlur_6893_5267" />
</filter>
<filter id="filter3_f_6893_5267" x="2.94611" y="3.22656" width="8.94989" height="10.7286" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="1" result="effect1_foregroundBlur_6893_5267" />
</filter>
<filter id="filter4_f_6893_5267" x="13.7482" y="20.056" width="3.66141" height="3.02374" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.25" result="effect1_foregroundBlur_6893_5267" />
</filter>
<filter id="filter5_f_6893_5267" x="14.9086" y="19.8671" width="2.72344" height="1.74852" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.3" result="effect1_foregroundBlur_6893_5267" />
</filter>
<filter id="filter6_f_6893_5267" x="23.685" y="19.9796" width="6.00494" height="4.01282" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.25" result="effect1_foregroundBlur_6893_5267" />
</filter>
<filter id="filter7_f_6893_5267" x="23.6851" y="23.8235" width="4.12671" height="3.56561" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.25" result="effect1_foregroundBlur_6893_5267" />
</filter>
<filter id="filter8_f_6893_5267" x="24.9163" y="20.2484" width="5.10474" height="3.11255" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.25" result="effect1_foregroundBlur_6893_5267" />
</filter>
<filter id="filter9_f_6893_5267" x="28.9245" y="19.9119" width="1.36264" height="1.3374" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.25" result="effect1_foregroundBlur_6893_5267" />
</filter>
<filter id="filter10_f_6893_5267" x="24.8484" y="23.8991" width="5.10162" height="3.11908" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.25" result="effect1_foregroundBlur_6893_5267" />
</filter>
<filter id="filter11_f_6893_5267" x="28.8604" y="25.6981" width="1.35999" height="1.34009" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.25" result="effect1_foregroundBlur_6893_5267" />
</filter>
<filter id="filter12_f_6893_5267" x="2.14175" y="23.9108" width="5.10162" height="3.11908" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.25" result="effect1_foregroundBlur_6893_5267" />
</filter>
<filter id="filter13_f_6893_5267" x="5.96417" y="23.8369" width="1.36395" height="1.33594" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.25" result="effect1_foregroundBlur_6893_5267" />
</filter>
<filter id="filter14_f_6893_5267" x="2.21042" y="20.0551" width="5.11365" height="3.09381" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.25" result="effect1_foregroundBlur_6893_5267" />
</filter>
<filter id="filter15_f_6893_5267" x="6.08273" y="21.8224" width="1.33606" height="1.36389" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.25" result="effect1_foregroundBlur_6893_5267" />
</filter>
<filter id="filter16_f_6893_5267" x="18.1024" y="6.10156" width="12.5851" height="22.1857" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="2" result="effect1_foregroundBlur_6893_5267" />
</filter>
<filter id="filter17_f_6893_5267" x="22.4086" y="6.76719" width="4.825" height="7.1375" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.3" result="effect1_foregroundBlur_6893_5267" />
</filter>
<filter id="filter18_f_6893_5267" x="22.7274" y="9.28906" width="4.53125" height="4.73438" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.375" result="effect1_foregroundBlur_6893_5267" />
</filter>
<filter id="filter19_f_6893_5267" x="4.72321" y="6.99927" width="4.46875" height="6.90771" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.25" result="effect1_foregroundBlur_6893_5267" />
</filter>
<filter id="filter20_f_6893_5267" x="4.64819" y="7.15155" width="1.15002" height="6.33752" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.25" result="effect1_foregroundBlur_6893_5267" />
</filter>
<filter id="filter21_f_6893_5267" x="9.27264" y="17.468" width="4.82969" height="3.34529" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.2" result="effect1_foregroundBlur_6893_5267" />
</filter>
<filter id="filter22_f_6893_5267" x="17.2414" y="17.468" width="4.82969" height="3.34529" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.2" result="effect1_foregroundBlur_6893_5267" />
</filter>
<filter id="filter23_f_6893_5267" x="20.975" y="18.7406" width="1.12813" height="1.25313" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.2" result="effect1_foregroundBlur_6893_5267" />
</filter>
<filter id="filter24_f_6893_5267" x="13.0805" y="18.7406" width="1.12813" height="1.25313" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.2" result="effect1_foregroundBlur_6893_5267" />
</filter>
<linearGradient id="paint0_linear_6893_5267" x1="7.90668" y1="1.34978" x2="7.90668" y2="30.99" gradientUnits="userSpaceOnUse">
<stop offset="0.288159" stop-color="#F2CC26" />
<stop offset="0.762024" stop-color="#E99E20" />
<stop offset="0.9925" stop-color="#E3821D" />
<stop offset="1" stop-color="#E3801D" />
</linearGradient>
<linearGradient id="paint1_linear_6893_5267" x1="8.83102" y1="12.033" x2="1.16971" y2="12.033" gradientUnits="userSpaceOnUse">
<stop stop-color="#E99E20" stop-opacity="0" />
<stop offset="0.9925" stop-color="#E3821D" />
<stop offset="1" stop-color="#E3801D" />
</linearGradient>
<linearGradient id="paint2_linear_6893_5267" x1="26.7911" y1="12.033" x2="30.245" y2="12.033" gradientUnits="userSpaceOnUse">
<stop stop-color="#E99E20" stop-opacity="0" />
<stop offset="0.9925" stop-color="#E3821D" />
<stop offset="1" stop-color="#E3801D" />
</linearGradient>
<linearGradient id="paint3_linear_6893_5267" x1="16.001" y1="-1.59459" x2="16" y2="30.99" gradientUnits="userSpaceOnUse">
<stop offset="0.77079" stop-color="#F59639" stop-opacity="0" />
<stop offset="1" stop-color="#FF63C4" />
</linearGradient>
<linearGradient id="paint4_linear_6893_5267" x1="16" y1="11.2521" x2="16" y2="32.475" gradientUnits="userSpaceOnUse">
<stop offset="0.854227" stop-color="white" stop-opacity="0" />
<stop offset="0.985362" stop-color="white" />
</linearGradient>
<radialGradient id="paint5_radial_6893_5267" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(22.1755 4.47688) rotate(55.4547) scale(5.37104 10.6707)">
<stop stop-color="#FFA720" />
<stop offset="0.921158" stop-color="#FFA720" stop-opacity="0" />
</radialGradient>
<linearGradient id="paint6_linear_6893_5267" x1="21.9081" y1="6.85159" x2="28.1649" y2="13.6953" gradientUnits="userSpaceOnUse">
<stop stop-color="#FFA720" />
<stop offset="1" stop-color="#FFA720" stop-opacity="0" />
</linearGradient>
<linearGradient id="paint7_linear_6893_5267" x1="10.6023" y1="10.6172" x2="4.74258" y2="10.0703" gradientUnits="userSpaceOnUse">
<stop offset="0.437473" stop-color="#ED8C1B" />
<stop offset="1" stop-color="#FFB03A" />
</linearGradient>
<linearGradient id="paint8_linear_6893_5267" x1="27.0399" y1="4.96094" x2="26.4438" y2="7.30239" gradientUnits="userSpaceOnUse">
<stop offset="0.28598" stop-color="#FFE792" />
<stop offset="1" stop-color="#FFDD65" stop-opacity="0" />
</linearGradient>
<linearGradient id="paint9_linear_6893_5267" x1="15.7508" y1="22.3512" x2="15.0789" y2="23.4449" gradientUnits="userSpaceOnUse">
<stop stop-color="#E3900E" />
<stop offset="1" stop-color="#EA9D26" stop-opacity="0" />
</linearGradient>
<radialGradient id="paint10_radial_6893_5267" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(16.4461 21.1797) rotate(-153.246) scale(2.11729 2.12981)">
<stop stop-color="#EA088B" />
<stop offset="1" stop-color="#E61E27" />
</radialGradient>
<linearGradient id="paint11_linear_6893_5267" x1="17.2036" y1="20.7414" x2="15.6801" y2="20.7414" gradientUnits="userSpaceOnUse">
<stop stop-color="white" stop-opacity="0.9" />
<stop offset="1" stop-color="white" stop-opacity="0" />
</linearGradient>
<linearGradient id="paint12_linear_6893_5267" x1="24.2898" y1="23.236" x2="28.0242" y2="21.3203" gradientUnits="userSpaceOnUse">
<stop stop-color="#E88105" />
<stop offset="1" stop-color="#E37D02" stop-opacity="0" />
</linearGradient>
<linearGradient id="paint13_linear_6893_5267" x1="24.2898" y1="24.5798" x2="28.0242" y2="26.4955" gradientUnits="userSpaceOnUse">
<stop offset="0.286458" stop-color="#DE7D07" />
<stop offset="0.817708" stop-color="#E37D02" stop-opacity="0" />
</linearGradient>
<linearGradient id="paint14_linear_6893_5267" x1="25.2898" y1="22.9453" x2="29.371" y2="21.0078" gradientUnits="userSpaceOnUse">
<stop offset="0.15625" stop-color="#D64A38" />
<stop offset="1" stop-color="#FB7425" />
</linearGradient>
<linearGradient id="paint15_linear_6893_5267" x1="25.0739" y1="24.7096" x2="29.1465" y2="26.6651" gradientUnits="userSpaceOnUse">
<stop offset="0.15625" stop-color="#D64A38" />
<stop offset="1" stop-color="#FB7425" />
</linearGradient>
<linearGradient id="paint16_linear_6893_5267" x1="7.01785" y1="24.7214" x2="2.94525" y2="26.6768" gradientUnits="userSpaceOnUse">
<stop offset="0.15625" stop-color="#D64A38" />
<stop offset="1" stop-color="#FB7425" />
</linearGradient>
<linearGradient id="paint17_linear_6893_5267" x1="6.81823" y1="22.9292" x2="2.72754" y2="21.0119" gradientUnits="userSpaceOnUse">
<stop offset="0.15625" stop-color="#D64A38" />
<stop offset="1" stop-color="#FB7425" />
</linearGradient>
<linearGradient id="paint18_linear_6893_5267" x1="16.0466" y1="27.5225" x2="16.0466" y2="23.1004" gradientUnits="userSpaceOnUse">
<stop stop-color="#E61E27" />
<stop offset="1" stop-color="#672A7A" />
</linearGradient>
<linearGradient id="paint19_linear_6893_5267" x1="23.3524" y1="10.8385" x2="22.9558" y2="22.8891" gradientUnits="userSpaceOnUse">
<stop offset="0.548257" stop-color="#FFDD65" />
<stop offset="1" stop-color="#FFDD65" stop-opacity="0" />
</linearGradient>
<linearGradient id="paint20_linear_6893_5267" x1="26.5398" y1="15.5078" x2="25.2898" y2="12.0391" gradientUnits="userSpaceOnUse">
<stop stop-color="#EF8A47" />
<stop offset="1" stop-color="#EF8A47" stop-opacity="0" />
</linearGradient>
<radialGradient id="paint21_radial_6893_5267" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(22.868 7.77344) rotate(55.7389) scale(7.82686 9.38424)">
<stop stop-color="#FFDF70" />
<stop offset="1" stop-color="#FFDF70" stop-opacity="0" />
</radialGradient>
<linearGradient id="paint22_linear_6893_5267" x1="25.0555" y1="10.4766" x2="25.0555" y2="12.8203" gradientUnits="userSpaceOnUse">
<stop offset="0.432292" stop-color="#FFE7A3" />
<stop offset="1" stop-color="#FFDF83" stop-opacity="0" />
</linearGradient>
<linearGradient id="paint23_linear_6893_5267" x1="14.9531" y1="19.7308" x2="15.2627" y2="22.9469" gradientUnits="userSpaceOnUse">
<stop stop-color="#EC9611" />
<stop offset="1" stop-color="#EA9D26" stop-opacity="0" />
</linearGradient>
<linearGradient id="paint24_linear_6893_5267" x1="22.9219" y1="19.7308" x2="23.2315" y2="22.9469" gradientUnits="userSpaceOnUse">
<stop stop-color="#EC9611" />
<stop offset="1" stop-color="#EA9D26" stop-opacity="0" />
</linearGradient>
<radialGradient id="paint25_radial_6893_5267" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(12.0156 19.5886) rotate(-91.0929) scale(5.75971 5.75893)">
<stop offset="0.166667" stop-color="#482641" />
<stop offset="0.276042" stop-color="#594253" />
<stop offset="0.401042" stop-color="#483637" />
</radialGradient>
<linearGradient id="paint26_linear_6893_5267" x1="9.98438" y1="20.1406" x2="11.75" y2="18.8594" gradientUnits="userSpaceOnUse">
<stop stop-color="#271B27" />
<stop offset="1" stop-color="#483637" stop-opacity="0" />
</linearGradient>
<radialGradient id="paint27_radial_6893_5267" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(19.9844 19.5886) rotate(-91.0929) scale(5.75971 5.75893)">
<stop offset="0.166667" stop-color="#482641" />
<stop offset="0.276042" stop-color="#594253" />
<stop offset="0.401042" stop-color="#483637" />
</radialGradient>
<linearGradient id="paint28_linear_6893_5267" x1="17.9531" y1="20.1406" x2="19.7188" y2="18.8594" gradientUnits="userSpaceOnUse">
<stop stop-color="#271B27" />
<stop offset="1" stop-color="#483637" stop-opacity="0" />
</linearGradient>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 28 KiB

View File

@ -1,345 +0,0 @@
<svg width="100%" height="100%" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M27.9617 26.0652V6.42191C27.9617 4.98441 26.6257 4.28128 25.532 5.29691L21.5184 9.24913C21.3313 9.43334 21.0793 9.53659 20.8167 9.53659H11.2204C10.9578 9.53659 10.7058 9.43334 10.5188 9.24913L6.50513 5.29691C5.41138 4.28128 4.07544 4.98441 4.07544 6.42191V26.0652C4.07544 28.277 5.83537 30.0703 8.00597 30.0703H24.0312C26.2018 30.0703 27.9617 28.277 27.9617 26.0652Z" fill="url(#paint0_linear_28327_2053)" />
<path d="M27.9617 26.0652V6.42191C27.9617 4.98441 26.6257 4.28128 25.532 5.29691L21.5184 9.24913C21.3313 9.43334 21.0793 9.53659 20.8167 9.53659H11.2204C10.9578 9.53659 10.7058 9.43334 10.5188 9.24913L6.50513 5.29691C5.41138 4.28128 4.07544 4.98441 4.07544 6.42191V26.0652C4.07544 28.277 5.83537 30.0703 8.00597 30.0703H24.0312C26.2018 30.0703 27.9617 28.277 27.9617 26.0652Z" fill="url(#paint1_linear_28327_2053)" />
<path d="M27.9617 26.0652V6.42191C27.9617 4.98441 26.6257 4.28128 25.532 5.29691L21.5184 9.24913C21.3313 9.43334 21.0793 9.53659 20.8167 9.53659H11.2204C10.9578 9.53659 10.7058 9.43334 10.5188 9.24913L6.50513 5.29691C5.41138 4.28128 4.07544 4.98441 4.07544 6.42191V26.0652C4.07544 28.277 5.83537 30.0703 8.00597 30.0703H24.0312C26.2018 30.0703 27.9617 28.277 27.9617 26.0652Z" fill="url(#paint2_linear_28327_2053)" />
<path d="M27.9617 26.0652V6.42191C27.9617 4.98441 26.6257 4.28128 25.532 5.29691L21.5184 9.24913C21.3313 9.43334 21.0793 9.53659 20.8167 9.53659H11.2204C10.9578 9.53659 10.7058 9.43334 10.5188 9.24913L6.50513 5.29691C5.41138 4.28128 4.07544 4.98441 4.07544 6.42191V26.0652C4.07544 28.277 5.83537 30.0703 8.00597 30.0703H24.0312C26.2018 30.0703 27.9617 28.277 27.9617 26.0652Z" fill="url(#paint3_linear_28327_2053)" />
<path d="M27.9617 26.0652V6.42191C27.9617 4.98441 26.6257 4.28128 25.532 5.29691L21.5184 9.24913C21.3313 9.43334 21.0793 9.53659 20.8167 9.53659H11.2204C10.9578 9.53659 10.7058 9.43334 10.5188 9.24913L6.50513 5.29691C5.41138 4.28128 4.07544 4.98441 4.07544 6.42191V26.0652C4.07544 28.277 5.83537 30.0703 8.00597 30.0703H24.0312C26.2018 30.0703 27.9617 28.277 27.9617 26.0652Z" fill="url(#paint4_linear_28327_2053)" />
<path d="M27.9617 26.0652V6.42191C27.9617 4.98441 26.6257 4.28128 25.532 5.29691L21.5184 9.24913C21.3313 9.43334 21.0793 9.53659 20.8167 9.53659H11.2204C10.9578 9.53659 10.7058 9.43334 10.5188 9.24913L6.50513 5.29691C5.41138 4.28128 4.07544 4.98441 4.07544 6.42191V26.0652C4.07544 28.277 5.83537 30.0703 8.00597 30.0703H24.0312C26.2018 30.0703 27.9617 28.277 27.9617 26.0652Z" fill="url(#paint5_radial_28327_2053)" />
<g filter="url(#filter0_f_28327_2053)">
<rect x="5.05408" y="21.8203" width="2.72692" height="3.69801" rx="1.36346" fill="#D67908" />
</g>
<g filter="url(#filter1_f_28327_2053)">
<path d="M20.7508 10.2007C17.7675 10.3082 25.9773 15.1544 25.9773 15.1544L27.1023 6.09195C27.157 5.63101 26.7382 5.13844 25.8523 5.96097C25.8523 5.96097 22.0258 9.72898 21.8387 9.91319C21.6516 10.0974 21.4307 10.1621 21.1371 10.2007C20.9875 10.2203 20.9015 10.1952 20.7508 10.2007Z" fill="url(#paint6_linear_28327_2053)" />
</g>
<path d="M6.13261 13.5034L8.93261 10.9034C9.25261 10.6034 9.25261 10.1234 8.93261 9.83344L5.91793 7.15626C5.53511 6.82032 4.74261 6.9297 4.74261 7.76344V12.9634C4.74261 13.7969 5.62261 13.9834 6.13261 13.5034Z" fill="url(#paint7_linear_28327_2053)" />
<g filter="url(#filter2_f_28327_2053)">
<path d="M26.4909 5.65184C26.5488 5.50816 26.6882 5.41406 26.8431 5.41406V5.41406C27.0529 5.41406 27.2229 5.58411 27.2229 5.79388V8.03906L25.8055 7.35156L26.4909 5.65184Z" fill="url(#paint8_linear_28327_2053)" />
</g>
<g filter="url(#filter3_f_28327_2053)">
<path d="M5.44611 5.72656L8.82107 8.9461C9.57518 9.66548 9.58931 10.8646 8.85236 11.6016V11.6016" stroke="#FFDF70" stroke-linecap="round" />
</g>
<g filter="url(#filter4_f_28327_2053)">
<path d="M14.8054 20.6503L14.8697 20.6353C15.3433 20.5248 15.8365 20.53 16.3077 20.6503V20.6503C16.8288 20.7484 17.1399 21.3458 16.6999 21.7758L16.1491 22.3773C15.8791 22.6473 15.2863 22.6473 15.0163 22.3773L14.4733 21.7758C14.0241 21.2679 14.3054 20.7601 14.8054 20.6503Z" fill="url(#paint9_linear_28327_2053)" />
</g>
<path d="M15.2265 20.2066L15.2908 20.1916C15.7644 20.0811 16.2577 20.0862 16.7289 20.2066V20.2066C17.25 20.3047 17.561 20.902 17.121 21.332L16.5703 21.9336C16.3003 22.2036 15.7075 22.2036 15.4375 21.9336L14.8945 21.332C14.4453 20.8242 14.7265 20.3164 15.2265 20.2066Z" fill="url(#paint10_radial_28327_2053)" />
<g filter="url(#filter5_f_28327_2053)">
<ellipse cx="16.2703" cy="20.7414" rx="0.761719" ry="0.274258" fill="url(#paint11_linear_28327_2053)" />
</g>
<g filter="url(#filter6_f_28327_2053)">
<path d="M24.7851 22.8922L28.5898 21.0797" stroke="url(#paint12_linear_28327_2053)" stroke-width="1.2" stroke-miterlimit="10" stroke-linecap="round" />
</g>
<g filter="url(#filter7_f_28327_2053)">
<path d="M24.7851 24.9235L26.7117 26.2891" stroke="url(#paint13_linear_28327_2053)" stroke-width="1.2" stroke-miterlimit="10" stroke-linecap="round" />
</g>
<path d="M25.5663 22.5391L29.371 20.7266" stroke="url(#paint14_linear_28327_2053)" stroke-width="1.2" stroke-miterlimit="10" stroke-linecap="round" />
<g filter="url(#filter8_f_28327_2053)">
<path d="M25.5663 22.7109L29.371 20.8984" stroke="#FF8485" stroke-width="0.3" stroke-miterlimit="10" stroke-linecap="round" />
</g>
<g filter="url(#filter9_f_28327_2053)">
<ellipse cx="29.6059" cy="20.5805" rx="0.18384" ry="0.165827" transform="rotate(-22.7455 29.6059 20.5805)" fill="#FFDD86" />
</g>
<path d="M25.5636 24.6692L29.3652 26.4883" stroke="url(#paint15_linear_28327_2053)" stroke-width="1.2" stroke-miterlimit="10" stroke-linecap="round" />
<g filter="url(#filter10_f_28327_2053)">
<path d="M25.4984 24.5491L29.3 26.3682" stroke="#FF8485" stroke-width="0.3" stroke-miterlimit="10" stroke-linecap="round" />
</g>
<g filter="url(#filter11_f_28327_2053)">
<ellipse cx="29.5405" cy="26.3682" rx="0.18384" ry="0.165827" transform="rotate(28.2981 29.5405 26.3682)" fill="#FFDD86" />
</g>
<path d="M6.5281 24.681L2.72654 26.5" stroke="url(#paint16_linear_28327_2053)" stroke-width="1.2" stroke-miterlimit="10" stroke-linecap="round" />
<g filter="url(#filter12_f_28327_2053)">
<path d="M6.59334 24.5608L2.79179 26.3799" stroke="#FF8485" stroke-width="0.3" stroke-miterlimit="10" stroke-linecap="round" />
</g>
<g filter="url(#filter13_f_28327_2053)">
<ellipse rx="0.18384" ry="0.165827" transform="matrix(-0.942776 -0.333427 -0.333427 0.942776 6.64614 24.505)" fill="#FFDD86" />
</g>
<path d="M6.53969 22.5243L2.72612 20.7305" stroke="url(#paint17_linear_28327_2053)" stroke-width="1.2" stroke-miterlimit="10" stroke-linecap="round" />
<g filter="url(#filter14_f_28327_2053)">
<path d="M6.67403 22.4989L2.86046 20.7052" stroke="#FF8485" stroke-width="0.3" stroke-miterlimit="10" stroke-linecap="round" />
</g>
<g filter="url(#filter15_f_28327_2053)">
<ellipse rx="0.18384" ry="0.165827" transform="matrix(-0.338111 -0.941106 -0.941106 0.338111 6.75078 22.5044)" fill="#FFDD86" />
</g>
<path d="M20.4179 23.0547C20.4179 25.4947 18.436 27.3906 15.996 27.3906C13.556 27.3906 11.6835 25.4478 11.6835 23.0078C11.6835 23.0078 13.4882 25.1406 15.996 23.0078C18.3476 25.0859 20.4179 23.0547 20.4179 23.0547Z" fill="url(#paint18_linear_28327_2053)" />
<g filter="url(#filter16_f_28327_2053)">
<path d="M19.4316 20.4682C19.0065 20.4682 18.6563 20.1251 18.6563 19.7086V18.2872C18.6563 17.8707 19.0065 17.5276 19.4316 17.5276C19.8568 17.5276 20.2069 17.8707 20.2069 18.2872V19.7086C20.2069 20.1374 19.8568 20.4682 19.4316 20.4682Z" fill="url(#paint19_linear_28327_2053)" />
</g>
<path d="M19.9707 20.0859C19.5456 20.0859 19.1954 19.7428 19.1954 19.3262V17.9049C19.1954 17.4883 19.5456 17.1453 19.9707 17.1453C20.3959 17.1453 20.7461 17.4883 20.7461 17.9049V19.3262C20.7461 19.7551 20.3959 20.0859 19.9707 20.0859Z" fill="url(#paint20_linear_28327_2053)" />
<path d="M19.9707 20.0859C19.5456 20.0859 19.1954 19.7428 19.1954 19.3262V17.9049C19.1954 17.4883 19.5456 17.1453 19.9707 17.1453C20.3959 17.1453 20.7461 17.4883 20.7461 17.9049V19.3262C20.7461 19.7551 20.3959 20.0859 19.9707 20.0859Z" fill="url(#paint21_linear_28327_2053)" />
<g filter="url(#filter17_f_28327_2053)">
<path d="M11.6054 20.4682C11.1802 20.4682 10.8301 20.1251 10.8301 19.7086V18.2872C10.8301 17.8707 11.1802 17.5276 11.6054 17.5276C12.0306 17.5276 12.3807 17.8707 12.3807 18.2872V19.7086C12.3807 20.1374 12.0306 20.4682 11.6054 20.4682Z" fill="url(#paint22_linear_28327_2053)" />
</g>
<path d="M12.029 20.0859C11.6038 20.0859 11.2537 19.7428 11.2537 19.3262V17.9049C11.2537 17.4883 11.6038 17.1453 12.029 17.1453C12.4541 17.1453 12.8043 17.4883 12.8043 17.9049V19.3262C12.8043 19.7551 12.4541 20.0859 12.029 20.0859Z" fill="url(#paint23_linear_28327_2053)" />
<path d="M12.029 20.0859C11.6038 20.0859 11.2537 19.7428 11.2537 19.3262V17.9049C11.2537 17.4883 11.6038 17.1453 12.029 17.1453C12.4541 17.1453 12.8043 17.4883 12.8043 17.9049V19.3262C12.8043 19.7551 12.4541 20.0859 12.029 20.0859Z" fill="url(#paint24_linear_28327_2053)" />
<g filter="url(#filter18_f_28327_2053)">
<circle cx="20.2069" cy="17.7638" r="0.236228" fill="#775B70" />
</g>
<g filter="url(#filter19_f_28327_2053)">
<circle cx="12.2652" cy="17.7638" r="0.236228" fill="#775B70" />
</g>
<g filter="url(#filter20_f_28327_2053)">
<rect x="22.1024" y="10.1016" width="4.5851" height="14.1857" fill="url(#paint25_linear_28327_2053)" />
</g>
<path d="M25.8329 13.5034L23.0329 10.9034C22.7129 10.6034 22.7129 10.1234 23.0329 9.83344L26.0476 7.15626C26.4304 6.82032 27.2229 6.9297 27.2229 7.76344V12.9634C27.2229 13.7969 26.3429 13.9834 25.8329 13.5034Z" fill="#FFB915" />
<path d="M25.8329 13.5034L23.0329 10.9034C22.7129 10.6034 22.7129 10.1234 23.0329 9.83344L26.0476 7.15626C26.4304 6.82032 27.2229 6.9297 27.2229 7.76344V12.9634C27.2229 13.7969 26.3429 13.9834 25.8329 13.5034Z" fill="url(#paint26_linear_28327_2053)" />
<g filter="url(#filter21_f_28327_2053)">
<path d="M26.6336 7.36719L23.0086 10.4922L26.5555 13.3047L26.6336 7.36719Z" fill="url(#paint27_radial_28327_2053)" />
</g>
<g filter="url(#filter22_f_28327_2053)">
<path d="M23.7274 10.2891L26.2586 13.0234" stroke="url(#paint28_linear_28327_2053)" stroke-width="0.5" stroke-linecap="round" />
</g>
<g filter="url(#filter23_f_28327_2053)">
<path d="M5.22321 7.49927V13.407L8.69196 10.3176L5.22321 7.49927Z" fill="#FEB33E" />
</g>
<g filter="url(#filter24_f_28327_2053)">
<path d="M5.22321 7.72656V12.9141" stroke="#FFE7A3" stroke-width="0.15" stroke-linecap="round" />
</g>
<defs>
<filter id="filter0_f_28327_2053" x="3.55408" y="20.3203" width="5.72693" height="6.698" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.75" result="effect1_foregroundBlur_28327_2053" />
</filter>
<filter id="filter1_f_28327_2053" x="19.098" y="4.5188" width="9.00903" height="11.6356" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.5" result="effect1_foregroundBlur_28327_2053" />
</filter>
<filter id="filter2_f_28327_2053" x="24.8055" y="4.41406" width="3.41742" height="4.625" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.5" result="effect1_foregroundBlur_28327_2053" />
</filter>
<filter id="filter3_f_28327_2053" x="2.94611" y="3.22656" width="8.94989" height="10.7285" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="1" result="effect1_foregroundBlur_28327_2053" />
</filter>
<filter id="filter4_f_28327_2053" x="13.7482" y="20.056" width="3.66144" height="3.0238" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.25" result="effect1_foregroundBlur_28327_2053" />
</filter>
<filter id="filter5_f_28327_2053" x="14.9086" y="19.8672" width="2.72344" height="1.74846" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.3" result="effect1_foregroundBlur_28327_2053" />
</filter>
<filter id="filter6_f_28327_2053" x="23.6849" y="19.9796" width="6.005" height="4.0127" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.25" result="effect1_foregroundBlur_28327_2053" />
</filter>
<filter id="filter7_f_28327_2053" x="23.6851" y="23.8235" width="4.12671" height="3.56567" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.25" result="effect1_foregroundBlur_28327_2053" />
</filter>
<filter id="filter8_f_28327_2053" x="24.9163" y="20.2484" width="5.10474" height="3.11255" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.25" result="effect1_foregroundBlur_28327_2053" />
</filter>
<filter id="filter9_f_28327_2053" x="28.9246" y="19.9119" width="1.36261" height="1.33728" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.25" result="effect1_foregroundBlur_28327_2053" />
</filter>
<filter id="filter10_f_28327_2053" x="24.8483" y="23.899" width="5.10168" height="3.11914" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.25" result="effect1_foregroundBlur_28327_2053" />
</filter>
<filter id="filter11_f_28327_2053" x="28.8605" y="25.6981" width="1.35999" height="1.34009" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.25" result="effect1_foregroundBlur_28327_2053" />
</filter>
<filter id="filter12_f_28327_2053" x="2.14172" y="23.9108" width="5.10168" height="3.11914" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.25" result="effect1_foregroundBlur_28327_2053" />
</filter>
<filter id="filter13_f_28327_2053" x="5.96417" y="23.837" width="1.36395" height="1.33594" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.25" result="effect1_foregroundBlur_28327_2053" />
</filter>
<filter id="filter14_f_28327_2053" x="2.21045" y="20.0552" width="5.11365" height="3.09375" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.25" result="effect1_foregroundBlur_28327_2053" />
</filter>
<filter id="filter15_f_28327_2053" x="6.08276" y="21.8225" width="1.33606" height="1.36377" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.25" result="effect1_foregroundBlur_28327_2053" />
</filter>
<filter id="filter16_f_28327_2053" x="18.1563" y="17.0276" width="2.5506" height="3.94067" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.25" result="effect1_foregroundBlur_28327_2053" />
</filter>
<filter id="filter17_f_28327_2053" x="10.3301" y="17.0276" width="2.5506" height="3.94067" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.25" result="effect1_foregroundBlur_28327_2053" />
</filter>
<filter id="filter18_f_28327_2053" x="19.4707" y="17.0276" width="1.47247" height="1.47241" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.25" result="effect1_foregroundBlur_28327_2053" />
</filter>
<filter id="filter19_f_28327_2053" x="11.529" y="17.0276" width="1.47247" height="1.47241" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.25" result="effect1_foregroundBlur_28327_2053" />
</filter>
<filter id="filter20_f_28327_2053" x="18.1024" y="6.10156" width="12.5851" height="22.1857" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="2" result="effect1_foregroundBlur_28327_2053" />
</filter>
<filter id="filter21_f_28327_2053" x="22.4086" y="6.76719" width="4.825" height="7.1375" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.3" result="effect1_foregroundBlur_28327_2053" />
</filter>
<filter id="filter22_f_28327_2053" x="22.7274" y="9.28906" width="4.53125" height="4.73438" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.375" result="effect1_foregroundBlur_28327_2053" />
</filter>
<filter id="filter23_f_28327_2053" x="4.72321" y="6.99927" width="4.46875" height="6.90771" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.25" result="effect1_foregroundBlur_28327_2053" />
</filter>
<filter id="filter24_f_28327_2053" x="4.64819" y="7.15161" width="1.15002" height="6.3374" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.25" result="effect1_foregroundBlur_28327_2053" />
</filter>
<linearGradient id="paint0_linear_28327_2053" x1="7.96361" y1="1.13036" x2="7.96361" y2="31.0703" gradientUnits="userSpaceOnUse">
<stop offset="0.288159" stop-color="#F2CC26" />
<stop offset="0.762024" stop-color="#E99E20" />
<stop offset="0.9925" stop-color="#E3821D" />
<stop offset="1" stop-color="#E3801D" />
</linearGradient>
<linearGradient id="paint1_linear_28327_2053" x1="8.88356" y1="11.9216" x2="1.25856" y2="11.9216" gradientUnits="userSpaceOnUse">
<stop stop-color="#E99E20" stop-opacity="0" />
<stop offset="0.9925" stop-color="#E3821D" />
<stop offset="1" stop-color="#E3801D" />
</linearGradient>
<linearGradient id="paint2_linear_28327_2053" x1="26.7586" y1="11.9216" x2="30.1961" y2="11.9216" gradientUnits="userSpaceOnUse">
<stop stop-color="#E99E20" stop-opacity="0" />
<stop offset="0.9925" stop-color="#E3821D" />
<stop offset="1" stop-color="#E3801D" />
</linearGradient>
<linearGradient id="paint3_linear_28327_2053" x1="16.0195" y1="-1.84378" x2="16.0186" y2="31.0703" gradientUnits="userSpaceOnUse">
<stop offset="0.77079" stop-color="#F59639" stop-opacity="0" />
<stop offset="1" stop-color="#FF63C4" />
</linearGradient>
<linearGradient id="paint4_linear_28327_2053" x1="16.0186" y1="11.1328" x2="16.0186" y2="32.5703" gradientUnits="userSpaceOnUse">
<stop offset="0.854227" stop-color="white" stop-opacity="0" />
<stop offset="0.985362" stop-color="white" />
</linearGradient>
<radialGradient id="paint5_radial_28327_2053" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(22.1648 4.28909) rotate(55.8501) scale(5.39983 10.6704)">
<stop stop-color="#FFA720" />
<stop offset="0.921158" stop-color="#FFA720" stop-opacity="0" />
</radialGradient>
<linearGradient id="paint6_linear_28327_2053" x1="21.9081" y1="6.85159" x2="28.1649" y2="13.6953" gradientUnits="userSpaceOnUse">
<stop stop-color="#FFA720" />
<stop offset="1" stop-color="#FFA720" stop-opacity="0" />
</linearGradient>
<linearGradient id="paint7_linear_28327_2053" x1="10.6024" y1="10.6172" x2="4.74261" y2="10.0703" gradientUnits="userSpaceOnUse">
<stop offset="0.437473" stop-color="#ED8C1B" />
<stop offset="1" stop-color="#FFB03A" />
</linearGradient>
<linearGradient id="paint8_linear_28327_2053" x1="27.0399" y1="4.96094" x2="26.4438" y2="7.30239" gradientUnits="userSpaceOnUse">
<stop offset="0.28598" stop-color="#FFE792" />
<stop offset="1" stop-color="#FFDD65" stop-opacity="0" />
</linearGradient>
<linearGradient id="paint9_linear_28327_2053" x1="15.7507" y1="22.3512" x2="15.0789" y2="23.445" gradientUnits="userSpaceOnUse">
<stop stop-color="#E3900E" />
<stop offset="1" stop-color="#EA9D26" stop-opacity="0" />
</linearGradient>
<radialGradient id="paint10_radial_28327_2053" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(16.4461 21.1797) rotate(-153.246) scale(2.11729 2.12981)">
<stop stop-color="#EA088B" />
<stop offset="1" stop-color="#E61E27" />
</radialGradient>
<linearGradient id="paint11_linear_28327_2053" x1="17.2036" y1="20.7414" x2="15.6801" y2="20.7414" gradientUnits="userSpaceOnUse">
<stop stop-color="white" stop-opacity="0.9" />
<stop offset="1" stop-color="white" stop-opacity="0" />
</linearGradient>
<linearGradient id="paint12_linear_28327_2053" x1="24.2898" y1="23.236" x2="28.0242" y2="21.3203" gradientUnits="userSpaceOnUse">
<stop stop-color="#E88105" />
<stop offset="1" stop-color="#E37D02" stop-opacity="0" />
</linearGradient>
<linearGradient id="paint13_linear_28327_2053" x1="24.2898" y1="24.5798" x2="28.0242" y2="26.4955" gradientUnits="userSpaceOnUse">
<stop offset="0.286458" stop-color="#DE7D07" />
<stop offset="0.817708" stop-color="#E37D02" stop-opacity="0" />
</linearGradient>
<linearGradient id="paint14_linear_28327_2053" x1="25.2898" y1="22.9453" x2="29.371" y2="21.0078" gradientUnits="userSpaceOnUse">
<stop offset="0.15625" stop-color="#D64A38" />
<stop offset="1" stop-color="#FB7425" />
</linearGradient>
<linearGradient id="paint15_linear_28327_2053" x1="25.0739" y1="24.7096" x2="29.1465" y2="26.6651" gradientUnits="userSpaceOnUse">
<stop offset="0.15625" stop-color="#D64A38" />
<stop offset="1" stop-color="#FB7425" />
</linearGradient>
<linearGradient id="paint16_linear_28327_2053" x1="7.01785" y1="24.7214" x2="2.94525" y2="26.6768" gradientUnits="userSpaceOnUse">
<stop offset="0.15625" stop-color="#D64A38" />
<stop offset="1" stop-color="#FB7425" />
</linearGradient>
<linearGradient id="paint17_linear_28327_2053" x1="6.8182" y1="22.9292" x2="2.72751" y2="21.0118" gradientUnits="userSpaceOnUse">
<stop offset="0.15625" stop-color="#D64A38" />
<stop offset="1" stop-color="#FB7425" />
</linearGradient>
<linearGradient id="paint18_linear_28327_2053" x1="16.0466" y1="27.5225" x2="16.0466" y2="23.1004" gradientUnits="userSpaceOnUse">
<stop stop-color="#E61E27" />
<stop offset="1" stop-color="#672A7A" />
</linearGradient>
<linearGradient id="paint19_linear_28327_2053" x1="20.6882" y1="19.6797" x2="21.6884" y2="23.1407" gradientUnits="userSpaceOnUse">
<stop stop-color="#EC9611" />
<stop offset="1" stop-color="#EA9D26" stop-opacity="0" />
</linearGradient>
<linearGradient id="paint20_linear_28327_2053" x1="22.8992" y1="18.2109" x2="18.4305" y2="18.2109" gradientUnits="userSpaceOnUse">
<stop stop-color="#432A3D" />
<stop offset="0.567708" stop-color="#684E61" />
<stop offset="0.765625" stop-color="#43253D" />
</linearGradient>
<linearGradient id="paint21_linear_28327_2053" x1="20.3211" y1="18.0546" x2="20.3211" y2="20.3515" gradientUnits="userSpaceOnUse">
<stop offset="0.326531" stop-color="#43253D" stop-opacity="0" />
<stop offset="1" stop-color="#43253D" />
</linearGradient>
<linearGradient id="paint22_linear_28327_2053" x1="12.862" y1="19.6797" x2="13.8622" y2="23.1407" gradientUnits="userSpaceOnUse">
<stop stop-color="#E89311" />
<stop offset="1" stop-color="#EA9D26" stop-opacity="0" />
</linearGradient>
<linearGradient id="paint23_linear_28327_2053" x1="14.9575" y1="18.2109" x2="10.4887" y2="18.2109" gradientUnits="userSpaceOnUse">
<stop stop-color="#432A3D" />
<stop offset="0.567708" stop-color="#684E61" />
<stop offset="0.765625" stop-color="#43253D" />
</linearGradient>
<linearGradient id="paint24_linear_28327_2053" x1="12.3793" y1="18.0546" x2="12.3793" y2="20.3515" gradientUnits="userSpaceOnUse">
<stop offset="0.326531" stop-color="#43253D" stop-opacity="0" />
<stop offset="1" stop-color="#43253D" />
</linearGradient>
<linearGradient id="paint25_linear_28327_2053" x1="23.3524" y1="10.8385" x2="22.9558" y2="22.8891" gradientUnits="userSpaceOnUse">
<stop offset="0.548257" stop-color="#FFDD65" />
<stop offset="1" stop-color="#FFDD65" stop-opacity="0" />
</linearGradient>
<linearGradient id="paint26_linear_28327_2053" x1="26.5398" y1="15.5078" x2="25.2898" y2="12.0391" gradientUnits="userSpaceOnUse">
<stop stop-color="#EF8A47" />
<stop offset="1" stop-color="#EF8A47" stop-opacity="0" />
</linearGradient>
<radialGradient id="paint27_radial_28327_2053" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(22.868 7.77344) rotate(55.7389) scale(7.82686 9.38424)">
<stop stop-color="#FFDF70" />
<stop offset="1" stop-color="#FFDF70" stop-opacity="0" />
</radialGradient>
<linearGradient id="paint28_linear_28327_2053" x1="25.0555" y1="10.4766" x2="25.0555" y2="12.8203" gradientUnits="userSpaceOnUse">
<stop offset="0.432292" stop-color="#FFE7A3" />
<stop offset="1" stop-color="#FFDF83" stop-opacity="0" />
</linearGradient>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 KiB

View File

@ -1,338 +0,0 @@
<svg width="100%" height="100%" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<g filter="url(#filter0_iiii_18_20100)">
<rect x="2.09375" y="4.96875" width="27.875" height="22.0312" rx="0.8" fill="#5E4F86" />
</g>
<g filter="url(#filter1_f_18_20100)">
<path d="M2.57935 21.9844V10.0156H5.96764C6.92614 10.0156 7.70317 10.8663 7.70317 11.9156V20.0844C7.70317 21.1337 6.92614 21.9844 5.96764 21.9844H2.57935Z" stroke="#463875" stroke-width="0.65" />
<path d="M2.57935 21.9844V10.0156H5.96764C6.92614 10.0156 7.70317 10.8663 7.70317 11.9156V20.0844C7.70317 21.1337 6.92614 21.9844 5.96764 21.9844H2.57935Z" stroke="url(#paint0_linear_18_20100)" stroke-width="0.65" />
</g>
<g filter="url(#filter2_f_18_20100)">
<path d="M29.4983 10.0156V21.9844H26.1C25.1387 21.9844 24.3594 21.1337 24.3594 20.0844V11.9156C24.3594 10.8663 25.1387 10.0156 26.1 10.0156H29.4983Z" stroke="#463875" stroke-width="0.65" />
<path d="M29.4983 10.0156V21.9844H26.1C25.1387 21.9844 24.3594 21.1337 24.3594 20.0844V11.9156C24.3594 10.8663 25.1387 10.0156 26.1 10.0156H29.4983Z" stroke="url(#paint1_linear_18_20100)" stroke-width="0.65" />
</g>
<g filter="url(#filter3_f_18_20100)">
<path d="M9.94531 11.9156C9.94531 10.8663 10.796 10.0156 11.8453 10.0156H20.1547C21.204 10.0156 22.0547 10.8663 22.0547 11.9156V20.0844C22.0547 21.1337 21.204 21.9844 20.1547 21.9844H11.8453C10.796 21.9844 9.94531 21.1337 9.94531 20.0844V11.9156Z" stroke="#463875" stroke-width="0.65" />
<path d="M9.94531 11.9156C9.94531 10.8663 10.796 10.0156 11.8453 10.0156H20.1547C21.204 10.0156 22.0547 10.8663 22.0547 11.9156V20.0844C22.0547 21.1337 21.204 21.9844 20.1547 21.9844H11.8453C10.796 21.9844 9.94531 21.1337 9.94531 20.0844V11.9156Z" stroke="url(#paint2_linear_18_20100)" stroke-width="0.65" />
</g>
<g filter="url(#filter4_i_18_20100)">
<path d="M29.9688 10.0156V21.9844H26.2594C25.21 21.9844 24.3594 21.1337 24.3594 20.0844V11.9156C24.3594 10.8663 25.21 10.0156 26.2594 10.0156H29.9688Z" fill="#7BBEE4" />
</g>
<path d="M29.9688 10.0156V21.9844H26.2594C25.21 21.9844 24.3594 21.1337 24.3594 20.0844V11.9156C24.3594 10.8663 25.21 10.0156 26.2594 10.0156H29.9688Z" fill="url(#paint3_linear_18_20100)" />
<g filter="url(#filter5_i_18_20100)">
<path d="M9.94531 11.9156C9.94531 10.8663 10.796 10.0156 11.8453 10.0156H20.1547C21.204 10.0156 22.0547 10.8663 22.0547 11.9156V20.0844C22.0547 21.1337 21.204 21.9844 20.1547 21.9844H11.8453C10.796 21.9844 9.94531 21.1337 9.94531 20.0844V11.9156Z" fill="#7BBEE4" />
</g>
<g filter="url(#filter6_i_18_20100)">
<path d="M2.09375 21.9844V10.0156H5.80313C6.85246 10.0156 7.70312 10.8663 7.70312 11.9156V20.0844C7.70312 21.1337 6.85246 21.9844 5.80313 21.9844H2.09375Z" fill="#7BBEE4" />
</g>
<g filter="url(#filter7_f_18_20100)">
<path d="M4.0625 6.75781C4.0625 6.61974 4.17443 6.50781 4.3125 6.50781H5.85938C5.99745 6.50781 6.10938 6.61974 6.10938 6.75781V8.30469C6.10938 8.44276 5.99745 8.55469 5.85938 8.55469H4.3125C4.17443 8.55469 4.0625 8.44276 4.0625 8.30469V6.75781Z" stroke="#43346D" stroke-width="0.6" />
<path d="M4.0625 6.75781C4.0625 6.61974 4.17443 6.50781 4.3125 6.50781H5.85938C5.99745 6.50781 6.10938 6.61974 6.10938 6.75781V8.30469C6.10938 8.44276 5.99745 8.55469 5.85938 8.55469H4.3125C4.17443 8.55469 4.0625 8.44276 4.0625 8.30469V6.75781Z" stroke="url(#paint4_linear_18_20100)" stroke-width="0.6" />
</g>
<g filter="url(#filter8_f_18_20100)">
<path d="M4.0625 6.75781C4.0625 6.61974 4.17443 6.50781 4.3125 6.50781H5.85938C5.99745 6.50781 6.10938 6.61974 6.10938 6.75781V8.30469C6.10938 8.44276 5.99745 8.55469 5.85938 8.55469H4.3125C4.17443 8.55469 4.0625 8.44276 4.0625 8.30469V6.75781Z" stroke="#422E6F" stroke-width="0.1" />
</g>
<g filter="url(#filter9_f_18_20100)">
<path d="M9.53125 6.75781C9.53125 6.61974 9.64318 6.50781 9.78125 6.50781H11.3281C11.4662 6.50781 11.5781 6.61974 11.5781 6.75781V8.30469C11.5781 8.44276 11.4662 8.55469 11.3281 8.55469H9.78125C9.64318 8.55469 9.53125 8.44276 9.53125 8.30469V6.75781Z" stroke="#43346D" stroke-width="0.6" />
<path d="M9.53125 6.75781C9.53125 6.61974 9.64318 6.50781 9.78125 6.50781H11.3281C11.4662 6.50781 11.5781 6.61974 11.5781 6.75781V8.30469C11.5781 8.44276 11.4662 8.55469 11.3281 8.55469H9.78125C9.64318 8.55469 9.53125 8.44276 9.53125 8.30469V6.75781Z" stroke="url(#paint5_linear_18_20100)" stroke-width="0.6" />
</g>
<g filter="url(#filter10_f_18_20100)">
<path d="M9.53125 6.75781C9.53125 6.61974 9.64318 6.50781 9.78125 6.50781H11.3281C11.4662 6.50781 11.5781 6.61974 11.5781 6.75781V8.30469C11.5781 8.44276 11.4662 8.55469 11.3281 8.55469H9.78125C9.64318 8.55469 9.53125 8.44276 9.53125 8.30469V6.75781Z" stroke="#422E6F" stroke-width="0.1" />
</g>
<g filter="url(#filter11_f_18_20100)">
<path d="M15.0078 6.75781C15.0078 6.61974 15.1197 6.50781 15.2578 6.50781H16.8047C16.9428 6.50781 17.0547 6.61974 17.0547 6.75781V8.30469C17.0547 8.44276 16.9428 8.55469 16.8047 8.55469H15.2578C15.1197 8.55469 15.0078 8.44276 15.0078 8.30469V6.75781Z" stroke="#43346D" stroke-width="0.6" />
<path d="M15.0078 6.75781C15.0078 6.61974 15.1197 6.50781 15.2578 6.50781H16.8047C16.9428 6.50781 17.0547 6.61974 17.0547 6.75781V8.30469C17.0547 8.44276 16.9428 8.55469 16.8047 8.55469H15.2578C15.1197 8.55469 15.0078 8.44276 15.0078 8.30469V6.75781Z" stroke="url(#paint6_linear_18_20100)" stroke-width="0.6" />
</g>
<g filter="url(#filter12_f_18_20100)">
<path d="M15.0078 6.75781C15.0078 6.61974 15.1197 6.50781 15.2578 6.50781H16.8047C16.9428 6.50781 17.0547 6.61974 17.0547 6.75781V8.30469C17.0547 8.44276 16.9428 8.55469 16.8047 8.55469H15.2578C15.1197 8.55469 15.0078 8.44276 15.0078 8.30469V6.75781Z" stroke="#422E6F" stroke-width="0.1" />
</g>
<g filter="url(#filter13_f_18_20100)">
<path d="M20.4688 6.75781C20.4688 6.61974 20.5807 6.50781 20.7188 6.50781H22.2656C22.4037 6.50781 22.5156 6.61974 22.5156 6.75781V8.30469C22.5156 8.44276 22.4037 8.55469 22.2656 8.55469H20.7188C20.5807 8.55469 20.4688 8.44276 20.4688 8.30469V6.75781Z" stroke="#43346D" stroke-width="0.6" />
<path d="M20.4688 6.75781C20.4688 6.61974 20.5807 6.50781 20.7188 6.50781H22.2656C22.4037 6.50781 22.5156 6.61974 22.5156 6.75781V8.30469C22.5156 8.44276 22.4037 8.55469 22.2656 8.55469H20.7188C20.5807 8.55469 20.4688 8.44276 20.4688 8.30469V6.75781Z" stroke="url(#paint7_linear_18_20100)" stroke-width="0.6" />
</g>
<g filter="url(#filter14_f_18_20100)">
<path d="M20.4688 6.75781C20.4688 6.61974 20.5807 6.50781 20.7188 6.50781H22.2656C22.4037 6.50781 22.5156 6.61974 22.5156 6.75781V8.30469C22.5156 8.44276 22.4037 8.55469 22.2656 8.55469H20.7188C20.5807 8.55469 20.4688 8.44276 20.4688 8.30469V6.75781Z" stroke="#422E6F" stroke-width="0.1" />
</g>
<g filter="url(#filter15_f_18_20100)">
<path d="M25.9375 6.75781C25.9375 6.61974 26.0494 6.50781 26.1875 6.50781H27.7344C27.8724 6.50781 27.9844 6.61974 27.9844 6.75781V8.30469C27.9844 8.44276 27.8724 8.55469 27.7344 8.55469H26.1875C26.0494 8.55469 25.9375 8.44276 25.9375 8.30469V6.75781Z" stroke="#43346D" stroke-width="0.6" />
<path d="M25.9375 6.75781C25.9375 6.61974 26.0494 6.50781 26.1875 6.50781H27.7344C27.8724 6.50781 27.9844 6.61974 27.9844 6.75781V8.30469C27.9844 8.44276 27.8724 8.55469 27.7344 8.55469H26.1875C26.0494 8.55469 25.9375 8.44276 25.9375 8.30469V6.75781Z" stroke="url(#paint8_linear_18_20100)" stroke-width="0.6" />
</g>
<g filter="url(#filter16_f_18_20100)">
<path d="M25.9375 6.75781C25.9375 6.61974 26.0494 6.50781 26.1875 6.50781H27.7344C27.8724 6.50781 27.9844 6.61974 27.9844 6.75781V8.30469C27.9844 8.44276 27.8724 8.55469 27.7344 8.55469H26.1875C26.0494 8.55469 25.9375 8.44276 25.9375 8.30469V6.75781Z" stroke="#422E6F" stroke-width="0.1" />
</g>
<g filter="url(#filter17_f_18_20100)">
<path d="M4.0625 23.6953C4.0625 23.5572 4.17443 23.4453 4.3125 23.4453H5.85938C5.99745 23.4453 6.10938 23.5572 6.10938 23.6953V25.2422C6.10938 25.3803 5.99745 25.4922 5.85938 25.4922H4.3125C4.17443 25.4922 4.0625 25.3803 4.0625 25.2422V23.6953Z" stroke="#43346D" stroke-width="0.6" />
<path d="M4.0625 23.6953C4.0625 23.5572 4.17443 23.4453 4.3125 23.4453H5.85938C5.99745 23.4453 6.10938 23.5572 6.10938 23.6953V25.2422C6.10938 25.3803 5.99745 25.4922 5.85938 25.4922H4.3125C4.17443 25.4922 4.0625 25.3803 4.0625 25.2422V23.6953Z" stroke="url(#paint9_linear_18_20100)" stroke-width="0.6" />
</g>
<g filter="url(#filter18_f_18_20100)">
<path d="M9.53125 23.6953C9.53125 23.5572 9.64318 23.4453 9.78125 23.4453H11.3281C11.4662 23.4453 11.5781 23.5572 11.5781 23.6953V25.2422C11.5781 25.3803 11.4662 25.4922 11.3281 25.4922H9.78125C9.64318 25.4922 9.53125 25.3803 9.53125 25.2422V23.6953Z" stroke="#43346D" stroke-width="0.6" />
<path d="M9.53125 23.6953C9.53125 23.5572 9.64318 23.4453 9.78125 23.4453H11.3281C11.4662 23.4453 11.5781 23.5572 11.5781 23.6953V25.2422C11.5781 25.3803 11.4662 25.4922 11.3281 25.4922H9.78125C9.64318 25.4922 9.53125 25.3803 9.53125 25.2422V23.6953Z" stroke="url(#paint10_linear_18_20100)" stroke-width="0.6" />
</g>
<g filter="url(#filter19_f_18_20100)">
<path d="M15 23.6953C15 23.5572 15.1119 23.4453 15.25 23.4453H16.7969C16.9349 23.4453 17.0469 23.5572 17.0469 23.6953V25.2422C17.0469 25.3803 16.9349 25.4922 16.7969 25.4922H15.25C15.1119 25.4922 15 25.3803 15 25.2422V23.6953Z" stroke="#43346D" stroke-width="0.6" />
<path d="M15 23.6953C15 23.5572 15.1119 23.4453 15.25 23.4453H16.7969C16.9349 23.4453 17.0469 23.5572 17.0469 23.6953V25.2422C17.0469 25.3803 16.9349 25.4922 16.7969 25.4922H15.25C15.1119 25.4922 15 25.3803 15 25.2422V23.6953Z" stroke="url(#paint11_linear_18_20100)" stroke-width="0.6" />
</g>
<g filter="url(#filter20_f_18_20100)">
<path d="M20.4688 23.6953C20.4688 23.5572 20.5807 23.4453 20.7188 23.4453H22.2656C22.4037 23.4453 22.5156 23.5572 22.5156 23.6953V25.2422C22.5156 25.3803 22.4037 25.4922 22.2656 25.4922H20.7188C20.5807 25.4922 20.4688 25.3803 20.4688 25.2422V23.6953Z" stroke="#43346D" stroke-width="0.6" />
<path d="M20.4688 23.6953C20.4688 23.5572 20.5807 23.4453 20.7188 23.4453H22.2656C22.4037 23.4453 22.5156 23.5572 22.5156 23.6953V25.2422C22.5156 25.3803 22.4037 25.4922 22.2656 25.4922H20.7188C20.5807 25.4922 20.4688 25.3803 20.4688 25.2422V23.6953Z" stroke="url(#paint12_linear_18_20100)" stroke-width="0.6" />
</g>
<g filter="url(#filter21_f_18_20100)">
<path d="M25.9375 23.6953C25.9375 23.5572 26.0494 23.4453 26.1875 23.4453H27.7344C27.8724 23.4453 27.9844 23.5572 27.9844 23.6953V25.2422C27.9844 25.3803 27.8724 25.4922 27.7344 25.4922H26.1875C26.0494 25.4922 25.9375 25.3803 25.9375 25.2422V23.6953Z" stroke="#43346D" stroke-width="0.6" />
<path d="M25.9375 23.6953C25.9375 23.5572 26.0494 23.4453 26.1875 23.4453H27.7344C27.8724 23.4453 27.9844 23.5572 27.9844 23.6953V25.2422C27.9844 25.3803 27.8724 25.4922 27.7344 25.4922H26.1875C26.0494 25.4922 25.9375 25.3803 25.9375 25.2422V23.6953Z" stroke="url(#paint13_linear_18_20100)" stroke-width="0.6" />
</g>
<path d="M4.0625 6.75781C4.0625 6.61974 4.17443 6.50781 4.3125 6.50781H5.85938C5.99745 6.50781 6.10938 6.61974 6.10938 6.75781V8.30469C6.10938 8.44276 5.99745 8.55469 5.85938 8.55469H4.3125C4.17443 8.55469 4.0625 8.44276 4.0625 8.30469V6.75781Z" fill="#E5E5E5" />
<path d="M9.53125 6.75781C9.53125 6.61974 9.64318 6.50781 9.78125 6.50781H11.3281C11.4662 6.50781 11.5781 6.61974 11.5781 6.75781V8.30469C11.5781 8.44276 11.4662 8.55469 11.3281 8.55469H9.78125C9.64318 8.55469 9.53125 8.44276 9.53125 8.30469V6.75781Z" fill="#E5E5E5" />
<path d="M15 6.75781C15 6.61974 15.1119 6.50781 15.25 6.50781H16.7969C16.9349 6.50781 17.0469 6.61974 17.0469 6.75781V8.30469C17.0469 8.44276 16.9349 8.55469 16.7969 8.55469H15.25C15.1119 8.55469 15 8.44276 15 8.30469V6.75781Z" fill="#E5E5E5" />
<path d="M20.4688 6.75781C20.4688 6.61974 20.5807 6.50781 20.7188 6.50781H22.2656C22.4037 6.50781 22.5156 6.61974 22.5156 6.75781V8.30469C22.5156 8.44276 22.4037 8.55469 22.2656 8.55469H20.7188C20.5807 8.55469 20.4688 8.44276 20.4688 8.30469V6.75781Z" fill="#E5E5E5" />
<path d="M25.9375 6.75781C25.9375 6.61974 26.0494 6.50781 26.1875 6.50781H27.7344C27.8724 6.50781 27.9844 6.61974 27.9844 6.75781V8.30469C27.9844 8.44276 27.8724 8.55469 27.7344 8.55469H26.1875C26.0494 8.55469 25.9375 8.44276 25.9375 8.30469V6.75781Z" fill="#E5E5E5" />
<g filter="url(#filter22_f_18_20100)">
<path d="M4.0625 23.6953C4.0625 23.5572 4.17443 23.4453 4.3125 23.4453H5.85938C5.99745 23.4453 6.10938 23.5572 6.10938 23.6953V25.2422C6.10938 25.3803 5.99745 25.4922 5.85938 25.4922H4.3125C4.17443 25.4922 4.0625 25.3803 4.0625 25.2422V23.6953Z" stroke="#422E6F" stroke-width="0.1" />
</g>
<g filter="url(#filter23_f_18_20100)">
<path d="M9.53125 23.6953C9.53125 23.5572 9.64318 23.4453 9.78125 23.4453H11.3281C11.4662 23.4453 11.5781 23.5572 11.5781 23.6953V25.2422C11.5781 25.3803 11.4662 25.4922 11.3281 25.4922H9.78125C9.64318 25.4922 9.53125 25.3803 9.53125 25.2422V23.6953Z" stroke="#422E6F" stroke-width="0.1" />
</g>
<g filter="url(#filter24_f_18_20100)">
<path d="M15.0078 23.6953C15.0078 23.5572 15.1197 23.4453 15.2578 23.4453H16.8047C16.9428 23.4453 17.0547 23.5572 17.0547 23.6953V25.2422C17.0547 25.3803 16.9428 25.4922 16.8047 25.4922H15.2578C15.1197 25.4922 15.0078 25.3803 15.0078 25.2422V23.6953Z" stroke="#422E6F" stroke-width="0.1" />
</g>
<g filter="url(#filter25_f_18_20100)">
<path d="M20.4688 23.6953C20.4688 23.5572 20.5807 23.4453 20.7188 23.4453H22.2656C22.4037 23.4453 22.5156 23.5572 22.5156 23.6953V25.2422C22.5156 25.3803 22.4037 25.4922 22.2656 25.4922H20.7188C20.5807 25.4922 20.4688 25.3803 20.4688 25.2422V23.6953Z" stroke="#422E6F" stroke-width="0.1" />
</g>
<g filter="url(#filter26_f_18_20100)">
<path d="M25.9375 23.6953C25.9375 23.5572 26.0494 23.4453 26.1875 23.4453H27.7344C27.8724 23.4453 27.9844 23.5572 27.9844 23.6953V25.2422C27.9844 25.3803 27.8724 25.4922 27.7344 25.4922H26.1875C26.0494 25.4922 25.9375 25.3803 25.9375 25.2422V23.6953Z" stroke="#422E6F" stroke-width="0.1" />
</g>
<path d="M4.0625 23.6953C4.0625 23.5572 4.17443 23.4453 4.3125 23.4453H5.85938C5.99745 23.4453 6.10938 23.5572 6.10938 23.6953V25.2422C6.10938 25.3803 5.99745 25.4922 5.85938 25.4922H4.3125C4.17443 25.4922 4.0625 25.3803 4.0625 25.2422V23.6953Z" fill="#E5E5E5" />
<path d="M9.53125 23.6953C9.53125 23.5572 9.64318 23.4453 9.78125 23.4453H11.3281C11.4662 23.4453 11.5781 23.5572 11.5781 23.6953V25.2422C11.5781 25.3803 11.4662 25.4922 11.3281 25.4922H9.78125C9.64318 25.4922 9.53125 25.3803 9.53125 25.2422V23.6953Z" fill="#E5E5E5" />
<path d="M15 23.6953C15 23.5572 15.1119 23.4453 15.25 23.4453H16.7969C16.9349 23.4453 17.0469 23.5572 17.0469 23.6953V25.2422C17.0469 25.3803 16.9349 25.4922 16.7969 25.4922H15.25C15.1119 25.4922 15 25.3803 15 25.2422V23.6953Z" fill="#E5E5E5" />
<path d="M20.4688 23.6953C20.4688 23.5572 20.5807 23.4453 20.7188 23.4453H22.2656C22.4037 23.4453 22.5156 23.5572 22.5156 23.6953V25.2422C22.5156 25.3803 22.4037 25.4922 22.2656 25.4922H20.7188C20.5807 25.4922 20.4688 25.3803 20.4688 25.2422V23.6953Z" fill="#E5E5E5" />
<path d="M25.9375 23.6953C25.9375 23.5572 26.0494 23.4453 26.1875 23.4453H27.7344C27.8724 23.4453 27.9844 23.5572 27.9844 23.6953V25.2422C27.9844 25.3803 27.8724 25.4922 27.7344 25.4922H26.1875C26.0494 25.4922 25.9375 25.3803 25.9375 25.2422V23.6953Z" fill="#E5E5E5" />
<defs>
<filter id="filter0_iiii_18_20100" x="1.79375" y="4.66875" width="28.575" height="22.6313" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha" />
<feOffset dy="0.4" />
<feGaussianBlur stdDeviation="0.15" />
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1" />
<feColorMatrix type="matrix" values="0 0 0 0 0.356863 0 0 0 0 0.317647 0 0 0 0 0.501961 0 0 0 1 0" />
<feBlend mode="normal" in2="shape" result="effect1_innerShadow_18_20100" />
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha" />
<feOffset dx="-0.4" />
<feGaussianBlur stdDeviation="0.15" />
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1" />
<feColorMatrix type="matrix" values="0 0 0 0 0.447059 0 0 0 0 0.407843 0 0 0 0 0.572549 0 0 0 1 0" />
<feBlend mode="normal" in2="effect1_innerShadow_18_20100" result="effect2_innerShadow_18_20100" />
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha" />
<feOffset dy="-0.4" />
<feGaussianBlur stdDeviation="0.15" />
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1" />
<feColorMatrix type="matrix" values="0 0 0 0 0.376471 0 0 0 0 0.231373 0 0 0 0 0.584314 0 0 0 1 0" />
<feBlend mode="normal" in2="effect2_innerShadow_18_20100" result="effect3_innerShadow_18_20100" />
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha" />
<feOffset dx="0.4" />
<feGaussianBlur stdDeviation="0.2" />
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1" />
<feColorMatrix type="matrix" values="0 0 0 0 0.313726 0 0 0 0 0.262745 0 0 0 0 0.466667 0 0 0 1 0" />
<feBlend mode="normal" in2="effect3_innerShadow_18_20100" result="effect4_innerShadow_18_20100" />
</filter>
<filter id="filter1_f_18_20100" x="1.95439" y="9.39067" width="6.3738" height="13.2187" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.15" result="effect1_foregroundBlur_18_20100" />
</filter>
<filter id="filter2_f_18_20100" x="23.7344" y="9.39067" width="6.38894" height="13.2187" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.15" result="effect1_foregroundBlur_18_20100" />
</filter>
<filter id="filter3_f_18_20100" x="9.32036" y="9.39067" width="13.3593" height="13.2187" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.15" result="effect1_foregroundBlur_18_20100" />
</filter>
<filter id="filter4_i_18_20100" x="24.3594" y="10.0156" width="6.60938" height="11.9688" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha" />
<feOffset dx="1" />
<feGaussianBlur stdDeviation="1.5" />
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1" />
<feColorMatrix type="matrix" values="0 0 0 0 0.321569 0 0 0 0 0.615686 0 0 0 0 0.764706 0 0 0 1 0" />
<feBlend mode="normal" in2="shape" result="effect1_innerShadow_18_20100" />
</filter>
<filter id="filter5_i_18_20100" x="9.94531" y="10.0156" width="12.1094" height="11.9688" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha" />
<feOffset />
<feGaussianBlur stdDeviation="2" />
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1" />
<feColorMatrix type="matrix" values="0 0 0 0 0.321569 0 0 0 0 0.615686 0 0 0 0 0.764706 0 0 0 1 0" />
<feBlend mode="normal" in2="shape" result="effect1_innerShadow_18_20100" />
</filter>
<filter id="filter6_i_18_20100" x="1.09375" y="10.0156" width="6.60938" height="11.9688" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha" />
<feOffset dx="-1" />
<feGaussianBlur stdDeviation="1.5" />
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1" />
<feColorMatrix type="matrix" values="0 0 0 0 0.321569 0 0 0 0 0.615686 0 0 0 0 0.764706 0 0 0 1 0" />
<feBlend mode="normal" in2="shape" result="effect1_innerShadow_18_20100" />
</filter>
<filter id="filter7_f_18_20100" x="3.51245" y="5.95776" width="3.14697" height="3.14697" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.125" result="effect1_foregroundBlur_18_20100" />
</filter>
<filter id="filter8_f_18_20100" x="3.86245" y="6.30776" width="2.44697" height="2.44697" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.075" result="effect1_foregroundBlur_18_20100" />
</filter>
<filter id="filter9_f_18_20100" x="8.9812" y="5.95776" width="3.14697" height="3.14697" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.125" result="effect1_foregroundBlur_18_20100" />
</filter>
<filter id="filter10_f_18_20100" x="9.3312" y="6.30776" width="2.44697" height="2.44697" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.075" result="effect1_foregroundBlur_18_20100" />
</filter>
<filter id="filter11_f_18_20100" x="14.4578" y="5.95776" width="3.14697" height="3.14697" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.125" result="effect1_foregroundBlur_18_20100" />
</filter>
<filter id="filter12_f_18_20100" x="14.8078" y="6.30776" width="2.44697" height="2.44697" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.075" result="effect1_foregroundBlur_18_20100" />
</filter>
<filter id="filter13_f_18_20100" x="19.9187" y="5.95776" width="3.14697" height="3.14697" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.125" result="effect1_foregroundBlur_18_20100" />
</filter>
<filter id="filter14_f_18_20100" x="20.2687" y="6.30776" width="2.44697" height="2.44697" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.075" result="effect1_foregroundBlur_18_20100" />
</filter>
<filter id="filter15_f_18_20100" x="25.3875" y="5.95776" width="3.14697" height="3.14697" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.125" result="effect1_foregroundBlur_18_20100" />
</filter>
<filter id="filter16_f_18_20100" x="25.7375" y="6.30776" width="2.44697" height="2.44697" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.075" result="effect1_foregroundBlur_18_20100" />
</filter>
<filter id="filter17_f_18_20100" x="3.51245" y="22.8953" width="3.14697" height="3.14697" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.125" result="effect1_foregroundBlur_18_20100" />
</filter>
<filter id="filter18_f_18_20100" x="8.9812" y="22.8953" width="3.14697" height="3.14697" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.125" result="effect1_foregroundBlur_18_20100" />
</filter>
<filter id="filter19_f_18_20100" x="14.45" y="22.8953" width="3.14697" height="3.14697" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.125" result="effect1_foregroundBlur_18_20100" />
</filter>
<filter id="filter20_f_18_20100" x="19.9187" y="22.8953" width="3.14697" height="3.14697" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.125" result="effect1_foregroundBlur_18_20100" />
</filter>
<filter id="filter21_f_18_20100" x="25.3875" y="22.8953" width="3.14697" height="3.14697" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.125" result="effect1_foregroundBlur_18_20100" />
</filter>
<filter id="filter22_f_18_20100" x="3.86245" y="23.2453" width="2.44697" height="2.44697" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.075" result="effect1_foregroundBlur_18_20100" />
</filter>
<filter id="filter23_f_18_20100" x="9.3312" y="23.2453" width="2.44697" height="2.44697" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.075" result="effect1_foregroundBlur_18_20100" />
</filter>
<filter id="filter24_f_18_20100" x="14.8078" y="23.2453" width="2.44697" height="2.44697" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.075" result="effect1_foregroundBlur_18_20100" />
</filter>
<filter id="filter25_f_18_20100" x="20.2687" y="23.2453" width="2.44697" height="2.44697" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.075" result="effect1_foregroundBlur_18_20100" />
</filter>
<filter id="filter26_f_18_20100" x="25.7375" y="23.2453" width="2.44697" height="2.44697" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.075" result="effect1_foregroundBlur_18_20100" />
</filter>
<linearGradient id="paint0_linear_18_20100" x1="2.76942" y1="21.4319" x2="6.13388" y2="21.1993" gradientUnits="userSpaceOnUse">
<stop stop-color="#564D7C" />
<stop offset="1" stop-color="#564D7C" stop-opacity="0" />
</linearGradient>
<linearGradient id="paint1_linear_18_20100" x1="24.55" y1="21.4319" x2="25.7998" y2="21.3309" gradientUnits="userSpaceOnUse">
<stop stop-color="#7D769C" />
<stop offset="1" stop-color="#7D769C" stop-opacity="0" />
</linearGradient>
<linearGradient id="paint2_linear_18_20100" x1="10.3945" y1="21.4319" x2="13.255" y2="20.8871" gradientUnits="userSpaceOnUse">
<stop stop-color="#7D769C" />
<stop offset="1" stop-color="#7D769C" stop-opacity="0" />
</linearGradient>
<linearGradient id="paint3_linear_18_20100" x1="30.8125" y1="21.9844" x2="26.6875" y2="21.9844" gradientUnits="userSpaceOnUse">
<stop stop-color="#87CDED" />
<stop offset="1" stop-color="#87CDED" stop-opacity="0" />
</linearGradient>
<linearGradient id="paint4_linear_18_20100" x1="3.90625" y1="8.55469" x2="4.8125" y2="8.45312" gradientUnits="userSpaceOnUse">
<stop stop-color="#7A7294" />
<stop offset="1" stop-color="#7A7294" stop-opacity="0" />
</linearGradient>
<linearGradient id="paint5_linear_18_20100" x1="9.375" y1="8.55469" x2="10.2812" y2="8.45312" gradientUnits="userSpaceOnUse">
<stop stop-color="#7A7294" />
<stop offset="1" stop-color="#7A7294" stop-opacity="0" />
</linearGradient>
<linearGradient id="paint6_linear_18_20100" x1="14.8516" y1="8.55469" x2="15.7578" y2="8.45312" gradientUnits="userSpaceOnUse">
<stop stop-color="#7A7294" />
<stop offset="1" stop-color="#7A7294" stop-opacity="0" />
</linearGradient>
<linearGradient id="paint7_linear_18_20100" x1="20.3125" y1="8.55469" x2="21.2187" y2="8.45312" gradientUnits="userSpaceOnUse">
<stop stop-color="#7A7294" />
<stop offset="1" stop-color="#7A7294" stop-opacity="0" />
</linearGradient>
<linearGradient id="paint8_linear_18_20100" x1="25.7812" y1="8.55469" x2="26.6875" y2="8.45312" gradientUnits="userSpaceOnUse">
<stop stop-color="#7A7294" />
<stop offset="1" stop-color="#7A7294" stop-opacity="0" />
</linearGradient>
<linearGradient id="paint9_linear_18_20100" x1="3.90625" y1="25.4922" x2="4.8125" y2="25.3906" gradientUnits="userSpaceOnUse">
<stop stop-color="#7A7294" />
<stop offset="1" stop-color="#7A7294" stop-opacity="0" />
</linearGradient>
<linearGradient id="paint10_linear_18_20100" x1="9.375" y1="25.4922" x2="10.2812" y2="25.3906" gradientUnits="userSpaceOnUse">
<stop stop-color="#7A7294" />
<stop offset="1" stop-color="#7A7294" stop-opacity="0" />
</linearGradient>
<linearGradient id="paint11_linear_18_20100" x1="14.8437" y1="25.4922" x2="15.75" y2="25.3906" gradientUnits="userSpaceOnUse">
<stop stop-color="#7A7294" />
<stop offset="1" stop-color="#7A7294" stop-opacity="0" />
</linearGradient>
<linearGradient id="paint12_linear_18_20100" x1="20.3125" y1="25.4922" x2="21.2187" y2="25.3906" gradientUnits="userSpaceOnUse">
<stop stop-color="#7A7294" />
<stop offset="1" stop-color="#7A7294" stop-opacity="0" />
</linearGradient>
<linearGradient id="paint13_linear_18_20100" x1="25.7812" y1="25.4922" x2="26.6875" y2="25.3906" gradientUnits="userSpaceOnUse">
<stop stop-color="#7A7294" />
<stop offset="1" stop-color="#7A7294" stop-opacity="0" />
</linearGradient>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

View File

@ -1,186 +0,0 @@
<svg width="100%" height="100%" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<g filter="url(#filter0_i_18_18382)">
<path d="M8.97094 7.24512C6.29539 9.30811 5.9423 11.5837 5.9873 12.9995C6.05991 14.2784 6.22043 15.1674 6.34761 15.8717L6.36089 15.9453C6.51034 16.7742 6.17759 17.5816 5.56055 18.0928L4.91841 18.6248C4.8743 18.6613 4.86067 18.7232 4.88534 18.7749L6.09659 21.3137L4.51715 22.0672L3.3059 19.5285C2.93592 18.753 3.14034 17.8253 3.80197 17.2772L4.44412 16.7452C4.60682 16.6104 4.66887 16.4233 4.63866 16.2557L4.62452 16.1775C4.56451 15.8452 4.27047 13.8177 4.25247 13.0581C4.22614 11.9474 4.29703 8.81201 6.58812 6.15918C9.26 3.06543 13.4866 2.08105 15.9553 2.08105C18.5881 2.08105 22.7402 3.06543 25.4121 6.15918C27.7032 8.81201 27.7741 11.9474 27.7478 13.0581C27.7856 13.7659 27.4357 15.8452 27.3757 16.1775L27.3616 16.2557C27.3314 16.4233 27.3934 16.6104 27.5561 16.7452L28.1983 17.2772C28.8599 17.8253 29.0643 18.753 28.6943 19.5285L27.4831 22.0672L25.9036 21.3137L27.1149 18.7749C27.1396 18.7232 27.1259 18.6613 27.0818 18.6248L26.4397 18.0928C25.8226 17.5816 25.4899 16.7742 25.6393 15.9453L25.6526 15.8717C25.7798 15.1674 25.9403 14.2785 26.0129 12.9997C26.0579 11.5838 25.7049 9.30811 23.0293 7.24512C20.219 5.07819 17.1662 4.90137 15.9553 4.90137C14.7444 4.90137 11.7812 5.07819 8.97094 7.24512Z" fill="url(#paint0_radial_18_18382)" />
<path d="M8.97094 7.24512C6.29539 9.30811 5.9423 11.5837 5.9873 12.9995C6.05991 14.2784 6.22043 15.1674 6.34761 15.8717L6.36089 15.9453C6.51034 16.7742 6.17759 17.5816 5.56055 18.0928L4.91841 18.6248C4.8743 18.6613 4.86067 18.7232 4.88534 18.7749L6.09659 21.3137L4.51715 22.0672L3.3059 19.5285C2.93592 18.753 3.14034 17.8253 3.80197 17.2772L4.44412 16.7452C4.60682 16.6104 4.66887 16.4233 4.63866 16.2557L4.62452 16.1775C4.56451 15.8452 4.27047 13.8177 4.25247 13.0581C4.22614 11.9474 4.29703 8.81201 6.58812 6.15918C9.26 3.06543 13.4866 2.08105 15.9553 2.08105C18.5881 2.08105 22.7402 3.06543 25.4121 6.15918C27.7032 8.81201 27.7741 11.9474 27.7478 13.0581C27.7856 13.7659 27.4357 15.8452 27.3757 16.1775L27.3616 16.2557C27.3314 16.4233 27.3934 16.6104 27.5561 16.7452L28.1983 17.2772C28.8599 17.8253 29.0643 18.753 28.6943 19.5285L27.4831 22.0672L25.9036 21.3137L27.1149 18.7749C27.1396 18.7232 27.1259 18.6613 27.0818 18.6248L26.4397 18.0928C25.8226 17.5816 25.4899 16.7742 25.6393 15.9453L25.6526 15.8717C25.7798 15.1674 25.9403 14.2785 26.0129 12.9997C26.0579 11.5838 25.7049 9.30811 23.0293 7.24512C20.219 5.07819 17.1662 4.90137 15.9553 4.90137C14.7444 4.90137 11.7812 5.07819 8.97094 7.24512Z" fill="url(#paint1_radial_18_18382)" />
<path d="M8.97094 7.24512C6.29539 9.30811 5.9423 11.5837 5.9873 12.9995C6.05991 14.2784 6.22043 15.1674 6.34761 15.8717L6.36089 15.9453C6.51034 16.7742 6.17759 17.5816 5.56055 18.0928L4.91841 18.6248C4.8743 18.6613 4.86067 18.7232 4.88534 18.7749L6.09659 21.3137L4.51715 22.0672L3.3059 19.5285C2.93592 18.753 3.14034 17.8253 3.80197 17.2772L4.44412 16.7452C4.60682 16.6104 4.66887 16.4233 4.63866 16.2557L4.62452 16.1775C4.56451 15.8452 4.27047 13.8177 4.25247 13.0581C4.22614 11.9474 4.29703 8.81201 6.58812 6.15918C9.26 3.06543 13.4866 2.08105 15.9553 2.08105C18.5881 2.08105 22.7402 3.06543 25.4121 6.15918C27.7032 8.81201 27.7741 11.9474 27.7478 13.0581C27.7856 13.7659 27.4357 15.8452 27.3757 16.1775L27.3616 16.2557C27.3314 16.4233 27.3934 16.6104 27.5561 16.7452L28.1983 17.2772C28.8599 17.8253 29.0643 18.753 28.6943 19.5285L27.4831 22.0672L25.9036 21.3137L27.1149 18.7749C27.1396 18.7232 27.1259 18.6613 27.0818 18.6248L26.4397 18.0928C25.8226 17.5816 25.4899 16.7742 25.6393 15.9453L25.6526 15.8717C25.7798 15.1674 25.9403 14.2785 26.0129 12.9997C26.0579 11.5838 25.7049 9.30811 23.0293 7.24512C20.219 5.07819 17.1662 4.90137 15.9553 4.90137C14.7444 4.90137 11.7812 5.07819 8.97094 7.24512Z" fill="url(#paint2_radial_18_18382)" />
<path d="M8.97094 7.24512C6.29539 9.30811 5.9423 11.5837 5.9873 12.9995C6.05991 14.2784 6.22043 15.1674 6.34761 15.8717L6.36089 15.9453C6.51034 16.7742 6.17759 17.5816 5.56055 18.0928L4.91841 18.6248C4.8743 18.6613 4.86067 18.7232 4.88534 18.7749L6.09659 21.3137L4.51715 22.0672L3.3059 19.5285C2.93592 18.753 3.14034 17.8253 3.80197 17.2772L4.44412 16.7452C4.60682 16.6104 4.66887 16.4233 4.63866 16.2557L4.62452 16.1775C4.56451 15.8452 4.27047 13.8177 4.25247 13.0581C4.22614 11.9474 4.29703 8.81201 6.58812 6.15918C9.26 3.06543 13.4866 2.08105 15.9553 2.08105C18.5881 2.08105 22.7402 3.06543 25.4121 6.15918C27.7032 8.81201 27.7741 11.9474 27.7478 13.0581C27.7856 13.7659 27.4357 15.8452 27.3757 16.1775L27.3616 16.2557C27.3314 16.4233 27.3934 16.6104 27.5561 16.7452L28.1983 17.2772C28.8599 17.8253 29.0643 18.753 28.6943 19.5285L27.4831 22.0672L25.9036 21.3137L27.1149 18.7749C27.1396 18.7232 27.1259 18.6613 27.0818 18.6248L26.4397 18.0928C25.8226 17.5816 25.4899 16.7742 25.6393 15.9453L25.6526 15.8717C25.7798 15.1674 25.9403 14.2785 26.0129 12.9997C26.0579 11.5838 25.7049 9.30811 23.0293 7.24512C20.219 5.07819 17.1662 4.90137 15.9553 4.90137C14.7444 4.90137 11.7812 5.07819 8.97094 7.24512Z" fill="url(#paint3_radial_18_18382)" />
<path d="M8.97094 7.24512C6.29539 9.30811 5.9423 11.5837 5.9873 12.9995C6.05991 14.2784 6.22043 15.1674 6.34761 15.8717L6.36089 15.9453C6.51034 16.7742 6.17759 17.5816 5.56055 18.0928L4.91841 18.6248C4.8743 18.6613 4.86067 18.7232 4.88534 18.7749L6.09659 21.3137L4.51715 22.0672L3.3059 19.5285C2.93592 18.753 3.14034 17.8253 3.80197 17.2772L4.44412 16.7452C4.60682 16.6104 4.66887 16.4233 4.63866 16.2557L4.62452 16.1775C4.56451 15.8452 4.27047 13.8177 4.25247 13.0581C4.22614 11.9474 4.29703 8.81201 6.58812 6.15918C9.26 3.06543 13.4866 2.08105 15.9553 2.08105C18.5881 2.08105 22.7402 3.06543 25.4121 6.15918C27.7032 8.81201 27.7741 11.9474 27.7478 13.0581C27.7856 13.7659 27.4357 15.8452 27.3757 16.1775L27.3616 16.2557C27.3314 16.4233 27.3934 16.6104 27.5561 16.7452L28.1983 17.2772C28.8599 17.8253 29.0643 18.753 28.6943 19.5285L27.4831 22.0672L25.9036 21.3137L27.1149 18.7749C27.1396 18.7232 27.1259 18.6613 27.0818 18.6248L26.4397 18.0928C25.8226 17.5816 25.4899 16.7742 25.6393 15.9453L25.6526 15.8717C25.7798 15.1674 25.9403 14.2785 26.0129 12.9997C26.0579 11.5838 25.7049 9.30811 23.0293 7.24512C20.219 5.07819 17.1662 4.90137 15.9553 4.90137C14.7444 4.90137 11.7812 5.07819 8.97094 7.24512Z" fill="url(#paint4_radial_18_18382)" />
<path d="M8.97094 7.24512C6.29539 9.30811 5.9423 11.5837 5.9873 12.9995C6.05991 14.2784 6.22043 15.1674 6.34761 15.8717L6.36089 15.9453C6.51034 16.7742 6.17759 17.5816 5.56055 18.0928L4.91841 18.6248C4.8743 18.6613 4.86067 18.7232 4.88534 18.7749L6.09659 21.3137L4.51715 22.0672L3.3059 19.5285C2.93592 18.753 3.14034 17.8253 3.80197 17.2772L4.44412 16.7452C4.60682 16.6104 4.66887 16.4233 4.63866 16.2557L4.62452 16.1775C4.56451 15.8452 4.27047 13.8177 4.25247 13.0581C4.22614 11.9474 4.29703 8.81201 6.58812 6.15918C9.26 3.06543 13.4866 2.08105 15.9553 2.08105C18.5881 2.08105 22.7402 3.06543 25.4121 6.15918C27.7032 8.81201 27.7741 11.9474 27.7478 13.0581C27.7856 13.7659 27.4357 15.8452 27.3757 16.1775L27.3616 16.2557C27.3314 16.4233 27.3934 16.6104 27.5561 16.7452L28.1983 17.2772C28.8599 17.8253 29.0643 18.753 28.6943 19.5285L27.4831 22.0672L25.9036 21.3137L27.1149 18.7749C27.1396 18.7232 27.1259 18.6613 27.0818 18.6248L26.4397 18.0928C25.8226 17.5816 25.4899 16.7742 25.6393 15.9453L25.6526 15.8717C25.7798 15.1674 25.9403 14.2785 26.0129 12.9997C26.0579 11.5838 25.7049 9.30811 23.0293 7.24512C20.219 5.07819 17.1662 4.90137 15.9553 4.90137C14.7444 4.90137 11.7812 5.07819 8.97094 7.24512Z" fill="url(#paint5_linear_18_18382)" />
</g>
<path d="M3.72032 22.4236C3.5802 21.9624 3.78897 21.4669 4.21686 21.2451L7.50131 19.5423C7.94222 19.3137 8.4827 19.5379 8.63234 20.0115L11.1429 27.9561C11.2933 28.432 10.9759 28.928 10.4808 28.9908L6.72997 29.4669C6.24636 29.5283 5.78896 29.232 5.64724 28.7656L3.72032 22.4236Z" fill="url(#paint6_linear_18_18382)" />
<path d="M3.72032 22.4236C3.5802 21.9624 3.78897 21.4669 4.21686 21.2451L7.50131 19.5423C7.94222 19.3137 8.4827 19.5379 8.63234 20.0115L11.1429 27.9561C11.2933 28.432 10.9759 28.928 10.4808 28.9908L6.72997 29.4669C6.24636 29.5283 5.78896 29.232 5.64724 28.7656L3.72032 22.4236Z" fill="url(#paint7_linear_18_18382)" />
<path d="M3.72032 22.4236C3.5802 21.9624 3.78897 21.4669 4.21686 21.2451L7.50131 19.5423C7.94222 19.3137 8.4827 19.5379 8.63234 20.0115L11.1429 27.9561C11.2933 28.432 10.9759 28.928 10.4808 28.9908L6.72997 29.4669C6.24636 29.5283 5.78896 29.232 5.64724 28.7656L3.72032 22.4236Z" fill="url(#paint8_radial_18_18382)" />
<path d="M3.72032 22.4236C3.5802 21.9624 3.78897 21.4669 4.21686 21.2451L7.50131 19.5423C7.94222 19.3137 8.4827 19.5379 8.63234 20.0115L11.1429 27.9561C11.2933 28.432 10.9759 28.928 10.4808 28.9908L6.72997 29.4669C6.24636 29.5283 5.78896 29.232 5.64724 28.7656L3.72032 22.4236Z" fill="url(#paint9_linear_18_18382)" />
<path d="M3.72032 22.4236C3.5802 21.9624 3.78897 21.4669 4.21686 21.2451L7.50131 19.5423C7.94222 19.3137 8.4827 19.5379 8.63234 20.0115L11.1429 27.9561C11.2933 28.432 10.9759 28.928 10.4808 28.9908L6.72997 29.4669C6.24636 29.5283 5.78896 29.232 5.64724 28.7656L3.72032 22.4236Z" fill="url(#paint10_linear_18_18382)" />
<g filter="url(#filter1_i_18_18382)">
<path d="M28.263 22.4236C28.4031 21.9624 28.1943 21.4669 27.7664 21.2451L24.482 19.5423C24.0411 19.3137 23.5006 19.5379 23.3509 20.0115L20.8404 27.9561C20.69 28.432 21.0074 28.928 21.5025 28.9908L25.2533 29.4669C25.7369 29.5283 26.1943 29.232 26.336 28.7656L28.263 22.4236Z" fill="url(#paint11_linear_18_18382)" />
<path d="M28.263 22.4236C28.4031 21.9624 28.1943 21.4669 27.7664 21.2451L24.482 19.5423C24.0411 19.3137 23.5006 19.5379 23.3509 20.0115L20.8404 27.9561C20.69 28.432 21.0074 28.928 21.5025 28.9908L25.2533 29.4669C25.7369 29.5283 26.1943 29.232 26.336 28.7656L28.263 22.4236Z" fill="url(#paint12_linear_18_18382)" />
<path d="M28.263 22.4236C28.4031 21.9624 28.1943 21.4669 27.7664 21.2451L24.482 19.5423C24.0411 19.3137 23.5006 19.5379 23.3509 20.0115L20.8404 27.9561C20.69 28.432 21.0074 28.928 21.5025 28.9908L25.2533 29.4669C25.7369 29.5283 26.1943 29.232 26.336 28.7656L28.263 22.4236Z" fill="url(#paint13_radial_18_18382)" />
<path d="M28.263 22.4236C28.4031 21.9624 28.1943 21.4669 27.7664 21.2451L24.482 19.5423C24.0411 19.3137 23.5006 19.5379 23.3509 20.0115L20.8404 27.9561C20.69 28.432 21.0074 28.928 21.5025 28.9908L25.2533 29.4669C25.7369 29.5283 26.1943 29.232 26.336 28.7656L28.263 22.4236Z" fill="url(#paint14_radial_18_18382)" />
</g>
<path d="M6.46752 19.7017C6.34016 19.2787 6.57989 18.8324 7.00296 18.7051L9.338 18.0022C9.76108 17.8748 10.2073 18.1146 10.3346 18.5376L13.2486 28.2178C13.376 28.6409 13.1362 29.0871 12.7132 29.2144L10.3781 29.9173C9.95505 30.0447 9.50884 29.805 9.38149 29.3819L6.46752 19.7017Z" fill="url(#paint15_linear_18_18382)" />
<path d="M6.46752 19.7017C6.34016 19.2787 6.57989 18.8324 7.00296 18.7051L9.338 18.0022C9.76108 17.8748 10.2073 18.1146 10.3346 18.5376L13.2486 28.2178C13.376 28.6409 13.1362 29.0871 12.7132 29.2144L10.3781 29.9173C9.95505 30.0447 9.50884 29.805 9.38149 29.3819L6.46752 19.7017Z" fill="url(#paint16_radial_18_18382)" />
<path d="M6.46752 19.7017C6.34016 19.2787 6.57989 18.8324 7.00296 18.7051L9.338 18.0022C9.76108 17.8748 10.2073 18.1146 10.3346 18.5376L13.2486 28.2178C13.376 28.6409 13.1362 29.0871 12.7132 29.2144L10.3781 29.9173C9.95505 30.0447 9.50884 29.805 9.38149 29.3819L6.46752 19.7017Z" fill="url(#paint17_radial_18_18382)" />
<path d="M6.46752 19.7017C6.34016 19.2787 6.57989 18.8324 7.00296 18.7051L9.338 18.0022C9.76108 17.8748 10.2073 18.1146 10.3346 18.5376L13.2486 28.2178C13.376 28.6409 13.1362 29.0871 12.7132 29.2144L10.3781 29.9173C9.95505 30.0447 9.50884 29.805 9.38149 29.3819L6.46752 19.7017Z" fill="url(#paint18_linear_18_18382)" />
<path d="M25.3283 19.7017C25.4556 19.2787 25.2159 18.8324 24.7928 18.7051L22.4578 18.0022C22.0347 17.8748 21.5885 18.1146 21.4611 18.5376L18.5472 28.2178C18.4198 28.6409 18.6595 29.0871 19.0826 29.2144L21.4176 29.9173C21.8407 30.0447 22.2869 29.805 22.4143 29.3819L25.3283 19.7017Z" fill="url(#paint19_linear_18_18382)" />
<path d="M25.3283 19.7017C25.4556 19.2787 25.2159 18.8324 24.7928 18.7051L22.4578 18.0022C22.0347 17.8748 21.5885 18.1146 21.4611 18.5376L18.5472 28.2178C18.4198 28.6409 18.6595 29.0871 19.0826 29.2144L21.4176 29.9173C21.8407 30.0447 22.2869 29.805 22.4143 29.3819L25.3283 19.7017Z" fill="url(#paint20_linear_18_18382)" />
<path d="M25.3283 19.7017C25.4556 19.2787 25.2159 18.8324 24.7928 18.7051L22.4578 18.0022C22.0347 17.8748 21.5885 18.1146 21.4611 18.5376L18.5472 28.2178C18.4198 28.6409 18.6595 29.0871 19.0826 29.2144L21.4176 29.9173C21.8407 30.0447 22.2869 29.805 22.4143 29.3819L25.3283 19.7017Z" fill="url(#paint21_radial_18_18382)" />
<path d="M25.3283 19.7017C25.4556 19.2787 25.2159 18.8324 24.7928 18.7051L22.4578 18.0022C22.0347 17.8748 21.5885 18.1146 21.4611 18.5376L18.5472 28.2178C18.4198 28.6409 18.6595 29.0871 19.0826 29.2144L21.4176 29.9173C21.8407 30.0447 22.2869 29.805 22.4143 29.3819L25.3283 19.7017Z" fill="url(#paint22_radial_18_18382)" />
<path d="M5.98718 12.9995C5.94219 11.5837 6.29527 9.30811 8.97082 7.24512C11.7811 5.07819 14.7443 4.90137 15.9552 4.90137C17.1661 4.90137 20.2189 5.07819 23.0292 7.24512C25.7048 9.30811 26.0578 11.5838 26.0128 12.9997C25.9402 14.2785 25.7797 15.1674 25.6525 15.8717L25.6392 15.9453C25.5195 16.6093 25.7093 17.2597 26.1068 17.7549L26.7731 14.0724C26.7903 13.986 26.806 13.8988 26.8203 13.8115C26.8873 13.4016 26.9219 12.983 26.9219 12.5576C26.9219 7.50073 22.032 3.40137 16 3.40137C9.96801 3.40137 5.07812 7.50073 5.07812 12.5576C5.07812 12.9883 5.1136 13.4121 5.18224 13.8271L5.17969 13.8271L5.89691 17.7503C6.2919 17.2556 6.48014 16.6073 6.36077 15.9453L6.34749 15.8717C6.22031 15.1674 6.05979 14.2784 5.98718 12.9995Z" fill="url(#paint23_linear_18_18382)" />
<path d="M5.98718 12.9995C5.94219 11.5837 6.29527 9.30811 8.97082 7.24512C11.7811 5.07819 14.7443 4.90137 15.9552 4.90137C17.1661 4.90137 20.2189 5.07819 23.0292 7.24512C25.7048 9.30811 26.0578 11.5838 26.0128 12.9997C25.9402 14.2785 25.7797 15.1674 25.6525 15.8717L25.6392 15.9453C25.5195 16.6093 25.7093 17.2597 26.1068 17.7549L26.7731 14.0724C26.7903 13.986 26.806 13.8988 26.8203 13.8115C26.8873 13.4016 26.9219 12.983 26.9219 12.5576C26.9219 7.50073 22.032 3.40137 16 3.40137C9.96801 3.40137 5.07812 7.50073 5.07812 12.5576C5.07812 12.9883 5.1136 13.4121 5.18224 13.8271L5.17969 13.8271L5.89691 17.7503C6.2919 17.2556 6.48014 16.6073 6.36077 15.9453L6.34749 15.8717C6.22031 15.1674 6.05979 14.2784 5.98718 12.9995Z" fill="url(#paint24_radial_18_18382)" />
<path d="M5.98718 12.9995C5.94219 11.5837 6.29527 9.30811 8.97082 7.24512C11.7811 5.07819 14.7443 4.90137 15.9552 4.90137C17.1661 4.90137 20.2189 5.07819 23.0292 7.24512C25.7048 9.30811 26.0578 11.5838 26.0128 12.9997C25.9402 14.2785 25.7797 15.1674 25.6525 15.8717L25.6392 15.9453C25.5195 16.6093 25.7093 17.2597 26.1068 17.7549L26.7731 14.0724C26.7903 13.986 26.806 13.8988 26.8203 13.8115C26.8873 13.4016 26.9219 12.983 26.9219 12.5576C26.9219 7.50073 22.032 3.40137 16 3.40137C9.96801 3.40137 5.07812 7.50073 5.07812 12.5576C5.07812 12.9883 5.1136 13.4121 5.18224 13.8271L5.17969 13.8271L5.89691 17.7503C6.2919 17.2556 6.48014 16.6073 6.36077 15.9453L6.34749 15.8717C6.22031 15.1674 6.05979 14.2784 5.98718 12.9995Z" fill="url(#paint25_linear_18_18382)" />
<path d="M5.98718 12.9995C5.94219 11.5837 6.29527 9.30811 8.97082 7.24512C11.7811 5.07819 14.7443 4.90137 15.9552 4.90137C17.1661 4.90137 20.2189 5.07819 23.0292 7.24512C25.7048 9.30811 26.0578 11.5838 26.0128 12.9997C25.9402 14.2785 25.7797 15.1674 25.6525 15.8717L25.6392 15.9453C25.5195 16.6093 25.7093 17.2597 26.1068 17.7549L26.7731 14.0724C26.7903 13.986 26.806 13.8988 26.8203 13.8115C26.8873 13.4016 26.9219 12.983 26.9219 12.5576C26.9219 7.50073 22.032 3.40137 16 3.40137C9.96801 3.40137 5.07812 7.50073 5.07812 12.5576C5.07812 12.9883 5.1136 13.4121 5.18224 13.8271L5.17969 13.8271L5.89691 17.7503C6.2919 17.2556 6.48014 16.6073 6.36077 15.9453L6.34749 15.8717C6.22031 15.1674 6.05979 14.2784 5.98718 12.9995Z" fill="url(#paint26_radial_18_18382)" />
<g filter="url(#filter2_f_18_18382)">
<path d="M26.1724 17.316C26.1896 17.2295 26.806 13.8988 26.8203 13.8115C26.8873 13.4016 26.9219 12.983 26.9219 12.5576C26.9219 7.50073 22.032 3.40137 16 3.40137C9.96801 3.40137 5.07812 7.50073 5.07812 12.5576C5.07812 12.9883 5.1136 13.4121 5.18224 13.8271L5.17969 13.8271L5.83019 17.4014" stroke="url(#paint27_linear_18_18382)" stroke-width="0.1" />
</g>
<g filter="url(#filter3_f_18_18382)">
<path d="M27.0589 16.0014C26.9997 16.2263 26.9622 16.7367 27.2856 16.9788C27.609 17.2208 27.8068 17.3878 27.8653 17.441C28.1661 17.6417 28.6741 18.257 28.299 19.1125" stroke="#D1D1D3" stroke-width="0.3" />
</g>
<defs>
<filter id="filter0_i_18_18382" x="3.12305" y="1.83105" width="26.0042" height="20.2361" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha" />
<feOffset dx="0.25" dy="-0.25" />
<feGaussianBlur stdDeviation="0.25" />
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1" />
<feColorMatrix type="matrix" values="0 0 0 0 0.52549 0 0 0 0 0.513726 0 0 0 0 0.541176 0 0 0 1 0" />
<feBlend mode="normal" in2="shape" result="effect1_innerShadow_18_18382" />
</filter>
<filter id="filter1_i_18_18382" x="20.6027" y="19.4521" width="7.70354" height="10.2228" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha" />
<feOffset dx="-0.2" dy="0.2" />
<feGaussianBlur stdDeviation="0.2" />
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1" />
<feColorMatrix type="matrix" values="0 0 0 0 0.690196 0 0 0 0 0.686275 0 0 0 0 0.698039 0 0 0 1 0" />
<feBlend mode="normal" in2="shape" result="effect1_innerShadow_18_18382" />
</filter>
<filter id="filter2_f_18_18382" x="4.82808" y="3.15132" width="22.3438" height="14.459" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.1" result="effect1_foregroundBlur_18_18382" />
</filter>
<filter id="filter3_f_18_18382" x="26.5693" y="15.6633" width="2.31326" height="3.80947" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix" />
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
<feGaussianBlur stdDeviation="0.15" result="effect1_foregroundBlur_18_18382" />
</filter>
<radialGradient id="paint0_radial_18_18382" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(23.6188 4.48184) rotate(114.311) scale(16.9353 23.4245)">
<stop stop-color="#DADADB" />
<stop offset="1" stop-color="#B9B5BD" />
</radialGradient>
<radialGradient id="paint1_radial_18_18382" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(3.12305 10.8068) rotate(19.2062) scale(9.61161 32.0782)">
<stop offset="0.095751" stop-color="#969499" />
<stop offset="1" stop-color="#969499" stop-opacity="0" />
</radialGradient>
<radialGradient id="paint2_radial_18_18382" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(5.95906 20.563) rotate(-117.087) scale(3.0608 1.02371)">
<stop offset="0.256074" stop-color="#C6C4C9" />
<stop offset="1" stop-color="#C6C4C9" stop-opacity="0" />
</radialGradient>
<radialGradient id="paint3_radial_18_18382" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(5.83425 20.7294) rotate(-117.35) scale(2.03754 0.586159)">
<stop offset="0.166979" stop-color="#8D8D8F" />
<stop offset="1" stop-color="#8D8D8F" stop-opacity="0" />
</radialGradient>
<radialGradient id="paint4_radial_18_18382" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(22.3511 8.14414) rotate(-54.3815) scale(3.429 6.67803)">
<stop offset="0.56676" stop-color="#EBEBED" />
<stop offset="1" stop-color="#EBEBED" stop-opacity="0" />
</radialGradient>
<linearGradient id="paint5_linear_18_18382" x1="27.8844" y1="21.4159" x2="27.094" y2="18.67" gradientUnits="userSpaceOnUse">
<stop offset="0.326903" stop-color="#B1B0B4" />
<stop offset="1" stop-color="#B1B0B4" stop-opacity="0" />
</linearGradient>
<linearGradient id="paint6_linear_18_18382" x1="5.06449" y1="21.4326" x2="7.42872" y2="29.4749" gradientUnits="userSpaceOnUse">
<stop stop-color="#A6A0AA" />
<stop offset="1" stop-color="#9D94A2" />
</linearGradient>
<linearGradient id="paint7_linear_18_18382" x1="8.15118" y1="29.4749" x2="7.42872" y2="26.9552" gradientUnits="userSpaceOnUse">
<stop stop-color="#998E9E" />
<stop offset="1" stop-color="#998E9E" stop-opacity="0" />
</linearGradient>
<radialGradient id="paint8_radial_18_18382" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(3.677 22.0576) rotate(75.1074) scale(8.92479 1.06286)">
<stop stop-color="#817F83" />
<stop offset="1" stop-color="#817F83" stop-opacity="0" />
</radialGradient>
<linearGradient id="paint9_linear_18_18382" x1="4.53324" y1="19.9951" x2="5.87699" y2="23.1513" gradientUnits="userSpaceOnUse">
<stop stop-color="#7F7E80" />
<stop offset="1" stop-color="#7F7E80" stop-opacity="0" />
</linearGradient>
<linearGradient id="paint10_linear_18_18382" x1="8.55733" y1="24.1461" x2="7.00043" y2="24.6537" gradientUnits="userSpaceOnUse">
<stop offset="0.181858" stop-color="#807D84" />
<stop offset="1" stop-color="#807D84" stop-opacity="0" />
</linearGradient>
<linearGradient id="paint11_linear_18_18382" x1="27.1583" y1="20.8076" x2="24.5546" y2="29.4749" gradientUnits="userSpaceOnUse">
<stop stop-color="#BAB9BC" />
<stop offset="1" stop-color="#9F96A4" />
</linearGradient>
<linearGradient id="paint12_linear_18_18382" x1="23.252" y1="29.4749" x2="25.1583" y2="26.4013" gradientUnits="userSpaceOnUse">
<stop stop-color="#9A8F9F" />
<stop offset="1" stop-color="#9A8F9F" stop-opacity="0" />
</linearGradient>
<radialGradient id="paint13_radial_18_18382" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(27.6739 22.7295) rotate(106.376) scale(3.71313 0.681309)">
<stop stop-color="#C7C6C8" />
<stop offset="1" stop-color="#BAB8BC" stop-opacity="0" />
</radialGradient>
<radialGradient id="paint14_radial_18_18382" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(23.6895 22.6826) rotate(19.7468) scale(3.88469 2.56034)">
<stop stop-color="#C1BFC3" />
<stop offset="1" stop-color="#C1BFC3" stop-opacity="0" />
</radialGradient>
<linearGradient id="paint15_linear_18_18382" x1="7.97071" y1="18.4013" x2="11.7207" y2="30.9013" gradientUnits="userSpaceOnUse">
<stop stop-color="#B7B6B8" />
<stop offset="0.321101" stop-color="#D9D5DD" />
<stop offset="0.681651" stop-color="#D9D5DD" />
<stop offset="1" stop-color="#CDC1D4" />
</linearGradient>
<radialGradient id="paint16_radial_18_18382" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(6.18946 18.8701) rotate(72.755) scale(16.655 1.37978)">
<stop stop-color="#A4A2A6" />
<stop offset="1" stop-color="#C5BACF" stop-opacity="0" />
</radialGradient>
<radialGradient id="paint17_radial_18_18382" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(11.5332 22.6201) rotate(162.646) scale(1.04769 9.65758)">
<stop offset="0.261566" stop-color="#F6F4F7" />
<stop offset="1" stop-color="#E6E1EA" stop-opacity="0" />
</radialGradient>
<linearGradient id="paint18_linear_18_18382" x1="12.1426" y1="24.1201" x2="11.6113" y2="24.2607" gradientUnits="userSpaceOnUse">
<stop offset="0.133145" stop-color="#DBD9DE" />
<stop offset="1" stop-color="#DBD9DE" stop-opacity="0" />
</linearGradient>
<linearGradient id="paint19_linear_18_18382" x1="24.377" y1="18.3076" x2="20.0958" y2="31.1201" gradientUnits="userSpaceOnUse">
<stop stop-color="#DAD9DB" />
<stop offset="0.399322" stop-color="#DEDDE1" />
<stop offset="0.961979" stop-color="#C7B9CF" />
</linearGradient>
<linearGradient id="paint20_linear_18_18382" x1="23.9395" y1="18.1826" x2="23.2833" y2="20.2763" gradientUnits="userSpaceOnUse">
<stop offset="0.10868" stop-color="#C9C9CA" />
<stop offset="1" stop-color="#C9C9CA" stop-opacity="0" />
</linearGradient>
<radialGradient id="paint21_radial_18_18382" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(20.377 21.6513) rotate(15.7807) scale(1.4938 15.9576)">
<stop offset="0.205252" stop-color="#A4A3A6" />
<stop offset="1" stop-color="#CECAD3" stop-opacity="0" />
</radialGradient>
<radialGradient id="paint22_radial_18_18382" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(24.2364 21.7763) rotate(105.977) scale(3.91692 0.624606)">
<stop offset="0.151268" stop-color="#F5F3F7" />
<stop offset="1" stop-color="#E8E4EC" stop-opacity="0" />
</radialGradient>
<linearGradient id="paint23_linear_18_18382" x1="6.09582" y1="16.9951" x2="17.4083" y2="2.49512" gradientUnits="userSpaceOnUse">
<stop stop-color="#CDCBCF" />
<stop offset="1" stop-color="#BEB5C7" />
</linearGradient>
<radialGradient id="paint24_radial_18_18382" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(22.6271 8.58887) rotate(-88.0363) scale(5.47196 16.8348)">
<stop offset="0.172043" stop-color="#AFA7B6" />
<stop offset="1" stop-color="#AFA7B6" stop-opacity="0" />
</radialGradient>
<linearGradient id="paint25_linear_18_18382" x1="26.3146" y1="17.7549" x2="22.8771" y2="9.33887" gradientUnits="userSpaceOnUse">
<stop stop-color="#9B99A0" />
<stop offset="1" stop-color="#9B99A0" stop-opacity="0" />
</linearGradient>
<radialGradient id="paint26_radial_18_18382" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(6.28332 18.5264) rotate(-88.9949) scale(3.56305 5.42238)">
<stop stop-color="#A5A2A9" />
<stop offset="1" stop-color="#A5A2A9" stop-opacity="0" />
</radialGradient>
<linearGradient id="paint27_linear_18_18382" x1="10.0646" y1="7.08887" x2="25.1271" y2="7.15137" gradientUnits="userSpaceOnUse">
<stop stop-color="#CFC9D4" />
<stop offset="1" stop-color="#DFDDE3" />
</linearGradient>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 815 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1014 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 390 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 569 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 617 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 854 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

View File

@ -1 +1,75 @@
{"name":"cobalt","short_name":"cobalt","start_url":"/","icons":[{"src":"/icons/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/icons/android-chrome-512x512.png","sizes":"512x512","type":"image/png"},{"src":"/icons/generic.png","sizes":"512x512","type":"image/png","purpose":"any"},{"src":"/icons/maskable/x48.png","sizes":"48x48","type":"image/png","purpose":"maskable"},{"src":"/icons/maskable/x72.png","sizes":"72x72","type":"image/png","purpose":"maskable"},{"src":"/icons/maskable/x96.png","sizes":"96x96","type":"image/png","purpose":"maskable"},{"src":"/icons/maskable/x128.png","sizes":"128x128","type":"image/png","purpose":"maskable"},{"src":"/icons/maskable/x192.png","sizes":"192x192","type":"image/png","purpose":"maskable"},{"src":"/icons/maskable/x384.png","sizes":"384x384","type":"image/png","purpose":"maskable"},{"src":"/icons/maskable/x512.png","sizes":"512x512","type":"image/png","purpose":"maskable"},{"src":"/icons/maskable/x1280.png","sizes":"1280x1280","type":"image/png","purpose":"maskable"}],"theme_color":"#000000","background_color":"#000000","display":"standalone"}
{
"name": "cobalt",
"short_name": "cobalt",
"start_url": "/",
"icons": [
{
"src": "/icons/android-chrome-192x192.png",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "/icons/android-chrome-512x512.png",
"sizes": "512x512",
"type": "image/png"
},
{
"src": "/icons/generic.png",
"sizes": "512x512",
"type": "image/png",
"purpose": "any"
},
{
"src": "/icons/maskable/48.png",
"sizes": "48x48",
"type": "image/png",
"purpose": "maskable"
},
{
"src": "/icons/maskable/72.png",
"sizes": "72x72",
"type": "image/png",
"purpose": "maskable"
},
{
"src": "/icons/maskable/96.png",
"sizes": "96x96",
"type": "image/png",
"purpose": "maskable"
},
{
"src": "/icons/maskable/128.png",
"sizes": "128x128",
"type": "image/png",
"purpose": "maskable"
},
{
"src": "/icons/maskable/192.png",
"sizes": "192x192",
"type": "image/png",
"purpose": "maskable"
},
{
"src": "/icons/maskable/384.png",
"sizes": "384x384",
"type": "image/png",
"purpose": "maskable"
},
{
"src": "/icons/maskable/512.png",
"sizes": "512x512",
"type": "image/png",
"purpose": "maskable"
}
],
"share_target": {
"action": "/",
"params": {
"text": "u",
"url": "u"
}
},
"theme_color": "#000000",
"background_color": "#000000",
"display": "standalone"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

View File

@ -8,7 +8,7 @@
"LinkInput": "paste the link here",
"AboutSummary": "cobalt is your go-to place for downloads from social and media platforms. zero ads, trackers, or other creepy bullshit. simply paste a share link and you're ready to rock!",
"EmbedBriefDescription": "save what you love. no ads, trackers, or other creepy bullshit.",
"MadeWithLove": "made with &lt;3 by wukko",
"MadeWithLove": "made with &lt;3 by imput",
"AccessibilityInputArea": "link input area",
"AccessibilityOpenAbout": "open about popup",
"AccessibilityDownloadButton": "download button",
@ -90,7 +90,6 @@
"DonateSub": "help it stay online",
"DonateExplanation": "cobalt doesn't shove ads in your face and doesn't sell your personal data, meaning that it's <span class=\"text-backdrop\">completely free to use</span> for everyone. but development and maintenance of a media-heavy service used by over 750k people is quite costly. both in terms of time and money.\n\nif cobalt helped you in the past and you want to keep it growing and evolving, you can return the favor by making a donation!\n\nyour donation will help all cobalt users: educators, students, content creators, artists, musicians, and many, many more!\n\nin past, donations have let cobalt:\n*; increase stability and uptime to nearly 100%.\n*; speed up ALL downloads, especially heavier ones.\n*; open the api for free public use.\n*; withstand several huge user influxes with 0 downtime.\n*; add resource-intensive features (such as gif conversion).\n*; continue improving our infrastructure.\n*; keep developers happy.\n\n<span class=\"text-backdrop\">every cent matters and is extremely appreciated</span>, you can truly make a difference!\n\nif you can't donate, share cobalt with a friend! we don't get ads anywhere, so cobalt is spread by word of mouth.\nsharing is the easiest way to help achieve the goal of better internet for everyone.",
"DonateVia": "donate via",
"DonateHireMe": "...or you can <a class=\"text-backdrop link\" href=\"{s}\" target=\"_blank\">hire me</a> :)",
"SettingsVideoMute": "mute audio",
"SettingsVideoMuteExplanation": "removes audio from video downloads when possible.",
"ErrorSoundCloudNoClientId": "i couldn't get the temporary token that's required to download songs from soundcloud. try again, but if issue persists, {ContactLink}.",
@ -101,19 +100,13 @@
"FollowSupport": "keep in touch with cobalt for news, support, and more:",
"SourceCode": "explore source code, report issues, star or fork the repo:",
"PrivacyPolicy": "cobalt's privacy policy is simple: no data about you is ever collected or stored. zero, zilch, nada, nothing.\nwhat you download is solely your business, not mine or anyone else's.\n\nif your download requires rendering, then data about requested content is encrypted and temporarily stored in server's RAM. it's necessary for this feature to function.\n\nencrypted data is stored for <span class=\"text-backdrop\">90 seconds</span> and then permanently removed.\n\nstored data is only possible to decrypt with unique encryption keys from your download link. furthermore, the official cobalt codebase doesn't provide a way to read temporarily stored data outside of processing functions.\n\nyou can check cobalt's <a class=\"text-backdrop link\" href=\"{repo}\" target=\"_blank\">source code</a> yourself and see that everything is as stated.",
"ErrorYTUnavailable": "this youtube video is unavailable, it could be region or age restricted. try another one!",
"ErrorYTTryOtherCodec": "i couldn't find anything to download with your settings. try another codec or quality!\n\nsometimes youtube api acts unexpectedly. try again or try another settings.",
"ErrorYTUnavailable": "this youtube video is unavailable. it could be age or region restricted. try another one!",
"ErrorYTTryOtherCodec": "i couldn't find anything to download with your settings. try another codec or quality in settings!",
"SettingsCodecSubtitle": "youtube codec",
"SettingsCodecDescription": "h264: generally better player support, but quality tops out at 1080p.\nav1: poor player support, but supports 8k & HDR.\nvp9: usually highest bitrate, preserves most detail. supports 4k & HDR.\n\npick h264 if you want best editor/player/social media compatibility.",
"SettingsCodecDescription": "h264: best support across apps/platforms, average detail level. max quality is 1080p.\nav1: best quality, small file size, most detail. supports 8k & HDR.\nvp9: same quality as av1, but file is x2 bigger. supports 4k & HDR.\n\npick h264 if you want best compatibility.\npick av1 if you want best quality and efficiency.",
"SettingsAudioDub": "youtube audio track",
"SettingsAudioDubDescription": "defines which audio track will be used. if dubbed track isn't available, original video language is used instead.\n\noriginal: original video language is used.\nauto: default browser (and cobalt) language is used.",
"SettingsDubDefault": "original",
"SettingsDubAuto": "auto",
"SettingsVimeoPrefer": "vimeo downloads type",
"SettingsVimeoPreferDescription": "progressive: direct file link to vimeo's cdn. max quality is 1080p.\ndash: video and audio are merged by cobalt into one file. max quality is 4k.\n\npick \"progressive\" if you want best editor/player/social media compatibility. if progressive download isn't available, dash is used instead.",
"ShareURL": "share",
"ErrorTweetUnavailable": "couldn't find anything about this tweet. this could be because its visibility is limited. try another one!",
"ErrorTwitterRIP": "twitter has restricted access to any content to unauthenticated users. while there's a way to get regular tweets, spaces are, unfortunately, impossible to get at this time. i am looking into possible solutions.",
"PopupCloseDone": "done",
"Accessibility": "accessibility",
"SettingsReduceTransparency": "reduce transparency",
@ -154,10 +147,14 @@
"SettingsTwitterGifDescription": "converting looping videos to .gif reduces quality and majorly increases file size. if you want best efficiency, keep this setting off.",
"ErrorTweetProtected": "this tweet is from a private account, so i can't see it. try another one!",
"ErrorTweetNSFW": "this tweet contains sensitive content, so i can't see it. try another one!",
"UpdateEncryption": "encryption and new services",
"PrivateAnalytics": "private analytics",
"SettingsDisableAnalytics": "opt out of private analytics",
"SettingsAnalyticsExplanation": "enable if you don't want to be included in anonymous traffic stats. read more about this in about > privacy policy (tl;dr: nothing about you is ever stored or tracked, no cookies are used).",
"AnalyticsDescription": "cobalt uses a self-hosted plausible instance to get an approximate number of how many people use it.\n\nplausible is fully compliant with GDPR, CCPA and PECR, doesn't use cookies, and never stores any identifiable info, not even your ip address.\n\nall data is aggregated and never personalized. nothing about what you download is ever saved anywhere. it's used just for anonymous traffic stats, nothing more.\n\nplausible is fully open source, just like cobalt, and if you want to learn more about it, you can do so <a class=\"text-backdrop link\" href=\"https://plausible.io\" target=\"_blank\">here</a>. if you wish to opt out of traffic stats, you can do it in settings > other."
"AnalyticsDescription": "cobalt uses a self-hosted plausible instance to get an approximate number of how many people use it.\n\nplausible is fully compliant with GDPR, CCPA and PECR, doesn't use cookies, and never stores any identifiable info, not even your ip address.\n\nall data is aggregated and never personalized. nothing about what you download is ever saved anywhere. it's used just for anonymous traffic stats, nothing more.\n\nplausible is fully open source, just like cobalt, and if you want to learn more about it, you can do so <a class=\"text-backdrop link\" href=\"https://plausible.io\" target=\"_blank\">here</a>. if you wish to opt out of traffic stats, you can do it in settings > other.",
"SettingsTikTokH265": "prefer h265",
"SettingsTikTokH265Description": "download 1080p videos from tiktok in h265/hevc format when available.",
"SettingsYoutubeDub": "use browser language",
"SettingsYoutubeDubDescription": "uses your browser's default language for youtube dubbed audio tracks. works even if cobalt ui isn't translated to your language.",
"UpdateIstream": "better service support and ux"
}
}

View File

@ -45,7 +45,7 @@
"AccessibilityEnableDownloadPopup": "спрашивать, что делать с загрузками",
"SettingsQualityDescription": "если выбранное качество недоступно, то выбирается ближайшее к нему.",
"NoScriptMessage": "кобальт использует javascript для обработки ссылок и интерактивного интерфейса. ты должен разрешить использование javascript, чтобы пользоваться сайтом. тут нет никаких зловредных скриптов, обещаю.",
"DownloadPopupDescriptionIOS": "как сохранить в фото:\n1. добавь этот сценарий siri: <a class=\"text-backdrop link\" href=\"{saveToGalleryShortcut}\" target=\"_blank\">save to photos</a>.\n2. нажми \"поделиться\" выше этого текста.\n3. выбери \"save to photos\" в открывшемся окне.\n\nкак сохранить в файлы:\n1. добавь этот сценарий siri: <a class=\"text-backdrop link\" href=\"{saveToGalleryShortcut}\" target=\"_blank\">save to files</a>.\n2. нажми \"поделиться\" выше этого текста.\n3. выбери \"save to files\" в открывшемся окне.\n4. выбери папку для сохранения файла и нажми \"открыть\".\n\nоба сценария работают только вместе с веб-приложением кобальта.",
"DownloadPopupDescriptionIOS": "как сохранить в фото:\n1. добавь этот сценарий siri: <a class=\"text-backdrop link\" href=\"{saveToGalleryShortcut}\" target=\"_blank\">save to photos</a>.\n2. нажми \"поделиться\" выше этого текста.\n3. выбери \"save to photos\" в открывшемся окне.\n\nкак сохранить в файлы:\n1. добавь этот сценарий siri: <a class=\"text-backdrop link\" href=\"{saveToFilesShortcut}\" target=\"_blank\">save to files</a>.\n2. нажми \"поделиться\" выше этого текста.\n3. выбери \"save to files\" в открывшемся окне.\n4. выбери папку для сохранения файла и нажми \"открыть\".\n\nоба сценария работают только вместе с веб-приложением кобальта.",
"DownloadPopupDescription": "кнопка скачивания открывает новое окно с файлом. ты можешь отключить выбор метода скачивания файла в настройках.",
"ClickToCopy": "нажми, чтобы скопировать",
"Download": "скачать",
@ -91,7 +91,6 @@
"DonateSub": "ты можешь помочь!",
"DonateExplanation": "кобальт не пихает рекламу тебе в лицо и не продаёт твои личные данные, а значит работает <span class=\"text-backdrop\">совершенно бесплатно</span> для всех. но разработка и поддержка медиа сервиса, которым пользуются более 750 тысяч людей, обходится довольно затратно.\n\nесли кобальт тебе помог и ты хочешь, чтобы он продолжал расти и развиваться, то это можно сделать через донаты!\n\nтвой донат поможет всем, кто пользуется кобальтом: преподавателям, студентам, музыкантам, художникам, контент-мейкерам и многим-многим другим!\n\nв прошлом донаты помогли кобальту:\n*; повысить стабильность и аптайм почти до 100%.\n*; ускорить ВСЕ загрузки, особенно наиболее тяжёлые.\n*; открыть api для бесплатного использования.\n*; выдержать несколько огромных наплывов пользователей без перебоев.\n*; добавить ресурсоемкие фичи (например конвертацию в gif).\n*; продолжать улучшать нашу инфраструктуру.\n*; радовать разработчиков.\n\n<span class=\"text-backdrop\">каждый донат невероятно ценится</span> и помогает кобальту развиваться!\n\nесли ты не можешь отправить донат, то поделись кобальтом с другом! мы нигде не размещаем рекламу, поэтому кобальт распространяется из уст в уста.\nподелиться - самый простой способ помочь достичь цели лучшего интернета для всех.",
"DonateVia": "открыть",
"DonateHireMe": "...или же ты можешь <a class=\"text-backdrop link\" href=\"{s}\" target=\"_blank\">пригласить меня на работу</a> :)",
"SettingsVideoMute": "убрать аудио",
"SettingsVideoMuteExplanation": "убирает звук при загрузке видео, но только когда это возможно.",
"ErrorSoundCloudNoClientId": "мне не удалось достать временный токен, который необходим для скачивания аудио из soundcloud. попробуй ещё раз, но если так и не получится, {ContactLink}.",
@ -102,19 +101,13 @@
"FollowSupport": "подписывайся на соц.сети кобальта для новостей и поддержки:",
"SourceCode": "шарься в исходнике, пиши о проблемах, или же форкай репозиторий:",
"PrivacyPolicy": "политика конфиденциальности кобальта довольно проста: никакие данные о тебе никогда не собираются и не хранятся. нуль, ноль, нада, ничего.\nто, что ты скачиваешь, - твоё личное дело, а не чьё-либо ещё.\n\nесли твоей загрузке требуется рендер, то зашифрованные данные о ней временно хранятся в ОЗУ сервера. это необходимо для работы данной функции.\n\nзашифрованные данные хранятся в течение <span class=\"text-backdrop\">90 секунд</span> и затем безвозвратно удаляются.\n\ncохранённые данные можно расшифровать только с помощью уникальных ключей шифрования из твоей ссылки на скачивание. кроме того, официальная кодовая база кобальта не предусматривает возможности чтения эти данные вне функций обработки.\n\nты всегда можешь посмотреть <a class=\"text-backdrop link\" href=\"{repo}\" target=\"_blank\">исходный код кобальта</a> и убедиться, что всё так, как заявлено.",
"ErrorYTUnavailable": "это видео недоступно, возможно оно ограничено по региону или доступу. попробуй другое!",
"ErrorYTTryOtherCodec": "я не нашёл того, что мог бы скачать с твоими настройками. попробуй другой кодек или качество!",
"SettingsCodecSubtitle": "кодек для видео с youtube",
"SettingsCodecDescription": "h264: обширная поддержка плеерами, но макс. качество всего лишь 1080p.\nav1: слабая поддержка плеерами, но поддерживает 8k и HDR.\nvp9: обычно наиболее высокий битрейт, лучше сохраняется качество видео. поддерживает 4k и HDR.\n\nвыбирай h264, если тебе нужна наилучшая совместимость с плеерами/редакторами/соцсетями.",
"SettingsAudioDub": "звуковая дорожка для видео с youtube",
"SettingsAudioDubDescription": "определяет, какая звуковая дорожка используется при скачивании видео. если дублированная дорожка недоступна, то вместо неё используется оригинальная.\n\nоригинал: используется оригинальная дорожка.\nавто: используется язык браузера и интерфейса кобальта.",
"SettingsDubDefault": "оригинал",
"SettingsDubAuto": "авто",
"SettingsVimeoPrefer": "тип загрузок с vimeo",
"SettingsVimeoPreferDescription": "progressive: прямая ссылка на файл с сервера vimeo. максимальное качество: 1080p.\ndash: кобальт совмещает видео и аудио в один файл. максимальное качество: 4k.\n\nвыбирай \"progressive\", если тебе нужна наилучшая совместимость с плеерами/редакторами/соцсетями. если \"progressive\" файл недоступен, кобальт скачает \"dash\".",
"ErrorYTUnavailable": "это видео недоступно. возможно оно ограничено по доступу или региону. попробуй другое!",
"ErrorYTTryOtherCodec": "я не нашёл того, что мог бы скачать с твоими настройками. попробуй другой кодек или качество в настройках!",
"SettingsCodecSubtitle": "кодек для youtube видео",
"SettingsCodecDescription": "h264: лучшая совместимость, средний уровень детализированности. максимальное качество - 1080p.\nav1: лучшее качество, маленький размер файла, наибольшее количество деталей. поддерживает 8k и HDR.\nvp9: такая же детализированность, как и у av1, но файл в 2 раза больше. поддерживает 4k и HDR.\n\nвыбирай h264, если тебе нужна наилучшая совместимость.\nвыбирай av1, если ты хочешь лучшее качество и эффективность.",
"SettingsAudioDub": "звуковая дорожка для youtube видео",
"ShareURL": "поделиться",
"ErrorTweetUnavailable": "не смог найти что-либо об этом твите. возможно его видимость ограничена. попробуй другой!",
"ErrorTwitterRIP": "твиттер ограничил доступ к любому контенту на сайте для пользователей без аккаунтов. я нашёл лазейку, чтобы доставать обычные твиты, а для spaces, к сожалению, нет. я ищу возможные варианты выхода из ситуации.",
"PopupCloseDone": "готово",
"Accessibility": "общедоступность",
"SettingsReduceTransparency": "уменьшить прозрачность",
@ -156,10 +149,14 @@
"SettingsTwitterGifDescription": "конвертирование зацикленного видео в .gif снижает качество и значительно увеличивает размер файла. если важна максимальная эффективность, то не используй эту функцию.",
"ErrorTweetProtected": "этот твит из закрытого аккаунта, поэтому я не могу его увидеть. попробуй другой!",
"ErrorTweetNSFW": "этот твит содержит деликатный контент, поэтому я не могу его увидеть. попробуй другой!",
"UpdateEncryption": "шифрование и новые сервисы",
"PrivateAnalytics": "приватная аналитика",
"SettingsDisableAnalytics": "отключить приватную аналитику",
"SettingsAnalyticsExplanation": "включи, если не хочешь быть частью анонимной статистики трафика. подробнее об этом можно прочитать в политике конфиденциальности (tl;dr: ничего о тебе или твоих действиях не хранится и не отслеживается, даже куки нет).",
"AnalyticsDescription": "кобальт использует собственный инстанс plausible чтобы иметь приблизительное представление о том, сколько людей им пользуются.\n\nplausible полностью соответствует GDPR, CCPA и PECR, не использует куки и никогда не хранит никакой идентифицируемой информации, даже ip-адрес.\n\nвсе данные агрегируются и никогда не персонализируются. ничего о том, что ты скачиваешь, никогда не сохраняется. это просто анонимная статистика трафика, ничего больше.\n\nplausible также как и кобальт имеет открытый исходный код, и, если ты хочешь узнать о нём больше, то это можно сделать <a class=\"text-backdrop link\" href=\"https://plausible.io\" target=\"_blank\">здесь</a>. а если же ты хочешь исключить себя из статистики, то это можно сделать в настройках > другое."
"AnalyticsDescription": "кобальт использует собственный инстанс plausible чтобы иметь приблизительное представление о том, сколько людей им пользуются.\n\nplausible полностью соответствует GDPR, CCPA и PECR, не использует куки и никогда не хранит никакой идентифицируемой информации, даже ip-адрес.\n\nвсе данные агрегируются и никогда не персонализируются. ничего о том, что ты скачиваешь, никогда не сохраняется. это просто анонимная статистика трафика, ничего больше.\n\nplausible также как и кобальт имеет открытый исходный код, и, если ты хочешь узнать о нём больше, то это можно сделать <a class=\"text-backdrop link\" href=\"https://plausible.io\" target=\"_blank\">здесь</a>. а если же ты хочешь исключить себя из статистики, то это можно сделать в настройках > другое.",
"SettingsTikTokH265": "предпочитать h265",
"SettingsTikTokH265Description": "скачивает видео с tiktok в 1080p и h265/hevc, когда это возможно.",
"SettingsYoutubeDub": "использовать язык браузера",
"SettingsYoutubeDubDescription": "использует главный язык браузера для аудиодорожек на youtube. работает даже если кобальт не переведён в твой язык.",
"UpdateIstream": "быстрые загрузки и приятный интерфейс"
}
}

View File

@ -8,7 +8,7 @@ let loc = {}
let languages = [];
export async function loadLoc() {
const files = await fs.promises.readdir(locPath).catch((e) => { return [] });
const files = await fs.promises.readdir(locPath).catch(() => []);
files.forEach(file => {
loc[file.split('.')[0]] = loadJSON(`${locPath}/${file}`);
languages.push(file.split('.')[0])

View File

@ -13,9 +13,6 @@ export async function buildFront(commitHash, branch) {
// build html
if (!fs.existsSync('./build/')){
fs.mkdirSync('./build/');
fs.mkdirSync('./build/ios/');
fs.mkdirSync('./build/pc/');
fs.mkdirSync('./build/mob/');
}
// get rid of old build path
if (fs.existsSync('./min')) {
@ -26,16 +23,9 @@ export async function buildFront(commitHash, branch) {
let params = {
"hash": commitHash,
"lang": i,
"useragent": "pc",
"branch": branch
}
fs.writeFileSync(`./build/pc/${i}.html`, cleanHTML(page(params)));
params["useragent"] = "iphone os";
fs.writeFileSync(`./build/ios/${i}.html`, cleanHTML(page(params)));
params["useragent"] = "android";
fs.writeFileSync(`./build/mob/${i}.html`, cleanHTML(page(params)));
fs.writeFileSync(`./build/${i}.html`, cleanHTML(page(params)));
}
// build js & css
await esbuild.build({
@ -45,7 +35,7 @@ export async function buildFront(commitHash, branch) {
loader: { '.js': 'js', '.css': 'css', },
charset: 'utf8'
})
} catch (e) {
} catch {
return;
}
}

View File

@ -1,5 +1,17 @@
{
"current": {
"version": "7.13",
"date": "May 5, 2024",
"title": "better ux, improvements for youtube, twitter, tiktok, instagram, and more!",
"banner": {
"file": "meowthbusinessman.webp",
"alt": "photo of a businessman holding hands together (merkel-raute pose) with meowth plush head.",
"width": 1440,
"height": 960
},
"content": "long time no see! well, actually, you've been using the latest version for some time now. we've moved to a rolling release scheme, allowing for speedy update rollouts :)\n\nsince 7.11, there has been a ton of changes. here are the most notable of them:\n*; youtube downloads are now faster and more reliable than ever.\n*; all posts from twitter are now downloadable, including sensitive ones.\n*; you now can download tiktok videos in 1080p h265! just enable h265 support in settings > video.\n*; added support for sharing links directly to the cobalt web app on android.\n*; added 240p and 144p quality options to the quality picker in settings (for some reason, many of you wanted this).\n*; pasting a link with additional text around it will now work; cobalt will extract the link for you (works only via the paste button).\n*; added anonymous traffic analytics by plausible. we're using a selfhosted instance and don't collect any identifiable information about you. you can learn more in about > privacy policy. you can also opt out of anonymous analytics in settings > other.\n\nservice support improvements:\n*; implemented internal streams functionality, allowing for more fine-grained file streaming and therefore proper youtube support.\n*; added fallback to m4a if opus isn't available for youtube.\n*; added a total of 7 ways to get instagram post info, including mobile api, embed, and graphql api. absolute torture.\n*; added support for reddit user posts.\n*; updated the way tiktok downloads are handled for better reliability and 1080p support.\n*; added tiktok author's username to filename.\n*; added support for rutube shorts and yappy videos.\n*; added support for m.soundcloud.com links.\n*; added support for new post and reel links from instagram.\n*; added support for photo twitter links, only used for gifs.\n*; added support for m.bilibili.com links.\n*; added support for new type of vimeo links.\n*; added support for ddinstagram.com links.\n*; updated youtube codec info in settings to display the fact that av1 is a better choice now.\n*; updated best audio picking for tiktok and soundcloud.\n*; changed the youtube client to web, since android client no longer works.\n*; removed the vimeo download type switcher, as it should've always been automatic instead.\n*; removed an ability to enable the tiktok watermark, as it no longer includes the author's username.\n\nui & ux improvements:\n*; youtube audio dub switcher is now a toggle with a much easier to understand description.\n*; meowbalt now sticks out on the left side of download popup on desktop.\n*; updated \"made with love\" text to include the research & dev team behind cobalt, imput.\n*; fixed grammar of russian localization.\n*; rounded corners are now correctly rendered across all browsers.\n*; various minor improvements, including smaller button padding.\n*; removed the notification (red dot) functionality as the most recent changelog is already always on screen.\n*; removed settings migration from the old domain.\n\nother changes:\n*; various docs updates in github repo, making sure they're functional across branches and forks.\n*; major codebase cleanup.\n\nthank you for using cobalt, and thank you for being one of our 900k friends! i hope you like this update as much as we liked making it.\n\nwe're committed to keeping cobalt the best way to save what you love without ads or invasion of your privacy. there's a ton of cool stuff to come soon; stay tuned and have an amazing rest of your day <3\n\nif you want to help our goal of a better internet for everyone, just share cobalt with a friend!\n\n(original photo of a man in a suit by benzoix on freepik)"
},
"history": [{
"version": "7.11",
"date": "March 6, 2024",
"title": "cache encryption, meowbalt, dailymotion, bilibili, and much more!",
@ -10,8 +22,7 @@
"height": 640
},
"content": "cobalt may not have as many groceries as 7-eleven, but it sure does have lots of big changes in this update!\n\n*; all cached stream info is now encrypted and can only be decrypted with a link you get from cobalt.\n*; new popup style featuring meowbalt, cobalt's speedy mascot. you will see him more often from now on!\n*; added support for dailymotion (including short links).\n*; added support for bilibili.tv, fixed support for bilibili.com, and added support for all related short links.\n*; added support for unlisted vimeo links.\n*; added support for tumblr audio and revamped the entire module.\n*; added support for embed ok.ru links.\n\nwe also updated the privacy policy to reflect the addition of data encryption, go check it out.\n\nfor people with iphones:\n*; clearer ios saving tutorial.\n*; added \"save to files\" ios shortcut.\n*; updated save to photos shortcut.\n\nmake sure to save both shortcuts and read the updated tutorial!\n\nfor people who host a cobalt instance:\n*; updated all environment variables TO_BE_LIKE_THIS. time to update your configs! for now cobalt is backwards compatible with old variable names, but it won't last forever.\n*; added a list of all environment variables and their descriptions to <a class=\"text-backdrop link\" href=\"{repo}/blob/current/docs/run-an-instance.md#list-of-all-environment-variables\" target=\"_blank\">run-an-instance doc</a>.\n*; updated <a class=\"text-backdrop link\" href=\"{repo}/blob/current/docs/examples/cookies.example.json\" target=\"_blank\">cookie file example</a> with more services and improved examples.\n*; updated <a class=\"text-backdrop link\" href=\"{repo}/blob/current/docs/examples/docker-compose.example.yml\" target=\"_blank\">docker compose example</a> with better explanations and up-to-date env variable samples.\n*; updated some packages to get rid of all unnecessary messages in console.\n\nwant to host an instance? <a class=\"text-backdrop link\" href=\"{repo}/blob/current/docs/run-an-instance.md\" target=\"_blank\">learn how to do it here</a>.\n\nfrontend changes:\n*; removed migration popup.\n*; corners across ui are even more round now.\n*; bottom glass bkg in popups is no longer rounded on top right.\n*; small popup no longer stretches like gum, it's fixed in size on desktop.\n*; small popup animation no longer lags on mobile.\n*; better ui scaling across resolutions.\n*; updated donation text.\n\nthank you for using cobalt, all 750k of you. hope you like this update as much as we enjoyed making it :D"
},
"history": [{
}, {
"version": "7.9",
"date": "January 17, 2024",
"title": "twitter gifs, pinterest, ok.ru, and more!",

View File

@ -1,5 +1,6 @@
import UrlPattern from "url-pattern";
import { loadJSON } from "./sub/loadFromFs.js";
const config = loadJSON("./src/config.json");
const packageJson = loadJSON("./package.json");
const servicesConfigJson = loadJSON("./src/modules/processing/servicesConfig.json");
@ -12,6 +13,35 @@ Object.values(servicesConfigJson.config).forEach(service => {
)
})
const
apiURL = process.env.API_URL || '',
// WEB mode related environment variables
webEnvs = {
webPort: process.env.WEB_PORT || 9001,
webURL: process.env.WEB_URL || '',
showSponsors: !!process.env.SHOW_SPONSORS,
isBeta: !!process.env.IS_BETA,
plausibleHostname: process.env.PLAUSIBLE_HOSTNAME,
apiURL
},
// API mode related environment variables
apiEnvs = {
apiPort: process.env.API_PORT || 9000,
apiName: process.env.API_NAME || 'unknown',
listenAddress: process.env.API_LISTEN_ADDRESS,
corsWildcard: process.env.CORS_WILDCARD !== '0',
corsURL: process.env.CORS_URL,
cookiePath: process.env.COOKIE_PATH,
processingPriority: process.platform !== 'win32'
&& process.env.PROCESSING_PRIORITY
&& parseInt(process.env.PROCESSING_PRIORITY),
tiktokDeviceInfo: process.env.TIKTOK_DEVICE_INFO && JSON.parse(process.env.TIKTOK_DEVICE_INFO),
freebindCIDR: process.platform === 'linux' && process.env.FREEBIND_CIDR,
apiURL
}
export const
services = servicesConfigJson.config,
audioIgnore = servicesConfigJson.audioIgnore,
@ -19,11 +49,14 @@ export const
streamLifespan = config.streamLifespan,
maxVideoDuration = config.maxVideoDuration,
genericUserAgent = config.genericUserAgent,
repo = packageJson["bugs"]["url"].replace('/issues', ''),
repo = packageJson.bugs.url.replace('/issues', ''),
authorInfo = config.authorInfo,
donations = config.donations,
ffmpegArgs = config.ffmpegArgs,
supportedAudio = config.supportedAudio,
celebrations = config.celebrations,
links = config.links,
sponsors = config.sponsors
sponsors = config.sponsors,
mode = (apiURL && !webEnvs.webURL) ? 'API' :
(webEnvs.webURL && apiURL) ? 'WEB' : undefined,
env = mode === 'API' ? apiEnvs : webEnvs

View File

@ -61,6 +61,6 @@ export default function(emoji, size, disablePadding, fluent) {
if (!names[emoji]) emoji = "❓";
let filePath = `emoji/${names[emoji]}.svg`;
if (fluent) filePath = `emoji/3d/${names[emoji]}.svg`;
if (fluent) filePath = `emoji/3d/${names[emoji]}.png`;
return `<img class="emoji" draggable=false height="${size}" width="${size}" ${padding ? `style="${padding}" ` : ''}alt="${emoji}" src="${filePath}" loading="lazy">`
}

View File

@ -1,4 +1,4 @@
import { authorInfo, celebrations, sponsors } from "../config.js";
import { authorInfo, celebrations, sponsors, env } from "../config.js";
import emoji from "../emoji.js";
import { loadFile } from "../sub/loadFromFs.js";
@ -266,5 +266,5 @@ export function sponsoredList() {
}
export function betaTag() {
return process.env.IS_BETA ? '<span class="logo-sub">β</span>' : ''
return env.isBeta ? '<span class="logo-sub">β</span>' : ''
}

View File

@ -1,11 +1,6 @@
import { languageList } from "../../localization/manager.js";
export default function(lang, userAgent) {
export default function(lang) {
let language = languageList.includes(lang) ? lang : "en";
let ua = userAgent.toLowerCase();
let platform = (ua.match("android") || ua.match("iphone os")) ? "mob" : "pc";
if (platform === "mob" && ua.match("iphone os")) platform = "ios";
return `/build/${platform}/${language}.html`;
return `/build/${language}.html`;
}

View File

@ -1,10 +1,30 @@
import { checkbox, collapsibleList, explanation, footerButtons, multiPagePopup, popup, popupWithBottomButtons, sep, settingsCategory, switcher, socialLink, socialLinks, urgentNotice, keyboardShortcuts, webLoc, sponsoredList, betaTag, linkSVG } from "./elements.js";
import { services as s, authorInfo, version, repo, donations, supportedAudio, links } from "../config.js";
import { services as s, version, repo, donations, supportedAudio, links, env } from "../config.js";
import { getCommitInfo } from "../sub/currentCommit.js";
import loc from "../../localization/manager.js";
import emoji from "../emoji.js";
import changelogManager from "../changelog/changelogManager.js";
import {
checkbox,
collapsibleList,
explanation,
footerButtons,
multiPagePopup,
popup,
popupWithBottomButtons,
sep,
settingsCategory,
switcher,
socialLink,
socialLinks,
urgentNotice,
keyboardShortcuts,
webLoc,
sponsoredList,
betaTag,
linkSVG
} from "./elements.js";
let com = getCommitInfo();
let enabledServices = Object.keys(s).filter(p => s[p].enabled).sort().map((p) => {
@ -27,14 +47,9 @@ for (let i in donations["crypto"]) {
}
export default function(obj) {
const t = (str, replace) => { return loc(obj.lang, str, replace) };
let ua = obj.useragent.toLowerCase();
let isIOS = ua.match("iphone os");
let isMobile = ua.match("android") || ua.match("iphone os");
let platform = isMobile ? "m" : "d";
if (isMobile && isIOS) platform = "i";
const t = (str, replace) => {
return loc(obj.lang, str, replace)
}
audioFormats[0]["text"] = t('SettingsAudioFormatBest');
@ -44,17 +59,16 @@ export default function(obj) {
<html lang="${obj.lang}">
<head>
<meta charset="utf-8">
<meta name="viewport" content="viewport-fit=cover, width=device-width, height=device-height, initial-scale=1, maximum-scale=${isIOS ? `1` : `5`}">
<meta name="viewport" content="viewport-fit=cover, width=device-width, height=device-height, initial-scale=1, maximum-scale=1">
<title>${t("AppTitleCobalt")}</title>
<meta property="og:url" content="${process.env.WEB_URL}">
<meta property="og:url" content="${env.webURL}">
<meta property="og:title" content="${t("AppTitleCobalt")}">
<meta property="og:description" content="${t('EmbedBriefDescription')}">
<meta property="og:image" content="${process.env.WEB_URL}icons/generic.png">
<meta property="og:image" content="${env.webURL}icons/generic.png">
<meta name="title" content="${t("AppTitleCobalt")}">
<meta name="description" content="${t('AboutSummary')}">
<meta name="theme-color" content="#000000">
<meta name="twitter:card" content="summary">
<meta name="apple-mobile-web-app-capable" content="yes">
@ -71,19 +85,21 @@ export default function(obj) {
<link rel="stylesheet" href="fonts/notosansmono.css">
<link rel="stylesheet" href="cobalt.css">
<meta name="theme-color" content="#000000">
<link rel="preload" href="fonts/notosansmono.css" as="style">
<link rel="preload" href="assets/meowbalt/error.png" as="image">
<link rel="preload" href="assets/meowbalt/question.png" as="image">
${process.env.PLAUSIBLE_HOSTNAME ?
${env.plausibleHostname ?
`<script
defer
data-domain="${new URL(process.env.WEB_URL).hostname}"
src="https://${process.env.PLAUSIBLE_HOSTNAME}/js/script.js"
data-domain="${new URL(env.webURL).hostname}"
src="https://${env.plausibleHostname}/js/script.js"
></script>`
: ''}
</head>
<body id="cobalt-body" ${platform === "d" ? 'class="desktop"' : ''}>
<body id="cobalt-body">
<noscript>
<div style="margin: 2rem;">${t('NoScriptMessage')}</div>
</noscript>
@ -98,7 +114,7 @@ export default function(obj) {
header: {
aboveTitle: {
text: t('MadeWithLove'),
url: authorInfo.link
url: repo
},
closeAria: t('AccessibilityGoBack'),
title: `${emoji("🔮", 30)} ${t('TitlePopupAbout')}`
@ -169,7 +185,7 @@ export default function(obj) {
name: "privacy",
title: `${emoji("🔒")} ${t("CollapsePrivacy")}`,
body: t("PrivacyPolicy") + `${
process.env.PLAUSIBLE_HOSTNAME ? `<br><br>${t("AnalyticsDescription")}` : ''
env.plausibleHostname ? `<br><br>${t("AnalyticsDescription")}` : ''
}`
}, {
name: "legal",
@ -177,7 +193,7 @@ export default function(obj) {
body: t("FairUse")
}])
},
...(process.env.SHOW_SPONSORS ?
...(env.showSponsors ?
[{
text: t("SponsoredBy"),
classes: ["sponsored-by-text"],
@ -285,12 +301,6 @@ export default function(obj) {
}, {
text: donate.replace(/REPLACEME/g, t('ClickToCopy')),
classes: ["desc-padding"]
}, {
text: sep(),
raw: true
}, {
text: t('DonateHireMe', authorInfo.link),
classes: ["desc-padding"]
}]
})
}],
@ -300,7 +310,7 @@ export default function(obj) {
closeAria: t('AccessibilityGoBack'),
header: {
aboveTitle: {
text: `v.${version}-${obj.hash}${platform} (${obj.branch})`,
text: `v.${version}-${obj.hash} (${obj.branch})`,
url: `${repo}/commit/${obj.hash}`
},
title: `${emoji("⚙️", 30)} ${t('TitlePopupSettings')}`
@ -335,19 +345,15 @@ export default function(obj) {
}, {
action: "360",
text: "360p"
}, {
action: "240",
text: "240p"
}, {
action: "144",
text: "144p"
}]
})
})
+ settingsCategory({
name: "twitter",
title: "twitter",
body: checkbox([{
action: "twitterGif",
name: t("SettingsTwitterGif"),
padding: "no-margin"
}])
+ explanation(t('SettingsTwitterGifDescription'))
})
+ settingsCategory({
name: "codec",
title: t('SettingsCodecSubtitle'),
@ -367,19 +373,24 @@ export default function(obj) {
})
})
+ settingsCategory({
name: "vimeo",
title: t('SettingsVimeoPrefer'),
body: switcher({
name: "vimeoDash",
explanation: t('SettingsVimeoPreferDescription'),
items: [{
action: "false",
text: "progressive"
}, {
action: "true",
text: "dash"
}]
name: "twitter",
title: "twitter",
body: checkbox([{
action: "twitterGif",
name: t("SettingsTwitterGif"),
padding: "no-margin"
}])
+ explanation(t('SettingsTwitterGifDescription'))
})
+ settingsCategory({
name: "tiktok",
title: "tiktok",
body: checkbox([{
action: "tiktokH265",
name: t("SettingsTikTokH265"),
padding: "no-margin"
}])
+ explanation(t('SettingsTikTokH265Description'))
})
}, {
name: "audio",
@ -401,19 +412,14 @@ export default function(obj) {
+ explanation(t('SettingsVideoMuteExplanation'))
})
+ settingsCategory({
name: "dub",
name: "youtube-dub",
title: t("SettingsAudioDub"),
body: switcher({
name: "dubLang",
explanation: t('SettingsAudioDubDescription'),
items: [{
action: "original",
text: t('SettingsDubDefault')
}, {
action: "auto",
text: t('SettingsDubAuto')
}]
})
body: checkbox([{
action: "ytDub",
name: t("SettingsYoutubeDub"),
padding: "no-margin"
}])
+ explanation(t('SettingsYoutubeDubDescription'))
})
+ settingsCategory({
name: "tiktok-audio",
@ -499,7 +505,7 @@ export default function(obj) {
}])
})
+ (() => {
if (process.env.PLAUSIBLE_HOSTNAME) {
if (env.plausibleHostname) {
return settingsCategory({
name: "privacy",
title: t('PrivateAnalytics'),
@ -552,7 +558,7 @@ export default function(obj) {
},
body: switcher({
name: "download",
explanation: `${!isIOS ? t('DownloadPopupDescription') : t('DownloadPopupDescriptionIOS')}`,
explanation: t('DownloadPopupDescription'),
items: `<a id="pd-download" class="switch full" target="_blank" href="/"><span>${t('Download')}</span></a>
<div id="pd-share" class="switch full">${t('ShareURL')}</div>
<div id="pd-copy" class="switch full">${t('CopyURL')}</div>`
@ -578,8 +584,8 @@ export default function(obj) {
<div id="popup-backdrop" onclick="hideAllPopups()"></div>
<div id="home" style="visibility:hidden">
${urgentNotice({
emoji: "🔒",
text: t("UpdateEncryption"),
emoji: "🫧",
text: t("UpdateIstream"),
visible: true,
action: "popup('about', 1, 'changelog')"
})}
@ -629,7 +635,7 @@ export default function(obj) {
</footer>
</div>
<script>
let defaultApiUrl = '${process.env.API_URL || ''}';
let defaultApiUrl = '${env.apiURL}';
const loc = ${webLoc(t,
[
'ErrorNoInternet',
@ -646,7 +652,8 @@ export default function(obj) {
'DataTransferError',
'FilenamePreviewVideoTitle',
'FilenamePreviewAudioTitle',
'FilenamePreviewAudioAuthor'
'FilenamePreviewAudioAuthor',
'DownloadPopupDescriptionIOS'
])}
</script>
<script src="cobalt.js"></script>

View File

@ -1,9 +1,10 @@
import Cookie from './cookie.js';
import { readFile, writeFile } from 'fs/promises';
import { parse as parseSetCookie, splitCookiesString } from 'set-cookie-parser';
import { env } from '../../../modules/config.js'
const WRITE_INTERVAL = 60000,
cookiePath = process.env.COOKIE_PATH,
cookiePath = env.cookiePath,
COUNTER = Symbol('counter');
let cookies = {}, dirty = false, intervalId;

View File

@ -26,9 +26,21 @@ import twitch from "./services/twitch.js";
import rutube from "./services/rutube.js";
import dailymotion from "./services/dailymotion.js";
import snapchat from "./services/snapchat.js";
import { env } from '../config.js';
let freebind;
export default async function(host, patternMatch, url, lang, obj) {
assert(url instanceof URL);
let dispatcher, requestIP;
if (env.freebindCIDR) {
if (!freebind) {
freebind = await import('freebind');
}
requestIP = freebind.ip.random(env.freebindCIDR);
dispatcher = freebind.dispatcherFromIP(requestIP, { strict: false });
}
try {
let r, isAudioOnly = !!obj.isAudioOnly, disableMetadata = !!obj.disableMetadata;
@ -67,7 +79,8 @@ export default async function(host, patternMatch, url, lang, obj) {
format: obj.vCodec,
isAudioOnly: isAudioOnly,
isAudioMuted: obj.isAudioMuted,
dubLang: obj.dubLang
dubLang: obj.dubLang,
dispatcher
}
if (url.hostname === 'music.youtube.com' || isAudioOnly === true) {
@ -81,7 +94,8 @@ export default async function(host, patternMatch, url, lang, obj) {
case "reddit":
r = await reddit({
sub: patternMatch.sub,
id: patternMatch.id
id: patternMatch.id,
user: patternMatch.user
});
break;
case "tiktok":
@ -89,7 +103,8 @@ export default async function(host, patternMatch, url, lang, obj) {
postId: patternMatch.postId,
id: patternMatch.id,
fullAudio: obj.isTTFullAudio,
isAudioOnly: isAudioOnly
isAudioOnly: isAudioOnly,
h265: obj.tiktokH265
});
break;
case "tumblr":
@ -104,8 +119,7 @@ export default async function(host, patternMatch, url, lang, obj) {
id: patternMatch.id.slice(0, 11),
password: patternMatch.password,
quality: obj.vQuality,
isAudioOnly: isAudioOnly,
forceDash: isAudioOnly ? true : obj.vimeoDash
isAudioOnly: isAudioOnly
});
break;
case "soundcloud":
@ -114,6 +128,7 @@ export default async function(host, patternMatch, url, lang, obj) {
url,
author: patternMatch.author,
song: patternMatch.song,
format: obj.aFormat,
shortLink: patternMatch.shortLink || false,
accessKey: patternMatch.accessKey || false
});
@ -121,7 +136,8 @@ export default async function(host, patternMatch, url, lang, obj) {
case "instagram":
r = await instagram({
...patternMatch,
quality: obj.vQuality
quality: obj.vQuality,
dispatcher
})
break;
case "vine":
@ -152,6 +168,7 @@ export default async function(host, patternMatch, url, lang, obj) {
case "rutube":
r = await rutube({
id: patternMatch.id,
yappyId: patternMatch.yappyId,
quality: obj.vQuality,
isAudioOnly: isAudioOnly
});
@ -188,7 +205,8 @@ export default async function(host, patternMatch, url, lang, obj) {
return matchActionDecider(
r, host, obj.aFormat, isAudioOnly,
lang, isAudioMuted, disableMetadata,
obj.filenamePattern, obj.twitterGif
obj.filenamePattern, obj.twitterGif,
requestIP
)
} catch (e) {
return apiJSON(0, { t: genericError(lang, host) })

View File

@ -3,7 +3,7 @@ import { apiJSON } from "../sub/utils.js";
import loc from "../../localization/manager.js";
import createFilename from "./createFilename.js";
export default function(r, host, userFormat, isAudioOnly, lang, isAudioMuted, disableMetadata, filenamePattern, toGif) {
export default function(r, host, userFormat, isAudioOnly, lang, isAudioMuted, disableMetadata, filenamePattern, toGif, requestIP) {
let action,
responseType = 2,
defaultParams = {
@ -11,7 +11,8 @@ export default function(r, host, userFormat, isAudioOnly, lang, isAudioMuted, di
service: host,
filename: r.filenameAttributes ?
createFilename(r.filenameAttributes, filenamePattern, isAudioOnly, isAudioMuted) : r.filename,
fileMetadata: !disableMetadata ? r.fileMetadata : false
fileMetadata: !disableMetadata ? r.fileMetadata : false,
requestIP
},
params = {},
audioFormat = String(userFormat);
@ -139,40 +140,22 @@ export default function(r, host, userFormat, isAudioOnly, lang, isAudioMuted, di
audioFormat = "best"
}
const serviceBestAudio = r.bestAudio || services[host]["bestAudio"];
const isBestAudio = audioFormat === "best";
const isBestOrMp3 = audioFormat === "mp3" || isBestAudio;
const isBestAudioDefined = isBestAudio && services[host]["bestAudio"];
const isBestHostAudio = services[host]["bestAudio"] && (audioFormat === services[host]["bestAudio"]);
const isBestOrMp3 = isBestAudio || audioFormat === "mp3";
const isBestAudioDefined = isBestAudio && serviceBestAudio;
const isBestHostAudio = serviceBestAudio && (audioFormat === serviceBestAudio);
const isTikTok = host === "tiktok" || host === "douyin";
const isTumblrAudio = host === "tumblr" && !r.filename;
const isSoundCloud = host === "soundcloud";
if (isTikTok && services.tiktok.audioFormats.includes(audioFormat)) {
if (r.isMp3 && isBestOrMp3) {
audioFormat = "mp3";
processType = "bridge"
} else if (isBestAudio) {
audioFormat = "m4a";
processType = "bridge"
}
}
if (isSoundCloud && services.soundcloud.audioFormats.includes(audioFormat)) {
if (r.isMp3 && isBestOrMp3) {
audioFormat = "mp3";
processType = "render"
copy = true
} else if (isBestAudio || audioFormat === "opus") {
audioFormat = "opus";
processType = "render"
copy = true
}
}
if (isBestAudioDefined || isBestHostAudio) {
audioFormat = services[host]["bestAudio"];
audioFormat = serviceBestAudio;
processType = "bridge";
if (isSoundCloud) {
processType = "render"
copy = true
}
} else if (isBestAudio && !isSoundCloud) {
audioFormat = "m4a";
copy = true

View File

@ -2,59 +2,169 @@ import { createStream } from "../../stream/manage.js";
import { genericUserAgent } from "../../config.js";
import { getCookie, updateCookie } from "../cookie/manager.js";
const commonInstagramHeaders = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
'User-Agent': genericUserAgent,
'X-Ig-App-Id': '936619743392459',
'X-Asbd-Id': '129477',
'x-requested-with': 'XMLHttpRequest',
'Sec-Fetch-Dest': 'empty',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Site': 'same-origin',
'upgrade-insecure-requests': '1',
'accept-encoding': 'gzip, deflate, br',
'accept-language': 'en-US,en;q=0.9,en;q=0.8',
const commonHeaders = {
"user-agent": genericUserAgent,
"sec-gpc": "1",
"sec-fetch-site": "same-origin",
"x-ig-app-id": "936619743392459"
}
const mobileHeaders = {
"x-ig-app-locale": "en_US",
"x-ig-device-locale": "en_US",
"x-ig-mapped-locale": "en_US",
"user-agent": "Instagram 275.0.0.27.98 Android (33/13; 280dpi; 720x1423; Xiaomi; Redmi 7; onclite; qcom; en_US; 458229237)",
"accept-language": "en-US",
"x-fb-http-engine": "Liger",
"x-fb-client-ip": "True",
"x-fb-server-cluster": "True",
"content-length": "0",
}
const embedHeaders = {
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
"Accept-Language": "en-GB,en;q=0.9",
"Cache-Control": "max-age=0",
"Dnt": "1",
"Priority": "u=0, i",
"Sec-Ch-Ua": 'Chromium";v="124", "Google Chrome";v="124", "Not-A.Brand";v="99',
"Sec-Ch-Ua-Mobile": "?0",
"Sec-Ch-Ua-Platform": "macOS",
"Sec-Fetch-Dest": "document",
"Sec-Fetch-Mode": "navigate",
"Sec-Fetch-Site": "none",
"Sec-Fetch-User": "?1",
"Upgrade-Insecure-Requests": "1",
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
}
async function request(url, cookie) {
const data = await fetch(url, {
const cachedDtsg = {
value: '',
expiry: 0
}
export default function(obj) {
const dispatcher = obj.dispatcher;
async function findDtsgId(cookie) {
try {
if (cachedDtsg.expiry > Date.now()) return cachedDtsg.value;
const data = await fetch('https://www.instagram.com/', {
headers: {
...commonInstagramHeaders,
...commonHeaders,
cookie
},
dispatcher
}).then(r => r.text());
const token = data.match(/"dtsg":{"token":"(.*?)"/)[1];
cachedDtsg.value = token;
cachedDtsg.expiry = Date.now() + 86390000;
if (token) return token;
return false;
}
catch {}
}
async function request(url, cookie, method = 'GET', requestData) {
let headers = {
...commonHeaders,
'x-ig-www-claim': cookie?._wwwClaim || '0',
'x-csrftoken': cookie?.values()?.csrftoken,
cookie
}
})
if (method === 'POST') {
headers['content-type'] = 'application/x-www-form-urlencoded';
}
const data = await fetch(url, {
method,
headers,
body: requestData && new URLSearchParams(requestData),
dispatcher
});
if (data.headers.get('X-Ig-Set-Www-Claim') && cookie)
cookie._wwwClaim = data.headers.get('X-Ig-Set-Www-Claim');
updateCookie(cookie, data.headers);
return data.json();
}
}
async function getMediaId(id, { cookie, token } = {}) {
const oembedURL = new URL('https://i.instagram.com/api/v1/oembed/');
oembedURL.searchParams.set('url', `https://www.instagram.com/p/${id}/`);
async function getPost(id) {
let data;
try {
const cookie = getCookie('instagram');
const oembed = await fetch(oembedURL, {
headers: {
...mobileHeaders,
...( token && { authorization: `Bearer ${token}` } ),
cookie
},
dispatcher
}).then(r => r.json()).catch(() => {});
const url = new URL('https://www.instagram.com/graphql/query/');
url.searchParams.set('query_hash', 'b3055c01b4b222b8a47dc12b090e4e64')
url.searchParams.set('variables', JSON.stringify({
child_comment_count: 3,
fetch_comment_count: 40,
has_threaded_comments: true,
parent_comment_count: 24,
shortcode: id
}))
return oembed?.media_id;
}
data = (await request(url, cookie)).data;
async function requestMobileApi(mediaId, { cookie, token } = {}) {
const mediaInfo = await fetch(`https://i.instagram.com/api/v1/media/${mediaId}/info/`, {
headers: {
...mobileHeaders,
...( token && { authorization: `Bearer ${token}` } ),
cookie
},
dispatcher
}).then(r => r.json()).catch(() => {});
} catch {}
return mediaInfo?.items?.[0];
}
async function requestHTML(id, cookie) {
const data = await fetch(`https://www.instagram.com/p/${id}/embed/captioned/`, {
headers: {
...embedHeaders,
cookie
},
dispatcher
}).then(r => r.text()).catch(() => {});
if (!data) return { error: 'ErrorCouldntFetch' };
let embedData = JSON.parse(data?.match(/"init",\[\],\[(.*?)\]\],/)[1]);
const sidecar = data?.shortcode_media?.edge_sidecar_to_children;
if (!embedData || !embedData?.contextJSON) return false;
embedData = JSON.parse(embedData.contextJSON);
return embedData;
}
async function requestGQL(id, cookie) {
let dtsgId;
if (cookie) {
dtsgId = await findDtsgId(cookie);
}
const url = new URL('https://www.instagram.com/api/graphql/');
const requestData = {
jazoest: '26406',
variables: JSON.stringify({
shortcode: id,
__relay_internal__pv__PolarisShareMenurelayprovider: false
}),
doc_id: '7153618348081770'
};
if (dtsgId) {
requestData.fb_dtsg = dtsgId;
}
return (await request(url, cookie, 'POST', requestData))
.data
?.xdt_api__v1__media__shortcode__web_info
?.items
?.[0];
}
function extractOldPost(data, id) {
const sidecar = data?.gql_data?.shortcode_media?.edge_sidecar_to_children;
if (sidecar) {
const picker = sidecar.edges.filter(e => e.node?.display_url)
.map(e => {
@ -75,23 +185,105 @@ async function getPost(id) {
});
if (picker.length) return { picker }
} else if (data?.shortcode_media?.video_url) {
} else if (data?.gql_data?.shortcode_media?.video_url) {
return {
urls: data.shortcode_media.video_url,
urls: data.gql_data.shortcode_media.video_url,
filename: `instagram_${id}.mp4`,
audioFilename: `instagram_${id}_audio`
}
} else if (data?.shortcode_media?.display_url) {
} else if (data?.gql_data?.shortcode_media?.display_url) {
return {
urls: data.shortcode_media.display_url,
urls: data.gql_data?.shortcode_media.display_url,
isPhoto: true
}
}
}
function extractNewPost(data, id) {
const carousel = data.carousel_media;
if (carousel) {
const picker = carousel.filter(e => e?.image_versions2)
.map(e => {
const type = e.video_versions ? "video" : "photo";
const imageUrl = e.image_versions2.candidates[0].url;
let url = imageUrl;
if (type === 'video') {
const video = e.video_versions.reduce((a, b) => a.width * a.height < b.width * b.height ? b : a);
url = video.url;
}
return {
type, url,
/* thumbnails have `Cross-Origin-Resource-Policy`
** set to `same-origin`, so we need to proxy them */
thumb: createStream({
service: "instagram",
type: "default",
u: imageUrl,
filename: "image.jpg"
})
}
});
if (picker.length) return { picker }
} else if (data.video_versions) {
const video = data.video_versions.reduce((a, b) => a.width * a.height < b.width * b.height ? b : a)
return {
urls: video.url,
filename: `instagram_${id}.mp4`,
audioFilename: `instagram_${id}_audio`
}
} else if (data.image_versions2?.candidates) {
return {
urls: data.image_versions2.candidates[0].url,
isPhoto: true
}
}
}
async function getPost(id) {
let data, result;
try {
const cookie = getCookie('instagram');
const bearer = getCookie('instagram_bearer');
const token = bearer?.values()?.token;
// get media_id for mobile api, three methods
let media_id = await getMediaId(id);
if (!media_id && token) media_id = await getMediaId(id, { token });
if (!media_id && cookie) media_id = await getMediaId(id, { cookie });
// mobile api (bearer)
if (media_id && token) data = await requestMobileApi(id, { token });
// mobile api (no cookie, cookie)
if (!data && media_id) data = await requestMobileApi(id);
if (!data && media_id && cookie) data = await requestMobileApi(id, { cookie });
// html embed (no cookie, cookie)
if (!data) data = await requestHTML(id);
if (!data && cookie) data = await requestHTML(id, cookie);
// web app graphql api (no cookie, cookie)
if (!data) data = await requestGQL(id);
if (!data && cookie) data = await requestGQL(id, cookie);
} catch {}
if (!data) return { error: 'ErrorCouldntFetch' };
if (data?.gql_data) {
result = extractOldPost(data, id)
} else {
result = extractNewPost(data, id)
}
if (result) return result;
return { error: 'ErrorEmptyDownload' }
}
}
async function usernameToId(username, cookie) {
async function usernameToId(username, cookie) {
const url = new URL('https://www.instagram.com/api/v1/users/web_profile_info/');
url.searchParams.set('username', username);
@ -99,26 +291,35 @@ async function usernameToId(username, cookie) {
const data = await request(url, cookie);
return data?.data?.user?.id;
} catch {}
}
}
async function getStory(username, id) {
async function getStory(username, id) {
const cookie = getCookie('instagram');
if (!cookie) return { error: 'ErrorUnsupported' }
if (!cookie) return { error: 'ErrorUnsupported' };
const userId = await usernameToId(username, cookie);
if (!userId) return { error: 'ErrorEmptyDownload' }
if (!userId) return { error: 'ErrorEmptyDownload' };
const url = new URL('https://www.instagram.com/api/v1/feed/reels_media/');
url.searchParams.set('reel_ids', userId);
url.searchParams.set('media_id', id);
const dtsgId = await findDtsgId(cookie);
const url = new URL('https://www.instagram.com/api/graphql/');
const requestData = {
fb_dtsg: dtsgId,
jazoest: '26438',
variables: JSON.stringify({
reel_ids_arr : [ userId ],
}),
server_timestamps: true,
doc_id: '25317500907894419'
};
let media;
try {
const data = await request(url, cookie);
media = data?.reels_media?.find(m => m.id === userId);
const data = (await request(url, cookie, 'POST', requestData));
media = data?.data?.xdt_api__v1__feed__reels_media?.reels_media?.find(m => m.id === userId);
} catch {}
const item = media.items[media.media_ids.indexOf(id)];
const item = media.items.find(m => m.pk === id);
if (!item) return { error: 'ErrorEmptyDownload' };
if (item.video_versions) {
@ -138,9 +339,8 @@ async function getStory(username, id) {
}
return { error: 'ErrorCouldntFetch' };
}
}
export default function(obj) {
const { postId, storyId, username } = obj;
if (postId) return getPost(postId);
if (username && storyId) return getStory(username, storyId);

View File

@ -1,22 +1,17 @@
import { genericUserAgent } from "../../config.js";
const videoLinkBase = {
"regular": "https://v1.pinimg.com/videos/mc/720p/",
"story": "https://v1.pinimg.com/videos/mc/720p/"
}
const videoRegex = /"url":"(https:\/\/v1.pinimg.com\/videos\/.*?)"/g;
const imageRegex = /src="(https:\/\/i\.pinimg\.com\/.*\.(jpg|gif))"/g;
export default async function(o) {
let id = o.id, type = "regular";
let id = o.id;
if (!o.id && o.shortLink) {
id = await fetch(`https://api.pinterest.com/url_shortener/${o.shortLink}/redirect/`, { redirect: "manual" }).then((r) => {
return r.headers.get("location").split('pin/')[1].split('/')[0]
}).catch(() => {});
}
if (id.includes("--")) {
id = id.split("--")[1];
type = "story";
}
if (id.includes("--")) id = id.split("--")[1];
if (!id) return { error: 'ErrorCouldntFetch' };
let html = await fetch(`https://www.pinterest.com/pin/${id}/`, {
@ -25,12 +20,24 @@ export default async function(o) {
if (!html) return { error: 'ErrorCouldntFetch' };
let videoLink = html.split(`"url":"${videoLinkBase[type]}`)[1]?.split('"')[0];
if (!html.includes(videoLink)) return { error: 'ErrorEmptyDownload' };
let videoLink = [...html.matchAll(videoRegex)]
.map(([, link]) => link)
.find(a => a.endsWith('.mp4') && a.includes('720p'));
return {
urls: `${videoLinkBase[type]}${videoLink}`,
if (videoLink) return {
urls: videoLink,
filename: `pinterest_${o.id}.mp4`,
audioFilename: `pinterest_${o.id}_audio`
}
let imageLink = [...html.matchAll(imageRegex)]
.map(([, link]) => link)
.find(a => a.endsWith('.jpg') || a.endsWith('.gif'));
if (imageLink) return {
urls: imageLink,
isPhoto: true
}
return { error: 'ErrorEmptyDownload' };
}

View File

@ -48,43 +48,73 @@ async function getAccessToken() {
}
export default async function(obj) {
const url = new URL(`https://www.reddit.com/r/${obj.sub}/comments/${obj.id}.json`);
let url = new URL(`https://www.reddit.com/r/${obj.sub}/comments/${obj.id}.json`);
if (obj.user) {
url.pathname = `/user/${obj.user}/comments/${obj.id}.json`;
}
const accessToken = await getAccessToken();
if (accessToken) url.hostname = 'oauth.reddit.com';
let data = await fetch(
url, { headers: accessToken && { authorization: `Bearer ${accessToken}` } }
).then((r) => { return r.json() }).catch(() => { return false });
if (!data) return { error: 'ErrorCouldntFetch' };
url, {
headers: accessToken && { authorization: `Bearer ${accessToken}` }
}
).then(r => r.json() ).catch(() => {});
data = data[0]["data"]["children"][0]["data"];
if (!data || !Array.isArray(data)) return { error: 'ErrorCouldntFetch' };
if (data.url.endsWith('.gif')) return { typeId: 1, urls: data.url };
data = data[0]?.data?.children[0]?.data;
if (!("reddit_video" in data["secure_media"])) return { error: 'ErrorEmptyDownload' };
if (data["secure_media"]["reddit_video"]["duration"] * 1000 > maxVideoDuration) return { error: ['ErrorLengthLimit', maxVideoDuration / 60000] };
if (data?.url?.endsWith('.gif')) return {
typeId: 1,
urls: data.url
}
if (!data.secure_media?.reddit_video)
return { error: 'ErrorEmptyDownload' };
if (data.secure_media?.reddit_video?.duration * 1000 > maxVideoDuration)
return { error: ['ErrorLengthLimit', maxVideoDuration / 60000] };
let audio = false,
video = data["secure_media"]["reddit_video"]["fallback_url"].split('?')[0],
audioFileLink = video.match('.mp4') ? `${video.split('_')[0]}_audio.mp4` : `${data["secure_media"]["reddit_video"]["fallback_url"].split('DASH')[0]}audio`;
video = data.secure_media?.reddit_video?.fallback_url?.split('?')[0],
audioFileLink = `${data.secure_media?.reddit_video?.fallback_url?.split('DASH')[0]}audio`;
await fetch(audioFileLink, { method: "HEAD" }).then((r) => { if (Number(r.status) === 200) audio = true }).catch(() => { audio = false });
if (video.match('.mp4')) {
audioFileLink = `${video.split('_')[0]}_audio.mp4`
}
// test the existence of audio
await fetch(audioFileLink, { method: "HEAD" }).then((r) => {
if (Number(r.status) === 200) {
audio = true
}
}).catch(() => {})
// fallback for videos with variable audio quality
if (!audio) {
audioFileLink = `${video.split('_')[0]}_AUDIO_128.mp4`
await fetch(audioFileLink, { method: "HEAD" }).then((r) => { if (Number(r.status) === 200) audio = true }).catch(() => { audio = false });
await fetch(audioFileLink, { method: "HEAD" }).then((r) => {
if (Number(r.status) === 200) {
audio = true
}
}).catch(() => {})
}
let id = video.split('/')[3];
if (!audio) return { typeId: 1, urls: video };
if (!audio) return {
typeId: 1,
urls: video
}
return {
typeId: 2,
type: "render",
urls: [video, audioFileLink],
audioFilename: `reddit_${id}_audio`,
filename: `reddit_${id}.mp4`
};
}
}

View File

@ -1,18 +1,47 @@
import HLS from 'hls-parser';
import { maxVideoDuration } from "../../config.js";
import { cleanString } from '../../sub/utils.js';
async function requestJSON(url) {
try {
const r = await fetch(url);
return await r.json();
} catch {}
}
export default async function(obj) {
if (obj.yappyId) {
let yappy = await requestJSON(
`https://rutube.ru/pangolin/api/web/yappy/yappypage/?client=wdp&videoId=${obj.yappyId}&page=1&page_size=15`
)
let yappyURL = yappy?.results?.find(r => r.id === obj.yappyId)?.link;
if (!yappyURL) return { error: 'ErrorEmptyDownload' };
return {
urls: yappyURL,
filename: `rutube_yappy_${obj.yappyId}.mp4`,
audioFilename: `rutube_yappy_${obj.yappyId}_audio`
}
}
let quality = obj.quality === "max" ? "9000" : obj.quality;
let play = await fetch(`https://rutube.ru/api/play/options/${obj.id}/?no_404=true&referer&pver=v2`).then((r) => { return r.json() }).catch(() => { return false });
let play = await requestJSON(
`https://rutube.ru/api/play/options/${obj.id}/?no_404=true&referer&pver=v2`
)
if (!play) return { error: 'ErrorCouldntFetch' };
if ("hls" in play.live_streams) return { error: 'ErrorLiveVideo' };
if (!play.video_balancer || play.detail) return { error: 'ErrorEmptyDownload' };
if (play.detail || !play.video_balancer) return { error: 'ErrorEmptyDownload' };
if (play.live_streams?.hls) return { error: 'ErrorLiveVideo' };
if (play.duration > maxVideoDuration) return { error: ['ErrorLengthLimit', maxVideoDuration / 60000] };
if (play.duration > maxVideoDuration)
return { error: ['ErrorLengthLimit', maxVideoDuration / 60000] };
let m3u8 = await fetch(play.video_balancer.m3u8)
.then(r => r.text())
.catch(() => {});
let m3u8 = await fetch(play.video_balancer.m3u8).then((r) => { return r.text() }).catch(() => { return false });
if (!m3u8) return { error: 'ErrorCouldntFetch' };
m3u8 = HLS.parse(m3u8).variants.sort((a, b) => Number(b.bandwidth) - Number(a.bandwidth));
@ -21,6 +50,7 @@ export default async function(obj) {
if (Number(quality) < bestQuality.resolution.height) {
bestQuality = m3u8.find((i) => (Number(quality) === i["resolution"].height));
}
let fileMetadata = {
title: cleanString(play.title.trim()),
artist: cleanString(play.author.name.trim()),
@ -31,7 +61,7 @@ export default async function(obj) {
isM3U8: true,
filenameAttributes: {
service: "rutube",
id: play.id,
id: obj.id,
title: fileMetadata.title,
author: fileMetadata.artist,
resolution: `${bestQuality.resolution.width}x${bestQuality.resolution.height}`,

View File

@ -1,7 +1,10 @@
import { maxVideoDuration } from "../../config.js";
import { cleanString } from "../../sub/utils.js";
let cachedID = {};
const cachedID = {
version: '',
id: ''
}
async function findClientID() {
try {
@ -29,9 +32,7 @@ async function findClientID() {
cachedID.id = clientid;
return clientid;
} catch (e) {
return false;
}
} catch {}
}
export default async function(obj) {
@ -55,27 +56,31 @@ export default async function(obj) {
let json = await fetch(`https://api-v2.soundcloud.com/resolve?url=${link}&client_id=${clientId}`).then((r) => {
return r.status === 200 ? r.json() : false
}).catch(() => { return false });
}).catch(() => {});
if (!json) return { error: 'ErrorCouldntFetch' };
if (!json["media"]["transcodings"]) return { error: 'ErrorEmptyDownload' };
let isMp3,
selectedStream = json.media.transcodings.filter(v => v.preset === "opus_0_0")
let bestAudio = "opus",
selectedStream = json.media.transcodings.find(v => v.preset === "opus_0_0"),
mp3Media = json.media.transcodings.find(v => v.preset === "mp3_0_0");
// fall back to mp3 if no opus is available
if (selectedStream.length === 0) {
selectedStream = json.media.transcodings.filter(v => v.preset === "mp3_0_0")
isMp3 = true
// use mp3 if present if user prefers it or if opus isn't available
if (mp3Media && (obj.format === "mp3" || !selectedStream)) {
selectedStream = mp3Media;
bestAudio = "mp3"
}
let fileUrlBase = selectedStream[0]["url"];
let fileUrlBase = selectedStream.url;
let fileUrl = `${fileUrlBase}${fileUrlBase.includes("?") ? "&" : "?"}client_id=${clientId}&track_authorization=${json.track_authorization}`;
if (fileUrl.substring(0, 54) !== "https://api-v2.soundcloud.com/media/soundcloud:tracks:") return { error: 'ErrorEmptyDownload' };
if (json.duration > maxVideoDuration) return { error: ['ErrorLengthAudioConvert', maxVideoDuration / 60000] };
if (json.duration > maxVideoDuration)
return { error: ['ErrorLengthAudioConvert', maxVideoDuration / 60000] };
let file = await fetch(fileUrl).then(async (r) => { return (await r.json()).url }).catch(() => { return false });
let file = await fetch(fileUrl).then(async (r) => { return (await r.json()).url }).catch(() => {});
if (!file) return { error: 'ErrorCouldntFetch' };
let fileMetadata = {
@ -91,7 +96,7 @@ export default async function(obj) {
title: fileMetadata.title,
author: fileMetadata.artist
},
isMp3,
bestAudio,
fileMetadata
}
}

View File

@ -1,4 +1,4 @@
import { genericUserAgent } from "../../config.js";
import { genericUserAgent, env } from "../../config.js";
const shortDomain = "https://vt.tiktok.com/";
const apiPath = "https://api22-normal-c-alisg.tiktokv.com/aweme/v1/feed/?region=US&carrier_region=US";
@ -7,7 +7,7 @@ const apiUserAgent = "TikTok/338014 CFNetwork/1410.1 Darwin/22.6.0";
export default async function(obj) {
let postId = obj.postId ? obj.postId : false;
if (!process.env.TIKTOK_DEVICE_INFO) return { error: 'ErrorCouldntFetch' };
if (!env.tiktokDeviceInfo) return { error: 'ErrorCouldntFetch' };
if (!postId) {
let html = await fetch(`${shortDomain}${obj.id}`, {
@ -27,8 +27,7 @@ export default async function(obj) {
}
if (!postId) return { error: 'ErrorCantGetID' };
let deviceInfo = JSON.parse(process.env.TIKTOK_DEVICE_INFO);
deviceInfo = new URLSearchParams(deviceInfo).toString();
let deviceInfo = new URLSearchParams(env.tiktokDeviceInfo).toString();
let apiURL = new URL(apiPath);
apiURL.searchParams.append("aweme_id", postId);
@ -42,14 +41,19 @@ export default async function(obj) {
detail = detail?.aweme_list?.find(v => v.aweme_id === postId);
if (!detail) return { error: 'ErrorCouldntFetch' };
let video, videoFilename, audioFilename, isMp3, audio, images,
filenameBase = `tiktok_${detail.author.unique_id}_${postId}`;
let video, videoFilename, audioFilename, audio, images,
filenameBase = `tiktok_${detail.author.unique_id}_${postId}`,
bestAudio = 'm4a';
images = detail.image_post_info?.images;
let playAddr = detail.video.play_addr_h264;
if (!playAddr) playAddr = detail.video.play_addr;
if (obj.h265) {
playAddr = detail.video.bit_rate[0].play_addr
}
if (!playAddr && detail.video.play_addr) {
playAddr = detail.video.play_addr
}
if (!obj.isAudioOnly && !images) {
video = playAddr.url_list[0];
@ -57,12 +61,12 @@ export default async function(obj) {
} else {
let fallback = playAddr.url_list[0];
audio = fallback;
audioFilename = `${filenameBase}_audio_fv`; // fv - from video
audioFilename = `${filenameBase}_audio`;
if (obj.fullAudio || fallback.includes("music")) {
audio = detail.music.play_url.url_list[0]
audioFilename = `${filenameBase}_audio`
audioFilename = `${filenameBase}_audio_original`
}
if (audio.slice(-4) === ".mp3") isMp3 = true;
if (audio.slice(-4) === ".mp3") bestAudio = 'mp3';
}
if (video) return {
@ -73,7 +77,7 @@ export default async function(obj) {
urls: audio,
audioFilename: audioFilename,
isAudioOnly: true,
isMp3: isMp3
bestAudio
}
if (images) {
let imageLinks = [];
@ -87,13 +91,13 @@ export default async function(obj) {
urls: audio,
audioFilename: audioFilename,
isAudioOnly: true,
isMp3: isMp3
bestAudio
}
}
if (audio) return {
urls: audio,
audioFilename: audioFilename,
isAudioOnly: true,
isMp3: isMp3
bestAudio
}
}

View File

@ -1,5 +1,4 @@
import psl from "psl";
import { genericUserAgent } from "../../config.js";
const API_KEY = 'jrsCWX1XDuVxAFO4GkK147syAoN8BJZ5voz8tS80bPcj26Vc5Z';
const API_BASE = 'https://api-http2.tumblr.com';

View File

@ -1,5 +1,6 @@
import { genericUserAgent } from "../../config.js";
import { createStream } from "../../stream/manage.js";
import { getCookie, updateCookie } from "../cookie/manager.js";
const graphqlURL = 'https://twitter.com/i/api/graphql/5GOHgZe-8U2j5sVHQzEm9A/TweetResultByRestId';
const tokenURL = 'https://api.twitter.com/1.1/guest/activate.json';
@ -49,9 +50,26 @@ const getGuestToken = async (forceReload = false) => {
}
}
const requestTweet = (tweetId, token) => {
const requestTweet = async(tweetId, token, cookie) => {
const graphqlTweetURL = new URL(graphqlURL);
let headers = {
...commonHeaders,
'content-type': 'application/json',
'x-guest-token': token,
cookie: `guest_id=${encodeURIComponent(`v1:${token}`)}`
}
if (cookie) {
headers = {
...commonHeaders,
'content-type': 'application/json',
'X-Twitter-Auth-Type': 'OAuth2Session',
'x-csrf-token': cookie.values().ct0,
cookie
}
}
graphqlTweetURL.searchParams.set('variables',
JSON.stringify({
tweetId,
@ -62,31 +80,39 @@ const requestTweet = (tweetId, token) => {
);
graphqlTweetURL.searchParams.set('features', tweetFeatures);
return fetch(graphqlTweetURL, {
let result = await fetch(graphqlTweetURL, { headers });
updateCookie(cookie, result.headers);
// we might have been missing the `ct0` cookie, retry
if (result.status === 403 && result.headers.get('set-cookie')) {
result = await fetch(graphqlTweetURL, {
headers: {
...commonHeaders,
'content-type': 'application/json',
'x-guest-token': token,
cookie: `guest_id=${encodeURIComponent(`v1:${token}`)}`
...headers,
'x-csrf-token': cookie.values().ct0
}
})
});
}
return result
}
export default async function({ id, index, toGif }) {
const cookie = await getCookie('twitter');
let guestToken = await getGuestToken();
if (!guestToken) return { error: 'ErrorCouldntFetch' };
let tweet = await requestTweet(id, guestToken);
if ([403, 429].includes(tweet.status)) { // get new token & retry
// get new token & retry if old one expired
if ([403, 429].includes(tweet.status)) {
guestToken = await getGuestToken(true);
tweet = await requestTweet(id, guestToken)
}
tweet = await tweet.json();
// {"data":{"tweetResult":{"result":{"__typename":"TweetUnavailable","reason":"Protected"}}}}
const tweetTypename = tweet?.data?.tweetResult?.result?.__typename;
let tweetTypename = tweet?.data?.tweetResult?.result?.__typename;
if (tweetTypename === "TweetUnavailable") {
const reason = tweet?.data?.tweetResult?.result?.reason;
@ -94,21 +120,32 @@ export default async function({ id, index, toGif }) {
case "Protected":
return { error: 'ErrorTweetProtected' }
case "NsfwLoggedOut":
return { error: 'ErrorTweetNSFW' }
if (cookie) {
tweet = await requestTweet(id, guestToken, cookie);
tweet = await tweet.json();
tweetTypename = tweet?.data?.tweetResult?.result?.__typename;
} else return { error: 'ErrorTweetNSFW' }
}
}
if (tweetTypename !== "Tweet") {
if (!["Tweet", "TweetWithVisibilityResults"].includes(tweetTypename)) {
return { error: 'ErrorTweetUnavailable' }
}
const baseTweet = tweet.data.tweetResult.result.legacy,
repostedTweet = baseTweet.retweeted_status_result?.result.legacy.extended_entities;
let tweetResult = tweet.data.tweetResult.result,
baseTweet = tweetResult.legacy,
repostedTweet = baseTweet?.retweeted_status_result?.result.legacy.extended_entities;
if (tweetTypename === "TweetWithVisibilityResults") {
baseTweet = tweetResult.tweet.legacy;
repostedTweet = baseTweet?.retweeted_status_result?.result.tweet.legacy.extended_entities;
}
let media = (repostedTweet?.media || baseTweet?.extended_entities?.media);
media = media?.filter(m => m.video_info?.variants?.length);
// check if there's a video at given index (/video/<index>)
if ([0, 1, 2, 3].includes(index) && index < media?.length) {
if (index >= 0 && index < media?.length) {
media = [media[index]]
}

View File

@ -39,7 +39,7 @@ export default async function(obj) {
if (!api) return { error: 'ErrorCouldntFetch' };
let downloadType = "dash";
if (!obj.forceDash && JSON.stringify(api).includes('"progressive":[{')) downloadType = "progressive";
if (!obj.isAudioOnly && JSON.stringify(api).includes('"progressive":[{')) downloadType = "progressive";
let fileMetadata = {
title: cleanString(api.video.title.trim()),

View File

@ -1,10 +1,11 @@
import { Innertube } from 'youtubei.js';
import { Innertube, Session } from 'youtubei.js';
import { maxVideoDuration } from '../../config.js';
import { cleanString } from '../../sub/utils.js';
import { fetch } from 'undici'
const yt = await Innertube.create();
const ytBase = await Innertube.create();
const c = {
const codecMatch = {
h264: {
codec: "avc1",
aCodec: "mp4a",
@ -22,8 +23,30 @@ const c = {
}
}
const cloneInnertube = (customFetch) => {
const session = new Session(
ytBase.session.context,
ytBase.session.key,
ytBase.session.api_version,
ytBase.session.account_index,
ytBase.session.player,
undefined,
customFetch ?? ytBase.session.http.fetch,
ytBase.session.cache
);
const yt = new Innertube(session);
return yt;
}
export default async function(o) {
let info, isDubbed, quality = o.quality === "max" ? "9000" : o.quality; //set quality 9000(p) to be interpreted as max
const yt = cloneInnertube(
(input, init) => fetch(input, { ...init, dispatcher: o.dispatcher })
);
let info, isDubbed, format = o.format || "h264";
let quality = o.quality === "max" ? "9000" : o.quality; // 9000(p) - max quality
function qual(i) {
if (!i.quality_label) {
return;
@ -33,7 +56,7 @@ export default async function(o) {
}
try {
info = await yt.getBasicInfo(o.id, 'ANDROID');
info = await yt.getBasicInfo(o.id, 'WEB');
} catch (e) {
return { error: 'ErrorCantConnectToServiceAPI' };
}
@ -43,12 +66,29 @@ export default async function(o) {
if (info.playability_status.status !== 'OK') return { error: 'ErrorYTUnavailable' };
if (info.basic_info.is_live) return { error: 'ErrorLiveVideo' };
let bestQuality, hasAudio, adaptive_formats = info.streaming_data.adaptive_formats.filter(e =>
e.mime_type.includes(c[o.format].codec) || e.mime_type.includes(c[o.format].aCodec)
// return a critical error if returned video is "Video Not Available"
// or a similar stub by youtube
if (info.basic_info.id !== o.id) {
return {
error: 'ErrorCantConnectToServiceAPI',
critical: true
}
}
let bestQuality, hasAudio;
const filterByCodec = (formats) => formats.filter(e =>
e.mime_type.includes(codecMatch[format].codec) || e.mime_type.includes(codecMatch[format].aCodec)
).sort((a, b) => Number(b.bitrate) - Number(a.bitrate));
bestQuality = adaptive_formats.find(i => i.has_video);
hasAudio = adaptive_formats.find(i => i.has_audio);
let adaptive_formats = filterByCodec(info.streaming_data.adaptive_formats);
if (adaptive_formats.length === 0 && format === "vp9") {
format = "h264"
adaptive_formats = filterByCodec(info.streaming_data.adaptive_formats)
}
bestQuality = adaptive_formats.find(i => i.has_video && i.content_length);
hasAudio = adaptive_formats.find(i => i.has_audio && i.content_length);
if (bestQuality) bestQuality = qual(bestQuality);
if (!bestQuality && !o.isAudioOnly || !hasAudio) return { error: 'ErrorYTTryOtherCodec' };
@ -87,42 +127,37 @@ export default async function(o) {
youtubeDubName: isDubbed ? o.dubLang : false
}
if (filenameAttributes.title === "Video Not Available" && filenameAttributes.author === "YouTube Viewers")
return {
error: 'ErrorCantConnectToServiceAPI',
critical: true
}
if (hasAudio && o.isAudioOnly) return {
type: "render",
isAudioOnly: true,
urls: audio.url,
urls: audio.decipher(yt.session.player),
filenameAttributes: filenameAttributes,
fileMetadata: fileMetadata
fileMetadata: fileMetadata,
bestAudio: format === "h264" ? 'm4a' : 'opus'
}
const matchingQuality = Number(quality) > Number(bestQuality) ? bestQuality : quality,
checkSingle = i => qual(i) === matchingQuality && i.mime_type.includes(c[o.format].codec),
checkSingle = i => qual(i) === matchingQuality && i.mime_type.includes(codecMatch[format].codec),
checkRender = i => qual(i) === matchingQuality && i.has_video && !i.has_audio;
let match, type, urls;
if (!o.isAudioOnly && !o.isAudioMuted && o.format === 'h264') {
if (!o.isAudioOnly && !o.isAudioMuted && format === 'h264') {
match = info.streaming_data.formats.find(checkSingle);
type = "bridge";
urls = match?.url;
urls = match?.decipher(yt.session.player);
}
const video = adaptive_formats.find(checkRender);
if (!match && video) {
match = video;
type = "render";
urls = [video.url, audio.url];
urls = [video.decipher(yt.session.player), audio.decipher(yt.session.player)];
}
if (match) {
filenameAttributes.qualityLabel = match.quality_label;
filenameAttributes.resolution = `${match.width}x${match.height}`;
filenameAttributes.extension = c[o.format].container;
filenameAttributes.youtubeFormat = o.format;
filenameAttributes.extension = codecMatch[format].container;
filenameAttributes.youtubeFormat = format;
return {
type,
urls,

View File

@ -7,11 +7,12 @@
"video/:comId", "_shortLink/:comShortLink",
"_tv/:lang/video/:tvId", "_tv/video/:tvId"
],
"subdomains": ["m"],
"enabled": true
},
"reddit": {
"alias": "reddit videos & gifs",
"patterns": ["r/:sub/comments/:id/:title"],
"patterns": ["r/:sub/comments/:id/:title", "user/:user/comments/:id/:title"],
"subdomains": "*",
"enabled": true
},
@ -56,7 +57,6 @@
"alias": "tiktok videos, photos & audio",
"patterns": [":user/video/:postId", ":id", "t/:id", ":user/photo/:postId"],
"subdomains": ["vt", "vm"],
"audioFormats": ["best", "m4a", "mp3"],
"enabled": true
},
"douyin": {
@ -66,18 +66,18 @@
"enabled": false
},
"vimeo": {
"patterns": [":id", "video/:id", ":id/:password"],
"patterns": [":id", "video/:id", ":id/:password", "/channels/:user/:id"],
"enabled": true,
"bestAudio": "mp3"
},
"soundcloud": {
"patterns": [":author/:song/s-:accessKey", ":author/:song", ":shortLink"],
"subdomains": ["on", "m"],
"audioFormats": ["best", "opus", "mp3"],
"enabled": true
},
"instagram": {
"alias": "instagram reels, posts & stories",
"altDomains": ["ddinstagram.com"],
"patterns": [
"reels/:postId", ":username/reel/:postId", "reel/:postId", "p/:postId", ":username/p/:postId",
"tv/:postId", "stories/:username/:storyId"
@ -91,7 +91,7 @@
"enabled": true
},
"pinterest": {
"alias": "pinterest videos & stories",
"alias": "pinterest (all media)",
"patterns": ["pin/:id", "pin/:id/:garbage", "url_shortener/:shortLink"],
"enabled": true
},
@ -109,7 +109,7 @@
"rutube": {
"alias": "rutube videos",
"tld": "ru",
"patterns": ["video/:id", "play/embed/:id"],
"patterns": ["video/:id", "play/embed/:id", "shorts/:id", "yappy/:yappyId"],
"enabled": true
},
"dailymotion": {

View File

@ -16,10 +16,11 @@ export const testers = {
patternMatch.id?.length <= 128 || patternMatch.shortLink?.length <= 32,
"reddit": (patternMatch) =>
patternMatch.sub?.length <= 22 && patternMatch.id?.length <= 10,
(patternMatch.sub?.length <= 22 && patternMatch.id?.length <= 10)
|| (patternMatch.user?.length <= 22 && patternMatch.id?.length <= 10),
"rutube": (patternMatch) =>
patternMatch.id?.length === 32,
patternMatch.id?.length === 32 || patternMatch.yappyId?.length === 32,
"soundcloud": (patternMatch) =>
(patternMatch.author?.length <= 255 && patternMatch.song?.length <= 255)

View File

@ -64,6 +64,12 @@ export function aliasURL(url) {
if (url.hostname === 'dai.ly' && parts.length === 2) {
url = new URL(`https://dailymotion.com/video/${parts[1]}`)
}
break;
case "ddinstagram":
if (services.instagram.altDomains.includes(host.domain) && [null, 'd', 'g'].includes(host.subdomain)) {
url.hostname = 'instagram.com';
}
break;
}
return url

View File

@ -0,0 +1,104 @@
import { request } from 'undici';
import { Readable } from 'node:stream';
import { assert } from 'console';
import { getHeaders } from './shared.js';
const CHUNK_SIZE = BigInt(8e6); // 8 MB
const min = (a, b) => a < b ? a : b;
async function* readChunks(streamInfo, size) {
let read = 0n;
while (read < size) {
if (streamInfo.controller.signal.aborted) {
throw new Error("controller aborted");
}
const chunk = await request(streamInfo.url, {
headers: {
...getHeaders('youtube'),
Range: `bytes=${read}-${read + CHUNK_SIZE}`
},
dispatcher: streamInfo.dispatcher,
signal: streamInfo.controller.signal
});
const expected = min(CHUNK_SIZE, size - read);
const received = BigInt(chunk.headers['content-length']);
if (received < expected / 2n) {
streamInfo.controller.abort();
}
for await (const data of chunk.body) {
yield data;
}
read += received;
}
}
function chunkedStream(streamInfo, size) {
assert(streamInfo.controller instanceof AbortController);
const stream = Readable.from(readChunks(streamInfo, size));
return stream;
}
async function handleYoutubeStream(streamInfo, res) {
try {
const req = await fetch(streamInfo.url, {
headers: getHeaders('youtube'),
method: 'HEAD',
dispatcher: streamInfo.dispatcher,
signal: streamInfo.controller.signal
});
streamInfo.url = req.url;
const size = BigInt(req.headers.get('content-length'));
if (req.status !== 200 || !size)
return res.destroy();
const stream = chunkedStream(streamInfo, size);
for (const headerName of ['content-type', 'content-length']) {
const headerValue = req.headers.get(headerName);
if (headerValue) res.setHeader(headerName, headerValue);
}
stream.pipe(res);
stream.on('error', () => res.destroy());
} catch {
res.destroy();
}
}
export async function internalStream(streamInfo, res) {
if (streamInfo.service === 'youtube') {
return handleYoutubeStream(streamInfo, res);
}
try {
const req = await request(streamInfo.url, {
headers: {
...streamInfo.headers,
host: undefined
},
dispatcher: streamInfo.dispatcher,
signal: streamInfo.controller.signal,
maxRedirections: 16
});
res.status(req.statusCode);
for (const [ name, value ] of Object.entries(req.headers))
res.setHeader(name, value)
if (req.statusCode < 200 || req.statusCode > 299)
return res.destroy();
req.body.pipe(res);
req.body.on('error', () => res.destroy());
} catch {
streamInfo.controller.abort();
}
}

View File

@ -3,7 +3,13 @@ import { randomBytes } from "crypto";
import { nanoid } from 'nanoid';
import { decryptStream, encryptStream, generateHmac } from "../sub/crypto.js";
import { streamLifespan } from "../config.js";
import { streamLifespan, env } from "../config.js";
import { strict as assert } from "assert";
// optional dependency
const freebind = env.freebindCIDR && await import('freebind').catch(() => {});
const M3U_SERVICES = ['dailymotion', 'vimeo', 'rutube'];
const streamNoAccess = {
error: "i couldn't verify if you have access to this stream. go back and try again!",
@ -24,6 +30,7 @@ streamCache.on("expired", (key) => {
streamCache.del(key);
})
const internalStreamCache = {};
const hmacSalt = randomBytes(64).toString('hex');
export function createStream(obj) {
@ -42,7 +49,8 @@ export function createStream(obj) {
isAudioOnly: !!obj.isAudioOnly,
copy: !!obj.copy,
mute: !!obj.mute,
metadata: obj.fileMetadata || false
metadata: obj.fileMetadata || false,
requestIP: obj.requestIP
};
streamCache.set(
@ -50,7 +58,7 @@ export function createStream(obj) {
encryptStream(streamData, iv, secret)
)
let streamLink = new URL('/api/stream', process.env.API_URL);
let streamLink = new URL('/api/stream', env.apiURL);
const params = {
't': streamID,
@ -67,6 +75,67 @@ export function createStream(obj) {
return streamLink.toString();
}
export function getInternalStream(id) {
return internalStreamCache[id];
}
export function createInternalStream(url, obj = {}) {
assert(typeof url === 'string');
let dispatcher;
if (obj.requestIP) {
dispatcher = freebind?.dispatcherFromIP(obj.requestIP, { strict: false })
}
const streamID = nanoid();
internalStreamCache[streamID] = {
url,
service: obj.service,
controller: new AbortController(),
dispatcher
};
let streamLink = new URL('/api/istream', `http://127.0.0.1:${env.apiPort}`);
streamLink.searchParams.set('t', streamID);
return streamLink.toString();
}
export function destroyInternalStream(url) {
url = new URL(url);
if (url.hostname !== '127.0.0.1') {
return;
}
const id = url.searchParams.get('t');
if (internalStreamCache[id]) {
internalStreamCache[id].controller.abort();
delete internalStreamCache[id];
}
}
function wrapStream(streamInfo) {
/* m3u8 links are currently not supported
* for internal streams, skip them */
if (M3U_SERVICES.includes(streamInfo.service)) {
return streamInfo;
}
const url = streamInfo.urls;
if (typeof url === 'string') {
streamInfo.urls = createInternalStream(url, streamInfo);
} else if (Array.isArray(url)) {
for (const idx in streamInfo.urls) {
streamInfo.urls[idx] = createInternalStream(
streamInfo.urls[idx], streamInfo
);
}
} else throw 'invalid urls';
return streamInfo;
}
export function verifyStream(id, hmac, exp, secret, iv) {
try {
const ghmac = generateHmac(`${id},${exp},${iv},${secret}`, hmacSalt);
@ -82,9 +151,9 @@ export function verifyStream(id, hmac, exp, secret, iv) {
if (Number(exp) <= new Date().getTime())
return streamNoExist;
return streamInfo;
return wrapStream(streamInfo);
}
catch (e) {
catch {
return {
error: "something went wrong and i couldn't verify this stream. go back and try again!",
status: 500

View File

@ -0,0 +1,21 @@
import { genericUserAgent } from "../config.js";
const defaultHeaders = {
'user-agent': genericUserAgent
}
const serviceHeaders = {
bilibili: {
referer: 'https://www.bilibili.com/'
},
youtube: {
accept: '*/*',
origin: 'https://www.youtube.com',
referer: 'https://www.youtube.com',
DNT: '?1'
}
}
export function getHeaders(service) {
return { ...defaultHeaders, ...serviceHeaders[service] }
}

View File

@ -1,4 +1,5 @@
import { streamAudioOnly, streamDefault, streamLiveRender, streamVideoOnly, convertToGif } from "./types.js";
import { internalStream } from './internal.js';
export default async function(res, streamInfo) {
try {
@ -7,6 +8,8 @@ export default async function(res, streamInfo) {
return;
}
switch (streamInfo.type) {
case "internal":
return await internalStream(streamInfo, res);
case "render":
await streamLiveRender(streamInfo, res);
break;
@ -21,7 +24,7 @@ export default async function(res, streamInfo) {
await streamDefault(streamInfo, res);
break;
}
} catch (e) {
} catch {
res.status(500).json({ status: "error", text: "Internal Server Error" });
}
}

View File

@ -1,10 +1,19 @@
import { spawn } from "child_process";
import ffmpeg from "ffmpeg-static";
import { ffmpegArgs, genericUserAgent } from "../config.js";
import { metadataManager } from "../sub/utils.js";
import { request } from "undici";
import ffmpeg from "ffmpeg-static";
import { spawn } from "child_process";
import { create as contentDisposition } from "content-disposition-header";
import { metadataManager } from "../sub/utils.js";
import { destroyInternalStream } from "./manage.js";
import { env, ffmpegArgs } from "../config.js";
import { getHeaders } from "./shared.js";
function toRawHeaders(headers) {
return Object.entries(headers)
.map(([key, value]) => `${key}: ${value}\r\n`)
.join('');
}
function closeRequest(controller) {
try { controller.abort() } catch {}
}
@ -35,15 +44,19 @@ function pipe(from, to, done) {
}
function getCommand(args) {
if (process.env.PROCESSING_PRIORITY && process.platform !== "win32") {
return ['nice', ['-n', process.env.PROCESSING_PRIORITY, ffmpeg, ...args]]
if (!isNaN(env.processingPriority)) {
return ['nice', ['-n', env.processingPriority.toString(), ffmpeg, ...args]]
}
return [ffmpeg, args]
}
export async function streamDefault(streamInfo, res) {
const abortController = new AbortController();
const shutdown = () => (closeRequest(abortController), closeResponse(res));
const shutdown = () => (
closeRequest(abortController),
closeResponse(res),
destroyInternalStream(streamInfo.urls)
);
try {
let filename = streamInfo.filename;
@ -53,13 +66,16 @@ export async function streamDefault(streamInfo, res) {
res.setHeader('Content-disposition', contentDisposition(filename));
const { body: stream, headers } = await request(streamInfo.urls, {
headers: { 'user-agent': genericUserAgent },
headers: getHeaders(streamInfo.service),
signal: abortController.signal,
maxRedirections: 16
});
res.setHeader('content-type', headers['content-type']);
res.setHeader('content-length', headers['content-length']);
for (const headerName of ['content-type', 'content-length']) {
if (headers[headerName]) {
res.setHeader(headerName, headers[headerName]);
}
}
pipe(stream, res, shutdown);
} catch {
@ -67,68 +83,53 @@ export async function streamDefault(streamInfo, res) {
}
}
export async function streamLiveRender(streamInfo, res) {
let abortController = new AbortController(), process;
export function streamLiveRender(streamInfo, res) {
let process;
const shutdown = () => (
closeRequest(abortController),
killProcess(process),
closeResponse(res)
closeResponse(res),
streamInfo.urls.map(destroyInternalStream)
);
const headers = getHeaders(streamInfo.service);
const rawHeaders = toRawHeaders(headers);
try {
if (streamInfo.urls.length !== 2) return shutdown();
const { body: audio } = await request(streamInfo.urls[1], {
maxRedirections: 16, signal: abortController.signal,
headers: {
'user-agent': genericUserAgent,
referer: streamInfo.service === 'bilibili'
? 'https://www.bilibili.com/'
: undefined,
}
});
const format = streamInfo.filename.split('.')[streamInfo.filename.split('.').length - 1];
let args = [
'-loglevel', '-8',
'-user_agent', genericUserAgent
];
if (streamInfo.service === 'bilibili') {
args.push(
'-headers', 'Referer: https://www.bilibili.com/\r\n',
)
}
args.push(
'-headers', rawHeaders,
'-i', streamInfo.urls[0],
'-i', 'pipe:3',
'-headers', rawHeaders,
'-i', streamInfo.urls[1],
'-map', '0:v',
'-map', '1:a',
);
]
args = args.concat(ffmpegArgs[format]);
if (streamInfo.metadata) {
args = args.concat(metadataManager(streamInfo.metadata))
}
args.push('-f', format, 'pipe:4');
args.push('-f', format, 'pipe:3');
process = spawn(...getCommand(args), {
windowsHide: true,
stdio: [
'inherit', 'inherit', 'inherit',
'pipe', 'pipe'
'pipe'
],
});
const [,,, audioInput, muxOutput] = process.stdio;
const [,,, muxOutput] = process.stdio;
res.setHeader('Connection', 'keep-alive');
res.setHeader('Content-Disposition', contentDisposition(streamInfo.filename));
audio.on('error', shutdown);
audioInput.on('error', shutdown);
audio.pipe(audioInput);
pipe(muxOutput, res, shutdown);
process.on('close', shutdown);
@ -140,18 +141,20 @@ export async function streamLiveRender(streamInfo, res) {
export function streamAudioOnly(streamInfo, res) {
let process;
const shutdown = () => (killProcess(process), closeResponse(res));
const shutdown = () => (
killProcess(process),
closeResponse(res),
destroyInternalStream(streamInfo.urls)
);
try {
let args = [
'-loglevel', '-8',
'-user_agent', genericUserAgent
];
'-headers', toRawHeaders(getHeaders(streamInfo.service)),
]
if (streamInfo.service === "twitter") {
args.push('-seekable', '0');
} else if (streamInfo.service === 'bilibili') {
args.push('-headers', 'Referer: https://www.bilibili.com/\r\n');
}
args.push(
@ -162,12 +165,12 @@ export function streamAudioOnly(streamInfo, res) {
if (streamInfo.metadata) {
args = args.concat(metadataManager(streamInfo.metadata))
}
let arg = streamInfo.copy ? ffmpegArgs["copy"] : ffmpegArgs["audio"];
args = args.concat(arg);
args = args.concat(ffmpegArgs[streamInfo.copy ? 'copy' : 'audio']);
if (ffmpegArgs[streamInfo.audioFormat]) {
args = args.concat(ffmpegArgs[streamInfo.audioFormat])
}
args.push('-f', streamInfo.audioFormat === "m4a" ? "ipod" : streamInfo.audioFormat, 'pipe:3');
process = spawn(...getCommand(args), {
@ -192,17 +195,20 @@ export function streamAudioOnly(streamInfo, res) {
export function streamVideoOnly(streamInfo, res) {
let process;
const shutdown = () => (killProcess(process), closeResponse(res));
const shutdown = () => (
killProcess(process),
closeResponse(res),
destroyInternalStream(streamInfo.urls)
);
try {
let args = [
'-loglevel', '-8'
'-loglevel', '-8',
'-headers', toRawHeaders(getHeaders(streamInfo.service)),
]
if (streamInfo.service === "twitter") {
args.push('-seekable', '0')
} else if (streamInfo.service === 'bilibili') {
args.push('-headers', 'Referer: https://www.bilibili.com/\r\n')
}
args.push(
@ -222,6 +228,7 @@ export function streamVideoOnly(streamInfo, res) {
if (format === "mp4") {
args.push('-movflags', 'faststart+frag_keyframe+empty_moov')
}
args.push('-f', format, 'pipe:3');
process = spawn(...getCommand(args), {
@ -254,10 +261,12 @@ export function convertToGif(streamInfo, res) {
let args = [
'-loglevel', '-8'
]
if (streamInfo.service === "twitter") {
args.push('-seekable', '0')
}
args.push('-i', streamInfo.urls)
args.push('-i', streamInfo.urls);
args = args.concat(ffmpegArgs["gif"]);
args.push('-f', "gif", 'pipe:3');

View File

@ -1,4 +1,4 @@
import { createHmac, createCipheriv, createDecipheriv, scryptSync } from "crypto";
import { createHmac, createCipheriv, createDecipheriv } from "crypto";
const algorithm = "aes256"

View File

@ -9,7 +9,15 @@ const apiVar = {
aFormat: ["best", "mp3", "ogg", "wav", "opus"],
filenamePattern: ["classic", "pretty", "basic", "nerdy"]
},
booleanOnly: ["isAudioOnly", "isTTFullAudio", "isAudioMuted", "dubLang", "vimeoDash", "disableMetadata", "twitterGif"]
booleanOnly: [
"isAudioOnly",
"isTTFullAudio",
"isAudioMuted",
"dubLang",
"disableMetadata",
"twitterGif",
"tiktokH265"
]
}
const forbiddenCharsString = ['}', '{', '%', '>', '<', '^', ';', '`', '$', '"', "@", '='];
@ -83,8 +91,8 @@ export function checkJSONPost(obj) {
isAudioMuted: false,
disableMetadata: false,
dubLang: false,
vimeoDash: false,
twitterGif: false
twitterGif: false,
tiktokH265: false
}
try {
let objKeys = Object.keys(obj);

View File

@ -878,6 +878,30 @@
"code": 200,
"status": "redirect"
}
}, {
"name": "ddinstagram link",
"url": "https://ddinstagram.com/p/CmCVWoIr9OH/",
"params": {},
"expected": {
"code": 200,
"status": "redirect"
}
}, {
"name": "d.ddinstagram.com link",
"url": "https://d.ddinstagram.com/p/CmCVWoIr9OH/",
"params": {},
"expected": {
"code": 200,
"status": "redirect"
}
}, {
"name": "g.ddinstagram.com link",
"url": "https://g.ddinstagram.com/p/CmCVWoIr9OH/",
"params": {},
"expected": {
"code": 200,
"status": "redirect"
}
}],
"vine": [{
"name": "regular vine link (9+10=21)",
@ -952,6 +976,38 @@
"code": 200,
"status": "redirect"
}
}, {
"name": "regular picture",
"url": "https://www.pinterest.com/pin/412994228343400946/",
"params": {},
"expected": {
"code": 200,
"status": "redirect"
}
}, {
"name": "regular picture (.ca TLD)",
"url": "https://www.pinterest.ca/pin/412994228343400946/",
"params": {},
"expected": {
"code": 200,
"status": "redirect"
}
}, {
"name": "regular gif",
"url": "https://www.pinterest.com/pin/814447913881127862/",
"params": {},
"expected": {
"code": 200,
"status": "redirect"
}
}, {
"name": "regular gif (.ca TLD)",
"url": "https://www.pinterest.ca/pin/814447913881127862/",
"params": {},
"expected": {
"code": 200,
"status": "redirect"
}
}],
"streamable": [{
"name": "regular video",
@ -1061,6 +1117,22 @@
"code": 200,
"status": "stream"
}
}, {
"name": "yappy",
"url": "https://rutube.ru/yappy/f1771e86294748eea8ecb2ac88e55740/",
"params": {},
"expected": {
"code": 200,
"status": "stream"
}
}, {
"name": "shorts",
"url": "https://rutube.ru/shorts/935c1afafd0e7d52836d671967d53dac/",
"params": {},
"expected": {
"code": 200,
"status": "stream"
}
}, {
"name": "vertical video (isAudioOnly)",
"url": "https://rutube.ru/video/18a281399b96f9184c647455a86f6724/",