discord-player 6.0.0-dev.2 → 6.0.0-dev.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/utils/AudioFilters.ts","../src/extractors/BaseExtractor.ts","../src/extractors/ExtractorExecutionContext.ts","../src/Structures/Playlist.ts","../src/Player.ts","../src/Structures/Queue.ts","../src/Structures/Track.ts","../src/types/types.ts","../src/utils/Util.ts","../src/Structures/PlayerError.ts","../src/utils/FFmpegStream.ts","../src/utils/QueryResolver.ts","../src/VoiceInterface/VoiceUtils.ts","../src/VoiceInterface/StreamDispatcher.ts","../src/Structures/SearchResult.ts","../src/Structures/GuildQueue/GuildNodeManager.ts","../src/Structures/GuildQueue/GuildQueue.ts","../src/Structures/GuildQueue/GuildQueueHistory.ts","../src/Structures/GuildQueue/GuildQueuePlayerNode.ts","../src/Structures/GuildQueue/GuildQueueAudioFilters.ts"],"sourcesContent":["import { version as djsVersion } from 'discord.js';\n\nexport * from './utils/AudioFilters';\nexport * from './extractors/BaseExtractor';\nexport * from './extractors/ExtractorExecutionContext';\nexport * from './Structures/Playlist';\nexport * from './Player';\nexport * from './Structures/PlayerError';\nexport * from './utils/QueryResolver';\nexport * from './Structures/Queue';\nexport * from './Structures/Track';\nexport * from './VoiceInterface/VoiceUtils';\nexport * from './VoiceInterface/StreamDispatcher';\nexport * from './utils/Util';\nexport * from './types/types';\nexport * from './utils/FFmpegStream';\nexport * from './Structures/GuildQueue';\nexport {\n AudioFilters as PCMAudioFilters,\n BiquadFilters,\n FilterType as BiquadFilterType,\n PCMFilters,\n Q_BUTTERWORTH,\n VolumeTransformer,\n BASS_EQ_BANDS,\n AF_NIGHTCORE_RATE,\n AF_VAPORWAVE_RATE,\n FiltersChain\n} from '@discord-player/equalizer';\n\n// eslint-disable-next-line @typescript-eslint/no-inferrable-types\nexport const version: string = '5.4.0';\n\nif (!djsVersion.startsWith('14')) {\n process.emitWarning(`Discord.js v${djsVersion} is incompatible with Discord Player v${version}! Please use >=v14.x of Discord.js`);\n}\n","import { FiltersName } from '../types/types';\n\nconst bass = (g: number) => `bass=g=${g}:f=110:w=0.3`;\n\nclass AudioFilters {\n public constructor() {\n return AudioFilters;\n }\n\n public static filters: Record<FiltersName, string> = {\n bassboost_low: bass(15),\n bassboost: bass(20),\n bassboost_high: bass(30),\n '8D': 'apulsator=hz=0.09',\n vaporwave: 'aresample=48000,asetrate=48000*0.8',\n nightcore: 'aresample=48000,asetrate=48000*1.25',\n phaser: 'aphaser=in_gain=0.4',\n tremolo: 'tremolo',\n vibrato: 'vibrato=f=6.5',\n reverse: 'areverse',\n treble: 'treble=g=5',\n normalizer2: 'dynaudnorm=g=101',\n normalizer: 'acompressor',\n surrounding: 'surround',\n pulsator: 'apulsator=hz=1',\n subboost: 'asubboost',\n karaoke: 'stereotools=mlev=0.03',\n flanger: 'flanger',\n gate: 'agate',\n haas: 'haas',\n mcompand: 'mcompand',\n mono: 'pan=mono|c0=.5*c0+.5*c1',\n mstlr: 'stereotools=mode=ms>lr',\n mstrr: 'stereotools=mode=ms>rr',\n compressor: 'compand=points=-80/-105|-62/-80|-15.4/-15.4|0/-12|20/-7.6',\n expander: 'compand=attacks=0:points=-80/-169|-54/-80|-49.5/-64.6|-41.1/-41.1|-25.8/-15|-10.8/-4.5|0/0|20/8.3',\n softlimiter: 'compand=attacks=0:points=-80/-80|-12.4/-12.4|-6/-8|0/-6.8|20/-2.8',\n chorus: 'chorus=0.7:0.9:55:0.4:0.25:2',\n chorus2d: 'chorus=0.6:0.9:50|60:0.4|0.32:0.25|0.4:2|1.3',\n chorus3d: 'chorus=0.5:0.9:50|60|40:0.4|0.32|0.3:0.25|0.4|0.3:2|2.3|1.3',\n fadein: 'afade=t=in:ss=0:d=10',\n dim: `afftfilt=\"'real=re * (1-clip((b/nb)*b,0,1))':imag='im * (1-clip((b/nb)*b,0,1))'\"`,\n earrape: 'channelsplit,sidechaingate=level_in=64'\n };\n\n public static get<K extends FiltersName>(name: K) {\n return this.filters[name];\n }\n\n public static has<K extends FiltersName>(name: K) {\n return name in this.filters;\n }\n\n public static *[Symbol.iterator](): IterableIterator<{ name: FiltersName; value: string }> {\n for (const [k, v] of Object.entries(this.filters)) {\n yield { name: k as FiltersName, value: v as string };\n }\n }\n\n public static get names() {\n return Object.keys(this.filters) as FiltersName[];\n }\n\n // @ts-expect-error AudioFilters.length\n public static get length() {\n return this.names.length;\n }\n\n public static toString() {\n return this.names.map((m) => (this as any)[m]).join(','); // eslint-disable-line @typescript-eslint/no-explicit-any\n }\n\n /**\n * Create ffmpeg args from the specified filters name\n * @param filter The filter name\n * @returns\n */\n public static create<K extends FiltersName>(filters?: K[]) {\n if (!filters || !Array.isArray(filters)) return this.toString();\n return filters\n .filter((predicate) => typeof predicate === 'string')\n .map((m) => this.get(m))\n .join(',');\n }\n\n /**\n * Defines audio filter\n * @param filterName The name of the filter\n * @param value The ffmpeg args\n */\n public static define(filterName: string, value: string) {\n this.filters[filterName as FiltersName] = value;\n }\n\n /**\n * Defines multiple audio filters\n * @param filtersArray Array of filters containing the filter name and ffmpeg args\n */\n public static defineBulk(filtersArray: { name: string; value: string }[]) {\n filtersArray.forEach((arr) => this.define(arr.name, arr.value));\n }\n}\n\nexport default AudioFilters;\nexport { AudioFilters };\n","import { User } from 'discord.js';\nimport { Readable } from 'stream';\nimport { Playlist } from '../Structures/Playlist';\nimport { Track } from '../Structures/Track';\nimport { PlayerEvents, SearchQueryType } from '../types/types';\nimport { ExtractorExecutionContext } from './ExtractorExecutionContext';\n\nexport class BaseExtractor {\n /**\n * Identifier for this extractor\n */\n public static identifier = 'com.discord-player.extractor';\n\n /**\n * Extractor constructor\n * @param context Context that instantiated this extractor\n */\n public constructor(public context: ExtractorExecutionContext) {}\n\n /**\n * Identifier of this extractor\n */\n public get identifier() {\n return (this.constructor as typeof BaseExtractor).identifier;\n }\n\n /**\n * This method will be executed when this extractor is activated\n */\n public async activate() {\n // executed when this extractor is activated\n return;\n }\n\n /**\n * This method will be executed when this extractor is deactivated\n */\n public async deactivate() {\n // executed when this extractor is deactivated\n return;\n }\n\n /**\n * Validate incoming query\n * @param query The query to validate\n */\n public async validate(query: string, type?: SearchQueryType | null): Promise<boolean> {\n void type;\n return false;\n }\n\n /**\n * Stream the given track\n * @param info The track to stream\n */\n public async stream(info: Track): Promise<Readable | string> {\n void info;\n throw new Error('Not Implemented');\n }\n\n /**\n * Handle the given query\n * @param query The query to handle\n */\n public async handle(query: string, context: ExtractorSearchContext): Promise<ExtractorInfo> {\n void context;\n throw new Error('Not Implemented');\n }\n\n /**\n * A stream middleware to handle streams before passing it to the player\n * @param stream The incoming stream\n * @param next The next function\n */\n public handlePostStream(stream: Readable, next: NextFunction) {\n return next(null, stream);\n }\n\n /**\n * Dispatch an event to the player\n * @param event The event to dispatch\n * @param args The data to dispatch\n */\n public emit<K extends keyof PlayerEvents>(event: K, ...args: Parameters<PlayerEvents[K]>) {\n return this.context.player.emit(event, ...args);\n }\n}\n\nexport type NextFunction = (error?: Error | null, stream?: Readable) => void;\n\nexport interface ExtractorInfo {\n playlist: Playlist | null;\n tracks: Track[];\n}\n\nexport interface ExtractorSearchContext {\n type?: SearchQueryType | null;\n requestedBy?: User | null;\n}\n","import { Player } from '../Player';\nimport { Collection } from '@discord-player/utils';\nimport { BaseExtractor } from './BaseExtractor';\n\nexport class ExtractorExecutionContext {\n public store = new Collection<string, BaseExtractor>();\n public constructor(public player: Player) {}\n\n public isRegistered(identifier: string) {\n return this.store.has(identifier);\n }\n\n public get size() {\n return this.store.size;\n }\n\n public get(identifier: string) {\n return this.store.get(identifier);\n }\n\n public async register(_extractor: typeof BaseExtractor) {\n if (typeof _extractor.identifier !== 'string' || this.store.has(_extractor.identifier)) return;\n const extractor = new _extractor(this);\n\n try {\n this.store.set(_extractor.identifier, extractor);\n await extractor.activate();\n } catch {\n this.store.delete(_extractor.identifier);\n }\n }\n\n public async unregister<K extends string | BaseExtractor>(_extractor: K) {\n const extractor = typeof _extractor === 'string' ? this.store.get(_extractor) : this.store.find((r) => r === _extractor);\n if (!extractor) return;\n\n try {\n const key = extractor.identifier || this.store.findKey((e) => e === extractor)!;\n this.store.delete(key);\n await extractor.deactivate();\n } catch {\n // do nothing\n }\n }\n\n public async unregisterAll() {\n try {\n await Promise.all(\n this.store.map((e, k) => {\n this.store.delete(k);\n return e.deactivate();\n })\n );\n } catch {\n // do nothing\n }\n }\n\n public async run<T = unknown>(fn: ExtractorExecutionFN<T>) {\n for (const ext of this.store.values()) {\n const result = await fn(ext).catch(() => {\n return false;\n });\n if (result)\n return {\n extractor: ext,\n result\n } as ExtractorExecutionResult<T>;\n }\n\n return null;\n }\n}\n\nexport interface ExtractorExecutionResult<T = unknown> {\n extractor: BaseExtractor;\n result: T;\n}\nexport type ExtractorExecutionFN<T = unknown> = (extractor: BaseExtractor) => Promise<T | boolean>;\n","import { Player } from '../Player';\nimport { Track } from './Track';\nimport { PlaylistInitData, PlaylistJSON, TrackJSON, TrackSource } from '../types/types';\n\nclass Playlist {\n public readonly player: Player;\n public tracks: Track[];\n public title: string;\n public description: string;\n public thumbnail: string;\n public type: 'album' | 'playlist';\n public source: TrackSource;\n public author: {\n name: string;\n url: string;\n };\n public id: string;\n public url: string;\n public readonly rawPlaylist?: any; // eslint-disable-line @typescript-eslint/no-explicit-any\n\n /**\n * Playlist constructor\n * @param {Player} player The player\n * @param {PlaylistInitData} data The data\n */\n constructor(player: Player, data: PlaylistInitData) {\n /**\n * The player\n * @name Playlist#player\n * @type {Player}\n * @readonly\n */\n this.player = player;\n\n /**\n * The tracks in this playlist\n * @name Playlist#tracks\n * @type {Track[]}\n */\n this.tracks = data.tracks ?? [];\n\n /**\n * The author of this playlist\n * @name Playlist#author\n * @type {object}\n */\n this.author = data.author;\n\n /**\n * The description\n * @name Playlist#description\n * @type {string}\n */\n this.description = data.description;\n\n /**\n * The thumbnail of this playlist\n * @name Playlist#thumbnail\n * @type {string}\n */\n this.thumbnail = data.thumbnail;\n\n /**\n * The playlist type:\n * - `album`\n * - `playlist`\n * @name Playlist#type\n * @type {string}\n */\n this.type = data.type;\n\n /**\n * The source of this playlist:\n * - `youtube`\n * - `soundcloud`\n * - `spotify`\n * - `arbitrary`\n * @name Playlist#source\n * @type {string}\n */\n this.source = data.source;\n\n /**\n * The playlist id\n * @name Playlist#id\n * @type {string}\n */\n this.id = data.id;\n\n /**\n * The playlist url\n * @name Playlist#url\n * @type {string}\n */\n this.url = data.url;\n\n /**\n * The playlist title\n * @type {string}\n */\n this.title = data.title;\n\n /**\n * @name Playlist#rawPlaylist\n * @type {any}\n * @readonly\n */\n }\n\n *[Symbol.iterator]() {\n yield* this.tracks;\n }\n\n /**\n * JSON representation of this playlist\n * @param {boolean} [withTracks=true] If it should build json with tracks\n * @returns {PlaylistJSON}\n */\n toJSON(withTracks = true) {\n const payload = {\n id: this.id,\n url: this.url,\n title: this.title,\n description: this.description,\n thumbnail: this.thumbnail,\n type: this.type,\n source: this.source,\n author: this.author,\n tracks: [] as TrackJSON[]\n };\n\n if (withTracks) payload.tracks = this.tracks.map((m) => m.toJSON(true));\n\n return payload as PlaylistJSON;\n }\n}\n\nexport { Playlist };\n","import { Client, GuildResolvable, Snowflake, VoiceState, IntentsBitField, User, ChannelType, GuildVoiceChannelResolvable } from 'discord.js';\nimport { EventEmitter } from '@discord-player/utils';\nimport { Queue } from './Structures/Queue';\nimport { VoiceUtils } from './VoiceInterface/VoiceUtils';\nimport { PlayerEvents, PlayerOptions, QueryType, SearchOptions, PlayerInitOptions, PlaylistInitData, SearchQueryType } from './types/types';\nimport { Track } from './Structures/Track';\nimport { QueryResolver } from './utils/QueryResolver';\nimport { Util } from './utils/Util';\nimport { PlayerError, ErrorStatusCode } from './Structures/PlayerError';\nimport { Playlist } from './Structures/Playlist';\nimport { generateDependencyReport } from '@discordjs/voice';\nimport { ExtractorExecutionContext } from './extractors/ExtractorExecutionContext';\nimport { Collection } from '@discord-player/utils';\nimport { BaseExtractor } from './extractors/BaseExtractor';\nimport { SearchResult } from './Structures/SearchResult';\nimport { GuildNodeCreateOptions, GuildNodeManager } from './Structures/GuildQueue/GuildNodeManager';\nimport { GuildQueueEvents, VoiceConnectConfig } from './Structures/GuildQueue';\n\nclass Player extends EventEmitter<PlayerEvents> {\n public readonly client: Client;\n public readonly options: PlayerInitOptions = {\n autoRegisterExtractor: true,\n lockVoiceStateHandler: false,\n blockExtractors: [],\n ytdlOptions: {\n highWaterMark: 1 << 25\n },\n connectionTimeout: 20000,\n smoothVolume: true,\n lagMonitor: 30000\n };\n /**\n * @deprecated\n */\n public readonly queues = new Collection<Snowflake, Queue>();\n public nodes = new GuildNodeManager(this);\n public readonly voiceUtils = new VoiceUtils();\n public requiredEvents = ['error', 'connectionError'] as string[];\n public extractors = new ExtractorExecutionContext(this);\n public events = new EventEmitter<GuildQueueEvents>();\n #lastLatency = -1;\n\n /**\n * Creates new Discord Player\n * @param {Client} client The Discord Client\n * @param {PlayerInitOptions} [options] The player init options\n */\n constructor(client: Client, options: PlayerInitOptions = {}) {\n super();\n\n /**\n * The discord.js client\n * @type {Client}\n */\n this.client = client;\n\n if (this.client?.options?.intents && !new IntentsBitField(this.client?.options?.intents).has(IntentsBitField.Flags.GuildVoiceStates)) {\n throw new PlayerError('client is missing \"GuildVoiceStates\" intent');\n }\n\n /**\n * The extractors collection\n * @type {ExtractorModel}\n */\n this.options = Object.assign(this.options, options);\n\n this.client.on('voiceStateUpdate', this.handleVoiceState.bind(this));\n\n if (this.options?.autoRegisterExtractor) {\n let nv: any; // eslint-disable-line @typescript-eslint/no-explicit-any\n\n if ((nv = Util.require('@discord-player/extractor'))) {\n ['YouTubeExtractor', 'SoundCloudExtractor', 'ReverbnationExtractor', 'VimeoExtractor', 'AttachmentExtractor'].forEach((ext) => void this.extractors.register(nv[ext]));\n }\n }\n\n if (typeof this.options.lagMonitor === 'number' && this.options.lagMonitor > 0) {\n setInterval(() => {\n const start = performance.now();\n setTimeout(() => {\n this.#lastLatency = performance.now() - start;\n }, 0).unref();\n }, this.options.lagMonitor).unref();\n }\n }\n\n /**\n * Event loop lag\n * @type {number}\n */\n get eventLoopLag() {\n return this.#lastLatency;\n }\n\n /**\n * Generates statistics\n */\n generateStatistics() {\n return this.queues.map((m) => m.generateStatistics());\n }\n\n private _handleVoiceStateLegacy(oldState: VoiceState, newState: VoiceState) {\n const queue = this.getQueue(oldState.guild.id);\n if (!queue || !queue.connection) return;\n\n // dispatch voice state update\n const wasHandled = this.emit('voiceStateUpdate', queue, oldState, newState);\n // if the event was handled, return assuming the listener implemented all of the logic below\n if (wasHandled && !this.options.lockVoiceStateHandler) return;\n\n if (oldState.channelId && !newState.channelId && newState.member!.id === newState.guild.members.me!.id) {\n try {\n queue.destroy();\n } catch {\n /* noop */\n }\n return void this.emit('botDisconnect', queue);\n }\n\n if (!oldState.channelId && newState.channelId && newState.member!.id === newState.guild.members.me!.id) {\n if (newState.serverMute != null && oldState.serverMute !== newState.serverMute) {\n queue.setPaused(newState.serverMute);\n } else if (newState.channel?.type === ChannelType.GuildStageVoice && newState.suppress != null && oldState.suppress !== newState.suppress) {\n queue.setPaused(newState.suppress);\n if (newState.suppress) {\n newState.guild.members.me!.voice.setRequestToSpeak(true).catch(Util.noop);\n }\n }\n }\n\n if (!newState.channelId && oldState.channelId === queue.connection.channel.id) {\n if (!Util.isVoiceEmpty(queue.connection.channel)) return;\n const timeout = setTimeout(() => {\n if (!Util.isVoiceEmpty(queue.connection.channel)) return;\n if (!this.queues.has(queue.guild.id)) return;\n if (queue.options.leaveOnEmpty) queue.destroy(true);\n this.emit('channelEmpty', queue);\n }, queue.options.leaveOnEmptyCooldown || 0).unref();\n queue._cooldownsTimeout.set(`empty_${oldState.guild.id}`, timeout);\n }\n\n if (newState.channelId && newState.channelId === queue.connection.channel.id) {\n const emptyTimeout = queue._cooldownsTimeout.get(`empty_${oldState.guild.id}`);\n const channelEmpty = Util.isVoiceEmpty(queue.connection.channel);\n if (!channelEmpty && emptyTimeout) {\n clearTimeout(emptyTimeout);\n queue._cooldownsTimeout.delete(`empty_${oldState.guild.id}`);\n }\n }\n\n if (oldState.channelId && newState.channelId && oldState.channelId !== newState.channelId) {\n if (newState.member!.id === newState.guild.members.me!.id) {\n if (queue.connection && newState.member!.id === newState.guild.members.me!.id) queue.connection.channel = newState.channel!;\n const emptyTimeout = queue._cooldownsTimeout.get(`empty_${oldState.guild.id}`);\n const channelEmpty = Util.isVoiceEmpty(queue.connection.channel);\n if (!channelEmpty && emptyTimeout) {\n clearTimeout(emptyTimeout);\n queue._cooldownsTimeout.delete(`empty_${oldState.guild.id}`);\n } else {\n const timeout = setTimeout(() => {\n if (queue.connection && !Util.isVoiceEmpty(queue.connection.channel)) return;\n if (!this.queues.has(queue.guild.id)) return;\n if (queue.options.leaveOnEmpty) queue.destroy(true);\n this.emit('channelEmpty', queue);\n }, queue.options.leaveOnEmptyCooldown || 0).unref();\n queue._cooldownsTimeout.set(`empty_${oldState.guild.id}`, timeout);\n }\n } else {\n if (newState.channelId !== queue.connection.channel.id) {\n if (!Util.isVoiceEmpty(queue.connection.channel)) return;\n if (queue._cooldownsTimeout.has(`empty_${oldState.guild.id}`)) return;\n const timeout = setTimeout(() => {\n if (!Util.isVoiceEmpty(queue.connection.channel)) return;\n if (!this.queues.has(queue.guild.id)) return;\n if (queue.options.leaveOnEmpty) queue.destroy(true);\n this.emit('channelEmpty', queue);\n }, queue.options.leaveOnEmptyCooldown || 0).unref();\n queue._cooldownsTimeout.set(`empty_${oldState.guild.id}`, timeout);\n } else {\n const emptyTimeout = queue._cooldownsTimeout.get(`empty_${oldState.guild.id}`);\n const channelEmpty = Util.isVoiceEmpty(queue.connection.channel);\n if (!channelEmpty && emptyTimeout) {\n clearTimeout(emptyTimeout);\n queue._cooldownsTimeout.delete(`empty_${oldState.guild.id}`);\n }\n }\n }\n }\n }\n\n private _handleVoiceState(oldState: VoiceState, newState: VoiceState) {\n const queue = this.nodes.get(oldState.guild.id);\n if (!queue || !queue.connection || !queue.channel) return;\n\n // dispatch voice state update\n const wasHandled = this.events.emit('voiceStateUpdate', queue, oldState, newState);\n // if the event was handled, return assuming the listener implemented all of the logic below\n if (wasHandled && !this.options.lockVoiceStateHandler) return;\n\n if (oldState.channelId && !newState.channelId && newState.member!.id === newState.guild.members.me!.id) {\n try {\n queue.delete();\n } catch {\n /* noop */\n }\n return void this.events.emit('disconnect', queue);\n }\n\n if (!oldState.channelId && newState.channelId && newState.member!.id === newState.guild.members.me!.id) {\n if (newState.serverMute != null && oldState.serverMute !== newState.serverMute) {\n queue.node.setPaused(newState.serverMute);\n } else if (newState.channel?.type === ChannelType.GuildStageVoice && newState.suppress != null && oldState.suppress !== newState.suppress) {\n queue.node.setPaused(newState.suppress);\n if (newState.suppress) {\n newState.guild.members.me!.voice.setRequestToSpeak(true).catch(Util.noop);\n }\n }\n }\n\n if (!newState.channelId && oldState.channelId === queue.channel.id) {\n if (!Util.isVoiceEmpty(queue.channel)) return;\n const timeout = setTimeout(() => {\n if (!Util.isVoiceEmpty(queue.channel!)) return;\n if (!this.nodes.has(queue.guild.id)) return;\n if (queue.options.leaveOnEmpty) queue.delete();\n this.events.emit('emptyChannel', queue);\n }, queue.options.leaveOnEmptyCooldown || 0).unref();\n queue.timeouts.set(`empty_${oldState.guild.id}`, timeout);\n }\n\n if (newState.channelId && newState.channelId === queue.channel.id) {\n const emptyTimeout = queue.timeouts.get(`empty_${oldState.guild.id}`);\n const channelEmpty = Util.isVoiceEmpty(queue.channel);\n if (!channelEmpty && emptyTimeout) {\n clearTimeout(emptyTimeout);\n queue.timeouts.delete(`empty_${oldState.guild.id}`);\n }\n }\n\n if (oldState.channelId && newState.channelId && oldState.channelId !== newState.channelId) {\n if (newState.member!.id === newState.guild.members.me!.id) {\n if (queue.connection && newState.member!.id === newState.guild.members.me!.id) queue.channel = newState.channel!;\n const emptyTimeout = queue.timeouts.get(`empty_${oldState.guild.id}`);\n const channelEmpty = Util.isVoiceEmpty(queue.channel);\n if (!channelEmpty && emptyTimeout) {\n clearTimeout(emptyTimeout);\n queue.timeouts.delete(`empty_${oldState.guild.id}`);\n } else {\n const timeout = setTimeout(() => {\n if (queue.connection && !Util.isVoiceEmpty(queue.channel!)) return;\n if (!this.nodes.has(queue.guild.id)) return;\n if (queue.options.leaveOnEmpty) queue.delete();\n this.events.emit('emptyChannel', queue);\n }, queue.options.leaveOnEmptyCooldown || 0).unref();\n queue.timeouts.set(`empty_${oldState.guild.id}`, timeout);\n }\n } else {\n if (newState.channelId !== queue.channel.id) {\n if (!Util.isVoiceEmpty(queue.channel)) return;\n if (queue.timeouts.has(`empty_${oldState.guild.id}`)) return;\n const timeout = setTimeout(() => {\n if (!Util.isVoiceEmpty(queue.channel!)) return;\n if (!this.nodes.has(queue.guild.id)) return;\n if (queue.options.leaveOnEmpty) queue.delete();\n this.events.emit('emptyChannel', queue);\n }, queue.options.leaveOnEmptyCooldown || 0).unref();\n queue.timeouts.set(`empty_${oldState.guild.id}`, timeout);\n } else {\n const emptyTimeout = queue.timeouts.get(`empty_${oldState.guild.id}`);\n const channelEmpty = Util.isVoiceEmpty(queue.channel!);\n if (!channelEmpty && emptyTimeout) {\n clearTimeout(emptyTimeout);\n queue.timeouts.delete(`empty_${oldState.guild.id}`);\n }\n }\n }\n }\n }\n\n /**\n * Handles voice state update\n * @param {VoiceState} oldState The old voice state\n * @param {VoiceState} newState The new voice state\n * @returns {void}\n */\n public handleVoiceState(oldState: VoiceState, newState: VoiceState): void {\n this._handleVoiceState(oldState, newState);\n this._handleVoiceStateLegacy(oldState, newState);\n }\n\n public lockVoiceStateHandler() {\n this.options.lockVoiceStateHandler = true;\n }\n\n public unlockVoiceStateHandler() {\n this.options.lockVoiceStateHandler = false;\n }\n\n public isVoiceStateHandlerLocked() {\n return !!this.options.lockVoiceStateHandler;\n }\n\n /**\n * Creates a queue for a guild if not available, else returns existing queue\n * @param {GuildResolvable} guild The guild\n * @param {PlayerOptions} queueInitOptions Queue init options\n * @returns {Queue}\n */\n createQueue<T = unknown>(guild: GuildResolvable, queueInitOptions: PlayerOptions & { metadata?: T } = {}): Queue<T> {\n Util.warn('<Player.createQueue> is deprecated and will be removed in the future. Use new <Player.nodes.create> instead!');\n guild = this.client.guilds.resolve(guild)!;\n if (!guild) throw new PlayerError('Unknown Guild', ErrorStatusCode.UNKNOWN_GUILD);\n if (this.queues.has(guild.id)) return this.queues.get(guild.id) as Queue<T>;\n\n const _meta = queueInitOptions.metadata;\n delete queueInitOptions['metadata'];\n queueInitOptions.volumeSmoothness ??= this.options.smoothVolume ? 0.08 : 0;\n queueInitOptions.ytdlOptions ??= this.options.ytdlOptions;\n const queue = new Queue(this, guild, queueInitOptions);\n queue.metadata = _meta;\n this.queues.set(guild.id, queue);\n\n return queue as Queue<T>;\n }\n\n /**\n * Returns the queue if available\n * @param {GuildResolvable} guild The guild id\n * @returns {Queue | undefined}\n */\n getQueue<T = unknown>(guild: GuildResolvable): Queue<T> | undefined {\n Util.warn('<Player.getQueue> is deprecated and will be removed in the future. Use new <Player.nodes.get> instead!');\n guild = this.client.guilds.resolve(guild)!;\n if (!guild) throw new PlayerError('Unknown Guild', ErrorStatusCode.UNKNOWN_GUILD);\n return this.queues.get(guild.id) as Queue<T>;\n }\n\n /**\n * Deletes a queue and returns deleted queue object\n * @param {GuildResolvable} guild The guild id to remove\n * @returns {Queue}\n */\n deleteQueue<T = unknown>(guild: GuildResolvable) {\n Util.warn('<Player.deleteQueue> is deprecated and will be removed in the future. Use new <Player.nodes.delete> instead!');\n guild = this.client.guilds.resolve(guild)!;\n if (!guild) throw new PlayerError('Unknown Guild', ErrorStatusCode.UNKNOWN_GUILD);\n const prev = this.getQueue<T>(guild)!;\n\n try {\n prev.destroy();\n } catch {} // eslint-disable-line no-empty\n this.queues.delete(guild.id);\n\n return prev;\n }\n\n /**\n * Initiate audio player\n * @param channel The voice channel on which the music should be played\n * @param query The track or source to play\n * @param options Options for player\n * @example ```js\n * const client = new Discord.Client({ intents: ['GuildVoiceStates'] });\n * const player = new Player(client);\n *\n * // play\n * const query = message.getQuerySomehow();\n *\n * await player.play(message.member.voice.channel, query, {\n * nodeOptions: {\n * metadata: message\n * }\n * });\n * ```\n */\n public async play<T = unknown>(\n channel: GuildVoiceChannelResolvable,\n query: string | Track | SearchResult,\n options: SearchOptions & {\n nodeOptions?: GuildNodeCreateOptions<T>;\n connectionOptions?: VoiceConnectConfig;\n } = {}\n ) {\n const vc = this.client.channels.resolve(channel);\n if (!vc?.isVoiceBased()) throw new Error('Expected a voice channel');\n\n const result = query instanceof SearchResult ? query : await this.search(query, options);\n if (result.isEmpty()) {\n throw new Error(`No results found for \"${query}\" (Extractor: ${result.extractor?.identifier || 'N/A'})`);\n }\n\n const queue = this.nodes.create(vc.guild, options.nodeOptions);\n if (!queue.channel) await queue.connect(vc, options.connectionOptions);\n\n if (!result.hasPlaylist()) {\n await queue.node.play(result.tracks[0]);\n } else {\n queue.addTrack(result.playlist!);\n await queue.node.play();\n }\n\n return {\n track: result.tracks[0],\n extractor: result.extractor,\n searchResult: result,\n queue\n };\n }\n\n /**\n * @typedef {object} PlayerSearchResult\n * @property {Playlist} [playlist] The playlist (if any)\n * @property {Track[]} tracks The tracks\n */\n /**\n * Search tracks\n * @param {string|Track} query The search query\n * @param {SearchOptions} options The search options\n * @returns {Promise<SearchResult>}\n */\n async search(query: string | Track, options: SearchOptions = {}): Promise<SearchResult> {\n if (options.requestedBy != null) options.requestedBy = this.client.users.resolve(options.requestedBy)!;\n options.blockExtractors ??= this.options.blockExtractors;\n if (query instanceof Track)\n return new SearchResult(this, {\n playlist: query.playlist || null,\n tracks: [query],\n query: query.toString(),\n extractor: null,\n queryType: query.queryType,\n requestedBy: options.requestedBy\n });\n\n let extractor: BaseExtractor | null = null;\n\n options.searchEngine ??= QueryType.AUTO;\n\n const queryType = options.searchEngine === QueryType.AUTO ? QueryResolver.resolve(query) : options.searchEngine;\n\n // force particular extractor\n if (options.searchEngine.startsWith('ext:')) {\n extractor = this.extractors.get(options.searchEngine.substring(4))!;\n if (!extractor) return new SearchResult(this, { query, queryType });\n }\n\n // query all extractors\n if (!extractor) {\n extractor =\n (\n await this.extractors.run(async (ext) => {\n if (options.blockExtractors?.includes(ext.identifier)) return false;\n return ext.validate(query, queryType as SearchQueryType);\n })\n )?.extractor || null;\n }\n\n // no extractors available\n if (!extractor) {\n return new SearchResult(this, { query, queryType });\n }\n\n const res = await extractor\n .handle(query, {\n type: queryType as SearchQueryType,\n requestedBy: options.requestedBy as User\n })\n .catch(() => null);\n\n if (res) {\n return new SearchResult(this, {\n query,\n queryType,\n playlist: res.playlist,\n tracks: res.tracks,\n extractor\n });\n }\n\n const result = await this.extractors.run(\n async (ext) =>\n (await ext.validate(query)) &&\n ext.handle(query, {\n type: queryType as SearchQueryType,\n requestedBy: options.requestedBy as User\n })\n );\n if (!result?.result) return new SearchResult(this, { query, queryType });\n\n return new SearchResult(this, {\n query,\n queryType,\n playlist: result.result.playlist,\n tracks: result.result.tracks,\n extractor: result.extractor\n });\n }\n\n /**\n * Generates a report of the dependencies used by the `@discordjs/voice` module. Useful for debugging.\n * @returns {string}\n */\n scanDeps() {\n const line = '-'.repeat(50);\n const depsReport = generateDependencyReport();\n const extractorReport = this.extractors.store\n .map((m) => {\n return m.identifier;\n })\n .join('\\n');\n return `${depsReport}\\nLoaded Extractors:\\n${extractorReport || 'None'}\\n${line}`;\n }\n\n emit<U extends keyof PlayerEvents>(eventName: U, ...args: Parameters<PlayerEvents[U]>): boolean {\n if (this.requiredEvents.includes(eventName) && !super.eventNames().includes(eventName)) {\n // eslint-disable-next-line no-console\n console.error(...args);\n Util.warn(`Unhandled \"${eventName}\" event! Events ${this.requiredEvents.map((m) => `\"${m}\"`).join(', ')} must have event listeners!`, 'UnhandledEventWarning');\n return false;\n } else {\n return super.emit(eventName, ...args);\n }\n }\n\n /**\n * Resolves queue\n * @param {GuildResolvable|Queue} queueLike Queue like object\n * @returns {Queue}\n * @deprecated\n */\n resolveQueue<T>(queueLike: GuildResolvable | Queue): Queue<T> {\n Util.warn('<Player.resolveQueue> is deprecated and will be removed in the future. Use new <Player.nodes.resolve> instead!');\n return this.getQueue(queueLike instanceof Queue ? queueLike.guild : queueLike)!;\n }\n\n *[Symbol.iterator]() {\n yield* this.nodes.cache.size ? this.nodes.cache.values() : this.queues.values();\n }\n\n /**\n * Creates `Playlist` instance\n * @param data The data to initialize a playlist\n */\n createPlaylist(data: PlaylistInitData) {\n return new Playlist(this, data);\n }\n}\n\nexport { Player };\n","import { Guild, StageChannel, VoiceChannel, SnowflakeUtil, GuildChannelResolvable, ChannelType } from 'discord.js';\nimport { Player } from '../Player';\nimport { StreamDispatcher } from '../VoiceInterface/StreamDispatcher';\nimport { Track } from './Track';\nimport { PlayerOptions, PlayerProgressbarOptions, PlayOptions, QueueFilters, QueueRepeatMode, SearchQueryType } from '../types/types';\nimport { AudioResource, StreamType } from '@discordjs/voice';\nimport { Util } from '../utils/Util';\nimport AudioFilters from '../utils/AudioFilters';\nimport { PlayerError, ErrorStatusCode } from './PlayerError';\nimport type { Readable } from 'stream';\nimport { createFFmpegStream } from '../utils/FFmpegStream';\nimport os from 'os';\nimport { parentPort } from 'worker_threads';\nimport type { BiquadFilters, EqualizerBand, PCMFilters } from '@discord-player/equalizer';\nimport { Collection } from '@discord-player/utils';\nimport { QueryResolver } from '../utils/QueryResolver';\nimport { YouTube } from 'youtube-sr';\n\nconst OBCS_DEFAULT = async () => {\n return undefined;\n};\n\n/**\n * @deprecated use GuildQueue instead\n */\nclass Queue<T = unknown> {\n public readonly guild: Guild;\n public readonly player: Player;\n public connection!: StreamDispatcher;\n public tracks: Track[] = [];\n public previousTracks: Track[] = [];\n public options: PlayerOptions;\n public playing = false;\n public metadata?: T | null = null;\n public repeatMode: QueueRepeatMode = 0;\n public readonly id = SnowflakeUtil.generate().toString();\n private _streamTime = 0;\n public _cooldownsTimeout = new Collection<string, NodeJS.Timeout>();\n private _activeFilters: any[] = []; // eslint-disable-line @typescript-eslint/no-explicit-any\n private _filtersUpdate = false;\n private _lastEQBands: EqualizerBand[] = [];\n private _lastAudioFilters: PCMFilters[] = [];\n private _lastBiquadFilter!: BiquadFilters;\n #destroyed = false;\n public onBeforeCreateStream: (track: Track, source: SearchQueryType, queue: Queue) => Promise<Readable | undefined> = OBCS_DEFAULT;\n\n /**\n * Queue constructor\n * @param {Player} player The player that instantiated this queue\n * @param {Guild} guild The guild that instantiated this queue\n * @param {PlayerOptions} [options] Player options for the queue\n */\n constructor(player: Player, guild: Guild, options: PlayerOptions = {}) {\n /**\n * The player that instantiated this queue\n * @type {Player}\n * @readonly\n */\n this.player = player;\n\n /**\n * The guild that instantiated this queue\n * @type {Guild}\n * @readonly\n */\n this.guild = guild;\n\n /**\n * The player options for this queue\n * @type {PlayerOptions}\n */\n this.options = {};\n\n /**\n * Queue repeat mode\n * @type {QueueRepeatMode}\n * @name Queue#repeatMode\n */\n\n /**\n * Queue metadata\n * @type {any}\n * @name Queue#metadata\n */\n\n /**\n * Previous tracks\n * @type {Track[]}\n * @name Queue#previousTracks\n */\n\n /**\n * Regular tracks\n * @type {Track[]}\n * @name Queue#tracks\n */\n\n /**\n * The connection\n * @type {StreamDispatcher}\n * @name Queue#connection\n */\n\n /**\n * The ID of this queue\n * @type {Snowflake}\n * @name Queue#id\n */\n\n Object.assign(\n this.options,\n {\n leaveOnEnd: true,\n leaveOnStop: true,\n leaveOnEmpty: true,\n leaveOnEndCooldown: 1000,\n leaveOnEmptyCooldown: 1000,\n autoSelfDeaf: true,\n ytdlOptions: {\n highWaterMark: 1 << 25\n },\n initialVolume: 100,\n bufferingTimeout: 3000,\n spotifyBridge: true,\n disableVolume: false,\n disableEqualizer: false,\n equalizerBands: [],\n disableBiquad: false,\n disableFilters: false,\n defaultFilters: []\n } as PlayerOptions,\n options\n );\n\n if (Array.isArray(options.equalizerBands)) this._lastEQBands = options.equalizerBands;\n if (Array.isArray(options.defaultFilters)) this._lastAudioFilters = options.defaultFilters;\n if (options.biquadFilter != null) this._lastBiquadFilter = options.biquadFilter;\n // eslint-disable-next-line\n if ('onBeforeCreateStream' in this.options) this.onBeforeCreateStream = this.options.onBeforeCreateStream!;\n\n this.player.emit('debug', this, `Queue initialized:\\n\\n${this.player.scanDeps()}`);\n }\n\n /**\n * The PCM filterer\n */\n public get filters() {\n return this.connection.filters;\n }\n\n public get equalizer() {\n return this.connection.equalizer;\n }\n\n public get biquad() {\n return this.connection.biquad;\n }\n\n /**\n * Forces next play\n * @returns {Promise<void>}\n */\n public async forceNext() {\n if (this.connection.audioResource) {\n this.connection.emit('finish', this.connection.audioResource);\n } else if (this.tracks.length) {\n await this.play();\n }\n }\n\n /**\n * Returns current track\n * @type {Track}\n */\n get current() {\n if (this.#watchDestroyed()) return;\n return this.connection.audioResource?.metadata ?? this.tracks[0];\n }\n\n /**\n * If this queue is destroyed\n * @type {boolean}\n */\n get destroyed() {\n return this.#destroyed;\n }\n\n /**\n * Returns current track\n * @returns {Track}\n */\n nowPlaying() {\n if (this.#watchDestroyed()) return;\n return this.current;\n }\n\n /**\n * Connects to a voice channel\n * @param {GuildChannelResolvable} channel The voice/stage channel\n * @returns {Promise<Queue>}\n */\n async connect(channel: GuildChannelResolvable) {\n if (this.#watchDestroyed()) return;\n const _channel = this.guild.channels.resolve(channel) as StageChannel | VoiceChannel;\n if (![ChannelType.GuildStageVoice, ChannelType.GuildVoice].includes(_channel?.type))\n throw new PlayerError(`Channel type must be GuildVoice or GuildStageVoice, got ${_channel?.type}!`, ErrorStatusCode.INVALID_ARG_TYPE);\n const connection = await this.player.voiceUtils.connect(_channel, {\n deaf: this.options.autoSelfDeaf\n });\n this.connection = connection;\n\n if (_channel.type === ChannelType.GuildStageVoice) {\n await _channel.guild.members.me!.voice.setSuppressed(false).catch(async () => {\n return await _channel.guild.members.me!.voice.setRequestToSpeak(true).catch(Util.noop);\n });\n }\n\n this.connection.on('dsp', (filters) => {\n this._lastAudioFilters = filters;\n });\n\n this.connection.on('eqBands', (filters) => {\n this._lastEQBands = filters;\n });\n\n this.connection.on('biquad', (filters) => {\n this._lastBiquadFilter = filters;\n });\n\n this.connection.on('volume', (vol) => {\n this.options.initialVolume = vol;\n });\n\n this.connection.on('error', (err) => {\n if (this.#watchDestroyed(false)) return;\n this.player.emit('connectionError', this, err);\n });\n this.connection.on('debug', (msg) => {\n if (this.#watchDestroyed(false)) return;\n this.player.emit('debug', this, msg);\n });\n\n this.player.emit('connectionCreate', this, this.connection);\n\n this.connection.on('start', (resource) => {\n if (this.#watchDestroyed(false)) return;\n this.playing = true;\n if (!this._filtersUpdate) this.player.emit('trackStart', this, resource?.metadata ?? this.current);\n this._filtersUpdate = false;\n });\n\n this.connection.on('finish', async (resource) => {\n if (this.#watchDestroyed(false)) return;\n this.playing = false;\n if (this._filtersUpdate) return;\n this._streamTime = 0;\n\n this.player.emit('trackEnd', this, resource.metadata);\n\n if (!this.tracks.length && this.repeatMode === QueueRepeatMode.OFF) {\n this.emitEnd();\n } else if (!this.tracks.length && this.repeatMode === QueueRepeatMode.AUTOPLAY) {\n this._handleAutoplay(Util.last(this.previousTracks));\n } else {\n if (this.repeatMode === QueueRepeatMode.TRACK) return void this.play(Util.last(this.previousTracks), { immediate: true });\n if (this.repeatMode === QueueRepeatMode.QUEUE) this.tracks.push(Util.last(this.previousTracks));\n const nextTrack = this.tracks.shift();\n this.play(nextTrack, { immediate: true });\n return;\n }\n });\n\n return this;\n }\n\n private emitEnd() {\n const timeout = setTimeout(() => {\n if (!this.player.queues.has(this.guild.id)) return;\n if (this.tracks.length || this.current) return;\n if (this.options.leaveOnEnd) this.destroy();\n this.player.emit('queueEnd', this);\n }, this.options.leaveOnEndCooldown || 0).unref();\n\n this._cooldownsTimeout.set(`queueEnd_${this.guild.id}`, timeout);\n }\n\n private refreshEndCooldown() {\n const existingTimeout = this._cooldownsTimeout.get(`queueEnd_${this.guild.id}`);\n if (this.tracks.length || this.current) {\n clearTimeout(existingTimeout);\n this._cooldownsTimeout.delete(`queueEnd_${this.guild.id}`);\n }\n }\n\n /**\n * Destroys this queue\n * @param {boolean} [disconnect=this.options.leaveOnStop] If it should leave on destroy\n * @returns {void}\n */\n destroy(disconnect = this.options.leaveOnStop) {\n if (this.#watchDestroyed()) return;\n if (this.connection) this.connection.end();\n if (disconnect) this.connection?.disconnect();\n this.player.queues.delete(this.guild.id);\n this.player.voiceUtils.cache.delete(this.guild.id);\n this.#destroyed = true;\n }\n\n /**\n * Skips current track\n * @returns {boolean}\n */\n skip() {\n if (this.#watchDestroyed()) return;\n if (!this.connection) return false;\n this._filtersUpdate = false;\n this.connection.end();\n return true;\n }\n\n /**\n * Adds single track to the queue\n * @param {Track} track The track to add\n * @returns {void}\n */\n addTrack(track: Track) {\n if (this.#watchDestroyed()) return;\n if (!(track instanceof Track)) throw new PlayerError('invalid track', ErrorStatusCode.INVALID_TRACK);\n this.tracks.push(track);\n this.refreshEndCooldown();\n this.player.emit('trackAdd', this, track);\n }\n\n /**\n * Adds multiple tracks to the queue\n * @param {Track[]} tracks Array of tracks to add\n */\n addTracks(tracks: Track[]) {\n if (this.#watchDestroyed()) return;\n if (!tracks.every((y) => y instanceof Track)) throw new PlayerError('invalid track', ErrorStatusCode.INVALID_TRACK);\n this.tracks.push(...tracks);\n this.refreshEndCooldown();\n this.player.emit('tracksAdd', this, tracks);\n }\n\n /**\n * Sets paused state\n * @param {boolean} paused The paused state\n * @returns {boolean}\n */\n setPaused(paused?: boolean) {\n if (this.#watchDestroyed()) return false;\n if (!this.connection) return false;\n return paused ? this.connection.pause(true) : this.connection.resume();\n }\n\n /**\n * If the player is currently paused\n */\n get paused() {\n return this.connection.paused;\n }\n\n set paused(val: boolean) {\n this.setPaused(val);\n }\n\n /**\n * Pause the playback\n */\n pause() {\n return this.setPaused(true);\n }\n\n /**\n * Resume the playback\n */\n resume() {\n return this.setPaused(false);\n }\n\n /**\n * Sets bitrate\n * @param {number|auto} bitrate bitrate to set\n * @returns {void}\n */\n setBitrate(bitrate: number | 'auto') {\n if (this.#watchDestroyed()) return;\n if (!this.connection?.audioResource?.encoder) return;\n if (bitrate === 'auto') bitrate = this.connection.channel?.bitrate ?? 64000;\n this.connection.audioResource.encoder.setBitrate(bitrate);\n }\n\n /**\n * Sets volume\n * @param {number} amount The volume amount\n * @returns {boolean}\n */\n setVolume(amount: number) {\n if (this.#watchDestroyed()) return;\n if (!this.connection) return false;\n this.options.initialVolume = amount;\n return this.connection.setVolume(amount);\n }\n /**\n * Sets repeat mode\n * @param {QueueRepeatMode} mode The repeat mode\n * @returns {boolean}\n */\n setRepeatMode(mode: QueueRepeatMode) {\n if (this.#watchDestroyed()) return;\n if (![QueueRepeatMode.OFF, QueueRepeatMode.QUEUE, QueueRepeatMode.TRACK, QueueRepeatMode.AUTOPLAY].includes(mode))\n throw new PlayerError(`Unknown repeat mode \"${mode}\"!`, ErrorStatusCode.UNKNOWN_REPEAT_MODE);\n if (mode === this.repeatMode) return false;\n this.repeatMode = mode;\n return true;\n }\n\n /**\n * The current volume amount\n * @type {number}\n */\n get volume() {\n if (this.#watchDestroyed()) return 100;\n if (!this.connection) return 100;\n return this.connection.volume;\n }\n\n set volume(amount: number) {\n this.setVolume(amount);\n }\n\n /**\n * The stream time of this queue\n * @type {number}\n */\n get streamTime() {\n if (this.#watchDestroyed()) return 0;\n if (!this.connection) return 0;\n const playbackTime = this._streamTime + this.connection.streamTime;\n const NC = this._activeFilters.includes('nightcore') ? 1.25 : null;\n const VW = this._activeFilters.includes('vaporwave') ? 0.8 : null;\n\n if (NC && VW) return playbackTime * (NC + VW);\n return NC ? playbackTime * NC : VW ? playbackTime * VW : playbackTime;\n }\n\n set streamTime(time: number) {\n if (this.#watchDestroyed()) return;\n this.seek(time);\n }\n\n /**\n * Returns enabled filters\n * @returns {AudioFilters}\n */\n getFiltersEnabled() {\n if (this.#watchDestroyed()) return;\n return AudioFilters.names.filter((x) => this._activeFilters.includes(x));\n }\n\n /**\n * Returns disabled filters\n * @returns {AudioFilters}\n */\n getFiltersDisabled() {\n if (this.#watchDestroyed()) return;\n return AudioFilters.names.filter((x) => !this._activeFilters.includes(x));\n }\n\n /**\n * Sets filters\n * @param {QueueFilters} filters Queue filters\n * @returns {Promise<void>}\n */\n async setFilters(filters?: QueueFilters) {\n if (this.#watchDestroyed()) return;\n if (!filters || !Object.keys(filters).length) {\n // reset filters\n const streamTime = this.streamTime;\n this._activeFilters = [];\n return await this.play(this.current, {\n immediate: true,\n filtersUpdate: true,\n seek: streamTime,\n encoderArgs: []\n });\n }\n\n const _filters: any[] = []; // eslint-disable-line @typescript-eslint/no-explicit-any\n\n for (const filter in filters) {\n if (filters[filter as keyof QueueFilters] === true) _filters.push(filter);\n }\n\n if (this._activeFilters.join('') === _filters.join('')) return;\n\n const newFilters = AudioFilters.create(_filters).trim();\n const streamTime = this.streamTime;\n this._activeFilters = _filters;\n\n return await this.play(this.current, {\n immediate: true,\n filtersUpdate: true,\n seek: streamTime,\n encoderArgs: !_filters.length ? undefined : ['-af', newFilters]\n });\n }\n\n /**\n * Seeks to the given time\n * @param {number} position The position\n * @returns {boolean}\n */\n async seek(position: number) {\n if (this.#watchDestroyed()) return;\n if (!this.playing || !this.current) return false;\n if (position < 1) position = 0;\n if (position >= this.current.durationMS) return this.skip();\n\n await this.play(this.current, {\n immediate: true,\n filtersUpdate: true, // to stop events\n seek: position\n });\n\n return true;\n }\n\n /**\n * Plays previous track\n * @returns {Promise<void>}\n */\n async back() {\n if (this.#watchDestroyed()) return;\n const prev = this.previousTracks[this.previousTracks.length - 2]; // because last item is the current track\n if (!prev) throw new PlayerError('Could not find previous track', ErrorStatusCode.TRACK_NOT_FOUND);\n\n return await this.play(prev, { immediate: true });\n }\n\n /**\n * Clear this queue\n */\n clear() {\n if (this.#watchDestroyed()) return;\n this.tracks = [];\n this.previousTracks = [];\n }\n\n /**\n * Stops the player\n * @returns {void}\n */\n stop() {\n if (this.#watchDestroyed()) return;\n return this.destroy();\n }\n\n /**\n * Shuffles this queue\n * @returns {boolean}\n */\n shuffle() {\n if (this.#watchDestroyed()) return;\n if (!this.tracks.length || this.tracks.length < 2) return false;\n\n for (let i = this.tracks.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [this.tracks[i], this.tracks[j]] = [this.tracks[j], this.tracks[i]];\n }\n\n return true;\n }\n\n /**\n * Removes a track from the queue\n * @param {Track|string|number} track The track to remove\n * @returns {Track}\n */\n remove(track: Track | string | number) {\n if (this.#watchDestroyed()) return;\n let trackFound: Track | null = null;\n if (typeof track === 'number') {\n trackFound = this.tracks[track];\n if (trackFound) {\n this.tracks = this.tracks.filter((t) => t.id !== trackFound!.id);\n }\n } else {\n trackFound = this.tracks.find((s) => s.id === (track instanceof Track ? track.id : track))!;\n if (trackFound) {\n this.tracks = this.tracks.filter((s) => s.id !== trackFound!.id);\n }\n }\n\n return trackFound;\n }\n\n /**\n * Returns the index of the specified track. If found, returns the track index else returns -1.\n * @param {number|Track|string} track The track\n * @returns {number}\n */\n getTrackPosition(track: number | Track | string) {\n if (this.#watchDestroyed()) return;\n if (typeof track === 'number') return this.tracks[track] != null ? track : -1;\n return this.tracks.findIndex((pred) => pred.id === (track instanceof Track ? track.id : track));\n }\n\n /**\n * Jumps to particular track\n * @param {Track|number} track The track\n * @returns {void}\n */\n jump(track: Track | number): void {\n if (this.#watchDestroyed()) return;\n const foundTrack = this.remove(track);\n if (!foundTrack) throw new PlayerError('Track not found', ErrorStatusCode.TRACK_NOT_FOUND);\n\n this.tracks.splice(0, 0, foundTrack);\n\n return void this.skip();\n }\n\n /**\n * Jumps to particular track, removing other tracks on the way\n * @param {Track|number} track The track\n * @returns {void}\n */\n skipTo(track: Track | number): void {\n if (this.#watchDestroyed()) return;\n const trackIndex = this.getTrackPosition(track)!;\n const removedTrack = this.remove(track);\n if (!removedTrack) throw new PlayerError('Track not found', ErrorStatusCode.TRACK_NOT_FOUND);\n\n this.tracks.splice(0, trackIndex, removedTrack);\n\n return void this.skip();\n }\n\n /**\n * Inserts the given track to specified index\n * @param {Track} track The track to insert\n * @param {number} [index=0] The index where this track should be\n */\n insert(track: Track, index = 0) {\n if (this.#watchDestroyed()) return;\n if (!track || !(track instanceof Track)) throw new PlayerError('track must be the instance of Track', ErrorStatusCode.INVALID_TRACK);\n if (typeof index !== 'number' || index < 0 || !Number.isFinite(index)) throw new PlayerError(`Invalid index \"${index}\"`, ErrorStatusCode.INVALID_ARG_TYPE);\n\n this.tracks.splice(index, 0, track);\n\n this.player.emit('trackAdd', this, track);\n }\n\n /**\n * @typedef {object} PlayerTimestamp\n * @property {string} current The current progress\n * @property {string} end The total time\n * @property {number} progress Progress in %\n */\n\n /**\n * Returns player stream timestamp\n * @returns {PlayerTimestamp}\n */\n getPlayerTimestamp() {\n if (this.#watchDestroyed()) return;\n const currentStreamTime = this.streamTime;\n const totalTime = this.current!.durationMS;\n\n const currentTimecode = Util.buildTimeCode(Util.parseMS(currentStreamTime));\n const endTimecode = Util.buildTimeCode(Util.parseMS(totalTime));\n\n return {\n current: currentTimecode,\n end: endTimecode,\n progress: Math.round((currentStreamTime / totalTime) * 100)\n };\n }\n\n /**\n * Creates progress bar string\n * @param {PlayerProgressbarOptions} options The progress bar options\n * @returns {string}\n */\n createProgressBar(options: PlayerProgressbarOptions = { timecodes: true }) {\n if (this.#watchDestroyed()) return;\n const length = typeof options.length === 'number' ? (options.length <= 0 || options.length === Infinity ? 15 : options.length) : 15;\n\n const index = Math.round((this.streamTime / this.current!.durationMS) * length);\n const indicator = typeof options.indicator === 'string' && options.indicator.length > 0 ? options.indicator : '🔘';\n const line = typeof options.line === 'string' && options.line.length > 0 ? options.line : '▬';\n\n if (index >= 1 && index <= length) {\n const bar = line.repeat(length - 1).split('');\n bar.splice(index, 0, indicator);\n if (options.timecodes) {\n const timestamp = this.getPlayerTimestamp()!;\n return `${timestamp.current} ┃ ${bar.join('')} ┃ ${timestamp.end}`;\n } else {\n return `${bar.join('')}`;\n }\n } else {\n if (options.timecodes) {\n const timestamp = this.getPlayerTimestamp()!;\n return `${timestamp.current} ┃ ${indicator}${line.repeat(length - 1)} ┃ ${timestamp.end}`;\n } else {\n return `${indicator}${line.repeat(length - 1)}`;\n }\n }\n }\n\n /**\n * Total duration\n * @type {Number}\n */\n get totalTime(): number {\n if (this.#watchDestroyed()) return 0;\n return this.tracks.length > 0 ? this.tracks.map((t) => t.durationMS).reduce((p, c) => p + c) : 0;\n }\n\n /**\n * Generates statistics\n */\n generateStatistics() {\n return {\n guild: this.guild.id,\n memory: process.memoryUsage(),\n tracks: this.tracks.length,\n os: {\n cpuCount: os.cpus().length,\n totalMem: os.totalmem(),\n freeMem: os.freemem(),\n platform: process.platform\n },\n isShard: typeof process.send === 'function' || parentPort != null,\n latency: {\n client: this.player.client.ws.ping,\n udp: this.connection.voiceConnection.ping.udp,\n ws: this.connection.voiceConnection.ping.ws,\n eventLoop: this.player.eventLoopLag\n },\n subscribers: this.player.queues.size,\n connections: this.player.queues.filter((x) => x.connection?.voiceConnection != null).size,\n extractors: this.player.extractors.size\n };\n }\n\n /**\n * Voice connection latency in ms\n * @type {number}\n */\n public get ping() {\n return this.connection.voiceConnection.ping.udp;\n }\n\n /**\n * Play stream in a voice/stage channel\n * @param {Track} [src] The track to play (if empty, uses first track from the queue)\n * @param {PlayOptions} [options] The options\n * @returns {Promise<void>}\n */\n async play(src?: Track, options: PlayOptions = {}): Promise<void> {\n if (this.#watchDestroyed(false)) return;\n if (!this.connection || !this.connection.voiceConnection) throw new PlayerError('Voice connection is not available, use <Queue>.connect()!', ErrorStatusCode.NO_CONNECTION);\n if (src && (this.playing || this.tracks.length) && !options.immediate) return this.addTrack(src);\n const track = options.filtersUpdate && !options.immediate ? src || this.current : src ?? this.tracks.shift();\n if (!track) return;\n\n this.player.emit('debug', this, 'Received play request');\n\n if (!options.filtersUpdate) {\n this.previousTracks = this.previousTracks.filter((x) => x.id !== track.id);\n this.previousTracks.push(track);\n }\n\n let stream: string | Readable | null = null;\n const hasCustomDownloader = typeof this.onBeforeCreateStream === 'function';\n if (hasCustomDownloader) {\n const qt: SearchQueryType = track.queryType || (track.raw.source === 'spotify' ? 'spotifySong' : track.raw.source === 'apple_music' ? 'appleMusicSong' : track.raw.source) || 'arbitrary';\n stream = (await this.onBeforeCreateStream(track, qt, this)) || null;\n }\n\n if (!stream) {\n const streamInfo = await this.player.extractors.run(async (extractor) => {\n const canStream = await extractor.validate(track.url, track.queryType || QueryResolver.resolve(track.url));\n if (!canStream) return false;\n return await extractor.stream(track);\n });\n if (!streamInfo || !streamInfo.result) {\n this.player.emit('error', this, new Error('No stream extractors are available for this track'));\n return void this.play(this.tracks.shift(), { immediate: true });\n }\n\n stream = streamInfo.result;\n }\n\n const ffmpegStream = createFFmpegStream(stream, {\n encoderArgs: options.encoderArgs || this._activeFilters.length ? ['-af', AudioFilters.create(this._activeFilters)] : [],\n seek: options.seek ? options.seek / 1000 : 0,\n fmt: 's16le'\n }).on('error', (err) => {\n if (!`${err}`.toLowerCase().includes('premature close')) this.player.emit('error', this, err);\n });\n\n const resource: AudioResource<Track> = this.connection.createStream(ffmpegStream, {\n type: StreamType.Raw,\n data: track,\n disableVolume: Boolean(this.options.disableVolume),\n disableEqualizer: Boolean(this.options.disableEqualizer),\n eq: this._lastEQBands,\n disableBiquad: Boolean(this.options.disableBiquad),\n biquadFilter: this._lastBiquadFilter,\n defaultFilters: this._lastAudioFilters,\n disableFilters: Boolean(this.options.disableFilters),\n volume: this.options.initialVolume,\n disableResampler: false\n });\n\n if (options.seek) this._streamTime = options.seek;\n this._filtersUpdate = options.filtersUpdate!;\n\n setTimeout(() => {\n this.connection.playStream(resource);\n }, this.#getBufferingTimeout()).unref();\n }\n\n /**\n * Private method to handle autoplay\n * @param {Track} track The source track to find its similar track for autoplay\n * @returns {Promise<void>}\n * @private\n */\n private async _handleAutoplay(track: Track): Promise<void> {\n if (this.#watchDestroyed()) return;\n if (!track || ![track.source, track.raw?.source].includes('youtube')) {\n return this.emitEnd();\n }\n let info = await YouTube.getVideo(track.url)\n .then((x) => x.videos![0])\n .catch(Util.noop);\n // fallback\n if (!info)\n info = await YouTube.search(track.author)\n .then((x) => x[0])\n .catch(Util.noop);\n if (!info) {\n return this.emitEnd();\n }\n\n const nextTrack = new Track(this.player, {\n title: info.title!,\n url: `https://www.youtube.com/watch?v=${info.id}`,\n duration: info.durationFormatted || Util.buildTimeCode(Util.parseMS(info.duration * 1000)),\n description: '',\n thumbnail: typeof info.thumbnail === 'string' ? info.thumbnail! : info.thumbnail!.url!,\n views: info.views,\n author: info.channel!.name!,\n requestedBy: track.requestedBy,\n source: 'youtube',\n queryType: 'youtubeVideo'\n });\n\n this.play(nextTrack, { immediate: true });\n }\n\n *[Symbol.iterator]() {\n if (this.#watchDestroyed()) return;\n yield* this.tracks;\n }\n\n /**\n * JSON representation of this queue\n * @returns {object}\n */\n toJSON() {\n if (this.#watchDestroyed()) return;\n return {\n id: this.id,\n guild: this.guild.id,\n voiceChannel: this.connection?.channel?.id,\n options: this.options,\n tracks: this.tracks.map((m) => m.toJSON())\n };\n }\n\n /**\n * String representation of this queue\n * @returns {string}\n */\n toString() {\n if (this.#watchDestroyed()) return;\n if (!this.tracks.length) return 'No songs available to display!';\n return `**Upcoming Songs:**\\n${this.tracks.map((m, i) => `${i + 1}. **${m.title}**`).join('\\n')}`;\n }\n\n #watchDestroyed(emit = true) {\n if (this.#destroyed) {\n if (emit) this.player.emit('error', this, new PlayerError('Cannot use destroyed queue', ErrorStatusCode.DESTROYED_QUEUE));\n return true;\n }\n\n return false;\n }\n\n #getBufferingTimeout() {\n const timeout = this.options.bufferingTimeout!;\n\n if (isNaN(timeout) || timeout < 0 || !Number.isFinite(timeout)) return 1000;\n return timeout;\n }\n}\n\nexport { Queue };\n","import { User, escapeMarkdown, SnowflakeUtil } from 'discord.js';\nimport { Player } from '../Player';\nimport { RawTrackData, SearchQueryType, TrackJSON } from '../types/types';\nimport { Playlist } from './Playlist';\nimport { Queue } from './Queue';\n\nexport type TrackResolvable = Track | string | number;\n\nexport class Track {\n public player!: Player;\n public title!: string;\n public description!: string;\n public author!: string;\n public url!: string;\n public thumbnail!: string;\n public duration!: string;\n public views!: number;\n public requestedBy: User | null = null;\n public playlist?: Playlist;\n public queryType: SearchQueryType | null | undefined = null;\n public readonly raw: RawTrackData = {} as RawTrackData;\n public readonly id = SnowflakeUtil.generate().toString();\n\n /**\n * Track constructor\n * @param {Player} player The player that instantiated this Track\n * @param {RawTrackData} data Track data\n */\n constructor(player: Player, data: RawTrackData) {\n /**\n * The player that instantiated this Track\n * @name Track#player\n * @type {Player}\n * @readonly\n */\n Object.defineProperty(this, 'player', { value: player, enumerable: false });\n\n /**\n * Title of this track\n * @name Track#title\n * @type {string}\n */\n\n /**\n * Description of this track\n * @name Track#description\n * @type {string}\n */\n\n /**\n * Author of this track\n * @name Track#author\n * @type {string}\n */\n\n /**\n * URL of this track\n * @name Track#url\n * @type {string}\n */\n\n /**\n * Thumbnail of this track\n * @name Track#thumbnail\n * @type {string}\n */\n\n /**\n * Duration of this track\n * @name Track#duration\n * @type {string}\n */\n\n /**\n * Views count of this track\n * @name Track#views\n * @type {number}\n */\n\n /**\n * Person who requested this track\n * @name Track#requestedBy\n * @type {User}\n */\n\n /**\n * If this track belongs to playlist\n * @name Track#fromPlaylist\n * @type {boolean}\n */\n\n /**\n * Raw track data\n * @name Track#raw\n * @type {RawTrackData}\n */\n\n /**\n * The track id\n * @name Track#id\n * @type {Snowflake}\n * @readonly\n */\n\n /**\n * The playlist which track belongs\n * @name Track#playlist\n * @type {Playlist}\n */\n\n void this._patch(data);\n }\n\n private _patch(data: RawTrackData) {\n this.title = escapeMarkdown(data.title ?? '');\n this.author = data.author ?? '';\n this.url = data.url ?? '';\n this.thumbnail = data.thumbnail ?? '';\n this.duration = data.duration ?? '';\n this.views = data.views ?? 0;\n this.queryType = data.queryType;\n this.requestedBy = data.requestedBy || null;\n this.playlist = data.playlist;\n\n // raw\n Object.defineProperty(this, 'raw', { value: Object.assign({}, { source: data.raw?.source ?? data.source }, data.raw ?? data), enumerable: false });\n }\n\n /**\n * The queue in which this track is located\n * @type {Queue}\n */\n get queue(): Queue {\n return this.player.queues.find((q) => q.tracks.some((ab) => ab.id === this.id))!;\n }\n\n /**\n * The track duration in millisecond\n * @type {number}\n */\n get durationMS(): number {\n const times = (n: number, t: number) => {\n let tn = 1;\n for (let i = 0; i < t; i++) tn *= n;\n return t <= 0 ? 1000 : tn * 1000;\n };\n\n return this.duration\n .split(':')\n .reverse()\n .map((m, i) => parseInt(m) * times(60, i))\n .reduce((a, c) => a + c, 0);\n }\n\n /**\n * Returns source of this track\n * @type {TrackSource}\n */\n get source() {\n return this.raw.source ?? 'arbitrary';\n }\n\n /**\n * String representation of this track\n * @returns {string}\n */\n toString(): string {\n return `${this.title} by ${this.author}`;\n }\n\n /**\n * Raw JSON representation of this track\n * @returns {TrackJSON}\n */\n toJSON(hidePlaylist?: boolean) {\n return {\n id: this.id,\n title: this.title,\n description: this.description,\n author: this.author,\n url: this.url,\n thumbnail: this.thumbnail,\n duration: this.duration,\n durationMS: this.durationMS,\n views: this.views,\n requestedBy: this.requestedBy?.id || null,\n playlist: hidePlaylist ? null : this.playlist?.toJSON() ?? null\n } as TrackJSON;\n }\n}\n","import { Snowflake, User, UserResolvable, VoiceState } from 'discord.js';\nimport { Readable, Duplex } from 'stream';\nimport { Queue } from '../Structures/Queue';\nimport { Track } from '../Structures/Track';\nimport { Playlist } from '../Structures/Playlist';\nimport { StreamDispatcher } from '../VoiceInterface/StreamDispatcher';\nimport { downloadOptions } from 'ytdl-core';\nimport { BiquadFilters, EqualizerBand, PCMFilters } from '@discord-player/equalizer';\n\nexport type FiltersName = keyof QueueFilters;\n\nexport interface PlayerSearchResult {\n playlist: Playlist | null;\n tracks: Track[];\n}\n\n/**\n * @typedef {AudioFilters} QueueFilters\n */\nexport interface QueueFilters {\n bassboost_low?: boolean;\n bassboost?: boolean;\n bassboost_high?: boolean;\n '8D'?: boolean;\n vaporwave?: boolean;\n nightcore?: boolean;\n phaser?: boolean;\n tremolo?: boolean;\n vibrato?: boolean;\n reverse?: boolean;\n treble?: boolean;\n normalizer?: boolean;\n normalizer2?: boolean;\n surrounding?: boolean;\n pulsator?: boolean;\n subboost?: boolean;\n karaoke?: boolean;\n flanger?: boolean;\n gate?: boolean;\n haas?: boolean;\n mcompand?: boolean;\n mono?: boolean;\n mstlr?: boolean;\n mstrr?: boolean;\n compressor?: boolean;\n expander?: boolean;\n softlimiter?: boolean;\n chorus?: boolean;\n chorus2d?: boolean;\n chorus3d?: boolean;\n fadein?: boolean;\n dim?: boolean;\n earrape?: boolean;\n}\n\n/**\n * The track source:\n * - soundcloud\n * - youtube\n * - spotify\n * - apple_music\n * - arbitrary\n * @typedef {string} TrackSource\n */\nexport type TrackSource = 'soundcloud' | 'youtube' | 'spotify' | 'apple_music' | 'arbitrary';\n\n/**\n * @typedef {object} RawTrackData\n * @property {string} title The title\n * @property {string} description The description\n * @property {string} author The author\n * @property {string} url The url\n * @property {string} thumbnail The thumbnail\n * @property {string} duration The duration\n * @property {number} views The views\n * @property {User} requestedBy The user who requested this track\n * @property {Playlist} [playlist] The playlist\n * @property {TrackSource} [source=\"arbitrary\"] The source\n * @property {any} [engine] The engine\n * @property {boolean} [live] If this track is live\n * @property {any} [raw] The raw data\n */\nexport interface RawTrackData {\n title: string;\n description: string;\n author: string;\n url: string;\n thumbnail: string;\n duration: string;\n views: number;\n requestedBy?: User | null;\n playlist?: Playlist;\n source?: TrackSource;\n engine?: any; // eslint-disable-line @typescript-eslint/no-explicit-any\n live?: boolean;\n raw?: any; // eslint-disable-line @typescript-eslint/no-explicit-any\n queryType?: SearchQueryType;\n}\n\n/**\n * @typedef {object} TimeData\n * @property {number} days Time in days\n * @property {number} hours Time in hours\n * @property {number} minutes Time in minutes\n * @property {number} seconds Time in seconds\n */\nexport interface TimeData {\n days: number;\n hours: number;\n minutes: number;\n seconds: number;\n}\n\n/**\n * @typedef {object} PlayerProgressbarOptions\n * @property {boolean} [timecodes] If it should render time codes\n * @property {boolean} [queue] If it should create progress bar for the whole queue\n * @property {number} [length] The bar length\n * @property {string} [line] The bar track\n * @property {string} [indicator] The indicator\n */\nexport interface PlayerProgressbarOptions {\n timecodes?: boolean;\n length?: number;\n line?: string;\n indicator?: string;\n queue?: boolean;\n}\n\n/**\n * @typedef {object} PlayerOptions\n * @property {boolean} [leaveOnEnd=true] If it should leave on end\n * @property {boolean} [leaveOnStop=true] If it should leave on stop\n * @property {boolean} [leaveOnEmpty=true] If it should leave on empty\n * @property {number} [leaveOnEmptyCooldown=1000] The cooldown in ms\n * @property {number} [leaveOnEndCooldown=1000] The cooldown in ms\n * @property {boolean} [autoSelfDeaf=true] If it should set the bot in deaf mode\n * @property {YTDLDownloadOptions} [ytdlOptions] The youtube download options\n * @property {number} [initialVolume=100] The initial player volume\n * @property {number} [bufferingTimeout=3000] Buffering timeout for the stream\n * @property {boolean} [spotifyBridge=true] If player should bridge spotify source to youtube\n * @property {boolean} [disableVolume=false] If player should disable inline volume\n * @property {boolean} [disableEqualizer=false] If player should disable equalizer\n * @property {boolean} [disableBiquad=false] If player should disable biquad\n * @property {number} [volumeSmoothness=0] The volume transition smoothness between volume changes (lower the value to get better result)\n * Setting this or leaving this empty will disable this effect. Example: `volumeSmoothness: 0.1`\n * @property {EqualizerBand[]} [equalizerBands] The equalizer bands array for 15 band equalizer.\n * @property {BiquadFilters} [biquadFilter] The biquad filter initializer value\n * @property {boolean} [disableFilters] Disable/enable PCM filter\n * @property {PCMFilters[]} [defaultFilters] The PCM filters initializer\n * @property {Function} [onBeforeCreateStream] Runs before creating stream\n */\nexport interface PlayerOptions {\n leaveOnEnd?: boolean;\n leaveOnEndCooldown?: number;\n leaveOnStop?: boolean;\n leaveOnEmpty?: boolean;\n leaveOnEmptyCooldown?: number;\n autoSelfDeaf?: boolean;\n ytdlOptions?: downloadOptions;\n initialVolume?: number;\n bufferingTimeout?: number;\n spotifyBridge?: boolean;\n disableVolume?: boolean;\n disableEqualizer?: boolean;\n disableBiquad?: boolean;\n volumeSmoothness?: number;\n equalizerBands?: EqualizerBand[];\n biquadFilter?: BiquadFilters;\n disableFilters?: boolean;\n defaultFilters?: PCMFilters[];\n onBeforeCreateStream?: (track: Track, source: SearchQueryType, queue: Queue) => Promise<Readable>;\n}\n\n/**\n * @typedef {object} ExtractorModelData\n * @property {object} [playlist] The playlist info (if any)\n * @property {string} [playlist.title] The playlist title\n * @property {string} [playlist.description] The playlist description\n * @property {string} [playlist.thumbnail] The playlist thumbnail\n * @property {album|playlist} [playlist.type] The playlist type: `album` | `playlist`\n * @property {TrackSource} [playlist.source] The playlist source\n * @property {object} [playlist.author] The playlist author\n * @property {string} [playlist.author.name] The author name\n * @property {string} [playlist.author.url] The author url\n * @property {string} [playlist.id] The playlist id\n * @property {string} [playlist.url] The playlist url\n * @property {any} [playlist.rawPlaylist] The raw data\n * @property {ExtractorData[]} data The data\n */\n\n/**\n * @typedef {object} ExtractorData\n * @property {string} title The title\n * @property {number} duration The duration\n * @property {string} thumbnail The thumbnail\n * @property {string|Readable|Duplex} engine The stream engine\n * @property {number} views The views count\n * @property {string} author The author\n * @property {string} description The description\n * @property {string} url The url\n * @property {string} [version] The extractor version\n * @property {TrackSource} [source=\"arbitrary\"] The source\n */\nexport interface ExtractorModelData {\n playlist?: {\n title: string;\n description: string;\n thumbnail: string;\n type: 'album' | 'playlist';\n source: TrackSource;\n author: {\n name: string;\n url: string;\n };\n id: string;\n url: string;\n rawPlaylist?: any; // eslint-disable-line @typescript-eslint/no-explicit-any\n };\n data: {\n title: string;\n duration: number;\n thumbnail: string;\n engine: string | Readable | Duplex;\n views: number;\n author: string;\n description: string;\n url: string;\n version?: string;\n source?: TrackSource;\n }[];\n}\n\n/**\n * The search query type\n * This can be one of:\n * - AUTO\n * - YOUTUBE\n * - YOUTUBE_PLAYLIST\n * - SOUNDCLOUD_TRACK\n * - SOUNDCLOUD_PLAYLIST\n * - SOUNDCLOUD\n * - SPOTIFY_SONG\n * - SPOTIFY_ALBUM\n * - SPOTIFY_PLAYLIST\n * - FACEBOOK\n * - VIMEO\n * - ARBITRARY\n * - REVERBNATION\n * - YOUTUBE_SEARCH\n * - YOUTUBE_VIDEO\n * - SOUNDCLOUD_SEARCH\n * - APPLE_MUSIC_SONG\n * - APPLE_MUSIC_ALBUM\n * - APPLE_MUSIC_PLAYLIST\n * - FILE\n * @typedef {number} QueryType\n */\nexport const QueryType = {\n AUTO: 'auto',\n YOUTUBE: 'youtube',\n YOUTUBE_PLAYLIST: 'youtubePlaylist',\n SOUNDCLOUD_TRACK: 'soundcloudTrack',\n SOUNDCLOUD_PLAYLIST: 'soundcloudPlaylist',\n SOUNDCLOUD: 'soundcloud',\n SPOTIFY_SONG: 'spotifySong',\n SPOTIFY_ALBUM: 'spotifyAlbum',\n SPOTIFY_PLAYLIST: 'spotifyPlaylist',\n FACEBOOK: 'facebook',\n VIMEO: 'vimeo',\n ARBITRARY: 'arbitrary',\n REVERBNATION: 'reverbnation',\n YOUTUBE_SEARCH: 'youtubeSearch',\n YOUTUBE_VIDEO: 'youtubeVideo',\n SOUNDCLOUD_SEARCH: 'soundcloudSearch',\n APPLE_MUSIC_SONG: 'appleMusicSong',\n APPLE_MUSIC_ALBUM: 'appleMusicAlbum',\n APPLE_MUSIC_PLAYLIST: 'appleMusicPlaylist',\n FILE: 'file'\n} as const;\n\nexport type SearchQueryType = keyof typeof QueryType | (typeof QueryType)[keyof typeof QueryType];\n\n/**\n * Emitted when bot gets disconnected from a voice channel\n * @event Player#botDisconnect\n * @param {Queue} queue The queue\n */\n\n/**\n * Emitted when the voice channel is empty\n * @event Player#channelEmpty\n * @param {Queue} queue The queue\n */\n\n/**\n * Emitted when bot connects to a voice channel\n * @event Player#connectionCreate\n * @param {Queue} queue The queue\n * @param {StreamDispatcher} connection The discord player connection object\n */\n\n/**\n * Debug information\n * @event Player#debug\n * @param {Queue} queue The queue\n * @param {string} message The message\n */\n\n/**\n * Emitted on error\n * <warn>This event should handled properly otherwise it may crash your process!</warn>\n * @event Player#error\n * @param {Queue} queue The queue\n * @param {Error} error The error\n */\n\n/**\n * Emitted on connection error. Sometimes stream errors are emitted here as well.\n * @event Player#connectionError\n * @param {Queue} queue The queue\n * @param {Error} error The error\n */\n\n/**\n * Emitted when queue ends\n * @event Player#queueEnd\n * @param {Queue} queue The queue\n */\n\n/**\n * Emitted when a single track is added\n * @event Player#trackAdd\n * @param {Queue} queue The queue\n * @param {Track} track The track\n */\n\n/**\n * Emitted when multiple tracks are added\n * @event Player#tracksAdd\n * @param {Queue} queue The queue\n * @param {Track[]} tracks The tracks\n */\n\n/**\n * Emitted when a track starts playing\n * @event Player#trackStart\n * @param {Queue} queue The queue\n * @param {Track} track The track\n */\n\n/**\n * Emitted when a track ends\n * @event Player#trackEnd\n * @param {Queue} queue The queue\n * @param {Track} track The track\n */\n\n/**\n * Emitted when voice state updates. Listen to this event to modify internal voice state update handler.\n * @event Player#voiceStateUpdate\n * @param {Queue} queue The queue that this update belongs to\n * @param {VoiceState} oldState The old voice state\n * @param {VoiceState} newState The new voice state\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\nexport interface PlayerEvents {\n //#region legacy\n botDisconnect: (queue: Queue) => any;\n channelEmpty: (queue: Queue) => any;\n connectionCreate: (queue: Queue, connection: StreamDispatcher) => any;\n debug: (queue: Queue, message: string) => any;\n error: (queue: Queue, error: Error) => any;\n connectionError: (queue: Queue, error: Error) => any;\n queueEnd: (queue: Queue) => any;\n trackAdd: (queue: Queue, track: Track) => any;\n tracksAdd: (queue: Queue, track: Track[]) => any;\n trackStart: (queue: Queue, track: Track) => any;\n trackEnd: (queue: Queue, track: Track) => any;\n voiceStateUpdate: (queue: Queue, oldState: VoiceState, newState: VoiceState) => any;\n //#endregion legacy\n}\n\n/* eslint-enable @typescript-eslint/no-explicit-any */\n\n/**\n * @typedef {object} PlayOptions\n * @property {boolean} [filtersUpdate=false] If this play was triggered for filters update\n * @property {string[]} [encoderArgs=[]] FFmpeg args passed to encoder\n * @property {number} [seek] Time to seek to before playing\n * @property {boolean} [immediate=false] If it should start playing the provided track immediately\n */\nexport interface PlayOptions {\n filtersUpdate?: boolean;\n encoderArgs?: string[];\n seek?: number;\n immediate?: boolean;\n}\n\nexport type QueryExtractorSearch = `ext:${string}`;\n\n/**\n * @typedef {object} SearchOptions\n * @property {UserResolvable} requestedBy The user who requested this search\n * @property {typeof QueryType|string} [searchEngine=QueryType.AUTO] The query search engine, can be extractor name to target specific one (custom)\n * @property {boolean} [blockExtractors[]] List of the extractors to block\n */\nexport interface SearchOptions {\n requestedBy?: UserResolvable;\n searchEngine?: SearchQueryType | QueryExtractorSearch;\n blockExtractors?: string[];\n}\n\n/**\n * The queue repeat mode. This can be one of:\n * - OFF\n * - TRACK\n * - QUEUE\n * - AUTOPLAY\n * @typedef {number} QueueRepeatMode\n */\nexport enum QueueRepeatMode {\n OFF = 0,\n TRACK = 1,\n QUEUE = 2,\n AUTOPLAY = 3\n}\n\n/**\n * @typedef {object} PlaylistInitData\n * @property {Track[]} tracks The tracks of this playlist\n * @property {string} title The playlist title\n * @property {string} description The description\n * @property {string} thumbnail The thumbnail\n * @property {album|playlist} type The playlist type: `album` | `playlist`\n * @property {TrackSource} source The playlist source\n * @property {object} author The playlist author\n * @property {string} [author.name] The author name\n * @property {string} [author.url] The author url\n * @property {string} id The playlist id\n * @property {string} url The playlist url\n * @property {any} [rawPlaylist] The raw playlist data\n */\nexport interface PlaylistInitData {\n tracks: Track[];\n title: string;\n description: string;\n thumbnail: string;\n type: 'album' | 'playlist';\n source: TrackSource;\n author: {\n name: string;\n url: string;\n };\n id: string;\n url: string;\n rawPlaylist?: any; // eslint-disable-line @typescript-eslint/no-explicit-any\n}\n\n/**\n * @typedef {object} TrackJSON\n * @property {string} title The track title\n * @property {string} description The track description\n * @property {string} author The author\n * @property {string} url The url\n * @property {string} thumbnail The thumbnail\n * @property {string} duration The duration\n * @property {number} durationMS The duration in ms\n * @property {number} views The views count\n * @property {Snowflake} requestedBy The id of the user who requested this track\n * @property {PlaylistJSON} [playlist] The playlist info (if any)\n */\nexport interface TrackJSON {\n id: Snowflake;\n title: string;\n description: string;\n author: string;\n url: string;\n thumbnail: string;\n duration: string;\n durationMS: number;\n views: number;\n requestedBy: Snowflake;\n playlist?: PlaylistJSON;\n}\n\n/**\n * @typedef {object} PlaylistJSON\n * @property {string} id The playlist id\n * @property {string} url The playlist url\n * @property {string} title The playlist title\n * @property {string} description The playlist description\n * @property {string} thumbnail The thumbnail\n * @property {album|playlist} type The playlist type: `album` | `playlist`\n * @property {TrackSource} source The track source\n * @property {object} author The playlist author\n * @property {string} [author.name] The author name\n * @property {string} [author.url] The author url\n * @property {TrackJSON[]} tracks The tracks data (if any)\n */\nexport interface PlaylistJSON {\n id: string;\n url: string;\n title: string;\n description: string;\n thumbnail: string;\n type: 'album' | 'playlist';\n source: TrackSource;\n author: {\n name: string;\n url: string;\n };\n tracks: TrackJSON[];\n}\n\n/**\n * @typedef {object} PlayerInitOptions\n * @property {boolean} [autoRegisterExtractor=true] If it should automatically register `@discord-player/extractor`\n * @property {YTDLDownloadOptions} [ytdlOptions] The options passed to `ytdl-core`\n * @property {number} [connectionTimeout=20000] The voice connection timeout\n * @property {boolean} [smoothVolume=true] Toggle smooth volume transition\n * @property {boolean} [lagMonitor=30000] Time in ms to re-monitor event loop lag\n * @property {boolean} [lockVoiceStateHandler] Prevent voice state handler from being overridden\n * @property {string[]} [blockExtractors] List of extractors to block\n */\nexport interface PlayerInitOptions {\n autoRegisterExtractor?: boolean;\n ytdlOptions?: downloadOptions;\n connectionTimeout?: number;\n smoothVolume?: boolean;\n lagMonitor?: number;\n lockVoiceStateHandler?: boolean;\n blockExtractors?: string[];\n}\n","import { StageChannel, VoiceChannel } from 'discord.js';\nimport { TimeData } from '../types/types';\nimport { setTimeout } from 'timers/promises';\n\nclass Util {\n /**\n * Utils\n */\n private constructor() {} // eslint-disable-line @typescript-eslint/no-empty-function\n\n /**\n * Creates duration string\n * @param {object} durObj The duration object\n * @returns {string}\n */\n static durationString(durObj: Record<string, number>) {\n return Object.values(durObj)\n .map((m) => (isNaN(m) ? 0 : m))\n .join(':');\n }\n\n /**\n * Parses milliseconds to consumable time object\n * @param {number} milliseconds The time in ms\n * @returns {TimeData}\n */\n static parseMS(milliseconds: number) {\n if (isNaN(milliseconds)) milliseconds = 0;\n const round = milliseconds > 0 ? Math.floor : Math.ceil;\n\n return {\n days: round(milliseconds / 86400000),\n hours: round(milliseconds / 3600000) % 24,\n minutes: round(milliseconds / 60000) % 60,\n seconds: round(milliseconds / 1000) % 60\n } as TimeData;\n }\n\n /**\n * Builds time code\n * @param {TimeData} duration The duration object\n * @returns {string}\n */\n static buildTimeCode(duration: TimeData) {\n const items = Object.keys(duration);\n const required = ['days', 'hours', 'minutes', 'seconds'];\n\n const parsed = items.filter((x) => required.includes(x)).map((m) => duration[m as keyof TimeData]);\n const final = parsed\n .slice(parsed.findIndex((x) => x !== 0))\n .map((x) => x.toString().padStart(2, '0'))\n .join(':');\n\n return final.length <= 3 ? `0:${final.padStart(2, '0') || 0}` : final;\n }\n\n /**\n * Picks last item of the given array\n * @param {any[]} arr The array\n * @returns {any}\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n static last<T = any>(arr: T[]): T {\n if (!Array.isArray(arr)) return arr;\n return arr[arr.length - 1];\n }\n\n /**\n * Checks if the voice channel is empty\n * @param {VoiceChannel|StageChannel} channel The voice channel\n * @returns {boolean}\n */\n static isVoiceEmpty(channel: VoiceChannel | StageChannel) {\n return channel && channel.members.filter((member) => !member.user.bot).size === 0;\n }\n\n /**\n * Safer require\n * @param {string} id Node require id\n * @returns {any}\n */\n static require(id: string) {\n try {\n return require(id);\n } catch {\n return null;\n }\n }\n\n /**\n * Asynchronous timeout\n * @param {number} time The time in ms to wait\n * @returns {Promise<unknown>}\n */\n static wait(time: number) {\n return setTimeout(time, undefined, { ref: false });\n }\n\n static noop() {} // eslint-disable-line @typescript-eslint/no-empty-function\n\n static async getFetch() {\n if ('fetch' in globalThis) return globalThis.fetch;\n for (const lib of ['node-fetch', 'undici']) {\n try {\n return await import(lib).then((res) => res.fetch || res.default?.fetch || res.default);\n } catch {\n try {\n // eslint-disable-next-line\n const res = require(lib);\n if (res) return res.fetch || res.default?.fetch || res.default;\n } catch {\n // no?\n }\n }\n }\n }\n\n static warn(message: string, code = 'DeprecationWarning', detail?: string) {\n process.emitWarning(message, {\n code,\n detail\n });\n }\n}\n\nexport { Util };\n","export enum ErrorStatusCode {\n STREAM_ERROR = 'StreamError',\n AUDIO_PLAYER_ERROR = 'AudioPlayerError',\n PLAYER_ERROR = 'PlayerError',\n NO_AUDIO_RESOURCE = 'NoAudioResource',\n UNKNOWN_GUILD = 'UnknownGuild',\n INVALID_ARG_TYPE = 'InvalidArgType',\n UNKNOWN_EXTRACTOR = 'UnknownExtractor',\n INVALID_EXTRACTOR = 'InvalidExtractor',\n INVALID_CHANNEL_TYPE = 'InvalidChannelType',\n INVALID_TRACK = 'InvalidTrack',\n UNKNOWN_REPEAT_MODE = 'UnknownRepeatMode',\n TRACK_NOT_FOUND = 'TrackNotFound',\n NO_CONNECTION = 'NoConnection',\n DESTROYED_QUEUE = 'DestroyedQueue'\n}\n\nexport class PlayerError extends Error {\n message: string;\n statusCode: ErrorStatusCode;\n createdAt = new Date();\n\n constructor(message: string, code: ErrorStatusCode = ErrorStatusCode.PLAYER_ERROR) {\n super();\n\n this.message = `[${code}] ${message}`;\n this.statusCode = code;\n this.name = code;\n\n Error.captureStackTrace(this);\n }\n\n get createdTimestamp() {\n return this.createdAt.getTime();\n }\n\n valueOf() {\n return this.statusCode;\n }\n\n toJSON() {\n return {\n stack: this.stack,\n code: this.statusCode,\n message: this.message,\n created: this.createdTimestamp\n };\n }\n\n toString() {\n return this.stack;\n }\n}\n","import { FFmpeg } from 'prism-media';\nimport type { Duplex, Readable } from 'stream';\n\nexport interface FFmpegStreamOptions {\n fmt?: string;\n encoderArgs?: string[];\n seek?: number;\n skip?: boolean;\n}\n\nexport function FFMPEG_ARGS_STRING(stream: string, fmt?: string) {\n // prettier-ignore\n return [\n \"-reconnect\", \"1\",\n \"-reconnect_streamed\", \"1\",\n \"-reconnect_delay_max\", \"5\",\n \"-i\", stream,\n \"-analyzeduration\", \"0\",\n \"-loglevel\", \"0\",\n \"-f\", `${typeof fmt === \"string\" ? fmt : \"s16le\"}`,\n \"-ar\", \"48000\",\n \"-ac\", \"2\"\n ];\n}\n\nexport function FFMPEG_ARGS_PIPED(fmt?: string) {\n // prettier-ignore\n return [\n \"-analyzeduration\", \"0\",\n \"-loglevel\", \"0\",\n \"-f\", `${typeof fmt === \"string\" ? fmt : \"s16le\"}`,\n \"-ar\", \"48000\",\n \"-ac\", \"2\"\n ];\n}\n\n/**\n * Creates FFmpeg stream\n * @param stream The source stream\n * @param options FFmpeg stream options\n */\nexport function createFFmpegStream(stream: Readable | Duplex | string, options?: FFmpegStreamOptions) {\n if (options?.skip && typeof stream !== 'string') return stream;\n options ??= {};\n const args = typeof stream === 'string' ? FFMPEG_ARGS_STRING(stream, options.fmt) : FFMPEG_ARGS_PIPED(options.fmt);\n\n if (!Number.isNaN(options.seek)) args.unshift('-ss', String(options.seek));\n if (Array.isArray(options.encoderArgs)) args.push(...options.encoderArgs);\n\n const transcoder = new FFmpeg({ shell: false, args });\n transcoder.on('close', () => transcoder.destroy());\n\n if (typeof stream !== 'string') {\n stream.on('error', () => transcoder.destroy());\n stream.pipe(transcoder);\n }\n\n return transcoder;\n}\n","import { YouTube } from 'youtube-sr';\nimport { QueryType } from '../types/types';\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport { validateURL as SoundcloudValidateURL } from 'soundcloud-scraper';\n\n// #region scary things below *sigh*\nconst spotifySongRegex = /^https?:\\/\\/(?:embed\\.|open\\.)(?:spotify\\.com\\/)(?:track\\/|\\?uri=spotify:track:)((\\w|-){22})(\\?si=.+)?$/;\nconst spotifyPlaylistRegex = /^https?:\\/\\/(?:embed\\.|open\\.)(?:spotify\\.com\\/)(?:playlist\\/|\\?uri=spotify:playlist:)((\\w|-){22})(\\?si=.+)?$/;\nconst spotifyAlbumRegex = /^https?:\\/\\/(?:embed\\.|open\\.)(?:spotify\\.com\\/)(?:album\\/|\\?uri=spotify:album:)((\\w|-){22})(\\?si=.+)?$/;\nconst vimeoRegex = /^(http|https)?:\\/\\/(www\\.|player\\.)?vimeo\\.com\\/(?:channels\\/(?:\\w+\\/)?|groups\\/([^/]*)\\/videos\\/|video\\/|)(\\d+)(?:|\\/\\?)$/;\nconst reverbnationRegex = /^https:\\/\\/(www.)?reverbnation.com\\/(.+)\\/song\\/(.+)$/;\nconst attachmentRegex = /^https?:\\/\\/.+$/;\nconst appleMusicSongRegex = /^https?:\\/\\/music\\.apple\\.com\\/.+?\\/(song|album)\\/.+?(\\/.+?\\?i=|\\/)([0-9]+)$/;\nconst appleMusicPlaylistRegex = /^https?:\\/\\/music\\.apple\\.com\\/.+?\\/playlist\\/.+\\/pl\\.[a-f0-9]+$/;\nconst appleMusicAlbumRegex = /^https?:\\/\\/music\\.apple\\.com\\/.+?\\/album\\/.+\\/([0-9]+)$/;\n// #endregion scary things above *sigh*\n\nclass QueryResolver {\n /**\n * Query resolver\n */\n private constructor() {} // eslint-disable-line @typescript-eslint/no-empty-function\n\n static get regex() {\n return {\n spotifyAlbumRegex,\n spotifyPlaylistRegex,\n spotifySongRegex,\n vimeoRegex,\n reverbnationRegex,\n attachmentRegex,\n appleMusicAlbumRegex,\n appleMusicPlaylistRegex,\n appleMusicSongRegex\n };\n }\n\n /**\n * Resolves the given search query\n * @param {string} query The query\n * @returns {QueryType}\n */\n static resolve(query: string): (typeof QueryType)[keyof typeof QueryType] {\n query = query.trim();\n if (SoundcloudValidateURL(query, 'track')) return QueryType.SOUNDCLOUD_TRACK;\n if (SoundcloudValidateURL(query, 'playlist') || query.includes('/sets/')) return QueryType.SOUNDCLOUD_PLAYLIST;\n if (YouTube.isPlaylist(query)) return QueryType.YOUTUBE_PLAYLIST;\n if (QueryResolver.validateId(query) || QueryResolver.validateURL(query)) return QueryType.YOUTUBE_VIDEO;\n if (spotifySongRegex.test(query)) return QueryType.SPOTIFY_SONG;\n if (spotifyPlaylistRegex.test(query)) return QueryType.SPOTIFY_PLAYLIST;\n if (spotifyAlbumRegex.test(query)) return QueryType.SPOTIFY_ALBUM;\n if (vimeoRegex.test(query)) return QueryType.VIMEO;\n if (reverbnationRegex.test(query)) return QueryType.REVERBNATION;\n if (appleMusicAlbumRegex.test(query)) return QueryType.APPLE_MUSIC_ALBUM;\n if (appleMusicPlaylistRegex.test(query)) return QueryType.APPLE_MUSIC_PLAYLIST;\n if (appleMusicSongRegex.test(query)) return QueryType.APPLE_MUSIC_SONG;\n if (attachmentRegex.test(query)) return QueryType.ARBITRARY;\n\n return QueryType.YOUTUBE_SEARCH;\n }\n\n /**\n * Parses vimeo id from url\n * @param {string} query The query\n * @returns {string}\n */\n static getVimeoID(query: string): string | null | undefined {\n return QueryResolver.resolve(query) === QueryType.VIMEO\n ? query\n .split('/')\n .filter((x) => !!x)\n .pop()\n : null;\n }\n\n static validateId(q: string) {\n return YouTube.Regex.VIDEO_ID.test(q);\n }\n\n static validateURL(q: string) {\n return YouTube.Regex.VIDEO_URL.test(q);\n }\n}\n\nexport { QueryResolver };\n","import { VoiceChannel, StageChannel, Snowflake } from 'discord.js';\nimport { DiscordGatewayAdapterCreator, joinVoiceChannel, VoiceConnection, getVoiceConnection } from '@discordjs/voice';\nimport { StreamDispatcher } from './StreamDispatcher';\nimport { Collection } from '@discord-player/utils';\n\nclass VoiceUtils {\n public cache: Collection<Snowflake, StreamDispatcher>;\n\n /**\n * The voice utils\n * @private\n */\n constructor() {\n /**\n * The cache where voice utils stores stream managers\n * @type {Collection<Snowflake, StreamDispatcher>}\n */\n this.cache = new Collection<Snowflake, StreamDispatcher>();\n }\n\n /**\n * Joins a voice channel, creating basic stream dispatch manager\n * @param {StageChannel|VoiceChannel} channel The voice channel\n * @param {object} [options] Join options\n * @returns {Promise<StreamDispatcher>}\n */\n public async connect(\n channel: VoiceChannel | StageChannel,\n options?: {\n deaf?: boolean;\n maxTime?: number;\n }\n ): Promise<StreamDispatcher> {\n const conn = await this.join(channel, options);\n const sub = new StreamDispatcher(conn, channel, options?.maxTime);\n this.cache.set(channel.guild.id, sub);\n return sub;\n }\n\n /**\n * Joins a voice channel\n * @param {StageChannel|VoiceChannel} [channel] The voice/stage channel to join\n * @param {object} [options] Join options\n * @returns {VoiceConnection}\n */\n public async join(\n channel: VoiceChannel | StageChannel,\n options?: {\n deaf?: boolean;\n maxTime?: number;\n }\n ) {\n const conn = joinVoiceChannel({\n guildId: channel.guild.id,\n channelId: channel.id,\n adapterCreator: channel.guild.voiceAdapterCreator as unknown as DiscordGatewayAdapterCreator,\n selfDeaf: Boolean(options?.deaf)\n });\n\n return conn;\n }\n\n /**\n * Disconnects voice connection\n * @param {VoiceConnection} connection The voice connection\n * @returns {void}\n */\n public disconnect(connection: VoiceConnection | StreamDispatcher) {\n if (connection instanceof StreamDispatcher) return connection.voiceConnection.destroy();\n return connection.destroy();\n }\n\n /**\n * Returns Discord Player voice connection\n * @param {Snowflake} guild The guild id\n * @returns {StreamDispatcher}\n */\n public getConnection(guild: Snowflake) {\n return this.cache.get(guild) || getVoiceConnection(guild);\n }\n}\n\nexport { VoiceUtils };\n","import {\n AudioPlayer,\n AudioPlayerError,\n AudioPlayerStatus,\n AudioResource,\n createAudioPlayer,\n createAudioResource,\n entersState,\n StreamType,\n VoiceConnection,\n VoiceConnectionStatus,\n VoiceConnectionDisconnectReason\n} from '@discordjs/voice';\nimport { StageChannel, VoiceChannel } from 'discord.js';\nimport { Duplex, Readable } from 'stream';\nimport { EventEmitter } from '@discord-player/utils';\nimport { Track } from '../Structures/Track';\nimport { Util } from '../utils/Util';\nimport { PlayerError, ErrorStatusCode } from '../Structures/PlayerError';\nimport { EqualizerBand, BiquadFilters, PCMFilters, FiltersChain } from '@discord-player/equalizer';\n\ninterface CreateStreamOps {\n type?: StreamType;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n data?: any;\n disableVolume?: boolean;\n disableEqualizer?: boolean;\n disableBiquad?: boolean;\n eq?: EqualizerBand[];\n biquadFilter?: BiquadFilters;\n disableFilters?: boolean;\n defaultFilters?: PCMFilters[];\n volume?: number;\n disableResampler?: boolean;\n sampleRate?: number;\n}\n\nexport interface VoiceEvents {\n /* eslint-disable @typescript-eslint/no-explicit-any */\n error: (error: AudioPlayerError) => any;\n debug: (message: string) => any;\n start: (resource: AudioResource<Track>) => any;\n finish: (resource: AudioResource<Track>) => any;\n dsp: (filters: PCMFilters[]) => any;\n eqBands: (filters: EqualizerBand[]) => any;\n sampleRate: (filters: number) => any;\n biquad: (filters: BiquadFilters) => any;\n volume: (volume: number) => any;\n /* eslint-enable @typescript-eslint/no-explicit-any */\n}\n\nclass StreamDispatcher extends EventEmitter<VoiceEvents> {\n public readonly voiceConnection: VoiceConnection;\n public readonly audioPlayer: AudioPlayer;\n public channel: VoiceChannel | StageChannel;\n public audioResource?: AudioResource<Track> | null;\n private readyLock = false;\n public dsp = new FiltersChain();\n\n /**\n * Creates new connection object\n * @param {VoiceConnection} connection The connection\n * @param {VoiceChannel|StageChannel} channel The connected channel\n * @private\n */\n constructor(connection: VoiceConnection, channel: VoiceChannel | StageChannel, public readonly connectionTimeout: number = 20000) {\n super();\n\n /**\n * The voice connection\n * @type {VoiceConnection}\n */\n this.voiceConnection = connection;\n\n /**\n * The audio player\n * @type {AudioPlayer}\n */\n this.audioPlayer = createAudioPlayer();\n\n /**\n * The voice channel\n * @type {VoiceChannel|StageChannel}\n */\n this.channel = channel;\n\n this.dsp.onUpdate = () => {\n if (!this.dsp) return;\n if (this.dsp.filters?.filters) this.emit('dsp', this.dsp.filters?.filters);\n if (this.dsp.biquad?.filter) this.emit('biquad', this.dsp.biquad?.filter);\n if (this.dsp.equalizer) this.emit('eqBands', this.dsp.equalizer.getEQ());\n if (this.dsp.volume) this.emit('volume', this.dsp.volume.volume);\n if (this.dsp.resampler) this.emit('sampleRate', this.dsp.resampler.targetSampleRate);\n };\n\n this.dsp.onError = (e) => this.emit('error', e as AudioPlayerError);\n\n this.voiceConnection.on('stateChange', async (_, newState) => {\n if (newState.status === VoiceConnectionStatus.Disconnected) {\n if (newState.reason === VoiceConnectionDisconnectReason.WebSocketClose && newState.closeCode === 4014) {\n try {\n await entersState(this.voiceConnection, VoiceConnectionStatus.Connecting, this.connectionTimeout);\n } catch {\n try {\n this.voiceConnection.destroy();\n } catch (err) {\n this.emit('error', err as AudioPlayerError);\n }\n }\n } else if (this.voiceConnection.rejoinAttempts < 5) {\n await Util.wait((this.voiceConnection.rejoinAttempts + 1) * 5000);\n this.voiceConnection.rejoin();\n } else {\n try {\n this.voiceConnection.destroy();\n } catch (err) {\n this.emit('error', err as AudioPlayerError);\n }\n }\n } else if (newState.status === VoiceConnectionStatus.Destroyed) {\n this.end();\n } else if (!this.readyLock && (newState.status === VoiceConnectionStatus.Connecting || newState.status === VoiceConnectionStatus.Signalling)) {\n this.readyLock = true;\n try {\n await entersState(this.voiceConnection, VoiceConnectionStatus.Ready, this.connectionTimeout);\n } catch {\n if (this.voiceConnection.state.status !== VoiceConnectionStatus.Destroyed) {\n try {\n this.voiceConnection.destroy();\n } catch (err) {\n this.emit('error', err as AudioPlayerError);\n }\n }\n } finally {\n this.readyLock = false;\n }\n }\n });\n\n this.audioPlayer.on('stateChange', (oldState, newState) => {\n if (newState.status === AudioPlayerStatus.Playing) {\n if (!this.paused) return void this.emit('start', this.audioResource!);\n } else if (newState.status === AudioPlayerStatus.Idle && oldState.status !== AudioPlayerStatus.Idle) {\n if (!this.paused) {\n void this.emit('finish', this.audioResource!);\n this.dsp.destroy();\n this.audioResource = null;\n }\n }\n });\n\n this.audioPlayer.on('debug', (m) => void this.emit('debug', m));\n this.audioPlayer.on('error', (error) => void this.emit('error', error));\n this.voiceConnection.subscribe(this.audioPlayer);\n }\n\n /**\n * Check if the player has been paused manually\n */\n get paused() {\n return this.audioPlayer.state.status === AudioPlayerStatus.Paused;\n }\n\n set paused(val: boolean) {\n val ? this.pause(true) : this.resume();\n }\n\n /**\n * Whether or not the player is currently paused automatically or manually.\n */\n isPaused() {\n return this.paused || this.audioPlayer.state.status === AudioPlayerStatus.AutoPaused;\n }\n\n /**\n * Whether or not the player is currently buffering\n */\n isBuffering() {\n return this.audioPlayer.state.status === AudioPlayerStatus.Buffering;\n }\n\n /**\n * Whether or not the player is currently playing\n */\n isPlaying() {\n return this.audioPlayer.state.status === AudioPlayerStatus.Playing;\n }\n\n /**\n * Whether or not the player is currently idle\n */\n isIdle() {\n return this.audioPlayer.state.status === AudioPlayerStatus.Idle;\n }\n\n /**\n * Creates stream\n * @param {Readable|Duplex|string} src The stream source\n * @param {object} [ops] Options\n * @returns {AudioResource}\n */\n createStream(src: Readable | Duplex | string, ops?: CreateStreamOps) {\n const stream =\n !ops?.disableFilters && typeof src !== 'string'\n ? this.dsp.create(src, {\n dsp: {\n filters: ops?.defaultFilters,\n disabled: ops?.disableFilters\n },\n biquad: ops?.biquadFilter\n ? {\n filter: ops.biquadFilter,\n disabled: ops?.disableBiquad\n }\n : undefined,\n resampler: {\n targetSampleRate: ops?.sampleRate,\n disabled: ops?.disableResampler\n },\n equalizer: {\n bandMultiplier: ops?.eq,\n disabled: ops?.disableEqualizer\n },\n volume: {\n volume: ops?.volume,\n disabled: ops?.disableVolume\n }\n })\n : src;\n\n this.audioResource = createAudioResource(stream, {\n inputType: ops?.type ?? StreamType.Arbitrary,\n metadata: ops?.data,\n // volume controls happen from AudioFilter DSP utility\n inlineVolume: false\n });\n\n return this.audioResource;\n }\n\n public get resampler() {\n return this.dsp?.resampler;\n }\n\n public get filters() {\n return this.dsp?.filters;\n }\n\n public get biquad() {\n return this.dsp?.biquad || null;\n }\n\n public get equalizer() {\n return this.dsp?.equalizer || null;\n }\n\n /**\n * The player status\n * @type {AudioPlayerStatus}\n */\n get status() {\n return this.audioPlayer.state.status;\n }\n\n /**\n * Disconnects from voice\n * @returns {void}\n */\n disconnect() {\n try {\n this.audioPlayer.stop(true);\n this.voiceConnection.destroy();\n } catch {} // eslint-disable-line no-empty\n }\n\n /**\n * Stops the player\n * @returns {void}\n */\n end() {\n this.audioPlayer.stop();\n }\n\n /**\n * Pauses the stream playback\n * @param {boolean} [interpolateSilence=false] If true, the player will play 5 packets of silence after pausing to prevent audio glitches.\n * @returns {boolean}\n */\n pause(interpolateSilence?: boolean) {\n const success = this.audioPlayer.pause(interpolateSilence);\n return success;\n }\n\n /**\n * Resumes the stream playback\n * @returns {boolean}\n */\n resume() {\n const success = this.audioPlayer.unpause();\n return success;\n }\n\n /**\n * Play stream\n * @param {AudioResource<Track>} [resource=this.audioResource] The audio resource to play\n * @returns {Promise<StreamDispatcher>}\n */\n async playStream(resource: AudioResource<Track> = this.audioResource!) {\n if (!resource) throw new PlayerError('Audio resource is not available!', ErrorStatusCode.NO_AUDIO_RESOURCE);\n if (resource.ended) {\n return void this.emit('finish', resource);\n }\n if (!this.audioResource) this.audioResource = resource;\n if (this.voiceConnection.state.status !== VoiceConnectionStatus.Ready) {\n try {\n await entersState(this.voiceConnection, VoiceConnectionStatus.Ready, this.connectionTimeout);\n } catch (err) {\n return void this.emit('error', err as AudioPlayerError);\n }\n }\n\n try {\n this.audioPlayer.play(resource);\n } catch (e) {\n this.emit('error', e as AudioPlayerError);\n }\n\n return this;\n }\n\n /**\n * Sets playback volume\n * @param {number} value The volume amount\n * @returns {boolean}\n */\n setVolume(value: number) {\n if (!this.dsp.volume) return false;\n return this.dsp.volume.setVolume(value);\n }\n\n /**\n * The current volume\n * @type {number}\n */\n get volume() {\n if (!this.dsp.volume) return 100;\n return this.dsp.volume.volume;\n }\n\n /**\n * The playback time\n * @type {number}\n */\n get streamTime() {\n if (!this.audioResource) return 0;\n return this.audioResource.playbackDuration;\n }\n}\n\nexport { StreamDispatcher as StreamDispatcher };\n","import { User } from 'discord.js';\nimport { BaseExtractor } from '../extractors/BaseExtractor';\nimport { Player } from '../Player';\nimport { QueryExtractorSearch, QueryType, SearchQueryType } from '../types/types';\nimport { Playlist } from './Playlist';\nimport { Track } from './Track';\n\nexport interface SearchResultData {\n query: string;\n queryType?: SearchQueryType | QueryExtractorSearch | null;\n extractor?: BaseExtractor | null;\n playlist?: Playlist | null;\n tracks?: Track[];\n requestedBy?: User | null;\n}\n\nexport class SearchResult {\n public constructor(public player: Player, private _data: SearchResultData) {}\n\n public get query() {\n return this._data.query;\n }\n\n public get queryType() {\n return this._data.queryType || QueryType.AUTO;\n }\n\n public get extractor() {\n return this._data.extractor || null;\n }\n\n public get playlist() {\n return this._data.playlist;\n }\n\n public get tracks() {\n return this._data.tracks || [];\n }\n\n public get requestedBy() {\n return this._data.requestedBy || null;\n }\n\n public async execute() {\n return this.player.search(this.query, {\n searchEngine: this.queryType,\n requestedBy: this.requestedBy!\n });\n }\n\n public isEmpty() {\n return !this.tracks.length;\n }\n\n public hasPlaylist() {\n return this.playlist != null;\n }\n\n public hasTracks() {\n return this.tracks.length > 0;\n }\n\n public toJSON() {\n return {\n query: this.query,\n queryType: this.queryType,\n playlist: this.playlist?.toJSON(false) || null,\n tracks: this.tracks.map((m) => m.toJSON(true)),\n extractor: this.extractor?.identifier || null,\n requestedBy: this.requestedBy?.toJSON() || null\n };\n }\n}\n","import { EqualizerBand, PCMFilters, BiquadFilters } from '@discord-player/equalizer';\nimport { Collection, QueueStrategy } from '@discord-player/utils';\nimport { GuildResolvable } from 'discord.js';\nimport { Player } from '../../Player';\nimport { GuildQueue, OnBeforeCreateStreamHandler } from './GuildQueue';\nimport { QueueRepeatMode } from '../../types/types';\n\nexport interface GuildNodeCreateOptions<T = unknown> {\n strategy?: QueueStrategy;\n volume?: number | boolean;\n equalizer?: EqualizerBand[] | boolean;\n a_filter?: PCMFilters[] | boolean;\n biquad?: BiquadFilters | boolean;\n resampler?: number | boolean;\n disableHistory?: boolean;\n skipOnNoStream?: boolean;\n onBeforeCreateStream?: OnBeforeCreateStreamHandler;\n repeatMode?: QueueRepeatMode;\n leaveOnEmpty?: boolean;\n leaveOnEmptyCooldown?: number;\n leaveOnEnd?: boolean;\n leaveOnEndCooldown?: number;\n leaveOnStop?: boolean;\n leaveOnStopCooldown?: number;\n metadata?: T | null;\n}\n\nexport type NodeResolvable = GuildQueue | GuildResolvable;\n\nexport class GuildNodeManager<Meta = unknown> {\n public cache = new Collection<string, GuildQueue>();\n public constructor(public player: Player) {}\n\n public create<T = Meta>(guild: GuildResolvable, options: GuildNodeCreateOptions<T> = {}): GuildQueue<T> {\n const server = this.player.client.guilds.resolve(guild);\n if (!server) {\n throw new Error('Invalid or unknown guild');\n }\n\n if (this.cache.has(server.id)) {\n return this.cache.get(server.id) as GuildQueue<T>;\n }\n\n options.strategy ??= 'FIFO';\n options.volume ??= 100;\n options.equalizer ??= [];\n options.a_filter ??= [];\n options.disableHistory ??= false;\n options.skipOnNoStream ??= false;\n options.leaveOnEmpty ??= true;\n options.leaveOnEmptyCooldown ??= 0;\n options.leaveOnEnd ??= true;\n options.leaveOnEndCooldown ??= 0;\n options.leaveOnStop ??= true;\n options.leaveOnStopCooldown ??= 0;\n options.resampler ??= 48000;\n\n const queue = new GuildQueue<T>(this.player, {\n guild: server,\n queueStrategy: options.strategy,\n volume: options.volume,\n equalizer: options.equalizer,\n filterer: options.a_filter,\n biquad: options.biquad,\n resampler: options.resampler,\n disableHistory: options.disableHistory,\n skipOnNoStream: options.skipOnNoStream,\n onBeforeCreateStream: options.onBeforeCreateStream,\n repeatMode: options.repeatMode,\n leaveOnEmpty: options.leaveOnEmpty,\n leaveOnEmptyCooldown: options.leaveOnEmptyCooldown,\n leaveOnEnd: options.leaveOnEnd,\n leaveOnEndCooldown: options.leaveOnEndCooldown,\n leaveOnStop: options.leaveOnStop,\n leaveOnStopCooldown: options.leaveOnStopCooldown,\n metadata: options.metadata\n });\n\n this.cache.set(server.id, queue);\n\n return queue;\n }\n\n public get<T = Meta>(node: NodeResolvable) {\n const queue = this.resolve(node);\n if (!queue) return null;\n\n return (this.cache.get(queue.id) as GuildQueue<T>) || null;\n }\n\n public has(node: NodeResolvable) {\n const id = node instanceof GuildQueue ? node.id : this.player.client.guilds.resolveId(node)!;\n return this.cache.has(id);\n }\n\n public delete(node: NodeResolvable) {\n const queue = this.resolve(node);\n if (!queue) throw new Error('Cannot delete non-existing queue');\n\n queue.node.stop(true);\n\n return this.cache.delete(queue.id);\n }\n\n public resolve<T = Meta>(node: NodeResolvable) {\n if (node instanceof GuildQueue) {\n return node;\n }\n\n return this.cache.get(this.player.client.guilds.resolveId(node)!) as GuildQueue<T> | undefined;\n }\n\n public resolveId(node: NodeResolvable) {\n const q = this.resolve(node);\n return q?.id || null;\n }\n}\n","import { Player } from '../../Player';\nimport { ChannelType, Guild, GuildVoiceChannelResolvable, VoiceBasedChannel, VoiceState } from 'discord.js';\nimport { Collection, Queue, QueueStrategy } from '@discord-player/utils';\nimport { BiquadFilters, EqualizerBand, PCMFilters } from '@discord-player/equalizer';\nimport { Track } from '../Track';\nimport { StreamDispatcher } from '../../VoiceInterface/StreamDispatcher';\nimport { AudioResource } from '@discordjs/voice';\nimport { Util } from '../../utils/Util';\nimport { Playlist } from '../Playlist';\nimport { GuildQueueHistory } from './GuildQueueHistory';\nimport { GuildQueuePlayerNode } from './GuildQueuePlayerNode';\nimport { GuildQueueAudioFilters } from './GuildQueueAudioFilters';\nimport { Readable } from 'stream';\nimport { QueueRepeatMode, SearchQueryType } from '../../types/types';\nimport { setTimeout } from 'timers';\nimport { YouTube } from 'youtube-sr';\n\nexport interface GuildNodeInit<Meta = unknown> {\n guild: Guild;\n queueStrategy: QueueStrategy;\n equalizer: EqualizerBand[] | boolean;\n volume: number | boolean;\n biquad: BiquadFilters | boolean | undefined;\n resampler: number | boolean;\n filterer: PCMFilters[] | boolean;\n disableHistory: boolean;\n skipOnNoStream: boolean;\n onBeforeCreateStream?: OnBeforeCreateStreamHandler;\n repeatMode?: QueueRepeatMode;\n leaveOnEmpty: boolean;\n leaveOnEmptyCooldown: number;\n leaveOnEnd: boolean;\n leaveOnEndCooldown: number;\n leaveOnStop: boolean;\n leaveOnStopCooldown: number;\n metadata?: Meta | null;\n}\n\nexport interface VoiceConnectConfig {\n deaf?: boolean;\n timeout?: number;\n}\n\nexport type OnBeforeCreateStreamHandler = (track: Track, queryType: SearchQueryType, queue: GuildQueue) => Promise<Readable | null>;\n\nexport interface GuildQueueEvents<Meta = unknown> {\n /**\n * Emitted when audio track is added to the queue\n * @param queue The queue where this event occurred\n * @param track The track\n */\n audioTrackAdd: (queue: GuildQueue<Meta>, track: Track) => unknown;\n /**\n * Emitted when audio tracks were added to the queue\n * @param queue The queue where this event occurred\n * @param tracks The tracks array\n */\n audioTracksAdd: (queue: GuildQueue<Meta>, track: Track[]) => unknown;\n /**\n * Emitted when a connection is created\n * @param queue The queue where this event occurred\n */\n connection: (queue: GuildQueue<Meta>) => unknown;\n /**\n * Emitted when the bot is disconnected from the channel\n * @param queue The queue where this event occurred\n */\n disconnect: (queue: GuildQueue<Meta>) => unknown;\n /**\n * Emitted when the queue sends a debug info\n * @param queue The queue where this event occurred\n * @param message The debug message\n */\n debug: (queue: GuildQueue<Meta>, message: string) => unknown;\n /**\n * Emitted when the queue encounters error\n * @param queue The queue where this event occurred\n * @param error The error\n */\n error: (queue: GuildQueue<Meta>, error: Error) => unknown;\n /**\n * Emitted when the voice channel is empty\n * @param queue The queue where this event occurred\n */\n emptyChannel: (queue: GuildQueue<Meta>) => unknown;\n /**\n * Emitted when the queue is empty\n * @param queue The queue where this event occurred\n */\n emptyQueue: (queue: GuildQueue<Meta>) => unknown;\n /**\n * Emitted when the audio player starts streaming audio track\n * @param queue The queue where this event occurred\n * @param track The track that is being streamed\n */\n playerStart: (queue: GuildQueue<Meta>, track: Track) => unknown;\n /**\n * Emitted when the audio player errors while streaming audio track\n * @param queue The queue where this event occurred\n * @param error The error\n * @param track The track that is being streamed\n */\n playerError: (queue: GuildQueue<Meta>, error: Error, track: Track) => unknown;\n /**\n * Emitted when the audio player finishes streaming audio track\n * @param queue The queue where this event occurred\n * @param track The track that was being streamed\n */\n playerFinish: (queue: GuildQueue<Meta>, track: Track) => unknown;\n /**\n * Emitted when the audio player skips current track\n * @param queue The queue where this event occurred\n * @param track The track that was skipped\n */\n playerSkip: (queue: GuildQueue<Meta>, track: Track) => unknown;\n /**\n * Emitted when the voice state is updated.\n * Consuming this event may disable default voice state update handler if `Player.isVoiceStateHandlerLocked()` returns `false`.\n * @param queue The queue where this event occurred\n * @param oldState The old voice state\n * @param newState The new voice state\n */\n voiceStateUpdate: (queue: GuildQueue<Meta>, oldState: VoiceState, newState: VoiceState) => unknown;\n}\n\nexport class GuildQueue<Meta = unknown> {\n #transitioning = false;\n #initializing = false;\n #deleted = false;\n #initializingPromises: Array<(value: boolean | PromiseLike<boolean>) => void> = [];\n private __current: Track | null = null;\n public tracks: Queue<Track>;\n public history = new GuildQueueHistory<Meta>(this);\n public dispatcher: StreamDispatcher | null = null;\n public node = new GuildQueuePlayerNode<Meta>(this);\n public filters = new GuildQueueAudioFilters<Meta>(this);\n public onBeforeCreateStream: OnBeforeCreateStreamHandler = async () => null;\n public repeatMode = QueueRepeatMode.OFF;\n public timeouts = new Collection<string, NodeJS.Timeout>();\n\n public constructor(public player: Player, public options: GuildNodeInit<Meta>) {\n this.tracks = new Queue<Track>(options.queueStrategy);\n if (typeof options.onBeforeCreateStream === 'function') this.onBeforeCreateStream = options.onBeforeCreateStream;\n if (options.repeatMode != null) this.repeatMode = options.repeatMode;\n\n if (this.options.biquad != null && typeof this.options.biquad !== 'boolean') {\n this.filters._lastFiltersCache.biquad = this.options.biquad;\n }\n if (Array.isArray(this.options.equalizer)) {\n this.filters._lastFiltersCache.equalizer = this.options.equalizer;\n }\n if (Array.isArray(this.options.filterer)) {\n this.filters._lastFiltersCache.filters = this.options.filterer;\n }\n if (typeof this.options.resampler === 'number') {\n this.filters._lastFiltersCache.sampleRate = this.options.resampler;\n }\n this.debug(`GuildQueue initialized for guild ${this.options.guild.name} (ID: ${this.options.guild.id})`);\n }\n\n public debug(m: string) {\n this.player.events.emit('debug', this, m);\n }\n\n public get metadata() {\n return this.options.metadata;\n }\n\n public set metadata(m: Meta | undefined | null) {\n this.options.metadata = m;\n }\n\n public setMetadata(m: Meta | undefined | null) {\n this.#warnIfDeleted();\n this.options.metadata = m;\n }\n\n public get initializing() {\n return this.#initializing;\n }\n\n public set initializing(v: boolean) {\n this.#initializing = v;\n if (v) this.#resolveInitializerAwaiters();\n }\n\n public get currentTrack() {\n return this.dispatcher?.audioResource?.metadata || this.__current;\n }\n\n public get deleted() {\n return this.#deleted;\n }\n\n public get channel() {\n return this.dispatcher?.channel || null;\n }\n\n public set channel(c: VoiceBasedChannel | null) {\n if (this.dispatcher) {\n if (c) {\n this.dispatcher.channel = c;\n } else {\n this.delete();\n }\n }\n }\n\n public get connection() {\n return this.dispatcher?.voiceConnection || null;\n }\n\n public get guild() {\n return this.options.guild;\n }\n\n public get id() {\n return this.guild.id;\n }\n\n public setTransitioning(state: boolean) {\n this.#warnIfDeleted();\n this.#transitioning = state;\n }\n\n public isTransitioning() {\n return this.#transitioning;\n }\n\n public setRepeatMode(mode: QueueRepeatMode) {\n this.#warnIfDeleted();\n this.repeatMode = mode;\n }\n\n public isEmpty() {\n this.#warnIfDeleted();\n return this.tracks.size < 1;\n }\n\n public isPlaying() {\n this.#warnIfDeleted();\n return this.dispatcher?.audioResource != null;\n }\n\n public addTrack(track: Track | Track[] | Playlist) {\n this.#warnIfDeleted();\n const toAdd = track instanceof Playlist ? track.tracks : track;\n this.tracks.add(toAdd);\n const isMulti = Array.isArray(toAdd);\n\n if (isMulti) {\n this.player.events.emit('audioTracksAdd', this, toAdd);\n } else {\n this.player.events.emit('audioTrackAdd', this, toAdd);\n }\n }\n\n public async connect(channelResolvable: GuildVoiceChannelResolvable, options?: VoiceConnectConfig) {\n this.#warnIfDeleted();\n const channel = this.player.client.channels.resolve(channelResolvable);\n if (!channel || !channel.isVoiceBased()) {\n throw new Error(`Expected a voice based channel (type ${ChannelType.GuildVoice}/${ChannelType.GuildStageVoice}), received ${channel?.type}`);\n }\n\n this.debug(`Connecting to ${channel.type === ChannelType.GuildStageVoice ? 'stage' : 'voice'} channel ${channel.name} (ID: ${channel.id})`);\n\n if (this.dispatcher) {\n this.debug('Destroying old connection');\n this.#removeListeners(this.dispatcher);\n this.dispatcher.disconnect();\n }\n\n this.dispatcher = await this.player.voiceUtils.connect(channel, {\n deaf: Boolean(options?.deaf),\n maxTime: options?.timeout ?? this.player.options.connectionTimeout ?? 120_000\n });\n\n this.player.events.emit('connection', this);\n\n if (this.channel!.type === ChannelType.GuildStageVoice) {\n await this.channel!.guild.members.me!.voice.setSuppressed(false).catch(async () => {\n return await this.channel!.guild.members.me!.voice.setRequestToSpeak(true).catch(Util.noop);\n });\n }\n\n this.#attachListeners(this.dispatcher);\n\n return this;\n }\n\n public get ping() {\n return this.connection?.ping.udp ?? -1;\n }\n\n public delete() {\n if (this.player.nodes.delete(this.id)) {\n this.#deleted = true;\n }\n }\n\n public awaitInitialization() {\n return new Promise<boolean>((r) => {\n if (!this.#initializing) return r(true);\n this.#initializingPromises.push(r);\n });\n }\n\n #attachListeners(dispatcher: StreamDispatcher) {\n dispatcher.on('error', (e) => this.player.events.emit('error', this, e));\n dispatcher.on('debug', (m) => this.player.events.emit('debug', this, m));\n dispatcher.on('finish', (r) => this.#performFinish(r));\n dispatcher.on('start', (r) => this.#performStart(r));\n dispatcher.on('dsp', (f) => {\n this.filters._lastFiltersCache.filters = f;\n });\n dispatcher.on('biquad', (f) => {\n this.filters._lastFiltersCache.biquad = f;\n });\n dispatcher.on('eqBands', (f) => {\n this.filters._lastFiltersCache.equalizer = f;\n });\n dispatcher.on('volume', (f) => {\n this.filters._lastFiltersCache.volume = f;\n });\n }\n\n #removeListeners(dispatcher: StreamDispatcher) {\n dispatcher.removeAllListeners();\n }\n\n #performStart(resource?: AudioResource<Track>) {\n const track = resource?.metadata || this.currentTrack;\n if (track && !this.isTransitioning()) this.player.events.emit('playerStart', this, track);\n this.setTransitioning(false);\n this.initializing = false;\n }\n\n #performFinish(resource?: AudioResource<Track>) {\n const track = resource?.metadata || this.currentTrack;\n if (track && !this.isTransitioning()) {\n this.history.push(track);\n this.node.resetProgress();\n this.player.events.emit('playerFinish', this, track);\n if (this.tracks.size < 1 && this.repeatMode === QueueRepeatMode.OFF) {\n this.#emitEnd();\n } else {\n if (this.repeatMode === QueueRepeatMode.AUTOPLAY) {\n this.#handleAutoplay(track);\n return;\n }\n if (this.repeatMode === QueueRepeatMode.TRACK) {\n this.__current = this.history.tracks.dispatch() || track;\n return this.node.play(this.__current);\n }\n if (this.repeatMode === QueueRepeatMode.QUEUE) this.tracks.add(this.history.tracks.dispatch() || track);\n this.__current = this.tracks.dispatch()!;\n this.node.play(this.__current, {\n queue: false\n });\n }\n }\n }\n\n #emitEnd() {\n this.__current = null;\n this.player.events.emit('emptyQueue', this);\n if (this.options.leaveOnEnd) {\n const tm: NodeJS.Timeout = setTimeout(() => {\n if (this.tracks.size) return clearTimeout(tm);\n this.dispatcher?.disconnect();\n }, this.options.leaveOnEndCooldown).unref();\n }\n }\n\n async #handleAutoplay(track: Track) {\n let info = await YouTube.getVideo(track.url)\n .then((x) => x.videos![0])\n .catch(Util.noop);\n\n // fallback\n if (!info)\n info = await YouTube.search(track.author)\n .then((x) => x[0])\n .catch(Util.noop);\n\n if (!info) {\n return this.#emitEnd();\n }\n\n const nextTrack = new Track(this.player, {\n title: info.title!,\n url: `https://www.youtube.com/watch?v=${info.id}`,\n duration: info.durationFormatted || Util.buildTimeCode(Util.parseMS(info.duration * 1000)),\n description: info.title!,\n thumbnail: typeof info.thumbnail === 'string' ? info.thumbnail! : info.thumbnail!.url!,\n views: info.views,\n author: info.channel!.name!,\n requestedBy: track.requestedBy,\n source: 'youtube',\n queryType: 'youtubeVideo'\n });\n\n this.node.play(nextTrack, {\n queue: false,\n seek: 0,\n transitionMode: false\n });\n }\n\n #resolveInitializerAwaiters() {\n this.#initializingPromises.forEach((p) => {\n p(!this.#initializing);\n });\n\n this.#initializingPromises = [];\n }\n\n #warnIfDeleted() {\n if (!this.deleted) return;\n Util.warn('Deleted queue usage detected! Please remove references to deleted queues in order to prevent memory leaks.', 'DiscordPlayerWarning');\n }\n}\n","import { Queue } from '@discord-player/utils';\nimport { Track } from '../Track';\nimport { GuildQueue } from './GuildQueue';\n\nexport class GuildQueueHistory<Meta = unknown> {\n public tracks = new Queue<Track>('LIFO');\n public constructor(public queue: GuildQueue<Meta>) {}\n\n public get currentTrack() {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return this.queue.dispatcher?.audioResource?.metadata || ((this.queue as any).__current as Track | null);\n }\n\n public get nextTrack() {\n return this.queue.tracks.at(0) || null;\n }\n\n public get previousTrack() {\n return this.tracks.at(0) || null;\n }\n\n public get disabled() {\n return this.queue.options.disableHistory;\n }\n\n public isEmpty() {\n return this.tracks.size < 1;\n }\n\n public push(track: Track | Track[]) {\n if (this.disabled) return false;\n this.tracks.add(track);\n return true;\n }\n\n public clear() {\n this.tracks.clear();\n }\n\n public next() {\n const track = this.nextTrack;\n if (!track) {\n throw new Error('No next track in the queue');\n }\n\n this.queue.node.skip();\n }\n\n public previous() {\n const track = this.previousTrack;\n if (!track) {\n throw new Error('No previous track in the queue');\n }\n\n this.queue.node.play(track, { queue: true });\n this.queue.node.skip();\n }\n}\n","import { StreamType } from '@discordjs/voice';\nimport { Readable } from 'stream';\nimport { PlayerProgressbarOptions, SearchQueryType } from '../../types/types';\nimport AudioFilters from '../../utils/AudioFilters';\nimport { createFFmpegStream } from '../../utils/FFmpegStream';\nimport { QueryResolver } from '../../utils/QueryResolver';\nimport { Util } from '../../utils/Util';\nimport { Track, TrackResolvable } from '../Track';\nimport { GuildQueue } from './GuildQueue';\n\nexport interface ResourcePlayOptions {\n queue?: boolean;\n seek?: number;\n transitionMode?: boolean;\n}\n\nexport interface PlayerTimestamp {\n current: {\n label: string;\n value: number;\n };\n total: {\n label: string;\n value: number;\n };\n progress: number;\n}\n\nexport class GuildQueuePlayerNode<Meta = unknown> {\n #progress = 0;\n public constructor(public queue: GuildQueue<Meta>) {}\n\n public isIdle() {\n return !!this.queue.dispatcher?.isIdle();\n }\n\n public isBuffering() {\n return !!this.queue.dispatcher?.isBuffering();\n }\n\n public isPlaying() {\n return !!this.queue.dispatcher?.isPlaying();\n }\n\n public isPaused() {\n return !!this.queue.dispatcher?.isPaused();\n }\n\n public resetProgress() {\n this.#progress = 0;\n }\n\n public get playbackTime() {\n if (this.queue.dispatcher?.streamTime == null) return 0;\n const dur = this.#progress + this.queue.dispatcher.streamTime;\n const hasNightcore = this.queue.filters.ffmpeg.filters.includes('nightcore');\n const hasVwave = this.queue.filters.ffmpeg.filters.includes('vaporwave');\n\n if (hasNightcore && hasVwave) return dur * (1.25 + 0.8);\n return hasNightcore ? dur * 1.25 : hasVwave ? dur * 0.8 : dur;\n }\n\n public getTimestamp(): PlayerTimestamp | null {\n if (!this.queue.currentTrack) return null;\n\n const current = this.playbackTime;\n const total = this.queue.currentTrack.durationMS;\n\n return {\n current: {\n label: Util.buildTimeCode(Util.parseMS(current)),\n value: current\n },\n total: {\n label: Util.buildTimeCode(Util.parseMS(total)),\n value: total\n },\n progress: Math.round((current / total) * 100)\n };\n }\n\n public createProgressBar(options?: PlayerProgressbarOptions) {\n const timestamp = this.getTimestamp();\n if (!timestamp) return null;\n\n const { indicator = '🔘', length = 15, line = '▬', timecodes = true } = options || {};\n\n if (isNaN(length) || length < 0 || !Number.isFinite(length)) throw new Error('invalid progressbar length');\n const index = Math.round((timestamp.current.value / timestamp.total.value) * length);\n\n if (index >= 1 && index <= length) {\n const bar = line.repeat(length - 1).split('');\n bar.splice(index, 0, indicator);\n if (timecodes) {\n return `${timestamp.current.label} ┃ ${bar.join('')} ┃ ${timestamp.total.label}`;\n } else {\n return `${bar.join('')}`;\n }\n } else {\n if (timecodes) {\n return `${timestamp.current.label} ┃ ${indicator}${line.repeat(length - 1)} ┃ ${timestamp.total.label}`;\n } else {\n return `${indicator}${line.repeat(length - 1)}`;\n }\n }\n }\n\n public async seek(duration: number) {\n if (!this.queue.currentTrack) return false;\n await this.play(this.queue.currentTrack, {\n seek: duration,\n transitionMode: true\n });\n return true;\n }\n\n public get volume() {\n return this.queue.dispatcher?.volume ?? 100;\n }\n\n public setVolume(vol: number) {\n if (!this.queue.dispatcher) return false;\n const res = this.queue.dispatcher.setVolume(vol);\n if (res) this.queue.filters._lastFiltersCache.volume = vol;\n return res;\n }\n\n public setBitrate(rate: number | 'auto') {\n this.queue.dispatcher?.audioResource?.encoder?.setBitrate(rate === 'auto' ? this.queue.channel?.bitrate ?? 64000 : rate);\n }\n\n public setPaused(state: boolean) {\n if (state) return this.queue.dispatcher?.pause(true) || false;\n return this.queue.dispatcher?.resume() || false;\n }\n\n public pause() {\n return this.setPaused(true);\n }\n\n public resume() {\n return this.setPaused(false);\n }\n\n public skip() {\n if (!this.queue.dispatcher) return false;\n this.queue.setTransitioning(false);\n this.queue.dispatcher.end();\n return true;\n }\n\n public remove(track: TrackResolvable) {\n const foundTrack = this.queue.tracks.find((t, idx) => {\n if (track instanceof Track || typeof track === 'string') {\n return (typeof track === 'string' ? track : track.id) === t.id;\n }\n if (typeof track === 'string') return track === t.id;\n return idx === track;\n });\n if (!foundTrack) return null;\n\n this.queue.tracks.removeOne((t) => t.id === foundTrack.id);\n\n return foundTrack;\n }\n\n public jump(track: TrackResolvable) {\n const removed = this.remove(track);\n if (!removed) return false;\n this.queue.tracks.store.unshift(removed);\n return this.skip();\n }\n\n public getTrackPosition(track: TrackResolvable) {\n return this.queue.tracks.toArray().findIndex((t, idx) => {\n if (track instanceof Track || typeof track === 'string') {\n return (typeof track === 'string' ? track : track.id) === t.id;\n }\n if (typeof track === 'string') return track === t.id;\n return idx === track;\n });\n }\n\n public skipTo(track: TrackResolvable) {\n const idx = this.getTrackPosition(track);\n if (idx < 0) return false;\n const removed = this.remove(idx);\n if (!removed) return false;\n this.queue.tracks.store.splice(0, idx, removed);\n return this.skip();\n }\n\n public insert(track: Track, index = 0) {\n if (!(track instanceof Track)) throw new Error('invalid track');\n this.queue.tracks.store.splice(index, 0, track);\n }\n\n public stop(force = false) {\n if (!this.queue.dispatcher) return false;\n this.queue.dispatcher.end();\n if (force) {\n this.queue.dispatcher.disconnect();\n return true;\n }\n if (this.queue.options.leaveOnStop) {\n const tm: NodeJS.Timeout = setTimeout(() => {\n if (this.isPlaying() || this.queue.tracks.size) return clearTimeout(tm);\n this.queue.dispatcher?.disconnect();\n }, this.queue.options.leaveOnStopCooldown).unref();\n }\n return true;\n }\n\n public async play(res?: Track, options?: ResourcePlayOptions) {\n if (!this.queue.dispatcher?.voiceConnection) {\n throw new Error('No voice connection available');\n }\n\n options = Object.assign(\n {},\n {\n queue: this.queue.currentTrack != null,\n transitionMode: false,\n seek: 0\n } as ResourcePlayOptions,\n options\n )!;\n\n if (res && options.queue) {\n return this.queue.tracks.add(res);\n }\n\n this.queue.debug(`Received play request from guild ${this.queue.guild.name} (ID: ${this.queue.guild.id})`);\n\n const track = res || this.queue.tracks.dispatch();\n if (!track) {\n throw new Error('Play request received but track was not provided');\n }\n\n this.queue.initializing = true;\n\n try {\n const qt: SearchQueryType = track.queryType || (track.raw.source === 'spotify' ? 'spotifySong' : track.raw.source === 'apple_music' ? 'appleMusicSong' : track.raw.source) || 'arbitrary';\n const stream = (await this.queue.onBeforeCreateStream?.(track, qt, this.queue).catch(() => null)) || (await this.#createGenericStream(track).catch(() => null));\n if (!stream) {\n const error = new Error('Could not extract stream for this track');\n this.queue.initializing = false;\n if (this.queue.options.skipOnNoStream) {\n this.queue.player.events.emit('playerSkip', this.queue, track);\n this.queue.player.events.emit('playerError', this.queue, error, track);\n this.play(this.queue.tracks.dispatch());\n return;\n }\n\n throw error;\n }\n\n if (typeof options.seek === 'number' && options.seek >= 0) {\n this.#progress = options.seek;\n } else {\n this.#progress = 0;\n }\n\n const pcmStream = this.#createFFmpegStream(stream, track, options.seek ?? 0);\n const resource = this.queue.dispatcher.createStream(pcmStream, {\n disableBiquad: this.queue.options.biquad === false,\n disableEqualizer: this.queue.options.equalizer === false,\n disableVolume: this.queue.options.volume === false,\n disableFilters: this.queue.options.filterer === false,\n disableResampler: this.queue.options.resampler === false,\n sampleRate: typeof this.queue.options.resampler === 'number' && this.queue.options.resampler > 0 ? this.queue.options.resampler : undefined,\n biquadFilter: this.queue.filters._lastFiltersCache.biquad || undefined,\n eq: this.queue.filters._lastFiltersCache.equalizer,\n defaultFilters: this.queue.filters._lastFiltersCache.filters,\n volume: this.queue.filters._lastFiltersCache.volume,\n data: track,\n type: StreamType.Raw\n });\n\n this.queue.setTransitioning(!!options.transitionMode);\n\n await this.queue.dispatcher.playStream(resource);\n } catch (e) {\n this.queue.initializing = false;\n throw e;\n }\n }\n\n async #createGenericStream(track: Track) {\n const streamInfo = await this.queue.player.extractors.run(async (extractor) => {\n const canStream = await extractor.validate(track.url, track.queryType || QueryResolver.resolve(track.url));\n if (!canStream) return false;\n return await extractor.stream(track);\n });\n if (!streamInfo || !streamInfo.result) {\n return null;\n }\n\n const stream = streamInfo.result;\n return stream;\n }\n\n #createFFmpegStream(stream: Readable | string, track: Track, seek = 0) {\n const ffmpegStream = createFFmpegStream(stream, {\n encoderArgs: this.queue.filters.ffmpeg.filters.length ? ['-af', AudioFilters.create(this.queue.filters.ffmpeg.filters)] : [],\n seek: seek / 1000,\n fmt: 's16le'\n }).on('error', (err) => {\n if (!`${err}`.toLowerCase().includes('premature close')) this.queue.player.events.emit('playerError', this.queue, err, track);\n });\n\n return ffmpegStream;\n }\n}\n","import AudioFilters from '../../utils/AudioFilters';\nimport { GuildQueue } from './GuildQueue';\nimport { BiquadFilters, Equalizer, EqualizerBand, PCMFilters } from '@discord-player/equalizer';\n\ntype Filters = keyof typeof AudioFilters.filters;\n\n// TODO\nexport const EqualizerConfigurationPreset = {\n Jazz: Array.from({ length: 15 }, (_, i) => ({\n band: i,\n gain: i > 2 && i < 6 ? 0.5 : i > 6 && i < 14 ? -0.75 : 0\n })),\n EDM: Array.from(\n {\n length: Equalizer.BAND_COUNT\n },\n (_, i) => ({\n band: i,\n gain: i > 3 && i < 7 ? 0.75 : i > 9 && i < 13 ? -0.75 : 0\n })\n ),\n HipHop: Array.from(\n {\n length: Equalizer.BAND_COUNT\n },\n (_, i) => ({\n band: i,\n gain: i > 4 && i < 8 ? 0.75 : i > 10 && i < 14 ? -0.5 : 0\n })\n ),\n Rock: Array.from(\n {\n length: Equalizer.BAND_COUNT\n },\n (_, i) => ({\n band: i,\n gain: i > 2 && i < 6 ? 0.75 : i > 8 && i < 12 ? -0.75 : 0\n })\n ),\n Metal: Array.from(\n {\n length: Equalizer.BAND_COUNT\n },\n (_, i) => ({\n band: i,\n gain: i > 4 && i < 8 ? 0.75 : i > 9 && i < 14 ? -0.75 : 0\n })\n ),\n Folk: Array.from(\n {\n length: Equalizer.BAND_COUNT\n },\n (_, i) => ({\n band: i,\n gain: i > 3 && i < 7 ? 0.5 : i > 9 && i < 14 ? -0.5 : 0\n })\n ),\n RnB: Array.from(\n {\n length: Equalizer.BAND_COUNT\n },\n (_, i) => ({\n band: i,\n gain: i > 4 && i < 8 ? 0.5 : i > 9 && i < 14 ? -0.5 : 0\n })\n ),\n Country: Array.from(\n {\n length: Equalizer.BAND_COUNT\n },\n (_, i) => ({\n band: i,\n gain: i > 2 && i < 6 ? 0.5 : i > 9 && i < 13 ? -0.5 : 0\n })\n ),\n Classical: Array.from(\n {\n length: Equalizer.BAND_COUNT\n },\n (_, i) => ({\n band: i,\n gain: i > 4 && i < 8 ? 0.5 : i > 10 && i < 14 ? -0.5 : 0\n })\n )\n} as const;\n\nexport class FFmpegFilterer<Meta = unknown> {\n #ffmpegFilters: Filters[] = [];\n public constructor(public af: GuildQueueAudioFilters<Meta>) {}\n\n #setFilters(filters: Filters[]) {\n this.#ffmpegFilters = [...new Set(filters)];\n return this.af.triggerReplay(this.af.queue.node.getTimestamp()?.current.value || 0);\n }\n\n public setFilters(filters: Filters[] | Record<Filters, boolean> | boolean) {\n let _filters: Filters[] = [];\n if (typeof filters === 'boolean') {\n _filters = !filters ? [] : (Object.keys(AudioFilters.filters) as Filters[]);\n } else if (Array.isArray(filters)) {\n _filters = filters;\n } else {\n _filters = Object.entries(filters)\n .filter((res) => res[1] === true)\n .map((m) => m[0]) as Filters[];\n }\n\n return this.#setFilters(_filters);\n }\n\n public get filters() {\n return this.#ffmpegFilters;\n }\n\n public set filters(filters: Filters[]) {\n this.setFilters(filters);\n }\n\n public toggle(filters: Filters[] | Filters) {\n if (!Array.isArray(filters)) filters = [filters];\n const fresh: Filters[] = [];\n\n this.filters.forEach((f) => {\n if (this.filters.includes(f)) return;\n fresh.push(f);\n });\n\n return this.#setFilters(this.#ffmpegFilters.filter((r) => !filters.includes(r)).concat(fresh));\n }\n\n public getFiltersEnabled() {\n return this.#ffmpegFilters;\n }\n\n public getFiltersDisabled() {\n return AudioFilters.names.filter((f) => !this.#ffmpegFilters.includes(f));\n }\n\n public isEnabled<T extends Filters>(filter: T): boolean {\n return this.#ffmpegFilters.includes(filter);\n }\n\n public isDisabled<T extends Filters>(filter: T): boolean {\n return !this.isEnabled(filter);\n }\n\n public isValidFilter(filter: string) {\n return AudioFilters.has(filter as Filters);\n }\n}\n\nexport interface GuildQueueAFiltersCache {\n equalizer: EqualizerBand[];\n biquad: BiquadFilters | null;\n filters: PCMFilters[];\n volume: number;\n sampleRate: number;\n}\n\nexport class GuildQueueAudioFilters<Meta = unknown> {\n public graph = new AFilterGraph<Meta>(this);\n public ffmpeg = new FFmpegFilterer<Meta>(this);\n public equalizerPresets = EqualizerConfigurationPreset;\n public _lastFiltersCache: GuildQueueAFiltersCache = {\n biquad: null,\n equalizer: [],\n filters: [],\n volume: 100,\n sampleRate: -1\n };\n public constructor(public queue: GuildQueue<Meta>) {\n if (typeof this.queue.options.volume === 'number') {\n this._lastFiltersCache.volume = this.queue.options.volume;\n }\n }\n\n public get volume() {\n return this.queue.dispatcher?.dsp?.volume || null;\n }\n\n public get equalizer() {\n return this.queue.dispatcher?.equalizer || null;\n }\n\n public get biquad() {\n return this.queue.dispatcher?.biquad || null;\n }\n\n public get filters() {\n return this.queue.dispatcher?.filters || null;\n }\n\n public get resampler() {\n return this.queue.dispatcher?.resampler || null;\n }\n\n public async triggerReplay(seek = 0) {\n if (!this.queue.currentTrack) return false;\n try {\n await this.queue.node.play(this.queue.currentTrack, {\n queue: false,\n seek,\n transitionMode: true\n });\n\n return true;\n } catch {\n return false;\n }\n }\n}\n\nexport class AFilterGraph<Meta = unknown> {\n public constructor(public af: GuildQueueAudioFilters<Meta>) {}\n\n public get ffmpeg() {\n return this.af.ffmpeg.filters;\n }\n\n public get equalizer() {\n return (this.af.equalizer?.bandMultipliers || []).map((m, i) => ({\n band: i,\n gain: m\n })) as EqualizerBand[];\n }\n\n public get biquad() {\n return null;\n // return (this.af.biquad?.getFilterName() as Exclude<BiquadFilters, number> | null) || null;\n }\n\n public get filters() {\n return this.af.filters?.filters || [];\n }\n\n public get volume() {\n return this.af.volume;\n }\n\n public get resampler() {\n return this.af.resampler;\n }\n\n public dump(): FilterGraph {\n return {\n ffmpeg: this.ffmpeg,\n equalizer: this.equalizer,\n biquad: this.biquad,\n filters: this.filters,\n sampleRate: this.resampler?.targetSampleRate || this.resampler?.sampleRate || 48000,\n volume: this.volume?.volume ?? 100\n };\n }\n}\n\nexport interface FilterGraph {\n ffmpeg: Filters[];\n equalizer: EqualizerBand[];\n biquad: Exclude<BiquadFilters, number> | null;\n filters: PCMFilters[];\n volume: number;\n sampleRate: number;\n}\n"],"mappings":"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","names":["ChannelType","EventEmitter","SnowflakeUtil","QueueRepeatMode","setTimeout","setTimeout","ErrorStatusCode","Collection","YouTube","SnowflakeUtil","Collection","streamTime","YouTube","StreamType","StreamType","Collection","Collection","Collection","Collection","ChannelType","Collection","Queue","Queue","Queue","StreamType","StreamType","setTimeout","YouTube","Collection","Queue","ChannelType","setTimeout","YouTube","Collection","EventEmitter","Collection","ChannelType","AudioFilters","BiquadFilters","PCMFilters","FiltersChain"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/utils/AudioFilters.ts","../src/extractors/BaseExtractor.ts","../src/extractors/ExtractorExecutionContext.ts","../src/Structures/GuildNodeManager.ts","../src/Structures/GuildQueue.ts","../src/Structures/Track.ts","../src/utils/Util.ts","../src/Structures/Playlist.ts","../src/Structures/GuildQueueHistory.ts","../src/Structures/GuildQueuePlayerNode.ts","../src/utils/QueryResolver.ts","../src/types/types.ts","../src/Structures/GuildQueueAudioFilters.ts","../src/utils/FFmpegStream.ts","../src/Structures/GuildQueueStatistics.ts","../src/Structures/SearchResult.ts","../src/Structures/PlayerError.ts","../src/VoiceInterface/VoiceUtils.ts","../src/VoiceInterface/StreamDispatcher.ts","../src/utils/QueryCache.ts","../src/Player.ts","../src/utils/__internal__/_container.ts","../src/utils/__internal__/addPlayer.ts","../src/utils/__internal__/clearPlayer.ts","../src/utils/__internal__/getPlayers.ts"],"sourcesContent":["import { version as djsVersion } from 'discord.js';\n\nexport * from './utils/AudioFilters';\nexport * from './extractors/BaseExtractor';\nexport * from './extractors/ExtractorExecutionContext';\nexport * from './Structures';\nexport * from './VoiceInterface/VoiceUtils';\nexport * from './VoiceInterface/StreamDispatcher';\nexport * from './utils/Util';\nexport * from './types/types';\nexport * from './utils/FFmpegStream';\nexport * from './utils/QueryCache';\nexport * from './Player';\nexport {\n AudioFilters as PCMAudioFilters,\n BiquadFilters,\n FilterType as BiquadFilterType,\n PCMFilters,\n Q_BUTTERWORTH,\n VolumeTransformer,\n BASS_EQ_BANDS,\n AF_NIGHTCORE_RATE,\n AF_VAPORWAVE_RATE,\n FiltersChain\n} from '@discord-player/equalizer';\n\n// eslint-disable-next-line @typescript-eslint/no-inferrable-types\nexport const version: string = '6.0.0-dev.3';\n\nif (!djsVersion.startsWith('14')) {\n process.emitWarning(`Discord.js v${djsVersion} is incompatible with Discord Player v${version}! Please use >=v14.x of Discord.js`);\n}\n","import { FiltersName } from '../types/types';\n\nconst bass = (g: number) => `bass=g=${g}:f=110:w=0.3`;\n\nclass AudioFilters {\n public constructor() {\n return AudioFilters;\n }\n\n public static filters: Record<FiltersName, string> = {\n bassboost_low: bass(15),\n bassboost: bass(20),\n bassboost_high: bass(30),\n '8D': 'apulsator=hz=0.09',\n vaporwave: 'aresample=48000,asetrate=48000*0.8',\n nightcore: 'aresample=48000,asetrate=48000*1.25',\n lofi: 'aresample=48000,asetrate=48000*0.9,extrastereo=m=2.5:c=disabled',\n phaser: 'aphaser=in_gain=0.4',\n tremolo: 'tremolo',\n vibrato: 'vibrato=f=6.5',\n reverse: 'areverse',\n treble: 'treble=g=5',\n normalizer2: 'dynaudnorm=g=101',\n normalizer: 'acompressor',\n surrounding: 'surround',\n pulsator: 'apulsator=hz=1',\n subboost: 'asubboost',\n karaoke: 'stereotools=mlev=0.03',\n flanger: 'flanger',\n gate: 'agate',\n haas: 'haas',\n mcompand: 'mcompand',\n mono: 'pan=mono|c0=.5*c0+.5*c1',\n mstlr: 'stereotools=mode=ms>lr',\n mstrr: 'stereotools=mode=ms>rr',\n compressor: 'compand=points=-80/-105|-62/-80|-15.4/-15.4|0/-12|20/-7.6',\n expander: 'compand=attacks=0:points=-80/-169|-54/-80|-49.5/-64.6|-41.1/-41.1|-25.8/-15|-10.8/-4.5|0/0|20/8.3',\n softlimiter: 'compand=attacks=0:points=-80/-80|-12.4/-12.4|-6/-8|0/-6.8|20/-2.8',\n chorus: 'chorus=0.7:0.9:55:0.4:0.25:2',\n chorus2d: 'chorus=0.6:0.9:50|60:0.4|0.32:0.25|0.4:2|1.3',\n chorus3d: 'chorus=0.5:0.9:50|60|40:0.4|0.32|0.3:0.25|0.4|0.3:2|2.3|1.3',\n fadein: 'afade=t=in:ss=0:d=10',\n dim: `afftfilt=\"'real=re * (1-clip((b/nb)*b,0,1))':imag='im * (1-clip((b/nb)*b,0,1))'\"`,\n earrape: 'channelsplit,sidechaingate=level_in=64'\n };\n\n public static get<K extends FiltersName>(name: K) {\n return this.filters[name];\n }\n\n public static has<K extends FiltersName>(name: K) {\n return name in this.filters;\n }\n\n public static *[Symbol.iterator](): IterableIterator<{ name: FiltersName; value: string }> {\n for (const [k, v] of Object.entries(this.filters)) {\n yield { name: k as FiltersName, value: v as string };\n }\n }\n\n public static get names() {\n return Object.keys(this.filters) as FiltersName[];\n }\n\n // @ts-expect-error AudioFilters.length\n public static get length() {\n return this.names.length;\n }\n\n public static toString() {\n return this.names.map((m) => (this as any)[m]).join(','); // eslint-disable-line @typescript-eslint/no-explicit-any\n }\n\n /**\n * Create ffmpeg args from the specified filters name\n * @param filter The filter name\n * @returns\n */\n public static create<K extends FiltersName>(filters?: K[]) {\n if (!filters || !Array.isArray(filters)) return this.toString();\n return filters\n .filter((predicate) => typeof predicate === 'string')\n .map((m) => this.get(m))\n .join(',');\n }\n\n /**\n * Defines audio filter\n * @param filterName The name of the filter\n * @param value The ffmpeg args\n */\n public static define(filterName: string, value: string) {\n this.filters[filterName as FiltersName] = value;\n }\n\n /**\n * Defines multiple audio filters\n * @param filtersArray Array of filters containing the filter name and ffmpeg args\n */\n public static defineBulk(filtersArray: { name: string; value: string }[]) {\n filtersArray.forEach((arr) => this.define(arr.name, arr.value));\n }\n}\n\nexport default AudioFilters;\nexport { AudioFilters };\n","import { User } from 'discord.js';\nimport { Readable } from 'stream';\nimport { Playlist } from '../Structures/Playlist';\nimport { Track } from '../Structures/Track';\nimport { PlayerEvents, SearchQueryType } from '../types/types';\nimport { ExtractorExecutionContext } from './ExtractorExecutionContext';\n\nexport class BaseExtractor {\n /**\n * Identifier for this extractor\n */\n public static identifier = 'com.discord-player.extractor';\n\n /**\n * Extractor constructor\n * @param context Context that instantiated this extractor\n */\n public constructor(public context: ExtractorExecutionContext) {}\n\n /**\n * Identifier of this extractor\n */\n public get identifier() {\n return (this.constructor as typeof BaseExtractor).identifier;\n }\n\n /**\n * This method will be executed when this extractor is activated\n */\n public async activate() {\n // executed when this extractor is activated\n return;\n }\n\n /**\n * This method will be executed when this extractor is deactivated\n */\n public async deactivate() {\n // executed when this extractor is deactivated\n return;\n }\n\n /**\n * Validate incoming query\n * @param query The query to validate\n */\n public async validate(query: string, type?: SearchQueryType | null): Promise<boolean> {\n void type;\n return false;\n }\n\n /**\n * Stream the given track\n * @param info The track to stream\n */\n public async stream(info: Track): Promise<Readable | string> {\n void info;\n throw new Error('Not Implemented');\n }\n\n /**\n * Handle the given query\n * @param query The query to handle\n */\n public async handle(query: string, context: ExtractorSearchContext): Promise<ExtractorInfo> {\n void context;\n throw new Error('Not Implemented');\n }\n\n /**\n * A stream middleware to handle streams before passing it to the player\n * @param stream The incoming stream\n * @param next The next function\n */\n public handlePostStream(stream: Readable, next: NextFunction) {\n return next(null, stream);\n }\n\n /**\n * Dispatch an event to the player\n * @param event The event to dispatch\n * @param args The data to dispatch\n */\n public emit<K extends keyof PlayerEvents>(event: K, ...args: Parameters<PlayerEvents[K]>) {\n return this.context.player.emit(event, ...args);\n }\n\n /**\n * Create extractor response\n * @param playlist The playlist\n * @param tracks The track array\n */\n public createResponse(playlist?: Playlist | null, tracks: Track[] = playlist?.tracks || []): ExtractorInfo {\n return { playlist: playlist || null, tracks };\n }\n}\n\nexport type NextFunction = (error?: Error | null, stream?: Readable) => void;\n\nexport interface ExtractorInfo {\n playlist: Playlist | null;\n tracks: Track[];\n}\n\nexport interface ExtractorSearchContext {\n type?: SearchQueryType | null;\n requestedBy?: User | null;\n}\n","import { Player } from '../Player';\nimport { Collection } from '@discord-player/utils';\nimport { BaseExtractor } from './BaseExtractor';\n\nexport class ExtractorExecutionContext {\n public store = new Collection<string, BaseExtractor>();\n public constructor(public player: Player) {}\n\n public isRegistered(identifier: string) {\n return this.store.has(identifier);\n }\n\n public get size() {\n return this.store.size;\n }\n\n public get(identifier: string) {\n return this.store.get(identifier);\n }\n\n public async register(_extractor: typeof BaseExtractor) {\n if (typeof _extractor.identifier !== 'string' || this.store.has(_extractor.identifier)) return;\n const extractor = new _extractor(this);\n\n try {\n this.store.set(_extractor.identifier, extractor);\n await extractor.activate();\n } catch {\n this.store.delete(_extractor.identifier);\n }\n }\n\n public async unregister<K extends string | BaseExtractor>(_extractor: K) {\n const extractor = typeof _extractor === 'string' ? this.store.get(_extractor) : this.store.find((r) => r === _extractor);\n if (!extractor) return;\n\n try {\n const key = extractor.identifier || this.store.findKey((e) => e === extractor)!;\n this.store.delete(key);\n await extractor.deactivate();\n } catch {\n // do nothing\n }\n }\n\n public async unregisterAll() {\n try {\n await Promise.all(\n this.store.map((e, k) => {\n this.store.delete(k);\n return e.deactivate();\n })\n );\n } catch {\n // do nothing\n }\n }\n\n public async run<T = unknown>(fn: ExtractorExecutionFN<T>, filterBlocked = true) {\n const blocked = this.player.options.blockExtractors ?? [];\n for (const ext of this.store.values()) {\n if (filterBlocked && blocked.some((e) => e === ext.identifier)) continue;\n const result = await fn(ext).catch(() => {\n return false;\n });\n if (result)\n return {\n extractor: ext,\n result\n } as ExtractorExecutionResult<T>;\n }\n\n return null;\n }\n}\n\nexport interface ExtractorExecutionResult<T = unknown> {\n extractor: BaseExtractor;\n result: T;\n}\nexport type ExtractorExecutionFN<T = unknown> = (extractor: BaseExtractor) => Promise<T | boolean>;\n","import { EqualizerBand, PCMFilters, BiquadFilters } from '@discord-player/equalizer';\nimport { Collection, QueueStrategy } from '@discord-player/utils';\nimport { GuildResolvable } from 'discord.js';\nimport { Player } from '../Player';\nimport { GuildQueue, OnAfterCreateStreamHandler, OnBeforeCreateStreamHandler } from './GuildQueue';\nimport { FiltersName, QueueRepeatMode } from '../types/types';\n\nexport interface GuildNodeCreateOptions<T = unknown> {\n strategy?: QueueStrategy;\n volume?: number | boolean;\n equalizer?: EqualizerBand[] | boolean;\n a_filter?: PCMFilters[] | boolean;\n biquad?: BiquadFilters | boolean;\n resampler?: number | boolean;\n disableHistory?: boolean;\n skipOnNoStream?: boolean;\n onBeforeCreateStream?: OnBeforeCreateStreamHandler;\n onAfterCreateStream?: OnAfterCreateStreamHandler;\n repeatMode?: QueueRepeatMode;\n leaveOnEmpty?: boolean;\n leaveOnEmptyCooldown?: number;\n leaveOnEnd?: boolean;\n leaveOnEndCooldown?: number;\n leaveOnStop?: boolean;\n leaveOnStopCooldown?: number;\n metadata?: T | null;\n selfDeaf?: boolean;\n connectionTimeout?: number;\n defaultFFmpegFilters?: FiltersName[];\n bufferingTimeout?: number;\n}\n\nexport type NodeResolvable = GuildQueue | GuildResolvable;\n\nexport class GuildNodeManager<Meta = unknown> {\n public cache = new Collection<string, GuildQueue>();\n public constructor(public player: Player) {}\n\n /**\n * Create guild queue if it does not exist\n * @param guild The guild which will be the owner of the queue\n * @param options Queue initializer options\n */\n public create<T = Meta>(guild: GuildResolvable, options: GuildNodeCreateOptions<T> = {}): GuildQueue<T> {\n const server = this.player.client.guilds.resolve(guild);\n if (!server) {\n throw new Error('Invalid or unknown guild');\n }\n\n if (this.cache.has(server.id)) {\n return this.cache.get(server.id) as GuildQueue<T>;\n }\n\n options.strategy ??= 'FIFO';\n options.volume ??= 100;\n options.equalizer ??= [];\n options.a_filter ??= [];\n options.disableHistory ??= false;\n options.skipOnNoStream ??= false;\n options.leaveOnEmpty ??= true;\n options.leaveOnEmptyCooldown ??= 0;\n options.leaveOnEnd ??= true;\n options.leaveOnEndCooldown ??= 0;\n options.leaveOnStop ??= true;\n options.leaveOnStopCooldown ??= 0;\n options.resampler ??= 48000;\n options.selfDeaf ??= true;\n options.connectionTimeout ??= this.player.options.connectionTimeout;\n options.bufferingTimeout ??= 1000;\n\n const queue = new GuildQueue<T>(this.player, {\n guild: server,\n queueStrategy: options.strategy,\n volume: options.volume,\n equalizer: options.equalizer,\n filterer: options.a_filter,\n biquad: options.biquad,\n resampler: options.resampler,\n disableHistory: options.disableHistory,\n skipOnNoStream: options.skipOnNoStream,\n onBeforeCreateStream: options.onBeforeCreateStream,\n onAfterCreateStream: options.onAfterCreateStream,\n repeatMode: options.repeatMode,\n leaveOnEmpty: options.leaveOnEmpty,\n leaveOnEmptyCooldown: options.leaveOnEmptyCooldown,\n leaveOnEnd: options.leaveOnEnd,\n leaveOnEndCooldown: options.leaveOnEndCooldown,\n leaveOnStop: options.leaveOnStop,\n leaveOnStopCooldown: options.leaveOnStopCooldown,\n metadata: options.metadata,\n connectionTimeout: options.connectionTimeout ?? 120_000,\n selfDeaf: options.selfDeaf,\n ffmpegFilters: options.defaultFFmpegFilters ?? [],\n bufferingTimeout: options.bufferingTimeout\n });\n\n this.cache.set(server.id, queue);\n\n return queue;\n }\n\n /**\n * Get existing queue\n * @param node Queue resolvable\n */\n public get<T = Meta>(node: NodeResolvable) {\n const queue = this.resolve(node);\n if (!queue) return null;\n\n return (this.cache.get(queue.id) as GuildQueue<T>) || null;\n }\n\n /**\n * Check if a queue exists\n * @param node Queue resolvable\n */\n public has(node: NodeResolvable) {\n const id = node instanceof GuildQueue ? node.id : this.player.client.guilds.resolveId(node)!;\n return this.cache.has(id);\n }\n\n /**\n * Delete queue\n * @param node Queue resolvable\n */\n public delete(node: NodeResolvable) {\n const queue = this.resolve(node);\n if (!queue) throw new Error('Cannot delete non-existing queue');\n\n queue.node.stop(true);\n queue.connection?.removeAllListeners();\n queue.dispatcher?.removeAllListeners();\n queue.dispatcher?.disconnect();\n queue.timeouts.forEach((tm) => clearTimeout(tm));\n queue.history.clear();\n queue.tracks.clear();\n\n return this.cache.delete(queue.id);\n }\n\n /**\n * Resolve queue\n * @param node Queue resolvable\n */\n public resolve<T = Meta>(node: NodeResolvable) {\n if (node instanceof GuildQueue) {\n return node;\n }\n\n return this.cache.get(this.player.client.guilds.resolveId(node)!) as GuildQueue<T> | undefined;\n }\n\n /**\n * Resolve queue id\n * @param node Queue resolvable\n */\n public resolveId(node: NodeResolvable) {\n const q = this.resolve(node);\n return q?.id || null;\n }\n}\n","import { Player } from '../Player';\nimport { ChannelType, Guild, GuildVoiceChannelResolvable, VoiceBasedChannel, VoiceState } from 'discord.js';\nimport { Collection, Queue, QueueStrategy } from '@discord-player/utils';\nimport { BiquadFilters, EqualizerBand, PCMFilters } from '@discord-player/equalizer';\nimport { Track } from './Track';\nimport { StreamDispatcher } from '../VoiceInterface/StreamDispatcher';\nimport { AudioResource, StreamType } from '@discordjs/voice';\nimport { Util } from '../utils/Util';\nimport { Playlist } from './Playlist';\nimport { GuildQueueHistory } from './GuildQueueHistory';\nimport { GuildQueuePlayerNode } from './GuildQueuePlayerNode';\nimport { GuildQueueAudioFilters } from './GuildQueueAudioFilters';\nimport { Readable } from 'stream';\nimport { FiltersName, QueueRepeatMode, SearchQueryType } from '../types/types';\nimport { setTimeout } from 'timers';\nimport { YouTube } from 'youtube-sr';\nimport { GuildQueueStatistics } from './GuildQueueStatistics';\n\nexport interface GuildNodeInit<Meta = unknown> {\n guild: Guild;\n queueStrategy: QueueStrategy;\n equalizer: EqualizerBand[] | boolean;\n volume: number | boolean;\n biquad: BiquadFilters | boolean | undefined;\n resampler: number | boolean;\n filterer: PCMFilters[] | boolean;\n ffmpegFilters: FiltersName[];\n disableHistory: boolean;\n skipOnNoStream: boolean;\n onBeforeCreateStream?: OnBeforeCreateStreamHandler;\n onAfterCreateStream?: OnAfterCreateStreamHandler;\n repeatMode?: QueueRepeatMode;\n leaveOnEmpty: boolean;\n leaveOnEmptyCooldown: number;\n leaveOnEnd: boolean;\n leaveOnEndCooldown: number;\n leaveOnStop: boolean;\n leaveOnStopCooldown: number;\n connectionTimeout: number;\n selfDeaf?: boolean;\n metadata?: Meta | null;\n bufferingTimeout: number;\n}\n\nexport interface VoiceConnectConfig {\n deaf?: boolean;\n timeout?: number;\n}\n\nexport interface PostProcessedResult {\n stream: Readable;\n type: StreamType;\n}\n\nexport type OnBeforeCreateStreamHandler = (track: Track, queryType: SearchQueryType, queue: GuildQueue) => Promise<Readable | null>;\nexport type OnAfterCreateStreamHandler = (stream: Readable, queue: GuildQueue) => Promise<PostProcessedResult | null>;\n\nexport type PlayerTriggeredReason = 'filters' | 'normal';\n\nexport interface GuildQueueEvents<Meta = unknown> {\n /**\n * Emitted when audio track is added to the queue\n * @param queue The queue where this event occurred\n * @param track The track\n */\n audioTrackAdd: (queue: GuildQueue<Meta>, track: Track) => unknown;\n /**\n * Emitted when audio tracks were added to the queue\n * @param queue The queue where this event occurred\n * @param tracks The tracks array\n */\n audioTracksAdd: (queue: GuildQueue<Meta>, track: Track[]) => unknown;\n /**\n * Emitted when a connection is created\n * @param queue The queue where this event occurred\n */\n connection: (queue: GuildQueue<Meta>) => unknown;\n /**\n * Emitted when the bot is disconnected from the channel\n * @param queue The queue where this event occurred\n */\n disconnect: (queue: GuildQueue<Meta>) => unknown;\n /**\n * Emitted when the queue sends a debug info\n * @param queue The queue where this event occurred\n * @param message The debug message\n */\n debug: (queue: GuildQueue<Meta>, message: string) => unknown;\n /**\n * Emitted when the queue encounters error\n * @param queue The queue where this event occurred\n * @param error The error\n */\n error: (queue: GuildQueue<Meta>, error: Error) => unknown;\n /**\n * Emitted when the voice channel is empty\n * @param queue The queue where this event occurred\n */\n emptyChannel: (queue: GuildQueue<Meta>) => unknown;\n /**\n * Emitted when the queue is empty\n * @param queue The queue where this event occurred\n */\n emptyQueue: (queue: GuildQueue<Meta>) => unknown;\n /**\n * Emitted when the audio player starts streaming audio track\n * @param queue The queue where this event occurred\n * @param track The track that is being streamed\n */\n playerStart: (queue: GuildQueue<Meta>, track: Track) => unknown;\n /**\n * Emitted when the audio player errors while streaming audio track\n * @param queue The queue where this event occurred\n * @param error The error\n * @param track The track that is being streamed\n */\n playerError: (queue: GuildQueue<Meta>, error: Error, track: Track) => unknown;\n /**\n * Emitted when the audio player finishes streaming audio track\n * @param queue The queue where this event occurred\n * @param track The track that was being streamed\n */\n playerFinish: (queue: GuildQueue<Meta>, track: Track) => unknown;\n /**\n * Emitted when the audio player skips current track\n * @param queue The queue where this event occurred\n * @param track The track that was skipped\n */\n playerSkip: (queue: GuildQueue<Meta>, track: Track) => unknown;\n /**\n * Emitted when the audio player is triggered\n * @param queue The queue where this event occurred\n * @param track The track which was played in this event\n */\n playerTrigger: (queue: GuildQueue<Meta>, track: Track, reason: PlayerTriggeredReason) => unknown;\n /**\n * Emitted when the voice state is updated. Consuming this event may disable default voice state update handler if `Player.isVoiceStateHandlerLocked()` returns `false`.\n * @param queue The queue where this event occurred\n * @param oldState The old voice state\n * @param newState The new voice state\n */\n voiceStateUpdate: (queue: GuildQueue<Meta>, oldState: VoiceState, newState: VoiceState) => unknown;\n}\n\nexport class GuildQueue<Meta = unknown> {\n #transitioning = false;\n #initializing = false;\n #deleted = false;\n #initializingPromises: Array<(value: boolean | PromiseLike<boolean>) => void> = [];\n private __current: Track | null = null;\n public tracks: Queue<Track>;\n public history = new GuildQueueHistory<Meta>(this);\n public dispatcher: StreamDispatcher | null = null;\n public node = new GuildQueuePlayerNode<Meta>(this);\n public filters = new GuildQueueAudioFilters<Meta>(this);\n public onBeforeCreateStream: OnBeforeCreateStreamHandler = async () => null;\n public onAfterCreateStream: OnAfterCreateStreamHandler = async (stream) => ({\n stream,\n type: StreamType.Raw\n });\n public repeatMode = QueueRepeatMode.OFF;\n public timeouts = new Collection<string, NodeJS.Timeout>();\n public stats = new GuildQueueStatistics<Meta>(this);\n\n public constructor(public player: Player, public options: GuildNodeInit<Meta>) {\n this.tracks = new Queue<Track>(options.queueStrategy);\n if (typeof options.onBeforeCreateStream === 'function') this.onBeforeCreateStream = options.onBeforeCreateStream;\n if (typeof options.onAfterCreateStream === 'function') this.onAfterCreateStream = options.onAfterCreateStream;\n if (options.repeatMode != null) this.repeatMode = options.repeatMode;\n\n options.selfDeaf ??= true;\n\n if (this.options.biquad != null && typeof this.options.biquad !== 'boolean') {\n this.filters._lastFiltersCache.biquad = this.options.biquad;\n }\n if (Array.isArray(this.options.equalizer)) {\n this.filters._lastFiltersCache.equalizer = this.options.equalizer;\n }\n if (Array.isArray(this.options.filterer)) {\n this.filters._lastFiltersCache.filters = this.options.filterer;\n }\n if (typeof this.options.resampler === 'number') {\n this.filters._lastFiltersCache.sampleRate = this.options.resampler;\n }\n if (Array.isArray(this.options.ffmpegFilters)) {\n this.filters.ffmpeg.setDefaults(this.options.ffmpegFilters);\n }\n this.debug(`GuildQueue initialized for guild ${this.options.guild.name} (ID: ${this.options.guild.id})`);\n }\n\n /**\n * Write a debug message to this queue\n * @param m The message to write\n */\n public debug(m: string) {\n this.player.events.emit('debug', this, m);\n }\n\n /**\n * The metadata of this queue\n */\n public get metadata() {\n return this.options.metadata;\n }\n\n public set metadata(m: Meta | undefined | null) {\n this.options.metadata = m;\n }\n\n /**\n * Set metadata for this queue\n * @param m Metadata to set\n */\n public setMetadata(m: Meta | undefined | null) {\n this.#warnIfDeleted();\n this.options.metadata = m;\n }\n\n /**\n * Indicates if this queue is currently initializing\n */\n public get initializing() {\n return this.#initializing;\n }\n\n public set initializing(v: boolean) {\n this.#initializing = v;\n if (v) this.#resolveInitializerAwaiters();\n }\n\n /**\n * Indicates current track of this queue\n */\n public get currentTrack() {\n return this.dispatcher?.audioResource?.metadata || this.__current;\n }\n\n /**\n * Indicates if this queue was deleted previously\n */\n public get deleted() {\n return this.#deleted;\n }\n\n /**\n * The voice channel of this queue\n */\n public get channel() {\n return this.dispatcher?.channel || null;\n }\n\n public set channel(c: VoiceBasedChannel | null) {\n if (this.dispatcher) {\n if (c) {\n this.dispatcher.channel = c;\n } else {\n this.delete();\n }\n }\n }\n\n /**\n * The voice connection of this queue\n */\n public get connection() {\n return this.dispatcher?.voiceConnection || null;\n }\n\n /**\n * The guild this queue belongs to\n */\n public get guild() {\n return this.options.guild;\n }\n\n /**\n * The id of this queue\n */\n public get id() {\n return this.guild.id;\n }\n\n /**\n * Set transition mode for this queue\n * @param state The state to set\n */\n public setTransitioning(state: boolean) {\n this.#warnIfDeleted();\n this.#transitioning = state;\n }\n\n /**\n * if this queue is currently under transition mode\n */\n public isTransitioning() {\n return this.#transitioning;\n }\n\n /**\n * Set repeat mode for this queue\n * @param mode The repeat mode to apply\n */\n public setRepeatMode(mode: QueueRepeatMode) {\n this.#warnIfDeleted();\n this.repeatMode = mode;\n }\n\n /**\n * Check if this queue has no tracks left in it\n */\n public isEmpty() {\n this.#warnIfDeleted();\n return this.tracks.size < 1;\n }\n\n /**\n * Check if this queue currently holds active audio resource\n */\n public isPlaying() {\n this.#warnIfDeleted();\n return this.dispatcher?.audioResource != null;\n }\n\n /**\n * Add track to the queue\n * @param track Track or playlist or array of tracks to add\n */\n public addTrack(track: Track | Track[] | Playlist) {\n this.#warnIfDeleted();\n const toAdd = track instanceof Playlist ? track.tracks : track;\n this.tracks.add(toAdd);\n const isMulti = Array.isArray(toAdd);\n\n if (isMulti) {\n this.player.events.emit('audioTrackAdd', this, toAdd[0]);\n this.player.events.emit('audioTracksAdd', this, toAdd);\n } else {\n this.player.events.emit('audioTrackAdd', this, toAdd);\n }\n }\n\n /**\n * Connect to a voice channel\n * @param channelResolvable The voice channel to connect to\n * @param options Join config\n */\n public async connect(channelResolvable: GuildVoiceChannelResolvable, options: VoiceConnectConfig = {}) {\n this.#warnIfDeleted();\n const channel = this.player.client.channels.resolve(channelResolvable);\n if (!channel || !channel.isVoiceBased()) {\n throw new Error(`Expected a voice based channel (type ${ChannelType.GuildVoice}/${ChannelType.GuildStageVoice}), received ${channel?.type}`);\n }\n\n this.debug(`Connecting to ${channel.type === ChannelType.GuildStageVoice ? 'stage' : 'voice'} channel ${channel.name} (ID: ${channel.id})`);\n\n if (this.dispatcher) {\n this.debug('Destroying old connection');\n this.#removeListeners(this.dispatcher);\n this.dispatcher.disconnect();\n }\n\n this.dispatcher = await this.player.voiceUtils.connect(channel, {\n deaf: options.deaf ?? this.options.selfDeaf ?? true,\n maxTime: options?.timeout ?? this.options.connectionTimeout ?? 120_000,\n queue: this\n });\n\n this.player.events.emit('connection', this);\n\n if (this.channel!.type === ChannelType.GuildStageVoice) {\n await this.channel!.guild.members.me!.voice.setSuppressed(false).catch(async () => {\n return await this.channel!.guild.members.me!.voice.setRequestToSpeak(true).catch(Util.noop);\n });\n }\n\n this.#attachListeners(this.dispatcher);\n\n return this;\n }\n\n /**\n * The voice connection latency of this queue\n */\n public get ping() {\n return this.connection?.ping.udp ?? -1;\n }\n\n /**\n * Delete this queue\n */\n public delete() {\n if (this.player.nodes.delete(this.id)) {\n this.#deleted = true;\n }\n }\n\n /**\n * Wait for this queue to initialize\n */\n public awaitInitialization() {\n return new Promise<boolean>((r) => {\n if (!this.#initializing) return r(true);\n this.#initializingPromises.push(r);\n });\n }\n\n #attachListeners(dispatcher: StreamDispatcher) {\n dispatcher.on('error', (e) => this.player.events.emit('error', this, e));\n dispatcher.on('debug', (m) => this.player.events.emit('debug', this, m));\n dispatcher.on('finish', (r) => this.#performFinish(r));\n dispatcher.on('start', (r) => this.#performStart(r));\n dispatcher.on('dsp', (f) => {\n this.filters._lastFiltersCache.filters = f;\n });\n dispatcher.on('biquad', (f) => {\n this.filters._lastFiltersCache.biquad = f;\n });\n dispatcher.on('eqBands', (f) => {\n this.filters._lastFiltersCache.equalizer = f;\n });\n dispatcher.on('volume', (f) => {\n this.filters._lastFiltersCache.volume = f;\n });\n }\n\n #removeListeners(dispatcher: StreamDispatcher) {\n dispatcher.removeAllListeners();\n }\n\n #performStart(resource?: AudioResource<Track>) {\n const track = resource?.metadata || this.currentTrack;\n this.player.events.emit('playerTrigger', this, track!, this.isTransitioning() ? 'filters' : 'normal');\n if (track && !this.isTransitioning()) this.player.events.emit('playerStart', this, track);\n this.setTransitioning(false);\n this.initializing = false;\n }\n\n #performFinish(resource?: AudioResource<Track>) {\n const track = resource?.metadata || this.currentTrack;\n if (track && !this.isTransitioning()) {\n this.history.push(track);\n this.node.resetProgress();\n this.player.events.emit('playerFinish', this, track);\n if (this.tracks.size < 1 && this.repeatMode === QueueRepeatMode.OFF) {\n this.#emitEnd();\n } else {\n if (this.repeatMode === QueueRepeatMode.TRACK) {\n this.__current = this.history.tracks.dispatch() || track;\n return this.node.play(this.__current!);\n }\n if (this.repeatMode === QueueRepeatMode.QUEUE) this.tracks.add(this.history.tracks.dispatch() || track);\n if (!this.tracks.size) {\n if (this.repeatMode === QueueRepeatMode.AUTOPLAY) {\n this.#handleAutoplay(track);\n return;\n }\n } else {\n this.__current = this.tracks.dispatch()!;\n this.node.play(this.__current, {\n queue: false\n });\n }\n }\n }\n }\n\n #emitEnd() {\n this.__current = null;\n this.player.events.emit('emptyQueue', this);\n if (this.options.leaveOnEnd) {\n const tm: NodeJS.Timeout = setTimeout(() => {\n if (this.tracks.size) return clearTimeout(tm);\n this.dispatcher?.disconnect();\n }, this.options.leaveOnEndCooldown).unref();\n }\n }\n\n async #handleAutoplay(track: Track) {\n let info = await YouTube.getVideo(track.url)\n .then((x) => x.videos![0])\n .catch(Util.noop);\n\n // fallback\n if (!info)\n info = await YouTube.search(track.author)\n .then((x) => x[0])\n .catch(Util.noop);\n\n if (!info) {\n return this.#emitEnd();\n }\n\n const nextTrack = new Track(this.player, {\n title: info.title!,\n url: `https://www.youtube.com/watch?v=${info.id}`,\n duration: info.durationFormatted || Util.buildTimeCode(Util.parseMS(info.duration * 1000)),\n description: info.title!,\n thumbnail: typeof info.thumbnail === 'string' ? info.thumbnail! : info.thumbnail!.url!,\n views: info.views,\n author: info.channel!.name!,\n requestedBy: track.requestedBy,\n source: 'youtube',\n queryType: 'youtubeVideo'\n });\n\n this.node.play(nextTrack, {\n queue: false,\n seek: 0,\n transitionMode: false\n });\n }\n\n #resolveInitializerAwaiters() {\n this.#initializingPromises.forEach((p) => {\n p(!this.#initializing);\n });\n\n this.#initializingPromises = [];\n }\n\n #warnIfDeleted() {\n if (!this.deleted) return;\n Util.warn('Deleted queue usage detected! Please remove references to deleted queues in order to prevent memory leaks.', 'DiscordPlayerWarning');\n }\n}\n","import { User, escapeMarkdown, SnowflakeUtil } from 'discord.js';\nimport { Player } from '../Player';\nimport { RawTrackData, SearchQueryType, TrackJSON } from '../types/types';\nimport { Playlist } from './Playlist';\nimport { GuildQueue } from './GuildQueue';\n\nexport type TrackResolvable = Track | string | number;\n\nexport class Track {\n public player!: Player;\n public title!: string;\n public description!: string;\n public author!: string;\n public url!: string;\n public thumbnail!: string;\n public duration!: string;\n public views!: number;\n public requestedBy: User | null = null;\n public playlist?: Playlist;\n public queryType: SearchQueryType | null | undefined = null;\n public readonly raw: RawTrackData = {} as RawTrackData;\n public readonly id = SnowflakeUtil.generate().toString();\n\n /**\n * Track constructor\n * @param {Player} player The player that instantiated this Track\n * @param {RawTrackData} data Track data\n */\n constructor(player: Player, data: RawTrackData) {\n /**\n * The player that instantiated this Track\n * @name Track#player\n * @type {Player}\n * @readonly\n */\n Object.defineProperty(this, 'player', { value: player, enumerable: false });\n\n /**\n * Title of this track\n * @name Track#title\n * @type {string}\n */\n\n /**\n * Description of this track\n * @name Track#description\n * @type {string}\n */\n\n /**\n * Author of this track\n * @name Track#author\n * @type {string}\n */\n\n /**\n * URL of this track\n * @name Track#url\n * @type {string}\n */\n\n /**\n * Thumbnail of this track\n * @name Track#thumbnail\n * @type {string}\n */\n\n /**\n * Duration of this track\n * @name Track#duration\n * @type {string}\n */\n\n /**\n * Views count of this track\n * @name Track#views\n * @type {number}\n */\n\n /**\n * Person who requested this track\n * @name Track#requestedBy\n * @type {User}\n */\n\n /**\n * If this track belongs to playlist\n * @name Track#fromPlaylist\n * @type {boolean}\n */\n\n /**\n * Raw track data\n * @name Track#raw\n * @type {RawTrackData}\n */\n\n /**\n * The track id\n * @name Track#id\n * @type {Snowflake}\n * @readonly\n */\n\n /**\n * The playlist which track belongs\n * @name Track#playlist\n * @type {Playlist}\n */\n\n void this._patch(data);\n }\n\n private _patch(data: RawTrackData) {\n this.title = escapeMarkdown(data.title ?? '');\n this.author = data.author ?? '';\n this.url = data.url ?? '';\n this.thumbnail = data.thumbnail ?? '';\n this.duration = data.duration ?? '';\n this.views = data.views ?? 0;\n this.queryType = data.queryType;\n this.requestedBy = data.requestedBy || null;\n this.playlist = data.playlist;\n\n // raw\n Object.defineProperty(this, 'raw', { value: Object.assign({}, { source: data.raw?.source ?? data.source }, data.raw ?? data), enumerable: false });\n }\n\n /**\n * The queue in which this track is located\n * @type {Queue}\n */\n get queue(): GuildQueue {\n return this.player.nodes.cache.find((q) => q.tracks.some((ab) => ab.id === this.id))!;\n }\n\n /**\n * The track duration in millisecond\n * @type {number}\n */\n get durationMS(): number {\n const times = (n: number, t: number) => {\n let tn = 1;\n for (let i = 0; i < t; i++) tn *= n;\n return t <= 0 ? 1000 : tn * 1000;\n };\n\n return this.duration\n .split(':')\n .reverse()\n .map((m, i) => parseInt(m) * times(60, i))\n .reduce((a, c) => a + c, 0);\n }\n\n /**\n * Returns source of this track\n * @type {TrackSource}\n */\n get source() {\n return this.raw.source ?? 'arbitrary';\n }\n\n /**\n * String representation of this track\n * @returns {string}\n */\n toString(): string {\n return `${this.title} by ${this.author}`;\n }\n\n /**\n * Raw JSON representation of this track\n * @returns {TrackJSON}\n */\n toJSON(hidePlaylist?: boolean) {\n return {\n id: this.id,\n title: this.title,\n description: this.description,\n author: this.author,\n url: this.url,\n thumbnail: this.thumbnail,\n duration: this.duration,\n durationMS: this.durationMS,\n views: this.views,\n requestedBy: this.requestedBy?.id || null,\n playlist: hidePlaylist ? null : this.playlist?.toJSON() ?? null\n } as TrackJSON;\n }\n}\n","import { StageChannel, VoiceChannel } from 'discord.js';\nimport { TimeData } from '../types/types';\nimport { setTimeout } from 'timers/promises';\n\nclass Util {\n /**\n * Utils\n */\n private constructor() {} // eslint-disable-line @typescript-eslint/no-empty-function\n\n /**\n * Creates duration string\n * @param {object} durObj The duration object\n * @returns {string}\n */\n static durationString(durObj: Record<string, number>) {\n return Object.values(durObj)\n .map((m) => (isNaN(m) ? 0 : m))\n .join(':');\n }\n\n /**\n * Parses milliseconds to consumable time object\n * @param {number} milliseconds The time in ms\n * @returns {TimeData}\n */\n static parseMS(milliseconds: number) {\n if (isNaN(milliseconds)) milliseconds = 0;\n const round = milliseconds > 0 ? Math.floor : Math.ceil;\n\n return {\n days: round(milliseconds / 86400000),\n hours: round(milliseconds / 3600000) % 24,\n minutes: round(milliseconds / 60000) % 60,\n seconds: round(milliseconds / 1000) % 60\n } as TimeData;\n }\n\n /**\n * Builds time code\n * @param {TimeData} duration The duration object\n * @returns {string}\n */\n static buildTimeCode(duration: TimeData) {\n const items = Object.keys(duration);\n const required = ['days', 'hours', 'minutes', 'seconds'];\n\n const parsed = items.filter((x) => required.includes(x)).map((m) => duration[m as keyof TimeData]);\n const final = parsed\n .slice(parsed.findIndex((x) => x !== 0))\n .map((x) => x.toString().padStart(2, '0'))\n .join(':');\n\n return final.length <= 3 ? `0:${final.padStart(2, '0') || 0}` : final;\n }\n\n /**\n * Picks last item of the given array\n * @param {any[]} arr The array\n * @returns {any}\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n static last<T = any>(arr: T[]): T {\n if (!Array.isArray(arr)) return arr;\n return arr[arr.length - 1];\n }\n\n /**\n * Checks if the voice channel is empty\n * @param {VoiceChannel|StageChannel} channel The voice channel\n * @returns {boolean}\n */\n static isVoiceEmpty(channel: VoiceChannel | StageChannel) {\n return channel && channel.members.filter((member) => !member.user.bot).size === 0;\n }\n\n /**\n * Safer require\n * @param {string} id Node require id\n * @returns {any}\n */\n static require(id: string) {\n try {\n return require(id);\n } catch {\n return null;\n }\n }\n\n /**\n * Asynchronous timeout\n * @param {number} time The time in ms to wait\n * @returns {Promise<unknown>}\n */\n static wait(time: number) {\n return setTimeout(time, undefined, { ref: false });\n }\n\n static noop() {} // eslint-disable-line @typescript-eslint/no-empty-function\n\n static async getFetch() {\n if ('fetch' in globalThis) return globalThis.fetch;\n for (const lib of ['node-fetch', 'undici']) {\n try {\n return await import(lib).then((res) => res.fetch || res.default?.fetch || res.default);\n } catch {\n try {\n // eslint-disable-next-line\n const res = require(lib);\n if (res) return res.fetch || res.default?.fetch || res.default;\n } catch {\n // no?\n }\n }\n }\n }\n\n static warn(message: string, code = 'DeprecationWarning', detail?: string) {\n process.emitWarning(message, {\n code,\n detail\n });\n }\n}\n\nexport { Util };\n","import { Player } from '../Player';\nimport { Track } from './Track';\nimport { PlaylistInitData, PlaylistJSON, TrackJSON, TrackSource } from '../types/types';\n\nexport class Playlist {\n public readonly player: Player;\n public tracks: Track[];\n public title: string;\n public description: string;\n public thumbnail: string;\n public type: 'album' | 'playlist';\n public source: TrackSource;\n public author: {\n name: string;\n url: string;\n };\n public id: string;\n public url: string;\n public readonly rawPlaylist?: any; // eslint-disable-line @typescript-eslint/no-explicit-any\n\n /**\n * Playlist constructor\n * @param {Player} player The player\n * @param {PlaylistInitData} data The data\n */\n constructor(player: Player, data: PlaylistInitData) {\n /**\n * The player\n * @name Playlist#player\n * @type {Player}\n * @readonly\n */\n this.player = player;\n\n /**\n * The tracks in this playlist\n * @name Playlist#tracks\n * @type {Track[]}\n */\n this.tracks = data.tracks ?? [];\n\n /**\n * The author of this playlist\n * @name Playlist#author\n * @type {object}\n */\n this.author = data.author;\n\n /**\n * The description\n * @name Playlist#description\n * @type {string}\n */\n this.description = data.description;\n\n /**\n * The thumbnail of this playlist\n * @name Playlist#thumbnail\n * @type {string}\n */\n this.thumbnail = data.thumbnail;\n\n /**\n * The playlist type:\n * - `album`\n * - `playlist`\n * @name Playlist#type\n * @type {string}\n */\n this.type = data.type;\n\n /**\n * The source of this playlist:\n * - `youtube`\n * - `soundcloud`\n * - `spotify`\n * - `arbitrary`\n * @name Playlist#source\n * @type {string}\n */\n this.source = data.source;\n\n /**\n * The playlist id\n * @name Playlist#id\n * @type {string}\n */\n this.id = data.id;\n\n /**\n * The playlist url\n * @name Playlist#url\n * @type {string}\n */\n this.url = data.url;\n\n /**\n * The playlist title\n * @type {string}\n */\n this.title = data.title;\n\n /**\n * @name Playlist#rawPlaylist\n * @type {any}\n * @readonly\n */\n }\n\n *[Symbol.iterator]() {\n yield* this.tracks;\n }\n\n /**\n * JSON representation of this playlist\n * @param {boolean} [withTracks=true] If it should build json with tracks\n * @returns {PlaylistJSON}\n */\n toJSON(withTracks = true) {\n const payload = {\n id: this.id,\n url: this.url,\n title: this.title,\n description: this.description,\n thumbnail: this.thumbnail,\n type: this.type,\n source: this.source,\n author: this.author,\n tracks: [] as TrackJSON[]\n };\n\n if (withTracks) payload.tracks = this.tracks.map((m) => m.toJSON(true));\n\n return payload as PlaylistJSON;\n }\n}\n","import { Queue } from '@discord-player/utils';\nimport { Track } from './Track';\nimport { GuildQueue } from './GuildQueue';\n\nexport class GuildQueueHistory<Meta = unknown> {\n public tracks = new Queue<Track>('LIFO');\n public constructor(public queue: GuildQueue<Meta>) {}\n\n /**\n * Current track in the queue\n */\n public get currentTrack() {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return this.queue.dispatcher?.audioResource?.metadata || ((this.queue as any).__current as Track | null);\n }\n\n /**\n * Next track in the queue\n */\n public get nextTrack() {\n return this.queue.tracks.at(0) || null;\n }\n\n /**\n * Previous track in the queue\n */\n public get previousTrack() {\n return this.tracks.at(0) || null;\n }\n\n /**\n * If history is disabled\n */\n public get disabled() {\n return this.queue.options.disableHistory;\n }\n\n /**\n * If history is empty\n */\n public isEmpty() {\n return this.tracks.size < 1;\n }\n\n /**\n * Add track to track history\n * @param track The track to add\n */\n public push(track: Track | Track[]) {\n if (this.disabled) return false;\n this.tracks.add(track);\n return true;\n }\n\n /**\n * Clear history\n */\n public clear() {\n this.tracks.clear();\n }\n\n /**\n * Play the next track in the queue\n */\n public next() {\n const track = this.nextTrack;\n if (!track) {\n throw new Error('No next track in the queue');\n }\n\n this.queue.node.skip();\n }\n\n /**\n * Play the previous track in the queue\n */\n public previous() {\n const track = this.previousTrack;\n if (!track) {\n throw new Error('No previous track in the queue');\n }\n\n this.queue.node.play(track, { queue: true });\n this.queue.node.skip();\n }\n}\n","import { AudioResource, StreamType } from '@discordjs/voice';\nimport { Readable } from 'stream';\nimport { PlayerProgressbarOptions, SearchQueryType } from '../types/types';\nimport { QueryResolver } from '../utils/QueryResolver';\nimport { Util } from '../utils/Util';\nimport { Track, TrackResolvable } from './Track';\nimport { GuildQueue } from './GuildQueue';\nimport { setTimeout as waitFor } from 'timers/promises';\n\nexport const FFMPEG_SRATE_REGEX = /asetrate=\\d+\\*(\\d(\\.\\d)?)/;\n\nexport interface ResourcePlayOptions {\n queue?: boolean;\n seek?: number;\n transitionMode?: boolean;\n}\n\nexport interface PlayerTimestamp {\n current: {\n label: string;\n value: number;\n };\n total: {\n label: string;\n value: number;\n };\n progress: number;\n}\n\nexport class GuildQueuePlayerNode<Meta = unknown> {\n #progress = 0;\n public constructor(public queue: GuildQueue<Meta>) {}\n\n /**\n * If the player is currently in idle mode\n */\n public isIdle() {\n return !!this.queue.dispatcher?.isIdle();\n }\n\n /**\n * If the player is currently buffering the track\n */\n public isBuffering() {\n return !!this.queue.dispatcher?.isBuffering();\n }\n\n /**\n * If the player is currently playing a track\n */\n public isPlaying() {\n return !!this.queue.dispatcher?.isPlaying();\n }\n\n /**\n * If the player is currently paused\n */\n public isPaused() {\n return !!this.queue.dispatcher?.isPaused();\n }\n\n /**\n * Reset progress history\n */\n public resetProgress() {\n this.#progress = 0;\n }\n\n /**\n * The stream time for current session\n */\n public get streamTime() {\n return this.queue.dispatcher?.streamTime ?? 0;\n }\n\n /**\n * Current playback duration with history included\n */\n public get playbackTime() {\n const dur = this.#progress + this.streamTime;\n\n return dur;\n }\n\n /**\n * Get duration multiplier\n */\n public getDurationMultiplier() {\n const srateFilters = this.queue.filters.ffmpeg.toArray().filter((ff) => FFMPEG_SRATE_REGEX.test(ff));\n const multipliers = srateFilters\n .map((m) => {\n return parseFloat(FFMPEG_SRATE_REGEX.exec(m)?.[1] as string);\n })\n .filter((f) => !isNaN(f));\n\n return !multipliers.length ? 1 : multipliers.reduce((accumulator, current) => current + accumulator);\n }\n\n /**\n * Estimated progress of the player\n */\n public get estimatedPlaybackTime() {\n const dur = this.playbackTime;\n return Math.round(this.getDurationMultiplier() * dur);\n }\n\n /**\n * Estimated total duration of the player\n */\n public get estimatedDuration() {\n const dur = this.queue.currentTrack?.durationMS ?? 0;\n\n return Math.round(dur / this.getDurationMultiplier());\n }\n\n /**\n * Get stream progress\n * @param ignoreFilters Ignore filters\n */\n public getTimestamp(ignoreFilters = false): PlayerTimestamp | null {\n if (!this.queue.currentTrack) return null;\n\n const current = ignoreFilters ? this.playbackTime : this.estimatedPlaybackTime;\n const total = ignoreFilters ? this.queue.currentTrack.durationMS : this.estimatedDuration;\n\n return {\n current: {\n label: Util.buildTimeCode(Util.parseMS(current)),\n value: current\n },\n total: {\n label: Util.buildTimeCode(Util.parseMS(total)),\n value: total\n },\n progress: Math.round((current / total) * 100)\n };\n }\n\n /**\n * Create progress bar for current progress\n * @param options Progress bar options\n */\n public createProgressBar(options?: PlayerProgressbarOptions) {\n const timestamp = this.getTimestamp();\n if (!timestamp) return null;\n\n const { indicator = '🔘', length = 15, line = '▬', timecodes = true } = options || {};\n\n if (isNaN(length) || length < 0 || !Number.isFinite(length)) throw new Error('invalid progressbar length');\n const index = Math.round((timestamp.current.value / timestamp.total.value) * length);\n\n if (index >= 1 && index <= length) {\n const bar = line.repeat(length - 1).split('');\n bar.splice(index, 0, indicator);\n if (timecodes) {\n return `${timestamp.current.label} ┃ ${bar.join('')} ┃ ${timestamp.total.label}`;\n } else {\n return `${bar.join('')}`;\n }\n } else {\n if (timecodes) {\n return `${timestamp.current.label} ┃ ${indicator}${line.repeat(length - 1)} ┃ ${timestamp.total.label}`;\n } else {\n return `${indicator}${line.repeat(length - 1)}`;\n }\n }\n }\n\n /**\n * Seek the player\n * @param duration The duration to seek to\n */\n public async seek(duration: number) {\n if (!this.queue.currentTrack) return false;\n await this.play(this.queue.currentTrack, {\n seek: duration,\n transitionMode: true\n });\n return true;\n }\n\n /**\n * Current volume\n */\n public get volume() {\n return this.queue.dispatcher?.volume ?? 100;\n }\n\n /**\n * Set volume\n * @param vol Volume amount to set\n */\n public setVolume(vol: number) {\n if (!this.queue.dispatcher) return false;\n const res = this.queue.dispatcher.setVolume(vol);\n if (res) this.queue.filters._lastFiltersCache.volume = vol;\n return res;\n }\n\n /**\n * Set bit rate\n * @param rate The bit rate to set\n */\n public setBitrate(rate: number | 'auto') {\n this.queue.dispatcher?.audioResource?.encoder?.setBitrate(rate === 'auto' ? this.queue.channel?.bitrate ?? 64000 : rate);\n }\n\n /**\n * Set paused state\n * @param state The state\n */\n public setPaused(state: boolean) {\n if (state) return this.queue.dispatcher?.pause(true) || false;\n return this.queue.dispatcher?.resume() || false;\n }\n\n /**\n * Pause the playback\n */\n public pause() {\n return this.setPaused(true);\n }\n\n /**\n * Resume the playback\n */\n public resume() {\n return this.setPaused(false);\n }\n\n /**\n * Skip current track\n */\n public skip() {\n if (!this.queue.dispatcher) return false;\n this.queue.setTransitioning(false);\n this.queue.dispatcher.end();\n return true;\n }\n\n /**\n * Remove the given track from queue\n * @param track The track to remove\n */\n public remove(track: TrackResolvable) {\n const foundTrack = this.queue.tracks.find((t, idx) => {\n if (track instanceof Track || typeof track === 'string') {\n return (typeof track === 'string' ? track : track.id) === t.id;\n }\n if (typeof track === 'string') return track === t.id;\n return idx === track;\n });\n if (!foundTrack) return null;\n\n this.queue.tracks.removeOne((t) => t.id === foundTrack.id);\n\n return foundTrack;\n }\n\n /**\n * Jump to specific track on the queue\n * @param track The track to jump to without removing other tracks\n */\n public jump(track: TrackResolvable) {\n const removed = this.remove(track);\n if (!removed) return false;\n this.queue.tracks.store.unshift(removed);\n return this.skip();\n }\n\n /**\n * Get track position\n * @param track The track\n */\n public getTrackPosition(track: TrackResolvable) {\n return this.queue.tracks.toArray().findIndex((t, idx) => {\n if (track instanceof Track || typeof track === 'string') {\n return (typeof track === 'string' ? track : track.id) === t.id;\n }\n if (typeof track === 'string') return track === t.id;\n return idx === track;\n });\n }\n\n /**\n * Skip to the given track, removing others on the way\n * @param track The track to skip to\n */\n public skipTo(track: TrackResolvable) {\n const idx = this.getTrackPosition(track);\n if (idx < 0) return false;\n const removed = this.remove(idx);\n if (!removed) return false;\n this.queue.tracks.store.splice(0, idx, removed);\n return this.skip();\n }\n\n /**\n * Insert a track on the given position in queue\n * @param track The track to insert\n * @param index The position to insert to, defaults to 0.\n */\n public insert(track: Track, index = 0) {\n if (!(track instanceof Track)) throw new Error('invalid track');\n this.queue.tracks.store.splice(index, 0, track);\n }\n\n /**\n * Stop the playback\n * @param force Whether or not to forcefully stop the playback\n */\n public stop(force = false) {\n if (!this.queue.dispatcher) return false;\n this.queue.dispatcher.end();\n if (force) {\n this.queue.dispatcher.disconnect();\n return true;\n }\n if (this.queue.options.leaveOnStop) {\n const tm: NodeJS.Timeout = setTimeout(() => {\n if (this.isPlaying() || this.queue.tracks.size) return clearTimeout(tm);\n this.queue.dispatcher?.disconnect();\n }, this.queue.options.leaveOnStopCooldown).unref();\n }\n return true;\n }\n\n /**\n * Play the given track\n * @param res The track to play\n * @param options Options for playing the track\n */\n public async play(res?: Track, options?: ResourcePlayOptions) {\n if (!this.queue.dispatcher?.voiceConnection) {\n throw new Error('No voice connection available');\n }\n\n this.queue.debug(`Received play request from guild ${this.queue.guild.name} (ID: ${this.queue.guild.id})`);\n\n options = Object.assign(\n {},\n {\n queue: this.queue.currentTrack != null,\n transitionMode: false,\n seek: 0\n } as ResourcePlayOptions,\n options\n )!;\n\n if (res && options.queue) {\n this.queue.debug('Requested option requires to queue the track, adding the given track to queue instead...');\n return this.queue.tracks.add(res);\n }\n\n const track = res || this.queue.tracks.dispatch();\n if (!track) {\n throw new Error('Play request received but track was not provided');\n }\n\n this.queue.debug('Requested option requires to play the track, initializing...');\n this.queue.initializing = true;\n\n try {\n this.queue.debug(`Initiating stream extraction process...`);\n const qt: SearchQueryType = track.queryType || (track.raw.source === 'spotify' ? 'spotifySong' : track.raw.source === 'apple_music' ? 'appleMusicSong' : track.raw.source) || 'arbitrary';\n this.queue.debug(`Executing onBeforeCreateStream hook (QueryType: ${qt})...`);\n let stream = await this.queue.onBeforeCreateStream?.(track, qt, this.queue).catch(() => null);\n\n if (!stream) {\n this.queue.debug('Failed to get stream from onBeforeCreateStream!');\n stream = (await this.#createGenericStream(track).catch(() => null)) as Readable;\n }\n\n if (!stream) {\n const error = new Error('Could not extract stream for this track');\n this.queue.initializing = false;\n if (this.queue.options.skipOnNoStream) {\n this.queue.player.events.emit('playerSkip', this.queue, track);\n this.queue.player.events.emit('playerError', this.queue, error, track);\n this.play(this.queue.tracks.dispatch());\n return;\n }\n\n throw error;\n }\n\n if (typeof options.seek === 'number' && options.seek >= 0) {\n this.#progress = options.seek;\n } else {\n this.#progress = 0;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const cookies = track.source === 'youtube' ? (<any>this.queue.player.options.ytdlOptions?.requestOptions)?.headers?.cookie : undefined;\n const pcmStream = this.#createFFmpegStream(stream, track, options.seek ?? 0, cookies);\n\n if (options.transitionMode) {\n this.queue.debug(`Transition mode detected, player will wait for buffering timeout to expire (Timeout: ${this.queue.options.bufferingTimeout}ms)`);\n await waitFor(this.queue.options.bufferingTimeout);\n this.queue.debug('Buffering timeout has expired!');\n }\n\n this.queue.debug(\n `Preparing final stream config: ${JSON.stringify(\n {\n disableBiquad: this.queue.options.biquad === false,\n disableEqualizer: this.queue.options.equalizer === false,\n disableVolume: this.queue.options.volume === false,\n disableFilters: this.queue.options.filterer === false,\n disableResampler: this.queue.options.resampler === false,\n sampleRate: typeof this.queue.options.resampler === 'number' && this.queue.options.resampler > 0 ? this.queue.options.resampler : undefined,\n biquadFilter: this.queue.filters._lastFiltersCache.biquad || undefined,\n eq: this.queue.filters._lastFiltersCache.equalizer,\n defaultFilters: this.queue.filters._lastFiltersCache.filters,\n volume: this.queue.filters._lastFiltersCache.volume,\n transitionMode: !!options.transitionMode,\n ffmpegFilters: this.queue.filters.ffmpeg.toString(),\n seek: options.seek\n },\n null,\n 2\n )}`\n );\n\n const resource = await this.queue.dispatcher.createStream(pcmStream, {\n disableBiquad: this.queue.options.biquad === false,\n disableEqualizer: this.queue.options.equalizer === false,\n disableVolume: this.queue.options.volume === false,\n disableFilters: this.queue.options.filterer === false,\n disableResampler: this.queue.options.resampler === false,\n sampleRate: typeof this.queue.options.resampler === 'number' && this.queue.options.resampler > 0 ? this.queue.options.resampler : undefined,\n biquadFilter: this.queue.filters._lastFiltersCache.biquad || undefined,\n eq: this.queue.filters._lastFiltersCache.equalizer,\n defaultFilters: this.queue.filters._lastFiltersCache.filters,\n volume: this.queue.filters._lastFiltersCache.volume,\n data: track,\n type: StreamType.Raw\n });\n\n this.queue.setTransitioning(!!options.transitionMode);\n\n await this.#performPlay(resource);\n } catch (e) {\n this.queue.debug(`Failed to initialize audio player: ${e}`);\n this.queue.initializing = false;\n throw e;\n }\n }\n\n async #performPlay(resource: AudioResource<Track>) {\n this.queue.debug('Initializing audio player...');\n await this.queue.dispatcher!.playStream(resource);\n this.queue.debug('Dispatching audio...');\n }\n\n async #createGenericStream(track: Track) {\n this.queue.debug(`Attempting to extract stream for Track { title: ${track.title}, url: ${track.url} } using registered extractors`);\n const streamInfo = await this.queue.player.extractors.run(async (extractor) => {\n if (this.queue.player.options.blockStreamFrom?.some((ext) => ext === extractor.identifier)) return false;\n const canStream = await extractor.validate(track.url, track.queryType || QueryResolver.resolve(track.url));\n if (!canStream) return false;\n return await extractor.stream(track);\n }, false);\n if (!streamInfo || !streamInfo.result) {\n this.queue.debug(`Failed to extract stream for Track { title: ${track.title}, url: ${track.url} } using registered extractors`);\n return null;\n }\n\n this.queue.debug(`Stream extraction was successful for Track { title: ${track.title}, url: ${track.url} } (Extractor: ${streamInfo.extractor.identifier})`);\n\n const stream = streamInfo.result;\n return stream;\n }\n\n #createFFmpegStream(stream: Readable | string, track: Track, seek = 0, cookies?: string) {\n const ffmpegStream = this.queue.filters.ffmpeg\n .createStream(stream, {\n encoderArgs: this.queue.filters.ffmpeg.filters.length ? ['-af', this.queue.filters.ffmpeg.toString()] : [],\n seek: seek / 1000,\n fmt: 's16le',\n cookies\n })\n .on('error', (err) => {\n const m = `${err}`.toLowerCase();\n\n this.queue.debug(`Stream closed due to an error from FFmpeg stream: ${err.stack || err.message || err}`);\n\n if (m.includes('premature close') || m.includes('epipe')) return;\n\n this.queue.player.events.emit('playerError', this.queue, err, track);\n });\n\n return ffmpegStream;\n }\n}\n","import { YouTube } from 'youtube-sr';\nimport { QueryType } from '../types/types';\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport { validateURL as SoundcloudValidateURL } from 'soundcloud-scraper';\n\n// #region scary things below *sigh*\nconst spotifySongRegex = /^https?:\\/\\/(?:embed\\.|open\\.)(?:spotify\\.com\\/)(?:track\\/|\\?uri=spotify:track:)((\\w|-){22})(\\?si=.+)?$/;\nconst spotifyPlaylistRegex = /^https?:\\/\\/(?:embed\\.|open\\.)(?:spotify\\.com\\/)(?:playlist\\/|\\?uri=spotify:playlist:)((\\w|-){22})(\\?si=.+)?$/;\nconst spotifyAlbumRegex = /^https?:\\/\\/(?:embed\\.|open\\.)(?:spotify\\.com\\/)(?:album\\/|\\?uri=spotify:album:)((\\w|-){22})(\\?si=.+)?$/;\nconst vimeoRegex = /^(http|https)?:\\/\\/(www\\.|player\\.)?vimeo\\.com\\/(?:channels\\/(?:\\w+\\/)?|groups\\/([^/]*)\\/videos\\/|video\\/|)(\\d+)(?:|\\/\\?)$/;\nconst reverbnationRegex = /^https:\\/\\/(www.)?reverbnation.com\\/(.+)\\/song\\/(.+)$/;\nconst attachmentRegex = /^https?:\\/\\/.+$/;\nconst appleMusicSongRegex = /^https?:\\/\\/music\\.apple\\.com\\/.+?\\/(song|album)\\/.+?(\\/.+?\\?i=|\\/)([0-9]+)$/;\nconst appleMusicPlaylistRegex = /^https?:\\/\\/music\\.apple\\.com\\/.+?\\/playlist\\/.+\\/pl\\.(u-)?[a-zA-Z0-9]+$/;\nconst appleMusicAlbumRegex = /^https?:\\/\\/music\\.apple\\.com\\/.+?\\/album\\/.+\\/([0-9]+)$/;\n// #endregion scary things above *sigh*\n\nclass QueryResolver {\n /**\n * Query resolver\n */\n private constructor() {} // eslint-disable-line @typescript-eslint/no-empty-function\n\n static get regex() {\n return {\n spotifyAlbumRegex,\n spotifyPlaylistRegex,\n spotifySongRegex,\n vimeoRegex,\n reverbnationRegex,\n attachmentRegex,\n appleMusicAlbumRegex,\n appleMusicPlaylistRegex,\n appleMusicSongRegex\n };\n }\n\n /**\n * Resolves the given search query\n * @param {string} query The query\n * @returns {QueryType}\n */\n static resolve(query: string): (typeof QueryType)[keyof typeof QueryType] {\n query = query.trim();\n if (SoundcloudValidateURL(query, 'track')) return QueryType.SOUNDCLOUD_TRACK;\n if (SoundcloudValidateURL(query, 'playlist') || query.includes('/sets/')) return QueryType.SOUNDCLOUD_PLAYLIST;\n if (YouTube.isPlaylist(query)) return QueryType.YOUTUBE_PLAYLIST;\n if (QueryResolver.validateId(query) || QueryResolver.validateURL(query)) return QueryType.YOUTUBE_VIDEO;\n if (spotifySongRegex.test(query)) return QueryType.SPOTIFY_SONG;\n if (spotifyPlaylistRegex.test(query)) return QueryType.SPOTIFY_PLAYLIST;\n if (spotifyAlbumRegex.test(query)) return QueryType.SPOTIFY_ALBUM;\n if (vimeoRegex.test(query)) return QueryType.VIMEO;\n if (reverbnationRegex.test(query)) return QueryType.REVERBNATION;\n if (appleMusicAlbumRegex.test(query)) return QueryType.APPLE_MUSIC_ALBUM;\n if (appleMusicPlaylistRegex.test(query)) return QueryType.APPLE_MUSIC_PLAYLIST;\n if (appleMusicSongRegex.test(query)) return QueryType.APPLE_MUSIC_SONG;\n if (attachmentRegex.test(query)) return QueryType.ARBITRARY;\n\n return QueryType.YOUTUBE_SEARCH;\n }\n\n /**\n * Parses vimeo id from url\n * @param {string} query The query\n * @returns {string}\n */\n static getVimeoID(query: string): string | null | undefined {\n return QueryResolver.resolve(query) === QueryType.VIMEO\n ? query\n .split('/')\n .filter((x) => !!x)\n .pop()\n : null;\n }\n\n static validateId(q: string) {\n return YouTube.Regex.VIDEO_ID.test(q);\n }\n\n static validateURL(q: string) {\n return YouTube.Regex.VIDEO_URL.test(q);\n }\n}\n\nexport { QueryResolver };\n","import { Snowflake, User, UserResolvable, VoiceState } from 'discord.js';\nimport { GuildQueue } from '../Structures';\nimport { Track } from '../Structures/Track';\nimport { Playlist } from '../Structures/Playlist';\nimport { downloadOptions } from 'ytdl-core';\nimport { QueryCache } from '../utils/QueryCache';\n\nexport type FiltersName = keyof QueueFilters;\n\nexport interface PlayerSearchResult {\n playlist: Playlist | null;\n tracks: Track[];\n}\n\n/**\n * @typedef {AudioFilters} QueueFilters\n */\nexport interface QueueFilters {\n bassboost_low?: boolean;\n bassboost?: boolean;\n bassboost_high?: boolean;\n '8D'?: boolean;\n vaporwave?: boolean;\n nightcore?: boolean;\n phaser?: boolean;\n tremolo?: boolean;\n vibrato?: boolean;\n reverse?: boolean;\n treble?: boolean;\n normalizer?: boolean;\n normalizer2?: boolean;\n surrounding?: boolean;\n pulsator?: boolean;\n subboost?: boolean;\n karaoke?: boolean;\n flanger?: boolean;\n gate?: boolean;\n haas?: boolean;\n mcompand?: boolean;\n mono?: boolean;\n mstlr?: boolean;\n mstrr?: boolean;\n compressor?: boolean;\n expander?: boolean;\n softlimiter?: boolean;\n chorus?: boolean;\n chorus2d?: boolean;\n chorus3d?: boolean;\n fadein?: boolean;\n dim?: boolean;\n earrape?: boolean;\n lofi?: boolean;\n}\n\n/**\n * The track source:\n * - soundcloud\n * - youtube\n * - spotify\n * - apple_music\n * - arbitrary\n * @typedef {string} TrackSource\n */\nexport type TrackSource = 'soundcloud' | 'youtube' | 'spotify' | 'apple_music' | 'arbitrary';\n\n/**\n * @typedef {object} RawTrackData\n * @property {string} title The title\n * @property {string} description The description\n * @property {string} author The author\n * @property {string} url The url\n * @property {string} thumbnail The thumbnail\n * @property {string} duration The duration\n * @property {number} views The views\n * @property {User} requestedBy The user who requested this track\n * @property {Playlist} [playlist] The playlist\n * @property {TrackSource} [source=\"arbitrary\"] The source\n * @property {any} [engine] The engine\n * @property {boolean} [live] If this track is live\n * @property {any} [raw] The raw data\n */\nexport interface RawTrackData {\n title: string;\n description: string;\n author: string;\n url: string;\n thumbnail: string;\n duration: string;\n views: number;\n requestedBy?: User | null;\n playlist?: Playlist;\n source?: TrackSource;\n engine?: any; // eslint-disable-line @typescript-eslint/no-explicit-any\n live?: boolean;\n raw?: any; // eslint-disable-line @typescript-eslint/no-explicit-any\n queryType?: SearchQueryType;\n}\n\n/**\n * @typedef {object} TimeData\n * @property {number} days Time in days\n * @property {number} hours Time in hours\n * @property {number} minutes Time in minutes\n * @property {number} seconds Time in seconds\n */\nexport interface TimeData {\n days: number;\n hours: number;\n minutes: number;\n seconds: number;\n}\n\n/**\n * @typedef {object} PlayerProgressbarOptions\n * @property {boolean} [timecodes] If it should render time codes\n * @property {boolean} [queue] If it should create progress bar for the whole queue\n * @property {number} [length] The bar length\n * @property {string} [line] The bar track\n * @property {string} [indicator] The indicator\n */\nexport interface PlayerProgressbarOptions {\n timecodes?: boolean;\n length?: number;\n line?: string;\n indicator?: string;\n queue?: boolean;\n}\n\n/**\n * The search query type\n * This can be one of:\n * - AUTO\n * - YOUTUBE\n * - YOUTUBE_PLAYLIST\n * - SOUNDCLOUD_TRACK\n * - SOUNDCLOUD_PLAYLIST\n * - SOUNDCLOUD\n * - SPOTIFY_SONG\n * - SPOTIFY_ALBUM\n * - SPOTIFY_PLAYLIST\n * - FACEBOOK\n * - VIMEO\n * - ARBITRARY\n * - REVERBNATION\n * - YOUTUBE_SEARCH\n * - YOUTUBE_VIDEO\n * - SOUNDCLOUD_SEARCH\n * - APPLE_MUSIC_SONG\n * - APPLE_MUSIC_ALBUM\n * - APPLE_MUSIC_PLAYLIST\n * - FILE\n * @typedef {number} QueryType\n */\nexport const QueryType = {\n AUTO: 'auto',\n YOUTUBE: 'youtube',\n YOUTUBE_PLAYLIST: 'youtubePlaylist',\n SOUNDCLOUD_TRACK: 'soundcloudTrack',\n SOUNDCLOUD_PLAYLIST: 'soundcloudPlaylist',\n SOUNDCLOUD: 'soundcloud',\n SPOTIFY_SONG: 'spotifySong',\n SPOTIFY_ALBUM: 'spotifyAlbum',\n SPOTIFY_PLAYLIST: 'spotifyPlaylist',\n FACEBOOK: 'facebook',\n VIMEO: 'vimeo',\n ARBITRARY: 'arbitrary',\n REVERBNATION: 'reverbnation',\n YOUTUBE_SEARCH: 'youtubeSearch',\n YOUTUBE_VIDEO: 'youtubeVideo',\n SOUNDCLOUD_SEARCH: 'soundcloudSearch',\n APPLE_MUSIC_SONG: 'appleMusicSong',\n APPLE_MUSIC_ALBUM: 'appleMusicAlbum',\n APPLE_MUSIC_PLAYLIST: 'appleMusicPlaylist',\n FILE: 'file'\n} as const;\n\nexport type SearchQueryType = keyof typeof QueryType | (typeof QueryType)[keyof typeof QueryType];\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\nexport interface PlayerEvents {\n debug: (message: string) => any;\n error: (error: Error) => any;\n voiceStateUpdate: (queue: GuildQueue, oldState: VoiceState, newState: VoiceState) => any;\n}\n\n/* eslint-enable @typescript-eslint/no-explicit-any */\n\n/**\n * @typedef {object} PlayOptions\n * @property {boolean} [filtersUpdate=false] If this play was triggered for filters update\n * @property {string[]} [encoderArgs=[]] FFmpeg args passed to encoder\n * @property {number} [seek] Time to seek to before playing\n * @property {boolean} [immediate=false] If it should start playing the provided track immediately\n */\nexport interface PlayOptions {\n filtersUpdate?: boolean;\n encoderArgs?: string[];\n seek?: number;\n immediate?: boolean;\n}\n\nexport type QueryExtractorSearch = `ext:${string}`;\n\n/**\n * @typedef {object} SearchOptions\n * @property {UserResolvable} requestedBy The user who requested this search\n * @property {typeof QueryType|string} [searchEngine=QueryType.AUTO] The query search engine, can be extractor name to target specific one (custom)\n * @property {string[]} [blockExtractors[]] List of the extractors to block\n * @property {boolean} [ignoreCache] If it should ignore query cache lookup\n */\nexport interface SearchOptions {\n requestedBy?: UserResolvable;\n searchEngine?: SearchQueryType | QueryExtractorSearch;\n blockExtractors?: string[];\n ignoreCache?: boolean;\n}\n\n/**\n * The queue repeat mode. This can be one of:\n * - OFF\n * - TRACK\n * - QUEUE\n * - AUTOPLAY\n * @typedef {number} QueueRepeatMode\n */\nexport enum QueueRepeatMode {\n OFF = 0,\n TRACK = 1,\n QUEUE = 2,\n AUTOPLAY = 3\n}\n\n/**\n * @typedef {object} PlaylistInitData\n * @property {Track[]} tracks The tracks of this playlist\n * @property {string} title The playlist title\n * @property {string} description The description\n * @property {string} thumbnail The thumbnail\n * @property {album|playlist} type The playlist type: `album` | `playlist`\n * @property {TrackSource} source The playlist source\n * @property {object} author The playlist author\n * @property {string} [author.name] The author name\n * @property {string} [author.url] The author url\n * @property {string} id The playlist id\n * @property {string} url The playlist url\n * @property {any} [rawPlaylist] The raw playlist data\n */\nexport interface PlaylistInitData {\n tracks: Track[];\n title: string;\n description: string;\n thumbnail: string;\n type: 'album' | 'playlist';\n source: TrackSource;\n author: {\n name: string;\n url: string;\n };\n id: string;\n url: string;\n rawPlaylist?: any; // eslint-disable-line @typescript-eslint/no-explicit-any\n}\n\n/**\n * @typedef {object} TrackJSON\n * @property {string} title The track title\n * @property {string} description The track description\n * @property {string} author The author\n * @property {string} url The url\n * @property {string} thumbnail The thumbnail\n * @property {string} duration The duration\n * @property {number} durationMS The duration in ms\n * @property {number} views The views count\n * @property {Snowflake} requestedBy The id of the user who requested this track\n * @property {PlaylistJSON} [playlist] The playlist info (if any)\n */\nexport interface TrackJSON {\n id: Snowflake;\n title: string;\n description: string;\n author: string;\n url: string;\n thumbnail: string;\n duration: string;\n durationMS: number;\n views: number;\n requestedBy: Snowflake;\n playlist?: PlaylistJSON;\n}\n\n/**\n * @typedef {object} PlaylistJSON\n * @property {string} id The playlist id\n * @property {string} url The playlist url\n * @property {string} title The playlist title\n * @property {string} description The playlist description\n * @property {string} thumbnail The thumbnail\n * @property {album|playlist} type The playlist type: `album` | `playlist`\n * @property {TrackSource} source The track source\n * @property {object} author The playlist author\n * @property {string} [author.name] The author name\n * @property {string} [author.url] The author url\n * @property {TrackJSON[]} tracks The tracks data (if any)\n */\nexport interface PlaylistJSON {\n id: string;\n url: string;\n title: string;\n description: string;\n thumbnail: string;\n type: 'album' | 'playlist';\n source: TrackSource;\n author: {\n name: string;\n url: string;\n };\n tracks: TrackJSON[];\n}\n\n/**\n * @typedef {object} PlayerInitOptions\n * @property {boolean} [autoRegisterExtractor=true] If it should automatically register `@discord-player/extractor`\n * @property {YTDLDownloadOptions} [ytdlOptions] The options passed to `ytdl-core`\n * @property {number} [connectionTimeout=20000] The voice connection timeout\n * @property {boolean} [smoothVolume=true] Toggle smooth volume transition\n * @property {boolean} [lagMonitor=30000] Time in ms to re-monitor event loop lag\n * @property {boolean} [lockVoiceStateHandler] Prevent voice state handler from being overridden\n * @property {string[]} [blockExtractors] List of extractors to disable querying metadata from\n * @property {string[]} [blockStreamFrom] List of extractors to disable streaming from\n * @property {QueryCache | null} [queryCache] Query cache provider\n */\nexport interface PlayerInitOptions {\n autoRegisterExtractor?: boolean;\n ytdlOptions?: downloadOptions;\n connectionTimeout?: number;\n smoothVolume?: boolean;\n lagMonitor?: number;\n lockVoiceStateHandler?: boolean;\n blockExtractors?: string[];\n blockStreamFrom?: string[];\n queryCache?: QueryCache | null;\n}\n","import { Readable } from 'stream';\nimport { FiltersName, QueueFilters } from '../types/types';\nimport AudioFilters from '../utils/AudioFilters';\nimport { GuildQueue } from './GuildQueue';\nimport { BiquadFilters, Equalizer, EqualizerBand, PCMFilters } from '@discord-player/equalizer';\nimport { FFmpegStreamOptions, createFFmpegStream } from '../utils/FFmpegStream';\n\ntype Filters = keyof typeof AudioFilters.filters;\n\nconst makeBands = (arr: number[]) => {\n return Array.from(\n {\n length: Equalizer.BAND_COUNT\n },\n (_, i) => ({\n band: i,\n gain: arr[i] ? arr[i] / 30 : 0\n })\n ) as EqualizerBand[];\n};\n\nexport const EqualizerConfigurationPreset = {\n Flat: makeBands([]),\n Classical: makeBands([-1.11022e-15, -1.11022e-15, -1.11022e-15, -1.11022e-15, -1.11022e-15, -1.11022e-15, -7.2, -7.2, -7.2, -9.6]),\n Club: makeBands([-1.11022e-15, -1.11022e-15, 8.0, 5.6, 5.6, 5.6, 3.2, -1.11022e-15, -1.11022e-15, -1.11022e-15]),\n Dance: makeBands([9.6, 7.2, 2.4, -1.11022e-15, -1.11022e-15, -5.6, -7.2, -7.2, -1.11022e-15, -1.11022e-15]),\n FullBass: makeBands([-8.0, 9.6, 9.6, 5.6, 1.6, -4.0, -8.0, -10.4, -11.2, -11.2]),\n FullBassTreble: makeBands([7.2, 5.6, -1.11022e-15, -7.2, -4.8, 1.6, 8.0, 11.2, 12.0, 12.0]),\n FullTreble: makeBands([-9.6, -9.6, -9.6, -4.0, 2.4, 11.2, 16.0, 16.0, 16.0, 16.8]),\n Headphones: makeBands([4.8, 11.2, 5.6, -3.2, -2.4, 1.6, 4.8, 9.6, 12.8, 14.4]),\n LargeHall: makeBands([10.4, 10.4, 5.6, 5.6, -1.11022e-15, -4.8, -4.8, -4.8, -1.11022e-15, -1.11022e-15]),\n Live: makeBands([-4.8, -1.11022e-15, 4.0, 5.6, 5.6, 5.6, 4.0, 2.4, 2.4, 2.4]),\n Party: makeBands([7.2, 7.2, -1.11022e-15, -1.11022e-15, -1.11022e-15, -1.11022e-15, -1.11022e-15, -1.11022e-15, 7.2, 7.2]),\n Pop: makeBands([-1.6, 4.8, 7.2, 8.0, 5.6, -1.11022e-15, -2.4, -2.4, -1.6, -1.6]),\n Reggae: makeBands([-1.11022e-15, -1.11022e-15, -1.11022e-15, -5.6, -1.11022e-15, 6.4, 6.4, -1.11022e-15, -1.11022e-15, -1.11022e-15]),\n Rock: makeBands([8.0, 4.8, -5.6, -8.0, -3.2, 4.0, 8.8, 11.2, 11.2, 11.2]),\n Ska: makeBands([-2.4, -4.8, -4.0, -1.11022e-15, 4.0, 5.6, 8.8, 9.6, 11.2, 9.6]),\n Soft: makeBands([4.8, 1.6, -1.11022e-15, -2.4, -1.11022e-15, 4.0, 8.0, 9.6, 11.2, 12.0]),\n SoftRock: makeBands([4.0, 4.0, 2.4, -1.11022e-15, -4.0, -5.6, -3.2, -1.11022e-15, 2.4, 8.8]),\n Techno: makeBands([8.0, 5.6, -1.11022e-15, -5.6, -4.8, -1.11022e-15, 8.0, 9.6, 9.6, 8.8])\n} as const;\n\nexport class FFmpegFilterer<Meta = unknown> {\n #ffmpegFilters: Filters[] = [];\n public constructor(public af: GuildQueueAudioFilters<Meta>) {}\n\n #setFilters(filters: Filters[]) {\n const ignoreFilters = this.filters.some((ff) => ff === 'nightcore' || ff === 'vaporwave') && !filters.some((ff) => ff === 'nightcore' || ff === 'vaporwave');\n const seekTime = this.af.queue.node.getTimestamp(ignoreFilters)?.current.value || 0;\n this.#ffmpegFilters = [...new Set(filters)];\n return this.af.triggerReplay(seekTime);\n }\n\n /**\n * Create ffmpeg stream\n * @param source The stream source\n * @param options The stream options\n */\n public createStream(source: string | Readable, options: FFmpegStreamOptions) {\n return createFFmpegStream(source, options);\n }\n\n /**\n * Set ffmpeg filters\n * @param filters The filters\n */\n public setFilters(filters: Filters[] | Record<Filters, boolean> | boolean) {\n let _filters: Filters[] = [];\n if (typeof filters === 'boolean') {\n _filters = !filters ? [] : (Object.keys(AudioFilters.filters) as Filters[]);\n } else if (Array.isArray(filters)) {\n _filters = filters;\n } else {\n _filters = Object.entries(filters)\n .filter((res) => res[1] === true)\n .map((m) => m[0]) as Filters[];\n }\n\n return this.#setFilters(_filters);\n }\n\n /**\n * Currently active ffmpeg filters\n */\n public get filters() {\n return this.#ffmpegFilters;\n }\n\n public set filters(filters: Filters[]) {\n this.setFilters(filters);\n }\n\n /**\n * Toggle given ffmpeg filter(s)\n * @param filters The filter(s)\n */\n public toggle(filters: Filters[] | Filters) {\n if (!Array.isArray(filters)) filters = [filters];\n const fresh: Filters[] = [];\n\n filters.forEach((f) => {\n if (this.filters.includes(f)) return;\n fresh.push(f);\n });\n\n return this.#setFilters(this.#ffmpegFilters.filter((r) => !filters.includes(r)).concat(fresh));\n }\n\n /**\n * Set default filters\n * @param ff Filters list\n */\n public setDefaults(ff: Filters[]) {\n this.#ffmpegFilters = ff;\n }\n\n /**\n * Get list of enabled filters\n */\n public getFiltersEnabled() {\n return this.#ffmpegFilters;\n }\n\n /**\n * Get list of disabled filters\n */\n public getFiltersDisabled() {\n return AudioFilters.names.filter((f) => !this.#ffmpegFilters.includes(f));\n }\n\n /**\n * Check if the given filter is enabled\n * @param filter The filter\n */\n public isEnabled<T extends Filters>(filter: T): boolean {\n return this.#ffmpegFilters.includes(filter);\n }\n\n /**\n * Check if the given filter is disabled\n * @param filter The filter\n */\n public isDisabled<T extends Filters>(filter: T): boolean {\n return !this.isEnabled(filter);\n }\n\n /**\n * Check if the given filter is a valid filter\n * @param filter The filter to test\n */\n public isValidFilter(filter: string): filter is FiltersName {\n return AudioFilters.has(filter as Filters);\n }\n\n /**\n * Convert current filters to array\n */\n public toArray() {\n return this.filters.map((filter) => AudioFilters.get(filter));\n }\n\n /**\n * Convert current filters to JSON object\n */\n public toJSON() {\n const obj = {} as Record<keyof QueueFilters, string>;\n\n this.filters.forEach((filter) => (obj[filter] = AudioFilters.get(filter)));\n\n return obj;\n }\n\n /**\n * String representation of current filters\n */\n public toString() {\n return AudioFilters.create(this.filters);\n }\n}\n\nexport interface GuildQueueAFiltersCache {\n equalizer: EqualizerBand[];\n biquad: BiquadFilters | null;\n filters: PCMFilters[];\n volume: number;\n sampleRate: number;\n}\n\nexport class GuildQueueAudioFilters<Meta = unknown> {\n public graph = new AFilterGraph<Meta>(this);\n public ffmpeg = new FFmpegFilterer<Meta>(this);\n public equalizerPresets = EqualizerConfigurationPreset;\n public _lastFiltersCache: GuildQueueAFiltersCache = {\n biquad: null,\n equalizer: [],\n filters: [],\n volume: 100,\n sampleRate: -1\n };\n public constructor(public queue: GuildQueue<Meta>) {\n if (typeof this.queue.options.volume === 'number') {\n this._lastFiltersCache.volume = this.queue.options.volume;\n }\n }\n\n /**\n * Volume transformer\n */\n public get volume() {\n return this.queue.dispatcher?.dsp?.volume || null;\n }\n\n /**\n * 15 Band Equalizer\n */\n public get equalizer() {\n return this.queue.dispatcher?.equalizer || null;\n }\n\n /**\n * Digital biquad filters\n */\n public get biquad() {\n return this.queue.dispatcher?.biquad || null;\n }\n\n /**\n * DSP filters\n */\n public get filters() {\n return this.queue.dispatcher?.filters || null;\n }\n\n /**\n * Audio resampler\n */\n public get resampler() {\n return this.queue.dispatcher?.resampler || null;\n }\n\n /**\n * Replay current track in transition mode\n * @param seek The duration to seek to\n */\n public async triggerReplay(seek = 0) {\n if (!this.queue.currentTrack) return false;\n try {\n await this.queue.node.play(this.queue.currentTrack, {\n queue: false,\n seek,\n transitionMode: true\n });\n\n return true;\n } catch {\n return false;\n }\n }\n}\n\nexport class AFilterGraph<Meta = unknown> {\n public constructor(public af: GuildQueueAudioFilters<Meta>) {}\n\n public get ffmpeg() {\n return this.af.ffmpeg.filters;\n }\n\n public get equalizer() {\n return (this.af.equalizer?.bandMultipliers || []).map((m, i) => ({\n band: i,\n gain: m\n })) as EqualizerBand[];\n }\n\n public get biquad() {\n return null;\n // return (this.af.biquad?.getFilterName() as Exclude<BiquadFilters, number> | null) || null;\n }\n\n public get filters() {\n return this.af.filters?.filters || [];\n }\n\n public get volume() {\n return this.af.volume;\n }\n\n public get resampler() {\n return this.af.resampler;\n }\n\n public dump(): FilterGraph {\n return {\n ffmpeg: this.ffmpeg,\n equalizer: this.equalizer,\n biquad: this.biquad,\n filters: this.filters,\n sampleRate: this.resampler?.targetSampleRate || this.resampler?.sampleRate || 48000,\n volume: this.volume?.volume ?? 100\n };\n }\n}\n\nexport interface FilterGraph {\n ffmpeg: Filters[];\n equalizer: EqualizerBand[];\n biquad: Exclude<BiquadFilters, number> | null;\n filters: PCMFilters[];\n volume: number;\n sampleRate: number;\n}\n","import { FFmpeg } from 'prism-media';\nimport type { Duplex, Readable } from 'stream';\n\nexport interface FFmpegStreamOptions {\n fmt?: string;\n encoderArgs?: string[];\n seek?: number;\n skip?: boolean;\n cookies?: string;\n}\n\nexport function FFMPEG_ARGS_STRING(stream: string, fmt?: string, cookies?: string) {\n // prettier-ignore\n const args = [\n \"-reconnect\", \"1\",\n \"-reconnect_streamed\", \"1\",\n \"-reconnect_delay_max\", \"5\",\n \"-i\", stream,\n \"-analyzeduration\", \"0\",\n \"-loglevel\", \"0\",\n \"-f\", `${typeof fmt === \"string\" ? fmt : \"s16le\"}`,\n \"-ar\", \"48000\",\n \"-ac\", \"2\"\n ];\n\n if (typeof cookies === 'string') {\n // https://ffmpeg.org/ffmpeg-protocols.html#HTTP-Cookies\n args.push('-cookies', cookies.startsWith('\"') ? cookies : `\"${cookies}\"`);\n }\n\n return args;\n}\n\nexport function FFMPEG_ARGS_PIPED(fmt?: string) {\n // prettier-ignore\n return [\n \"-analyzeduration\", \"0\",\n \"-loglevel\", \"0\",\n \"-f\", `${typeof fmt === \"string\" ? fmt : \"s16le\"}`,\n \"-ar\", \"48000\",\n \"-ac\", \"2\"\n ];\n}\n\n/**\n * Creates FFmpeg stream\n * @param stream The source stream\n * @param options FFmpeg stream options\n */\nexport function createFFmpegStream(stream: Readable | Duplex | string, options?: FFmpegStreamOptions) {\n if (options?.skip && typeof stream !== 'string') return stream;\n options ??= {};\n const args = typeof stream === 'string' ? FFMPEG_ARGS_STRING(stream, options.fmt, options.cookies) : FFMPEG_ARGS_PIPED(options.fmt);\n\n if (!Number.isNaN(options.seek)) args.unshift('-ss', String(options.seek));\n if (Array.isArray(options.encoderArgs)) args.push(...options.encoderArgs);\n\n const transcoder = new FFmpeg({ shell: false, args });\n transcoder.on('close', () => transcoder.destroy());\n\n if (typeof stream !== 'string') {\n stream.on('error', () => transcoder.destroy());\n stream.pipe(transcoder);\n }\n\n return transcoder;\n}\n","import { GuildQueue } from './GuildQueue';\n\nexport interface GuildQueueStatisticsMetadata {\n latency: {\n eventLoop: number;\n voiceConnection: number;\n };\n status: {\n buffering: boolean;\n playing: boolean;\n paused: boolean;\n idle: boolean;\n };\n tracksCount: number;\n historySize: number;\n extractors: number;\n listeners: number;\n memoryUsage: NodeJS.MemoryUsage;\n versions: {\n node: string;\n player: string;\n };\n}\n\nexport class GuildQueueStatistics<Meta = unknown> {\n public constructor(public queue: GuildQueue<Meta>) {}\n\n /**\n * Generate statistics of this queue\n */\n public generate() {\n return {\n latency: {\n eventLoop: this.queue.player.eventLoopLag,\n voiceConnection: this.queue.ping\n },\n status: {\n buffering: this.queue.node.isBuffering(),\n playing: this.queue.node.isPlaying(),\n paused: this.queue.node.isPaused(),\n idle: this.queue.node.isIdle()\n },\n tracksCount: this.queue.tracks.size,\n historySize: this.queue.history.tracks.size,\n extractors: this.queue.player.extractors.size,\n listeners: this.queue.guild.members.me?.voice.channel?.members.filter((m) => !m.user.bot).size || 0,\n memoryUsage: process.memoryUsage(),\n versions: {\n node: process.version,\n player: '6.0.0-dev.3'\n }\n } as GuildQueueStatisticsMetadata;\n }\n}\n","import { User } from 'discord.js';\nimport { BaseExtractor } from '../extractors/BaseExtractor';\nimport { Player } from '../Player';\nimport { QueryExtractorSearch, QueryType, SearchQueryType } from '../types/types';\nimport { Playlist } from './Playlist';\nimport { Track } from './Track';\n\nexport interface SearchResultData {\n query: string;\n queryType?: SearchQueryType | QueryExtractorSearch | null;\n extractor?: BaseExtractor | null;\n playlist?: Playlist | null;\n tracks?: Track[];\n requestedBy?: User | null;\n}\n\nexport class SearchResult {\n public constructor(public player: Player, private _data: SearchResultData) {}\n\n /**\n * The search query\n */\n public get query() {\n return this._data.query;\n }\n\n /**\n * The search query type\n */\n public get queryType() {\n return this._data.queryType || QueryType.AUTO;\n }\n\n /**\n * The extractor\n */\n public get extractor() {\n return this._data.extractor || null;\n }\n\n /**\n * Playlist result\n */\n public get playlist() {\n return this._data.playlist;\n }\n\n /**\n * Tracks result\n */\n public get tracks() {\n return this._data.tracks || [];\n }\n\n /**\n * Requested by\n */\n public get requestedBy() {\n return this._data.requestedBy || null;\n }\n\n /**\n * Re-execute this search\n */\n public async execute() {\n return this.player.search(this.query, {\n searchEngine: this.queryType,\n requestedBy: this.requestedBy!\n });\n }\n\n /**\n * If this search result is empty\n */\n public isEmpty() {\n return !this.tracks.length;\n }\n\n /**\n * If this search result has playlist\n */\n public hasPlaylist() {\n return this.playlist != null;\n }\n\n /**\n * If this search result has tracks\n */\n public hasTracks() {\n return this.tracks.length > 0;\n }\n\n /**\n * JSON representation of this search\n */\n public toJSON() {\n return {\n query: this.query,\n queryType: this.queryType,\n playlist: this.playlist?.toJSON(false) || null,\n tracks: this.tracks.map((m) => m.toJSON(true)),\n extractor: this.extractor?.identifier || null,\n requestedBy: this.requestedBy?.toJSON() || null\n };\n }\n}\n","export enum ErrorStatusCode {\n STREAM_ERROR = 'StreamError',\n AUDIO_PLAYER_ERROR = 'AudioPlayerError',\n PLAYER_ERROR = 'PlayerError',\n NO_AUDIO_RESOURCE = 'NoAudioResource',\n UNKNOWN_GUILD = 'UnknownGuild',\n INVALID_ARG_TYPE = 'InvalidArgType',\n UNKNOWN_EXTRACTOR = 'UnknownExtractor',\n INVALID_EXTRACTOR = 'InvalidExtractor',\n INVALID_CHANNEL_TYPE = 'InvalidChannelType',\n INVALID_TRACK = 'InvalidTrack',\n UNKNOWN_REPEAT_MODE = 'UnknownRepeatMode',\n TRACK_NOT_FOUND = 'TrackNotFound',\n NO_CONNECTION = 'NoConnection',\n DESTROYED_QUEUE = 'DestroyedQueue'\n}\n\nexport class PlayerError extends Error {\n message: string;\n statusCode: ErrorStatusCode;\n createdAt = new Date();\n\n constructor(message: string, code: ErrorStatusCode = ErrorStatusCode.PLAYER_ERROR) {\n super();\n\n this.message = `[${code}] ${message}`;\n this.statusCode = code;\n this.name = code;\n\n Error.captureStackTrace(this);\n }\n\n get createdTimestamp() {\n return this.createdAt.getTime();\n }\n\n valueOf() {\n return this.statusCode;\n }\n\n toJSON() {\n return {\n stack: this.stack,\n code: this.statusCode,\n message: this.message,\n created: this.createdTimestamp\n };\n }\n\n toString() {\n return this.stack;\n }\n}\n","import { VoiceChannel, StageChannel, Snowflake } from 'discord.js';\nimport { DiscordGatewayAdapterCreator, joinVoiceChannel, VoiceConnection, getVoiceConnection } from '@discordjs/voice';\nimport { StreamDispatcher } from './StreamDispatcher';\nimport { Collection } from '@discord-player/utils';\nimport { GuildQueue } from '../Structures';\n\nclass VoiceUtils {\n public cache: Collection<Snowflake, StreamDispatcher>;\n\n /**\n * The voice utils\n * @private\n */\n constructor() {\n /**\n * The cache where voice utils stores stream managers\n * @type {Collection<Snowflake, StreamDispatcher>}\n */\n this.cache = new Collection<Snowflake, StreamDispatcher>();\n }\n\n /**\n * Joins a voice channel, creating basic stream dispatch manager\n * @param {StageChannel|VoiceChannel} channel The voice channel\n * @param {object} [options] Join options\n * @returns {Promise<StreamDispatcher>}\n */\n public async connect(\n channel: VoiceChannel | StageChannel,\n options?: {\n deaf?: boolean;\n maxTime?: number;\n queue: GuildQueue;\n }\n ): Promise<StreamDispatcher> {\n if (!options?.queue) throw new Error('GuildQueue is required');\n const conn = await this.join(channel, options);\n const sub = new StreamDispatcher(conn, channel, options.queue, options.maxTime);\n this.cache.set(channel.guild.id, sub);\n return sub;\n }\n\n /**\n * Joins a voice channel\n * @param {StageChannel|VoiceChannel} [channel] The voice/stage channel to join\n * @param {object} [options] Join options\n * @returns {VoiceConnection}\n */\n public async join(\n channel: VoiceChannel | StageChannel,\n options?: {\n deaf?: boolean;\n maxTime?: number;\n }\n ) {\n const conn = joinVoiceChannel({\n guildId: channel.guild.id,\n channelId: channel.id,\n adapterCreator: channel.guild.voiceAdapterCreator as unknown as DiscordGatewayAdapterCreator,\n selfDeaf: Boolean(options?.deaf)\n });\n\n return conn;\n }\n\n /**\n * Disconnects voice connection\n * @param {VoiceConnection} connection The voice connection\n * @returns {void}\n */\n public disconnect(connection: VoiceConnection | StreamDispatcher) {\n if (connection instanceof StreamDispatcher) return connection.voiceConnection.destroy();\n return connection.destroy();\n }\n\n /**\n * Returns Discord Player voice connection\n * @param {Snowflake} guild The guild id\n * @returns {StreamDispatcher}\n */\n public getConnection(guild: Snowflake) {\n return this.cache.get(guild) || getVoiceConnection(guild);\n }\n}\n\nexport { VoiceUtils };\n","import {\n AudioPlayer,\n AudioPlayerError,\n AudioPlayerStatus,\n AudioResource,\n createAudioPlayer,\n createAudioResource,\n entersState,\n StreamType,\n VoiceConnection,\n VoiceConnectionStatus,\n VoiceConnectionDisconnectReason\n} from '@discordjs/voice';\nimport { StageChannel, VoiceChannel } from 'discord.js';\nimport type { Readable } from 'stream';\nimport { EventEmitter } from '@discord-player/utils';\nimport { Track } from '../Structures/Track';\nimport { Util } from '../utils/Util';\nimport { PlayerError, ErrorStatusCode } from '../Structures/PlayerError';\nimport { EqualizerBand, BiquadFilters, PCMFilters, FiltersChain } from '@discord-player/equalizer';\nimport { GuildQueue, PostProcessedResult } from '../Structures';\n\ninterface CreateStreamOps {\n type?: StreamType;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n data?: any;\n disableVolume?: boolean;\n disableEqualizer?: boolean;\n disableBiquad?: boolean;\n eq?: EqualizerBand[];\n biquadFilter?: BiquadFilters;\n disableFilters?: boolean;\n defaultFilters?: PCMFilters[];\n volume?: number;\n disableResampler?: boolean;\n sampleRate?: number;\n}\n\nexport interface VoiceEvents {\n /* eslint-disable @typescript-eslint/no-explicit-any */\n error: (error: AudioPlayerError) => any;\n debug: (message: string) => any;\n start: (resource: AudioResource<Track>) => any;\n finish: (resource: AudioResource<Track>) => any;\n dsp: (filters: PCMFilters[]) => any;\n eqBands: (filters: EqualizerBand[]) => any;\n sampleRate: (filters: number) => any;\n biquad: (filters: BiquadFilters) => any;\n volume: (volume: number) => any;\n /* eslint-enable @typescript-eslint/no-explicit-any */\n}\n\nclass StreamDispatcher extends EventEmitter<VoiceEvents> {\n public readonly voiceConnection: VoiceConnection;\n public readonly audioPlayer: AudioPlayer;\n public channel: VoiceChannel | StageChannel;\n public audioResource?: AudioResource<Track> | null;\n private readyLock = false;\n public dsp = new FiltersChain();\n\n /**\n * Creates new connection object\n * @param {VoiceConnection} connection The connection\n * @param {VoiceChannel|StageChannel} channel The connected channel\n * @private\n */\n constructor(connection: VoiceConnection, channel: VoiceChannel | StageChannel, public queue: GuildQueue, public readonly connectionTimeout: number = 20000) {\n super();\n\n /**\n * The voice connection\n * @type {VoiceConnection}\n */\n this.voiceConnection = connection;\n\n /**\n * The audio player\n * @type {AudioPlayer}\n */\n this.audioPlayer = createAudioPlayer();\n\n /**\n * The voice channel\n * @type {VoiceChannel|StageChannel}\n */\n this.channel = channel;\n\n this.dsp.onUpdate = () => {\n if (!this.dsp) return;\n if (this.dsp.filters?.filters) this.emit('dsp', this.dsp.filters?.filters);\n if (this.dsp.biquad?.filter) this.emit('biquad', this.dsp.biquad?.filter);\n if (this.dsp.equalizer) this.emit('eqBands', this.dsp.equalizer.getEQ());\n if (this.dsp.volume) this.emit('volume', this.dsp.volume.volume);\n if (this.dsp.resampler) this.emit('sampleRate', this.dsp.resampler.targetSampleRate);\n };\n\n this.dsp.onError = (e) => this.emit('error', e as AudioPlayerError);\n\n this.voiceConnection.on('stateChange', async (_, newState) => {\n if (newState.status === VoiceConnectionStatus.Disconnected) {\n if (newState.reason === VoiceConnectionDisconnectReason.WebSocketClose && newState.closeCode === 4014) {\n try {\n await entersState(this.voiceConnection, VoiceConnectionStatus.Connecting, this.connectionTimeout);\n } catch {\n try {\n this.voiceConnection.destroy();\n } catch (err) {\n this.emit('error', err as AudioPlayerError);\n }\n }\n } else if (this.voiceConnection.rejoinAttempts < 5) {\n await Util.wait((this.voiceConnection.rejoinAttempts + 1) * 5000);\n this.voiceConnection.rejoin();\n } else {\n try {\n this.voiceConnection.destroy();\n } catch (err) {\n this.emit('error', err as AudioPlayerError);\n }\n }\n } else if (newState.status === VoiceConnectionStatus.Destroyed) {\n this.end();\n } else if (!this.readyLock && (newState.status === VoiceConnectionStatus.Connecting || newState.status === VoiceConnectionStatus.Signalling)) {\n this.readyLock = true;\n try {\n await entersState(this.voiceConnection, VoiceConnectionStatus.Ready, this.connectionTimeout);\n } catch {\n if (this.voiceConnection.state.status !== VoiceConnectionStatus.Destroyed) {\n try {\n this.voiceConnection.destroy();\n } catch (err) {\n this.emit('error', err as AudioPlayerError);\n }\n }\n } finally {\n this.readyLock = false;\n }\n }\n });\n\n this.audioPlayer.on('stateChange', (oldState, newState) => {\n if (newState.status === AudioPlayerStatus.Playing) {\n if (oldState.status === AudioPlayerStatus.Idle || oldState.status === AudioPlayerStatus.Buffering) {\n return this.emit('start', this.audioResource!);\n }\n } else if (newState.status === AudioPlayerStatus.Idle && oldState.status !== AudioPlayerStatus.Idle) {\n this.emit('finish', this.audioResource!);\n this.dsp.destroy();\n this.audioResource = null;\n }\n });\n\n this.audioPlayer.on('debug', (m) => void this.emit('debug', m));\n this.audioPlayer.on('error', (error) => void this.emit('error', error));\n this.voiceConnection.subscribe(this.audioPlayer);\n }\n\n /**\n * Check if the player has been paused manually\n */\n get paused() {\n return this.audioPlayer.state.status === AudioPlayerStatus.Paused;\n }\n\n set paused(val: boolean) {\n val ? this.pause(true) : this.resume();\n }\n\n /**\n * Whether or not the player is currently paused automatically or manually.\n */\n isPaused() {\n return this.paused || this.audioPlayer.state.status === AudioPlayerStatus.AutoPaused;\n }\n\n /**\n * Whether or not the player is currently buffering\n */\n isBuffering() {\n return this.audioPlayer.state.status === AudioPlayerStatus.Buffering;\n }\n\n /**\n * Whether or not the player is currently playing\n */\n isPlaying() {\n return this.audioPlayer.state.status === AudioPlayerStatus.Playing;\n }\n\n /**\n * Whether or not the player is currently idle\n */\n isIdle() {\n return this.audioPlayer.state.status === AudioPlayerStatus.Idle;\n }\n\n /**\n * Creates stream\n * @param {Readable} src The stream source\n * @param {object} [ops] Options\n * @returns {AudioResource}\n */\n async createStream(src: Readable, ops?: CreateStreamOps) {\n if (!ops?.disableFilters) this.queue.debug('Initiating DSP filters pipeline...');\n const stream = !ops?.disableFilters\n ? this.dsp.create(src, {\n dsp: {\n filters: ops?.defaultFilters,\n disabled: ops?.disableFilters\n },\n biquad: ops?.biquadFilter\n ? {\n filter: ops.biquadFilter,\n disabled: ops?.disableBiquad\n }\n : undefined,\n resampler: {\n targetSampleRate: ops?.sampleRate,\n disabled: ops?.disableResampler\n },\n equalizer: {\n bandMultiplier: ops?.eq,\n disabled: ops?.disableEqualizer\n },\n volume: {\n volume: ops?.volume,\n disabled: ops?.disableVolume\n }\n })\n : src;\n\n this.queue.debug('Executing onAfterCreateStream hook...');\n const postStream = await this.queue.onAfterCreateStream?.(stream, this.queue).catch(\n () =>\n ({\n stream: stream,\n type: ops?.type ?? StreamType.Arbitrary\n } as PostProcessedResult)\n );\n\n this.queue.debug('Preparing AudioResource...');\n this.audioResource = createAudioResource(postStream?.stream ?? stream, {\n inputType: postStream?.type ?? ops?.type ?? StreamType.Arbitrary,\n metadata: ops?.data,\n // volume controls happen from AudioFilter DSP utility\n inlineVolume: false\n });\n\n return this.audioResource;\n }\n\n public get resampler() {\n return this.dsp?.resampler;\n }\n\n public get filters() {\n return this.dsp?.filters;\n }\n\n public get biquad() {\n return this.dsp?.biquad || null;\n }\n\n public get equalizer() {\n return this.dsp?.equalizer || null;\n }\n\n /**\n * The player status\n * @type {AudioPlayerStatus}\n */\n get status() {\n return this.audioPlayer.state.status;\n }\n\n /**\n * Disconnects from voice\n * @returns {void}\n */\n disconnect() {\n try {\n if (this.audioPlayer) this.audioPlayer.stop(true);\n this.voiceConnection.destroy();\n } catch {} // eslint-disable-line no-empty\n }\n\n /**\n * Stops the player\n * @returns {void}\n */\n end() {\n this.audioPlayer.stop();\n }\n\n /**\n * Pauses the stream playback\n * @param {boolean} [interpolateSilence=false] If true, the player will play 5 packets of silence after pausing to prevent audio glitches.\n * @returns {boolean}\n */\n pause(interpolateSilence?: boolean) {\n const success = this.audioPlayer.pause(interpolateSilence);\n return success;\n }\n\n /**\n * Resumes the stream playback\n * @returns {boolean}\n */\n resume() {\n const success = this.audioPlayer.unpause();\n return success;\n }\n\n /**\n * Play stream\n * @param {AudioResource<Track>} [resource=this.audioResource] The audio resource to play\n * @returns {Promise<StreamDispatcher>}\n */\n async playStream(resource: AudioResource<Track> = this.audioResource!) {\n if (!resource) throw new PlayerError('Audio resource is not available!', ErrorStatusCode.NO_AUDIO_RESOURCE);\n if (resource.ended) {\n return void this.emit('finish', resource);\n }\n if (!this.audioResource) this.audioResource = resource;\n if (this.voiceConnection.state.status !== VoiceConnectionStatus.Ready) {\n try {\n await entersState(this.voiceConnection, VoiceConnectionStatus.Ready, this.connectionTimeout);\n } catch (err) {\n return void this.emit('error', err as AudioPlayerError);\n }\n }\n\n try {\n this.audioPlayer.play(resource);\n } catch (e) {\n this.emit('error', e as AudioPlayerError);\n }\n\n return this;\n }\n\n /**\n * Sets playback volume\n * @param {number} value The volume amount\n * @returns {boolean}\n */\n setVolume(value: number) {\n if (!this.dsp.volume) return false;\n return this.dsp.volume.setVolume(value);\n }\n\n /**\n * The current volume\n * @type {number}\n */\n get volume() {\n if (!this.dsp.volume) return 100;\n return this.dsp.volume.volume;\n }\n\n /**\n * The playback time\n * @type {number}\n */\n get streamTime() {\n if (!this.audioResource) return 0;\n return this.audioResource.playbackDuration;\n }\n}\n\nexport { StreamDispatcher as StreamDispatcher };\n","import Fuse from 'fuse.js';\nimport { Player } from '../Player';\nimport { SearchResult } from '../Structures/SearchResult';\nimport { Track } from '../Structures/Track';\nimport { User } from 'discord.js';\nimport { SearchQueryType } from '../types/types';\n\nexport interface QueryCacheOptions {\n checkInterval?: number;\n}\n\n// 5h\nconst DEFAULT_EXPIRY_TIMEOUT = 18_000_000;\n\nexport class QueryCache {\n #defaultCache = new Map<string, DiscordPlayerQueryResultCache<Track>>();\n public timer: NodeJS.Timer;\n public fuse = new Fuse([] as Track[], {\n // prettier-ignore\n keys: [\n 'url'\n ]\n });\n public constructor(\n public player: Player,\n public options: QueryCacheOptions = {\n checkInterval: DEFAULT_EXPIRY_TIMEOUT\n }\n ) {\n this.timer = setInterval(this.cleanup.bind(this), this.checkInterval).unref();\n }\n\n public get checkInterval() {\n return this.options.checkInterval ?? DEFAULT_EXPIRY_TIMEOUT;\n }\n\n public async cleanup() {\n for (const [id, value] of this.#defaultCache) {\n if (value.hasExpired()) {\n this.#defaultCache.delete(id);\n }\n }\n }\n\n public async clear() {\n this.#defaultCache.clear();\n }\n\n public async getData() {\n return [...this.#defaultCache.values()];\n }\n\n public async addData(data: SearchResult) {\n data.tracks.forEach((d) => {\n if (this.#defaultCache.has(d.url)) return;\n this.#defaultCache.set(d.url, new DiscordPlayerQueryResultCache(d));\n });\n }\n\n public async resolve(context: QueryCacheResolverContext) {\n const cacheData = await this.getData();\n\n this.fuse.setCollection(cacheData.map((m) => m.data));\n\n const result = this.fuse.search(context.query);\n if (!result.length)\n return new SearchResult(this.player, {\n query: context.query,\n requestedBy: context.requestedBy,\n queryType: context.queryType\n });\n\n return new SearchResult(this.player, {\n query: context.query,\n tracks: result.map((m) => m.item),\n playlist: null,\n queryType: context.queryType,\n requestedBy: context.requestedBy\n });\n }\n}\n\nexport class DiscordPlayerQueryResultCache<T = unknown> {\n public expireAfter = DEFAULT_EXPIRY_TIMEOUT;\n public constructor(public data: T, expireAfter: number = DEFAULT_EXPIRY_TIMEOUT) {\n if (typeof expireAfter === 'number') {\n this.expireAfter = Date.now() + expireAfter;\n }\n }\n\n public hasExpired() {\n if (typeof this.expireAfter !== 'number' || isNaN(this.expireAfter) || this.expireAfter < 1) return false;\n return Date.now() <= this.expireAfter;\n }\n}\n\nexport interface QueryCacheResolverContext {\n query: string;\n requestedBy?: User;\n queryType?: SearchQueryType | `ext:${string}`;\n}\n","import { Client, SnowflakeUtil, VoiceState, IntentsBitField, User, ChannelType, GuildVoiceChannelResolvable } from 'discord.js';\nimport { EventEmitter } from '@discord-player/utils';\nimport { Playlist, Track, GuildQueueEvents, VoiceConnectConfig, GuildNodeCreateOptions, GuildNodeManager, SearchResult } from './Structures';\nimport { VoiceUtils } from './VoiceInterface/VoiceUtils';\nimport { PlayerEvents, QueryType, SearchOptions, PlayerInitOptions, PlaylistInitData, SearchQueryType } from './types/types';\nimport { QueryResolver } from './utils/QueryResolver';\nimport { Util } from './utils/Util';\nimport { generateDependencyReport } from '@discordjs/voice';\nimport { ExtractorExecutionContext } from './extractors/ExtractorExecutionContext';\nimport { BaseExtractor } from './extractors/BaseExtractor';\nimport * as _internals from './utils/__internal__';\nimport { QueryCache } from './utils/QueryCache';\n\nconst kSingleton = Symbol('InstanceDiscordPlayerSingleton');\n\nexport class Player extends EventEmitter<PlayerEvents> {\n public static _singletonKey = kSingleton;\n public readonly id = SnowflakeUtil.generate().toString();\n public readonly client: Client;\n public readonly options: PlayerInitOptions;\n public nodes = new GuildNodeManager(this);\n public readonly voiceUtils = new VoiceUtils();\n public requiredEvents = ['error', 'connectionError'] as string[];\n public extractors = new ExtractorExecutionContext(this);\n public events = new EventEmitter<GuildQueueEvents>();\n #lastLatency = -1;\n #voiceStateUpdateListener = this.handleVoiceState.bind(this);\n #lagMonitorTimeout!: NodeJS.Timeout;\n #lagMonitorInterval!: NodeJS.Timer;\n\n /**\n * Creates new Discord Player\n * @param {Client} client The Discord Client\n * @param {PlayerInitOptions} [options] The player init options\n */\n public constructor(client: Client, options: PlayerInitOptions = {}) {\n super();\n\n /**\n * The discord.js client\n * @type {Client}\n */\n this.client = client;\n\n if (this.client?.options?.intents && !new IntentsBitField(this.client?.options?.intents).has(IntentsBitField.Flags.GuildVoiceStates)) {\n Util.warn('client is missing \"GuildVoiceStates\" intent', 'InvalidIntentsBitField');\n }\n\n /**\n * The extractors collection\n * @type {ExtractorModel}\n */\n this.options = {\n autoRegisterExtractor: true,\n lockVoiceStateHandler: false,\n blockExtractors: [],\n blockStreamFrom: [],\n connectionTimeout: 20000,\n smoothVolume: true,\n lagMonitor: 30000,\n queryCache: options.queryCache === null ? null : new QueryCache(this),\n ...options,\n ytdlOptions: {\n highWaterMark: 1 << 25,\n ...options.ytdlOptions\n }\n };\n\n this.client.on('voiceStateUpdate', this.#voiceStateUpdateListener);\n\n if (this.options?.autoRegisterExtractor) {\n let nv: any; // eslint-disable-line @typescript-eslint/no-explicit-any\n\n if ((nv = Util.require('@discord-player/extractor'))) {\n ['YouTubeExtractor', 'SoundCloudExtractor', 'ReverbnationExtractor', 'VimeoExtractor', 'AttachmentExtractor'].forEach((ext) => void this.extractors.register(nv[ext]));\n }\n }\n\n if (typeof this.options.lagMonitor === 'number' && this.options.lagMonitor > 0) {\n this.#lagMonitorInterval = setInterval(() => {\n const start = performance.now();\n this.#lagMonitorTimeout = setTimeout(() => {\n this.#lastLatency = performance.now() - start;\n }, 0).unref();\n }, this.options.lagMonitor).unref();\n }\n\n _internals.addPlayer(this);\n }\n\n /**\n * Creates discord-player singleton instance.\n * @param client The client that instantiated player\n * @param options Player initializer options\n */\n public static singleton(client: Client, options: PlayerInitOptions = {}) {\n if (!(kSingleton in Player)) {\n Object.defineProperty(Player, kSingleton, {\n value: new Player(client, options),\n writable: true,\n configurable: true,\n enumerable: false\n });\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (Player as any)[kSingleton] as Player;\n }\n\n /**\n * Get all active player instances\n */\n public static getAllPlayers() {\n return _internals.getPlayers();\n }\n\n /**\n * Clear all player instances\n */\n public static clearAllPlayers() {\n return _internals.instances.clear();\n }\n\n /**\n * The current query cache provider\n */\n public get queryCache() {\n return this.options.queryCache ?? null;\n }\n\n /**\n * Alias to `Player.nodes`\n */\n public get queues() {\n return this.nodes;\n }\n\n /**\n * Event loop lag\n * @type {number}\n */\n public get eventLoopLag() {\n return this.#lastLatency;\n }\n\n /**\n * Generates statistics\n */\n public generateStatistics() {\n return {\n instances: _internals.instances.size,\n queuesCount: this.queues.cache.size,\n queryCacheEnabled: this.queryCache != null,\n queues: this.queues.cache.map((m) => m.stats.generate())\n };\n }\n\n /**\n * Destroy player\n */\n public async destroy() {\n this.nodes.cache.forEach((node) => node.delete());\n this.client.off('voiceStateUpdate', this.#voiceStateUpdateListener);\n this.removeAllListeners();\n this.events.removeAllListeners();\n await this.extractors.unregisterAll();\n if (this.#lagMonitorInterval) clearInterval(this.#lagMonitorInterval);\n if (this.#lagMonitorTimeout) clearInterval(this.#lagMonitorTimeout);\n _internals.clearPlayer(this);\n }\n\n private _handleVoiceState(oldState: VoiceState, newState: VoiceState) {\n const queue = this.nodes.get(oldState.guild.id);\n if (!queue || !queue.connection || !queue.channel) return;\n\n // dispatch voice state update\n const wasHandled = this.events.emit('voiceStateUpdate', queue, oldState, newState);\n // if the event was handled, return assuming the listener implemented all of the logic below\n if (wasHandled && !this.options.lockVoiceStateHandler) return;\n\n if (oldState.channelId && !newState.channelId && newState.member!.id === newState.guild.members.me!.id) {\n try {\n queue.delete();\n } catch {\n /* noop */\n }\n return void this.events.emit('disconnect', queue);\n }\n\n if (!oldState.channelId && newState.channelId && newState.member!.id === newState.guild.members.me!.id) {\n if (newState.serverMute != null && oldState.serverMute !== newState.serverMute) {\n queue.node.setPaused(newState.serverMute);\n } else if (newState.channel?.type === ChannelType.GuildStageVoice && newState.suppress != null && oldState.suppress !== newState.suppress) {\n queue.node.setPaused(newState.suppress);\n if (newState.suppress) {\n newState.guild.members.me!.voice.setRequestToSpeak(true).catch(Util.noop);\n }\n }\n }\n\n if (!newState.channelId && oldState.channelId === queue.channel.id) {\n if (!Util.isVoiceEmpty(queue.channel)) return;\n const timeout = setTimeout(() => {\n if (!Util.isVoiceEmpty(queue.channel!)) return;\n if (!this.nodes.has(queue.guild.id)) return;\n if (queue.options.leaveOnEmpty) queue.delete();\n this.events.emit('emptyChannel', queue);\n }, queue.options.leaveOnEmptyCooldown || 0).unref();\n queue.timeouts.set(`empty_${oldState.guild.id}`, timeout);\n }\n\n if (newState.channelId && newState.channelId === queue.channel.id) {\n const emptyTimeout = queue.timeouts.get(`empty_${oldState.guild.id}`);\n const channelEmpty = Util.isVoiceEmpty(queue.channel);\n if (!channelEmpty && emptyTimeout) {\n clearTimeout(emptyTimeout);\n queue.timeouts.delete(`empty_${oldState.guild.id}`);\n }\n }\n\n if (oldState.channelId && newState.channelId && oldState.channelId !== newState.channelId) {\n if (newState.member!.id === newState.guild.members.me!.id) {\n if (queue.connection && newState.member!.id === newState.guild.members.me!.id) queue.channel = newState.channel!;\n const emptyTimeout = queue.timeouts.get(`empty_${oldState.guild.id}`);\n const channelEmpty = Util.isVoiceEmpty(queue.channel);\n if (!channelEmpty && emptyTimeout) {\n clearTimeout(emptyTimeout);\n queue.timeouts.delete(`empty_${oldState.guild.id}`);\n } else {\n const timeout = setTimeout(() => {\n if (queue.connection && !Util.isVoiceEmpty(queue.channel!)) return;\n if (!this.nodes.has(queue.guild.id)) return;\n if (queue.options.leaveOnEmpty) queue.delete();\n this.events.emit('emptyChannel', queue);\n }, queue.options.leaveOnEmptyCooldown || 0).unref();\n queue.timeouts.set(`empty_${oldState.guild.id}`, timeout);\n }\n } else {\n if (newState.channelId !== queue.channel.id) {\n if (!Util.isVoiceEmpty(queue.channel)) return;\n if (queue.timeouts.has(`empty_${oldState.guild.id}`)) return;\n const timeout = setTimeout(() => {\n if (!Util.isVoiceEmpty(queue.channel!)) return;\n if (!this.nodes.has(queue.guild.id)) return;\n if (queue.options.leaveOnEmpty) queue.delete();\n this.events.emit('emptyChannel', queue);\n }, queue.options.leaveOnEmptyCooldown || 0).unref();\n queue.timeouts.set(`empty_${oldState.guild.id}`, timeout);\n } else {\n const emptyTimeout = queue.timeouts.get(`empty_${oldState.guild.id}`);\n const channelEmpty = Util.isVoiceEmpty(queue.channel!);\n if (!channelEmpty && emptyTimeout) {\n clearTimeout(emptyTimeout);\n queue.timeouts.delete(`empty_${oldState.guild.id}`);\n }\n }\n }\n }\n }\n\n /**\n * Handles voice state update\n * @param {VoiceState} oldState The old voice state\n * @param {VoiceState} newState The new voice state\n * @returns {void}\n */\n public handleVoiceState(oldState: VoiceState, newState: VoiceState): void {\n this._handleVoiceState(oldState, newState);\n }\n\n /**\n * Lock voice state handler\n */\n public lockVoiceStateHandler() {\n this.options.lockVoiceStateHandler = true;\n }\n\n /**\n * Unlock voice state handler\n */\n public unlockVoiceStateHandler() {\n this.options.lockVoiceStateHandler = false;\n }\n\n /**\n * Checks if voice state handler is locked\n */\n public isVoiceStateHandlerLocked() {\n return !!this.options.lockVoiceStateHandler;\n }\n\n /**\n * Initiate audio player\n * @param channel The voice channel on which the music should be played\n * @param query The track or source to play\n * @param options Options for player\n */\n public async play<T = unknown>(\n channel: GuildVoiceChannelResolvable,\n query: string | Track | SearchResult,\n options: SearchOptions & {\n nodeOptions?: GuildNodeCreateOptions<T>;\n connectionOptions?: VoiceConnectConfig;\n } = {}\n ) {\n const vc = this.client.channels.resolve(channel);\n if (!vc?.isVoiceBased()) throw new Error('Expected a voice channel');\n\n const result = query instanceof SearchResult ? query : await this.search(query, options);\n if (result.isEmpty()) {\n throw new Error(`No results found for \"${query}\" (Extractor: ${result.extractor?.identifier || 'N/A'})`);\n }\n\n const queue = this.nodes.create(vc.guild, options.nodeOptions);\n if (!queue.channel) await queue.connect(vc, options.connectionOptions);\n\n if (!result.hasPlaylist()) {\n await queue.node.play(result.tracks[0]);\n } else {\n queue.addTrack(result.playlist!);\n await queue.node.play();\n }\n\n return {\n track: result.tracks[0],\n extractor: result.extractor,\n searchResult: result,\n queue\n };\n }\n\n /**\n * @typedef {object} PlayerSearchResult\n * @property {Playlist} [playlist] The playlist (if any)\n * @property {Track[]} tracks The tracks\n */\n /**\n * Search tracks\n * @param {string|Track} query The search query\n * @param {SearchOptions} options The search options\n * @returns {Promise<SearchResult>}\n */\n public async search(query: string | Track, options: SearchOptions = {}): Promise<SearchResult> {\n if (options.requestedBy != null) options.requestedBy = this.client.users.resolve(options.requestedBy)!;\n options.blockExtractors ??= this.options.blockExtractors;\n if (query instanceof Track)\n return new SearchResult(this, {\n playlist: query.playlist || null,\n tracks: [query],\n query: query.toString(),\n extractor: null,\n queryType: query.queryType,\n requestedBy: options.requestedBy\n });\n\n let extractor: BaseExtractor | null = null;\n\n options.searchEngine ??= QueryType.AUTO;\n\n const queryType = options.searchEngine === QueryType.AUTO ? QueryResolver.resolve(query) : options.searchEngine;\n\n // force particular extractor\n if (options.searchEngine.startsWith('ext:')) {\n extractor = this.extractors.get(options.searchEngine.substring(4))!;\n if (!extractor) return new SearchResult(this, { query, queryType });\n }\n\n // query all extractors\n if (!extractor) {\n // cache validation\n if (!options.ignoreCache) {\n const res = await this.queryCache?.resolve({\n query,\n queryType,\n requestedBy: options.requestedBy\n });\n // cache hit\n if (res?.hasTracks()) return res;\n }\n\n // cache miss\n extractor =\n (\n await this.extractors.run(async (ext) => {\n if (options.blockExtractors?.includes(ext.identifier)) return false;\n return ext.validate(query, queryType as SearchQueryType);\n })\n )?.extractor || null;\n }\n\n // no extractors available\n if (!extractor) {\n return new SearchResult(this, { query, queryType });\n }\n\n const res = await extractor\n .handle(query, {\n type: queryType as SearchQueryType,\n requestedBy: options.requestedBy as User\n })\n .catch(() => null);\n\n if (res) {\n const result = new SearchResult(this, {\n query,\n queryType,\n playlist: res.playlist,\n tracks: res.tracks,\n extractor\n });\n\n if (!options.ignoreCache) {\n await this.queryCache?.addData(result);\n }\n\n return result;\n }\n\n const result = await this.extractors.run(\n async (ext) =>\n !options.blockExtractors?.includes(ext.identifier) &&\n (await ext.validate(query)) &&\n ext.handle(query, {\n type: queryType as SearchQueryType,\n requestedBy: options.requestedBy as User\n })\n );\n if (!result?.result) return new SearchResult(this, { query, queryType });\n\n const data = new SearchResult(this, {\n query,\n queryType,\n playlist: result.result.playlist,\n tracks: result.result.tracks,\n extractor: result.extractor\n });\n\n if (!options.ignoreCache) {\n await this.queryCache?.addData(data);\n }\n\n return data;\n }\n\n /**\n * Generates a report of the dependencies used by the `@discordjs/voice` module. Useful for debugging.\n * @returns {string}\n */\n public scanDeps() {\n const line = '-'.repeat(50);\n const depsReport = generateDependencyReport();\n const extractorReport = this.extractors.store\n .map((m) => {\n return m.identifier;\n })\n .join('\\n');\n return `${depsReport}\\nLoaded Extractors:\\n${extractorReport || 'None'}\\n${line}`;\n }\n\n public emit<U extends keyof PlayerEvents>(eventName: U, ...args: Parameters<PlayerEvents[U]>): boolean {\n if (this.requiredEvents.includes(eventName) && !super.eventNames().includes(eventName)) {\n // eslint-disable-next-line no-console\n console.error(...args);\n Util.warn(`Unhandled \"${eventName}\" event! Events ${this.requiredEvents.map((m) => `\"${m}\"`).join(', ')} must have event listeners!`, 'UnhandledEventWarning');\n return false;\n } else {\n return super.emit(eventName, ...args);\n }\n }\n\n public *[Symbol.iterator]() {\n yield* this.nodes.cache.values();\n }\n\n /**\n * Creates `Playlist` instance\n * @param data The data to initialize a playlist\n */\n public createPlaylist(data: PlaylistInitData) {\n return new Playlist(this, data);\n }\n}\n","import type { Player } from '../../Player';\n\nexport const instances = new Map<string, Player>();\n","import { Player } from '../../Player';\nimport { instances } from './_container';\n\nexport function addPlayer(player: Player) {\n if (instances.has(player.id)) return true;\n\n instances.set(player.id, player);\n\n return instances.has(player.id);\n}\n","import { Player } from '../../Player';\nimport { instances } from './_container';\n\nexport function clearPlayer(player: Player) {\n return instances.delete(player.id);\n}\n","import { instances } from './_container';\n\nexport function getPlayers() {\n return [...instances.values()];\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,WAAW,kBAAkB;;;ACEtC,IAAM,OAAO,wBAAC,MAAc,UAAU,iBAAzB;AAEb,IAAM,gBAAN,MAAmB;AAAA,EACR,cAAc;AACjB,WAAO;AAAA,EACX;AAAA,EAuCA,OAAc,IAA2B,MAAS;AAC9C,WAAO,KAAK,QAAQ;AAAA,EACxB;AAAA,EAEA,OAAc,IAA2B,MAAS;AAC9C,WAAO,QAAQ,KAAK;AAAA,EACxB;AAAA,EAEA,SAAgB,OAAO,YAAoE;AACvF,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,KAAK,OAAO,GAAG;AAC/C,YAAM,EAAE,MAAM,GAAkB,OAAO,EAAY;AAAA,IACvD;AAAA,EACJ;AAAA,EAEA,WAAkB,QAAQ;AACtB,WAAO,OAAO,KAAK,KAAK,OAAO;AAAA,EACnC;AAAA,EAGA,WAAkB,SAAS;AACvB,WAAO,KAAK,MAAM;AAAA,EACtB;AAAA,EAEA,OAAc,WAAW;AACrB,WAAO,KAAK,MAAM,IAAI,CAAC,MAAO,KAAa,EAAE,EAAE,KAAK,GAAG;AAAA,EAC3D;AAAA,EAOA,OAAc,OAA8B,SAAe;AACvD,QAAI,CAAC,WAAW,CAAC,MAAM,QAAQ,OAAO;AAAG,aAAO,KAAK,SAAS;AAC9D,WAAO,QACF,OAAO,CAAC,cAAc,OAAO,cAAc,QAAQ,EACnD,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,EACtB,KAAK,GAAG;AAAA,EACjB;AAAA,EAOA,OAAc,OAAO,YAAoB,OAAe;AACpD,SAAK,QAAQ,cAA6B;AAAA,EAC9C;AAAA,EAMA,OAAc,WAAW,cAAiD;AACtE,iBAAa,QAAQ,CAAC,QAAQ,KAAK,OAAO,IAAI,MAAM,IAAI,KAAK,CAAC;AAAA,EAClE;AACJ;AAlGA,IAAM,eAAN;AAAM;AAAA,aAKY,UAAuC;AAAA,EACjD,eAAe,KAAK,EAAE;AAAA,EACtB,WAAW,KAAK,EAAE;AAAA,EAClB,gBAAgB,KAAK,EAAE;AAAA,EACvB,MAAM;AAAA,EACN,WAAW;AAAA,EACX,WAAW;AAAA,EACX,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,UAAU;AAAA,EACV,UAAU;AAAA,EACV,SAAS;AAAA,EACT,SAAS;AAAA,EACT,MAAM;AAAA,EACN,MAAM;AAAA,EACN,UAAU;AAAA,EACV,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,aAAa;AAAA,EACb,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,SAAS;AACb;AA4DJ,IAAO,uBAAQ;;;ACjGR,IAAM,gBAAN,MAAoB;AAAA,EAUhB,YAAmB,SAAoC;AAApC;AAAA,EAAqC;AAAA,EAK/D,IAAW,aAAa;AACpB,WAAQ,KAAK,YAAqC;AAAA,EACtD;AAAA,EAKA,MAAa,WAAW;AAEpB;AAAA,EACJ;AAAA,EAKA,MAAa,aAAa;AAEtB;AAAA,EACJ;AAAA,EAMA,MAAa,SAAS,OAAe,MAAiD;AAElF,WAAO;AAAA,EACX;AAAA,EAMA,MAAa,OAAO,MAAyC;AAEzD,UAAM,IAAI,MAAM,iBAAiB;AAAA,EACrC;AAAA,EAMA,MAAa,OAAO,OAAe,SAAyD;AAExF,UAAM,IAAI,MAAM,iBAAiB;AAAA,EACrC;AAAA,EAOO,iBAAiB,QAAkB,MAAoB;AAC1D,WAAO,KAAK,MAAM,MAAM;AAAA,EAC5B;AAAA,EAOO,KAAmC,UAAa,MAAmC;AACtF,WAAO,KAAK,QAAQ,OAAO,KAAK,OAAO,GAAG,IAAI;AAAA,EAClD;AAAA,EAOO,eAAe,UAA4B,SAAkB,UAAU,UAAU,CAAC,GAAkB;AACvG,WAAO,EAAE,UAAU,YAAY,MAAM,OAAO;AAAA,EAChD;AACJ;AAxFa;AAAA,cAIK,aAAa;;;ACV/B,SAAS,kBAAkB;AAGpB,IAAM,4BAAN,MAAgC;AAAA,EAE5B,YAAmB,QAAgB;AAAhB;AAD1B,SAAO,QAAQ,IAAI,WAAkC;AAAA,EACV;AAAA,EAEpC,aAAa,YAAoB;AACpC,WAAO,KAAK,MAAM,IAAI,UAAU;AAAA,EACpC;AAAA,EAEA,IAAW,OAAO;AACd,WAAO,KAAK,MAAM;AAAA,EACtB;AAAA,EAEO,IAAI,YAAoB;AAC3B,WAAO,KAAK,MAAM,IAAI,UAAU;AAAA,EACpC;AAAA,EAEA,MAAa,SAAS,YAAkC;AACpD,QAAI,OAAO,WAAW,eAAe,YAAY,KAAK,MAAM,IAAI,WAAW,UAAU;AAAG;AACxF,UAAM,YAAY,IAAI,WAAW,IAAI;AAErC,QAAI;AACA,WAAK,MAAM,IAAI,WAAW,YAAY,SAAS;AAC/C,YAAM,UAAU,SAAS;AAAA,IAC7B,QAAE;AACE,WAAK,MAAM,OAAO,WAAW,UAAU;AAAA,IAC3C;AAAA,EACJ;AAAA,EAEA,MAAa,WAA6C,YAAe;AACrE,UAAM,YAAY,OAAO,eAAe,WAAW,KAAK,MAAM,IAAI,UAAU,IAAI,KAAK,MAAM,KAAK,CAAC,MAAM,MAAM,UAAU;AACvH,QAAI,CAAC;AAAW;AAEhB,QAAI;AACA,YAAM,MAAM,UAAU,cAAc,KAAK,MAAM,QAAQ,CAAC,MAAM,MAAM,SAAS;AAC7E,WAAK,MAAM,OAAO,GAAG;AACrB,YAAM,UAAU,WAAW;AAAA,IAC/B,QAAE;AAAA,IAEF;AAAA,EACJ;AAAA,EAEA,MAAa,gBAAgB;AACzB,QAAI;AACA,YAAM,QAAQ;AAAA,QACV,KAAK,MAAM,IAAI,CAAC,GAAG,MAAM;AACrB,eAAK,MAAM,OAAO,CAAC;AACnB,iBAAO,EAAE,WAAW;AAAA,QACxB,CAAC;AAAA,MACL;AAAA,IACJ,QAAE;AAAA,IAEF;AAAA,EACJ;AAAA,EAEA,MAAa,IAAiB,IAA6B,gBAAgB,MAAM;AAC7E,UAAM,UAAU,KAAK,OAAO,QAAQ,mBAAmB,CAAC;AACxD,eAAW,OAAO,KAAK,MAAM,OAAO,GAAG;AACnC,UAAI,iBAAiB,QAAQ,KAAK,CAAC,MAAM,MAAM,IAAI,UAAU;AAAG;AAChE,YAAM,SAAS,MAAM,GAAG,GAAG,EAAE,MAAM,MAAM;AACrC,eAAO;AAAA,MACX,CAAC;AACD,UAAI;AACA,eAAO;AAAA,UACH,WAAW;AAAA,UACX;AAAA,QACJ;AAAA,IACR;AAEA,WAAO;AAAA,EACX;AACJ;AAtEa;;;ACHb,SAAS,cAAAA,mBAAiC;;;ACA1C,SAAS,mBAAsF;AAC/F,SAAS,cAAAC,aAAY,SAAAC,cAA4B;;;ACFjD,SAAe,gBAAgB,qBAAqB;AAQ7C,IAAM,QAAN,MAAY;AAAA,EAoBf,YAAY,QAAgB,MAAoB;AAXhD,SAAO,cAA2B;AAElC,SAAO,YAAgD;AACvD,SAAgB,MAAoB,CAAC;AACrC,SAAgB,KAAK,cAAc,SAAS,EAAE,SAAS;AAcnD,WAAO,eAAe,MAAM,UAAU,EAAE,OAAO,QAAQ,YAAY,MAAM,CAAC;AA2E1E,SAAK,KAAK,OAAO,IAAI;AAAA,EACzB;AAAA,EAEQ,OAAO,MAAoB;AAC/B,SAAK,QAAQ,eAAe,KAAK,SAAS,EAAE;AAC5C,SAAK,SAAS,KAAK,UAAU;AAC7B,SAAK,MAAM,KAAK,OAAO;AACvB,SAAK,YAAY,KAAK,aAAa;AACnC,SAAK,WAAW,KAAK,YAAY;AACjC,SAAK,QAAQ,KAAK,SAAS;AAC3B,SAAK,YAAY,KAAK;AACtB,SAAK,cAAc,KAAK,eAAe;AACvC,SAAK,WAAW,KAAK;AAGrB,WAAO,eAAe,MAAM,OAAO,EAAE,OAAO,OAAO,OAAO,CAAC,GAAG,EAAE,QAAQ,KAAK,KAAK,UAAU,KAAK,OAAO,GAAG,KAAK,OAAO,IAAI,GAAG,YAAY,MAAM,CAAC;AAAA,EACrJ;AAAA,EAMA,IAAI,QAAoB;AACpB,WAAO,KAAK,OAAO,MAAM,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,KAAK,CAAC,OAAO,GAAG,OAAO,KAAK,EAAE,CAAC;AAAA,EACvF;AAAA,EAMA,IAAI,aAAqB;AACrB,UAAM,QAAQ,wBAAC,GAAW,MAAc;AACpC,UAAI,KAAK;AACT,eAAS,IAAI,GAAG,IAAI,GAAG;AAAK,cAAM;AAClC,aAAO,KAAK,IAAI,MAAO,KAAK;AAAA,IAChC,GAJc;AAMd,WAAO,KAAK,SACP,MAAM,GAAG,EACT,QAAQ,EACR,IAAI,CAAC,GAAG,MAAM,SAAS,CAAC,IAAI,MAAM,IAAI,CAAC,CAAC,EACxC,OAAO,CAAC,GAAG,MAAM,IAAI,GAAG,CAAC;AAAA,EAClC;AAAA,EAMA,IAAI,SAAS;AACT,WAAO,KAAK,IAAI,UAAU;AAAA,EAC9B;AAAA,EAMA,WAAmB;AACf,WAAO,GAAG,KAAK,YAAY,KAAK;AAAA,EACpC;AAAA,EAMA,OAAO,cAAwB;AAC3B,WAAO;AAAA,MACH,IAAI,KAAK;AAAA,MACT,OAAO,KAAK;AAAA,MACZ,aAAa,KAAK;AAAA,MAClB,QAAQ,KAAK;AAAA,MACb,KAAK,KAAK;AAAA,MACV,WAAW,KAAK;AAAA,MAChB,UAAU,KAAK;AAAA,MACf,YAAY,KAAK;AAAA,MACjB,OAAO,KAAK;AAAA,MACZ,aAAa,KAAK,aAAa,MAAM;AAAA,MACrC,UAAU,eAAe,OAAO,KAAK,UAAU,OAAO,KAAK;AAAA,IAC/D;AAAA,EACJ;AACJ;AArLa;;;ADFb,SAAwB,cAAAC,mBAAkB;;;AEJ1C,SAAS,cAAAC,mBAAkB;AAE3B,IAAM,OAAN,MAAW;AAAA,EAIC,cAAc;AAAA,EAAC;AAAA,EAOvB,OAAO,eAAe,QAAgC;AAClD,WAAO,OAAO,OAAO,MAAM,EACtB,IAAI,CAAC,MAAO,MAAM,CAAC,IAAI,IAAI,CAAE,EAC7B,KAAK,GAAG;AAAA,EACjB;AAAA,EAOA,OAAO,QAAQ,cAAsB;AACjC,QAAI,MAAM,YAAY;AAAG,qBAAe;AACxC,UAAM,QAAQ,eAAe,IAAI,KAAK,QAAQ,KAAK;AAEnD,WAAO;AAAA,MACH,MAAM,MAAM,eAAe,KAAQ;AAAA,MACnC,OAAO,MAAM,eAAe,IAAO,IAAI;AAAA,MACvC,SAAS,MAAM,eAAe,GAAK,IAAI;AAAA,MACvC,SAAS,MAAM,eAAe,GAAI,IAAI;AAAA,IAC1C;AAAA,EACJ;AAAA,EAOA,OAAO,cAAc,UAAoB;AACrC,UAAM,QAAQ,OAAO,KAAK,QAAQ;AAClC,UAAM,WAAW,CAAC,QAAQ,SAAS,WAAW,SAAS;AAEvD,UAAM,SAAS,MAAM,OAAO,CAAC,MAAM,SAAS,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,SAAS,EAAoB;AACjG,UAAM,QAAQ,OACT,MAAM,OAAO,UAAU,CAAC,MAAM,MAAM,CAAC,CAAC,EACtC,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,GAAG,CAAC,EACxC,KAAK,GAAG;AAEb,WAAO,MAAM,UAAU,IAAI,KAAK,MAAM,SAAS,GAAG,GAAG,KAAK,MAAM;AAAA,EACpE;AAAA,EAQA,OAAO,KAAc,KAAa;AAC9B,QAAI,CAAC,MAAM,QAAQ,GAAG;AAAG,aAAO;AAChC,WAAO,IAAI,IAAI,SAAS;AAAA,EAC5B;AAAA,EAOA,OAAO,aAAa,SAAsC;AACtD,WAAO,WAAW,QAAQ,QAAQ,OAAO,CAAC,WAAW,CAAC,OAAO,KAAK,GAAG,EAAE,SAAS;AAAA,EACpF;AAAA,EAOA,OAAO,QAAQ,IAAY;AACvB,QAAI;AACA,aAAO,UAAQ;AAAA,IACnB,QAAE;AACE,aAAO;AAAA,IACX;AAAA,EACJ;AAAA,EAOA,OAAO,KAAK,MAAc;AACtB,WAAOC,YAAW,MAAM,QAAW,EAAE,KAAK,MAAM,CAAC;AAAA,EACrD;AAAA,EAEA,OAAO,OAAO;AAAA,EAAC;AAAA,EAEf,aAAa,WAAW;AACpB,QAAI,WAAW;AAAY,aAAO,WAAW;AAC7C,eAAW,OAAO,CAAC,cAAc,QAAQ,GAAG;AACxC,UAAI;AACA,eAAO,MAAM,OAAO,KAAK,KAAK,CAAC,QAAQ,IAAI,SAAS,IAAI,SAAS,SAAS,IAAI,OAAO;AAAA,MACzF,QAAE;AACE,YAAI;AAEA,gBAAM,MAAM,UAAQ;AACpB,cAAI;AAAK,mBAAO,IAAI,SAAS,IAAI,SAAS,SAAS,IAAI;AAAA,QAC3D,QAAE;AAAA,QAEF;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,OAAO,KAAK,SAAiB,OAAO,sBAAsB,QAAiB;AACvE,YAAQ,YAAY,SAAS;AAAA,MACzB;AAAA,MACA;AAAA,IACJ,CAAC;AAAA,EACL;AACJ;AAvHM;;;ACAC,IAAM,WAAN,MAAe;AAAA,EAqBlB,YAAY,QAAgB,MAAwB;AAOhD,SAAK,SAAS;AAOd,SAAK,SAAS,KAAK,UAAU,CAAC;AAO9B,SAAK,SAAS,KAAK;AAOnB,SAAK,cAAc,KAAK;AAOxB,SAAK,YAAY,KAAK;AAStB,SAAK,OAAO,KAAK;AAWjB,SAAK,SAAS,KAAK;AAOnB,SAAK,KAAK,KAAK;AAOf,SAAK,MAAM,KAAK;AAMhB,SAAK,QAAQ,KAAK;AAAA,EAOtB;AAAA,EAEA,EAAE,OAAO,YAAY;AACjB,WAAO,KAAK;AAAA,EAChB;AAAA,EAOA,OAAO,aAAa,MAAM;AACtB,UAAM,UAAU;AAAA,MACZ,IAAI,KAAK;AAAA,MACT,KAAK,KAAK;AAAA,MACV,OAAO,KAAK;AAAA,MACZ,aAAa,KAAK;AAAA,MAClB,WAAW,KAAK;AAAA,MAChB,MAAM,KAAK;AAAA,MACX,QAAQ,KAAK;AAAA,MACb,QAAQ,KAAK;AAAA,MACb,QAAQ,CAAC;AAAA,IACb;AAEA,QAAI;AAAY,cAAQ,SAAS,KAAK,OAAO,IAAI,CAAC,MAAM,EAAE,OAAO,IAAI,CAAC;AAEtE,WAAO;AAAA,EACX;AACJ;AAnIa;;;ACJb,SAAS,aAAa;AAIf,IAAM,oBAAN,MAAwC;AAAA,EAEpC,YAAmB,OAAyB;AAAzB;AAD1B,SAAO,SAAS,IAAI,MAAa,MAAM;AAAA,EACa;AAAA,EAKpD,IAAW,eAAe;AAEtB,WAAO,KAAK,MAAM,YAAY,eAAe,YAAc,KAAK,MAAc;AAAA,EAClF;AAAA,EAKA,IAAW,YAAY;AACnB,WAAO,KAAK,MAAM,OAAO,GAAG,CAAC,KAAK;AAAA,EACtC;AAAA,EAKA,IAAW,gBAAgB;AACvB,WAAO,KAAK,OAAO,GAAG,CAAC,KAAK;AAAA,EAChC;AAAA,EAKA,IAAW,WAAW;AAClB,WAAO,KAAK,MAAM,QAAQ;AAAA,EAC9B;AAAA,EAKO,UAAU;AACb,WAAO,KAAK,OAAO,OAAO;AAAA,EAC9B;AAAA,EAMO,KAAK,OAAwB;AAChC,QAAI,KAAK;AAAU,aAAO;AAC1B,SAAK,OAAO,IAAI,KAAK;AACrB,WAAO;AAAA,EACX;AAAA,EAKO,QAAQ;AACX,SAAK,OAAO,MAAM;AAAA,EACtB;AAAA,EAKO,OAAO;AACV,UAAM,QAAQ,KAAK;AACnB,QAAI,CAAC,OAAO;AACR,YAAM,IAAI,MAAM,4BAA4B;AAAA,IAChD;AAEA,SAAK,MAAM,KAAK,KAAK;AAAA,EACzB;AAAA,EAKO,WAAW;AACd,UAAM,QAAQ,KAAK;AACnB,QAAI,CAAC,OAAO;AACR,YAAM,IAAI,MAAM,gCAAgC;AAAA,IACpD;AAEA,SAAK,MAAM,KAAK,KAAK,OAAO,EAAE,OAAO,KAAK,CAAC;AAC3C,SAAK,MAAM,KAAK,KAAK;AAAA,EACzB;AACJ;AAjFa;;;ACJb,SAAwB,kBAAkB;;;ACA1C,SAAS,eAAe;;;ACyJjB,IAAM,YAAY;AAAA,EACrB,MAAM;AAAA,EACN,SAAS;AAAA,EACT,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,qBAAqB;AAAA,EACrB,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,eAAe;AAAA,EACf,kBAAkB;AAAA,EAClB,UAAU;AAAA,EACV,OAAO;AAAA,EACP,WAAW;AAAA,EACX,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,mBAAmB;AAAA,EACnB,kBAAkB;AAAA,EAClB,mBAAmB;AAAA,EACnB,sBAAsB;AAAA,EACtB,MAAM;AACV;AAmDO,IAAK,kBAAL,kBAAKC,qBAAL;AACH,EAAAA,kCAAA,SAAM,KAAN;AACA,EAAAA,kCAAA,WAAQ,KAAR;AACA,EAAAA,kCAAA,WAAQ,KAAR;AACA,EAAAA,kCAAA,cAAW,KAAX;AAJQ,SAAAA;AAAA,GAAA;;;AD7NZ,SAAS,eAAe,6BAA6B;AAGrD,IAAM,mBAAmB;AACzB,IAAM,uBAAuB;AAC7B,IAAM,oBAAoB;AAC1B,IAAM,aAAa;AACnB,IAAM,oBAAoB;AAC1B,IAAM,kBAAkB;AACxB,IAAM,sBAAsB;AAC5B,IAAM,0BAA0B;AAChC,IAAM,uBAAuB;AAG7B,IAAM,gBAAN,MAAoB;AAAA,EAIR,cAAc;AAAA,EAAC;AAAA,EAEvB,WAAW,QAAQ;AACf,WAAO;AAAA,MACH;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACJ;AAAA,EACJ;AAAA,EAOA,OAAO,QAAQ,OAA2D;AACtE,YAAQ,MAAM,KAAK;AACnB,QAAI,sBAAsB,OAAO,OAAO;AAAG,aAAO,UAAU;AAC5D,QAAI,sBAAsB,OAAO,UAAU,KAAK,MAAM,SAAS,QAAQ;AAAG,aAAO,UAAU;AAC3F,QAAI,QAAQ,WAAW,KAAK;AAAG,aAAO,UAAU;AAChD,QAAI,cAAc,WAAW,KAAK,KAAK,cAAc,YAAY,KAAK;AAAG,aAAO,UAAU;AAC1F,QAAI,iBAAiB,KAAK,KAAK;AAAG,aAAO,UAAU;AACnD,QAAI,qBAAqB,KAAK,KAAK;AAAG,aAAO,UAAU;AACvD,QAAI,kBAAkB,KAAK,KAAK;AAAG,aAAO,UAAU;AACpD,QAAI,WAAW,KAAK,KAAK;AAAG,aAAO,UAAU;AAC7C,QAAI,kBAAkB,KAAK,KAAK;AAAG,aAAO,UAAU;AACpD,QAAI,qBAAqB,KAAK,KAAK;AAAG,aAAO,UAAU;AACvD,QAAI,wBAAwB,KAAK,KAAK;AAAG,aAAO,UAAU;AAC1D,QAAI,oBAAoB,KAAK,KAAK;AAAG,aAAO,UAAU;AACtD,QAAI,gBAAgB,KAAK,KAAK;AAAG,aAAO,UAAU;AAElD,WAAO,UAAU;AAAA,EACrB;AAAA,EAOA,OAAO,WAAW,OAA0C;AACxD,WAAO,cAAc,QAAQ,KAAK,MAAM,UAAU,QAC5C,MACK,MAAM,GAAG,EACT,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EACjB,IAAI,IACT;AAAA,EACV;AAAA,EAEA,OAAO,WAAW,GAAW;AACzB,WAAO,QAAQ,MAAM,SAAS,KAAK,CAAC;AAAA,EACxC;AAAA,EAEA,OAAO,YAAY,GAAW;AAC1B,WAAO,QAAQ,MAAM,UAAU,KAAK,CAAC;AAAA,EACzC;AACJ;AAjEM;;;ADXN,SAAS,cAAc,eAAe;AAE/B,IAAM,qBAAqB;AATlC;AA6BO,IAAM,uBAAN,MAA2C;AAAA,EAEvC,YAAmB,OAAyB;AAAzB;AAka1B,uBAAM;AAMN,uBAAM;AAmBN;AA5bA,kCAAY;AAAA,EACwC;AAAA,EAK7C,SAAS;AACZ,WAAO,CAAC,CAAC,KAAK,MAAM,YAAY,OAAO;AAAA,EAC3C;AAAA,EAKO,cAAc;AACjB,WAAO,CAAC,CAAC,KAAK,MAAM,YAAY,YAAY;AAAA,EAChD;AAAA,EAKO,YAAY;AACf,WAAO,CAAC,CAAC,KAAK,MAAM,YAAY,UAAU;AAAA,EAC9C;AAAA,EAKO,WAAW;AACd,WAAO,CAAC,CAAC,KAAK,MAAM,YAAY,SAAS;AAAA,EAC7C;AAAA,EAKO,gBAAgB;AACnB,uBAAK,WAAY;AAAA,EACrB;AAAA,EAKA,IAAW,aAAa;AACpB,WAAO,KAAK,MAAM,YAAY,cAAc;AAAA,EAChD;AAAA,EAKA,IAAW,eAAe;AACtB,UAAM,MAAM,mBAAK,aAAY,KAAK;AAElC,WAAO;AAAA,EACX;AAAA,EAKO,wBAAwB;AAC3B,UAAM,eAAe,KAAK,MAAM,QAAQ,OAAO,QAAQ,EAAE,OAAO,CAAC,OAAO,mBAAmB,KAAK,EAAE,CAAC;AACnG,UAAM,cAAc,aACf,IAAI,CAAC,MAAM;AACR,aAAO,WAAW,mBAAmB,KAAK,CAAC,IAAI,EAAY;AAAA,IAC/D,CAAC,EACA,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAE5B,WAAO,CAAC,YAAY,SAAS,IAAI,YAAY,OAAO,CAAC,aAAa,YAAY,UAAU,WAAW;AAAA,EACvG;AAAA,EAKA,IAAW,wBAAwB;AAC/B,UAAM,MAAM,KAAK;AACjB,WAAO,KAAK,MAAM,KAAK,sBAAsB,IAAI,GAAG;AAAA,EACxD;AAAA,EAKA,IAAW,oBAAoB;AAC3B,UAAM,MAAM,KAAK,MAAM,cAAc,cAAc;AAEnD,WAAO,KAAK,MAAM,MAAM,KAAK,sBAAsB,CAAC;AAAA,EACxD;AAAA,EAMO,aAAa,gBAAgB,OAA+B;AAC/D,QAAI,CAAC,KAAK,MAAM;AAAc,aAAO;AAErC,UAAM,UAAU,gBAAgB,KAAK,eAAe,KAAK;AACzD,UAAM,QAAQ,gBAAgB,KAAK,MAAM,aAAa,aAAa,KAAK;AAExE,WAAO;AAAA,MACH,SAAS;AAAA,QACL,OAAO,KAAK,cAAc,KAAK,QAAQ,OAAO,CAAC;AAAA,QAC/C,OAAO;AAAA,MACX;AAAA,MACA,OAAO;AAAA,QACH,OAAO,KAAK,cAAc,KAAK,QAAQ,KAAK,CAAC;AAAA,QAC7C,OAAO;AAAA,MACX;AAAA,MACA,UAAU,KAAK,MAAO,UAAU,QAAS,GAAG;AAAA,IAChD;AAAA,EACJ;AAAA,EAMO,kBAAkB,SAAoC;AACzD,UAAM,YAAY,KAAK,aAAa;AACpC,QAAI,CAAC;AAAW,aAAO;AAEvB,UAAM,EAAE,YAAY,aAAM,SAAS,IAAI,OAAO,UAAK,YAAY,KAAK,IAAI,WAAW,CAAC;AAEpF,QAAI,MAAM,MAAM,KAAK,SAAS,KAAK,CAAC,OAAO,SAAS,MAAM;AAAG,YAAM,IAAI,MAAM,4BAA4B;AACzG,UAAM,QAAQ,KAAK,MAAO,UAAU,QAAQ,QAAQ,UAAU,MAAM,QAAS,MAAM;AAEnF,QAAI,SAAS,KAAK,SAAS,QAAQ;AAC/B,YAAM,MAAM,KAAK,OAAO,SAAS,CAAC,EAAE,MAAM,EAAE;AAC5C,UAAI,OAAO,OAAO,GAAG,SAAS;AAC9B,UAAI,WAAW;AACX,eAAO,GAAG,UAAU,QAAQ,gBAAW,IAAI,KAAK,EAAE,YAAO,UAAU,MAAM;AAAA,MAC7E,OAAO;AACH,eAAO,GAAG,IAAI,KAAK,EAAE;AAAA,MACzB;AAAA,IACJ,OAAO;AACH,UAAI,WAAW;AACX,eAAO,GAAG,UAAU,QAAQ,gBAAW,YAAY,KAAK,OAAO,SAAS,CAAC,YAAO,UAAU,MAAM;AAAA,MACpG,OAAO;AACH,eAAO,GAAG,YAAY,KAAK,OAAO,SAAS,CAAC;AAAA,MAChD;AAAA,IACJ;AAAA,EACJ;AAAA,EAMA,MAAa,KAAK,UAAkB;AAChC,QAAI,CAAC,KAAK,MAAM;AAAc,aAAO;AACrC,UAAM,KAAK,KAAK,KAAK,MAAM,cAAc;AAAA,MACrC,MAAM;AAAA,MACN,gBAAgB;AAAA,IACpB,CAAC;AACD,WAAO;AAAA,EACX;AAAA,EAKA,IAAW,SAAS;AAChB,WAAO,KAAK,MAAM,YAAY,UAAU;AAAA,EAC5C;AAAA,EAMO,UAAU,KAAa;AAC1B,QAAI,CAAC,KAAK,MAAM;AAAY,aAAO;AACnC,UAAM,MAAM,KAAK,MAAM,WAAW,UAAU,GAAG;AAC/C,QAAI;AAAK,WAAK,MAAM,QAAQ,kBAAkB,SAAS;AACvD,WAAO;AAAA,EACX;AAAA,EAMO,WAAW,MAAuB;AACrC,SAAK,MAAM,YAAY,eAAe,SAAS,WAAW,SAAS,SAAS,KAAK,MAAM,SAAS,WAAW,OAAQ,IAAI;AAAA,EAC3H;AAAA,EAMO,UAAU,OAAgB;AAC7B,QAAI;AAAO,aAAO,KAAK,MAAM,YAAY,MAAM,IAAI,KAAK;AACxD,WAAO,KAAK,MAAM,YAAY,OAAO,KAAK;AAAA,EAC9C;AAAA,EAKO,QAAQ;AACX,WAAO,KAAK,UAAU,IAAI;AAAA,EAC9B;AAAA,EAKO,SAAS;AACZ,WAAO,KAAK,UAAU,KAAK;AAAA,EAC/B;AAAA,EAKO,OAAO;AACV,QAAI,CAAC,KAAK,MAAM;AAAY,aAAO;AACnC,SAAK,MAAM,iBAAiB,KAAK;AACjC,SAAK,MAAM,WAAW,IAAI;AAC1B,WAAO;AAAA,EACX;AAAA,EAMO,OAAO,OAAwB;AAClC,UAAM,aAAa,KAAK,MAAM,OAAO,KAAK,CAAC,GAAG,QAAQ;AAClD,UAAI,iBAAiB,SAAS,OAAO,UAAU,UAAU;AACrD,gBAAQ,OAAO,UAAU,WAAW,QAAQ,MAAM,QAAQ,EAAE;AAAA,MAChE;AACA,UAAI,OAAO,UAAU;AAAU,eAAO,UAAU,EAAE;AAClD,aAAO,QAAQ;AAAA,IACnB,CAAC;AACD,QAAI,CAAC;AAAY,aAAO;AAExB,SAAK,MAAM,OAAO,UAAU,CAAC,MAAM,EAAE,OAAO,WAAW,EAAE;AAEzD,WAAO;AAAA,EACX;AAAA,EAMO,KAAK,OAAwB;AAChC,UAAM,UAAU,KAAK,OAAO,KAAK;AACjC,QAAI,CAAC;AAAS,aAAO;AACrB,SAAK,MAAM,OAAO,MAAM,QAAQ,OAAO;AACvC,WAAO,KAAK,KAAK;AAAA,EACrB;AAAA,EAMO,iBAAiB,OAAwB;AAC5C,WAAO,KAAK,MAAM,OAAO,QAAQ,EAAE,UAAU,CAAC,GAAG,QAAQ;AACrD,UAAI,iBAAiB,SAAS,OAAO,UAAU,UAAU;AACrD,gBAAQ,OAAO,UAAU,WAAW,QAAQ,MAAM,QAAQ,EAAE;AAAA,MAChE;AACA,UAAI,OAAO,UAAU;AAAU,eAAO,UAAU,EAAE;AAClD,aAAO,QAAQ;AAAA,IACnB,CAAC;AAAA,EACL;AAAA,EAMO,OAAO,OAAwB;AAClC,UAAM,MAAM,KAAK,iBAAiB,KAAK;AACvC,QAAI,MAAM;AAAG,aAAO;AACpB,UAAM,UAAU,KAAK,OAAO,GAAG;AAC/B,QAAI,CAAC;AAAS,aAAO;AACrB,SAAK,MAAM,OAAO,MAAM,OAAO,GAAG,KAAK,OAAO;AAC9C,WAAO,KAAK,KAAK;AAAA,EACrB;AAAA,EAOO,OAAO,OAAc,QAAQ,GAAG;AACnC,QAAI,EAAE,iBAAiB;AAAQ,YAAM,IAAI,MAAM,eAAe;AAC9D,SAAK,MAAM,OAAO,MAAM,OAAO,OAAO,GAAG,KAAK;AAAA,EAClD;AAAA,EAMO,KAAK,QAAQ,OAAO;AACvB,QAAI,CAAC,KAAK,MAAM;AAAY,aAAO;AACnC,SAAK,MAAM,WAAW,IAAI;AAC1B,QAAI,OAAO;AACP,WAAK,MAAM,WAAW,WAAW;AACjC,aAAO;AAAA,IACX;AACA,QAAI,KAAK,MAAM,QAAQ,aAAa;AAChC,YAAM,KAAqB,WAAW,MAAM;AACxC,YAAI,KAAK,UAAU,KAAK,KAAK,MAAM,OAAO;AAAM,iBAAO,aAAa,EAAE;AACtE,aAAK,MAAM,YAAY,WAAW;AAAA,MACtC,GAAG,KAAK,MAAM,QAAQ,mBAAmB,EAAE,MAAM;AAAA,IACrD;AACA,WAAO;AAAA,EACX;AAAA,EAOA,MAAa,KAAK,KAAa,SAA+B;AAC1D,QAAI,CAAC,KAAK,MAAM,YAAY,iBAAiB;AACzC,YAAM,IAAI,MAAM,+BAA+B;AAAA,IACnD;AAEA,SAAK,MAAM,MAAM,oCAAoC,KAAK,MAAM,MAAM,aAAa,KAAK,MAAM,MAAM,KAAK;AAEzG,cAAU,OAAO;AAAA,MACb,CAAC;AAAA,MACD;AAAA,QACI,OAAO,KAAK,MAAM,gBAAgB;AAAA,QAClC,gBAAgB;AAAA,QAChB,MAAM;AAAA,MACV;AAAA,MACA;AAAA,IACJ;AAEA,QAAI,OAAO,QAAQ,OAAO;AACtB,WAAK,MAAM,MAAM,0FAA0F;AAC3G,aAAO,KAAK,MAAM,OAAO,IAAI,GAAG;AAAA,IACpC;AAEA,UAAM,QAAQ,OAAO,KAAK,MAAM,OAAO,SAAS;AAChD,QAAI,CAAC,OAAO;AACR,YAAM,IAAI,MAAM,kDAAkD;AAAA,IACtE;AAEA,SAAK,MAAM,MAAM,8DAA8D;AAC/E,SAAK,MAAM,eAAe;AAE1B,QAAI;AACA,WAAK,MAAM,MAAM,yCAAyC;AAC1D,YAAM,KAAsB,MAAM,cAAc,MAAM,IAAI,WAAW,YAAY,gBAAgB,MAAM,IAAI,WAAW,gBAAgB,mBAAmB,MAAM,IAAI,WAAW;AAC9K,WAAK,MAAM,MAAM,mDAAmD,QAAQ;AAC5E,UAAI,SAAS,MAAM,KAAK,MAAM,uBAAuB,OAAO,IAAI,KAAK,KAAK,EAAE,MAAM,MAAM,IAAI;AAE5F,UAAI,CAAC,QAAQ;AACT,aAAK,MAAM,MAAM,iDAAiD;AAClE,iBAAU,MAAM,sBAAK,8CAAL,WAA0B,OAAO,MAAM,MAAM,IAAI;AAAA,MACrE;AAEA,UAAI,CAAC,QAAQ;AACT,cAAM,QAAQ,IAAI,MAAM,yCAAyC;AACjE,aAAK,MAAM,eAAe;AAC1B,YAAI,KAAK,MAAM,QAAQ,gBAAgB;AACnC,eAAK,MAAM,OAAO,OAAO,KAAK,cAAc,KAAK,OAAO,KAAK;AAC7D,eAAK,MAAM,OAAO,OAAO,KAAK,eAAe,KAAK,OAAO,OAAO,KAAK;AACrE,eAAK,KAAK,KAAK,MAAM,OAAO,SAAS,CAAC;AACtC;AAAA,QACJ;AAEA,cAAM;AAAA,MACV;AAEA,UAAI,OAAO,QAAQ,SAAS,YAAY,QAAQ,QAAQ,GAAG;AACvD,2BAAK,WAAY,QAAQ;AAAA,MAC7B,OAAO;AACH,2BAAK,WAAY;AAAA,MACrB;AAGA,YAAM,UAAU,MAAM,WAAW,YAAkB,KAAK,MAAM,OAAO,QAAQ,aAAa,gBAAiB,SAAS,SAAS;AAC7H,YAAM,YAAY,sBAAK,4CAAL,WAAyB,QAAQ,OAAO,QAAQ,QAAQ,GAAG;AAE7E,UAAI,QAAQ,gBAAgB;AACxB,aAAK,MAAM,MAAM,wFAAwF,KAAK,MAAM,QAAQ,qBAAqB;AACjJ,cAAM,QAAQ,KAAK,MAAM,QAAQ,gBAAgB;AACjD,aAAK,MAAM,MAAM,gCAAgC;AAAA,MACrD;AAEA,WAAK,MAAM;AAAA,QACP,kCAAkC,KAAK;AAAA,UACnC;AAAA,YACI,eAAe,KAAK,MAAM,QAAQ,WAAW;AAAA,YAC7C,kBAAkB,KAAK,MAAM,QAAQ,cAAc;AAAA,YACnD,eAAe,KAAK,MAAM,QAAQ,WAAW;AAAA,YAC7C,gBAAgB,KAAK,MAAM,QAAQ,aAAa;AAAA,YAChD,kBAAkB,KAAK,MAAM,QAAQ,cAAc;AAAA,YACnD,YAAY,OAAO,KAAK,MAAM,QAAQ,cAAc,YAAY,KAAK,MAAM,QAAQ,YAAY,IAAI,KAAK,MAAM,QAAQ,YAAY;AAAA,YAClI,cAAc,KAAK,MAAM,QAAQ,kBAAkB,UAAU;AAAA,YAC7D,IAAI,KAAK,MAAM,QAAQ,kBAAkB;AAAA,YACzC,gBAAgB,KAAK,MAAM,QAAQ,kBAAkB;AAAA,YACrD,QAAQ,KAAK,MAAM,QAAQ,kBAAkB;AAAA,YAC7C,gBAAgB,CAAC,CAAC,QAAQ;AAAA,YAC1B,eAAe,KAAK,MAAM,QAAQ,OAAO,SAAS;AAAA,YAClD,MAAM,QAAQ;AAAA,UAClB;AAAA,UACA;AAAA,UACA;AAAA,QACJ;AAAA,MACJ;AAEA,YAAM,WAAW,MAAM,KAAK,MAAM,WAAW,aAAa,WAAW;AAAA,QACjE,eAAe,KAAK,MAAM,QAAQ,WAAW;AAAA,QAC7C,kBAAkB,KAAK,MAAM,QAAQ,cAAc;AAAA,QACnD,eAAe,KAAK,MAAM,QAAQ,WAAW;AAAA,QAC7C,gBAAgB,KAAK,MAAM,QAAQ,aAAa;AAAA,QAChD,kBAAkB,KAAK,MAAM,QAAQ,cAAc;AAAA,QACnD,YAAY,OAAO,KAAK,MAAM,QAAQ,cAAc,YAAY,KAAK,MAAM,QAAQ,YAAY,IAAI,KAAK,MAAM,QAAQ,YAAY;AAAA,QAClI,cAAc,KAAK,MAAM,QAAQ,kBAAkB,UAAU;AAAA,QAC7D,IAAI,KAAK,MAAM,QAAQ,kBAAkB;AAAA,QACzC,gBAAgB,KAAK,MAAM,QAAQ,kBAAkB;AAAA,QACrD,QAAQ,KAAK,MAAM,QAAQ,kBAAkB;AAAA,QAC7C,MAAM;AAAA,QACN,MAAM,WAAW;AAAA,MACrB,CAAC;AAED,WAAK,MAAM,iBAAiB,CAAC,CAAC,QAAQ,cAAc;AAEpD,YAAM,sBAAK,8BAAL,WAAkB;AAAA,IAC5B,SAAS,GAAP;AACE,WAAK,MAAM,MAAM,sCAAsC,GAAG;AAC1D,WAAK,MAAM,eAAe;AAC1B,YAAM;AAAA,IACV;AAAA,EACJ;AA+CJ;AAjda;AACT;AAmaM;AAAA,iBAAY,sCAAC,UAAgC;AAC/C,OAAK,MAAM,MAAM,8BAA8B;AAC/C,QAAM,KAAK,MAAM,WAAY,WAAW,QAAQ;AAChD,OAAK,MAAM,MAAM,sBAAsB;AAC3C,GAJkB;AAMZ;AAAA,yBAAoB,sCAAC,OAAc;AACrC,OAAK,MAAM,MAAM,mDAAmD,MAAM,eAAe,MAAM,mCAAmC;AAClI,QAAM,aAAa,MAAM,KAAK,MAAM,OAAO,WAAW,IAAI,OAAO,cAAc;AAC3E,QAAI,KAAK,MAAM,OAAO,QAAQ,iBAAiB,KAAK,CAAC,QAAQ,QAAQ,UAAU,UAAU;AAAG,aAAO;AACnG,UAAM,YAAY,MAAM,UAAU,SAAS,MAAM,KAAK,MAAM,aAAa,cAAc,QAAQ,MAAM,GAAG,CAAC;AACzG,QAAI,CAAC;AAAW,aAAO;AACvB,WAAO,MAAM,UAAU,OAAO,KAAK;AAAA,EACvC,GAAG,KAAK;AACR,MAAI,CAAC,cAAc,CAAC,WAAW,QAAQ;AACnC,SAAK,MAAM,MAAM,+CAA+C,MAAM,eAAe,MAAM,mCAAmC;AAC9H,WAAO;AAAA,EACX;AAEA,OAAK,MAAM,MAAM,uDAAuD,MAAM,eAAe,MAAM,qBAAqB,WAAW,UAAU,aAAa;AAE1J,QAAM,SAAS,WAAW;AAC1B,SAAO;AACX,GAjB0B;AAmB1B;AAAA,wBAAmB,gCAAC,QAA2B,OAAc,OAAO,GAAG,SAAkB;AACrF,QAAM,eAAe,KAAK,MAAM,QAAQ,OACnC,aAAa,QAAQ;AAAA,IAClB,aAAa,KAAK,MAAM,QAAQ,OAAO,QAAQ,SAAS,CAAC,OAAO,KAAK,MAAM,QAAQ,OAAO,SAAS,CAAC,IAAI,CAAC;AAAA,IACzG,MAAM,OAAO;AAAA,IACb,KAAK;AAAA,IACL;AAAA,EACJ,CAAC,EACA,GAAG,SAAS,CAAC,QAAQ;AAClB,UAAM,IAAI,GAAG,MAAM,YAAY;AAE/B,SAAK,MAAM,MAAM,qDAAqD,IAAI,SAAS,IAAI,WAAW,KAAK;AAEvG,QAAI,EAAE,SAAS,iBAAiB,KAAK,EAAE,SAAS,OAAO;AAAG;AAE1D,SAAK,MAAM,OAAO,OAAO,KAAK,eAAe,KAAK,OAAO,KAAK,KAAK;AAAA,EACvE,CAAC;AAEL,SAAO;AACX,GAnBmB;;;AGtdvB,SAAwB,iBAA4C;;;ACJpE,SAAS,cAAc;AAWhB,SAAS,mBAAmB,QAAgB,KAAc,SAAkB;AAE/E,QAAM,OAAO;AAAA,IACT;AAAA,IAAc;AAAA,IACd;AAAA,IAAuB;AAAA,IACvB;AAAA,IAAwB;AAAA,IACxB;AAAA,IAAM;AAAA,IACN;AAAA,IAAoB;AAAA,IACpB;AAAA,IAAa;AAAA,IACb;AAAA,IAAM,GAAG,OAAO,QAAQ,WAAW,MAAM;AAAA,IACzC;AAAA,IAAO;AAAA,IACP;AAAA,IAAO;AAAA,EACX;AAEA,MAAI,OAAO,YAAY,UAAU;AAE7B,SAAK,KAAK,YAAY,QAAQ,WAAW,GAAG,IAAI,UAAU,IAAI,UAAU;AAAA,EAC5E;AAEA,SAAO;AACX;AApBgB;AAsBT,SAAS,kBAAkB,KAAc;AAE5C,SAAO;AAAA,IACH;AAAA,IAAoB;AAAA,IACpB;AAAA,IAAa;AAAA,IACb;AAAA,IAAM,GAAG,OAAO,QAAQ,WAAW,MAAM;AAAA,IACzC;AAAA,IAAO;AAAA,IACP;AAAA,IAAO;AAAA,EACX;AACJ;AATgB;AAgBT,SAAS,mBAAmB,QAAoC,SAA+B;AAClG,MAAI,SAAS,QAAQ,OAAO,WAAW;AAAU,WAAO;AACxD,wBAAY,CAAC;AACb,QAAM,OAAO,OAAO,WAAW,WAAW,mBAAmB,QAAQ,QAAQ,KAAK,QAAQ,OAAO,IAAI,kBAAkB,QAAQ,GAAG;AAElI,MAAI,CAAC,OAAO,MAAM,QAAQ,IAAI;AAAG,SAAK,QAAQ,OAAO,OAAO,QAAQ,IAAI,CAAC;AACzE,MAAI,MAAM,QAAQ,QAAQ,WAAW;AAAG,SAAK,KAAK,GAAG,QAAQ,WAAW;AAExE,QAAM,aAAa,IAAI,OAAO,EAAE,OAAO,OAAO,KAAK,CAAC;AACpD,aAAW,GAAG,SAAS,MAAM,WAAW,QAAQ,CAAC;AAEjD,MAAI,OAAO,WAAW,UAAU;AAC5B,WAAO,GAAG,SAAS,MAAM,WAAW,QAAQ,CAAC;AAC7C,WAAO,KAAK,UAAU;AAAA,EAC1B;AAEA,SAAO;AACX;AAjBgB;;;ADxChB,IAAM,YAAY,wBAAC,QAAkB;AACjC,SAAO,MAAM;AAAA,IACT;AAAA,MACI,QAAQ,UAAU;AAAA,IACtB;AAAA,IACA,CAAC,GAAG,OAAO;AAAA,MACP,MAAM;AAAA,MACN,MAAM,IAAI,KAAK,IAAI,KAAK,KAAK;AAAA,IACjC;AAAA,EACJ;AACJ,GAVkB;AAYX,IAAM,+BAA+B;AAAA,EACxC,MAAM,UAAU,CAAC,CAAC;AAAA,EAClB,WAAW,UAAU,CAAC,aAAc,aAAc,aAAc,aAAc,aAAc,aAAc,MAAM,MAAM,MAAM,IAAI,CAAC;AAAA,EACjI,MAAM,UAAU,CAAC,aAAc,aAAc,GAAK,KAAK,KAAK,KAAK,KAAK,aAAc,aAAc,WAAY,CAAC;AAAA,EAC/G,OAAO,UAAU,CAAC,KAAK,KAAK,KAAK,aAAc,aAAc,MAAM,MAAM,MAAM,aAAc,WAAY,CAAC;AAAA,EAC1G,UAAU,UAAU,CAAC,IAAM,KAAK,KAAK,KAAK,KAAK,IAAM,IAAM,OAAO,OAAO,KAAK,CAAC;AAAA,EAC/E,gBAAgB,UAAU,CAAC,KAAK,KAAK,aAAc,MAAM,MAAM,KAAK,GAAK,MAAM,IAAM,EAAI,CAAC;AAAA,EAC1F,YAAY,UAAU,CAAC,MAAM,MAAM,MAAM,IAAM,KAAK,MAAM,IAAM,IAAM,IAAM,IAAI,CAAC;AAAA,EACjF,YAAY,UAAU,CAAC,KAAK,MAAM,KAAK,MAAM,MAAM,KAAK,KAAK,KAAK,MAAM,IAAI,CAAC;AAAA,EAC7E,WAAW,UAAU,CAAC,MAAM,MAAM,KAAK,KAAK,aAAc,MAAM,MAAM,MAAM,aAAc,WAAY,CAAC;AAAA,EACvG,MAAM,UAAU,CAAC,MAAM,aAAc,GAAK,KAAK,KAAK,KAAK,GAAK,KAAK,KAAK,GAAG,CAAC;AAAA,EAC5E,OAAO,UAAU,CAAC,KAAK,KAAK,aAAc,aAAc,aAAc,aAAc,aAAc,aAAc,KAAK,GAAG,CAAC;AAAA,EACzH,KAAK,UAAU,CAAC,MAAM,KAAK,KAAK,GAAK,KAAK,aAAc,MAAM,MAAM,MAAM,IAAI,CAAC;AAAA,EAC/E,QAAQ,UAAU,CAAC,aAAc,aAAc,aAAc,MAAM,aAAc,KAAK,KAAK,aAAc,aAAc,WAAY,CAAC;AAAA,EACpI,MAAM,UAAU,CAAC,GAAK,KAAK,MAAM,IAAM,MAAM,GAAK,KAAK,MAAM,MAAM,IAAI,CAAC;AAAA,EACxE,KAAK,UAAU,CAAC,MAAM,MAAM,IAAM,aAAc,GAAK,KAAK,KAAK,KAAK,MAAM,GAAG,CAAC;AAAA,EAC9E,MAAM,UAAU,CAAC,KAAK,KAAK,aAAc,MAAM,aAAc,GAAK,GAAK,KAAK,MAAM,EAAI,CAAC;AAAA,EACvF,UAAU,UAAU,CAAC,GAAK,GAAK,KAAK,aAAc,IAAM,MAAM,MAAM,aAAc,KAAK,GAAG,CAAC;AAAA,EAC3F,QAAQ,UAAU,CAAC,GAAK,KAAK,aAAc,MAAM,MAAM,aAAc,GAAK,KAAK,KAAK,GAAG,CAAC;AAC5F;AAxCA;AA0CO,IAAM,iBAAN,MAAqC;AAAA,EAEjC,YAAmB,IAAkC;AAAlC;AAE1B;AAHA,uCAA4B,CAAC;AAAA,EACgC;AAAA,EActD,aAAa,QAA2B,SAA8B;AACzE,WAAO,mBAAmB,QAAQ,OAAO;AAAA,EAC7C;AAAA,EAMO,WAAW,SAAyD;AACvE,QAAI,WAAsB,CAAC;AAC3B,QAAI,OAAO,YAAY,WAAW;AAC9B,iBAAW,CAAC,UAAU,CAAC,IAAK,OAAO,KAAK,qBAAa,OAAO;AAAA,IAChE,WAAW,MAAM,QAAQ,OAAO,GAAG;AAC/B,iBAAW;AAAA,IACf,OAAO;AACH,iBAAW,OAAO,QAAQ,OAAO,EAC5B,OAAO,CAAC,QAAQ,IAAI,OAAO,IAAI,EAC/B,IAAI,CAAC,MAAM,EAAE,EAAE;AAAA,IACxB;AAEA,WAAO,sBAAK,4BAAL,WAAiB;AAAA,EAC5B;AAAA,EAKA,IAAW,UAAU;AACjB,WAAO,mBAAK;AAAA,EAChB;AAAA,EAEA,IAAW,QAAQ,SAAoB;AACnC,SAAK,WAAW,OAAO;AAAA,EAC3B;AAAA,EAMO,OAAO,SAA8B;AACxC,QAAI,CAAC,MAAM,QAAQ,OAAO;AAAG,gBAAU,CAAC,OAAO;AAC/C,UAAM,QAAmB,CAAC;AAE1B,YAAQ,QAAQ,CAAC,MAAM;AACnB,UAAI,KAAK,QAAQ,SAAS,CAAC;AAAG;AAC9B,YAAM,KAAK,CAAC;AAAA,IAChB,CAAC;AAED,WAAO,sBAAK,4BAAL,WAAiB,mBAAK,gBAAe,OAAO,CAAC,MAAM,CAAC,QAAQ,SAAS,CAAC,CAAC,EAAE,OAAO,KAAK;AAAA,EAChG;AAAA,EAMO,YAAY,IAAe;AAC9B,uBAAK,gBAAiB;AAAA,EAC1B;AAAA,EAKO,oBAAoB;AACvB,WAAO,mBAAK;AAAA,EAChB;AAAA,EAKO,qBAAqB;AACxB,WAAO,qBAAa,MAAM,OAAO,CAAC,MAAM,CAAC,mBAAK,gBAAe,SAAS,CAAC,CAAC;AAAA,EAC5E;AAAA,EAMO,UAA6B,QAAoB;AACpD,WAAO,mBAAK,gBAAe,SAAS,MAAM;AAAA,EAC9C;AAAA,EAMO,WAA8B,QAAoB;AACrD,WAAO,CAAC,KAAK,UAAU,MAAM;AAAA,EACjC;AAAA,EAMO,cAAc,QAAuC;AACxD,WAAO,qBAAa,IAAI,MAAiB;AAAA,EAC7C;AAAA,EAKO,UAAU;AACb,WAAO,KAAK,QAAQ,IAAI,CAAC,WAAW,qBAAa,IAAI,MAAM,CAAC;AAAA,EAChE;AAAA,EAKO,SAAS;AACZ,UAAM,MAAM,CAAC;AAEb,SAAK,QAAQ,QAAQ,CAAC,WAAY,IAAI,UAAU,qBAAa,IAAI,MAAM,CAAE;AAEzE,WAAO;AAAA,EACX;AAAA,EAKO,WAAW;AACd,WAAO,qBAAa,OAAO,KAAK,OAAO;AAAA,EAC3C;AACJ;AAxIa;AACT;AAGA;AAAA,gBAAW,gCAAC,SAAoB;AAC5B,QAAM,gBAAgB,KAAK,QAAQ,KAAK,CAAC,OAAO,OAAO,eAAe,OAAO,WAAW,KAAK,CAAC,QAAQ,KAAK,CAAC,OAAO,OAAO,eAAe,OAAO,WAAW;AAC3J,QAAM,WAAW,KAAK,GAAG,MAAM,KAAK,aAAa,aAAa,GAAG,QAAQ,SAAS;AAClF,qBAAK,gBAAiB,CAAC,GAAG,IAAI,IAAI,OAAO,CAAC;AAC1C,SAAO,KAAK,GAAG,cAAc,QAAQ;AACzC,GALW;AA8IR,IAAM,yBAAN,MAA6C;AAAA,EAWzC,YAAmB,OAAyB;AAAzB;AAV1B,SAAO,QAAQ,IAAI,aAAmB,IAAI;AAC1C,SAAO,SAAS,IAAI,eAAqB,IAAI;AAC7C,SAAO,mBAAmB;AAC1B,SAAO,oBAA6C;AAAA,MAChD,QAAQ;AAAA,MACR,WAAW,CAAC;AAAA,MACZ,SAAS,CAAC;AAAA,MACV,QAAQ;AAAA,MACR,YAAY;AAAA,IAChB;AAEI,QAAI,OAAO,KAAK,MAAM,QAAQ,WAAW,UAAU;AAC/C,WAAK,kBAAkB,SAAS,KAAK,MAAM,QAAQ;AAAA,IACvD;AAAA,EACJ;AAAA,EAKA,IAAW,SAAS;AAChB,WAAO,KAAK,MAAM,YAAY,KAAK,UAAU;AAAA,EACjD;AAAA,EAKA,IAAW,YAAY;AACnB,WAAO,KAAK,MAAM,YAAY,aAAa;AAAA,EAC/C;AAAA,EAKA,IAAW,SAAS;AAChB,WAAO,KAAK,MAAM,YAAY,UAAU;AAAA,EAC5C;AAAA,EAKA,IAAW,UAAU;AACjB,WAAO,KAAK,MAAM,YAAY,WAAW;AAAA,EAC7C;AAAA,EAKA,IAAW,YAAY;AACnB,WAAO,KAAK,MAAM,YAAY,aAAa;AAAA,EAC/C;AAAA,EAMA,MAAa,cAAc,OAAO,GAAG;AACjC,QAAI,CAAC,KAAK,MAAM;AAAc,aAAO;AACrC,QAAI;AACA,YAAM,KAAK,MAAM,KAAK,KAAK,KAAK,MAAM,cAAc;AAAA,QAChD,OAAO;AAAA,QACP;AAAA,QACA,gBAAgB;AAAA,MACpB,CAAC;AAED,aAAO;AAAA,IACX,QAAE;AACE,aAAO;AAAA,IACX;AAAA,EACJ;AACJ;AAtEa;AAwEN,IAAM,eAAN,MAAmC;AAAA,EAC/B,YAAmB,IAAkC;AAAlC;AAAA,EAAmC;AAAA,EAE7D,IAAW,SAAS;AAChB,WAAO,KAAK,GAAG,OAAO;AAAA,EAC1B;AAAA,EAEA,IAAW,YAAY;AACnB,YAAQ,KAAK,GAAG,WAAW,mBAAmB,CAAC,GAAG,IAAI,CAAC,GAAG,OAAO;AAAA,MAC7D,MAAM;AAAA,MACN,MAAM;AAAA,IACV,EAAE;AAAA,EACN;AAAA,EAEA,IAAW,SAAS;AAChB,WAAO;AAAA,EAEX;AAAA,EAEA,IAAW,UAAU;AACjB,WAAO,KAAK,GAAG,SAAS,WAAW,CAAC;AAAA,EACxC;AAAA,EAEA,IAAW,SAAS;AAChB,WAAO,KAAK,GAAG;AAAA,EACnB;AAAA,EAEA,IAAW,YAAY;AACnB,WAAO,KAAK,GAAG;AAAA,EACnB;AAAA,EAEO,OAAoB;AACvB,WAAO;AAAA,MACH,QAAQ,KAAK;AAAA,MACb,WAAW,KAAK;AAAA,MAChB,QAAQ,KAAK;AAAA,MACb,SAAS,KAAK;AAAA,MACd,YAAY,KAAK,WAAW,oBAAoB,KAAK,WAAW,cAAc;AAAA,MAC9E,QAAQ,KAAK,QAAQ,UAAU;AAAA,IACnC;AAAA,EACJ;AACJ;AAzCa;;;ARtPb,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,WAAAC,gBAAe;;;AUSjB,IAAM,uBAAN,MAA2C;AAAA,EACvC,YAAmB,OAAyB;AAAzB;AAAA,EAA0B;AAAA,EAK7C,WAAW;AACd,WAAO;AAAA,MACH,SAAS;AAAA,QACL,WAAW,KAAK,MAAM,OAAO;AAAA,QAC7B,iBAAiB,KAAK,MAAM;AAAA,MAChC;AAAA,MACA,QAAQ;AAAA,QACJ,WAAW,KAAK,MAAM,KAAK,YAAY;AAAA,QACvC,SAAS,KAAK,MAAM,KAAK,UAAU;AAAA,QACnC,QAAQ,KAAK,MAAM,KAAK,SAAS;AAAA,QACjC,MAAM,KAAK,MAAM,KAAK,OAAO;AAAA,MACjC;AAAA,MACA,aAAa,KAAK,MAAM,OAAO;AAAA,MAC/B,aAAa,KAAK,MAAM,QAAQ,OAAO;AAAA,MACvC,YAAY,KAAK,MAAM,OAAO,WAAW;AAAA,MACzC,WAAW,KAAK,MAAM,MAAM,QAAQ,IAAI,MAAM,SAAS,QAAQ,OAAO,CAAC,MAAM,CAAC,EAAE,KAAK,GAAG,EAAE,QAAQ;AAAA,MAClG,aAAa,QAAQ,YAAY;AAAA,MACjC,UAAU;AAAA,QACN,MAAM,QAAQ;AAAA,QACd,QAAQ;AAAA,MACZ;AAAA,IACJ;AAAA,EACJ;AACJ;AA7Ba;;;AVxBb;AAgJO,IAAM,aAAN,MAAiC;AAAA,EAoB7B,YAAmB,QAAuB,SAA8B;AAArD;AAAuB;AAkPjD;AAmBA;AAIA;AAQA;AA6BA;AAWA,uBAAM;AAmCN;AAQA;AAvXA,uCAAiB;AACjB,sCAAgB;AAChB,iCAAW;AACX,8CAAgF,CAAC;AACjF,SAAQ,YAA0B;AAElC,SAAO,UAAU,IAAI,kBAAwB,IAAI;AACjD,SAAO,aAAsC;AAC7C,SAAO,OAAO,IAAI,qBAA2B,IAAI;AACjD,SAAO,UAAU,IAAI,uBAA6B,IAAI;AACtD,SAAO,uBAAoD,mCAAY,MAAZ;AAC3D,SAAO,sBAAkD,8BAAO,YAAY;AAAA,MACxE;AAAA,MACA,MAAMC,YAAW;AAAA,IACrB,IAHyD;AAIzD,SAAO;AACP,SAAO,WAAW,IAAIC,YAAmC;AACzD,SAAO,QAAQ,IAAI,qBAA2B,IAAI;AAG9C,SAAK,SAAS,IAAIC,OAAa,QAAQ,aAAa;AACpD,QAAI,OAAO,QAAQ,yBAAyB;AAAY,WAAK,uBAAuB,QAAQ;AAC5F,QAAI,OAAO,QAAQ,wBAAwB;AAAY,WAAK,sBAAsB,QAAQ;AAC1F,QAAI,QAAQ,cAAc;AAAM,WAAK,aAAa,QAAQ;AAE1D,YAAQ,aAAR,QAAQ,WAAa;AAErB,QAAI,KAAK,QAAQ,UAAU,QAAQ,OAAO,KAAK,QAAQ,WAAW,WAAW;AACzE,WAAK,QAAQ,kBAAkB,SAAS,KAAK,QAAQ;AAAA,IACzD;AACA,QAAI,MAAM,QAAQ,KAAK,QAAQ,SAAS,GAAG;AACvC,WAAK,QAAQ,kBAAkB,YAAY,KAAK,QAAQ;AAAA,IAC5D;AACA,QAAI,MAAM,QAAQ,KAAK,QAAQ,QAAQ,GAAG;AACtC,WAAK,QAAQ,kBAAkB,UAAU,KAAK,QAAQ;AAAA,IAC1D;AACA,QAAI,OAAO,KAAK,QAAQ,cAAc,UAAU;AAC5C,WAAK,QAAQ,kBAAkB,aAAa,KAAK,QAAQ;AAAA,IAC7D;AACA,QAAI,MAAM,QAAQ,KAAK,QAAQ,aAAa,GAAG;AAC3C,WAAK,QAAQ,OAAO,YAAY,KAAK,QAAQ,aAAa;AAAA,IAC9D;AACA,SAAK,MAAM,oCAAoC,KAAK,QAAQ,MAAM,aAAa,KAAK,QAAQ,MAAM,KAAK;AAAA,EAC3G;AAAA,EAMO,MAAM,GAAW;AACpB,SAAK,OAAO,OAAO,KAAK,SAAS,MAAM,CAAC;AAAA,EAC5C;AAAA,EAKA,IAAW,WAAW;AAClB,WAAO,KAAK,QAAQ;AAAA,EACxB;AAAA,EAEA,IAAW,SAAS,GAA4B;AAC5C,SAAK,QAAQ,WAAW;AAAA,EAC5B;AAAA,EAMO,YAAY,GAA4B;AAC3C,0BAAK,kCAAL;AACA,SAAK,QAAQ,WAAW;AAAA,EAC5B;AAAA,EAKA,IAAW,eAAe;AACtB,WAAO,mBAAK;AAAA,EAChB;AAAA,EAEA,IAAW,aAAa,GAAY;AAChC,uBAAK,eAAgB;AACrB,QAAI;AAAG,4BAAK,4DAAL;AAAA,EACX;AAAA,EAKA,IAAW,eAAe;AACtB,WAAO,KAAK,YAAY,eAAe,YAAY,KAAK;AAAA,EAC5D;AAAA,EAKA,IAAW,UAAU;AACjB,WAAO,mBAAK;AAAA,EAChB;AAAA,EAKA,IAAW,UAAU;AACjB,WAAO,KAAK,YAAY,WAAW;AAAA,EACvC;AAAA,EAEA,IAAW,QAAQ,GAA6B;AAC5C,QAAI,KAAK,YAAY;AACjB,UAAI,GAAG;AACH,aAAK,WAAW,UAAU;AAAA,MAC9B,OAAO;AACH,aAAK,OAAO;AAAA,MAChB;AAAA,IACJ;AAAA,EACJ;AAAA,EAKA,IAAW,aAAa;AACpB,WAAO,KAAK,YAAY,mBAAmB;AAAA,EAC/C;AAAA,EAKA,IAAW,QAAQ;AACf,WAAO,KAAK,QAAQ;AAAA,EACxB;AAAA,EAKA,IAAW,KAAK;AACZ,WAAO,KAAK,MAAM;AAAA,EACtB;AAAA,EAMO,iBAAiB,OAAgB;AACpC,0BAAK,kCAAL;AACA,uBAAK,gBAAiB;AAAA,EAC1B;AAAA,EAKO,kBAAkB;AACrB,WAAO,mBAAK;AAAA,EAChB;AAAA,EAMO,cAAc,MAAuB;AACxC,0BAAK,kCAAL;AACA,SAAK,aAAa;AAAA,EACtB;AAAA,EAKO,UAAU;AACb,0BAAK,kCAAL;AACA,WAAO,KAAK,OAAO,OAAO;AAAA,EAC9B;AAAA,EAKO,YAAY;AACf,0BAAK,kCAAL;AACA,WAAO,KAAK,YAAY,iBAAiB;AAAA,EAC7C;AAAA,EAMO,SAAS,OAAmC;AAC/C,0BAAK,kCAAL;AACA,UAAM,QAAQ,iBAAiB,WAAW,MAAM,SAAS;AACzD,SAAK,OAAO,IAAI,KAAK;AACrB,UAAM,UAAU,MAAM,QAAQ,KAAK;AAEnC,QAAI,SAAS;AACT,WAAK,OAAO,OAAO,KAAK,iBAAiB,MAAM,MAAM,EAAE;AACvD,WAAK,OAAO,OAAO,KAAK,kBAAkB,MAAM,KAAK;AAAA,IACzD,OAAO;AACH,WAAK,OAAO,OAAO,KAAK,iBAAiB,MAAM,KAAK;AAAA,IACxD;AAAA,EACJ;AAAA,EAOA,MAAa,QAAQ,mBAAgD,UAA8B,CAAC,GAAG;AACnG,0BAAK,kCAAL;AACA,UAAM,UAAU,KAAK,OAAO,OAAO,SAAS,QAAQ,iBAAiB;AACrE,QAAI,CAAC,WAAW,CAAC,QAAQ,aAAa,GAAG;AACrC,YAAM,IAAI,MAAM,wCAAwC,YAAY,cAAc,YAAY,8BAA8B,SAAS,MAAM;AAAA,IAC/I;AAEA,SAAK,MAAM,iBAAiB,QAAQ,SAAS,YAAY,kBAAkB,UAAU,mBAAmB,QAAQ,aAAa,QAAQ,KAAK;AAE1I,QAAI,KAAK,YAAY;AACjB,WAAK,MAAM,2BAA2B;AACtC,4BAAK,sCAAL,WAAsB,KAAK;AAC3B,WAAK,WAAW,WAAW;AAAA,IAC/B;AAEA,SAAK,aAAa,MAAM,KAAK,OAAO,WAAW,QAAQ,SAAS;AAAA,MAC5D,MAAM,QAAQ,QAAQ,KAAK,QAAQ,YAAY;AAAA,MAC/C,SAAS,SAAS,WAAW,KAAK,QAAQ,qBAAqB;AAAA,MAC/D,OAAO;AAAA,IACX,CAAC;AAED,SAAK,OAAO,OAAO,KAAK,cAAc,IAAI;AAE1C,QAAI,KAAK,QAAS,SAAS,YAAY,iBAAiB;AACpD,YAAM,KAAK,QAAS,MAAM,QAAQ,GAAI,MAAM,cAAc,KAAK,EAAE,MAAM,YAAY;AAC/E,eAAO,MAAM,KAAK,QAAS,MAAM,QAAQ,GAAI,MAAM,kBAAkB,IAAI,EAAE,MAAM,KAAK,IAAI;AAAA,MAC9F,CAAC;AAAA,IACL;AAEA,0BAAK,sCAAL,WAAsB,KAAK;AAE3B,WAAO;AAAA,EACX;AAAA,EAKA,IAAW,OAAO;AACd,WAAO,KAAK,YAAY,KAAK,OAAO;AAAA,EACxC;AAAA,EAKO,SAAS;AACZ,QAAI,KAAK,OAAO,MAAM,OAAO,KAAK,EAAE,GAAG;AACnC,yBAAK,UAAW;AAAA,IACpB;AAAA,EACJ;AAAA,EAKO,sBAAsB;AACzB,WAAO,IAAI,QAAiB,CAAC,MAAM;AAC/B,UAAI,CAAC,mBAAK;AAAe,eAAO,EAAE,IAAI;AACtC,yBAAK,uBAAsB,KAAK,CAAC;AAAA,IACrC,CAAC;AAAA,EACL;AAwHJ;AA5Xa;AACT;AACA;AACA;AACA;AAkQA;AAAA,qBAAgB,gCAAC,YAA8B;AAC3C,aAAW,GAAG,SAAS,CAAC,MAAM,KAAK,OAAO,OAAO,KAAK,SAAS,MAAM,CAAC,CAAC;AACvE,aAAW,GAAG,SAAS,CAAC,MAAM,KAAK,OAAO,OAAO,KAAK,SAAS,MAAM,CAAC,CAAC;AACvE,aAAW,GAAG,UAAU,CAAC,MAAM,sBAAK,kCAAL,WAAoB,EAAE;AACrD,aAAW,GAAG,SAAS,CAAC,MAAM,sBAAK,gCAAL,WAAmB,EAAE;AACnD,aAAW,GAAG,OAAO,CAAC,MAAM;AACxB,SAAK,QAAQ,kBAAkB,UAAU;AAAA,EAC7C,CAAC;AACD,aAAW,GAAG,UAAU,CAAC,MAAM;AAC3B,SAAK,QAAQ,kBAAkB,SAAS;AAAA,EAC5C,CAAC;AACD,aAAW,GAAG,WAAW,CAAC,MAAM;AAC5B,SAAK,QAAQ,kBAAkB,YAAY;AAAA,EAC/C,CAAC;AACD,aAAW,GAAG,UAAU,CAAC,MAAM;AAC3B,SAAK,QAAQ,kBAAkB,SAAS;AAAA,EAC5C,CAAC;AACL,GAjBgB;AAmBhB;AAAA,qBAAgB,gCAAC,YAA8B;AAC3C,aAAW,mBAAmB;AAClC,GAFgB;AAIhB;AAAA,kBAAa,gCAAC,UAAiC;AAC3C,QAAM,QAAQ,UAAU,YAAY,KAAK;AACzC,OAAK,OAAO,OAAO,KAAK,iBAAiB,MAAM,OAAQ,KAAK,gBAAgB,IAAI,YAAY,QAAQ;AACpG,MAAI,SAAS,CAAC,KAAK,gBAAgB;AAAG,SAAK,OAAO,OAAO,KAAK,eAAe,MAAM,KAAK;AACxF,OAAK,iBAAiB,KAAK;AAC3B,OAAK,eAAe;AACxB,GANa;AAQb;AAAA,mBAAc,gCAAC,UAAiC;AAC5C,QAAM,QAAQ,UAAU,YAAY,KAAK;AACzC,MAAI,SAAS,CAAC,KAAK,gBAAgB,GAAG;AAClC,SAAK,QAAQ,KAAK,KAAK;AACvB,SAAK,KAAK,cAAc;AACxB,SAAK,OAAO,OAAO,KAAK,gBAAgB,MAAM,KAAK;AACnD,QAAI,KAAK,OAAO,OAAO,KAAK,KAAK,4BAAoC;AACjE,4BAAK,sBAAL;AAAA,IACJ,OAAO;AACH,UAAI,KAAK,8BAAsC;AAC3C,aAAK,YAAY,KAAK,QAAQ,OAAO,SAAS,KAAK;AACnD,eAAO,KAAK,KAAK,KAAK,KAAK,SAAU;AAAA,MACzC;AACA,UAAI,KAAK;AAAsC,aAAK,OAAO,IAAI,KAAK,QAAQ,OAAO,SAAS,KAAK,KAAK;AACtG,UAAI,CAAC,KAAK,OAAO,MAAM;AACnB,YAAI,KAAK,iCAAyC;AAC9C,gCAAK,oCAAL,WAAqB;AACrB;AAAA,QACJ;AAAA,MACJ,OAAO;AACH,aAAK,YAAY,KAAK,OAAO,SAAS;AACtC,aAAK,KAAK,KAAK,KAAK,WAAW;AAAA,UAC3B,OAAO;AAAA,QACX,CAAC;AAAA,MACL;AAAA,IACJ;AAAA,EACJ;AACJ,GA3Bc;AA6Bd;AAAA,aAAQ,kCAAG;AACP,OAAK,YAAY;AACjB,OAAK,OAAO,OAAO,KAAK,cAAc,IAAI;AAC1C,MAAI,KAAK,QAAQ,YAAY;AACzB,UAAM,KAAqBC,YAAW,MAAM;AACxC,UAAI,KAAK,OAAO;AAAM,eAAO,aAAa,EAAE;AAC5C,WAAK,YAAY,WAAW;AAAA,IAChC,GAAG,KAAK,QAAQ,kBAAkB,EAAE,MAAM;AAAA,EAC9C;AACJ,GATQ;AAWF;AAAA,oBAAe,sCAAC,OAAc;AAChC,MAAI,OAAO,MAAMC,SAAQ,SAAS,MAAM,GAAG,EACtC,KAAK,CAAC,MAAM,EAAE,OAAQ,EAAE,EACxB,MAAM,KAAK,IAAI;AAGpB,MAAI,CAAC;AACD,WAAO,MAAMA,SAAQ,OAAO,MAAM,MAAM,EACnC,KAAK,CAAC,MAAM,EAAE,EAAE,EAChB,MAAM,KAAK,IAAI;AAExB,MAAI,CAAC,MAAM;AACP,WAAO,sBAAK,sBAAL;AAAA,EACX;AAEA,QAAM,YAAY,IAAI,MAAM,KAAK,QAAQ;AAAA,IACrC,OAAO,KAAK;AAAA,IACZ,KAAK,mCAAmC,KAAK;AAAA,IAC7C,UAAU,KAAK,qBAAqB,KAAK,cAAc,KAAK,QAAQ,KAAK,WAAW,GAAI,CAAC;AAAA,IACzF,aAAa,KAAK;AAAA,IAClB,WAAW,OAAO,KAAK,cAAc,WAAW,KAAK,YAAa,KAAK,UAAW;AAAA,IAClF,OAAO,KAAK;AAAA,IACZ,QAAQ,KAAK,QAAS;AAAA,IACtB,aAAa,MAAM;AAAA,IACnB,QAAQ;AAAA,IACR,WAAW;AAAA,EACf,CAAC;AAED,OAAK,KAAK,KAAK,WAAW;AAAA,IACtB,OAAO;AAAA,IACP,MAAM;AAAA,IACN,gBAAgB;AAAA,EACpB,CAAC;AACL,GAjCqB;AAmCrB;AAAA,gCAA2B,kCAAG;AAC1B,qBAAK,uBAAsB,QAAQ,CAAC,MAAM;AACtC,MAAE,CAAC,mBAAK,cAAa;AAAA,EACzB,CAAC;AAED,qBAAK,uBAAwB,CAAC;AAClC,GAN2B;AAQ3B;AAAA,mBAAc,kCAAG;AACb,MAAI,CAAC,KAAK;AAAS;AACnB,OAAK,KAAK,8GAA8G,sBAAsB;AAClJ,GAHc;;;ADteX,IAAM,mBAAN,MAAuC;AAAA,EAEnC,YAAmB,QAAgB;AAAhB;AAD1B,SAAO,QAAQ,IAAIC,YAA+B;AAAA,EACP;AAAA,EAOpC,OAAiB,OAAwB,UAAqC,CAAC,GAAkB;AACpG,UAAM,SAAS,KAAK,OAAO,OAAO,OAAO,QAAQ,KAAK;AACtD,QAAI,CAAC,QAAQ;AACT,YAAM,IAAI,MAAM,0BAA0B;AAAA,IAC9C;AAEA,QAAI,KAAK,MAAM,IAAI,OAAO,EAAE,GAAG;AAC3B,aAAO,KAAK,MAAM,IAAI,OAAO,EAAE;AAAA,IACnC;AAEA,YAAQ,aAAR,QAAQ,WAAa;AACrB,YAAQ,WAAR,QAAQ,SAAW;AACnB,YAAQ,cAAR,QAAQ,YAAc,CAAC;AACvB,YAAQ,aAAR,QAAQ,WAAa,CAAC;AACtB,YAAQ,mBAAR,QAAQ,iBAAmB;AAC3B,YAAQ,mBAAR,QAAQ,iBAAmB;AAC3B,YAAQ,iBAAR,QAAQ,eAAiB;AACzB,YAAQ,yBAAR,QAAQ,uBAAyB;AACjC,YAAQ,eAAR,QAAQ,aAAe;AACvB,YAAQ,uBAAR,QAAQ,qBAAuB;AAC/B,YAAQ,gBAAR,QAAQ,cAAgB;AACxB,YAAQ,wBAAR,QAAQ,sBAAwB;AAChC,YAAQ,cAAR,QAAQ,YAAc;AACtB,YAAQ,aAAR,QAAQ,WAAa;AACrB,YAAQ,sBAAR,QAAQ,oBAAsB,KAAK,OAAO,QAAQ;AAClD,YAAQ,qBAAR,QAAQ,mBAAqB;AAE7B,UAAM,QAAQ,IAAI,WAAc,KAAK,QAAQ;AAAA,MACzC,OAAO;AAAA,MACP,eAAe,QAAQ;AAAA,MACvB,QAAQ,QAAQ;AAAA,MAChB,WAAW,QAAQ;AAAA,MACnB,UAAU,QAAQ;AAAA,MAClB,QAAQ,QAAQ;AAAA,MAChB,WAAW,QAAQ;AAAA,MACnB,gBAAgB,QAAQ;AAAA,MACxB,gBAAgB,QAAQ;AAAA,MACxB,sBAAsB,QAAQ;AAAA,MAC9B,qBAAqB,QAAQ;AAAA,MAC7B,YAAY,QAAQ;AAAA,MACpB,cAAc,QAAQ;AAAA,MACtB,sBAAsB,QAAQ;AAAA,MAC9B,YAAY,QAAQ;AAAA,MACpB,oBAAoB,QAAQ;AAAA,MAC5B,aAAa,QAAQ;AAAA,MACrB,qBAAqB,QAAQ;AAAA,MAC7B,UAAU,QAAQ;AAAA,MAClB,mBAAmB,QAAQ,qBAAqB;AAAA,MAChD,UAAU,QAAQ;AAAA,MAClB,eAAe,QAAQ,wBAAwB,CAAC;AAAA,MAChD,kBAAkB,QAAQ;AAAA,IAC9B,CAAC;AAED,SAAK,MAAM,IAAI,OAAO,IAAI,KAAK;AAE/B,WAAO;AAAA,EACX;AAAA,EAMO,IAAc,MAAsB;AACvC,UAAM,QAAQ,KAAK,QAAQ,IAAI;AAC/B,QAAI,CAAC;AAAO,aAAO;AAEnB,WAAQ,KAAK,MAAM,IAAI,MAAM,EAAE,KAAuB;AAAA,EAC1D;AAAA,EAMO,IAAI,MAAsB;AAC7B,UAAM,KAAK,gBAAgB,aAAa,KAAK,KAAK,KAAK,OAAO,OAAO,OAAO,UAAU,IAAI;AAC1F,WAAO,KAAK,MAAM,IAAI,EAAE;AAAA,EAC5B;AAAA,EAMO,OAAO,MAAsB;AAChC,UAAM,QAAQ,KAAK,QAAQ,IAAI;AAC/B,QAAI,CAAC;AAAO,YAAM,IAAI,MAAM,kCAAkC;AAE9D,UAAM,KAAK,KAAK,IAAI;AACpB,UAAM,YAAY,mBAAmB;AACrC,UAAM,YAAY,mBAAmB;AACrC,UAAM,YAAY,WAAW;AAC7B,UAAM,SAAS,QAAQ,CAAC,OAAO,aAAa,EAAE,CAAC;AAC/C,UAAM,QAAQ,MAAM;AACpB,UAAM,OAAO,MAAM;AAEnB,WAAO,KAAK,MAAM,OAAO,MAAM,EAAE;AAAA,EACrC;AAAA,EAMO,QAAkB,MAAsB;AAC3C,QAAI,gBAAgB,YAAY;AAC5B,aAAO;AAAA,IACX;AAEA,WAAO,KAAK,MAAM,IAAI,KAAK,OAAO,OAAO,OAAO,UAAU,IAAI,CAAE;AAAA,EACpE;AAAA,EAMO,UAAU,MAAsB;AACnC,UAAM,IAAI,KAAK,QAAQ,IAAI;AAC3B,WAAO,GAAG,MAAM;AAAA,EACpB;AACJ;AA9Ha;;;AYlBN,IAAM,eAAN,MAAmB;AAAA,EACf,YAAmB,QAAwB,OAAyB;AAAjD;AAAwB;AAAA,EAA0B;AAAA,EAK5E,IAAW,QAAQ;AACf,WAAO,KAAK,MAAM;AAAA,EACtB;AAAA,EAKA,IAAW,YAAY;AACnB,WAAO,KAAK,MAAM,aAAa,UAAU;AAAA,EAC7C;AAAA,EAKA,IAAW,YAAY;AACnB,WAAO,KAAK,MAAM,aAAa;AAAA,EACnC;AAAA,EAKA,IAAW,WAAW;AAClB,WAAO,KAAK,MAAM;AAAA,EACtB;AAAA,EAKA,IAAW,SAAS;AAChB,WAAO,KAAK,MAAM,UAAU,CAAC;AAAA,EACjC;AAAA,EAKA,IAAW,cAAc;AACrB,WAAO,KAAK,MAAM,eAAe;AAAA,EACrC;AAAA,EAKA,MAAa,UAAU;AACnB,WAAO,KAAK,OAAO,OAAO,KAAK,OAAO;AAAA,MAClC,cAAc,KAAK;AAAA,MACnB,aAAa,KAAK;AAAA,IACtB,CAAC;AAAA,EACL;AAAA,EAKO,UAAU;AACb,WAAO,CAAC,KAAK,OAAO;AAAA,EACxB;AAAA,EAKO,cAAc;AACjB,WAAO,KAAK,YAAY;AAAA,EAC5B;AAAA,EAKO,YAAY;AACf,WAAO,KAAK,OAAO,SAAS;AAAA,EAChC;AAAA,EAKO,SAAS;AACZ,WAAO;AAAA,MACH,OAAO,KAAK;AAAA,MACZ,WAAW,KAAK;AAAA,MAChB,UAAU,KAAK,UAAU,OAAO,KAAK,KAAK;AAAA,MAC1C,QAAQ,KAAK,OAAO,IAAI,CAAC,MAAM,EAAE,OAAO,IAAI,CAAC;AAAA,MAC7C,WAAW,KAAK,WAAW,cAAc;AAAA,MACzC,aAAa,KAAK,aAAa,OAAO,KAAK;AAAA,IAC/C;AAAA,EACJ;AACJ;AAzFa;;;AChBN,IAAK,kBAAL,kBAAKC,qBAAL;AACH,EAAAA,iBAAA,kBAAe;AACf,EAAAA,iBAAA,wBAAqB;AACrB,EAAAA,iBAAA,kBAAe;AACf,EAAAA,iBAAA,uBAAoB;AACpB,EAAAA,iBAAA,mBAAgB;AAChB,EAAAA,iBAAA,sBAAmB;AACnB,EAAAA,iBAAA,uBAAoB;AACpB,EAAAA,iBAAA,uBAAoB;AACpB,EAAAA,iBAAA,0BAAuB;AACvB,EAAAA,iBAAA,mBAAgB;AAChB,EAAAA,iBAAA,yBAAsB;AACtB,EAAAA,iBAAA,qBAAkB;AAClB,EAAAA,iBAAA,mBAAgB;AAChB,EAAAA,iBAAA,qBAAkB;AAdV,SAAAA;AAAA,GAAA;AAiBL,IAAM,cAAN,cAA0B,MAAM;AAAA,EAKnC,YAAY,SAAiB,OAAwB,kCAA8B;AAC/E,UAAM;AAHV,qBAAY,IAAI,KAAK;AAKjB,SAAK,UAAU,IAAI,SAAS;AAC5B,SAAK,aAAa;AAClB,SAAK,OAAO;AAEZ,UAAM,kBAAkB,IAAI;AAAA,EAChC;AAAA,EAEA,IAAI,mBAAmB;AACnB,WAAO,KAAK,UAAU,QAAQ;AAAA,EAClC;AAAA,EAEA,UAAU;AACN,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,SAAS;AACL,WAAO;AAAA,MACH,OAAO,KAAK;AAAA,MACZ,MAAM,KAAK;AAAA,MACX,SAAS,KAAK;AAAA,MACd,SAAS,KAAK;AAAA,IAClB;AAAA,EACJ;AAAA,EAEA,WAAW;AACP,WAAO,KAAK;AAAA,EAChB;AACJ;AAnCa;;;AChBb,SAAuC,kBAAmC,0BAA0B;;;ACDpG;AAAA,EAGI;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAAC;AAAA,EAEA;AAAA,EACA;AAAA,OACG;AAGP,SAAS,oBAAoB;AAI7B,SAAmD,oBAAoB;AAiCvE,IAAM,mBAAN,cAA+B,aAA0B;AAAA,EAcrD,YAAY,YAA6B,SAA6C,OAAmC,oBAA4B,KAAO;AACxJ,UAAM;AAD4E;AAAmC;AATzH,SAAQ,YAAY;AACpB,SAAO,MAAM,IAAI,aAAa;AAe1B,SAAK,kBAAkB;AAMvB,SAAK,cAAc,kBAAkB;AAMrC,SAAK,UAAU;AAEf,SAAK,IAAI,WAAW,MAAM;AACtB,UAAI,CAAC,KAAK;AAAK;AACf,UAAI,KAAK,IAAI,SAAS;AAAS,aAAK,KAAK,OAAO,KAAK,IAAI,SAAS,OAAO;AACzE,UAAI,KAAK,IAAI,QAAQ;AAAQ,aAAK,KAAK,UAAU,KAAK,IAAI,QAAQ,MAAM;AACxE,UAAI,KAAK,IAAI;AAAW,aAAK,KAAK,WAAW,KAAK,IAAI,UAAU,MAAM,CAAC;AACvE,UAAI,KAAK,IAAI;AAAQ,aAAK,KAAK,UAAU,KAAK,IAAI,OAAO,MAAM;AAC/D,UAAI,KAAK,IAAI;AAAW,aAAK,KAAK,cAAc,KAAK,IAAI,UAAU,gBAAgB;AAAA,IACvF;AAEA,SAAK,IAAI,UAAU,CAAC,MAAM,KAAK,KAAK,SAAS,CAAqB;AAElE,SAAK,gBAAgB,GAAG,eAAe,OAAO,GAAG,aAAa;AAC1D,UAAI,SAAS,WAAW,sBAAsB,cAAc;AACxD,YAAI,SAAS,WAAW,gCAAgC,kBAAkB,SAAS,cAAc,MAAM;AACnG,cAAI;AACA,kBAAM,YAAY,KAAK,iBAAiB,sBAAsB,YAAY,KAAK,iBAAiB;AAAA,UACpG,QAAE;AACE,gBAAI;AACA,mBAAK,gBAAgB,QAAQ;AAAA,YACjC,SAAS,KAAP;AACE,mBAAK,KAAK,SAAS,GAAuB;AAAA,YAC9C;AAAA,UACJ;AAAA,QACJ,WAAW,KAAK,gBAAgB,iBAAiB,GAAG;AAChD,gBAAM,KAAK,MAAM,KAAK,gBAAgB,iBAAiB,KAAK,GAAI;AAChE,eAAK,gBAAgB,OAAO;AAAA,QAChC,OAAO;AACH,cAAI;AACA,iBAAK,gBAAgB,QAAQ;AAAA,UACjC,SAAS,KAAP;AACE,iBAAK,KAAK,SAAS,GAAuB;AAAA,UAC9C;AAAA,QACJ;AAAA,MACJ,WAAW,SAAS,WAAW,sBAAsB,WAAW;AAC5D,aAAK,IAAI;AAAA,MACb,WAAW,CAAC,KAAK,cAAc,SAAS,WAAW,sBAAsB,cAAc,SAAS,WAAW,sBAAsB,aAAa;AAC1I,aAAK,YAAY;AACjB,YAAI;AACA,gBAAM,YAAY,KAAK,iBAAiB,sBAAsB,OAAO,KAAK,iBAAiB;AAAA,QAC/F,QAAE;AACE,cAAI,KAAK,gBAAgB,MAAM,WAAW,sBAAsB,WAAW;AACvE,gBAAI;AACA,mBAAK,gBAAgB,QAAQ;AAAA,YACjC,SAAS,KAAP;AACE,mBAAK,KAAK,SAAS,GAAuB;AAAA,YAC9C;AAAA,UACJ;AAAA,QACJ,UAAE;AACE,eAAK,YAAY;AAAA,QACrB;AAAA,MACJ;AAAA,IACJ,CAAC;AAED,SAAK,YAAY,GAAG,eAAe,CAAC,UAAU,aAAa;AACvD,UAAI,SAAS,WAAW,kBAAkB,SAAS;AAC/C,YAAI,SAAS,WAAW,kBAAkB,QAAQ,SAAS,WAAW,kBAAkB,WAAW;AAC/F,iBAAO,KAAK,KAAK,SAAS,KAAK,aAAc;AAAA,QACjD;AAAA,MACJ,WAAW,SAAS,WAAW,kBAAkB,QAAQ,SAAS,WAAW,kBAAkB,MAAM;AACjG,aAAK,KAAK,UAAU,KAAK,aAAc;AACvC,aAAK,IAAI,QAAQ;AACjB,aAAK,gBAAgB;AAAA,MACzB;AAAA,IACJ,CAAC;AAED,SAAK,YAAY,GAAG,SAAS,CAAC,MAAM,KAAK,KAAK,KAAK,SAAS,CAAC,CAAC;AAC9D,SAAK,YAAY,GAAG,SAAS,CAAC,UAAU,KAAK,KAAK,KAAK,SAAS,KAAK,CAAC;AACtE,SAAK,gBAAgB,UAAU,KAAK,WAAW;AAAA,EACnD;AAAA,EAKA,IAAI,SAAS;AACT,WAAO,KAAK,YAAY,MAAM,WAAW,kBAAkB;AAAA,EAC/D;AAAA,EAEA,IAAI,OAAO,KAAc;AACrB,UAAM,KAAK,MAAM,IAAI,IAAI,KAAK,OAAO;AAAA,EACzC;AAAA,EAKA,WAAW;AACP,WAAO,KAAK,UAAU,KAAK,YAAY,MAAM,WAAW,kBAAkB;AAAA,EAC9E;AAAA,EAKA,cAAc;AACV,WAAO,KAAK,YAAY,MAAM,WAAW,kBAAkB;AAAA,EAC/D;AAAA,EAKA,YAAY;AACR,WAAO,KAAK,YAAY,MAAM,WAAW,kBAAkB;AAAA,EAC/D;AAAA,EAKA,SAAS;AACL,WAAO,KAAK,YAAY,MAAM,WAAW,kBAAkB;AAAA,EAC/D;AAAA,EAQA,MAAM,aAAa,KAAe,KAAuB;AACrD,QAAI,CAAC,KAAK;AAAgB,WAAK,MAAM,MAAM,oCAAoC;AAC/E,UAAM,SAAS,CAAC,KAAK,iBACf,KAAK,IAAI,OAAO,KAAK;AAAA,MACjB,KAAK;AAAA,QACD,SAAS,KAAK;AAAA,QACd,UAAU,KAAK;AAAA,MACnB;AAAA,MACA,QAAQ,KAAK,eACP;AAAA,QACI,QAAQ,IAAI;AAAA,QACZ,UAAU,KAAK;AAAA,MACnB,IACA;AAAA,MACN,WAAW;AAAA,QACP,kBAAkB,KAAK;AAAA,QACvB,UAAU,KAAK;AAAA,MACnB;AAAA,MACA,WAAW;AAAA,QACP,gBAAgB,KAAK;AAAA,QACrB,UAAU,KAAK;AAAA,MACnB;AAAA,MACA,QAAQ;AAAA,QACJ,QAAQ,KAAK;AAAA,QACb,UAAU,KAAK;AAAA,MACnB;AAAA,IACJ,CAAC,IACD;AAEN,SAAK,MAAM,MAAM,uCAAuC;AACxD,UAAM,aAAa,MAAM,KAAK,MAAM,sBAAsB,QAAQ,KAAK,KAAK,EAAE;AAAA,MAC1E,OACK;AAAA,QACG;AAAA,QACA,MAAM,KAAK,QAAQC,YAAW;AAAA,MAClC;AAAA,IACR;AAEA,SAAK,MAAM,MAAM,4BAA4B;AAC7C,SAAK,gBAAgB,oBAAoB,YAAY,UAAU,QAAQ;AAAA,MACnE,WAAW,YAAY,QAAQ,KAAK,QAAQA,YAAW;AAAA,MACvD,UAAU,KAAK;AAAA,MAEf,cAAc;AAAA,IAClB,CAAC;AAED,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAW,YAAY;AACnB,WAAO,KAAK,KAAK;AAAA,EACrB;AAAA,EAEA,IAAW,UAAU;AACjB,WAAO,KAAK,KAAK;AAAA,EACrB;AAAA,EAEA,IAAW,SAAS;AAChB,WAAO,KAAK,KAAK,UAAU;AAAA,EAC/B;AAAA,EAEA,IAAW,YAAY;AACnB,WAAO,KAAK,KAAK,aAAa;AAAA,EAClC;AAAA,EAMA,IAAI,SAAS;AACT,WAAO,KAAK,YAAY,MAAM;AAAA,EAClC;AAAA,EAMA,aAAa;AACT,QAAI;AACA,UAAI,KAAK;AAAa,aAAK,YAAY,KAAK,IAAI;AAChD,WAAK,gBAAgB,QAAQ;AAAA,IACjC,QAAE;AAAA,IAAO;AAAA,EACb;AAAA,EAMA,MAAM;AACF,SAAK,YAAY,KAAK;AAAA,EAC1B;AAAA,EAOA,MAAM,oBAA8B;AAChC,UAAM,UAAU,KAAK,YAAY,MAAM,kBAAkB;AACzD,WAAO;AAAA,EACX;AAAA,EAMA,SAAS;AACL,UAAM,UAAU,KAAK,YAAY,QAAQ;AACzC,WAAO;AAAA,EACX;AAAA,EAOA,MAAM,WAAW,WAAiC,KAAK,eAAgB;AACnE,QAAI,CAAC;AAAU,YAAM,IAAI,YAAY,6EAAqE;AAC1G,QAAI,SAAS,OAAO;AAChB,aAAO,KAAK,KAAK,KAAK,UAAU,QAAQ;AAAA,IAC5C;AACA,QAAI,CAAC,KAAK;AAAe,WAAK,gBAAgB;AAC9C,QAAI,KAAK,gBAAgB,MAAM,WAAW,sBAAsB,OAAO;AACnE,UAAI;AACA,cAAM,YAAY,KAAK,iBAAiB,sBAAsB,OAAO,KAAK,iBAAiB;AAAA,MAC/F,SAAS,KAAP;AACE,eAAO,KAAK,KAAK,KAAK,SAAS,GAAuB;AAAA,MAC1D;AAAA,IACJ;AAEA,QAAI;AACA,WAAK,YAAY,KAAK,QAAQ;AAAA,IAClC,SAAS,GAAP;AACE,WAAK,KAAK,SAAS,CAAqB;AAAA,IAC5C;AAEA,WAAO;AAAA,EACX;AAAA,EAOA,UAAU,OAAe;AACrB,QAAI,CAAC,KAAK,IAAI;AAAQ,aAAO;AAC7B,WAAO,KAAK,IAAI,OAAO,UAAU,KAAK;AAAA,EAC1C;AAAA,EAMA,IAAI,SAAS;AACT,QAAI,CAAC,KAAK,IAAI;AAAQ,aAAO;AAC7B,WAAO,KAAK,IAAI,OAAO;AAAA,EAC3B;AAAA,EAMA,IAAI,aAAa;AACb,QAAI,CAAC,KAAK;AAAe,aAAO;AAChC,WAAO,KAAK,cAAc;AAAA,EAC9B;AACJ;AA5TM;;;ADjDN,SAAS,cAAAC,mBAAkB;AAG3B,IAAM,aAAN,MAAiB;AAAA,EAOb,cAAc;AAKV,SAAK,QAAQ,IAAIC,YAAwC;AAAA,EAC7D;AAAA,EAQA,MAAa,QACT,SACA,SAKyB;AACzB,QAAI,CAAC,SAAS;AAAO,YAAM,IAAI,MAAM,wBAAwB;AAC7D,UAAM,OAAO,MAAM,KAAK,KAAK,SAAS,OAAO;AAC7C,UAAM,MAAM,IAAI,iBAAiB,MAAM,SAAS,QAAQ,OAAO,QAAQ,OAAO;AAC9E,SAAK,MAAM,IAAI,QAAQ,MAAM,IAAI,GAAG;AACpC,WAAO;AAAA,EACX;AAAA,EAQA,MAAa,KACT,SACA,SAIF;AACE,UAAM,OAAO,iBAAiB;AAAA,MAC1B,SAAS,QAAQ,MAAM;AAAA,MACvB,WAAW,QAAQ;AAAA,MACnB,gBAAgB,QAAQ,MAAM;AAAA,MAC9B,UAAU,QAAQ,SAAS,IAAI;AAAA,IACnC,CAAC;AAED,WAAO;AAAA,EACX;AAAA,EAOO,WAAW,YAAgD;AAC9D,QAAI,sBAAsB;AAAkB,aAAO,WAAW,gBAAgB,QAAQ;AACtF,WAAO,WAAW,QAAQ;AAAA,EAC9B;AAAA,EAOO,cAAc,OAAkB;AACnC,WAAO,KAAK,MAAM,IAAI,KAAK,KAAK,mBAAmB,KAAK;AAAA,EAC5D;AACJ;AA7EM;;;AENN,OAAO,UAAU;AAYjB,IAAM,yBAAyB;AAZ/B;AAcO,IAAM,aAAN,MAAiB;AAAA,EASb,YACI,QACA,UAA6B;AAAA,IAChC,eAAe;AAAA,EACnB,GACF;AAJS;AACA;AAVX,sCAAgB,oBAAI,IAAkD;AAEtE,SAAO,OAAO,IAAI,KAAK,CAAC,GAAc;AAAA,MAElC,MAAM;AAAA,QACF;AAAA,MACJ;AAAA,IACJ,CAAC;AAOG,SAAK,QAAQ,YAAY,KAAK,QAAQ,KAAK,IAAI,GAAG,KAAK,aAAa,EAAE,MAAM;AAAA,EAChF;AAAA,EAEA,IAAW,gBAAgB;AACvB,WAAO,KAAK,QAAQ,iBAAiB;AAAA,EACzC;AAAA,EAEA,MAAa,UAAU;AACnB,eAAW,CAAC,IAAI,KAAK,KAAK,mBAAK,gBAAe;AAC1C,UAAI,MAAM,WAAW,GAAG;AACpB,2BAAK,eAAc,OAAO,EAAE;AAAA,MAChC;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,MAAa,QAAQ;AACjB,uBAAK,eAAc,MAAM;AAAA,EAC7B;AAAA,EAEA,MAAa,UAAU;AACnB,WAAO,CAAC,GAAG,mBAAK,eAAc,OAAO,CAAC;AAAA,EAC1C;AAAA,EAEA,MAAa,QAAQ,MAAoB;AACrC,SAAK,OAAO,QAAQ,CAAC,MAAM;AACvB,UAAI,mBAAK,eAAc,IAAI,EAAE,GAAG;AAAG;AACnC,yBAAK,eAAc,IAAI,EAAE,KAAK,IAAI,8BAA8B,CAAC,CAAC;AAAA,IACtE,CAAC;AAAA,EACL;AAAA,EAEA,MAAa,QAAQ,SAAoC;AACrD,UAAM,YAAY,MAAM,KAAK,QAAQ;AAErC,SAAK,KAAK,cAAc,UAAU,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;AAEpD,UAAM,SAAS,KAAK,KAAK,OAAO,QAAQ,KAAK;AAC7C,QAAI,CAAC,OAAO;AACR,aAAO,IAAI,aAAa,KAAK,QAAQ;AAAA,QACjC,OAAO,QAAQ;AAAA,QACf,aAAa,QAAQ;AAAA,QACrB,WAAW,QAAQ;AAAA,MACvB,CAAC;AAEL,WAAO,IAAI,aAAa,KAAK,QAAQ;AAAA,MACjC,OAAO,QAAQ;AAAA,MACf,QAAQ,OAAO,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,MAChC,UAAU;AAAA,MACV,WAAW,QAAQ;AAAA,MACnB,aAAa,QAAQ;AAAA,IACzB,CAAC;AAAA,EACL;AACJ;AAlEa;AACT;AAmEG,IAAM,gCAAN,MAAiD;AAAA,EAE7C,YAAmB,MAAS,cAAsB,wBAAwB;AAAvD;AAD1B,SAAO,cAAc;AAEjB,QAAI,OAAO,gBAAgB,UAAU;AACjC,WAAK,cAAc,KAAK,IAAI,IAAI;AAAA,IACpC;AAAA,EACJ;AAAA,EAEO,aAAa;AAChB,QAAI,OAAO,KAAK,gBAAgB,YAAY,MAAM,KAAK,WAAW,KAAK,KAAK,cAAc;AAAG,aAAO;AACpG,WAAO,KAAK,IAAI,KAAK,KAAK;AAAA,EAC9B;AACJ;AAZa;;;AClFb,SAAiB,iBAAAC,gBAA2B,iBAAuB,eAAAC,oBAAgD;AACnH,SAAS,gBAAAC,qBAAoB;AAM7B,SAAS,gCAAgC;;;ACLlC,IAAM,YAAY,oBAAI,IAAoB;;;ACC1C,SAAS,UAAU,QAAgB;AACtC,MAAI,UAAU,IAAI,OAAO,EAAE;AAAG,WAAO;AAErC,YAAU,IAAI,OAAO,IAAI,MAAM;AAE/B,SAAO,UAAU,IAAI,OAAO,EAAE;AAClC;AANgB;;;ACAT,SAAS,YAAY,QAAgB;AACxC,SAAO,UAAU,OAAO,OAAO,EAAE;AACrC;AAFgB;;;ACDT,SAAS,aAAa;AACzB,SAAO,CAAC,GAAG,UAAU,OAAO,CAAC;AACjC;AAFgB;;;AJWhB,IAAM,aAAa,OAAO,gCAAgC;AAb1D;AAeO,IAAM,UAAN,cAAqBC,cAA2B;AAAA,EAoB5C,YAAY,QAAgB,UAA6B,CAAC,GAAG;AAChE,UAAM;AAnBV,SAAgB,KAAKC,eAAc,SAAS,EAAE,SAAS;AAGvD,SAAO,QAAQ,IAAI,iBAAiB,IAAI;AACxC,SAAgB,aAAa,IAAI,WAAW;AAC5C,SAAO,iBAAiB,CAAC,SAAS,iBAAiB;AACnD,SAAO,aAAa,IAAI,0BAA0B,IAAI;AACtD,SAAO,SAAS,IAAID,cAA+B;AACnD,qCAAe;AACf,kDAA4B,KAAK,iBAAiB,KAAK,IAAI;AAC3D;AACA;AAcI,SAAK,SAAS;AAEd,QAAI,KAAK,QAAQ,SAAS,WAAW,CAAC,IAAI,gBAAgB,KAAK,QAAQ,SAAS,OAAO,EAAE,IAAI,gBAAgB,MAAM,gBAAgB,GAAG;AAClI,WAAK,KAAK,+CAA+C,wBAAwB;AAAA,IACrF;AAMA,SAAK,UAAU;AAAA,MACX,uBAAuB;AAAA,MACvB,uBAAuB;AAAA,MACvB,iBAAiB,CAAC;AAAA,MAClB,iBAAiB,CAAC;AAAA,MAClB,mBAAmB;AAAA,MACnB,cAAc;AAAA,MACd,YAAY;AAAA,MACZ,YAAY,QAAQ,eAAe,OAAO,OAAO,IAAI,WAAW,IAAI;AAAA,MACpE,GAAG;AAAA,MACH,aAAa;AAAA,QACT,eAAe,KAAK;AAAA,QACpB,GAAG,QAAQ;AAAA,MACf;AAAA,IACJ;AAEA,SAAK,OAAO,GAAG,oBAAoB,mBAAK,0BAAyB;AAEjE,QAAI,KAAK,SAAS,uBAAuB;AACrC,UAAI;AAEJ,UAAK,KAAK,KAAK,QAAQ,2BAA2B,GAAI;AAClD,SAAC,oBAAoB,uBAAuB,yBAAyB,kBAAkB,qBAAqB,EAAE,QAAQ,CAAC,QAAQ,KAAK,KAAK,WAAW,SAAS,GAAG,IAAI,CAAC;AAAA,MACzK;AAAA,IACJ;AAEA,QAAI,OAAO,KAAK,QAAQ,eAAe,YAAY,KAAK,QAAQ,aAAa,GAAG;AAC5E,yBAAK,qBAAsB,YAAY,MAAM;AACzC,cAAM,QAAQ,YAAY,IAAI;AAC9B,2BAAK,oBAAqB,WAAW,MAAM;AACvC,6BAAK,cAAe,YAAY,IAAI,IAAI;AAAA,QAC5C,GAAG,CAAC,EAAE,MAAM;AAAA,MAChB,GAAG,KAAK,QAAQ,UAAU,EAAE,MAAM;AAAA,IACtC;AAEA,IAAW,UAAU,IAAI;AAAA,EAC7B;AAAA,EAOA,OAAc,UAAU,QAAgB,UAA6B,CAAC,GAAG;AACrE,QAAI,EAAE,cAAc,UAAS;AACzB,aAAO,eAAe,SAAQ,YAAY;AAAA,QACtC,OAAO,IAAI,QAAO,QAAQ,OAAO;AAAA,QACjC,UAAU;AAAA,QACV,cAAc;AAAA,QACd,YAAY;AAAA,MAChB,CAAC;AAAA,IACL;AAGA,WAAQ,QAAe;AAAA,EAC3B;AAAA,EAKA,OAAc,gBAAgB;AAC1B,WAAkB,WAAW;AAAA,EACjC;AAAA,EAKA,OAAc,kBAAkB;AAC5B,WAAkB,UAAU,MAAM;AAAA,EACtC;AAAA,EAKA,IAAW,aAAa;AACpB,WAAO,KAAK,QAAQ,cAAc;AAAA,EACtC;AAAA,EAKA,IAAW,SAAS;AAChB,WAAO,KAAK;AAAA,EAChB;AAAA,EAMA,IAAW,eAAe;AACtB,WAAO,mBAAK;AAAA,EAChB;AAAA,EAKO,qBAAqB;AACxB,WAAO;AAAA,MACH,WAAsB,UAAU;AAAA,MAChC,aAAa,KAAK,OAAO,MAAM;AAAA,MAC/B,mBAAmB,KAAK,cAAc;AAAA,MACtC,QAAQ,KAAK,OAAO,MAAM,IAAI,CAAC,MAAM,EAAE,MAAM,SAAS,CAAC;AAAA,IAC3D;AAAA,EACJ;AAAA,EAKA,MAAa,UAAU;AACnB,SAAK,MAAM,MAAM,QAAQ,CAAC,SAAS,KAAK,OAAO,CAAC;AAChD,SAAK,OAAO,IAAI,oBAAoB,mBAAK,0BAAyB;AAClE,SAAK,mBAAmB;AACxB,SAAK,OAAO,mBAAmB;AAC/B,UAAM,KAAK,WAAW,cAAc;AACpC,QAAI,mBAAK;AAAqB,oBAAc,mBAAK,oBAAmB;AACpE,QAAI,mBAAK;AAAoB,oBAAc,mBAAK,mBAAkB;AAClE,IAAW,YAAY,IAAI;AAAA,EAC/B;AAAA,EAEQ,kBAAkB,UAAsB,UAAsB;AAClE,UAAM,QAAQ,KAAK,MAAM,IAAI,SAAS,MAAM,EAAE;AAC9C,QAAI,CAAC,SAAS,CAAC,MAAM,cAAc,CAAC,MAAM;AAAS;AAGnD,UAAM,aAAa,KAAK,OAAO,KAAK,oBAAoB,OAAO,UAAU,QAAQ;AAEjF,QAAI,cAAc,CAAC,KAAK,QAAQ;AAAuB;AAEvD,QAAI,SAAS,aAAa,CAAC,SAAS,aAAa,SAAS,OAAQ,OAAO,SAAS,MAAM,QAAQ,GAAI,IAAI;AACpG,UAAI;AACA,cAAM,OAAO;AAAA,MACjB,QAAE;AAAA,MAEF;AACA,aAAO,KAAK,KAAK,OAAO,KAAK,cAAc,KAAK;AAAA,IACpD;AAEA,QAAI,CAAC,SAAS,aAAa,SAAS,aAAa,SAAS,OAAQ,OAAO,SAAS,MAAM,QAAQ,GAAI,IAAI;AACpG,UAAI,SAAS,cAAc,QAAQ,SAAS,eAAe,SAAS,YAAY;AAC5E,cAAM,KAAK,UAAU,SAAS,UAAU;AAAA,MAC5C,WAAW,SAAS,SAAS,SAASE,aAAY,mBAAmB,SAAS,YAAY,QAAQ,SAAS,aAAa,SAAS,UAAU;AACvI,cAAM,KAAK,UAAU,SAAS,QAAQ;AACtC,YAAI,SAAS,UAAU;AACnB,mBAAS,MAAM,QAAQ,GAAI,MAAM,kBAAkB,IAAI,EAAE,MAAM,KAAK,IAAI;AAAA,QAC5E;AAAA,MACJ;AAAA,IACJ;AAEA,QAAI,CAAC,SAAS,aAAa,SAAS,cAAc,MAAM,QAAQ,IAAI;AAChE,UAAI,CAAC,KAAK,aAAa,MAAM,OAAO;AAAG;AACvC,YAAM,UAAU,WAAW,MAAM;AAC7B,YAAI,CAAC,KAAK,aAAa,MAAM,OAAQ;AAAG;AACxC,YAAI,CAAC,KAAK,MAAM,IAAI,MAAM,MAAM,EAAE;AAAG;AACrC,YAAI,MAAM,QAAQ;AAAc,gBAAM,OAAO;AAC7C,aAAK,OAAO,KAAK,gBAAgB,KAAK;AAAA,MAC1C,GAAG,MAAM,QAAQ,wBAAwB,CAAC,EAAE,MAAM;AAClD,YAAM,SAAS,IAAI,SAAS,SAAS,MAAM,MAAM,OAAO;AAAA,IAC5D;AAEA,QAAI,SAAS,aAAa,SAAS,cAAc,MAAM,QAAQ,IAAI;AAC/D,YAAM,eAAe,MAAM,SAAS,IAAI,SAAS,SAAS,MAAM,IAAI;AACpE,YAAM,eAAe,KAAK,aAAa,MAAM,OAAO;AACpD,UAAI,CAAC,gBAAgB,cAAc;AAC/B,qBAAa,YAAY;AACzB,cAAM,SAAS,OAAO,SAAS,SAAS,MAAM,IAAI;AAAA,MACtD;AAAA,IACJ;AAEA,QAAI,SAAS,aAAa,SAAS,aAAa,SAAS,cAAc,SAAS,WAAW;AACvF,UAAI,SAAS,OAAQ,OAAO,SAAS,MAAM,QAAQ,GAAI,IAAI;AACvD,YAAI,MAAM,cAAc,SAAS,OAAQ,OAAO,SAAS,MAAM,QAAQ,GAAI;AAAI,gBAAM,UAAU,SAAS;AACxG,cAAM,eAAe,MAAM,SAAS,IAAI,SAAS,SAAS,MAAM,IAAI;AACpE,cAAM,eAAe,KAAK,aAAa,MAAM,OAAO;AACpD,YAAI,CAAC,gBAAgB,cAAc;AAC/B,uBAAa,YAAY;AACzB,gBAAM,SAAS,OAAO,SAAS,SAAS,MAAM,IAAI;AAAA,QACtD,OAAO;AACH,gBAAM,UAAU,WAAW,MAAM;AAC7B,gBAAI,MAAM,cAAc,CAAC,KAAK,aAAa,MAAM,OAAQ;AAAG;AAC5D,gBAAI,CAAC,KAAK,MAAM,IAAI,MAAM,MAAM,EAAE;AAAG;AACrC,gBAAI,MAAM,QAAQ;AAAc,oBAAM,OAAO;AAC7C,iBAAK,OAAO,KAAK,gBAAgB,KAAK;AAAA,UAC1C,GAAG,MAAM,QAAQ,wBAAwB,CAAC,EAAE,MAAM;AAClD,gBAAM,SAAS,IAAI,SAAS,SAAS,MAAM,MAAM,OAAO;AAAA,QAC5D;AAAA,MACJ,OAAO;AACH,YAAI,SAAS,cAAc,MAAM,QAAQ,IAAI;AACzC,cAAI,CAAC,KAAK,aAAa,MAAM,OAAO;AAAG;AACvC,cAAI,MAAM,SAAS,IAAI,SAAS,SAAS,MAAM,IAAI;AAAG;AACtD,gBAAM,UAAU,WAAW,MAAM;AAC7B,gBAAI,CAAC,KAAK,aAAa,MAAM,OAAQ;AAAG;AACxC,gBAAI,CAAC,KAAK,MAAM,IAAI,MAAM,MAAM,EAAE;AAAG;AACrC,gBAAI,MAAM,QAAQ;AAAc,oBAAM,OAAO;AAC7C,iBAAK,OAAO,KAAK,gBAAgB,KAAK;AAAA,UAC1C,GAAG,MAAM,QAAQ,wBAAwB,CAAC,EAAE,MAAM;AAClD,gBAAM,SAAS,IAAI,SAAS,SAAS,MAAM,MAAM,OAAO;AAAA,QAC5D,OAAO;AACH,gBAAM,eAAe,MAAM,SAAS,IAAI,SAAS,SAAS,MAAM,IAAI;AACpE,gBAAM,eAAe,KAAK,aAAa,MAAM,OAAQ;AACrD,cAAI,CAAC,gBAAgB,cAAc;AAC/B,yBAAa,YAAY;AACzB,kBAAM,SAAS,OAAO,SAAS,SAAS,MAAM,IAAI;AAAA,UACtD;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAAA,EAQO,iBAAiB,UAAsB,UAA4B;AACtE,SAAK,kBAAkB,UAAU,QAAQ;AAAA,EAC7C;AAAA,EAKO,wBAAwB;AAC3B,SAAK,QAAQ,wBAAwB;AAAA,EACzC;AAAA,EAKO,0BAA0B;AAC7B,SAAK,QAAQ,wBAAwB;AAAA,EACzC;AAAA,EAKO,4BAA4B;AAC/B,WAAO,CAAC,CAAC,KAAK,QAAQ;AAAA,EAC1B;AAAA,EAQA,MAAa,KACT,SACA,OACA,UAGI,CAAC,GACP;AACE,UAAM,KAAK,KAAK,OAAO,SAAS,QAAQ,OAAO;AAC/C,QAAI,CAAC,IAAI,aAAa;AAAG,YAAM,IAAI,MAAM,0BAA0B;AAEnE,UAAM,SAAS,iBAAiB,eAAe,QAAQ,MAAM,KAAK,OAAO,OAAO,OAAO;AACvF,QAAI,OAAO,QAAQ,GAAG;AAClB,YAAM,IAAI,MAAM,yBAAyB,sBAAsB,OAAO,WAAW,cAAc,QAAQ;AAAA,IAC3G;AAEA,UAAM,QAAQ,KAAK,MAAM,OAAO,GAAG,OAAO,QAAQ,WAAW;AAC7D,QAAI,CAAC,MAAM;AAAS,YAAM,MAAM,QAAQ,IAAI,QAAQ,iBAAiB;AAErE,QAAI,CAAC,OAAO,YAAY,GAAG;AACvB,YAAM,MAAM,KAAK,KAAK,OAAO,OAAO,EAAE;AAAA,IAC1C,OAAO;AACH,YAAM,SAAS,OAAO,QAAS;AAC/B,YAAM,MAAM,KAAK,KAAK;AAAA,IAC1B;AAEA,WAAO;AAAA,MACH,OAAO,OAAO,OAAO;AAAA,MACrB,WAAW,OAAO;AAAA,MAClB,cAAc;AAAA,MACd;AAAA,IACJ;AAAA,EACJ;AAAA,EAaA,MAAa,OAAO,OAAuB,UAAyB,CAAC,GAA0B;AAC3F,QAAI,QAAQ,eAAe;AAAM,cAAQ,cAAc,KAAK,OAAO,MAAM,QAAQ,QAAQ,WAAW;AACpG,YAAQ,oBAAR,QAAQ,kBAAoB,KAAK,QAAQ;AACzC,QAAI,iBAAiB;AACjB,aAAO,IAAI,aAAa,MAAM;AAAA,QAC1B,UAAU,MAAM,YAAY;AAAA,QAC5B,QAAQ,CAAC,KAAK;AAAA,QACd,OAAO,MAAM,SAAS;AAAA,QACtB,WAAW;AAAA,QACX,WAAW,MAAM;AAAA,QACjB,aAAa,QAAQ;AAAA,MACzB,CAAC;AAEL,QAAI,YAAkC;AAEtC,YAAQ,iBAAR,QAAQ,eAAiB,UAAU;AAEnC,UAAM,YAAY,QAAQ,iBAAiB,UAAU,OAAO,cAAc,QAAQ,KAAK,IAAI,QAAQ;AAGnG,QAAI,QAAQ,aAAa,WAAW,MAAM,GAAG;AACzC,kBAAY,KAAK,WAAW,IAAI,QAAQ,aAAa,UAAU,CAAC,CAAC;AACjE,UAAI,CAAC;AAAW,eAAO,IAAI,aAAa,MAAM,EAAE,OAAO,UAAU,CAAC;AAAA,IACtE;AAGA,QAAI,CAAC,WAAW;AAEZ,UAAI,CAAC,QAAQ,aAAa;AACtB,cAAMC,OAAM,MAAM,KAAK,YAAY,QAAQ;AAAA,UACvC;AAAA,UACA;AAAA,UACA,aAAa,QAAQ;AAAA,QACzB,CAAC;AAED,YAAIA,MAAK,UAAU;AAAG,iBAAOA;AAAA,MACjC;AAGA,mBAEQ,MAAM,KAAK,WAAW,IAAI,OAAO,QAAQ;AACrC,YAAI,QAAQ,iBAAiB,SAAS,IAAI,UAAU;AAAG,iBAAO;AAC9D,eAAO,IAAI,SAAS,OAAO,SAA4B;AAAA,MAC3D,CAAC,IACF,aAAa;AAAA,IACxB;AAGA,QAAI,CAAC,WAAW;AACZ,aAAO,IAAI,aAAa,MAAM,EAAE,OAAO,UAAU,CAAC;AAAA,IACtD;AAEA,UAAM,MAAM,MAAM,UACb,OAAO,OAAO;AAAA,MACX,MAAM;AAAA,MACN,aAAa,QAAQ;AAAA,IACzB,CAAC,EACA,MAAM,MAAM,IAAI;AAErB,QAAI,KAAK;AACL,YAAMC,UAAS,IAAI,aAAa,MAAM;AAAA,QAClC;AAAA,QACA;AAAA,QACA,UAAU,IAAI;AAAA,QACd,QAAQ,IAAI;AAAA,QACZ;AAAA,MACJ,CAAC;AAED,UAAI,CAAC,QAAQ,aAAa;AACtB,cAAM,KAAK,YAAY,QAAQA,OAAM;AAAA,MACzC;AAEA,aAAOA;AAAA,IACX;AAEA,UAAM,SAAS,MAAM,KAAK,WAAW;AAAA,MACjC,OAAO,QACH,CAAC,QAAQ,iBAAiB,SAAS,IAAI,UAAU,KAChD,MAAM,IAAI,SAAS,KAAK,KACzB,IAAI,OAAO,OAAO;AAAA,QACd,MAAM;AAAA,QACN,aAAa,QAAQ;AAAA,MACzB,CAAC;AAAA,IACT;AACA,QAAI,CAAC,QAAQ;AAAQ,aAAO,IAAI,aAAa,MAAM,EAAE,OAAO,UAAU,CAAC;AAEvE,UAAM,OAAO,IAAI,aAAa,MAAM;AAAA,MAChC;AAAA,MACA;AAAA,MACA,UAAU,OAAO,OAAO;AAAA,MACxB,QAAQ,OAAO,OAAO;AAAA,MACtB,WAAW,OAAO;AAAA,IACtB,CAAC;AAED,QAAI,CAAC,QAAQ,aAAa;AACtB,YAAM,KAAK,YAAY,QAAQ,IAAI;AAAA,IACvC;AAEA,WAAO;AAAA,EACX;AAAA,EAMO,WAAW;AACd,UAAM,OAAO,IAAI,OAAO,EAAE;AAC1B,UAAM,aAAa,yBAAyB;AAC5C,UAAM,kBAAkB,KAAK,WAAW,MACnC,IAAI,CAAC,MAAM;AACR,aAAO,EAAE;AAAA,IACb,CAAC,EACA,KAAK,IAAI;AACd,WAAO,GAAG;AAAA;AAAA,EAAmC,mBAAmB;AAAA,EAAW;AAAA,EAC/E;AAAA,EAEO,KAAmC,cAAiB,MAA4C;AACnG,QAAI,KAAK,eAAe,SAAS,SAAS,KAAK,CAAC,MAAM,WAAW,EAAE,SAAS,SAAS,GAAG;AAEpF,cAAQ,MAAM,GAAG,IAAI;AACrB,WAAK,KAAK,cAAc,4BAA4B,KAAK,eAAe,IAAI,CAAC,MAAM,IAAI,IAAI,EAAE,KAAK,IAAI,gCAAgC,uBAAuB;AAC7J,aAAO;AAAA,IACX,OAAO;AACH,aAAO,MAAM,KAAK,WAAW,GAAG,IAAI;AAAA,IACxC;AAAA,EACJ;AAAA,EAEA,EAAS,OAAO,YAAY;AACxB,WAAO,KAAK,MAAM,MAAM,OAAO;AAAA,EACnC;AAAA,EAMO,eAAe,MAAwB;AAC1C,WAAO,IAAI,SAAS,MAAM,IAAI;AAAA,EAClC;AACJ;AAldO,IAAM,SAAN;AAAM;AAUT;AACA;AACA;AACA;AAbS,OACK,gBAAgB;;;ArBHlC;AAAA,EACoB,gBAAhBC;AAAA,EACA,iBAAAC;AAAA,EACc;AAAA,EACd,cAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,gBAAAC;AAAA,OACG;AAGA,IAAM,UAAkB;AAE/B,IAAI,CAAC,WAAW,WAAW,IAAI,GAAG;AAC9B,UAAQ,YAAY,eAAe,mDAAmD,2CAA2C;AACrI;","names":["Collection","Collection","Queue","StreamType","setTimeout","setTimeout","QueueRepeatMode","setTimeout","YouTube","StreamType","Collection","Queue","setTimeout","YouTube","Collection","ErrorStatusCode","StreamType","StreamType","Collection","Collection","SnowflakeUtil","ChannelType","EventEmitter","EventEmitter","SnowflakeUtil","ChannelType","res","result","AudioFilters","BiquadFilters","PCMFilters","FiltersChain"]}