SLOPSHOPPER

pixel-player

A pixel-art music player pane that streams a playlist through mpv

newpanecommandprocesstimer
v0.5.3MITupdated 2026-10-06chrisluo5311/Pixel-Play
A shopper browsing a rack in a slop shop
Preview · a replayed session in a sandbox
claude · ~/work/app · pixel-player
│ ┃ ♪ Pixel Player ✕ › fix the failing auth test and add an audit log call │ ┃ │ ┃ ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ⏺ Read(src/auth.ts) │ ┃ ▀▀▀▀▀▀▀▀▀▀▀▀██▀▀▀▀ ⎿ Read 6 lines │ ┃ ▀██▀▀████████▀▀▀██ ⏺ Update(src/auth.ts) │ ┃ ██▀▀▀▀▀▀▀▀████▀▀▀▀ ⎿ Added 2 lines, removed 1 line │ ┃ █████▀▀█▀█▀█▀▀████ ⏺ Bash(bun test) │ ┃ ██▀▀▀█▀▀▀▀▀▀▀▀▀▀██ ⎿ 3 pass, 1 fail │ ┃ ██▀▀██████▀██▀▀██▀ │ ┃ ██▀▀▀▀▀██▀▀█▀▀▀▀▀▀ ● Done. refresh now rejects expired claims and logs an audit event. │ ┃ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ │ ┃ ✻ Worked for 42s · done 4:20 PM │ ┃ │ ┃ › /music │ ┃ ■ Nothing queued ⎿ pixel-player: Pixel Player opened. /music help lists the command │ ┃ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ --… │ ┃ ▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁ │ ┃ [ ⏮ ] [ ▶ ] [ ■ ] [ ⏭ ] │ ┃ [ vol- ] 60 [ vol+ ] skin: vinyl ▾ │ ┃ │ ┃ ─ Playlist (0) ─ │ ┃ Empty. /music add <youtube link> │ ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── › ? for shortcuts

Draws

Pane · ♪ Pixel Player
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ▀▀▀▀▀▀▀▀▀▀▀▀██▀▀▀▀ ▀██▀▀████████▀▀▀██ ██▀▀▀▀▀▀▀▀████▀▀▀▀ █████▀▀█▀█▀█▀▀████ ██▀▀▀█▀▀▀▀▀▀▀▀▀▀██ ██▀▀██████▀██▀▀██▀ ██▀▀▀▀▀██▀▀█▀▀▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ■ Nothing queued ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ --:--/--:-- ▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁ [ ⏮ ] [ ▶ ] [ ■ ] [ ⏭ ] [ vol- ] 60 [ vol+ ] skin: vinyl ▾ ─ Playlist (0) ─ Empty. /music add <youtube link>
README

<a id="readme-top"></a>

[![Stars][stars-shield]][stars-url] [![Version][version-shield]][version-url] [![License][license-shield]][license-url] [![Made for Claude Code][made-for-shield]][made-for-url] [![Views][views-shield]][views-url]

<a href="https://github.com/chrisluo5311/Pixel-Play"> <img src="assets/demo/logo.png" alt="Pixel Play logo" width="96" height="96"> </a>

<h1 align="center">Pixel Play</h1>

A pixel-art music player that docks beside your Claude Code conversation. <a href="#usage"><strong>Explore the commands »</strong></a> <a href="assets/demo/demo.mp4">View Demo</a> · <a href="https://github.com/chrisluo5311/Pixel-Play/issues/new?labels=bug">Report Bug</a> · <a href="https://github.com/chrisluo5311/Pixel-Play/issues/new?labels=enhancement">Request Feature</a>

<ol> <li> <a href="#about-the-project">About The Project</a> <ul> <li><a href="#built-with">Built With</a></li> </ul> </li> <li> <a href="#getting-started">Getting Started</a> <ul> <li><a href="#prerequisites">Prerequisites</a></li> <li><a href="#installation">Installation</a></li> </ul> </li> <li> <a href="#usage">Usage</a> <ul> <li><a href="#commands">Commands</a></li> <li><a href="#pane-controls">Pane controls</a></li> <li><a href="#playlist-format">Playlist format</a></li> <li><a href="#skins">Skins</a></li> </ul> </li> <li><a href="#development">Development</a></li> <li><a href="#roadmap">Roadmap</a></li> <li><a href="#license">License</a></li> <li><a href="#contact">Contact</a></li> <li><a href="#acknowledgments">Acknowledgments</a></li> </ol>

About The Project

<a href="assets/demo/demo.mp4"> <img src="assets/demo/demo.gif" alt="Pixel Play demo: playing a playlist, switching tracks and skins" width="100%"> </a> <sub>▶ <a href="assets/demo/demo.mp4">Watch the full demo video (MP4)</a></sub>

Pixel Play keeps music one keystroke away while you work. It docks as a pane beside the conversation: you keep talking to Claude on the left while a pixel-art character dances to your playlist on the right.

  • Lives inside Claude Code. A /music command and a docked pane, no extra window or app.
  • Streams instead of downloading. YouTube links play through mpv and yt-dlp without fetching the whole file first.
  • Twelve animated skins, including animal memes. Each one is drawn with half-block characters (▀), two pixels per terminal cell.
  • Point and click. Click a track to play it, click the buttons, or use single-key hotkeys.
  • Your playlist survives updates. It lives in ~/.claude/pixel-play/, outside the plugin folder.

It is a Claude Code mod: a plugin of function hooks. Playback goes through mpv, controlled over its IPC socket.

Built With

[![TypeScript][typescript-shield]][typescript-url] [![Lua][lua-shield]][lua-url] [![mpv][mpv-shield]][mpv-url] [![yt-dlp][ytdlp-shield]][ytdlp-url]

Getting Started

Prerequisites

  • Claude Code with mod (hooks module) support
  • macOS. Other systems should work wherever mpv runs, but are untested.
  • mpv and yt-dlp ``sh brew install mpv yt-dlp ``
  • A terminal with truecolor: iTerm2, Ghostty, kitty, WezTerm, ...
  • For the side-by-side layout: Claude Code's fullscreen layout and a terminal at least 110 columns wide.

[!NOTE] Claude Code decides where the pane goes, not the mod. Below 110 columns the pane opens above the prompt, and the player switches to a compact layout with a small sprite beside the controls. Docked, it asks for about 30% of the terminal's width (30 to 44 columns) and shrinks the sprite on short windows. Drag the dock's edge to override the width.

Installation

The repository is its own plugin marketplace.

  1. Add the marketplace and install the plugin: ``sh claude plugin marketplace add chrisluo5311/Pixel-Play claude plugin install pixel-player@pixel-play ``
  2. Restart Claude Code, or run /reload-plugins. /music is now available in every session.
  3. Add some tracks and start playing: `` /music add https://www.youtube.com/watch?v=... /music play ``

To update later:

claude plugin marketplace update pixel-play && claude plugin update pixel-player@pixel-play

To try it without installing:

git clone https://github.com/chrisluo5311/Pixel-Play.git
claude --plugin-dir ./Pixel-Play

Usage

Commands

CommandWhat it does
/musicOpen the player pane
/music helpList the commands
/music play [n]Play the playlist, optionally from track n
/music pausePause, or resume when paused
/music resumeResume a paused track (/music play with no number also resumes)
/music stopStop
/music next / /music prevSkip forward or back
/music add <url>Append a YouTube link, direct audio URL or local file
/music reloadRe-read the playlist after editing it by hand
/music skinsList the skins
/music skin [name or number]Switch skin (no argument: next skin)
/music vol <0-100>Set the volume

Pane controls

KeyAction
pPlay / pause / resume
sStop
n / bNext / previous track
u / dVolume up / down

Click a track in the playlist to play it. Pick a skin from the skin: menu with the arrow keys and Enter.

Playlist format

Your playlist lives in ~/.claude/pixel-play/playlist.txt, so plugin updates never touch it. playlist.example.txt shows the format:

# Lines starting with # are comments.
https://www.youtube.com/watch?v=abc123
https://www.youtube.com/watch?v=def456 # Optional title shown until the real one loads
/Users/me/Music/song.mp3

Anything mpv can open works: YouTube and other sites yt-dlp supports, direct audio URLs, and local files.

Skins

Twelve animated skins (doge and pop-cat are the animal-meme ones), generated with PixelLab. Switch with /music skin <name or number> or the skin: menu in the pane.

<img src="assets/demo/skins.gif" alt="The twelve Pixel Play skins: vinyl, headphone-kid, cat, cassette, anime-girl, handheld, shiba-dj, boombox, rainy-window, penguin, doge, pop-cat" width="100%">

The source PNGs live in assets/. To add or change a skin:

  1. Put a 40×40 PNG in assets/png/NN-name.png.
  2. Optionally, add its animation frames as assets/frames/NN-name/0.png, 1.png, ...
  3. Regenerate the sprite module: ``sh node scripts/png2sprite.mjs ``

Development

claude plugin validate .   # validate the manifest and hooks
claude plugin test .       # run the tests
claude --plugin-dir .      # run Claude Code with this checkout; /reload-plugins hot-reloads
PathContents
hooks/register.tsxThe /music command, playback, and the pane
hooks/player.tsPlaylist parsing, progress parsing, formatting
hooks/pixel.tsxHalf-block sprite renderer
hooks/skins.gen.tsGenerated sprite data (do not edit by hand)
mpv/progress.luampv script that reports the playback position
scripts/png2sprite.mjsPNG to sprite converter (Node, no dependencies)
types/index.d.tsThe mod's state contract
player.test.tsTests

Roadmap

  • ☑ Docked pane with an animated pixel-art sprite
  • ☑ YouTube streaming through mpv and yt-dlp
  • ☑ Pause and resume over mpv's IPC socket
  • ☑ Twelve skins with a picker menu
  • ☐ Live volume control (today the volume applies from the next track on)
  • ☐ An equalizer driven by the audio (today it is decorative)
  • ☐ Tested support for Linux and Windows

See the open issues for proposed features and known issues.

[!WARNING] Streaming YouTube audio with yt-dlp may conflict with YouTube's Terms of Service. Use it for your own listening, at your own discretion.

License

Distributed under the MIT License. See LICENSE for more information.

Contact

chrisluo5311 · @chrisluo5311

Project link: https://github.com/chrisluo5311/Pixel-Play

Acknowledgments

<!-- MARKDOWN LINKS & IMAGES --> [stars-shield]: https://img.shields.io/github/stars/chrisluo5311/Pixel-Play?style=for-the-badge&amp;logo=github&amp;color=f5c542 [stars-url]: https://github.com/chrisluo5311/Pixel-Play/stargazers [version-shield]: https://img.shields.io/badge/dynamic/json?style=for-the-badge&amp;label=version&amp;color=8a63d2&amp;url=https%3A%2F%2Fraw.githubusercontent.com%2Fchrisluo5311%2FPixel-Play%2Fmain%2F.claude-plugin%2Fplugin.json&amp;query=%24.version [version-url]: .claude-plugin/plugin.json [license-shield]: https://img.shields.io/badge/license-MIT-3da639?style=for-the-badge [license-url]: LICENSE [made-for-shield]: https://img.shields.io/badge/made%20for-Claude%20Code-d97757?style=for-the-badge&amp;logo=claude&amp;logoColor=white [made-for-url]: https://claude.com/claude-code [views-shield]: https://hits.sh/github.com/chrisluo5311/Pixel-Play.svg?style=for-the-badge&amp;label=views&amp;color=e8478b [views-url]: https://hits.sh/github.com/chrisluo5311/Pixel-Play/ [typescript-shield]: https://img.shields.io/badge/TypeScript-3178C6?style=for-the-badge&amp;logo=typescript&amp;logoColor=white [typescript-url]: https://www.typescriptlang.org [lua-shield]: https://img.shields.io/badge/Lua-2C2D72?style=for-the-badge&amp;logo=lua&amp;logoColor=white [lua-url]: https://www.lua.org [mpv-shield]: https://img.shields.io/badge/mpv-691F69?style=for-the-badge&amp;logo=mpv&amp;logoColor=white [mpv-url]: https://mpv.io [ytdlp-shield]: https://img.shields.io/badge/yt--dlp-FF0000?style=for-the-badge&amp;logo=youtube&amp;logoColor=white [ytdlp-url]: https://github.com/yt-dlp/yt-dlp

Source 5 files
hooks/register.tsx 493 lines
1import { atom, read, update } from 'claude-code'
2import type { EngineInterface, Register } from 'claude-code'
3
4import type { Player, Track } from '../types'
5import { PixelArt } from './pixel'
6import {
7  dockColumns,
8  equalizer,
9  formatTime,
10  ipcCommand,
11  ipcSucceeded,
12  parsePlaylist,
13  parseProgress,
14  progressBar,
15  trackLabel,
16  truncateToWidth,
17} from './player'
18import { SKINS } from './skins.gen'
19
20const PANE = 'pixel-player'
21const FRAME_MS = 250
22// Inline above the prompt: a half-size sprite beside the controls fits in this many rows.
23const INLINE_ROWS = 12
24// Docked, the rows under the sprite that must stay in view: a gap, title, bar, equalizer, two button rows.
25const CONTROL_ROWS = 7
26// Docked, the tracks kept in view under the controls; a longer playlist scrolls.
27const PLAYLIST_TRACKS = 5
28
29/** Rows the playlist needs in view: a gap, its heading, and up to PLAYLIST_TRACKS tracks (or the empty note). */
30function playlistRows(tracks: number): number {
31  return 2 + Math.max(1, Math.min(tracks, PLAYLIST_TRACKS))
32}
33
34const STOPPED: Player = { status: 'stopped', index: 0, title: '', position: -1, duration: -1 }
35const failed = (index: number, message: string): Player => ({ ...STOPPED, index, status: 'error', message })
36
37const player = atom({ plugin: 'pixel-player', key: 'player' } as const, STOPPED)
38const playlist = atom({ plugin: 'pixel-player', key: 'playlist' } as const, [] as Track[])
39const skin = atom({ plugin: 'pixel-player', key: 'skin' } as const, SKINS[0]?.id ?? '')
40const frame = atom({ plugin: 'pixel-player', key: 'frame' } as const, 0)
41const volume = atom({ plugin: 'pixel-player', key: 'volume' } as const, 60)
42
43const HELP = [
44  '/music              open the player pane',
45  '/music play [n]     play the playlist (from track n)',
46  '/music pause        pause, or resume when paused',
47  '/music resume       resume a paused track',
48  '/music stop | next | prev',
49  '/music add <url>    append a YouTube link, audio URL or file to playlist.txt',
50  '/music reload       re-read playlist.txt',
51  '/music skins        list the skins',
52  '/music skin [name]  next skin, or one by name or number',
53  '/music vol <0-100>  volume, from the next track on',
54].join('\n')
55
56// Playback lives in this module: a reload kills the child and starts over.
57let stream: AsyncGenerator<unknown, unknown> | undefined
58let generation = 0
59let ticker: { cancel: () => void } | undefined
60let titles: Record<string, string> = {}
61// mpv's JSON IPC socket for the running child; one name per module load.
62let socket: string | undefined
63const SOCKET_ID = Math.random().toString(36).slice(2, 8)
64
65type $ = EngineInterface
66
67export const register: Register = on => {
68  on('session.start', async ($, e, next) => {
69    await $.command.register({ name: 'music', description: 'Pixel-art music player: play, stop, next, skin, vol' })
70    await restoreState($)
71    // Whatever was playing before a reload is gone with the old module.
72    await update($, player, () => STOPPED)
73
74    return next(e)
75  })
76
77  on('command.run', { command: 'music' }, async ($, e) => {
78    const [verb = '', ...rest] = e.args.trim().split(/\s+/).filter(Boolean)
79    const arg = rest.join(' ')
80
81    switch (verb.toLowerCase()) {
82      case '':
83        await openPane($, e.presentation.columns)
84        return { text: 'Pixel Player opened. /music help lists the commands.' }
85      case 'help':
86        return { text: HELP }
87      case 'play': {
88        if (!arg && (await read($, player)).status === 'paused') return { text: await resume($) }
89        const list = await loadPlaylist($)
90        if (list.length === 0) return { text: emptyPlaylist() }
91        const n = arg ? Number(arg) - 1 : (await read($, player)).index
92        void play($, Number.isInteger(n) && n >= 0 && n < list.length ? n : 0)
93        await openPane($, e.presentation.columns)
94        return { text: `Playing track ${(Number.isInteger(n) && n >= 0 && n < list.length ? n : 0) + 1}.` }
95      }
96      case 'pause':
97        return { text: (await read($, player)).status === 'paused' ? await resume($) : await pause($) }
98      case 'resume':
99        return { text: await resume($) }
100      case 'stop':
101        await stop($)
102        return { text: 'Stopped.' }
103      case 'next':
104      case 'prev':
105        return { text: await step($, verb === 'next' ? 1 : -1) }
106      case 'reload': {
107        const list = await loadPlaylist($)
108        return { text: `playlist.txt: ${list.length} track(s).` }
109      }
110      case 'add': {
111        if (!arg) return { text: 'Usage: /music add <url or file>' }
112        const path = await playlistPath($)
113        const old = (await $.fs.exists(path)) ? await $.fs.read(path) : ''
114        await $.fs.write(path, `${old}${old.endsWith('\n') || old === '' ? '' : '\n'}${arg}\n`)
115        const list = await loadPlaylist($)
116        return { text: `Added as track ${list.length}.` }
117      }
118      case 'skins': {
119        const current = await read($, skin)
120        const rows = SKINS.map((s, i) => `${s.id === current ? '▸' : ' '} ${String(i + 1).padStart(2)}. ${s.id}`)
121        return { text: `${rows.join('\n')}\n\n/music skin <name or number> to switch.` }
122      }
123      case 'skin': {
124        const id = await cycleSkin($, arg)
125        return { text: id ? `Skin: ${id}` : `No skin "${arg}". /music skins lists them.` }
126      }
127      case 'vol':
128      case 'volume': {
129        const v = Number(arg)
130        if (!Number.isFinite(v)) return { text: `Volume is ${await read($, volume)}. Usage: /music vol <0-100>` }
131        await setVolume($, v)
132        return { text: `Volume ${Math.round(Math.max(0, Math.min(100, v)))} (from the next track).` }
133      }
134      default:
135        return { text: HELP }
136    }
137  })
138
139  on('ui.render', { component: 'Pane', requestId: PANE }, async ($, e) => {
140    const elements = $.ui.resolve(e)
141    const { Box, Text, Button } = elements
142    // A picker where the surface draws one (all but mobile); else a button that cycles.
143    const Select = 'Select' in elements ? elements.Select : undefined
144    const width = Math.max(20, e.props.bodyColumns)
145    const inline = e.props.placement === 'inline'
146    const p = await read($, player)
147    const list = await read($, playlist)
148    const skinId = await read($, skin)
149    const sprite = SKINS.find(s => s.id === skinId) ?? SKINS[0]
150    const tick = await read($, frame)
151    const vol = await read($, volume)
152    const isPlaying = p.status === 'playing'
153    const title = p.title || trackLabel(list[p.index], titles) || 'Nothing queued'
154    const icon = { stopped: '■', loading: '…', playing: '▶', paused: '⏸', error: '!' }[p.status]
155
156    // Inline, the sprite goes at half size to the left; docked, it sits on top and
157    // shrinks on a short terminal so the controls and the playlist stay in view.
158    const art = sprite && (
159      <PixelArt
160        Box={Box}
161        Text={Text}
162        sprite={sprite}
163        frame={isPlaying ? tick : 0}
164        maxColumns={inline ? 20 : width}
165        maxRows={inline ? 10 : e.props.scroll.bodyRows - CONTROL_ROWS - playlistRows(list.length)}
166      />
167    )
168    const controlsWidth = inline ? Math.max(20, width - 22) : width
169    const align = inline ? 'flex-start' : 'center'
170    const controls = (
171      <Box flexDirection="column" alignItems={align} flexGrow={1}>
172        <Text bold wrap="truncate">
173          {icon} {title}
174        </Text>
175        <Text wrap="truncate">
176          <Text color="cyan">{progressBar(p.position, p.duration, Math.max(4, controlsWidth - 16))}</Text>{' '}
177          <Text dimColor>
178            {formatTime(p.position)}/{formatTime(p.duration)}
179          </Text>
180        </Text>
181        <Text color="magenta">{equalizer(tick, Math.min(controlsWidth, 24), isPlaying)}</Text>
182        {p.status === 'error' && p.message && (
183          <Text color="red" wrap="truncate">
184            {p.message}
185          </Text>
186        )}
187        <Box flexDirection="row" flexWrap="wrap" justifyContent={align} gap={1}>
188          <Button key="prev" hotkey="b" label="⏮" onPress={() => step($, -1)} />
189          <Button
190            key="play"
191            hotkey="p"
192            label={isPlaying ? '⏸' : '▶'}
193            onPress={() => (isPlaying ? pause($) : p.status === 'paused' ? resume($) : play($, p.index))}
194          />
195          <Button key="stop" hotkey="s" label="■" onPress={() => stop($)} />
196          <Button key="next" hotkey="n" label="⏭" onPress={() => step($, 1)} />
197        </Box>
198        <Box flexDirection="row" flexWrap="wrap" justifyContent={align} gap={1}>
199          <Button key="voldown" hotkey="d" label="vol-" dimColor onPress={() => setVolume($, vol - 10)} />
200          <Text dimColor>{vol}</Text>
201          <Button key="volup" hotkey="u" label="vol+" dimColor onPress={() => setVolume($, vol + 10)} />
202          {Select ? (
203            <Select
204              key="skin"
205              label="skin"
206              options={SKINS.map(s => ({ value: s.id }))}
207              value={sprite?.id}
208              onSelect={id => void cycleSkin($, id)}
209            />
210          ) : (
211            <Button key="skin" label={`skin: ${sprite?.id ?? '-'}`} dimColor onPress={() => cycleSkin($, '')} />
212          )}
213        </Box>
214      </Box>
215    )
216    const tracks = (
217      <Box flexDirection="column">
218        <Text dimColor>─ Playlist ({list.length}) ─</Text>
219        {list.length === 0 && <Text dimColor>Empty. /music add &lt;youtube link&gt;</Text>}
220        {/* One cell short of the edge: a wide character in the last column wraps on some terminals. */}
221        {list.map((track, i) => (
222          <Button
223            key={`t${i}`}
224            plain
225            dimColor={i !== p.index}
226            label={truncateToWidth(`${i === p.index ? '▸' : ' '} ${i + 1}. ${trackLabel(track, titles)}`, width - 1)}
227            onPress={() => play($, i)}
228          />
229        ))}
230      </Box>
231    )
232
233    if (inline) {
234      return (
235        <Box flexDirection="column">
236          <Box flexDirection="row" gap={2}>
237            {art}
238            {controls}
239          </Box>
240          <Text> </Text>
241          {tracks}
242        </Box>
243      )
244    }
245    return (
246      <Box flexDirection="column">
247        {art}
248        <Text> </Text>
249        {controls}
250        <Text> </Text>
251        {tracks}
252      </Box>
253    )
254  })
255
256  on('session.end', async ($, e, next) => {
257    if (e.reason === 'clear') {
258      // /clear goes on under a new session whose state starts empty, and no
259      // session.start fires for it: keep the music and carry the state over
260      // once the new session is in place (a write before then is wiped).
261      const carried = await read($, player)
262      const ended = await next(e)
263      carryOver($, e.sessionId, carried, 0)
264      return ended
265    }
266    await stop($)
267    if (socket) await $.process.run(['/bin/rm', '-f', socket]).catch(() => undefined)
268    return next(e)
269  })
270}
271
272/** Refills the state once the session after a /clear has taken over; retries for about 5 s. */
273function carryOver($: $, endedId: string, carried: Player, tries: number): void {
274  $.clock.after(tries === 0 ? 50 : 200, () => {
275    void (async () => {
276      const id = await $.session.id().catch(() => endedId)
277      if (id === endedId && tries < 25) return carryOver($, endedId, carried, tries + 1)
278      await restoreState($)
279      // A running track reports its own progress; a stopped one is put back as it was.
280      const now = await read($, player)
281      if (now.status === 'stopped' && now.title === '' && now.index === 0) await update($, player, () => carried)
282    })()
283  })
284}
285
286/** Fills the session's state from what is kept across sessions: titles, skin, volume, playlist. */
287async function restoreState($: $): Promise<void> {
288  titles = ((await $.store.get('titles')) as Record<string, string> | undefined) ?? {}
289  const savedSkin = await $.store.get('skin')
290  if (typeof savedSkin === 'string' && SKINS.some(s => s.id === savedSkin)) await update($, skin, () => savedSkin)
291  const savedVolume = await $.store.get('volume')
292  if (typeof savedVolume === 'number') await update($, volume, () => savedVolume)
293  await loadPlaylist($).catch(() => undefined)
294}
295
296// Asks for a dock sized to the terminal, and a short block when it sits inline above the prompt.
297async function openPane($: $, terminalColumns: number): Promise<void> {
298  await $.ui.open({ id: PANE, title: '♪ Pixel Player', columns: dockColumns(terminalColumns), rows: INLINE_ROWS })
299}
300
301// Kept outside the plugin folder: an installed plugin's folder is a copy that an update replaces.
302async function playlistPath($: $): Promise<string> {
303  const home = (await $.env.get('HOME')) ?? ''
304  const path = `${home}/.claude/pixel-play/playlist.txt`
305  if (!(await $.fs.exists(path))) {
306    const legacy = `${$.plugin.root}/playlist.txt`
307    const start = (await $.fs.exists(legacy))
308      ? await $.fs.read(legacy)
309      : '# One track per line: a YouTube link, a direct audio URL, or a local file path.\n' +
310        '# Anything after " # " on a line is a title shown until the real one loads.\n'
311    await $.fs.write(path, start)
312  }
313  return path
314}
315
316async function loadPlaylist($: $): Promise<Track[]> {
317  const path = await playlistPath($)
318  const list = (await $.fs.exists(path)) ? parsePlaylist(await $.fs.read(path)) : []
319  await update($, playlist, () => list)
320  return list
321}
322
323function emptyPlaylist(): string {
324  return 'The playlist is empty. Add a line with /music add <youtube link>, or edit ~/.claude/pixel-play/playlist.txt'
325}
326
327async function which($: $, name: string): Promise<string | undefined> {
328  for (const dir of ['/opt/homebrew/bin', '/usr/local/bin', '/usr/bin']) {
329    if (await $.fs.exists(`${dir}/${name}`)) return `${dir}/${name}`
330  }
331  return undefined
332}
333
334async function play($: $, index: number): Promise<void> {
335  const list = await read($, playlist)
336  const track = list[index]
337  if (!track) return
338  await halt()
339  const mine = ++generation
340
341  const mpv = await which($, 'mpv')
342  if (!mpv) {
343    await update($, player, () => failed(index, 'mpv not found: brew install mpv yt-dlp'))
344    return
345  }
346  const ytdlp = await which($, 'yt-dlp')
347  socket = await socketPath($)
348  const vol = await read($, volume)
349  await update($, player, () => ({ status: 'loading', index, title: trackLabel(track, titles), position: -1, duration: -1 }))
350  startTicker($)
351
352  const argv = [
353    mpv,
354    '--no-video',
355    '--really-quiet',
356    `--volume=${vol}`,
357    `--script=${$.plugin.root}/mpv/progress.lua`,
358    `--input-ipc-server=${socket}`,
359    '--ytdl-format=bestaudio/best',
360    ...(ytdlp ? [`--script-opts=ytdl_hook-ytdl_path=${ytdlp}`] : []),
361    track.url,
362  ]
363  const child = $.process.spawn({ argv })
364  stream = child
365  let errors = ''
366  let code: number | null = null
367  try {
368    for await (const chunk of child) {
369      if (mine !== generation) break
370      if (chunk.stream === 'stderr') {
371        errors = (errors + chunk.text).slice(-400)
372        continue
373      }
374      const progress = parseProgress(chunk.text)
375      if (!progress) continue
376      if (progress.title && !progress.title.startsWith('watch?') && titles[track.url] !== progress.title) {
377        titles = { ...titles, [track.url]: progress.title }
378        await $.store.set('titles', titles)
379      }
380      await update($, player, () => ({
381        status: progress.paused ? 'paused' : 'playing',
382        index,
383        title: titles[track.url] ?? progress.title,
384        position: progress.position,
385        duration: progress.duration,
386      }))
387    }
388    if (mine === generation) code = (await child.result).code
389  } catch (err) {
390    if (mine === generation) {
391      await update($, player, () => failed(index, String(err).slice(0, 200)))
392      endTicker()
393    }
394    return
395  }
396  if (mine !== generation) return
397  stream = undefined
398
399  if (code === 0) {
400    // Finished on its own: on to the next track, wrapping around.
401    void play($, (index + 1) % list.length)
402    return
403  }
404  const message = errors.trim().split('\n').pop() || `mpv exited with ${code}`
405  await update($, player, () => failed(index, message))
406  endTicker()
407}
408
409/** Ends the child, if any, without touching the state. */
410async function halt(): Promise<void> {
411  generation++
412  const s = stream
413  stream = undefined
414  await s?.return(undefined).catch(() => undefined)
415}
416
417async function stop($: $): Promise<void> {
418  await halt()
419  const p = await read($, player)
420  await update($, player, () => ({ ...STOPPED, index: p.index, title: p.title }))
421  endTicker()
422}
423
424// Short enough for a Unix socket path (104 bytes on macOS).
425async function socketPath($: $): Promise<string> {
426  const tmp = ((await $.env.get('TMPDIR')) || '/tmp').replace(/\/+$/, '')
427  return `${tmp}/pixel-play-${SOCKET_ID}.sock`
428}
429
430/** Sends commands to the running mpv over its IPC socket; true when it took them. */
431async function mpvCommand($: $, ...commands: unknown[][]): Promise<boolean> {
432  if (!socket || !stream) return false
433  const result = await $.process
434    .run(['/usr/bin/nc', '-U', socket], { stdin: commands.map(c => ipcCommand(...c)).join(''), timeoutMs: 3000 })
435    .catch(() => undefined)
436  return result?.exitCode === 0 && ipcSucceeded(result.stdout)
437}
438
439async function pause($: $): Promise<string> {
440  const p = await read($, player)
441  if (p.status !== 'playing') return p.status === 'paused' ? 'Already paused.' : 'Nothing is playing.'
442  if (!(await mpvCommand($, ['set_property', 'pause', true]))) return 'Could not reach mpv to pause.'
443  await update($, player, q => ({ ...q, status: 'paused' }))
444  endTicker()
445  return `Paused at ${formatTime(p.position)}.`
446}
447
448async function resume($: $): Promise<string> {
449  const p = await read($, player)
450  if (p.status !== 'paused') return 'Nothing is paused.'
451  if (!(await mpvCommand($, ['set_property', 'pause', false]))) return 'Could not reach mpv to resume.'
452  await update($, player, q => ({ ...q, status: 'playing' }))
453  startTicker($)
454  return 'Resumed.'
455}
456
457async function step($: $, delta: number): Promise<string> {
458  const list = await read($, playlist)
459  if (list.length === 0) return emptyPlaylist()
460  const p = await read($, player)
461  const n = (p.index + delta + list.length) % list.length
462  void play($, n)
463  return `Track ${n + 1}: ${trackLabel(list[n], titles)}`
464}
465
466async function cycleSkin($: $, name: string): Promise<string | undefined> {
467  const current = await read($, skin)
468  const byNumber = /^\d+$/.test(name) ? SKINS[Number(name) - 1] : undefined
469  const target = name
470    ? (byNumber ?? SKINS.find(s => s.id === name || s.id.includes(name)))
471    : SKINS[(SKINS.findIndex(s => s.id === current) + 1) % SKINS.length]
472  if (!target) return undefined
473  await update($, skin, () => target.id)
474  await $.store.set('skin', target.id)
475  return target.id
476}
477
478async function setVolume($: $, v: number): Promise<void> {
479  const clamped = Math.round(Math.max(0, Math.min(100, v)))
480  await update($, volume, () => clamped)
481  await $.store.set('volume', clamped)
482}
483
484function startTicker($: $): void {
485  if (ticker) return
486  ticker = $.clock.every(FRAME_MS, () => update($, frame, n => (n + 1) % 1_000_000))
487}
488
489function endTicker(): void {
490  ticker?.cancel()
491  ticker = undefined
492}
493
hooks/pixel.tsx 142 lines
1// Draws a sprite with half blocks: one cell holds two pixels, the top one as
2// the glyph's color and the bottom one as its background.
3
4import type { Elements } from 'claude-code'
5
6import { ALPHABET, SKINS } from './skins.gen'
7
8export type Sprite = {
9  id: string
10  width: number
11  height: number
12  palette: string[]
13  // One char per pixel, row by row; '.' is transparent.
14  frames: string[]
15}
16
17type Cell = { glyph: string; color?: string; backgroundColor?: string }
18
19const decode = new Map([...ALPHABET].map((ch, i) => [ch, i]))
20
21function pixel(sprite: Sprite, frame: string, x: number, y: number): string | undefined {
22  if (x < 0 || y < 0 || x >= sprite.width || y >= sprite.height) return undefined
23  const k = decode.get(frame[y * sprite.width + x] ?? '.')
24  return k === undefined ? undefined : sprite.palette[k]
25}
26
27function cell(top?: string, bottom?: string): Cell {
28  if (!top && !bottom) return { glyph: ' ' }
29  if (!top) return { glyph: '▄', color: bottom }
30  if (!bottom) return { glyph: '▀', color: top }
31  if (top === bottom) return { glyph: '█', color: top }
32  return { glyph: '▀', color: top, backgroundColor: bottom }
33}
34
35// The opaque bounding box across every frame, so empty margins are dropped.
36type Bounds = { x0: number; y0: number; x1: number; y1: number }
37const boxes = new Map<string, Bounds>()
38function boxOf(sprite: Sprite): Bounds {
39  const known = boxes.get(sprite.id)
40  if (known) return known
41  let [x0, y0, x1, y1] = [sprite.width, sprite.height, -1, -1]
42  for (const frame of sprite.frames) {
43    for (let y = 0; y < sprite.height; y++) {
44      for (let x = 0; x < sprite.width; x++) {
45        if (frame[y * sprite.width + x] === '.') continue
46        x0 = Math.min(x0, x)
47        y0 = Math.min(y0, y)
48        x1 = Math.max(x1, x)
49        y1 = Math.max(y1, y)
50      }
51    }
52  }
53  const box = x1 < 0 ? { x0: 0, y0: 0, x1: sprite.width - 1, y1: sprite.height - 1 } : { x0, y0, x1, y1 }
54  boxes.set(sprite.id, box)
55  return box
56}
57
58/**
59 * Pixels per side of the square every skin is fitted into at most, so switching
60 * never resizes the pane; kept small so the playlist has room under it.
61 */
62export const ART_SIZE = 24
63/** The smallest square, however little room there is. */
64const MIN_ART_SIZE = 8
65
66// The widest and tallest box among the skins: every skin is scaled by what fits
67// these into the square, so pixels come out the same size and skins keep the
68// size they were drawn at relative to each other.
69let largest: { w: number; h: number } | undefined
70function largestOf(sprite: Sprite) {
71  largest ??= SKINS.map(boxOf).reduce((m, b) => ({ w: Math.max(m.w, b.x1 - b.x0 + 1), h: Math.max(m.h, b.y1 - b.y0 + 1) }), { w: 1, h: 1 })
72  const box = boxOf(sprite)
73  return { w: Math.max(largest.w, box.x1 - box.x0 + 1), h: Math.max(largest.h, box.y1 - box.y0 + 1) }
74}
75
76/** Cell rows for one frame, each row as runs of identical cells. */
77export function rasterize(sprite: Sprite, frameIndex: number, maxColumns: number, maxRows = Infinity) {
78  const frame = sprite.frames[frameIndex % sprite.frames.length] ?? ''
79  const box = boxOf(sprite)
80  const w = box.x1 - box.x0 + 1
81  const h = box.y1 - box.y0 + 1
82  // The largest even square that fits the room given (two pixels per row).
83  const room = Math.min(ART_SIZE, maxColumns, maxRows * 2)
84  const size = Math.max(MIN_ART_SIZE, room - (room % 2))
85  // One scale for every skin (never enlarging), nearest neighbour, centred in the square.
86  const big = largestOf(sprite)
87  const scale = Math.min(1, size / big.w, size / big.h)
88  const outW = Math.max(1, Math.round(w * scale))
89  const outH = Math.max(1, Math.round(h * scale))
90  const left = Math.floor((size - outW) / 2)
91  const top = Math.floor((size - outH) / 2)
92  const at = (cx: number, cy: number) => {
93    const ox = cx - left
94    const oy = cy - top
95    if (ox < 0 || oy < 0 || ox >= outW || oy >= outH) return undefined
96    return pixel(sprite, frame, box.x0 + Math.floor((ox * w) / outW), box.y0 + Math.floor((oy * h) / outH))
97  }
98  const rows: Array<Array<Cell & { text: string }>> = []
99  for (let cy = 0; cy < size; cy += 2) {
100    const runs: Array<Cell & { text: string }> = []
101    for (let cx = 0; cx < size; cx++) {
102      const c = cell(at(cx, cy), at(cx, cy + 1))
103      const last = runs[runs.length - 1]
104      if (last && last.color === c.color && last.backgroundColor === c.backgroundColor && last.glyph === c.glyph) {
105        last.text += c.glyph
106      } else {
107        runs.push({ ...c, text: c.glyph })
108      }
109    }
110    rows.push(runs)
111  }
112  return rows
113}
114
115export function PixelArt(props: {
116  Text: Elements['terminal']['Text']
117  Box: Elements['terminal']['Box']
118  sprite: Sprite
119  frame: number
120  maxColumns: number
121  maxRows?: number
122}) {
123  const { Text, Box, sprite, frame, maxColumns, maxRows } = props
124  return (
125    <Box flexDirection="column" alignItems="center" flexShrink={0}>
126      {rasterize(sprite, frame, maxColumns, maxRows).map(runs => (
127        <Text wrap="truncate">
128          {runs.map(run =>
129            run.color ? (
130              <Text color={run.color} backgroundColor={run.backgroundColor}>
131                {run.text}
132              </Text>
133            ) : (
134              run.text
135            ),
136          )}
137        </Text>
138      ))}
139    </Box>
140  )
141}
142
hooks/player.ts 131 lines
1import type { Track } from '../types'
2
3/** Reads playlist.txt: one track per line, `#` lines skipped, ` # title` optional. */
4export function parsePlaylist(text: string): Track[] {
5  const tracks: Track[] = []
6  for (const raw of text.split(/\r?\n/)) {
7    const line = raw.trim()
8    if (!line || line.startsWith('#')) continue
9    const cut = line.indexOf(' # ')
10    const url = (cut < 0 ? line : line.slice(0, cut)).trim()
11    const title = cut < 0 ? undefined : line.slice(cut + 3).trim() || undefined
12    tracks.push(title ? { url, title } : { url })
13  }
14  return tracks
15}
16
17export type Progress = { position: number; duration: number; paused: boolean; title: string }
18
19/** Pulls the last `@@pos|<pos>|<dur>|<paused 0/1>|<title>` line that mpv/progress.lua wrote. */
20export function parseProgress(chunk: string): Progress | undefined {
21  let found: Progress | undefined
22  for (const line of chunk.split('\n')) {
23    const m = /^@@pos\|(-?[\d.]+)\|(-?[\d.]+)\|([01])\|(.*)$/.exec(line.trim())
24    if (m) found = { position: Number(m[1]), duration: Number(m[2]), paused: m[3] === '1', title: m[4] ?? '' }
25  }
26  return found
27}
28
29/** One line of mpv's JSON IPC protocol. */
30export function ipcCommand(...command: unknown[]): string {
31  return `${JSON.stringify({ command })}\n`
32}
33
34/** Whether mpv answered every command it was sent with success. */
35export function ipcSucceeded(reply: string): boolean {
36  const lines = reply.split('\n').filter(l => l.includes('"error"'))
37  return lines.length > 0 && lines.every(l => l.includes('"error":"success"'))
38}
39
40/** The dock width to ask for: a share of the terminal, room for a full-size sprite on wide ones. */
41export function dockColumns(terminalColumns: number): number {
42  return Math.max(30, Math.min(44, Math.round(terminalColumns * 0.3)))
43}
44
45export function formatTime(seconds: number): string {
46  if (!(seconds >= 0)) return '--:--'
47  const s = Math.floor(seconds)
48  const h = Math.floor(s / 3600)
49  const mm = String(Math.floor((s % 3600) / 60)).padStart(2, '0')
50  const ss = String(s % 60).padStart(2, '0')
51  return h > 0 ? `${h}:${mm}:${ss}` : `${mm}:${ss}`
52}
53
54export function progressBar(position: number, duration: number, width: number): string {
55  const cells = Math.max(4, width)
56  if (!(duration > 0)) return '░'.repeat(cells)
57  const filled = Math.min(cells, Math.round((position / duration) * cells))
58  return '█'.repeat(filled) + '░'.repeat(cells - filled)
59}
60
61const BARS = '▁▂▃▄▅▆▇█'
62
63/** A made-up equalizer: there are no samples to analyse, only a beat to fake. */
64export function equalizer(tick: number, width: number, isPlaying: boolean): string {
65  let s = ''
66  for (let i = 0; i < width; i++) {
67    if (!isPlaying) {
68      s += BARS[0]
69      continue
70    }
71    const v = Math.sin(tick * 0.9 + i * 1.7) + Math.sin(tick * 0.37 + i * 0.6) + Math.sin(i * 3.1 + tick * 1.3)
72    s += BARS[Math.max(0, Math.min(7, Math.round(((v + 3) / 6) * 7)))]
73  }
74  return s
75}
76
77// East Asian wide and fullwidth ranges, plus emoji: each takes two terminal cells.
78const WIDE: Array<[number, number]> = [
79  [0x1100, 0x115f],
80  [0x2e80, 0x303e],
81  [0x3041, 0x33ff],
82  [0x3400, 0x4dbf],
83  [0x4e00, 0x9fff],
84  [0xa000, 0xa4cf],
85  [0xac00, 0xd7a3],
86  [0xf900, 0xfaff],
87  [0xfe30, 0xfe4f],
88  [0xff00, 0xff60],
89  [0xffe0, 0xffe6],
90  [0x1f300, 0x1f64f],
91  [0x1f900, 0x1f9ff],
92  [0x20000, 0x3fffd],
93]
94
95function charWidth(ch: string): number {
96  const code = ch.codePointAt(0) ?? 0
97  return WIDE.some(([lo, hi]) => code >= lo && code <= hi) ? 2 : 1
98}
99
100/** How many terminal cells the text takes. */
101export function displayWidth(text: string): number {
102  let w = 0
103  for (const ch of text) w += charWidth(ch)
104  return w
105}
106
107/** Cuts the text to at most `width` cells, ending in … when cut. */
108export function truncateToWidth(text: string, width: number): string {
109  if (displayWidth(text) <= width) return text
110  let out = ''
111  let w = 0
112  for (const ch of text) {
113    const cw = charWidth(ch)
114    if (w + cw > width - 1) break
115    out += ch
116    w += cw
117  }
118  return `${out}…`
119}
120
121export function trackLabel(track: Track | undefined, titles: Record<string, string>): string {
122  if (!track) return ''
123  return titles[track.url] ?? track.title ?? shortUrl(track.url)
124}
125
126function shortUrl(url: string): string {
127  const id = /[?&]v=([\w-]+)/.exec(url)?.[1] ?? /youtu\.be\/([\w-]+)/.exec(url)?.[1]
128  if (id) return `youtube ${id}`
129  return url.split('/').filter(Boolean).pop() ?? url
130}
131
hooks/skins.gen.ts 561 lines
1// Generated by scripts/png2sprite.mjs from assets/. Do not edit by hand.
2import type { Sprite } from './pixel'
3
4export const ALPHABET = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!#$%&()*+,-/:;<=>?@[]^_{|}~"
5
6export const SKINS: readonly Sprite[] = [
7 {
8  "id": "vinyl",
9  "width": 40,
10  "height": 40,
11  "palette": [
12   "#805443",
13   "#e0a588",
14   "#353142",
15   "#573235",
16   "#a1674f",
17   "#272435",
18   "#322329",
19   "#1c1a29",
20   "#6c463a",
21   "#bbb6c2",
22   "#7c80c5",
23   "#7d7885",
24   "#908b9a",
25   "#5f5e72",
26   "#bc856b",
27   "#484357",
28   "#e3e8ee",
29   "#cf625f",
30   "#ea5454",
31   "#a23436",
32   "#6c2030",
33   "#cfccdc",
34   "#a09aa5",
35   "#ecc2c1",
36   "#ddb3b7",
37   "#d2acae",
38   "#8e3a3a",
39   "#6a6a7c",
40   "#c7c4cd",
41   "#eef5f8",
42   "#6d6d6d",
43   "#9299ae",
44   "#eaced7"
45  ],
46  "frames": [
47   ".....................................................................................................................................................................................................................................................011111111111111111111111121113..........144054444444000444444444625748..........1449a6444422bcc222444445d75523..........e02cff36d2777777776344f5gd7733..........1445f6ff5757777777773075cd7643..........144433f22257777777777652df7733..........e4443gcc2257777777777775777733..........e4449cccd2277777777777d6225783..........144dfccccf27777777777776222883..........1422fdcccf7777777777775d688043..........14252fdcd77hiihj777777b7644443..........1425222ff7hiiiiij7777757784443..........e025222277iiijiii7777d77784043..........1425222277iiig8ii77ffff7784443..........1425222277iiijiii77ff7f7784443..........1427722577jiiiiij75cd5f7784443..........14377777777kiiij77c25ff2744443..........144977777777777772c97bf2644443..........1447777777777777227f5bf5044443..........e000b777777777777gd7cb98888883..........14440c7777777777bf755928444403..........144646777777777d25559684444443..........1461h03777777772f57d7223333343..........14hij7406dd777772f7881i111e303..........1430064488722222578844jk4df303..........144738444448888884444088888003..........e00000000000000000000000000003..........333333333333333333333333333333...........75555..................5557...............................................................................................................................................................................................................",
48   ".....................................................................................................................................................................................................................................................011111111111111111111111121113..........144054444444000444444444625748..........1449l6444422mcc222444445d75523..........e02cff36d2777777776344f5gd7733..........1445f6ff5757777777773075cd7643..........144433f22257777777777652df7733..........e4443gcc2257777777777775777733..........e4449cccd2277777777777d6225783..........144dfccccf27777777777776222883..........1422fdcccf7777777777775b688043..........14252fdcd77nnnno777777b7644443..........1425222ff7nnnnnnp7777757784443..........e025222277nnnjnnn7777d77784043..........1425222277nnqgjnn77ffff7784443..........1425222577nnnjnnn77ff7f7784443..........1427722777pnnnnnp75cd5f7784443..........14377777777nnnnn77c25ff2744443..........144c77777777777772c97bf2644443..........1447777777777777227f5bf5044443..........e0009777777777777gd7cb98888883..........14440r7777777777bf755928444403..........144646777777777d25559684444443..........1461h03777777772f5797223333343..........14hij7406s9777772f7881i111e303..........1430064488722222578844jk4df303..........144738444448888884444088888003..........e00000000000000000000000000003..........333333333333333333333333333333...........75555..................5557...............................................................................................................................................................................................................",
49   ".....................................................................................................................................................................................................................................................011111111111111111111111121113..........144054444444000444444444625748..........1449t6444422222220444445d75523..........e02cff36d2777777776344f5gd7733..........1445f6ff5757777777773075cd7643..........14443sf22257777777777652df7733..........e4443ccc2257777777777775777733..........e4449cccd227777777777776225783..........144dfccccf27777777777776222883..........1422fdcccf77777777777757688043..........14252fdcd77ttttt777777b7644443..........1425222ff7ttttttt7777757784443..........e025222277ttttttt7777d77784043..........1425222277ttutttt77ffff7784443..........1425222577ttttttt77ff7f7784443..........1427722777ttttttt75cd5f7784443..........14377777777ttttt77cb5ff2744443..........144777777777777772c97bf2044443..........1447777777777777227f5bf5044443..........e0007777777777777gd7cbd8888883..........1444077777777777bf755928444403..........144648777777777d25557684444443..........1461h03777777772f5757223333343..........14hij740677777772f7881i111e303..........1430064488722222578844jk4df303..........144738444448888884444088888003..........e00000000000000000000000000003..........333333333333333333333333333333...........75555..................5557...............................................................................................................................................................................................................",
50   ".....................................................................................................................................................................................................................................................011111111111111111111111121113..........144054444444000444444444625748..........1449t6444422222220444445d75523..........e02cff36d2777777776344f5gd7733..........1445f6ff5757777777773075cd7643..........14443sf22257777777777652df7733..........e4443ccc2257777777777775777733..........e4449cccd227777777777776225783..........144dfccccf27777777777776222883..........1422fdcccf77777777777757688043..........14252fdcd77vwwwc777777b7644443..........1425222ff7cwwwwwc7777757784443..........e025222277wwwjwww7777d77784043..........1425222277wwqtjww77ffff7784443..........1425222777wwwjwww77ff7f7784443..........1427777777vwwwwwv75cd5f7784443..........14377777777vwwwc77cb5ff2744443..........144777777777777772c97bf2044443..........1447777777777777227f5bt5044443..........e0007777777777777gd7cbg8888883..........1444077777777777bf755928444403..........144648777777777d25557684444443..........1461h03777777772f5757223333343..........14hij740677777772f7881i111e303..........1430064488722222578844jk4df303..........144738444448888884444088888003..........e00000000000000000000000000003..........333333333333333333333333333333...........75555..................5557...............................................................................................................................................................................................................",
51   ".....................................................................................................................................................................................................................................................011111111111111111111111121113..........144054444444000444444444625748..........1449t6444422222220444445d75523..........e02cff36d2777777776344f5gd7733..........1445f6ff5757777777773075cd7643..........144433f22257777777777652df7733..........e4443gcc2257777777777775777733..........e4449cccd227777777777776225783..........144dfccccf27777777777776222883..........1422fdcccf77777777777757688043..........14252fdcd777hhh7777777b7644443..........1425222ff77hiiih77777757784443..........e025222277hiiiiih7777d77784043..........1425222277hiitiih77ffff7784443..........1425222277hiiiiih77ff7f7784443..........14272227777iiiii775cd5f7784443..........143777777777iii777cb5ff2744443..........144777777777777772c97bf2044443..........1447777777777777227f5bt5044443..........e0007777777777777gd7cbg8888883..........1444077777777777bf755928444403..........144648777777777d25557684444443..........1461h03777777772f5757223333343..........14hij740677777772f7881i111e303..........1430064488722222578844jk4df303..........144738444448888884444088888003..........e00000000000000000000000000003..........333333333333333333333333333333...........75555..................5557..............................................................................................................................................................................................................."
52  ]
53 },
54 {
55  "id": "headphone-kid",
56  "width": 40,
57  "height": 40,
58  "palette": [
59   "#2c2234",
60   "#3d3444",
61   "#271f31",
62   "#603d47",
63   "#77574f",
64   "#fadcb6",
65   "#332733",
66   "#dea090",
67   "#cf8d7f",
68   "#9b4740",
69   "#eead1d",
70   "#b65e45",
71   "#8c8486",
72   "#cf7639",
73   "#d8d8d7",
74   "#a9a5a5",
75   "#b18e88",
76   "#cec6be",
77   "#c2bcb6",
78   "#faf2e2",
79   "#f0cbad",
80   "#a16766"
81  ],
82  "frames": [
83   "................................................................................................00000000..............................000111111220...........................01110000021110.........................0122233333322210.......................012233333333332210.....................01223334444433332210....................21234444444444333212...................0123344444444443333212..................2123334444444323333210..................2123333323423322333210..................2223323323303252323222.................223232223232005550032322................123230652565055555032321...............01232255555555555555223212..............21232355665555556055303210..............21232076556555505567023210...............003228755555555557722322.................0322077555555557702232...................02.17775599557770.22........................022855558200...........................60992222229900.........................6a922b0cc0b22ba6......................66abb0da0ee0ad0bba00...................6550b20da0ff0ad00b0556..................0780009ad6ee6da9000870...................000.09da6aa6ad92.000........................0baa0000aab2............................000a0ff6a030.............................2100221210..............................2112222110..............................0111221110..............................0212222100..............................0862222080.............................6fcfg22gfcf0............................0feg0000gef0.............................000....000...............................................................................................",
84   "........................................................................................................................................00000000..............................000111111220...........................01110000021110.........................0122233333322110.......................012233333333332210.....................01223334444433332210....................21234444444444333212...................0123344444444443333212..................2123334444444323333210..................2123323323423322333210..................2223323323303252323222.................223232223232005550032322................123230622565055555032321...............01232255555555555555223212..............21232355005555550055303210..............21232070000555500007023210...............003228755555555557722322.................0322277555555557722232...................02.00775599557722.22........................022855558220...........................02992222229902.........................2a922b0cc0b22ba0......................00abb0da0ee0ad0bba22...................6550b20da0ff0ad00b0556..................0780209ad6ee6da9220870...................022.09da6aa6ad92.220........................0baa0000aab0............................000002262000.............................2112222110..............................0111221110..............................0212222100..............................0862222080.............................6fcfg22gfcf0............................0feg0000gef0.............................000....000...............................................................................................",
85   "........................................................................................................................................00000000..............................000111111220...........................01110000021110.........................0122233333322110.......................012233333333332210.....................01223334444433332210....................21234444444444333212...................0123344444444443333212..................2123334444444323333210..................2123323323423322333210..................2223323323303252323222.................223232223232000550032322................123232522565055555232321...............01232250065555510005223212..............2123235h0065555000i5303210..............2123207jj06555566jj7623210...............003228755555555577722322.................0322277555995557722232...................22.02775555557722.22.........................2285555822.............................099222222990...........................0a22b0cc0b22a0.........................0ab0da0cc0ad0ba0.......................00ab0da0ee6ad0ba00.....................655229ad6aa6da922556....................078229da0000ad922870.....................0020baa0ff6aab0200.........................000002212000.............................2112222110..............................0111221110..............................0212222100..............................0862222080.............................6fcfg22gfcf0............................0feg0000gef0.............................000....000...............................................................................................",
86   "................................................................................................00000000..............................000111111220...........................01110000021110.........................0122333333322210.......................012233333333332210.....................01223444444443332210....................21234444444444333212...................0123334444444323333212..................2123323323433322333210..................2123323323233252223210..................2222352250223255203222.................223232555552505555232322................123220000555555000032321...............0123232h0005555022i2223212..............212323kjj06555566jj2323210..............21232077555555555577023210...............00322l775559955577722322.................0322277755555577722232...................22.22278555588220.22.........................2222222222.............................09922cc22990...........................2a22b0cc0b22a0..........................2b0da0ee0ad0b2.........................0ab0da0ff0ad0ba0.......................00a29ad6ee6da92a00......................05029da6aa6aa90052......................0572baa0000adb2770.......................0822aa0ff6aab070.........................20200022120000............................2112222110..............................0111221110..............................0212222100..............................0862222080.............................6fcfg22gfcf0............................0feg0000gef0.............................000....000...............................................................................................",
87   "..............................................................................................000000000000...........................01111111111110.........................0122233333322210.......................012233333333332210.....................01223334444433332210....................21234444444444333212...................0123344444444323333212..................2123333323443322333210..................2123323323233252223210..................2222222323223255203222.................223232522505505555232322................123232066555556600522321...............0123225h0j655556j0h5203210..............2123235j1065555666j5303210...............003207755555555557732322.................2320777555995557770232..................2322777555555557772232...................22227775555557772222........................227855558822.............................2222222222.............................69922cc22996...........................0a22b0cc0b22a0..........................bb0da0ee0ad0bb.........................0ab0da0ff0ad0ba0........................0a29ad6ee6da90a0........................0029da6aa6ad90000.......................052baa0000aab2750........................0200a0ff6a02200...........................2100221212..............................2112222110..............................0111221110..............................0212222100..............................0862222080.............................6fcfg22gfcf0............................0feg0000gef0.............................000....000..............................................................................................."
88  ]
89 },
90 {
91  "id": "cat",
92  "width": 40,
93  "height": 40,
94  "palette": [
95   "#5a2a27",
96   "#fad697",
97   "#f09f49",
98   "#562623",
99   "#612f2a",
100   "#fccc77",
101   "#c36f29",
102   "#25221f",
103   "#292825",
104   "#e4883b",
105   "#dc8239",
106   "#585860",
107   "#b4631e",
108   "#fdbd5f",
109   "#4e4e56",
110   "#3d3d45",
111   "#3a373a",
112   "#46464e",
113   "#eb8b40",
114   "#d07832",
115   "#2a2218",
116   "#fdfefd",
117   "#6a696e",
118   "#a1561c",
119   "#84411f",
120   "#a7a5a5",
121   "#974725"
122  ],
123  "frames": [
124   "...................................................................................................................................................................................................................00.....................................0123...........403......................31563.77888..009a3......................01167bb8b8887c2d13......................3267efg6666e771113.......................c7bh66iiiij687dj3.......................7hh6iiiiiiij67h3.......................8bhj9iiiiiiii6ch8.......................8b6j77iiiiikiic78......................7e7c7l7iiiillkic7h8....................8hh7c777iiii88797hme8...................8mb7cc7a911ia7ii7hmm8...................7hf7cii111k11iii7hhh8....................8h8c211111111197hhh8.....................8831111kk111117hf8........................02111111111j778..........................03jj111jj33.............................066jdddj663............................066a511156660...........................0iii11111iij63..........................0iii11111iii60.......0..................0iii11111iiii0.....0060.................3iii9111iii900.....0ccc0...............3c3ii9910iii0ii0.....3cc3...............3c39i9060iii0ii3....066c0...............3cc3i90a0ii0ii634000aaj0................3cc3i90a0ii0ccc3999a330..................0c3990a0990ccc00000......................0099033993030.............................40...33..........................................................................................................................................................................................................................",
125   ".........................................................................................................................................................................................................................................................00.............4.......................0123..........00a4......................311a33.77888.3c9553.....................3d11637bbb8887c5123.....................3a19n8ehgg888h715j3......................3agehh66aai6687j3........................7bh66iiiiiij67h8.......................8eeb6iiiiiiii6ne8.......................8h66aiiiiiii9i678......................7h7n6779iiiii77a7h8....................8hhf7j7l7iiiikl797he8...................8mmf7i9ka911ia79i7hm8...................8hhf7iii111k11iii7hh8...................7hhf7i111111111197hh8....................8ff721111kk111117f8......................88.31111111111j77...........................03jj111jj33.............................0o6jdddj663............................066a511156660.......330.................0iii11111iia63......3663................0iii11111iii60.....36663................0iii1111iii900....36c63.................3iii9111iii0ii0...3j63.................3c3ii9910iii0ii3..3jj3..................3c39i9060ii0ii63009j6...................3cc3i90a0ii0icc3aa43.....................0c3990a0990ccc000........................0099033990030.............................40...33..........................................................................................................................................................................................................................",
126   ".......................................................................................................................................................................................................................................................................00........................03...........3i1.......................09933..77888.3c513......................3911a37bbb8887c513......................391117begg888h8153.......................3917bh66aai6688j3........................67bh66iiiiij6788........................7bh66iiiiiiij688.......................8hf669iiiiiiii688.......................77cc6777iiiii776h8.....................7hh77j777iiiik7767h8...................8hhmf7i977911ia79i7m8...................8mmmf7iii111k11iij7h8...................7hhhf7i1111111111j7h8....................7fhf711111kk1111k78......................88732111111111j78...........................03jj111jj33.............................066jdddj663......333...................066a511156660....3ccc3..................0iii11111iia63..3cccc3..................0iii11111iii60..0cc33...................0iii1111iii900..0cc.....................3iii9111iii0ii0.3c3....................3c3ii9910iii0ii33cc3....................3c39i9060ii0iii3cc3.....................3cc3i90a0ii0icc330.....................pp0c3990a0990ccc0pppp.................ppppp0099033990000pppppp.................pppppp40ppp33ppppppppp.................................................................................................................................................................................................................",
127   ".........................................................................................................................................................................................................................................................................300......................03333788888..009223....................0q2267ebbb8887725123....................31157bhggg667h7c11i3....................3117bh66aaii66877a3......................78bh66iiiiiij67h8.......................7fh666iiiiiiij6h8.......................77c6677iiiii7a678......................7hh7667l7iiiil767h8....................8hhmf7j777iiii7767he8...................8mmmf7i977911ia767hm8...................8hhmf7iii111k11ij7hh8...................7hhhf7i11111111167hh8....................8fhf711111kk11137f8......................8887211111111j778..........................03jj111jj33.............................066jdddj663............................066a511156660....3000...................0iii11111iij63...3ccc3..................0iii11111iii60..0ccc30..................0iii11111iiii0..3cc3....................3iii9111iii000...3c3...................3c3ii9910iii0ii0..3c3...................3c39i9060iii0ii303cc3...................3cc3i90a0ii0ii63ccc3.....................3c3i90a0ii0ccc3cc3......................3c3990a0990ccc003........................0099033990030.............................40...33..........................................................................................................................................................................................................................",
128   ".................................................................................................................................................................................................................................00.......................030...77888..00i9......................0ii9337bbb8887c2153.....................311167bhgg668h75113.....................311d7bh66aii6687dj3......................3j7bh66iiiiij6773.......................7gbh66iiiiiii66h8.......................7fh66777iiii776h8.......................77c66l77iiii7l77h8.....................7hh76jl77i11i7777he8...................8hhmf7i97711kia777hm8...................8mmmf7iii111111i67hh8...................7hhhf7i1111kk11167hh8....................7hhf711111kk11167f8......................8ff7911111111j778........................8883jj111jj33.............................066jdddj663.............................06a511156660...........................066i11111iij63..........................0iii11111iij63....333...................0iii11111iii60....3c3...................0iii9111iiiii0....3cc3..................3iii9910iii000....3cc3.................3c3ii9060iii0ii0...3cc3.................3c39i90a0ii0iii3..06cc3.................3cc3i90a0ii0ii630366c3...................3c3i90a0ii0ccc3666c3....................3c3990a0990ccc00333......................0099033993030.............................40...33.........................................................................................................................................................................................................................."
129  ]
130 },
131 {
132  "id": "cassette",
133  "width": 40,
134  "height": 40,
135  "palette": [
136   "#d4d1cd",
137   "#2f2f31",
138   "#313236",
139   "#37363a",
140   "#3a3a1a",
141   "#444658",
142   "#3c3b4a",
143   "#28282a",
144   "#403c3e",
145   "#201d0b",
146   "#f5e4c1",
147   "#21201f",
148   "#1e1c1c",
149   "#89878c",
150   "#e3dac1",
151   "#454446",
152   "#262125",
153   "#382129",
154   "#3c2929",
155   "#342021",
156   "#2a1b1e",
157   "#3d211f",
158   "#da6164",
159   "#282622",
160   "#875856",
161   "#e6605f",
162   "#70707b",
163   "#5b5c65",
164   "#fbfbfb",
165   "#171416",
166   "#5c3b3e",
167   "#b2b7b6",
168   "#555563",
169   "#434100",
170   "#faf81e",
171   "#644b4c",
172   "#736163",
173   "#7c7c84",
174   "#81454b"
175  ],
176  "frames": [
177   "...................................................................................................................................................................................................................................................................................................................................012122222211132122312221121111111.......3425666666666666666666666666635742......8913aaaaaaaaaaaaaaaaaaaaaaaaaa6298......85baaaaaaaaaaaaaaaaaaaaaaaaaaaa753......85caacdeeeeeeeeeeeeeeeeeeeeeeea753......f5gaaaaaaaaaaaaaaaaaaaaaaaaaaaa758......85gaaaaaaaaaaaaaaaaaaaaaaaaaaaa752......85hiiiiiijjjhghjhjhjhkjjhjiiiiii52......f5lmmmmm7b7c3fffff8132b77nommmmj53......f5lppppdd3fcccqqqqqqccbf3rdppppl53......85impmidnss1bbqqqqqqbb7sscdppmml53......f5lpppidbss7bbqqqqqqbbnsstdppppj53......85lppppudnqbbnqqqqqq7ccqbduppppj53......f5lppppmkkcckckkkkkkgckkkkpppppk53.....v3577777777777777777777777n7777775f0....t255555555555555555555555555555555rg....t355555533223222222322233323555555rb....tg555553rrrrrrrrwqqrrrrrrrww355555rb....t7555551wwwwwwwwwx6wwwwwwwwwf55555rb....t755557dwwwwwwwww99wwwwwwwwwd15555fg.....1b555cwwwww7rbwwwwww7f1wwwwq75539w......byb55bw1ncw7fcwwwwwwn87wcn1qg559yf......0b777b111c21177777777771b371n777b0...........................................................................................................................................................................................................................................................................................................................................................................",
178   "...................................................................................................................................................................................................................................................................................................................................012122222211132122312221121111111.......3425666666666666666666666666635742......8913aaaaaaaaaaaaaaaaaaaaaaaaaa6298......85baaaaaaaaaaaaaaaaaaaaaaaaaaaa753......85caaewtdeeeeeeeeeeeeeeeeeeeeea753......f5gaaaaaaaaaaaaaaaaaaaaaaaaaaaa758......85gaaaaaaaaaaaaaaaaaaaaaaaaaaaa752......85hiiiiiijjjhghjhjhjhkjjhjiiiiii52......f5lmmmmm7b7c3fffff8132b77nmmmmmj53......f5lppppzr3fcccqqqqqqccbf3rzppppl53......85impmpdnss1bbqqqqqqbb7sscdppmml53......f5lppppdbss7bbqqqqqqbbnsstdppppj53......85lppppArnqbbnqqqqqq7ccqbruppppj53......f5lppppmkkcckckkkkkkgckkkkpppppk53.....v3577777777777777777777777n7777775f0....t255555555555555555555555555555555rg....t355555533223222222322233323555555rb....tg555553rrrrrrrrwqqrrrrrrrww355555rb....t7555551wwwwwwwwwx6wwwwwwwwwf55555rb....t755557dwwwwwwwww99wwwwwwwwwd15555fw.....1b555cwwwww7rbwwwwww7f1wwwwq75539w......byb55bw1ncw7fcwwwwwwn87wcn1qg559yf......0b777b111c21177777777771b371n777b0...........................................................................................................................................................................................................................................................................................................................................................................",
179   "...................................................................................................................................................................................................................................................................................................................................012122222211132122312221121111111.......3425666666666666666666666666635742......8913aaaaaaaaaaaaaaaaaaaaaaaaaa6298......85baaaaaaaaaaaaaaaaaaaaaaaaaaaa753......85caaeeeeeeeeeeeeeeeeeeeeeeeeea753......f5gaaaaaaaaaaaaaaaaaaaaaaaaaaaa758......85gaaaaaaaaaaaaaaaaaaaaaaaaaaaa752......85hiiiiiijjjhgghjhjjhkjjjjjiiiii52......f5lmmmmg777c3ffff81332b77nnpmmmj53......f5lpppmg7BBbcccqqqqcccbffbbmpppl53......85impmpg3ssbbbbqqqqbbb7ss37mpmml53......f5lpppm72BBbbbbqqqqbbbbBs2gppppj53......85lpppmbbBqbbnqqqqqq7cbqBbbmpppj53......f5lpppmkkkcckckkkkkkgckkkkkppppk53.....v3577777777777777777777777nn777775f0....t255555555555555555555555555555555rg....t355555533223222222322233323555555rb....tg555553rrrrrrrrwqqrrrrrrrww355555rb....t7555551wwwwwwwwwx6wwwwwwwwwf55555rb....t755557dwwwwwwwww99wwwwwwwwwd15555f0.....1b555cwwwww7rbwwwwww7f1wwwwq75539w......byb55bw1ncw7fcwwwwwwn87wcn1qg559yf......0b777b111c21177777777771b371n777b0...........................................................................................................................................................................................................................................................................................................................................................................",
180   "...................................................................................................................................................................................................................................................................................................................................012122222211132122312221121111111.......3425666666666666666666666666635742......8913aaaaaaaaaaaaaaaaaaaaaaaaaa6298......85baaaaaaaaaaaaaaaaaaaaaaaaaaaa753......85caaeeeeeeeeeeeeeeeeeeeeeeeeea753......f5gaaaaaaaaaaaaaaaaaaaaaaaaaaaa758......85gaaaaaaaaaaaaaaaaaaaaaaaaaaaa752......85hiiiiiijjjhgghjhjjhkjjjjjiiiii52......f5lmmmmg777c3ffff81332b77nnpmmmj53......f5lpppmg7BBbcccqqqqcccbffbbmpppl53......85impmug3ssbbbbqqqqbbb7ss37Cpmml53......f5lpppp72BBbbbbqqqqbbbbBs2gppppj53......85lpppmbbBqbbnqqqqqq7cbqBbbmpppj53......f5lpppmpkkcckckkkkkkgckkkkpppppk53.....v3577777777777777777777777nn777775f0....t255555555555555555555555555555555rg....t355555533223222222322233323555555rb....tg555553rrrrrrrrwqqrrrrrrrww355555rb....t7555551wwwwwwwwwx6wwwwwwwwwf55555rb....t755557dwwwwwwwww99wwwwwwwwwd15555f0.....1b555cwwwww7rbwwwwww7f1wwwwq75539w......byb55bw1ncw7fcwwwwwwn87wcn1qg559yf......0b777b111c21177777777771b371n777b0...........................................................................................................................................................................................................................................................................................................................................................................",
181   "...................................................................................................................................................................................................................................................................................................................................012122222211132122312221121111111.......3425666666666666666666666666635742......8913aaaaaaaaaaaaaaaaaaaaaaaaaa6298......85baaaaaaaaaaaaaaaaaaaaaaaaaaaa753......85caaeeeeeeeeeeeeeeeeeeeeeeeeea753......f5gaaaaaaaaaaaaaaaaaaaaaaaaaaaa758......85gaaaaaaaaaaaaaaaaaaaaaaaaaaaa752......85hiiiiiijjjhghhhjhjjkjjjjjiiiii52......f5lmmmmg777c3fffff8132b77nnpmmmj53......f5lpppmg7BBbcrsssqqqccbffbbmpppl53......85impmmg3ssbbbsssqqqbb7ss37ppmml53......f5lppmp72sBbbbsssqqqbbbBs2gppppj53......85lpppmbbBqbbqsssqqqqcbqBbbmpppj53......f5lpppmkkkckckkkkkkkkckkkkkppppk53.....v3577777777777777777777777nn777775f0....t255555555555555555555555555555555rg....t355555533223222222322233323555555rb....tg555553rrrrrrrrwqqrrrrrrrww355555rb....t7555551wwwwwwwwwx6wwwwwwwwwf55555rb....t755557dwwwwwwwww99wwwwwwwwwd15555f0.....1b555cwwwww7rbwwwwww7f1wwwwq75539w......byb55bw1ncw7fcwwwwwwn87wcn1qg559yf......0b777b111c21177777777771b371n777b0..........................................................................................................................................................................................................................................................................................................................................................................."
182  ]
183 },
184 {
185  "id": "anime-girl",
186  "width": 40,
187  "height": 40,
188  "palette": [
189   "#211f34",
190   "#403952",
191   "#3b354e",
192   "#40616f",
193   "#1e1c2f",
194   "#d2ccdd",
195   "#0c0a0a",
196   "#090706",
197   "#262438",
198   "#5a828b",
199   "#335663",
200   "#a56b74",
201   "#dcbcd9",
202   "#19131c",
203   "#cf7755",
204   "#6f6576",
205   "#dd8869",
206   "#f7d8c5",
207   "#312d40",
208   "#efad88",
209   "#b2664e",
210   "#e79572",
211   "#938a9d",
212   "#c68472",
213   "#581637",
214   "#97282a",
215   "#614861",
216   "#877e90",
217   "#905f7d",
218   "#a49dad",
219   "#711a2c",
220   "#bc908a",
221   "#b24945",
222   "#a33634",
223   "#571b43",
224   "#a29388",
225   "#f1c2a6",
226   "#c17863",
227   "#b1acbb"
228  ],
229  "frames": [
230   "...........................................................................................................................................000000.................................001120000..............................03042221240............................0435042222206..........................42471542424104.........................4121478424422040........................4211107377442044........................4114127999702204........................41444473aaa720207.......................414b4473ca9700447.........7.............446ded07aaa7004476........74.............4fg7h00a9a6044476........74.............0igh60476644744.6........74..............7ghhh421147400..........74..............ghhhh4111077............74...............jhhhe1208k600..........68................lhh7207kmmmm8.........7..................ll700enmm5m4.........76...................78.e655mmm6..666667776.....................6fm5555m0.opppp84764...................qq655555m40ppppo70474..................0f7855555544opppo70677..................007rm55555m7oopp640477...................06r555555mmoopp7404778.................00555555mmmm7opo7404778....6............805mmmm55mmm7opo07407778....6..........2s8r555tm5mim7ou746408678...vn6nnnw.....1188rr55mmmmm7oo7460........e7663nnnm...77nnxxx5mmimm7oo77.0........6nlhhhhggnnnnnnnnnnxmi55m7o746.8....6666hhhhhhhhhhhhhhhhhnnx8t5557o706.8...yyyyyo6ehhhhhhhhhhhhhhhnxr55557o606.76667677766677776ggghhhhhhhn85555mo746..8888888888888888888888888eexmmmm5mo747..sssssssssssssssssssssssss61mmmmmmmo747..66666666666666666666666608555555mm746...11111111111111111112222277rmmmmmmm707...",
231   "..................................................................................................................................................................................0000000................................001122000..............................03042221240...........................20435042222206.........................412471542424104.........................4211478424422047........................4211107377442447........................41141279997022207.......................41444473aaa720147..........7............444n4473ca97004476.........74...........446666d7aaa7044476.........74............4fgh780a9a64744.6.........74.............7gh6h476647400...........77.............7ghhh4211177.............77.............ghhhhh2110k600...........778.............jhhhh8127mmmm8..........468..............lhhh614mmm5m4..........47................llz70em55mmm7...666667776..................787mm5555m7..opppp84764..................4q755555m770ppppo70474..................4f7555555m70opppo70677..................4075555555m4oopp640477...................765555555m7oopp7404778.....6...........0m555555mmmm7opo7404778.....7...........45mmmm555mmm7opo07407778.....7.........1sr555tm55mim7ou746408678...vn7nnnw.....118rr55mmmmmm7oo7460........e7663nn.....77nxxx5mmmmmm7oo77.0........6nlhhhhggnknnnnnnnnxmi55m7o746.8....6666hhhhhhhhhhhhhhhhhnnx8t5557o706.8...yyyyyo6ehhhhhhhhhhhhhhhnxr55557o606.76667677766677776ggghhhhhhhn85555mo746..8888888888888888888888888eexmmmm5mo747..sssssssssssssssssssssssss61mmmmmmmo747..66666666666666666666666608555555mm746...11111111111111111112222277rmmmmmmm707...",
232   ".................................................................................................................................................................................000000.................................01112000...............................03042212240............................0435042212206..........................42471542424104.........................4121478424422047........................4211107377741044........................41141107999712277.......................414441473aaa72147...........7............14444473ca9700447..........74...........446e4447aaa7044477.........74............4f7h440a9a64744.6.........74............01g644476647400...........77.............7ghhh4211477.............77.............ghhhh41110d000...........778.............jhhh01108mmmm8..........468..............lhh7147mmm5m4..........47................lA7007m55mmm7...666667776..................0.7m55555m7..opppp84764.................001055555m770ppppo70474..................077555555m70opppo70677...................7r5555555m4oopp640477..................44r5555555m7oopp7404778......6..........0555555mmmmmoopo7404778......7..........4mmmm555mmmm7opo07407778......7........24r555t55mmim7ou746408678....ze7Bnnw....118rr5mmmmmmm7oo7460.........7663nnnnnkkk7nxxx5mmmmmm7oo77.0........6nlhhhhggnnnnnnnnnnxmi55m7o746.8....6666hhhhhhhhhhhhhhhhhnnx855557o706.8...yyyyyo6ehhhhhhhhhhhhhhhnx555557o606.76667677766677776ggghhhhhhhn85555mo746..8888888888888888888888888eexmmmm5mo747..sssssssssssssssssssssssss61mmmmmmmo747..66666666666666666666666608555555mm746...11111111111111111112222277rmmmmmmm707...",
233   ".................................................................................................................................................................................00000000...............................04111220000.............................034422212206..........................40435042222104..........................424715424242040........................4i21478424422044.......................41211107377742404.......................441141277999720277.......................414444733aa700447.......................444b44473ca704447.......................0066ed44aaa7044476......................40ff6h44d9a647447d........................7qg74476647400...........................7ghh4211477.............................ghhh411107000............................jhh7104kmmmm8............................lh7447emm5m4.............................l70.e7C5mmmr...666667....................7..72m5555m7..opppp8.......................26555555m70ppppo7......................0f7555555m70opppo7......................407m555555m7oopp64.......................045555555m7oopp74......................00555555mmmm7opo74............7.........05mmmm555mmm7opo07............7........2srr555t55mim7ou746..........ze7Bnnw....118rrr5mmmmmm7oo746..........7663nnnnnkkk7nxxxxmmmimm7oo77..........6nlhhhhggnnnnnnnnnnxmi55m7o746......6666hhhhhhhhhhhhhhhhhnnx855557o706.....yyyyyo6ehhhhhhhhhhhhhhhnx555557o606.76667677766677776ggghhhhhhhn85555mo746..8888888888888888888888888eexmmmm5mo747..sssssssssssssssssssssssss61mmmmmmmo747..66666666666666666666666608555555mm746...11111111111111111112222277rmmmmmmm707...",
234   "...........................................................................................................................................0000000................................001122000..............................03042221240............................0435042222206..........................42471542424104.........................4121478424422040........................4211107377442444........................4114127999702104........................41444473aaa720207.......................414b4473ca9700447........................46ded07aaa7044476.......................0fg7h00a9a6044476........................7gh60476644744.6........................7ghhh421147400..........................ghhhh4111077.............................jhhhe1208k600............................lhh7107kmmmm8............................ll700eBmm5m4..............................78.e655mmm6..666667........................6fm5555m0.opppp8.......................qq655555m40ppppo7......................0f7855555504opppo7......................007rm55555m7oopp64.......................07r555555mmoopp74......................00555555mmmm7opo74...........7..........805mmmm55mmm7opo07...........7.........2s0r555tm5mim7ou746..........e7nnnw.....1188rr55mmmmm7oo746.........e766nnnnnnkkk7nnxxx5mmimm7oo77..........6nlhhhhgnnnnnnnnnnnxmi55m7o746......6666hhhhhhhhhhhhhhhhhnnx8t5557o706.....yyyyyo6ehhhhhhhhhhhhhhhnxr55557o606.76667677766677776ggghhhhhhhn85555mo746..8888888888888888888888888eexmmmm5mo747..sssssssssssssssssssssssss61mmmmmmmo747..66666666666666666666666608555555mm746...11111111111111111112222277rmmmmmmm707..."
235  ]
236 },
237 {
238  "id": "handheld",
239  "width": 40,
240  "height": 40,
241  "palette": [
242   "#3a3648",
243   "#2c2836",
244   "#574d67",
245   "#b8b2c9",
246   "#1f1b27",
247   "#18131e",
248   "#9890a8",
249   "#89c271",
250   "#548743",
251   "#68a156",
252   "#437136",
253   "#f7fdf2",
254   "#d5a7a1",
255   "#ce9391",
256   "#af474f",
257   "#dab0a7",
258   "#60934e",
259   "#97cd81"
260  ],
261  "frames": [
262   ".........................................................................................0000000000000000000001.................023333333333333333333314................156666666666666666666654................036444444444444444444624................136400000000000000004625................136404444444444444404625................1364047778777779a9404625................136404977777989999404625................1364049777779b9998404625................136404897798b889b8404625................136404877b98898a99404625................136404a9b998b88baa404625................13640499999b98b99a404625................136404999aaa99999a404625................136404aaaaaaaaaaa8404625................136404444444444444044625................136400000000000000446625................136444444444444444466625................136666666666666666666625................136666666666666666666625................136666666666666666666625................136661466666666666666625................136640046666666666446625................136400004666666664cc4625................136100001666664464cc4625................13644004466664de46446625................13664444666664ee46666625................136664466666664466666625................136666666666666666666625................136666661166116666622625................536666661166116666566425................536666626662666665646625................536666666666666626566225................52666666666666666621225.................5222222222222222222225...................55555555555555555555...........................................................................................",
263   ".........................................................................................0000000000000000000001.................023333333333333333333314................156666666666666666666654................036444444444444444444624................136400000000000000004625................136404444444444444404625................1364047787777779a9404625................136404777777989999404625................1364049777b99b9998404625................13640489779aa989b8404625................136404877b9aaaaa99404625................136404a9b99bba8baa404625................13640499999ba9b99a404625................136404999a9a99999a404625................136404aaaaaaaaaaa8404625................136404444444444444044625................136400000000000000446625................136444444444444444466625................136666666666666666666625................136666666666666666666625................136666666666666666666625................136661466666666666666625................136644446666666666446625................136440044666666664cc4625................136100001666664464cc4625................13640000466664ff46446625................13664004666664ff46666625................136664466666664466666625................136666666666666666666625................136666661166116666622625................536666661166116666566425................536666626662666665646625................536666666666666626566225................52666666666666666621225.................5222222222222222222225...................55555555555555555555...........................................................................................",
264   ".........................................................................................0000000000000000000001.................023333333333333333333314................156666666666666666666654................036444444444444444444624................136400000000000000004625................136404444444444444404625................136404777777799999404625................136404777777999999404625................136404977799a9b999404625................1364049777baaa9b9a404625................13640487799aabaaaa404625................136404777b9abgb8aa404625................13640499b99aab999a404625................13640499999aa9999a404625................136404aaaaaaaaaaa8404625................136404444444444444044625................136400000000000000446625................136444444444444444466625................136666666666666666666625................136666666666666666666625................136666666666666666666625................136661466666666666446625................136644446666666664cc4625................136440044666664464cc4625................13610000166664hh46446625................13640000466664hh46666625................136640046666664466666625................136664466666666666666625................136666666666116666666625................136666661166116666622625................536666661166116666566425................536666626662666665646625................536666666666666626566225................52666666666666666621225.................5222222222222222222225...................55555555555555555555...........................................................................................",
265   ".........................................................................................0000000000000000000001.................023333333333333333333314................156666666666666666666654................036444444444444444444624................136400000000000000004625................136404444444444444404625................136404777777999999404625................13640497777799a999404625................1364049777b999bg8a404625................13640487799a9baaaa404625................136404777b9aaabaaa404625................13640479b9aabbg99a404625................1364049999aaag999a404625................136404a999aaa9999a404625................136404aaaaaaaaaaa8404625................136404444444444444044625................136400000000000000446625................136444444444444444466625................136666666666666666666625................136666666666666666666625................136666666666666666666625................136661466666666666666625................136640046666666666446625................136400004666666664cc4625................136100001666664464cc4625................13644004466664hh46446625................13664444666664hh46666625................136664466666664466666625................136666666666666666666625................136666661166116666622625................536666661166116666566425................536666626662666665646625................536666666666666626566225................52666666666666666621225.................5222222222222222222225...................55555555555555555555...........................................................................................",
266   ".........................................................................................0000000000000000000001.................023333333333333333333314................156666666666666666666654................036444444444444444444624................136400000000000000004625................136404444444444444404625................136404777777799999404625................13640497777799a999404625................13640497779b99aab8404625................1364049777b99baa99404625................13640489799aaaabaa404625................136404777baaaab99a404625................13640499b9aaba999a404625................136404a999aaaaa99a404625................136404aaaaaaaaaaa8404625................136404444444444444044625................136400000000000000446625................136444444444444444466625................136666666666666666666625................136666666666666666666625................136666666666666666666625................136661466666666666666625................136640046666666666446625................136400004666666664cc4625................136100001666664464cc4625................13644004466664hh46446625................13664444666664hh46666625................136664466666664466666625................136666666666666666666625................136666661166116666622625................536666661166116666566425................536666626662666665646625................536666666666666626566225................52666666666666666621225.................5222222222222222222225...................55555555555555555555..........................................................................................."
267  ]
268 },
269 {
270  "id": "shiba-dj",
271  "width": 40,
272  "height": 40,
273  "palette": [
274   "#db963e",
275   "#120c19",
276   "#0d070d",
277   "#a97844",
278   "#0b0614",
279   "#fbeed1",
280   "#cfa16c",
281   "#855520",
282   "#2f2439",
283   "#030101",
284   "#fcfaf9",
285   "#6b636e",
286   "#aca8b0",
287   "#6c4216",
288   "#cc4178",
289   "#443c4d",
290   "#f371e1",
291   "#221623",
292   "#c8c4d2",
293   "#c2b2fd",
294   "#93632f",
295   "#ba8a56",
296   "#393144",
297   "#f41fce",
298   "#fc10dd",
299   "#f1debe",
300   "#c9965b",
301   "#983d89",
302   "#a56c28",
303   "#b39e92",
304   "#e29ee6"
305  ],
306  "frames": [
307   "..........................................................................................011..............110....................20011..........11002...................1000031........2300004..................1055600444444440065504..................4055007000000007005504..................4050200000000000720504..................4007000000000000007004..................4780000000000000000834..................1488888880000888888841..................4912a444488888a4444894..................108a444448208a44444804.................4b28844444400444444484b4................4b20844448555584444804b4................484048888451452888840484................4c40011155544555144004c4................4d40555525555552555504d4.................4405555544444455555044...................446555554ee455555624.....................176555551155555671.......................41665555555566d2........................20773666666777002.11...................4000077777777000002002..................47700655555550000040004................200070555555555770002d04...............4555670555555551000004774...............4657572655555515550004744.............444772f2444555554535507444............44b4444g..4484444446d63544b411.........4b4ffbbf.bbb8fbbhb8cffffffc8bbb1.......4bbhiffcccccf1i8bhbbfbccccc8f44bb4......4bbbfiifffffii8bbhb4b4b444bbjjjjb4.....4bbbbbfbaaaaab8bbbhbbbbbbbbbbbbbbbb1....4hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh4....4hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh4....4hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh4....444444444444444444444444444444444444......44444......................44444........44444......................44444....",
308   "..........................................................................................011..............110....................20011..........11002...................1000031........2300004..................1055600444444440065504..................4055007000000007005504..................4050200000000000720504..................4007000000000000007004..................4780000000000000000834..................1488888880000888888841..................4912a444488888a4444894..................108a444448208a44444804.................4b28844444400444444484b4................4b20844448555584444804b4................484048888451452888840484................4c40011155544555144004c4................4d40555525555552555504d4.................4405555544444455555044...................446555554ee4h5555624.....................176555551155555671.......................41665555555566d22.......................20773666666777000.11...................4000077777777000004004..................4k70065555555000004004.................200070555555555770002d04................255670555555551000004774...............455l574655555515550004744.............44466m34444555554535507444............44b4444m444484444446d63544b411.........4b4ffbbfnbob8fbbhb8cffffffc8bbb1.......4bbhiffccooof1i8bhbbfbccccc8f44bb4......4bbbfiifffffii8bbhb4b4b444bbjjjjb4.....4bbbbbfbaaaaab8bbbhbbbbbbbbbbbbbbbb1....4hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh4....4hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh4....4hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh4....444444444444444444444444444444444444......44444......................44444........44444......................44444....",
309   "..................................................................................................................................011..............110....................20011..........11002...................1000031........2300004..................1055600444444440065504..................4055007000000007005504..................4050200000000000720504..................4007000000000000007004..................4780000000000000000834..................1488888880000888888841..................4912a444488888a4444894..................108a444448208a44444804.................4b28844444400444444484b4................4b20844448555584444804b4................484048888451452888840484................4c40011155544555144004c4................4d40555525555552555504d4.................4405555544114455555044...................44655555pppp55555624.....................1765555555555556k1.......................44665555555566dd211....................477773666666377000402..................25557077777777q00004004................455557055555555577000204................4q5q54055555555100000474................445l54455555551555000444..............4444mf2444455555453550744.............44b44nm4444484444446d63544b411.........4b4ffbnrfbbb8fbbhb8cffffffc8bbb1.......4bbhi..cncccf1i8bhbbfbccccc8f44bb4......4bbbfiifffffii8bbhb4b4b444bbjjjjb4.....4bbbbbfbaaaaab8bbbhbbbbbbbbbbbbbbbb1....4hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh4....4hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh4....4hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh4....444444444444444444444444444444444444......44444......................44444........44444......................44444....",
310   "....................................................................................................................................1..............11.....................04001..........11000....................200031........230002...................1055600444444440065504..................1055007000000007005504..................4050200000000000720504..................4007000000000000007004..................4000000000000000000834..................4788880000000088888844..................148888888000088a444844..................4912a444488888a4444894.................4b08a444448208a4444480b4................4b08844444400444444480b4................480084444855558444480084................4c404888h5544555h88404c4................4d40055555544555555004d4.................4405555255445525555044...................44655554455445555624.....................1765555555555556k1.......................44665555555566dd2111...................4007736666663770004004.................20s70077777777q00004004................455557055555555577000274................455557055555555100000474................465l54455555551555000444..............4444mm7444455555453550744.............44b44fm4444484444446d63544b411.........4b4ffnmffbbb8fbbhb8cffffffc8bbb1.......4bbhigncccccf1i8bhbbfbccccc8f44bb4......4bbbfiifffffii8bbhb4b4b444bbjjjjb4.....4bbbbbfbaaaaab8bbbhbbbbbbbbbbbbbbbb1....4hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh4....4hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh4....4hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh4....444444444444444444444444444444444444......44444......................44444........44444......................44444....",
311   "..................................................................................................................................011..............110....................20011..........11002...................1000031........2300004..................1055600444444440065504..................4055007000000007005504..................4050200000000000720504..................4007000000000000007004..................4780000000000000000834..................1488888880000888888841..................4912a444488888a4444894..................108a444448208a44444804.................4b28844444400444444484b4................4b20844448555584444804b4................484048888451452888840484................4c40011155544555144004c4................4d40555555545555555504d4.................44055555445t4455555044...................44655555555555555624.....................1765555555555556k1.......................44665555555566dd2111...................4007736666663770004004..................4770077777777q00004004.................25557055555555577000274................455557055555555100000474................465l54455555551555000444..............4444mm7444455555453550744.............44b44fm4444484444446d63544b411.........4b4ffnfffbbb8fbbhb8cffffffc8bbb1.......4bbhinunocccf1i8bhbbfbccccc8f44bb4......4bbbfiifffffii8bbhb4b4b444bbjjjjb4.....4bbbbbfbaaaaab8bbbhbbbbbbbbbbbbbbbb1....4hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh4....4hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh4....4hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh4....444444444444444444444444444444444444......44444......................44444........44444......................44444...."
312  ]
313 },
314 {
315  "id": "boombox",
316  "width": 40,
317  "height": 40,
318  "palette": [
319   "#160f38",
320   "#0a072d",
321   "#0a0528",
322   "#0b0934",
323   "#14042f",
324   "#1e1a44",
325   "#36396a",
326   "#60739b",
327   "#7f93b8",
328   "#010012",
329   "#070018",
330   "#070918",
331   "#0f022a",
332   "#090223",
333   "#140424",
334   "#2b0a39",
335   "#200833",
336   "#29062f",
337   "#1c042b",
338   "#92318d",
339   "#893086",
340   "#210c41",
341   "#1a0635",
342   "#5f78f1",
343   "#0d041d",
344   "#6f7dc8",
345   "#4f4cb7",
346   "#666fc1",
347   "#8a3eb0",
348   "#150b23",
349   "#8a674e",
350   "#120e41",
351   "#150c0b",
352   "#6393f3",
353   "#3e3bc5",
354   "#d128be",
355   "#201354",
356   "#6b2479",
357   "#e68b25",
358   "#bf5295",
359   "#d37358",
360   "#b331a6",
361   "#da46ab",
362   "#c379a5",
363   "#9e66b0",
364   "#db708c",
365   "#050306",
366   "#2e2064",
367   "#595eb4",
368   "#461a59",
369   "#698862",
370   "#c18729",
371   "#db5279",
372   "#948535",
373   "#806cbd",
374   "#a9297d",
375   "#c13224",
376   "#5c36a9",
377   "#dc9315",
378   "#e32ec0",
379   "#715bb8",
380   "#6a5ec1",
381   "#bd29b8",
382   "#9c30b0",
383   "#d036b1",
384   "#9f27a2",
385   "#51579e",
386   "#654fb6",
387   "#f8684f",
388   "#854db5",
389   "#592168",
390   "#342977",
391   "#46469c",
392   "#31a846",
393   "#28a249",
394   "#7c90d1",
395   "#3b367d",
396   "#3e3687",
397   "#f0960a",
398   "#f97f29",
399   "#a5211d",
400   "#ec2abe",
401   "#ad1e2c",
402   "#995369",
403   "#4240a2",
404   "#753ab7",
405   "#ef745e",
406   "#d36518",
407   "#4c2e9c"
408  ],
409  "frames": [
410   "......................................................................................................................................................................................................................................................01221111111222212221111111213..........4152666666667897a8b66666666225..........c022222222d122221222222212ddd5..........c0..........................a5..........e0..........................d5........ffe2gfhhhhfhhihigihhhhhhfhhgfgc2ff.....djjkjjjjjjjjjjjjjjjjjjjjjjjjjkjjjjj0....dllmmmmmjjjjjjjjjjjjjjjjjjjjj4mmmlmm....dmf9daa4d1111111111111111111jcadadlm....d4fnocngcppqqqpr1111pppsppq1jtuvwol4....2ilqxnyg21313333111131333111kltn0bf4....2ilxt0p0cjjjjjjjkkkkjjjjjjj3k0ztp2f4....djllAAAlB4c23m422dddcc4cc214kAAAAojm....2jckkkkjkkjjjj4e4wwcebjjjjkkkkkkkikm....ekcfk33333jjjjmCDEFC.ojjjj3333vgkAl4....ejk338161pckjjiGHxIGJKjjk363133pLkkg....ojk3M11111vpNjiOPxQRS9jj3M111111qAjg....oj3M11111110vjmICsTns9j3q11111112dkg....djv211111111vj4Uznxnqaj3111111111pmi....cjv3112v1111pN4UCCFsEKjL3111M1111Mmi....cjv111vM3111pf33111112jA1111Mq111Mmi....cj3611131111dj4ottoobaj3q11111111p4m....cj3q1111111qNj3zwtUUK9jj3v111111qajg....djk3p11111q3jj34112122jj3qv1111MpNjm....djBk33Mrqq3jjjjjjjjjjjjjj33q3MV03Bk4....dBMgjj22djjjjjjjjjjjjjjjjjjcdcdkk3am....djmkjjjjjjjjjjjjjjjjjjjjjjjjjjjjjkjm.....gigeeeeoeoeoeoeoeoeeeeeeeoeeeeeege...................................................................................................................................................................................................................................................",
411   "......................................................................................................................................................................................................................................................01221111111222212221111111213..........4152666666667897a8b66666666225..........c022222222d122221222222212ddd5..........c0..........................a5..........e0..........................d5........ffe2gfhhhhfhhihigihhhhhhfhhgfgc2ff.....djjkjjjjjjjjjjjjjjjjjjjjjjjjjkjjjjj0....dllmmmmmjjjjjjjjjjjjjjjjjjjjj4mmmlmm....dmf9daa4d1111111111111111111jcadadlm....d4fnocngcppqqqpr1111pppsppq1jtCvCol4....2ilqxnyg21313333111131333111kltn0bf4....2ilxt0W0cjjjjjjjkkkkjjjjjjj3k0ztp2f4....djllAAAlB4c23m422dddcc4cc214kAAAAojm....2jckkkkjkkjjjj4e4eweeojjjjkkkkkkkikm....ekcfk33333jjjjmCCXYZ!ojjjj33333kkAl4....ejk33rpppM3kjjiCXxnZ#ajjk3MpppZ33kkg....ojk3r11111r3jji.xx$x%9jj3M21111r33jg....oj3M&11111MM3jmCx(Cxs9j3qp111111Z3kg....dj3p1111111p3j4C$C)Zqaj3p1111111p3mi....cj3p1111111p3N4CCC*Z.9j3p1111111p3mi....cj3p1111111p3f33111112j3p1111111p3mi....cj3r1111111Z3j4ottoobaj3M1111111p34m....cj3LZ11111qv+j3zwtUUK9jj3r11111Z,3jg....djk3-r111qA3jj34112122jj3vp111M-3kjm....djBk33rrq33jjjjjjjjjjjjjj33rrrv33Bk4....dBMgjj22djjjjjjjjjjjjjjjjjjcdd1kk3am....djmkjjjjjjjjjjjjjjjjjjjjjjjjjjjjjkjm.....gigeeeeoeoeoeoeoeoeeeeeeeoeeeeeege...................................................................................................................................................................................................................................................",
412   "......................................................................................................................................................................................................................................................01221111111222212221111111213..........4152666666667897a8b66666666225..........c022222222d122221222222212ddd5..........c0..........................a5..........e0..........................d5........ffe2gfhhhhfhhihigihhhhhhfhhgfgc2ff.....djjkjjjjjjjjjjjjjjjjjjjjjjjjjkjjjjj0....dllmmmmmjjjjjjjjjjjjjjjjjjjjj4mmmlmm....dmf9daa4d1111111111111111111jcadadlm....d4fnocngcqqqqqpr1111sppsppq1jt/v:ol4....2iltxntg21313333111131333111kltn0bf4....2ilCt0:0cjjjjjjjkkkkjjjjjjj3k0zts2f4....djllAAAlB4c23m422dddcc4cc214kAAAAojm....2jckkkkjkkjjjj4e4eweeojjjjkkkkkkkikm....ekcfk33333jjjjmCC$YZ!ojjjj33333kkAl4....ejk33-ppp-3kjjiCXxxZ#ajjk3Mppp-33kkg....ojk3-1111p-3jji.nXCxC9jj3Mp1111-33jg....oj3Mp11111p-3jm$nCCxCKj3qp11111p-3kg....dj3p1111111p3j4C*xxZs9j3p1111111p3mi....cj3p111M111p3N4C.Y*Z.9j3p111M111p3mi....cj3p1111111p3f33111112j3p1111111p3mi....cj3-p11111p-3j4ottoobaj3-p11111p-34m....cj33q11111qv+j3zwtUUK9jj3-11111Mv3jg....djk33q;;;-33jj34112122jj33-pppqv3kjm....djBk33<<=33jjjjjjjjjjjjjj33===v33Bk4....dBMgjj22djjjjjjjjjjjjjjjjjjcd11kk3am....djmkjjjjjjjjjjjjjjjjjjjjjjjjjjjjjkjm.....gigeeeeoeoeoeoeoeoeeeeeeeoeeeeeege...................................................................................................................................................................................................................................................",
413   "......................................................................................................................................................................................................................................................01221111111222212221111111213..........4152666666667897a8b66666666225..........c022222222d122221222222212ddd5..........c0..........................a5..........e0..........................d5........ffe2gfhhhhfhhihigihhhhhhfhhgfgc2ff.....djjkjjjjjjjjjjjjjjjjjjjjjjjjjkjjjjj0....dllmmmmmjjjjjjjjjjjjjjjjjjjjj4mmmlmm....dmf9daa4d1111111111111111111jcadadlm....d4fCocCgcqqqqqpr1111sppsppq1jt/v:ol4....2ilt>>tg21313333111131333111kltn0bf4....2ilWt0:0cjjjjjjjkkkkjjjjjjj3k0zts2f4....djllAAAlB4c23m422dddcc4cc214kAAAAojm....2jckkkkjkkjjjj4e4ewdebjjjjkkkkkkkikm....ekcfk33333jjjjmzZ.?C@ojjjj3q3v3kkAl4....ejk3qqr31qqkjjisZxx[]9jjkMq35&qq3kkg....ojk3q11111v3jjisxXx8^9jj3311111_33jg....ojdM2111111q3jm{x|CCCaj1q1111111Zdkg....djp&1111111&pj4{Zxx[CKj3r1111111Mdmi....cjp0111M1111pN4.#Z?CCKjp0111p1111pmi....cjpL11,M311Lpf33111112jp611Aq1116pmi....cj1M1111111q1j4ottoobaj3q1111111M34m....cj3311111113+j3zw}UzK9jj3311111133jg....djk3qq111qq3jj34112122jj3qq111Mq3kjm....djBk333r333jjjjjjjjjjjjjj33=Mv~33Bk4....dBMgjj22djjjjjjjjjjjjjjjjjjcdd1kk3am....djmkjjjjjjjjjjjjjjjjjjjjjjjjjjjjjkjm.....gigeeeeoeoeoeoeoeoeeeeeeeoeeeeeege...................................................................................................................................................................................................................................................",
414   "......................................................................................................................................................................................................................................................01221111111222212221111111213..........4152666666667897a8b66666666225..........c022222222d122221222222212ddd5..........c0..........................a5..........e0..........................d5........ffe2gfhhhhfhhihigihhhhhhfhhgfgc2ff.....djjkjjjjjjjjjjjjjjjjjjjjjjjjjkjjjjj0....dllmmmmmjjjjjjjjjjjjjjjjjjjjj4mmmlmm....dmf9daa4d1111111111111111111jcadadlm....d4fCocCgcqqqqqpr1111sppsppq1jtxvXol4....2ilt//tg21313333111131333111klt.0bf4....2ilxt0:0cjjjjjjjkkkkjjjjjjj3k0ztC2f4....djllAAAlB4c23m422dddcc4cc214kAAAAojm....2jckkkkjkkjjjj4e4eddebjjjjkkkkkkkikm....ekcfd32M(13jjjm!rZ$CCKjjjj3q3qv0kAl4....ejk,q11111q0jji*rxx.C9jjk;L1131q,kkg....ojk-1111111M3jiCxCxx.9jj3M111111q3jg....ojd1111111113jmCx##xzaj1q11111112dkg....djp111111111pj4sCS*.CKj3111111111dmi....cjp1111M1111pN4zCCXCCKjp1111p1111Mmi....cjp111AM3111pf33111112jp111Arq111Mmi....cj2111111111rj4ottoobaj3111111111q4m....cjrv1111111qdj3zwCUzK9jjq1111111_ajg....dj1q<11111qdjj34112122jj3q11111MMmjm....djB33q331q3jjjjjjjjjjjjjj333Mv1q3Bk4....dBMgj22jdjjjjjjjjjjjjjjjjjjcdd1kk3am....djmkjjjjjjjjjjjjjjjjjjjjjjjjjjjjjkjm.....gigeeeeoeoeoeoeoeoeeeeeeeoeeeeeege..................................................................................................................................................................................................................................................."
415  ]
416 },
417 {
418  "id": "rainy-window",
419  "width": 40,
420  "height": 40,
421  "palette": [
422   "#250e2f",
423   "#3d0f52",
424   "#340945",
425   "#39559f",
426   "#353348",
427   "#3a58a6",
428   "#31375e",
429   "#36114e",
430   "#481658",
431   "#8c9ecb",
432   "#77a4e1",
433   "#702433",
434   "#324888",
435   "#5f2234",
436   "#3f1f28",
437   "#3d5373",
438   "#131c21",
439   "#360f26",
440   "#332657",
441   "#87b9ee",
442   "#5177ca",
443   "#973e5f",
444   "#c95960",
445   "#a8d8f9",
446   "#313f7c",
447   "#5a234c",
448   "#c76d62",
449   "#792552",
450   "#683023",
451   "#85442a",
452   "#f2c585",
453   "#fffcf8",
454   "#de9f68",
455   "#6078a6",
456   "#8f579f",
457   "#5b823d",
458   "#22372c",
459   "#33623d",
460   "#dac002",
461   "#aaa122",
462   "#271c1e",
463   "#c48e63"
464  ],
465  "frames": [
466   "0000120000000000000000000000000000210000000012003334443333300333333533360027000000001200335333333330035555555556002800000000120033333333333003353955555600280000000010003333355a3330039535955556002800000000120033335333336003533555555600b100000000120033339333336005555555555600b2000000007200333335c5cc3003555555555600b700000000720033335555553b05555595355600b700000000820000000000000000000000000000b700000000820000bbbbbbbbbbb2000000000000b200000000820deffffffffffd04444444444g00b700000000820hi3333333333d03333333333600b700000000820bi3333333333d03333339393600b700000000820bi333a533333d03333355333600b200000000820bi3333333333d03333353333600b700000000820bi3a33333333d03jjjj5333k600b70000000082hli3333333333b03aaakccccc600b7000000008lhmi335a333333b03aankcoccc600b7000000008lhm4nnknnnn333b03aankciocc600b700000000plhq6kkkkkkk553b03aaakc6ooo6b0b700000000plhq6kkkkkkkaaab0aakkkccooc6b0b700000000rlsqttknnnkk333b05555kcc5666b0b700000000rluvuwknnnkk33ob0ooookc55c36b0b700000000bluuvuxknnkk3oob0yyyckzg3A3600b100000000bquvuuukkkkkoood0yccckBzggcg0A0100000000lmuuuutkkkkkooob0ccccCAABAgAA00100000000rttttttkkkkkooob0yyyc4DggAAgAA0100000000rmwEEkkkkkkkooob0yyyfCBBgAAAgA0100000000rmme0ooooookooob0ccyocggeeAEE00100000000rmlEoooooookooob0ccyok3sseEEE02100000000rmle6ooooookooob0ccyoc3FsEEE0021000000008mleFqqmrlbbbbbb0000000tsEEE002100000000pmqpeq00000002000000000EsEEE00210000000drmAEEEmqpqqqqqqqqqqlllllspE78111700000077777777777777777777777777777777770000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
467   "00001200000000000000000000000000002100000000120033344433333003333333333600270000000012003353333333300355555555560028000000001200333333335330033535555556002800000000100033553335333003353955555600280000000012003333355a333003953595555600b10000000012003933533333x003533555555600b2000000007200335c9555533003555555555600b700000000720033555555553b05555555355600b700000000820000000000000000000000000000b700000000820000bbbbbbbbbbb2000000000000b200000000820deffffffffffd04444444444g00b700000000820hi3333333333d03333333333600b700000000820bi3333333333d03333333333600b700000000820bi3333333333d03333359393600b200000000820bi333a533333d03333355333600b700000000820bi3333333333d03jjjj53333600b70000000082hli3a33333333b03aaakccccc600b7000000008lhmi3355333333b03aankcoccc600b7000000008lhm4nnknnnn333b03aankciocc600b700000000plhq6kkkkkkk553b03aaakc6ooo6b0b700000000plhq6kkkkkkkaaab0aakkkccooc6b0b700000000rlsqttknnnkk333b05555kcc5666b0b700000000rlvvvvknnnkk33ob0ooookc55c36b0b700000000blvvuvxknnkk3oob0yyyckzg3A3600b100000000bmvvvvkkkkkkoood0yccckBzggcg0A0100000000lmvvvvkkkkkkooob0ccccCAABAgAA00100000000rttttttkkkkkooob0yyyc4DggAAgAA0100000000rmwEEkkkkkkkooob0yyyfCBBgAAAgA0100000000rmwe0ooooookooob0ccyocggeeAEE00100000000rmlEoooooookooob0ccyok3sseEEE02100000000rmle6ooooookooob0ccyoc3FsEEE0021000000008mleFqqmrlbbbbbb0000000tsEEE002100000000pmqpeq00000002000000000EsEEE00210000000drmAEEEmqpqqqqqqqqqqlllllspE78111700000077777777777777777777777777777777770000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
468   "000012000000000000000000000000000021000000001200333444443330033333333336002800000000120033533a33333003555555555600280000000012003333333333300333555555560028000000001000335533335330033535555556002800000000120033333335333003353995555600b10000000012003933355a333003953555555600b2000000007200335c55cccc6003555555555600b700000000720033339555553b05555555355600b700000000820000000000000000000000000000b70000000082000bbbbbbbbbbbb2000000000000b200000000820deffffffffffd04444444444g00b700000000820hi3333333333d03333333333600b700000000820bi3333333333d03333333333600b700000000820bi3333333333d03333355333600b200000000820bi3333333333d03333359393600b700000000820bi333a533333d03jjjj53333600b7000000008lhli3333333333b03aaakcc333600b7000000008lhmi3a55333333b03aankcoccc600b700000000plhm4nnknnnn333b03aankciocc600b700000000plhq6kkkkkkk553b03aaakc6ooo6b0b700000000rlhq6kkkkkkkaaab0aakkkccooc6b0b700000000rlvvvvknnnkk333b05555kcc5666b0b700000000rvvvvvvnnnkk33ob0ooookc55c36b0b700000000bvvvvvvknnkk3oob0yyyckzg3A3600b100000000bvvvvvvkkkkkoood0ycyckBzggcg0A0100000000lvvvvvvkkkkkooob0ccccCAABAgAA00100000000rmtttttkkkkkooob0yyyc4DggAAgAA0100000000rmwEEkkkkkkkooob0yyyDCBBgAAAgA0100000000rmwe0ooooookooob0ccyocggeeAEE00100000000rmlEoooooookooob0ccyok3sseEEE02100000000rmle6ooooookooob0ccyoc3FsEEE002100000000rmleFqqmrlbbbbbb0000000tsEEE002100000000pmqpeq00000002000000000EsEEE00210000000drmAEEEmqqqqqqqqqqqqlllllspE78111700000077777777777777777777777777777777770000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
469   "000012000000000000000000000000000021000000001200333334443330033333n5n3360028000000001200335555333330035555555556002800000000120033333333333003333555555600280000000010003333333353300333555555560028000000001200335933335330033535555556002800000000120033333335333003353995555600b1000000007200393355cac33003955555555600b200000000720033335555556005555555355600b700000000820000000000000000000000000000b700000000820000bbbbbbbbbbb2000000000000b2000000008200effffffffffd04444444444g00b700000000820di3333n3j333d0333a333333600b700000000820hi3333333333d03333333333600b700000000820bi3333333333d03333355333600b200000000820bi3333333333d03333355333600b700000000820bi3333333333d03jjja59393600b700000000820li333a333333d03aaakcc333600b700000000820li3355333333b03aajkcoc33600b7000000008lhm4jjkjjjj333b03aajkciocc600b7000000008lhq6kkkkkkk553b03aaakc6ooo600b700000000plhq6kkkkkkkaaab0aakkkccooc6b0b700000000plsqttkjjjkk333b05555kcc5666b0b700000000rluuvukajjkk33ob0ooookc55c36b0b700000000rlvvuvtkjjkk3oob0yyyckBg3A3600b100000000bluvvvxkkkkkoood0ycyckBBggcg0A0100000000bmuvvukkkkkkooob0ccccDAABAgAA00100000000lttttttkkkkkooob0yyyc4DggAAgAA0100000000rmwEEkkkkkkkooob0yyyDDBBgAAAgA0100000000rmwe0ooooookooob0ccyocggeeAEE00100000000rmlEoooooookooob0ccyok3eeeEEE02100000000rmle6ooooookooob0ccyoc3FsEEE0021000000008mleFqqmrlbbbbbb0000000tsEEE002100000000pmqpeq00000002000000000EsEEE002100000000rmAEEEmqpqqqqqqqqqlllllpspE78111700000077777777777777777777777777777777770000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
470   "000012000000000000000000000000000021000000001200333334444430033333353336002800000000120033555533333003555595955600280000000012003333333333300333333555560028000000001000333335555330033335555556002800000000120033333355533003335555555600280000000012003339333353300335359555560028000000007200393355ccc33003555955555600b10000000072003333555a556005955555355600b200000000820000000000000000000000000000b700000000820000bbbbbbbbbb02000000000000b2000000008200effffffffffd04444444444g00b700000000820di3333333333d03333333333600b700000000820hi3333j3j333d03n3n333333600b700000000820hi3333333333d03333355333600b200000000820bi3333333333d03333353333600b700000000820bi3333333333d03jjja53333600b700000000820li3333333333d03aaakcxcx3600b700000000820li335a333333d03aajkcoccc600b7000000008lhm4jjkjjaj333b03aajkciocc600b7000000008lhq6kkkkkkk553b03aaakc6ooo600b700000000plhq6kkkkkkkkkab0aakkkccooc6b0b700000000plsqttkkkkkk333b05555kcc5666b0b700000000rluuvukkkkkk33ob0ooookc55c3600b700000000rluvuuxkkkkk3oob0cccckBg3A3600b100000000bluuvuukkkkkooob0cccckBBggcg0A0100000000bmuuuutkkkkkooob0ccccDAABAgAA00100000000lttttttkkkkkooob0cccc4DggAAgAA0100000000rmwEEkkkkkkkooob0cccDDBBgAAAgA0100000000rmwe0ooooookooob0cccocggeeAEE00100000000rmlEoooooookooob0cccok3eeeEEE021000000008mle6ooooookooob0cccoc3FsEEE0021000000008mleFqqmrlbbbbbb0000000tsEEE002100000000pmqpeq00000002000000000EsEEE002100000000rmAEEEmqpqqqqqqqqqlllllpspE78111700000077777777777777777777777777777777770000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
471  ]
472 },
473 {
474  "id": "penguin",
475  "width": 40,
476  "height": 40,
477  "palette": [
478   "#141021",
479   "#1d172f",
480   "#6b687d",
481   "#36314a",
482   "#fcf0e7",
483   "#bab7c6",
484   "#eca90d",
485   "#933606",
486   "#da4f9d",
487   "#d74194",
488   "#413d55",
489   "#4b475c",
490   "#a29fae",
491   "#f9b019",
492   "#b14f07",
493   "#dc980b",
494   "#545065",
495   "#f4e6d4",
496   "#c23b53",
497   "#93909f",
498   "#e68c04",
499   "#d77d0e"
500  ],
501  "frames": [
502   "...........................................................................................................................................................................................................................0000..........11..............1.......12233300.......1140.............1......1223333300......1.1............1.1.....122333333300...111..............11......333333330000...11...............41.....03423333440000...................1......04443334444110.................111......14043334044110.................11......154006740044100.........................148446674488400.........................188866677488400...0000..................1584767774885000000330.................00055477744440013333300...............003300555555550011333000...............033330055555555111111100..............3333300024444455551111110..............1223310034444444455511000...............01111100444444444455110..................00000024444444444555100......................044444444445555110......................044444444445555110......................044444444445555110......................044444444445555100......................024444444455551100.......................1544444455555110........................0554444555551100.......................0005555555550000.......................1667725555551077770......................06677000000077670....................22220070222222070072222...............222222220222222220222222222...................222222222222222....................................................................................................................................",
503   "...................................................................................................................................................................................0000..................................12233300...............................1223333300.............................122333333300....111.....................333333330000....141............1.......03423333440000...11.............11......04443334444110..01..............41......14043334044110..................11.....154006740044100..................1......148446674488400.........................198866677488400.........................158476777488500........................0005547774444000000..................0033300555555550011333000..............032333005555555511113333310............0321010024444445551111133300...........02331000a44444444555111111100...........0211000044444444445511100000.............0100..b4444444444555110.................00...044444444445555110......................044444444445555110......................044444444445555110......................044444444445555100......................0c4444444455551100.......................0544444455555110........................0554444555551100.........................15555555550000.........................0d025555530000..........................066700000076670........................066670....076666........................00000.....076600...................................000..............................................................................................................................................................................",
504   "..........................................................................................................................................000...................................1223300................................122333300..............................12233333300.............................333333330000...........................0342333344000.....1.............11......04443334444100....11...........111......14043334044110....14............41.....154006740044100.....1............1......148466674488400.........................188866677488400....................110..058476777488500...................02230000554777444400....................0233333005555555500000..................000333300555555550113300.................0000000355445555111333300.................000004444444555111333330.................000544444444555111133300..................04444444444551111100000.................b4444444444555110000010................044444444445555110..000.................044444444445555110......................044444444445555110......................044444444445555100......................054444444455551100.......................0544444455555110........................0555445555550000.........................02555555550000...........................002555526670............................0770000e6660...........................20770222606f022.....................22222000222200000222222...............222222222222222222222222222...................222222222222222....................................................................................................................................",
505   "..................................................................................................000...................................1223300........................11......122333300.....111.............1111.....12233333300....1111............0411.....333333330300......01............1......0333333330000.......1...................0g423334440000.....01...................b4443344444110.....h...................144046744044110.....0...................199066670094400.....11.............110..19944667i498400......1............0223..059446674488500...................02330000544774444400....................0233333005444455500100..................00033330055555555011330..................00001003554455551113330...................0000a44444445511113330...................0004444444455511113300...................0j44444444455511113300..................04444444444455511100000.................04444444444455511000010.................044444444445555110.000..................044444444445555110..0...................0c4444444445555100.......................05444444455551100.......................0554444455555110........................0255545555550100.........................0g555555536000...........................00225552d6k..............................070000k0060.............................0771..f0000...........................222002220222222.....................22222220222222222222222...............222222222222222222222222222...................222222222222222....................................................................................................................................",
506   "..................................................................................................................................................................................0000........1.........................12233300......11.......................1223333300.....11.............111......122333333300.....11.............41......333333330000......11............11.....03423333440000.....141..................04443334444110......01..................14043334044110.........................154006740044100.........................148466674488400....................110..198876677488400...................022300059447774488500...................02333300554444444400000.................000333300555555550031330.................000033005555555501133330..................00000554445555111133300..................0000444444455511111330....................054444444455511111300...................044444444445511111330...................044444444445551101300...................044444444455551000000...................044444444455551110......................044444444455551100......................054444444455551100......................05544444455551110........................0554444555551100.........................05555555500000...........................055555500000.............................0000006670...........................22207022l666722.....................22222222022260007222222...............222222222222220222222222222...................222222222222222...................................................................................................................................."
507  ]
508 },
509 {
510  "id": "doge",
511  "width": 40,
512  "height": 40,
513  "palette": [
514   "#201b16",
515   "#e0a44a",
516   "#dfa6a0",
517   "#99622b",
518   "#51504e",
519   "#f7eccc",
520   "#c0af86",
521   "#865024",
522   "#c58637",
523   "#bd7e28",
524   "#d1933e"
525  ],
526  "frames": [
527   "..........................................................................................................................................................................000..............000...................01110............01110..................010110..........011010..................0220110000000000110220.................012223104444444401322210................012220330000000033022210................032220003111111300022230................032300111111111111003230................032001111111111111100230................030011111111111111110030................030111111111111111111030................000111115111111511111000...............04031111555111155511113040..............00011130015111151003111040.............0400111044051111504401110440............0400510500031111300050150040............0401551055015555105501551040............0001555100550440550015551000............0001555555550000555555551000.............00355555555500555555555300...............036555550550055055555630.................0655555500550055555560..................0365555555555555555630...................03655555555555555630...................0133665555555555663310..................0111336666666666331110.................001111156666666651111100................011111155555555551111110...............03111115555555555551111130..............01111155555555555555111110..............01111155555555555555111110.............0311115555555555555555111130............0111115555555555555555111110..............................................................................................................................",
528   ".........................................................................................................................................................................0000..............0000..................01110............01110..................0101100000000000011010.................012201104444444401102210................012220330000000033022210................032220003111111300022230................032300111111111111003230................032001111111111111100230................030011111111111111110030................030111111111111111111030................000111111111111111111000...............04031111111111111111113040..............00011111115111151111111040.............0400111111151111511111110440............0400510000031111300000150040............0401551055015555105501551040............0001555100550440550015551000............0001555555550000555555551000.............00355555555500555555555300...............036555550550055055555630.................0655555500550055555560..................0365555555555555555630...................03655555555555555630....................03366555555555566330...................0111336666666666331110..................0111115666666665111110.................001111155555555551111100................011111555555555555111110...............03111115555555555551111130..............01111155555555555555111110..............01111155555555555555111110.............0311115555555555555555111130............0111115555555555555555111110..............................................................................................................................",
529   "..................................................................................................................................000..............000...................01110............01110.................011011000000000000110110................012201104444444401102210................032220330000000033022230................032220003111111300022230................032300111111111111003230................032001111111111111100230................030011111111111111110030................030111111111111111111030................000111115111111511111000...............04031111555111155511113040..............00011130015111151003111040.............0400111055051111505501110440............0400510500031111300050150040............0401551055015555105501551040............0001555100550440550015551000............0001555555550000555555551000.............00355555555500555555555300...............036555550550055055555630.................0655555500550055555560..................0365555555555555555630...................03655555555555555630.....................3366555555555566330....................011336666666666331100..................0311115666666665111110.................011111155555555551111110................011111555555555555111110................011111555555555555111110...............03111115555555555551111130..............01111155555555555555111110..............01111155555555555555111110.............0311115555555555555555111130............0111115555555555555555111110..............................................................................................................................",
530   ".................................................................................................................................0000..............0000..................01110............01110..................010110..........011010..................0220110000000000110220.................012223104444444401722210................012220330000000033022210................032220003111111300022230................032300111111111111003230................032001111111111111100230................030011111111111111110030................030111115111111511111030................000111155511115551111000...............04031130015111151003113040..............00011105505111150550111040.............0400510500031111300050150440............0400551055015555105501550040............0401555100550440550015551040............0001555555550000555555551000............0001555555555005555555551000.............00355555505500550555555300...............036555555005500555555630.................0655555555555555555560..................0365555555555555555630...................03655555555555555630....................83366555555555566339...................0111336666666666331110..................0111115666666665111110.................0a1111155555555551111110................011111555555555555111110...............03111115555555555551111130..............01111155555555555555111110..............01111155555555555555111110.............0311115555555555555555111130............0111115555555555555555111110..............................................................................................................................",
531   ".........................................................................................................................................................................0000..............0000..................01110............01110.................0110110..........0110110................012201100000000001102210................032223330000000033322230................032220003111111300022230................032300111111111111003230................032001111111111111100230................030011111111111111110030................030111111111111111111030................000111115111111511111000...............04031111555111155511113040..............00011130015111151003111040.............0400111055051111505501110440............0400510500031111300050150040............0401551055015555105501551040............0001555100550440550015551000............0001555555550000555555551000.............00355555555500555555555300...............036555550550055055555630.................0655555500550055555560..................0365555555555555555630...................03655555555555555630....................03366555555555566330...................0111336666666666331110..................0111115666666665111110.................001111155555555551111100................011111555555555555111110...............03111155555555555555111130..............01111155555555555555111110..............01111555555555555555511110.............0311115555555555555555111130............0111115555555555555555111110.............................................................................................................................."
532  ]
533 },
534 {
535  "id": "pop-cat",
536  "width": 40,
537  "height": 40,
538  "palette": [
539   "#14110e",
540   "#100d0a",
541   "#f39e39",
542   "#f69328",
543   "#fdaaa5",
544   "#fefdfb",
545   "#1a1513",
546   "#96322f",
547   "#dc4c4c",
548   "#959594",
549   "#464342",
550   "#dcdbdb"
551  ],
552  "frames": [
553   "...............................................................................................................................010....................000.............022200................002230............0402221..............0222040............04402220..00000000..12220440............0444122211222222221122204440............0444412222222222222222144440............0444122222222222222222204440............0440222222222552222222220440.............04222222222555522222222240..............02222222222555522222222220..............12222000225555552200022221.............0222200500555555550050022220.........0..0222200500555555551050022220..0.......00222222066555577555506022222200.........022222225555555555555522222221........0000022255550555105550555522200000.......02222555555500111100555555522220......002000555555550188881055555555000200......10795555555550444415555555559700.......0..0995555555550000555555555990..0..........09955555555555555555555990...............009955555555555555559910.600........011110177555555555555559700.0550.......0557770777795555555555977770025550......0557717722255555555555522277022250.......050177222225555555555222227022220........1.07722222555555555522222702220...........17722222255555555222222771220...........0772222225555555522222277021............077222222955555592222227706..............177222229955559922222770................177722229999999922227770.................1177772111111112777711...................0000000......0000000..................................................................................................................................",
554   ".......................................................................................010...................0000.............022200................022230............0402221..............0222040............04402220..00000000..12220440............0444122211222222221122204440............0444412222222222222222144440............0444122222222222222222204440............0440222222222552222222220440............044222222222555522222222240..............02222222222555522222222220..............12222000225555552200022220.............0222200500555555550050022220............0222200500555555551050022220.........0002222220665555775555060222222000........022222225555555555555522222220.........11002225555055510555055552220016.......0022225555515111111115055555222200.......20005555555111111111155555550002......001079555555511118811115555555970066........0995555555114444115555555990.........1...09955555551444415555555990...0...........119955555500005555559910............101...177555555555555559700.100.........05511077779555555555597777015550........15537072225555555555552227005555a........03217222255555555555522227022250.........0217222225555555555222227022220..........17722222555555555522222771220...........17722222255555555222222771220...........0772222225555555522222277021............077222222955555592222227706..............177222229955559922222770.................1772222999999992222771...................17777211111111277771....................0000000......0000000..................................................................................................................................",
555   "........................................................................................010..................020...............022200..............002230..............0402220............0222040..............0440220..00000000..0220440.............0444402211222222221122044440............0444402222222222222222044440............0444122222222552222222204440.............04022222222555522222222040..............04222222222555522222222240..............02222000225555552200022220..............12220050055555555005002220.............0222200500555555551050022220............0222220665555775555060222220..........00222222255555555555555222222200......00.022222555505551055505555222220.00......11002255550511111111505555220016........02222555551511111111505555522220.......0200055555551111111111555555500020.......10795555555111111111155555559700.......10.0995555551118888111555555990.00.......0..09955555511444411555555990..0............019955555144441555559910..................17755555000055555970...............000.077779b555555555977770..010.........05510722255555555555522270.65550........05217222255555555555522221025550........02217222225555555555222227022255........02177222225555555555222227022220........02177222222555555552222227712220.........107722222255555555222222771220............172222229555555922222271120.............17722222995555992222277000...............0722222999999992222770...................07777211111111277771....................0000000......0000000..................................................................................................................................",
556   "...............................................................................................................................010....................000.............022200................002230............0402221..............0222040............04402220..00000000..12220440............0444122211222222221122204440............0444412222222222222222144440............0444122222222222222222204440............0440222222222552222222220440.............04222222222555522222222240..............02222222222555522222222220..............12222000225555552200022221.............0222200500555555550050022220.........0..0222200500555555551050022220..0.......00222222066555577555506022222200.........122222225555555555555522222221........0010022255550555115550555522200100.......12222555555511188111555555522221......002100555555555188881555555555000200......11795555555555111155555555559700.......0..1995555555555115555555555990..0.........119955555555555555555555991............111119955555555555555559911.000.........55511177555555555555559700.1550.........55370777795555555555977770025551........02217722255555555555522277023350.........1177222225555555555222227022220..........17722222555555555522222702220...........17722222255555555222222771220...........0772222225555555522222277121............077222222955555592222227706..............177222229955559922222770................177222229999999922227770.................1177777111111117777711...................0000000......000000...................................................................................................................................",
557   ".......................................................................................................................................................................10......................00.............122000................000320...........030022200..00000000..102220020..........044402222112222222211222204440..........044440222222222222222222044440...........0444102222222222222222104440............0441222222222222222222220440............0402222222222552222222222040............0422222222225555222222222240.............12222222222555522222222221.............0222220002255555522000222220..........1.0222200500555555550050022220.0........00222220050055555555105002222200.......0.122222206655557755550602222221.0......0002222222555555555555552222222100.......02002225555505511550555552220020......002222255555555118811555555552222200.....0000055555555551881555555555510000.........0.555555555504405555555555.0.............19555555555044655555555591...............119955555556655555559911100........055011117755555555555555970005550.......055577077779555555555597777005550........157717722255555555555522277022220.......117177222225555555555222227022220.........117722222555555555522222702220...........17722222255555555222222771220...........0772222225555555522222277121............077222222955555592222227706..............177222229955559922222770................177722229999999922227770.................1171011111111111111711...................0000............000..................................................................................................................................."
558  ]
559 }
560]
561
types/index.d.ts 26 lines
1export type Track = { url: string; title?: string }
2
3export type PlayerStatus = 'stopped' | 'loading' | 'playing' | 'paused' | 'error'
4
5export type Player = {
6  status: PlayerStatus
7  index: number
8  title: string
9  // Seconds; -1 while unknown (a live stream has no duration).
10  position: number
11  duration: number
12  message?: string
13}
14
15declare module 'claude-code' {
16  interface PluginState {
17    'pixel-player': {
18      player: Player
19      playlist: Track[]
20      skin: string
21      frame: number
22      volume: number
23    }
24  }
25}
26