diff options
Diffstat (limited to 'dotfiles/common/.config')
136 files changed, 34771 insertions, 0 deletions
diff --git a/dotfiles/common/.config/.cmailpass.gpg b/dotfiles/common/.config/.cmailpass.gpg new file mode 100644 index 0000000..48c4632 --- /dev/null +++ b/dotfiles/common/.config/.cmailpass.gpg @@ -0,0 +1,2 @@ +Œ
+O;ŒŠª¨ƒÿÒKꡎÕýg{*F´¤pK4 _á aØ›¶ÎÁmÍrÉj"Τß;܃¢ÒêÌÌ€™ z¼šxx-šìûÝç9Ñô=ü`=£{ôDYà³
\ No newline at end of file diff --git a/dotfiles/common/.config/.gmailpass.gpg b/dotfiles/common/.config/.gmailpass.gpg new file mode 100644 index 0000000..cea3fe1 --- /dev/null +++ b/dotfiles/common/.config/.gmailpass.gpg @@ -0,0 +1 @@ +Œ
¨‘q~–¤9KÿÒEp…é[,/Fd?aNTÒ†o%#JWÙ-«•‚rsšW_£ídíMïG¾>Óv³ª£õÃ~Bñzô²W[˜hQ°r
\ No newline at end of file diff --git a/dotfiles/common/.config/.tidal-dl.json b/dotfiles/common/.config/.tidal-dl.json new file mode 100644 index 0000000..9c39da2 --- /dev/null +++ b/dotfiles/common/.config/.tidal-dl.json @@ -0,0 +1 @@ +{"albumFolderFormat": "{ArtistName}/{AlbumTitle} ({AlbumYear})", "apiKeyIndex": 1, "audioQuality": "HiFi", "checkExist": true, "downloadDelay": true, "downloadPath": "/home/cjennings/music/", "includeEP": true, "language": "0", "lyricFile": false, "multiThread": true, "playlistFolderFormat": "{PlaylistName}", "saveAlbumInfo": false, "saveCovers": true, "showProgress": false, "showTrackInfo": false, "trackFileFormat": "{TrackNumber} {TrackTitle}", "usePlaylistFolder": false, "videoFileFormat": "{VideoNumber} - {ArtistName} - {VideoTitle}", "videoQuality": "P1080"}
\ No newline at end of file diff --git a/dotfiles/common/.config/.tidal-dl.token.json b/dotfiles/common/.config/.tidal-dl.token.json new file mode 100644 index 0000000..64396c3 --- /dev/null +++ b/dotfiles/common/.config/.tidal-dl.token.json @@ -0,0 +1 @@ +eyJhY2Nlc3NUb2tlbiI6ICJleUpyYVdRaU9pSjJPVTFHYkZocVdTSXNJbUZzWnlJNklrVlRNalUySW4wLmV5SjBlWEJsSWpvaWJ6SmZZV05qWlhOeklpd2lkV2xrSWpvek5qa3pOems0TUN3aWMyTnZjR1VpT2lKeVgzVnpjaUIzWDNWemNpQjNYM04xWWlJc0ltZFdaWElpT2pBc0luTldaWElpT2pFc0ltTnBaQ0k2TkRJMU9Td2laWGh3SWpveE56WXdOamcwT1RreUxDSnphV1FpT2lKaE5UTXpaalV3WkMxa056azVMVFExTXpJdE9UUmlNUzAwTWpFd1pqVXdOakZqTURRaUxDSnBjM01pT2lKb2RIUndjem92TDJGMWRHZ3VkR2xrWVd3dVkyOXRMM1l4SW4wLk9VaFJNNFlRMXNJQzB0QTVTX0ptck1FWjlzWmMxcUVwVzlNa203YUlIbDZKQlVxdGdGbnJFcFFBTmx5dFNYYXFDa0E3NWJ2aUV6TldGUE5iQmxyQUh3IiwgImNvdW50cnlDb2RlIjogIlVTIiwgImV4cGlyZXNBZnRlciI6IDE3NjA2ODQ5OTIuMzYzMTA4MiwgInJlZnJlc2hUb2tlbiI6ICJleUpyYVdRaU9pSm9VekZLWVRkVk1DSXNJbUZzWnlJNklrVlROVEV5SW4wLmV5SjBlWEJsSWpvaWJ6SmZjbVZtY21WemFDSXNJblZwWkNJNk16WTVNemM1T0RBc0luTmpiM0JsSWpvaWNsOTFjM0lnZDE5MWMzSWdkMTl6ZFdJaUxDSmphV1FpT2pReU5Ua3NJbk5XWlhJaU9qRXNJbWRXWlhJaU9qQXNJbWx6Y3lJNkltaDBkSEJ6T2k4dllYVjBhQzUwYVdSaGJDNWpiMjB2ZGpFaWZRLkFhQ1FFV1ZvWlZGU2p1NXpPLWJiMXV4QmpGZV9FVG1nWUhRRlpIb1BJQ2xnQW1IcWFBWUY2OXFacURmN0lpVktyLVBmdTRTN1p6ZHhiM3E4Mm5xY2F0WGtBRDNmV01sS0VDekxoNGwxTE50ODBFaU9LZk51T2lWZ2pnMmxpMzdweGltR3RuNGdybW5LS3pUTVlHV0dfSnBHLXY1SWRDdjdYVmtyRTRMNFpEM05DSGo1IiwgInVzZXJpZCI6IDM2OTM3OTgwfQ==
\ No newline at end of file diff --git a/dotfiles/common/.config/audacious/QtUi.conf b/dotfiles/common/.config/audacious/QtUi.conf new file mode 100644 index 0000000..18b3f4c --- /dev/null +++ b/dotfiles/common/.config/audacious/QtUi.conf @@ -0,0 +1,3 @@ +[General] +geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\xe\0\0\x4g\0\0\x2\xef\0\0\0\0\0\0\0\xe\0\0\x4g\0\0\x2\xef\0\0\0\0\0\0\0\0\x4h\0\0\0\0\0\0\0\xe\0\0\x4g\0\0\x2\xef) +windowState=@ByteArray(\0\0\0\xff\0\0\0\0\xfd\0\0\0\0\0\0\x4h\0\0\x2\x93\0\0\0\x4\0\0\0\x4\0\0\0\b\0\0\0\b\xfc\0\0\0\x1\0\0\0\x2\0\0\0\x1\0\0\0\x16\0M\0\x61\0i\0n\0T\0o\0o\0l\0\x42\0\x61\0r\x1\0\0\0\0\xff\xff\xff\xff\0\0\0\0\0\0\0\0) diff --git a/dotfiles/common/.config/audacious/config b/dotfiles/common/.config/audacious/config new file mode 100644 index 0000000..fd1fdd4 --- /dev/null +++ b/dotfiles/common/.config/audacious/config @@ -0,0 +1,23 @@ + +[audacious] +repeat=TRUE + +[audgui] +filesel_path=/home/cjennings/playlists/andor + +[audqt] +icon_theme=audacious-flat +theme=dark + +[qtui] +player_height=738 +player_width=1128 + +[skins] +equalizer_x=178 +equalizer_y=22 +player_x=614 +player_y=442 +playlist_x=674 +playlist_y=181 +skin=/home/cjennings/.local/share/audacious/Skins/nadamp.zip diff --git a/dotfiles/common/.config/audacious/playlist-state b/dotfiles/common/.config/audacious/playlist-state new file mode 100644 index 0000000..985b3d2 --- /dev/null +++ b/dotfiles/common/.config/audacious/playlist-state @@ -0,0 +1,12 @@ +active 1 +playing 1 +playlist 0 +position 0 +shuffle 0 +resume-state 1 +resume-time 84873 +playlist 1 +position 0 +shuffle 0 +resume-state 1 +resume-time 5276 diff --git a/dotfiles/common/.config/audacious/playlists/1000.audpl b/dotfiles/common/.config/audacious/playlists/1000.audpl new file mode 100644 index 0000000..3334184 --- /dev/null +++ b/dotfiles/common/.config/audacious/playlists/1000.audpl @@ -0,0 +1,5 @@ +title=New%20Playlist +uri=file:///home/cjennings/playlists/andor/andor.opus +length=215907 +bitrate=128 +codec=Opus diff --git a/dotfiles/common/.config/audacious/playlists/order b/dotfiles/common/.config/audacious/playlists/order new file mode 100644 index 0000000..c9a7c13 --- /dev/null +++ b/dotfiles/common/.config/audacious/playlists/order @@ -0,0 +1 @@ +1000 1001
\ No newline at end of file diff --git a/dotfiles/common/.config/audacious/plugin-registry b/dotfiles/common/.config/audacious/plugin-registry new file mode 100644 index 0000000..9cedebb --- /dev/null +++ b/dotfiles/common/.config/audacious/plugin-registry @@ -0,0 +1,926 @@ +format 11 +transport /usr/lib/audacious/Transport/gio.so +stamp 1758887725 +version 48 +flags 0 +name GIO Plugin +domain audacious-plugins +priority 0 +about 1 +config 0 +enabled 1 +scheme ftp +scheme sftp +scheme smb +scheme mtp +transport /usr/lib/audacious/Transport/mms.so +stamp 1758887725 +version 48 +flags 0 +name MMS Plugin +domain audacious-plugins +priority 0 +about 0 +config 0 +enabled 1 +scheme mms +transport /usr/lib/audacious/Transport/neon.so +stamp 1758887725 +version 48 +flags 0 +name Neon HTTP/HTTPS Plugin +domain audacious-plugins +priority 0 +about 0 +config 0 +enabled 1 +scheme http +scheme https +playlist /usr/lib/audacious/Container/asx.so +stamp 1758887725 +version 48 +flags 0 +name ASXv1/ASXv2 Playlists +domain audacious-plugins +priority 0 +about 0 +config 0 +enabled 1 +ext asx +saves 0 +playlist /usr/lib/audacious/Container/asx3.so +stamp 1758887725 +version 48 +flags 0 +name ASXv3 Playlists +domain audacious-plugins +priority 0 +about 0 +config 0 +enabled 1 +ext asx +saves 1 +playlist /usr/lib/audacious/Container/audpl.so +stamp 1758887725 +version 48 +flags 0 +name Audacious Playlists (audpl) +domain audacious-plugins +priority 0 +about 0 +config 0 +enabled 1 +ext audpl +saves 1 +playlist /usr/lib/audacious/Container/cue.so +stamp 1758887725 +version 48 +flags 0 +name Cue Sheet Plugin +domain audacious-plugins +priority 0 +about 0 +config 0 +enabled 1 +ext cue +saves 0 +playlist /usr/lib/audacious/Container/m3u.so +stamp 1758887725 +version 48 +flags 0 +name M3U Playlists +domain audacious-plugins +priority 0 +about 0 +config 0 +enabled 1 +ext m3u +ext m3u8 +saves 1 +playlist /usr/lib/audacious/Container/pls.so +stamp 1758887725 +version 48 +flags 0 +name PLS Playlists +domain audacious-plugins +priority 0 +about 0 +config 0 +enabled 1 +ext pls +saves 1 +playlist /usr/lib/audacious/Container/xspf.so +stamp 1758887725 +version 48 +flags 0 +name XML Shareable Playlists (XSPF) +domain audacious-plugins +priority 0 +about 0 +config 0 +enabled 1 +ext xspf +saves 1 +input /usr/lib/audacious/Input/xsf.so +stamp 1758887725 +version 48 +flags 0 +name 2SF Decoder +domain audacious-plugins +priority 5 +about 0 +config 1 +enabled 1 +scheme 2sf +scheme mini2sf +subtunes 0 +writes 0 +input /usr/lib/audacious/Input/aac-raw.so +stamp 1758887725 +version 48 +flags 0 +name AAC (Raw) Decoder +domain audacious-plugins +priority 5 +about 0 +config 0 +enabled 1 +scheme aac +ext audio/aac +subtunes 0 +writes 0 +input /usr/lib/audacious/Input/amidi-plug.so +stamp 1758887725 +version 48 +flags 0 +name AMIDI-Plug (MIDI Player) +domain audacious-plugins +priority 5 +about 1 +config 1 +enabled 1 +scheme mid +scheme midi +scheme rmi +scheme rmid +ext audio/midi +subtunes 0 +writes 0 +input /usr/lib/audacious/Input/cdaudio-ng.so +stamp 1758887725 +version 48 +flags 0 +name Audio CD Plugin +domain audacious-plugins +priority 5 +about 1 +config 1 +enabled 1 +mime cdda +subtunes 2 +writes 0 +input /usr/lib/audacious/Input/console.so +stamp 1758887725 +version 48 +flags 0 +name Game Console Music Decoder +domain audacious-plugins +priority 5 +about 1 +config 1 +enabled 1 +scheme ay +scheme gbs +scheme gym +scheme hes +scheme kss +scheme nsf +scheme nsfe +scheme sap +scheme spc +scheme vgm +scheme vgz +subtunes 2 +writes 0 +input /usr/lib/audacious/Input/madplug.so +stamp 1758887725 +version 48 +flags 0 +name MPG123 Plugin +domain audacious-plugins +priority 5 +about 0 +config 1 +enabled 1 +scheme mp3 +scheme mp2 +scheme mp1 +scheme bmu +ext audio/mp3 +ext audio/mpeg +ext audio/x-mp3 +ext audio/x-mpeg +subtunes 0 +writes 1 +input /usr/lib/audacious/Input/openmpt.so +stamp 1758887725 +version 48 +flags 0 +name OpenMPT (Module Player) +domain audacious-plugins +priority 5 +about 1 +config 1 +enabled 1 +scheme 669 +scheme amf +scheme ams +scheme dbm +scheme digi +scheme dmf +scheme dsm +scheme far +scheme gdm +scheme ice +scheme imf +scheme it +scheme j2b +scheme m15 +scheme mdl +scheme med +scheme mmcmp +scheme mms +scheme mo3 +scheme mod +scheme mptm +scheme mt2 +scheme mtm +scheme nst +scheme okt +scheme plm +scheme ppm +scheme psm +scheme pt36 +scheme ptm +scheme s3m +scheme sfx +scheme sfx2 +scheme st26 +scheme stk +scheme stm +scheme ult +scheme umx +scheme wow +scheme xm +scheme xpk +subtunes 0 +writes 0 +input /usr/lib/audacious/Input/psf2.so +stamp 1758887725 +version 48 +flags 0 +name OpenPSF PSF1/PSF2 Decoder +domain audacious-plugins +priority 5 +about 0 +config 1 +enabled 1 +scheme psf +scheme minipsf +scheme psf2 +scheme minipsf2 +scheme spu +scheme spx +subtunes 0 +writes 0 +input /usr/lib/audacious/Input/opus.so +stamp 1758887725 +version 48 +flags 0 +name Opus Decoder +domain audacious-plugins +priority 5 +about 1 +config 0 +enabled 1 +scheme opus +ext application/ogg +ext audio/ogg +ext audio/opus +ext audio/x-opus+ogg +subtunes 0 +writes 0 +input /usr/lib/audacious/Input/sid.so +stamp 1758887725 +version 48 +flags 0 +name SID Player +domain audacious-plugins +priority 5 +about 0 +config 1 +enabled 1 +scheme sid +scheme psid +ext audio/prs.sid +subtunes 2 +writes 0 +input /usr/lib/audacious/Input/metronom.so +stamp 1758887725 +version 48 +flags 0 +name Tact Generator +domain audacious-plugins +priority 5 +about 1 +config 0 +enabled 1 +mime tact +subtunes 0 +writes 0 +input /usr/lib/audacious/Input/tonegen.so +stamp 1758887725 +version 48 +flags 0 +name Tone Generator +domain audacious-plugins +priority 5 +about 1 +config 0 +enabled 1 +mime tone +subtunes 0 +writes 0 +input /usr/lib/audacious/Input/vtx.so +stamp 1758887725 +version 48 +flags 0 +name VTX Decoder +domain audacious-plugins +priority 5 +about 1 +config 0 +enabled 1 +scheme vtx +subtunes 0 +writes 0 +input /usr/lib/audacious/Input/wavpack.so +stamp 1758887725 +version 48 +flags 0 +name WavPack Decoder +domain audacious-plugins +priority 5 +about 1 +config 0 +enabled 1 +scheme wv +ext audio/x-wavpack +subtunes 0 +writes 1 +input /usr/lib/audacious/Input/flacng.so +stamp 1758887725 +version 48 +flags 0 +name FLAC Decoder +domain audacious-plugins +priority 6 +about 1 +config 0 +enabled 1 +scheme flac +scheme fla +ext audio/flac +ext audio/x-flac +ext audio/ogg +ext application/ogg +subtunes 0 +writes 1 +input /usr/lib/audacious/Input/modplug.so +stamp 1758887725 +version 48 +flags 0 +name ModPlug (Module Player) +domain audacious-plugins +priority 6 +about 0 +config 1 +enabled 1 +scheme amf +scheme ams +scheme dbm +scheme dbf +scheme dsm +scheme far +scheme mdl +scheme stm +scheme ult +scheme mt2 +scheme mod +scheme s3m +scheme dmf +scheme umx +scheme it +scheme 669 +scheme xm +scheme mtm +scheme psm +scheme ft2 +subtunes 2 +writes 0 +input /usr/lib/audacious/Input/vorbis.so +stamp 1758887725 +version 48 +flags 0 +name Ogg Vorbis Decoder +domain audacious-plugins +priority 7 +about 1 +config 0 +enabled 1 +scheme ogg +scheme ogm +scheme oga +ext application/ogg +ext application/x-ogg +ext audio/ogg +ext audio/x-vorbis+ogg +subtunes 0 +writes 1 +input /usr/lib/audacious/Input/sndfile.so +stamp 1758887725 +version 48 +flags 0 +name Sndfile Plugin +domain audacious-plugins +priority 9 +about 1 +config 0 +enabled 1 +scheme aiff +scheme au +scheme raw +scheme wav +ext audio/wav +ext audio/x-wav +subtunes 0 +writes 0 +input /usr/lib/audacious/Input/ffaudio.so +stamp 1758887725 +version 48 +flags 0 +name FFmpeg Plugin +domain audacious-plugins +priority 10 +about 1 +config 0 +enabled 1 +scheme mpc +scheme mp+ +scheme mpp +scheme wma +scheme shn +scheme aa3 +scheme oma +scheme aac +scheme ac3 +scheme adx +scheme ape +scheme dts +scheme vqf +scheme m4a +scheme mp4 +scheme wav +scheme ogg +scheme oga +scheme spx +scheme tta +scheme webm +scheme mka +scheme mkv +ext application/ogg +ext audio/aac +ext audio/mp4 +ext audio/ogg +subtunes 0 +writes 1 +effect /usr/lib/audacious/Effect/bs2b.so +stamp 1758887725 +version 48 +flags 0 +name Bauer Stereophonic-to-Binaural (BS2B) +domain audacious-plugins +priority 0 +about 0 +config 1 +enabled 0 +effect /usr/lib/audacious/Effect/bitcrusher.so +stamp 1758887725 +version 48 +flags 0 +name Bitcrusher +domain audacious-plugins +priority 0 +about 0 +config 1 +enabled 0 +effect /usr/lib/audacious/Effect/crystalizer.so +stamp 1758887725 +version 48 +flags 0 +name Crystalizer +domain audacious-plugins +priority 0 +about 0 +config 1 +enabled 0 +effect /usr/lib/audacious/Effect/compressor.so +stamp 1758887725 +version 48 +flags 0 +name Dynamic Range Compressor +domain audacious-plugins +priority 0 +about 1 +config 1 +enabled 0 +effect /usr/lib/audacious/Effect/echo.so +stamp 1758887725 +version 48 +flags 0 +name Echo +domain audacious-plugins +priority 0 +about 1 +config 1 +enabled 0 +effect /usr/lib/audacious/Effect/stereo.so +stamp 1758887725 +version 48 +flags 0 +name Extra Stereo +domain audacious-plugins +priority 0 +about 1 +config 1 +enabled 0 +effect /usr/lib/audacious/Effect/silence-removal.so +stamp 1758887725 +version 48 +flags 0 +name Silence Removal +domain audacious-plugins +priority 0 +about 1 +config 1 +enabled 0 +effect /usr/lib/audacious/Effect/speed-pitch.so +stamp 1758887725 +version 48 +flags 0 +name Speed and Pitch +domain audacious-plugins +priority 0 +about 0 +config 1 +enabled 0 +effect /usr/lib/audacious/Effect/voice_removal.so +stamp 1758887725 +version 48 +flags 0 +name Voice Removal +domain audacious-plugins +priority 0 +about 0 +config 0 +enabled 0 +effect /usr/lib/audacious/Effect/mixer.so +stamp 1758887725 +version 48 +flags 0 +name Channel Mixer +domain audacious-plugins +priority 2 +about 1 +config 1 +enabled 0 +effect /usr/lib/audacious/Effect/resample.so +stamp 1758887725 +version 48 +flags 0 +name Sample Rate Converter +domain audacious-plugins +priority 2 +about 1 +config 1 +enabled 0 +effect /usr/lib/audacious/Effect/sox-resampler.so +stamp 1758887725 +version 48 +flags 0 +name SoX Resampler +domain audacious-plugins +priority 2 +about 1 +config 1 +enabled 0 +effect /usr/lib/audacious/Effect/crossfade.so +stamp 1758887725 +version 48 +flags 0 +name Crossfade +domain audacious-plugins +priority 5 +about 1 +config 1 +enabled 0 +effect /usr/lib/audacious/Effect/background_music.so +stamp 1758887725 +version 48 +flags 0 +name Background Music +domain audacious-plugins +priority 10 +about 1 +config 1 +enabled 0 +output /usr/lib/audacious/Output/pipewire.so +stamp 1758887725 +version 48 +flags 0 +name PipeWire Output +domain audacious-plugins +priority 2 +about 1 +config 0 +enabled 0 +output /usr/lib/audacious/Output/pulse_audio.so +stamp 1758887725 +version 48 +flags 0 +name PulseAudio Output +domain audacious-plugins +priority 2 +about 1 +config 1 +enabled 1 +output /usr/lib/audacious/Output/alsa.so +stamp 1758887725 +version 48 +flags 0 +name ALSA Output +domain audacious-plugins +priority 5 +about 1 +config 1 +enabled 0 +output /usr/lib/audacious/Output/oss4.so +stamp 1758887725 +version 48 +flags 0 +name OSS3 Output +domain audacious-plugins +priority 6 +about 1 +config 1 +enabled 0 +output /usr/lib/audacious/Output/sdlout.so +stamp 1758887725 +version 48 +flags 0 +name SDL Output +domain audacious-plugins +priority 9 +about 1 +config 0 +enabled 0 +output /usr/lib/audacious/Output/filewriter.so +stamp 1758887725 +version 48 +flags 0 +name FileWriter Plugin +domain audacious-plugins +priority 10 +about 1 +config 1 +enabled 0 +output /usr/lib/audacious/Output/jack-ng.so +stamp 1758887725 +version 48 +flags 0 +name JACK Output +domain audacious-plugins +priority 10 +about 0 +config 1 +enabled 0 +vis /usr/lib/audacious/Visualization/blur_scope-qt.so +stamp 1758887725 +version 48 +flags 2 +name Blur Scope +domain audacious-plugins +priority 0 +about 0 +config 1 +enabled 0 +vis /usr/lib/audacious/Visualization/gl-spectrum-qt.so +stamp 1758887725 +version 48 +flags 2 +name OpenGL Spectrum Analyzer +domain audacious-plugins +priority 0 +about 1 +config 0 +enabled 0 +vis /usr/lib/audacious/Visualization/qt-spectrum.so +stamp 1758887725 +version 48 +flags 2 +name Spectrum Analyzer +domain audacious-plugins +priority 0 +about 0 +config 0 +enabled 0 +vis /usr/lib/audacious/Visualization/vumeter-qt.so +stamp 1758887725 +version 48 +flags 2 +name VU Meter +domain audacious-plugins +priority 0 +about 1 +config 1 +enabled 0 +general /usr/lib/audacious/General/albumart-qt.so +stamp 1758887725 +version 48 +flags 2 +name Album Art +domain audacious-plugins +priority 0 +about 0 +config 0 +enabled 0 +general /usr/lib/audacious/General/cd-menu-items.so +stamp 1758887725 +version 48 +flags 0 +name Audio CD Menu Items +domain audacious-plugins +priority 0 +about 0 +config 0 +enabled 1 +general /usr/lib/audacious/General/delete-files.so +stamp 1758887725 +version 48 +flags 0 +name Delete Files +domain audacious-plugins +priority 0 +about 0 +config 1 +enabled 0 +general /usr/lib/audacious/General/notify.so +stamp 1758887725 +version 48 +flags 0 +name Desktop Notifications +domain audacious-plugins +priority 0 +about 1 +config 1 +enabled 0 +general /usr/lib/audacious/General/qthotkey.so +stamp 1758887725 +version 48 +flags 2 +name Global Hotkeys +domain audacious-plugins +priority 0 +about 1 +config 1 +enabled 0 +general /usr/lib/audacious/General/lirc.so +stamp 1758887725 +version 48 +flags 0 +name LIRC Plugin +domain audacious-plugins +priority 0 +about 1 +config 1 +enabled 0 +general /usr/lib/audacious/General/lyrics-qt.so +stamp 1758887725 +version 48 +flags 2 +name Lyrics +domain audacious-plugins +priority 0 +about 0 +config 1 +enabled 0 +general /usr/lib/audacious/General/mpris2.so +stamp 1758887725 +version 48 +flags 0 +name MPRIS 2 Server +domain audacious-plugins +priority 0 +about 1 +config 0 +enabled 1 +general /usr/lib/audacious/General/playback-history-qt.so +stamp 1758887725 +version 48 +flags 2 +name Playback History +domain audacious-plugins +priority 0 +about 1 +config 1 +enabled 0 +general /usr/lib/audacious/General/playlist-manager-qt.so +stamp 1758887725 +version 48 +flags 2 +name Playlist Manager +domain audacious-plugins +priority 0 +about 0 +config 0 +enabled 0 +general /usr/lib/audacious/General/scrobbler.so +stamp 1758887725 +version 48 +flags 0 +name Scrobbler 2.0 +domain audacious-plugins +priority 0 +about 1 +config 1 +enabled 0 +general /usr/lib/audacious/General/search-tool-qt.so +stamp 1758887725 +version 48 +flags 2 +name Search Tool +domain audacious-plugins +priority 0 +about 0 +config 1 +enabled 0 +general /usr/lib/audacious/General/song_change.so +stamp 1758887725 +version 48 +flags 0 +name Song Change +domain audacious-plugins +priority 0 +about 0 +config 1 +enabled 0 +general /usr/lib/audacious/General/song-info-qt.so +stamp 1758887725 +version 48 +flags 2 +name Song Info +domain audacious-plugins +priority 0 +about 0 +config 0 +enabled 0 +general /usr/lib/audacious/General/statusicon-qt.so +stamp 1758887725 +version 48 +flags 2 +name Status Icon +domain audacious-plugins +priority 0 +about 1 +config 1 +enabled 0 +iface /usr/lib/audacious/General/qtui.so +stamp 1758887725 +version 48 +flags 2 +name Qt Interface +domain audacious-plugins +priority 0 +about 0 +config 1 +enabled 0 +iface /usr/lib/audacious/General/skins-qt.so +stamp 1758887725 +version 48 +flags 2 +name Winamp Classic Interface +domain audacious-plugins +priority 0 +about 0 +config 1 +enabled 1 diff --git a/dotfiles/common/.config/calibre/conversion/azw3_output.py b/dotfiles/common/.config/calibre/conversion/azw3_output.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/dotfiles/common/.config/calibre/conversion/azw3_output.py diff --git a/dotfiles/common/.config/calibre/conversion/comic_input.py b/dotfiles/common/.config/calibre/conversion/comic_input.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/dotfiles/common/.config/calibre/conversion/comic_input.py diff --git a/dotfiles/common/.config/calibre/conversion/debug.py b/dotfiles/common/.config/calibre/conversion/debug.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/dotfiles/common/.config/calibre/conversion/debug.py diff --git a/dotfiles/common/.config/calibre/conversion/docx_input.py b/dotfiles/common/.config/calibre/conversion/docx_input.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/dotfiles/common/.config/calibre/conversion/docx_input.py diff --git a/dotfiles/common/.config/calibre/conversion/docx_output.py b/dotfiles/common/.config/calibre/conversion/docx_output.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/dotfiles/common/.config/calibre/conversion/docx_output.py diff --git a/dotfiles/common/.config/calibre/conversion/epub_output.py b/dotfiles/common/.config/calibre/conversion/epub_output.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/dotfiles/common/.config/calibre/conversion/epub_output.py diff --git a/dotfiles/common/.config/calibre/conversion/fb2_input.py b/dotfiles/common/.config/calibre/conversion/fb2_input.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/dotfiles/common/.config/calibre/conversion/fb2_input.py diff --git a/dotfiles/common/.config/calibre/conversion/fb2_output.py b/dotfiles/common/.config/calibre/conversion/fb2_output.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/dotfiles/common/.config/calibre/conversion/fb2_output.py diff --git a/dotfiles/common/.config/calibre/conversion/heuristics.py b/dotfiles/common/.config/calibre/conversion/heuristics.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/dotfiles/common/.config/calibre/conversion/heuristics.py diff --git a/dotfiles/common/.config/calibre/conversion/htmlz_output.py b/dotfiles/common/.config/calibre/conversion/htmlz_output.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/dotfiles/common/.config/calibre/conversion/htmlz_output.py diff --git a/dotfiles/common/.config/calibre/conversion/kepub_output.py b/dotfiles/common/.config/calibre/conversion/kepub_output.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/dotfiles/common/.config/calibre/conversion/kepub_output.py diff --git a/dotfiles/common/.config/calibre/conversion/look_and_feel.py b/dotfiles/common/.config/calibre/conversion/look_and_feel.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/dotfiles/common/.config/calibre/conversion/look_and_feel.py diff --git a/dotfiles/common/.config/calibre/conversion/lrf_output.py b/dotfiles/common/.config/calibre/conversion/lrf_output.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/dotfiles/common/.config/calibre/conversion/lrf_output.py diff --git a/dotfiles/common/.config/calibre/conversion/metadata.py b/dotfiles/common/.config/calibre/conversion/metadata.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/dotfiles/common/.config/calibre/conversion/metadata.py diff --git a/dotfiles/common/.config/calibre/conversion/mobi_output.py b/dotfiles/common/.config/calibre/conversion/mobi_output.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/dotfiles/common/.config/calibre/conversion/mobi_output.py diff --git a/dotfiles/common/.config/calibre/conversion/page_setup.py b/dotfiles/common/.config/calibre/conversion/page_setup.py new file mode 100644 index 0000000..d54ecbb --- /dev/null +++ b/dotfiles/common/.config/calibre/conversion/page_setup.py @@ -0,0 +1,3 @@ +json:{ + "output_profile": "kobo" +}
\ No newline at end of file diff --git a/dotfiles/common/.config/calibre/conversion/pdb_output.py b/dotfiles/common/.config/calibre/conversion/pdb_output.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/dotfiles/common/.config/calibre/conversion/pdb_output.py diff --git a/dotfiles/common/.config/calibre/conversion/pdf_input.py b/dotfiles/common/.config/calibre/conversion/pdf_input.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/dotfiles/common/.config/calibre/conversion/pdf_input.py diff --git a/dotfiles/common/.config/calibre/conversion/pdf_output.py b/dotfiles/common/.config/calibre/conversion/pdf_output.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/dotfiles/common/.config/calibre/conversion/pdf_output.py diff --git a/dotfiles/common/.config/calibre/conversion/pmlz_output.py b/dotfiles/common/.config/calibre/conversion/pmlz_output.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/dotfiles/common/.config/calibre/conversion/pmlz_output.py diff --git a/dotfiles/common/.config/calibre/conversion/rb_output.py b/dotfiles/common/.config/calibre/conversion/rb_output.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/dotfiles/common/.config/calibre/conversion/rb_output.py diff --git a/dotfiles/common/.config/calibre/conversion/rtf_input.py b/dotfiles/common/.config/calibre/conversion/rtf_input.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/dotfiles/common/.config/calibre/conversion/rtf_input.py diff --git a/dotfiles/common/.config/calibre/conversion/search_and_replace.py b/dotfiles/common/.config/calibre/conversion/search_and_replace.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/dotfiles/common/.config/calibre/conversion/search_and_replace.py diff --git a/dotfiles/common/.config/calibre/conversion/snb_output.py b/dotfiles/common/.config/calibre/conversion/snb_output.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/dotfiles/common/.config/calibre/conversion/snb_output.py diff --git a/dotfiles/common/.config/calibre/conversion/structure_detection.py b/dotfiles/common/.config/calibre/conversion/structure_detection.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/dotfiles/common/.config/calibre/conversion/structure_detection.py diff --git a/dotfiles/common/.config/calibre/conversion/toc.py b/dotfiles/common/.config/calibre/conversion/toc.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/dotfiles/common/.config/calibre/conversion/toc.py diff --git a/dotfiles/common/.config/calibre/conversion/txt_input.py b/dotfiles/common/.config/calibre/conversion/txt_input.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/dotfiles/common/.config/calibre/conversion/txt_input.py diff --git a/dotfiles/common/.config/calibre/conversion/txt_output.py b/dotfiles/common/.config/calibre/conversion/txt_output.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/dotfiles/common/.config/calibre/conversion/txt_output.py diff --git a/dotfiles/common/.config/calibre/conversion/txtz_output.py b/dotfiles/common/.config/calibre/conversion/txtz_output.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/dotfiles/common/.config/calibre/conversion/txtz_output.py diff --git a/dotfiles/common/.config/calibre/custom_recipes/The Economist_1001.recipe b/dotfiles/common/.config/calibre/custom_recipes/The Economist_1001.recipe new file mode 100644 index 0000000..bcb8364 --- /dev/null +++ b/dotfiles/common/.config/calibre/custom_recipes/The Economist_1001.recipe @@ -0,0 +1,684 @@ +#!/usr/bin/env python +# License: GPLv3 Copyright: 2008, Kovid Goyal <kovid at kovidgoyal.net> + +import json +import re +import time +from collections import defaultdict +from datetime import datetime, timedelta +from urllib.parse import quote, urlencode +from uuid import uuid4 + +from html5_parser import parse +from lxml import etree + +from calibre import replace_entities +from calibre.ebooks.BeautifulSoup import BeautifulSoup, NavigableString, Tag +from calibre.ptempfile import PersistentTemporaryFile +from calibre.scraper.simple import read_url +from calibre.utils.date import parse_only_date +from calibre.web.feeds.news import BasicNewsRecipe + + +def E(parent, name, text='', **attrs): + ans = parent.makeelement(name, **attrs) + ans.text = text + parent.append(ans) + return ans + + +def process_node(node, html_parent): + ntype = node.get('type') + if ntype == 'tag': + c = html_parent.makeelement(node['name']) + c.attrib.update({k: v or '' for k, v in node.get('attribs', {}).items()}) + html_parent.append(c) + for nc in node.get('children', ()): + process_node(nc, c) + elif ntype == 'text': + text = node.get('data') + if text: + text = replace_entities(text) + if len(html_parent): + t = html_parent[-1] + t.tail = (t.tail or '') + text + else: + html_parent.text = (html_parent.text or '') + text + + +def safe_dict(data, *names): + ans = data + for x in names: + ans = ans.get(x) or {} + return ans + + +class JSONHasNoContent(ValueError): + pass + + +def load_article_from_json(raw, root): + # open('/t/raw.json', 'w').write(raw) + data = json.loads(raw) + body = root.xpath('//body')[0] + article = E(body, 'article') + E(article, 'div', data['flyTitle'], style='color: red; font-size:small; font-weight:bold;') + E(article, 'h1', data['title'], title=safe_dict(data, 'url', 'canonical') or '') + E(article, 'div', data['rubric'], style='font-style: italic; color:#202020;') + try: + date = data['dateModified'] + except Exception: + date = data['datePublished'] + dt = datetime.fromisoformat(date[:-1]) + timedelta(seconds=time.timezone) + dt = dt.strftime('%b %d, %Y %I:%M %p') + if data['dateline'] is None: + E(article, 'p', dt, style='color: gray; font-size:small;') + else: + E(article, 'p', dt + ' | ' + (data['dateline']), style='color: gray; font-size:small;') + main_image_url = safe_dict(data, 'image', 'main', 'url').get('canonical') + if main_image_url: + div = E(article, 'div') + try: + E(div, 'img', src=main_image_url) + except Exception: + pass + for node in data.get('text') or (): + process_node(node, article) + + +def process_web_list(li_node): + li_html = '' + for li in li_node['items']: + if li.get('textHtml'): + li_html += f'<li>{li.get("textHtml")}</li>' + else: + li_html += f'<li>{li.get("text", "")}</li>' + return li_html + + +def process_info_box(bx): + info = '' + for x in safe_dict(bx, 'components'): + info += f'<blockquote>{process_web_node(x)}</blockquote>' + return info + + +def process_web_node(node): + ntype = node.get('type', '') + if ntype == 'CROSSHEAD': + if node.get('textHtml'): + return f'<h4>{node.get("textHtml")}</h4>' + return f'<h4>{node.get("text", "")}</h4>' + elif ntype in ['PARAGRAPH', 'BOOK_INFO']: + if node.get('textHtml'): + return f'<p>{node.get("textHtml")}</p>' + return f'<p>{node.get("text", "")}</p>' + elif ntype == 'IMAGE': + alt = '' if node.get('altText') is None else node.get('altText') + cap = '' + if node.get('caption'): + if node['caption'].get('textHtml') is not None: + cap = node['caption']['textHtml'] + return f'<div><img src="{node["url"]}" title="{alt}"></div><div style="text-align:center; font-size:small;">{cap}</div>' + elif ntype == 'PULL_QUOTE': + if node.get('textHtml'): + return f'<blockquote>{node.get("textHtml")}</blockquote>' + return f'<blockquote>{node.get("text", "")}</blockquote>' + elif ntype == 'DIVIDER': + return '<hr>' + elif ntype == 'INFOGRAPHIC': + if node.get('fallback'): + return process_web_node(node['fallback']) + elif ntype == 'INFOBOX': + return process_info_box(node) + elif ntype == 'UNORDERED_LIST': + if node.get('items'): + return process_web_list(node) + elif ntype: + print('** ', ntype) + return '' + + +def load_article_from_web_json(raw): + # open('/t/raw.json', 'w').write(raw) + body = '' + try: + data = json.loads(raw)['props']['pageProps']['cp2Content'] + except Exception: + data = json.loads(raw)['props']['pageProps']['content'] + body += f'<div style="color: red; font-size:small; font-weight:bold;">{data.get("flyTitle", "")}</div>' + body += f'<h1>{data["headline"]}</h1>' + if data.get('rubric') and data.get('rubric') is not None: + body += f'<div style="font-style: italic; color:#202020;">{data.get("rubric", "")}</div>' + try: + date = data['dateModified'] + except Exception: + date = data['datePublished'] + dt = datetime.fromisoformat(date[:-1]) + timedelta(seconds=time.timezone) + dt = dt.strftime('%b %d, %Y %I:%M %p') + if data.get('dateline') is None: + body += f'<p style="color: gray; font-size: small;">{dt}</p>' + else: + body += f'<p style="color: gray; font-size: small;">{dt + " | " + (data["dateline"])}</p>' + main_image_url = safe_dict(data, 'leadComponent') or '' + if main_image_url: + body += process_web_node(data['leadComponent']) + for node in data.get('body'): + body += process_web_node(node) + return '<html><body><article>' + body + '</article></body></html>' + + +def cleanup_html_article(root): + main = root.xpath('//main')[0] + body = root.xpath('//body')[0] + for child in tuple(body): + body.remove(child) + body.append(main) + main.set('id', '') + main.tag = 'article' + for x in root.xpath('//*[@style]'): + x.set('style', '') + for x in root.xpath('//button'): + x.getparent().remove(x) + + +def classes(classes): + q = frozenset(classes.split(' ')) + return dict(attrs={ + 'class': lambda x: x and frozenset(x.split()).intersection(q)}) + + +def new_tag(soup, name, attrs=()): + impl = getattr(soup, 'new_tag', None) + if impl is not None: + return impl(name, attrs=dict(attrs)) + return Tag(soup, name, attrs=attrs or None) + + +class NoArticles(Exception): + pass + + +def process_url(url): + if url.startswith('/'): + url = 'https://www.economist.com' + url + return url + + +class Economist(BasicNewsRecipe): + title = 'The Economist' + language = 'en_GB' + encoding = 'utf-8' + masthead_url = 'https://www.livemint.com/lm-img/dev/economist-logo-oneline.png' + + __author__ = 'Kovid Goyal' + description = ( + 'Global news and current affairs from a European' + ' perspective. Best downloaded on Friday mornings (GMT)' + ) + extra_css = ''' + em { color:#202020; } + img {display:block; margin:0 auto;} + ''' + oldest_article = 7.0 + resolve_internal_links = True + remove_tags = [ + dict(name=['script', 'noscript', 'title', 'iframe', 'cf_floatingcontent', 'aside', 'footer', 'svg']), + dict(attrs={'aria-label': 'Article Teaser'}), + dict(attrs={'id': 'player'}), + dict(attrs={ + 'class': [ + 'dblClkTrk', 'ec-article-info', 'share_inline_header', + 'related-items', 'main-content-container', 'ec-topic-widget', + 'teaser', 'blog-post__bottom-panel-bottom', 'blog-post__comments-label', + 'blog-post__foot-note', 'blog-post__sharebar', 'blog-post__bottom-panel', + 'newsletter-form', 'share-links-header', 'teaser--wrapped', 'latest-updates-panel__container', + 'latest-updates-panel__article-link', 'blog-post__section' + ] + } + ), + dict(attrs={ + 'class': lambda x: x and 'blog-post__siblings-list-aside' in x.split()}), + dict(attrs={'id': lambda x: x and 'gpt-ad-slot' in x}), + classes( + 'share-links-header teaser--wrapped latest-updates-panel__container' + ' latest-updates-panel__article-link blog-post__section newsletter-form blog-post__bottom-panel' + ) + ] + keep_only_tags = [dict(name='article', id=lambda x: not x)] + no_stylesheets = True + remove_attributes = ['data-reactid', 'width', 'height'] + # economist.com has started throttling after about 60% of the total has + # downloaded with connection reset by peer (104) errors. + delay = 3 + browser_type = 'webengine' + from_archive = True + recipe_specific_options = { + 'date': { + 'short': 'The date of the edition to download (YYYY-MM-DD format)', + 'long': 'For example, 2024-07-19', + }, + 'res': { + 'short': 'For hi-res images, select a resolution from the\nfollowing options: 834, 960, 1096, 1280, 1424', + 'long': 'This is useful for non e-ink devices, and for a lower file size\nthan the default, use from 480, 384, 360, 256.', + 'default': '600', + }, + 'de': { + 'short': 'Web Edition', + 'long': 'Yes/No. Digital Edition does not skip some articles based on your location.', + 'default': 'No', + } + } + + def __init__(self, *args, **kwargs): + BasicNewsRecipe.__init__(self, *args, **kwargs) + d = self.recipe_specific_options.get('de') + if d and isinstance(d, str): + if d.lower().strip() == 'yes': + self.from_archive = True + + needs_subscription = False + + def get_browser(self, *args, **kwargs): + if self.from_archive: + kwargs['user_agent'] = ( + 'Mozilla/5.0 (Linux; Android 14) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.6533.103 Mobile Safari/537.36 Liskov' + ) + br = BasicNewsRecipe.get_browser(self, *args, **kwargs) + else: + kwargs['user_agent'] = 'TheEconomist-Lamarr-android' + br = BasicNewsRecipe.get_browser(self, *args, **kwargs) + br.addheaders += [ + ('accept', '*/*'), + ('content-type', 'application/json'), + ('apollographql-client-name', 'mobile-app-apollo'), + ('apollographql-client-version', '3.50.0'), + ('x-request-id', str(uuid4())), + ] + return br + + def publication_date(self): + edition_date = self.recipe_specific_options.get('date') + if edition_date and isinstance(edition_date, str): + return parse_only_date(edition_date, as_utc=False) + try: + url = self.browser.open('https://www.economist.com/printedition').geturl() + except Exception as e: + self.log('Failed to fetch publication date with error: ' + str(e)) + return super().publication_date() + return parse_only_date(url.split('/')[-1], as_utc=False) + + def economist_test_article(self): + return [('Articles', [{'title':'test', + 'url':'https://www.economist.com/leaders/2025/03/13/americas-bullied-allies-need-to-toughen-up' + }])] + + def economist_return_index(self, ans): + if not ans: + raise NoArticles( + 'Could not find any articles, either the ' + 'economist.com server is having trouble and you should ' + 'try later or the website format has changed and the ' + 'recipe needs to be updated.' + ) + return ans + + def get_content_id(self, ed_date): + id_query = { + 'query': 'query EditionsQuery($from:Int$size:Int$ref:String!){section:canonical(ref:$ref){...EditionFragment __typename}}fragment EditionFragment on Content{hasPart(from:$from size:$size sort:"datePublished:desc"){total parts{id datePublished image{...ImageCoverFragment __typename}__typename}__typename}__typename}fragment ImageCoverFragment on Media{cover{headline width height url{canonical __typename}regionsAllowed __typename}__typename}', # noqa: E501 + 'operationName': 'EditionsQuery', + 'variables':'{"from":0,"size":24,"ref":"/content/d06tg8j85rifiq3oo544c6b9j61dno2n"}', + } + id_url = 'https://cp2-graphql-gateway.p.aws.economist.com/graphql?' + urlencode(id_query, safe='()!', quote_via=quote) + raw_id_data = self.index_to_soup(id_url, raw=True) + data = json.loads(raw_id_data)['data']['section']['hasPart']['parts'] + for x in data: + if ed_date in x['datePublished']: + return x['id'] + return None + + def parse_index(self): + if self.from_archive: + return self.parse_web_index() + edition_date = self.recipe_specific_options.get('date') + # return self.economist_test_article() + # url = 'https://www.economist.com/weeklyedition/archive' + query = { + 'query': 'query LatestWeeklyAutoEditionQuery($ref:String!){canonical(ref:$ref){hasPart(from:0 size:1 sort:"datePublished:desc"){parts{...WeeklyEditionFragment __typename}__typename}__typename}}fragment WeeklyEditionFragment on Content{id type datePublished image{...ImageCoverFragment __typename}url{canonical __typename}hasPart(size:100 sort:"publication.context.position"){parts{...ArticleFragment __typename}__typename}__typename}fragment ArticleFragment on Content{ad{grapeshot{channels{name __typename}__typename}__typename}articleSection{internal{id title:headline __typename}__typename}audio{main{id duration(format:"seconds")source:channel{id __typename}url{canonical __typename}__typename}__typename}byline dateline dateModified datePublished dateRevised flyTitle:subheadline id image{...ImageInlineFragment ...ImageMainFragment ...ImagePromoFragment __typename}print{title:headline flyTitle:subheadline rubric:description section{id title:headline __typename}__typename}publication{id tegID title:headline flyTitle:subheadline datePublished regionsAllowed url{canonical __typename}__typename}rubric:description source:channel{id __typename}tegID text(format:"json")title:headline type url{canonical __typename}topic contentIdentity{forceAppWebview mediaType articleType __typename}__typename}fragment ImageInlineFragment on Media{inline{url{canonical __typename}width height __typename}__typename}fragment ImageMainFragment on Media{main{url{canonical __typename}width height __typename}__typename}fragment ImagePromoFragment on Media{promo{url{canonical __typename}id width height __typename}__typename}fragment ImageCoverFragment on Media{cover{headline width height url{canonical __typename}regionsAllowed __typename}__typename}', # noqa: E501 + 'operationName': 'LatestWeeklyAutoEditionQuery', + 'variables': '{"ref":"/content/d06tg8j85rifiq3oo544c6b9j61dno2n"}', + } + if edition_date and isinstance(edition_date, str): + content_id = self.get_content_id(edition_date) + if content_id: + query = { + 'query': 'query SpecificWeeklyEditionQuery($path:String!){section:canonical(ref:$path){...WeeklyEditionFragment __typename}}fragment WeeklyEditionFragment on Content{id type datePublished image{...ImageCoverFragment __typename}url{canonical __typename}hasPart(size:100 sort:"publication.context.position"){parts{...ArticleFragment __typename}__typename}__typename}fragment ArticleFragment on Content{ad{grapeshot{channels{name __typename}__typename}__typename}articleSection{internal{id title:headline __typename}__typename}audio{main{id duration(format:"seconds")source:channel{id __typename}url{canonical __typename}__typename}__typename}byline dateline dateModified datePublished dateRevised flyTitle:subheadline id image{...ImageInlineFragment ...ImageMainFragment ...ImagePromoFragment __typename}print{title:headline flyTitle:subheadline rubric:description section{id title:headline __typename}__typename}publication{id tegID title:headline flyTitle:subheadline datePublished regionsAllowed url{canonical __typename}__typename}rubric:description source:channel{id __typename}tegID text(format:"json")title:headline type url{canonical __typename}topic contentIdentity{forceAppWebview mediaType articleType __typename}__typename}fragment ImageInlineFragment on Media{inline{url{canonical __typename}width height __typename}__typename}fragment ImageMainFragment on Media{main{url{canonical __typename}width height __typename}__typename}fragment ImagePromoFragment on Media{promo{url{canonical __typename}id width height __typename}__typename}fragment ImageCoverFragment on Media{cover{headline width height url{canonical __typename}regionsAllowed __typename}__typename}', # noqa: E501 + 'operationName': 'SpecificWeeklyEditionQuery', + 'variables': '{{"path":"{}"}}'.format(content_id), + } + url = 'https://cp2-graphql-gateway.p.aws.economist.com/graphql?' + urlencode(query, safe='()!', quote_via=quote) + try: + if edition_date and isinstance(edition_date, str): + if not content_id: + self.log(edition_date, ' not found, trying web edition.') + self.from_archive = True + return self.parse_web_index() + raw = self.index_to_soup(url, raw=True) + except Exception: + self.log('Digital Edition Server is not reachable, try again after some time.') + self.from_archive = True + return self.parse_web_index() + ans = self.economist_parse_index(raw) + return self.economist_return_index(ans) + + def economist_parse_index(self, raw): + # edition_date = self.recipe_specific_options.get('date') + # if edition_date and isinstance(edition_date, str): + # data = json.loads(raw)['data']['section'] + # else: + # data = json.loads(raw)['data']['canonical']['hasPart']['parts'][0] + try: + data = json.loads(raw)['data']['section'] + except KeyError: + data = json.loads(raw)['data']['canonical']['hasPart']['parts'][0] + dt = datetime.fromisoformat(data['datePublished'][:-1]) + timedelta(seconds=time.timezone) + dt = dt.strftime('%b %d, %Y') + self.timefmt = ' [' + dt + ']' + # get local issue cover, title + try: + region = json.loads(self.index_to_soup('https://geolocation-db.com/json', raw=True))['country_code'] + except Exception: + region = '' + for cov in data['image']['cover']: + if region in cov['regionsAllowed']: + self.description = cov['headline'] + self.cover_url = cov['url']['canonical'].replace('economist.com/', + 'economist.com/cdn-cgi/image/width=960,quality=80,format=auto/') + break + else: + self.description = data['image']['cover'][0]['headline'] + self.cover_url = data['image']['cover'][0]['url']['canonical'].replace('economist.com/', + 'economist.com/cdn-cgi/image/width=960,quality=80,format=auto/') + self.log('Got cover:', self.cover_url, '\n', self.description) + + feeds_dict = defaultdict(list) + for part in safe_dict(data, 'hasPart', 'parts'): + try: + section = part['articleSection']['internal'][0]['title'] + except Exception: + section = safe_dict(part, 'print', 'section', 'title') or 'section' + if section not in feeds_dict: + self.log(section) + title = safe_dict(part, 'title') + desc = safe_dict(part, 'rubric') or '' + sub = safe_dict(part, 'flyTitle') or '' + if sub and section != sub: + desc = sub + ' :: ' + desc + pt = PersistentTemporaryFile('.html') + pt.write(json.dumps(part).encode('utf-8')) + pt.close() + url = 'file:///' + pt.name + feeds_dict[section].append({'title': title, 'url': url, 'description': desc}) + self.log('\t', title, '\n\t\t', desc) + return list(feeds_dict.items()) + + def populate_article_metadata(self, article, soup, first): + if not self.from_archive: + article.url = soup.find('h1')['title'] + + def preprocess_html(self, soup): + width = '600' + w = self.recipe_specific_options.get('res') + if w and isinstance(w, str): + width = w + for img in soup.findAll('img', src=True): + qua = 'economist.com/cdn-cgi/image/width=' + width + ',quality=80,format=auto/' + img['src'] = img['src'].replace('economist.com/', qua) + return soup + + def preprocess_raw_html(self, raw, url): + if self.from_archive: + return self.preprocess_raw_web_html(raw, url) + + # open('/t/raw.html', 'wb').write(raw.encode('utf-8')) + + body = '<html><body><article></article></body></html>' + root = parse(body) + load_article_from_json(raw, root) + + if '/interactive/' in url: + return ('<html><body><article><h1>' + root.xpath('//h1')[0].text + '</h1><em>' + 'This article is supposed to be read in a browser.' + '</em></article></body></html>') + + for div in root.xpath('//div[@class="lazy-image"]'): + noscript = list(div.iter('noscript')) + if noscript and noscript[0].text: + img = list(parse(noscript[0].text).iter('img')) + if img: + p = noscript[0].getparent() + idx = p.index(noscript[0]) + p.insert(idx, p.makeelement('img', src=img[0].get('src'))) + p.remove(noscript[0]) + for x in root.xpath('//*[name()="script" or name()="style" or name()="source" or name()="meta"]'): + x.getparent().remove(x) + # the economist uses <small> for small caps with a custom font + for init in root.xpath('//span[@data-caps="initial"]'): + init.set('style', 'font-weight:bold;') + for x in root.xpath('//small'): + if x.text and len(x) == 0: + x.text = x.text.upper() + x.tag = 'span' + x.set('style', 'font-variant: small-caps') + for h2 in root.xpath('//h2'): + h2.tag = 'h4' + for x in root.xpath('//figcaption'): + x.set('style', 'text-align:center; font-size:small;') + for x in root.xpath('//cite'): + x.tag = 'blockquote' + x.set('style', 'color:#404040;') + raw = etree.tostring(root, encoding='unicode') + return raw + + def parse_index_from_printedition(self): + # return self.economist_test_article() + edition_date = self.recipe_specific_options.get('date') + if edition_date and isinstance(edition_date, str): + url = 'https://www.economist.com/weeklyedition/' + edition_date + self.timefmt = ' [' + edition_date + ']' + else: + url = 'https://www.economist.com/printedition' + # raw = open('/t/raw.html').read() + raw = self.index_to_soup(url, raw=True) + # with open('/t/raw.html', 'wb') as f: + # f.write(raw) + soup = self.index_to_soup(raw) + # nav = soup.find(attrs={'class':'navigation__wrapper'}) + # if nav is not None: + # a = nav.find('a', href=lambda x: x and '/printedition/' in x) + # if a is not None: + # self.log('Following nav link to current edition', a['href']) + # soup = self.index_to_soup(process_url(a['href'])) + ans = self.economist_parse_index(soup) + if not ans: + raise NoArticles( + 'Could not find any articles, either the ' + 'economist.com server is having trouble and you should ' + 'try later or the website format has changed and the ' + 'recipe needs to be updated.' + ) + return ans + + def eco_find_image_tables(self, soup): + for x in soup.findAll('table', align=['right', 'center']): + if len(x.findAll('font')) in (1, 2) and len(x.findAll('img')) == 1: + yield x + + def postprocess_html(self, soup, first): + for img in soup.findAll('img', srcset=True): + del img['srcset'] + for table in list(self.eco_find_image_tables(soup)): + caption = table.find('font') + img = table.find('img') + div = new_tag(soup, 'div') + div['style'] = 'text-align:left;font-size:70%' + ns = NavigableString(self.tag_to_string(caption)) + div.insert(0, ns) + div.insert(1, new_tag(soup, 'br')) + del img['width'] + del img['height'] + img.extract() + div.insert(2, img) + table.replaceWith(div) + return soup + + def canonicalize_internal_url(self, url, is_link=True): + if url.endswith('/print'): + url = url.rpartition('/')[0] + return BasicNewsRecipe.canonicalize_internal_url(self, url, is_link=is_link) + + # archive code + def parse_web_index(self): + edition_date = self.recipe_specific_options.get('date') + # return self.economist_test_article() + if edition_date and isinstance(edition_date, str): + url = 'https://www.economist.com/weeklyedition/' + edition_date + self.timefmt = ' [' + edition_date + ']' + else: + url = 'https://www.economist.com/weeklyedition' + soup = self.index_to_soup(url) + ans = self.economist_parse_web_index(soup) + return self.economist_return_index(ans) + + def economist_parse_web_index(self, soup): + script_tag = soup.find('script', id='__NEXT_DATA__') + if script_tag is not None: + data = json.loads(script_tag.string) + # open('/t/raw.json', 'w').write(json.dumps(data, indent=2, sort_keys=True)) + self.description = safe_dict(data, 'props', 'pageProps', 'content', 'headline') + self.timefmt = ' [' + safe_dict(data, 'props', 'pageProps', 'content', 'formattedIssueDate') + ']' + self.cover_url = safe_dict(data, 'props', 'pageProps', 'content', 'cover', 'url').replace( + 'economist.com/', 'economist.com/cdn-cgi/image/width=960,quality=80,format=auto/').replace('SQ_', '') + self.log('Got cover:', self.cover_url) + + feeds = [] + + for part in safe_dict( + data, 'props', 'pageProps', 'content', 'headerSections' + ) + safe_dict(data, 'props', 'pageProps', 'content', 'sections'): + section = safe_dict(part, 'name') or '' + if not section: + continue + self.log(section) + + articles = [] + + for ar in part['articles']: + title = safe_dict(ar, 'headline') or '' + url = process_url(safe_dict(ar, 'url') or '') + if not title or not url: + continue + desc = safe_dict(ar, 'rubric') or '' + sub = safe_dict(ar, 'flyTitle') or '' + if sub and section != sub: + desc = sub + ' :: ' + desc + self.log('\t', title, '\n\t', desc, '\n\t\t', url) + articles.append({'title': title, 'url': url, 'description': desc}) + feeds.append((section, articles)) + return feeds + else: + return [] + + def preprocess_raw_web_html(self, raw, url): + # open('/t/raw.html', 'wb').write(raw.encode('utf-8')) + root_ = parse(raw) + if '/interactive/' in url: + return ('<html><body><article><h1>' + root_.xpath('//h1')[0].text + '</h1><em>' + 'This article is supposed to be read in a browser' + '</em></article></body></html>') + + script = root_.xpath('//script[@id="__NEXT_DATA__"]') + + html = load_article_from_web_json(script[0].text) + + root = parse(html) + for div in root.xpath('//div[@class="lazy-image"]'): + noscript = list(div.iter('noscript')) + if noscript and noscript[0].text: + img = list(parse(noscript[0].text).iter('img')) + if img: + p = noscript[0].getparent() + idx = p.index(noscript[0]) + p.insert(idx, p.makeelement('img', src=img[0].get('src'))) + p.remove(noscript[0]) + for x in root.xpath('//*[name()="script" or name()="style" or name()="source" or name()="meta"]'): + x.getparent().remove(x) + # the economist uses <small> for small caps with a custom font + for init in root.xpath('//span[@data-caps="initial"]'): + init.set('style', 'font-weight:bold;') + for x in root.xpath('//small'): + if x.text and len(x) == 0: + x.text = x.text.upper() + x.tag = 'span' + x.set('style', 'font-variant: small-caps') + for h2 in root.xpath('//h2'): + h2.tag = 'h4' + for x in root.xpath('//figcaption'): + x.set('style', 'text-align:center; font-size:small;') + for x in root.xpath('//cite'): + x.tag = 'blockquote' + x.set('style', 'color:#404040;') + raw = etree.tostring(root, encoding='unicode') + return raw + + raw_ar = read_url([], 'https://archive.is/latest/' + url) + archive = BeautifulSoup(str(raw_ar)) + art = archive.find('article') + if art: + bdy = art.findAll('section') + if len(bdy) != 0: + content = bdy[-1] + else: + content = archive.find('div', attrs={'itemprop':'text'}) + soup = BeautifulSoup(raw) + article = soup.find('section', attrs={'id':'body'}) + if not article: + article = soup.find('div', attrs={'itemprop':'text'}) + if not article: + article = soup.find(attrs={'itemprop':'blogPost'}) + if article and content: + self.log('**fetching archive content') + article.append(content) + + div = soup.findAll(attrs={'style': lambda x: x and x.startswith( + ('color:rgb(13, 13, 13);', 'color: rgb(18, 18, 18);') + )}) + for p in div: + p.name = 'p' + return str(soup) + return raw + return raw + + def preprocess_web_html(self, soup): + for img in soup.findAll('img', attrs={'old-src':True}): + img['src'] = img['old-src'] + for a in soup.findAll('a', href=True): + a['href'] = 'http' + a['href'].split('http')[-1] + for fig in soup.findAll('figure'): + fig['class'] = 'sub' + for sty in soup.findAll(attrs={'style':True}): + del sty['style'] + width = '600' + w = self.recipe_specific_options.get('res') + if w and isinstance(w, str): + width = w + for img in soup.findAll('img', src=True): + if '/cdn-cgi/image/' not in img['src']: + qua = 'economist.com/cdn-cgi/image/width=' + width + ',quality=80,format=auto/' + img['src'] = img['src'].replace('economist.com/', qua) + else: + img['src'] = re.sub(r'width=\d+', 'width=' + width, img['src']) + return soup + + +calibre_most_common_ua = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36'
\ No newline at end of file diff --git a/dotfiles/common/.config/calibre/custom_recipes/The New York Times_1000.recipe b/dotfiles/common/.config/calibre/custom_recipes/The New York Times_1000.recipe new file mode 100644 index 0000000..db3c40b --- /dev/null +++ b/dotfiles/common/.config/calibre/custom_recipes/The New York Times_1000.recipe @@ -0,0 +1,368 @@ +#!/usr/bin/env python +# vim:fileencoding=utf-8 +# License: GPLv3 Copyright: 2018, Kovid Goyal <kovid at kovidgoyal.net> + +from __future__ import absolute_import, division, print_function, unicode_literals + +import datetime +import json +import re + +import mechanize + +from calibre import strftime +from calibre.ebooks.BeautifulSoup import Tag +from calibre.utils.date import strptime +from calibre.web.feeds.news import BasicNewsRecipe +from polyglot.urllib import urlencode + +is_web_edition = True +use_wayback_machine = False + +# This is an Apollo persisted query hash which you can get +# from looking at the XHR requests made by: https://www.nytimes.com/section/todayspaper +# or by https://www.nytimes.com/section/world +persistedQuery = '1f99120a11e94dd62a9474f68ee1255537ee3cf7eac20a0377819edb2fa1fef7' + +# The sections to download when downloading the web edition, comment out +# the section you are not interested in +web_sections = [ + ('World', 'world'), + ('U.S.', 'us'), + ('Politics', 'politics'), + # ('New York', 'nyregion'), + ('Business', 'business'), + ('Technology', 'technology'), + ('Sports', 'sports'), + ('Science', 'science'), + ('Health', 'health'), + ('Opinion', 'opinion'), + # ('Arts', 'arts'), + ('Books', 'books'), + # ('Movies', 'movies'), + # ('Music', 'arts/music'), + # ('Television', 'arts/television'), + # ('Style', 'style'), + # ('Dining & Wine', 'food'), + # ('Fashion & Style', 'fashion'), + # ('Home & Garden', 'garden'), + # ('Travel', 'travel'), + ('Education', 'education'), + # ('Multimedia', 'multimedia'), + ('Obituaries', 'obituaries'), + # ('Sunday Magazine', 'magazine') +] +# web_sections = [ ('Business', 'business'), ] +url_date_pat = re.compile(r'/(2\d\d\d)/(\d\d)/(\d\d)/') + + +def date_from_url(url): + m = url_date_pat.search(url) + if m is not None: + return datetime.date(*map(int, m.groups())) + + +def format_date(d): + try: + return strftime(' [%a, %d %b %Y]', d) + except Exception: + return strftime(' [%Y/%m/%d]', d) + + +def classes(classes): + q = frozenset(classes.split(' ')) + return dict(attrs={ + 'class': lambda x: x and frozenset(x.split()).intersection(q)}) + + +def new_tag(soup, name, attrs=()): + impl = getattr(soup, 'new_tag', None) + if impl is not None: + return impl(name, attrs=dict(attrs)) + return Tag(soup, name, attrs=attrs or None) + + +class NewYorkTimes(BasicNewsRecipe): + if is_web_edition: + title = 'The New York Times (Web)' + description = ( + 'New York Times (Web). You can edit the recipe to remove sections you are not interested in. ' + 'Use advanced menu to make changes to fetch Todays Paper' + ) + else: + title = 'The New York Times' + description = ( + 'New York Times. Todays Paper ' + 'Use advanced menu to make changes to fetch Web Edition' + ) + encoding = 'utf-8' + __author__ = 'Kovid Goyal' + language = 'en_US' + ignore_duplicate_articles = {'title', 'url'} + no_stylesheets = True + oldest_web_edition_article = 1 # days + + extra_css = ''' + .byl, .time { font-size:small; color:#202020; } + .cap { font-size:small; text-align:center; } + .cred { font-style:italic; font-size:small; } + em, blockquote { color: #202020; } + .sc { font-variant: small-caps; } + .lbl { font-size:small; color:#404040; } + img { display:block; margin:0 auto; } + ''' + + @property + def nyt_parser(self): + ans = getattr(self, '_nyt_parser', None) + if ans is None: + from calibre.live import load_module + self._nyt_parser = ans = load_module('calibre.web.site_parsers.nytimes') + return ans + + def get_nyt_page(self, url, skip_wayback=False): + if use_wayback_machine and not skip_wayback: + from calibre import browser + return self.nyt_parser.download_url(url, browser()) + return self.index_to_soup(url, raw=True) + + def preprocess_raw_html(self, raw_html, url): + cleaned = self.nyt_parser.clean_js_json(raw_html) + return self.nyt_parser.extract_html(self.index_to_soup(cleaned), url) + + articles_are_obfuscated = use_wayback_machine + + if use_wayback_machine: + def get_obfuscated_article(self, url): + from calibre.ptempfile import PersistentTemporaryFile + with PersistentTemporaryFile() as tf: + tf.write(self.get_nyt_page(url)) + return tf.name + + recipe_specific_options = { + 'web': { + 'short': 'Type in yes, if you want ' + ('Todays Paper' if is_web_edition else 'Web Edition'), + 'default': 'Web Edition' if is_web_edition else 'Todays Paper', + }, + 'days': { + 'short': 'Oldest article to download from this news source. In days ', + 'long': 'For example, 1, gives you articles from the past 24 hours\n(Works only for Web_Edition)', + 'default': str(oldest_web_edition_article) + }, + 'date': { + 'short': 'The date of the edition to download (YYYY/MM/DD format)\nUsed to fetch past editions of NYT newspaper', + 'long': 'For example, 2024/07/16' + }, + 'res': { + 'short': ( + 'For hi-res images, select a resolution from the following\noptions: ' + 'popup, jumbo, mobileMasterAt3x, superJumbo' + ), + 'long': ( + 'This is useful for non e-ink devices, and for a lower file size\nthan ' + 'the default, use mediumThreeByTwo440, mediumThreeByTwo225, articleInline.' + ), + }, + 'comp': { + 'short': 'Compress News Images?', + 'long': 'enter yes', + 'default': 'no' + } + } + + def __init__(self, *args, **kwargs): + BasicNewsRecipe.__init__(self, *args, **kwargs) + c = self.recipe_specific_options.get('comp') + d = self.recipe_specific_options.get('days') + w = self.recipe_specific_options.get('web') + self.is_web_edition = is_web_edition + if w and isinstance(w, str): + if w == 'yes': + self.is_web_edition = not is_web_edition + if d and isinstance(d, str): + self.oldest_web_edition_article = float(d) + if c and isinstance(c, str): + if c.lower() == 'yes': + self.compress_news_images = True + + def read_todays_paper(self): + pdate = self.recipe_specific_options.get('date') + templ = 'https://www.nytimes.com/issue/todayspaper/{}/todays-new-york-times' + if pdate and isinstance(pdate, str): + return pdate, self.index_to_soup(templ.format(pdate)) + # Cant figure out how to get the date so just try todays and yesterdays dates + date = datetime.date.today() + pdate = date.strftime('%Y/%m/%d') + try: + soup = self.index_to_soup(templ.format(pdate)) + except Exception as e: + if getattr(e, 'code', None) == 404: + date -= datetime.timedelta(days=1) + pdate = date.strftime('%Y/%m/%d') + soup = self.index_to_soup(templ.format(pdate)) + else: + raise + self.log("Using today's paper from:", pdate) + return pdate, soup + + def read_nyt_metadata(self): + pdate, soup = self.read_todays_paper() + date = strptime(pdate, '%Y/%m/%d', assume_utc=False, as_utc=False) + self.cover_url = 'https://static01.nyt.com/images/{}/nytfrontpage/scan.jpg'.format(pdate) + self.timefmt = strftime(' [%d %b, %Y]', date) + self.nytimes_publication_date = pdate + script = soup.findAll('script', text=lambda x: x and 'window.__preloadedData' in x)[0] + script = type(u'')(script) + raw_json = script[script.find('{'):script.rfind(';')].strip().rstrip(';') # }} + clean_json = self.nyt_parser.clean_js_json(raw_json) + self.nytimes_graphql_config = json.loads(clean_json)['config'] + return soup + + def nyt_graphql_query(self, qid, operationName='CollectionsQuery'): + query = { + 'operationName': operationName, + 'variables': json.dumps({ + 'id': qid, + 'first': 10, + 'exclusionMode': 'HIGHLIGHTS_AND_EMBEDDED', + 'isFetchMore':False, + 'isTranslatable':False, + 'isEspanol':False, + 'highlightsListUri':'nyt://per/personalized-list/__null__', + 'highlightsListFirst':0, + 'hasHighlightsList':False + }, separators=',:'), + 'extensions': json.dumps({ + 'persistedQuery': { + 'version':1, + 'sha256Hash': persistedQuery, + }, + }, separators=',:') + } + url = self.nytimes_graphql_config['gqlUrlClient'] + '?' + urlencode(query) + br = self.browser + # br.set_debug_http(True) + headers = dict(self.nytimes_graphql_config['gqlRequestHeaders']) + headers['Accept'] = 'application/json' + req = mechanize.Request(url, headers=headers) + raw = br.open(req).read() + # open('/t/raw.json', 'wb').write(raw) + return json.loads(raw) + + def parse_todays_page(self): + self.read_nyt_metadata() + query_id = '/issue/todayspaper/{}/todays-new-york-times'.format(self.nytimes_publication_date) + data = self.nyt_graphql_query(query_id) + return parse_todays_page(data, self.log) + + def parse_web_sections(self): + self.read_nyt_metadata() + feeds = [] + for section_title, slug in web_sections: + query_id = '/section/' + slug + try: + data = self.nyt_graphql_query(query_id) + self.log('Section:', section_title) + articles = parse_web_section(data, log=self.log, title=section_title) + except Exception as e: + self.log('Failed to parse section:', section_title, 'with error:', e) + articles = [] + if articles: + feeds.append((section_title, articles)) + else: + # open('/t/raw.json', 'w').write(json.dumps(data, indent=2)) + self.log(' No articles found in section:', section_title) + if self.test and len(feeds) >= self.test[0]: + break + return feeds + + def parse_index(self): + # return [('All articles', [ + # {'title': 'XXXXX', 'url': 'https://www.nytimes.com/2020/11/27/world/americas/coronavirus-migrants-venezuela.html'}, + # ])] + if self.is_web_edition: + return self.parse_web_sections() + return self.parse_todays_page() + + def get_browser(self, *args, **kwargs): + kwargs['user_agent'] = 'User-Agent: Mozilla/5.0 (compatible; archive.org_bot; Wayback Machine Live Record; +http://archive.org/details/archive.org_bot)' + br = BasicNewsRecipe.get_browser(self, *args, **kwargs) + return br + + def preprocess_html(self, soup): + w = self.recipe_specific_options.get('res') + if w and isinstance(w, str): + res = '-' + w + for img in soup.findAll('img', attrs={'src':True}): + if '-article' in img['src']: + ext = img['src'].split('?')[0].split('.')[-1] + img['src'] = img['src'].rsplit('-article', 1)[0] + res + '.' + ext + for c in soup.findAll('div', attrs={'class':'cap'}): + for p in c.findAll(['p', 'div']): + p.name = 'span' + return soup + + def get_article_url(self, article): + url = BasicNewsRecipe.get_article_url(self, article) + if not re.search(r'/video/|/athletic/|/card/', url): + return url + self.log('\tSkipping ', url) + + +def asset_to_article(asset): + title = asset['headline']['default'] + return {'title': title, 'url': asset['url'], 'description': asset['summary']} + + +def parse_todays_page(data, log=print): + containers = data['data']['legacyCollection']['groupings'][0]['containers'] + feeds = [] + for cont in containers: + if cont['__typename'] != 'LegacyCollectionContainer': + continue + section_name = cont['label'].strip() + if not section_name: + continue + log(section_name) + articles = [] + for rel in cont['relations']: + if rel.get('__typename') == 'LegacyCollectionRelation': + asset = rel['asset'] + if asset['__typename'] == 'Article': + articles.append(asset_to_article(asset)) + log(' ', articles[-1]['title'] + ':', articles[-1]['url']) + if articles: + feeds.append((section_name, articles)) + return feeds + + +def parse_web_section(data, log=print, title=''): + articles = [] + try: + containers = data['data']['legacyCollection']['collectionsPage'] + if containers.get('embeddedCollections'): + containers = containers['embeddedCollections'] + else: + containers = [containers] + except Exception as e: + log('Failed to parse web section', title, 'with error:', e) + return articles + for cont in containers: + for s in cont['stream']['edges']: + asset = s['node'] + if asset['__typename'] == 'Article': + articles.append(asset_to_article(asset)) + log(' ', articles[-1]['title'] + ':', articles[-1]['url']) + return articles + + +if __name__ == '__main__': + import sys + data = json.loads(open(sys.argv[-1], 'rb').read()) + if is_web_edition: + parse_web_section(data) + else: + parse_todays_page(data) + + +calibre_most_common_ua = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36' diff --git a/dotfiles/common/.config/calibre/custom_recipes/index.json b/dotfiles/common/.config/calibre/custom_recipes/index.json new file mode 100644 index 0000000..0d9451b --- /dev/null +++ b/dotfiles/common/.config/calibre/custom_recipes/index.json @@ -0,0 +1,6 @@ +{ + "1001": [ + "The Economist", + "The Economist_1001.recipe" + ] +}
\ No newline at end of file diff --git a/dotfiles/common/.config/calibre/customize.py.json b/dotfiles/common/.config/calibre/customize.py.json new file mode 100644 index 0000000..310bdb1 --- /dev/null +++ b/dotfiles/common/.config/calibre/customize.py.json @@ -0,0 +1,76 @@ +{ + "disabled_plugins": { + "__class__": "set", + "__value__": [ + "Amazon UK Kindle", + "OZON.ru", + "Amazon IN Kindle", + "Baen Ebooks", + "Wolne Lektury", + "eBook.nl", + "Feedbooks", + "Amazon AU Kindle", + "Библио.бг", + "Amazon ES Kindle", + "Mills and Boon UK", + "ebook.de", + "Legimi", + "Bubok Portugal", + "MobileRead", + "Amazon FR Kindle", + "МоÑта библиотека", + "Ebookpoint", + "Woblink", + "Bubok Spain", + "LitRes", + "Amazon DE Kindle", + "EbooksGratuits.com", + "Kobo", + "Empik", + "Beam EBooks DE", + "RW2010", + "Amazon IT Kindle", + "Nexto", + "Amazon CA Kindle", + "Publio", + "Åšwiat Ebooków", + "Smashwords", + "Virtualo", + "Weightless Books" + ] + }, + "enabled_plugins": { + "__class__": "set", + "__value__": [ + "ManyBooks", + "Archive.org", + "Amazon Kindle", + "Pragmatic Bookshelf", + "Big Book Search", + "Google Images", + "Google Books", + "eBooks.com", + "Barnes and Noble", + "Project Gutenberg" + ] + }, + "filetype_mapping": {}, + "plugin_customization": {}, + "plugins": { + "Apple Books covers": "/home/cjennings/.config/calibre/plugins/Apple Books covers.zip", + "Barnes & Noble": "/home/cjennings/.config/calibre/plugins/Barnes & Noble.zip", + "Clean Comments": "/home/cjennings/.config/calibre/plugins/Clean Comments.zip", + "Extract ISBN": "/home/cjennings/.config/calibre/plugins/Extract ISBN.zip", + "Favourites Menu": "/home/cjennings/.config/calibre/plugins/Favourites Menu.zip", + "Find Duplicates": "/home/cjennings/.config/calibre/plugins/Find Duplicates.zip", + "Hardcover": "/home/cjennings/.config/calibre/plugins/Hardcover.zip", + "Kindle Collections": "/home/cjennings/.config/calibre/plugins/Kindle Collections.zip", + "Kindle hi-res covers": "/home/cjennings/.config/calibre/plugins/Kindle hi-res covers.zip", + "Kobo Metadata": "/home/cjennings/.config/calibre/plugins/Kobo Metadata.zip", + "Kobo Utilities": "/home/cjennings/.config/calibre/plugins/Kobo Utilities.zip", + "Markdown Output": "/home/cjennings/.config/calibre/plugins/Markdown Output.zip", + "Reading List": "/home/cjennings/.config/calibre/plugins/Reading List.zip", + "Search The Internet": "/home/cjennings/.config/calibre/plugins/Search The Internet.zip", + "Standard Ebooks": "/home/cjennings/.config/calibre/plugins/Standard Ebooks.zip" + } +}
\ No newline at end of file diff --git a/dotfiles/common/.config/calibre/device_drivers_KOBOTOUCH.py.json b/dotfiles/common/.config/calibre/device_drivers_KOBOTOUCH.py.json new file mode 100644 index 0000000..230e5b8 --- /dev/null +++ b/dotfiles/common/.config/calibre/device_drivers_KOBOTOUCH.py.json @@ -0,0 +1,59 @@ +{ + "affect_hyphenation": false, + "bookstats_pagecount_template": "", + "bookstats_timetoread_lower_template": "", + "bookstats_timetoread_upper_template": "", + "bookstats_wordcount_template": "", + "collections_columns": "", + "collections_template": "", + "create_collections": false, + "debugging_title": "", + "delete_empty_collections": false, + "disable_hyphenation": false, + "dithered_covers": false, + "driver_version": "2.6.0", + "extra_customization": [], + "force_series_id": false, + "format_map": [ + "kepub", + "epub", + "cbz", + "cbr" + ], + "hyphenation_limit_lines": 2, + "hyphenation_min_chars": 6, + "hyphenation_min_chars_after": 3, + "hyphenation_min_chars_before": 3, + "ignore_collections_names": "", + "keep_cover_aspect": false, + "kepubify": true, + "letterbox_fs_covers": false, + "letterbox_fs_covers_color": "#000000", + "manage_collections": true, + "modify_css": false, + "override_kobo_replace_existing": true, + "per_device_css": "{}", + "png_covers": false, + "read_metadata": true, + "save_template": "{author_sort}/{title} - {authors}", + "series_index_template": "", + "show_archived_books": false, + "show_previews": false, + "show_recommendations": false, + "subtitle_template": "", + "support_newer_firmware": false, + "template_for_kepubify": "", + "update_bookstats": false, + "update_core_metadata": false, + "update_device_metadata": true, + "update_purchased_kepubs": false, + "update_series": true, + "update_subtitle": false, + "upload_covers": true, + "upload_grayscale": false, + "use_author_sort": false, + "use_collections_columns": true, + "use_collections_template": false, + "use_series_index_template": false, + "use_subdirs": true +}
\ No newline at end of file diff --git a/dotfiles/common/.config/calibre/device_drivers_KOBOTOUCHEXTENDED.py.json b/dotfiles/common/.config/calibre/device_drivers_KOBOTOUCHEXTENDED.py.json new file mode 100644 index 0000000..bfc0600 --- /dev/null +++ b/dotfiles/common/.config/calibre/device_drivers_KOBOTOUCHEXTENDED.py.json @@ -0,0 +1,62 @@ +{ + "bookstats_pagecount_template": "", + "bookstats_timetoread_lower_template": "", + "bookstats_timetoread_upper_template": "", + "bookstats_wordcount_template": "", + "clean_markup": false, + "collections_columns": "", + "collections_template": "", + "create_collections": false, + "debugging_title": "", + "delete_empty_collections": false, + "disable_hyphenation": false, + "dithered_covers": false, + "driver_version": "3.6.3", + "extra_customization": [], + "extra_features": true, + "file_copy_dir": "", + "format_map": [ + "kepub", + "epub", + "cbr", + "cbz" + ], + "full_page_numbers": false, + "hyphenate": false, + "hyphenate_chars": 6, + "hyphenate_chars_after": 3, + "hyphenate_chars_before": 3, + "hyphenate_limit_lines": 2, + "ignore_collections_names": "", + "keep_cover_aspect": false, + "kepubify_template": "", + "letterbox_fs_covers": false, + "letterbox_fs_covers_color": "#000000", + "manage_collections": true, + "modify_css": false, + "override_kobo_replace_existing": true, + "png_covers": false, + "read_metadata": true, + "save_template": "{author_sort}/{title} - {authors}", + "show_archived_books": false, + "show_previews": false, + "show_recommendations": false, + "skip_failed": false, + "smarten_punctuation": false, + "subtitle_template": "", + "support_newer_firmware": false, + "update_bookstats": false, + "update_core_metadata": false, + "update_device_metadata": true, + "update_purchased_kepubs": false, + "update_series": true, + "update_subtitle": false, + "upload_covers": false, + "upload_encumbered": false, + "upload_grayscale": false, + "use_author_sort": false, + "use_collections_columns": true, + "use_collections_template": false, + "use_subdirs": true, + "use_template": false +}
\ No newline at end of file diff --git a/dotfiles/common/.config/calibre/device_drivers_USER_DEFINED.py.json b/dotfiles/common/.config/calibre/device_drivers_USER_DEFINED.py.json new file mode 100644 index 0000000..7963676 --- /dev/null +++ b/dotfiles/common/.config/calibre/device_drivers_USER_DEFINED.py.json @@ -0,0 +1,24 @@ +{ + "extra_customization": [ + "", + "", + "", + null, + "", + "", + "", + "", + "", + "", + false + ], + "format_map": [ + "epub", + "mobi", + "pdf" + ], + "read_metadata": true, + "save_template": "{author_sort}/{title} - {authors}", + "use_author_sort": false, + "use_subdirs": true +}
\ No newline at end of file diff --git a/dotfiles/common/.config/calibre/fonts/scanner_cache.json b/dotfiles/common/.config/calibre/fonts/scanner_cache.json new file mode 100644 index 0000000..4f118b6 --- /dev/null +++ b/dotfiles/common/.config/calibre/fonts/scanner_cache.json @@ -0,0 +1,24018 @@ +{ + "fonts": { + "/home/cjennings/.local/share/fonts/AppleColorEmoji.ttf||42722048:1747702940.241918": { + "family_name": "Apple Color Emoji", + "font-family": "Apple Color Emoji", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Apple Color Emoji", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 6, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/home/cjennings/.local/share/fonts/AppleColorEmoji.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/BerkeleyMono-Bold.otf||74596:1747702940.241918": { + "family_name": "Berkeley Mono", + "font-family": "Berkeley Mono", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "Berkeley Mono Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/home/cjennings/.local/share/fonts/BerkeleyMono-Bold.otf", + "preferred_family_name": "Berkeley Mono", + "preferred_subfamily_name": "Bold", + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/BerkeleyMono-Bold.ttf||114872:1747702940.242918": { + "family_name": "Berkeley Mono", + "font-family": "Berkeley Mono", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "Berkeley Mono Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/home/cjennings/.local/share/fonts/BerkeleyMono-Bold.ttf", + "preferred_family_name": "Berkeley Mono", + "preferred_subfamily_name": "Bold", + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/BerkeleyMono-BoldItalic.otf||75756:1747702940.242918": { + "family_name": "Berkeley Mono", + "font-family": "Berkeley Mono", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 0, + "full_name": "Berkeley Mono Bold Italic", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/home/cjennings/.local/share/fonts/BerkeleyMono-BoldItalic.otf", + "preferred_family_name": "Berkeley Mono", + "preferred_subfamily_name": "Bold Italic", + "subfamily_name": "Bold Italic", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/BerkeleyMono-BoldItalic.ttf||116664:1747702940.243918": { + "family_name": "Berkeley Mono", + "font-family": "Berkeley Mono", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 0, + "full_name": "Berkeley Mono Bold Italic", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/home/cjennings/.local/share/fonts/BerkeleyMono-BoldItalic.ttf", + "preferred_family_name": "Berkeley Mono", + "preferred_subfamily_name": "Bold Italic", + "subfamily_name": "Bold Italic", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/BerkeleyMono-Italic.otf||75172:1747702940.243918": { + "family_name": "Berkeley Mono", + "font-family": "Berkeley Mono", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Berkeley Mono Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/home/cjennings/.local/share/fonts/BerkeleyMono-Italic.otf", + "preferred_family_name": "Berkeley Mono", + "preferred_subfamily_name": "Italic", + "subfamily_name": "Italic", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/BerkeleyMono-Italic.ttf||115636:1747702940.243918": { + "family_name": "Berkeley Mono", + "font-family": "Berkeley Mono", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Berkeley Mono Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/home/cjennings/.local/share/fonts/BerkeleyMono-Italic.ttf", + "preferred_family_name": "Berkeley Mono", + "preferred_subfamily_name": "Italic", + "subfamily_name": "Italic", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/BerkeleyMono-Regular.otf||72688:1747702940.2449179": { + "family_name": "Berkeley Mono", + "font-family": "Berkeley Mono", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Berkeley Mono Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/home/cjennings/.local/share/fonts/BerkeleyMono-Regular.otf", + "preferred_family_name": "Berkeley Mono", + "preferred_subfamily_name": "Regular", + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/BerkeleyMono-Regular.ttf||114656:1747702940.2449179": { + "family_name": "Berkeley Mono", + "font-family": "Berkeley Mono", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Berkeley Mono Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/home/cjennings/.local/share/fonts/BerkeleyMono-Regular.ttf", + "preferred_family_name": "Berkeley Mono", + "preferred_subfamily_name": "Regular", + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/BerkeleyMonoVariable-Italic.ttf||103704:1747702940.2449179": { + "family_name": "Berkeley Mono Variable Italic", + "font-family": "Berkeley Mono Variable Italic", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Berkeley Mono Variable Italic", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/home/cjennings/.local/share/fonts/BerkeleyMonoVariable-Italic.ttf", + "preferred_family_name": "Berkeley Mono Variable", + "preferred_subfamily_name": "Italic", + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/BerkeleyMonoVariable-Regular.ttf||101012:1747702940.2459176": { + "family_name": "Berkeley Mono Variable", + "font-family": "Berkeley Mono Variable", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Berkeley Mono Variable Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/home/cjennings/.local/share/fonts/BerkeleyMonoVariable-Regular.ttf", + "preferred_family_name": "Berkeley Mono Variable", + "preferred_subfamily_name": "Regular", + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/CartographCF-Bold.otf||112176:1747702940.2459176": { + "family_name": "Cartograph CF Bold", + "font-family": "Cartograph CF Bold", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 8, + "full_name": "Cartograph CF Bold", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": true, + "is_wws": false, + "os2_version": 3, + "panose": [ + 0, + 0, + 8, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/home/cjennings/.local/share/fonts/CartographCF-Bold.otf", + "preferred_family_name": "Cartograph CF", + "preferred_subfamily_name": "Bold", + "subfamily_name": "Regular", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/CartographCF-BoldItalic.otf||120580:1747702940.2469175": { + "family_name": "Cartograph CF Bold", + "font-family": "Cartograph CF Bold", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 8, + "full_name": "Cartograph CF Bold Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 0, + 0, + 8, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/home/cjennings/.local/share/fonts/CartographCF-BoldItalic.otf", + "preferred_family_name": "Cartograph CF", + "preferred_subfamily_name": "Bold Italic", + "subfamily_name": "Italic", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/CartographCF-DemiBold.otf||110188:1747702940.2469175": { + "family_name": "Cartograph CF Demi Bold", + "font-family": "Cartograph CF Demi Bold", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "600", + "fs_type": 8, + "full_name": "Cartograph CF Demi Bold", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": true, + "is_wws": false, + "os2_version": 3, + "panose": [ + 0, + 0, + 7, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/home/cjennings/.local/share/fonts/CartographCF-DemiBold.otf", + "preferred_family_name": "Cartograph CF", + "preferred_subfamily_name": "Demi Bold", + "subfamily_name": "Regular", + "weight": 600, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/CartographCF-DemiBoldItalic.otf||121136:1747702940.2479174": { + "family_name": "Cartograph CF Demi Bold", + "font-family": "Cartograph CF Demi Bold", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "600", + "fs_type": 8, + "full_name": "Cartograph CF Demi Bold Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 0, + 0, + 7, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/home/cjennings/.local/share/fonts/CartographCF-DemiBoldItalic.otf", + "preferred_family_name": "Cartograph CF", + "preferred_subfamily_name": "Demi Bold Italic", + "subfamily_name": "Italic", + "weight": 600, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/CartographCF-ExtraBold.otf||111532:1747702940.2479174": { + "family_name": "Cartograph CF Extra Bold", + "font-family": "Cartograph CF Extra Bold", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "800", + "fs_type": 8, + "full_name": "Cartograph CF Extra Bold", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": true, + "is_wws": false, + "os2_version": 3, + "panose": [ + 0, + 0, + 9, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/home/cjennings/.local/share/fonts/CartographCF-ExtraBold.otf", + "preferred_family_name": "Cartograph CF", + "preferred_subfamily_name": "Extra Bold", + "subfamily_name": "Regular", + "weight": 800, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/CartographCF-ExtraBoldItalic.otf||120080:1747702940.2479174": { + "family_name": "Cartograph CF Extra Bold", + "font-family": "Cartograph CF Extra Bold", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "800", + "fs_type": 8, + "full_name": "Cartograph CF Extra Bold Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 0, + 0, + 9, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/home/cjennings/.local/share/fonts/CartographCF-ExtraBoldItalic.otf", + "preferred_family_name": "Cartograph CF", + "preferred_subfamily_name": "Extra Bold Italic", + "subfamily_name": "Italic", + "weight": 800, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/CartographCF-ExtraLight.otf||108024:1747702940.2489173": { + "family_name": "Cartograph CF Extra Light", + "font-family": "Cartograph CF Extra Light", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "200", + "fs_type": 8, + "full_name": "Cartograph CF Extra Light", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": true, + "is_wws": false, + "os2_version": 3, + "panose": [ + 0, + 0, + 3, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/home/cjennings/.local/share/fonts/CartographCF-ExtraLight.otf", + "preferred_family_name": "Cartograph CF", + "preferred_subfamily_name": "Extra Light", + "subfamily_name": "Regular", + "weight": 200, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/CartographCF-ExtraLightItalic.otf||118496:1747702940.2489173": { + "family_name": "Cartograph CF Extra Light", + "font-family": "Cartograph CF Extra Light", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "200", + "fs_type": 8, + "full_name": "Cartograph CF Extra Light Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 0, + 0, + 3, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/home/cjennings/.local/share/fonts/CartographCF-ExtraLightItalic.otf", + "preferred_family_name": "Cartograph CF", + "preferred_subfamily_name": "Extra Light Italic", + "subfamily_name": "Italic", + "weight": 200, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/CartographCF-Heavy.otf||113700:1747702940.2499173": { + "family_name": "Cartograph CF Heavy", + "font-family": "Cartograph CF Heavy", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "900", + "fs_type": 8, + "full_name": "Cartograph CF Heavy", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": true, + "is_wws": false, + "os2_version": 3, + "panose": [ + 0, + 0, + 10, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/home/cjennings/.local/share/fonts/CartographCF-Heavy.otf", + "preferred_family_name": "Cartograph CF", + "preferred_subfamily_name": "Heavy", + "subfamily_name": "Regular", + "weight": 900, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/CartographCF-HeavyItalic.otf||123024:1747702940.2499173": { + "family_name": "Cartograph CF Heavy", + "font-family": "Cartograph CF Heavy", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "900", + "fs_type": 8, + "full_name": "Cartograph CF Heavy Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 0, + 0, + 10, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/home/cjennings/.local/share/fonts/CartographCF-HeavyItalic.otf", + "preferred_family_name": "Cartograph CF", + "preferred_subfamily_name": "Heavy Italic", + "subfamily_name": "Italic", + "weight": 900, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/CartographCF-Light.otf||108372:1747702940.2499173": { + "family_name": "Cartograph CF Light", + "font-family": "Cartograph CF Light", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "300", + "fs_type": 8, + "full_name": "Cartograph CF Light", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": true, + "is_wws": false, + "os2_version": 3, + "panose": [ + 0, + 0, + 4, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/home/cjennings/.local/share/fonts/CartographCF-Light.otf", + "preferred_family_name": "Cartograph CF", + "preferred_subfamily_name": "Light", + "subfamily_name": "Regular", + "weight": 300, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/CartographCF-LightItalic.otf||118272:1747702940.2509172": { + "family_name": "Cartograph CF Light", + "font-family": "Cartograph CF Light", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "300", + "fs_type": 8, + "full_name": "Cartograph CF Light Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 0, + 0, + 4, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/home/cjennings/.local/share/fonts/CartographCF-LightItalic.otf", + "preferred_family_name": "Cartograph CF", + "preferred_subfamily_name": "Light Italic", + "subfamily_name": "Italic", + "weight": 300, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/CartographCF-Regular.otf||107884:1747702940.2509172": { + "family_name": "Cartograph CF", + "font-family": "Cartograph CF", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 8, + "full_name": "Cartograph CF Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": true, + "is_wws": false, + "os2_version": 3, + "panose": [ + 0, + 0, + 5, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/home/cjennings/.local/share/fonts/CartographCF-Regular.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/CartographCF-RegularItalic.otf||117452:1747702940.251917": { + "family_name": "Cartograph CF", + "font-family": "Cartograph CF", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 8, + "full_name": "Cartograph CF Regular Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 0, + 0, + 5, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/home/cjennings/.local/share/fonts/CartographCF-RegularItalic.otf", + "preferred_family_name": null, + "preferred_subfamily_name": "Regular Italic", + "subfamily_name": "Italic", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/CartographCF-Thin.otf||105640:1747702940.251917": { + "family_name": "Cartograph CF Thin", + "font-family": "Cartograph CF Thin", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "100", + "fs_type": 8, + "full_name": "Cartograph CF Thin", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": true, + "is_wws": false, + "os2_version": 3, + "panose": [ + 0, + 0, + 2, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/home/cjennings/.local/share/fonts/CartographCF-Thin.otf", + "preferred_family_name": "Cartograph CF", + "preferred_subfamily_name": "Thin", + "subfamily_name": "Regular", + "weight": 100, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/CartographCF-ThinItalic.otf||116284:1747702940.251917": { + "family_name": "Cartograph CF Thin", + "font-family": "Cartograph CF Thin", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "100", + "fs_type": 8, + "full_name": "Cartograph CF Thin Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 0, + 0, + 2, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/home/cjennings/.local/share/fonts/CartographCF-ThinItalic.otf", + "preferred_family_name": "Cartograph CF", + "preferred_subfamily_name": "Thin Italic", + "subfamily_name": "Italic", + "weight": 100, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/CodeliaLigatures-Bold.otf||118064:1747702940.2529168": { + "family_name": "Codelia Ligatures", + "font-family": "Codelia Ligatures", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 8, + "full_name": "Codelia Ligatures Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/home/cjennings/.local/share/fonts/CodeliaLigatures-Bold.otf", + "preferred_family_name": "Codelia Ligatures", + "preferred_subfamily_name": "Bold", + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/CodeliaLigatures-BoldItalic.otf||117860:1747702940.2529168": { + "family_name": "Codelia Ligatures", + "font-family": "Codelia Ligatures", + "font-stretch": "normal", + "font-style": "oblique", + "font-weight": "bold", + "fs_type": 8, + "full_name": "Codelia Ligatures Bold Italic", + "is_bold": true, + "is_italic": true, + "is_oblique": true, + "is_otf": true, + "is_regular": true, + "is_wws": true, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/home/cjennings/.local/share/fonts/CodeliaLigatures-BoldItalic.otf", + "preferred_family_name": "Codelia Ligatures", + "preferred_subfamily_name": "Bold Italic", + "subfamily_name": "Bold Italic", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/CodeliaLigatures-Italic.otf||114384:1747702940.2539167": { + "family_name": "Codelia Ligatures", + "font-family": "Codelia Ligatures", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 8, + "full_name": "Codelia Ligatures Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/home/cjennings/.local/share/fonts/CodeliaLigatures-Italic.otf", + "preferred_family_name": "Codelia Ligatures", + "preferred_subfamily_name": "Italic", + "subfamily_name": "Italic", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/CodeliaLigatures-Regular.otf||116684:1747702940.2539167": { + "family_name": "Codelia Ligatures", + "font-family": "Codelia Ligatures", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 8, + "full_name": "Codelia Ligatures Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/home/cjennings/.local/share/fonts/CodeliaLigatures-Regular.otf", + "preferred_family_name": "Codelia Ligatures", + "preferred_subfamily_name": "Regular", + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/ComicCodeLigatures-Bold.otf||92016:1747702940.2539167": { + "family_name": "Comic Code Ligatures", + "font-family": "Comic Code Ligatures", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 8, + "full_name": "Comic Code Ligatures Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 12, + 5, + 9, + 2, + 2, + 4, + 6, + 2, + 4 + ], + "path": "/home/cjennings/.local/share/fonts/ComicCodeLigatures-Bold.otf", + "preferred_family_name": "Comic Code Ligatures", + "preferred_subfamily_name": "Bold", + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/ComicCodeLigatures-BoldItalic.otf||92188:1747702940.2549167": { + "family_name": "Comic Code Ligatures", + "font-family": "Comic Code Ligatures", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 8, + "full_name": "Comic Code Ligatures Bold Italic", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 1, + 5, + 9, + 2, + 2, + 0, + 6, + 0, + 0 + ], + "path": "/home/cjennings/.local/share/fonts/ComicCodeLigatures-BoldItalic.otf", + "preferred_family_name": "Comic Code Ligatures", + "preferred_subfamily_name": "Bold Italic", + "subfamily_name": "Bold Italic", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/ComicCodeLigatures-Italic.otf||95120:1747702940.2549167": { + "family_name": "Comic Code Ligatures", + "font-family": "Comic Code Ligatures", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 8, + "full_name": "Comic Code Ligatures Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 1, + 5, + 9, + 2, + 2, + 0, + 6, + 0, + 0 + ], + "path": "/home/cjennings/.local/share/fonts/ComicCodeLigatures-Italic.otf", + "preferred_family_name": "Comic Code Ligatures", + "preferred_subfamily_name": "Italic", + "subfamily_name": "Italic", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/ComicCodeLigatures-Light.otf||95088:1747702940.2549167": { + "family_name": "Comic Code Ligatures Light", + "font-family": "Comic Code Ligatures Light", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "300", + "fs_type": 8, + "full_name": "Comic Code Ligatures Light", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 12, + 5, + 9, + 2, + 2, + 4, + 6, + 2, + 4 + ], + "path": "/home/cjennings/.local/share/fonts/ComicCodeLigatures-Light.otf", + "preferred_family_name": "Comic Code Ligatures", + "preferred_subfamily_name": "Light", + "subfamily_name": "Regular", + "weight": 300, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/ComicCodeLigatures-LightItalic.otf||96648:1747702940.2559166": { + "family_name": "Comic Code Ligatures Light", + "font-family": "Comic Code Ligatures Light", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "300", + "fs_type": 8, + "full_name": "Comic Code Ligatures Light Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 1, + 5, + 9, + 2, + 2, + 0, + 6, + 0, + 0 + ], + "path": "/home/cjennings/.local/share/fonts/ComicCodeLigatures-LightItalic.otf", + "preferred_family_name": "Comic Code Ligatures", + "preferred_subfamily_name": "Light Italic", + "subfamily_name": "Italic", + "weight": 300, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/ComicCodeLigatures-Medium.otf||94056:1747702940.2559166": { + "family_name": "Comic Code Ligatures Medium", + "font-family": "Comic Code Ligatures Medium", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "500", + "fs_type": 8, + "full_name": "Comic Code Ligatures Medium", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 12, + 5, + 9, + 2, + 2, + 4, + 6, + 2, + 4 + ], + "path": "/home/cjennings/.local/share/fonts/ComicCodeLigatures-Medium.otf", + "preferred_family_name": "Comic Code Ligatures", + "preferred_subfamily_name": "Medium", + "subfamily_name": "Regular", + "weight": 500, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/ComicCodeLigatures-MediumItalic.otf||95256:1747702940.2569165": { + "family_name": "Comic Code Ligatures Medium", + "font-family": "Comic Code Ligatures Medium", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "500", + "fs_type": 8, + "full_name": "Comic Code Ligatures Medium Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 1, + 5, + 9, + 2, + 2, + 0, + 6, + 0, + 0 + ], + "path": "/home/cjennings/.local/share/fonts/ComicCodeLigatures-MediumItalic.otf", + "preferred_family_name": "Comic Code Ligatures", + "preferred_subfamily_name": "Medium Italic", + "subfamily_name": "Italic", + "weight": 500, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/ComicCodeLigatures-Regular.otf||93004:1747702940.2569165": { + "family_name": "Comic Code Ligatures", + "font-family": "Comic Code Ligatures", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 8, + "full_name": "Comic Code Ligatures Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 12, + 5, + 9, + 2, + 2, + 4, + 6, + 2, + 4 + ], + "path": "/home/cjennings/.local/share/fonts/ComicCodeLigatures-Regular.otf", + "preferred_family_name": "Comic Code Ligatures", + "preferred_subfamily_name": "Regular", + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/ComicCodeLigatures-SBIta.otf||96380:1747702940.2569165": { + "family_name": "Comic Code Ligatures Semibold", + "font-family": "Comic Code Ligatures Semibold", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "600", + "fs_type": 8, + "full_name": "Comic Code Ligatures Semibold Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 1, + 5, + 9, + 2, + 2, + 0, + 6, + 0, + 0 + ], + "path": "/home/cjennings/.local/share/fonts/ComicCodeLigatures-SBIta.otf", + "preferred_family_name": "Comic Code Ligatures", + "preferred_subfamily_name": "Semibold Italic", + "subfamily_name": "Italic", + "weight": 600, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/ComicCodeLigatures-Semibold.otf||94744:1747702940.2579162": { + "family_name": "Comic Code Ligatures Semibold", + "font-family": "Comic Code Ligatures Semibold", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "600", + "fs_type": 8, + "full_name": "Comic Code Ligatures Semibold", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 12, + 5, + 9, + 2, + 2, + 4, + 6, + 2, + 4 + ], + "path": "/home/cjennings/.local/share/fonts/ComicCodeLigatures-Semibold.otf", + "preferred_family_name": "Comic Code Ligatures", + "preferred_subfamily_name": "Semibold", + "subfamily_name": "Regular", + "weight": 600, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/ComicCodeLigatures-Thin.otf||89560:1747702940.2579162": { + "family_name": "Comic Code Ligatures Thin", + "font-family": "Comic Code Ligatures Thin", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "100", + "fs_type": 8, + "full_name": "Comic Code Ligatures Thin", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 12, + 5, + 9, + 2, + 2, + 4, + 6, + 2, + 4 + ], + "path": "/home/cjennings/.local/share/fonts/ComicCodeLigatures-Thin.otf", + "preferred_family_name": "Comic Code Ligatures", + "preferred_subfamily_name": "Thin", + "subfamily_name": "Regular", + "weight": 100, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/ComicCodeLigatures-ThinItalic.otf||90044:1747702940.2579162": { + "family_name": "Comic Code Ligatures Thin", + "font-family": "Comic Code Ligatures Thin", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "100", + "fs_type": 8, + "full_name": "Comic Code Ligatures Thin Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 1, + 5, + 9, + 2, + 2, + 0, + 6, + 0, + 0 + ], + "path": "/home/cjennings/.local/share/fonts/ComicCodeLigatures-ThinItalic.otf", + "preferred_family_name": "Comic Code Ligatures", + "preferred_subfamily_name": "Thin Italic", + "subfamily_name": "Italic", + "weight": 100, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/ComicCodeLigatures-ULIta.otf||97832:1747702940.2589161": { + "family_name": "Comic Code Ligatures UltraLight", + "font-family": "Comic Code Ligatures UltraLight", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "200", + "fs_type": 8, + "full_name": "Comic Code Ligatures UltraLight Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 1, + 5, + 9, + 2, + 2, + 0, + 6, + 0, + 0 + ], + "path": "/home/cjennings/.local/share/fonts/ComicCodeLigatures-ULIta.otf", + "preferred_family_name": "Comic Code Ligatures", + "preferred_subfamily_name": "UltraLight Italic", + "subfamily_name": "Italic", + "weight": 200, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/ComicCodeLigatures-UltraLight.otf||95728:1747702940.2589161": { + "family_name": "Comic Code Ligatures UltraLight", + "font-family": "Comic Code Ligatures UltraLight", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "200", + "fs_type": 8, + "full_name": "Comic Code Ligatures UltraLight", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 12, + 5, + 9, + 2, + 2, + 4, + 6, + 2, + 4 + ], + "path": "/home/cjennings/.local/share/fonts/ComicCodeLigatures-UltraLight.otf", + "preferred_family_name": "Comic Code Ligatures", + "preferred_subfamily_name": "UltraLight", + "subfamily_name": "Regular", + "weight": 200, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/Courier 10 Pitch Regular.otf||35196:1747702940.2589161": { + "family_name": "Courier 10 Pitch", + "font-family": "Courier 10 Pitch", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "500", + "fs_type": 0, + "full_name": "Courier10PitchBT-Roman", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 2, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/home/cjennings/.local/share/fonts/Courier 10 Pitch Regular.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 500, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/MERIFONT.TTF||49504:1747702940.2589161": { + "family_name": "Chess Merida", + "font-family": "Chess Merida", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Chess Merida", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 0, + "panose": [ + 2, + 11, + 6, + 3, + 5, + 3, + 2, + 2, + 2, + 4 + ], + "path": "/home/cjennings/.local/share/fonts/MERIFONT.TTF", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/Merriweather-Black.ttf||141700:1747702940.259916": { + "family_name": "Merriweather Black", + "font-family": "Merriweather Black", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "900", + "fs_type": 0, + "full_name": "Merriweather Black", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 10, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/home/cjennings/.local/share/fonts/Merriweather-Black.ttf", + "preferred_family_name": "Merriweather", + "preferred_subfamily_name": "Black", + "subfamily_name": "Regular", + "weight": 900, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/Merriweather-BlackItalic.ttf||142620:1747702940.259916": { + "family_name": "Merriweather Black", + "font-family": "Merriweather Black", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "900", + "fs_type": 0, + "full_name": "Merriweather Black Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 10, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/home/cjennings/.local/share/fonts/Merriweather-BlackItalic.ttf", + "preferred_family_name": "Merriweather", + "preferred_subfamily_name": "Black Italic", + "subfamily_name": "Italic", + "weight": 900, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/Merriweather-Bold.ttf||142040:1747702940.260916": { + "family_name": "Merriweather", + "font-family": "Merriweather", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "Merriweather Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 8, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/home/cjennings/.local/share/fonts/Merriweather-Bold.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/Merriweather-BoldItalic.ttf||143832:1747702940.260916": { + "family_name": "Merriweather", + "font-family": "Merriweather", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 0, + "full_name": "Merriweather Bold Italic", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 8, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/home/cjennings/.local/share/fonts/Merriweather-BoldItalic.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold Italic", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/Merriweather-Italic.ttf||142648:1747702940.261916": { + "family_name": "Merriweather", + "font-family": "Merriweather", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Merriweather Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 5, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/home/cjennings/.local/share/fonts/Merriweather-Italic.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Italic", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/Merriweather-Light.ttf||148124:1747702940.261916": { + "family_name": "Merriweather Light", + "font-family": "Merriweather Light", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "300", + "fs_type": 0, + "full_name": "Merriweather Light", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 4, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/home/cjennings/.local/share/fonts/Merriweather-Light.ttf", + "preferred_family_name": "Merriweather", + "preferred_subfamily_name": "Light", + "subfamily_name": "Regular", + "weight": 300, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/Merriweather-LightItalic.ttf||142056:1747702940.261916": { + "family_name": "Merriweather Light", + "font-family": "Merriweather Light", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "300", + "fs_type": 0, + "full_name": "Merriweather Light Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 4, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/home/cjennings/.local/share/fonts/Merriweather-LightItalic.ttf", + "preferred_family_name": "Merriweather", + "preferred_subfamily_name": "Light Italic", + "subfamily_name": "Italic", + "weight": 300, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/Merriweather-Regular.ttf||149120:1747702940.2629156": { + "family_name": "Merriweather", + "font-family": "Merriweather", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Merriweather Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 5, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/home/cjennings/.local/share/fonts/Merriweather-Regular.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/MonoLisa-Bold.otf||118736:1747702940.2629156": { + "family_name": "MonoLisa", + "font-family": "MonoLisa", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 8, + "full_name": "MonoLisa Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 11, + 8, + 9, + 3, + 2, + 4, + 6, + 2, + 4 + ], + "path": "/home/cjennings/.local/share/fonts/MonoLisa-Bold.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/MonoLisa-BoldItalic.otf||119056:1747702940.2639155": { + "family_name": "MonoLisa", + "font-family": "MonoLisa", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 8, + "full_name": "MonoLisa Bold Italic", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 11, + 8, + 9, + 3, + 2, + 4, + 13, + 2, + 4 + ], + "path": "/home/cjennings/.local/share/fonts/MonoLisa-BoldItalic.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold Italic", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/MonoLisa-Regular.otf||116244:1747702940.2639155": { + "family_name": "MonoLisa", + "font-family": "MonoLisa", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 8, + "full_name": "MonoLisa Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 11, + 5, + 9, + 3, + 2, + 4, + 6, + 2, + 4 + ], + "path": "/home/cjennings/.local/share/fonts/MonoLisa-Regular.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/MonoLisa-RegularItalic.otf||116892:1747702940.2649155": { + "family_name": "MonoLisa", + "font-family": "MonoLisa", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 8, + "full_name": "MonoLisa Regular Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 11, + 5, + 9, + 3, + 2, + 4, + 13, + 2, + 4 + ], + "path": "/home/cjennings/.local/share/fonts/MonoLisa-RegularItalic.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Italic", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/NFM.ttf||2507556:1761438003.486015": { + "family_name": "Symbols Nerd Font Mono", + "font-family": "Symbols Nerd Font Mono", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Symbols Nerd Font Mono", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 5, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/home/cjennings/.local/share/fonts/NFM.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/NovaletraSerifCF-Bold.otf||64528:1747702940.2649155": { + "family_name": "Novaletra Serif CF Medium", + "font-family": "Novaletra Serif CF Medium", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 8, + "full_name": "Novaletra Serif CF Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/home/cjennings/.local/share/fonts/NovaletraSerifCF-Bold.otf", + "preferred_family_name": "Novaletra Serif CF", + "preferred_subfamily_name": "Bold", + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/NovaletraSerifCF-BoldItalic.otf||66320:1747702940.2649155": { + "family_name": "Novaletra Serif CF Medium", + "font-family": "Novaletra Serif CF Medium", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 8, + "full_name": "Novaletra Serif CF Bold Italic", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/home/cjennings/.local/share/fonts/NovaletraSerifCF-BoldItalic.otf", + "preferred_family_name": "Novaletra Serif CF", + "preferred_subfamily_name": "Bold Italic", + "subfamily_name": "Bold Italic", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/NovaletraSerifCF-DemiBold.otf||64428:1747702940.2649155": { + "family_name": "Novaletra Serif CF Demi Bold", + "font-family": "Novaletra Serif CF Demi Bold", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "600", + "fs_type": 8, + "full_name": "Novaletra Serif CF Demi Bold", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/home/cjennings/.local/share/fonts/NovaletraSerifCF-DemiBold.otf", + "preferred_family_name": "Novaletra Serif CF", + "preferred_subfamily_name": "Demi Bold", + "subfamily_name": "Regular", + "weight": 600, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/NovaletraSerifCF-DemiBoldItalic.otf||65864:1747702940.2649155": { + "family_name": "Novaletra Serif CF Demi Bold", + "font-family": "Novaletra Serif CF Demi Bold", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "600", + "fs_type": 8, + "full_name": "Novaletra Serif CF Demi Bold Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/home/cjennings/.local/share/fonts/NovaletraSerifCF-DemiBoldItalic.otf", + "preferred_family_name": "Novaletra Serif CF", + "preferred_subfamily_name": "Demi Bold Italic", + "subfamily_name": "Italic", + "weight": 600, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/NovaletraSerifCF-ExtBold.otf||63976:1747702940.2659154": { + "family_name": "Novaletra Serif CF Ext Bold", + "font-family": "Novaletra Serif CF Ext Bold", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "800", + "fs_type": 8, + "full_name": "Novaletra Serif CF Ext Bold", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/home/cjennings/.local/share/fonts/NovaletraSerifCF-ExtBold.otf", + "preferred_family_name": "Novaletra Serif CF", + "preferred_subfamily_name": "Ext Bold", + "subfamily_name": "Regular", + "weight": 800, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/NovaletraSerifCF-ExtBoldItalic.otf||65820:1747702940.2659154": { + "family_name": "Novaletra Serif CF Ext Bold", + "font-family": "Novaletra Serif CF Ext Bold", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "800", + "fs_type": 8, + "full_name": "Novaletra Serif CF Ext Bold Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/home/cjennings/.local/share/fonts/NovaletraSerifCF-ExtBoldItalic.otf", + "preferred_family_name": "Novaletra Serif CF", + "preferred_subfamily_name": "Ext Bold Italic", + "subfamily_name": "Italic", + "weight": 800, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/NovaletraSerifCF-Heavy.otf||63884:1747702940.2659154": { + "family_name": "Novaletra Serif CF Heavy", + "font-family": "Novaletra Serif CF Heavy", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "900", + "fs_type": 8, + "full_name": "Novaletra Serif CF Heavy", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/home/cjennings/.local/share/fonts/NovaletraSerifCF-Heavy.otf", + "preferred_family_name": "Novaletra Serif CF", + "preferred_subfamily_name": "Heavy", + "subfamily_name": "Regular", + "weight": 900, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/NovaletraSerifCF-HeavyItalic.otf||66264:1747702940.2659154": { + "family_name": "Novaletra Serif CF Heavy", + "font-family": "Novaletra Serif CF Heavy", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "900", + "fs_type": 8, + "full_name": "Novaletra Serif CF Heavy Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/home/cjennings/.local/share/fonts/NovaletraSerifCF-HeavyItalic.otf", + "preferred_family_name": "Novaletra Serif CF", + "preferred_subfamily_name": "Heavy Italic", + "subfamily_name": "Italic", + "weight": 900, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/NovaletraSerifCF-Light.otf||64140:1747702940.2669153": { + "family_name": "Novaletra Serif CF Light", + "font-family": "Novaletra Serif CF Light", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "300", + "fs_type": 8, + "full_name": "Novaletra Serif CF Light", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/home/cjennings/.local/share/fonts/NovaletraSerifCF-Light.otf", + "preferred_family_name": "Novaletra Serif CF", + "preferred_subfamily_name": "Light", + "subfamily_name": "Regular", + "weight": 300, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/NovaletraSerifCF-LightItalic.otf||66732:1747702940.2669153": { + "family_name": "Novaletra Serif CF Light", + "font-family": "Novaletra Serif CF Light", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "300", + "fs_type": 8, + "full_name": "Novaletra Serif CF Light Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/home/cjennings/.local/share/fonts/NovaletraSerifCF-LightItalic.otf", + "preferred_family_name": "Novaletra Serif CF", + "preferred_subfamily_name": "Light Italic", + "subfamily_name": "Italic", + "weight": 300, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/NovaletraSerifCF-Medium.otf||64364:1747702940.2669153": { + "family_name": "Novaletra Serif CF Medium", + "font-family": "Novaletra Serif CF Medium", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "500", + "fs_type": 8, + "full_name": "Novaletra Serif CF Medium", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/home/cjennings/.local/share/fonts/NovaletraSerifCF-Medium.otf", + "preferred_family_name": "Novaletra Serif CF", + "preferred_subfamily_name": "Medium", + "subfamily_name": "Regular", + "weight": 500, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/NovaletraSerifCF-MediumItalic.otf||66216:1747702940.2669153": { + "family_name": "Novaletra Serif CF Medium", + "font-family": "Novaletra Serif CF Medium", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "500", + "fs_type": 8, + "full_name": "Novaletra Serif CF Medium Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/home/cjennings/.local/share/fonts/NovaletraSerifCF-MediumItalic.otf", + "preferred_family_name": "Novaletra Serif CF", + "preferred_subfamily_name": "Medium Italic", + "subfamily_name": "Italic", + "weight": 500, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/NovaletraSerifCF-Regular.otf||64392:1747702940.2669153": { + "family_name": "Novaletra Serif CF", + "font-family": "Novaletra Serif CF", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 8, + "full_name": "Novaletra Serif CF Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/home/cjennings/.local/share/fonts/NovaletraSerifCF-Regular.otf", + "preferred_family_name": "Novaletra Serif CF", + "preferred_subfamily_name": "Regular", + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/NovaletraSerifCF-RegularItalic.otf||66240:1747702940.2679152": { + "family_name": "Novaletra Serif CF", + "font-family": "Novaletra Serif CF", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 8, + "full_name": "Novaletra Serif CF Regular Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/home/cjennings/.local/share/fonts/NovaletraSerifCF-RegularItalic.otf", + "preferred_family_name": "Novaletra Serif CF", + "preferred_subfamily_name": "Regular Italic", + "subfamily_name": "Italic", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/PragmataProB_09.ttf||4607292:1747702940.2899127": { + "family_name": "PragmataPro", + "font-family": "PragmataPro", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 264, + "full_name": "PragmataPro Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 5, + 0, + 3, + 0, + 0, + 2, + 0, + 4 + ], + "path": "/home/cjennings/.local/share/fonts/PragmataProB_09.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/PragmataProB_liga_09.ttf||4624112:1747702940.294912": { + "family_name": "PragmataPro Liga", + "font-family": "PragmataPro Liga", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 264, + "full_name": "PragmataPro Liga Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 5, + 0, + 3, + 0, + 0, + 2, + 0, + 4 + ], + "path": "/home/cjennings/.local/share/fonts/PragmataProB_liga_09.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/PragmataProI_09.ttf||4490692:1747702940.2999115": { + "family_name": "PragmataPro", + "font-family": "PragmataPro", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 264, + "full_name": "PragmataPro Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 5, + 0, + 3, + 0, + 0, + 2, + 0, + 4 + ], + "path": "/home/cjennings/.local/share/fonts/PragmataProI_09.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Italic", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/PragmataProI_liga_09.ttf||4507588:1747702940.303911": { + "family_name": "PragmataPro Liga", + "font-family": "PragmataPro Liga", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 264, + "full_name": "PragmataPro Liga Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 5, + 0, + 3, + 0, + 0, + 2, + 0, + 4 + ], + "path": "/home/cjennings/.local/share/fonts/PragmataProI_liga_09.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Italic", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/PragmataProR_09.ttf||5051440:1747702940.3059108": { + "family_name": "PragmataPro", + "font-family": "PragmataPro", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 264, + "full_name": "PragmataPro Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/home/cjennings/.local/share/fonts/PragmataProR_09.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/PragmataProR_liga_09.ttf||5068260:1747702940.3079107": { + "family_name": "PragmataPro Liga", + "font-family": "PragmataPro Liga", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 264, + "full_name": "PragmataPro Liga Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/home/cjennings/.local/share/fonts/PragmataProR_liga_09.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/PragmataProZ_09.ttf||4439452:1747702940.3089106": { + "family_name": "PragmataPro", + "font-family": "PragmataPro", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 258, + "full_name": "PragmataPro Bold Italic", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 5, + 0, + 8, + 0, + 8, + 2, + 0, + 4 + ], + "path": "/home/cjennings/.local/share/fonts/PragmataProZ_09.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold Italic", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/PragmataProZ_liga_09.ttf||4456268:1747702940.3109102": { + "family_name": "PragmataPro Liga", + "font-family": "PragmataPro Liga", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 258, + "full_name": "PragmataPro Liga Bold Italic", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 5, + 0, + 8, + 0, + 8, + 2, + 0, + 4 + ], + "path": "/home/cjennings/.local/share/fonts/PragmataProZ_liga_09.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold Italic", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/PragmataPro_Mono_B_09.ttf||3900260:1747702940.3239088": { + "family_name": "PragmataPro Mono", + "font-family": "PragmataPro Mono", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 264, + "full_name": "PragmataPro Mono Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 5, + 9, + 3, + 0, + 0, + 2, + 0, + 4 + ], + "path": "/home/cjennings/.local/share/fonts/PragmataPro_Mono_B_09.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/PragmataPro_Mono_B_liga_09.ttf||3917076:1747702940.3279083": { + "family_name": "PragmataPro Mono Liga", + "font-family": "PragmataPro Mono Liga", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 264, + "full_name": "PragmataPro Mono Liga Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 5, + 9, + 3, + 0, + 0, + 2, + 0, + 4 + ], + "path": "/home/cjennings/.local/share/fonts/PragmataPro_Mono_B_liga_09.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/PragmataPro_Mono_I_09.ttf||3822344:1747702940.3329077": { + "family_name": "PragmataPro Mono", + "font-family": "PragmataPro Mono", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 264, + "full_name": "PragmataPro Mono Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 5, + 9, + 3, + 0, + 0, + 2, + 0, + 4 + ], + "path": "/home/cjennings/.local/share/fonts/PragmataPro_Mono_I_09.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Italic", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/PragmataPro_Mono_I_liga_09.ttf||3839140:1747702940.3339076": { + "family_name": "PragmataPro Mono Liga", + "font-family": "PragmataPro Mono Liga", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 264, + "full_name": "PragmataPro Mono Liga Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 5, + 9, + 3, + 0, + 0, + 2, + 0, + 4 + ], + "path": "/home/cjennings/.local/share/fonts/PragmataPro_Mono_I_liga_09.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Italic", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/PragmataPro_Mono_R_09.ttf||4233500:1747702940.339907": { + "family_name": "PragmataPro Mono", + "font-family": "PragmataPro Mono", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 264, + "full_name": "PragmataPro Mono Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 5, + 9, + 4, + 0, + 0, + 2, + 0, + 4 + ], + "path": "/home/cjennings/.local/share/fonts/PragmataPro_Mono_R_09.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/PragmataPro_Mono_R_liga_09.ttf||4250320:1747702940.3449063": { + "family_name": "PragmataPro Mono Liga", + "font-family": "PragmataPro Mono Liga", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 264, + "full_name": "PragmataPro Mono Liga Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 5, + 9, + 4, + 0, + 0, + 2, + 0, + 4 + ], + "path": "/home/cjennings/.local/share/fonts/PragmataPro_Mono_R_liga_09.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/PragmataPro_Mono_Z_09.ttf||3752628:1747702940.3459063": { + "family_name": "PragmataPro Mono", + "font-family": "PragmataPro Mono", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 264, + "full_name": "PragmataPro Mono Bold Italic", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 5, + 9, + 3, + 0, + 0, + 2, + 0, + 4 + ], + "path": "/home/cjennings/.local/share/fonts/PragmataPro_Mono_Z_09.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold Italic", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/PragmataPro_Mono_Z_liga_09.ttf||3769444:1747702940.347906": { + "family_name": "PragmataPro Mono Liga", + "font-family": "PragmataPro Mono Liga", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 264, + "full_name": "PragmataPro Mono Liga Bold Italic", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 5, + 9, + 3, + 0, + 0, + 2, + 0, + 4 + ], + "path": "/home/cjennings/.local/share/fonts/PragmataPro_Mono_Z_liga_09.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold Italic", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/all-the-icons-nerd-fonts-family.ttf||14:1748063563.124969": {}, + "/home/cjennings/.local/share/fonts/all-the-icons.ttf||44732:1748063565.161948": { + "family_name": "all-the-icons", + "font-family": "all-the-icons", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "all-the-icons", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 3, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/home/cjennings/.local/share/fonts/all-the-icons.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/file-icons.ttf||489672:1748063564.8389513": { + "family_name": "file-icons", + "font-family": "file-icons", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "file-icons", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 3, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/home/cjennings/.local/share/fonts/file-icons.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/fontawesome.ttf||152796:1748063564.3299565": { + "family_name": "FontAwesome", + "font-family": "FontAwesome", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "FontAwesome Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 3, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/home/cjennings/.local/share/fonts/fontawesome.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/material-design-icons.ttf||128180:1748063563.532965": { + "family_name": "Material Icons", + "font-family": "Material Icons", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Material Icons", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 5, + 3, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/home/cjennings/.local/share/fonts/material-design-icons.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/octicons.ttf||52544:1748063563.9909601": { + "family_name": "github-octicons", + "font-family": "github-octicons", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 8, + "full_name": "github-octicons", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 0, + 5, + 3, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/home/cjennings/.local/share/fonts/octicons.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/cjennings/.local/share/fonts/weathericons.ttf||99564:1748063563.7869623": { + "family_name": "Weather Icons", + "font-family": "Weather Icons", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 4, + "full_name": "Weather Icons Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 3, + "panose": [ + 0, + 0, + 5, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/home/cjennings/.local/share/fonts/weathericons.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/opt/calibre/resources/fonts/liberation/LiberationMono-Bold.ttf||307996:1710386566.0": { + "family_name": "Liberation Mono", + "font-family": "Liberation Mono", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "Liberation Mono Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 7, + 7, + 9, + 2, + 2, + 5, + 2, + 4, + 4 + ], + "path": "/opt/calibre/resources/fonts/liberation/LiberationMono-Bold.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/opt/calibre/resources/fonts/liberation/LiberationMono-BoldItalic.ttf||284068:1710386566.0": { + "family_name": "Liberation Mono", + "font-family": "Liberation Mono", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 0, + "full_name": "Liberation Mono Bold Italic", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 7, + 7, + 9, + 2, + 2, + 5, + 9, + 4, + 4 + ], + "path": "/opt/calibre/resources/fonts/liberation/LiberationMono-BoldItalic.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold Italic", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/opt/calibre/resources/fonts/liberation/LiberationMono-Italic.ttf||281536:1710386566.0": { + "family_name": "Liberation Mono", + "font-family": "Liberation Mono", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Liberation Mono Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 7, + 4, + 9, + 2, + 2, + 5, + 9, + 4, + 4 + ], + "path": "/opt/calibre/resources/fonts/liberation/LiberationMono-Italic.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Italic", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/opt/calibre/resources/fonts/liberation/LiberationMono-Regular.ttf||319508:1710386566.0": { + "family_name": "Liberation Mono", + "font-family": "Liberation Mono", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Liberation Mono", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 7, + 4, + 9, + 2, + 2, + 5, + 2, + 4, + 4 + ], + "path": "/opt/calibre/resources/fonts/liberation/LiberationMono-Regular.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/opt/calibre/resources/fonts/liberation/LiberationSans-Bold.ttf||414456:1710386566.0": { + "family_name": "Liberation Sans", + "font-family": "Liberation Sans", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "Liberation Sans Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 11, + 7, + 4, + 2, + 2, + 2, + 2, + 2, + 4 + ], + "path": "/opt/calibre/resources/fonts/liberation/LiberationSans-Bold.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/opt/calibre/resources/fonts/liberation/LiberationSans-BoldItalic.ttf||408996:1710386566.0": { + "family_name": "Liberation Sans", + "font-family": "Liberation Sans", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 0, + "full_name": "Liberation Sans Bold Italic", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 11, + 7, + 4, + 2, + 2, + 2, + 9, + 2, + 4 + ], + "path": "/opt/calibre/resources/fonts/liberation/LiberationSans-BoldItalic.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold Italic", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/opt/calibre/resources/fonts/liberation/LiberationSans-Italic.ttf||415816:1710386566.0": { + "family_name": "Liberation Sans", + "font-family": "Liberation Sans", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Liberation Sans Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 11, + 6, + 4, + 2, + 2, + 2, + 9, + 2, + 4 + ], + "path": "/opt/calibre/resources/fonts/liberation/LiberationSans-Italic.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Italic", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/opt/calibre/resources/fonts/liberation/LiberationSans-Regular.ttf||410712:1710386566.0": { + "family_name": "Liberation Sans", + "font-family": "Liberation Sans", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Liberation Sans", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 11, + 6, + 4, + 2, + 2, + 2, + 2, + 2, + 4 + ], + "path": "/opt/calibre/resources/fonts/liberation/LiberationSans-Regular.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/opt/calibre/resources/fonts/liberation/LiberationSerif-Bold.ttf||370096:1710386566.0": { + "family_name": "Liberation Serif", + "font-family": "Liberation Serif", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "Liberation Serif Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 2, + 8, + 3, + 7, + 5, + 5, + 2, + 3, + 4 + ], + "path": "/opt/calibre/resources/fonts/liberation/LiberationSerif-Bold.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/opt/calibre/resources/fonts/liberation/LiberationSerif-BoldItalic.ttf||376772:1710386566.0": { + "family_name": "Liberation Serif", + "font-family": "Liberation Serif", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 0, + "full_name": "Liberation Serif Bold Italic", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 2, + 7, + 3, + 6, + 5, + 5, + 9, + 3, + 4 + ], + "path": "/opt/calibre/resources/fonts/liberation/LiberationSerif-BoldItalic.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold Italic", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/opt/calibre/resources/fonts/liberation/LiberationSerif-Italic.ttf||375632:1710386566.0": { + "family_name": "Liberation Serif", + "font-family": "Liberation Serif", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Liberation Serif Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 2, + 5, + 3, + 5, + 4, + 5, + 9, + 3, + 4 + ], + "path": "/opt/calibre/resources/fonts/liberation/LiberationSerif-Italic.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Italic", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/opt/calibre/resources/fonts/liberation/LiberationSerif-Regular.ttf||393576:1710386566.0": { + "family_name": "Liberation Serif", + "font-family": "Liberation Serif", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Liberation Serif", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 2, + 6, + 3, + 5, + 4, + 5, + 2, + 3, + 4 + ], + "path": "/opt/calibre/resources/fonts/liberation/LiberationSerif-Regular.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/Adwaita/AdwaitaMono-Bold.ttf||1413212:1751188544.0": { + "family_name": "Adwaita Mono", + "font-family": "Adwaita Mono", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "Adwaita Mono Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 8, + 9, + 3, + 0, + 0, + 0, + 0, + 4 + ], + "path": "/usr/share/fonts/Adwaita/AdwaitaMono-Bold.ttf", + "preferred_family_name": "Adwaita Mono", + "preferred_subfamily_name": "Bold", + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": "Adwaita Mono", + "wws_subfamily_name": "Bold" + }, + "/usr/share/fonts/Adwaita/AdwaitaMono-BoldItalic.ttf||1473552:1751188544.0": { + "family_name": "Adwaita Mono", + "font-family": "Adwaita Mono", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 0, + "full_name": "Adwaita Mono Bold Italic", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 8, + 9, + 3, + 0, + 0, + 0, + 0, + 4 + ], + "path": "/usr/share/fonts/Adwaita/AdwaitaMono-BoldItalic.ttf", + "preferred_family_name": "Adwaita Mono", + "preferred_subfamily_name": "Bold Italic", + "subfamily_name": "Bold Italic", + "weight": 700, + "width": 5, + "wws_family_name": "Adwaita Mono", + "wws_subfamily_name": "Bold Italic" + }, + "/usr/share/fonts/Adwaita/AdwaitaMono-Italic.ttf||1469384:1751188544.0": { + "family_name": "Adwaita Mono", + "font-family": "Adwaita Mono", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Adwaita Mono Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 5, + 9, + 3, + 0, + 0, + 0, + 0, + 4 + ], + "path": "/usr/share/fonts/Adwaita/AdwaitaMono-Italic.ttf", + "preferred_family_name": "Adwaita Mono", + "preferred_subfamily_name": "Italic", + "subfamily_name": "Italic", + "weight": 400, + "width": 5, + "wws_family_name": "Adwaita Mono", + "wws_subfamily_name": "Italic" + }, + "/usr/share/fonts/Adwaita/AdwaitaMono-Regular.ttf||1417460:1751188544.0": { + "family_name": "Adwaita Mono", + "font-family": "Adwaita Mono", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Adwaita Mono", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 5, + 9, + 3, + 0, + 0, + 0, + 0, + 4 + ], + "path": "/usr/share/fonts/Adwaita/AdwaitaMono-Regular.ttf", + "preferred_family_name": "Adwaita Mono", + "preferred_subfamily_name": "Regular", + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": "Adwaita Mono", + "wws_subfamily_name": "Regular" + }, + "/usr/share/fonts/Adwaita/AdwaitaSans-Italic.ttf||910352:1751188544.0": { + "family_name": "Adwaita Sans", + "font-family": "Adwaita Sans", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Adwaita Sans Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 5, + 3, + 0, + 0, + 0, + 2, + 0, + 4 + ], + "path": "/usr/share/fonts/Adwaita/AdwaitaSans-Italic.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Italic", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/Adwaita/AdwaitaSans-Regular.ttf||879796:1751188544.0": { + "family_name": "Adwaita Sans", + "font-family": "Adwaita Sans", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Adwaita Sans", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 5, + 3, + 0, + 0, + 0, + 2, + 0, + 4 + ], + "path": "/usr/share/fonts/Adwaita/AdwaitaSans-Regular.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/AndaleMo.TTF||105468:1747703126.0": { + "family_name": "Andale Mono", + "font-family": "Andale Mono", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 8, + "full_name": "Andale Mono", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 11, + 5, + 9, + 0, + 0, + 0, + 0, + 0, + 4 + ], + "path": "/usr/share/fonts/TTF/AndaleMo.TTF", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/AriBlk.TTF||117028:1747703126.0": { + "family_name": "Arial Black", + "font-family": "Arial Black", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Arial Black", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 11, + 10, + 4, + 2, + 1, + 2, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/AriBlk.TTF", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/Arial.TTF||275572:1747703126.0": { + "family_name": "Arial", + "font-family": "Arial", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Arial", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 11, + 6, + 4, + 2, + 2, + 2, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/Arial.TTF", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/Arialbd.TTF||286620:1747703126.0": { + "family_name": "Arial", + "font-family": "Arial", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "Arial Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 11, + 7, + 4, + 2, + 2, + 2, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/Arialbd.TTF", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/Arialbi.TTF||224692:1747703126.0": { + "family_name": "Arial", + "font-family": "Arial", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 0, + "full_name": "Arial Bold Italic", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 11, + 7, + 4, + 2, + 2, + 2, + 9, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/Arialbi.TTF", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold Italic", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/Ariali.TTF||206132:1747703126.0": { + "family_name": "Arial", + "font-family": "Arial", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Arial Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 11, + 6, + 4, + 2, + 2, + 2, + 9, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/Ariali.TTF", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Italic", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/Charis-Bold.ttf||875024:1749461378.0": { + "family_name": "Charis", + "font-family": "Charis", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "Charis Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 8, + 0, + 6, + 0, + 0, + 2, + 0, + 4 + ], + "path": "/usr/share/fonts/TTF/Charis-Bold.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/Charis-BoldItalic.ttf||895556:1749461378.0": { + "family_name": "Charis", + "font-family": "Charis", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 0, + "full_name": "Charis Bold Italic", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 8, + 0, + 6, + 0, + 0, + 9, + 0, + 4 + ], + "path": "/usr/share/fonts/TTF/Charis-BoldItalic.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold Italic", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/Charis-Italic.ttf||892576:1749461378.0": { + "family_name": "Charis", + "font-family": "Charis", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Charis Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 5, + 0, + 6, + 0, + 0, + 9, + 0, + 4 + ], + "path": "/usr/share/fonts/TTF/Charis-Italic.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Italic", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/Charis-Medium.ttf||882532:1749461378.0": { + "family_name": "Charis Medium", + "font-family": "Charis Medium", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "500", + "fs_type": 0, + "full_name": "Charis Medium", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 5, + 0, + 6, + 0, + 0, + 2, + 0, + 4 + ], + "path": "/usr/share/fonts/TTF/Charis-Medium.ttf", + "preferred_family_name": "Charis", + "preferred_subfamily_name": "Medium", + "subfamily_name": "Regular", + "weight": 500, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/Charis-MediumItalic.ttf||905440:1749461378.0": { + "family_name": "Charis Medium", + "font-family": "Charis Medium", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "500", + "fs_type": 0, + "full_name": "Charis Medium Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 5, + 0, + 6, + 0, + 0, + 9, + 0, + 4 + ], + "path": "/usr/share/fonts/TTF/Charis-MediumItalic.ttf", + "preferred_family_name": "Charis", + "preferred_subfamily_name": "Medium Italic", + "subfamily_name": "Italic", + "weight": 500, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/Charis-Regular.ttf||878076:1749461378.0": { + "family_name": "Charis", + "font-family": "Charis", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Charis", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 5, + 0, + 6, + 0, + 0, + 2, + 0, + 4 + ], + "path": "/usr/share/fonts/TTF/Charis-Regular.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/Charis-SemiBold.ttf||872028:1749461378.0": { + "family_name": "Charis SemiBold", + "font-family": "Charis SemiBold", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "600", + "fs_type": 0, + "full_name": "Charis SemiBold", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 5, + 0, + 6, + 0, + 0, + 2, + 0, + 4 + ], + "path": "/usr/share/fonts/TTF/Charis-SemiBold.ttf", + "preferred_family_name": "Charis", + "preferred_subfamily_name": "SemiBold", + "subfamily_name": "Regular", + "weight": 600, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/Charis-SemiBoldItalic.ttf||906668:1749461378.0": { + "family_name": "Charis SemiBold", + "font-family": "Charis SemiBold", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "600", + "fs_type": 0, + "full_name": "Charis SemiBold Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 5, + 0, + 6, + 0, + 0, + 9, + 0, + 4 + ], + "path": "/usr/share/fonts/TTF/Charis-SemiBoldItalic.ttf", + "preferred_family_name": "Charis", + "preferred_subfamily_name": "SemiBold Italic", + "subfamily_name": "Italic", + "weight": 600, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/Comic.TTF||126364:1747703126.0": { + "family_name": "Comic Sans MS", + "font-family": "Comic Sans MS", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Comic Sans MS", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 1, + "panose": [ + 3, + 15, + 7, + 2, + 3, + 3, + 2, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/Comic.TTF", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/Comicbd.TTF||111476:1747703126.0": { + "family_name": "Comic Sans MS", + "font-family": "Comic Sans MS", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "Comic Sans MS Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 1, + "panose": [ + 3, + 15, + 9, + 2, + 3, + 3, + 2, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/Comicbd.TTF", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/DejaVuMathTeXGyre.ttf||577192:1710752851.0": { + "family_name": "DejaVu Math TeX Gyre", + "font-family": "DejaVu Math TeX Gyre", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 12, + "full_name": "DejaVuMathTeXGyre-Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 5, + 3, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/DejaVuMathTeXGyre.ttf", + "preferred_family_name": "DejaVu Math TeX Gyre", + "preferred_subfamily_name": "Regular", + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/DejaVuSans-Bold.ttf||708920:1710752851.0": { + "family_name": "DejaVu Sans", + "font-family": "DejaVu Sans", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "DejaVu Sans Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 11, + 8, + 3, + 3, + 6, + 4, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/DejaVuSans-Bold.ttf", + "preferred_family_name": "DejaVu Sans", + "preferred_subfamily_name": "Bold", + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/DejaVuSans-BoldOblique.ttf||645600:1710752851.0": { + "family_name": "DejaVu Sans", + "font-family": "DejaVu Sans", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 0, + "full_name": "DejaVu Sans Bold Oblique", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 11, + 8, + 3, + 3, + 3, + 4, + 11, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/DejaVuSans-BoldOblique.ttf", + "preferred_family_name": "DejaVu Sans", + "preferred_subfamily_name": "Bold Oblique", + "subfamily_name": "Bold Oblique", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/DejaVuSans-ExtraLight.ttf||355824:1710752851.0": { + "family_name": "DejaVu Sans Light", + "font-family": "DejaVu Sans Light", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "200", + "fs_type": 0, + "full_name": "DejaVu Sans ExtraLight", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 11, + 2, + 3, + 3, + 8, + 4, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/DejaVuSans-ExtraLight.ttf", + "preferred_family_name": "DejaVu Sans", + "preferred_subfamily_name": "ExtraLight", + "subfamily_name": "ExtraLight", + "weight": 200, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/DejaVuSans-Oblique.ttf||637648:1710752851.0": { + "family_name": "DejaVu Sans", + "font-family": "DejaVu Sans", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 0, + "full_name": "DejaVu Sans Oblique", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 11, + 6, + 3, + 3, + 3, + 4, + 11, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/DejaVuSans-Oblique.ttf", + "preferred_family_name": "DejaVu Sans", + "preferred_subfamily_name": "Oblique", + "subfamily_name": "Oblique", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/DejaVuSans.ttf||759720:1710752851.0": { + "family_name": "DejaVu Sans", + "font-family": "DejaVu Sans", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "DejaVu Sans", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 11, + 6, + 3, + 3, + 8, + 4, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/DejaVuSans.ttf", + "preferred_family_name": "DejaVu Sans", + "preferred_subfamily_name": "Book", + "subfamily_name": "Book", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/DejaVuSansCondensed-Bold.ttf||667844:1710752851.0": { + "family_name": "DejaVu Sans Condensed", + "font-family": "DejaVu Sans Condensed", + "font-stretch": "semi-condensed", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "DejaVu Sans Condensed Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 11, + 8, + 6, + 3, + 6, + 4, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/DejaVuSansCondensed-Bold.ttf", + "preferred_family_name": "DejaVu Sans", + "preferred_subfamily_name": "Condensed Bold", + "subfamily_name": "Bold", + "weight": 700, + "width": 4, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/DejaVuSansCondensed-BoldOblique.ttf||614068:1710752851.0": { + "family_name": "DejaVu Sans Condensed", + "font-family": "DejaVu Sans Condensed", + "font-stretch": "semi-condensed", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 0, + "full_name": "DejaVu Sans Condensed Bold Oblique", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 11, + 8, + 6, + 3, + 3, + 4, + 11, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/DejaVuSansCondensed-BoldOblique.ttf", + "preferred_family_name": "DejaVu Sans", + "preferred_subfamily_name": "Condensed Bold Oblique", + "subfamily_name": "Bold Oblique", + "weight": 700, + "width": 4, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/DejaVuSansCondensed-Oblique.ttf||601448:1710752851.0": { + "family_name": "DejaVu Sans Condensed", + "font-family": "DejaVu Sans Condensed", + "font-stretch": "semi-condensed", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 0, + "full_name": "DejaVu Sans Condensed Oblique", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 11, + 6, + 6, + 3, + 3, + 4, + 11, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/DejaVuSansCondensed-Oblique.ttf", + "preferred_family_name": "DejaVu Sans", + "preferred_subfamily_name": "Condensed Oblique", + "subfamily_name": "Oblique", + "weight": 400, + "width": 4, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/DejaVuSansCondensed.ttf||682828:1710752851.0": { + "family_name": "DejaVu Sans Condensed", + "font-family": "DejaVu Sans Condensed", + "font-stretch": "semi-condensed", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "DejaVu Sans Condensed", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 11, + 6, + 6, + 3, + 8, + 4, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/DejaVuSansCondensed.ttf", + "preferred_family_name": "DejaVu Sans", + "preferred_subfamily_name": "Condensed", + "subfamily_name": "Book", + "weight": 400, + "width": 4, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/DejaVuSansMono-Bold.ttf||334268:1710752851.0": { + "family_name": "DejaVu Sans Mono", + "font-family": "DejaVu Sans Mono", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "DejaVu Sans Mono Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 11, + 7, + 9, + 3, + 6, + 4, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/DejaVuSansMono-Bold.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/DejaVuSansMono-BoldOblique.ttf||254960:1710752851.0": { + "family_name": "DejaVu Sans Mono", + "font-family": "DejaVu Sans Mono", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 0, + "full_name": "DejaVu Sans Mono Bold Oblique", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 11, + 7, + 9, + 3, + 3, + 4, + 11, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/DejaVuSansMono-BoldOblique.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold Oblique", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/DejaVuSansMono-Oblique.ttf||253448:1710752851.0": { + "family_name": "DejaVu Sans Mono", + "font-family": "DejaVu Sans Mono", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 0, + "full_name": "DejaVu Sans Mono Oblique", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 11, + 6, + 9, + 3, + 3, + 4, + 11, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/DejaVuSansMono-Oblique.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Oblique", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/DejaVuSansMono.ttf||343140:1710752851.0": { + "family_name": "DejaVu Sans Mono", + "font-family": "DejaVu Sans Mono", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "DejaVu Sans Mono", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 11, + 6, + 9, + 3, + 8, + 4, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/DejaVuSansMono.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Book", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/DejaVuSerif-Bold.ttf||356668:1710752851.0": { + "family_name": "DejaVu Serif", + "font-family": "DejaVu Serif", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "DejaVu Serif Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 6, + 8, + 3, + 5, + 6, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/DejaVuSerif-Bold.ttf", + "preferred_family_name": "DejaVu Serif", + "preferred_subfamily_name": "Bold", + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/DejaVuSerif-BoldItalic.ttf||348020:1710752851.0": { + "family_name": "DejaVu Serif", + "font-family": "DejaVu Serif", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 0, + "full_name": "DejaVu Serif Bold Italic", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 6, + 8, + 3, + 5, + 3, + 5, + 11, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/DejaVuSerif-BoldItalic.ttf", + "preferred_family_name": "DejaVu Serif", + "preferred_subfamily_name": "Bold Italic", + "subfamily_name": "Bold Italic", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/DejaVuSerif-Italic.ttf||346544:1710752851.0": { + "family_name": "DejaVu Serif", + "font-family": "DejaVu Serif", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 0, + "full_name": "DejaVu Serif Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 6, + 6, + 3, + 5, + 3, + 5, + 11, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/DejaVuSerif-Italic.ttf", + "preferred_family_name": "DejaVu Serif", + "preferred_subfamily_name": "Italic", + "subfamily_name": "Italic", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/DejaVuSerif.ttf||380660:1710752851.0": { + "family_name": "DejaVu Serif", + "font-family": "DejaVu Serif", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "DejaVu Serif", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 6, + 6, + 3, + 5, + 6, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/DejaVuSerif.ttf", + "preferred_family_name": "DejaVu Serif", + "preferred_subfamily_name": "Book", + "subfamily_name": "Book", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/DejaVuSerifCondensed-Bold.ttf||331820:1710752851.0": { + "family_name": "DejaVu Serif Condensed", + "font-family": "DejaVu Serif Condensed", + "font-stretch": "semi-condensed", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "DejaVu Serif Condensed Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 6, + 8, + 6, + 5, + 6, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/DejaVuSerifCondensed-Bold.ttf", + "preferred_family_name": "DejaVu Serif", + "preferred_subfamily_name": "Condensed Bold", + "subfamily_name": "Bold", + "weight": 700, + "width": 4, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/DejaVuSerifCondensed-BoldItalic.ttf||347076:1710752851.0": { + "family_name": "DejaVu Serif Condensed", + "font-family": "DejaVu Serif Condensed", + "font-stretch": "semi-condensed", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 0, + "full_name": "DejaVu Serif Condensed Bold Italic", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 6, + 8, + 6, + 5, + 3, + 5, + 11, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/DejaVuSerifCondensed-BoldItalic.ttf", + "preferred_family_name": "DejaVu Serif", + "preferred_subfamily_name": "Condensed Bold Italic", + "subfamily_name": "Bold Italic", + "weight": 700, + "width": 4, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/DejaVuSerifCondensed-Italic.ttf||345868:1710752851.0": { + "family_name": "DejaVu Serif Condensed", + "font-family": "DejaVu Serif Condensed", + "font-stretch": "semi-condensed", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 0, + "full_name": "DejaVu Serif Condensed Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 6, + 6, + 6, + 5, + 3, + 5, + 11, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/DejaVuSerifCondensed-Italic.ttf", + "preferred_family_name": "DejaVu Serif", + "preferred_subfamily_name": "Condensed Italic", + "subfamily_name": "Italic", + "weight": 400, + "width": 4, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/DejaVuSerifCondensed.ttf||347208:1710752851.0": { + "family_name": "DejaVu Serif Condensed", + "font-family": "DejaVu Serif Condensed", + "font-stretch": "semi-condensed", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "DejaVu Serif Condensed", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 6, + 6, + 6, + 5, + 6, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/DejaVuSerifCondensed.ttf", + "preferred_family_name": "DejaVu Serif", + "preferred_subfamily_name": "Condensed", + "subfamily_name": "Book", + "weight": 400, + "width": 4, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/FiraCodeNerdFont-Bold.ttf||2672432:1745519248.0": { + "family_name": "FiraCode Nerd Font", + "font-family": "FiraCode Nerd Font", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "FiraCode Nerd Font Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/FiraCodeNerdFont-Bold.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/FiraCodeNerdFont-Light.ttf||2641408:1745519248.0": { + "family_name": "FiraCode Nerd Font Light", + "font-family": "FiraCode Nerd Font Light", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "300", + "fs_type": 0, + "full_name": "FiraCode Nerd Font Light", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/FiraCodeNerdFont-Light.ttf", + "preferred_family_name": "FiraCode Nerd Font", + "preferred_subfamily_name": "Light", + "subfamily_name": "Regular", + "weight": 300, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/FiraCodeNerdFont-Medium.ttf||2636736:1745519248.0": { + "family_name": "FiraCode Nerd Font Med", + "font-family": "FiraCode Nerd Font Med", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "500", + "fs_type": 0, + "full_name": "FiraCode Nerd Font Med", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/FiraCodeNerdFont-Medium.ttf", + "preferred_family_name": "FiraCode Nerd Font", + "preferred_subfamily_name": "Medium", + "subfamily_name": "Regular", + "weight": 500, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/FiraCodeNerdFont-Regular.ttf||2642616:1745519248.0": { + "family_name": "FiraCode Nerd Font", + "font-family": "FiraCode Nerd Font", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "FiraCode Nerd Font Reg", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/FiraCodeNerdFont-Regular.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/FiraCodeNerdFont-Retina.ttf||2638472:1745519248.0": { + "family_name": "FiraCode Nerd Font Ret", + "font-family": "FiraCode Nerd Font Ret", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "450", + "fs_type": 0, + "full_name": "FiraCode Nerd Font Ret", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/FiraCodeNerdFont-Retina.ttf", + "preferred_family_name": "FiraCode Nerd Font", + "preferred_subfamily_name": "Retina", + "subfamily_name": "Regular", + "weight": 450, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/FiraCodeNerdFont-SemiBold.ttf||2657272:1745519248.0": { + "family_name": "FiraCode Nerd Font SemBd", + "font-family": "FiraCode Nerd Font SemBd", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "600", + "fs_type": 0, + "full_name": "FiraCode Nerd Font SemBd", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/FiraCodeNerdFont-SemiBold.ttf", + "preferred_family_name": "FiraCode Nerd Font", + "preferred_subfamily_name": "SemiBold", + "subfamily_name": "Regular", + "weight": 600, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/FiraCodeNerdFontMono-Bold.ttf||2677400:1745519248.0": { + "family_name": "FiraCode Nerd Font Mono", + "font-family": "FiraCode Nerd Font Mono", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "FiraCode Nerd Font Mono Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/FiraCodeNerdFontMono-Bold.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/FiraCodeNerdFontMono-Light.ttf||2646620:1745519248.0": { + "family_name": "FiraCode Nerd Font Mono Light", + "font-family": "FiraCode Nerd Font Mono Light", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "300", + "fs_type": 0, + "full_name": "FiraCode Nerd Font Mono Light", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/FiraCodeNerdFontMono-Light.ttf", + "preferred_family_name": "FiraCode Nerd Font Mono", + "preferred_subfamily_name": "Light", + "subfamily_name": "Regular", + "weight": 300, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/FiraCodeNerdFontMono-Medium.ttf||2641764:1745519248.0": { + "family_name": "FiraCode Nerd Font Mono Med", + "font-family": "FiraCode Nerd Font Mono Med", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "500", + "fs_type": 0, + "full_name": "FiraCode Nerd Font Mono Med", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/FiraCodeNerdFontMono-Medium.ttf", + "preferred_family_name": "FiraCode Nerd Font Mono", + "preferred_subfamily_name": "Medium", + "subfamily_name": "Regular", + "weight": 500, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/FiraCodeNerdFontMono-Regular.ttf||2647492:1745519248.0": { + "family_name": "FiraCode Nerd Font Mono", + "font-family": "FiraCode Nerd Font Mono", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "FiraCode Nerd Font Mono Reg", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/FiraCodeNerdFontMono-Regular.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/FiraCodeNerdFontMono-Retina.ttf||2643500:1745519248.0": { + "family_name": "FiraCode Nerd Font Mono Ret", + "font-family": "FiraCode Nerd Font Mono Ret", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "450", + "fs_type": 0, + "full_name": "FiraCode Nerd Font Mono Ret", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/FiraCodeNerdFontMono-Retina.ttf", + "preferred_family_name": "FiraCode Nerd Font Mono", + "preferred_subfamily_name": "Retina", + "subfamily_name": "Regular", + "weight": 450, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/FiraCodeNerdFontMono-SemiBold.ttf||2662304:1745519248.0": { + "family_name": "FiraCode Nerd Font Mono SemBd", + "font-family": "FiraCode Nerd Font Mono SemBd", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "600", + "fs_type": 0, + "full_name": "FiraCode Nerd Font Mono SemBd", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/FiraCodeNerdFontMono-SemiBold.ttf", + "preferred_family_name": "FiraCode Nerd Font Mono", + "preferred_subfamily_name": "SemiBold", + "subfamily_name": "Regular", + "weight": 600, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/FiraCodeNerdFontPropo-Bold.ttf||2686036:1745519248.0": { + "family_name": "FiraCode Nerd Font Propo", + "font-family": "FiraCode Nerd Font Propo", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "FiraCode Nerd Font Propo Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/FiraCodeNerdFontPropo-Bold.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/FiraCodeNerdFontPropo-Light.ttf||2655032:1745519248.0": { + "family_name": "FiraCode Nerd Font Propo Light", + "font-family": "FiraCode Nerd Font Propo Light", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "300", + "fs_type": 0, + "full_name": "FiraCode Nerd Font Propo Light", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/FiraCodeNerdFontPropo-Light.ttf", + "preferred_family_name": "FiraCode Nerd Font Propo", + "preferred_subfamily_name": "Light", + "subfamily_name": "Regular", + "weight": 300, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/FiraCodeNerdFontPropo-Medium.ttf||2650356:1745519248.0": { + "family_name": "FiraCode Nerd Font Propo Med", + "font-family": "FiraCode Nerd Font Propo Med", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "500", + "fs_type": 0, + "full_name": "FiraCode Nerd Font Propo Med", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/FiraCodeNerdFontPropo-Medium.ttf", + "preferred_family_name": "FiraCode Nerd Font Propo", + "preferred_subfamily_name": "Medium", + "subfamily_name": "Regular", + "weight": 500, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/FiraCodeNerdFontPropo-Regular.ttf||2656220:1745519248.0": { + "family_name": "FiraCode Nerd Font Propo", + "font-family": "FiraCode Nerd Font Propo", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "FiraCode Nerd Font Propo Reg", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": true, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/FiraCodeNerdFontPropo-Regular.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/FiraCodeNerdFontPropo-Retina.ttf||2652092:1745519248.0": { + "family_name": "FiraCode Nerd Font Propo Ret", + "font-family": "FiraCode Nerd Font Propo Ret", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "450", + "fs_type": 0, + "full_name": "FiraCode Nerd Font Propo Ret", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/FiraCodeNerdFontPropo-Retina.ttf", + "preferred_family_name": "FiraCode Nerd Font Propo", + "preferred_subfamily_name": "Retina", + "subfamily_name": "Regular", + "weight": 450, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/FiraCodeNerdFontPropo-SemiBold.ttf||2670896:1745519248.0": { + "family_name": "FiraCode Nerd Font Propo SemBd", + "font-family": "FiraCode Nerd Font Propo SemBd", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "600", + "fs_type": 0, + "full_name": "FiraCode Nerd Font Propo SemBd", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/FiraCodeNerdFontPropo-SemiBold.ttf", + "preferred_family_name": "FiraCode Nerd Font Propo", + "preferred_subfamily_name": "SemiBold", + "subfamily_name": "Regular", + "weight": 600, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/Georgia.TTF||142964:1747703126.0": { + "family_name": "Georgia", + "font-family": "Georgia", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Georgia", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 4, + 5, + 2, + 5, + 4, + 5, + 2, + 3, + 3 + ], + "path": "/usr/share/fonts/TTF/Georgia.TTF", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/Georgiab.TTF||139584:1747703126.0": { + "family_name": "Georgia", + "font-family": "Georgia", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "Georgia Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 4, + 8, + 2, + 5, + 4, + 5, + 2, + 2, + 3 + ], + "path": "/usr/share/fonts/TTF/Georgiab.TTF", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/Georgiai.TTF||156668:1747703126.0": { + "family_name": "Georgia", + "font-family": "Georgia", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Georgia Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 4, + 5, + 2, + 5, + 4, + 5, + 9, + 3, + 3 + ], + "path": "/usr/share/fonts/TTF/Georgiai.TTF", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Italic", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/Georgiaz.TTF||158796:1747703126.0": { + "family_name": "Georgia", + "font-family": "Georgia", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 0, + "full_name": "Georgia Bold Italic", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 4, + 8, + 2, + 5, + 4, + 5, + 9, + 2, + 3 + ], + "path": "/usr/share/fonts/TTF/Georgiaz.TTF", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold Italic", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/HackNerdFont-Bold.ttf||2694312:1745519248.0": { + "family_name": "Hack Nerd Font", + "font-family": "Hack Nerd Font", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "Hack Nerd Font Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 8, + 9, + 3, + 2, + 2, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/HackNerdFont-Bold.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/HackNerdFont-BoldItalic.ttf||2699988:1745519248.0": { + "family_name": "Hack Nerd Font", + "font-family": "Hack Nerd Font", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 0, + "full_name": "Hack Nerd Font Bold Italic", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 8, + 9, + 3, + 2, + 2, + 9, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/HackNerdFont-BoldItalic.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold Italic", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/HackNerdFont-Italic.ttf||2693356:1745519248.0": { + "family_name": "Hack Nerd Font", + "font-family": "Hack Nerd Font", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Hack Nerd Font Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 6, + 9, + 3, + 2, + 2, + 9, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/HackNerdFont-Italic.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Italic", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/HackNerdFont-Regular.ttf||2685912:1745519248.0": { + "family_name": "Hack Nerd Font", + "font-family": "Hack Nerd Font", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Hack Nerd Font Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 6, + 9, + 3, + 2, + 2, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/HackNerdFont-Regular.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/HackNerdFontMono-Bold.ttf||2674696:1745519248.0": { + "family_name": "Hack Nerd Font Mono", + "font-family": "Hack Nerd Font Mono", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "Hack Nerd Font Mono Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 8, + 9, + 3, + 2, + 2, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/HackNerdFontMono-Bold.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/HackNerdFontMono-BoldItalic.ttf||2680468:1745519248.0": { + "family_name": "Hack Nerd Font Mono", + "font-family": "Hack Nerd Font Mono", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 0, + "full_name": "Hack Nerd Font Mono Bold Italic", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 8, + 9, + 3, + 2, + 2, + 9, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/HackNerdFontMono-BoldItalic.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold Italic", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/HackNerdFontMono-Italic.ttf||2673840:1745519248.0": { + "family_name": "Hack Nerd Font Mono", + "font-family": "Hack Nerd Font Mono", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Hack Nerd Font Mono Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 6, + 9, + 3, + 2, + 2, + 9, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/HackNerdFontMono-Italic.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Italic", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/HackNerdFontMono-Regular.ttf||2666460:1745519248.0": { + "family_name": "Hack Nerd Font Mono", + "font-family": "Hack Nerd Font Mono", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Hack Nerd Font Mono Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 6, + 9, + 3, + 2, + 2, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/HackNerdFontMono-Regular.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/HackNerdFontPropo-Bold.ttf||2694156:1745519248.0": { + "family_name": "Hack Nerd Font Propo", + "font-family": "Hack Nerd Font Propo", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "Hack Nerd Font Propo Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 8, + 9, + 3, + 2, + 2, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/HackNerdFontPropo-Bold.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/HackNerdFontPropo-BoldItalic.ttf||2699832:1745519248.0": { + "family_name": "Hack Nerd Font Propo", + "font-family": "Hack Nerd Font Propo", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 0, + "full_name": "Hack Nerd Font Propo Bold Italic", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 8, + 9, + 3, + 2, + 2, + 9, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/HackNerdFontPropo-BoldItalic.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold Italic", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/HackNerdFontPropo-Italic.ttf||2693200:1745519248.0": { + "family_name": "Hack Nerd Font Propo", + "font-family": "Hack Nerd Font Propo", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Hack Nerd Font Propo Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 6, + 9, + 3, + 2, + 2, + 9, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/HackNerdFontPropo-Italic.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Italic", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/HackNerdFontPropo-Regular.ttf||2685760:1745519248.0": { + "family_name": "Hack Nerd Font Propo", + "font-family": "Hack Nerd Font Propo", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Hack Nerd Font Propo Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 6, + 9, + 3, + 2, + 2, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/HackNerdFontPropo-Regular.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/Impact.TTF||136076:1747703126.0": { + "family_name": "Impact", + "font-family": "Impact", + "font-stretch": "condensed", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Impact", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 11, + 8, + 6, + 3, + 9, + 2, + 5, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/Impact.TTF", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 3, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFont-Bold.ttf||2389020:1745519248.0": { + "family_name": "JetBrainsMonoNL NF", + "font-family": "JetBrainsMonoNL NF", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "JetBrainsMonoNL NF Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFont-Bold.ttf", + "preferred_family_name": "JetBrainsMonoNL Nerd Font", + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFont-BoldItalic.ttf||2392132:1745519248.0": { + "family_name": "JetBrainsMonoNL NF", + "font-family": "JetBrainsMonoNL NF", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 0, + "full_name": "JetBrainsMonoNL NF Bold Italic", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFont-BoldItalic.ttf", + "preferred_family_name": "JetBrainsMonoNL Nerd Font", + "preferred_subfamily_name": null, + "subfamily_name": "Bold Italic", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFont-ExtraBold.ttf||2391492:1745519248.0": { + "family_name": "JetBrainsMonoNL NF ExtraBold", + "font-family": "JetBrainsMonoNL NF ExtraBold", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "800", + "fs_type": 0, + "full_name": "JetBrainsMonoNL NF ExtraBold", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFont-ExtraBold.ttf", + "preferred_family_name": "JetBrainsMonoNL Nerd Font", + "preferred_subfamily_name": "ExtraBold", + "subfamily_name": "Regular", + "weight": 800, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFont-ExtraBoldItalic.ttf||2393472:1745519248.0": { + "family_name": "JetBrainsMonoNL NF ExtraBold", + "font-family": "JetBrainsMonoNL NF ExtraBold", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "800", + "fs_type": 0, + "full_name": "JetBrainsMonoNL NF ExtraBold Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFont-ExtraBoldItalic.ttf", + "preferred_family_name": "JetBrainsMonoNL Nerd Font", + "preferred_subfamily_name": "ExtraBold Italic", + "subfamily_name": "Italic", + "weight": 800, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFont-ExtraLight.ttf||2387208:1745519248.0": { + "family_name": "JetBrainsMonoNL NF ExtraLight", + "font-family": "JetBrainsMonoNL NF ExtraLight", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "200", + "fs_type": 0, + "full_name": "JetBrainsMonoNL NF ExtraLight", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFont-ExtraLight.ttf", + "preferred_family_name": "JetBrainsMonoNL Nerd Font", + "preferred_subfamily_name": "ExtraLight", + "subfamily_name": "Regular", + "weight": 200, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFont-ExtraLightItalic.ttf||2387952:1745519248.0": { + "family_name": "JetBrainsMonoNL NF ExtraLight", + "font-family": "JetBrainsMonoNL NF ExtraLight", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "200", + "fs_type": 0, + "full_name": "JetBrainsMonoNL NF ExtraLight Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFont-ExtraLightItalic.ttf", + "preferred_family_name": "JetBrainsMonoNL Nerd Font", + "preferred_subfamily_name": "ExtraLight Italic", + "subfamily_name": "Italic", + "weight": 200, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFont-Italic.ttf||2389592:1745519248.0": { + "family_name": "JetBrainsMonoNL NF", + "font-family": "JetBrainsMonoNL NF", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 0, + "full_name": "JetBrainsMonoNL NF Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFont-Italic.ttf", + "preferred_family_name": "JetBrainsMonoNL Nerd Font", + "preferred_subfamily_name": null, + "subfamily_name": "Italic", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFont-Light.ttf||2388892:1745519248.0": { + "family_name": "JetBrainsMonoNL NF Light", + "font-family": "JetBrainsMonoNL NF Light", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "300", + "fs_type": 0, + "full_name": "JetBrainsMonoNL NF Light", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFont-Light.ttf", + "preferred_family_name": "JetBrainsMonoNL Nerd Font", + "preferred_subfamily_name": "Light", + "subfamily_name": "Regular", + "weight": 300, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFont-LightItalic.ttf||2390312:1745519248.0": { + "family_name": "JetBrainsMonoNL NF Light", + "font-family": "JetBrainsMonoNL NF Light", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "300", + "fs_type": 0, + "full_name": "JetBrainsMonoNL NF Light Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFont-LightItalic.ttf", + "preferred_family_name": "JetBrainsMonoNL Nerd Font", + "preferred_subfamily_name": "Light Italic", + "subfamily_name": "Italic", + "weight": 300, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFont-Medium.ttf||2386364:1745519248.0": { + "family_name": "JetBrainsMonoNL NF Medium", + "font-family": "JetBrainsMonoNL NF Medium", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "500", + "fs_type": 0, + "full_name": "JetBrainsMonoNL NF Medium", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFont-Medium.ttf", + "preferred_family_name": "JetBrainsMonoNL Nerd Font", + "preferred_subfamily_name": "Medium", + "subfamily_name": "Regular", + "weight": 500, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFont-MediumItalic.ttf||2389596:1745519248.0": { + "family_name": "JetBrainsMonoNL NF Medium", + "font-family": "JetBrainsMonoNL NF Medium", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "500", + "fs_type": 0, + "full_name": "JetBrainsMonoNL NF Medium Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFont-MediumItalic.ttf", + "preferred_family_name": "JetBrainsMonoNL Nerd Font", + "preferred_subfamily_name": "Medium Italic", + "subfamily_name": "Italic", + "weight": 500, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFont-Regular.ttf||2386636:1745519248.0": { + "family_name": "JetBrainsMonoNL NF", + "font-family": "JetBrainsMonoNL NF", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "JetBrainsMonoNL NF Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFont-Regular.ttf", + "preferred_family_name": "JetBrainsMonoNL Nerd Font", + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFont-SemiBold.ttf||2387944:1745519248.0": { + "family_name": "JetBrainsMonoNL NF SemiBold", + "font-family": "JetBrainsMonoNL NF SemiBold", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "600", + "fs_type": 0, + "full_name": "JetBrainsMonoNL NF SemiBold", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFont-SemiBold.ttf", + "preferred_family_name": "JetBrainsMonoNL Nerd Font", + "preferred_subfamily_name": "SemiBold", + "subfamily_name": "Regular", + "weight": 600, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFont-SemiBoldItalic.ttf||2392048:1745519248.0": { + "family_name": "JetBrainsMonoNL NF SemiBold", + "font-family": "JetBrainsMonoNL NF SemiBold", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "600", + "fs_type": 0, + "full_name": "JetBrainsMonoNL NF SemiBold Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFont-SemiBoldItalic.ttf", + "preferred_family_name": "JetBrainsMonoNL Nerd Font", + "preferred_subfamily_name": "SemiBold Italic", + "subfamily_name": "Italic", + "weight": 600, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFont-Thin.ttf||2384112:1745519248.0": { + "family_name": "JetBrainsMonoNL NF Thin", + "font-family": "JetBrainsMonoNL NF Thin", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "100", + "fs_type": 0, + "full_name": "JetBrainsMonoNL NF Thin", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFont-Thin.ttf", + "preferred_family_name": "JetBrainsMonoNL Nerd Font", + "preferred_subfamily_name": "Thin", + "subfamily_name": "Regular", + "weight": 100, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFont-ThinItalic.ttf||2387148:1745519248.0": { + "family_name": "JetBrainsMonoNL NF Thin", + "font-family": "JetBrainsMonoNL NF Thin", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "100", + "fs_type": 0, + "full_name": "JetBrainsMonoNL NF Thin Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFont-ThinItalic.ttf", + "preferred_family_name": "JetBrainsMonoNL Nerd Font", + "preferred_subfamily_name": "Thin Italic", + "subfamily_name": "Italic", + "weight": 100, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFontMono-Bold.ttf||2390340:1745519248.0": { + "family_name": "JetBrainsMonoNL NFM", + "font-family": "JetBrainsMonoNL NFM", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "JetBrainsMonoNL NFM Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFontMono-Bold.ttf", + "preferred_family_name": "JetBrainsMonoNL Nerd Font Mono", + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFontMono-BoldItalic.ttf||2393480:1745519248.0": { + "family_name": "JetBrainsMonoNL NFM", + "font-family": "JetBrainsMonoNL NFM", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 0, + "full_name": "JetBrainsMonoNL NFM Bold Italic", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFontMono-BoldItalic.ttf", + "preferred_family_name": "JetBrainsMonoNL Nerd Font Mono", + "preferred_subfamily_name": null, + "subfamily_name": "Bold Italic", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFontMono-ExtraBold.ttf||2392812:1745519248.0": { + "family_name": "JetBrainsMonoNL NFM ExtraBold", + "font-family": "JetBrainsMonoNL NFM ExtraBold", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "800", + "fs_type": 0, + "full_name": "JetBrainsMonoNL NFM ExtraBold", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFontMono-ExtraBold.ttf", + "preferred_family_name": "JetBrainsMonoNL Nerd Font Mono", + "preferred_subfamily_name": "ExtraBold", + "subfamily_name": "Regular", + "weight": 800, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFontMono-ExtraBoldItalic.ttf||2394820:1745519248.0": { + "family_name": "JetBrainsMonoNL NFM ExtraBold", + "font-family": "JetBrainsMonoNL NFM ExtraBold", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "800", + "fs_type": 0, + "full_name": "JetBrainsMonoNL NFM ExtraBold Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFontMono-ExtraBoldItalic.ttf", + "preferred_family_name": "JetBrainsMonoNL Nerd Font Mono", + "preferred_subfamily_name": "ExtraBold Italic", + "subfamily_name": "Italic", + "weight": 800, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFontMono-ExtraLight.ttf||2388532:1745519248.0": { + "family_name": "JetBrainsMonoNL NFM ExtraLight", + "font-family": "JetBrainsMonoNL NFM ExtraLight", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "200", + "fs_type": 0, + "full_name": "JetBrainsMonoNL NFM ExtraLight", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFontMono-ExtraLight.ttf", + "preferred_family_name": "JetBrainsMonoNL Nerd Font Mono", + "preferred_subfamily_name": "ExtraLight", + "subfamily_name": "Regular", + "weight": 200, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFontMono-ExtraLightItalic.ttf||2389304:1745519248.0": { + "family_name": "JetBrainsMonoNL NFM ExtraLight", + "font-family": "JetBrainsMonoNL NFM ExtraLight", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "200", + "fs_type": 0, + "full_name": "JetBrainsMonoNL NFM ExtraLight Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFontMono-ExtraLightItalic.ttf", + "preferred_family_name": "JetBrainsMonoNL Nerd Font Mono", + "preferred_subfamily_name": "ExtraLight Italic", + "subfamily_name": "Italic", + "weight": 200, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFontMono-Italic.ttf||2390940:1745519248.0": { + "family_name": "JetBrainsMonoNL NFM", + "font-family": "JetBrainsMonoNL NFM", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 0, + "full_name": "JetBrainsMonoNL NFM Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFontMono-Italic.ttf", + "preferred_family_name": "JetBrainsMonoNL Nerd Font Mono", + "preferred_subfamily_name": null, + "subfamily_name": "Italic", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFontMono-Light.ttf||2390212:1745519248.0": { + "family_name": "JetBrainsMonoNL NFM Light", + "font-family": "JetBrainsMonoNL NFM Light", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "300", + "fs_type": 0, + "full_name": "JetBrainsMonoNL NFM Light", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFontMono-Light.ttf", + "preferred_family_name": "JetBrainsMonoNL Nerd Font Mono", + "preferred_subfamily_name": "Light", + "subfamily_name": "Regular", + "weight": 300, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFontMono-LightItalic.ttf||2391660:1745519248.0": { + "family_name": "JetBrainsMonoNL NFM Light", + "font-family": "JetBrainsMonoNL NFM Light", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "300", + "fs_type": 0, + "full_name": "JetBrainsMonoNL NFM Light Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFontMono-LightItalic.ttf", + "preferred_family_name": "JetBrainsMonoNL Nerd Font Mono", + "preferred_subfamily_name": "Light Italic", + "subfamily_name": "Italic", + "weight": 300, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFontMono-Medium.ttf||2387688:1745519248.0": { + "family_name": "JetBrainsMonoNL NFM Medium", + "font-family": "JetBrainsMonoNL NFM Medium", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "500", + "fs_type": 0, + "full_name": "JetBrainsMonoNL NFM Medium", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFontMono-Medium.ttf", + "preferred_family_name": "JetBrainsMonoNL Nerd Font Mono", + "preferred_subfamily_name": "Medium", + "subfamily_name": "Regular", + "weight": 500, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFontMono-MediumItalic.ttf||2390948:1745519248.0": { + "family_name": "JetBrainsMonoNL NFM Medium", + "font-family": "JetBrainsMonoNL NFM Medium", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "500", + "fs_type": 0, + "full_name": "JetBrainsMonoNL NFM Medium Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFontMono-MediumItalic.ttf", + "preferred_family_name": "JetBrainsMonoNL Nerd Font Mono", + "preferred_subfamily_name": "Medium Italic", + "subfamily_name": "Italic", + "weight": 500, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFontMono-Regular.ttf||2387956:1745519248.0": { + "family_name": "JetBrainsMonoNL NFM", + "font-family": "JetBrainsMonoNL NFM", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "JetBrainsMonoNL NFM Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFontMono-Regular.ttf", + "preferred_family_name": "JetBrainsMonoNL Nerd Font Mono", + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFontMono-SemiBold.ttf||2389264:1745519248.0": { + "family_name": "JetBrainsMonoNL NFM SemiBold", + "font-family": "JetBrainsMonoNL NFM SemiBold", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "600", + "fs_type": 0, + "full_name": "JetBrainsMonoNL NFM SemiBold", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFontMono-SemiBold.ttf", + "preferred_family_name": "JetBrainsMonoNL Nerd Font Mono", + "preferred_subfamily_name": "SemiBold", + "subfamily_name": "Regular", + "weight": 600, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFontMono-SemiBoldItalic.ttf||2393396:1745519248.0": { + "family_name": "JetBrainsMonoNL NFM SemiBold", + "font-family": "JetBrainsMonoNL NFM SemiBold", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "600", + "fs_type": 0, + "full_name": "JetBrainsMonoNL NFM SemiBold Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFontMono-SemiBoldItalic.ttf", + "preferred_family_name": "JetBrainsMonoNL Nerd Font Mono", + "preferred_subfamily_name": "SemiBold Italic", + "subfamily_name": "Italic", + "weight": 600, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFontMono-Thin.ttf||2385432:1745519248.0": { + "family_name": "JetBrainsMonoNL NFM Thin", + "font-family": "JetBrainsMonoNL NFM Thin", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "100", + "fs_type": 0, + "full_name": "JetBrainsMonoNL NFM Thin", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFontMono-Thin.ttf", + "preferred_family_name": "JetBrainsMonoNL Nerd Font Mono", + "preferred_subfamily_name": "Thin", + "subfamily_name": "Regular", + "weight": 100, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFontMono-ThinItalic.ttf||2388496:1745519248.0": { + "family_name": "JetBrainsMonoNL NFM Thin", + "font-family": "JetBrainsMonoNL NFM Thin", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "100", + "fs_type": 0, + "full_name": "JetBrainsMonoNL NFM Thin Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFontMono-ThinItalic.ttf", + "preferred_family_name": "JetBrainsMonoNL Nerd Font Mono", + "preferred_subfamily_name": "Thin Italic", + "subfamily_name": "Italic", + "weight": 100, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFontPropo-Bold.ttf||2388880:1745519248.0": { + "family_name": "JetBrainsMonoNL NFP", + "font-family": "JetBrainsMonoNL NFP", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "JetBrainsMonoNL NFP Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFontPropo-Bold.ttf", + "preferred_family_name": "JetBrainsMonoNL Nerd Font Propo", + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFontPropo-BoldItalic.ttf||2391992:1745519248.0": { + "family_name": "JetBrainsMonoNL NFP", + "font-family": "JetBrainsMonoNL NFP", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 0, + "full_name": "JetBrainsMonoNL NFP Bold Italic", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFontPropo-BoldItalic.ttf", + "preferred_family_name": "JetBrainsMonoNL Nerd Font Propo", + "preferred_subfamily_name": null, + "subfamily_name": "Bold Italic", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFontPropo-ExtraBold.ttf||2391352:1745519248.0": { + "family_name": "JetBrainsMonoNL NFP ExtraBold", + "font-family": "JetBrainsMonoNL NFP ExtraBold", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "800", + "fs_type": 0, + "full_name": "JetBrainsMonoNL NFP ExtraBold", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFontPropo-ExtraBold.ttf", + "preferred_family_name": "JetBrainsMonoNL Nerd Font Propo", + "preferred_subfamily_name": "ExtraBold", + "subfamily_name": "Regular", + "weight": 800, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFontPropo-ExtraBoldItalic.ttf||2393332:1745519248.0": { + "family_name": "JetBrainsMonoNL NFP ExtraBold", + "font-family": "JetBrainsMonoNL NFP ExtraBold", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "800", + "fs_type": 0, + "full_name": "JetBrainsMonoNL NFP ExtraBold Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFontPropo-ExtraBoldItalic.ttf", + "preferred_family_name": "JetBrainsMonoNL Nerd Font Propo", + "preferred_subfamily_name": "ExtraBold Italic", + "subfamily_name": "Italic", + "weight": 800, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFontPropo-ExtraLight.ttf||2387068:1745519248.0": { + "family_name": "JetBrainsMonoNL NFP ExtraLight", + "font-family": "JetBrainsMonoNL NFP ExtraLight", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "200", + "fs_type": 0, + "full_name": "JetBrainsMonoNL NFP ExtraLight", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFontPropo-ExtraLight.ttf", + "preferred_family_name": "JetBrainsMonoNL Nerd Font Propo", + "preferred_subfamily_name": "ExtraLight", + "subfamily_name": "Regular", + "weight": 200, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFontPropo-ExtraLightItalic.ttf||2387812:1745519248.0": { + "family_name": "JetBrainsMonoNL NFP ExtraLight", + "font-family": "JetBrainsMonoNL NFP ExtraLight", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "200", + "fs_type": 0, + "full_name": "JetBrainsMonoNL NFP ExtraLight Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFontPropo-ExtraLightItalic.ttf", + "preferred_family_name": "JetBrainsMonoNL Nerd Font Propo", + "preferred_subfamily_name": "ExtraLight Italic", + "subfamily_name": "Italic", + "weight": 200, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFontPropo-Italic.ttf||2389452:1745519248.0": { + "family_name": "JetBrainsMonoNL NFP", + "font-family": "JetBrainsMonoNL NFP", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 0, + "full_name": "JetBrainsMonoNL NFP Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFontPropo-Italic.ttf", + "preferred_family_name": "JetBrainsMonoNL Nerd Font Propo", + "preferred_subfamily_name": null, + "subfamily_name": "Italic", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFontPropo-Light.ttf||2388752:1745519248.0": { + "family_name": "JetBrainsMonoNL NFP Light", + "font-family": "JetBrainsMonoNL NFP Light", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "300", + "fs_type": 0, + "full_name": "JetBrainsMonoNL NFP Light", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFontPropo-Light.ttf", + "preferred_family_name": "JetBrainsMonoNL Nerd Font Propo", + "preferred_subfamily_name": "Light", + "subfamily_name": "Regular", + "weight": 300, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFontPropo-LightItalic.ttf||2390172:1745519248.0": { + "family_name": "JetBrainsMonoNL NFP Light", + "font-family": "JetBrainsMonoNL NFP Light", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "300", + "fs_type": 0, + "full_name": "JetBrainsMonoNL NFP Light Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFontPropo-LightItalic.ttf", + "preferred_family_name": "JetBrainsMonoNL Nerd Font Propo", + "preferred_subfamily_name": "Light Italic", + "subfamily_name": "Italic", + "weight": 300, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFontPropo-Medium.ttf||2386224:1745519248.0": { + "family_name": "JetBrainsMonoNL NFP Medium", + "font-family": "JetBrainsMonoNL NFP Medium", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "500", + "fs_type": 0, + "full_name": "JetBrainsMonoNL NFP Medium", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFontPropo-Medium.ttf", + "preferred_family_name": "JetBrainsMonoNL Nerd Font Propo", + "preferred_subfamily_name": "Medium", + "subfamily_name": "Regular", + "weight": 500, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFontPropo-MediumItalic.ttf||2389456:1745519248.0": { + "family_name": "JetBrainsMonoNL NFP Medium", + "font-family": "JetBrainsMonoNL NFP Medium", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "500", + "fs_type": 0, + "full_name": "JetBrainsMonoNL NFP Medium Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFontPropo-MediumItalic.ttf", + "preferred_family_name": "JetBrainsMonoNL Nerd Font Propo", + "preferred_subfamily_name": "Medium Italic", + "subfamily_name": "Italic", + "weight": 500, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFontPropo-Regular.ttf||2386496:1745519248.0": { + "family_name": "JetBrainsMonoNL NFP", + "font-family": "JetBrainsMonoNL NFP", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "JetBrainsMonoNL NFP Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFontPropo-Regular.ttf", + "preferred_family_name": "JetBrainsMonoNL Nerd Font Propo", + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFontPropo-SemiBold.ttf||2387804:1745519248.0": { + "family_name": "JetBrainsMonoNL NFP SemiBold", + "font-family": "JetBrainsMonoNL NFP SemiBold", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "600", + "fs_type": 0, + "full_name": "JetBrainsMonoNL NFP SemiBold", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFontPropo-SemiBold.ttf", + "preferred_family_name": "JetBrainsMonoNL Nerd Font Propo", + "preferred_subfamily_name": "SemiBold", + "subfamily_name": "Regular", + "weight": 600, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFontPropo-SemiBoldItalic.ttf||2391908:1745519248.0": { + "family_name": "JetBrainsMonoNL NFP SemiBold", + "font-family": "JetBrainsMonoNL NFP SemiBold", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "600", + "fs_type": 0, + "full_name": "JetBrainsMonoNL NFP SemiBold Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFontPropo-SemiBoldItalic.ttf", + "preferred_family_name": "JetBrainsMonoNL Nerd Font Propo", + "preferred_subfamily_name": "SemiBold Italic", + "subfamily_name": "Italic", + "weight": 600, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFontPropo-Thin.ttf||2383972:1745519248.0": { + "family_name": "JetBrainsMonoNL NFP Thin", + "font-family": "JetBrainsMonoNL NFP Thin", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "100", + "fs_type": 0, + "full_name": "JetBrainsMonoNL NFP Thin", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFontPropo-Thin.ttf", + "preferred_family_name": "JetBrainsMonoNL Nerd Font Propo", + "preferred_subfamily_name": "Thin", + "subfamily_name": "Regular", + "weight": 100, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFontPropo-ThinItalic.ttf||2387008:1745519248.0": { + "family_name": "JetBrainsMonoNL NFP Thin", + "font-family": "JetBrainsMonoNL NFP Thin", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "100", + "fs_type": 0, + "full_name": "JetBrainsMonoNL NFP Thin Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNLNerdFontPropo-ThinItalic.ttf", + "preferred_family_name": "JetBrainsMonoNL Nerd Font Propo", + "preferred_subfamily_name": "Thin Italic", + "subfamily_name": "Italic", + "weight": 100, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNerdFont-Bold.ttf||2472872:1745519248.0": { + "family_name": "JetBrainsMono NF", + "font-family": "JetBrainsMono NF", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "JetBrainsMono NF Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNerdFont-Bold.ttf", + "preferred_family_name": "JetBrainsMono Nerd Font", + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNerdFont-BoldItalic.ttf||2474096:1745519248.0": { + "family_name": "JetBrainsMono NF", + "font-family": "JetBrainsMono NF", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 0, + "full_name": "JetBrainsMono NF Bold Italic", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNerdFont-BoldItalic.ttf", + "preferred_family_name": "JetBrainsMono Nerd Font", + "preferred_subfamily_name": null, + "subfamily_name": "Bold Italic", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNerdFont-ExtraBold.ttf||2474636:1745519248.0": { + "family_name": "JetBrainsMono NF ExtraBold", + "font-family": "JetBrainsMono NF ExtraBold", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "800", + "fs_type": 0, + "full_name": "JetBrainsMono NF ExtraBold", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNerdFont-ExtraBold.ttf", + "preferred_family_name": "JetBrainsMono Nerd Font", + "preferred_subfamily_name": "ExtraBold", + "subfamily_name": "Regular", + "weight": 800, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNerdFont-ExtraBoldItalic.ttf||2476116:1745519248.0": { + "family_name": "JetBrainsMono NF ExtraBold", + "font-family": "JetBrainsMono NF ExtraBold", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "800", + "fs_type": 0, + "full_name": "JetBrainsMono NF ExtraBold Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNerdFont-ExtraBoldItalic.ttf", + "preferred_family_name": "JetBrainsMono Nerd Font", + "preferred_subfamily_name": "ExtraBold Italic", + "subfamily_name": "Italic", + "weight": 800, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNerdFont-ExtraLight.ttf||2469240:1745519248.0": { + "family_name": "JetBrainsMono NF ExtraLight", + "font-family": "JetBrainsMono NF ExtraLight", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "200", + "fs_type": 0, + "full_name": "JetBrainsMono NF ExtraLight", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNerdFont-ExtraLight.ttf", + "preferred_family_name": "JetBrainsMono Nerd Font", + "preferred_subfamily_name": "ExtraLight", + "subfamily_name": "Regular", + "weight": 200, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNerdFont-ExtraLightItalic.ttf||2468532:1745519248.0": { + "family_name": "JetBrainsMono NF ExtraLight", + "font-family": "JetBrainsMono NF ExtraLight", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "200", + "fs_type": 0, + "full_name": "JetBrainsMono NF ExtraLight Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNerdFont-ExtraLightItalic.ttf", + "preferred_family_name": "JetBrainsMono Nerd Font", + "preferred_subfamily_name": "ExtraLight Italic", + "subfamily_name": "Italic", + "weight": 200, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNerdFont-Italic.ttf||2471188:1745519248.0": { + "family_name": "JetBrainsMono NF", + "font-family": "JetBrainsMono NF", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 0, + "full_name": "JetBrainsMono NF Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNerdFont-Italic.ttf", + "preferred_family_name": "JetBrainsMono Nerd Font", + "preferred_subfamily_name": null, + "subfamily_name": "Italic", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNerdFont-Light.ttf||2471528:1745519248.0": { + "family_name": "JetBrainsMono NF Light", + "font-family": "JetBrainsMono NF Light", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "300", + "fs_type": 0, + "full_name": "JetBrainsMono NF Light", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNerdFont-Light.ttf", + "preferred_family_name": "JetBrainsMono Nerd Font", + "preferred_subfamily_name": "Light", + "subfamily_name": "Regular", + "weight": 300, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNerdFont-LightItalic.ttf||2471416:1745519248.0": { + "family_name": "JetBrainsMono NF Light", + "font-family": "JetBrainsMono NF Light", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "300", + "fs_type": 0, + "full_name": "JetBrainsMono NF Light Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNerdFont-LightItalic.ttf", + "preferred_family_name": "JetBrainsMono Nerd Font", + "preferred_subfamily_name": "Light Italic", + "subfamily_name": "Italic", + "weight": 300, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNerdFont-Medium.ttf||2468976:1745519248.0": { + "family_name": "JetBrainsMono NF Medium", + "font-family": "JetBrainsMono NF Medium", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "500", + "fs_type": 0, + "full_name": "JetBrainsMono NF Medium", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNerdFont-Medium.ttf", + "preferred_family_name": "JetBrainsMono Nerd Font", + "preferred_subfamily_name": "Medium", + "subfamily_name": "Regular", + "weight": 500, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNerdFont-MediumItalic.ttf||2471136:1745519248.0": { + "family_name": "JetBrainsMono NF Medium", + "font-family": "JetBrainsMono NF Medium", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "500", + "fs_type": 0, + "full_name": "JetBrainsMono NF Medium Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNerdFont-MediumItalic.ttf", + "preferred_family_name": "JetBrainsMono Nerd Font", + "preferred_subfamily_name": "Medium Italic", + "subfamily_name": "Italic", + "weight": 500, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNerdFont-Regular.ttf||2469104:1745519248.0": { + "family_name": "JetBrainsMono NF", + "font-family": "JetBrainsMono NF", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "JetBrainsMono NF Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNerdFont-Regular.ttf", + "preferred_family_name": "JetBrainsMono Nerd Font", + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNerdFont-SemiBold.ttf||2472212:1745519248.0": { + "family_name": "JetBrainsMono NF SemiBold", + "font-family": "JetBrainsMono NF SemiBold", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "600", + "fs_type": 0, + "full_name": "JetBrainsMono NF SemiBold", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNerdFont-SemiBold.ttf", + "preferred_family_name": "JetBrainsMono Nerd Font", + "preferred_subfamily_name": "SemiBold", + "subfamily_name": "Regular", + "weight": 600, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNerdFont-SemiBoldItalic.ttf||2474204:1745519248.0": { + "family_name": "JetBrainsMono NF SemiBold", + "font-family": "JetBrainsMono NF SemiBold", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "600", + "fs_type": 0, + "full_name": "JetBrainsMono NF SemiBold Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNerdFont-SemiBoldItalic.ttf", + "preferred_family_name": "JetBrainsMono Nerd Font", + "preferred_subfamily_name": "SemiBold Italic", + "subfamily_name": "Italic", + "weight": 600, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNerdFont-Thin.ttf||2465240:1745519248.0": { + "family_name": "JetBrainsMono NF Thin", + "font-family": "JetBrainsMono NF Thin", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "100", + "fs_type": 0, + "full_name": "JetBrainsMono NF Thin", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNerdFont-Thin.ttf", + "preferred_family_name": "JetBrainsMono Nerd Font", + "preferred_subfamily_name": "Thin", + "subfamily_name": "Regular", + "weight": 100, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNerdFont-ThinItalic.ttf||2467336:1745519248.0": { + "family_name": "JetBrainsMono NF Thin", + "font-family": "JetBrainsMono NF Thin", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "100", + "fs_type": 0, + "full_name": "JetBrainsMono NF Thin Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNerdFont-ThinItalic.ttf", + "preferred_family_name": "JetBrainsMono Nerd Font", + "preferred_subfamily_name": "Thin Italic", + "subfamily_name": "Italic", + "weight": 100, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNerdFontMono-Bold.ttf||2473884:1745519248.0": { + "family_name": "JetBrainsMono NFM", + "font-family": "JetBrainsMono NFM", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "JetBrainsMono NFM Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNerdFontMono-Bold.ttf", + "preferred_family_name": "JetBrainsMono Nerd Font Mono", + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNerdFontMono-BoldItalic.ttf||2475144:1745519248.0": { + "family_name": "JetBrainsMono NFM", + "font-family": "JetBrainsMono NFM", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 0, + "full_name": "JetBrainsMono NFM Bold Italic", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNerdFontMono-BoldItalic.ttf", + "preferred_family_name": "JetBrainsMono Nerd Font Mono", + "preferred_subfamily_name": null, + "subfamily_name": "Bold Italic", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNerdFontMono-ExtraBold.ttf||2475648:1745519248.0": { + "family_name": "JetBrainsMono NFM ExtraBold", + "font-family": "JetBrainsMono NFM ExtraBold", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "800", + "fs_type": 0, + "full_name": "JetBrainsMono NFM ExtraBold", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNerdFontMono-ExtraBold.ttf", + "preferred_family_name": "JetBrainsMono Nerd Font Mono", + "preferred_subfamily_name": "ExtraBold", + "subfamily_name": "Regular", + "weight": 800, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNerdFontMono-ExtraBoldItalic.ttf||2477160:1745519248.0": { + "family_name": "JetBrainsMono NFM ExtraBold", + "font-family": "JetBrainsMono NFM ExtraBold", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "800", + "fs_type": 0, + "full_name": "JetBrainsMono NFM ExtraBold Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNerdFontMono-ExtraBoldItalic.ttf", + "preferred_family_name": "JetBrainsMono Nerd Font Mono", + "preferred_subfamily_name": "ExtraBold Italic", + "subfamily_name": "Italic", + "weight": 800, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNerdFontMono-ExtraLight.ttf||2470252:1745519248.0": { + "family_name": "JetBrainsMono NFM ExtraLight", + "font-family": "JetBrainsMono NFM ExtraLight", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "200", + "fs_type": 0, + "full_name": "JetBrainsMono NFM ExtraLight", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNerdFontMono-ExtraLight.ttf", + "preferred_family_name": "JetBrainsMono Nerd Font Mono", + "preferred_subfamily_name": "ExtraLight", + "subfamily_name": "Regular", + "weight": 200, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNerdFontMono-ExtraLightItalic.ttf||2469576:1745519248.0": { + "family_name": "JetBrainsMono NFM ExtraLight", + "font-family": "JetBrainsMono NFM ExtraLight", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "200", + "fs_type": 0, + "full_name": "JetBrainsMono NFM ExtraLight Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNerdFontMono-ExtraLightItalic.ttf", + "preferred_family_name": "JetBrainsMono Nerd Font Mono", + "preferred_subfamily_name": "ExtraLight Italic", + "subfamily_name": "Italic", + "weight": 200, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNerdFontMono-Italic.ttf||2472232:1745519248.0": { + "family_name": "JetBrainsMono NFM", + "font-family": "JetBrainsMono NFM", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 0, + "full_name": "JetBrainsMono NFM Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNerdFontMono-Italic.ttf", + "preferred_family_name": "JetBrainsMono Nerd Font Mono", + "preferred_subfamily_name": null, + "subfamily_name": "Italic", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNerdFontMono-Light.ttf||2472540:1745519248.0": { + "family_name": "JetBrainsMono NFM Light", + "font-family": "JetBrainsMono NFM Light", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "300", + "fs_type": 0, + "full_name": "JetBrainsMono NFM Light", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNerdFontMono-Light.ttf", + "preferred_family_name": "JetBrainsMono Nerd Font Mono", + "preferred_subfamily_name": "Light", + "subfamily_name": "Regular", + "weight": 300, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNerdFontMono-LightItalic.ttf||2472460:1745519248.0": { + "family_name": "JetBrainsMono NFM Light", + "font-family": "JetBrainsMono NFM Light", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "300", + "fs_type": 0, + "full_name": "JetBrainsMono NFM Light Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNerdFontMono-LightItalic.ttf", + "preferred_family_name": "JetBrainsMono Nerd Font Mono", + "preferred_subfamily_name": "Light Italic", + "subfamily_name": "Italic", + "weight": 300, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNerdFontMono-Medium.ttf||2469988:1745519248.0": { + "family_name": "JetBrainsMono NFM Medium", + "font-family": "JetBrainsMono NFM Medium", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "500", + "fs_type": 0, + "full_name": "JetBrainsMono NFM Medium", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNerdFontMono-Medium.ttf", + "preferred_family_name": "JetBrainsMono Nerd Font Mono", + "preferred_subfamily_name": "Medium", + "subfamily_name": "Regular", + "weight": 500, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNerdFontMono-MediumItalic.ttf||2472180:1745519248.0": { + "family_name": "JetBrainsMono NFM Medium", + "font-family": "JetBrainsMono NFM Medium", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "500", + "fs_type": 0, + "full_name": "JetBrainsMono NFM Medium Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNerdFontMono-MediumItalic.ttf", + "preferred_family_name": "JetBrainsMono Nerd Font Mono", + "preferred_subfamily_name": "Medium Italic", + "subfamily_name": "Italic", + "weight": 500, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNerdFontMono-Regular.ttf||2470116:1745519248.0": { + "family_name": "JetBrainsMono NFM", + "font-family": "JetBrainsMono NFM", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "JetBrainsMono NFM Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNerdFontMono-Regular.ttf", + "preferred_family_name": "JetBrainsMono Nerd Font Mono", + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNerdFontMono-SemiBold.ttf||2473228:1745519248.0": { + "family_name": "JetBrainsMono NFM SemiBold", + "font-family": "JetBrainsMono NFM SemiBold", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "600", + "fs_type": 0, + "full_name": "JetBrainsMono NFM SemiBold", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNerdFontMono-SemiBold.ttf", + "preferred_family_name": "JetBrainsMono Nerd Font Mono", + "preferred_subfamily_name": "SemiBold", + "subfamily_name": "Regular", + "weight": 600, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNerdFontMono-SemiBoldItalic.ttf||2475252:1745519248.0": { + "family_name": "JetBrainsMono NFM SemiBold", + "font-family": "JetBrainsMono NFM SemiBold", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "600", + "fs_type": 0, + "full_name": "JetBrainsMono NFM SemiBold Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNerdFontMono-SemiBoldItalic.ttf", + "preferred_family_name": "JetBrainsMono Nerd Font Mono", + "preferred_subfamily_name": "SemiBold Italic", + "subfamily_name": "Italic", + "weight": 600, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNerdFontMono-Thin.ttf||2466256:1745519248.0": { + "family_name": "JetBrainsMono NFM Thin", + "font-family": "JetBrainsMono NFM Thin", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "100", + "fs_type": 0, + "full_name": "JetBrainsMono NFM Thin", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNerdFontMono-Thin.ttf", + "preferred_family_name": "JetBrainsMono Nerd Font Mono", + "preferred_subfamily_name": "Thin", + "subfamily_name": "Regular", + "weight": 100, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNerdFontMono-ThinItalic.ttf||2468384:1745519248.0": { + "family_name": "JetBrainsMono NFM Thin", + "font-family": "JetBrainsMono NFM Thin", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "100", + "fs_type": 0, + "full_name": "JetBrainsMono NFM Thin Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNerdFontMono-ThinItalic.ttf", + "preferred_family_name": "JetBrainsMono Nerd Font Mono", + "preferred_subfamily_name": "Thin Italic", + "subfamily_name": "Italic", + "weight": 100, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNerdFontPropo-Bold.ttf||2472732:1745519248.0": { + "family_name": "JetBrainsMono NFP", + "font-family": "JetBrainsMono NFP", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "JetBrainsMono NFP Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNerdFontPropo-Bold.ttf", + "preferred_family_name": "JetBrainsMono Nerd Font Propo", + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNerdFontPropo-BoldItalic.ttf||2473956:1745519248.0": { + "family_name": "JetBrainsMono NFP", + "font-family": "JetBrainsMono NFP", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 0, + "full_name": "JetBrainsMono NFP Bold Italic", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNerdFontPropo-BoldItalic.ttf", + "preferred_family_name": "JetBrainsMono Nerd Font Propo", + "preferred_subfamily_name": null, + "subfamily_name": "Bold Italic", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNerdFontPropo-ExtraBold.ttf||2474496:1745519248.0": { + "family_name": "JetBrainsMono NFP ExtraBold", + "font-family": "JetBrainsMono NFP ExtraBold", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "800", + "fs_type": 0, + "full_name": "JetBrainsMono NFP ExtraBold", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNerdFontPropo-ExtraBold.ttf", + "preferred_family_name": "JetBrainsMono Nerd Font Propo", + "preferred_subfamily_name": "ExtraBold", + "subfamily_name": "Regular", + "weight": 800, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNerdFontPropo-ExtraBoldItalic.ttf||2475976:1745519248.0": { + "family_name": "JetBrainsMono NFP ExtraBold", + "font-family": "JetBrainsMono NFP ExtraBold", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "800", + "fs_type": 0, + "full_name": "JetBrainsMono NFP ExtraBold Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNerdFontPropo-ExtraBoldItalic.ttf", + "preferred_family_name": "JetBrainsMono Nerd Font Propo", + "preferred_subfamily_name": "ExtraBold Italic", + "subfamily_name": "Italic", + "weight": 800, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNerdFontPropo-ExtraLight.ttf||2469100:1745519248.0": { + "family_name": "JetBrainsMono NFP ExtraLight", + "font-family": "JetBrainsMono NFP ExtraLight", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "200", + "fs_type": 0, + "full_name": "JetBrainsMono NFP ExtraLight", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNerdFontPropo-ExtraLight.ttf", + "preferred_family_name": "JetBrainsMono Nerd Font Propo", + "preferred_subfamily_name": "ExtraLight", + "subfamily_name": "Regular", + "weight": 200, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNerdFontPropo-ExtraLightItalic.ttf||2468392:1745519248.0": { + "family_name": "JetBrainsMono NFP ExtraLight", + "font-family": "JetBrainsMono NFP ExtraLight", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "200", + "fs_type": 0, + "full_name": "JetBrainsMono NFP ExtraLight Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNerdFontPropo-ExtraLightItalic.ttf", + "preferred_family_name": "JetBrainsMono Nerd Font Propo", + "preferred_subfamily_name": "ExtraLight Italic", + "subfamily_name": "Italic", + "weight": 200, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNerdFontPropo-Italic.ttf||2471048:1745519248.0": { + "family_name": "JetBrainsMono NFP", + "font-family": "JetBrainsMono NFP", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 0, + "full_name": "JetBrainsMono NFP Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNerdFontPropo-Italic.ttf", + "preferred_family_name": "JetBrainsMono Nerd Font Propo", + "preferred_subfamily_name": null, + "subfamily_name": "Italic", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNerdFontPropo-Light.ttf||2471388:1745519248.0": { + "family_name": "JetBrainsMono NFP Light", + "font-family": "JetBrainsMono NFP Light", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "300", + "fs_type": 0, + "full_name": "JetBrainsMono NFP Light", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNerdFontPropo-Light.ttf", + "preferred_family_name": "JetBrainsMono Nerd Font Propo", + "preferred_subfamily_name": "Light", + "subfamily_name": "Regular", + "weight": 300, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNerdFontPropo-LightItalic.ttf||2471276:1745519248.0": { + "family_name": "JetBrainsMono NFP Light", + "font-family": "JetBrainsMono NFP Light", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "300", + "fs_type": 0, + "full_name": "JetBrainsMono NFP Light Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNerdFontPropo-LightItalic.ttf", + "preferred_family_name": "JetBrainsMono Nerd Font Propo", + "preferred_subfamily_name": "Light Italic", + "subfamily_name": "Italic", + "weight": 300, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNerdFontPropo-Medium.ttf||2468836:1745519248.0": { + "family_name": "JetBrainsMono NFP Medium", + "font-family": "JetBrainsMono NFP Medium", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "500", + "fs_type": 0, + "full_name": "JetBrainsMono NFP Medium", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNerdFontPropo-Medium.ttf", + "preferred_family_name": "JetBrainsMono Nerd Font Propo", + "preferred_subfamily_name": "Medium", + "subfamily_name": "Regular", + "weight": 500, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNerdFontPropo-MediumItalic.ttf||2470996:1745519248.0": { + "family_name": "JetBrainsMono NFP Medium", + "font-family": "JetBrainsMono NFP Medium", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "500", + "fs_type": 0, + "full_name": "JetBrainsMono NFP Medium Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNerdFontPropo-MediumItalic.ttf", + "preferred_family_name": "JetBrainsMono Nerd Font Propo", + "preferred_subfamily_name": "Medium Italic", + "subfamily_name": "Italic", + "weight": 500, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNerdFontPropo-Regular.ttf||2468964:1745519248.0": { + "family_name": "JetBrainsMono NFP", + "font-family": "JetBrainsMono NFP", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "JetBrainsMono NFP Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNerdFontPropo-Regular.ttf", + "preferred_family_name": "JetBrainsMono Nerd Font Propo", + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNerdFontPropo-SemiBold.ttf||2472072:1745519248.0": { + "family_name": "JetBrainsMono NFP SemiBold", + "font-family": "JetBrainsMono NFP SemiBold", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "600", + "fs_type": 0, + "full_name": "JetBrainsMono NFP SemiBold", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNerdFontPropo-SemiBold.ttf", + "preferred_family_name": "JetBrainsMono Nerd Font Propo", + "preferred_subfamily_name": "SemiBold", + "subfamily_name": "Regular", + "weight": 600, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNerdFontPropo-SemiBoldItalic.ttf||2474064:1745519248.0": { + "family_name": "JetBrainsMono NFP SemiBold", + "font-family": "JetBrainsMono NFP SemiBold", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "600", + "fs_type": 0, + "full_name": "JetBrainsMono NFP SemiBold Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNerdFontPropo-SemiBoldItalic.ttf", + "preferred_family_name": "JetBrainsMono Nerd Font Propo", + "preferred_subfamily_name": "SemiBold Italic", + "subfamily_name": "Italic", + "weight": 600, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNerdFontPropo-Thin.ttf||2465100:1745519248.0": { + "family_name": "JetBrainsMono NFP Thin", + "font-family": "JetBrainsMono NFP Thin", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "100", + "fs_type": 0, + "full_name": "JetBrainsMono NFP Thin", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNerdFontPropo-Thin.ttf", + "preferred_family_name": "JetBrainsMono Nerd Font Propo", + "preferred_subfamily_name": "Thin", + "subfamily_name": "Regular", + "weight": 100, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/JetBrainsMonoNerdFontPropo-ThinItalic.ttf||2467196:1745519248.0": { + "family_name": "JetBrainsMono NFP Thin", + "font-family": "JetBrainsMono NFP Thin", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "100", + "fs_type": 0, + "full_name": "JetBrainsMono NFP Thin Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 0, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/JetBrainsMonoNerdFontPropo-ThinItalic.ttf", + "preferred_family_name": "JetBrainsMono Nerd Font Propo", + "preferred_subfamily_name": "Thin Italic", + "subfamily_name": "Italic", + "weight": 100, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/Lato-Black.ttf||614544:1720269962.0": { + "family_name": "Lato Black", + "font-family": "Lato Black", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "900", + "fs_type": 0, + "full_name": "Lato Black", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 15, + 5, + 2, + 2, + 2, + 4, + 3, + 2, + 3 + ], + "path": "/usr/share/fonts/TTF/Lato-Black.ttf", + "preferred_family_name": "Lato", + "preferred_subfamily_name": "Black", + "subfamily_name": "Regular", + "weight": 900, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/Lato-BlackItalic.ttf||672480:1720269962.0": { + "family_name": "Lato Black", + "font-family": "Lato Black", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "900", + "fs_type": 0, + "full_name": "Lato Black Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 15, + 5, + 2, + 2, + 2, + 4, + 3, + 2, + 3 + ], + "path": "/usr/share/fonts/TTF/Lato-BlackItalic.ttf", + "preferred_family_name": "Lato", + "preferred_subfamily_name": "Black Italic", + "subfamily_name": "Italic", + "weight": 900, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/Lato-Bold.ttf||657188:1720269962.0": { + "family_name": "Lato", + "font-family": "Lato", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "Lato Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 15, + 5, + 2, + 2, + 2, + 4, + 3, + 2, + 3 + ], + "path": "/usr/share/fonts/TTF/Lato-Bold.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/Lato-BoldItalic.ttf||699008:1720269962.0": { + "family_name": "Lato", + "font-family": "Lato", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 0, + "full_name": "Lato Bold Italic", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 15, + 5, + 2, + 2, + 2, + 4, + 3, + 2, + 3 + ], + "path": "/usr/share/fonts/TTF/Lato-BoldItalic.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold Italic", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/Lato-Hairline.ttf||584784:1720269962.0": { + "family_name": "Lato Hairline", + "font-family": "Lato Hairline", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "250", + "fs_type": 0, + "full_name": "Lato Hairline", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 15, + 5, + 2, + 2, + 2, + 4, + 3, + 2, + 3 + ], + "path": "/usr/share/fonts/TTF/Lato-Hairline.ttf", + "preferred_family_name": "Lato", + "preferred_subfamily_name": "Hairline", + "subfamily_name": "Regular", + "weight": 250, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/Lato-HairlineItalic.ttf||609436:1720269962.0": { + "family_name": "Lato Hairline", + "font-family": "Lato Hairline", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "250", + "fs_type": 0, + "full_name": "Lato Hairline Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 15, + 5, + 2, + 2, + 2, + 4, + 3, + 2, + 3 + ], + "path": "/usr/share/fonts/TTF/Lato-HairlineItalic.ttf", + "preferred_family_name": "Lato", + "preferred_subfamily_name": "Hairline Italic", + "subfamily_name": "Italic", + "weight": 250, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/Lato-Heavy.ttf||665420:1720269962.0": { + "family_name": "Lato Heavy", + "font-family": "Lato Heavy", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "800", + "fs_type": 0, + "full_name": "Lato Heavy", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 15, + 5, + 2, + 2, + 2, + 4, + 3, + 2, + 3 + ], + "path": "/usr/share/fonts/TTF/Lato-Heavy.ttf", + "preferred_family_name": "Lato", + "preferred_subfamily_name": "Heavy", + "subfamily_name": "Regular", + "weight": 800, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/Lato-HeavyItalic.ttf||698924:1720269962.0": { + "family_name": "Lato Heavy", + "font-family": "Lato Heavy", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "800", + "fs_type": 0, + "full_name": "Lato Heavy Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 15, + 5, + 2, + 2, + 2, + 4, + 3, + 2, + 3 + ], + "path": "/usr/share/fonts/TTF/Lato-HeavyItalic.ttf", + "preferred_family_name": "Lato", + "preferred_subfamily_name": "Heavy Italic", + "subfamily_name": "Italic", + "weight": 800, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/Lato-Italic.ttf||723544:1720269962.0": { + "family_name": "Lato", + "font-family": "Lato", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Lato Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 15, + 5, + 2, + 2, + 2, + 4, + 3, + 2, + 3 + ], + "path": "/usr/share/fonts/TTF/Lato-Italic.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Italic", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/Lato-Light.ttf||644556:1720269962.0": { + "family_name": "Lato Light", + "font-family": "Lato Light", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "300", + "fs_type": 0, + "full_name": "Lato Light", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 15, + 5, + 2, + 2, + 2, + 4, + 3, + 2, + 3 + ], + "path": "/usr/share/fonts/TTF/Lato-Light.ttf", + "preferred_family_name": "Lato", + "preferred_subfamily_name": "Light", + "subfamily_name": "Regular", + "weight": 300, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/Lato-LightItalic.ttf||658212:1720269962.0": { + "family_name": "Lato Light", + "font-family": "Lato Light", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "300", + "fs_type": 0, + "full_name": "Lato Light Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 15, + 5, + 2, + 2, + 2, + 4, + 3, + 2, + 3 + ], + "path": "/usr/share/fonts/TTF/Lato-LightItalic.ttf", + "preferred_family_name": "Lato", + "preferred_subfamily_name": "Light Italic", + "subfamily_name": "Italic", + "weight": 300, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/Lato-Medium.ttf||637068:1720269962.0": { + "family_name": "Lato Medium", + "font-family": "Lato Medium", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "500", + "fs_type": 0, + "full_name": "Lato Medium", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 15, + 5, + 2, + 2, + 2, + 4, + 3, + 2, + 3 + ], + "path": "/usr/share/fonts/TTF/Lato-Medium.ttf", + "preferred_family_name": "Lato", + "preferred_subfamily_name": "Medium", + "subfamily_name": "Regular", + "weight": 500, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/Lato-MediumItalic.ttf||695588:1720269962.0": { + "family_name": "Lato Medium", + "font-family": "Lato Medium", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "500", + "fs_type": 0, + "full_name": "Lato Medium Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 15, + 5, + 2, + 2, + 2, + 4, + 3, + 2, + 3 + ], + "path": "/usr/share/fonts/TTF/Lato-MediumItalic.ttf", + "preferred_family_name": "Lato", + "preferred_subfamily_name": "Medium Italic", + "subfamily_name": "Italic", + "weight": 500, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/Lato-Regular.ttf||657212:1720269962.0": { + "family_name": "Lato", + "font-family": "Lato", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Lato Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 15, + 5, + 2, + 2, + 2, + 4, + 3, + 2, + 3 + ], + "path": "/usr/share/fonts/TTF/Lato-Regular.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/Lato-Semibold.ttf||669228:1720269962.0": { + "family_name": "Lato Semibold", + "font-family": "Lato Semibold", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "600", + "fs_type": 0, + "full_name": "Lato Semibold", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 15, + 5, + 2, + 2, + 2, + 4, + 3, + 2, + 3 + ], + "path": "/usr/share/fonts/TTF/Lato-Semibold.ttf", + "preferred_family_name": "Lato", + "preferred_subfamily_name": "Semibold", + "subfamily_name": "Regular", + "weight": 600, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/Lato-SemiboldItalic.ttf||698028:1720269962.0": { + "family_name": "Lato Semibold", + "font-family": "Lato Semibold", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "600", + "fs_type": 0, + "full_name": "Lato Semibold Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 15, + 5, + 2, + 2, + 2, + 4, + 3, + 2, + 3 + ], + "path": "/usr/share/fonts/TTF/Lato-SemiboldItalic.ttf", + "preferred_family_name": "Lato", + "preferred_subfamily_name": "Semibold Italic", + "subfamily_name": "Italic", + "weight": 600, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/Lato-Thin.ttf||627220:1720269962.0": { + "family_name": "Lato Thin", + "font-family": "Lato Thin", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "275", + "fs_type": 0, + "full_name": "Lato Thin", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 15, + 5, + 2, + 2, + 2, + 4, + 3, + 2, + 3 + ], + "path": "/usr/share/fonts/TTF/Lato-Thin.ttf", + "preferred_family_name": "Lato", + "preferred_subfamily_name": "Thin", + "subfamily_name": "Regular", + "weight": 275, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/Lato-ThinItalic.ttf||654216:1720269962.0": { + "family_name": "Lato Thin", + "font-family": "Lato Thin", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "275", + "fs_type": 0, + "full_name": "Lato Thin Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 15, + 5, + 2, + 2, + 2, + 4, + 3, + 2, + 3 + ], + "path": "/usr/share/fonts/TTF/Lato-ThinItalic.ttf", + "preferred_family_name": "Lato", + "preferred_subfamily_name": "Thin Italic", + "subfamily_name": "Italic", + "weight": 275, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/Lexend-Black.ttf||105484:1762977106.0": { + "family_name": "Lexend Black", + "font-family": "Lexend Black", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "900", + "fs_type": 0, + "full_name": "Lexend Black", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/Lexend-Black.ttf", + "preferred_family_name": "Lexend", + "preferred_subfamily_name": "Black", + "subfamily_name": "Regular", + "weight": 900, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/Lexend-Bold.ttf||105564:1762977106.0": { + "family_name": "Lexend", + "font-family": "Lexend", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "Lexend Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/Lexend-Bold.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/Lexend-ExtraBold.ttf||105516:1762977106.0": { + "family_name": "Lexend ExtraBold", + "font-family": "Lexend ExtraBold", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "800", + "fs_type": 0, + "full_name": "Lexend ExtraBold", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/Lexend-ExtraBold.ttf", + "preferred_family_name": "Lexend", + "preferred_subfamily_name": "ExtraBold", + "subfamily_name": "Regular", + "weight": 800, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/Lexend-ExtraLight.ttf||100612:1762977106.0": { + "family_name": "Lexend ExtraLight", + "font-family": "Lexend ExtraLight", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "200", + "fs_type": 0, + "full_name": "Lexend ExtraLight", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/Lexend-ExtraLight.ttf", + "preferred_family_name": "Lexend", + "preferred_subfamily_name": "ExtraLight", + "subfamily_name": "Regular", + "weight": 200, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/Lexend-Light.ttf||100656:1762977106.0": { + "family_name": "Lexend Light", + "font-family": "Lexend Light", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "300", + "fs_type": 0, + "full_name": "Lexend Light", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/Lexend-Light.ttf", + "preferred_family_name": "Lexend", + "preferred_subfamily_name": "Light", + "subfamily_name": "Regular", + "weight": 300, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/Lexend-Medium.ttf||101904:1762977106.0": { + "family_name": "Lexend Medium", + "font-family": "Lexend Medium", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "500", + "fs_type": 0, + "full_name": "Lexend Medium", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/Lexend-Medium.ttf", + "preferred_family_name": "Lexend", + "preferred_subfamily_name": "Medium", + "subfamily_name": "Regular", + "weight": 500, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/Lexend-Regular.ttf||100264:1762977106.0": { + "family_name": "Lexend", + "font-family": "Lexend", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Lexend Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/Lexend-Regular.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/Lexend-SemiBold.ttf||102264:1762977106.0": { + "family_name": "Lexend SemiBold", + "font-family": "Lexend SemiBold", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "600", + "fs_type": 0, + "full_name": "Lexend SemiBold", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/Lexend-SemiBold.ttf", + "preferred_family_name": "Lexend", + "preferred_subfamily_name": "SemiBold", + "subfamily_name": "Regular", + "weight": 600, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/Lexend-Thin.ttf||97420:1762977106.0": { + "family_name": "Lexend Thin", + "font-family": "Lexend Thin", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "100", + "fs_type": 0, + "full_name": "Lexend Thin", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/Lexend-Thin.ttf", + "preferred_family_name": "Lexend", + "preferred_subfamily_name": "Thin", + "subfamily_name": "Regular", + "weight": 100, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/LexendDeca-Black.ttf||105528:1762977106.0": { + "family_name": "Lexend Deca Black", + "font-family": "Lexend Deca Black", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "900", + "fs_type": 0, + "full_name": "Lexend Deca Black", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/LexendDeca-Black.ttf", + "preferred_family_name": "Lexend Deca", + "preferred_subfamily_name": "Black", + "subfamily_name": "Regular", + "weight": 900, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/LexendDeca-Bold.ttf||105600:1762977106.0": { + "family_name": "Lexend Deca", + "font-family": "Lexend Deca", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "Lexend Deca Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/LexendDeca-Bold.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/LexendDeca-ExtraBold.ttf||105560:1762977106.0": { + "family_name": "Lexend Deca ExtraBold", + "font-family": "Lexend Deca ExtraBold", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "800", + "fs_type": 0, + "full_name": "Lexend Deca ExtraBold", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/LexendDeca-ExtraBold.ttf", + "preferred_family_name": "Lexend Deca", + "preferred_subfamily_name": "ExtraBold", + "subfamily_name": "Regular", + "weight": 800, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/LexendDeca-ExtraLight.ttf||100660:1762977106.0": { + "family_name": "Lexend Deca ExtraLight", + "font-family": "Lexend Deca ExtraLight", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "200", + "fs_type": 0, + "full_name": "Lexend Deca ExtraLight", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/LexendDeca-ExtraLight.ttf", + "preferred_family_name": "Lexend Deca", + "preferred_subfamily_name": "ExtraLight", + "subfamily_name": "Regular", + "weight": 200, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/LexendDeca-Light.ttf||100700:1762977106.0": { + "family_name": "Lexend Deca Light", + "font-family": "Lexend Deca Light", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "300", + "fs_type": 0, + "full_name": "Lexend Deca Light", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/LexendDeca-Light.ttf", + "preferred_family_name": "Lexend Deca", + "preferred_subfamily_name": "Light", + "subfamily_name": "Regular", + "weight": 300, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/LexendDeca-Medium.ttf||101952:1762977106.0": { + "family_name": "Lexend Deca Medium", + "font-family": "Lexend Deca Medium", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "500", + "fs_type": 0, + "full_name": "Lexend Deca Medium", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/LexendDeca-Medium.ttf", + "preferred_family_name": "Lexend Deca", + "preferred_subfamily_name": "Medium", + "subfamily_name": "Regular", + "weight": 500, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/LexendDeca-Regular.ttf||100300:1762977106.0": { + "family_name": "Lexend Deca", + "font-family": "Lexend Deca", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Lexend Deca Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/LexendDeca-Regular.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/LexendDeca-SemiBold.ttf||102312:1762977106.0": { + "family_name": "Lexend Deca SemiBold", + "font-family": "Lexend Deca SemiBold", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "600", + "fs_type": 0, + "full_name": "Lexend Deca SemiBold", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/LexendDeca-SemiBold.ttf", + "preferred_family_name": "Lexend Deca", + "preferred_subfamily_name": "SemiBold", + "subfamily_name": "Regular", + "weight": 600, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/LexendDeca-Thin.ttf||97468:1762977106.0": { + "family_name": "Lexend Deca Thin", + "font-family": "Lexend Deca Thin", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "100", + "fs_type": 0, + "full_name": "Lexend Deca Thin", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/LexendDeca-Thin.ttf", + "preferred_family_name": "Lexend Deca", + "preferred_subfamily_name": "Thin", + "subfamily_name": "Regular", + "weight": 100, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/LexendDeca[wght].ttf||174564:1762977106.0": { + "family_name": "Lexend Deca", + "font-family": "Lexend Deca", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Lexend Deca Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/LexendDeca[wght].ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/LexendExa-Black.ttf||105860:1762977106.0": { + "family_name": "Lexend Exa Black", + "font-family": "Lexend Exa Black", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "900", + "fs_type": 0, + "full_name": "Lexend Exa Black", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/LexendExa-Black.ttf", + "preferred_family_name": "Lexend Exa", + "preferred_subfamily_name": "Black", + "subfamily_name": "Regular", + "weight": 900, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/LexendExa-Bold.ttf||106728:1762977106.0": { + "family_name": "Lexend Exa", + "font-family": "Lexend Exa", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "Lexend Exa Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/LexendExa-Bold.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/LexendExa-ExtraBold.ttf||106552:1762977106.0": { + "family_name": "Lexend Exa ExtraBold", + "font-family": "Lexend Exa ExtraBold", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "800", + "fs_type": 0, + "full_name": "Lexend Exa ExtraBold", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/LexendExa-ExtraBold.ttf", + "preferred_family_name": "Lexend Exa", + "preferred_subfamily_name": "ExtraBold", + "subfamily_name": "Regular", + "weight": 800, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/LexendExa-ExtraLight.ttf||101408:1762977106.0": { + "family_name": "Lexend Exa ExtraLight", + "font-family": "Lexend Exa ExtraLight", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "200", + "fs_type": 0, + "full_name": "Lexend Exa ExtraLight", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/LexendExa-ExtraLight.ttf", + "preferred_family_name": "Lexend Exa", + "preferred_subfamily_name": "ExtraLight", + "subfamily_name": "Regular", + "weight": 200, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/LexendExa-Light.ttf||101640:1762977106.0": { + "family_name": "Lexend Exa Light", + "font-family": "Lexend Exa Light", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "300", + "fs_type": 0, + "full_name": "Lexend Exa Light", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/LexendExa-Light.ttf", + "preferred_family_name": "Lexend Exa", + "preferred_subfamily_name": "Light", + "subfamily_name": "Regular", + "weight": 300, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/LexendExa-Medium.ttf||103160:1762977106.0": { + "family_name": "Lexend Exa Medium", + "font-family": "Lexend Exa Medium", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "500", + "fs_type": 0, + "full_name": "Lexend Exa Medium", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/LexendExa-Medium.ttf", + "preferred_family_name": "Lexend Exa", + "preferred_subfamily_name": "Medium", + "subfamily_name": "Regular", + "weight": 500, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/LexendExa-Regular.ttf||101208:1762977106.0": { + "family_name": "Lexend Exa", + "font-family": "Lexend Exa", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Lexend Exa Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/LexendExa-Regular.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/LexendExa-SemiBold.ttf||102852:1762977106.0": { + "family_name": "Lexend Exa SemiBold", + "font-family": "Lexend Exa SemiBold", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "600", + "fs_type": 0, + "full_name": "Lexend Exa SemiBold", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/LexendExa-SemiBold.ttf", + "preferred_family_name": "Lexend Exa", + "preferred_subfamily_name": "SemiBold", + "subfamily_name": "Regular", + "weight": 600, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/LexendExa-Thin.ttf||98224:1762977106.0": { + "family_name": "Lexend Exa Thin", + "font-family": "Lexend Exa Thin", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "100", + "fs_type": 0, + "full_name": "Lexend Exa Thin", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/LexendExa-Thin.ttf", + "preferred_family_name": "Lexend Exa", + "preferred_subfamily_name": "Thin", + "subfamily_name": "Regular", + "weight": 100, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/LexendExa[wght].ttf||188436:1762977106.0": { + "family_name": "Lexend Exa", + "font-family": "Lexend Exa", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Lexend Exa Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/LexendExa[wght].ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/LexendGiga-Black.ttf||106152:1762977106.0": { + "family_name": "Lexend Giga Black", + "font-family": "Lexend Giga Black", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "900", + "fs_type": 0, + "full_name": "Lexend Giga Black", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/LexendGiga-Black.ttf", + "preferred_family_name": "Lexend Giga", + "preferred_subfamily_name": "Black", + "subfamily_name": "Regular", + "weight": 900, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/LexendGiga-Bold.ttf||107492:1762977106.0": { + "family_name": "Lexend Giga", + "font-family": "Lexend Giga", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "Lexend Giga Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/LexendGiga-Bold.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/LexendGiga-ExtraBold.ttf||106868:1762977106.0": { + "family_name": "Lexend Giga ExtraBold", + "font-family": "Lexend Giga ExtraBold", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "800", + "fs_type": 0, + "full_name": "Lexend Giga ExtraBold", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/LexendGiga-ExtraBold.ttf", + "preferred_family_name": "Lexend Giga", + "preferred_subfamily_name": "ExtraBold", + "subfamily_name": "Regular", + "weight": 800, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/LexendGiga-ExtraLight.ttf||101384:1762977106.0": { + "family_name": "Lexend Giga ExtraLight", + "font-family": "Lexend Giga ExtraLight", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "200", + "fs_type": 0, + "full_name": "Lexend Giga ExtraLight", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/LexendGiga-ExtraLight.ttf", + "preferred_family_name": "Lexend Giga", + "preferred_subfamily_name": "ExtraLight", + "subfamily_name": "Regular", + "weight": 200, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/LexendGiga-Light.ttf||102132:1762977106.0": { + "family_name": "Lexend Giga Light", + "font-family": "Lexend Giga Light", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "300", + "fs_type": 0, + "full_name": "Lexend Giga Light", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/LexendGiga-Light.ttf", + "preferred_family_name": "Lexend Giga", + "preferred_subfamily_name": "Light", + "subfamily_name": "Regular", + "weight": 300, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/LexendGiga-Medium.ttf||103652:1762977106.0": { + "family_name": "Lexend Giga Medium", + "font-family": "Lexend Giga Medium", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "500", + "fs_type": 0, + "full_name": "Lexend Giga Medium", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/LexendGiga-Medium.ttf", + "preferred_family_name": "Lexend Giga", + "preferred_subfamily_name": "Medium", + "subfamily_name": "Regular", + "weight": 500, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/LexendGiga-Regular.ttf||101324:1762977106.0": { + "family_name": "Lexend Giga", + "font-family": "Lexend Giga", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Lexend Giga Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/LexendGiga-Regular.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/LexendGiga-SemiBold.ttf||103968:1762977106.0": { + "family_name": "Lexend Giga SemiBold", + "font-family": "Lexend Giga SemiBold", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "600", + "fs_type": 0, + "full_name": "Lexend Giga SemiBold", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/LexendGiga-SemiBold.ttf", + "preferred_family_name": "Lexend Giga", + "preferred_subfamily_name": "SemiBold", + "subfamily_name": "Regular", + "weight": 600, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/LexendGiga-Thin.ttf||98272:1762977106.0": { + "family_name": "Lexend Giga Thin", + "font-family": "Lexend Giga Thin", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "100", + "fs_type": 0, + "full_name": "Lexend Giga Thin", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/LexendGiga-Thin.ttf", + "preferred_family_name": "Lexend Giga", + "preferred_subfamily_name": "Thin", + "subfamily_name": "Regular", + "weight": 100, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/LexendGiga[wght].ttf||190576:1762977106.0": { + "family_name": "Lexend Giga", + "font-family": "Lexend Giga", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Lexend Giga Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/LexendGiga[wght].ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/LexendMega-Black.ttf||106232:1762977106.0": { + "family_name": "Lexend Mega Black", + "font-family": "Lexend Mega Black", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "900", + "fs_type": 0, + "full_name": "Lexend Mega Black", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/LexendMega-Black.ttf", + "preferred_family_name": "Lexend Mega", + "preferred_subfamily_name": "Black", + "subfamily_name": "Regular", + "weight": 900, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/LexendMega-Bold.ttf||107376:1762977106.0": { + "family_name": "Lexend Mega", + "font-family": "Lexend Mega", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "Lexend Mega Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/LexendMega-Bold.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/LexendMega-ExtraBold.ttf||107024:1762977106.0": { + "family_name": "Lexend Mega ExtraBold", + "font-family": "Lexend Mega ExtraBold", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "800", + "fs_type": 0, + "full_name": "Lexend Mega ExtraBold", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/LexendMega-ExtraBold.ttf", + "preferred_family_name": "Lexend Mega", + "preferred_subfamily_name": "ExtraBold", + "subfamily_name": "Regular", + "weight": 800, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/LexendMega-ExtraLight.ttf||101480:1762977106.0": { + "family_name": "Lexend Mega ExtraLight", + "font-family": "Lexend Mega ExtraLight", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "200", + "fs_type": 0, + "full_name": "Lexend Mega ExtraLight", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/LexendMega-ExtraLight.ttf", + "preferred_family_name": "Lexend Mega", + "preferred_subfamily_name": "ExtraLight", + "subfamily_name": "Regular", + "weight": 200, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/LexendMega-Light.ttf||102224:1762977106.0": { + "family_name": "Lexend Mega Light", + "font-family": "Lexend Mega Light", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "300", + "fs_type": 0, + "full_name": "Lexend Mega Light", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/LexendMega-Light.ttf", + "preferred_family_name": "Lexend Mega", + "preferred_subfamily_name": "Light", + "subfamily_name": "Regular", + "weight": 300, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/LexendMega-Medium.ttf||103832:1762977106.0": { + "family_name": "Lexend Mega Medium", + "font-family": "Lexend Mega Medium", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "500", + "fs_type": 0, + "full_name": "Lexend Mega Medium", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/LexendMega-Medium.ttf", + "preferred_family_name": "Lexend Mega", + "preferred_subfamily_name": "Medium", + "subfamily_name": "Regular", + "weight": 500, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/LexendMega-Regular.ttf||101464:1762977106.0": { + "family_name": "Lexend Mega", + "font-family": "Lexend Mega", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Lexend Mega Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/LexendMega-Regular.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/LexendMega-SemiBold.ttf||103916:1762977106.0": { + "family_name": "Lexend Mega SemiBold", + "font-family": "Lexend Mega SemiBold", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "600", + "fs_type": 0, + "full_name": "Lexend Mega SemiBold", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/LexendMega-SemiBold.ttf", + "preferred_family_name": "Lexend Mega", + "preferred_subfamily_name": "SemiBold", + "subfamily_name": "Regular", + "weight": 600, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/LexendMega-Thin.ttf||98416:1762977106.0": { + "family_name": "Lexend Mega Thin", + "font-family": "Lexend Mega Thin", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "100", + "fs_type": 0, + "full_name": "Lexend Mega Thin", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/LexendMega-Thin.ttf", + "preferred_family_name": "Lexend Mega", + "preferred_subfamily_name": "Thin", + "subfamily_name": "Regular", + "weight": 100, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/LexendMega[wght].ttf||190592:1762977106.0": { + "family_name": "Lexend Mega", + "font-family": "Lexend Mega", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Lexend Mega Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/LexendMega[wght].ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/LexendPeta-Black.ttf||106436:1762977106.0": { + "family_name": "Lexend Peta Black", + "font-family": "Lexend Peta Black", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "900", + "fs_type": 0, + "full_name": "Lexend Peta Black", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/LexendPeta-Black.ttf", + "preferred_family_name": "Lexend Peta", + "preferred_subfamily_name": "Black", + "subfamily_name": "Regular", + "weight": 900, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/LexendPeta-Bold.ttf||107428:1762977106.0": { + "family_name": "Lexend Peta", + "font-family": "Lexend Peta", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "Lexend Peta Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/LexendPeta-Bold.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/LexendPeta-ExtraBold.ttf||107144:1762977106.0": { + "family_name": "Lexend Peta ExtraBold", + "font-family": "Lexend Peta ExtraBold", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "800", + "fs_type": 0, + "full_name": "Lexend Peta ExtraBold", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/LexendPeta-ExtraBold.ttf", + "preferred_family_name": "Lexend Peta", + "preferred_subfamily_name": "ExtraBold", + "subfamily_name": "Regular", + "weight": 800, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/LexendPeta-ExtraLight.ttf||101660:1762977106.0": { + "family_name": "Lexend Peta ExtraLight", + "font-family": "Lexend Peta ExtraLight", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "200", + "fs_type": 0, + "full_name": "Lexend Peta ExtraLight", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/LexendPeta-ExtraLight.ttf", + "preferred_family_name": "Lexend Peta", + "preferred_subfamily_name": "ExtraLight", + "subfamily_name": "Regular", + "weight": 200, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/LexendPeta-Light.ttf||102324:1762977106.0": { + "family_name": "Lexend Peta Light", + "font-family": "Lexend Peta Light", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "300", + "fs_type": 0, + "full_name": "Lexend Peta Light", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/LexendPeta-Light.ttf", + "preferred_family_name": "Lexend Peta", + "preferred_subfamily_name": "Light", + "subfamily_name": "Regular", + "weight": 300, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/LexendPeta-Medium.ttf||103800:1762977106.0": { + "family_name": "Lexend Peta Medium", + "font-family": "Lexend Peta Medium", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "500", + "fs_type": 0, + "full_name": "Lexend Peta Medium", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/LexendPeta-Medium.ttf", + "preferred_family_name": "Lexend Peta", + "preferred_subfamily_name": "Medium", + "subfamily_name": "Regular", + "weight": 500, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/LexendPeta-Regular.ttf||101436:1762977106.0": { + "family_name": "Lexend Peta", + "font-family": "Lexend Peta", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Lexend Peta Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/LexendPeta-Regular.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/LexendPeta-SemiBold.ttf||103844:1762977106.0": { + "family_name": "Lexend Peta SemiBold", + "font-family": "Lexend Peta SemiBold", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "600", + "fs_type": 0, + "full_name": "Lexend Peta SemiBold", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/LexendPeta-SemiBold.ttf", + "preferred_family_name": "Lexend Peta", + "preferred_subfamily_name": "SemiBold", + "subfamily_name": "Regular", + "weight": 600, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/LexendPeta-Thin.ttf||98576:1762977106.0": { + "family_name": "Lexend Peta Thin", + "font-family": "Lexend Peta Thin", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "100", + "fs_type": 0, + "full_name": "Lexend Peta Thin", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/LexendPeta-Thin.ttf", + "preferred_family_name": "Lexend Peta", + "preferred_subfamily_name": "Thin", + "subfamily_name": "Regular", + "weight": 100, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/LexendPeta[wght].ttf||190708:1762977106.0": { + "family_name": "Lexend Peta", + "font-family": "Lexend Peta", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Lexend Peta Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/LexendPeta[wght].ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/LexendTera-Black.ttf||106516:1762977106.0": { + "family_name": "Lexend Tera Black", + "font-family": "Lexend Tera Black", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "900", + "fs_type": 0, + "full_name": "Lexend Tera Black", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/LexendTera-Black.ttf", + "preferred_family_name": "Lexend Tera", + "preferred_subfamily_name": "Black", + "subfamily_name": "Regular", + "weight": 900, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/LexendTera-Bold.ttf||107324:1762977106.0": { + "family_name": "Lexend Tera", + "font-family": "Lexend Tera", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "Lexend Tera Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/LexendTera-Bold.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/LexendTera-ExtraBold.ttf||107188:1762977106.0": { + "family_name": "Lexend Tera ExtraBold", + "font-family": "Lexend Tera ExtraBold", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "800", + "fs_type": 0, + "full_name": "Lexend Tera ExtraBold", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/LexendTera-ExtraBold.ttf", + "preferred_family_name": "Lexend Tera", + "preferred_subfamily_name": "ExtraBold", + "subfamily_name": "Regular", + "weight": 800, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/LexendTera-ExtraLight.ttf||101600:1762977106.0": { + "family_name": "Lexend Tera ExtraLight", + "font-family": "Lexend Tera ExtraLight", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "200", + "fs_type": 0, + "full_name": "Lexend Tera ExtraLight", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/LexendTera-ExtraLight.ttf", + "preferred_family_name": "Lexend Tera", + "preferred_subfamily_name": "ExtraLight", + "subfamily_name": "Regular", + "weight": 200, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/LexendTera-Light.ttf||102320:1762977106.0": { + "family_name": "Lexend Tera Light", + "font-family": "Lexend Tera Light", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "300", + "fs_type": 0, + "full_name": "Lexend Tera Light", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/LexendTera-Light.ttf", + "preferred_family_name": "Lexend Tera", + "preferred_subfamily_name": "Light", + "subfamily_name": "Regular", + "weight": 300, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/LexendTera-Medium.ttf||104020:1762977106.0": { + "family_name": "Lexend Tera Medium", + "font-family": "Lexend Tera Medium", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "500", + "fs_type": 0, + "full_name": "Lexend Tera Medium", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/LexendTera-Medium.ttf", + "preferred_family_name": "Lexend Tera", + "preferred_subfamily_name": "Medium", + "subfamily_name": "Regular", + "weight": 500, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/LexendTera-Regular.ttf||101472:1762977106.0": { + "family_name": "Lexend Tera", + "font-family": "Lexend Tera", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Lexend Tera Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/LexendTera-Regular.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/LexendTera-SemiBold.ttf||103904:1762977106.0": { + "family_name": "Lexend Tera SemiBold", + "font-family": "Lexend Tera SemiBold", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "600", + "fs_type": 0, + "full_name": "Lexend Tera SemiBold", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/LexendTera-SemiBold.ttf", + "preferred_family_name": "Lexend Tera", + "preferred_subfamily_name": "SemiBold", + "subfamily_name": "Regular", + "weight": 600, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/LexendTera-Thin.ttf||98496:1762977106.0": { + "family_name": "Lexend Tera Thin", + "font-family": "Lexend Tera Thin", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "100", + "fs_type": 0, + "full_name": "Lexend Tera Thin", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/LexendTera-Thin.ttf", + "preferred_family_name": "Lexend Tera", + "preferred_subfamily_name": "Thin", + "subfamily_name": "Regular", + "weight": 100, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/LexendTera[wght].ttf||191036:1762977106.0": { + "family_name": "Lexend Tera", + "font-family": "Lexend Tera", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Lexend Tera Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/LexendTera[wght].ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/LexendZetta-Black.ttf||107560:1762977106.0": { + "family_name": "Lexend Zetta Black", + "font-family": "Lexend Zetta Black", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "900", + "fs_type": 0, + "full_name": "Lexend Zetta Black", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/LexendZetta-Black.ttf", + "preferred_family_name": "Lexend Zetta", + "preferred_subfamily_name": "Black", + "subfamily_name": "Regular", + "weight": 900, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/LexendZetta-Bold.ttf||107952:1762977106.0": { + "family_name": "Lexend Zetta", + "font-family": "Lexend Zetta", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "Lexend Zetta Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/LexendZetta-Bold.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/LexendZetta-ExtraBold.ttf||107344:1762977106.0": { + "family_name": "Lexend Zetta ExtraBold", + "font-family": "Lexend Zetta ExtraBold", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "800", + "fs_type": 0, + "full_name": "Lexend Zetta ExtraBold", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/LexendZetta-ExtraBold.ttf", + "preferred_family_name": "Lexend Zetta", + "preferred_subfamily_name": "ExtraBold", + "subfamily_name": "Regular", + "weight": 800, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/LexendZetta-ExtraLight.ttf||101704:1762977106.0": { + "family_name": "Lexend Zetta ExtraLight", + "font-family": "Lexend Zetta ExtraLight", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "200", + "fs_type": 0, + "full_name": "Lexend Zetta ExtraLight", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/LexendZetta-ExtraLight.ttf", + "preferred_family_name": "Lexend Zetta", + "preferred_subfamily_name": "ExtraLight", + "subfamily_name": "Regular", + "weight": 200, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/LexendZetta-Light.ttf||102120:1762977106.0": { + "family_name": "Lexend Zetta Light", + "font-family": "Lexend Zetta Light", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "300", + "fs_type": 0, + "full_name": "Lexend Zetta Light", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/LexendZetta-Light.ttf", + "preferred_family_name": "Lexend Zetta", + "preferred_subfamily_name": "Light", + "subfamily_name": "Regular", + "weight": 300, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/LexendZetta-Medium.ttf||104036:1762977106.0": { + "family_name": "Lexend Zetta Medium", + "font-family": "Lexend Zetta Medium", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "500", + "fs_type": 0, + "full_name": "Lexend Zetta Medium", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/LexendZetta-Medium.ttf", + "preferred_family_name": "Lexend Zetta", + "preferred_subfamily_name": "Medium", + "subfamily_name": "Regular", + "weight": 500, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/LexendZetta-Regular.ttf||102040:1762977106.0": { + "family_name": "Lexend Zetta", + "font-family": "Lexend Zetta", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Lexend Zetta Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/LexendZetta-Regular.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/LexendZetta-SemiBold.ttf||104448:1762977106.0": { + "family_name": "Lexend Zetta SemiBold", + "font-family": "Lexend Zetta SemiBold", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "600", + "fs_type": 0, + "full_name": "Lexend Zetta SemiBold", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/LexendZetta-SemiBold.ttf", + "preferred_family_name": "Lexend Zetta", + "preferred_subfamily_name": "SemiBold", + "subfamily_name": "Regular", + "weight": 600, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/LexendZetta-Thin.ttf||98616:1762977106.0": { + "family_name": "Lexend Zetta Thin", + "font-family": "Lexend Zetta Thin", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "100", + "fs_type": 0, + "full_name": "Lexend Zetta Thin", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/LexendZetta-Thin.ttf", + "preferred_family_name": "Lexend Zetta", + "preferred_subfamily_name": "Thin", + "subfamily_name": "Regular", + "weight": 100, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/LexendZetta[wght].ttf||191192:1762977106.0": { + "family_name": "Lexend Zetta", + "font-family": "Lexend Zetta", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Lexend Zetta Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/LexendZetta[wght].ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/Lexend[HEXP,wght].ttf||240288:1762977106.0": { + "family_name": "Lexend", + "font-family": "Lexend", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Lexend Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/Lexend[HEXP,wght].ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/MesloLGLDZNerdFont-Bold.ttf||2870796:1745519248.0": { + "family_name": "MesloLGLDZ Nerd Font", + "font-family": "MesloLGLDZ Nerd Font", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "MesloLGLDZ Nerd Font Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 7, + 9, + 3, + 6, + 4, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/MesloLGLDZNerdFont-Bold.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/MesloLGLDZNerdFont-BoldItalic.ttf||2828752:1745519248.0": { + "family_name": "MesloLGLDZ Nerd Font", + "font-family": "MesloLGLDZ Nerd Font", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 0, + "full_name": "MesloLGLDZ Nerd Font Bold Italic", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 7, + 9, + 3, + 3, + 4, + 11, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/MesloLGLDZNerdFont-BoldItalic.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold Italic", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/MesloLGLDZNerdFont-Italic.ttf||2812340:1745519248.0": { + "family_name": "MesloLGLDZ Nerd Font", + "font-family": "MesloLGLDZ Nerd Font", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 0, + "full_name": "MesloLGLDZ Nerd Font Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 6, + 9, + 3, + 3, + 4, + 11, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/MesloLGLDZNerdFont-Italic.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Italic", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/MesloLGLDZNerdFont-Regular.ttf||2853588:1745519248.0": { + "family_name": "MesloLGLDZ Nerd Font", + "font-family": "MesloLGLDZ Nerd Font", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "MesloLGLDZ Nerd Font Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 6, + 9, + 3, + 8, + 4, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/MesloLGLDZNerdFont-Regular.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/MesloLGLDZNerdFontMono-Bold.ttf||2849396:1745519248.0": { + "family_name": "MesloLGLDZ Nerd Font Mono", + "font-family": "MesloLGLDZ Nerd Font Mono", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "MesloLGLDZ Nerd Font Mono Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 7, + 9, + 3, + 6, + 4, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/MesloLGLDZNerdFontMono-Bold.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/MesloLGLDZNerdFontMono-BoldItalic.ttf||2807872:1745519248.0": { + "family_name": "MesloLGLDZ Nerd Font Mono", + "font-family": "MesloLGLDZ Nerd Font Mono", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 0, + "full_name": "MesloLGLDZ Nerd Font Mono Bold Italic", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 7, + 9, + 3, + 3, + 4, + 11, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/MesloLGLDZNerdFontMono-BoldItalic.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold Italic", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/MesloLGLDZNerdFontMono-Italic.ttf||2791460:1745519248.0": { + "family_name": "MesloLGLDZ Nerd Font Mono", + "font-family": "MesloLGLDZ Nerd Font Mono", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 0, + "full_name": "MesloLGLDZ Nerd Font Mono Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 6, + 9, + 3, + 3, + 4, + 11, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/MesloLGLDZNerdFontMono-Italic.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Italic", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/MesloLGLDZNerdFontMono-Regular.ttf||2832192:1745519248.0": { + "family_name": "MesloLGLDZ Nerd Font Mono", + "font-family": "MesloLGLDZ Nerd Font Mono", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "MesloLGLDZ Nerd Font Mono Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 6, + 9, + 3, + 8, + 4, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/MesloLGLDZNerdFontMono-Regular.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/MesloLGLDZNerdFontPropo-Bold.ttf||2870644:1745519248.0": { + "family_name": "MesloLGLDZ Nerd Font Propo", + "font-family": "MesloLGLDZ Nerd Font Propo", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "MesloLGLDZ Nerd Font Propo Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 7, + 9, + 3, + 6, + 4, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/MesloLGLDZNerdFontPropo-Bold.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/MesloLGLDZNerdFontPropo-BoldItalic.ttf||2828596:1745519248.0": { + "family_name": "MesloLGLDZ Nerd Font Propo", + "font-family": "MesloLGLDZ Nerd Font Propo", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 0, + "full_name": "MesloLGLDZ Nerd Font Propo Bold Italic", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 7, + 9, + 3, + 3, + 4, + 11, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/MesloLGLDZNerdFontPropo-BoldItalic.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold Italic", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/MesloLGLDZNerdFontPropo-Italic.ttf||2812188:1745519248.0": { + "family_name": "MesloLGLDZ Nerd Font Propo", + "font-family": "MesloLGLDZ Nerd Font Propo", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 0, + "full_name": "MesloLGLDZ Nerd Font Propo Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 6, + 9, + 3, + 3, + 4, + 11, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/MesloLGLDZNerdFontPropo-Italic.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Italic", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/MesloLGLDZNerdFontPropo-Regular.ttf||2853436:1745519248.0": { + "family_name": "MesloLGLDZ Nerd Font Propo", + "font-family": "MesloLGLDZ Nerd Font Propo", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "MesloLGLDZ Nerd Font Propo Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 6, + 9, + 3, + 8, + 4, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/MesloLGLDZNerdFontPropo-Regular.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/MesloLGLNerdFont-Bold.ttf||2870760:1745519248.0": { + "family_name": "MesloLGL Nerd Font", + "font-family": "MesloLGL Nerd Font", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "MesloLGL Nerd Font Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 7, + 9, + 3, + 6, + 4, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/MesloLGLNerdFont-Bold.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/MesloLGLNerdFont-BoldItalic.ttf||2828720:1745519248.0": { + "family_name": "MesloLGL Nerd Font", + "font-family": "MesloLGL Nerd Font", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 0, + "full_name": "MesloLGL Nerd Font Bold Italic", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 7, + 9, + 3, + 3, + 4, + 11, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/MesloLGLNerdFont-BoldItalic.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold Italic", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/MesloLGLNerdFont-Italic.ttf||2812300:1745519248.0": { + "family_name": "MesloLGL Nerd Font", + "font-family": "MesloLGL Nerd Font", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 0, + "full_name": "MesloLGL Nerd Font Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 6, + 9, + 3, + 3, + 4, + 11, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/MesloLGLNerdFont-Italic.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Italic", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/MesloLGLNerdFont-Regular.ttf||2853552:1745519248.0": { + "family_name": "MesloLGL Nerd Font", + "font-family": "MesloLGL Nerd Font", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "MesloLGL Nerd Font Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 6, + 9, + 3, + 8, + 4, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/MesloLGLNerdFont-Regular.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/MesloLGLNerdFontMono-Bold.ttf||2849360:1745519248.0": { + "family_name": "MesloLGL Nerd Font Mono", + "font-family": "MesloLGL Nerd Font Mono", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "MesloLGL Nerd Font Mono Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 7, + 9, + 3, + 6, + 4, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/MesloLGLNerdFontMono-Bold.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/MesloLGLNerdFontMono-BoldItalic.ttf||2807840:1745519248.0": { + "family_name": "MesloLGL Nerd Font Mono", + "font-family": "MesloLGL Nerd Font Mono", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 0, + "full_name": "MesloLGL Nerd Font Mono Bold Italic", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 7, + 9, + 3, + 3, + 4, + 11, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/MesloLGLNerdFontMono-BoldItalic.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold Italic", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/MesloLGLNerdFontMono-Italic.ttf||2791420:1745519248.0": { + "family_name": "MesloLGL Nerd Font Mono", + "font-family": "MesloLGL Nerd Font Mono", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 0, + "full_name": "MesloLGL Nerd Font Mono Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 6, + 9, + 3, + 3, + 4, + 11, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/MesloLGLNerdFontMono-Italic.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Italic", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/MesloLGLNerdFontMono-Regular.ttf||2832156:1745519248.0": { + "family_name": "MesloLGL Nerd Font Mono", + "font-family": "MesloLGL Nerd Font Mono", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "MesloLGL Nerd Font Mono Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 6, + 9, + 3, + 8, + 4, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/MesloLGLNerdFontMono-Regular.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/MesloLGLNerdFontPropo-Bold.ttf||2870608:1745519248.0": { + "family_name": "MesloLGL Nerd Font Propo", + "font-family": "MesloLGL Nerd Font Propo", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "MesloLGL Nerd Font Propo Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 7, + 9, + 3, + 6, + 4, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/MesloLGLNerdFontPropo-Bold.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/MesloLGLNerdFontPropo-BoldItalic.ttf||2828564:1745519248.0": { + "family_name": "MesloLGL Nerd Font Propo", + "font-family": "MesloLGL Nerd Font Propo", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 0, + "full_name": "MesloLGL Nerd Font Propo Bold Italic", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 7, + 9, + 3, + 3, + 4, + 11, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/MesloLGLNerdFontPropo-BoldItalic.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold Italic", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/MesloLGLNerdFontPropo-Italic.ttf||2812148:1745519248.0": { + "family_name": "MesloLGL Nerd Font Propo", + "font-family": "MesloLGL Nerd Font Propo", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 0, + "full_name": "MesloLGL Nerd Font Propo Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 6, + 9, + 3, + 3, + 4, + 11, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/MesloLGLNerdFontPropo-Italic.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Italic", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/MesloLGLNerdFontPropo-Regular.ttf||2853400:1745519248.0": { + "family_name": "MesloLGL Nerd Font Propo", + "font-family": "MesloLGL Nerd Font Propo", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "MesloLGL Nerd Font Propo Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 6, + 9, + 3, + 8, + 4, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/MesloLGLNerdFontPropo-Regular.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/MesloLGMDZNerdFont-Bold.ttf||2870760:1745519248.0": { + "family_name": "MesloLGMDZ Nerd Font", + "font-family": "MesloLGMDZ Nerd Font", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "MesloLGMDZ Nerd Font Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 7, + 9, + 3, + 6, + 4, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/MesloLGMDZNerdFont-Bold.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/MesloLGMDZNerdFont-BoldItalic.ttf||2828716:1745519248.0": { + "family_name": "MesloLGMDZ Nerd Font", + "font-family": "MesloLGMDZ Nerd Font", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 0, + "full_name": "MesloLGMDZ Nerd Font Bold Italic", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 7, + 9, + 3, + 3, + 4, + 11, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/MesloLGMDZNerdFont-BoldItalic.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold Italic", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/MesloLGMDZNerdFont-Italic.ttf||2812352:1745519248.0": { + "family_name": "MesloLGMDZ Nerd Font", + "font-family": "MesloLGMDZ Nerd Font", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 0, + "full_name": "MesloLGMDZ Nerd Font Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 6, + 9, + 3, + 3, + 4, + 11, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/MesloLGMDZNerdFont-Italic.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Italic", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/MesloLGMDZNerdFont-Regular.ttf||2853600:1745519248.0": { + "family_name": "MesloLGMDZ Nerd Font", + "font-family": "MesloLGMDZ Nerd Font", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "MesloLGMDZ Nerd Font Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 6, + 9, + 3, + 8, + 4, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/MesloLGMDZNerdFont-Regular.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/MesloLGMDZNerdFontMono-Bold.ttf||2849148:1745519248.0": { + "family_name": "MesloLGMDZ Nerd Font Mono", + "font-family": "MesloLGMDZ Nerd Font Mono", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "MesloLGMDZ Nerd Font Mono Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 7, + 9, + 3, + 6, + 4, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/MesloLGMDZNerdFontMono-Bold.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/MesloLGMDZNerdFontMono-BoldItalic.ttf||2807624:1745519248.0": { + "family_name": "MesloLGMDZ Nerd Font Mono", + "font-family": "MesloLGMDZ Nerd Font Mono", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 0, + "full_name": "MesloLGMDZ Nerd Font Mono Bold Italic", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 7, + 9, + 3, + 3, + 4, + 11, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/MesloLGMDZNerdFontMono-BoldItalic.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold Italic", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/MesloLGMDZNerdFontMono-Italic.ttf||2791260:1745519248.0": { + "family_name": "MesloLGMDZ Nerd Font Mono", + "font-family": "MesloLGMDZ Nerd Font Mono", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 0, + "full_name": "MesloLGMDZ Nerd Font Mono Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 6, + 9, + 3, + 3, + 4, + 11, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/MesloLGMDZNerdFontMono-Italic.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Italic", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/MesloLGMDZNerdFontMono-Regular.ttf||2831992:1745519248.0": { + "family_name": "MesloLGMDZ Nerd Font Mono", + "font-family": "MesloLGMDZ Nerd Font Mono", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "MesloLGMDZ Nerd Font Mono Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 6, + 9, + 3, + 8, + 4, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/MesloLGMDZNerdFontMono-Regular.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/MesloLGMDZNerdFontPropo-Bold.ttf||2870608:1745519248.0": { + "family_name": "MesloLGMDZ Nerd Font Propo", + "font-family": "MesloLGMDZ Nerd Font Propo", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "MesloLGMDZ Nerd Font Propo Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 7, + 9, + 3, + 6, + 4, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/MesloLGMDZNerdFontPropo-Bold.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/MesloLGMDZNerdFontPropo-BoldItalic.ttf||2828560:1745519248.0": { + "family_name": "MesloLGMDZ Nerd Font Propo", + "font-family": "MesloLGMDZ Nerd Font Propo", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 0, + "full_name": "MesloLGMDZ Nerd Font Propo Bold Italic", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 7, + 9, + 3, + 3, + 4, + 11, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/MesloLGMDZNerdFontPropo-BoldItalic.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold Italic", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/MesloLGMDZNerdFontPropo-Italic.ttf||2812200:1745519248.0": { + "family_name": "MesloLGMDZ Nerd Font Propo", + "font-family": "MesloLGMDZ Nerd Font Propo", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 0, + "full_name": "MesloLGMDZ Nerd Font Propo Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 6, + 9, + 3, + 3, + 4, + 11, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/MesloLGMDZNerdFontPropo-Italic.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Italic", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/MesloLGMDZNerdFontPropo-Regular.ttf||2853448:1745519248.0": { + "family_name": "MesloLGMDZ Nerd Font Propo", + "font-family": "MesloLGMDZ Nerd Font Propo", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "MesloLGMDZ Nerd Font Propo Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 6, + 9, + 3, + 8, + 4, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/MesloLGMDZNerdFontPropo-Regular.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/MesloLGMNerdFont-Bold.ttf||2870724:1745519248.0": { + "family_name": "MesloLGM Nerd Font", + "font-family": "MesloLGM Nerd Font", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "MesloLGM Nerd Font Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 7, + 9, + 3, + 6, + 4, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/MesloLGMNerdFont-Bold.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/MesloLGMNerdFont-BoldItalic.ttf||2828684:1745519248.0": { + "family_name": "MesloLGM Nerd Font", + "font-family": "MesloLGM Nerd Font", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 0, + "full_name": "MesloLGM Nerd Font Bold Italic", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 7, + 9, + 3, + 3, + 4, + 11, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/MesloLGMNerdFont-BoldItalic.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold Italic", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/MesloLGMNerdFont-Italic.ttf||2812312:1745519248.0": { + "family_name": "MesloLGM Nerd Font", + "font-family": "MesloLGM Nerd Font", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 0, + "full_name": "MesloLGM Nerd Font Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 6, + 9, + 3, + 3, + 4, + 11, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/MesloLGMNerdFont-Italic.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Italic", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/MesloLGMNerdFont-Regular.ttf||2853564:1745519248.0": { + "family_name": "MesloLGM Nerd Font", + "font-family": "MesloLGM Nerd Font", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "MesloLGM Nerd Font Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 6, + 9, + 3, + 8, + 4, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/MesloLGMNerdFont-Regular.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/MesloLGMNerdFontMono-Bold.ttf||2849112:1745519248.0": { + "family_name": "MesloLGM Nerd Font Mono", + "font-family": "MesloLGM Nerd Font Mono", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "MesloLGM Nerd Font Mono Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 7, + 9, + 3, + 6, + 4, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/MesloLGMNerdFontMono-Bold.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/MesloLGMNerdFontMono-BoldItalic.ttf||2807592:1745519248.0": { + "family_name": "MesloLGM Nerd Font Mono", + "font-family": "MesloLGM Nerd Font Mono", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 0, + "full_name": "MesloLGM Nerd Font Mono Bold Italic", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 7, + 9, + 3, + 3, + 4, + 11, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/MesloLGMNerdFontMono-BoldItalic.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold Italic", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/MesloLGMNerdFontMono-Italic.ttf||2791220:1745519248.0": { + "family_name": "MesloLGM Nerd Font Mono", + "font-family": "MesloLGM Nerd Font Mono", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 0, + "full_name": "MesloLGM Nerd Font Mono Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 6, + 9, + 3, + 3, + 4, + 11, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/MesloLGMNerdFontMono-Italic.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Italic", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/MesloLGMNerdFontMono-Regular.ttf||2831956:1745519248.0": { + "family_name": "MesloLGM Nerd Font Mono", + "font-family": "MesloLGM Nerd Font Mono", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "MesloLGM Nerd Font Mono Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 6, + 9, + 3, + 8, + 4, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/MesloLGMNerdFontMono-Regular.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/MesloLGMNerdFontPropo-Bold.ttf||2870572:1745519248.0": { + "family_name": "MesloLGM Nerd Font Propo", + "font-family": "MesloLGM Nerd Font Propo", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "MesloLGM Nerd Font Propo Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 7, + 9, + 3, + 6, + 4, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/MesloLGMNerdFontPropo-Bold.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/MesloLGMNerdFontPropo-BoldItalic.ttf||2828528:1745519248.0": { + "family_name": "MesloLGM Nerd Font Propo", + "font-family": "MesloLGM Nerd Font Propo", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 0, + "full_name": "MesloLGM Nerd Font Propo Bold Italic", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 7, + 9, + 3, + 3, + 4, + 11, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/MesloLGMNerdFontPropo-BoldItalic.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold Italic", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/MesloLGMNerdFontPropo-Italic.ttf||2812160:1745519248.0": { + "family_name": "MesloLGM Nerd Font Propo", + "font-family": "MesloLGM Nerd Font Propo", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 0, + "full_name": "MesloLGM Nerd Font Propo Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 6, + 9, + 3, + 3, + 4, + 11, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/MesloLGMNerdFontPropo-Italic.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Italic", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/MesloLGMNerdFontPropo-Regular.ttf||2853412:1745519248.0": { + "family_name": "MesloLGM Nerd Font Propo", + "font-family": "MesloLGM Nerd Font Propo", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "MesloLGM Nerd Font Propo Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 6, + 9, + 3, + 8, + 4, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/MesloLGMNerdFontPropo-Regular.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/MesloLGSDZNerdFont-Bold.ttf||2870472:1745519248.0": { + "family_name": "MesloLGSDZ Nerd Font", + "font-family": "MesloLGSDZ Nerd Font", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "MesloLGSDZ Nerd Font Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 7, + 9, + 3, + 6, + 4, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/MesloLGSDZNerdFont-Bold.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/MesloLGSDZNerdFont-BoldItalic.ttf||2828428:1745519248.0": { + "family_name": "MesloLGSDZ Nerd Font", + "font-family": "MesloLGSDZ Nerd Font", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 0, + "full_name": "MesloLGSDZ Nerd Font Bold Italic", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 7, + 9, + 3, + 3, + 4, + 11, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/MesloLGSDZNerdFont-BoldItalic.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold Italic", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/MesloLGSDZNerdFont-Italic.ttf||2812112:1745519248.0": { + "family_name": "MesloLGSDZ Nerd Font", + "font-family": "MesloLGSDZ Nerd Font", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 0, + "full_name": "MesloLGSDZ Nerd Font Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 6, + 9, + 3, + 3, + 4, + 11, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/MesloLGSDZNerdFont-Italic.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Italic", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/MesloLGSDZNerdFont-Regular.ttf||2853360:1745519248.0": { + "family_name": "MesloLGSDZ Nerd Font", + "font-family": "MesloLGSDZ Nerd Font", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "MesloLGSDZ Nerd Font Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 6, + 9, + 3, + 8, + 4, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/MesloLGSDZNerdFont-Regular.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/MesloLGSDZNerdFontMono-Bold.ttf||2848808:1745519248.0": { + "family_name": "MesloLGSDZ Nerd Font Mono", + "font-family": "MesloLGSDZ Nerd Font Mono", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "MesloLGSDZ Nerd Font Mono Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 7, + 9, + 3, + 6, + 4, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/MesloLGSDZNerdFontMono-Bold.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/MesloLGSDZNerdFontMono-BoldItalic.ttf||2807284:1745519248.0": { + "family_name": "MesloLGSDZ Nerd Font Mono", + "font-family": "MesloLGSDZ Nerd Font Mono", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 0, + "full_name": "MesloLGSDZ Nerd Font Mono Bold Italic", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 7, + 9, + 3, + 3, + 4, + 11, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/MesloLGSDZNerdFontMono-BoldItalic.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold Italic", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/MesloLGSDZNerdFontMono-Italic.ttf||2790968:1745519248.0": { + "family_name": "MesloLGSDZ Nerd Font Mono", + "font-family": "MesloLGSDZ Nerd Font Mono", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 0, + "full_name": "MesloLGSDZ Nerd Font Mono Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 6, + 9, + 3, + 3, + 4, + 11, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/MesloLGSDZNerdFontMono-Italic.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Italic", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/MesloLGSDZNerdFontMono-Regular.ttf||2831700:1745519248.0": { + "family_name": "MesloLGSDZ Nerd Font Mono", + "font-family": "MesloLGSDZ Nerd Font Mono", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "MesloLGSDZ Nerd Font Mono Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 6, + 9, + 3, + 8, + 4, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/MesloLGSDZNerdFontMono-Regular.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/MesloLGSDZNerdFontPropo-Bold.ttf||2870320:1745519248.0": { + "family_name": "MesloLGSDZ Nerd Font Propo", + "font-family": "MesloLGSDZ Nerd Font Propo", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "MesloLGSDZ Nerd Font Propo Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 7, + 9, + 3, + 6, + 4, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/MesloLGSDZNerdFontPropo-Bold.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/MesloLGSDZNerdFontPropo-BoldItalic.ttf||2828272:1745519248.0": { + "family_name": "MesloLGSDZ Nerd Font Propo", + "font-family": "MesloLGSDZ Nerd Font Propo", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 0, + "full_name": "MesloLGSDZ Nerd Font Propo Bold Italic", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 7, + 9, + 3, + 3, + 4, + 11, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/MesloLGSDZNerdFontPropo-BoldItalic.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold Italic", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/MesloLGSDZNerdFontPropo-Italic.ttf||2811960:1745519248.0": { + "family_name": "MesloLGSDZ Nerd Font Propo", + "font-family": "MesloLGSDZ Nerd Font Propo", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 0, + "full_name": "MesloLGSDZ Nerd Font Propo Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 6, + 9, + 3, + 3, + 4, + 11, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/MesloLGSDZNerdFontPropo-Italic.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Italic", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/MesloLGSDZNerdFontPropo-Regular.ttf||2853208:1745519248.0": { + "family_name": "MesloLGSDZ Nerd Font Propo", + "font-family": "MesloLGSDZ Nerd Font Propo", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "MesloLGSDZ Nerd Font Propo Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 6, + 9, + 3, + 8, + 4, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/MesloLGSDZNerdFontPropo-Regular.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/MesloLGSNerdFont-Bold.ttf||2870436:1745519248.0": { + "family_name": "MesloLGS Nerd Font", + "font-family": "MesloLGS Nerd Font", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "MesloLGS Nerd Font Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 7, + 9, + 3, + 6, + 4, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/MesloLGSNerdFont-Bold.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/MesloLGSNerdFont-BoldItalic.ttf||2828396:1745519248.0": { + "family_name": "MesloLGS Nerd Font", + "font-family": "MesloLGS Nerd Font", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 0, + "full_name": "MesloLGS Nerd Font Bold Italic", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 7, + 9, + 3, + 3, + 4, + 11, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/MesloLGSNerdFont-BoldItalic.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold Italic", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/MesloLGSNerdFont-Italic.ttf||2812072:1745519248.0": { + "family_name": "MesloLGS Nerd Font", + "font-family": "MesloLGS Nerd Font", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 0, + "full_name": "MesloLGS Nerd Font Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 6, + 9, + 3, + 3, + 4, + 11, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/MesloLGSNerdFont-Italic.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Italic", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/MesloLGSNerdFont-Regular.ttf||2853324:1745519248.0": { + "family_name": "MesloLGS Nerd Font", + "font-family": "MesloLGS Nerd Font", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "MesloLGS Nerd Font Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 6, + 9, + 3, + 8, + 4, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/MesloLGSNerdFont-Regular.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/MesloLGSNerdFontMono-Bold.ttf||2848772:1745519248.0": { + "family_name": "MesloLGS Nerd Font Mono", + "font-family": "MesloLGS Nerd Font Mono", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "MesloLGS Nerd Font Mono Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 7, + 9, + 3, + 6, + 4, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/MesloLGSNerdFontMono-Bold.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/MesloLGSNerdFontMono-BoldItalic.ttf||2807252:1745519248.0": { + "family_name": "MesloLGS Nerd Font Mono", + "font-family": "MesloLGS Nerd Font Mono", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 0, + "full_name": "MesloLGS Nerd Font Mono Bold Italic", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 7, + 9, + 3, + 3, + 4, + 11, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/MesloLGSNerdFontMono-BoldItalic.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold Italic", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/MesloLGSNerdFontMono-Italic.ttf||2790928:1745519248.0": { + "family_name": "MesloLGS Nerd Font Mono", + "font-family": "MesloLGS Nerd Font Mono", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 0, + "full_name": "MesloLGS Nerd Font Mono Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 6, + 9, + 3, + 3, + 4, + 11, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/MesloLGSNerdFontMono-Italic.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Italic", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/MesloLGSNerdFontMono-Regular.ttf||2831664:1745519248.0": { + "family_name": "MesloLGS Nerd Font Mono", + "font-family": "MesloLGS Nerd Font Mono", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "MesloLGS Nerd Font Mono Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 6, + 9, + 3, + 8, + 4, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/MesloLGSNerdFontMono-Regular.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/MesloLGSNerdFontPropo-Bold.ttf||2870284:1745519248.0": { + "family_name": "MesloLGS Nerd Font Propo", + "font-family": "MesloLGS Nerd Font Propo", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "MesloLGS Nerd Font Propo Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 7, + 9, + 3, + 6, + 4, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/MesloLGSNerdFontPropo-Bold.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/MesloLGSNerdFontPropo-BoldItalic.ttf||2828240:1745519248.0": { + "family_name": "MesloLGS Nerd Font Propo", + "font-family": "MesloLGS Nerd Font Propo", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 0, + "full_name": "MesloLGS Nerd Font Propo Bold Italic", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 7, + 9, + 3, + 3, + 4, + 11, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/MesloLGSNerdFontPropo-BoldItalic.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold Italic", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/MesloLGSNerdFontPropo-Italic.ttf||2811920:1745519248.0": { + "family_name": "MesloLGS Nerd Font Propo", + "font-family": "MesloLGS Nerd Font Propo", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 0, + "full_name": "MesloLGS Nerd Font Propo Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 6, + 9, + 3, + 3, + 4, + 11, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/MesloLGSNerdFontPropo-Italic.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Italic", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/MesloLGSNerdFontPropo-Regular.ttf||2853172:1745519248.0": { + "family_name": "MesloLGS Nerd Font Propo", + "font-family": "MesloLGS Nerd Font Propo", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "MesloLGS Nerd Font Propo Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 6, + 9, + 3, + 8, + 4, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/MesloLGSNerdFontPropo-Regular.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/SymbolsNerdFontMono-Regular.ttf||2507556:1745602343.0": { + "family_name": "Symbols Nerd Font Mono", + "font-family": "Symbols Nerd Font Mono", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Symbols Nerd Font Mono", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 0, + 5, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/SymbolsNerdFontMono-Regular.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/Times.TTF||330412:1747703126.0": { + "family_name": "Times New Roman", + "font-family": "Times New Roman", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Times New Roman", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 2, + 6, + 3, + 5, + 4, + 5, + 2, + 3, + 4 + ], + "path": "/usr/share/fonts/TTF/Times.TTF", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/Timesbd.TTF||333900:1747703126.0": { + "family_name": "Times New Roman", + "font-family": "Times New Roman", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "Times New Roman Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 2, + 8, + 3, + 7, + 5, + 5, + 2, + 3, + 4 + ], + "path": "/usr/share/fonts/TTF/Timesbd.TTF", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/Timesbi.TTF||238612:1747703126.0": { + "family_name": "Times New Roman", + "font-family": "Times New Roman", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 0, + "full_name": "Times New Roman Bold Italic", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 2, + 7, + 3, + 6, + 5, + 5, + 9, + 3, + 4 + ], + "path": "/usr/share/fonts/TTF/Timesbi.TTF", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold Italic", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/Timesi.TTF||247092:1747703126.0": { + "family_name": "Times New Roman", + "font-family": "Times New Roman", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Times New Roman Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 2, + 5, + 3, + 5, + 4, + 5, + 9, + 3, + 4 + ], + "path": "/usr/share/fonts/TTF/Timesi.TTF", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Italic", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/Trebucbd.ttf||123828:1747703126.0": { + "family_name": "Trebuchet MS", + "font-family": "Trebuchet MS", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 8, + "full_name": "Trebuchet MS Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 11, + 7, + 3, + 2, + 2, + 2, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/Trebucbd.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/UBraille.ttf||154412:1747703135.0": { + "family_name": "Braille", + "font-family": "Braille", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Braille", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 0, + 6, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/UBraille.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/Vera.ttf||65932:1720917375.0": { + "family_name": "Bitstream Vera Sans", + "font-family": "Bitstream Vera Sans", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 4, + "full_name": "Bitstream Vera Sans", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 11, + 6, + 3, + 3, + 8, + 4, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/Vera.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Roman", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/VeraBI.ttf||63208:1720917375.0": { + "family_name": "Bitstream Vera Sans", + "font-family": "Bitstream Vera Sans", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 4, + "full_name": "Bitstream Vera Sans Bold Oblique", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 11, + 8, + 3, + 3, + 3, + 4, + 11, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/VeraBI.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold Oblique", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/VeraBd.ttf||58716:1720917375.0": { + "family_name": "Bitstream Vera Sans", + "font-family": "Bitstream Vera Sans", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 4, + "full_name": "Bitstream Vera Sans Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 11, + 8, + 3, + 3, + 6, + 4, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/VeraBd.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/VeraIt.ttf||63684:1720917375.0": { + "family_name": "Bitstream Vera Sans", + "font-family": "Bitstream Vera Sans", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 4, + "full_name": "Bitstream Vera Sans Oblique", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 11, + 6, + 3, + 3, + 3, + 4, + 11, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/VeraIt.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Oblique", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/VeraMoBI.ttf||55032:1720917375.0": { + "family_name": "Bitstream Vera Sans Mono", + "font-family": "Bitstream Vera Sans Mono", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 4, + "full_name": "Bitstream Vera Sans Mono Bold Oblique", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 11, + 7, + 9, + 3, + 3, + 4, + 11, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/VeraMoBI.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold Oblique", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/VeraMoBd.ttf||49052:1720917375.0": { + "family_name": "Bitstream Vera Sans Mono", + "font-family": "Bitstream Vera Sans Mono", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 4, + "full_name": "Bitstream Vera Sans Mono Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 11, + 7, + 9, + 3, + 6, + 4, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/VeraMoBd.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/VeraMoIt.ttf||54508:1720917375.0": { + "family_name": "Bitstream Vera Sans Mono", + "font-family": "Bitstream Vera Sans Mono", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 4, + "full_name": "Bitstream Vera Sans Mono Oblique", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 11, + 6, + 9, + 3, + 3, + 4, + 11, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/VeraMoIt.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Oblique", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/VeraMono.ttf||49224:1720917375.0": { + "family_name": "Bitstream Vera Sans Mono", + "font-family": "Bitstream Vera Sans Mono", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 4, + "full_name": "Bitstream Vera Sans Mono", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 11, + 6, + 9, + 3, + 8, + 4, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/VeraMono.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Roman", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/VeraSe.ttf||60280:1720917375.0": { + "family_name": "Bitstream Vera Serif", + "font-family": "Bitstream Vera Serif", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 4, + "full_name": "Bitstream Vera Serif", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 6, + 6, + 3, + 5, + 6, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/VeraSe.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Roman", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/VeraSeBd.ttf||58736:1720917375.0": { + "family_name": "Bitstream Vera Serif", + "font-family": "Bitstream Vera Serif", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 4, + "full_name": "Bitstream Vera Serif Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 6, + 8, + 3, + 5, + 6, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/VeraSeBd.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/Verdana.TTF||139640:1747703126.0": { + "family_name": "Verdana", + "font-family": "Verdana", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Verdana", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 11, + 6, + 4, + 3, + 5, + 4, + 4, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/Verdana.TTF", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/Verdanab.TTF||136032:1747703126.0": { + "family_name": "Verdana", + "font-family": "Verdana", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "Verdana Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 11, + 8, + 4, + 3, + 5, + 4, + 4, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/Verdanab.TTF", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/Verdanai.TTF||154264:1747703126.0": { + "family_name": "Verdana", + "font-family": "Verdana", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Verdana Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 11, + 6, + 4, + 3, + 5, + 4, + 11, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/Verdanai.TTF", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Italic", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/Verdanaz.TTF||153324:1747703126.0": { + "family_name": "Verdana", + "font-family": "Verdana", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 0, + "full_name": "Verdana Bold Italic", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 11, + 8, + 4, + 3, + 5, + 4, + 11, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/Verdanaz.TTF", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold Italic", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/Webdings.TTF||118752:1747703126.0": { + "family_name": "Webdings", + "font-family": "Webdings", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Webdings", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 1, + "panose": [ + 5, + 3, + 1, + 2, + 1, + 5, + 9, + 6, + 7, + 3 + ], + "path": "/usr/share/fonts/TTF/Webdings.TTF", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/all-the-icons.ttf||44732:1747703104.0": { + "family_name": "all-the-icons", + "font-family": "all-the-icons", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "all-the-icons", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 3, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/all-the-icons.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/cour.ttf||302688:1747703126.0": { + "family_name": "Courier New", + "font-family": "Courier New", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Courier New", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 7, + 3, + 9, + 2, + 2, + 5, + 2, + 4, + 4 + ], + "path": "/usr/share/fonts/TTF/cour.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/courbd.ttf||311508:1747703126.0": { + "family_name": "Courier New", + "font-family": "Courier New", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "Courier New Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 7, + 6, + 9, + 2, + 2, + 5, + 2, + 4, + 4 + ], + "path": "/usr/share/fonts/TTF/courbd.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/courbi.ttf||234788:1747703126.0": { + "family_name": "Courier New", + "font-family": "Courier New", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 0, + "full_name": "Courier New Bold Italic", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 7, + 6, + 9, + 2, + 2, + 5, + 9, + 4, + 4 + ], + "path": "/usr/share/fonts/TTF/courbi.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold Italic", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/couri.ttf||244156:1747703126.0": { + "family_name": "Courier New", + "font-family": "Courier New", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Courier New Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 7, + 4, + 9, + 2, + 2, + 5, + 9, + 4, + 4 + ], + "path": "/usr/share/fonts/TTF/couri.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Italic", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/file-icons.ttf||489672:1747703104.0": { + "family_name": "file-icons", + "font-family": "file-icons", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "file-icons", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 3, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/file-icons.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/fontawesome.ttf||152796:1747703104.0": { + "family_name": "FontAwesome", + "font-family": "FontAwesome", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "FontAwesome Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 3, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/fontawesome.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/literata-variable/Literata-Italic[opsz,wght].ttf||902728:1762976654.0": { + "family_name": "Literata", + "font-family": "Literata", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Literata Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/literata-variable/Literata-Italic[opsz,wght].ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Italic", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/literata-variable/Literata[opsz,wght].ttf||955132:1762976654.0": { + "family_name": "Literata", + "font-family": "Literata", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Literata Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/literata-variable/Literata[opsz,wght].ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/material-design-icons.ttf||128180:1747703104.0": { + "family_name": "Material Icons", + "font-family": "Material Icons", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Material Icons", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 5, + 3, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/material-design-icons.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/octicons.ttf||52544:1747703104.0": { + "family_name": "github-octicons", + "font-family": "github-octicons", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 8, + "full_name": "github-octicons", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 0, + 5, + 3, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/octicons.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/trebuc.ttf||126796:1747703126.0": { + "family_name": "Trebuchet MS", + "font-family": "Trebuchet MS", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 8, + "full_name": "Trebuchet MS", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 11, + 6, + 3, + 2, + 2, + 2, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/trebuc.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/trebucbi.ttf||131188:1747703126.0": { + "family_name": "Trebuchet MS", + "font-family": "Trebuchet MS", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 8, + "full_name": "Trebuchet MS Bold Italic", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 11, + 7, + 3, + 2, + 2, + 2, + 9, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/trebucbi.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold Italic", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/trebucit.ttf||139288:1747703126.0": { + "family_name": "Trebuchet MS", + "font-family": "Trebuchet MS", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 8, + "full_name": "Trebuchet MS Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 11, + 6, + 3, + 2, + 2, + 2, + 9, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/trebucit.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Italic", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/weathericons.ttf||99564:1747703104.0": { + "family_name": "Weather Icons", + "font-family": "Weather Icons", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 4, + "full_name": "Weather Icons Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 3, + "panose": [ + 0, + 0, + 5, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/weathericons.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-sans/SourceSans3-Black.otf||337012:1720044504.0": { + "family_name": "Source Sans 3 Black", + "font-family": "Source Sans 3 Black", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "900", + "fs_type": 0, + "full_name": "Source Sans 3 Black", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 11, + 9, + 3, + 3, + 4, + 3, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-sans/SourceSans3-Black.otf", + "preferred_family_name": "Source Sans 3", + "preferred_subfamily_name": "Black", + "subfamily_name": "Regular", + "weight": 900, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-sans/SourceSans3-BlackIt.otf||240960:1720044504.0": { + "family_name": "Source Sans 3 Black", + "font-family": "Source Sans 3 Black", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "900", + "fs_type": 0, + "full_name": "Source Sans 3 Black Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 11, + 9, + 3, + 3, + 4, + 3, + 9, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-sans/SourceSans3-BlackIt.otf", + "preferred_family_name": "Source Sans 3", + "preferred_subfamily_name": "Black Italic", + "subfamily_name": "Italic", + "weight": 900, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-sans/SourceSans3-Bold.otf||343596:1720044504.0": { + "family_name": "Source Sans 3", + "font-family": "Source Sans 3", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "Source Sans 3 Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 11, + 8, + 3, + 3, + 4, + 3, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-sans/SourceSans3-Bold.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-sans/SourceSans3-BoldIt.otf||243664:1720044504.0": { + "family_name": "Source Sans 3", + "font-family": "Source Sans 3", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 0, + "full_name": "Source Sans 3 Bold Italic", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 11, + 8, + 3, + 3, + 4, + 3, + 9, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-sans/SourceSans3-BoldIt.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold Italic", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-sans/SourceSans3-ExtraLight.otf||318280:1720044504.0": { + "family_name": "Source Sans 3 ExtraLight", + "font-family": "Source Sans 3 ExtraLight", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "200", + "fs_type": 0, + "full_name": "Source Sans 3 ExtraLight", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 11, + 3, + 3, + 3, + 4, + 3, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-sans/SourceSans3-ExtraLight.otf", + "preferred_family_name": "Source Sans 3", + "preferred_subfamily_name": "ExtraLight", + "subfamily_name": "Regular", + "weight": 200, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-sans/SourceSans3-ExtraLightIt.otf||226468:1720044504.0": { + "family_name": "Source Sans 3 ExtraLight", + "font-family": "Source Sans 3 ExtraLight", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "200", + "fs_type": 0, + "full_name": "Source Sans 3 ExtraLight Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 11, + 3, + 3, + 3, + 4, + 3, + 9, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-sans/SourceSans3-ExtraLightIt.otf", + "preferred_family_name": "Source Sans 3", + "preferred_subfamily_name": "ExtraLight Italic", + "subfamily_name": "Italic", + "weight": 200, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-sans/SourceSans3-It.otf||239048:1720044504.0": { + "family_name": "Source Sans 3", + "font-family": "Source Sans 3", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Source Sans 3 Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 11, + 5, + 3, + 3, + 4, + 3, + 9, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-sans/SourceSans3-It.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Italic", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-sans/SourceSans3-Light.otf||327396:1720044504.0": { + "family_name": "Source Sans 3 Light", + "font-family": "Source Sans 3 Light", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "300", + "fs_type": 0, + "full_name": "Source Sans 3 Light", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 11, + 4, + 3, + 3, + 4, + 3, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-sans/SourceSans3-Light.otf", + "preferred_family_name": "Source Sans 3", + "preferred_subfamily_name": "Light", + "subfamily_name": "Regular", + "weight": 300, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-sans/SourceSans3-LightIt.otf||233512:1720044504.0": { + "family_name": "Source Sans 3 Light", + "font-family": "Source Sans 3 Light", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "300", + "fs_type": 0, + "full_name": "Source Sans 3 Light Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 11, + 4, + 3, + 3, + 4, + 3, + 9, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-sans/SourceSans3-LightIt.otf", + "preferred_family_name": "Source Sans 3", + "preferred_subfamily_name": "Light Italic", + "subfamily_name": "Italic", + "weight": 300, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-sans/SourceSans3-Medium.otf||336848:1720044504.0": { + "family_name": "Source Sans 3 Medium", + "font-family": "Source Sans 3 Medium", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "500", + "fs_type": 0, + "full_name": "Source Sans 3 Medium", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 11, + 6, + 3, + 3, + 4, + 3, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-sans/SourceSans3-Medium.otf", + "preferred_family_name": "Source Sans 3", + "preferred_subfamily_name": "Medium", + "subfamily_name": "Regular", + "weight": 500, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-sans/SourceSans3-MediumIt.otf||239040:1720044504.0": { + "family_name": "Source Sans 3 Medium", + "font-family": "Source Sans 3 Medium", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "500", + "fs_type": 0, + "full_name": "Source Sans 3 Medium Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 11, + 6, + 3, + 3, + 4, + 3, + 9, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-sans/SourceSans3-MediumIt.otf", + "preferred_family_name": "Source Sans 3", + "preferred_subfamily_name": "Medium Italic", + "subfamily_name": "Italic", + "weight": 500, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-sans/SourceSans3-Regular.otf||334924:1720044504.0": { + "family_name": "Source Sans 3", + "font-family": "Source Sans 3", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Source Sans 3", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": true, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 11, + 5, + 3, + 3, + 4, + 3, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-sans/SourceSans3-Regular.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-sans/SourceSans3-Semibold.otf||339636:1720044504.0": { + "family_name": "Source Sans 3 Semibold", + "font-family": "Source Sans 3 Semibold", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "600", + "fs_type": 0, + "full_name": "Source Sans 3 Semibold", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 11, + 7, + 3, + 3, + 4, + 3, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-sans/SourceSans3-Semibold.otf", + "preferred_family_name": "Source Sans 3", + "preferred_subfamily_name": "Semibold", + "subfamily_name": "Regular", + "weight": 600, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-sans/SourceSans3-SemiboldIt.otf||239736:1720044504.0": { + "family_name": "Source Sans 3 Semibold", + "font-family": "Source Sans 3 Semibold", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "600", + "fs_type": 0, + "full_name": "Source Sans 3 Semibold Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 11, + 7, + 3, + 3, + 4, + 3, + 9, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-sans/SourceSans3-SemiboldIt.otf", + "preferred_family_name": "Source Sans 3", + "preferred_subfamily_name": "Semibold Italic", + "subfamily_name": "Italic", + "weight": 600, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-sans/SourceSans3VF-Italic.otf||303192:1720044504.0": { + "family_name": "SourceSans3VF", + "font-family": "SourceSans3VF", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "200", + "fs_type": 0, + "full_name": "SourceSans3VF Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 11, + 3, + 3, + 3, + 4, + 3, + 9, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-sans/SourceSans3VF-Italic.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Italic", + "weight": 200, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-sans/SourceSans3VF-Upright.otf||538164:1720044504.0": { + "family_name": "SourceSans3VF", + "font-family": "SourceSans3VF", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "200", + "fs_type": 0, + "full_name": "SourceSans3VF", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 11, + 3, + 3, + 3, + 4, + 3, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-sans/SourceSans3VF-Upright.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 200, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-sans/SourceSansPro-Black.otf||295500:1720044504.0": { + "family_name": "Source Sans Pro Black", + "font-family": "Source Sans Pro Black", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "900", + "fs_type": 0, + "full_name": "Source Sans Pro Black", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 11, + 8, + 3, + 3, + 4, + 3, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-sans/SourceSansPro-Black.otf", + "preferred_family_name": "Source Sans Pro", + "preferred_subfamily_name": "Black", + "subfamily_name": "Regular", + "weight": 900, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-sans/SourceSansPro-BlackIt.otf||212660:1720044504.0": { + "family_name": "Source Sans Pro Black", + "font-family": "Source Sans Pro Black", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "900", + "fs_type": 0, + "full_name": "Source Sans Pro Black Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 11, + 8, + 3, + 3, + 4, + 3, + 9, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-sans/SourceSansPro-BlackIt.otf", + "preferred_family_name": "Source Sans Pro", + "preferred_subfamily_name": "Black Italic", + "subfamily_name": "Italic", + "weight": 900, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-sans/SourceSansPro-Bold.otf||298076:1720044504.0": { + "family_name": "Source Sans Pro", + "font-family": "Source Sans Pro", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "Source Sans Pro Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 11, + 7, + 3, + 3, + 4, + 3, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-sans/SourceSansPro-Bold.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-sans/SourceSansPro-BoldIt.otf||212380:1720044504.0": { + "family_name": "Source Sans Pro", + "font-family": "Source Sans Pro", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 0, + "full_name": "Source Sans Pro Bold Italic", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 11, + 7, + 3, + 3, + 4, + 3, + 9, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-sans/SourceSansPro-BoldIt.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold Italic", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-sans/SourceSansPro-ExtraLight.otf||282200:1720044504.0": { + "family_name": "Source Sans Pro ExtraLight", + "font-family": "Source Sans Pro ExtraLight", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "200", + "fs_type": 0, + "full_name": "Source Sans Pro ExtraLight", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 11, + 3, + 3, + 3, + 4, + 3, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-sans/SourceSansPro-ExtraLight.otf", + "preferred_family_name": "Source Sans Pro", + "preferred_subfamily_name": "ExtraLight", + "subfamily_name": "Regular", + "weight": 200, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-sans/SourceSansPro-ExtraLightIt.otf||198324:1720044504.0": { + "family_name": "Source Sans Pro ExtraLight", + "font-family": "Source Sans Pro ExtraLight", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "200", + "fs_type": 0, + "full_name": "Source Sans Pro ExtraLight Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 11, + 3, + 3, + 3, + 4, + 3, + 9, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-sans/SourceSansPro-ExtraLightIt.otf", + "preferred_family_name": "Source Sans Pro", + "preferred_subfamily_name": "ExtraLight Italic", + "subfamily_name": "Italic", + "weight": 200, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-sans/SourceSansPro-It.otf||208408:1720044504.0": { + "family_name": "Source Sans Pro", + "font-family": "Source Sans Pro", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Source Sans Pro Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 11, + 5, + 3, + 3, + 4, + 3, + 9, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-sans/SourceSansPro-It.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Italic", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-sans/SourceSansPro-Light.otf||290464:1720044504.0": { + "family_name": "Source Sans Pro Light", + "font-family": "Source Sans Pro Light", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "300", + "fs_type": 0, + "full_name": "Source Sans Pro Light", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 11, + 4, + 3, + 3, + 4, + 3, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-sans/SourceSansPro-Light.otf", + "preferred_family_name": "Source Sans Pro", + "preferred_subfamily_name": "Light", + "subfamily_name": "Regular", + "weight": 300, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-sans/SourceSansPro-LightIt.otf||204752:1720044504.0": { + "family_name": "Source Sans Pro Light", + "font-family": "Source Sans Pro Light", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "300", + "fs_type": 0, + "full_name": "Source Sans Pro Light Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 11, + 4, + 3, + 3, + 4, + 3, + 9, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-sans/SourceSansPro-LightIt.otf", + "preferred_family_name": "Source Sans Pro", + "preferred_subfamily_name": "Light Italic", + "subfamily_name": "Italic", + "weight": 300, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-sans/SourceSansPro-Regular.otf||293200:1720044504.0": { + "family_name": "Source Sans Pro", + "font-family": "Source Sans Pro", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Source Sans Pro", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": true, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 11, + 5, + 3, + 3, + 4, + 3, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-sans/SourceSansPro-Regular.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-sans/SourceSansPro-Semibold.otf||295952:1720044504.0": { + "family_name": "Source Sans Pro Semibold", + "font-family": "Source Sans Pro Semibold", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "600", + "fs_type": 0, + "full_name": "Source Sans Pro Semibold", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 11, + 6, + 3, + 3, + 4, + 3, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-sans/SourceSansPro-Semibold.otf", + "preferred_family_name": "Source Sans Pro", + "preferred_subfamily_name": "Semibold", + "subfamily_name": "Regular", + "weight": 600, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-sans/SourceSansPro-SemiboldIt.otf||210012:1720044504.0": { + "family_name": "Source Sans Pro Semibold", + "font-family": "Source Sans Pro Semibold", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "600", + "fs_type": 0, + "full_name": "Source Sans Pro Semibold Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 11, + 6, + 3, + 3, + 4, + 3, + 9, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-sans/SourceSansPro-SemiboldIt.otf", + "preferred_family_name": "Source Sans Pro", + "preferred_subfamily_name": "Semibold Italic", + "subfamily_name": "Italic", + "weight": 600, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-sans/SourceSansVariable-Italic.otf||252284:1720044504.0": { + "family_name": "Source Sans Variable", + "font-family": "Source Sans Variable", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "200", + "fs_type": 0, + "full_name": "Source Sans Variable Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 11, + 3, + 3, + 3, + 4, + 3, + 9, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-sans/SourceSansVariable-Italic.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Italic", + "weight": 200, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-sans/SourceSansVariable-Roman.otf||467920:1720044504.0": { + "family_name": "Source Sans Variable", + "font-family": "Source Sans Variable", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "200", + "fs_type": 0, + "full_name": "Source Sans Variable", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 11, + 3, + 3, + 3, + 4, + 3, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-sans/SourceSansVariable-Roman.otf", + "preferred_family_name": null, + "preferred_subfamily_name": "Roman", + "subfamily_name": "Regular", + "weight": 200, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-serif/SourceSerif4-Black.otf||247640:1720044433.0": { + "family_name": "Source Serif 4 Black", + "font-family": "Source Serif 4 Black", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "900", + "fs_type": 0, + "full_name": "Source Serif 4 Black", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 4, + 9, + 3, + 6, + 4, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-serif/SourceSerif4-Black.otf", + "preferred_family_name": "Source Serif 4", + "preferred_subfamily_name": "Black", + "subfamily_name": "Regular", + "weight": 900, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-serif/SourceSerif4-BlackIt.otf||169532:1720044433.0": { + "family_name": "Source Serif 4 Black", + "font-family": "Source Serif 4 Black", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "900", + "fs_type": 0, + "full_name": "Source Serif 4 Black Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 4, + 8, + 3, + 5, + 4, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-serif/SourceSerif4-BlackIt.otf", + "preferred_family_name": "Source Serif 4", + "preferred_subfamily_name": "Black Italic", + "subfamily_name": "Italic", + "weight": 900, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-serif/SourceSerif4-Bold.otf||251844:1720044433.0": { + "family_name": "Source Serif 4", + "font-family": "Source Serif 4", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "Source Serif 4 Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 4, + 8, + 3, + 5, + 4, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-serif/SourceSerif4-Bold.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-serif/SourceSerif4-BoldIt.otf||175576:1720044433.0": { + "family_name": "Source Serif 4", + "font-family": "Source Serif 4", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 0, + "full_name": "Source Serif 4 Bold Italic", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 4, + 8, + 3, + 5, + 4, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-serif/SourceSerif4-BoldIt.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold Italic", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-serif/SourceSerif4-ExtraLight.otf||237768:1720044433.0": { + "family_name": "Source Serif 4 ExtraLight", + "font-family": "Source Serif 4 ExtraLight", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "200", + "fs_type": 0, + "full_name": "Source Serif 4 ExtraLight", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 4, + 3, + 3, + 3, + 4, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-serif/SourceSerif4-ExtraLight.otf", + "preferred_family_name": "Source Serif 4", + "preferred_subfamily_name": "ExtraLight", + "subfamily_name": "Regular", + "weight": 200, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-serif/SourceSerif4-ExtraLightIt.otf||162564:1720044433.0": { + "family_name": "Source Serif 4 ExtraLight", + "font-family": "Source Serif 4 ExtraLight", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "200", + "fs_type": 0, + "full_name": "Source Serif 4 ExtraLight Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 4, + 3, + 3, + 4, + 4, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-serif/SourceSerif4-ExtraLightIt.otf", + "preferred_family_name": "Source Serif 4", + "preferred_subfamily_name": "ExtraLight Italic", + "subfamily_name": "Italic", + "weight": 200, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-serif/SourceSerif4-It.otf||169132:1720044433.0": { + "family_name": "Source Serif 4", + "font-family": "Source Serif 4", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Source Serif 4 Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 4, + 5, + 3, + 4, + 4, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-serif/SourceSerif4-It.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Italic", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-serif/SourceSerif4-Light.otf||246032:1720044433.0": { + "family_name": "Source Serif 4 Light", + "font-family": "Source Serif 4 Light", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "300", + "fs_type": 0, + "full_name": "Source Serif 4 Light", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 4, + 4, + 3, + 4, + 4, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-serif/SourceSerif4-Light.otf", + "preferred_family_name": "Source Serif 4", + "preferred_subfamily_name": "Light", + "subfamily_name": "Regular", + "weight": 300, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-serif/SourceSerif4-LightIt.otf||173476:1720044433.0": { + "family_name": "Source Serif 4 Light", + "font-family": "Source Serif 4 Light", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "300", + "fs_type": 0, + "full_name": "Source Serif 4 Light Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 4, + 4, + 3, + 4, + 4, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-serif/SourceSerif4-LightIt.otf", + "preferred_family_name": "Source Serif 4", + "preferred_subfamily_name": "Light Italic", + "subfamily_name": "Italic", + "weight": 300, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-serif/SourceSerif4-Regular.otf||241392:1720044433.0": { + "family_name": "Source Serif 4", + "font-family": "Source Serif 4", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Source Serif 4", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": true, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 4, + 6, + 3, + 5, + 4, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-serif/SourceSerif4-Regular.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-serif/SourceSerif4-Semibold.otf||252852:1720044433.0": { + "family_name": "Source Serif 4 Semibold", + "font-family": "Source Serif 4 Semibold", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "600", + "fs_type": 0, + "full_name": "Source Serif 4 Semibold", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 4, + 7, + 3, + 5, + 4, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-serif/SourceSerif4-Semibold.otf", + "preferred_family_name": "Source Serif 4", + "preferred_subfamily_name": "Semibold", + "subfamily_name": "Regular", + "weight": 600, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-serif/SourceSerif4-SemiboldIt.otf||174988:1720044433.0": { + "family_name": "Source Serif 4 Semibold", + "font-family": "Source Serif 4 Semibold", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "600", + "fs_type": 0, + "full_name": "Source Serif 4 Semibold Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 4, + 6, + 3, + 5, + 4, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-serif/SourceSerif4-SemiboldIt.otf", + "preferred_family_name": "Source Serif 4", + "preferred_subfamily_name": "Semibold Italic", + "subfamily_name": "Italic", + "weight": 600, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-serif/SourceSerif4Caption-Black.otf||236952:1720044433.0": { + "family_name": "Source Serif 4 Caption Black", + "font-family": "Source Serif 4 Caption Black", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "900", + "fs_type": 0, + "full_name": "Source Serif 4 Caption Black", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 4, + 9, + 3, + 5, + 4, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-serif/SourceSerif4Caption-Black.otf", + "preferred_family_name": "Source Serif 4 Caption", + "preferred_subfamily_name": "Black", + "subfamily_name": "Regular", + "weight": 900, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-serif/SourceSerif4Caption-BlackIt.otf||160764:1720044433.0": { + "family_name": "Source Serif 4 Caption Black", + "font-family": "Source Serif 4 Caption Black", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "900", + "fs_type": 0, + "full_name": "Source Serif 4 Caption Black Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 4, + 9, + 3, + 5, + 4, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-serif/SourceSerif4Caption-BlackIt.otf", + "preferred_family_name": "Source Serif 4 Caption", + "preferred_subfamily_name": "Black Italic", + "subfamily_name": "Italic", + "weight": 900, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-serif/SourceSerif4Caption-Bold.otf||243868:1720044433.0": { + "family_name": "Source Serif 4 Caption", + "font-family": "Source Serif 4 Caption", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "Source Serif 4 Caption Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 4, + 8, + 3, + 5, + 4, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-serif/SourceSerif4Caption-Bold.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-serif/SourceSerif4Caption-BoldIt.otf||172204:1720044433.0": { + "family_name": "Source Serif 4 Caption", + "font-family": "Source Serif 4 Caption", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 0, + "full_name": "Source Serif 4 Caption Bold Italic", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 4, + 8, + 3, + 5, + 4, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-serif/SourceSerif4Caption-BoldIt.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold Italic", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-serif/SourceSerif4Caption-ExtraLight.otf||234244:1720044433.0": { + "family_name": "Source Serif 4 Caption ExtraLight", + "font-family": "Source Serif 4 Caption ExtraLight", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "200", + "fs_type": 0, + "full_name": "Source Serif 4 Caption ExtraLight", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 4, + 3, + 3, + 3, + 4, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-serif/SourceSerif4Caption-ExtraLight.otf", + "preferred_family_name": "Source Serif 4 Caption", + "preferred_subfamily_name": "ExtraLight", + "subfamily_name": "Regular", + "weight": 200, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-serif/SourceSerif4Caption-ExtraLightIt.otf||158272:1720044433.0": { + "family_name": "Source Serif 4 Caption ExtraLight", + "font-family": "Source Serif 4 Caption ExtraLight", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "200", + "fs_type": 0, + "full_name": "Source Serif 4 Caption ExtraLight Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 4, + 3, + 3, + 3, + 4, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-serif/SourceSerif4Caption-ExtraLightIt.otf", + "preferred_family_name": "Source Serif 4 Caption", + "preferred_subfamily_name": "ExtraLight Italic", + "subfamily_name": "Italic", + "weight": 200, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-serif/SourceSerif4Caption-It.otf||158864:1720044433.0": { + "family_name": "Source Serif 4 Caption", + "font-family": "Source Serif 4 Caption", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Source Serif 4 Caption Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 4, + 6, + 3, + 4, + 4, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-serif/SourceSerif4Caption-It.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Italic", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-serif/SourceSerif4Caption-Light.otf||240880:1720044433.0": { + "family_name": "Source Serif 4 Caption Light", + "font-family": "Source Serif 4 Caption Light", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "300", + "fs_type": 0, + "full_name": "Source Serif 4 Caption Light", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 4, + 4, + 3, + 3, + 4, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-serif/SourceSerif4Caption-Light.otf", + "preferred_family_name": "Source Serif 4 Caption", + "preferred_subfamily_name": "Light", + "subfamily_name": "Regular", + "weight": 300, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-serif/SourceSerif4Caption-LightIt.otf||167608:1720044433.0": { + "family_name": "Source Serif 4 Caption Light", + "font-family": "Source Serif 4 Caption Light", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "300", + "fs_type": 0, + "full_name": "Source Serif 4 Caption Light Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 4, + 4, + 3, + 3, + 4, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-serif/SourceSerif4Caption-LightIt.otf", + "preferred_family_name": "Source Serif 4 Caption", + "preferred_subfamily_name": "Light Italic", + "subfamily_name": "Italic", + "weight": 300, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-serif/SourceSerif4Caption-Regular.otf||226484:1720044433.0": { + "family_name": "Source Serif 4 Caption", + "font-family": "Source Serif 4 Caption", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Source Serif 4 Caption", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": true, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 4, + 6, + 3, + 4, + 4, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-serif/SourceSerif4Caption-Regular.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-serif/SourceSerif4Caption-Semibold.otf||244224:1720044433.0": { + "family_name": "Source Serif 4 Caption Semibold", + "font-family": "Source Serif 4 Caption Semibold", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "600", + "fs_type": 0, + "full_name": "Source Serif 4 Caption Semibold", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 4, + 7, + 3, + 5, + 4, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-serif/SourceSerif4Caption-Semibold.otf", + "preferred_family_name": "Source Serif 4 Caption", + "preferred_subfamily_name": "Semibold", + "subfamily_name": "Regular", + "weight": 600, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-serif/SourceSerif4Caption-SemiboldIt.otf||171272:1720044433.0": { + "family_name": "Source Serif 4 Caption Semibold", + "font-family": "Source Serif 4 Caption Semibold", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "600", + "fs_type": 0, + "full_name": "Source Serif 4 Caption Semibold Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 4, + 7, + 3, + 5, + 4, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-serif/SourceSerif4Caption-SemiboldIt.otf", + "preferred_family_name": "Source Serif 4 Caption", + "preferred_subfamily_name": "Semibold Italic", + "subfamily_name": "Italic", + "weight": 600, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-serif/SourceSerif4Display-Black.otf||266984:1720044433.0": { + "family_name": "Source Serif 4 Display Black", + "font-family": "Source Serif 4 Display Black", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "900", + "fs_type": 0, + "full_name": "Source Serif 4 Display Black", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 4, + 8, + 3, + 7, + 4, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-serif/SourceSerif4Display-Black.otf", + "preferred_family_name": "Source Serif 4 Display", + "preferred_subfamily_name": "Black", + "subfamily_name": "Regular", + "weight": 900, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-serif/SourceSerif4Display-BlackIt.otf||178752:1720044433.0": { + "family_name": "Source Serif 4 Display Black", + "font-family": "Source Serif 4 Display Black", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "900", + "fs_type": 0, + "full_name": "Source Serif 4 Display Black Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 4, + 8, + 3, + 7, + 4, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-serif/SourceSerif4Display-BlackIt.otf", + "preferred_family_name": "Source Serif 4 Display", + "preferred_subfamily_name": "Black Italic", + "subfamily_name": "Italic", + "weight": 900, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-serif/SourceSerif4Display-Bold.otf||275896:1720044433.0": { + "family_name": "Source Serif 4 Display", + "font-family": "Source Serif 4 Display", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "Source Serif 4 Display Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 4, + 7, + 3, + 7, + 4, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-serif/SourceSerif4Display-Bold.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-serif/SourceSerif4Display-BoldIt.otf||183092:1720044433.0": { + "family_name": "Source Serif 4 Display", + "font-family": "Source Serif 4 Display", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 0, + "full_name": "Source Serif 4 Display Bold Italic", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 4, + 7, + 3, + 7, + 4, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-serif/SourceSerif4Display-BoldIt.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold Italic", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-serif/SourceSerif4Display-ExtraLight.otf||259356:1720044433.0": { + "family_name": "Source Serif 4 Display ExtraLight", + "font-family": "Source Serif 4 Display ExtraLight", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "200", + "fs_type": 0, + "full_name": "Source Serif 4 Display ExtraLight", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 4, + 3, + 3, + 5, + 4, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-serif/SourceSerif4Display-ExtraLight.otf", + "preferred_family_name": "Source Serif 4 Display", + "preferred_subfamily_name": "ExtraLight", + "subfamily_name": "Regular", + "weight": 200, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-serif/SourceSerif4Display-ExtraLightIt.otf||173540:1720044433.0": { + "family_name": "Source Serif 4 Display ExtraLight", + "font-family": "Source Serif 4 Display ExtraLight", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "200", + "fs_type": 0, + "full_name": "Source Serif 4 Display ExtraLight Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 4, + 3, + 3, + 5, + 4, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-serif/SourceSerif4Display-ExtraLightIt.otf", + "preferred_family_name": "Source Serif 4 Display", + "preferred_subfamily_name": "ExtraLight Italic", + "subfamily_name": "Italic", + "weight": 200, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-serif/SourceSerif4Display-It.otf||175300:1720044433.0": { + "family_name": "Source Serif 4 Display", + "font-family": "Source Serif 4 Display", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Source Serif 4 Display Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 4, + 4, + 3, + 6, + 4, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-serif/SourceSerif4Display-It.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Italic", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-serif/SourceSerif4Display-Light.otf||266612:1720044433.0": { + "family_name": "Source Serif 4 Display Light", + "font-family": "Source Serif 4 Display Light", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "300", + "fs_type": 0, + "full_name": "Source Serif 4 Display Light", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 4, + 4, + 3, + 5, + 4, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-serif/SourceSerif4Display-Light.otf", + "preferred_family_name": "Source Serif 4 Display", + "preferred_subfamily_name": "Light", + "subfamily_name": "Regular", + "weight": 300, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-serif/SourceSerif4Display-LightIt.otf||177676:1720044433.0": { + "family_name": "Source Serif 4 Display Light", + "font-family": "Source Serif 4 Display Light", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "300", + "fs_type": 0, + "full_name": "Source Serif 4 Display Light Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 4, + 4, + 3, + 5, + 4, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-serif/SourceSerif4Display-LightIt.otf", + "preferred_family_name": "Source Serif 4 Display", + "preferred_subfamily_name": "Light Italic", + "subfamily_name": "Italic", + "weight": 300, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-serif/SourceSerif4Display-Regular.otf||262988:1720044433.0": { + "family_name": "Source Serif 4 Display", + "font-family": "Source Serif 4 Display", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Source Serif 4 Display", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": true, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 4, + 5, + 3, + 6, + 4, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-serif/SourceSerif4Display-Regular.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-serif/SourceSerif4Display-Semibold.otf||273232:1720044433.0": { + "family_name": "Source Serif 4 Display Semibold", + "font-family": "Source Serif 4 Display Semibold", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "600", + "fs_type": 0, + "full_name": "Source Serif 4 Display Semibold", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 4, + 6, + 3, + 6, + 4, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-serif/SourceSerif4Display-Semibold.otf", + "preferred_family_name": "Source Serif 4 Display", + "preferred_subfamily_name": "Semibold", + "subfamily_name": "Regular", + "weight": 600, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-serif/SourceSerif4Display-SemiboldIt.otf||181464:1720044433.0": { + "family_name": "Source Serif 4 Display Semibold", + "font-family": "Source Serif 4 Display Semibold", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "600", + "fs_type": 0, + "full_name": "Source Serif 4 Display Semibold Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 4, + 6, + 3, + 6, + 4, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-serif/SourceSerif4Display-SemiboldIt.otf", + "preferred_family_name": "Source Serif 4 Display", + "preferred_subfamily_name": "Semibold Italic", + "subfamily_name": "Italic", + "weight": 600, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-serif/SourceSerif4SmText-Black.otf||253628:1720044433.0": { + "family_name": "Source Serif 4 SmText Black", + "font-family": "Source Serif 4 SmText Black", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "900", + "fs_type": 0, + "full_name": "Source Serif 4 SmText Black", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 4, + 9, + 3, + 5, + 4, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-serif/SourceSerif4SmText-Black.otf", + "preferred_family_name": "Source Serif 4 SmText", + "preferred_subfamily_name": "Black", + "subfamily_name": "Regular", + "weight": 900, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-serif/SourceSerif4SmText-BlackIt.otf||175452:1720044433.0": { + "family_name": "Source Serif 4 SmText Black", + "font-family": "Source Serif 4 SmText Black", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "900", + "fs_type": 0, + "full_name": "Source Serif 4 SmText Black Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 4, + 9, + 3, + 5, + 4, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-serif/SourceSerif4SmText-BlackIt.otf", + "preferred_family_name": "Source Serif 4 SmText", + "preferred_subfamily_name": "Black Italic", + "subfamily_name": "Italic", + "weight": 900, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-serif/SourceSerif4SmText-Bold.otf||254540:1720044433.0": { + "family_name": "Source Serif 4 SmText", + "font-family": "Source Serif 4 SmText", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "Source Serif 4 SmText Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 4, + 8, + 3, + 5, + 4, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-serif/SourceSerif4SmText-Bold.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-serif/SourceSerif4SmText-BoldIt.otf||177564:1720044433.0": { + "family_name": "Source Serif 4 SmText", + "font-family": "Source Serif 4 SmText", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 0, + "full_name": "Source Serif 4 SmText Bold Italic", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 4, + 8, + 3, + 5, + 4, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-serif/SourceSerif4SmText-BoldIt.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold Italic", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-serif/SourceSerif4SmText-ExtraLight.otf||241412:1720044433.0": { + "family_name": "Source Serif 4 SmText ExtraLight", + "font-family": "Source Serif 4 SmText ExtraLight", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "200", + "fs_type": 0, + "full_name": "Source Serif 4 SmText ExtraLight", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 4, + 3, + 3, + 3, + 4, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-serif/SourceSerif4SmText-ExtraLight.otf", + "preferred_family_name": "Source Serif 4 SmText", + "preferred_subfamily_name": "ExtraLight", + "subfamily_name": "Regular", + "weight": 200, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-serif/SourceSerif4SmText-ExtraLightIt.otf||170024:1720044433.0": { + "family_name": "Source Serif 4 SmText ExtraLight", + "font-family": "Source Serif 4 SmText ExtraLight", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "200", + "fs_type": 0, + "full_name": "Source Serif 4 SmText ExtraLight Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 4, + 3, + 3, + 3, + 4, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-serif/SourceSerif4SmText-ExtraLightIt.otf", + "preferred_family_name": "Source Serif 4 SmText", + "preferred_subfamily_name": "ExtraLight Italic", + "subfamily_name": "Italic", + "weight": 200, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-serif/SourceSerif4SmText-It.otf||172992:1720044433.0": { + "family_name": "Source Serif 4 SmText", + "font-family": "Source Serif 4 SmText", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Source Serif 4 SmText Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 4, + 6, + 3, + 4, + 4, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-serif/SourceSerif4SmText-It.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Italic", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-serif/SourceSerif4SmText-Light.otf||246944:1720044433.0": { + "family_name": "Source Serif 4 SmText Light", + "font-family": "Source Serif 4 SmText Light", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "300", + "fs_type": 0, + "full_name": "Source Serif 4 SmText Light", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 4, + 4, + 3, + 4, + 4, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-serif/SourceSerif4SmText-Light.otf", + "preferred_family_name": "Source Serif 4 SmText", + "preferred_subfamily_name": "Light", + "subfamily_name": "Regular", + "weight": 300, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-serif/SourceSerif4SmText-LightIt.otf||173956:1720044433.0": { + "family_name": "Source Serif 4 SmText Light", + "font-family": "Source Serif 4 SmText Light", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "300", + "fs_type": 0, + "full_name": "Source Serif 4 SmText Light Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 4, + 4, + 3, + 3, + 4, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-serif/SourceSerif4SmText-LightIt.otf", + "preferred_family_name": "Source Serif 4 SmText", + "preferred_subfamily_name": "Light Italic", + "subfamily_name": "Italic", + "weight": 300, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-serif/SourceSerif4SmText-Regular.otf||245204:1720044433.0": { + "family_name": "Source Serif 4 SmText", + "font-family": "Source Serif 4 SmText", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Source Serif 4 SmText", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": true, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 4, + 6, + 3, + 4, + 4, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-serif/SourceSerif4SmText-Regular.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-serif/SourceSerif4SmText-Semibold.otf||252660:1720044433.0": { + "family_name": "Source Serif 4 SmText Semibold", + "font-family": "Source Serif 4 SmText Semibold", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "600", + "fs_type": 0, + "full_name": "Source Serif 4 SmText Semibold", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 4, + 7, + 3, + 5, + 4, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-serif/SourceSerif4SmText-Semibold.otf", + "preferred_family_name": "Source Serif 4 SmText", + "preferred_subfamily_name": "Semibold", + "subfamily_name": "Regular", + "weight": 600, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-serif/SourceSerif4SmText-SemiboldIt.otf||177964:1720044433.0": { + "family_name": "Source Serif 4 SmText Semibold", + "font-family": "Source Serif 4 SmText Semibold", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "600", + "fs_type": 0, + "full_name": "Source Serif 4 SmText Semibold Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 4, + 7, + 3, + 5, + 4, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-serif/SourceSerif4SmText-SemiboldIt.otf", + "preferred_family_name": "Source Serif 4 SmText", + "preferred_subfamily_name": "Semibold Italic", + "subfamily_name": "Italic", + "weight": 600, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-serif/SourceSerif4Subhead-Black.otf||278960:1720044433.0": { + "family_name": "Source Serif 4 Subhead Black", + "font-family": "Source Serif 4 Subhead Black", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "900", + "fs_type": 0, + "full_name": "Source Serif 4 Subhead Black", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 4, + 9, + 3, + 6, + 4, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-serif/SourceSerif4Subhead-Black.otf", + "preferred_family_name": "Source Serif 4 Subhead", + "preferred_subfamily_name": "Black", + "subfamily_name": "Regular", + "weight": 900, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-serif/SourceSerif4Subhead-BlackIt.otf||179448:1720044433.0": { + "family_name": "Source Serif 4 Subhead Black", + "font-family": "Source Serif 4 Subhead Black", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "900", + "fs_type": 0, + "full_name": "Source Serif 4 Subhead Black Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 4, + 8, + 3, + 6, + 4, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-serif/SourceSerif4Subhead-BlackIt.otf", + "preferred_family_name": "Source Serif 4 Subhead", + "preferred_subfamily_name": "Black Italic", + "subfamily_name": "Italic", + "weight": 900, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-serif/SourceSerif4Subhead-Bold.otf||279084:1720044433.0": { + "family_name": "Source Serif 4 Subhead", + "font-family": "Source Serif 4 Subhead", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "Source Serif 4 Subhead Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 4, + 8, + 3, + 6, + 4, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-serif/SourceSerif4Subhead-Bold.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-serif/SourceSerif4Subhead-BoldIt.otf||182496:1720044433.0": { + "family_name": "Source Serif 4 Subhead", + "font-family": "Source Serif 4 Subhead", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 0, + "full_name": "Source Serif 4 Subhead Bold Italic", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 4, + 7, + 3, + 5, + 4, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-serif/SourceSerif4Subhead-BoldIt.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold Italic", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-serif/SourceSerif4Subhead-ExtraLight.otf||267592:1720044433.0": { + "family_name": "Source Serif 4 Subhead ExtraLight", + "font-family": "Source Serif 4 Subhead ExtraLight", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "200", + "fs_type": 0, + "full_name": "Source Serif 4 Subhead ExtraLight", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 4, + 3, + 3, + 4, + 4, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-serif/SourceSerif4Subhead-ExtraLight.otf", + "preferred_family_name": "Source Serif 4 Subhead", + "preferred_subfamily_name": "ExtraLight", + "subfamily_name": "Regular", + "weight": 200, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-serif/SourceSerif4Subhead-ExtraLightIt.otf||176412:1720044433.0": { + "family_name": "Source Serif 4 Subhead ExtraLight", + "font-family": "Source Serif 4 Subhead ExtraLight", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "200", + "fs_type": 0, + "full_name": "Source Serif 4 Subhead ExtraLight Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 4, + 3, + 3, + 4, + 4, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-serif/SourceSerif4Subhead-ExtraLightIt.otf", + "preferred_family_name": "Source Serif 4 Subhead", + "preferred_subfamily_name": "ExtraLight Italic", + "subfamily_name": "Italic", + "weight": 200, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-serif/SourceSerif4Subhead-It.otf||179776:1720044433.0": { + "family_name": "Source Serif 4 Subhead", + "font-family": "Source Serif 4 Subhead", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Source Serif 4 Subhead Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 4, + 5, + 3, + 5, + 4, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-serif/SourceSerif4Subhead-It.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Italic", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-serif/SourceSerif4Subhead-Light.otf||270416:1720044433.0": { + "family_name": "Source Serif 4 Subhead Light", + "font-family": "Source Serif 4 Subhead Light", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "300", + "fs_type": 0, + "full_name": "Source Serif 4 Subhead Light", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 4, + 4, + 3, + 5, + 4, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-serif/SourceSerif4Subhead-Light.otf", + "preferred_family_name": "Source Serif 4 Subhead", + "preferred_subfamily_name": "Light", + "subfamily_name": "Regular", + "weight": 300, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-serif/SourceSerif4Subhead-LightIt.otf||180108:1720044433.0": { + "family_name": "Source Serif 4 Subhead Light", + "font-family": "Source Serif 4 Subhead Light", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "300", + "fs_type": 0, + "full_name": "Source Serif 4 Subhead Light Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 4, + 4, + 3, + 4, + 4, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-serif/SourceSerif4Subhead-LightIt.otf", + "preferred_family_name": "Source Serif 4 Subhead", + "preferred_subfamily_name": "Light Italic", + "subfamily_name": "Italic", + "weight": 300, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-serif/SourceSerif4Subhead-Regular.otf||272540:1720044433.0": { + "family_name": "Source Serif 4 Subhead", + "font-family": "Source Serif 4 Subhead", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Source Serif 4 Subhead", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": true, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 4, + 5, + 3, + 5, + 4, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-serif/SourceSerif4Subhead-Regular.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-serif/SourceSerif4Subhead-Semibold.otf||277164:1720044433.0": { + "family_name": "Source Serif 4 Subhead Semibold", + "font-family": "Source Serif 4 Subhead Semibold", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "600", + "fs_type": 0, + "full_name": "Source Serif 4 Subhead Semibold", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 4, + 7, + 3, + 5, + 4, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-serif/SourceSerif4Subhead-Semibold.otf", + "preferred_family_name": "Source Serif 4 Subhead", + "preferred_subfamily_name": "Semibold", + "subfamily_name": "Regular", + "weight": 600, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-serif/SourceSerif4Subhead-SemiboldIt.otf||181760:1720044433.0": { + "family_name": "Source Serif 4 Subhead Semibold", + "font-family": "Source Serif 4 Subhead Semibold", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "600", + "fs_type": 0, + "full_name": "Source Serif 4 Subhead Semibold Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 4, + 6, + 3, + 5, + 4, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-serif/SourceSerif4Subhead-SemiboldIt.otf", + "preferred_family_name": "Source Serif 4 Subhead", + "preferred_subfamily_name": "Semibold Italic", + "subfamily_name": "Italic", + "weight": 600, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-serif/SourceSerif4Variable-Italic.otf||1303316:1720044433.0": { + "family_name": "Source Serif 4 Variable", + "font-family": "Source Serif 4 Variable", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Source Serif 4 Variable Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 4, + 5, + 3, + 4, + 4, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-serif/SourceSerif4Variable-Italic.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Italic", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-serif/SourceSerif4Variable-Roman.otf||1884148:1720044433.0": { + "family_name": "Source Serif 4 Variable", + "font-family": "Source Serif 4 Variable", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Source Serif 4 Variable", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 4, + 6, + 3, + 5, + 4, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-serif/SourceSerif4Variable-Roman.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-serif/SourceSerifPro-Black.otf||239188:1720044433.0": { + "family_name": "Source Serif Pro Black", + "font-family": "Source Serif Pro Black", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "900", + "fs_type": 0, + "full_name": "Source Serif Pro Black", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 4, + 9, + 3, + 5, + 4, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-serif/SourceSerifPro-Black.otf", + "preferred_family_name": "Source Serif Pro", + "preferred_subfamily_name": "Black", + "subfamily_name": "Regular", + "weight": 900, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-serif/SourceSerifPro-BlackIt.otf||165908:1720044433.0": { + "family_name": "Source Serif Pro Black", + "font-family": "Source Serif Pro Black", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "900", + "fs_type": 0, + "full_name": "Source Serif Pro Black Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 4, + 9, + 3, + 5, + 4, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-serif/SourceSerifPro-BlackIt.otf", + "preferred_family_name": "Source Serif Pro", + "preferred_subfamily_name": "Black Italic", + "subfamily_name": "Italic", + "weight": 900, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-serif/SourceSerifPro-Bold.otf||241476:1720044433.0": { + "family_name": "Source Serif Pro", + "font-family": "Source Serif Pro", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "Source Serif Pro Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 4, + 8, + 3, + 5, + 4, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-serif/SourceSerifPro-Bold.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-serif/SourceSerifPro-BoldIt.otf||172096:1720044433.0": { + "family_name": "Source Serif Pro", + "font-family": "Source Serif Pro", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 0, + "full_name": "Source Serif Pro Bold Italic", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 4, + 8, + 3, + 5, + 4, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-serif/SourceSerifPro-BoldIt.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold Italic", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-serif/SourceSerifPro-ExtraLight.otf||228772:1720044433.0": { + "family_name": "Source Serif Pro ExtraLight", + "font-family": "Source Serif Pro ExtraLight", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "200", + "fs_type": 0, + "full_name": "Source Serif Pro ExtraLight", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 4, + 2, + 3, + 5, + 4, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-serif/SourceSerifPro-ExtraLight.otf", + "preferred_family_name": "Source Serif Pro", + "preferred_subfamily_name": "ExtraLight", + "subfamily_name": "Regular", + "weight": 200, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-serif/SourceSerifPro-ExtraLightIt.otf||160992:1720044433.0": { + "family_name": "Source Serif Pro ExtraLight", + "font-family": "Source Serif Pro ExtraLight", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "200", + "fs_type": 0, + "full_name": "Source Serif Pro ExtraLight Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 4, + 2, + 3, + 5, + 4, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-serif/SourceSerifPro-ExtraLightIt.otf", + "preferred_family_name": "Source Serif Pro", + "preferred_subfamily_name": "ExtraLight Italic", + "subfamily_name": "Italic", + "weight": 200, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-serif/SourceSerifPro-It.otf||165356:1720044433.0": { + "family_name": "Source Serif Pro", + "font-family": "Source Serif Pro", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Source Serif Pro Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 4, + 6, + 3, + 5, + 4, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-serif/SourceSerifPro-It.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Italic", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-serif/SourceSerifPro-Light.otf||235500:1720044433.0": { + "family_name": "Source Serif Pro Light", + "font-family": "Source Serif Pro Light", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "300", + "fs_type": 0, + "full_name": "Source Serif Pro Light", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 4, + 3, + 3, + 5, + 4, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-serif/SourceSerifPro-Light.otf", + "preferred_family_name": "Source Serif Pro", + "preferred_subfamily_name": "Light", + "subfamily_name": "Regular", + "weight": 300, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-serif/SourceSerifPro-LightIt.otf||167540:1720044433.0": { + "family_name": "Source Serif Pro Light", + "font-family": "Source Serif Pro Light", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "300", + "fs_type": 0, + "full_name": "Source Serif Pro Light Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 4, + 3, + 3, + 5, + 4, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-serif/SourceSerifPro-LightIt.otf", + "preferred_family_name": "Source Serif Pro", + "preferred_subfamily_name": "Light Italic", + "subfamily_name": "Italic", + "weight": 300, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-serif/SourceSerifPro-Regular.otf||236192:1720044433.0": { + "family_name": "Source Serif Pro", + "font-family": "Source Serif Pro", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Source Serif Pro", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": true, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 4, + 6, + 3, + 5, + 4, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-serif/SourceSerifPro-Regular.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-serif/SourceSerifPro-Semibold.otf||239464:1720044433.0": { + "family_name": "Source Serif Pro Semibold", + "font-family": "Source Serif Pro Semibold", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "600", + "fs_type": 0, + "full_name": "Source Serif Pro Semibold", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 4, + 7, + 3, + 5, + 4, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-serif/SourceSerifPro-Semibold.otf", + "preferred_family_name": "Source Serif Pro", + "preferred_subfamily_name": "Semibold", + "subfamily_name": "Regular", + "weight": 600, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-serif/SourceSerifPro-SemiboldIt.otf||172504:1720044433.0": { + "family_name": "Source Serif Pro Semibold", + "font-family": "Source Serif Pro Semibold", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "600", + "fs_type": 0, + "full_name": "Source Serif Pro Semibold Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 4, + 7, + 3, + 5, + 4, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-serif/SourceSerifPro-SemiboldIt.otf", + "preferred_family_name": "Source Serif Pro", + "preferred_subfamily_name": "Semibold Italic", + "subfamily_name": "Italic", + "weight": 600, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-serif/SourceSerifVariable-Italic.otf||296396:1720044433.0": { + "family_name": "Source Serif Variable", + "font-family": "Source Serif Variable", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "389", + "fs_type": 0, + "full_name": "Source Serif Variable Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 4, + 6, + 3, + 5, + 4, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-serif/SourceSerifVariable-Italic.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Italic", + "weight": 389, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/adobe-source-serif/SourceSerifVariable-Roman.otf||458404:1720044433.0": { + "family_name": "Source Serif Variable", + "font-family": "Source Serif Variable", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "389", + "fs_type": 0, + "full_name": "Source Serif Variable", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": true, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 4, + 6, + 3, + 5, + 4, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/adobe-source-serif/SourceSerifVariable-Roman.otf", + "preferred_family_name": null, + "preferred_subfamily_name": "Roman", + "subfamily_name": "Regular", + "weight": 389, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/cantarell/Cantarell-VF.otf||170588:1720749076.0": { + "family_name": "Cantarell", + "font-family": "Cantarell", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Cantarell Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 5, + 3, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/cantarell/Cantarell-VF.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/gargoyle/Gargoyle-Mono-Bold-Italic.ttf||176888:1763372473.0": { + "family_name": "Gargoyle Mono", + "font-family": "Gargoyle Mono", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "600", + "fs_type": 0, + "full_name": "Gargoyle Mono Bold Italic", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 6, + 7, + 9, + 5, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/gargoyle/Gargoyle-Mono-Bold-Italic.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold Italic", + "weight": 600, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/gargoyle/Gargoyle-Mono-Bold.ttf||168396:1763372473.0": { + "family_name": "Gargoyle Mono", + "font-family": "Gargoyle Mono", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "600", + "fs_type": 0, + "full_name": "Gargoyle Mono Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 6, + 7, + 9, + 5, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/gargoyle/Gargoyle-Mono-Bold.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 600, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/gargoyle/Gargoyle-Mono-Italic.ttf||173600:1763372473.0": { + "family_name": "Gargoyle Mono", + "font-family": "Gargoyle Mono", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Gargoyle Mono Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 6, + 6, + 9, + 5, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/gargoyle/Gargoyle-Mono-Italic.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Italic", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/gargoyle/Gargoyle-Mono.ttf||164304:1763372473.0": { + "family_name": "Gargoyle Mono", + "font-family": "Gargoyle Mono", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Gargoyle Mono Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 6, + 6, + 9, + 5, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/gargoyle/Gargoyle-Mono.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/gargoyle/Gargoyle-Serif-Bold-Italic.ttf||1500764:1763372473.0": { + "family_name": "Gargoyle Serif", + "font-family": "Gargoyle Serif", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 0, + "full_name": "Gargoyle Serif Bold Italic", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 0, + 8, + 0, + 7, + 0, + 0, + 9, + 0, + 4 + ], + "path": "/usr/share/fonts/gargoyle/Gargoyle-Serif-Bold-Italic.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold Italic", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/gargoyle/Gargoyle-Serif-Bold.ttf||1439752:1763372473.0": { + "family_name": "Gargoyle Serif", + "font-family": "Gargoyle Serif", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "Gargoyle Serif Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 0, + 8, + 0, + 7, + 0, + 0, + 2, + 0, + 4 + ], + "path": "/usr/share/fonts/gargoyle/Gargoyle-Serif-Bold.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/gargoyle/Gargoyle-Serif-Italic.ttf||1505932:1763372473.0": { + "family_name": "Gargoyle Serif", + "font-family": "Gargoyle Serif", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Gargoyle Serif Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 0, + 6, + 0, + 6, + 0, + 0, + 9, + 0, + 4 + ], + "path": "/usr/share/fonts/gargoyle/Gargoyle-Serif-Italic.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Italic", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/gargoyle/Gargoyle-Serif.ttf||1504176:1763372473.0": { + "family_name": "Gargoyle Serif", + "font-family": "Gargoyle Serif", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Gargoyle Serif Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 0, + 5, + 0, + 6, + 0, + 0, + 2, + 0, + 4 + ], + "path": "/usr/share/fonts/gargoyle/Gargoyle-Serif.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/gsfonts/C059-BdIta.otf||103444:1759628689.0": { + "family_name": "C059", + "font-family": "C059", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 4, + "full_name": "C059-BdIta", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 0, + 0, + 8, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/gsfonts/C059-BdIta.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold Italic", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/gsfonts/C059-Bold.otf||100692:1759628689.0": { + "family_name": "C059", + "font-family": "C059", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 4, + "full_name": "C059-Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 0, + 0, + 8, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/gsfonts/C059-Bold.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/gsfonts/C059-Italic.otf||101324:1759628689.0": { + "family_name": "C059", + "font-family": "C059", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 4, + "full_name": "C059-Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 0, + 0, + 5, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/gsfonts/C059-Italic.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Italic", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/gsfonts/C059-Roman.otf||97476:1759628689.0": { + "family_name": "C059", + "font-family": "C059", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 4, + "full_name": "C059-Roman", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": true, + "is_wws": false, + "os2_version": 3, + "panose": [ + 0, + 0, + 5, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/gsfonts/C059-Roman.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Roman", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/gsfonts/D050000L.otf||29832:1759628689.0": { + "family_name": "D050000L", + "font-family": "D050000L", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "D050000L", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": true, + "is_wws": false, + "os2_version": 3, + "panose": [ + 1, + 1, + 6, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ], + "path": "/usr/share/fonts/gsfonts/D050000L.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/gsfonts/NimbusMonoPS-Bold.otf||87520:1759628689.0": { + "family_name": "Nimbus Mono PS", + "font-family": "Nimbus Mono PS", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 4, + "full_name": "NimbusMonoPS-Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 0, + 0, + 8, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/gsfonts/NimbusMonoPS-Bold.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/gsfonts/NimbusMonoPS-BoldItalic.otf||89580:1759628689.0": { + "family_name": "Nimbus Mono PS", + "font-family": "Nimbus Mono PS", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 4, + "full_name": "NimbusMonoPS-BoldItalic", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 0, + 0, + 8, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/gsfonts/NimbusMonoPS-BoldItalic.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold Italic", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/gsfonts/NimbusMonoPS-Italic.otf||82648:1759628689.0": { + "family_name": "Nimbus Mono PS", + "font-family": "Nimbus Mono PS", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 4, + "full_name": "NimbusMonoPS-Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 0, + 0, + 5, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/gsfonts/NimbusMonoPS-Italic.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Italic", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/gsfonts/NimbusMonoPS-Regular.otf||77936:1759628689.0": { + "family_name": "Nimbus Mono PS", + "font-family": "Nimbus Mono PS", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 4, + "full_name": "NimbusMonoPS-Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": true, + "is_wws": false, + "os2_version": 3, + "panose": [ + 0, + 0, + 5, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/gsfonts/NimbusMonoPS-Regular.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/gsfonts/NimbusRoman-Bold.otf||100984:1759628689.0": { + "family_name": "Nimbus Roman", + "font-family": "Nimbus Roman", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 4, + "full_name": "NimbusRoman-Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 0, + 0, + 8, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/gsfonts/NimbusRoman-Bold.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/gsfonts/NimbusRoman-BoldItalic.otf||104772:1759628689.0": { + "family_name": "Nimbus Roman", + "font-family": "Nimbus Roman", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 4, + "full_name": "NimbusRoman-BoldItalic", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 0, + 0, + 8, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/gsfonts/NimbusRoman-BoldItalic.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold Italic", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/gsfonts/NimbusRoman-Italic.otf||105684:1759628689.0": { + "family_name": "Nimbus Roman", + "font-family": "Nimbus Roman", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 4, + "full_name": "NimbusRoman-Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 0, + 0, + 5, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/gsfonts/NimbusRoman-Italic.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Italic", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/gsfonts/NimbusRoman-Regular.otf||98200:1759628689.0": { + "family_name": "Nimbus Roman", + "font-family": "Nimbus Roman", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 4, + "full_name": "NimbusRoman-Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": true, + "is_wws": false, + "os2_version": 3, + "panose": [ + 0, + 0, + 5, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/gsfonts/NimbusRoman-Regular.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/gsfonts/NimbusSans-Bold.otf||83264:1759628689.0": { + "family_name": "Nimbus Sans", + "font-family": "Nimbus Sans", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 4, + "full_name": "NimbusSans-Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 0, + 0, + 8, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/gsfonts/NimbusSans-Bold.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/gsfonts/NimbusSans-BoldItalic.otf||95396:1759628689.0": { + "family_name": "Nimbus Sans", + "font-family": "Nimbus Sans", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 4, + "full_name": "NimbusSans-BoldItalic", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 0, + 0, + 8, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/gsfonts/NimbusSans-BoldItalic.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold Italic", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/gsfonts/NimbusSans-Italic.otf||95244:1759628689.0": { + "family_name": "Nimbus Sans", + "font-family": "Nimbus Sans", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 4, + "full_name": "NimbusSans-Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 0, + 0, + 5, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/gsfonts/NimbusSans-Italic.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Italic", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/gsfonts/NimbusSans-Regular.otf||82264:1759628689.0": { + "family_name": "Nimbus Sans", + "font-family": "Nimbus Sans", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 4, + "full_name": "NimbusSans-Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": true, + "is_wws": false, + "os2_version": 3, + "panose": [ + 0, + 0, + 5, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/gsfonts/NimbusSans-Regular.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/gsfonts/NimbusSansNarrow-Bold.otf||81340:1759628689.0": { + "family_name": "Nimbus Sans Narrow", + "font-family": "Nimbus Sans Narrow", + "font-stretch": "semi-condensed", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 4, + "full_name": "NimbusSansNarrow-Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 0, + 0, + 8, + 6, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/gsfonts/NimbusSansNarrow-Bold.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 4, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/gsfonts/NimbusSansNarrow-BoldOblique.otf||87956:1759628689.0": { + "family_name": "Nimbus Sans Narrow", + "font-family": "Nimbus Sans Narrow", + "font-stretch": "semi-condensed", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 4, + "full_name": "NimbusSansNarrow-BoldOblique", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 0, + 0, + 8, + 6, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/gsfonts/NimbusSansNarrow-BoldOblique.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold Oblique", + "weight": 700, + "width": 4, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/gsfonts/NimbusSansNarrow-Oblique.otf||87068:1759628689.0": { + "family_name": "Nimbus Sans Narrow", + "font-family": "Nimbus Sans Narrow", + "font-stretch": "semi-condensed", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 4, + "full_name": "NimbusSansNarrow-Oblique", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 0, + 0, + 5, + 6, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/gsfonts/NimbusSansNarrow-Oblique.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Oblique", + "weight": 400, + "width": 4, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/gsfonts/NimbusSansNarrow-Regular.otf||80864:1759628689.0": { + "family_name": "Nimbus Sans Narrow", + "font-family": "Nimbus Sans Narrow", + "font-stretch": "semi-condensed", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 4, + "full_name": "NimbusSansNarrow-Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": true, + "is_wws": false, + "os2_version": 3, + "panose": [ + 0, + 0, + 5, + 6, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/gsfonts/NimbusSansNarrow-Regular.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 4, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/gsfonts/P052-Bold.otf||110980:1759628689.0": { + "family_name": "P052", + "font-family": "P052", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 4, + "full_name": "P052-Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 0, + 0, + 8, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/gsfonts/P052-Bold.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/gsfonts/P052-BoldItalic.otf||110928:1759628689.0": { + "family_name": "P052", + "font-family": "P052", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 4, + "full_name": "P052-BoldItalic", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 0, + 0, + 8, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/gsfonts/P052-BoldItalic.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold Italic", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/gsfonts/P052-Italic.otf||109824:1759628689.0": { + "family_name": "P052", + "font-family": "P052", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 4, + "full_name": "P052-Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 0, + 0, + 5, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/gsfonts/P052-Italic.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Italic", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/gsfonts/P052-Roman.otf||110236:1759628689.0": { + "family_name": "P052", + "font-family": "P052", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 4, + "full_name": "P052-Roman", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": true, + "is_wws": false, + "os2_version": 3, + "panose": [ + 0, + 0, + 5, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/gsfonts/P052-Roman.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Roman", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/gsfonts/StandardSymbolsPS.otf||21176:1759628689.0": { + "family_name": "Standard Symbols PS", + "font-family": "Standard Symbols PS", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 4, + "full_name": "Standard Symbols PS", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": true, + "is_wws": false, + "os2_version": 3, + "panose": [ + 5, + 5, + 1, + 2, + 1, + 7, + 6, + 2, + 5, + 7 + ], + "path": "/usr/share/fonts/gsfonts/StandardSymbolsPS.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/gsfonts/URWBookman-Demi.otf||97208:1759628689.0": { + "family_name": "URW Bookman", + "font-family": "URW Bookman", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "600", + "fs_type": 4, + "full_name": "URWBookman-Demi", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 0, + 0, + 7, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/gsfonts/URWBookman-Demi.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Demi", + "weight": 600, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/gsfonts/URWBookman-DemiItalic.otf||101584:1759628689.0": { + "family_name": "URW Bookman", + "font-family": "URW Bookman", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "600", + "fs_type": 4, + "full_name": "URWBookman-DemiItalic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 0, + 0, + 7, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/gsfonts/URWBookman-DemiItalic.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Demi Italic", + "weight": 600, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/gsfonts/URWBookman-Light.otf||98396:1759628689.0": { + "family_name": "URW Bookman", + "font-family": "URW Bookman", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "300", + "fs_type": 4, + "full_name": "URWBookman-Light", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 0, + 0, + 4, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/gsfonts/URWBookman-Light.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Light", + "weight": 300, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/gsfonts/URWBookman-LightItalic.otf||102764:1759628689.0": { + "family_name": "URW Bookman", + "font-family": "URW Bookman", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "300", + "fs_type": 4, + "full_name": "URWBookman-LightItalic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 0, + 0, + 4, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/gsfonts/URWBookman-LightItalic.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Light Italic", + "weight": 300, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/gsfonts/URWGothic-Book.otf||82968:1759628689.0": { + "family_name": "URW Gothic", + "font-family": "URW Gothic", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 4, + "full_name": "URWGothic-Book", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": true, + "is_wws": false, + "os2_version": 3, + "panose": [ + 0, + 0, + 5, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/gsfonts/URWGothic-Book.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Book", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/gsfonts/URWGothic-BookOblique.otf||85336:1759628689.0": { + "family_name": "URW Gothic", + "font-family": "URW Gothic", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 4, + "full_name": "URWGothic-BookOblique", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 0, + 0, + 5, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/gsfonts/URWGothic-BookOblique.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Book Oblique", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/gsfonts/URWGothic-Demi.otf||83580:1759628689.0": { + "family_name": "URW Gothic", + "font-family": "URW Gothic", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "600", + "fs_type": 4, + "full_name": "URWGothic-Demi", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 0, + 0, + 7, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/gsfonts/URWGothic-Demi.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Demi", + "weight": 600, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/gsfonts/URWGothic-DemiOblique.otf||86232:1759628689.0": { + "family_name": "URW Gothic", + "font-family": "URW Gothic", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "600", + "fs_type": 4, + "full_name": "URWGothic-DemiOblique", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 0, + 0, + 7, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/gsfonts/URWGothic-DemiOblique.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Demi Oblique", + "weight": 600, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/gsfonts/Z003-MediumItalic.otf||114052:1759628689.0": { + "family_name": "Z003", + "font-family": "Z003", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "500", + "fs_type": 4, + "full_name": "Z003-MediumItalic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": true, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 0, + 0, + 6, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/gsfonts/Z003-MediumItalic.otf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Medium Italic", + "weight": 500, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/liberation/LiberationMono-Bold.ttf||308068:1720827900.0": { + "family_name": "Liberation Mono", + "font-family": "Liberation Mono", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "Liberation Mono Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 7, + 7, + 9, + 2, + 2, + 5, + 2, + 4, + 4 + ], + "path": "/usr/share/fonts/liberation/LiberationMono-Bold.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/liberation/LiberationMono-BoldItalic.ttf||284184:1720827900.0": { + "family_name": "Liberation Mono", + "font-family": "Liberation Mono", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 0, + "full_name": "Liberation Mono Bold Italic", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 7, + 7, + 9, + 2, + 2, + 5, + 9, + 4, + 4 + ], + "path": "/usr/share/fonts/liberation/LiberationMono-BoldItalic.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold Italic", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/liberation/LiberationMono-Italic.ttf||281608:1720827900.0": { + "family_name": "Liberation Mono", + "font-family": "Liberation Mono", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Liberation Mono Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 7, + 4, + 9, + 2, + 2, + 5, + 9, + 4, + 4 + ], + "path": "/usr/share/fonts/liberation/LiberationMono-Italic.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Italic", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/liberation/LiberationMono-Regular.ttf||319624:1720827900.0": { + "family_name": "Liberation Mono", + "font-family": "Liberation Mono", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Liberation Mono", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 7, + 4, + 9, + 2, + 2, + 5, + 2, + 4, + 4 + ], + "path": "/usr/share/fonts/liberation/LiberationMono-Regular.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/liberation/LiberationSans-Bold.ttf||414568:1720827900.0": { + "family_name": "Liberation Sans", + "font-family": "Liberation Sans", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "Liberation Sans Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 11, + 7, + 4, + 2, + 2, + 2, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/liberation/LiberationSans-Bold.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/liberation/LiberationSans-BoldItalic.ttf||409108:1720827900.0": { + "family_name": "Liberation Sans", + "font-family": "Liberation Sans", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 0, + "full_name": "Liberation Sans Bold Italic", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 11, + 7, + 4, + 2, + 2, + 2, + 9, + 2, + 4 + ], + "path": "/usr/share/fonts/liberation/LiberationSans-BoldItalic.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold Italic", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/liberation/LiberationSans-Italic.ttf||415920:1720827900.0": { + "family_name": "Liberation Sans", + "font-family": "Liberation Sans", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Liberation Sans Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 11, + 6, + 4, + 2, + 2, + 2, + 9, + 2, + 4 + ], + "path": "/usr/share/fonts/liberation/LiberationSans-Italic.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Italic", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/liberation/LiberationSans-Regular.ttf||410820:1720827900.0": { + "family_name": "Liberation Sans", + "font-family": "Liberation Sans", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Liberation Sans", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 11, + 6, + 4, + 2, + 2, + 2, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/liberation/LiberationSans-Regular.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/liberation/LiberationSerif-Bold.ttf||370196:1720827900.0": { + "family_name": "Liberation Serif", + "font-family": "Liberation Serif", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "Liberation Serif Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 2, + 8, + 3, + 7, + 5, + 5, + 2, + 3, + 4 + ], + "path": "/usr/share/fonts/liberation/LiberationSerif-Bold.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/liberation/LiberationSerif-BoldItalic.ttf||376892:1720827900.0": { + "family_name": "Liberation Serif", + "font-family": "Liberation Serif", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 0, + "full_name": "Liberation Serif Bold Italic", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 2, + 7, + 3, + 6, + 5, + 5, + 9, + 3, + 4 + ], + "path": "/usr/share/fonts/liberation/LiberationSerif-BoldItalic.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold Italic", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/liberation/LiberationSerif-Italic.ttf||375760:1720827900.0": { + "family_name": "Liberation Serif", + "font-family": "Liberation Serif", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Liberation Serif Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 2, + 5, + 3, + 5, + 4, + 5, + 9, + 3, + 4 + ], + "path": "/usr/share/fonts/liberation/LiberationSerif-Italic.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Italic", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/liberation/LiberationSerif-Regular.ttf||393692:1720827900.0": { + "family_name": "Liberation Serif", + "font-family": "Liberation Serif", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Liberation Serif", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 2, + 6, + 3, + 5, + 4, + 5, + 2, + 3, + 4 + ], + "path": "/usr/share/fonts/liberation/LiberationSerif-Regular.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/libertinus/LibertinusKeyboard-Regular.ttf||204448:1727393489.0": { + "family_name": "Libertinus Keyboard", + "font-family": "Libertinus Keyboard", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "Libertinus Keyboard Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/libertinus/LibertinusKeyboard-Regular.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/libertinus/LibertinusMath-Regular.ttf||1229260:1727393489.0": { + "family_name": "Libertinus Math", + "font-family": "Libertinus Math", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Libertinus Math Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/libertinus/LibertinusMath-Regular.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/libertinus/LibertinusMono-Regular.ttf||153992:1727393489.0": { + "family_name": "Libertinus Mono", + "font-family": "Libertinus Mono", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Libertinus Mono Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/libertinus/LibertinusMono-Regular.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/libertinus/LibertinusSans-Bold.ttf||453840:1727393489.0": { + "family_name": "Libertinus Sans", + "font-family": "Libertinus Sans", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "Libertinus Sans Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/libertinus/LibertinusSans-Bold.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/libertinus/LibertinusSans-Italic.ttf||625672:1727393489.0": { + "family_name": "Libertinus Sans", + "font-family": "Libertinus Sans", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Libertinus Sans Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/libertinus/LibertinusSans-Italic.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Italic", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/libertinus/LibertinusSans-Regular.ttf||424224:1727393489.0": { + "family_name": "Libertinus Sans", + "font-family": "Libertinus Sans", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Libertinus Sans Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/libertinus/LibertinusSans-Regular.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/libertinus/LibertinusSerif-Bold.ttf||462900:1727393489.0": { + "family_name": "Libertinus Serif", + "font-family": "Libertinus Serif", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "Libertinus Serif Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/libertinus/LibertinusSerif-Bold.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/libertinus/LibertinusSerif-BoldItalic.ttf||499608:1727393489.0": { + "family_name": "Libertinus Serif", + "font-family": "Libertinus Serif", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 0, + "full_name": "Libertinus Serif Bold Italic", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/libertinus/LibertinusSerif-BoldItalic.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold Italic", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/libertinus/LibertinusSerif-Italic.ttf||586600:1727393489.0": { + "family_name": "Libertinus Serif", + "font-family": "Libertinus Serif", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Libertinus Serif Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/libertinus/LibertinusSerif-Italic.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Italic", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/libertinus/LibertinusSerif-Regular.ttf||560864:1727393489.0": { + "family_name": "Libertinus Serif", + "font-family": "Libertinus Serif", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Libertinus Serif Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/libertinus/LibertinusSerif-Regular.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/libertinus/LibertinusSerif-Semibold.ttf||456324:1727393489.0": { + "family_name": "Libertinus Serif Semibold", + "font-family": "Libertinus Serif Semibold", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "600", + "fs_type": 0, + "full_name": "Libertinus Serif Semibold", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/libertinus/LibertinusSerif-Semibold.ttf", + "preferred_family_name": "Libertinus Serif", + "preferred_subfamily_name": "Semibold", + "subfamily_name": "Regular", + "weight": 600, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/libertinus/LibertinusSerif-SemiboldItalic.ttf||582032:1727393489.0": { + "family_name": "Libertinus Serif Semibold Italic", + "font-family": "Libertinus Serif Semibold Italic", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "600", + "fs_type": 0, + "full_name": "Libertinus Serif Semibold Italic", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/libertinus/LibertinusSerif-SemiboldItalic.ttf", + "preferred_family_name": "Libertinus Serif", + "preferred_subfamily_name": "Semibold Italic", + "subfamily_name": "Regular", + "weight": 600, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/libertinus/LibertinusSerifDisplay-Regular.ttf||728776:1727393489.0": { + "family_name": "Libertinus Serif Display", + "font-family": "Libertinus Serif Display", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Libertinus Serif Display Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/libertinus/LibertinusSerifDisplay-Regular.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/libertinus/LibertinusSerifInitials-Regular.ttf||323892:1727393489.0": { + "family_name": "Libertinus Serif Initials", + "font-family": "Libertinus Serif Initials", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Libertinus Serif Initials Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/libertinus/LibertinusSerifInitials-Regular.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/noto/NotoColorEmoji.ttf||10673480:1758002085.0": { + "family_name": "Noto Color Emoji", + "font-family": "Noto Color Emoji", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Noto Color Emoji", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 6, + 9, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/noto/NotoColorEmoji.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + } + }, + "version": 2 +}
\ No newline at end of file diff --git a/dotfiles/common/.config/calibre/global.py.json b/dotfiles/common/.config/calibre/global.py.json new file mode 100644 index 0000000..e44de2c --- /dev/null +++ b/dotfiles/common/.config/calibre/global.py.json @@ -0,0 +1,82 @@ +{ + "add_formats_to_existing": false, + "case_sensitive": false, + "check_for_dupes_on_ctl": false, + "database_path": "/home/cjennings/library1.db", + "filename_pattern": "(?P<title>.+) - (?P<author>[^_]+)", + "input_format_order": [ + "EPUB", + "PDF", + "AZW3", + "MOBI", + "LIT", + "PRC", + "FB2", + "HTML", + "HTM", + "XHTM", + "SHTML", + "XHTML", + "ZIP", + "DOCX", + "ODT", + "RTF", + "TXT", + "CB7", + "SHTM", + "SNB", + "PMLZ", + "TCR", + "FBZ", + "DJVU", + "DOCM", + "LRF", + "TXTZ", + "KEPUB", + "POBI", + "PDB", + "CHM", + "CBR", + "HTMLZ", + "RB", + "MD", + "CBC", + "MARKDOWN", + "TEXT", + "AZW", + "UPDB", + "RECIPE", + "PML", + "DOWNLOADED_RECIPE", + "TEXTILE", + "RAR", + "CBZ", + "OPF", + "AZW4", + "DJV" + ], + "installation_uuid": "4c998702-215a-4787-a019-abdee4cdf53c", + "isbndb_com_key": "", + "language": "en", + "library_path": "/home/cjennings/archive/books", + "limit_search_columns": false, + "limit_search_columns_to": [ + "title", + "authors", + "tags", + "publisher" + ], + "manage_device_metadata": "manual", + "mark_new_books": true, + "migrated": false, + "network_timeout": 5, + "new_book_tags": [], + "numeric_collation": false, + "output_format": "epub", + "read_file_metadata": true, + "saved_searches": {}, + "swap_author_names": false, + "use_primary_find_in_search": true, + "user_categories": {}, + "worker_process_priority": "normal" +}
\ No newline at end of file diff --git a/dotfiles/common/.config/calibre/gui.py.json b/dotfiles/common/.config/calibre/gui.py.json new file mode 100644 index 0000000..bfe8d92 --- /dev/null +++ b/dotfiles/common/.config/calibre/gui.py.json @@ -0,0 +1,115 @@ +{ + "LRF_conversion_defaults": [], + "LRF_ebook_viewer_options": null, + "asked_library_thing_password": false, + "auto_download_cover": false, + "autolaunch_server": false, + "column_map": [ + "title", + "ondevice", + "authors", + "size", + "timestamp", + "rating", + "publisher", + "tags", + "series", + "pubdate" + ], + "confirm_delete": false, + "cover_flow_queue_length": 6, + "default_send_to_device_action": "DeviceAction:main::False:False", + "delete_news_from_library_on_upload": false, + "disable_animations": true, + "disable_tray_notification": false, + "enforce_cpu_limit": true, + "get_social_metadata": true, + "gui_layout": "wide", + "highlight_search_matches": false, + "internally_viewed_formats": [ + "AZW", + "AZW3", + "FB2", + "FBZ", + "HTML", + "HTMLZ", + "KEPUB", + "LIT", + "LRF", + "MOBI", + "PDB", + "POBI", + "PRC", + "RB", + "SNB" + ], + "jobs_search_history": [], + "lrf_viewer_search_history": [], + "main_search_history": [ + "author:kant", + "title:critique of pure reason", + "title critique of pure reason", + "title:being and time", + "heidegger basic writings", + "title:question concerning technology", + "tag:epub", + "question concerning technology heidegger", + "poetry language thought heidegger", + "basic writings heidegger", + "author:corrington", + "author:stanley", + "Marco", + "format:epub", + "publisher:nolo", + "author:heidegger format:epub", + "author:heidegger", + "author:ibsen", + "author:simenon", + "title:nexus", + "format:pdf tags:philosophy #reviewed:true", + "format:pdf tags:literature #reviewed:true", + "format:epub tags:literature #reviewed:true", + "format:epub tags:philosophy #reviewed:true", + "format:epub tags:philosophy #reviewed" + ], + "main_window_geometry": null, + "match_tags_type": "any", + "new_version_notification": false, + "oldest_news": 0, + "overwrite_author_title_metadata": true, + "plugin_search_history": [ + "kobo", + "covers", + "cover", + "rsync" + ], + "save_to_disk_template_history": [ + "{author_sort}/{title}/{title} - {authors}" + ], + "scheduler_search_history": [ + "Jacobin", + "New Republic" + ], + "search_as_you_type": false, + "send_to_device_template_history": [], + "send_to_storage_card_by_default": false, + "separate_cover_flow": false, + "shortcuts_search_history": [ + "quit", + "quickview", + "q" + ], + "show_avg_rating": true, + "sort_tags_by": "name", + "systray_icon": false, + "tag_browser_hidden_categories": { + "__class__": "set", + "__value__": [] + }, + "tweaks_search_history": [], + "upload_news_to_device": false, + "use_roman_numerals_for_series_number": false, + "viewer_search_history": [], + "viewer_toc_search_history": [], + "worker_limit": 6 +}
\ No newline at end of file diff --git a/dotfiles/common/.config/calibre/history.plist b/dotfiles/common/.config/calibre/history.plist new file mode 100644 index 0000000..14189a8 --- /dev/null +++ b/dotfiles/common/.config/calibre/history.plist @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>lineedit_history_choose_library_dialog</key> + <array> + <string>/home/cjennings/sync/books</string> + <string>/home/cjennings/archive/books</string> + <string>/home/cjennings/books</string> + <string>/home/cjennings/Library</string> + </array> + <key>lineedit_history_preferences_setting_auto_add_path</key> + <array> + <string>/home/cjennings/downloads/ebooks</string> + <string>/home/cjennings/</string> + <string>/home/cjennings/Downloads/ebooks</string> + <string>/home/cjennings/Downloads/eBooks</string> + <string>/home/cjennings/Documents/eBooks</string> + </array> + <key>lineedit_history_store_config_chooser_query</key> + <array/> + <key>lineedit_history_tag_browser_search</key> + <array/> +</dict> +</plist> diff --git a/dotfiles/common/.config/calibre/icons-any.rcc b/dotfiles/common/.config/calibre/icons-any.rcc Binary files differnew file mode 100644 index 0000000..2c2f7d2 --- /dev/null +++ b/dotfiles/common/.config/calibre/icons-any.rcc diff --git a/dotfiles/common/.config/calibre/icons-dark.rcc b/dotfiles/common/.config/calibre/icons-dark.rcc Binary files differnew file mode 100644 index 0000000..28b9a51 --- /dev/null +++ b/dotfiles/common/.config/calibre/icons-dark.rcc diff --git a/dotfiles/common/.config/calibre/metadata-sources-cache.json b/dotfiles/common/.config/calibre/metadata-sources-cache.json new file mode 100644 index 0000000..8424645 --- /dev/null +++ b/dotfiles/common/.config/calibre/metadata-sources-cache.json @@ -0,0 +1,18 @@ +{ + "amazon": "#!/usr/bin/env python\n# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai\n# License: GPLv3 Copyright: 2011, Kovid Goyal <kovid at kovidgoyal.net>\nfrom __future__ import absolute_import, division, print_function, unicode_literals\n\nimport re\nimport socket\nimport string\nimport time\nfrom functools import partial\n\ntry:\n from queue import Empty, Queue\nexcept ImportError:\n from Queue import Empty, Queue\n\nfrom threading import Thread\n\ntry:\n from urllib.parse import urlparse\nexcept ImportError:\n from urlparse import urlparse\n\nfrom mechanize import HTTPError\n\nfrom calibre import as_unicode, browser, random_user_agent, xml_replace_entities\nfrom calibre.ebooks.metadata import check_isbn\nfrom calibre.ebooks.metadata.book.base import Metadata\nfrom calibre.ebooks.metadata.sources.base import Option, Source, fixauthors, fixcase\nfrom calibre.utils.icu import lower as icu_lower\nfrom calibre.utils.localization import canonicalize_lang\nfrom calibre.utils.random_ua import accept_header_for_ua\n\n\ndef sort_matches_preferring_kindle_editions(matches):\n upos_map = {url:i for i, url in enumerate(matches)}\n\n def skey(url):\n opos = upos_map[url]\n parts = url.split('/')\n try:\n idx = parts.index('dp')\n except Exception:\n idx = -1\n if idx < 0 or idx + 1 >= len(parts) or not parts[idx+1].startswith('B'):\n return 1, opos\n return 0, opos\n matches.sort(key=skey)\n return matches\n\n\ndef iri_quote_plus(url):\n from calibre.ebooks.oeb.base import urlquote\n ans = urlquote(url)\n if isinstance(ans, bytes):\n ans = ans.decode('utf-8')\n return ans.replace('%20', '+')\n\n\ndef user_agent_is_ok(ua):\n return 'Mobile/' not in ua and 'Mobile ' not in ua\n\n\nclass CaptchaError(Exception):\n pass\n\n\nclass SearchFailed(ValueError):\n pass\n\n\nclass UrlNotFound(ValueError):\n\n def __init__(self, url):\n ValueError.__init__(self, 'The URL {} was not found (HTTP 404)'.format(url))\n\n\nclass UrlTimedOut(ValueError):\n\n def __init__(self, url):\n ValueError.__init__(self, 'Timed out fetching {} try again later'.format(url))\n\n\ndef parse_html(raw):\n try:\n from html5_parser import parse\n except ImportError:\n # Old versions of calibre\n import html5lib\n return html5lib.parse(raw, treebuilder='lxml', namespaceHTMLElements=False)\n else:\n return parse(raw)\n\n\ndef parse_details_page(url, log, timeout, browser, domain):\n from lxml.html import tostring\n\n from calibre.ebooks.chardet import xml_to_unicode\n from calibre.utils.cleantext import clean_ascii_chars\n try:\n from calibre.ebooks.metadata.sources.update import search_engines_module\n get_data_for_cached_url = search_engines_module().get_data_for_cached_url\n except Exception:\n def get_data_for_cached_url(*a):\n return None\n raw = get_data_for_cached_url(url)\n if raw:\n log('Using cached details for url:', url)\n else:\n log('Downloading details from:', url)\n try:\n raw = browser.open_novisit(url, timeout=timeout).read().strip()\n except Exception as e:\n if callable(getattr(e, 'getcode', None)) and e.getcode() == 404:\n log.error('URL not found: %r' % url)\n raise UrlNotFound(url)\n attr = getattr(e, 'args', [None])\n attr = attr if attr else [None]\n if isinstance(attr[0], socket.timeout):\n msg = 'Details page timed out. Try again later.'\n log.error(msg)\n raise UrlTimedOut(url)\n else:\n msg = 'Failed to make details query: %r' % url\n log.exception(msg)\n raise ValueError('Could not make details query for {}'.format(url))\n\n oraw = raw\n if 'amazon.com.br' in url:\n # amazon.com.br serves utf-8 but has an incorrect latin1 <meta> tag\n raw = raw.decode('utf-8')\n raw = xml_to_unicode(raw, strip_encoding_pats=True,\n resolve_entities=True)[0]\n if '<title>404 - ' in raw:\n raise ValueError('Got a 404 page for: %r' % url)\n if '>Could not find the requested document in the cache.<' in raw:\n raise ValueError('No cached entry for %s found' % url)\n\n try:\n root = parse_html(clean_ascii_chars(raw))\n except Exception:\n msg = 'Failed to parse amazon details page: %r' % url\n log.exception(msg)\n raise ValueError(msg)\n if domain == 'jp':\n for a in root.xpath('//a[@href]'):\n if ('black-curtain-redirect.html' in a.get('href')) or ('/black-curtain/save-eligibility/black-curtain' in a.get('href')):\n url = a.get('href')\n if url:\n if url.startswith('/'):\n url = 'https://amazon.co.jp' + a.get('href')\n log('Black curtain redirect found, following')\n return parse_details_page(url, log, timeout, browser, domain)\n\n errmsg = root.xpath('//*[@id=\"errorMessage\"]')\n if errmsg:\n msg = 'Failed to parse amazon details page: %r' % url\n msg += tostring(errmsg, method='text', encoding='unicode').strip()\n log.error(msg)\n raise ValueError(msg)\n\n from css_selectors import Select\n selector = Select(root)\n return oraw, root, selector\n\n\ndef parse_asin(root, log, url):\n try:\n link = root.xpath('//link[@rel=\"canonical\" and @href]')\n for l in link:\n return l.get('href').rpartition('/')[-1]\n except Exception:\n log.exception('Error parsing ASIN for url: %r' % url)\n\n\nclass Worker(Thread): # Get details {{{\n\n '''\n Get book details from amazons book page in a separate thread\n '''\n\n def __init__(self, url, result_queue, browser, log, relevance, domain,\n plugin, timeout=20, testing=False, preparsed_root=None,\n cover_url_processor=None, filter_result=None):\n Thread.__init__(self)\n self.cover_url_processor = cover_url_processor\n self.preparsed_root = preparsed_root\n self.daemon = True\n self.testing = testing\n self.url, self.result_queue = url, result_queue\n self.log, self.timeout = log, timeout\n self.filter_result = filter_result or (lambda x, log: True)\n self.relevance, self.plugin = relevance, plugin\n self.browser = browser\n self.cover_url = self.amazon_id = self.isbn = None\n self.domain = domain\n from lxml.html import tostring\n self.tostring = tostring\n\n months = { # {{{\n 'de': {\n 1: ['jän', 'januar'],\n 2: ['februar'],\n 3: ['märz'],\n 5: ['mai'],\n 6: ['juni'],\n 7: ['juli'],\n 10: ['okt', 'oktober'],\n 12: ['dez', 'dezember']\n },\n 'it': {\n 1: ['gennaio', 'enn'],\n 2: ['febbraio', 'febbr'],\n 3: ['marzo'],\n 4: ['aprile'],\n 5: ['maggio', 'magg'],\n 6: ['giugno'],\n 7: ['luglio'],\n 8: ['agosto', 'ag'],\n 9: ['settembre', 'sett'],\n 10: ['ottobre', 'ott'],\n 11: ['novembre'],\n 12: ['dicembre', 'dic'],\n },\n 'fr': {\n 1: ['janv'],\n 2: ['févr'],\n 3: ['mars'],\n 4: ['avril'],\n 5: ['mai'],\n 6: ['juin'],\n 7: ['juil'],\n 8: ['août'],\n 9: ['sept'],\n 10: ['oct', 'octobre'],\n 11: ['nov', 'novembre'],\n 12: ['déc', 'décembre'],\n },\n 'br': {\n 1: ['janeiro'],\n 2: ['fevereiro'],\n 3: ['março'],\n 4: ['abril'],\n 5: ['maio'],\n 6: ['junho'],\n 7: ['julho'],\n 8: ['agosto'],\n 9: ['setembro'],\n 10: ['outubro'],\n 11: ['novembro'],\n 12: ['dezembro'],\n },\n 'es': {\n 1: ['enero'],\n 2: ['febrero'],\n 3: ['marzo'],\n 4: ['abril'],\n 5: ['mayo'],\n 6: ['junio'],\n 7: ['julio'],\n 8: ['agosto'],\n 9: ['septiembre', 'setiembre'],\n 10: ['octubre'],\n 11: ['noviembre'],\n 12: ['diciembre'],\n },\n 'se': {\n 1: ['januari'],\n 2: ['februari'],\n 3: ['mars'],\n 4: ['april'],\n 5: ['maj'],\n 6: ['juni'],\n 7: ['juli'],\n 8: ['augusti'],\n 9: ['september'],\n 10: ['oktober'],\n 11: ['november'],\n 12: ['december'],\n },\n 'jp': {\n 1: ['1月'],\n 2: ['2月'],\n 3: ['3月'],\n 4: ['4月'],\n 5: ['5月'],\n 6: ['6月'],\n 7: ['7月'],\n 8: ['8月'],\n 9: ['9月'],\n 10: ['10月'],\n 11: ['11月'],\n 12: ['12月'],\n },\n 'nl': {\n 1: ['januari'], 2: ['februari'], 3: ['maart'], 5: ['mei'], 6: ['juni'], 7: ['juli'], 8: ['augustus'], 10: ['oktober'],\n }\n\n } # }}}\n\n self.english_months = [None, 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',\n 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']\n self.months = months.get(self.domain, {})\n\n self.pd_xpath = '''\n //h2[text()=\"Product Details\" or \\\n text()=\"Produktinformation\" or \\\n text()=\"Dettagli prodotto\" or \\\n text()=\"Product details\" or \\\n text()=\"Détails sur le produit\" or \\\n text()=\"Detalles del producto\" or \\\n text()=\"Detalhes do produto\" or \\\n text()=\"Productgegevens\" or \\\n text()=\"基本信æ¯\" or \\\n starts-with(text(), \"ç™»éŒ²æƒ…å ±\")]/../div[@class=\"content\"]\n '''\n # Editor: is for Spanish\n self.publisher_xpath = '''\n descendant::*[starts-with(text(), \"Publisher:\") or \\\n starts-with(text(), \"Verlag:\") or \\\n starts-with(text(), \"Editore:\") or \\\n starts-with(text(), \"Editeur\") or \\\n starts-with(text(), \"Editor:\") or \\\n starts-with(text(), \"Editora:\") or \\\n starts-with(text(), \"Uitgever:\") or \\\n starts-with(text(), \"Utgivare:\") or \\\n starts-with(text(), \"出版社:\")]\n '''\n self.pubdate_xpath = '''\n descendant::*[starts-with(text(), \"Publication Date:\") or \\\n starts-with(text(), \"Audible.com Release Date:\")]\n '''\n self.publisher_names = {'Publisher', 'Uitgever', 'Verlag', 'Utgivare', 'Herausgeber',\n 'Editore', 'Editeur', 'Éditeur', 'Editor', 'Editora', '出版社'}\n\n self.language_xpath = '''\n descendant::*[\n starts-with(text(), \"Language:\") \\\n or text() = \"Language\" \\\n or text() = \"Sprache:\" \\\n or text() = \"Lingua:\" \\\n or text() = \"Idioma:\" \\\n or starts-with(text(), \"Langue\") \\\n or starts-with(text(), \"言語\") \\\n or starts-with(text(), \"SprÃ¥k\") \\\n or starts-with(text(), \"è¯ç§\")\n ]\n '''\n self.language_names = {'Language', 'Sprache', 'SprÃ¥k',\n 'Lingua', 'Idioma', 'Langue', '言語', 'Taal', 'è¯ç§'}\n\n self.tags_xpath = '''\n descendant::h2[\n text() = \"Look for Similar Items by Category\" or\n text() = \"Ähnliche Artikel finden\" or\n text() = \"Buscar productos similares por categorÃa\" or\n text() = \"Ricerca articoli simili per categoria\" or\n text() = \"Rechercher des articles similaires par rubrique\" or\n text() = \"Procure por items similares por categoria\" or\n text() = \"関連商å“を探ã™\"\n ]/../descendant::ul/li\n '''\n\n self.ratings_pat = re.compile(\n r'([0-9.,]+) ?(out of|von|van|su|étoiles sur|ã¤æ˜Ÿã®ã†ã¡|de un máximo de|de|av) '\n r'([\\d\\.]+)( (stars|Sternen|stelle|estrellas|estrelas|sterren|stjärnor)){0,1}'\n )\n self.ratings_pat_cn = re.compile(r'([0-9.]+) 颗星,最多 5 颗星')\n self.ratings_pat_jp = re.compile(r'\\d+ã¤æ˜Ÿã®ã†ã¡([\\d\\.]+)')\n\n lm = {\n 'eng': ('English', 'Englisch', 'Engels', 'Engelska'),\n 'fra': ('French', 'Français'),\n 'ita': ('Italian', 'Italiano'),\n 'deu': ('German', 'Deutsch'),\n 'spa': ('Spanish', 'Espa\\xf1ol', 'Espaniol'),\n 'jpn': ('Japanese', '日本語'),\n 'por': ('Portuguese', 'Português'),\n 'nld': ('Dutch', 'Nederlands',),\n 'chs': ('Chinese', '䏿–‡', 'ç®€ä½“ä¸æ–‡'),\n 'swe': ('Swedish', 'Svenska'),\n }\n self.lang_map = {}\n for code, names in lm.items():\n for name in names:\n self.lang_map[name] = code\n\n self.series_pat = re.compile(\n r'''\n \\|\\s* # Prefix\n (Series)\\s*:\\s* # Series declaration\n (?P<series>.+?)\\s+ # The series name\n \\((Book)\\s* # Book declaration\n (?P<index>[0-9.]+) # Series index\n \\s*\\)\n ''', re.X)\n\n def delocalize_datestr(self, raw):\n if self.domain == 'cn':\n return raw.replace('å¹´', '-').replace('月', '-').replace('æ—¥', '')\n if not self.months:\n return raw\n ans = raw.lower()\n for i, vals in self.months.items():\n for x in vals:\n ans = ans.replace(x, self.english_months[i])\n ans = ans.replace(' de ', ' ')\n return ans\n\n def run(self):\n try:\n self.get_details()\n except Exception:\n self.log.exception('get_details failed for url: %r' % self.url)\n\n def get_details(self):\n if self.preparsed_root is None:\n raw, root, selector = parse_details_page(\n self.url, self.log, self.timeout, self.browser, self.domain)\n else:\n raw, root, selector = self.preparsed_root\n\n from css_selectors import Select\n self.selector = Select(root)\n self.parse_details(raw, root)\n\n def parse_details(self, raw, root):\n asin = parse_asin(root, self.log, self.url)\n if not asin and root.xpath('//form[@action=\"/errors/validateCaptcha\"]'):\n raise CaptchaError(\n 'Amazon returned a CAPTCHA page, probably because you downloaded too many books. Wait for some time and try again.')\n if self.testing:\n import tempfile\n import uuid\n with tempfile.NamedTemporaryFile(prefix=(asin or type('')(uuid.uuid4())) + '_',\n suffix='.html', delete=False) as f:\n f.write(raw)\n print('Downloaded HTML for', asin, 'saved in', f.name)\n\n try:\n title = self.parse_title(root)\n except Exception:\n self.log.exception('Error parsing title for url: %r' % self.url)\n title = None\n\n try:\n authors = self.parse_authors(root)\n except Exception:\n self.log.exception('Error parsing authors for url: %r' % self.url)\n authors = []\n\n if not title or not authors or not asin:\n self.log.error(\n 'Could not find title/authors/asin for %r' % self.url)\n self.log.error('ASIN: %r Title: %r Authors: %r' % (asin, title,\n authors))\n return\n\n mi = Metadata(title, authors)\n idtype = 'amazon' if self.domain == 'com' else 'amazon_' + self.domain\n mi.set_identifier(idtype, asin)\n self.amazon_id = asin\n\n try:\n mi.rating = self.parse_rating(root)\n except Exception:\n self.log.exception('Error parsing ratings for url: %r' % self.url)\n\n try:\n mi.comments = self.parse_comments(root, raw)\n except Exception:\n self.log.exception('Error parsing comments for url: %r' % self.url)\n\n try:\n series, series_index = self.parse_series(root)\n if series:\n mi.series, mi.series_index = series, series_index\n elif self.testing:\n mi.series, mi.series_index = 'Dummy series for testing', 1\n except Exception:\n self.log.exception('Error parsing series for url: %r' % self.url)\n\n try:\n mi.tags = self.parse_tags(root)\n except Exception:\n self.log.exception('Error parsing tags for url: %r' % self.url)\n\n try:\n self.cover_url = self.parse_cover(root, raw)\n except Exception:\n self.log.exception('Error parsing cover for url: %r' % self.url)\n if self.cover_url_processor is not None and self.cover_url and self.cover_url.startswith('/'):\n self.cover_url = self.cover_url_processor(self.cover_url)\n mi.has_cover = bool(self.cover_url)\n\n detail_bullets = root.xpath('//*[@data-feature-name=\"detailBullets\"]')\n non_hero = tuple(self.selector(\n 'div#bookDetails_container_div div#nonHeroSection')) or tuple(self.selector(\n '#productDetails_techSpec_sections'))\n feature_and_detail_bullets = root.xpath('//*[@data-feature-name=\"featureBulletsAndDetailBullets\"]')\n if detail_bullets:\n self.parse_detail_bullets(root, mi, detail_bullets[0])\n elif non_hero:\n try:\n self.parse_new_details(root, mi, non_hero[0])\n except Exception:\n self.log.exception(\n 'Failed to parse new-style book details section')\n elif feature_and_detail_bullets:\n self.parse_detail_bullets(root, mi, feature_and_detail_bullets[0], ul_selector='ul')\n\n else:\n pd = root.xpath(self.pd_xpath)\n if pd:\n pd = pd[0]\n\n try:\n isbn = self.parse_isbn(pd)\n if isbn:\n self.isbn = mi.isbn = isbn\n except Exception:\n self.log.exception(\n 'Error parsing ISBN for url: %r' % self.url)\n\n try:\n mi.publisher = self.parse_publisher(pd)\n except Exception:\n self.log.exception(\n 'Error parsing publisher for url: %r' % self.url)\n\n try:\n mi.pubdate = self.parse_pubdate(pd)\n except Exception:\n self.log.exception(\n 'Error parsing publish date for url: %r' % self.url)\n\n try:\n lang = self.parse_language(pd)\n if lang:\n mi.language = lang\n except Exception:\n self.log.exception(\n 'Error parsing language for url: %r' % self.url)\n\n else:\n self.log.warning(\n 'Failed to find product description for url: %r' % self.url)\n\n mi.source_relevance = self.relevance\n\n if self.amazon_id:\n if self.isbn:\n self.plugin.cache_isbn_to_identifier(self.isbn, self.amazon_id)\n if self.cover_url:\n self.plugin.cache_identifier_to_cover_url(self.amazon_id,\n self.cover_url)\n\n self.plugin.clean_downloaded_metadata(mi)\n\n if self.filter_result(mi, self.log):\n self.result_queue.put(mi)\n\n def totext(self, elem, only_printable=False):\n res = self.tostring(elem, encoding='unicode', method='text')\n if only_printable:\n try:\n filtered_characters = [s for s in res if s.isprintable()]\n except AttributeError:\n filtered_characters = [s for s in res if s in string.printable]\n res = ''.join(filtered_characters)\n return res.strip()\n\n def parse_title(self, root):\n\n def sanitize_title(title):\n ans = title.strip()\n if not ans.startswith('['):\n ans = re.sub(r'[(\\[].*[)\\]]', '', title).strip()\n return ans\n\n h1 = root.xpath('//h1[@id=\"title\"]')\n if h1:\n h1 = h1[0]\n for child in h1.xpath('./*[contains(@class, \"a-color-secondary\")]'):\n h1.remove(child)\n return sanitize_title(self.totext(h1))\n # audiobooks\n elem = root.xpath('//*[@id=\"productTitle\"]')\n if elem:\n return sanitize_title(self.totext(elem[0]))\n tdiv = root.xpath('//h1[contains(@class, \"parseasinTitle\")]')\n if not tdiv:\n span = root.xpath('//*[@id=\"ebooksTitle\"]')\n if span:\n return sanitize_title(self.totext(span[0]))\n h1 = root.xpath('//h1[@data-feature-name=\"title\"]')\n if h1:\n return sanitize_title(self.totext(h1[0]))\n raise ValueError('No title block found')\n tdiv = tdiv[0]\n actual_title = tdiv.xpath('descendant::*[@id=\"btAsinTitle\"]')\n if actual_title:\n title = self.tostring(actual_title[0], encoding='unicode',\n method='text').strip()\n else:\n title = self.tostring(tdiv, encoding='unicode',\n method='text').strip()\n return sanitize_title(title)\n\n def parse_authors(self, root):\n for sel in (\n '#byline .author .contributorNameID',\n '#byline .author a.a-link-normal',\n '#bylineInfo .author .contributorNameID',\n '#bylineInfo .author a.a-link-normal',\n '#bylineInfo #bylineContributor',\n '#bylineInfo #contributorLink',\n ):\n matches = tuple(self.selector(sel))\n if matches:\n authors = [self.totext(x) for x in matches]\n return [a for a in authors if a]\n\n x = '//h1[contains(@class, \"parseasinTitle\")]/following-sibling::span/*[(name()=\"a\" and @href) or (name()=\"span\" and @class=\"contributorNameTrigger\")]'\n aname = root.xpath(x)\n if not aname:\n aname = root.xpath('''\n //h1[contains(@class, \"parseasinTitle\")]/following-sibling::*[(name()=\"a\" and @href) or (name()=\"span\" and @class=\"contributorNameTrigger\")]\n ''')\n for x in aname:\n x.tail = ''\n authors = [self.tostring(x, encoding='unicode', method='text').strip() for x\n in aname]\n authors = [a for a in authors if a]\n return authors\n\n def parse_rating(self, root):\n for x in root.xpath('//div[@id=\"cpsims-feature\" or @id=\"purchase-sims-feature\" or @id=\"rhf\"]'):\n # Remove the similar books section as it can cause spurious\n # ratings matches\n x.getparent().remove(x)\n\n rating_paths = (\n '//div[@data-feature-name=\"averageCustomerReviews\" or @id=\"averageCustomerReviews\"]',\n '//div[@class=\"jumpBar\"]/descendant::span[contains(@class,\"asinReviewsSummary\")]',\n '//div[@class=\"buying\"]/descendant::span[contains(@class,\"asinReviewsSummary\")]',\n '//span[@class=\"crAvgStars\"]/descendant::span[contains(@class,\"asinReviewsSummary\")]'\n )\n ratings = None\n for p in rating_paths:\n ratings = root.xpath(p)\n if ratings:\n break\n\n def parse_ratings_text(text):\n try:\n m = self.ratings_pat.match(text)\n return float(m.group(1).replace(',', '.')) / float(m.group(3)) * 5\n except Exception:\n pass\n\n if ratings:\n ratings = ratings[0]\n for elem in ratings.xpath('descendant::*[@title]'):\n t = elem.get('title').strip()\n if self.domain == 'cn':\n m = self.ratings_pat_cn.match(t)\n if m is not None:\n return float(m.group(1))\n elif self.domain == 'jp':\n m = self.ratings_pat_jp.match(t)\n if m is not None:\n return float(m.group(1))\n else:\n ans = parse_ratings_text(t)\n if ans is not None:\n return ans\n for elem in ratings.xpath('descendant::span[@class=\"a-icon-alt\"]'):\n t = self.tostring(\n elem, encoding='unicode', method='text', with_tail=False).strip()\n ans = parse_ratings_text(t)\n if ans is not None:\n return ans\n else:\n # found in kindle book pages on amazon.com\n for x in root.xpath('//a[@id=\"acrCustomerReviewLink\"]'):\n spans = x.xpath('./span')\n if spans:\n txt = self.tostring(spans[0], method='text', encoding='unicode', with_tail=False).strip()\n try:\n return float(txt.replace(',', '.'))\n except Exception:\n pass\n\n def _render_comments(self, desc):\n from calibre.library.comments import sanitize_comments_html\n\n for c in desc.xpath('descendant::noscript'):\n c.getparent().remove(c)\n for c in desc.xpath('descendant::*[@class=\"seeAll\" or'\n ' @class=\"emptyClear\" or @id=\"collapsePS\" or'\n ' @id=\"expandPS\"]'):\n c.getparent().remove(c)\n for b in desc.xpath('descendant::b[@style]'):\n # Bing highlights search results\n s = b.get('style', '')\n if 'color' in s:\n b.tag = 'span'\n del b.attrib['style']\n\n for a in desc.xpath('descendant::a[@href]'):\n del a.attrib['href']\n a.tag = 'span'\n for a in desc.xpath('descendant::span[@class=\"a-text-italic\"]'):\n a.tag = 'i'\n for a in desc.xpath('descendant::span[@class=\"a-text-bold\"]'):\n a.tag = 'b'\n desc = self.tostring(desc, method='html', encoding='unicode').strip()\n desc = xml_replace_entities(desc, 'utf-8')\n\n # Encoding bug in Amazon data U+fffd (replacement char)\n # in some examples it is present in place of '\n desc = desc.replace('\\ufffd', \"'\")\n # remove all attributes from tags\n desc = re.sub(r'<([a-zA-Z0-9]+)\\s[^>]+>', r'<\\1>', desc)\n # Collapse whitespace\n # desc = re.sub(r'\\n+', '\\n', desc)\n # desc = re.sub(r' +', ' ', desc)\n # Remove the notice about text referring to out of print editions\n desc = re.sub(r'(?s)<em>--This text ref.*?</em>', '', desc)\n # Remove comments\n desc = re.sub(r'(?s)<!--.*?-->', '', desc)\n return sanitize_comments_html(desc)\n\n def parse_comments(self, root, raw):\n try:\n from urllib.parse import unquote\n except ImportError:\n from urllib import unquote\n ans = ''\n ovr = tuple(self.selector('#drengr_MobileTabbedDescriptionOverviewContent_feature_div')) or tuple(\n self.selector('#drengr_DesktopTabbedDescriptionOverviewContent_feature_div'))\n if ovr:\n ovr = ovr[0]\n ovr.tag = 'div'\n ans = self._render_comments(ovr)\n ovr = tuple(self.selector('#drengr_MobileTabbedDescriptionEditorialsContent_feature_div')) or tuple(\n self.selector('#drengr_DesktopTabbedDescriptionEditorialsContent_feature_div'))\n if ovr:\n ovr = ovr[0]\n ovr.tag = 'div'\n ans += self._render_comments(ovr)\n else:\n ns = tuple(self.selector('#bookDescription_feature_div noscript'))\n if ns:\n ns = ns[0]\n if len(ns) == 0 and ns.text:\n import html5lib\n\n # html5lib parsed noscript as CDATA\n ns = html5lib.parseFragment(\n '<div>%s</div>' % (ns.text), treebuilder='lxml', namespaceHTMLElements=False)[0]\n else:\n ns.tag = 'div'\n ans = self._render_comments(ns)\n else:\n desc = root.xpath('//div[@id=\"ps-content\"]/div[@class=\"content\"]')\n if desc:\n ans = self._render_comments(desc[0])\n else:\n ns = tuple(self.selector('#bookDescription_feature_div .a-expander-content'))\n if ns:\n ans = self._render_comments(ns[0])\n # audiobooks\n if not ans:\n elem = root.xpath('//*[@id=\"audible_desktopTabbedDescriptionOverviewContent_feature_div\"]')\n if elem:\n ans = self._render_comments(elem[0])\n desc = root.xpath(\n '//div[@id=\"productDescription\"]/*[@class=\"content\"]')\n if desc:\n ans += self._render_comments(desc[0])\n else:\n # Idiot chickens from amazon strike again. This data is now stored\n # in a JS variable inside a script tag URL encoded.\n m = re.search(br'var\\s+iframeContent\\s*=\\s*\"([^\"]+)\"', raw)\n if m is not None:\n try:\n text = unquote(m.group(1)).decode('utf-8')\n nr = parse_html(text)\n desc = nr.xpath(\n '//div[@id=\"productDescription\"]/*[@class=\"content\"]')\n if desc:\n ans += self._render_comments(desc[0])\n except Exception as e:\n self.log.warn(\n 'Parsing of obfuscated product description failed with error: %s' % as_unicode(e))\n else:\n desc = root.xpath('//div[@id=\"productDescription_fullView\"]')\n if desc:\n ans += self._render_comments(desc[0])\n\n return ans\n\n def parse_series(self, root):\n ans = (None, None)\n\n # This is found on kindle pages for books on amazon.* (including amazon.co.jp)\n series = root.xpath('//*[@id=\"rpi-attribute-book_details-series\"]')\n if series:\n spans = series[0].xpath('descendant::span')\n if spans:\n texts = [self.tostring(x, encoding='unicode', method='text', with_tail=False).strip()\n for x in spans]\n texts = list(filter(None, texts))\n if len(texts) == 2:\n idxinfo, series_name = texts\n idxinfo = idxinfo.strip()\n\n # Try Japanese pattern like: \"å…¨5å·»ä¸ç¬¬1å·»\", \"å…¨3å·»ä¸ç¬¬2å·»\"\n m = re.search(r'å…¨\\s*[0-9.]+\\s*(?:å·»|冊)ä¸ç¬¬\\s*([0-9.]+)\\s*(?:å·»|冊)', idxinfo)\n if m is not None:\n ans = (series_name, float(m.group(1)))\n return ans\n\n # Fallback: original behaviour (first number), used for EN/etc\n m = re.search(r'[0-9.]+', idxinfo)\n if m is not None:\n ans = (series_name, float(m.group()))\n return ans\n\n # This is found on the paperback/hardback pages for books on amazon.com\n series = root.xpath('//div[@data-feature-name=\"seriesTitle\"]')\n if series:\n series = series[0]\n spans = series.xpath('./span')\n if spans:\n raw = self.tostring(\n spans[0], encoding='unicode', method='text', with_tail=False).strip()\n m = re.search(r'\\s+([0-9.]+)$', raw.strip())\n if m is not None:\n series_index = float(m.group(1))\n s = series.xpath('./a[@id=\"series-page-link\"]')\n if s:\n series = self.tostring(\n s[0], encoding='unicode', method='text', with_tail=False).strip()\n if series:\n ans = (series, series_index)\n else:\n series = root.xpath('//div[@id=\"seriesBulletWidget_feature_div\"]')\n if series:\n a = series[0].xpath('descendant::a')\n if a:\n raw = self.tostring(a[0], encoding='unicode', method='text', with_tail=False)\n if self.domain == 'jp':\n m = re.search(r'å…¨\\s*[0-9.]+\\s*(?:å·»|冊)ä¸ç¬¬\\s*(?P<index>[0-9.]+)\\s*(?:å·»|冊)\\s*:\\s*(?P<series>.+)', raw.strip())\n else:\n m = re.search(r'(?:Book|Libro|Buch)\\s+(?P<index>[0-9.]+)\\s+(?:of|de|von)\\s+([0-9.]+)\\s*:\\s*(?P<series>.+)', raw.strip())\n if m is not None:\n ans = (m.group('series').strip(), float(m.group('index')))\n\n # This is found on Kindle edition pages on amazon.com\n if ans == (None, None):\n for span in root.xpath('//div[@id=\"aboutEbooksSection\"]//li/span'):\n text = (span.text or '').strip()\n m = re.match(r'Book\\s+([0-9.]+)', text)\n if m is not None:\n series_index = float(m.group(1))\n a = span.xpath('./a[@href]')\n if a:\n series = self.tostring(\n a[0], encoding='unicode', method='text', with_tail=False).strip()\n if series:\n ans = (series, series_index)\n # This is found on newer Kindle edition pages on amazon.com\n if ans == (None, None):\n for b in root.xpath('//div[@id=\"reviewFeatureGroup\"]/span/b'):\n text = (b.text or '').strip()\n m = re.match(r'Book\\s+([0-9.]+)', text)\n if m is not None:\n series_index = float(m.group(1))\n a = b.getparent().xpath('./a[@href]')\n if a:\n series = self.tostring(\n a[0], encoding='unicode', method='text', with_tail=False).partition('(')[0].strip()\n if series:\n ans = series, series_index\n\n if ans == (None, None):\n desc = root.xpath('//div[@id=\"ps-content\"]/div[@class=\"buying\"]')\n if desc:\n raw = self.tostring(desc[0], method='text', encoding='unicode')\n raw = re.sub(r'\\s+', ' ', raw)\n match = self.series_pat.search(raw)\n if match is not None:\n s, i = match.group('series'), float(match.group('index'))\n if s:\n ans = (s, i)\n if ans[0]:\n ans = (re.sub(r'\\s+Series$', '', ans[0]).strip(), ans[1])\n ans = (re.sub(r'\\(.+?\\s+Series\\)$', '', ans[0]).strip(), ans[1])\n return ans\n\n def parse_tags(self, root):\n ans = []\n exclude_tokens = {'kindle', 'a-z'}\n exclude = {'special features', 'by authors',\n 'authors & illustrators', 'books', 'new; used & rental textbooks'}\n seen = set()\n for li in root.xpath(self.tags_xpath):\n for i, a in enumerate(li.iterdescendants('a')):\n if i > 0:\n # we ignore the first category since it is almost always\n # too broad\n raw = (a.text or '').strip().replace(',', ';')\n lraw = icu_lower(raw)\n tokens = frozenset(lraw.split())\n if raw and lraw not in exclude and not tokens.intersection(exclude_tokens) and lraw not in seen:\n ans.append(raw)\n seen.add(lraw)\n return ans\n\n def parse_cover(self, root, raw=b''):\n # Look for the image URL in javascript, using the first image in the\n # image gallery as the cover\n import json\n imgpat = re.compile(r'\"hiRes\":\"(.+?)\",\"thumb\"')\n for script in root.xpath('//script'):\n m = imgpat.search(script.text or '')\n if m is not None:\n return m.group(1)\n imgpat = re.compile(r''''imageGalleryData'\\s*:\\s*(\\[\\s*{.+])''')\n for script in root.xpath('//script'):\n m = imgpat.search(script.text or '')\n if m is not None:\n try:\n return json.loads(m.group(1))[0]['mainUrl']\n except Exception:\n continue\n\n def clean_img_src(src):\n parts = src.split('/')\n if len(parts) > 3:\n bn = parts[-1]\n sparts = bn.split('_')\n if len(sparts) > 2:\n bn = re.sub(r'\\.\\.jpg$', '.jpg', (sparts[0] + sparts[-1]))\n return ('/'.join(parts[:-1])) + '/' + bn\n\n imgpat2 = re.compile(r'var imageSrc = \"([^\"]+)\"')\n for script in root.xpath('//script'):\n m = imgpat2.search(script.text or '')\n if m is not None:\n src = m.group(1)\n url = clean_img_src(src)\n if url:\n return url\n\n imgs = root.xpath(\n '//img[(@id=\"prodImage\" or @id=\"original-main-image\" or @id=\"main-image\" or @id=\"main-image-nonjs\") and @src]')\n if not imgs:\n imgs = (\n root.xpath('//div[@class=\"main-image-inner-wrapper\"]/img[@src]') or\n root.xpath('//div[@id=\"main-image-container\" or @id=\"ebooks-main-image-container\"]//img[@src]') or\n root.xpath(\n '//div[@id=\"mainImageContainer\"]//img[@data-a-dynamic-image]')\n )\n for img in imgs:\n try:\n idata = json.loads(img.get('data-a-dynamic-image'))\n except Exception:\n imgs = ()\n else:\n mwidth = 0\n try:\n url = None\n for iurl, (width, height) in idata.items():\n if width > mwidth:\n mwidth = width\n url = iurl\n\n return url\n except Exception:\n pass\n\n for img in imgs:\n src = img.get('src')\n if 'data:' in src:\n continue\n if 'loading-' in src:\n js_img = re.search(br'\"largeImage\":\"(https?://[^\"]+)\",', raw)\n if js_img:\n src = js_img.group(1).decode('utf-8')\n if ('/no-image-avail' not in src and 'loading-' not in src and '/no-img-sm' not in src):\n self.log('Found image: %s' % src)\n url = clean_img_src(src)\n if url:\n return url\n\n def parse_detail_bullets(self, root, mi, container, ul_selector='.detail-bullet-list'):\n try:\n ul = next(self.selector(ul_selector, root=container))\n except StopIteration:\n return\n for span in self.selector('.a-list-item', root=ul):\n cells = span.xpath('./span')\n if len(cells) >= 2:\n self.parse_detail_cells(mi, cells[0], cells[1])\n\n def parse_new_details(self, root, mi, non_hero):\n table = non_hero.xpath('descendant::table')[0]\n for tr in table.xpath('descendant::tr'):\n cells = tr.xpath('descendant::*[local-name()=\"td\" or local-name()=\"th\"]')\n if len(cells) == 2:\n self.parse_detail_cells(mi, cells[0], cells[1])\n\n def parse_detail_cells(self, mi, c1, c2):\n name = self.totext(c1, only_printable=True).strip().strip(':').strip()\n val = self.totext(c2)\n val = val.replace('\\u200e', '').replace('\\u200f', '')\n if not val:\n return\n if name in self.language_names:\n ans = self.lang_map.get(val)\n if not ans:\n ans = canonicalize_lang(val)\n if ans:\n mi.language = ans\n elif name in self.publisher_names:\n pub = val.partition(';')[0].partition('(')[0].strip()\n if pub:\n mi.publisher = pub\n date = val.rpartition('(')[-1].replace(')', '').strip()\n try:\n from calibre.utils.date import parse_only_date\n date = self.delocalize_datestr(date)\n mi.pubdate = parse_only_date(date, assume_utc=True)\n except Exception:\n self.log.exception('Failed to parse pubdate: %s' % val)\n elif name in {'ISBN', 'ISBN-10', 'ISBN-13'}:\n ans = check_isbn(val)\n if ans:\n self.isbn = mi.isbn = ans\n elif name in {'Publication date'}:\n from calibre.utils.date import parse_only_date\n date = self.delocalize_datestr(val)\n mi.pubdate = parse_only_date(date, assume_utc=True)\n\n def parse_isbn(self, pd):\n items = pd.xpath(\n 'descendant::*[starts-with(text(), \"ISBN\")]')\n if not items:\n items = pd.xpath(\n 'descendant::b[contains(text(), \"ISBN:\")]')\n for x in reversed(items):\n if x.tail:\n ans = check_isbn(x.tail.strip())\n if ans:\n return ans\n\n def parse_publisher(self, pd):\n for x in reversed(pd.xpath(self.publisher_xpath)):\n if x.tail:\n ans = x.tail.partition(';')[0]\n return ans.partition('(')[0].strip()\n\n def parse_pubdate(self, pd):\n from calibre.utils.date import parse_only_date\n for x in reversed(pd.xpath(self.pubdate_xpath)):\n if x.tail:\n date = x.tail.strip()\n date = self.delocalize_datestr(date)\n try:\n return parse_only_date(date, assume_utc=True)\n except Exception:\n pass\n for x in reversed(pd.xpath(self.publisher_xpath)):\n if x.tail:\n ans = x.tail\n date = ans.rpartition('(')[-1].replace(')', '').strip()\n date = self.delocalize_datestr(date)\n try:\n return parse_only_date(date, assume_utc=True)\n except Exception:\n pass\n\n def parse_language(self, pd):\n for x in reversed(pd.xpath(self.language_xpath)):\n if x.tail:\n raw = x.tail.strip().partition(',')[0].strip()\n ans = self.lang_map.get(raw, None)\n if ans:\n return ans\n ans = canonicalize_lang(ans)\n if ans:\n return ans\n# }}}\n\n\nclass Amazon(Source):\n\n name = 'Amazon.com'\n version = (1, 3, 15)\n minimum_calibre_version = (2, 82, 0)\n description = _('Downloads metadata and covers from Amazon')\n\n capabilities = frozenset(('identify', 'cover'))\n touched_fields = frozenset(('title', 'authors', 'identifier:amazon',\n 'rating', 'comments', 'publisher', 'pubdate',\n 'languages', 'series', 'tags'))\n has_html_comments = True\n supports_gzip_transfer_encoding = True\n prefer_results_with_isbn = False\n\n AMAZON_DOMAINS = {\n 'com': _('US'),\n 'fr': _('France'),\n 'de': _('Germany'),\n 'uk': _('UK'),\n 'au': _('Australia'),\n 'it': _('Italy'),\n 'jp': _('Japan'),\n 'es': _('Spain'),\n 'br': _('Brazil'),\n 'in': _('India'),\n 'nl': _('Netherlands'),\n 'cn': _('China'),\n 'ca': _('Canada'),\n 'se': _('Sweden'),\n }\n\n SERVERS = {\n 'auto': _('Choose server automatically'),\n 'amazon': _('Amazon servers'),\n 'bing': _('Bing search cache'),\n 'google': _('Google search cache'),\n 'wayback': _('Wayback machine cache (slow)'),\n 'ddg': _('DuckDuckGo search and Google cache'),\n }\n\n options = (\n Option('domain', 'choices', 'com', _('Amazon country website to use:'),\n _('Metadata from Amazon will be fetched using this '\n \"country's Amazon website.\"), choices=AMAZON_DOMAINS),\n Option('server', 'choices', 'auto', _('Server to get data from:'),\n _(\n 'Amazon has started blocking attempts to download'\n ' metadata from its servers. To get around this problem,'\n ' calibre can fetch the Amazon data from many different'\n ' places where it is cached. Choose the source you prefer.'\n ), choices=SERVERS),\n Option('use_mobi_asin', 'bool', False, _('Use the MOBI-ASIN for metadata search'),\n _(\n 'Enable this option to search for metadata with an'\n ' ASIN identifier from the MOBI file at the current country website,'\n ' unless any other amazon id is available. Note that if the'\n ' MOBI file came from a different Amazon country store, you could get'\n ' incorrect results.'\n )),\n Option('prefer_kindle_edition', 'bool', False, _('Prefer the Kindle edition, when available'),\n _(\n 'When searching for a book and the search engine returns both paper and Kindle editions,'\n ' always prefer the Kindle edition, instead of whatever the search engine returns at the'\n ' top.')\n ),\n )\n\n def __init__(self, *args, **kwargs):\n Source.__init__(self, *args, **kwargs)\n self.set_amazon_id_touched_fields()\n\n def id_from_url(self, url):\n from polyglot.urllib import urlparse\n purl = urlparse(url)\n if purl.netloc and purl.path and '/dp/' in purl.path:\n host_parts = tuple(x.lower() for x in purl.netloc.split('.'))\n if 'amazon' in host_parts:\n domain = host_parts[-1]\n parts = purl.path.split('/')\n idx = parts.index('dp')\n try:\n val = parts[idx+1]\n except IndexError:\n return\n aid = 'amazon' if domain == 'com' else ('amazon_' + domain)\n return aid, val\n\n def test_fields(self, mi):\n '''\n Return the first field from self.touched_fields that is null on the\n mi object\n '''\n for key in self.touched_fields:\n if key.startswith('identifier:'):\n key = key.partition(':')[-1]\n if key == 'amazon':\n if self.domain != 'com':\n key += '_' + self.domain\n if not mi.has_identifier(key):\n return 'identifier: ' + key\n elif mi.is_null(key):\n return key\n\n @property\n def browser(self):\n br = self._browser\n if br is None:\n ua = 'Mobile '\n while not user_agent_is_ok(ua):\n ua = random_user_agent(allow_ie=False)\n # ua = 'Mozilla/5.0 (Linux; Android 8.0.0; VTR-L29; rv:63.0) Gecko/20100101 Firefox/63.0'\n self._browser = br = browser(user_agent=ua)\n br.set_handle_gzip(True)\n if self.use_search_engine:\n br.addheaders += [\n ('Accept', accept_header_for_ua(ua)),\n ('Upgrade-insecure-requests', '1'),\n ]\n else:\n br.addheaders += [\n ('Accept', accept_header_for_ua(ua)),\n ('Upgrade-insecure-requests', '1'),\n ('Referer', self.referrer_for_domain()),\n ]\n return br\n\n def save_settings(self, *args, **kwargs):\n Source.save_settings(self, *args, **kwargs)\n self.set_amazon_id_touched_fields()\n\n def set_amazon_id_touched_fields(self):\n ident_name = 'identifier:amazon'\n if self.domain != 'com':\n ident_name += '_' + self.domain\n tf = [x for x in self.touched_fields if not\n x.startswith('identifier:amazon')] + [ident_name]\n self.touched_fields = frozenset(tf)\n\n def get_domain_and_asin(self, identifiers, extra_domains=()):\n identifiers = {k.lower(): v for k, v in identifiers.items()}\n for key, val in identifiers.items():\n if key in ('amazon', 'asin'):\n return 'com', val\n if key.startswith('amazon_'):\n domain = key.partition('_')[-1]\n if domain and (domain in self.AMAZON_DOMAINS or domain in extra_domains):\n return domain, val\n if self.prefs['use_mobi_asin']:\n val = identifiers.get('mobi-asin')\n if val is not None:\n return self.domain, val\n return None, None\n\n def referrer_for_domain(self, domain=None):\n domain = domain or self.domain\n return {\n 'uk': 'https://www.amazon.co.uk/',\n 'au': 'https://www.amazon.com.au/',\n 'br': 'https://www.amazon.com.br/',\n 'jp': 'https://www.amazon.co.jp/',\n 'mx': 'https://www.amazon.com.mx/',\n }.get(domain, 'https://www.amazon.%s/' % domain)\n\n def _get_book_url(self, identifiers): # {{{\n domain, asin = self.get_domain_and_asin(\n identifiers, extra_domains=('au', 'ca'))\n if domain and asin:\n url = None\n r = self.referrer_for_domain(domain)\n if r is not None:\n url = r + 'dp/' + asin\n if url:\n idtype = 'amazon' if domain == 'com' else 'amazon_' + domain\n return domain, idtype, asin, url\n\n def get_book_url(self, identifiers):\n ans = self._get_book_url(identifiers)\n if ans is not None:\n return ans[1:]\n\n def get_book_url_name(self, idtype, idval, url):\n if idtype == 'amazon':\n return self.name\n return 'A' + idtype.replace('_', '.')[1:]\n # }}}\n\n @property\n def domain(self):\n x = getattr(self, 'testing_domain', None)\n if x is not None:\n return x\n domain = self.prefs['domain']\n if domain not in self.AMAZON_DOMAINS:\n domain = 'com'\n\n return domain\n\n @property\n def server(self):\n x = getattr(self, 'testing_server', None)\n if x is not None:\n return x\n server = self.prefs['server']\n if server not in self.SERVERS:\n server = 'auto'\n return server\n\n @property\n def use_search_engine(self):\n return self.server != 'amazon'\n\n def clean_downloaded_metadata(self, mi):\n docase = (\n mi.language == 'eng' or\n (mi.is_null('language') and self.domain in {'com', 'uk', 'au'})\n )\n if mi.title and docase:\n # Remove series information from title\n m = re.search(r'\\S+\\s+(\\(.+?\\s+Book\\s+\\d+\\))$', mi.title)\n if m is not None:\n mi.title = mi.title.replace(m.group(1), '').strip()\n mi.title = fixcase(mi.title)\n mi.authors = fixauthors(mi.authors)\n if mi.tags and docase:\n mi.tags = list(map(fixcase, mi.tags))\n mi.isbn = check_isbn(mi.isbn)\n if mi.series and docase:\n mi.series = fixcase(mi.series)\n if mi.title and mi.series:\n for pat in (r':\\s*Book\\s+\\d+\\s+of\\s+%s$', r'\\(%s\\)$', r':\\s*%s\\s+Book\\s+\\d+$'):\n pat = pat % re.escape(mi.series)\n q = re.sub(pat, '', mi.title, flags=re.I).strip()\n if q and q != mi.title:\n mi.title = q\n break\n\n def get_website_domain(self, domain):\n return {'uk': 'co.uk', 'jp': 'co.jp', 'br': 'com.br', 'au': 'com.au'}.get(domain, domain)\n\n def create_query(self, log, title=None, authors=None, identifiers={}, # {{{\n domain=None, for_amazon=True):\n try:\n from urllib.parse import unquote_plus, urlencode\n except ImportError:\n from urllib import unquote_plus, urlencode\n if domain is None:\n domain = self.domain\n\n idomain, asin = self.get_domain_and_asin(identifiers)\n if idomain is not None:\n domain = idomain\n\n # See the amazon detailed search page to get all options\n terms = []\n q = {'search-alias': 'aps',\n 'unfiltered': '1',\n }\n\n if domain == 'com':\n q['sort'] = 'relevanceexprank'\n else:\n q['sort'] = 'relevancerank'\n\n isbn = check_isbn(identifiers.get('isbn', None))\n\n if asin is not None:\n q['field-keywords'] = asin\n terms.append(asin)\n elif isbn is not None:\n q['field-isbn'] = isbn\n if len(isbn) == 13:\n terms.extend('({} OR {}-{})'.format(isbn, isbn[:3], isbn[3:]).split())\n else:\n terms.append(isbn)\n else:\n # Only return book results\n q['search-alias'] = {'br': 'digital-text',\n 'nl': 'aps'}.get(domain, 'stripbooks')\n if title:\n title_tokens = list(self.get_title_tokens(title))\n if title_tokens:\n q['field-title'] = ' '.join(title_tokens)\n terms.extend(title_tokens)\n if authors:\n author_tokens = list(self.get_author_tokens(authors,\n only_first_author=True))\n if author_tokens:\n q['field-author'] = ' '.join(author_tokens)\n terms.extend(author_tokens)\n\n if not ('field-keywords' in q or 'field-isbn' in q or\n ('field-title' in q)):\n # Insufficient metadata to make an identify query\n log.error('Insufficient metadata to construct query, none of title, ISBN or ASIN supplied')\n raise SearchFailed()\n\n if not for_amazon:\n return terms, domain\n\n if domain == 'nl':\n q['__mk_nl_NL'] = 'Ã…MÅŽÕÑ'\n if 'field-keywords' not in q:\n q['field-keywords'] = ''\n for f in 'field-isbn field-title field-author'.split():\n q['field-keywords'] += ' ' + q.pop(f, '')\n q['field-keywords'] = q['field-keywords'].strip()\n\n encoded_q = {x.encode('utf-8', 'ignore'): y.encode('utf-8', 'ignore') for x, y in q.items()}\n url_query = urlencode(encoded_q)\n # amazon's servers want IRIs with unicode characters not percent esaped\n parts = []\n for x in url_query.split(b'&' if isinstance(url_query, bytes) else '&'):\n k, v = x.split(b'=' if isinstance(x, bytes) else '=', 1)\n parts.append('{}={}'.format(iri_quote_plus(unquote_plus(k)), iri_quote_plus(unquote_plus(v))))\n url_query = '&'.join(parts)\n url = 'https://www.amazon.%s/s/?' % self.get_website_domain(\n domain) + url_query\n return url, domain\n\n # }}}\n\n def get_cached_cover_url(self, identifiers): # {{{\n url = None\n domain, asin = self.get_domain_and_asin(identifiers)\n if asin is None:\n isbn = identifiers.get('isbn', None)\n if isbn is not None:\n asin = self.cached_isbn_to_identifier(isbn)\n if asin is not None:\n url = self.cached_identifier_to_cover_url(asin)\n\n return url\n # }}}\n\n def parse_results_page(self, root, domain): # {{{\n from lxml.html import tostring\n\n matches = []\n\n def title_ok(title):\n title = title.lower()\n bad = ['bulk pack', '[audiobook]', '[audio cd]',\n '(a book companion)', '( slipcase with door )', ': free sampler']\n if self.domain == 'com':\n bad.extend(['(%s edition)' % x for x in ('spanish', 'german')])\n for x in bad:\n if x in title:\n return False\n if title and title[0] in '[{' and re.search(r'\\(\\s*author\\s*\\)', title) is not None:\n # Bad entries in the catalog\n return False\n return True\n\n for query in (\n '//div[contains(@class, \"s-result-list\")]//h2/a[@href]',\n '//div[contains(@class, \"s-result-list\")]//div[@data-index]//h5//a[@href]',\n r'//li[starts-with(@id, \"result_\")]//a[@href and contains(@class, \"s-access-detail-page\")]',\n '//div[@data-cy=\"title-recipe\"]/a[@href]',\n ):\n result_links = root.xpath(query)\n if result_links:\n break\n for a in result_links:\n title = tostring(a, method='text', encoding='unicode')\n if title_ok(title):\n url = a.get('href')\n if url.startswith('/'):\n url = 'https://www.amazon.%s%s' % (\n self.get_website_domain(domain), url)\n matches.append(url)\n\n if not matches:\n # Previous generation of results page markup\n for div in root.xpath(r'//div[starts-with(@id, \"result_\")]'):\n links = div.xpath(r'descendant::a[@class=\"title\" and @href]')\n if not links:\n # New amazon markup\n links = div.xpath('descendant::h3/a[@href]')\n for a in links:\n title = tostring(a, method='text', encoding='unicode')\n if title_ok(title):\n url = a.get('href')\n if url.startswith('/'):\n url = 'https://www.amazon.%s%s' % (\n self.get_website_domain(domain), url)\n matches.append(url)\n break\n\n if not matches:\n # This can happen for some user agents that Amazon thinks are\n # mobile/less capable\n for td in root.xpath(\n r'//div[@id=\"Results\"]/descendant::td[starts-with(@id, \"search:Td:\")]'):\n for a in td.xpath(r'descendant::td[@class=\"dataColumn\"]/descendant::a[@href]/span[@class=\"srTitle\"]/..'):\n title = tostring(a, method='text', encoding='unicode')\n if title_ok(title):\n url = a.get('href')\n if url.startswith('/'):\n url = 'https://www.amazon.%s%s' % (\n self.get_website_domain(domain), url)\n matches.append(url)\n break\n if not matches and root.xpath('//form[@action=\"/errors/validateCaptcha\"]'):\n raise CaptchaError('Amazon returned a CAPTCHA page. Recently Amazon has begun using statistical'\n ' profiling to block access to its website. As such this metadata plugin is'\n ' unlikely to ever work reliably.')\n\n # Keep only the top 3 matches as the matches are sorted by relevance by\n # Amazon so lower matches are not likely to be very relevant\n return matches[:3]\n # }}}\n\n def search_amazon(self, br, testing, log, abort, title, authors, identifiers, timeout): # {{{\n from calibre.ebooks.chardet import xml_to_unicode\n from calibre.utils.cleantext import clean_ascii_chars\n matches = []\n query, domain = self.create_query(log, title=title, authors=authors,\n identifiers=identifiers)\n time.sleep(1)\n try:\n raw = br.open_novisit(query, timeout=timeout).read().strip()\n except Exception as e:\n if callable(getattr(e, 'getcode', None)) and \\\n e.getcode() == 404:\n log.error('Query malformed: %r' % query)\n raise SearchFailed()\n attr = getattr(e, 'args', [None])\n attr = attr if attr else [None]\n if isinstance(attr[0], socket.timeout):\n msg = _('Amazon timed out. Try again later.')\n log.error(msg)\n else:\n msg = 'Failed to make identify query: %r' % query\n log.exception(msg)\n raise SearchFailed()\n\n raw = clean_ascii_chars(xml_to_unicode(raw,\n strip_encoding_pats=True, resolve_entities=True)[0])\n\n if testing:\n import tempfile\n with tempfile.NamedTemporaryFile(prefix='amazon_results_',\n suffix='.html', delete=False) as f:\n f.write(raw.encode('utf-8'))\n print('Downloaded html for results page saved in', f.name)\n\n matches = []\n found = '<title>404 - ' not in raw\n\n if found:\n try:\n root = parse_html(raw)\n except Exception:\n msg = 'Failed to parse amazon page for query: %r' % query\n log.exception(msg)\n raise SearchFailed()\n\n matches = self.parse_results_page(root, domain)\n\n return matches, query, domain, None\n # }}}\n\n def search_search_engine(self, br, testing, log, abort, title, authors, identifiers, timeout, override_server=None): # {{{\n from calibre.ebooks.metadata.sources.update import search_engines_module\n se = search_engines_module()\n terms, domain = self.create_query(log, title=title, authors=authors,\n identifiers=identifiers, for_amazon=False)\n site = self.referrer_for_domain(\n domain)[len('https://'):].partition('/')[0]\n matches = []\n server = override_server or self.server\n if server == 'bing':\n urlproc, sfunc = se.bing_url_processor, se.bing_search\n elif server == 'wayback':\n urlproc, sfunc = se.wayback_url_processor, se.ddg_search\n elif server == 'ddg':\n urlproc, sfunc = se.ddg_url_processor, se.ddg_search\n elif server == 'google':\n urlproc, sfunc = se.google_url_processor, se.google_search\n else: # auto or unknown\n urlproc, sfunc = se.google_url_processor, se.google_search\n # urlproc, sfunc = se.bing_url_processor, se.bing_search\n try:\n results, qurl = sfunc(terms, site, log=log, br=br, timeout=timeout)\n except HTTPError as err:\n if err.code == 429 and sfunc is se.google_search:\n log('Got too many requests error from Google, trying via DuckDuckGo')\n urlproc, sfunc = se.ddg_url_processor, se.ddg_search\n results, qurl = sfunc(terms, site, log=log, br=br, timeout=timeout)\n else:\n raise\n\n br.set_current_header('Referer', qurl)\n for result in results:\n if abort.is_set():\n return matches, terms, domain, None\n\n purl = urlparse(result.url)\n if '/dp/' in purl.path and site in purl.netloc:\n # We cannot use cached URL as wayback machine no longer caches\n # amazon and Google and Bing web caches are no longer\n # accessible.\n url = result.url\n if url not in matches:\n matches.append(url)\n if len(matches) >= 3:\n break\n else:\n log('Skipping non-book result:', result)\n if not matches:\n log('No search engine results for terms:', ' '.join(terms))\n if urlproc is se.google_url_processor:\n # Google does not cache adult titles\n log('Trying the bing search engine instead')\n return self.search_search_engine(br, testing, log, abort, title, authors, identifiers, timeout, 'bing')\n return matches, terms, domain, urlproc\n # }}}\n\n def identify(self, log, result_queue, abort, title=None, authors=None, # {{{\n identifiers={}, timeout=60):\n '''\n Note this method will retry without identifiers automatically if no\n match is found with identifiers.\n '''\n\n testing = getattr(self, 'running_a_test', False)\n\n udata = self._get_book_url(identifiers)\n br = self.browser\n log('User-agent:', br.current_user_agent())\n log('Server:', self.server)\n if testing:\n print('User-agent:', br.current_user_agent())\n if udata is not None and not self.use_search_engine:\n # Try to directly get details page instead of running a search\n # Cannot use search engine as the directly constructed URL is\n # usually redirected to a full URL by amazon, and is therefore\n # not cached\n domain, idtype, asin, durl = udata\n if durl is not None:\n preparsed_root = parse_details_page(\n durl, log, timeout, br, domain)\n if preparsed_root is not None:\n qasin = parse_asin(preparsed_root[1], log, durl)\n if qasin == asin:\n w = Worker(durl, result_queue, br, log, 0, domain,\n self, testing=testing, preparsed_root=preparsed_root, timeout=timeout)\n try:\n w.get_details()\n return\n except Exception:\n log.exception(\n 'get_details failed for url: %r' % durl)\n func = self.search_search_engine if self.use_search_engine else self.search_amazon\n try:\n matches, query, domain, cover_url_processor = func(\n br, testing, log, abort, title, authors, identifiers, timeout)\n except SearchFailed:\n return\n\n if abort.is_set():\n return\n\n if not matches:\n if identifiers and title and authors:\n log('No matches found with identifiers, retrying using only'\n ' title and authors. Query: %r' % query)\n time.sleep(1)\n return self.identify(log, result_queue, abort, title=title,\n authors=authors, timeout=timeout)\n log.error('No matches found with query: %r' % query)\n return\n\n if self.prefs['prefer_kindle_edition']:\n matches = sort_matches_preferring_kindle_editions(matches)\n\n workers = [Worker(\n url, result_queue, br, log, i, domain, self, testing=testing, timeout=timeout,\n cover_url_processor=cover_url_processor, filter_result=partial(\n self.filter_result, title, authors, identifiers)) for i, url in enumerate(matches)]\n\n for w in workers:\n # Don't send all requests at the same time\n time.sleep(1)\n w.start()\n if abort.is_set():\n return\n\n while not abort.is_set():\n a_worker_is_alive = False\n for w in workers:\n w.join(0.2)\n if abort.is_set():\n break\n if w.is_alive():\n a_worker_is_alive = True\n if not a_worker_is_alive:\n break\n\n return None\n # }}}\n\n def filter_result(self, title, authors, identifiers, mi, log): # {{{\n if not self.use_search_engine:\n return True\n if title is not None:\n import regex\n only_punctuation_pat = regex.compile(r'^\\p{P}+$')\n\n def tokenize_title(x):\n ans = icu_lower(x).replace(\"'\", '').replace('\"', '').rstrip(':')\n if only_punctuation_pat.match(ans) is not None:\n ans = ''\n return ans\n\n tokens = {tokenize_title(x) for x in title.split() if len(x) > 3}\n tokens.discard('')\n if tokens:\n result_tokens = {tokenize_title(x) for x in mi.title.split()}\n result_tokens.discard('')\n if not tokens.intersection(result_tokens):\n log('Ignoring result:', mi.title, 'as its title does not match')\n return False\n if authors:\n author_tokens = set()\n for author in authors:\n author_tokens |= {icu_lower(x) for x in author.split() if len(x) > 2}\n result_tokens = set()\n for author in mi.authors:\n result_tokens |= {icu_lower(x) for x in author.split() if len(x) > 2}\n if author_tokens and not author_tokens.intersection(result_tokens):\n log('Ignoring result:', mi.title, 'by', ' & '.join(mi.authors), 'as its author does not match')\n return False\n return True\n # }}}\n\n def download_cover(self, log, result_queue, abort, # {{{\n title=None, authors=None, identifiers={}, timeout=60, get_best_cover=False):\n cached_url = self.get_cached_cover_url(identifiers)\n if cached_url is None:\n log.info('No cached cover found, running identify')\n rq = Queue()\n self.identify(log, rq, abort, title=title, authors=authors,\n identifiers=identifiers)\n if abort.is_set():\n return\n results = []\n while True:\n try:\n results.append(rq.get_nowait())\n except Empty:\n break\n results.sort(key=self.identify_results_keygen(\n title=title, authors=authors, identifiers=identifiers))\n for mi in results:\n cached_url = self.get_cached_cover_url(mi.identifiers)\n if cached_url is not None:\n break\n if cached_url is None:\n log.info('No cover found')\n return\n\n if abort.is_set():\n return\n log('Downloading cover from:', cached_url)\n br = self.browser\n if self.use_search_engine:\n br = br.clone_browser()\n br.set_current_header('Referer', self.referrer_for_domain(self.domain))\n try:\n time.sleep(1)\n cdata = br.open_novisit(\n cached_url, timeout=timeout).read()\n result_queue.put((self, cdata))\n except Exception:\n log.exception('Failed to download cover from:', cached_url)\n # }}}\n\n\ndef manual_tests(domain, **kw): # {{{\n # To run these test use:\n # calibre-debug -c \"from calibre.ebooks.metadata.sources.amazon import *; manual_tests('com')\"\n from calibre.ebooks.metadata.sources.test import authors_test, comments_test, isbn_test, series_test, test_identify_plugin, title_test\n all_tests = {}\n all_tests['com'] = [ # {{{\n ( # in title\n {'title': 'Expert C# 2008 Business Objects',\n 'authors': ['Lhotka']},\n [title_test('Expert C#'),\n authors_test(['Rockford Lhotka'])\n ]\n ),\n\n ( # Paperback with series\n {'identifiers': {'amazon': '1423146786'}},\n [title_test('Heroes of Olympus', exact=False), series_test('The Heroes of Olympus', 5)]\n ),\n\n ( # Kindle edition with series\n {'identifiers': {'amazon': 'B0085UEQDO'}},\n [title_test('Three Parts Dead', exact=True),\n series_test('Craft Sequence', 1)]\n ),\n\n ( # + in title and uses id=\"main-image\" for cover\n {'identifiers': {'amazon': '1933988770'}},\n [title_test(\n 'C++ Concurrency in Action: Practical Multithreading', exact=True)]\n ),\n\n\n ( # Different comments markup, using Book Description section\n {'identifiers': {'amazon': '0982514506'}},\n [title_test(\n \"Griffin's Destiny\",\n exact=True),\n comments_test('Jelena'), comments_test('Ashinji'),\n ]\n ),\n\n ( # New search results page markup (Dec 2024)\n {'title': 'Come si scrive un articolo medico-scientifico'},\n [title_test('Come si scrive un articolo medico-scientifico', exact=True)]\n ),\n\n ( # No specific problems\n {'identifiers': {'isbn': '0743273567'}},\n [title_test('the great gatsby'),\n authors_test(['f. Scott Fitzgerald'])]\n ),\n\n ]\n\n # }}}\n\n all_tests['de'] = [ # {{{\n # series\n (\n {'identifiers': {'isbn': '3499275120'}},\n [title_test('Vespasian: Das Schwert des Tribuns: Historischer Roman',\n exact=False), authors_test(['Robert Fabbri']), series_test('Die Vespasian-Reihe', 1)\n ]\n\n ),\n\n ( # umlaut in title/authors\n {'title': 'Flüsternde Wälder',\n 'authors': ['Nicola Förg']},\n [title_test('Flüsternde Wälder'),\n authors_test(['Nicola Förg'], subset=True)\n ]\n ),\n\n (\n {'identifiers': {'isbn': '9783453314979'}},\n [title_test('Die letzten Wächter: Roman',\n exact=False), authors_test(['Sergej Lukianenko'])\n ]\n\n ),\n\n (\n {'identifiers': {'isbn': '3548283519'}},\n [title_test('Wer Wind Sät: Der Fünfte Fall Für Bodenstein Und Kirchhoff',\n exact=False), authors_test(['Nele Neuhaus'])\n ]\n\n ),\n ] # }}}\n\n all_tests['it'] = [ # {{{\n (\n {'identifiers': {'isbn': '8838922195'}},\n [title_test('La briscola in cinque',\n exact=True), authors_test(['Marco Malvaldi'])\n ]\n\n ),\n ] # }}}\n\n all_tests['fr'] = [ # {{{\n (\n {'identifiers': {'amazon_fr': 'B07L7ST4RS'}},\n [title_test('Le secret de Lola', exact=True),\n authors_test(['Amélie BRIZIO'])\n ]\n ),\n (\n {'identifiers': {'isbn': '2221116798'}},\n [title_test(\"L'étrange voyage de Monsieur Daldry\",\n exact=True), authors_test(['Marc Levy'])\n ]\n\n ),\n ] # }}}\n\n all_tests['es'] = [ # {{{\n (\n {'identifiers': {'isbn': '8483460831'}},\n [title_test('Tiempos Interesantes',\n exact=False), authors_test(['Terry Pratchett'])\n ]\n\n ),\n ] # }}}\n\n all_tests['se'] = [ # {{{\n (\n {'identifiers': {'isbn': '9780552140287'}},\n [title_test('Men At Arms: A Discworld Novel: 14',\n exact=False), authors_test(['Terry Pratchett'])\n ]\n\n ),\n ] # }}}\n\n all_tests['jp'] = [ # {{{\n ( # Adult filtering test\n {'identifiers': {'isbn': '4799500066'}},\n [title_test('Bitch ï¼´ï½’ï½ï½'), ]\n ),\n\n ( # isbn -> title, authors\n {'identifiers': {'isbn': '9784101302720'}},\n [title_test('精霊ã®å®ˆã‚Šäºº',\n exact=True), authors_test(['上橋 èœç©‚å'])\n ]\n ),\n ( # title, authors -> isbn (will use Shift_JIS encoding in query.)\n {'title': '考ãˆãªã„ç·´ç¿’',\n 'authors': ['å°æ± é¾ä¹‹ä»‹']},\n [isbn_test('9784093881067'), ]\n ),\n ] # }}}\n\n all_tests['br'] = [ # {{{\n (\n {'title': 'A Ascensão da Sombra'},\n [title_test('A Ascensão da Sombra'), authors_test(['Robert Jordan'])]\n ),\n\n (\n {'title': 'Guerra dos Tronos'},\n [title_test('A Guerra dos Tronos. As Crônicas de Gelo e Fogo - Livro 1'), authors_test(['George R. R. Martin'])\n ]\n\n ),\n ] # }}}\n\n all_tests['nl'] = [ # {{{\n (\n {'title': 'Freakonomics'},\n [title_test('Freakonomics',\n exact=True), authors_test(['Steven Levitt & Stephen Dubner & R. Kuitenbrouwer & O. Brenninkmeijer & A. van Den Berg'])\n ]\n\n ),\n ] # }}}\n\n all_tests['cn'] = [ # {{{\n (\n {'identifiers': {'isbn': '9787115369512'}},\n [title_test('若为自由故 è‡ªç”±è½¯ä»¶ä¹‹çˆ¶ç†æŸ¥å¾·æ–¯æ‰˜æ›¼ä¼ ', exact=True),\n authors_test(['[美]sam Williams', 'é‚“æ¥ ï¼ŒæŽå‡¡å¸Œ'])]\n ),\n (\n {'title': '爱上Raspberry Pi'},\n [title_test('爱上Raspberry Pi',\n exact=True), authors_test(['Matt Richardson', 'Shawn Wallace', 'æŽå‡¡å¸Œ'])\n ]\n\n ),\n ] # }}}\n\n all_tests['ca'] = [ # {{{\n ( # Paperback with series\n {'identifiers': {'isbn': '9781623808747'}},\n [title_test('Parting Shot', exact=True),\n authors_test(['Mary Calmes'])]\n ),\n ( # in title\n {'title': 'Expert C# 2008 Business Objects',\n 'authors': ['Lhotka']},\n [title_test('Expert C# 2008 Business Objects'),\n authors_test(['Rockford Lhotka'])]\n ),\n ( # noscript description\n {'identifiers': {'amazon_ca': '162380874X'}},\n [title_test('Parting Shot', exact=True), authors_test(['Mary Calmes'])\n ]\n ),\n ] # }}}\n\n all_tests['in'] = [ # {{{\n ( # Paperback with series\n {'identifiers': {'amazon_in': '1423146786'}},\n [title_test('The Heroes of Olympus, Book Five The Blood of Olympus', exact=True)]\n ),\n ] # }}}\n\n def do_test(domain, start=0, stop=None, server='auto'):\n tests = all_tests[domain]\n if stop is None:\n stop = len(tests)\n tests = tests[start:stop]\n test_identify_plugin(Amazon.name, tests, modify_plugin=lambda p: (\n setattr(p, 'testing_domain', domain),\n setattr(p, 'touched_fields', p.touched_fields - {'tags'}),\n setattr(p, 'testing_server', server),\n ))\n\n do_test(domain, **kw)\n# }}}\n", + "big_book_search": "#!/usr/bin/env python\n# vim:fileencoding=UTF-8\nfrom __future__ import absolute_import, division, print_function, unicode_literals\n\n__license__ = 'GPL v3'\n__copyright__ = '2013, Kovid Goyal <kovid@kovidgoyal.net>'\n__docformat__ = 'restructuredtext en'\n\nfrom calibre.ebooks.metadata.sources.base import Option, Source\n\n\ndef get_urls(br, tokens):\n from urllib.parse import quote_plus\n\n from html5_parser import parse\n escaped = (quote_plus(x) for x in tokens if x and x.strip())\n q = '+'.join(escaped)\n url = 'https://bigbooksearch.com/please-dont-scrape-my-site-you-will-put-my-api-key-over-the-usage-limit-and-the-site-will-break/books/'+q\n raw = br.open(url).read()\n root = parse(raw.decode('utf-8'))\n urls = [i.get('src') for i in root.xpath('//img[@src]')]\n return urls\n\n\nclass BigBookSearch(Source):\n\n name = 'Big Book Search'\n version = (1, 0, 1)\n minimum_calibre_version = (2, 80, 0)\n description = _('Downloads multiple book covers from Amazon. Useful to find alternate covers.')\n capabilities = frozenset(['cover'])\n can_get_multiple_covers = True\n options = (Option('max_covers', 'number', 5, _('Maximum number of covers to get'),\n _('The maximum number of covers to process from the search result')),\n )\n supports_gzip_transfer_encoding = True\n\n def download_cover(self, log, result_queue, abort,\n title=None, authors=None, identifiers={}, timeout=30, get_best_cover=False):\n if not title:\n return\n br = self.browser\n tokens = tuple(self.get_title_tokens(title)) + tuple(self.get_author_tokens(authors))\n urls = get_urls(br, tokens)\n self.download_multiple_covers(title, authors, urls, get_best_cover, timeout, result_queue, abort, log)\n\n\ndef test():\n import pprint\n\n from calibre import browser\n br = browser()\n urls = get_urls(br, ['consider', 'phlebas', 'banks'])\n pprint.pprint(urls)\n\n\nif __name__ == '__main__':\n test()\n", + "edelweiss": "#!/usr/bin/env python\n# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:fdm=marker:ai\nfrom __future__ import absolute_import, division, print_function, unicode_literals\n\n__license__ = 'GPL v3'\n__copyright__ = '2013, Kovid Goyal <kovid at kovidgoyal.net>'\n__docformat__ = 'restructuredtext en'\n\nimport re\nimport time\nfrom threading import Thread\n\ntry:\n from queue import Empty, Queue\nexcept ImportError:\n from Queue import Empty, Queue\n\nfrom calibre import as_unicode, random_user_agent\nfrom calibre.ebooks.metadata import check_isbn\nfrom calibre.ebooks.metadata.sources.base import Source\n\n\ndef clean_html(raw):\n from calibre.ebooks.chardet import xml_to_unicode\n from calibre.utils.cleantext import clean_ascii_chars\n return clean_ascii_chars(xml_to_unicode(raw, strip_encoding_pats=True,\n resolve_entities=True, assume_utf8=True)[0])\n\n\ndef parse_html(raw):\n raw = clean_html(raw)\n from html5_parser import parse\n return parse(raw)\n\n\ndef astext(node):\n from lxml import etree\n return etree.tostring(node, method='text', encoding='unicode',\n with_tail=False).strip()\n\n\nclass Worker(Thread): # {{{\n\n def __init__(self, basic_data, relevance, result_queue, br, timeout, log, plugin):\n Thread.__init__(self)\n self.daemon = True\n self.basic_data = basic_data\n self.br, self.log, self.timeout = br, log, timeout\n self.result_queue, self.plugin, self.sku = result_queue, plugin, self.basic_data['sku']\n self.relevance = relevance\n\n def run(self):\n url = ('https://www.edelweiss.plus/GetTreelineControl.aspx?controlName=/uc/product/two_Enhanced.ascx&'\n 'sku={0}&idPrefix=content_1_{0}&mode=0'.format(self.sku))\n try:\n raw = self.br.open_novisit(url, timeout=self.timeout).read()\n except Exception:\n self.log.exception('Failed to load comments page: %r'%url)\n return\n\n try:\n mi = self.parse(raw)\n mi.source_relevance = self.relevance\n self.plugin.clean_downloaded_metadata(mi)\n self.result_queue.put(mi)\n except Exception:\n self.log.exception('Failed to parse details for sku: %s'%self.sku)\n\n def parse(self, raw):\n from calibre.ebooks.metadata.book.base import Metadata\n from calibre.utils.date import UNDEFINED_DATE\n root = parse_html(raw)\n mi = Metadata(self.basic_data['title'], self.basic_data['authors'])\n\n # Identifiers\n if self.basic_data['isbns']:\n mi.isbn = self.basic_data['isbns'][0]\n mi.set_identifier('edelweiss', self.sku)\n\n # Tags\n if self.basic_data['tags']:\n mi.tags = self.basic_data['tags']\n mi.tags = [t[1:].strip() if t.startswith('&') else t for t in mi.tags]\n\n # Publisher\n mi.publisher = self.basic_data['publisher']\n\n # Pubdate\n if self.basic_data['pubdate'] and self.basic_data['pubdate'].year != UNDEFINED_DATE:\n mi.pubdate = self.basic_data['pubdate']\n\n # Rating\n if self.basic_data['rating']:\n mi.rating = self.basic_data['rating']\n\n # Comments\n comments = ''\n for cid in ('summary', 'contributorbio', 'quotes_reviews'):\n cid = 'desc_{}{}-content'.format(cid, self.sku)\n div = root.xpath('//*[@id=\"{}\"]'.format(cid))\n if div:\n comments += self.render_comments(div[0])\n if comments:\n mi.comments = comments\n\n mi.has_cover = self.plugin.cached_identifier_to_cover_url(self.sku) is not None\n return mi\n\n def render_comments(self, desc):\n from lxml import etree\n\n from calibre.library.comments import sanitize_comments_html\n for c in desc.xpath('descendant::noscript'):\n c.getparent().remove(c)\n for a in desc.xpath('descendant::a[@href]'):\n del a.attrib['href']\n a.tag = 'span'\n desc = etree.tostring(desc, method='html', encoding='unicode').strip()\n\n # remove all attributes from tags\n desc = re.sub(r'<([a-zA-Z0-9]+)\\s[^>]+>', r'<\\1>', desc)\n # Collapse whitespace\n # desc = re.sub(r'\\n+', '\\n', desc)\n # desc = re.sub(r' +', ' ', desc)\n # Remove comments\n desc = re.sub(r'(?s)<!--.*?-->', '', desc)\n return sanitize_comments_html(desc)\n# }}}\n\n\ndef get_basic_data(browser, log, *skus):\n from mechanize import Request\n\n from calibre.utils.date import parse_only_date\n zeroes = ','.join('0' for sku in skus)\n data = {\n 'skus': ','.join(skus),\n 'drc': zeroes,\n 'startPosition': '0',\n 'sequence': '1',\n 'selected': zeroes,\n 'itemID': '0',\n 'orderID': '0',\n 'mailingID': '',\n 'tContentWidth': '926',\n 'originalOrder': ','.join(type('')(i) for i in range(len(skus))),\n 'selectedOrderID': '0',\n 'selectedSortColumn': '0',\n 'listType': '1',\n 'resultType': '32',\n 'blockView': '1',\n }\n items_data_url = 'https://www.edelweiss.plus/GetTreelineControl.aspx?controlName=/uc/listviews/ListView_Title_Multi.ascx'\n req = Request(items_data_url, data)\n response = browser.open_novisit(req)\n raw = response.read()\n root = parse_html(raw)\n for item in root.xpath('//div[@data-priority]'):\n row = item.getparent().getparent()\n sku = item.get('id').split('-')[-1]\n isbns = [x.strip() for x in row.xpath('descendant::*[contains(@class, \"pev_sku\")]/text()')[0].split(',') if check_isbn(x.strip())]\n isbns.sort(key=len, reverse=True)\n try:\n tags = [x.strip() for x in astext(row.xpath('descendant::*[contains(@class, \"pev_categories\")]')[0]).split('/')]\n except IndexError:\n tags = []\n rating = 0\n for bar in row.xpath('descendant::*[contains(@class, \"bgdColorCommunity\")]/@style'):\n m = re.search(r'width: (\\d+)px;.*max-width: (\\d+)px', bar)\n if m is not None:\n rating = float(m.group(1)) / float(m.group(2))\n break\n try:\n pubdate = parse_only_date(astext(row.xpath('descendant::*[contains(@class, \"pev_shipDate\")]')[0]\n ).split(':')[-1].split(u'\\xa0')[-1].strip(), assume_utc=True)\n except Exception:\n log.exception('Error parsing published date')\n pubdate = None\n authors = []\n for x in [x.strip() for x in row.xpath('descendant::*[contains(@class, \"pev_contributor\")]/@title')]:\n authors.extend(a.strip() for a in x.split(','))\n entry = {\n 'sku': sku,\n 'cover': row.xpath('descendant::img/@src')[0].split('?')[0],\n 'publisher': astext(row.xpath('descendant::*[contains(@class, \"headerPublisher\")]')[0]),\n 'title': astext(row.xpath('descendant::*[@id=\"title_{}\"]'.format(sku))[0]),\n 'authors': authors,\n 'isbns': isbns,\n 'tags': tags,\n 'pubdate': pubdate,\n 'format': ' '.join(row.xpath('descendant::*[contains(@class, \"pev_format\")]/text()')).strip(),\n 'rating': rating,\n }\n if entry['cover'].startswith('/'):\n entry['cover'] = None\n yield entry\n\n\nclass Edelweiss(Source):\n\n name = 'Edelweiss'\n version = (2, 0, 1)\n minimum_calibre_version = (3, 6, 0)\n description = _('Downloads metadata and covers from Edelweiss - A catalog updated by book publishers')\n\n capabilities = frozenset(['identify', 'cover'])\n touched_fields = frozenset([\n 'title', 'authors', 'tags', 'pubdate', 'comments', 'publisher',\n 'identifier:isbn', 'identifier:edelweiss', 'rating'])\n supports_gzip_transfer_encoding = True\n has_html_comments = True\n\n @property\n def user_agent(self):\n # Pass in an index to random_user_agent() to test with a particular\n # user agent\n return random_user_agent(allow_ie=False)\n\n def _get_book_url(self, sku):\n if sku:\n return 'https://www.edelweiss.plus/#sku={}&page=1'.format(sku)\n\n def get_book_url(self, identifiers): # {{{\n sku = identifiers.get('edelweiss', None)\n if sku:\n return 'edelweiss', sku, self._get_book_url(sku)\n\n # }}}\n\n def get_cached_cover_url(self, identifiers): # {{{\n sku = identifiers.get('edelweiss', None)\n if not sku:\n isbn = identifiers.get('isbn', None)\n if isbn is not None:\n sku = self.cached_isbn_to_identifier(isbn)\n return self.cached_identifier_to_cover_url(sku)\n # }}}\n\n def create_query(self, log, title=None, authors=None, identifiers={}):\n try:\n from urllib.parse import urlencode\n except ImportError:\n from urllib import urlencode\n import time\n BASE_URL = ('https://www.edelweiss.plus/GetTreelineControl.aspx?'\n 'controlName=/uc/listviews/controls/ListView_data.ascx&itemID=0&resultType=32&dashboardType=8&itemType=1&dataType=products&keywordSearch&')\n keywords = []\n isbn = check_isbn(identifiers.get('isbn', None))\n if isbn is not None:\n keywords.append(isbn)\n elif title:\n title_tokens = list(self.get_title_tokens(title))\n if title_tokens:\n keywords.extend(title_tokens)\n author_tokens = self.get_author_tokens(authors, only_first_author=True)\n if author_tokens:\n keywords.extend(author_tokens)\n if not keywords:\n return None\n params = {\n 'q': (' '.join(keywords)).encode('utf-8'),\n '_': type('')(int(time.time()))\n }\n return BASE_URL+urlencode(params)\n\n # }}}\n\n def identify(self, log, result_queue, abort, title=None, authors=None, # {{{\n identifiers={}, timeout=30):\n import json\n\n br = self.browser\n br.addheaders = [\n ('Referer', 'https://www.edelweiss.plus/'),\n ('X-Requested-With', 'XMLHttpRequest'),\n ('Cache-Control', 'no-cache'),\n ('Pragma', 'no-cache'),\n ]\n if 'edelweiss' in identifiers:\n items = [identifiers['edelweiss']]\n else:\n log.error('Currently Edelweiss returns random books for search queries')\n return\n query = self.create_query(log, title=title, authors=authors,\n identifiers=identifiers)\n if not query:\n log.error('Insufficient metadata to construct query')\n return\n log('Using query URL:', query)\n try:\n raw = br.open(query, timeout=timeout).read().decode('utf-8')\n except Exception as e:\n log.exception('Failed to make identify query: %r'%query)\n return as_unicode(e)\n items = re.search(r'window[.]items\\s*=\\s*(.+?);', raw)\n if items is None:\n log.error('Failed to get list of matching items')\n log.debug('Response text:')\n log.debug(raw)\n return\n items = json.loads(items.group(1))\n\n if (not items and identifiers and title and authors and\n not abort.is_set()):\n return self.identify(log, result_queue, abort, title=title,\n authors=authors, timeout=timeout)\n\n if not items:\n return\n\n workers = []\n items = items[:5]\n for i, item in enumerate(get_basic_data(self.browser, log, *items)):\n sku = item['sku']\n for isbn in item['isbns']:\n self.cache_isbn_to_identifier(isbn, sku)\n if item['cover']:\n self.cache_identifier_to_cover_url(sku, item['cover'])\n fmt = item['format'].lower()\n if 'audio' in fmt or 'mp3' in fmt:\n continue # Audio-book, ignore\n workers.append(Worker(item, i, result_queue, br.clone_browser(), timeout, log, self))\n\n if not workers:\n return\n\n for w in workers:\n w.start()\n # Don't send all requests at the same time\n time.sleep(0.1)\n\n while not abort.is_set():\n a_worker_is_alive = False\n for w in workers:\n w.join(0.2)\n if abort.is_set():\n break\n if w.is_alive():\n a_worker_is_alive = True\n if not a_worker_is_alive:\n break\n\n # }}}\n\n def download_cover(self, log, result_queue, abort, # {{{\n title=None, authors=None, identifiers={}, timeout=30, get_best_cover=False):\n cached_url = self.get_cached_cover_url(identifiers)\n if cached_url is None:\n log.info('No cached cover found, running identify')\n rq = Queue()\n self.identify(log, rq, abort, title=title, authors=authors,\n identifiers=identifiers)\n if abort.is_set():\n return\n results = []\n while True:\n try:\n results.append(rq.get_nowait())\n except Empty:\n break\n results.sort(key=self.identify_results_keygen(\n title=title, authors=authors, identifiers=identifiers))\n for mi in results:\n cached_url = self.get_cached_cover_url(mi.identifiers)\n if cached_url is not None:\n break\n if cached_url is None:\n log.info('No cover found')\n return\n\n if abort.is_set():\n return\n br = self.browser\n log('Downloading cover from:', cached_url)\n try:\n cdata = br.open_novisit(cached_url, timeout=timeout).read()\n result_queue.put((self, cdata))\n except Exception:\n log.exception('Failed to download cover from:', cached_url)\n # }}}\n\n\nif __name__ == '__main__':\n from calibre.ebooks.metadata.sources.test import authors_test, comments_test, pubdate_test, test_identify_plugin, title_test\n tests = [\n ( # A title and author search\n {'title': \"The Husband's Secret\", 'authors':['Liane Moriarty']},\n [title_test(\"The Husband's Secret\", exact=True),\n authors_test(['Liane Moriarty'])]\n ),\n\n ( # An isbn present in edelweiss\n {'identifiers':{'isbn': '9780312621360'}, },\n [title_test('Flame: A Sky Chasers Novel', exact=True),\n authors_test(['Amy Kathleen Ryan'])]\n ),\n\n # Multiple authors and two part title and no general description\n ({'identifiers':{'edelweiss':'0321180607'}},\n [title_test('XQuery From the Experts: A Guide to the W3C XML Query Language', exact=True),\n authors_test([\n 'Howard Katz', 'Don Chamberlin', 'Denise Draper', 'Mary Fernandez',\n 'Michael Kay', 'Jonathan Robie', 'Michael Rys', 'Jerome Simeon',\n 'Jim Tivy', 'Philip Wadler']),\n pubdate_test(2003, 8, 22),\n comments_test('Jérôme Siméon'), lambda mi: bool(mi.comments and 'No title summary' not in mi.comments)\n ]),\n ]\n start, stop = 0, len(tests)\n\n tests = tests[start:stop]\n test_identify_plugin(Edelweiss.name, tests)\n", + "google": "#!/usr/bin/env python\n# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai\n# License: GPLv3 Copyright: 2011, Kovid Goyal <kovid at kovidgoyal.net>\nfrom __future__ import absolute_import, division, print_function, unicode_literals\n\nimport hashlib\nimport os\nimport re\nimport sys\nimport tempfile\nimport time\n\nimport regex\n\ntry:\n from queue import Empty, Queue\nexcept ImportError:\n from Queue import Empty, Queue\n\nfrom calibre import as_unicode, prepare_string_for_xml, replace_entities\nfrom calibre.ebooks.chardet import xml_to_unicode\nfrom calibre.ebooks.metadata import authors_to_string, check_isbn\nfrom calibre.ebooks.metadata.book.base import Metadata\nfrom calibre.ebooks.metadata.sources.base import Source\nfrom calibre.utils.cleantext import clean_ascii_chars\nfrom calibre.utils.localization import canonicalize_lang\n\nNAMESPACES = {\n 'openSearch': 'http://a9.com/-/spec/opensearchrss/1.0/',\n 'atom': 'http://www.w3.org/2005/Atom',\n 'dc': 'http://purl.org/dc/terms',\n 'gd': 'http://schemas.google.com/g/2005'\n}\n\n\ndef pretty_google_books_comments(raw):\n raw = replace_entities(raw)\n # Paragraphs in the comments are removed but whatever software googl uses\n # to do this does not insert a space so we often find the pattern\n # word.Capital in the comments which can be used to find paragraph markers.\n parts = []\n for x in re.split(r'([a-z)\"â€])(\\.)([A-Z(\"“])', raw):\n if x == '.':\n parts.append('.</p>\\n\\n<p>')\n else:\n parts.append(prepare_string_for_xml(x))\n raw = '<p>' + ''.join(parts) + '</p>'\n return raw\n\n\ndef get_details(browser, url, timeout): # {{{\n try:\n raw = browser.open_novisit(url, timeout=timeout).read()\n except Exception as e:\n gc = getattr(e, 'getcode', lambda: -1)\n if gc() != 403:\n raise\n # Google is throttling us, wait a little\n time.sleep(2)\n raw = browser.open_novisit(url, timeout=timeout).read()\n\n return raw\n# }}}\n\n\nxpath_cache = {}\n\n\ndef XPath(x):\n ans = xpath_cache.get(x)\n if ans is None:\n from lxml import etree\n ans = xpath_cache[x] = etree.XPath(x, namespaces=NAMESPACES)\n return ans\n\n\ndef to_metadata(browser, log, entry_, timeout, running_a_test=False): # {{{\n from calibre.utils.xml_parse import safe_xml_fromstring\n # total_results = XPath('//openSearch:totalResults')\n # start_index = XPath('//openSearch:startIndex')\n # items_per_page = XPath('//openSearch:itemsPerPage')\n entry = XPath('//atom:entry')\n entry_id = XPath('descendant::atom:id')\n url = XPath('descendant::atom:link[@rel=\"self\"]/@href')\n creator = XPath('descendant::dc:creator')\n identifier = XPath('descendant::dc:identifier')\n title = XPath('descendant::dc:title')\n date = XPath('descendant::dc:date')\n publisher = XPath('descendant::dc:publisher')\n subject = XPath('descendant::dc:subject')\n description = XPath('descendant::dc:description')\n language = XPath('descendant::dc:language')\n\n # print(etree.tostring(entry_, pretty_print=True))\n\n def get_text(extra, x):\n try:\n ans = x(extra)\n if ans:\n ans = ans[0].text\n if ans and ans.strip():\n return ans.strip()\n except Exception:\n log.exception('Programming error:')\n return None\n\n def get_extra_details():\n raw = get_details(browser, details_url, timeout)\n if running_a_test:\n with open(os.path.join(tempfile.gettempdir(), 'Google-' + details_url.split('/')[-1] + '.xml'), 'wb') as f:\n f.write(raw)\n print('Book details saved to:', f.name, file=sys.stderr)\n feed = safe_xml_fromstring(xml_to_unicode(clean_ascii_chars(raw), strip_encoding_pats=True)[0])\n return entry(feed)[0]\n\n if isinstance(entry_, str):\n google_id = entry_\n details_url = 'https://www.google.com/books/feeds/volumes/' + google_id\n extra = get_extra_details()\n title_ = ': '.join([x.text for x in title(extra)]).strip()\n authors = [x.text.strip() for x in creator(extra) if x.text]\n else:\n id_url = entry_id(entry_)[0].text\n google_id = id_url.split('/')[-1]\n details_url = url(entry_)[0]\n title_ = ': '.join([x.text for x in title(entry_)]).strip()\n authors = [x.text.strip() for x in creator(entry_) if x.text]\n if not id_url or not title:\n # Silently discard this entry\n return None\n extra = None\n\n if not authors:\n authors = [_('Unknown')]\n if not title:\n return None\n if extra is None:\n extra = get_extra_details()\n mi = Metadata(title_, authors)\n mi.identifiers = {'google': google_id}\n mi.comments = get_text(extra, description)\n lang = canonicalize_lang(get_text(extra, language))\n if lang:\n mi.language = lang\n mi.publisher = get_text(extra, publisher)\n\n # ISBN\n isbns = []\n for x in identifier(extra):\n t = type('')(x.text).strip()\n if t[:5].upper() in ('ISBN:', 'LCCN:', 'OCLC:'):\n if t[:5].upper() == 'ISBN:':\n t = check_isbn(t[5:])\n if t:\n isbns.append(t)\n if isbns:\n mi.isbn = sorted(isbns, key=len)[-1]\n mi.all_isbns = isbns\n\n # Tags\n try:\n btags = [x.text for x in subject(extra) if x.text]\n tags = []\n for t in btags:\n atags = [y.strip() for y in t.split('/')]\n for tag in atags:\n if tag not in tags:\n tags.append(tag)\n except Exception:\n log.exception('Failed to parse tags:')\n tags = []\n if tags:\n mi.tags = [x.replace(',', ';') for x in tags]\n\n # pubdate\n pubdate = get_text(extra, date)\n if pubdate:\n from calibre.utils.date import parse_date, utcnow\n try:\n default = utcnow().replace(day=15)\n mi.pubdate = parse_date(pubdate, assume_utc=True, default=default)\n except Exception:\n log.error('Failed to parse pubdate %r' % pubdate)\n\n # Cover\n mi.has_google_cover = None\n for x in extra.xpath(\n '//*[@href and @rel=\"http://schemas.google.com/books/2008/thumbnail\"]'\n ):\n mi.has_google_cover = x.get('href')\n break\n\n return mi\n\n# }}}\n\n\nclass GoogleBooks(Source):\n\n name = 'Google'\n version = (1, 1, 3)\n minimum_calibre_version = (2, 80, 0)\n description = _('Downloads metadata and covers from Google Books')\n\n capabilities = frozenset({'identify'})\n touched_fields = frozenset({\n 'title', 'authors', 'tags', 'pubdate', 'comments', 'publisher',\n 'identifier:isbn', 'identifier:google', 'languages'\n })\n supports_gzip_transfer_encoding = True\n cached_cover_url_is_reliable = False\n\n GOOGLE_COVER = 'https://books.google.com/books?id=%s&printsec=frontcover&img=1'\n\n DUMMY_IMAGE_MD5 = frozenset(\n ('0de4383ebad0adad5eeb8975cd796657', 'a64fa89d7ebc97075c1d363fc5fea71f')\n )\n\n def get_book_url(self, identifiers): # {{{\n goog = identifiers.get('google', None)\n if goog is not None:\n return ('google', goog, 'https://books.google.com/books?id=%s' % goog)\n # }}}\n\n def id_from_url(self, url): # {{{\n from polyglot.urllib import parse_qs, urlparse\n purl = urlparse(url)\n if purl.netloc == 'books.google.com':\n q = parse_qs(purl.query)\n gid = q.get('id')\n if gid:\n return 'google', gid[0]\n # }}}\n\n def create_query(self, title=None, authors=None, identifiers={}, capitalize_isbn=False): # {{{\n try:\n from urllib.parse import urlencode\n except ImportError:\n from urllib import urlencode\n BASE_URL = 'https://books.google.com/books/feeds/volumes?'\n isbn = check_isbn(identifiers.get('isbn', None))\n q = ''\n if isbn is not None:\n q += ('ISBN:' if capitalize_isbn else 'isbn:') + isbn\n elif title or authors:\n\n def build_term(prefix, parts):\n return ' '.join('in' + prefix + ':' + x for x in parts)\n\n title_tokens = list(self.get_title_tokens(title))\n if title_tokens:\n q += build_term('title', title_tokens)\n author_tokens = list(self.get_author_tokens(authors, only_first_author=True))\n if author_tokens:\n q += ('+' if q else '') + build_term('author', author_tokens)\n\n if not q:\n return None\n if not isinstance(q, bytes):\n q = q.encode('utf-8')\n return BASE_URL + urlencode({\n 'q': q,\n 'max-results': 20,\n 'start-index': 1,\n 'min-viewability': 'none',\n })\n\n # }}}\n\n def download_cover( # {{{\n self,\n log,\n result_queue,\n abort,\n title=None,\n authors=None,\n identifiers={},\n timeout=30,\n get_best_cover=False\n ):\n cached_url = self.get_cached_cover_url(identifiers)\n if cached_url is None:\n log.info('No cached cover found, running identify')\n rq = Queue()\n self.identify(\n log,\n rq,\n abort,\n title=title,\n authors=authors,\n identifiers=identifiers\n )\n if abort.is_set():\n return\n results = []\n while True:\n try:\n results.append(rq.get_nowait())\n except Empty:\n break\n results.sort(\n key=self.identify_results_keygen(\n title=title, authors=authors, identifiers=identifiers\n )\n )\n for mi in results:\n cached_url = self.get_cached_cover_url(mi.identifiers)\n if cached_url is not None:\n break\n if cached_url is None:\n log.info('No cover found')\n return\n\n br = self.browser\n for candidate in (0, 1):\n if abort.is_set():\n return\n url = cached_url + '&zoom={}'.format(candidate)\n log('Downloading cover from:', cached_url)\n try:\n cdata = br.open_novisit(url, timeout=timeout).read()\n if cdata:\n if hashlib.md5(cdata).hexdigest() in self.DUMMY_IMAGE_MD5:\n log.warning('Google returned a dummy image, ignoring')\n else:\n result_queue.put((self, cdata))\n break\n except Exception:\n log.exception('Failed to download cover from:', cached_url)\n\n # }}}\n\n def get_cached_cover_url(self, identifiers): # {{{\n url = None\n goog = identifiers.get('google', None)\n if goog is None:\n isbn = identifiers.get('isbn', None)\n if isbn is not None:\n goog = self.cached_isbn_to_identifier(isbn)\n if goog is not None:\n url = self.cached_identifier_to_cover_url(goog)\n\n return url\n\n # }}}\n\n def postprocess_downloaded_google_metadata(self, ans, relevance=0): # {{{\n if not isinstance(ans, Metadata):\n return ans\n ans.source_relevance = relevance\n goog = ans.identifiers['google']\n for isbn in getattr(ans, 'all_isbns', []):\n self.cache_isbn_to_identifier(isbn, goog)\n if getattr(ans, 'has_google_cover', False):\n self.cache_identifier_to_cover_url(goog, self.GOOGLE_COVER % goog)\n if ans.comments:\n ans.comments = pretty_google_books_comments(ans.comments)\n self.clean_downloaded_metadata(ans)\n return ans\n # }}}\n\n def get_all_details( # {{{\n self,\n br,\n log,\n entries,\n abort,\n result_queue,\n timeout\n ):\n from lxml import etree\n for relevance, i in enumerate(entries):\n try:\n ans = self.postprocess_downloaded_google_metadata(to_metadata(br, log, i, timeout, self.running_a_test), relevance)\n if isinstance(ans, Metadata):\n result_queue.put(ans)\n except Exception:\n log.exception(\n 'Failed to get metadata for identify entry:', etree.tostring(i)\n )\n if abort.is_set():\n break\n\n # }}}\n\n def identify_via_web_search( # {{{\n self,\n log,\n result_queue,\n abort,\n title=None,\n authors=None,\n identifiers={},\n timeout=30\n ):\n from calibre.utils.filenames import ascii_text\n from polyglot.urllib import urlparse\n isbn = check_isbn(identifiers.get('isbn', None))\n q = []\n strip_punc_pat = regex.compile(r'[\\p{C}|\\p{M}|\\p{P}|\\p{S}|\\p{Z}]+', regex.UNICODE)\n google_ids = []\n check_tokens = set()\n has_google_id = 'google' in identifiers\n\n def to_check_tokens(*tokens):\n for t in tokens:\n if len(t) < 3:\n continue\n t = t.lower()\n if t in ('and', 'not', 'the'):\n continue\n yield ascii_text(strip_punc_pat.sub('', t))\n\n if has_google_id:\n google_ids.append(identifiers['google'])\n elif isbn is not None:\n q.append(isbn)\n elif title or authors:\n title_tokens = list(self.get_title_tokens(title))\n if title_tokens:\n q += title_tokens\n check_tokens |= set(to_check_tokens(*title_tokens))\n author_tokens = list(self.get_author_tokens(authors, only_first_author=True))\n if author_tokens:\n q += author_tokens\n check_tokens |= set(to_check_tokens(*author_tokens))\n if not q and not google_ids:\n return None\n from calibre.ebooks.metadata.sources.update import search_engines_module\n se = search_engines_module()\n br = se.google_specialize_browser(se.browser())\n if not has_google_id:\n url = se.google_format_query(q, site='books.google.com')\n log('Making query:', url)\n r = []\n root = se.query(br, url, 'google', timeout=timeout, save_raw=r.append)\n pat = re.compile(r'id=([^&]+)')\n for q in se.google_parse_results(root, r[0], log=log, ignore_uncached=False):\n m = pat.search(q.url)\n if m is None or not q.url:\n continue\n try:\n purl = urlparse(q.url)\n except Exception:\n continue\n if not purl.hostname.startswith('books.google'):\n continue\n google_ids.append(m.group(1))\n\n if not google_ids and isbn and (title or authors):\n return self.identify_via_web_search(log, result_queue, abort, title, authors, {}, timeout)\n found = False\n seen = set()\n for relevance, gid in enumerate(google_ids):\n if gid in seen:\n continue\n seen.add(gid)\n try:\n ans = to_metadata(br, log, gid, timeout, self.running_a_test)\n if isinstance(ans, Metadata):\n if isbn:\n if isbn not in ans.all_isbns:\n log('Excluding', ans.title, 'by', authors_to_string(ans.authors), 'as it does not match the ISBN:', isbn,\n 'not in', ' '.join(ans.all_isbns))\n continue\n elif check_tokens:\n candidate = set(to_check_tokens(*self.get_title_tokens(ans.title)))\n candidate |= set(to_check_tokens(*self.get_author_tokens(ans.authors)))\n if candidate.intersection(check_tokens) != check_tokens:\n log('Excluding', ans.title, 'by', authors_to_string(ans.authors), 'as it does not match the query')\n continue\n ans = self.postprocess_downloaded_google_metadata(ans, relevance)\n result_queue.put(ans)\n found = True\n except Exception:\n log.exception('Failed to get metadata for google books id:', gid)\n if abort.is_set():\n break\n if not found and isbn and (title or authors):\n return self.identify_via_web_search(log, result_queue, abort, title, authors, {}, timeout)\n # }}}\n\n def identify( # {{{\n self,\n log,\n result_queue,\n abort,\n title=None,\n authors=None,\n identifiers={},\n timeout=30\n ):\n from calibre.utils.xml_parse import safe_xml_fromstring\n entry = XPath('//atom:entry')\n identifiers = identifiers.copy()\n br = self.browser\n if 'google' in identifiers:\n try:\n ans = to_metadata(br, log, identifiers['google'], timeout, self.running_a_test)\n if isinstance(ans, Metadata):\n self.postprocess_downloaded_google_metadata(ans)\n result_queue.put(ans)\n return\n except Exception:\n log.exception('Failed to get metadata for Google identifier:', identifiers['google'])\n del identifiers['google']\n\n query = self.create_query(\n title=title, authors=authors, identifiers=identifiers\n )\n if not query:\n log.error('Insufficient metadata to construct query')\n return\n\n def make_query(query):\n log('Making query:', query)\n try:\n raw = br.open_novisit(query, timeout=timeout).read()\n except Exception as e:\n log.exception('Failed to make identify query: %r' % query)\n return False, as_unicode(e)\n\n try:\n feed = safe_xml_fromstring(xml_to_unicode(clean_ascii_chars(raw), strip_encoding_pats=True)[0])\n return True, entry(feed)\n except Exception as e:\n log.exception('Failed to parse identify results')\n return False, as_unicode(e)\n ok, entries = make_query(query)\n if not ok:\n return entries\n if not entries and not abort.is_set():\n log('No results found, doing a web search instead')\n return self.identify_via_web_search(log, result_queue, abort, title, authors, identifiers, timeout)\n\n # There is no point running these queries in threads as google\n # throttles requests returning 403 Forbidden errors\n self.get_all_details(br, log, entries, abort, result_queue, timeout)\n\n # }}}\n\n\nif __name__ == '__main__': # tests {{{\n # To run these test use:\n # calibre-debug src/calibre/ebooks/metadata/sources/google.py\n from calibre.ebooks.metadata.sources.test import authors_test, test_identify_plugin, title_test\n tests = [\n ({\n 'identifiers': {'google': 's7NIrgEACAAJ'},\n }, [title_test('Ride Every Stride', exact=False)]),\n\n ({\n 'identifiers': {'isbn': '0743273567'},\n 'title': 'Great Gatsby',\n 'authors': ['Fitzgerald']\n }, [\n title_test('The great gatsby', exact=True),\n authors_test(['F. Scott Fitzgerald'])\n ]),\n\n ({\n 'title': 'Flatland',\n 'authors': ['Abbott']\n }, [title_test('Flatland', exact=False)]),\n\n ({\n 'title': 'The Blood Red Indian Summer: A Berger and Mitry Mystery',\n 'authors': ['David Handler'],\n }, [title_test('The Blood Red Indian Summer: A Berger and Mitry Mystery')\n ]),\n\n ({\n # requires using web search to find the book, but web search is broken currently\n 'title': 'Dragon Done It',\n 'authors': ['Eric Flint'],\n }, [\n title_test('The dragon done it', exact=True),\n authors_test(['Eric Flint', 'Mike Resnick'])\n ]),\n\n ]\n test_identify_plugin(GoogleBooks.name, tests)\n\n# }}}\n", + "google_images": "#!/usr/bin/env python\n# vim:fileencoding=UTF-8\nfrom __future__ import absolute_import, division, print_function, unicode_literals\n\n__license__ = 'GPL v3'\n__copyright__ = '2013, Kovid Goyal <kovid@kovidgoyal.net>'\n__docformat__ = 'restructuredtext en'\n\nfrom collections import OrderedDict\n\nfrom calibre import random_user_agent\nfrom calibre.ebooks.metadata.sources.base import Option, Source\n\n\ndef parse_html(raw):\n try:\n from html5_parser import parse\n except ImportError:\n # Old versions of calibre\n import html5lib\n return html5lib.parse(raw, treebuilder='lxml', namespaceHTMLElements=False)\n else:\n return parse(raw)\n\n\ndef imgurl_from_id(raw, tbnid):\n from json import JSONDecoder\n q = '\"{}\",['.format(tbnid)\n start_pos = raw.index(q)\n if start_pos < 100:\n return\n jd = JSONDecoder()\n data = jd.raw_decode('[' + raw[start_pos:])[0]\n # from pprint import pprint\n # pprint(data)\n url_num = 0\n for x in data:\n if isinstance(x, list) and len(x) == 3:\n q = x[0]\n if hasattr(q, 'lower') and q.lower().startswith('http'):\n url_num += 1\n if url_num > 1:\n return q\n\n\ndef parse_google_markup(raw):\n root = parse_html(raw)\n # newer markup pages use data-docid not data-tbnid\n results = root.xpath('//div/@data-tbnid') or root.xpath('//div/@data-docid')\n ans = OrderedDict()\n for tbnid in results:\n try:\n imgurl = imgurl_from_id(raw, tbnid)\n except Exception:\n continue\n if imgurl:\n ans[imgurl] = True\n return list(ans)\n\n\nclass GoogleImages(Source):\n\n name = 'Google Images'\n version = (1, 0, 6)\n minimum_calibre_version = (2, 80, 0)\n description = _('Downloads covers from a Google Image search. Useful to find larger/alternate covers.')\n capabilities = frozenset(['cover'])\n can_get_multiple_covers = True\n supports_gzip_transfer_encoding = True\n options = (Option('max_covers', 'number', 5, _('Maximum number of covers to get'),\n _('The maximum number of covers to process from the Google search result')),\n Option('size', 'choices', 'svga', _('Cover size'),\n _('Search for covers larger than the specified size'),\n choices=OrderedDict((\n ('any', _('Any size'),),\n ('l', _('Large'),),\n ('qsvga', _('Larger than %s')%'400x300',),\n ('vga', _('Larger than %s')%'640x480',),\n ('svga', _('Larger than %s')%'600x800',),\n ('xga', _('Larger than %s')%'1024x768',),\n ('2mp', _('Larger than %s')%'2 MP',),\n ('4mp', _('Larger than %s')%'4 MP',),\n ))),\n )\n\n def download_cover(self, log, result_queue, abort,\n title=None, authors=None, identifiers={}, timeout=30, get_best_cover=False):\n if not title:\n return\n timeout = max(60, timeout) # Needs at least a minute\n title = ' '.join(self.get_title_tokens(title))\n author = ' '.join(self.get_author_tokens(authors))\n urls = self.get_image_urls(title, author, log, abort, timeout)\n self.download_multiple_covers(title, authors, urls, get_best_cover, timeout, result_queue, abort, log)\n\n @property\n def user_agent(self):\n return random_user_agent(allow_ie=False)\n\n def get_image_urls(self, title, author, log, abort, timeout):\n from calibre.utils.cleantext import clean_ascii_chars\n try:\n from urllib.parse import urlencode\n except ImportError:\n from urllib import urlencode\n br = self.browser\n q = urlencode({'as_q': ('%s %s'%(title, author)).encode('utf-8')})\n if isinstance(q, bytes):\n q = q.decode('utf-8')\n sz = self.prefs['size']\n if sz == 'any':\n sz = ''\n elif sz == 'l':\n sz = 'isz:l,'\n else:\n sz = 'isz:lt,islt:%s,' % sz\n # See https://www.google.com/advanced_image_search to understand this\n # URL scheme\n url = 'https://www.google.com/search?as_st=y&tbm=isch&{}&as_epq=&as_oq=&as_eq=&cr=&as_sitesearch=&safe=images&tbs={}iar:t,ift:jpg'.format(q, sz)\n log('Search URL: ' + url)\n # See https://github.com/benbusby/whoogle-search/pull/1054 for cookies\n br.set_simple_cookie('CONSENT', 'PENDING+987', '.google.com', path='/')\n template = b'\\x08\\x01\\x128\\x08\\x14\\x12+boq_identityfrontenduiserver_20231107.05_p0\\x1a\\x05en-US \\x03\\x1a\\x06\\x08\\x80\\xf1\\xca\\xaa\\x06'\n from base64 import standard_b64encode\n from datetime import date\n template.replace(b'20231107', date.today().strftime('%Y%m%d').encode('ascii'))\n br.set_simple_cookie('SOCS', standard_b64encode(template).decode('ascii').rstrip('='), '.google.com', path='/')\n # br.set_debug_http(True)\n raw = clean_ascii_chars(br.open(url).read().decode('utf-8'))\n # with open('/t/raw.html', 'w') as f:\n # f.write(raw)\n return parse_google_markup(raw)\n\n\ndef test_raw():\n import sys\n raw = open(sys.argv[-1]).read()\n for x in parse_google_markup(raw):\n print(x)\n\n\ndef test(title='Star Trek: Section 31: Control', authors=('David Mack',)):\n try:\n from queue import Queue\n except ImportError:\n from Queue import Queue\n from threading import Event\n\n from calibre.utils.logging import default_log\n p = GoogleImages(None)\n p.log = default_log\n rq = Queue()\n p.download_cover(default_log, rq, Event(), title=title, authors=authors)\n print('Downloaded', rq.qsize(), 'covers')\n\n\nif __name__ == '__main__':\n test()\n", + "hashes": { + "amazon": "3b8bf719310f23384f819213f656693baac2821f", + "big_book_search": "7a8b67c0f19ecbfe8a9d28b961aab1119f31c3e3", + "edelweiss": "640a39d0926dfdaa72f54160a1db5323b4d7c164", + "google": "e71e2242c2dababa10f73d9c2aee9b2864d4f80a", + "google_images": "4244dd8267cb6215c7dfd2da166c6e02b1db31ea", + "openlibrary": "239077a692701cbf0281e7a2e64306cd00217410", + "search_engines": "65c9081d21ecf31abf31ceb5f0d87870fcd943db" + }, + "openlibrary": "#!/usr/bin/env python\n# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai\nfrom __future__ import absolute_import, division, print_function, unicode_literals\n\n__license__ = 'GPL v3'\n__copyright__ = '2011, Kovid Goyal <kovid@kovidgoyal.net>'\n__docformat__ = 'restructuredtext en'\n\nfrom calibre.ebooks.metadata.sources.base import Source\n\n\nclass OpenLibrary(Source):\n\n name = 'Open Library'\n version = (1, 0, 2)\n minimum_calibre_version = (2, 80, 0)\n description = _('Downloads covers from The Open Library')\n\n capabilities = frozenset(['cover'])\n\n OPENLIBRARY = 'https://covers.openlibrary.org/b/isbn/%s-L.jpg?default=false'\n\n def download_cover(self, log, result_queue, abort,\n title=None, authors=None, identifiers={}, timeout=30, get_best_cover=False):\n if 'isbn' not in identifiers:\n return\n isbn = identifiers['isbn']\n br = self.browser\n try:\n ans = br.open_novisit(self.OPENLIBRARY%isbn, timeout=timeout).read()\n result_queue.put((self, ans))\n except Exception as e:\n if callable(getattr(e, 'getcode', None)) and e.getcode() == 404:\n log.error('No cover for ISBN: %r found'%isbn)\n else:\n log.exception('Failed to download cover for ISBN:', isbn)\n", + "search_engines": "#!/usr/bin/env python\n# vim:fileencoding=utf-8\n# License: GPLv3 Copyright: 2017, Kovid Goyal <kovid at kovidgoyal.net>\n\nfrom __future__ import absolute_import, division, print_function, unicode_literals\n\nimport json\nimport os\nimport re\nimport sys\nimport time\nfrom collections import namedtuple\nfrom contextlib import contextmanager\nfrom functools import partial\nfrom threading import Lock\n\ntry:\n from urllib.parse import parse_qs, quote, quote_plus, urlencode, urlparse\nexcept ImportError:\n from urllib import quote, quote_plus, urlencode\n\n from urlparse import parse_qs, urlparse\n\nfrom lxml import etree\n\nfrom calibre import browser as _browser\nfrom calibre import prints as safe_print\nfrom calibre import random_user_agent\nfrom calibre.constants import cache_dir\nfrom calibre.ebooks.chardet import xml_to_unicode\nfrom calibre.utils.lock import ExclusiveFile\nfrom calibre.utils.random_ua import accept_header_for_ua\n\ncurrent_version = (1, 2, 15)\nminimum_calibre_version = (2, 80, 0)\nwebcache = {}\nwebcache_lock = Lock()\nprints = partial(safe_print, file=sys.stderr)\n\n\nResult = namedtuple('Result', 'url title cached_url')\n\n\n@contextmanager\ndef rate_limit(name='test', time_between_visits=2, max_wait_seconds=5 * 60, sleep_time=0.2):\n lock_file = os.path.join(cache_dir(), 'search-engine.' + name + '.lock')\n with ExclusiveFile(lock_file, timeout=max_wait_seconds, sleep_time=sleep_time) as f:\n try:\n lv = float(f.read().decode('utf-8').strip())\n except Exception:\n lv = 0\n # we cannot use monotonic() as this is cross process and historical\n # data as well\n delta = time.time() - lv\n if delta < time_between_visits:\n time.sleep(time_between_visits - delta)\n try:\n yield\n finally:\n f.seek(0)\n f.truncate()\n f.write(repr(time.time()).encode('utf-8'))\n\n\ndef tostring(elem):\n return etree.tostring(elem, encoding='unicode', method='text', with_tail=False)\n\n\ndef browser():\n ua = random_user_agent(allow_ie=False)\n # ua = 'Mozilla/5.0 (Linux; Android 8.0.0; VTR-L29; rv:63.0) Gecko/20100101 Firefox/63.0'\n br = _browser(user_agent=ua)\n br.set_handle_gzip(True)\n br.addheaders += [\n ('Accept', accept_header_for_ua(ua)),\n ('Upgrade-insecure-requests', '1'),\n ]\n return br\n\n\ndef encode_query(**query):\n q = {k.encode('utf-8'): v.encode('utf-8') for k, v in query.items()}\n return urlencode(q).decode('utf-8')\n\n\ndef parse_html(raw):\n try:\n from html5_parser import parse\n except ImportError:\n # Old versions of calibre\n import html5lib\n return html5lib.parse(raw, treebuilder='lxml', namespaceHTMLElements=False)\n else:\n return parse(raw)\n\n\ndef query(br, url, key, dump_raw=None, limit=1, parser=parse_html, timeout=60, save_raw=None, simple_scraper=None):\n with rate_limit(key):\n if simple_scraper is None:\n raw = br.open_novisit(url, timeout=timeout).read()\n raw = xml_to_unicode(raw, strip_encoding_pats=True)[0]\n else:\n raw = simple_scraper(url, timeout=timeout)\n if dump_raw is not None:\n with open(dump_raw, 'w') as f:\n f.write(raw)\n if save_raw is not None:\n save_raw(raw)\n return parser(raw)\n\n\ndef quote_term(x):\n ans = quote_plus(x.encode('utf-8'))\n if isinstance(ans, bytes):\n ans = ans.decode('utf-8')\n return ans\n\n\n# DDG + Wayback machine DDG does a captcha after 2-3 requests {{{\n\ndef ddg_url_processor(url):\n return url\n\n\ndef ddg_term(t):\n t = t.replace('\"', '')\n if t.lower() in {'map', 'news'}:\n t = '\"' + t + '\"'\n if t in {'OR', 'AND', 'NOT'}:\n t = t.lower()\n return t\n\n\ndef ddg_href(url):\n if url.startswith('/'):\n q = url.partition('?')[2]\n url = parse_qs(q.encode('utf-8'))[b'uddg'][0].decode('utf-8')\n return url\n\n\ndef wayback_machine_cached_url(url, br=None, log=prints, timeout=60):\n q = quote_term(url)\n br = br or browser()\n try:\n data = query(br, 'https://archive.org/wayback/available?url=' +\n q, 'wayback', parser=json.loads, limit=0.25, timeout=timeout)\n except Exception as e:\n log('Wayback machine query failed for url: ' + url + ' with error: ' + str(e))\n return None\n try:\n closest = data['archived_snapshots']['closest']\n if closest['available']:\n ans = closest['url'].replace('http:', 'https:', 1)\n # get unmodified HTML\n ans = ans.replace(closest['timestamp'], closest['timestamp'] + 'id_', 1)\n return ans\n except Exception:\n pass\n from pprint import pformat\n log('Response from wayback machine:', pformat(data))\n\n\ndef wayback_url_processor(url):\n if url.startswith('/'):\n # Use original URL instead of absolutizing to wayback URL as wayback is\n # slow\n m = re.search(r'https?:', url)\n if m is None:\n url = 'https://web.archive.org' + url\n else:\n url = url[m.start():]\n return url\n\n\nddg_scraper_storage = []\n\n\ndef ddg_search(terms, site=None, br=None, log=prints, safe_search=False, dump_raw=None, timeout=60):\n # https://duck.co/help/results/syntax\n terms = [quote_term(ddg_term(t)) for t in terms]\n if site is not None:\n terms.append(quote_term(('site:' + site)))\n q = '+'.join(terms)\n url = 'https://duckduckgo.com/html/?q={q}&kp={kp}'.format(\n q=q, kp=1 if safe_search else -1)\n log('Making ddg query: ' + url)\n from calibre.scraper.simple import read_url\n br = br or browser()\n root = query(br, url, 'ddg', dump_raw, timeout=timeout, simple_scraper=partial(read_url, ddg_scraper_storage))\n ans = []\n for a in root.xpath('//*[@class=\"results\"]//*[@class=\"result__title\"]/a[@href and @class=\"result__a\"]'):\n try:\n ans.append(Result(ddg_href(a.get('href')), tostring(a), None))\n except KeyError:\n log('Failed to find ddg href in:', a.get('href'))\n return ans, url\n\n\ndef ddg_develop():\n br = browser()\n for result in ddg_search('heroes abercrombie'.split(), 'www.amazon.com', dump_raw='/t/raw.html', br=br)[0]:\n if '/dp/' in result.url:\n print(result.title)\n print(' ', result.url)\n print(' ', get_cached_url(result.url, br))\n print()\n# }}}\n\n\n# Bing uses a CAPTCHA {{{\n\ndef bing_term(t):\n t = t.replace('\"', '')\n if t in {'OR', 'AND', 'NOT'}:\n t = t.lower()\n return t\n\n\ndef bing_url_processor(url):\n return url\n\n\ndef resolve_bing_wrapper_page(url, br, log):\n raw = br.open_novisit(url).read().decode('utf-8', 'replace')\n m = re.search(r'var u = \"(.+)\"', raw)\n if m is None:\n log('Failed to resolve bing wrapper page for url: ' + url)\n return url\n log('Resolved bing wrapped URL: ' + url + ' to ' + m.group(1))\n return m.group(1)\n\n\nbing_scraper_storage = []\n\n\ndef bing_search(\n terms, site=None, br=None, log=prints, safe_search=False, dump_raw=None, timeout=60,\n show_user_agent=False, result_url_is_ok=lambda x: True\n):\n # http://vlaurie.com/computers2/Articles/bing_advanced_search.htm\n terms = [quote_term(bing_term(t)) for t in terms]\n if site is not None:\n terms.append(quote_term(('site:' + site)))\n q = '+'.join(terms)\n url = 'https://www.bing.com/search?q={q}'.format(q=q)\n log('Making bing query: ' + url)\n from calibre.scraper.simple import read_url\n root = query(br, url, 'bing', dump_raw, timeout=timeout, simple_scraper=partial(read_url, bing_scraper_storage))\n ans = []\n result_items = root.xpath('//*[@id=\"b_results\"]/li[@class=\"b_algo\"]')\n if not result_items:\n log('Bing returned no results')\n return ans, url\n for li in result_items:\n a = li.xpath('descendant::h2/a[@href]') or li.xpath('descendant::div[@class=\"b_algoheader\"]/a[@href]')\n a = a[0]\n title = tostring(a)\n ans_url = a.get('href')\n if ans_url.startswith('https://www.bing.com/'):\n ans_url = resolve_bing_wrapper_page(ans_url, br, log)\n if result_url_is_ok(ans_url):\n ans.append(Result(ans_url, title, None))\n if not ans:\n title = ' '.join(root.xpath('//title/text()'))\n log('Failed to find any results on results page, with title:', title)\n return ans, url\n\n\ndef bing_develop(terms='heroes abercrombie'):\n if isinstance(terms, str):\n terms = terms.split()\n for result in bing_search(terms, 'www.amazon.com', dump_raw='/t/raw.html', show_user_agent=True)[0]:\n if '/dp/' in result.url:\n print(result.title)\n print(' ', result.url)\n print(' ', result.cached_url)\n print()\n# }}}\n\n\n# Google only serves JS enabled search pages as of Sep 11, 2025 {{{\n\ndef google_term(t):\n t = t.replace('\"', '')\n if t in {'OR', 'AND', 'NOT'}:\n t = t.lower()\n return t\n\n\ndef google_url_processor(url):\n return url\n\n\ndef google_cache_url_for_url(url):\n if not isinstance(url, bytes):\n url = url.encode('utf-8')\n cu = quote(url, safe='')\n if isinstance(cu, bytes):\n cu = cu.decode('utf-8')\n return 'https://webcache.googleusercontent.com/search?q=cache:' + cu\n\n\ndef google_get_cached_url(url, br=None, log=prints, timeout=60):\n # Google's webcache was discontinued in september 2024\n cached_url = google_cache_url_for_url(url)\n br = google_specialize_browser(br or browser())\n try:\n raw = query(br, cached_url, 'google-cache', parser=lambda x: x.encode('utf-8'), timeout=timeout)\n except Exception as err:\n log('Failed to get cached URL from google for URL: {} with error: {}'.format(url, err))\n else:\n with webcache_lock:\n webcache[cached_url] = raw\n return cached_url\n\n\ndef canonicalize_url_for_cache_map(url):\n try:\n purl = urlparse(url)\n except Exception:\n return url\n if '.amazon.' in purl.netloc:\n url = url.split('&', 1)[0]\n return url\n\n\ndef google_parse_results(root, raw, log=prints, ignore_uncached=True):\n ans = []\n seen = set()\n for a in root.xpath('//a[@href]'):\n href = a.get('href')\n if not href.startswith('/url?q=http'):\n continue\n try:\n url = parse_qs(urlparse(href).query)['q'][0]\n purl = urlparse(url)\n except Exception:\n continue\n if purl.hostname.endswith('google.com'):\n continue\n try:\n title = tostring(next(a.iterchildren('span')))\n except StopIteration:\n continue\n curl = canonicalize_url_for_cache_map(url)\n if curl in seen:\n continue\n seen.add(curl)\n ans.append(Result(curl, title, None))\n if not ans:\n title = ' '.join(root.xpath('//title/text()'))\n log('Failed to find any results on results page, with title:', title)\n return ans\n\n\ndef google_consent_cookies():\n # See https://github.com/benbusby/whoogle-search/pull/1054 for cookies\n from base64 import standard_b64encode\n from datetime import date\n base = {'domain': '.google.com', 'path': '/'}\n b = base.copy()\n b['name'], b['value'] = 'CONSENT', 'PENDING+987'\n yield b\n template = b'\\x08\\x01\\x128\\x08\\x14\\x12+boq_identityfrontenduiserver_20231107.05_p0\\x1a\\x05en-US \\x03\\x1a\\x06\\x08\\x80\\xf1\\xca\\xaa\\x06'\n template.replace(b'20231107', date.today().strftime('%Y%m%d').encode('ascii'))\n b = base.copy()\n b['name'], b['value'] = 'SOCS', standard_b64encode(template).decode('ascii').rstrip('=')\n yield b\n\n\ndef google_specialize_browser(br):\n with webcache_lock:\n if not hasattr(br, 'google_consent_cookie_added'):\n for c in google_consent_cookies():\n br.set_simple_cookie(c['name'], c['value'], c['domain'], path=c['path'])\n br.google_consent_cookie_added = True\n # google serves JS based pages without the right user agent\n br.set_user_agent('L''y''nx''/2.''8.''6rel''.5 lib''ww''w-F''M/2.''1''4') # noqa\n return br\n\n\ndef is_probably_book_asin(t):\n return t and len(t) == 10 and t.startswith('B') and t.upper() == t\n\n\ndef is_asin_or_isbn(t):\n from calibre.ebooks.metadata import check_isbn\n return bool(check_isbn(t) or is_probably_book_asin(t))\n\n\ndef google_format_query(terms, site=None, tbm=None):\n prevent_spelling_correction = False\n for t in terms:\n if is_asin_or_isbn(t):\n prevent_spelling_correction = True\n break\n terms = [quote_term(google_term(t)) for t in terms]\n if site is not None:\n terms.append(quote_term(('site:' + site)))\n q = '+'.join(terms)\n url = 'https://www.google.com/search?q={q}'.format(q=q)\n # tbm causes 403 forbidden errors\n # if tbm:\n # url += '&tbm=' + tbm\n if prevent_spelling_correction:\n url += '&nfpr=1'\n return url\n\n\ndef google_search(terms, site=None, br=None, log=prints, safe_search=False, dump_raw=None, timeout=60):\n url = google_format_query(terms, site)\n log('Making google query: ' + url)\n br = google_specialize_browser(br or browser())\n r = []\n root = query(br, url, 'google', dump_raw, timeout=timeout, save_raw=r.append)\n return google_parse_results(root, r[0], log=log), url\n\n\ndef google_develop(search_terms='1423146786', raw_from=''):\n if raw_from:\n with open(raw_from, 'rb') as f:\n raw = f.read()\n results = google_parse_results(parse_html(raw), raw)\n else:\n br = browser()\n results = google_search(search_terms.split(), 'www.amazon.com', dump_raw='/t/raw.html', br=br)[0]\n for result in results:\n if '/dp/' in result.url:\n print(result.title)\n print(' ', result.url)\n print(' ', result.cached_url)\n print()\n# }}}\n\n\n# Yandex uses a CAPTCHA {{{\ndef yandex_term(t):\n t = t.replace('\"', '')\n if t in {'OR', 'AND', 'NOT'}:\n t = t.lower()\n return t\n\n\ndef yandex_format_query(terms, site=None):\n terms = [quote_term(yandex_term(t)) for t in terms]\n if site is not None:\n terms.append(quote_term(('site:' + site)))\n q = '+'.join(terms)\n url = 'https://yandex.com/search?text={q}'.format(q=q)\n return url\n\n\ndef yandex_parse_results(root, raw, log=prints, ignore_uncached=True):\n pass\n\n\nyandex_scraper_storage = []\n\n\ndef yandex_search(terms, site=None, br=None, dump_raw=None, log=prints, timeout=60):\n # Sadly yandex uses CAPTCHAs aggresively\n url = yandex_format_query(terms, site)\n br = browser()\n r = []\n from calibre.scraper.simple import read_url\n root = query(br, url, 'yandex', dump_raw, timeout=timeout, save_raw=r.append, simple_scraper=partial(read_url, yandex_scraper_storage))\n return yandex_parse_results(root, r[0], log=log), url\n\n\ndef yandex_develop(search_terms='1423146786', raw_from=''):\n if raw_from:\n with open(raw_from, 'rb') as f:\n raw = f.read()\n results = yandex_parse_results(parse_html(raw), raw)\n else:\n results = yandex_search(search_terms.split(), 'www.amazon.com', dump_raw='/t/raw.html')[0]\n for result in results:\n if '/dp/' in result.url:\n print(result.title)\n print(' ', result.url)\n print(' ', result.cached_url)\n print()\n\n# }}}\n\n\ndef get_cached_url(url, br=None, log=prints, timeout=60):\n from threading import Lock, Thread\n\n from polyglot.queue import Queue\n print_lock = Lock()\n q = Queue()\n\n def safe_print(*a):\n with print_lock:\n log(*a)\n\n def doit(func):\n try:\n q.put(func(url, br, safe_print, timeout))\n except Exception as e:\n safe_print(e)\n q.put(None)\n\n threads = []\n threads.append(Thread(target=doit, args=(wayback_machine_cached_url,), daemon=True).start())\n while threads:\n x = q.get()\n if x is not None:\n return x\n threads.pop()\n\n\ndef get_data_for_cached_url(url):\n with webcache_lock:\n return webcache.get(url)\n\n\ndef resolve_url(url):\n prefix, rest = url.partition(':')[::2]\n if prefix == 'bing':\n return bing_url_processor(rest)\n if prefix == 'wayback':\n return wayback_url_processor(rest)\n return url\n\n\n# if __name__ == '__main__':\n# import sys\n# func = sys.argv[-1]\n# globals()[func]()\n" +}
\ No newline at end of file diff --git a/dotfiles/common/.config/calibre/metadata_sources/global.json b/dotfiles/common/.config/calibre/metadata_sources/global.json new file mode 100644 index 0000000..be7665d --- /dev/null +++ b/dotfiles/common/.config/calibre/metadata_sources/global.json @@ -0,0 +1,23 @@ +{ + "id_link_rules": { + "title": [ + [ + "Title", + "https://z-library.sk/s/?q=title%3A{title}&languages[]=english&extensions[]=EPUB&extensions[]=PDF&selected_content_types[]=book&order=bestmatch" + ] + ] + }, + "ignore_fields": [ + "rating", + "series" + ], + "tag_map_rules": [ + { + "action": "remove", + "match_type": "not_one_of", + "query": "Art, Biography & Autobiography, Business, Chess, Computers, Cooking, Critical Theory, Design, Economics, French, History, Law, Linguistics, Literature, Magic, Mathematics, Music, Mythology, Non-Fiction, Philosophy, Poetry, Political Science, Politics, Psychology, Religion, Science, Social Critique, Sociology, Travel", + "replace": "" + } + ], + "txt_comments": true +}
\ No newline at end of file diff --git a/dotfiles/common/.config/calibre/mtp_devices.json b/dotfiles/common/.config/calibre/mtp_devices.json new file mode 100644 index 0000000..274f3de --- /dev/null +++ b/dotfiles/common/.config/calibre/mtp_devices.json @@ -0,0 +1,9 @@ +{ + "blacklist": [], + "history": { + "G0W19E040464033L": [ + "Fire", + "2021-01-28T21:54:04.815072+00:00" + ] + } +}
\ No newline at end of file diff --git a/dotfiles/common/.config/calibre/plugins/Apple Books covers.zip b/dotfiles/common/.config/calibre/plugins/Apple Books covers.zip Binary files differnew file mode 100644 index 0000000..722e2c7 --- /dev/null +++ b/dotfiles/common/.config/calibre/plugins/Apple Books covers.zip diff --git a/dotfiles/common/.config/calibre/plugins/Barnes & Noble.zip b/dotfiles/common/.config/calibre/plugins/Barnes & Noble.zip Binary files differnew file mode 100644 index 0000000..9c3932d --- /dev/null +++ b/dotfiles/common/.config/calibre/plugins/Barnes & Noble.zip diff --git a/dotfiles/common/.config/calibre/plugins/Clean Comments.zip b/dotfiles/common/.config/calibre/plugins/Clean Comments.zip Binary files differnew file mode 100644 index 0000000..224fcd7 --- /dev/null +++ b/dotfiles/common/.config/calibre/plugins/Clean Comments.zip diff --git a/dotfiles/common/.config/calibre/plugins/Extract ISBN.zip b/dotfiles/common/.config/calibre/plugins/Extract ISBN.zip Binary files differnew file mode 100644 index 0000000..7214c0e --- /dev/null +++ b/dotfiles/common/.config/calibre/plugins/Extract ISBN.zip diff --git a/dotfiles/common/.config/calibre/plugins/Favourites Menu.json b/dotfiles/common/.config/calibre/plugins/Favourites Menu.json new file mode 100644 index 0000000..8f239ba --- /dev/null +++ b/dotfiles/common/.config/calibre/plugins/Favourites Menu.json @@ -0,0 +1,140 @@ +{ + "menus": [ + { + "display": "Convert books", + "path": [ + "Convert Books" + ] + }, + null, + { + "display": "Start Content server", + "path": [ + "Connect Share", + "Start Content server" + ] + }, + { + "display": "Extract ISBN", + "path": [ + "Extract ISBN" + ] + }, + null, + { + "display": "Add to default list", + "path": [ + "Reading List", + "Add to default list" + ] + }, + { + "display": "Remove from default list", + "path": [ + "Reading List", + "Remove from default list" + ] + }, + { + "display": "View default list", + "path": [ + "Reading List", + "View default list" + ] + }, + null, + { + "display": "Find book duplicates...", + "path": [ + "Find Duplicates", + "Find book duplicates..." + ] + }, + { + "display": "Clean comments", + "path": [ + "Clean Comments", + "Clean comments" + ] + }, + { + "display": "Check library", + "path": [ + "Choose Library", + "Library maintenance", + "Check library" + ] + }, + { + "display": "Plugin updater", + "path": [ + "Plugin Updater" + ] + }, + null, + { + "display": "Email to...", + "path": [ + "Connect Share", + "Email to..." + ] + }, + { + "display": "email to Christine's Kindle", + "path": [ + "Connect Share", + "Email to...", + "Christine's Kindle" + ] + }, + { + "display": "email to Craig's Paperwhite", + "path": [ + "Connect Share", + "Email to...", + "Paperwhite" + ] + }, + { + "display": "email to Craig's Pixel6", + "path": [ + "Connect Share", + "Email to...", + "Pixel6" + ] + }, + null, + { + "display": "Start wireless device connection", + "path": [ + "Connect Share", + "Start wireless device connection" + ] + }, + { + "display": "Stop wireless device connection [192.168.86.26 or 172.17.0.1, port 9090]", + "path": [ + "Connect Share", + "Stop wireless device connection [192.168.86.26 or 172.17.0.1, port 9090]" + ] + }, + { + "display": "Manage collections", + "path": [ + "Edit Collections" + ] + }, + { + "display": "Get books", + "path": [ + "Store" + ] + }, + { + "display": "Kindle Collections", + "path": [ + "Kindle Collections" + ] + } + ] +}
\ No newline at end of file diff --git a/dotfiles/common/.config/calibre/plugins/Favourites Menu.zip b/dotfiles/common/.config/calibre/plugins/Favourites Menu.zip Binary files differnew file mode 100644 index 0000000..767f621 --- /dev/null +++ b/dotfiles/common/.config/calibre/plugins/Favourites Menu.zip diff --git a/dotfiles/common/.config/calibre/plugins/Find Duplicates.json b/dotfiles/common/.config/calibre/plugins/Find Duplicates.json new file mode 100644 index 0000000..9daa2b7 --- /dev/null +++ b/dotfiles/common/.config/calibre/plugins/Find Duplicates.json @@ -0,0 +1,13 @@ +{ + "authorMatch": "identical", + "authorSoundexLength": 8, + "autoDeleteBinaryDups": false, + "identifierType": "isbn", + "includeLanguages": false, + "searchType": "binary", + "showAllGroups": true, + "showTagAuthor": true, + "sortGroupsByTitle": true, + "titleMatch": "identical", + "titleSoundexLength": 6 +}
\ No newline at end of file diff --git a/dotfiles/common/.config/calibre/plugins/Find Duplicates.zip b/dotfiles/common/.config/calibre/plugins/Find Duplicates.zip Binary files differnew file mode 100644 index 0000000..a6ce77a --- /dev/null +++ b/dotfiles/common/.config/calibre/plugins/Find Duplicates.zip diff --git a/dotfiles/common/.config/calibre/plugins/KePub Metadata Reader.zip b/dotfiles/common/.config/calibre/plugins/KePub Metadata Reader.zip Binary files differnew file mode 100644 index 0000000..13394c9 --- /dev/null +++ b/dotfiles/common/.config/calibre/plugins/KePub Metadata Reader.zip diff --git a/dotfiles/common/.config/calibre/plugins/KePub Metadata Writer.zip b/dotfiles/common/.config/calibre/plugins/KePub Metadata Writer.zip Binary files differnew file mode 100644 index 0000000..7ac4e55 --- /dev/null +++ b/dotfiles/common/.config/calibre/plugins/KePub Metadata Writer.zip diff --git a/dotfiles/common/.config/calibre/plugins/Kindle hi-res covers.zip b/dotfiles/common/.config/calibre/plugins/Kindle hi-res covers.zip Binary files differnew file mode 100644 index 0000000..40106fe --- /dev/null +++ b/dotfiles/common/.config/calibre/plugins/Kindle hi-res covers.zip diff --git a/dotfiles/common/.config/calibre/plugins/Kobo Metadata.zip b/dotfiles/common/.config/calibre/plugins/Kobo Metadata.zip Binary files differnew file mode 100644 index 0000000..aaf91cb --- /dev/null +++ b/dotfiles/common/.config/calibre/plugins/Kobo Metadata.zip diff --git a/dotfiles/common/.config/calibre/plugins/Kobo Utilities.json b/dotfiles/common/.config/calibre/plugins/Kobo Utilities.json new file mode 100644 index 0000000..4d9121a --- /dev/null +++ b/dotfiles/common/.config/calibre/plugins/Kobo Utilities.json @@ -0,0 +1,122 @@ +{ + "BookmarkOptions": { + "backgroundJob": false, + "clearIfUnread": false, + "doNotStoreIfReopened": false, + "rating": true, + "readingStatus": true, + "setDateToNow": true, + "storeBookmarks": true, + "storeIfMoreRecent": false + }, + "Devices": { + "N4181C1037466": { + "active": true, + "backupOptionsStore": { + "backupCopiesToKeepSpin": 10, + "backupDestDirectory": "/home/cjennings/documents/kobo", + "backupEachCOnnection": true, + "backupZipDatabase": true, + "doDailyBackp": false + }, + "location_code": "main", + "name": "Kobo Libra 2", + "serial_no": "N4181C1037466", + "type": "Kobo Libra 2", + "updateOptionsStore": { + "doEarlyFirmwareUpdate": false, + "doFirmwareUpdateCheck": true, + "firmwareUpdateCheckLastTime": 0 + }, + "uuid": "8de75c8a-f9b6-405c-86a3-515afd1e71fa" + } + }, + "MetadataOptions": { + "author": false, + "authourSort": false, + "description": false, + "descriptionTemplate": "", + "descriptionUseTemplate": false, + "isbn": false, + "language": false, + "published_date": false, + "publisher": false, + "rating": false, + "readingStatus": -1, + "reading_direction": "Default", + "resetPosition": false, + "series": false, + "setRreadingStatus": false, + "set_reading_direction": false, + "set_sync_date": false, + "subtitle": false, + "subtitleTemplate": "", + "sync_date_library_date": "timestamp", + "title": false, + "titleSort": false, + "update_KoboEpubs": false, + "usePlugboard": false + }, + "ReadingOptions": { + "doNotUpdateIfSet": false, + "lockMargins": false, + "readingAlignment": "Off", + "readingFontFamily": "Georgia", + "readingFontSize": 22, + "readingLeftMargin": 3, + "readingLineHeight": 1.3, + "readingRightMargin": 3, + "updateConfigFile": false + }, + "_version": 2, + "backupAnnotations": { + "dest_directory": "" + }, + "backupOptionsStore": { + "backupCopiesToKeepSpin": 5, + "backupDestDirectory": "", + "backupEachCOnnection": false, + "backupZipDatabase": true, + "doDailyBackp": false + }, + "cleanImagesDir": { + "delete_extra_covers": false + }, + "commonOptionsStore": { + "buttonActionDevice": "", + "buttonActionLibrary": "", + "individualDeviceOptions": true + }, + "coverUpload": { + "blackandwhite": false, + "dithered_covers": false, + "keep_cover_aspect": false, + "kepub_covers": false, + "letterbox": false, + "letterbox_color": "#000000", + "png_covers": false + }, + "fixDuplicatesOptionsStore": { + "keepNewestShelf": true, + "purgeShelves": false + }, + "getShelvesOptionStore": { + "allBooks": true, + "replaceShelves": true + }, + "removeAnnotations": { + "removeAnnotAction": 0 + }, + "removeCovers": { + "kepub_covers": false, + "remove_fullsize_covers": false + }, + "setRelatedBooksOptionsStore": { + "relatedBooksType": 0 + }, + "updateOptionsStore": { + "doEarlyFirmwareUpdate": false, + "doFirmwareUpdateCheck": false, + "firmwareUpdateCheckLastTime": 1656213583 + } +}
\ No newline at end of file diff --git a/dotfiles/common/.config/calibre/plugins/Kobo Utilities.zip b/dotfiles/common/.config/calibre/plugins/Kobo Utilities.zip Binary files differnew file mode 100644 index 0000000..4d62c4b --- /dev/null +++ b/dotfiles/common/.config/calibre/plugins/Kobo Utilities.zip diff --git a/dotfiles/common/.config/calibre/plugins/KoboTouchExtended.zip b/dotfiles/common/.config/calibre/plugins/KoboTouchExtended.zip Binary files differnew file mode 100644 index 0000000..3640da2 --- /dev/null +++ b/dotfiles/common/.config/calibre/plugins/KoboTouchExtended.zip diff --git a/dotfiles/common/.config/calibre/plugins/Open With.json b/dotfiles/common/.config/calibre/plugins/Open With.json new file mode 100644 index 0000000..81eaeb8 --- /dev/null +++ b/dotfiles/common/.config/calibre/plugins/Open With.json @@ -0,0 +1,61 @@ +{ + "OpenWithMenus": { + "Menus": [ + { + "active": false, + "appArgs": "", + "appPath": "firefox", + "format": "EPUB", + "image": "owp_firefox.png", + "menuText": "EPUBReader (EPUB)", + "subMenu": "" + }, + { + "active": false, + "appArgs": "-c", + "appPath": "/usr/bin/emacsclient", + "format": "PDF", + "image": "reader.png", + "menuText": "Emacsclient", + "subMenu": "" + }, + { + "active": true, + "appArgs": "", + "appPath": "/usr/bin/zathura", + "format": "EPUB", + "image": "edit_book.png", + "menuText": "Zathura (EPUB)", + "subMenu": "" + }, + { + "active": true, + "appArgs": "", + "appPath": "/usr/bin/zathura", + "format": "PDF", + "image": "PDF.png", + "menuText": "Zathura (PDF)", + "subMenu": "" + }, + { + "active": false, + "appArgs": "-c", + "appPath": "/usr/bin/emacsclient", + "format": "EPUB", + "image": "PDF.png", + "menuText": "Emacsclient", + "subMenu": "" + }, + { + "active": false, + "appArgs": "", + "appPath": "gimp", + "format": "COVER", + "image": "owp_gimp.png", + "menuText": "Gimp (Cover)", + "subMenu": "" + } + ], + "UrlColWidth": 202 + } +}
\ No newline at end of file diff --git a/dotfiles/common/.config/calibre/plugins/Open With.zip b/dotfiles/common/.config/calibre/plugins/Open With.zip Binary files differnew file mode 100644 index 0000000..548c8ed --- /dev/null +++ b/dotfiles/common/.config/calibre/plugins/Open With.zip diff --git a/dotfiles/common/.config/calibre/plugins/Reading List.json b/dotfiles/common/.config/calibre/plugins/Reading List.json new file mode 100644 index 0000000..a348407 --- /dev/null +++ b/dotfiles/common/.config/calibre/plugins/Reading List.json @@ -0,0 +1,8 @@ +{ + "Devices": {}, + "Options": { + "quickAccess": false, + "removeDialog": true + }, + "SchemaVersion": 1.65 +}
\ No newline at end of file diff --git a/dotfiles/common/.config/calibre/plugins/Reading List.zip b/dotfiles/common/.config/calibre/plugins/Reading List.zip Binary files differnew file mode 100644 index 0000000..3a46edf --- /dev/null +++ b/dotfiles/common/.config/calibre/plugins/Reading List.zip diff --git a/dotfiles/common/.config/calibre/plugins/Search The Internet.json b/dotfiles/common/.config/calibre/plugins/Search The Internet.json new file mode 100644 index 0000000..21f6786 --- /dev/null +++ b/dotfiles/common/.config/calibre/plugins/Search The Internet.json @@ -0,0 +1,1097 @@ +{ + "SearchMenus": { + "Menus": [ + { + "active": false, + "encoding": "utf-8", + "image": "stip_audible.png", + "menuText": "Audible for Author", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://www.audible.com/search?keywords={author}" + }, + { + "active": false, + "encoding": "utf-8", + "image": "stip_audible.png", + "menuText": "Audible for Book", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://www.audible.com/search?keywords={author}+{title}" + }, + { + "active": false, + "encoding": "", + "image": "", + "menuText": "", + "method": "", + "openGroup": false, + "subMenu": "", + "url": "" + }, + { + "active": true, + "encoding": "latin-1", + "image": "stip_amazon.png", + "menuText": "Amazon.com for Book", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://www.amazon.com/s/ref=nb_sb_noss?url=search-alias%3Dstripbooks&field-keywords={author}+{title}" + }, + { + "active": false, + "encoding": "latin-1", + "image": "stip_amazon.png", + "menuText": "Amazon.co.uk for Book", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://www.amazon.co.uk/s/ref=nb_sb_noss?url=search-alias%3Dstripbooks&field-keywords={author}+{title}" + }, + { + "active": false, + "encoding": "latin-1", + "image": "stip_amazon.png", + "menuText": "Amazon.com.au for Book", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://www.amazon.com.au/s/ref=nb_sb_noss?url=search-alias%3Dstripbooks&field-keywords={author}+{title}" + }, + { + "active": false, + "encoding": "", + "image": "", + "menuText": "", + "method": "", + "openGroup": false, + "subMenu": "", + "url": "" + }, + { + "active": false, + "encoding": "utf-8", + "image": "stip_bn.png", + "menuText": "Barnes and Noble for Author", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://www.barnesandnoble.com/s/{author}/_/M-8q8" + }, + { + "active": false, + "encoding": "utf-8", + "image": "stip_bn.png", + "menuText": "Barnes and Noble for Book", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://www.barnesandnoble.com/s/{author}+{title}/_/M-8q8" + }, + { + "active": false, + "encoding": "utf-8", + "image": "stip_bn.png", + "menuText": "Barnes and Noble for ISBN", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://www.barnesandnoble.com/s/{isbn}/_/M-8q8" + }, + { + "active": false, + "encoding": "utf-8", + "image": "stip_bn.png", + "menuText": "Barnes and Noble for Title", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://www.barnesandnoble.com/s/{title}/_/M-8q8" + }, + { + "active": false, + "encoding": "", + "image": "", + "menuText": "", + "method": "", + "openGroup": false, + "subMenu": "", + "url": "" + }, + { + "active": false, + "encoding": "utf-8", + "image": "stip_ebay.png", + "menuText": "EBay US", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://www.ebay.com/sch/i.html?_nkw={author}+{title}&_sacat=267" + }, + { + "active": false, + "encoding": "utf-8", + "image": "stip_ebay.png", + "menuText": "EBay UK", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://www.ebay.co.uk/sch/i.html?_nkw={author}+{title}&_sacat=267" + }, + { + "active": false, + "encoding": "", + "image": "", + "menuText": "", + "method": "", + "openGroup": false, + "subMenu": "", + "url": "" + }, + { + "active": false, + "encoding": "utf-8", + "image": "stip_ebooks.png", + "menuText": "EBooks for Author", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://www.ebooks.com/SearchApp/SearchResults.net?term={author}&RestrictBy=author" + }, + { + "active": false, + "encoding": "utf-8", + "image": "stip_ebooks.png", + "menuText": "EBooks for Book", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://www.ebooks.com/SearchApp/SearchResults.net?term={author}+{title}" + }, + { + "active": true, + "encoding": "", + "image": "", + "menuText": "", + "method": "", + "openGroup": false, + "subMenu": "", + "url": "" + }, + { + "active": true, + "encoding": "utf-8", + "image": "stip_ff.png", + "menuText": "FantasticFiction for Author", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://www.fantasticfiction.com/search/?searchfor=author&keywords={author}" + }, + { + "active": true, + "encoding": "utf-8", + "image": "stip_ff.png", + "menuText": "FantasticFiction for Title", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://www.fantasticfiction.com/search/?searchfor=book&keywords={title}" + }, + { + "active": false, + "encoding": "", + "image": "", + "menuText": "", + "method": "", + "openGroup": false, + "subMenu": "", + "url": "" + }, + { + "active": false, + "encoding": "utf-8", + "image": "stip_fictiondb.png", + "menuText": "FictionDB for Author", + "method": "POST", + "openGroup": false, + "subMenu": "", + "url": "https://www.fictiondb.com/search/searchresults.htm?styp=5&srchtxt={author}" + }, + { + "active": false, + "encoding": "utf-8", + "image": "stip_fictiondb.png", + "menuText": "FictionDB for Book", + "method": "POST", + "openGroup": false, + "subMenu": "", + "url": "https://www.fictiondb.com/search/searchresults.htm?styp=5&author={author}&title={title}&srchtxt=multi&sgcode=0&tpcode=0&imprint=0&pubgroup=0&genretype=--&rating=-&myrating=-&status=-" + }, + { + "active": false, + "encoding": "utf-8", + "image": "stip_fictiondb.png", + "menuText": "FictionDB for ISBN", + "method": "POST", + "openGroup": false, + "subMenu": "", + "url": "https://www.fictiondb.com/search/searchresults.htm?styp=5&srchtxt={isbn}" + }, + { + "active": false, + "encoding": "utf-8", + "image": "stip_fictiondb.png", + "menuText": "FictionDB for Title", + "method": "POST", + "openGroup": false, + "subMenu": "", + "url": "https://www.fictiondb.com/search/searchresults.htm?styp=5&srchtxt={title}" + }, + { + "active": false, + "encoding": "", + "image": "", + "menuText": "", + "method": "", + "openGroup": false, + "subMenu": "", + "url": "" + }, + { + "active": false, + "encoding": "utf-8", + "image": "stip_goodreads.png", + "menuText": "Goodreads for Author", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://www.goodreads.com/search/search?q={author}&search_type=books" + }, + { + "active": false, + "encoding": "utf-8", + "image": "stip_goodreads.png", + "menuText": "Goodreads for Book", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://www.goodreads.com/search/search?q={author}+{title}&search_type=books" + }, + { + "active": false, + "encoding": "utf-8", + "image": "stip_goodreads.png", + "menuText": "Goodreads for ISBN", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://www.goodreads.com/search/search?q={isbn}&search_type=books" + }, + { + "active": false, + "encoding": "utf-8", + "image": "stip_goodreads.png", + "menuText": "Goodreads for Title", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://www.goodreads.com/search/search?q={title}&search_type=books" + }, + { + "active": true, + "encoding": "", + "image": "", + "menuText": "", + "method": "", + "openGroup": false, + "subMenu": "", + "url": "" + }, + { + "active": true, + "encoding": "utf-8", + "image": "stip_google.png", + "menuText": "Google images for Book", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://www.google.com/images?q=%22{author}%22+%22{title}%22" + }, + { + "active": true, + "encoding": "utf-8", + "image": "stip_google.png", + "menuText": "Google images 400x300", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://www.google.com/images?as_q={author}+%22{title}%22&tbs=isch:1,isz:lt,islt:qsvga,imgo:1&safe=off" + }, + { + "active": true, + "encoding": "utf-8", + "image": "stip_google.png", + "menuText": "Google.com for Book", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://www.google.com/#sclient=psy&q=%22{author}%22+%22{title}%22" + }, + { + "active": false, + "encoding": "", + "image": "", + "menuText": "", + "method": "", + "openGroup": false, + "subMenu": "", + "url": "" + }, + { + "active": false, + "encoding": "latin-1", + "image": "stip_isfdb.png", + "menuText": "isfdb for Author", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://www.isfdb.org/cgi-bin/se.cgi?type=Name&arg={author}" + }, + { + "active": false, + "encoding": "latin-1", + "image": "stip_isfdb.png", + "menuText": "isfdb for Book", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://www.isfdb.org/cgi-bin/edit/tp_search.cgi?TERM_1={title}&USE_1=title&OPERATOR_1=AND&TERM_2={author}&USE_2=author&OPERATOR_2=AND" + }, + { + "active": false, + "encoding": "latin-1", + "image": "stip_isfdb.png", + "menuText": "isfdb for ISBN", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://www.isfdb.org/cgi-bin/se.cgi?type=ISBN&arg={isbn}" + }, + { + "active": false, + "encoding": "latin-1", + "image": "stip_isfdb.png", + "menuText": "isfdb for Title", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://www.isfdb.org/cgi-bin/se.cgi?type=Fiction+Titles&arg={title}" + }, + { + "active": false, + "encoding": "", + "image": "", + "menuText": "", + "method": "", + "openGroup": false, + "subMenu": "", + "url": "" + }, + { + "active": false, + "encoding": "utf-8", + "image": "stip_kobo.png", + "menuText": "Kobo for Author", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://www.kobobooks.com/search/search.html?q={author}&f=author" + }, + { + "active": false, + "encoding": "utf-8", + "image": "stip_kobo.png", + "menuText": "Kobo for Book", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://www.kobobooks.com/search/search.html?q={author}+{title}&f=author" + }, + { + "active": false, + "encoding": "utf-8", + "image": "stip_kobo.png", + "menuText": "Kobo for Title", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://www.kobobooks.com/search/search.html?q={title}" + }, + { + "active": false, + "encoding": "", + "image": "", + "menuText": "", + "method": "", + "openGroup": false, + "subMenu": "", + "url": "" + }, + { + "active": false, + "encoding": "utf-8", + "image": "stip_loc.png", + "menuText": "Library of Congress for Author", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://catalog.loc.gov/cgi-bin/Pwebrecon.cgi?DB=local&Search_Arg={author}&Search_Code=NAME%40&CNT=100&hist=1&type=quick" + }, + { + "active": false, + "encoding": "utf-8", + "image": "stip_loc.png", + "menuText": "Library of Congress for ISBN", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://catalog.loc.gov/cgi-bin/Pwebrecon.cgi?DB=local&Search_Arg={isbn}&Search_Code=STNO^*&CNT=100&hist=1&type=quick" + }, + { + "active": false, + "encoding": "utf-8", + "image": "stip_loc.png", + "menuText": "Library of Congress for Title", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://catalog.loc.gov/cgi-bin/Pwebrecon.cgi?DB=local&Search_Arg={title}&Search_Code=TKEY^*&CNT=100&hist=1&type=quick" + }, + { + "active": false, + "encoding": "", + "image": "", + "menuText": "", + "method": "", + "openGroup": false, + "subMenu": "", + "url": "" + }, + { + "active": false, + "encoding": "utf-8", + "image": "stip_lthing.png", + "menuText": "LibraryThing for Author", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://www.librarything.com/search.php?search={author}" + }, + { + "active": false, + "encoding": "utf-8", + "image": "stip_lthing.png", + "menuText": "LibraryThing for Book", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://www.librarything.com/search.php?search={title}+{author}" + }, + { + "active": false, + "encoding": "utf-8", + "image": "stip_lthing.png", + "menuText": "LibraryThing for ISBN", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://www.librarything.com/search.php?search={isbn}" + }, + { + "active": false, + "encoding": "utf-8", + "image": "stip_lthing.png", + "menuText": "LibraryThing for Title", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://www.librarything.com/search.php?search={title}" + }, + { + "active": false, + "encoding": "", + "image": "", + "menuText": "", + "method": "", + "openGroup": false, + "subMenu": "", + "url": "" + }, + { + "active": false, + "encoding": "utf-8", + "image": "stip_litmap.png", + "menuText": "Literature-Map like Author", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://www.literature-map.com/{author}" + }, + { + "active": false, + "encoding": "", + "image": "", + "menuText": "", + "method": "", + "openGroup": false, + "subMenu": "", + "url": "" + }, + { + "active": false, + "encoding": "utf-8", + "image": "stip_loveread.png", + "menuText": "Lovereading for Author", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://www.lovereading.co.uk/search?s={author}" + }, + { + "active": false, + "encoding": "utf-8", + "image": "stip_loveread.png", + "menuText": "Lovereading for Book", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://www.lovereading.co.uk/search?s={author}+{title}&view=book-results" + }, + { + "active": false, + "encoding": "utf-8", + "image": "stip_loveread.png", + "menuText": "Lovereading for Title", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://www.lovereading.co.uk/search?s={title}&view=book-results" + }, + { + "active": false, + "encoding": "", + "image": "", + "menuText": "", + "method": "", + "openGroup": false, + "subMenu": "", + "url": "" + }, + { + "active": false, + "encoding": "utf-8", + "image": "stip_manybooks.png", + "menuText": "ManyBooks for Author", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://manybooks.net/search-book?search={author}" + }, + { + "active": false, + "encoding": "utf-8", + "image": "stip_manybooks.png", + "menuText": "ManyBooks for Title", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://manybooks.net/search-book?search={title}" + }, + { + "active": false, + "encoding": "", + "image": "", + "menuText": "", + "method": "", + "openGroup": false, + "subMenu": "", + "url": "" + }, + { + "active": false, + "encoding": "", + "image": "stip_nyt.png", + "menuText": "NYTimes for Author", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://nytimes.com/search?query={author}" + }, + { + "active": false, + "encoding": "", + "image": "stip_nyt.png", + "menuText": "NYTimes for Book", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://nytimes.com/search?query={author}+{title}" + }, + { + "active": false, + "encoding": "", + "image": "stip_nyt.png", + "menuText": "NYTimes for Title", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://nytimes.com/search?query={title}" + }, + { + "active": false, + "encoding": "", + "image": "", + "menuText": "", + "method": "", + "openGroup": false, + "subMenu": "", + "url": "" + }, + { + "active": false, + "encoding": "utf-8", + "image": "stip_wstones.png", + "menuText": "Waterstones for Author", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://www.waterstones.com/books/search/term/{author}" + }, + { + "active": false, + "encoding": "utf-8", + "image": "stip_wstones.png", + "menuText": "Waterstones for Book", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://www.waterstones.com/books/search/term/{title}+{author}" + }, + { + "active": false, + "encoding": "utf-8", + "image": "stip_wstones.png", + "menuText": "Waterstones for ISBN", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://www.waterstones.com/books/search/term/{isbn}" + }, + { + "active": false, + "encoding": "utf-8", + "image": "stip_wstones.png", + "menuText": "Waterstones for Title", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://www.waterstones.com/books/search/term/{title}" + }, + { + "active": false, + "encoding": "", + "image": "", + "menuText": "", + "method": "", + "openGroup": false, + "subMenu": "", + "url": "" + }, + { + "active": false, + "encoding": "utf-8", + "image": "stip_wsirn.png", + "menuText": "WhatShouldIReadNext for ISBN", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://www.whatshouldireadnext.com/isbn/{isbn}" + }, + { + "active": false, + "encoding": "", + "image": "", + "menuText": "", + "method": "", + "openGroup": false, + "subMenu": "", + "url": "" + }, + { + "active": false, + "encoding": "utf-8", + "image": "stip_wikipedia.png", + "menuText": "Wikipedia for Author", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://en.wikipedia.org/w/index.php?title=Special%3ASearch&search={author}" + }, + { + "active": false, + "encoding": "utf-8", + "image": "stip_wikipedia.png", + "menuText": "Wikipedia for Book", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://en.wikipedia.org/w/index.php?title=Special%3ASearch&search={author}+{title}" + }, + { + "active": false, + "encoding": "utf-8", + "image": "stip_wikipedia.png", + "menuText": "Wikipedia for Title", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://en.wikipedia.org/w/index.php?title=Special%3ASearch&search={title}" + }, + { + "active": false, + "encoding": "", + "image": "", + "menuText": "", + "method": "", + "openGroup": false, + "subMenu": "", + "url": "" + }, + { + "active": false, + "encoding": "latin-1", + "image": "stip_amazon.png", + "menuText": "Amazon.ca for Book", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://www.amazon.ca/s/ref=nb_sb_noss?url=search-alias%3Dstripbooks&field-keywords={author}+{title}" + }, + { + "active": false, + "encoding": "latin-1", + "image": "stip_amazon.png", + "menuText": "Amazon.cn for Book", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://www.amazon.cn/s/ref=nb_sb_noss?url=search-alias%3Dstripbooks&field-keywords={author}+{title}" + }, + { + "active": false, + "encoding": "latin-1", + "image": "stip_amazon.png", + "menuText": "Amazon.co.jp for Book", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://www.amazon.co.jp/s/ref=nb_sb_noss?url=search-alias%3Dstripbooks&field-keywords={author}+{title}" + }, + { + "active": false, + "encoding": "latin-1", + "image": "stip_amazon.png", + "menuText": "Amazon.de for Book", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://www.amazon.de/s/ref=nb_sb_noss?url=search-alias%3Dstripbooks&field-keywords={author}+{title}" + }, + { + "active": false, + "encoding": "latin-1", + "image": "stip_amazon.png", + "menuText": "Amazon.it for Book", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://www.amazon.it/s/ref=nb_sb_noss?url=search-alias%3Dstripbooks&field-keywords={author}+{title}" + }, + { + "active": false, + "encoding": "latin-1", + "image": "stip_amazon.png", + "menuText": "Amazon.fr for Book", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://www.amazon.fr/s/ref=nb_sb_noss?url=search-alias%3Dstripbooks&field-keywords={author}+{title}" + }, + { + "active": false, + "encoding": "utf-8", + "image": "stip_chapters.png", + "menuText": "Chapters.ca for Author", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://indigo.ca/en-ca/search/?q={author}" + }, + { + "active": false, + "encoding": "utf-8", + "image": "stip_chapters.png", + "menuText": "Chapters.ca for Book", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://indigo.ca/en-ca/search/?q={author}+{title}" + }, + { + "active": false, + "encoding": "utf-8", + "image": "stip_chapters.png", + "menuText": "Chapters.ca for ISBN", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://indigo.ca/en-ca/search/?q={isbn}" + }, + { + "active": false, + "encoding": "utf-8", + "image": "stip_chapters.png", + "menuText": "Chapters.ca for Title", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://indigo.ca/en-ca/search/?q={title}" + }, + { + "active": false, + "encoding": "utf-8", + "image": "stip_fnac.png", + "menuText": "Fnac for Author", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://recherche.fnac.com/Search/SearchResult.aspx?SCat=2&Search={author}" + }, + { + "active": false, + "encoding": "utf-8", + "image": "stip_fnac.png", + "menuText": "Fnac for Book", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://recherche.fnac.com/Search/SearchResult.aspx?SCat=2&Search={author}+{title}" + }, + { + "active": false, + "encoding": "utf-8", + "image": "stip_fnac.png", + "menuText": "Fnac for Title", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://recherche.fnac.com/Search/SearchResult.aspx?SCat=2&Search={title}" + }, + { + "active": false, + "encoding": "utf-8", + "image": "stip_google.png", + "menuText": "Google.de for Book", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://www.google.de/#sclient=psy&q=%22{author}%22+%22{title}%22" + }, + { + "active": false, + "encoding": "utf-8", + "image": "stip_google.png", + "menuText": "Google.es for Book", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://www.google.es/#sclient=psy&q=%22{author}%22+%22{title}%22" + }, + { + "active": false, + "encoding": "utf-8", + "image": "stip_google.png", + "menuText": "Google.fr for Book", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://www.google.fr/#sclient=psy&q=%22{author}%22+%22{title}%22" + }, + { + "active": false, + "encoding": "utf-8", + "image": "stip_google.png", + "menuText": "Google.it for Book", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://www.google.it/#sclient=psy&q=%22{author}%22+%22{title}%22" + }, + { + "active": false, + "encoding": "utf-8", + "image": "stip_libri.png", + "menuText": "libri.de for Author", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://www.libri.de/shop/action/advancedSearch?action=search&nodeId=-1&binderType=Alle&languageCode=DE&person={author}" + }, + { + "active": false, + "encoding": "utf-8", + "image": "stip_libri.png", + "menuText": "libri.de for Book", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://www.libri.de/shop/action/advancedSearch?action=search&nodeId=-1&binderType=Alle&languageCode=DE&title={title}&person={author}" + }, + { + "active": false, + "encoding": "utf-8", + "image": "stip_libri.png", + "menuText": "libri.de for Title", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://www.libri.de/shop/action/advancedSearch?action=search&nodeId=-1&binderType=Alle&languageCode=DE&title={title}" + }, + { + "active": false, + "encoding": "utf-8", + "image": "stip_wikipedia.png", + "menuText": "Wikipedia.de for Author", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://de.wikipedia.org/w/index.php?title=Special%3ASearch&search={author}" + }, + { + "active": false, + "encoding": "utf-8", + "image": "stip_wikipedia.png", + "menuText": "Wikipedia.de for Book", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://de.wikipedia.org/w/index.php?title=Special%3ASearch&search={author}+{title}" + }, + { + "active": false, + "encoding": "utf-8", + "image": "stip_wikipedia.png", + "menuText": "Wikipedia.de for Title", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://de.wikipedia.org/w/index.php?title=Special%3ASearch&search={title}" + }, + { + "active": false, + "encoding": "utf-8", + "image": "stip_wikipedia.png", + "menuText": "Wikipedia.es for Author", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://es.wikipedia.org/w/index.php?title=Special%3ASearch&search={author}" + }, + { + "active": false, + "encoding": "utf-8", + "image": "stip_wikipedia.png", + "menuText": "Wikipedia.es for Book", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://es.wikipedia.org/w/index.php?title=Special%3ASearch&search={author}+{title}" + }, + { + "active": false, + "encoding": "utf-8", + "image": "stip_wikipedia.png", + "menuText": "Wikipedia.es for Title", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://es.wikipedia.org/w/index.php?title=Special%3ASearch&search={title}" + }, + { + "active": false, + "encoding": "utf-8", + "image": "stip_wikipedia.png", + "menuText": "Wikipedia.fr for Author", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://fr.wikipedia.org/w/index.php?title=Sp%E9cial%3ARecherche&search={author}" + }, + { + "active": false, + "encoding": "utf-8", + "image": "stip_wikipedia.png", + "menuText": "Wikipedia.fr for Book", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://fr.wikipedia.org/w/index.php?title=Special%3ASearch&search={author}+{title}" + }, + { + "active": false, + "encoding": "utf-8", + "image": "stip_wikipedia.png", + "menuText": "Wikipedia.fr for Title", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://fr.wikipedia.org/w/index.php?title=Sp%E9cial%3ARecherche&search={title}" + }, + { + "active": false, + "encoding": "utf-8", + "image": "stip_wikipedia.png", + "menuText": "Wikipedia.it for Author", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://it.wikipedia.org/w/index.php?title=Special%3ASearch&search={author}" + }, + { + "active": false, + "encoding": "utf-8", + "image": "stip_wikipedia.png", + "menuText": "Wikipedia.it for Book", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://it.wikipedia.org/w/index.php?title=Special%3ASearch&search={author}+{title}" + }, + { + "active": false, + "encoding": "utf-8", + "image": "stip_wikipedia.png", + "menuText": "Wikipedia.it for Title", + "method": "GET", + "openGroup": false, + "subMenu": "", + "url": "https://it.wikipedia.org/w/index.php?title=Special%3ASearch&search={title}" + } + ], + "UrlColWidth": 1543 + } +}
\ No newline at end of file diff --git a/dotfiles/common/.config/calibre/plugins/Wikidata.zip b/dotfiles/common/.config/calibre/plugins/Wikidata.zip Binary files differnew file mode 100644 index 0000000..61f919b --- /dev/null +++ b/dotfiles/common/.config/calibre/plugins/Wikidata.zip diff --git a/dotfiles/common/.config/calibre/save_to_disk.py.json b/dotfiles/common/.config/calibre/save_to_disk.py.json new file mode 100644 index 0000000..bdf4e57 --- /dev/null +++ b/dotfiles/common/.config/calibre/save_to_disk.py.json @@ -0,0 +1,15 @@ +{ + "asciiize": false, + "formats": "all", + "replace_whitespace": false, + "save_cover": true, + "save_extra_files": false, + "send_template": "{author_sort}/{title} - {authors}", + "send_timefmt": "%b, %Y", + "single_dir": false, + "template": "{author_sort}/{title}/{title} - {authors}", + "timefmt": "%b, %Y", + "to_lowercase": false, + "update_metadata": false, + "write_opf": true +}
\ No newline at end of file diff --git a/dotfiles/common/.config/calibre/scheduler.xml b/dotfiles/common/.config/calibre/scheduler.xml new file mode 100644 index 0000000..d145a64 --- /dev/null +++ b/dotfiles/common/.config/calibre/scheduler.xml @@ -0,0 +1,166 @@ +<?xml version='1.0' encoding='utf-8'?> +<recipe_collection xmlns="http://calibre-ebook.com/recipe_collection"> + + <recipe_customization keep_issues="0" id="builtin:cracked_com" add_title_tag="yes" custom_tags="" recipe_specific_options="{}"/> + + <recipe_customization keep_issues="0" id="builtin:economist_free" add_title_tag="yes" custom_tags="" recipe_specific_options="{}"/> + + <recipe_customization keep_issues="0" id="builtin:economist_news" add_title_tag="yes" custom_tags="" recipe_specific_options="{}"/> + + <recipe_customization keep_issues="0" id="builtin:howtogeek" add_title_tag="yes" custom_tags="" recipe_specific_options="{}"/> + + <recipe_customization keep_issues="0" id="builtin:instapaper" add_title_tag="yes" custom_tags="" recipe_specific_options="{}"/> + + <recipe_customization keep_issues="0" id="builtin:nejm" add_title_tag="yes" custom_tags="" recipe_specific_options="{}"/> + + <recipe_customization keep_issues="7" id="builtin:nytimes" add_title_tag="yes" custom_tags="news" recipe_specific_options="{"web": "yes", "days": "1", "comp": "yes"}"/> + + <recipe_customization keep_issues="0" id="builtin:seattle_times" add_title_tag="yes" custom_tags="" recipe_specific_options="{}"/> + + <recipe_customization keep_issues="0" id="builtin:wsj_free" add_title_tag="yes" custom_tags="" recipe_specific_options="{}"/> + + <recipe_customization keep_issues="0" id="builtin:wsj" add_title_tag="yes" custom_tags="" recipe_specific_options="{}"/> + + <recipe_customization keep_issues="0" id="builtin:wash_post" add_title_tag="yes" custom_tags="" recipe_specific_options="{}"/> + + <recipe_customization keep_issues="0" id="builtin:wash_post_print" add_title_tag="yes" custom_tags="" recipe_specific_options="{}"/> + + <recipe_customization keep_issues="0" id="builtin:san_fran_chronicle" add_title_tag="yes" custom_tags="" recipe_specific_options="{}"/> + + <recipe_customization keep_issues="0" id="builtin:nytfeeds" add_title_tag="yes" custom_tags="" recipe_specific_options="{}"/> + + <recipe_customization keep_issues="0" id="builtin:nyt_magazine" add_title_tag="yes" custom_tags="" recipe_specific_options="{}"/> + + <recipe_customization keep_issues="0" id="builtin:nytimes_cooking" add_title_tag="yes" custom_tags="" recipe_specific_options="{}"/> + + <recipe_customization keep_issues="0" id="builtin:nytimesbook" add_title_tag="yes" custom_tags="" recipe_specific_options="{}"/> + + <recipe_customization keep_issues="0" id="builtin:lex_fridman_podcast" add_title_tag="yes" custom_tags="" recipe_specific_options="{}"/> + + <recipe_customization keep_issues="0" id="builtin:thenewcriterion" add_title_tag="yes" custom_tags="" recipe_specific_options="{}"/> + + <recipe_customization keep_issues="0" id="builtin:the_register" add_title_tag="yes" custom_tags="" recipe_specific_options="{}"/> + + <recipe_customization keep_issues="0" id="builtin:bbc_fast" add_title_tag="yes" custom_tags="" recipe_specific_options="{}"/> + + <recipe_customization keep_issues="0" id="builtin:american_thinker" add_title_tag="yes" custom_tags="" recipe_specific_options="{}"/> + + <recipe_customization keep_issues="0" id="builtin:barrons" add_title_tag="yes" custom_tags="" recipe_specific_options="{}"/> + + <recipe_customization keep_issues="0" id="builtin:bloomberg" add_title_tag="yes" custom_tags="" recipe_specific_options="{}"/> + + <recipe_customization keep_issues="0" id="builtin:nautilus" add_title_tag="yes" custom_tags="" recipe_specific_options="{}"/> + + <recipe_customization keep_issues="0" id="builtin:nymag" add_title_tag="yes" custom_tags="" recipe_specific_options="{}"/> + + <recipe_customization keep_issues="0" id="builtin:nypost" add_title_tag="yes" custom_tags="" recipe_specific_options="{}"/> + + <recipe_customization keep_issues="0" id="builtin:new_york_review_of_books" add_title_tag="yes" custom_tags="" recipe_specific_options="{}"/> + + <recipe_customization keep_issues="0" id="builtin:substack" add_title_tag="yes" custom_tags="" recipe_specific_options="{}"/> + + <recipe_customization keep_issues="0" id="builtin:cato" add_title_tag="yes" custom_tags="" recipe_specific_options="{}"/> + + <scheduled_recipe id="builtin:new_yorker" title="The New Yorker Magazine" last_downloaded="2026-01-11T18:56:25.700603+00:00"><schedule type="days_of_week">6:6:0</schedule></scheduled_recipe> + + <recipe_customization keep_issues="0" id="builtin:new_yorker" add_title_tag="yes" custom_tags="news" recipe_specific_options="{}"/> + + <recipe_customization keep_issues="0" id="builtin:the_week_magazine_free" add_title_tag="yes" custom_tags="news" recipe_specific_options="{}"/> + + <recipe_customization keep_issues="0" id="builtin:atlantic_com" add_title_tag="yes" custom_tags="news" recipe_specific_options="{}"/> + + <scheduled_recipe id="builtin:atlantic" title="The Atlantic" last_downloaded="2025-10-02T21:22:05.499182+00:00"><schedule type="days_of_month">24:6:0</schedule></scheduled_recipe> + + <recipe_customization keep_issues="0" id="builtin:atlantic" add_title_tag="yes" custom_tags="news" recipe_specific_options="{}"/> + + <scheduled_recipe id="builtin:harpers" title="Harper’s Magazine" last_downloaded="2025-10-02T21:21:56.402441+00:00"><schedule type="days_of_month">24:6:0</schedule></scheduled_recipe> + + <recipe_customization keep_issues="0" id="builtin:harpers" add_title_tag="yes" custom_tags="news" recipe_specific_options="{}"/> + + <recipe_customization keep_issues="0" id="builtin:rushisaband" add_title_tag="yes" custom_tags="" recipe_specific_options="{}"/> + + <recipe_customization keep_issues="0" id="builtin:prospectmaguk_free" add_title_tag="yes" custom_tags="" recipe_specific_options="{}"/> + + <recipe_customization keep_issues="0" id="builtin:oxford_mail" add_title_tag="yes" custom_tags="" recipe_specific_options="{}"/> + + <recipe_customization keep_issues="0" id="builtin:lrb" add_title_tag="yes" custom_tags="news" recipe_specific_options="{}"/> + + <recipe_customization keep_issues="0" id="builtin:interfax" add_title_tag="yes" custom_tags="" recipe_specific_options="{}"/> + + <recipe_customization keep_issues="0" id="builtin:ukrinform_en" add_title_tag="yes" custom_tags="" recipe_specific_options="{}"/> + + <recipe_customization keep_issues="0" id="builtin:nv_en" add_title_tag="yes" custom_tags="" recipe_specific_options="{}"/> + + <recipe_customization keep_issues="0" id="builtin:kyivpost_en" add_title_tag="yes" custom_tags="" recipe_specific_options="{}"/> + + <recipe_customization keep_issues="0" id="builtin:gagadget_en" add_title_tag="yes" custom_tags="" recipe_specific_options="{}"/> + + <recipe_customization keep_issues="0" id="builtin:google_news" add_title_tag="yes" custom_tags="" recipe_specific_options="{}"/> + + <recipe_customization keep_issues="0" id="builtin:moscow_times" add_title_tag="yes" custom_tags="" recipe_specific_options="{}"/> + + <recipe_customization keep_issues="0" id="builtin:novaya_gazeta_europe_en" add_title_tag="yes" custom_tags="news" recipe_specific_options="{}"/> + + <recipe_customization keep_issues="0" id="builtin:coda" add_title_tag="yes" custom_tags="news" recipe_specific_options="{}"/> + + <recipe_customization keep_issues="0" id="builtin:moscowtimes_en" add_title_tag="yes" custom_tags="news" recipe_specific_options="{}"/> + + <recipe_customization keep_issues="0" id="builtin:t_invariant_en" add_title_tag="yes" custom_tags="" recipe_specific_options="{}"/> + + <recipe_customization keep_issues="0" id="builtin:sputnik" add_title_tag="yes" custom_tags="" recipe_specific_options="{}"/> + + <recipe_customization keep_issues="0" id="builtin:russiafeed" add_title_tag="yes" custom_tags="" recipe_specific_options="{}"/> + + <recipe_customization keep_issues="0" id="builtin:spiegel_int" add_title_tag="yes" custom_tags="" recipe_specific_options="{}"/> + + <recipe_customization keep_issues="0" id="builtin:haaretz_en" add_title_tag="yes" custom_tags="" recipe_specific_options="{}"/> + + <recipe_customization keep_issues="0" id="builtin:foreignaffairs" add_title_tag="yes" custom_tags="news" recipe_specific_options="{}"/> + + <recipe_customization keep_issues="0" id="builtin:new_york_review_of_books_no_sub" add_title_tag="yes" custom_tags="news" recipe_specific_options="{}"/> + + <recipe_customization keep_issues="0" id="builtin:phillosophy_now" add_title_tag="yes" custom_tags="news" recipe_specific_options="{}"/> + + <recipe_customization keep_issues="0" id="builtin:scientific_american" add_title_tag="yes" custom_tags="news" recipe_specific_options="{"res": "500"}"/> + + <recipe_customization keep_issues="0" id="builtin:daily_writing_tips" add_title_tag="yes" custom_tags="" recipe_specific_options="{}"/> + + <recipe_customization keep_issues="0" id="builtin:economist_world_ahead" add_title_tag="yes" custom_tags="" recipe_specific_options="{}"/> + + <recipe_customization keep_issues="0" id="builtin:tls_mag" add_title_tag="yes" custom_tags="" recipe_specific_options="{}"/> + + <recipe_customization keep_issues="0" id="builtin:ars_technica" add_title_tag="yes" custom_tags="" recipe_specific_options="{}"/> + + <recipe_customization keep_issues="0" id="builtin:motherjones" add_title_tag="yes" custom_tags="" recipe_specific_options="{}"/> + + <recipe_customization keep_issues="0" id="builtin:time_magazine" add_title_tag="yes" custom_tags="" recipe_specific_options="{}"/> + + <recipe_customization keep_issues="0" id="builtin:wired" add_title_tag="yes" custom_tags="news" recipe_specific_options="{}"/> + + <recipe_customization keep_issues="0" id="builtin:the_federalist" add_title_tag="yes" custom_tags="" recipe_specific_options="{}"/> + + <recipe_customization keep_issues="0" id="builtin:le_monde_en" add_title_tag="yes" custom_tags="" recipe_specific_options="{}"/> + + <recipe_customization keep_issues="0" id="builtin:deutsche_welle_en" add_title_tag="yes" custom_tags="" recipe_specific_options="{}"/> + + <recipe_customization keep_issues="7" id="custom:1000" add_title_tag="yes" custom_tags="news" recipe_specific_options="{"web": "yes", "days": "1", "res": "mediumThreeByTwo440", "comp": "yes"}"/> + + <scheduled_recipe id="builtin:newrepublicmag" title="The New Republic Magazine" last_downloaded="2026-01-01T06:00:38.301817+00:00"><schedule type="days_of_month">1:0:0</schedule></scheduled_recipe> + + <recipe_customization keep_issues="0" id="builtin:newrepublicmag" add_title_tag="yes" custom_tags="news" recipe_specific_options="{}"/> + + <recipe_customization keep_issues="0" id="builtin:jacobinmag" add_title_tag="yes" custom_tags="news" recipe_specific_options="{}"/> + + <account_info id="builtin:lemonde_dip" username="craigmartinjennings@gmail.com" password="cmjDase1n"/> + + <scheduled_recipe id="builtin:lemonde_dip" title="Le Monde diplomatique - English edition" last_downloaded="2026-01-13T14:53:10.643908+00:00"><schedule type="interval">30.000000</schedule></scheduled_recipe> + + <recipe_customization keep_issues="0" id="builtin:lemonde_dip" add_title_tag="yes" custom_tags="news" recipe_specific_options="{}"/> + + <scheduled_recipe id="builtin:economist" title="The Economist" last_downloaded="2026-01-17T12:02:39.598845+00:00"><schedule type="days_of_week">5:6:0</schedule></scheduled_recipe> + + <recipe_customization keep_issues="7" id="builtin:economist" add_title_tag="yes" custom_tags="news" recipe_specific_options="{"res": "834"}"/> + + <recipe_customization keep_issues="5" id="builtin:nytimes_sub" add_title_tag="yes" custom_tags="news" recipe_specific_options="{"days": "1", "res": "mediumThreeByTwo440", "comp": "yes"}"/> + +</recipe_collection>
\ No newline at end of file diff --git a/dotfiles/common/.config/calibre/server-config.txt b/dotfiles/common/.config/calibre/server-config.txt new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/dotfiles/common/.config/calibre/server-config.txt diff --git a/dotfiles/common/.config/calibre/server-custom-list-template.json b/dotfiles/common/.config/calibre/server-custom-list-template.json new file mode 100644 index 0000000..f5cad2c --- /dev/null +++ b/dotfiles/common/.config/calibre/server-custom-list-template.json @@ -0,0 +1,14 @@ +{ + "comments_fields": [ + "comments" + ], + "height": "auto", + "lines": [ + "<b>{title}</b> by {authors}", + "{series_index} of <i>{series}</i>|||{rating}", + "{tags}", + "Date: {timestamp}|||Published: {pubdate}|||Publisher: {publisher}" + ], + "thumbnail": true, + "thumbnail_height": 140 +}
\ No newline at end of file diff --git a/dotfiles/common/.config/calibre/server-search-the-net.json b/dotfiles/common/.config/calibre/server-search-the-net.json new file mode 100644 index 0000000..89dbf5a --- /dev/null +++ b/dotfiles/common/.config/calibre/server-search-the-net.json @@ -0,0 +1,7 @@ +[ + { + "name": "Z-Library", + "url": "https://z-library.sk/s/?q=Title%3A{title}%20author%3A{author}&languages[]=english&extensions[]=EPUB&extensions[]=PDF&selected_content_types[]=book&order=bestmatch", + "type": "book" + } +]
\ No newline at end of file diff --git a/dotfiles/common/.config/calibre/server-users.sqlite b/dotfiles/common/.config/calibre/server-users.sqlite Binary files differnew file mode 100644 index 0000000..c191559 --- /dev/null +++ b/dotfiles/common/.config/calibre/server-users.sqlite diff --git a/dotfiles/common/.config/calibre/shortcuts/main.json b/dotfiles/common/.config/calibre/shortcuts/main.json new file mode 100644 index 0000000..3af458c --- /dev/null +++ b/dotfiles/common/.config/calibre/shortcuts/main.json @@ -0,0 +1,15 @@ +{ + "map": { + "Interface Action: Edit Collections (Edit Collections) - qaction": [ + "Ctrl+Shift+C" + ], + "Interface Action: Extract ISBN (Extract ISBN) - qaction": [ + "Ctrl+I" + ], + "Interface Action: Quickview (Quickview) - qaction": [], + "quit calibre": [ + "Q" + ] + }, + "options_map": {} +}
\ No newline at end of file diff --git a/dotfiles/common/.config/calibre/smtp.py.json b/dotfiles/common/.config/calibre/smtp.py.json new file mode 100644 index 0000000..9e9ebb8 --- /dev/null +++ b/dotfiles/common/.config/calibre/smtp.py.json @@ -0,0 +1,77 @@ +{ + "accounts": { + "c@cjennings.net": [ + "EPUB,PDF", + false, + false + ], + "cciarmello@gmail.com": [ + "PDF", + false, + false + ], + "cjennings_oasis@kindle.com": [ + "EPUB", + false, + false + ], + "cjennings_paperwhite@kindle.com": [ + "EPUB", + false, + true + ], + "cjennings_pixel6@kindle.com": [ + "EPUB", + false, + false + ], + "laurajsmetanick@gmail.com": [ + "PDF", + false, + false + ], + "laurajsmetanick@kindle.com": [ + "EPUB, TPZ", + false, + false + ], + "lugrad2012_VxFH2q@kindle.com": [ + "EPUB, TPZ", + false, + false + ], + "rubyblu@kindle.com": [ + "EPUB,AZW3,MOBI", + false, + false + ] + }, + "aliases": { + "c@cjennings.net": "c@cjennings.net", + "cjennings_oasis@kindle.com": "Oasis", + "cjennings_paperwhite@kindle.com": "Paperwhite", + "cjennings_pixel6@kindle.com": "Pixel6", + "laurajsmetanick@gmail.com": "Laura's Direct Email", + "laurajsmetanick@kindle.com": "Laura's Kindle", + "lugrad2012_VxFH2q@kindle.com": "Laura's iPad Kindle", + "rubyblu@kindle.com": "Christine's Kindle" + }, + "encryption": "TLS", + "from_": "c@cjennings.net", + "relay_host": "127.0.0.1", + "relay_password": "306c5275546b4e3766396f556d4d4342584d65786567", + "relay_port": 1025, + "relay_username": "c@cjennings.net", + "subjects": { + "c@cjennings.net": "Book: {title} - {author}", + "cciarmello@gmail.com": "{title}", + "cjennings_oasis@kindle.com": "{title}", + "cjennings_paperwhite@kindle.com": "{title}", + "cjennings_pixel6@kindle.com": "{title}", + "laurajsmetanick@gmail.com": "{title}", + "laurajsmetanick@kindle.com": "Book: {title} - {author}", + "lugrad2012_VxFH2q@kindle.com": "Book: {title} - {author}", + "rubyblu@kindle.com": "Book: {title} - {author}" + }, + "tags": {} +}
\ No newline at end of file diff --git a/dotfiles/common/.config/calibre/tag-map-rules.json b/dotfiles/common/.config/calibre/tag-map-rules.json new file mode 100644 index 0000000..7238834 --- /dev/null +++ b/dotfiles/common/.config/calibre/tag-map-rules.json @@ -0,0 +1,10 @@ +{ + "default": [ + { + "action": "remove", + "match_type": "not_one_of", + "query": "Art, Biography & Autobiography, Business, Chess, Comics, Computer, Cooking, Design, Economics, Fiction, Finance, Fitness, Games, Gardening, History, Latin, Law, Linguistics, Literary Critique, Literature, Magic, Mathematics, Music, Mythology, Non-Fiction, Philosophy, Poetry, Political Science, Politics, Psychology, Religion, Science, Social Critique, Sociology, Travel, Zen", + "replace": "" + } + ] +}
\ No newline at end of file diff --git a/dotfiles/common/.config/calibre/viewer-webengine.json b/dotfiles/common/.config/calibre/viewer-webengine.json new file mode 100644 index 0000000..dcd1405 --- /dev/null +++ b/dotfiles/common/.config/calibre/viewer-webengine.json @@ -0,0 +1,327 @@ +{ + "geometry-of-main_window_geometry": { + "frame_geometry": { + "height": 981, + "width": 1504, + "x": 0, + "y": 22 + }, + "full_screened": false, + "geometry": { + "height": 981, + "width": 1504, + "x": 0, + "y": 22 + }, + "maximized": false, + "normal_geometry": { + "height": 981, + "width": 1504, + "x": 0, + "y": 22 + }, + "qt": { + "__class__": "bytearray", + "__value__": "AdnQywADAAAAAAAAAAAAFgAABd8AAAPqAAAAAAAAABYAAAXfAAAD6gAAAAAAAAAABeAAAAAAAAAAFgAABd8AAAPq" + }, + "screen": { + "depth": 24, + "device_pixel_ratio": 1.5, + "geometry_in_logical_pixels": { + "height": 1003, + "width": 1504, + "x": 0, + "y": 0 + }, + "index_in_screens_list": 0, + "manufacturer": "", + "model": "", + "name": "eDP-1", + "serial": "", + "size_in_logical_pixels": { + "height": 1003, + "width": 1504 + }, + "virtual_geometry": { + "height": 1003, + "width": 1504, + "x": 0, + "y": 0 + } + } + }, + "local_storage": { + "search-bar-history-search-for-sc": [ + "black", + "dark", + "reverse", + "invert", + "quit" + ] + }, + "lookup_location": "Google dictionary", + "main_window_geometry": { + "__class__": "bytearray", + "__value__": "AdnQywADAAAAAAAAAAAAEwAABd8AAAPqAAAAAAAAABMAAAXfAAAD6gAAAAAAAAAABeAAAAAAAAAAEwAABd8AAAPq" + }, + "main_window_state": { + "__class__": "bytearray", + "__value__": "AAAA/wAAAAH9AAAAAgAAAAAAAAAAAAAAAPwCAAAAAvsAAAAQAHQAbwBjAC0AZABvAGMAawAAAAAA/////wAAAIsA////+wAAABYAcwBlAGEAcgBjAGgALQBkAG8AYwBrAAAAAAD/////AAAAnAD///8AAAABAAABeAAAA9X8AgAAAAT7AAAAFgBsAG8AbwBrAHUAcAAtAGQAbwBjAGsAAAAAAAAAA9UAAACGAP////sAAAAcAGIAbwBvAGsAbQBhAHIAawBzAC0AZABvAGMAawAAAAAAAAAD1QAAAPcA////+wAAABwAaQBuAHMAcABlAGMAdABvAHIALQBkAG8AYwBrAAAAAAD/////AAAAFAD////7AAAAHgBoAGkAZwBoAGwAaQBnAGgAdABzAC0AZABvAGMAawAAAAAA/////wAAANoA////AAAF4AAAA9UAAAAEAAAABAAAAAgAAAAI/AAAAAEAAAAAAAAAAQAAAB4AYQBjAHQAaQBvAG4AcwBfAHQAbwBvAGwAYgBhAHICAAAAAP////8AAAAAAAAAAA==" + }, + "old_prefs_migrated": true, + "session_data": { + "base_font_size": 28, + "columns_per_screen": { + "landscape": 1, + "portrait": 1 + }, + "controls_help_shown_count": 2, + "current_color_scheme": "black", + "keyboard_shortcuts": { + "quit": [ + { + "altKey": false, + "ctrlKey": false, + "key": "q", + "metaKey": false, + "shiftKey": false + } + ] + }, + "margin_bottom": 100, + "margin_left": 100, + "margin_right": 100, + "margin_top": 100, + "read_mode": "flow", + "standalone_font_settings": { + "minimum_font_size": 12, + "mono_family": "Berkeley Mono", + "sans_family": "Verdana", + "serif_family": "Merriweather" + }, + "standalone_misc_settings": { + "remember_last_read": true, + "remember_window_geometry": false, + "save_annotations_in_ebook": true, + "singleinstance": false + }, + "standalone_recently_opened": [ + { + "authors": [ + "Richard Polt" + ], + "key": "/home/cjennings/sync/books/Richard Polt/Heidegger_ An Introduction (44728)/Heidegger_ An Introduction - Richard Polt.azw3", + "pathtoebook": "/home/cjennings/sync/books/Richard Polt/Heidegger_ An Introduction (44728)/Heidegger_ An Introduction - Richard Polt.azw3", + "timestamp": "2025-09-10T01:03:46.282Z", + "title": "Heidegger: An Introduction" + }, + { + "authors": [ + "David Harvey" + ], + "key": "/home/cjennings/sync/books/David Harvey/A Companion to Marx's Capital_ Volume 1 (44747)/A Companion to Marx's Capital_ Volume 1 - David Harvey.mobi", + "pathtoebook": "/home/cjennings/sync/books/David Harvey/A Companion to Marx's Capital_ Volume 1 (44747)/A Companion to Marx's Capital_ Volume 1 - David Harvey.mobi", + "timestamp": "2025-09-10T01:01:01.569Z", + "title": "A Companion to Marx's Capital: Volume 1" + }, + { + "authors": [ + "Quentin Skinner" + ], + "key": "/home/cjennings/sync/books/Quentin Skinner/Liberty before Liberalism (44222)/Liberty before Liberalism - Quentin Skinner.mobi", + "pathtoebook": "/home/cjennings/sync/books/Quentin Skinner/Liberty before Liberalism (44222)/Liberty before Liberalism - Quentin Skinner.mobi", + "timestamp": "2025-08-03T23:22:50.318Z", + "title": "Liberty before Liberalism" + }, + { + "authors": [ + "Saint Thomas Aquinas" + ], + "key": "/home/cjennings/sync/books/Thomas Aquinas/Commentary on Aristotle's Metaphysics (43871)/Commentary on Aristotle's Metaphysics - Thomas Aquinas.epub", + "pathtoebook": "/home/cjennings/sync/books/Thomas Aquinas/Commentary on Aristotle's Metaphysics (43871)/Commentary on Aristotle's Metaphysics - Thomas Aquinas.epub", + "timestamp": "2025-07-30T21:29:13.047Z", + "title": "Commentary on Aristotle's Metaphysics" + }, + { + "authors": [ + "Saint Thomas Aquinas" + ], + "key": "/home/cjennings/sync/books/Saint Thomas Aquinas/Commentary on Aristotle's Metaphysics (43871)/Commentary on Aristotle's Metaphysics - Saint Thomas Aquinas.epub", + "pathtoebook": "/home/cjennings/sync/books/Saint Thomas Aquinas/Commentary on Aristotle's Metaphysics (43871)/Commentary on Aristotle's Metaphysics - Saint Thomas Aquinas.epub", + "timestamp": "2025-07-30T08:21:23.202Z", + "title": "Commentary on Aristotle's Metaphysics" + }, + { + "authors": [ + "Desconocido" + ], + "key": "/home/cjennings/sync/books/Jill Vance Buroker/Kant's 'Critique of Pure Reason'_ An Introduction (43864)/Kant's 'Critique of Pure Reason'_ An Intro - Jill Vance Buroker.mobi", + "pathtoebook": "/home/cjennings/sync/books/Jill Vance Buroker/Kant's 'Critique of Pure Reason'_ An Introduction (43864)/Kant's 'Critique of Pure Reason'_ An Intro - Jill Vance Buroker.mobi", + "timestamp": "2025-07-18T04:13:33.770Z", + "title": "Kants Critique of Pure Reason An Introduction Cambridge Introductions to Key Philosophical Texts Cambridge" + }, + { + "authors": [ + "Leszek Kolakowski" + ], + "key": "/home/cjennings/sync/books/Leszek Kolakowski/Is God Happy__ Selected Essays (43040)/Is God Happy__ Selected Essays - Leszek Kolakowski.azw3", + "pathtoebook": "/home/cjennings/sync/books/Leszek Kolakowski/Is God Happy__ Selected Essays (43040)/Is God Happy__ Selected Essays - Leszek Kolakowski.azw3", + "timestamp": "2025-07-13T16:19:13.806Z", + "title": "Is God Happy?: Selected Essays (Penguin Modern Classics)" + }, + { + "authors": [ + "Desconocido" + ], + "key": "/home/cjennings/sync/books/Desconocido/Routledge Aristotle And The Metaphysics (43652)/Routledge Aristotle And The Metaphysics - Desconocido.azw3", + "pathtoebook": "/home/cjennings/sync/books/Desconocido/Routledge Aristotle And The Metaphysics (43652)/Routledge Aristotle And The Metaphysics - Desconocido.azw3", + "timestamp": "2025-07-06T21:55:18.416Z", + "title": "Routledge Aristotle And The Metaphysics" + }, + { + "authors": [ + "Habermas, Jürgen" + ], + "key": "/home/cjennings/sync/books/Habermas, Jurgen/The Philosophical Discourse of Modernity (40589)/The Philosophical Discourse of Modernity - Habermas, Jurgen.epub", + "pathtoebook": "/home/cjennings/sync/books/Habermas, Jurgen/The Philosophical Discourse of Modernity (40589)/The Philosophical Discourse of Modernity - Habermas, Jurgen.epub", + "timestamp": "2024-12-13T02:38:28.792Z", + "title": "The Philosophical Discourse of Modernity" + }, + { + "authors": [ + "Tamsyn Muir" + ], + "key": "/home/cjennings/sync/books/Tamsyn Muir/Gideon the Ninth (40289)/Gideon the Ninth - Tamsyn Muir.epub", + "pathtoebook": "/home/cjennings/sync/books/Tamsyn Muir/Gideon the Ninth (40289)/Gideon the Ninth - Tamsyn Muir.epub", + "timestamp": "2024-11-15T19:06:33.047Z", + "title": "Gideon the Ninth" + }, + { + "key": "/home/cjennings/.local/opt/tor-browser/app/Browser/downloads/Love and Rockets #1 (1981) [Pyramid].cbz", + "pathtoebook": "/home/cjennings/.local/opt/tor-browser/app/Browser/downloads/Love and Rockets #1 (1981) [Pyramid].cbz", + "timestamp": "2022-08-23T16:40:22.898Z", + "title": "Love and Rockets #1 (1981) [Pyramid]" + }, + { + "key": "/home/cjennings/.local/opt/tor-browser/app/Browser/downloads/Love & Rockets v1 #05 (March 1984) [Cclay].cbr", + "pathtoebook": "/home/cjennings/.local/opt/tor-browser/app/Browser/downloads/Love & Rockets v1 #05 (March 1984) [Cclay].cbr", + "timestamp": "2022-08-23T16:40:04.599Z", + "title": "Love & Rockets v1 #05 (March 1984) [Cclay]" + }, + { + "key": "/tmp/mozilla_cjennings0/Love & Rockets v1 #05 (March 1984) [Cclay].cbr", + "pathtoebook": "/tmp/mozilla_cjennings0/Love & Rockets v1 #05 (March 1984) [Cclay].cbr", + "timestamp": "2022-08-23T16:31:27.722Z", + "title": "Love & Rockets v1 #05 (March 1984) [Cclay]" + }, + { + "authors": [ + "George Grätzer" + ], + "key": "/home/cjennings/Library/George Gratzer/More Math Into LaTeX (27737)/More Math Into LaTeX - George Gratzer.mobi", + "pathtoebook": "/home/cjennings/Library/George Gratzer/More Math Into LaTeX (27737)/More Math Into LaTeX - George Gratzer.mobi", + "timestamp": "2022-01-14T10:36:05.803Z", + "title": "More Math Into LaTeX" + }, + { + "authors": [ + "Simenon Georges" + ], + "key": "/home/cjennings/Library/Simenon Georges/050 Maigret's Little Joke (27730)/050 Maigret's Little Joke - Simenon Georges.mobi", + "pathtoebook": "/home/cjennings/Library/Simenon Georges/050 Maigret's Little Joke (27730)/050 Maigret's Little Joke - Simenon Georges.mobi", + "timestamp": "2022-01-10T12:32:52.530Z", + "title": "050 Maigret's Little Joke" + }, + { + "authors": [ + "Will Durant" + ], + "key": "/home/cjennings/Library/Will Durant/Story of Philosophy (3224)/Story of Philosophy - Will Durant.azw3", + "pathtoebook": "/home/cjennings/Library/Will Durant/Story of Philosophy (3224)/Story of Philosophy - Will Durant.azw3", + "timestamp": "2022-01-05T19:33:13.710Z", + "title": "Story of Philosophy" + }, + { + "authors": [ + "P G Wodehouse" + ], + "key": "/home/cjennings/Library/P. G. Wodehouse/Laughing Gas (24469)/Laughing Gas - P. G. Wodehouse.mobi", + "pathtoebook": "/home/cjennings/Library/P. G. Wodehouse/Laughing Gas (24469)/Laughing Gas - P. G. Wodehouse.mobi", + "timestamp": "2022-01-03T00:51:21.126Z", + "title": "Laughing Gas" + }, + { + "authors": [ + "Peter Seibel" + ], + "key": "/home/cjennings/Library/Peter Seibel/Coders at Work_ Reflections on the Craft of Programming (316)/Coders at Work_ Reflections on the Craft o - Peter Seibel.htmlz", + "pathtoebook": "/home/cjennings/Library/Peter Seibel/Coders at Work_ Reflections on the Craft of Programming (316)/Coders at Work_ Reflections on the Craft o - Peter Seibel.htmlz", + "timestamp": "2022-01-03T00:38:17.903Z", + "title": "Coders at Work" + }, + { + "authors": [ + "by Mike Gancarz" + ], + "key": "/home/cjennings/Downloads/torrents/files/Linux and the Unix Philosophy by Mike Gancarz (z-lib.org).epub", + "pathtoebook": "/home/cjennings/Downloads/torrents/files/Linux and the Unix Philosophy by Mike Gancarz (z-lib.org).epub", + "timestamp": "2022-01-02T23:44:59.829Z", + "title": "4362" + }, + { + "authors": [ + "Margaret Dauler Wilson" + ], + "key": "/home/cjennings/Library/Margaret Dauler Wilson/Descartes (86)/Descartes - Margaret Dauler Wilson.mobi", + "pathtoebook": "/home/cjennings/Library/Margaret Dauler Wilson/Descartes (86)/Descartes - Margaret Dauler Wilson.mobi", + "timestamp": "2022-01-02T14:20:51.792Z", + "title": "Descartes (Arguments of the Philosophers)" + }, + { + "authors": [ + "Alexander Tarlinder" + ], + "key": "/home/cjennings/Library/Alexander Tarlinder/Developer Testing_ Building Quality Into Software (26)/Developer Testing_ Building Quality Into S - Alexander Tarlinder.azw3", + "pathtoebook": "/home/cjennings/Library/Alexander Tarlinder/Developer Testing_ Building Quality Into Software (26)/Developer Testing_ Building Quality Into S - Alexander Tarlinder.azw3", + "timestamp": "2022-01-02T03:53:52.454Z", + "title": "Developer Testing: Building Quality into Software (Addison-Wesley Signature Series (Cohn))" + }, + { + "authors": [ + "Dieter Lohmar, Jagna Brudzinska" + ], + "key": "/home/cjennings/Library/Dieter Lohmar/Founding Psychoanalysis Phenomenologically_ Phenomenological Theory of Subjectivity and the Ps (17064)/Founding Psychoanalysis Phenomenologically - Dieter Lohmar.pdf", + "pathtoebook": "/home/cjennings/Library/Dieter Lohmar/Founding Psychoanalysis Phenomenologically_ Phenomenological Theory of Subjectivity and the Ps (17064)/Founding Psychoanalysis Phenomenologically - Dieter Lohmar.pdf", + "timestamp": "2022-01-01T22:55:44.420Z", + "title": "Founding Psychoanalysis Phenomenologically: Phenomenological Theory of Subjectivity and the Psychoanalytic Experience (Phaenomenologica, 199)" + }, + { + "authors": [ + "Kevin Passmore" + ], + "key": "/home/cjennings/Library/Kevin Passmore/Fascism_ A Very Short Introduction (5508)/Fascism_ A Very Short Introduction - Kevin Passmore.mobi", + "pathtoebook": "/home/cjennings/Library/Kevin Passmore/Fascism_ A Very Short Introduction (5508)/Fascism_ A Very Short Introduction - Kevin Passmore.mobi", + "timestamp": "2021-11-01T00:49:09.044Z", + "title": "Fascism: A Very Short Introduction (Very Short Introductions)" + }, + { + "authors": [ + "Lewis Carroll" + ], + "key": "/home/cjennings/Library/Lewis Carroll/Alice's Adventures in Wonderland_ &, Through the Looking-Glass (784)/Alice's Adventures in Wonderland_ &, Throu - Lewis Carroll.mobi", + "pathtoebook": "/home/cjennings/Library/Lewis Carroll/Alice's Adventures in Wonderland_ &, Through the Looking-Glass (784)/Alice's Adventures in Wonderland_ &, Throu - Lewis Carroll.mobi", + "timestamp": "2021-11-01T00:48:02.197Z", + "title": "Alice's Adventures in Wonderland and Through the Looking-Glass" + }, + { + "authors": [ + "Timothy Snyder" + ], + "key": "/home/cjennings/Library/Timothy Snyder/On Tyranny_ Twenty Lessons From the Twentieth Century (635)/On Tyranny_ Twenty Lessons From the Twenti - Timothy Snyder.azw3", + "pathtoebook": "/home/cjennings/Library/Timothy Snyder/On Tyranny_ Twenty Lessons From the Twentieth Century (635)/On Tyranny_ Twenty Lessons From the Twenti - Timothy Snyder.azw3", + "timestamp": "2021-10-31T22:46:48.986Z", + "title": "On Tyranny: Twenty Lessons from the Twentieth Century" + } + ] + } +}
\ No newline at end of file diff --git a/dotfiles/common/.config/calibre/viewer.json b/dotfiles/common/.config/calibre/viewer.json new file mode 100644 index 0000000..ecc631e --- /dev/null +++ b/dotfiles/common/.config/calibre/viewer.json @@ -0,0 +1,13 @@ +{ + "print-to-pdf-bottom-margin": 1.0, + "print-to-pdf-geometry": { + "__class__": "bytearray", + "__value__": "AdnQywADAAAAAAEjAAAA7AAAAyQAAAIpAAABJQAAAO4AAAMiAAACJwAAAAAAAAAABVYAAAElAAAA7gAAAyIAAAIn" + }, + "print-to-pdf-left-margin": 1.0, + "print-to-pdf-page-numbers": false, + "print-to-pdf-page-size": "letter", + "print-to-pdf-right-margin": 1.0, + "print-to-pdf-show-file": true, + "print-to-pdf-top-margin": 1.0 +}
\ No newline at end of file diff --git a/dotfiles/common/.config/calibre/viewer/annots/19f02e8b622152fd5d7c642d30ecac05080ddf3e9e288a22c4f49866ba57c8b2.json b/dotfiles/common/.config/calibre/viewer/annots/19f02e8b622152fd5d7c642d30ecac05080ddf3e9e288a22c4f49866ba57c8b2.json new file mode 100644 index 0000000..6ecdf09 --- /dev/null +++ b/dotfiles/common/.config/calibre/viewer/annots/19f02e8b622152fd5d7c642d30ecac05080ddf3e9e288a22c4f49866ba57c8b2.json @@ -0,0 +1 @@ +[{"pos": "epubcfi(/10/2/4/2[sbo-rt-content]/2/2[idm45611906833112]/16/1:266)", "pos_type": "epubcfi", "timestamp": "2022-07-09T18:01:11.603570+00:00", "type": "last-read"}]
\ No newline at end of file diff --git a/dotfiles/common/.config/calibre/viewer/annots/33083ace2855943c7e4d7d188c47051f047f05e84d828fca5e5545396b94f14c.json b/dotfiles/common/.config/calibre/viewer/annots/33083ace2855943c7e4d7d188c47051f047f05e84d828fca5e5545396b94f14c.json new file mode 100644 index 0000000..0317109 --- /dev/null +++ b/dotfiles/common/.config/calibre/viewer/annots/33083ace2855943c7e4d7d188c47051f047f05e84d828fca5e5545396b94f14c.json @@ -0,0 +1 @@ +[{"pos": "epubcfi(/2/2/4/2@50:49.93)", "pos_type": "epubcfi", "timestamp": "2025-07-18T04:14:04.406842+00:00", "type": "last-read"}]
\ No newline at end of file diff --git a/dotfiles/common/.config/calibre/viewer/annots/5856c3e5aa41dd1b47711fa2b70e5ba9a2f61369f97c7fcc415321753e7c8bea.json b/dotfiles/common/.config/calibre/viewer/annots/5856c3e5aa41dd1b47711fa2b70e5ba9a2f61369f97c7fcc415321753e7c8bea.json new file mode 100644 index 0000000..a44655c --- /dev/null +++ b/dotfiles/common/.config/calibre/viewer/annots/5856c3e5aa41dd1b47711fa2b70e5ba9a2f61369f97c7fcc415321753e7c8bea.json @@ -0,0 +1 @@ +[{"pos": "epubcfi(/2/2/4/2[page_1]@50:50)", "pos_type": "epubcfi", "timestamp": "2022-08-23T16:40:12.749665+00:00", "type": "last-read"}]
\ No newline at end of file diff --git a/dotfiles/common/.config/calibre/viewer/annots/5d4b018509f9383872d23f1c4a0652d20e908edc16409bc7697635a28f96478e.json b/dotfiles/common/.config/calibre/viewer/annots/5d4b018509f9383872d23f1c4a0652d20e908edc16409bc7697635a28f96478e.json new file mode 100644 index 0000000..1dfa74a --- /dev/null +++ b/dotfiles/common/.config/calibre/viewer/annots/5d4b018509f9383872d23f1c4a0652d20e908edc16409bc7697635a28f96478e.json @@ -0,0 +1 @@ +[{"pos": "epubcfi(/2/2/4/12[page_6]@50:50)", "pos_type": "epubcfi", "timestamp": "2022-08-23T16:41:02.476450+00:00", "type": "last-read"}]
\ No newline at end of file diff --git a/dotfiles/common/.config/calibre/viewer/annots/6fd06a181469267e9c09d240ef2d3cca061e54ce37143a9e142524f61028cdd9.json b/dotfiles/common/.config/calibre/viewer/annots/6fd06a181469267e9c09d240ef2d3cca061e54ce37143a9e142524f61028cdd9.json new file mode 100644 index 0000000..2579467 --- /dev/null +++ b/dotfiles/common/.config/calibre/viewer/annots/6fd06a181469267e9c09d240ef2d3cca061e54ce37143a9e142524f61028cdd9.json @@ -0,0 +1 @@ +[{"pos": "epubcfi(/2/2/4/6[page_3]@50:50)", "pos_type": "epubcfi", "timestamp": "2022-08-23T16:31:51.861250+00:00", "type": "last-read"}]
\ No newline at end of file diff --git a/dotfiles/common/.config/calibre/viewer/annots/90922c33b4cfd6cdf2f2f462bc5f6e6b0f18bdb829384144fdd13cc3b487deb1.json b/dotfiles/common/.config/calibre/viewer/annots/90922c33b4cfd6cdf2f2f462bc5f6e6b0f18bdb829384144fdd13cc3b487deb1.json new file mode 100644 index 0000000..0637a08 --- /dev/null +++ b/dotfiles/common/.config/calibre/viewer/annots/90922c33b4cfd6cdf2f2f462bc5f6e6b0f18bdb829384144fdd13cc3b487deb1.json @@ -0,0 +1 @@ +[]
\ No newline at end of file diff --git a/dotfiles/common/.config/calibre/viewer/annots/ab0b0aa00cc90f53470da2761ea678a4ccacef1f5002917bda43970cd6096b19.json b/dotfiles/common/.config/calibre/viewer/annots/ab0b0aa00cc90f53470da2761ea678a4ccacef1f5002917bda43970cd6096b19.json new file mode 100644 index 0000000..ac7dcad --- /dev/null +++ b/dotfiles/common/.config/calibre/viewer/annots/ab0b0aa00cc90f53470da2761ea678a4ccacef1f5002917bda43970cd6096b19.json @@ -0,0 +1 @@ +[{"pos": "epubcfi(/2/2/4/2@50:49.93)", "pos_type": "epubcfi", "timestamp": "2025-07-13T16:19:15.135276+00:00", "type": "last-read"}]
\ No newline at end of file diff --git a/dotfiles/common/.config/calibre/viewer/annots/c5a80ad08eb5ae859fefd73672b6a7cddc243254b55897adfdd5671fe7b2aacf.json b/dotfiles/common/.config/calibre/viewer/annots/c5a80ad08eb5ae859fefd73672b6a7cddc243254b55897adfdd5671fe7b2aacf.json new file mode 100644 index 0000000..098752f --- /dev/null +++ b/dotfiles/common/.config/calibre/viewer/annots/c5a80ad08eb5ae859fefd73672b6a7cddc243254b55897adfdd5671fe7b2aacf.json @@ -0,0 +1 @@ +[{"pos": "epubcfi(/4/2/4/128/1:16)", "pos_type": "epubcfi", "timestamp": "2025-07-06T21:55:27.324496+00:00", "type": "last-read"}]
\ No newline at end of file diff --git a/dotfiles/common/.config/conky/conky.conf b/dotfiles/common/.config/conky/conky.conf new file mode 100644 index 0000000..09ee8ea --- /dev/null +++ b/dotfiles/common/.config/conky/conky.conf @@ -0,0 +1,24 @@ +conky.config = { +out_to_console = true, +out_to_x = false, +background = false, +update_interval = 30, +total_run_times = 0, +}; +conky.text = [[ \ +${if_existing /sys/class/power_supply/BAT0}\ +󱊣 \ +${battery_percent BAT0}% \ +${if_existing /sys/class/power_supply/BAT0/status Charging}îª ${endif}\ +${if_existing /sys/class/power_supply/BAT0/status Discharging}îª ${endif}\ +${endif}\ +${if_existing /sys/class/power_supply/BAT1}\ +󱊣 \ +${battery_percent BAT1}% \ +${if_existing /sys/class/power_supply/BAT1/status Charging}îª ${endif}\ +${if_existing /sys/class/power_supply/BAT1/status Discharging}îª ${endif}\ +${endif}\ +ï‚ ${fs_used}/${fs_size} \ +ï³ ${time %a %B %d} \ +ó°¥” ${time %I:%M %p %Z} +]]; diff --git a/dotfiles/common/.config/dunst/dunstrc b/dotfiles/common/.config/dunst/dunstrc new file mode 100644 index 0000000..104df28 --- /dev/null +++ b/dotfiles/common/.config/dunst/dunstrc @@ -0,0 +1,72 @@ +# Dunst config - Dupre theme +# Warm, earthy colors from dupre-theme.el + +[global] +# Display +follow = mouse +width = 350 +height = (0, 300) +origin = top-right +offset = (35, 35) +indicate_hidden = yes +notification_limit = 5 +gap_size = 12 +padding = 12 +horizontal_padding = 20 +frame_width = 2 +sort = no +corner_radius = 10 + +# Progress bar +progress_bar_frame_width = 0 +progress_bar_corner_radius = 3 + +# Colors - Dupre theme +foreground = "#f0fef0" +frame_color = "#d7af5f" +highlight = "#d7af5f, #ccc768" + +# Text +font = BerkeleyMono Nerd Font 11 +markup = full +format = "<small>%a</small>\n<b>%s</b>\n%b" +alignment = left +vertical_alignment = center +show_age_threshold = -1 +hide_duplicate_count = false + +# Icon +icon_position = left +min_icon_size = 54 +max_icon_size = 80 +icon_corner_radius = 4 + +# Misc/Advanced +dmenu = fuzzel --dmenu --prompt 'Open with' + +# Mouse +mouse_left_click = close_current +mouse_middle_click = do_action, close_current +mouse_right_click = close_all + +[urgency_low] +background = "#151311f0" +timeout = 3 + +[urgency_normal] +background = "#151311f0" +timeout = 8 + +[urgency_critical] +background = "#7c2a09f0" +frame_color = "#d47c59" +highlight = "#ff2a00" +foreground = "#f0fef0" +timeout = 0 + +[fullscreen_delay_everything] +fullscreen = delay + +[fullscreen_show_critical] +msg_urgency = critical +fullscreen = show diff --git a/dotfiles/common/.config/environment.d/envvars.conf b/dotfiles/common/.config/environment.d/envvars.conf new file mode 100644 index 0000000..f937aab --- /dev/null +++ b/dotfiles/common/.config/environment.d/envvars.conf @@ -0,0 +1 @@ +PATH=/usr/local/bin:/usr/bin:/bin:$HOME/.local/bin:/usr/sbin:$HOME/.config/rofi/scripts diff --git a/dotfiles/common/.config/feh/keys b/dotfiles/common/.config/feh/keys new file mode 100644 index 0000000..3cdea0b --- /dev/null +++ b/dotfiles/common/.config/feh/keys @@ -0,0 +1,6 @@ +# feh key bindings +# Format: action key1 [key2 [key3]] + +# Zoom: add +/- to existing Up/Down bindings +zoom_in plus equal Up +zoom_out minus Down KP_Subtract diff --git a/dotfiles/common/.config/flameshot/flameshot.ini b/dotfiles/common/.config/flameshot/flameshot.ini new file mode 100644 index 0000000..8874b3b --- /dev/null +++ b/dotfiles/common/.config/flameshot/flameshot.ini @@ -0,0 +1,11 @@ +[General] +contrastOpacity=216 +copyOnDoubleClick=true +copyPathAfterSave=true +saveAfterCopy=true +saveAsFileExtension=jpg +savePath=/home/cjennings/pictures/screenshots +savePathFixed=true +showStartupLaunchMessage=false +uiColor=#2587e2 +useJpgForClipboard=true diff --git a/dotfiles/common/.config/fontconfig/fonts.conf b/dotfiles/common/.config/fontconfig/fonts.conf new file mode 100644 index 0000000..6a27675 --- /dev/null +++ b/dotfiles/common/.config/fontconfig/fonts.conf @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE fontconfig SYSTEM "fonts.dtd"> +<fontconfig> + <match target="font"> + <edit name="antialias" mode="assign"> + <bool>true</bool> + </edit> + <edit name="hinting" mode="assign"> + <bool>true</bool> + </edit> + <edit name="hintstyle" mode="assign"> + <const>hintslight</const> + </edit> + <edit name="rgba" mode="assign"> + <const>none</const> + </edit> + <edit name="autohint" mode="assign"> + <bool>true</bool> + </edit> + <edit name="lcdfilter" mode="assign"> + <const>lcdnone</const> + </edit> + <edit name="dpi" mode="assign"> + <double>144</double> + </edit> + </match> +</fontconfig> diff --git a/dotfiles/common/.config/gtk-3.0/gtk.css b/dotfiles/common/.config/gtk-3.0/gtk.css new file mode 100644 index 0000000..a1d4c13 --- /dev/null +++ b/dotfiles/common/.config/gtk-3.0/gtk.css @@ -0,0 +1,6 @@ +.window-frame, .window-frame:backdrop { + box-shadow: 0 0 0 black; /* removes shadow completely */ + border-style: none; + margin: 1; /* this retains the ability to resize with the mouse, if 1px is too narrow, set some higher values */ + border-radius: 0; +} diff --git a/dotfiles/common/.config/gtk-3.0/settings.ini b/dotfiles/common/.config/gtk-3.0/settings.ini new file mode 100644 index 0000000..2023ae6 --- /dev/null +++ b/dotfiles/common/.config/gtk-3.0/settings.ini @@ -0,0 +1,18 @@ +[Settings] +gtk-print-backends=file,cups,pdf +gtk-theme-name=Adwaita-dark +gtk-icon-theme-name=Papirus-Dark +gtk-font-name=Cantarell 11 +gtk-cursor-theme-name=Vimix-white-cursors +gtk-cursor-theme-size=0 +gtk-toolbar-style=GTK_TOOLBAR_BOTH +gtk-toolbar-icon-size=GTK_ICON_SIZE_LARGE_TOOLBAR +gtk-button-images=1 +gtk-menu-images=1 +gtk-enable-event-sounds=1 +gtk-enable-input-feedback-sounds=1 +gtk-xft-antialias=1 +gtk-xft-hinting=1 +gtk-xft-hintstyle=hintfull +gtk-xft-rgba=rgb +gtk-application-prefer-dark-theme=1
\ No newline at end of file diff --git a/dotfiles/common/.config/htop/htoprc b/dotfiles/common/.config/htop/htoprc new file mode 100644 index 0000000..06b580d --- /dev/null +++ b/dotfiles/common/.config/htop/htoprc @@ -0,0 +1,63 @@ +# Beware! This file is rewritten by htop when settings are changed in the interface. +# The parser is also very primitive, and not human-friendly. +htop_version=3.2.2 +config_reader_min_version=3 +fields=0 48 17 18 38 39 40 2 46 47 49 1 +hide_kernel_threads=1 +hide_userland_threads=0 +hide_running_in_container=0 +shadow_other_users=0 +show_thread_names=0 +show_program_path=1 +highlight_base_name=0 +highlight_deleted_exe=1 +shadow_distribution_path_prefix=0 +highlight_megabytes=1 +highlight_threads=1 +highlight_changes=0 +highlight_changes_delay_secs=5 +find_comm_in_cmdline=1 +strip_exe_from_cmdline=1 +show_merged_command=0 +header_margin=1 +screen_tabs=1 +detailed_cpu_time=0 +cpu_count_from_one=0 +show_cpu_usage=1 +show_cpu_frequency=0 +show_cpu_temperature=0 +degree_fahrenheit=0 +update_process_names=0 +account_guest_in_cpu_meter=0 +color_scheme=0 +enable_mouse=1 +delay=15 +hide_function_bar=0 +header_layout=two_50_50 +column_meters_0=AllCPUs Memory Swap +column_meter_modes_0=1 1 1 +column_meters_1=Tasks LoadAverage Uptime +column_meter_modes_1=2 2 2 +tree_view=0 +sort_key=46 +tree_sort_key=0 +sort_direction=-1 +tree_sort_direction=1 +tree_view_always_by_pid=0 +all_branches_collapsed=0 +screen:Main=PID USER PRIORITY NICE M_VIRT M_RESIDENT M_SHARE STATE PERCENT_CPU PERCENT_MEM TIME Command +.sort_key=PERCENT_CPU +.tree_sort_key=PID +.tree_view=0 +.tree_view_always_by_pid=0 +.sort_direction=-1 +.tree_sort_direction=1 +.all_branches_collapsed=0 +screen:I/O=PID USER IO_PRIORITY IO_RATE IO_READ_RATE IO_WRITE_RATE PERCENT_SWAP_DELAY PERCENT_IO_DELAY Command +.sort_key=IO_RATE +.tree_sort_key=PID +.tree_view=0 +.tree_view_always_by_pid=0 +.sort_direction=-1 +.tree_sort_direction=1 +.all_branches_collapsed=0 diff --git a/dotfiles/common/.config/mc/panels.ini b/dotfiles/common/.config/mc/panels.ini new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/dotfiles/common/.config/mc/panels.ini diff --git a/dotfiles/common/.config/mpd/mpd.conf b/dotfiles/common/.config/mpd/mpd.conf new file mode 100644 index 0000000..d084cb2 --- /dev/null +++ b/dotfiles/common/.config/mpd/mpd.conf @@ -0,0 +1,437 @@ +# An example configuration file for MPD. +# Read the user manual for documentation: http://www.musicpd.org/doc/user/ +# or /usr/share/doc/mpd/user-manual.html + + +# Files and directories ####################################################### +# +# This setting controls the top directory which MPD will search to discover the +# available audio files and add them to the daemon's online database. This +# setting defaults to the XDG directory, otherwise the music directory will be +# be disabled and audio files will only be accepted over ipc socket (using +# file:// protocol) or streaming files over an accepted protocol. +# +music_directory "/home/cjennings/music" +# +# This setting sets the MPD internal playlist directory. The purpose of this +# directory is storage for playlists created by MPD. The server will use +# playlist files not created by the server but only if they are in the MPD +# format. This setting defaults to playlist saving being disabled. +# +playlist_directory "/home/cjennings/music" +# +# This setting sets the location of the MPD database. This file is used to +# load the database at server start up and store the database while the +# server is not up. This setting defaults to disabled which will allow +# MPD to accept files over ipc socket (using file:// protocol) or streaming +# files over an accepted protocol. +# +db_file "/home/cjennings/.config/mpd/database" +# +# These settings are the locations for the daemon log files for the daemon. +# These logs are great for troubleshooting, depending on your log_level +# settings. +# +# The special value "syslog" makes MPD use the local syslog daemon. This +# setting defaults to logging to syslog, otherwise logging is disabled. +# +log_file "/home/cjennings/.config/mpd/log" +# +# This setting sets the location of the file which stores the process ID +# for use of mpd --kill and some init scripts. This setting is disabled by +# default and the pid file will not be stored. +# +pid_file "/home/cjennings/.config/mpd/pid" +# +# This setting sets the location of the file which contains information about +# most variables to get MPD back into the same general shape it was in before +# it was brought down. This setting is disabled by default and the server +# state will be reset on server start up. +# +state_file "/home/cjennings/.config/mpd/state" +# +# The location of the sticker database. This is a database which +# manages dynamic information attached to songs. +# +sticker_file "/home/cjennings/.config/mpd/sticker.sql" +# +############################################################################### + + +# General music daemon options ################################################ +# +# This setting specifies the user that MPD will run as. MPD should never run as +# root and you may use this setting to make MPD change its user ID after +# initialization. This setting is disabled by default and MPD is run as the +# current user. +# +user "cjennings" +# +# This setting specifies the group that MPD will run as. If not specified +# primary group of user specified with "user" setting will be used (if set). +# This is useful if MPD needs to be a member of group such as "audio" to +# have permission to use sound card. +# +#group "nogroup" +# +# This setting sets the address for the daemon to listen on. Careful attention +# should be paid if this is assigned to anything other then the default, any. +# This setting can deny access to control of the daemon. Choose any if you want +# to have mpd listen on every address. Not effective if systemd socket +# activation is in use. +# +# For network +# bind_to_address "0.0.0.0" +# +# And for Unix Socket +# bind_to_address "/home/cjennings/.config/mpd/socket" +bind_to_address "127.0.0.1" +# +# This setting is the TCP port that is desired for the daemon to get assigned +# to. +# +port "6600" +# +# This setting controls the type of information which is logged. Available +# setting arguments are "default", "secure" or "verbose". The "verbose" setting +# argument is recommended for troubleshooting, though can quickly stretch +# available resources on limited hardware storage. +# +log_level "default" +# +# If you have a problem with your MP3s ending abruptly it is recommended that +# you set this argument to "no" to attempt to fix the problem. If this solves +# the problem, it is highly recommended to fix the MP3 files with vbrfix +# (available as vbrfix in the debian archive), at which +# point gapless MP3 playback can be enabled. +# +#gapless_mp3_playback "yes" +# +# Setting "restore_paused" to "yes" puts MPD into pause mode instead +# of starting playback after startup. +# +restore_paused "yes" +# +# This setting enables MPD to create playlists in a format usable by other +# music players. +# +save_absolute_paths_in_playlists "yes" +# +# This setting defines a list of tag types that will be extracted during the +# audio file discovery process. The complete list of possible values can be +# found in the mpd.conf man page. +#metadata_to_use "artist,album,title,track,name,genre,date,composer,performer,disc" +# +# This setting enables automatic update of MPD's database when files in +# music_directory are changed. +# +auto_update "yes" +# +# Limit the depth of the directories being watched, 0 means only watch +# the music directory itself. There is no limit by default. +# +#auto_update_depth "3" +# +# Buffer settings for smooth streaming +audio_buffer_size "16384" # 16 MB buffer (default 4096 KB) +# +############################################################################### + + +# Symbolic link behavior ###################################################### +# +# If this setting is set to "yes", MPD will discover audio files by following +# symbolic links outside of the configured music_directory. +# +#follow_outside_symlinks "yes" +# +# If this setting is set to "yes", MPD will discover audio files by following +# symbolic links inside of the configured music_directory. +# +#follow_inside_symlinks "yes" +# +############################################################################### + + +# Zeroconf / Avahi Service Discovery ########################################## +# +# If this setting is set to "yes", service information will be published with +# Zeroconf / Avahi. +# +# zeroconf_enabled "yes" +# +# The argument to this setting will be the Zeroconf / Avahi unique name for +# this MPD server on the network. +# +# zeroconf_name "Music Player Daemon" +# +############################################################################### + + +# Permissions ################################################################# +# +# If this setting is set, MPD will require password authorization. The password +# can setting can be specified multiple times for different password profiles. +# +#password "password@read,add,control,admin" +# +# This setting specifies the permissions a user has who has not yet logged in. +# +#default_permissions "read,add,control,admin" +# +############################################################################### + + +# Database ####################################################################### +# + +#database { +# plugin "proxy" +# host "other.mpd.host" +# port "6600" +#} + +# Input ####################################################################### +# + +input { + plugin "curl" + timeout "30000" # 30 second timeout for connections +# proxy "proxy.isp.com:8080" +# proxy_user "user" +# proxy_password "password" +} + +# +############################################################################### + +# Audio Output ################################################################ +# +# MPD supports various audio output types, as well as playing through multiple +# audio outputs at the same time, through multiple audio_output settings +# blocks. Setting this block is optional, though the server will only attempt +# autodetection for one sound card. +# +# An example of an ALSA output: +# +#audio_output { +# type "alsa" +# name "My ALSA Device" +# device "hw:0,0" # optional +# mixer_type "hardware" # optional +# mixer_device "default" # optional +# mixer_control "PCM" # optional +# mixer_index "0" # optional +#} +# +# An example of an OSS output: +# +#audio_output { +# type "oss" +# name "My OSS Device" +# device "/dev/dsp" # optional +# mixer_type "hardware" # optional +# mixer_device "/dev/mixer" # optional +# mixer_control "PCM" # optional +#} +# +# An example of a shout output (for streaming to Icecast): +# +#audio_output { +# type "shout" +# encoding "ogg" # optional +# name "My Shout Stream" +# host "localhost" +# port "8000" +# mount "/mpd.ogg" +# password "hackme" +# quality "5.0" +# bitrate "128" +# format "44100:16:1" +# protocol "icecast2" # optional +# user "source" # optional +# description "My Stream Description" # optional +# url "http://example.com" # optional +# genre "jazz" # optional +# public "no" # optional +# timeout "2" # optional +# mixer_type "software" # optional +#} +# +# An example of a recorder output: +# +#audio_output { +# type "recorder" +# name "My recorder" +# encoder "vorbis" # optional, vorbis or lame +# path "/var/lib/mpd/recorder/mpd.ogg" +## quality "5.0" # do not define if bitrate is defined +# bitrate "128" # do not define if quality is defined +# format "44100:16:1" +#} +# +# An example of a httpd output (built-in HTTP streaming server): +# +#audio_output { +# type "httpd" +# name "My HTTP Stream" +# encoder "vorbis" # optional, vorbis or lame +# port "8000" +# bind_to_address "0.0.0.0" # optional, IPv4 or IPv6 +# quality "5.0" # do not define if bitrate is defined +# bitrate "128" # do not define if quality is defined +# format "44100:16:1" +# max_clients "0" # optional 0=no limit +#} +# +## cjennings 2021-06-26 + +audio_output { + type "pulse" + name "pulse audio" +} + +audio_output { + type "fifo" + name "my_fifo" + path "/tmp/mpd.fifo" + format "44100:16:2" +} +# An example of a pulseaudio output (streaming to a remote pulseaudio server) +# Please see README.Debian if you want mpd to play through the pulseaudio +# daemon started as part of your graphical desktop session! +# +#audio_output { +# type "pulse" +# name "My Pulse Output" +# server "remote_server" # optional +# sink "remote_server_sink" # optional +#} +# +# An example of a winmm output (Windows multimedia API). +# +#audio_output { +# type "winmm" +# name "My WinMM output" +# device "Digital Audio (S/PDIF) (High Definition Audio Device)" # optional +# or +# device "0" # optional +# mixer_type "hardware" # optional +#} +# +# An example of an openal output. +# +#audio_output { +# type "openal" +# name "My OpenAL output" +# device "Digital Audio (S/PDIF) (High Definition Audio Device)" # optional +#} +# +## Example "pipe" output: +# +#audio_output { +# type "pipe" +# name "my pipe" +# command "aplay -f cd 2>/dev/null" +## Or if you're want to use AudioCompress +# command "AudioCompress -m | aplay -f cd 2>/dev/null" +## Or to send raw PCM stream through PCM: +# command "nc example.org 8765" +# format "44100:16:2" +#} +# +## An example of a null output (for no audio output): +# +#audio_output { +# type "null" +# name "My Null Output" +# mixer_type "none" # optional +#} +# +# If MPD has been compiled with libsamplerate support, this setting specifies +# the sample rate converter to use. Possible values can be found in the +# mpd.conf man page or the libsamplerate documentation. By default, this is +# setting is disabled. +# +#samplerate_converter "Fastest Sinc Interpolator" +# +############################################################################### + + +# Normalization automatic volume adjustments ################################## +# +# This setting specifies the type of ReplayGain to use. This setting can have +# the argument "off", "album", "track" or "auto". "auto" is a special mode that +# chooses between "track" and "album" depending on the current state of +# random playback. If random playback is enabled then "track" mode is used. +# See <http://www.replaygain.org> for more details about ReplayGain. +# This setting is off by default. +# +replaygain "track" +# +# This setting sets the pre-amp used for files that have ReplayGain tags. By +# default this setting is disabled. +# +#replaygain_preamp "0" +# +# This setting sets the pre-amp used for files that do NOT have ReplayGain tags. +# By default this setting is disabled. +# +#replaygain_missing_preamp "0" +# +# This setting enables or disables ReplayGain limiting. +# MPD calculates actual amplification based on the ReplayGain tags +# and replaygain_preamp / replaygain_missing_preamp setting. +# If replaygain_limit is enabled MPD will never amplify audio signal +# above its original level. If replaygain_limit is disabled such amplification +# might occur. By default this setting is enabled. +# +#replaygain_limit "yes" +# +# This setting enables on-the-fly normalization volume adjustment. This will +# result in the volume of all playing audio to be adjusted so the output has +# equal "loudness". This setting is disabled by default. +# +volume_normalization "yes" +# +############################################################################### + + +# Character Encoding ########################################################## +# +# If file or directory names do not display correctly for your locale then you +# may need to modify this setting. +# +filesystem_charset "UTF-8" +# +# This setting controls the encoding that ID3v1 tags should be converted from. +# +# id3v1_encoding "UTF-8" (this is now deprecated) +# +############################################################################### + + +# SIDPlay decoder ############################################################# +# +# songlength_database: +# Location of your songlengths file, as distributed with the HVSC. +# The sidplay plugin checks this for matching MD5 fingerprints. +# See http://www.c64.org/HVSC/DOCUMENTS/Songlengths.faq +# +# default_songlength: +# This is the default playing time in seconds for songs not in the +# songlength database, or in case you're not using a database. +# A value of 0 means play indefinitely. +# +# filter: +# Turns the SID filter emulation on or off. +# +#decoder { +# plugin "sidplay" +# songlength_database "/media/C64Music/DOCUMENTS/Songlengths.txt" +# default_songlength "120" +# filter "true" +#} +# +############################################################################### + diff --git a/dotfiles/common/.config/mpd/musicpd.conf b/dotfiles/common/.config/mpd/musicpd.conf new file mode 100644 index 0000000..9f34c44 --- /dev/null +++ b/dotfiles/common/.config/mpd/musicpd.conf @@ -0,0 +1,436 @@ +# An example configuration file for MPD. +# Read the user manual for documentation: http://www.musicpd.org/doc/user/ +# or /usr/share/doc/mpd/user-manual.html + + +# Files and directories ####################################################### +# +# This setting controls the top directory which MPD will search to discover the +# available audio files and add them to the daemon's online database. This +# setting defaults to the XDG directory, otherwise the music directory will be +# be disabled and audio files will only be accepted over ipc socket (using +# file:// protocol) or streaming files over an accepted protocol. +# +music_directory "~cjennings/music" +# +# This setting sets the MPD internal playlist directory. The purpose of this +# directory is storage for playlists created by MPD. The server will use +# playlist files not created by the server but only if they are in the MPD +# format. This setting defaults to playlist saving being disabled. +# +playlist_directory "~cjennings/music" +# +# This setting sets the location of the MPD database. This file is used to +# load the database at server start up and store the database while the +# server is not up. This setting defaults to disabled which will allow +# MPD to accept files over ipc socket (using file:// protocol) or streaming +# files over an accepted protocol. +# +db_file "~cjennings/.config/mpd/database" +# +# These settings are the locations for the daemon log files for the daemon. +# These logs are great for troubleshooting, depending on your log_level +# settings. +# +# The special value "syslog" makes MPD use the local syslog daemon. This +# setting defaults to logging to syslog, otherwise logging is disabled. +# +log_file "~cjennings/.config/mpd/mpd.log" +# +# This setting sets the location of the file which stores the process ID +# for use of mpd --kill and some init scripts. This setting is disabled by +# default and the pid file will not be stored. +# +pid_file "~cjennings/.config/mpd/pid" +# +# This setting sets the location of the file which contains information about +# most variables to get MPD back into the same general shape it was in before +# it was brought down. This setting is disabled by default and the server +# state will be reset on server start up. +# +state_file "~cjennings/.config/mpd/state" +# +# The location of the sticker database. This is a database which +# manages dynamic information attached to songs. +# +sticker_file "~cjennings/.config/mpd/sticker.sql" +# +############################################################################### + + +# General music daemon options ################################################ +# +# This setting specifies the user that MPD will run as. MPD should never run as +# root and you may use this setting to make MPD change its user ID after +# initialization. This setting is disabled by default and MPD is run as the +# current user. +# +user "cjennings" +# +# This setting specifies the group that MPD will run as. If not specified +# primary group of user specified with "user" setting will be used (if set). +# This is useful if MPD needs to be a member of group such as "audio" to +# have permission to use sound card. +# +#group "nogroup" +# +# This setting sets the address for the daemon to listen on. Careful attention +# should be paid if this is assigned to anything other then the default, any. +# This setting can deny access to control of the daemon. Choose any if you want +# to have mpd listen on every address. Not effective if systemd socket +# activation is in use. +# +# For network +bind_to_address "0.0.0.0" +# +# And for Unix Socket +#bind_to_address "/run/mpd/socket" +# +# This setting is the TCP port that is desired for the daemon to get assigned +# to. +# +#port "6600" +# +# This setting controls the type of information which is logged. Available +# setting arguments are "default", "secure" or "verbose". The "verbose" setting +# argument is recommended for troubleshooting, though can quickly stretch +# available resources on limited hardware storage. +# +#log_level "default" +# +# If you have a problem with your MP3s ending abruptly it is recommended that +# you set this argument to "no" to attempt to fix the problem. If this solves +# the problem, it is highly recommended to fix the MP3 files with vbrfix +# (available as vbrfix in the debian archive), at which +# point gapless MP3 playback can be enabled. +# +#gapless_mp3_playback "yes" +# +# Setting "restore_paused" to "yes" puts MPD into pause mode instead +# of starting playback after startup. +# +restore_paused "yes" +# +# This setting enables MPD to create playlists in a format usable by other +# music players. +# +save_absolute_paths_in_playlists "yes" +# +# This setting defines a list of tag types that will be extracted during the +# audio file discovery process. The complete list of possible values can be +# found in the mpd.conf man page. +#metadata_to_use "artist,album,title,track,name,genre,date,composer,performer,disc" +# +# This setting enables automatic update of MPD's database when files in +# music_directory are changed. +# +auto_update "yes" +# +# Limit the depth of the directories being watched, 0 means only watch +# the music directory itself. There is no limit by default. +# +#auto_update_depth "3" +# +############################################################################### + + +# Symbolic link behavior ###################################################### +# +# If this setting is set to "yes", MPD will discover audio files by following +# symbolic links outside of the configured music_directory. +# +#follow_outside_symlinks "yes" +# +# If this setting is set to "yes", MPD will discover audio files by following +# symbolic links inside of the configured music_directory. +# +#follow_inside_symlinks "yes" +# +############################################################################### + + +# Zeroconf / Avahi Service Discovery ########################################## +# +# If this setting is set to "yes", service information will be published with +# Zeroconf / Avahi. +# +# zeroconf_enabled "yes" +# +# The argument to this setting will be the Zeroconf / Avahi unique name for +# this MPD server on the network. +# +# zeroconf_name "Music Player Daemon" +# +############################################################################### + + +# Permissions ################################################################# +# +# If this setting is set, MPD will require password authorization. The password +# can setting can be specified multiple times for different password profiles. +# +#password "password@read,add,control,admin" +# +# This setting specifies the permissions a user has who has not yet logged in. +# +#default_permissions "read,add,control,admin" +# +############################################################################### + + +# Database ####################################################################### +# + +#database { +# plugin "proxy" +# host "other.mpd.host" +# port "6600" +#} + +# Input ####################################################################### +# + +input { + plugin "curl" +# proxy "proxy.isp.com:8080" +# proxy_user "user" +# proxy_password "password" +} + +# +############################################################################### + +# Audio Output ################################################################ +# +# MPD supports various audio output types, as well as playing through multiple +# audio outputs at the same time, through multiple audio_output settings +# blocks. Setting this block is optional, though the server will only attempt +# autodetection for one sound card. +# +# An example of an ALSA output: +# +#audio_output { +# type "alsa" +# name "My ALSA Device" +# device "hw:0,0" # optional +# mixer_type "hardware" # optional +# mixer_device "default" # optional +# mixer_control "PCM" # optional +# mixer_index "0" # optional +#} +# +# An example of an OSS output: +# +#audio_output { +# type "oss" +# name "My OSS Device" +# device "/dev/dsp" # optional +# mixer_type "hardware" # optional +# mixer_device "/dev/mixer" # optional +# mixer_control "PCM" # optional +#} +# +# An example of a shout output (for streaming to Icecast): +# +#audio_output { +# type "shout" +# encoding "ogg" # optional +# name "My Shout Stream" +# host "localhost" +# port "8000" +# mount "/mpd.ogg" +# password "hackme" +# quality "5.0" +# bitrate "128" +# format "44100:16:1" +# protocol "icecast2" # optional +# user "source" # optional +# description "My Stream Description" # optional +# url "http://example.com" # optional +# genre "jazz" # optional +# public "no" # optional +# timeout "2" # optional +# mixer_type "software" # optional +#} +# +# An example of a recorder output: +# +#audio_output { +# type "recorder" +# name "My recorder" +# encoder "vorbis" # optional, vorbis or lame +# path "/var/lib/mpd/recorder/mpd.ogg" +## quality "5.0" # do not define if bitrate is defined +# bitrate "128" # do not define if quality is defined +# format "44100:16:1" +#} +# +# An example of a httpd output (built-in HTTP streaming server): +# +#audio_output { +# type "httpd" +# name "My HTTP Stream" +# encoder "vorbis" # optional, vorbis or lame +# port "8000" +# bind_to_address "0.0.0.0" # optional, IPv4 or IPv6 +# quality "5.0" # do not define if bitrate is defined +# bitrate "128" # do not define if quality is defined +# format "44100:16:1" +# max_clients "0" # optional 0=no limit +#} +# +## cjennings 2021-06-26 + +audio_output { + type "oss" + name "OSS Audio" + device "/dev/dsp" # optional + mixer_type "hardware" # optional + mixer_device "/dev/mixer" # optional + mixer_control "vol" # optional +} + +audio_output { + type "fifo" + name "my_fifo" + path "/tmp/mpd.fifo" + format "44100:16:2" +} +# An example of a pulseaudio output (streaming to a remote pulseaudio server) +# Please see README.Debian if you want mpd to play through the pulseaudio +# daemon started as part of your graphical desktop session! +# +#audio_output { +# type "pulse" +# name "My Pulse Output" +# server "remote_server" # optional +# sink "remote_server_sink" # optional +#} +# +# An example of a winmm output (Windows multimedia API). +# +#audio_output { +# type "winmm" +# name "My WinMM output" +# device "Digital Audio (S/PDIF) (High Definition Audio Device)" # optional +# or +# device "0" # optional +# mixer_type "hardware" # optional +#} +# +# An example of an openal output. +# +#audio_output { +# type "openal" +# name "My OpenAL output" +# device "Digital Audio (S/PDIF) (High Definition Audio Device)" # optional +#} +# +## Example "pipe" output: +# +#audio_output { +# type "pipe" +# name "my pipe" +# command "aplay -f cd 2>/dev/null" +## Or if you're want to use AudioCompress +# command "AudioCompress -m | aplay -f cd 2>/dev/null" +## Or to send raw PCM stream through PCM: +# command "nc example.org 8765" +# format "44100:16:2" +#} +# +## An example of a null output (for no audio output): +# +#audio_output { +# type "null" +# name "My Null Output" +# mixer_type "none" # optional +#} +# +# If MPD has been compiled with libsamplerate support, this setting specifies +# the sample rate converter to use. Possible values can be found in the +# mpd.conf man page or the libsamplerate documentation. By default, this is +# setting is disabled. +# +#samplerate_converter "Fastest Sinc Interpolator" +# +############################################################################### + + +# Normalization automatic volume adjustments ################################## +# +# This setting specifies the type of ReplayGain to use. This setting can have +# the argument "off", "album", "track" or "auto". "auto" is a special mode that +# chooses between "track" and "album" depending on the current state of +# random playback. If random playback is enabled then "track" mode is used. +# See <http://www.replaygain.org> for more details about ReplayGain. +# This setting is off by default. +# +replaygain "album" +# +# This setting sets the pre-amp used for files that have ReplayGain tags. By +# default this setting is disabled. +# +#replaygain_preamp "0" +# +# This setting sets the pre-amp used for files that do NOT have ReplayGain tags. +# By default this setting is disabled. +# +#replaygain_missing_preamp "0" +# +# This setting enables or disables ReplayGain limiting. +# MPD calculates actual amplification based on the ReplayGain tags +# and replaygain_preamp / replaygain_missing_preamp setting. +# If replaygain_limit is enabled MPD will never amplify audio signal +# above its original level. If replaygain_limit is disabled such amplification +# might occur. By default this setting is enabled. +# +#replaygain_limit "yes" +# +# This setting enables on-the-fly normalization volume adjustment. This will +# result in the volume of all playing audio to be adjusted so the output has +# equal "loudness". This setting is disabled by default. +# +volume_normalization "yes" +# +############################################################################### + + +# Character Encoding ########################################################## +# +# If file or directory names do not display correctly for your locale then you +# may need to modify this setting. +# +filesystem_charset "UTF-8" +# +# This setting controls the encoding that ID3v1 tags should be converted from. +# +# id3v1_encoding "UTF-8" +# +############################################################################### + + +# SIDPlay decoder ############################################################# +# +# songlength_database: +# Location of your songlengths file, as distributed with the HVSC. +# The sidplay plugin checks this for matching MD5 fingerprints. +# See http://www.c64.org/HVSC/DOCUMENTS/Songlengths.faq +# +# default_songlength: +# This is the default playing time in seconds for songs not in the +# songlength database, or in case you're not using a database. +# A value of 0 means play indefinitely. +# +# filter: +# Turns the SID filter emulation on or off. +# +#decoder { +# plugin "sidplay" +# songlength_database "/media/C64Music/DOCUMENTS/Songlengths.txt" +# default_songlength "120" +# filter "true" +#} +# +############################################################################### + diff --git a/dotfiles/common/.config/mpv/input.conf b/dotfiles/common/.config/mpv/input.conf new file mode 100644 index 0000000..937534c --- /dev/null +++ b/dotfiles/common/.config/mpv/input.conf @@ -0,0 +1,4 @@ +UP add volume +5 +DOWN add volume -5 +- add volume -5 += add volume 5 diff --git a/dotfiles/common/.config/mpv/mpv.conf b/dotfiles/common/.config/mpv/mpv.conf new file mode 100644 index 0000000..52a4082 --- /dev/null +++ b/dotfiles/common/.config/mpv/mpv.conf @@ -0,0 +1 @@ +volume=75 diff --git a/dotfiles/common/.config/ncmpcpp/bindings b/dotfiles/common/.config/ncmpcpp/bindings new file mode 100644 index 0000000..a7ca6c0 --- /dev/null +++ b/dotfiles/common/.config/ncmpcpp/bindings @@ -0,0 +1,551 @@ +############################################################## +## This is the example bindings file. Copy it to ## +## $XDG_CONFIG_HOME/ncmpcpp/bindings or ~/.ncmpcpp/bindings ## +## and set up your preferences. ## +############################################################## +## +##### General rules ##### +## +## 1) Because each action has runtime checks whether it's +## ok to run it, a few actions can be bound to one key. +## Actions will be bound in order given in configuration +## file. When a key is pressed, first action in order +## will test itself whether it's possible to run it. If +## test succeeds, action is executed and other actions +## bound to this key are ignored. If it doesn't, next +## action in order tests itself etc. +## +## 2) It's possible to bind more that one action at once +## to a key. It can be done using the following syntax: +## +## def_key "key" +## action1 +## action2 +## ... +## +## This creates a chain of actions. When such chain is +## executed, each action in chain is run until the end of +## chain is reached or one of its actions fails to execute +## due to its requirements not being met. If multiple actions +## and/or chains are bound to the same key, they will be +## consecutively run until one of them gets fully executed. +## +## 3) When ncmpcpp starts, bindings configuration file is +## parsed and then ncmpcpp provides "missing pieces" +## of default keybindings. If you want to disable some +## bindings, there is a special action called 'dummy' +## for that purpose. Eg. if you want to disable ability +## to crop playlists, you need to put the following +## into configuration file: +## +## def_key "C" +## dummy +## +## After that ncmpcpp will not bind any default action +## to this key. +## +## 4) To let you write simple macros, the following special +## actions are provided: +## +## - push_character "character" - pushes given special +## character into input queue, so it will be immediately +## picked by ncmpcpp upon next call to readKey function. +## Accepted values: mouse, up, down, page_up, page_down, +## home, end, space, enter, insert, delete, left, right, +## tab, ctrl-a, ctrl-b, ..., ctrl-z, ctrl-[, ctrl-\\, +## ctrl-], ctrl-^, ctrl-_, f1, f2, ..., f12, backspace. +## In addition, most of these names can be prefixed with +## alt-/ctrl-/shift- to be recognized with the appropriate +## modifier key(s). +## +## - push_characters "string" - pushes given string into +## input queue. +## +## - require_runnable "action" - checks whether given action +## is runnable and fails if it isn't. This is especially +## useful when mixed with previous two functions. Consider +## the following macro definition: +## +## def_key "key" +## push_characters "custom_filter" +## apply_filter +## +## If apply_filter can't be currently run, we end up with +## sequence of characters in input queue which will be +## treated just as we typed them. This may lead to unexpected +## results (in this case 'c' will most likely clear current +## playlist, 'u' will trigger database update, 's' will stop +## playback etc.). To prevent such thing from happening, we +## need to change above definition to this one: +## +## def_key "key" +## require_runnable "apply_filter" +## push_characters "custom_filter" +## apply_filter +## +## Here, first we test whether apply_filter can be actually run +## before we stuff characters into input queue, so if condition +## is not met, whole chain is aborted and we're fine. +## +## - require_screen "screen" - checks whether given screen is +## currently active. accepted values: browser, clock, help, +## media_library, outputs, playlist, playlist_editor, +## search_engine, tag_editor, visualizer, last_fm, lyrics, +## selected_items_adder, server_info, song_info, +## sort_playlist_dialog, tiny_tag_editor. +## +## - run_external_command "command" - runs given command using +## system() function. +## +## - run_external_console_command "command" - runs given console +## command using system() function. +## +## +## 5) In addition to binding to a key, you can also bind actions +## or chains of actions to a command. If it comes to commands, +## syntax is very similar to defining keys. Here goes example +## definition of a command: +## +## def_command "quit" [deferred] +## stop +## quit +## +## If you execute the above command (which can be done by +## invoking action execute_command, typing 'quit' and pressing +## enter), ncmpcpp will stop the player and then quit. Note the +## presence of word 'deferred' enclosed in square brackets. It +## tells ncmpcpp to wait for confirmation (ie. pressing enter) +## after you typed quit. Instead of 'deferred', 'immediate' +## could be used. Then ncmpcpp will not wait for confirmation +## (enter) and will execute the command the moment it sees it. +## +## Note: while command chains are executed, internal environment +## update (which includes current window refresh and mpd status +## update) is not performed for performance reasons. However, it +## may be desirable to do so in some situration. Therefore it's +## possible to invoke by hand by performing 'update enviroment' +## action. +## +## Note: There is a difference between: +## +## def_key "key" +## action1 +## +## def_key "key" +## action2 +## +## and +## +## def_key "key" +## action1 +## action2 +## +## First one binds two single actions to the same key whilst +## second one defines a chain of actions. The behavior of +## these two is different and is described in (1) and (2). +## +## Note: Function def_key accepts non-ascii characters. +## +##### List of unbound actions ##### +## +## The following actions are not bound to any key/command: +## +## - set_volume +## - load +## +# +#def_key "mouse" +# mouse_event +# +#def_key "up" +# scroll_up +# +#def_key "shift-up" +# select_item +# scroll_up +# +#def_key "down" +# scroll_down +# +#def_key "shift-down" +# select_item +# scroll_down +# +#def_key "[" +# scroll_up_album +# +#def_key "]" +# scroll_down_album +# +#def_key "{" +# scroll_up_artist +# +#def_key "}" +# scroll_down_artist +# +#def_key "page_up" +# page_up +# +#def_key "page_down" +# page_down +# +#def_key "home" +# move_home +# +#def_key "end" +# move_end +# +#def_key "insert" +# select_item +# +#def_key "enter" +# enter_directory +# +#def_key "enter" +# toggle_output +# +#def_key "enter" +# run_action +# +#def_key "enter" +# play_item +# +#def_key "space" +# add_item_to_playlist +# +#def_key "space" +# toggle_lyrics_update_on_song_change +# +#def_key "space" +# toggle_visualization_type +# +#def_key "delete" +# delete_playlist_items +# +#def_key "delete" +# delete_browser_items +# +#def_key "delete" +# delete_stored_playlist +# +#def_key "right" +# next_column +# +#def_key "right" +# slave_screen +# +#def_key "right" +# volume_up +# +#def_key "+" +# volume_up +# +#def_key "left" +# previous_column +# +#def_key "left" +# master_screen +# +#def_key "left" +# volume_down +# +#def_key "-" +# volume_down +# +#def_key ":" +# execute_command +# +#def_key "tab" +# next_screen +# +#def_key "shift-tab" +# previous_screen +# +#def_key "f1" +# show_help +# +#def_key "1" +# show_playlist +# +#def_key "2" +# show_browser +# +#def_key "2" +# change_browse_mode +# +#def_key "3" +# show_search_engine +# +#def_key "3" +# reset_search_engine +# +#def_key "4" +# show_media_library +# +#def_key "4" +# toggle_media_library_columns_mode +# +#def_key "5" +# show_playlist_editor +# +#def_key "6" +# show_tag_editor +# +#def_key "7" +# show_outputs +# +#def_key "8" +# show_visualizer +# +def_key "=" + show_clock +# +#def_key "@" +# show_server_info +# +#def_key "s" +# stop +# +#def_key "p" +# pause +# +#def_key ">" +# next +# +#def_key "<" +# previous +# +#def_key "ctrl-h" +# jump_to_parent_directory +# +#def_key "ctrl-h" +# replay_song +# +#def_key "backspace" +# jump_to_parent_directory +# +#def_key "backspace" +# replay_song +# +#def_key "backspace" +# play +# +#def_key "f" +# seek_forward +# +#def_key "b" +# seek_backward +# +#def_key "r" +# toggle_repeat +# +#def_key "z" +# toggle_random +# +#def_key "y" +# save_tag_changes +# +#def_key "y" +# start_searching +# +def_key "t" + toggle_single +# +#def_key "R" +# toggle_consume +# +#def_key "Y" +# toggle_replay_gain_mode +# +#def_key "T" +# toggle_add_mode +# +#def_key "|" +# toggle_mouse +# +#def_key "#" +# toggle_bitrate_visibility +# +#def_key "Z" +# shuffle +# +#def_key "x" +# toggle_crossfade +# +#def_key "X" +# set_crossfade +# +#def_key "u" +# update_database +# +#def_key "ctrl-s" +# sort_playlist +# +#def_key "ctrl-s" +# toggle_browser_sort_mode +# +#def_key "ctrl-s" +# toggle_media_library_sort_mode +# +#def_key "ctrl-r" +# reverse_playlist +# +#def_key "ctrl-f" +# apply_filter +# +#def_key "ctrl-_" +# select_found_items +# +#def_key "/" +# find +# +#def_key "/" +# find_item_forward +# +#def_key "?" +# find +# +#def_key "?" +# find_item_backward +# +#def_key "." +# next_found_item +# +#def_key "," +# previous_found_item +# +#def_key "w" +# toggle_find_mode +# +#def_key "e" +# edit_song +# +#def_key "e" +# edit_library_tag +# +#def_key "e" +# edit_library_album +# +#def_key "e" +# edit_directory_name +# +#def_key "e" +# edit_playlist_name +# +#def_key "e" +# edit_lyrics +# +def_key "i" + show_song_info +# +#def_key "I" +# show_artist_info +# +#def_key "g" +# jump_to_position_in_song +# +def_key "l" + show_lyrics +# +#def_key "ctrl-v" +# select_range +# +#def_key "v" +# reverse_selection +# +#def_key "V" +# remove_selection +# +#def_key "B" +# select_album +# +#def_key "a" +# add_selected_items +# +#def_key "c" +# clear_playlist +# +#def_key "c" +# clear_main_playlist +# +#def_key "C" +# crop_playlist +# +#def_key "C" +# crop_main_playlist +# +#def_key "m" +# move_sort_order_up +# +def_key "shift-up" + move_selected_items_up +# +#def_key "n" +# move_sort_order_down +# +def_key "shift-down" + move_selected_items_down +# +#def_key "M" +# move_selected_items_to +# +#def_key "A" +# add +# +def_key "S" + save_playlist +# +#def_key "o" +# jump_to_playing_song +# +#def_key "G" +# jump_to_browser +# +#def_key "G" +# jump_to_playlist_editor +# +#def_key "~" +# jump_to_media_library +# +#def_key "E" +# jump_to_tag_editor +# +#def_key "U" +# toggle_playing_song_centering +# +#def_key "P" +# toggle_display_mode +# +#def_key "\\" +# toggle_interface +# +#def_key "!" +# toggle_separators_between_albums +# +#def_key "L" +# toggle_lyrics_fetcher +# +#def_key "F" +# fetch_lyrics_in_background +# +#def_key "alt-l" +# toggle_fetching_lyrics_in_background +# +#def_key "ctrl-l" +# toggle_screen_lock +# +#def_key "`" +# toggle_library_tag_type +# +#def_key "`" +# refetch_lyrics +# +#def_key "`" +# add_random_items +# +#def_key "ctrl-p" +# set_selected_items_priority +# +#def_key "q" +# quit +# diff --git a/dotfiles/common/.config/ncmpcpp/config b/dotfiles/common/.config/ncmpcpp/config new file mode 100644 index 0000000..6520d5a --- /dev/null +++ b/dotfiles/common/.config/ncmpcpp/config @@ -0,0 +1,71 @@ +# Connection +mpd_host = "127.0.0.1" +# mpd_host = "/home/cjennings/.config/mpd/socket" +mpd_port = "6600" +mpd_music_dir = "/home/cjennings/music" +mpd_connection_timeout = "10" +mpd_crossfade_time = "1" + +# Visualizer +visualizer_data_source = "/tmp/mpd.fifo" +visualizer_output_name = "FIFO" +visualizer_in_stereo = "yes" +visualizer_type = "wave_filled" +visualizer_color = 246,245,244,243,242,241,240,239,238,237,236,235 +visualizer_look = "|○" + +# Columns +song_columns_list_format = "(3f)[239]{} (35)[246]{t|f} (30)[blue]{a} (30)[green]{b} (5f)[240]{l}" +song_list_format = "{$5 %a$9 $1│$9 $8%t$9 }|{ $8%f$9}$R{$5%b $7}" +song_status_format = "{{{$5%a$9}} $8-$9 {$2%t$9}|{$0%f$9}{ $8-$9 $3%b$9{ $8-$9 $5%y$9}}}" +song_library_format = "{%n $8-$9 }{%t}|{%f}" +now_playing_prefix = "$8$b ➤ " +browser_playlist_prefix = "playlist" +selected_item_prefix = "$5" +selected_item_suffix = "$9" +song_window_title_format = "{%t}|{%f} - {%a}" + +# Various +playlist_show_remaining_time = "no" +playlist_shorten_total_times = "yes" +playlist_separate_albums = "no" +playlist_display_mode = "columns" +browser_display_mode = "columns" +search_engine_display_mode = "columns" +discard_colors_if_item_is_selected = "no" +incremental_seeking = "yes" +seek_time = "1" +autocenter_mode = "yes" +centered_cursor = "yes" +progressbar_look = "─╼─" +progressbar_color = 240 +progressbar_elapsed_color = white +user_interface = "classic" +header_visibility = "no" +titles_visibility = "no" +header_text_scrolling = "yes" +cyclic_scrolling = "no" +lines_scrolled = "2" +follow_now_playing_lyrics = "yes" +show_hidden_files_in_local_browser = "no" +jump_to_now_playing_song_at_start = "yes" +clock_display_seconds = "no" +display_volume_level = "no" +display_bitrate = "yes" +display_remaining_time = "no" +regular_expressions = "extended" +ignore_leading_the = "no" +block_search_constraints_change_if_items_found = "yes" +mouse_support = "yes" +mouse_list_scroll_whole_page = "yes" +external_editor = "vim" +use_console_editor = "yes" +colors_enabled = "yes" +empty_tag_color = "white" +header_window_color = "yellow" +state_line_color = "black" +state_flags_color = "black" +main_window_color = 243 +statusbar_color = "yellow" +active_window_border = "yellow" + diff --git a/dotfiles/common/.config/picom.conf b/dotfiles/common/.config/picom.conf new file mode 100644 index 0000000..0b65df7 --- /dev/null +++ b/dotfiles/common/.config/picom.conf @@ -0,0 +1,56 @@ +# opacity-rule = [ +# "85:class_g = 'XTerm'", +# "85:class_g = 'Alacritty'", +# "85:class_g = 'xterm-kitty'", +# "85:class_g = 'URxvt'", +# "85:class_g = 'tabbed'", +# ]; +# "85:class_g = 'st-256color'", +# "85:class_g = 'Emacs'", + +# Blur +blur: +{ + method = "dual_kawase"; + strength = 2; +} + +wintypes: +{ + normal = { blur-background = true; }; + splash = { blur-background = false; }; +}; + +# Fading +fading = false; +fade-in-step = 0.07; +fade-out-step = 0.07; +fade-exclude = [ ]; + +# Other +corner-radius = 10.0; +round-borders = 1; +mark-wmwin-focused = true; +mark-ovredir-focused = true; +detect-rounded-corners = true; +rounded-corners-exclude = [ + "class_g = 'dwm'", + "class_g = 'dwmsystray'", + "window_type = 'dock'" + ]; +detect-client-opacity = true; + +vsync = true; +dbe = false; +unredir-if-possible = true; +detect-transient = true; +detect-client-leader = true; +invert-color-include = [ ]; + +# GLX backend +backend = "glx"; +glx-no-stencil = true; +glx-copy-from-front = false; +use-damage = true +glx-no-rebind-pixmap = true; + diff --git a/dotfiles/common/.config/qalculate/qalculate-gtk.cfg b/dotfiles/common/.config/qalculate/qalculate-gtk.cfg new file mode 100644 index 0000000..22d7f45 --- /dev/null +++ b/dotfiles/common/.config/qalculate/qalculate-gtk.cfg @@ -0,0 +1,329 @@ + +[General] +version=5.9.0 +allow_multiple_instances=-1 +width=1167 +always_on_top=0 +enable_tooltips=1 +error_info_shown=1 +save_mode_on_exit=1 +save_definitions_on_exit=1 +save_history_separately=0 +auto_update_exchange_rates=-1 +clear_history_on_exit=0 +history_expression_type=2 +use_custom_history_font=0 +use_custom_expression_font=0 +replace_expression=0 +enable_completion=1 +enable_completion2=1 +completion_min=1 +completion_min2=1 +completion_delay=0 +use_custom_status_font=0 +vertical_button_padding=-1 +horizontal_button_padding=-1 +use_custom_keypad_font=0 +latest_button_currency=USD +use_custom_result_font=0 +continuous_conversion=1 +set_missing_prefixes=0 +show_bases_keypad=1 +keep_function_dialog_open=0 +ignore_locale=0 +load_global_definitions=1 +local_currency_conversion=1 +use_binary_prefixes=0 +check_version=0 +show_keypad=1 +show_history=0 +history_height=0 +minimal_width=500 +show_stack=1 +show_convert=0 +persistent_keypad=0 +minimal_mode=0 +rpn_keys=1 +display_expression_status=1 +parsed_expression_in_resultview=0 +calculate_as_you_type_history_delay=2000 +use_unicode_signs=1 +lower_case_numbers=0 +duodecimal_symbols=0 +exp_display=3 +imaginary_j=0 +base_display=1 +twos_complement=1 +hexadecimal_twos_complement=0 +twos_complement_input=0 +hexadecimal_twos_complement_input=0 +spell_out_logical_operators=1 +caret_as_xor=0 +close_with_esc=-1 +digit_grouping=1 +copy_ascii=0 +copy_ascii_without_units=0 +decimal_comma=-1 +dot_as_separator=0 +comma_as_separator=1 +use_custom_application_font=0 +multiplication_sign=2 +division_sign=1 +expression_history=125×7×6 +expression_history=7600×4 +expression_history=7600X4 +expression_history=10619.57−3000 +expression_history=1991−1964 +expression_history=(5×75)+150 +expression_history=5×75 +expression_history=100−35 +expression_history=262690−165393.50 +expression_history=212770+24960 +expression_history=212770−24960 +expression_history=49920/2 +expression_history=262690−212770 +expression_history=68/24 +expression_history=168/197 +expression_history=197/168 +expression_history=262690−19100 +expression_history=38200/2 +expression_history=$38,200/2 +expression_history=30000/197000 +expression_history=197250+6360+6140+3840 +expression_history=4550+4050 +expression_history=4,500+4060 +expression_history=490×6 +expression_history=7688.16×4 +expression_history=3277.52+46.85 +expression_history=3310.94+109.04 +expression_history=3277.52+46.86 +expression_history=30 + 15 + 5 + 10 + 30 + 30 +expression_history=30 +5+15+30+20+20 +expression_history=30 + 5 + 15 + 30 + 20 + 5 + 5 + 20 +expression_history=1024×16 +expression_history=3278×12 +expression_history=1026×16 +expression_history=96×2 +history_time=1768330887 +history_expression=125×7×6 +history_parse=125 × 7 × 6 +history_result=5250 +history_time=1767984868 +history_expression=7600×4 +history_parse=7600 × 4 +history_result=30 400 +history_time=1767984861 +history_expression=7600X4 +history_parse=7600 +history_error=Trailing characters "X4" (not a valid variable/function/unit) in number "7600X4" were ignored. +history_result=7600 +history_time=1767984665 +history_expression=10619.57−3000 +history_parse=10 619.57 − 3000 +history_result=7619.57 +history_time=1767807514 +history_expression=1991−1964 +history_parse=1991 − 1964 +history_result=27 +history_time=1766252840 +history_expression=(5×75)+150 +history_parse=(5 × 75) + 150 +history_result=525 +history_time=1766252831 +history_expression=5×75 +history_parse=5 × 75 +history_result=375 +history_time=1764874377 +history_expression=100−35 +history_parse=100 − 35 +history_result=65 +history_time=1762832920 +history_expression=262690−165393.50 +history_parse=262 690 − 165 393.5 +history_result=97 296.5 +history_time=1762825204 +history_expression=212770+24960 +history_parse=212 770 + 24 960 +history_result=237 730 +history_time=1762825199 +history_expression=212770−24960 +history_parse=212 770 − 24 960 +history_result=187 810 +history_time=1762825172 +history_expression=49920/2 +history_parse=49 920 ∕ 2 +history_result=24 960 +history_time=1762823711 +history_expression=262690−212770 +history_parse=262 690 − 212 770 +history_result=49 920 +history_time=1762731979 +history_expression=68/24 +history_parse=68 ∕ 24 +history_result_approximate=2.833 333 333 +history_time=1762176587 +history_expression=168/197 +history_parse=168 ∕ 197 +history_result_approximate=0.852 791 878 2 +history_time=1762176579 +history_expression=197/168 +history_parse=197 ∕ 168 +history_result_approximate=1.172 619 048 +history_time=1761510158 +history_expression=262690−19100 +history_parse=262 690 − 19 100 +history_result=243 590 +history_time=1761508703 +history_expression=38200/2 +history_parse=38 200 ∕ 2 +history_result=19 100 +history_time=1761508667 +history_expression=$38,200/2 +history_parse=(USD × 38 200) ∕ 2 +history_result=$19 100 +history_time=1761449979 +history_expression=30000/197000 +history_parse=30 000 ∕ 197 000 +history_result_approximate=0.152 284 264 0 +history_time=1761245928 +history_expression=197250+6360+6140+3840 +history_parse=197 250 + 6360 + 6140 + 3840 +history_result=213 590 +history_time=1761167849 +history_expression=4550+4050 +history_parse=4550 + 4050 +history_result=8600 +history_time=1761167803 +history_expression=4,500+4060 +history_parse=4500 + 4060 +history_result=8560 +history_time=1752350332 +history_expression=490×6 +history_parse=490 × 6 +history_result=2940 +history_time=1752334636 +history_expression=7688.16×4 +history_parse=7688.16 × 4 +history_result=30 752.64 +history_time=1751310907 +history_expression=3277.52+46.85 +history_parse=3277.52 + 46.85 +history_result=3324.37 +history_time=1751310861 +history_expression=3310.94+109.04 +history_parse=3310.94 + 109.04 +history_result=3419.98 +history_time=1751310628 +history_expression=3277.52+46.86 +history_parse=3277.52 + 46.86 +history_result=3324.38 +history_time=1750342970 +history_expression=30 + 15 + 5 + 10 + 30 + 30 +history_parse=30 + 15 + 5 + 10 + 30 + 30 +history_result=120 +history_time=1750342955 +history_expression=30 +5+15+30+20+20 +history_parse=30 + 5 + 15 + 30 + 20 + 20 +history_result=120 +history_time=1750342806 +history_expression=30 + 15 + 5 + 10 + 30 + 30 +history_parse=30 + 15 + 5 + 10 + 30 + 30 +history_result=120 +history_time=1750342726 +history_expression=30 + 5 + 15 + 30 + 20 + 5 + 5 + 20 +history_parse=30 + 5 + 15 + 30 + 20 + 5 + 5 + 20 +history_result=130 +history_time=1749150165 +history_expression=1024×16 +history_parse=1024 × 16 +history_result=16 384 +history_time=1748972784 +history_expression=3278×12 +history_parse=3278 × 12 +history_result=39 336 +history_time=1748621453 +history_expression=1026×16 +history_parse=1026 × 16 +history_result=16 416 +history_time=1747760701 +history_expression=96×2 +history_parse=96 × 2 +history_result=192 +recent_functions= +recent_variables= +recent_units= + +[Mode] +min_deci=0 +use_min_deci=0 +max_deci=2 +use_max_deci=0 +precision=10 +interval_arithmetic=1 +interval_display=0 +min_exp=-1 +negative_exponents=0 +sort_minus_last=1 +number_fraction_format=0 +complex_number_form=0 +use_prefixes=1 +use_prefixes_for_all_units=0 +use_prefixes_for_currencies=0 +abbreviate_names=1 +all_prefixes_enabled=0 +denominator_prefix_enabled=1 +place_units_separately=1 +auto_post_conversion=3 +mixed_units_conversion=3 +number_base=10 +number_base_expression=10 +read_precision=0 +assume_denominators_nonzero=1 +warn_about_denominators_assumed_nonzero=1 +structuring=1 +angle_unit=1 +functions_enabled=1 +variables_enabled=1 +calculate_functions=1 +calculate_variables=1 +variable_units_enabled=1 +sync_units=1 +unknownvariables_enabled=0 +units_enabled=1 +allow_complex=1 +allow_infinite=1 +indicate_infinite_series=0 +show_ending_zeroes=1 +rounding_mode=0 +approximation=1 +interval_calculation=1 +concise_uncertainty_input=0 +calculate_as_you_type=0 +in_rpn_mode=0 +chain_mode=0 +limit_implicit_multiplication=0 +parsing_mode=0 +simplified_percentage=-1 +spacious=1 +excessive_parenthesis=0 +visible_keypad=0 +short_multiplication=1 +default_assumption_type=4 +default_assumption_sign=0 + +[Plotting] +plot_legend_placement=2 +plot_style=0 +plot_smoothing=0 +plot_display_grid=1 +plot_full_border=0 +plot_min=0 +plot_max=10 +plot_step=1 +plot_sampling_rate=1001 +plot_use_sampling_rate=1 +plot_variable=x +plot_rows=0 +plot_type=0 +plot_color=1 +plot_linewidth=2 diff --git a/dotfiles/common/.config/qt5ct/qt5ct.conf b/dotfiles/common/.config/qt5ct/qt5ct.conf new file mode 100644 index 0000000..56a88db --- /dev/null +++ b/dotfiles/common/.config/qt5ct/qt5ct.conf @@ -0,0 +1,32 @@ +[Appearance] +color_scheme_path=/usr/share/qt5ct/colors/darker.conf +custom_palette=true +icon_theme=Papirus-Dark +standard_dialogs=default +style=Adwaita-Dark + +[Fonts] +fixed="Cantarell,11,-1,5,50,0,0,0,0,0" +general="Cantarell,11,-1,5,50,0,0,0,0,0" + +[Interface] +activate_item_on_single_click=1 +buttonbox_layout=0 +cursor_flash_time=1000 +dialog_buttons_have_icons=1 +double_click_interval=400 +gui_effects=@Invalid() +keyboard_scheme=2 +menus_have_icons=true +show_shortcuts_in_context_menus=true +stylesheets=@Invalid() +toolbutton_style=4 +underline_shortcut=1 +wheel_scroll_lines=3 + +[SettingsWindow] +geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\x11\0\0\x4g\0\0\x2\xf0\0\0\0\0\0\0\0\x11\0\0\x4g\0\0\x2\xf0\0\0\0\0\0\0\0\0\x4h\0\0\0\0\0\0\0\x11\0\0\x4g\0\0\x2\xf0) + +[Troubleshooting] +force_raster_widgets=1 +ignored_applications=@Invalid() diff --git a/dotfiles/common/.config/qt6ct/qt6ct.conf b/dotfiles/common/.config/qt6ct/qt6ct.conf new file mode 100644 index 0000000..496c09d --- /dev/null +++ b/dotfiles/common/.config/qt6ct/qt6ct.conf @@ -0,0 +1,29 @@ +[Appearance] +color_scheme_path=/usr/share/qt6ct/colors/darker.conf +custom_palette=true +icon_theme=Papirus-Dark +standard_dialogs=default +style=Adwaita-Dark + +[Fonts] +fixed="Cantarell,11,-1,5,50,0,0,0,0,0" +general="Cantarell,11,-1,5,50,0,0,0,0,0" + +[Interface] +activate_item_on_single_click=1 +buttonbox_layout=0 +cursor_flash_time=1000 +dialog_buttons_have_icons=1 +double_click_interval=400 +gui_effects=@Invalid() +keyboard_scheme=2 +menus_have_icons=true +show_shortcuts_in_context_menus=true +stylesheets=@Invalid() +toolbutton_style=4 +underline_shortcut=1 +wheel_scroll_lines=3 + +[Troubleshooting] +force_raster_widgets=1 +ignored_applications=@Invalid() diff --git a/dotfiles/common/.config/ranger/commands.py b/dotfiles/common/.config/ranger/commands.py new file mode 100644 index 0000000..97b7909 --- /dev/null +++ b/dotfiles/common/.config/ranger/commands.py @@ -0,0 +1,62 @@ +# This is a sample commands.py. You can add your own commands here. +# +# Please refer to commands_full.py for all the default commands and a complete +# documentation. Do NOT add them all here, or you may end up with defunct +# commands when upgrading ranger. + +# A simple command for demonstration purposes follows. +# ----------------------------------------------------------------------------- + +from __future__ import (absolute_import, division, print_function) + +# You can import any python module as needed. +import os + +# You always need to import ranger.api.commands here to get the Command class: +from ranger.api.commands import Command + + +# Any class that is a subclass of "Command" will be integrated into ranger as a +# command. Try typing ":my_edit<ENTER>" in ranger! +class my_edit(Command): + # The so-called doc-string of the class will be visible in the built-in + # help that is accessible by typing "?c" inside ranger. + """:my_edit <filename> + + A sample command for demonstration purposes that opens a file in an editor. + """ + + # The execute method is called when you run this command in ranger. + def execute(self): + # self.arg(1) is the first (space-separated) argument to the function. + # This way you can write ":my_edit somefilename<ENTER>". + if self.arg(1): + # self.rest(1) contains self.arg(1) and everything that follows + target_filename = self.rest(1) + else: + # self.fm is a ranger.core.filemanager.FileManager object and gives + # you access to internals of ranger. + # self.fm.thisfile is a ranger.container.file.File object and is a + # reference to the currently selected file. + target_filename = self.fm.thisfile.path + + # This is a generic function to print text in ranger. + self.fm.notify("Let's edit the file " + target_filename + "!") + + # Using bad=True in fm.notify allows you to print error messages: + if not os.path.exists(target_filename): + self.fm.notify("The given file does not exist!", bad=True) + return + + # This executes a function from ranger.core.acitons, a module with a + # variety of subroutines that can help you construct commands. + # Check out the source, or run "pydoc ranger.core.actions" for a list. + self.fm.edit_file(target_filename) + + # The tab method is called when you press tab, and should return a list of + # suggestions that the user will tab through. + # tabnum is 1 for <TAB> and -1 for <S-TAB> by default + def tab(self, tabnum): + # This is a generic tab-completion function that iterates through the + # content of the current directory. + return self._tab_directory_content() diff --git a/dotfiles/common/.config/ranger/commands_full.py b/dotfiles/common/.config/ranger/commands_full.py new file mode 100644 index 0000000..d177203 --- /dev/null +++ b/dotfiles/common/.config/ranger/commands_full.py @@ -0,0 +1,1836 @@ +# -*- coding: utf-8 -*- +# This file is part of ranger, the console file manager. +# This configuration file is licensed under the same terms as ranger. +# =================================================================== +# +# NOTE: If you copied this file to /etc/ranger/commands_full.py or +# ~/.config/ranger/commands_full.py, then it will NOT be loaded by ranger, +# and only serve as a reference. +# +# =================================================================== +# This file contains ranger's commands. +# It's all in python; lines beginning with # are comments. +# +# Note that additional commands are automatically generated from the methods +# of the class ranger.core.actions.Actions. +# +# You can customize commands in the files /etc/ranger/commands.py (system-wide) +# and ~/.config/ranger/commands.py (per user). +# They have the same syntax as this file. In fact, you can just copy this +# file to ~/.config/ranger/commands_full.py with +# `ranger --copy-config=commands_full' and make your modifications, don't +# forget to rename it to commands.py. You can also use +# `ranger --copy-config=commands' to copy a short sample commands.py that +# has everything you need to get started. +# But make sure you update your configs when you update ranger. +# +# =================================================================== +# Every class defined here which is a subclass of `Command' will be used as a +# command in ranger. Several methods are defined to interface with ranger: +# execute(): called when the command is executed. +# cancel(): called when closing the console. +# tab(tabnum): called when <TAB> is pressed. +# quick(): called after each keypress. +# +# tab() argument tabnum is 1 for <TAB> and -1 for <S-TAB> by default +# +# The return values for tab() can be either: +# None: There is no tab completion +# A string: Change the console to this string +# A list/tuple/generator: cycle through every item in it +# +# The return value for quick() can be: +# False: Nothing happens +# True: Execute the command afterwards +# +# The return value for execute() and cancel() doesn't matter. +# +# =================================================================== +# Commands have certain attributes and methods that facilitate parsing of +# the arguments: +# +# self.line: The whole line that was written in the console. +# self.args: A list of all (space-separated) arguments to the command. +# self.quantifier: If this command was mapped to the key "X" and +# the user pressed 6X, self.quantifier will be 6. +# self.arg(n): The n-th argument, or an empty string if it doesn't exist. +# self.rest(n): The n-th argument plus everything that followed. For example, +# if the command was "search foo bar a b c", rest(2) will be "bar a b c" +# self.start(n): Anything before the n-th argument. For example, if the +# command was "search foo bar a b c", start(2) will be "search foo" +# +# =================================================================== +# And this is a little reference for common ranger functions and objects: +# +# self.fm: A reference to the "fm" object which contains most information +# about ranger. +# self.fm.notify(string): Print the given string on the screen. +# self.fm.notify(string, bad=True): Print the given string in RED. +# self.fm.reload_cwd(): Reload the current working directory. +# self.fm.thisdir: The current working directory. (A File object.) +# self.fm.thisfile: The current file. (A File object too.) +# self.fm.thistab.get_selection(): A list of all selected files. +# self.fm.execute_console(string): Execute the string as a ranger command. +# self.fm.open_console(string): Open the console with the given string +# already typed in for you. +# self.fm.move(direction): Moves the cursor in the given direction, which +# can be something like down=3, up=5, right=1, left=1, to=6, ... +# +# File objects (for example self.fm.thisfile) have these useful attributes and +# methods: +# +# tfile.path: The path to the file. +# tfile.basename: The base name only. +# tfile.load_content(): Force a loading of the directories content (which +# obviously works with directories only) +# tfile.is_directory: True/False depending on whether it's a directory. +# +# For advanced commands it is unavoidable to dive a bit into the source code +# of ranger. +# =================================================================== + +from __future__ import (absolute_import, division, print_function) + +from collections import deque +import os +import re + +from ranger.api.commands import Command + + +class alias(Command): + """:alias <newcommand> <oldcommand> + + Copies the oldcommand as newcommand. + """ + + context = 'browser' + resolve_macros = False + + def execute(self): + if not self.arg(1) or not self.arg(2): + self.fm.notify('Syntax: alias <newcommand> <oldcommand>', bad=True) + return + + self.fm.commands.alias(self.arg(1), self.rest(2)) + + +class echo(Command): + """:echo <text> + + Display the text in the statusbar. + """ + + def execute(self): + self.fm.notify(self.rest(1)) + + +class cd(Command): + """:cd [-r] <path> + + The cd command changes the directory. + If the path is a file, selects that file. + The command 'cd -' is equivalent to typing ``. + Using the option "-r" will get you to the real path. + """ + + def execute(self): + if self.arg(1) == '-r': + self.shift() + destination = os.path.realpath(self.rest(1)) + if os.path.isfile(destination): + self.fm.select_file(destination) + return + else: + destination = self.rest(1) + + if not destination: + destination = '~' + + if destination == '-': + self.fm.enter_bookmark('`') + else: + self.fm.cd(destination) + + def _tab_args(self): + # dest must be rest because path could contain spaces + if self.arg(1) == '-r': + start = self.start(2) + dest = self.rest(2) + else: + start = self.start(1) + dest = self.rest(1) + + if dest: + head, tail = os.path.split(os.path.expanduser(dest)) + if head: + dest_exp = os.path.join(os.path.normpath(head), tail) + else: + dest_exp = tail + else: + dest_exp = '' + return (start, dest_exp, os.path.join(self.fm.thisdir.path, dest_exp), + dest.endswith(os.path.sep)) + + @staticmethod + def _tab_paths(dest, dest_abs, ends_with_sep): + if not dest: + try: + return next(os.walk(dest_abs))[1], dest_abs + except (OSError, StopIteration): + return [], '' + + if ends_with_sep: + try: + return [os.path.join(dest, path) for path in next(os.walk(dest_abs))[1]], '' + except (OSError, StopIteration): + return [], '' + + return None, None + + def _tab_match(self, path_user, path_file): + if self.fm.settings.cd_tab_case == 'insensitive': + path_user = path_user.lower() + path_file = path_file.lower() + elif self.fm.settings.cd_tab_case == 'smart' and path_user.islower(): + path_file = path_file.lower() + return path_file.startswith(path_user) + + def _tab_normal(self, dest, dest_abs): + dest_dir = os.path.dirname(dest) + dest_base = os.path.basename(dest) + + try: + dirnames = next(os.walk(os.path.dirname(dest_abs)))[1] + except (OSError, StopIteration): + return [], '' + + return [os.path.join(dest_dir, d) for d in dirnames if self._tab_match(dest_base, d)], '' + + def _tab_fuzzy_match(self, basepath, tokens): + """ Find directories matching tokens recursively """ + if not tokens: + tokens = [''] + paths = [basepath] + while True: + token = tokens.pop() + matches = [] + for path in paths: + try: + directories = next(os.walk(path))[1] + except (OSError, StopIteration): + continue + matches += [os.path.join(path, d) for d in directories + if self._tab_match(token, d)] + if not tokens or not matches: + return matches + paths = matches + + return None + + def _tab_fuzzy(self, dest, dest_abs): + tokens = [] + basepath = dest_abs + while True: + basepath_old = basepath + basepath, token = os.path.split(basepath) + if basepath == basepath_old: + break + if os.path.isdir(basepath_old) and not token.startswith('.'): + basepath = basepath_old + break + tokens.append(token) + + paths = self._tab_fuzzy_match(basepath, tokens) + if not os.path.isabs(dest): + paths_rel = basepath + paths = [os.path.relpath(path, paths_rel) for path in paths] + else: + paths_rel = '' + return paths, paths_rel + + def tab(self, tabnum): + from os.path import sep + + start, dest, dest_abs, ends_with_sep = self._tab_args() + + paths, paths_rel = self._tab_paths(dest, dest_abs, ends_with_sep) + if paths is None: + if self.fm.settings.cd_tab_fuzzy: + paths, paths_rel = self._tab_fuzzy(dest, dest_abs) + else: + paths, paths_rel = self._tab_normal(dest, dest_abs) + + paths.sort() + + if self.fm.settings.cd_bookmarks: + paths[0:0] = [ + os.path.relpath(v.path, paths_rel) if paths_rel else v.path + for v in self.fm.bookmarks.dct.values() for path in paths + if v.path.startswith(os.path.join(paths_rel, path) + sep) + ] + + if not paths: + return None + if len(paths) == 1: + return start + paths[0] + sep + return [start + dirname for dirname in paths] + + +class chain(Command): + """:chain <command1>; <command2>; ... + + Calls multiple commands at once, separated by semicolons. + """ + + def execute(self): + if not self.rest(1).strip(): + self.fm.notify('Syntax: chain <command1>; <command2>; ...', bad=True) + return + for command in [s.strip() for s in self.rest(1).split(";")]: + self.fm.execute_console(command) + + +class shell(Command): + escape_macros_for_shell = True + + def execute(self): + if self.arg(1) and self.arg(1)[0] == '-': + flags = self.arg(1)[1:] + command = self.rest(2) + else: + flags = '' + command = self.rest(1) + + if command: + self.fm.execute_command(command, flags=flags) + + def tab(self, tabnum): + from ranger.ext.get_executables import get_executables + if self.arg(1) and self.arg(1)[0] == '-': + command = self.rest(2) + else: + command = self.rest(1) + start = self.line[0:len(self.line) - len(command)] + + try: + position_of_last_space = command.rindex(" ") + except ValueError: + return (start + program + ' ' for program + in get_executables() if program.startswith(command)) + if position_of_last_space == len(command) - 1: + selection = self.fm.thistab.get_selection() + if len(selection) == 1: + return self.line + selection[0].shell_escaped_basename + ' ' + return self.line + '%s ' + + before_word, start_of_word = self.line.rsplit(' ', 1) + return (before_word + ' ' + file.shell_escaped_basename + for file in self.fm.thisdir.files or [] + if file.shell_escaped_basename.startswith(start_of_word)) + + +class open_with(Command): + + def execute(self): + app, flags, mode = self._get_app_flags_mode(self.rest(1)) + self.fm.execute_file( + files=[f for f in self.fm.thistab.get_selection()], + app=app, + flags=flags, + mode=mode) + + def tab(self, tabnum): + return self._tab_through_executables() + + def _get_app_flags_mode(self, string): # pylint: disable=too-many-branches,too-many-statements + """Extracts the application, flags and mode from a string. + + examples: + "mplayer f 1" => ("mplayer", "f", 1) + "atool 4" => ("atool", "", 4) + "p" => ("", "p", 0) + "" => None + """ + + app = '' + flags = '' + mode = 0 + split = string.split() + + if len(split) == 1: + part = split[0] + if self._is_app(part): + app = part + elif self._is_flags(part): + flags = part + elif self._is_mode(part): + mode = part + + elif len(split) == 2: + part0 = split[0] + part1 = split[1] + + if self._is_app(part0): + app = part0 + if self._is_flags(part1): + flags = part1 + elif self._is_mode(part1): + mode = part1 + elif self._is_flags(part0): + flags = part0 + if self._is_mode(part1): + mode = part1 + elif self._is_mode(part0): + mode = part0 + if self._is_flags(part1): + flags = part1 + + elif len(split) >= 3: + part0 = split[0] + part1 = split[1] + part2 = split[2] + + if self._is_app(part0): + app = part0 + if self._is_flags(part1): + flags = part1 + if self._is_mode(part2): + mode = part2 + elif self._is_mode(part1): + mode = part1 + if self._is_flags(part2): + flags = part2 + elif self._is_flags(part0): + flags = part0 + if self._is_mode(part1): + mode = part1 + elif self._is_mode(part0): + mode = part0 + if self._is_flags(part1): + flags = part1 + + return app, flags, int(mode) + + def _is_app(self, arg): + return not self._is_flags(arg) and not arg.isdigit() + + @staticmethod + def _is_flags(arg): + from ranger.core.runner import ALLOWED_FLAGS + return all(x in ALLOWED_FLAGS for x in arg) + + @staticmethod + def _is_mode(arg): + return all(x in '0123456789' for x in arg) + + +class set_(Command): + """:set <option name>=<python expression> + + Gives an option a new value. + + Use `:set <option>!` to toggle or cycle it, e.g. `:set flush_input!` + """ + name = 'set' # don't override the builtin set class + + def execute(self): + name = self.arg(1) + name, value, _, toggle = self.parse_setting_line_v2() + if toggle: + self.fm.toggle_option(name) + else: + self.fm.set_option_from_string(name, value) + + def tab(self, tabnum): # pylint: disable=too-many-return-statements + from ranger.gui.colorscheme import get_all_colorschemes + name, value, name_done = self.parse_setting_line() + settings = self.fm.settings + if not name: + return sorted(self.firstpart + setting for setting in settings) + if not value and not name_done: + return sorted(self.firstpart + setting for setting in settings + if setting.startswith(name)) + if not value: + value_completers = { + "colorscheme": + # Cycle through colorschemes when name, but no value is specified + lambda: sorted(self.firstpart + colorscheme for colorscheme + in get_all_colorschemes(self.fm)), + + "column_ratios": + lambda: self.firstpart + ",".join(map(str, settings[name])), + } + + def default_value_completer(): + return self.firstpart + str(settings[name]) + + return value_completers.get(name, default_value_completer)() + if bool in settings.types_of(name): + if 'true'.startswith(value.lower()): + return self.firstpart + 'True' + if 'false'.startswith(value.lower()): + return self.firstpart + 'False' + # Tab complete colorscheme values if incomplete value is present + if name == "colorscheme": + return sorted(self.firstpart + colorscheme for colorscheme + in get_all_colorschemes(self.fm) if colorscheme.startswith(value)) + return None + + +class setlocal(set_): + """:setlocal path=<regular expression> <option name>=<python expression> + + Gives an option a new value. + """ + PATH_RE_DQUOTED = re.compile(r'^setlocal\s+path="(.*?)"') + PATH_RE_SQUOTED = re.compile(r"^setlocal\s+path='(.*?)'") + PATH_RE_UNQUOTED = re.compile(r'^path=(.*?)$') + + def _re_shift(self, match): + if not match: + return None + path = os.path.expanduser(match.group(1)) + for _ in range(len(path.split())): + self.shift() + return path + + def execute(self): + path = self._re_shift(self.PATH_RE_DQUOTED.match(self.line)) + if path is None: + path = self._re_shift(self.PATH_RE_SQUOTED.match(self.line)) + if path is None: + path = self._re_shift(self.PATH_RE_UNQUOTED.match(self.arg(1))) + if path is None and self.fm.thisdir: + path = self.fm.thisdir.path + if not path: + return + + name, value, _ = self.parse_setting_line() + self.fm.set_option_from_string(name, value, localpath=path) + + +class setintag(set_): + """:setintag <tag or tags> <option name>=<option value> + + Sets an option for directories that are tagged with a specific tag. + """ + + def execute(self): + tags = self.arg(1) + self.shift() + name, value, _ = self.parse_setting_line() + self.fm.set_option_from_string(name, value, tags=tags) + + +class default_linemode(Command): + + def execute(self): + from ranger.container.fsobject import FileSystemObject + + if len(self.args) < 2: + self.fm.notify( + "Usage: default_linemode [path=<regexp> | tag=<tag(s)>] <linemode>", bad=True) + + # Extract options like "path=..." or "tag=..." from the command line + arg1 = self.arg(1) + method = "always" + argument = None + if arg1.startswith("path="): + method = "path" + argument = re.compile(arg1[5:]) + self.shift() + elif arg1.startswith("tag="): + method = "tag" + argument = arg1[4:] + self.shift() + + # Extract and validate the line mode from the command line + lmode = self.rest(1) + if lmode not in FileSystemObject.linemode_dict: + self.fm.notify( + "Invalid linemode: %s; should be %s" % ( + lmode, "/".join(FileSystemObject.linemode_dict)), + bad=True, + ) + + # Add the prepared entry to the fm.default_linemodes + entry = [method, argument, lmode] + self.fm.default_linemodes.appendleft(entry) + + # Redraw the columns + if self.fm.ui.browser: + for col in self.fm.ui.browser.columns: + col.need_redraw = True + + def tab(self, tabnum): + return (self.arg(0) + " " + lmode + for lmode in self.fm.thisfile.linemode_dict.keys() + if lmode.startswith(self.arg(1))) + + +class quit(Command): # pylint: disable=redefined-builtin + """:quit + + Closes the current tab, if there's only one tab. + Otherwise quits if there are no tasks in progress. + """ + def _exit_no_work(self): + if self.fm.loader.has_work(): + self.fm.notify('Not quitting: Tasks in progress: Use `quit!` to force quit') + else: + self.fm.exit() + + def execute(self): + if len(self.fm.tabs) >= 2: + self.fm.tab_close() + else: + self._exit_no_work() + + +class quit_bang(Command): + """:quit! + + Closes the current tab, if there's only one tab. + Otherwise force quits immediately. + """ + name = 'quit!' + allow_abbrev = False + + def execute(self): + if len(self.fm.tabs) >= 2: + self.fm.tab_close() + else: + self.fm.exit() + + +class quitall(Command): + """:quitall + + Quits if there are no tasks in progress. + """ + def _exit_no_work(self): + if self.fm.loader.has_work(): + self.fm.notify('Not quitting: Tasks in progress: Use `quitall!` to force quit') + else: + self.fm.exit() + + def execute(self): + self._exit_no_work() + + +class quitall_bang(Command): + """:quitall! + + Force quits immediately. + """ + name = 'quitall!' + allow_abbrev = False + + def execute(self): + self.fm.exit() + + +class terminal(Command): + """:terminal + + Spawns an "x-terminal-emulator" starting in the current directory. + """ + + def execute(self): + from ranger.ext.get_executables import get_term + self.fm.run(get_term(), flags='f') + + +class delete(Command): + """:delete + + Tries to delete the selection or the files passed in arguments (if any). + The arguments use a shell-like escaping. + + "Selection" is defined as all the "marked files" (by default, you + can mark files with space or v). If there are no marked files, + use the "current file" (where the cursor is) + + When attempting to delete non-empty directories or multiple + marked files, it will require a confirmation. + """ + + allow_abbrev = False + escape_macros_for_shell = True + + def execute(self): + import shlex + from functools import partial + + def is_directory_with_files(path): + return os.path.isdir(path) and not os.path.islink(path) and len(os.listdir(path)) > 0 + + if self.rest(1): + files = shlex.split(self.rest(1)) + many_files = (len(files) > 1 or is_directory_with_files(files[0])) + else: + cwd = self.fm.thisdir + tfile = self.fm.thisfile + if not cwd or not tfile: + self.fm.notify("Error: no file selected for deletion!", bad=True) + return + + # relative_path used for a user-friendly output in the confirmation. + files = [f.relative_path for f in self.fm.thistab.get_selection()] + many_files = (cwd.marked_items or is_directory_with_files(tfile.path)) + + confirm = self.fm.settings.confirm_on_delete + if confirm != 'never' and (confirm != 'multiple' or many_files): + self.fm.ui.console.ask( + "Confirm deletion of: %s (y/N)" % ', '.join(files), + partial(self._question_callback, files), + ('n', 'N', 'y', 'Y'), + ) + else: + # no need for a confirmation, just delete + self.fm.delete(files) + + def tab(self, tabnum): + return self._tab_directory_content() + + def _question_callback(self, files, answer): + if answer == 'y' or answer == 'Y': + self.fm.delete(files) + + +class jump_non(Command): + """:jump_non [-FLAGS...] + + Jumps to first non-directory if highlighted file is a directory and vice versa. + + Flags: + -r Jump in reverse order + -w Wrap around if reaching end of filelist + """ + def __init__(self, *args, **kwargs): + super(jump_non, self).__init__(*args, **kwargs) + + flags, _ = self.parse_flags() + self._flag_reverse = 'r' in flags + self._flag_wrap = 'w' in flags + + @staticmethod + def _non(fobj, is_directory): + return fobj.is_directory if not is_directory else not fobj.is_directory + + def execute(self): + tfile = self.fm.thisfile + passed = False + found_before = None + found_after = None + for fobj in self.fm.thisdir.files[::-1] if self._flag_reverse else self.fm.thisdir.files: + if fobj.path == tfile.path: + passed = True + continue + + if passed: + if self._non(fobj, tfile.is_directory): + found_after = fobj.path + break + elif not found_before and self._non(fobj, tfile.is_directory): + found_before = fobj.path + + if found_after: + self.fm.select_file(found_after) + elif self._flag_wrap and found_before: + self.fm.select_file(found_before) + + +class mark_tag(Command): + """:mark_tag [<tags>] + + Mark all tags that are tagged with either of the given tags. + When leaving out the tag argument, all tagged files are marked. + """ + do_mark = True + + def execute(self): + cwd = self.fm.thisdir + tags = self.rest(1).replace(" ", "") + if not self.fm.tags or not cwd.files: + return + for fileobj in cwd.files: + try: + tag = self.fm.tags.tags[fileobj.realpath] + except KeyError: + continue + if not tags or tag in tags: + cwd.mark_item(fileobj, val=self.do_mark) + self.fm.ui.status.need_redraw = True + self.fm.ui.need_redraw = True + + +class console(Command): + """:console <command> + + Open the console with the given command. + """ + + def execute(self): + position = None + if self.arg(1)[0:2] == '-p': + try: + position = int(self.arg(1)[2:]) + except ValueError: + pass + else: + self.shift() + self.fm.open_console(self.rest(1), position=position) + + +class load_copy_buffer(Command): + """:load_copy_buffer + + Load the copy buffer from datadir/copy_buffer + """ + copy_buffer_filename = 'copy_buffer' + + def execute(self): + import sys + from ranger.container.file import File + from os.path import exists + fname = self.fm.datapath(self.copy_buffer_filename) + unreadable = IOError if sys.version_info[0] < 3 else OSError + try: + fobj = open(fname, 'r') + except unreadable: + return self.fm.notify( + "Cannot open %s" % (fname or self.copy_buffer_filename), bad=True) + + self.fm.copy_buffer = set(File(g) + for g in fobj.read().split("\n") if exists(g)) + fobj.close() + self.fm.ui.redraw_main_column() + return None + + +class save_copy_buffer(Command): + """:save_copy_buffer + + Save the copy buffer to datadir/copy_buffer + """ + copy_buffer_filename = 'copy_buffer' + + def execute(self): + import sys + fname = None + fname = self.fm.datapath(self.copy_buffer_filename) + unwritable = IOError if sys.version_info[0] < 3 else OSError + try: + fobj = open(fname, 'w') + except unwritable: + return self.fm.notify("Cannot open %s" % + (fname or self.copy_buffer_filename), bad=True) + fobj.write("\n".join(fobj.path for fobj in self.fm.copy_buffer)) + fobj.close() + return None + + +class unmark_tag(mark_tag): + """:unmark_tag [<tags>] + + Unmark all tags that are tagged with either of the given tags. + When leaving out the tag argument, all tagged files are unmarked. + """ + do_mark = False + + +class mkdir(Command): + """:mkdir <dirname> + + Creates a directory with the name <dirname>. + """ + + def execute(self): + from os.path import join, expanduser, lexists + from os import makedirs + + dirname = join(self.fm.thisdir.path, expanduser(self.rest(1))) + if not lexists(dirname): + makedirs(dirname) + else: + self.fm.notify("file/directory exists!", bad=True) + + def tab(self, tabnum): + return self._tab_directory_content() + + +class touch(Command): + """:touch <fname> + + Creates a file with the name <fname>. + """ + + def execute(self): + from os.path import join, expanduser, lexists + + fname = join(self.fm.thisdir.path, expanduser(self.rest(1))) + if not lexists(fname): + open(fname, 'a').close() + else: + self.fm.notify("file/directory exists!", bad=True) + + def tab(self, tabnum): + return self._tab_directory_content() + + +class edit(Command): + """:edit <filename> + + Opens the specified file in vim + """ + + def execute(self): + if not self.arg(1): + self.fm.edit_file(self.fm.thisfile.path) + else: + self.fm.edit_file(self.rest(1)) + + def tab(self, tabnum): + return self._tab_directory_content() + + +class eval_(Command): + """:eval [-q] <python code> + + Evaluates the python code. + `fm' is a reference to the FM instance. + To display text, use the function `p'. + + Examples: + :eval fm + :eval len(fm.directories) + :eval p("Hello World!") + """ + name = 'eval' + resolve_macros = False + + def execute(self): + # The import is needed so eval() can access the ranger module + import ranger # NOQA pylint: disable=unused-import,unused-variable + if self.arg(1) == '-q': + code = self.rest(2) + quiet = True + else: + code = self.rest(1) + quiet = False + global cmd, fm, p, quantifier # pylint: disable=invalid-name,global-variable-undefined + fm = self.fm + cmd = self.fm.execute_console + p = fm.notify + quantifier = self.quantifier + try: + try: + result = eval(code) # pylint: disable=eval-used + except SyntaxError: + exec(code) # pylint: disable=exec-used + else: + if result and not quiet: + p(result) + except Exception as err: # pylint: disable=broad-except + fm.notify("The error `%s` was caused by evaluating the " + "following code: `%s`" % (err, code), bad=True) + + +class rename(Command): + """:rename <newname> + + Changes the name of the currently highlighted file to <newname> + """ + + def execute(self): + from ranger.container.file import File + from os import access + + new_name = self.rest(1) + + if not new_name: + return self.fm.notify('Syntax: rename <newname>', bad=True) + + if new_name == self.fm.thisfile.relative_path: + return None + + if access(new_name, os.F_OK): + return self.fm.notify("Can't rename: file already exists!", bad=True) + + if self.fm.rename(self.fm.thisfile, new_name): + file_new = File(new_name) + self.fm.bookmarks.update_path(self.fm.thisfile.path, file_new) + self.fm.tags.update_path(self.fm.thisfile.path, file_new.path) + self.fm.thisdir.pointed_obj = file_new + self.fm.thisfile = file_new + + return None + + def tab(self, tabnum): + return self._tab_directory_content() + + +class rename_append(Command): + """:rename_append [-FLAGS...] + + Opens the console with ":rename <current file>" with the cursor positioned + before the file extension. + + Flags: + -a Position before all extensions + -r Remove everything before extensions + """ + def __init__(self, *args, **kwargs): + super(rename_append, self).__init__(*args, **kwargs) + + flags, _ = self.parse_flags() + self._flag_ext_all = 'a' in flags + self._flag_remove = 'r' in flags + + def execute(self): + from ranger import MACRO_DELIMITER, MACRO_DELIMITER_ESC + + tfile = self.fm.thisfile + relpath = tfile.relative_path.replace(MACRO_DELIMITER, MACRO_DELIMITER_ESC) + basename = tfile.basename.replace(MACRO_DELIMITER, MACRO_DELIMITER_ESC) + + if basename.find('.') <= 0: + self.fm.open_console('rename ' + relpath) + return + + if self._flag_ext_all: + pos_ext = re.search(r'[^.]+', basename).end(0) + else: + pos_ext = basename.rindex('.') + pos = len(relpath) - len(basename) + pos_ext + + if self._flag_remove: + relpath = relpath[:-len(basename)] + basename[pos_ext:] + pos -= pos_ext + + self.fm.open_console('rename ' + relpath, position=(7 + pos)) + + +class chmod(Command): + """:chmod <octal number> + + Sets the permissions of the selection to the octal number. + + The octal number is between 0 and 777. The digits specify the + permissions for the user, the group and others. + + A 1 permits execution, a 2 permits writing, a 4 permits reading. + Add those numbers to combine them. So a 7 permits everything. + """ + + def execute(self): + mode_str = self.rest(1) + if not mode_str: + if not self.quantifier: + self.fm.notify("Syntax: chmod <octal number>", bad=True) + return + mode_str = str(self.quantifier) + + try: + mode = int(mode_str, 8) + if mode < 0 or mode > 0o777: + raise ValueError + except ValueError: + self.fm.notify("Need an octal number between 0 and 777!", bad=True) + return + + for fobj in self.fm.thistab.get_selection(): + try: + os.chmod(fobj.path, mode) + except OSError as ex: + self.fm.notify(ex) + + # reloading directory. maybe its better to reload the selected + # files only. + self.fm.thisdir.content_outdated = True + + +class bulkrename(Command): + """:bulkrename + + This command opens a list of selected files in an external editor. + After you edit and save the file, it will generate a shell script + which does bulk renaming according to the changes you did in the file. + + This shell script is opened in an editor for you to review. + After you close it, it will be executed. + """ + + def execute(self): # pylint: disable=too-many-locals,too-many-statements + import sys + import tempfile + from ranger.container.file import File + from ranger.ext.shell_escape import shell_escape as esc + py3 = sys.version_info[0] >= 3 + + # Create and edit the file list + filenames = [f.relative_path for f in self.fm.thistab.get_selection()] + listfile = tempfile.NamedTemporaryFile(delete=False) + listpath = listfile.name + + if py3: + listfile.write("\n".join(filenames).encode("utf-8")) + else: + listfile.write("\n".join(filenames)) + listfile.close() + self.fm.execute_file([File(listpath)], app='editor') + listfile = open(listpath, 'r') + new_filenames = listfile.read().split("\n") + listfile.close() + os.unlink(listpath) + if all(a == b for a, b in zip(filenames, new_filenames)): + self.fm.notify("No renaming to be done!") + return + + # Generate script + cmdfile = tempfile.NamedTemporaryFile() + script_lines = [] + script_lines.append("# This file will be executed when you close the editor.\n") + script_lines.append("# Please double-check everything, clear the file to abort.\n") + script_lines.extend("mv -vi -- %s %s\n" % (esc(old), esc(new)) + for old, new in zip(filenames, new_filenames) if old != new) + script_content = "".join(script_lines) + if py3: + cmdfile.write(script_content.encode("utf-8")) + else: + cmdfile.write(script_content) + cmdfile.flush() + + # Open the script and let the user review it, then check if the script + # was modified by the user + self.fm.execute_file([File(cmdfile.name)], app='editor') + cmdfile.seek(0) + script_was_edited = (script_content != cmdfile.read()) + + # Do the renaming + self.fm.run(['/bin/sh', cmdfile.name], flags='w') + cmdfile.close() + + # Retag the files, but only if the script wasn't changed during review, + # because only then we know which are the source and destination files. + if not script_was_edited: + tags_changed = False + for old, new in zip(filenames, new_filenames): + if old != new: + oldpath = self.fm.thisdir.path + '/' + old + newpath = self.fm.thisdir.path + '/' + new + if oldpath in self.fm.tags: + old_tag = self.fm.tags.tags[oldpath] + self.fm.tags.remove(oldpath) + self.fm.tags.tags[newpath] = old_tag + tags_changed = True + if tags_changed: + self.fm.tags.dump() + else: + fm.notify("files have not been retagged") + + +class relink(Command): + """:relink <newpath> + + Changes the linked path of the currently highlighted symlink to <newpath> + """ + + def execute(self): + new_path = self.rest(1) + tfile = self.fm.thisfile + + if not new_path: + return self.fm.notify('Syntax: relink <newpath>', bad=True) + + if not tfile.is_link: + return self.fm.notify('%s is not a symlink!' % tfile.relative_path, bad=True) + + if new_path == os.readlink(tfile.path): + return None + + try: + os.remove(tfile.path) + os.symlink(new_path, tfile.path) + except OSError as err: + self.fm.notify(err) + + self.fm.reset() + self.fm.thisdir.pointed_obj = tfile + self.fm.thisfile = tfile + + return None + + def tab(self, tabnum): + if not self.rest(1): + return self.line + os.readlink(self.fm.thisfile.path) + return self._tab_directory_content() + + +class help_(Command): + """:help + + Display ranger's manual page. + """ + name = 'help' + + def execute(self): + def callback(answer): + if answer == "q": + return + elif answer == "m": + self.fm.display_help() + elif answer == "c": + self.fm.dump_commands() + elif answer == "k": + self.fm.dump_keybindings() + elif answer == "s": + self.fm.dump_settings() + + self.fm.ui.console.ask( + "View [m]an page, [k]ey bindings, [c]ommands or [s]ettings? (press q to abort)", + callback, + list("mqkcs") + ) + + +class copymap(Command): + """:copymap <keys> <newkeys1> [<newkeys2>...] + + Copies a "browser" keybinding from <keys> to <newkeys> + """ + context = 'browser' + + def execute(self): + if not self.arg(1) or not self.arg(2): + return self.fm.notify("Not enough arguments", bad=True) + + for arg in self.args[2:]: + self.fm.ui.keymaps.copy(self.context, self.arg(1), arg) + + return None + + +class copypmap(copymap): + """:copypmap <keys> <newkeys1> [<newkeys2>...] + + Copies a "pager" keybinding from <keys> to <newkeys> + """ + context = 'pager' + + +class copycmap(copymap): + """:copycmap <keys> <newkeys1> [<newkeys2>...] + + Copies a "console" keybinding from <keys> to <newkeys> + """ + context = 'console' + + +class copytmap(copymap): + """:copycmap <keys> <newkeys1> [<newkeys2>...] + + Copies a "taskview" keybinding from <keys> to <newkeys> + """ + context = 'taskview' + + +class unmap(Command): + """:unmap <keys> [<keys2>, ...] + + Remove the given "browser" mappings + """ + context = 'browser' + + def execute(self): + for arg in self.args[1:]: + self.fm.ui.keymaps.unbind(self.context, arg) + + +class cunmap(unmap): + """:cunmap <keys> [<keys2>, ...] + + Remove the given "console" mappings + """ + context = 'browser' + + +class punmap(unmap): + """:punmap <keys> [<keys2>, ...] + + Remove the given "pager" mappings + """ + context = 'pager' + + +class tunmap(unmap): + """:tunmap <keys> [<keys2>, ...] + + Remove the given "taskview" mappings + """ + context = 'taskview' + + +class map_(Command): + """:map <keysequence> <command> + + Maps a command to a keysequence in the "browser" context. + + Example: + map j move down + map J move down 10 + """ + name = 'map' + context = 'browser' + resolve_macros = False + + def execute(self): + if not self.arg(1) or not self.arg(2): + self.fm.notify("Syntax: {0} <keysequence> <command>".format(self.get_name()), bad=True) + return + + self.fm.ui.keymaps.bind(self.context, self.arg(1), self.rest(2)) + + +class cmap(map_): + """:cmap <keysequence> <command> + + Maps a command to a keysequence in the "console" context. + + Example: + cmap <ESC> console_close + cmap <C-x> console_type test + """ + context = 'console' + + +class tmap(map_): + """:tmap <keysequence> <command> + + Maps a command to a keysequence in the "taskview" context. + """ + context = 'taskview' + + +class pmap(map_): + """:pmap <keysequence> <command> + + Maps a command to a keysequence in the "pager" context. + """ + context = 'pager' + + +class scout(Command): + """:scout [-FLAGS...] <pattern> + + Swiss army knife command for searching, traveling and filtering files. + + Flags: + -a Automatically open a file on unambiguous match + -e Open the selected file when pressing enter + -f Filter files that match the current search pattern + -g Interpret pattern as a glob pattern + -i Ignore the letter case of the files + -k Keep the console open when changing a directory with the command + -l Letter skipping; e.g. allow "rdme" to match the file "readme" + -m Mark the matching files after pressing enter + -M Unmark the matching files after pressing enter + -p Permanent filter: hide non-matching files after pressing enter + -r Interpret pattern as a regular expression pattern + -s Smart case; like -i unless pattern contains upper case letters + -t Apply filter and search pattern as you type + -v Inverts the match + + Multiple flags can be combined. For example, ":scout -gpt" would create + a :filter-like command using globbing. + """ + # pylint: disable=bad-whitespace + AUTO_OPEN = 'a' + OPEN_ON_ENTER = 'e' + FILTER = 'f' + SM_GLOB = 'g' + IGNORE_CASE = 'i' + KEEP_OPEN = 'k' + SM_LETTERSKIP = 'l' + MARK = 'm' + UNMARK = 'M' + PERM_FILTER = 'p' + SM_REGEX = 'r' + SMART_CASE = 's' + AS_YOU_TYPE = 't' + INVERT = 'v' + # pylint: enable=bad-whitespace + + def __init__(self, *args, **kwargs): + super(scout, self).__init__(*args, **kwargs) + self._regex = None + self.flags, self.pattern = self.parse_flags() + + def execute(self): # pylint: disable=too-many-branches + thisdir = self.fm.thisdir + flags = self.flags + pattern = self.pattern + regex = self._build_regex() + count = self._count(move=True) + + self.fm.thistab.last_search = regex + self.fm.set_search_method(order="search") + + if (self.MARK in flags or self.UNMARK in flags) and thisdir.files: + value = flags.find(self.MARK) > flags.find(self.UNMARK) + if self.FILTER in flags: + for fobj in thisdir.files: + thisdir.mark_item(fobj, value) + else: + for fobj in thisdir.files: + if regex.search(fobj.relative_path): + thisdir.mark_item(fobj, value) + + if self.PERM_FILTER in flags: + thisdir.filter = regex if pattern else None + + # clean up: + self.cancel() + + if self.OPEN_ON_ENTER in flags or \ + (self.AUTO_OPEN in flags and count == 1): + if pattern == '..': + self.fm.cd(pattern) + else: + self.fm.move(right=1) + if self.quickly_executed: + self.fm.block_input(0.5) + + if self.KEEP_OPEN in flags and thisdir != self.fm.thisdir: + # reopen the console: + if not pattern: + self.fm.open_console(self.line) + else: + self.fm.open_console(self.line[0:-len(pattern)]) + + if self.quickly_executed and thisdir != self.fm.thisdir and pattern != "..": + self.fm.block_input(0.5) + + def cancel(self): + self.fm.thisdir.temporary_filter = None + self.fm.thisdir.refilter() + + def quick(self): + asyoutype = self.AS_YOU_TYPE in self.flags + if self.FILTER in self.flags: + self.fm.thisdir.temporary_filter = self._build_regex() + if self.PERM_FILTER in self.flags and asyoutype: + self.fm.thisdir.filter = self._build_regex() + if self.FILTER in self.flags or self.PERM_FILTER in self.flags: + self.fm.thisdir.refilter() + if self._count(move=asyoutype) == 1 and self.AUTO_OPEN in self.flags: + return True + return False + + def tab(self, tabnum): + self._count(move=True, offset=tabnum) + + def _build_regex(self): + if self._regex is not None: + return self._regex + + frmat = "%s" + flags = self.flags + pattern = self.pattern + + if pattern == ".": + return re.compile("") + + # Handle carets at start and dollar signs at end separately + if pattern.startswith('^'): + pattern = pattern[1:] + frmat = "^" + frmat + if pattern.endswith('$'): + pattern = pattern[:-1] + frmat += "$" + + # Apply one of the search methods + if self.SM_REGEX in flags: + regex = pattern + elif self.SM_GLOB in flags: + regex = re.escape(pattern).replace("\\*", ".*").replace("\\?", ".") + elif self.SM_LETTERSKIP in flags: + regex = ".*".join(re.escape(c) for c in pattern) + else: + regex = re.escape(pattern) + + regex = frmat % regex + + # Invert regular expression if necessary + if self.INVERT in flags: + regex = "^(?:(?!%s).)*$" % regex + + # Compile Regular Expression + # pylint: disable=no-member + options = re.UNICODE + if self.IGNORE_CASE in flags or self.SMART_CASE in flags and \ + pattern.islower(): + options |= re.IGNORECASE + # pylint: enable=no-member + try: + self._regex = re.compile(regex, options) + except re.error: + self._regex = re.compile("") + return self._regex + + def _count(self, move=False, offset=0): + count = 0 + cwd = self.fm.thisdir + pattern = self.pattern + + if not pattern or not cwd.files: + return 0 + if pattern == '.': + return 0 + if pattern == '..': + return 1 + + deq = deque(cwd.files) + deq.rotate(-cwd.pointer - offset) + i = offset + regex = self._build_regex() + for fsobj in deq: + if regex.search(fsobj.relative_path): + count += 1 + if move and count == 1: + cwd.move(to=(cwd.pointer + i) % len(cwd.files)) + self.fm.thisfile = cwd.pointed_obj + if count > 1: + return count + i += 1 + + return count == 1 + + +class narrow(Command): + """ + :narrow + + Show only the files selected right now. If no files are selected, + disable narrowing. + """ + def execute(self): + if self.fm.thisdir.marked_items: + selection = [f.basename for f in self.fm.thistab.get_selection()] + self.fm.thisdir.narrow_filter = selection + else: + self.fm.thisdir.narrow_filter = None + self.fm.thisdir.refilter() + + +class filter_inode_type(Command): + """ + :filter_inode_type [dfl] + + Displays only the files of specified inode type. Parameters + can be combined. + + d display directories + f display files + l display links + """ + + def execute(self): + if not self.arg(1): + self.fm.thisdir.inode_type_filter = "" + else: + self.fm.thisdir.inode_type_filter = self.arg(1) + self.fm.thisdir.refilter() + + +class filter_stack(Command): + """ + :filter_stack ... + + Manages the filter stack. + + filter_stack add FILTER_TYPE ARGS... + filter_stack pop + filter_stack decompose + filter_stack rotate [N=1] + filter_stack clear + filter_stack show + """ + def execute(self): + from ranger.core.filter_stack import SIMPLE_FILTERS, FILTER_COMBINATORS + + subcommand = self.arg(1) + + if subcommand == "add": + try: + self.fm.thisdir.filter_stack.append( + SIMPLE_FILTERS[self.arg(2)](self.rest(3)) + ) + except KeyError: + FILTER_COMBINATORS[self.arg(2)](self.fm.thisdir.filter_stack) + elif subcommand == "pop": + self.fm.thisdir.filter_stack.pop() + elif subcommand == "decompose": + inner_filters = self.fm.thisdir.filter_stack.pop().decompose() + if inner_filters: + self.fm.thisdir.filter_stack.extend(inner_filters) + elif subcommand == "clear": + self.fm.thisdir.filter_stack = [] + elif subcommand == "rotate": + rotate_by = int(self.arg(2) or 1) + self.fm.thisdir.filter_stack = ( + self.fm.thisdir.filter_stack[-rotate_by:] + + self.fm.thisdir.filter_stack[:-rotate_by] + ) + elif subcommand == "show": + stack = list(map(str, self.fm.thisdir.filter_stack)) + pager = self.fm.ui.open_pager() + pager.set_source(["Filter stack: "] + stack) + pager.move(to=100, percentage=True) + return + else: + self.fm.notify( + "Unknown subcommand: {}".format(subcommand), + bad=True + ) + return + + self.fm.thisdir.refilter() + + +class grep(Command): + """:grep <string> + + Looks for a string in all marked files or directories + """ + + def execute(self): + if self.rest(1): + action = ['grep', '--line-number'] + action.extend(['-e', self.rest(1), '-r']) + action.extend(f.path for f in self.fm.thistab.get_selection()) + self.fm.execute_command(action, flags='p') + + +class flat(Command): + """ + :flat <level> + + Flattens the directory view up to the specified level. + + -1 fully flattened + 0 remove flattened view + """ + + def execute(self): + try: + level_str = self.rest(1) + level = int(level_str) + except ValueError: + level = self.quantifier + if level is None: + self.fm.notify("Syntax: flat <level>", bad=True) + return + if level < -1: + self.fm.notify("Need an integer number (-1, 0, 1, ...)", bad=True) + self.fm.thisdir.unload() + self.fm.thisdir.flat = level + self.fm.thisdir.load_content() + +# Version control commands +# -------------------------------- + + +class stage(Command): + """ + :stage + + Stage selected files for the corresponding version control system + """ + + def execute(self): + from ranger.ext.vcs import VcsError + + if self.fm.thisdir.vcs and self.fm.thisdir.vcs.track: + filelist = [f.path for f in self.fm.thistab.get_selection()] + try: + self.fm.thisdir.vcs.action_add(filelist) + except VcsError as ex: + self.fm.notify('Unable to stage files: {0}'.format(ex)) + self.fm.ui.vcsthread.process(self.fm.thisdir) + else: + self.fm.notify('Unable to stage files: Not in repository') + + +class unstage(Command): + """ + :unstage + + Unstage selected files for the corresponding version control system + """ + + def execute(self): + from ranger.ext.vcs import VcsError + + if self.fm.thisdir.vcs and self.fm.thisdir.vcs.track: + filelist = [f.path for f in self.fm.thistab.get_selection()] + try: + self.fm.thisdir.vcs.action_reset(filelist) + except VcsError as ex: + self.fm.notify('Unable to unstage files: {0}'.format(ex)) + self.fm.ui.vcsthread.process(self.fm.thisdir) + else: + self.fm.notify('Unable to unstage files: Not in repository') + +# Metadata commands +# -------------------------------- + + +class prompt_metadata(Command): + """ + :prompt_metadata <key1> [<key2> [<key3> ...]] + + Prompt the user to input metadata for multiple keys in a row. + """ + + _command_name = "meta" + _console_chain = None + + def execute(self): + prompt_metadata._console_chain = self.args[1:] + self._process_command_stack() + + def _process_command_stack(self): + if prompt_metadata._console_chain: + key = prompt_metadata._console_chain.pop() + self._fill_console(key) + else: + for col in self.fm.ui.browser.columns: + col.need_redraw = True + + def _fill_console(self, key): + metadata = self.fm.metadata.get_metadata(self.fm.thisfile.path) + if key in metadata and metadata[key]: + existing_value = metadata[key] + else: + existing_value = "" + text = "%s %s %s" % (self._command_name, key, existing_value) + self.fm.open_console(text, position=len(text)) + + +class meta(prompt_metadata): + """ + :meta <key> [<value>] + + Change metadata of a file. Deletes the key if value is empty. + """ + + def execute(self): + key = self.arg(1) + update_dict = dict() + update_dict[key] = self.rest(2) + selection = self.fm.thistab.get_selection() + for fobj in selection: + self.fm.metadata.set_metadata(fobj.path, update_dict) + self._process_command_stack() + + def tab(self, tabnum): + key = self.arg(1) + metadata = self.fm.metadata.get_metadata(self.fm.thisfile.path) + if key in metadata and metadata[key]: + return [" ".join([self.arg(0), self.arg(1), metadata[key]])] + return [self.arg(0) + " " + k for k in sorted(metadata) + if k.startswith(self.arg(1))] + + +class linemode(default_linemode): + """ + :linemode <mode> + + Change what is displayed as a filename. + + - "mode" may be any of the defined linemodes (see: ranger.core.linemode). + "normal" is mapped to "filename". + """ + + def execute(self): + mode = self.arg(1) + + if mode == "normal": + from ranger.core.linemode import DEFAULT_LINEMODE + mode = DEFAULT_LINEMODE + + if mode not in self.fm.thisfile.linemode_dict: + self.fm.notify("Unhandled linemode: `%s'" % mode, bad=True) + return + + self.fm.thisdir.set_linemode_of_children(mode) + + # Ask the browsercolumns to redraw + for col in self.fm.ui.browser.columns: + col.need_redraw = True + + +class yank(Command): + """:yank [name|dir|path] + + Copies the file's name (default), directory or path into both the primary X + selection and the clipboard. + """ + + modes = { + '': 'basename', + 'name_without_extension': 'basename_without_extension', + 'name': 'basename', + 'dir': 'dirname', + 'path': 'path', + } + + def execute(self): + import subprocess + + def clipboards(): + from ranger.ext.get_executables import get_executables + clipboard_managers = { + 'xclip': [ + ['xclip'], + ['xclip', '-selection', 'clipboard'], + ], + 'xsel': [ + ['xsel'], + ['xsel', '-b'], + ], + 'pbcopy': [ + ['pbcopy'], + ], + } + ordered_managers = ['pbcopy', 'xclip', 'xsel'] + executables = get_executables() + for manager in ordered_managers: + if manager in executables: + return clipboard_managers[manager] + return [] + + clipboard_commands = clipboards() + + mode = self.modes[self.arg(1)] + selection = self.get_selection_attr(mode) + + new_clipboard_contents = "\n".join(selection) + for command in clipboard_commands: + process = subprocess.Popen(command, universal_newlines=True, + stdin=subprocess.PIPE) + process.communicate(input=new_clipboard_contents) + + def get_selection_attr(self, attr): + return [getattr(item, attr) for item in + self.fm.thistab.get_selection()] + + def tab(self, tabnum): + return ( + self.start(1) + mode for mode + in sorted(self.modes.keys()) + if mode + ) diff --git a/dotfiles/common/.config/ranger/rc.conf b/dotfiles/common/.config/ranger/rc.conf new file mode 100644 index 0000000..89d09ff --- /dev/null +++ b/dotfiles/common/.config/ranger/rc.conf @@ -0,0 +1,790 @@ + +# =================================================================== +# This file contains the default startup commands for ranger. +# To change them, it is recommended to create either /etc/ranger/rc.conf +# (system-wide) or ~/.config/ranger/rc.conf (per user) and add your custom +# commands there. +# +# If you copy this whole file there, you may want to set the environment +# variable RANGER_LOAD_DEFAULT_RC to FALSE to avoid loading it twice. +# +# The purpose of this file is mainly to define keybindings and settings. +# For running more complex python code, please create a plugin in "plugins/" or +# a command in "commands.py". +# +# Each line is a command that will be run before the user interface +# is initialized. As a result, you can not use commands which rely +# on the UI such as :delete or :mark. +# =================================================================== + +# =================================================================== +# == Options +# =================================================================== + +# Which viewmode should be used? Possible values are: +# miller: Use miller columns which show multiple levels of the hierarchy +# multipane: Midnight-commander like multipane view showing all tabs next +# to each other +set viewmode miller +#set viewmode multipane + +# How many columns are there, and what are their relative widths? +set column_ratios 1,3,4 + +# Which files should be hidden? (regular expression) +set hidden_filter ^\.|\.(?:pyc|pyo|bak|swp)$|^lost\+found$|^__(py)?cache__$ + +# Show hidden files? You can toggle this by typing 'zh' +set show_hidden false + +# Ask for a confirmation when running the "delete" command? +# Valid values are "always", "never", "multiple" (default) +# With "multiple", ranger will ask only if you delete multiple files at once. +set confirm_on_delete multiple + +# Use non-default path for file preview script? +# ranger ships with scope.sh, a script that calls external programs (see +# README.md for dependencies) to preview images, archives, etc. +set preview_script ~/.config/ranger/scope.sh + +# Use the external preview script or display simple plain text or image previews? +set use_preview_script true + +# Automatically count files in the directory, even before entering them? +set automatically_count_files true + +# Open all images in this directory when running certain image viewers +# like feh or sxiv? You can still open selected files by marking them. +set open_all_images true + +# Be aware of version control systems and display information. +set vcs_aware true + +# State of the four backends git, hg, bzr, svn. The possible states are +# disabled, local (only show local info), enabled (show local and remote +# information). +set vcs_backend_git enabled +set vcs_backend_hg disabled +set vcs_backend_bzr disabled +set vcs_backend_svn disabled + +# Use one of the supported image preview protocols +set preview_images true + +# Set the preview image method. Supported methods: +# +# * w3m (default): +# Preview images in full color with the external command "w3mimgpreview"? +# This requires the console web browser "w3m" and a supported terminal. +# It has been successfully tested with "xterm" and "urxvt" without tmux. +# +# * iterm2: +# Preview images in full color using iTerm2 image previews +# (http://iterm2.com/images.html). This requires using iTerm2 compiled +# with image preview support. +# +# This feature relies on the dimensions of the terminal's font. By default, a +# width of 8 and height of 11 are used. To use other values, set the options +# iterm2_font_width and iterm2_font_height to the desired values. +# +# * terminology: +# Previews images in full color in the terminology terminal emulator. +# Supports a wide variety of formats, even vector graphics like svg. +# +# * urxvt: +# Preview images in full color using urxvt image backgrounds. This +# requires using urxvt compiled with pixbuf support. +# +# * urxvt-full: +# The same as urxvt but utilizing not only the preview pane but the +# whole terminal window. +# +# * kitty: +# Preview images in full color using kitty image protocol. +# Requires python PIL or pillow library. +# If ranger does not share the local filesystem with kitty +# the transfer method is changed to encode the whole image; +# while slower, this allows remote previews, +# for example during an ssh session. +# Tmux is unsupported. +set preview_images_method ueberzug + +# Delay in seconds before displaying an image with the w3m method. +# Increase it in case of experiencing display corruption. +set w3m_delay 0.05 + +# Default iTerm2 font size (see: preview_images_method: iterm2) +set iterm2_font_width 8 +set iterm2_font_height 11 + +# Use a unicode "..." character to mark cut-off filenames? +set unicode_ellipsis false + +# BIDI support - try to properly display file names in RTL languages (Hebrew, Arabic). +# Requires the python-bidi pip package +set bidi_support false + +# Show dotfiles in the bookmark preview box? +set show_hidden_bookmarks true + +# Which colorscheme to use? These colorschemes are available by default: +# default, jungle, snow, solarized +# set colorscheme gruvbox + +# Preview files on the rightmost column? +# And collapse (shrink) the last column if there is nothing to preview? +set preview_files true +set preview_directories true +set collapse_preview true + +# Save the console history on exit? +set save_console_history true + +# Draw the status bar on top of the browser window (default: bottom) +set status_bar_on_top false + +# Draw a progress bar in the status bar which displays the average state of all +# currently running tasks which support progress bars? +set draw_progress_bar_in_status_bar true + +# Draw borders around columns? (separators, outline, both, or none) +# Separators are vertical lines between columns. +# Outline draws a box around all the columns. +# Both combines the two. +set draw_borders none + +# Display the directory name in tabs? +set dirname_in_tabs false + +# Enable the mouse support? +set mouse_enabled true + +# Display the file size in the main column or status bar? +set display_size_in_main_column true +set display_size_in_status_bar true + +# Display the free disk space in the status bar? +set display_free_space_in_status_bar true + +# Display files tags in all columns or only in main column? +set display_tags_in_all_columns true + +# Set a title for the window? +set update_title false + +# Set the title to "ranger" in the tmux program? +set update_tmux_title true + +# Shorten the title if it gets long? The number defines how many +# directories are displayed at once, 0 turns off this feature. +set shorten_title 3 + +# Show hostname in titlebar? +set hostname_in_titlebar true + +# Abbreviate $HOME with ~ in the titlebar (first line) of ranger? +set tilde_in_titlebar false + +# How many directory-changes or console-commands should be kept in history? +set max_history_size 20 +set max_console_history_size 50 + +# Try to keep so much space between the top/bottom border when scrolling: +set scroll_offset 8 + +# Flush the input after each key hit? (Noticeable when ranger lags) +set flushinput true + +# Padding on the right when there's no preview? +# This allows you to click into the space to run the file. +set padding_right true + +# Save bookmarks (used with mX and `X) instantly? +# This helps to synchronize bookmarks between multiple ranger +# instances but leads to *slight* performance loss. +# When false, bookmarks are saved when ranger is exited. +set autosave_bookmarks true + +# Save the "`" bookmark to disk. This can be used to switch to the last +# directory by typing "``". +set save_backtick_bookmark true + +# You can display the "real" cumulative size of directories by using the +# command :get_cumulative_size or typing "dc". The size is expensive to +# calculate and will not be updated automatically. You can choose +# to update it automatically though by turning on this option: +set autoupdate_cumulative_size false + +# Turning this on makes sense for screen readers: +set show_cursor false + +# One of: size, natural, basename, atime, ctime, mtime, type, random +set sort natural + +# Additional sorting options +set sort_reverse false +set sort_case_insensitive true +set sort_directories_first true +set sort_unicode false + +# Enable this if key combinations with the Alt Key don't work for you. +# (Especially on xterm) +set xterm_alt_key false + +# Whether to include bookmarks in cd command +set cd_bookmarks true + +# Changes case sensitivity for the cd command tab completion +set cd_tab_case sensitive + +# Use fuzzy tab completion with the "cd" command. For example, +# ":cd /u/lo/b<tab>" expands to ":cd /usr/local/bin". +set cd_tab_fuzzy false + +# Avoid previewing files larger than this size, in bytes. Use a value of 0 to +# disable this feature. +set preview_max_size 0 + +# The key hint lists up to this size have their sublists expanded. +# Otherwise the submaps are replaced with "...". +set hint_collapse_threshold 10 + +# Add the highlighted file to the path in the titlebar +set show_selection_in_titlebar true + +# The delay that ranger idly waits for user input, in milliseconds, with a +# resolution of 100ms. Lower delay reduces lag between directory updates but +# increases CPU load. +set idle_delay 2000 + +# When the metadata manager module looks for metadata, should it only look for +# a ".metadata.json" file in the current directory, or do a deep search and +# check all directories above the current one as well? +set metadata_deep_search false + +# Clear all existing filters when leaving a directory +set clear_filters_on_dir_change false + +# Disable displaying line numbers in main column. +# Possible values: false, absolute, relative. +set line_numbers false + +# When line_numbers=relative show the absolute line number in the +# current line. +set relative_current_zero false + +# Start line numbers from 1 instead of 0 +set one_indexed false + +# Save tabs on exit +set save_tabs_on_exit false + +# Enable scroll wrapping - moving down while on the last item will wrap around to +# the top and vice versa. +set wrap_scroll false + +# Set the global_inode_type_filter to nothing. Possible options: d, f and l for +# directories, files and symlinks respectively. +set global_inode_type_filter + +# This setting allows to freeze the list of files to save I/O bandwidth. It +# should be 'false' during start-up, but you can toggle it by pressing F. +set freeze_files false + +# =================================================================== +# == Local Options +# =================================================================== +# You can set local options that only affect a single directory. + +# Examples: +# setlocal path=~/downloads sort mtime + +# =================================================================== +# == Command Aliases in the Console +# =================================================================== + +alias e edit +alias q quit +alias q! quit! +alias qa quitall +alias qa! quitall! +alias qall quitall +alias qall! quitall! +alias setl setlocal + +alias filter scout -prts +alias find scout -aets +alias mark scout -mr +alias unmark scout -Mr +alias search scout -rs +alias search_inc scout -rts +alias travel scout -aefklst + +# =================================================================== +# == Define keys for the browser +# =================================================================== + +# Basic +map Q quitall +map q quit +copymap q ZZ ZQ + +map R reload_cwd +map F set freeze_files! +map <C-r> reset +map <C-l> redraw_window +map <C-c> abort +map <esc> change_mode normal +map ~ set viewmode! + +map i display_file +map ? help +map W display_log +map w taskview_open +map S shell $SHELL + +map : console +map ; console +map ! console shell%space +map @ console -p6 shell %%s +map # console shell -p%space +map s console shell%space +map r chain draw_possible_programs; console open_with%%space +map f console find%space +map cd console cd%space + +map <C-p> chain console; eval fm.ui.console.history_move(-1) + +# Change the line mode +map Mf linemode filename +map Mi linemode fileinfo +map Mm linemode mtime +map Mp linemode permissions +map Ms linemode sizemtime +map Mt linemode metatitle + +# Tagging / Marking +map t tag_toggle +map ut tag_remove +map "<any> tag_toggle tag=%any +map <Space> mark_files toggle=True +map v mark_files all=True toggle=True +map uv mark_files all=True val=False +map V toggle_visual_mode +map uV toggle_visual_mode reverse=True + +# For the nostalgics: Midnight Commander bindings +map <F1> help +map <F2> rename_append +map <F3> display_file +map <F4> edit +map <F5> copy +map <F6> cut +map <F7> console mkdir%space +map <F8> console delete +map <F10> exit + +# In case you work on a keyboard with dvorak layout +map <UP> move up=1 +map <DOWN> move down=1 +map <LEFT> move left=1 +map <RIGHT> move right=1 +map <HOME> move to=0 +map <END> move to=-1 +map <PAGEDOWN> move down=1 pages=True +map <PAGEUP> move up=1 pages=True +map <CR> move right=1 +#map <DELETE> console delete +map <INSERT> console touch%space + +# VIM-like +copymap <UP> k +copymap <DOWN> j +copymap <LEFT> h +copymap <RIGHT> l +copymap <HOME> gg +copymap <END> G +copymap <PAGEDOWN> <C-F> +copymap <PAGEUP> <C-B> + +map J move down=0.5 pages=True +map K move up=0.5 pages=True +copymap J <C-D> +copymap K <C-U> + +# Jumping around +map H history_go -1 +map L history_go 1 +map ] move_parent 1 +map [ move_parent -1 +map } traverse +map { traverse_backwards +map ) jump_non + +map gh cd ~ +map ge cd /etc +map gu cd /usr +map gd cd /dev +map gl cd -r . +map gL cd -r %f +map go cd /opt +map gv cd /var +map gi eval fm.cd('/run/media/' + os.getenv('USER')) +map gM cd /media +map gs cd /srv +map gp cd /tmp +map gR eval fm.cd(ranger.RANGERDIR) +map g/ cd / +map g? cd /usr/share/doc/ranger + +# External Programs +map E edit +map du shell -p du --max-depth=1 -h --apparent-size +map dU shell -p du --max-depth=1 -h --apparent-size | sort -rh +map yp yank path +map yd yank dir +map yn yank name +map y. yank name_without_extension + +# Filesystem Operations +map = chmod + +map cw console rename%space +map a rename_append +map A eval fm.open_console('rename ' + fm.thisfile.relative_path.replace("%", "%%")) +map I eval fm.open_console('rename ' + fm.thisfile.relative_path.replace("%", "%%"), position=7) + +map pp paste +map po paste overwrite=True +map pP paste append=True +map pO paste overwrite=True append=True +map pl paste_symlink relative=False +map pL paste_symlink relative=True +map phl paste_hardlink +map pht paste_hardlinked_subtree + +map dd console delete + +map da cut mode=add +map dr cut mode=remove +map dt cut mode=toggle + +map yy copy +map uy uncut +map ya copy mode=add +map yr copy mode=remove +map yt copy mode=toggle + +# Temporary workarounds +map dgg eval fm.cut(dirarg=dict(to=0), narg=quantifier) +map dG eval fm.cut(dirarg=dict(to=-1), narg=quantifier) +map dj eval fm.cut(dirarg=dict(down=1), narg=quantifier) +map dk eval fm.cut(dirarg=dict(up=1), narg=quantifier) +map ygg eval fm.copy(dirarg=dict(to=0), narg=quantifier) +map yG eval fm.copy(dirarg=dict(to=-1), narg=quantifier) +map yj eval fm.copy(dirarg=dict(down=1), narg=quantifier) +map yk eval fm.copy(dirarg=dict(up=1), narg=quantifier) + +# Searching +map / console search%space +map n search_next +map N search_next forward=False +map ct search_next order=tag +map cs search_next order=size +map ci search_next order=mimetype +map cc search_next order=ctime +map cm search_next order=mtime +map ca search_next order=atime + +# Tabs +map <C-n> tab_new +map <C-w> tab_close +map <TAB> tab_move 1 +map <S-TAB> tab_move -1 +map <A-Right> tab_move 1 +map <A-Left> tab_move -1 +map gt tab_move 1 +map gT tab_move -1 +map gn tab_new +map gc tab_close +map uq tab_restore +map <a-1> tab_open 1 +map <a-2> tab_open 2 +map <a-3> tab_open 3 +map <a-4> tab_open 4 +map <a-5> tab_open 5 +map <a-6> tab_open 6 +map <a-7> tab_open 7 +map <a-8> tab_open 8 +map <a-9> tab_open 9 +map <a-r> tab_shift 1 +map <a-l> tab_shift -1 + +# Sorting +map or set sort_reverse! +map oz set sort=random +map os chain set sort=size; set sort_reverse=False +map ob chain set sort=basename; set sort_reverse=False +map on chain set sort=natural; set sort_reverse=False +map om chain set sort=mtime; set sort_reverse=False +map oc chain set sort=ctime; set sort_reverse=False +map oa chain set sort=atime; set sort_reverse=False +map ot chain set sort=type; set sort_reverse=False +map oe chain set sort=extension; set sort_reverse=False + +map oS chain set sort=size; set sort_reverse=True +map oB chain set sort=basename; set sort_reverse=True +map oN chain set sort=natural; set sort_reverse=True +map oM chain set sort=mtime; set sort_reverse=True +map oC chain set sort=ctime; set sort_reverse=True +map oA chain set sort=atime; set sort_reverse=True +map oT chain set sort=type; set sort_reverse=True +map oE chain set sort=extension; set sort_reverse=True + +map dc get_cumulative_size + +# Settings +map zc set collapse_preview! +map zd set sort_directories_first! +map zh set show_hidden! +map <C-h> set show_hidden! +copymap <C-h> <backspace> +copymap <backspace> <backspace2> +map zI set flushinput! +map zi set preview_images! +map zm set mouse_enabled! +map zp set preview_files! +map zP set preview_directories! +map zs set sort_case_insensitive! +map zu set autoupdate_cumulative_size! +map zv set use_preview_script! +map zf console filter%space +copymap zf zz + +# Filter stack +map .n console filter_stack add name%space +map .m console filter_stack add mime%space +map .d filter_stack add type d +map .f filter_stack add type f +map .l filter_stack add type l +map .| filter_stack add or +map .& filter_stack add and +map .! filter_stack add not +map .r console filter_stack rotate +map .c filter_stack clear +map .* filter_stack decompose +map .p filter_stack pop +map .. filter_stack show + +# Bookmarks +map `<any> enter_bookmark %any +map '<any> enter_bookmark %any +map m<any> set_bookmark %any +map um<any> unset_bookmark %any + +map m<bg> draw_bookmarks +copymap m<bg> um<bg> `<bg> '<bg> + +# Generate all the chmod bindings with some python help: +eval for arg in "rwxXst": cmd("map +u{0} shell -f chmod u+{0} %s".format(arg)) +eval for arg in "rwxXst": cmd("map +g{0} shell -f chmod g+{0} %s".format(arg)) +eval for arg in "rwxXst": cmd("map +o{0} shell -f chmod o+{0} %s".format(arg)) +eval for arg in "rwxXst": cmd("map +a{0} shell -f chmod a+{0} %s".format(arg)) +eval for arg in "rwxXst": cmd("map +{0} shell -f chmod u+{0} %s".format(arg)) + +eval for arg in "rwxXst": cmd("map -u{0} shell -f chmod u-{0} %s".format(arg)) +eval for arg in "rwxXst": cmd("map -g{0} shell -f chmod g-{0} %s".format(arg)) +eval for arg in "rwxXst": cmd("map -o{0} shell -f chmod o-{0} %s".format(arg)) +eval for arg in "rwxXst": cmd("map -a{0} shell -f chmod a-{0} %s".format(arg)) +eval for arg in "rwxXst": cmd("map -{0} shell -f chmod u-{0} %s".format(arg)) + +# =================================================================== +# == Define keys for the console +# =================================================================== +# Note: Unmapped keys are passed directly to the console. + +# Basic +cmap <tab> eval fm.ui.console.tab() +cmap <s-tab> eval fm.ui.console.tab(-1) +cmap <ESC> eval fm.ui.console.close() +cmap <CR> eval fm.ui.console.execute() +cmap <C-l> redraw_window + +copycmap <ESC> <C-c> +copycmap <CR> <C-j> + +# Move around +cmap <up> eval fm.ui.console.history_move(-1) +cmap <down> eval fm.ui.console.history_move(1) +cmap <left> eval fm.ui.console.move(left=1) +cmap <right> eval fm.ui.console.move(right=1) +cmap <home> eval fm.ui.console.move(right=0, absolute=True) +cmap <end> eval fm.ui.console.move(right=-1, absolute=True) +cmap <a-b> eval fm.ui.console.move_word(left=1) +cmap <a-f> eval fm.ui.console.move_word(right=1) + +copycmap <a-b> <a-left> +copycmap <a-f> <a-right> + +# Line Editing +cmap <backspace> eval fm.ui.console.delete(-1) +cmap <delete> eval fm.ui.console.delete(0) +cmap <C-w> eval fm.ui.console.delete_word() +cmap <A-d> eval fm.ui.console.delete_word(backward=False) +cmap <C-k> eval fm.ui.console.delete_rest(1) +cmap <C-u> eval fm.ui.console.delete_rest(-1) +cmap <C-y> eval fm.ui.console.paste() + +# And of course the emacs way +copycmap <ESC> <C-g> +copycmap <up> <C-p> +copycmap <down> <C-n> +copycmap <left> <C-b> +copycmap <right> <C-f> +copycmap <home> <C-a> +copycmap <end> <C-e> +copycmap <delete> <C-d> +copycmap <backspace> <C-h> + +# Note: There are multiple ways to express backspaces. <backspace> (code 263) +# and <backspace2> (code 127). To be sure, use both. +copycmap <backspace> <backspace2> + +# This special expression allows typing in numerals: +cmap <allow_quantifiers> false + +# =================================================================== +# == Pager Keybindings +# =================================================================== + +# Movement +pmap <down> pager_move down=1 +pmap <up> pager_move up=1 +pmap <left> pager_move left=4 +pmap <right> pager_move right=4 +pmap <home> pager_move to=0 +pmap <end> pager_move to=-1 +pmap <pagedown> pager_move down=1.0 pages=True +pmap <pageup> pager_move up=1.0 pages=True +pmap <C-d> pager_move down=0.5 pages=True +pmap <C-u> pager_move up=0.5 pages=True + +copypmap <UP> k <C-p> +copypmap <DOWN> j <C-n> <CR> +copypmap <LEFT> h +copypmap <RIGHT> l +copypmap <HOME> g +copypmap <END> G +copypmap <C-d> d +copypmap <C-u> u +copypmap <PAGEDOWN> n f <C-F> <Space> +copypmap <PAGEUP> p b <C-B> + +# Basic +pmap <C-l> redraw_window +pmap <ESC> pager_close +copypmap <ESC> q Q i <F3> +pmap E edit_file + +# =================================================================== +# == Taskview Keybindings +# =================================================================== + +# Movement +tmap <up> taskview_move up=1 +tmap <down> taskview_move down=1 +tmap <home> taskview_move to=0 +tmap <end> taskview_move to=-1 +tmap <pagedown> taskview_move down=1.0 pages=True +tmap <pageup> taskview_move up=1.0 pages=True +tmap <C-d> taskview_move down=0.5 pages=True +tmap <C-u> taskview_move up=0.5 pages=True + +copytmap <UP> k <C-p> +copytmap <DOWN> j <C-n> <CR> +copytmap <HOME> g +copytmap <END> G +copytmap <C-u> u +copytmap <PAGEDOWN> n f <C-F> <Space> +copytmap <PAGEUP> p b <C-B> + +# Changing priority and deleting tasks +tmap J eval -q fm.ui.taskview.task_move(-1) +tmap K eval -q fm.ui.taskview.task_move(0) +# tmap dd eval -q fm.ui.taskview.task_remove() +tmap <pagedown> eval -q fm.ui.taskview.task_move(-1) +tmap <pageup> eval -q fm.ui.taskview.task_move(0) +tmap <delete> eval -q fm.ui.taskview.task_remove() + +# Basic +tmap <C-l> redraw_window +tmap <ESC> taskview_close +copytmap <ESC> q Q w <C-c> + +######### cjennings + +## image transformation +map r9 shell convert %s -rotate 90 %s + + +## navigation and file management +map gslr cd /media/remote0/3 +map mslr shell mv /media/remote0/3 +map cslr shell cp /media/remote0/3 + +### MAIN DIRECTORIES +map mdx shell mv %s ~/documents +map cdx shell cp %s ~/documents +map gdx cd ~/documents + +map gdr cd ~/documents/reference +map mdr shell mv %s ~/documents/reference +map cdr shell cp %s ~/documents/reference + +map mdl shell mv %d ~/downloads +map cdl shell cp %d ~/downloads +map gdl cd ~/downloads + +map mpx shell mv %s ~/pictures +map cpx shell cp %s ~/pictures +map gpx cd ~/pictures + +map gps cd ~/pictures/screenshots +map mps shell mv %s ~/pictures/screenshots +map cps shell cp %s ~/pictures/screenshots + +map gpw cd ~/pictures/wallpaper +map mpw shell mv %s ~/pictures/wallpaper +map cpw shell cp %s ~/pictures/wallpaper + +map gmx cd ~/music + +map gvx cd ~/videos +map cvx shell cp %s ~/videos +map mvx shell mv %s ~/videos + +## CONFIG +map grc cd ~/.config/ranger +map crc shell cp %s ~/.config/ranger +map mrc shell mv %s ~/.config/ranger + +### OPEN WITH +# open with alternate video player +map owm shell mpv %s + +# open with gimp +map owg shell gimp %s + +# open with zathura +map owz shell zathura %s + +### MISC ACTIONS +# set background wallpaper using feh +map bg shell feh --bg-fill %s && notify-send "ranger" "wallpaper updated" + +# delete +map dx shell rm -f %s + +# remap cut/uncut +map xx cut +map ux uncut diff --git a/dotfiles/common/.config/ranger/rifle.conf b/dotfiles/common/.config/ranger/rifle.conf new file mode 100644 index 0000000..8cc0ce7 --- /dev/null +++ b/dotfiles/common/.config/ranger/rifle.conf @@ -0,0 +1,257 @@ +# vim: ft=cfg +# +# This is the configuration file of "rifle", ranger's file executor/opener. +# Each line consists of conditions and a command. For each line the conditions +# are checked and if they are met, the respective command is run. +# +# Syntax: +# <condition1> , <condition2> , ... = command +# +# The command can contain these environment variables: +# $1-$9 | The n-th selected file +# $@ | All selected files +# +# If you use the special command "ask", rifle will ask you what program to run. +# +# Prefixing a condition with "!" will negate its result. +# These conditions are currently supported: +# match <regexp> | The regexp matches $1 +# ext <regexp> | The regexp matches the extension of $1 +# mime <regexp> | The regexp matches the mime type of $1 +# name <regexp> | The regexp matches the basename of $1 +# path <regexp> | The regexp matches the absolute path of $1 +# has <program> | The program is installed (i.e. located in $PATH) +# env <variable> | The environment variable "variable" is non-empty +# file | $1 is a file +# directory | $1 is a directory +# number <n> | change the number of this command to n +# terminal | stdin, stderr and stdout are connected to a terminal +# X | $DISPLAY is not empty (i.e. Xorg runs) +# +# There are also pseudo-conditions which have a "side effect": +# flag <flags> | Change how the program is run. See below. +# label <label> | Assign a label or name to the command so it can +# | be started with :open_with <label> in ranger +# | or `rifle -p <label>` in the standalone executable. +# else | Always true. +# +# Flags are single characters which slightly transform the command: +# f | Fork the program, make it run in the background. +# | New command = setsid $command >& /dev/null & +# r | Execute the command with root permissions +# | New command = sudo $command +# t | Run the program in a new terminal. If $TERMCMD is not defined, +# | rifle will attempt to extract it from $TERM. +# | New command = $TERMCMD -e $command +# Note: The "New command" serves only as an illustration, the exact +# implementation may differ. +# Note: When using rifle in ranger, there is an additional flag "c" for +# only running the current file even if you have marked multiple files. + +#------------------------------------------- +# Websites +#------------------------------------------- +# Rarely installed browsers get higher priority; It is assumed that if you +# install a rare browser, you probably use it. Firefox/konqueror/w3m on the +# other hand are often only installed as fallback browsers. +ext x?html?, has surf, X, flag f = surf -- file://"$1" +ext x?html?, has vimprobable, X, flag f = vimprobable -- "$@" +ext x?html?, has vimprobable2, X, flag f = vimprobable2 -- "$@" +ext x?html?, has qutebrowser, X, flag f = qutebrowser -- "$@" +ext x?html?, has dwb, X, flag f = dwb -- "$@" +ext x?html?, has jumanji, X, flag f = jumanji -- "$@" +ext x?html?, has luakit, X, flag f = luakit -- "$@" +ext x?html?, has uzbl, X, flag f = uzbl -- "$@" +ext x?html?, has uzbl-tabbed, X, flag f = uzbl-tabbed -- "$@" +ext x?html?, has uzbl-browser, X, flag f = uzbl-browser -- "$@" +ext x?html?, has uzbl-core, X, flag f = uzbl-core -- "$@" +ext x?html?, has midori, X, flag f = midori -- "$@" +ext x?html?, has chromium-browser, X, flag f = chromium-browser -- "$@" +ext x?html?, has chromium, X, flag f = chromium -- "$@" +ext x?html?, has google-chrome, X, flag f = google-chrome -- "$@" +ext x?html?, has opera, X, flag f = opera -- "$@" +ext x?html?, has firefox, X, flag f = firefox -- "$@" +ext x?html?, has seamonkey, X, flag f = seamonkey -- "$@" +ext x?html?, has iceweasel, X, flag f = iceweasel -- "$@" +ext x?html?, has epiphany, X, flag f = epiphany -- "$@" +ext x?html?, has konqueror, X, flag f = konqueror -- "$@" +ext x?html?, has elinks, terminal = elinks "$@" +ext x?html?, has links2, terminal = links2 "$@" +ext x?html?, has links, terminal = links "$@" +ext x?html?, has lynx, terminal = lynx -- "$@" +ext x?html?, has w3m, terminal = w3m "$@" + +#------------------------------------------- +# Misc +#------------------------------------------- +# Define the "editor" for text files as first action +mime ^text, label editor = ${VISUAL:-$EDITOR} -- "$@" +mime ^text, label pager = "$PAGER" -- "$@" +!mime ^text, label editor, ext xml|json|csv|tex|py|pl|rb|js|sh|php = ${VISUAL:-$EDITOR} -- "$@" +!mime ^text, label pager, ext xml|json|csv|tex|py|pl|rb|js|sh|php = "$PAGER" -- "$@" + +ext 1 = man "$1" +ext s[wmf]c, has zsnes, X = zsnes "$1" +ext s[wmf]c, has snes9x-gtk,X = snes9x-gtk "$1" +ext nes, has fceux, X = fceux "$1" +ext exe = wine "$1" +name ^[mM]akefile$ = make + +#-------------------------------------------- +# Code +#------------------------------------------- +ext py = python3 -- "$1" +ext pl = perl -- "$1" +ext rb = ruby -- "$1" +ext js = node -- "$1" +ext sh = sh -- "$1" +ext php = php -- "$1" + +#-------------------------------------------- +# Audio without X +#------------------------------------------- +mime ^audio|ogg$, terminal, has mpv = mpv -- "$@" +mime ^audio|ogg$, terminal, has mplayer2 = mplayer2 -- "$@" +mime ^audio|ogg$, terminal, has mplayer = mplayer -- "$@" +ext midi?, terminal, has wildmidi = wildmidi -- "$@" + +#-------------------------------------------- +# Video/Audio with a GUI +#------------------------------------------- +mime ^video, has mpv, X, flag f = mpv -- "$@" +mime ^video, has mpv, X, flag f = mpv --fs -- "$@" +mime ^video|audio, has vlc, X, flag f = vlc -- "$@" +mime ^video|audio, has gmplayer, X, flag f = gmplayer -- "$@" +mime ^video|audio, has smplayer, X, flag f = smplayer "$@" +mime ^video, has mplayer2, X, flag f = mplayer2 -- "$@" +mime ^video, has mplayer2, X, flag f = mplayer2 -fs -- "$@" +mime ^video, has mplayer, X, flag f = mplayer -- "$@" +mime ^video, has mplayer, X, flag f = mplayer -fs -- "$@" +mime ^video|audio, has totem, X, flag f = totem -- "$@" +mime ^video|audio, has totem, X, flag f = totem --fullscreen -- "$@" + +#-------------------------------------------- +# Video without X: +#------------------------------------------- +mime ^video, terminal, !X, has mpv = mpv -- "$@" +mime ^video, terminal, !X, has mplayer2 = mplayer2 -- "$@" +mime ^video, terminal, !X, has mplayer = mplayer -- "$@" + +#------------------------------------------- +# Documents +#------------------------------------------- +ext pdf, has llpp, X, flag f = llpp "$@" +ext pdf, has zathura, X, flag f = zathura -- "$@" +ext pdf, has mupdf, X, flag f = mupdf "$@" +ext pdf, has mupdf-x11,X, flag f = mupdf-x11 "$@" +ext pdf, has apvlv, X, flag f = apvlv -- "$@" +ext pdf, has xpdf, X, flag f = xpdf -- "$@" +ext pdf, has evince, X, flag f = evince -- "$@" +ext pdf, has atril, X, flag f = atril -- "$@" +ext pdf, has okular, X, flag f = okular -- "$@" +ext pdf, has epdfview, X, flag f = epdfview -- "$@" +ext pdf, has qpdfview, X, flag f = qpdfview "$@" +ext pdf, has open, X, flag f = open "$@" + +ext docx?, has catdoc, terminal = catdoc -- "$@" | "$PAGER" + +ext sxc|xlsx?|xlt|xlw|gnm|gnumeric, has gnumeric, X, flag f = gnumeric -- "$@" +ext sxc|xlsx?|xlt|xlw|gnm|gnumeric, has kspread, X, flag f = kspread -- "$@" +ext pptx?|od[dfgpst]|docx?|sxc|xlsx?|xlt|xlw|gnm|gnumeric, has libreoffice, X, flag f = libreoffice "$@" +ext pptx?|od[dfgpst]|docx?|sxc|xlsx?|xlt|xlw|gnm|gnumeric, has soffice, X, flag f = soffice "$@" +ext pptx?|od[dfgpst]|docx?|sxc|xlsx?|xlt|xlw|gnm|gnumeric, has ooffice, X, flag f = ooffice "$@" + +ext djvu, has zathura,X, flag f = zathura -- "$@" +ext djvu, has evince, X, flag f = evince -- "$@" +ext djvu, has atril, X, flag f = atril -- "$@" +ext djvu, has djview, X, flag f = djview -- "$@" + +ext epub, has zathura, X, flag f = zathura -- "$@" +ext mobi, has ebook-viewer, X, flag f = ebook-viewer -- "$@" + +#------------------------------------------- +# Image Viewing: +#------------------------------------------- +mime ^image/svg, has inkscape, X, flag f = inkscape -- "$@" +mime ^image/svg, has display, X, flag f = display -- "$@" + +mime ^image, has pqiv, X, flag f = pqiv -- "$@" +mime ^image, has nsxiv, X, flag f = nsxiv -- "$@" +mime ^image, has sxiv, X, flag f = sxiv -- "$@" +mime ^image, has feh, X, flag f = feh -- "$@" +mime ^image, has mirage, X, flag f = mirage -- "$@" +mime ^image, has ristretto, X, flag f = ristretto "$@" +mime ^image, has eog, X, flag f = eog -- "$@" +mime ^image, has eom, X, flag f = eom -- "$@" +mime ^image, has nomacs, X, flag f = nomacs -- "$@" +mime ^image, has geeqie, X, flag f = geeqie -- "$@" +mime ^image, has gwenview, X, flag f = gwenview -- "$@" +mime ^image, has gimp, X, flag f = gimp -- "$@" +ext xcf, X, flag f = gimp -- "$@" + +#------------------------------------------- +# Archives +#------------------------------------------- + +# avoid password prompt by providing empty password +ext 7z, has 7z = 7z -p l "$@" | "$PAGER" +# This requires atool +ext ace|ar|arc|bz2?|cab|cpio|cpt|deb|dgc|dmg|gz, has atool = atool --list --each -- "$@" | "$PAGER" +ext iso|jar|msi|pkg|rar|shar|tar|tgz|xar|xpi|xz|zip, has atool = atool --list --each -- "$@" | "$PAGER" +ext 7z|ace|ar|arc|bz2?|cab|cpio|cpt|deb|dgc|dmg|gz, has atool = atool --extract --each -- "$@" +ext iso|jar|msi|pkg|rar|shar|tar|tgz|xar|xpi|xz|zip, has atool = atool --extract --each -- "$@" + +# Listing and extracting archives without atool: +ext tar|gz|bz2|xz, has tar = tar vvtf "$1" | "$PAGER" +ext tar|gz|bz2|xz, has tar = for file in "$@"; do tar vvxf "$file"; done +ext bz2, has bzip2 = for file in "$@"; do bzip2 -dk "$file"; done +ext zip, has unzip = unzip -l "$1" | "$PAGER" +ext zip, has unzip = for file in "$@"; do unzip -d "${file%.*}" "$file"; done +ext ace, has unace = unace l "$1" | "$PAGER" +ext ace, has unace = for file in "$@"; do unace e "$file"; done +ext rar, has unrar = unrar l "$1" | "$PAGER" +ext rar, has unrar = for file in "$@"; do unrar x "$file"; done + +#------------------------------------------- +# Flag t fallback terminals +#------------------------------------------- +# Rarely installed terminal emulators get higher priority; It is assumed that +# if you install a rare terminal emulator, you probably use it. +# gnome-terminal/konsole/xterm on the other hand are often installed as part of +# a desktop environment or as fallback terminal emulators. +mime ^ranger/x-terminal-emulator, has terminator = terminator -x "$@" +mime ^ranger/x-terminal-emulator, has st = st -e "$@" +mime ^ranger/x-terminal-emulator, has terminology = terminology -e "$@" +mime ^ranger/x-terminal-emulator, has kitty = kitty -- "$@" +mime ^ranger/x-terminal-emulator, has alacritty = alacritty -e "$@" +mime ^ranger/x-terminal-emulator, has sakura = sakura -e "$@" +mime ^ranger/x-terminal-emulator, has lilyterm = lilyterm -e "$@" +#mime ^ranger/x-terminal-emulator, has cool-retro-term = cool-retro-term -e "$@" +mime ^ranger/x-terminal-emulator, has termite = termite -x '"$@"' +#mime ^ranger/x-terminal-emulator, has yakuake = yakuake -e "$@" +mime ^ranger/x-terminal-emulator, has guake = guake -ne "$@" +mime ^ranger/x-terminal-emulator, has tilda = tilda -c "$@" +mime ^ranger/x-terminal-emulator, has urxvt = urxvt -e "$@" +mime ^ranger/x-terminal-emulator, has pantheon-terminal = pantheon-terminal -e "$@" +mime ^ranger/x-terminal-emulator, has lxterminal = lxterminal -e "$@" +mime ^ranger/x-terminal-emulator, has mate-terminal = mate-terminal -x "$@" +mime ^ranger/x-terminal-emulator, has xfce4-terminal = xfce4-terminal -x "$@" +mime ^ranger/x-terminal-emulator, has konsole = konsole -e "$@" +mime ^ranger/x-terminal-emulator, has gnome-terminal = gnome-terminal -- "$@" +mime ^ranger/x-terminal-emulator, has xterm = xterm -e "$@" + +#------------------------------------------- +# Misc +#------------------------------------------- +label wallpaper, number 11, mime ^image, has feh, X = feh --bg-scale "$1" +label wallpaper, number 12, mime ^image, has feh, X = feh --bg-tile "$1" +label wallpaper, number 13, mime ^image, has feh, X = feh --bg-center "$1" +label wallpaper, number 14, mime ^image, has feh, X = feh --bg-fill "$1" + +# Define the editor for non-text files + pager as last action + !mime ^text, !ext xml|json|csv|tex|py|pl|rb|js|sh|php = ask +label editor, !mime ^text, !ext xml|json|csv|tex|py|pl|rb|js|sh|php = ${VISUAL:-$EDITOR} -- "$@" +label pager, !mime ^text, !ext xml|json|csv|tex|py|pl|rb|js|sh|php = "$PAGER" -- "$@" + +# The very last action, so that it's never triggered accidentally, is to execute a program: +mime application/x-executable = "$1" diff --git a/dotfiles/common/.config/ranger/scope.sh b/dotfiles/common/.config/ranger/scope.sh new file mode 100755 index 0000000..13a25b4 --- /dev/null +++ b/dotfiles/common/.config/ranger/scope.sh @@ -0,0 +1,216 @@ +#!/usr/bin/env bash + +set -o noclobber -o noglob -o nounset -o pipefail +IFS=$'\n' + +# If the option `use_preview_script` is set to `true`, +# then this script will be called and its output will be displayed in ranger. +# ANSI color codes are supported. +# STDIN is disabled, so interactive scripts won't work properly + +# This script is considered a configuration file and must be updated manually. +# It will be left untouched if you upgrade ranger. + +# Meanings of exit codes: +# code | meaning | action of ranger +# -----+------------+------------------------------------------- +# 0 | success | Display stdout as preview +# 1 | no preview | Display no preview at all +# 2 | plain text | Display the plain content of the file +# 3 | fix width | Don't reload when width changes +# 4 | fix height | Don't reload when height changes +# 5 | fix both | Don't ever reload +# 6 | image | Display the image `$IMAGE_CACHE_PATH` points to as an image preview +# 7 | image | Display the file directly as an image + +# Script arguments +FILE_PATH="${1}" # Full path of the highlighted file +PV_WIDTH="${2}" # Width of the preview pane (number of fitting characters) +PV_HEIGHT="${3}" # Height of the preview pane (number of fitting characters) +IMAGE_CACHE_PATH="${4}" # Full path that should be used to cache image preview +PV_IMAGE_ENABLED="${5}" # 'True' if image previews are enabled, 'False' otherwise. + +FILE_EXTENSION="${FILE_PATH##*.}" +FILE_EXTENSION_LOWER=$(echo ${FILE_EXTENSION} | tr '[:upper:]' '[:lower:]') + +# Settings +HIGHLIGHT_SIZE_MAX=262143 # 256KiB +HIGHLIGHT_TABWIDTH=8 +HIGHLIGHT_STYLE='pablo' +PYGMENTIZE_STYLE='autumn' + + +handle_extension() { + case "${FILE_EXTENSION_LOWER}" in + # Archive + a|ace|alz|arc|arj|bz|bz2|cab|cpio|deb|gz|jar|lha|lz|lzh|lzma|lzo|\ + rpm|rz|t7z|tar|tbz|tbz2|tgz|tlz|txz|tZ|tzo|war|xpi|xz|Z|zip) + atool --list -- "${FILE_PATH}" && exit 5 + bsdtar --list --file "${FILE_PATH}" && exit 5 + exit 1;; + rar) + # Avoid password prompt by providing empty password + unrar lt -p- -- "${FILE_PATH}" && exit 5 + exit 1;; + 7z) + # Avoid password prompt by providing empty password + 7z l -p -- "${FILE_PATH}" && exit 5 + exit 1;; + + # PDF + pdf) + # Preview as text conversion + pdftotext -l 10 -nopgbrk -q -- "${FILE_PATH}" - | fmt -w ${PV_WIDTH} && exit 5 + mutool draw -F txt -i -- "${FILE_PATH}" 1-10 | fmt -w ${PV_WIDTH} && exit 5 + exiftool "${FILE_PATH}" && exit 5 + exit 1;; + + # BitTorrent + torrent) + transmission-show -- "${FILE_PATH}" && exit 5 + exit 1;; + + # OpenDocument + odt|ods|odp|sxw) + # Preview as text conversion + odt2txt "${FILE_PATH}" && exit 5 + exit 1;; + + # HTML + htm|html|xhtml) + # Preview as text conversion + w3m -dump "${FILE_PATH}" && exit 5 + lynx -dump -- "${FILE_PATH}" && exit 5 + elinks -dump "${FILE_PATH}" && exit 5 + ;; # Continue with next handler on failure + esac +} + +handle_image() { + local mimetype="${1}" + case "${mimetype}" in + # SVG + # image/svg+xml) + # convert "${FILE_PATH}" "${IMAGE_CACHE_PATH}" && exit 6 + # exit 1;; + + # Image + image/*) + local orientation + orientation="$( identify -format '%[EXIF:Orientation]\n' -- "${FILE_PATH}" )" + # If orientation data is present and the image actually + # needs rotating ("1" means no rotation)... + if [[ -n "$orientation" && "$orientation" != 1 ]]; then + # ...auto-rotate the image according to the EXIF data. + convert -- "${FILE_PATH}" -auto-orient "${IMAGE_CACHE_PATH}" && exit 6 + fi + + # `w3mimgdisplay` will be called for all images (unless overriden as above), + # but might fail for unsupported types. + exit 7;; + + # Video + # video/*) + # # Thumbnail + # ffmpegthumbnailer -i "${FILE_PATH}" -o "${IMAGE_CACHE_PATH}" -s 0 && exit 6 + # exit 1;; + # PDF + # application/pdf) + # pdftoppm -f 1 -l 1 \ + # -scale-to-x 1920 \ + # -scale-to-y -1 \ + # -singlefile \ + # -jpeg -tiffcompression jpeg \ + # -- "${FILE_PATH}" "${IMAGE_CACHE_PATH%.*}" \ + # && exit 6 || exit 1;; + + # Preview archives using the first image inside. + # (Very useful for comic book collections for example.) + # application/zip|application/x-rar|application/x-7z-compressed|\ + # application/x-xz|application/x-bzip2|application/x-gzip|application/x-tar) + # local fn=""; local fe="" + # local zip=""; local rar=""; local tar=""; local bsd="" + # case "${mimetype}" in + # application/zip) zip=1 ;; + # application/x-rar) rar=1 ;; + # application/x-7z-compressed) ;; + # *) tar=1 ;; + # esac + # { [ "$tar" ] && fn=$(tar --list --file "${FILE_PATH}"); } || \ + # { fn=$(bsdtar --list --file "${FILE_PATH}") && bsd=1 && tar=""; } || \ + # { [ "$rar" ] && fn=$(unrar lb -p- -- "${FILE_PATH}"); } || \ + # { [ "$zip" ] && fn=$(zipinfo -1 -- "${FILE_PATH}"); } || return + # + # fn=$(echo "$fn" | python -c "import sys; import mimetypes as m; \ + # [ print(l, end='') for l in sys.stdin if \ + # (m.guess_type(l[:-1])[0] or '').startswith('image/') ]" |\ + # sort -V | head -n 1) + # [ "$fn" = "" ] && return + # [ "$bsd" ] && fn=$(printf '%b' "$fn") + # + # [ "$tar" ] && tar --extract --to-stdout \ + # --file "${FILE_PATH}" -- "$fn" > "${IMAGE_CACHE_PATH}" && exit 6 + # fe=$(echo -n "$fn" | sed 's/[][*?\]/\\\0/g') + # [ "$bsd" ] && bsdtar --extract --to-stdout \ + # --file "${FILE_PATH}" -- "$fe" > "${IMAGE_CACHE_PATH}" && exit 6 + # [ "$bsd" ] || [ "$tar" ] && rm -- "${IMAGE_CACHE_PATH}" + # [ "$rar" ] && unrar p -p- -inul -- "${FILE_PATH}" "$fn" > \ + # "${IMAGE_CACHE_PATH}" && exit 6 + # [ "$zip" ] && unzip -pP "" -- "${FILE_PATH}" "$fe" > \ + # "${IMAGE_CACHE_PATH}" && exit 6 + # [ "$rar" ] || [ "$zip" ] && rm -- "${IMAGE_CACHE_PATH}" + # ;; + esac +} + +handle_mime() { + local mimetype="${1}" + case "${mimetype}" in + # Text + text/* | */xml) + # Syntax highlight + if [[ "$( stat --printf='%s' -- "${FILE_PATH}" )" -gt "${HIGHLIGHT_SIZE_MAX}" ]]; then + exit 2 + fi + if [[ "$( tput colors )" -ge 256 ]]; then + local pygmentize_format='terminal256' + local highlight_format='xterm256' + else + local pygmentize_format='terminal' + local highlight_format='ansi' + fi + highlight --replace-tabs="${HIGHLIGHT_TABWIDTH}" --out-format="${highlight_format}" \ + --style="${HIGHLIGHT_STYLE}" --force -- "${FILE_PATH}" && exit 5 + # pygmentize -f "${pygmentize_format}" -O "style=${PYGMENTIZE_STYLE}" -- "${FILE_PATH}" && exit 5 + exit 2;; + + # Image + image/*) + # Preview as text conversion + # img2txt --gamma=0.6 --width="${PV_WIDTH}" -- "${FILE_PATH}" && exit 4 + exiftool "${FILE_PATH}" && exit 5 + exit 1;; + + # Video and audio + video/* | audio/*) + mediainfo "${FILE_PATH}" && exit 5 + exiftool "${FILE_PATH}" && exit 5 + exit 1;; + esac +} + +handle_fallback() { + echo '----- File Type Classification -----' && file --dereference --brief -- "${FILE_PATH}" && exit 5 + exit 1 +} + + +MIMETYPE="$( file --dereference --brief --mime-type -- "${FILE_PATH}" )" +if [[ "${PV_IMAGE_ENABLED}" == 'True' ]]; then + handle_image "${MIMETYPE}" +fi +handle_extension +handle_mime "${MIMETYPE}" +handle_fallback + +exit 1 diff --git a/dotfiles/common/.config/redshift.conf b/dotfiles/common/.config/redshift.conf new file mode 100644 index 0000000..92b61bf --- /dev/null +++ b/dotfiles/common/.config/redshift.conf @@ -0,0 +1,32 @@ +[redshift] +; Color temperature in Kelvin +; 6500K = neutral daylight (no filter) +; 5000K = subtle warmth +; 4500K = noticeable but readable warmth (recommended for night) +; 4000K = warm (like incandescent bulb) +; 3500K = very warm/orange (often too much) + +temp-day=6500 +temp-night=4500 + +; Brightness (1.0 = full, 0.8 = 20% dimmed) +; Keeping at 1.0 avoids readability issues +brightness-day=1.0 +brightness-night=1.0 + +; Gamma correction (1.0 = no correction) +gamma=1.0 + +; Fade between day/night (1 = gradual, 0 = instant) +fade=1 + +; Screen adjustment method +adjustment-method=randr + +; Location for sunrise/sunset calculation +location-provider=manual + +[manual] +; New Orleans, LA +lat=29.951065 +lon=-90.071533 diff --git a/dotfiles/common/.config/rofi/config.rasi b/dotfiles/common/.config/rofi/config.rasi new file mode 100644 index 0000000..3f50cc6 --- /dev/null +++ b/dotfiles/common/.config/rofi/config.rasi @@ -0,0 +1,6 @@ +configuration { + show-icons: true; + dpi: 1; +} + +@theme "~/.config/rofi/themes/rounded-gray-dark.rasi" diff --git a/dotfiles/common/.config/rofi/themes/rounded-gray-dark.rasi b/dotfiles/common/.config/rofi/themes/rounded-gray-dark.rasi new file mode 100644 index 0000000..de5bbc3 --- /dev/null +++ b/dotfiles/common/.config/rofi/themes/rounded-gray-dark.rasi @@ -0,0 +1,106 @@ +/* ROFI THEME - Matched to dunst notifications */ +/* Based on: Newman Sanchez (https://github.com/newmanls) */ + +* { + bg0: #383c4af0; + bg1: #2d303c; + bg2: #4a4e5c80; + bg3: #2d303c; + fg0: #cdd1dc; + fg1: #ffffff; + fg2: #969696; + fg3: #4a4e5c; + + font: "FiraCode Nerd Font Mono 10"; + + background-color: transparent; + text-color: @fg0; + + margin: 0px; + padding: 0px; + spacing: 0px; +} + +window { + location: north; + y-offset: calc(50% - 176px); + width: 480; + border-radius: 10px; + border: 1px; + border-color: @bg1; + + background-color: @bg0; +} + +mainbox { + padding: 12px; +} + +inputbar { + background-color: @bg1; + border-color: @bg3; + + border: 1px; + border-radius: 6px; + + padding: 12px 20px; + spacing: 8px; + children: [ prompt, entry ]; +} + +prompt { + text-color: @fg2; +} + +entry { + placeholder: "Search"; + placeholder-color: @fg3; +} + +message { + margin: 12px 0 0; + border-radius: 6px; + border-color: @bg2; + background-color: @bg2; +} + +textbox { + padding: 8px 24px; +} + +listview { + background-color: transparent; + + margin: 12px 0 0; + lines: 8; + columns: 1; + + fixed-height: false; +} + +element { + padding: 8px 16px; + spacing: 8px; + border-radius: 6px; +} + +element normal active { + text-color: @bg3; +} + +element alternate active { + text-color: @bg3; +} + +element selected normal, element selected active { + background-color: @bg3; +} + +element-icon { + size: 1em; + vertical-align: 0.5; +} + +element-text { + text-color: inherit; +} diff --git a/dotfiles/common/.config/sxhkd/sxhkdrc b/dotfiles/common/.config/sxhkd/sxhkdrc new file mode 100644 index 0000000..16b90c7 --- /dev/null +++ b/dotfiles/common/.config/sxhkd/sxhkdrc @@ -0,0 +1,106 @@ +# SXHDRC +# This is the sxhkdrc for the Simple X Hotkey Daemon. +# https://github.com/baskerville/sxhkd + + +super + space + rofi -show drun +super + shift + s + rofi -show ssh + + +# +# Browsers +# + +super + w + $BROWSER +super + shift + w + $ALTBROWSER +ctrl + alt + w + tor-browser + +# +# Applications +# + +# Emacs +super + e + emacsclient -c -a "" || emacs + +# File Manager +control + alt + f + nautilus + +# Virtualbox +super + v + virtualbox + + +# Library +super + shift + l + calibre + +# Radio +super + shift + r + shortwave + +# +# Music +# +# super + slash +# st -e ncmpcpp +# ctrl + alt + slash +# easytag ~/music + + +# +# Accessories +# + + +# Colorpicker +super + c + xcolor | xsel -b + +# Screenshots +super + s + file="$(date +%Y.%m.%d-%M%S).png" && maim ~/pictures/screenshots/$file && \ + notify-send "screenshot" "Image saved to ~/Pictures/screenshots/$file" + +# +# System +# + +# Audio Keys +XF86AudioMute + amixer -q -D pulse sset Master toggle && +XF86Audio{Raise,Lower}Volume + pactl -- set-sink-volume 0 {+,-}10% && + +# Brightness Keys +XF86MonBrightnessUp + brightnessctl s +10% && notify-send "Brightness" "Brightness increased" +XF86MonBrightnessDown + brightnessctl s 10%- && notify-send "Brightness" "Brightness decreased" + +# Microphone Toggle +control + alt + space + amixer set Capture toggle && amixer get Capture | grep '\[off\]' && notify-send "Microphone" "Microphone muted" || notify-send "Microphone" "Microphone on" + +# Bluetooth +super + shift + b + blueman-manager + +# Lock Screen +super + Escape + slock & + +# +# Keybinding +# + +super + k + $EDITOR ~/.config/sxhkd/sxhkdrc && notify-send "Keyboard Shortcuts" "Editing shortcuts" +super + shift + k + sudo killall sxhkd && sxhkd && notify-send "Keyboard Shortcuts" "Keyboard shortcuts reloaded" diff --git a/dotfiles/common/.config/systemd/user/emacs.service b/dotfiles/common/.config/systemd/user/emacs.service new file mode 100644 index 0000000..0e3a102 --- /dev/null +++ b/dotfiles/common/.config/systemd/user/emacs.service @@ -0,0 +1,19 @@ +[Unit] +Description=Emacs text editor +Documentation=info:emacs man:emacs(1) https://gnu.org/software/emacs/ + +[Service] +Type=notify +ExecStart=/home/cjennings/.local/bin/emacs --fg-daemon + +# Emacs will exit with status 15 after having received SIGTERM, which +# is the default "KillSignal" value systemd uses to stop services. +SuccessExitStatus=15 + +# The location of the SSH auth socket varies by distribution, and some +# set it from PAM, so don't override by default. +# Environment=SSH_AUTH_SOCK=%t/keyring/ssh +Restart=on-failure + +[Install] +WantedBy=default.target diff --git a/dotfiles/common/.config/systemd/user/geoclue-agent.service b/dotfiles/common/.config/systemd/user/geoclue-agent.service new file mode 100644 index 0000000..9f2adc0 --- /dev/null +++ b/dotfiles/common/.config/systemd/user/geoclue-agent.service @@ -0,0 +1,8 @@ +[Unit] +Description=redshift needs to get a (geo)clue + +[Service] +ExecStart=/usr/lib/geoclue-2.0/demos/agent + +[Install] +WantedBy=default.target diff --git a/dotfiles/common/.config/systemd/user/xdg-desktop-portal-gtk.service.d/environment.conf b/dotfiles/common/.config/systemd/user/xdg-desktop-portal-gtk.service.d/environment.conf new file mode 100644 index 0000000..e8c5e8f --- /dev/null +++ b/dotfiles/common/.config/systemd/user/xdg-desktop-portal-gtk.service.d/environment.conf @@ -0,0 +1,3 @@ +[Service] +Environment="DISPLAY=:0" +Environment="XAUTHORITY=/home/cjennings/.Xauthority"
\ No newline at end of file diff --git a/dotfiles/common/.config/tickrs/config.yml b/dotfiles/common/.config/tickrs/config.yml new file mode 100644 index 0000000..a9c07c3 --- /dev/null +++ b/dotfiles/common/.config/tickrs/config.yml @@ -0,0 +1,95 @@ +--- +# List of ticker symbols to start app with +#symbols: +# - SPY +# - AMD + +# Chart type to start app with +# Default is line +# Possible values: line, candle, kagi +#chart_type: candle + +# Use specified time frame when starting program and when new stocks are added +# Default is 1D +# Possible values: 1D, 1W, 1M, 3M, 6M, 1Y, 5Y +#time_frame: 1D + +# Interval to update data from API (seconds) +# Default is 1 +#update_interval: 1 + +# Enable pre / post market hours for graphs +#enable_pre_post: true + +# Hide help icon in top right +#hide_help: true + +# Hide previous close line on 1D chart +#hide_prev_close: true + +# Hide toggle block +#hide_toggle: true + +# Show volumes graph +#show_volumes: true + +# Show x-axis labels +#show_x_labels: true + +# Start in summary mode +#summary: true + +# Truncate pre market graphing to only 30 minutes prior to markets opening +#trunc_pre: true + +# Ticker options for Kagi charts +# +# A map of each ticker with reversal and/or price fields (both optional). If no +# entry is defined for a symbol, a default of 'close' price and 1% for 1D and 4% +# for non-1D timeframes is used. This can be updated in the GUI by pressing 'e' +# +# reversal can be supplied as a single value, or a map on time frame to give each +# time frame a different reversal amount +# +# reversal.type can be 'amount' or 'pct' +# +# price can be 'close' or 'high_low' +# +#kagi_options: +# SPY: +# reversal: +# type: amount +# value: 5.00 +# price: close +# AMD: +# price: high_low +# TSLA: +# reversal: +# type: pct +# value: 0.08 +# NVDA: +# reversal: +# 1D: +# type: pct +# value: 0.02 +# 5Y: +# type: pct +# value: 0.10 + +# Apply a custom theme +# +# All colors are optional. If commented out / omitted, the color will get sourced +# from your terminal color scheme +#theme: +# background: '#403E41' +# gray: '#727072' +# profit: '#ADD977' +# loss: '#FA648A' +# text_normal: '#FCFCFA' +# text_primary: '#FFDA65' +# text_secondary: '#79DBEA' +# border_primary: '#FC9766' +# border_secondary: '#FCFCFA' +# border_axis: '#FC9766' +# highlight_focused: '#FC9766' +# highlight_unfocused: '#727072' diff --git a/dotfiles/common/.config/topgrade.toml b/dotfiles/common/.config/topgrade.toml new file mode 100644 index 0000000..b4434f2 --- /dev/null +++ b/dotfiles/common/.config/topgrade.toml @@ -0,0 +1,246 @@ +# Include any additional configuration file(s) +# [include] sections are processed in the order you write them +# Files in $CONFIG_DIR/topgrade.d/ are automatically included before this file +[include] +# paths = ["/etc/topgrade.toml"] + + +[misc] +# Run `sudo -v` to cache credentials at the start of the run +# This avoids a blocking password prompt in the middle of an unattended run +# (default: false) +pre_sudo = true + +# Sudo command to be used +sudo_command = "sudo" + +# Disable specific steps - same options as the command line flag +# disable = ["system", "emacs"] +disable = ["emacs", "poetry", "gnome_shell_extensions"] + +# Ignore failures for these steps +# ignore_failures = ["powershell"] + +# List of remote machines with Topgrade installed on them +# remote_topgrades = ["toothless", "pi", "parnas"] + +# Path to Topgrade executable on remote machines +# remote_topgrade_path = ".cargo/bin/topgrade" + +# Arguments to pass to SSH when upgrading remote systems +# ssh_arguments = "-o ConnectTimeout=2" + +# Arguments to pass tmux when pulling Repositories +# tmux_arguments = "-S /var/tmux.sock" + +# Do not set the terminal title (default: true) +# set_title = true + +# Display the time in step titles (default: true) +# display_time = true + +# Don't ask for confirmations (no default value) +assume_yes = true + +# Do not ask to retry failed steps (default: false) +no_retry = true + +# Run inside tmux (default: false) +# run_in_tmux = true + +# Cleanup temporary or old files (default: false) +cleanup = true + +# Send a notification for every step (default: false) +# notify_each_step = false + +# Skip sending a notification at the end of a run (default: false) +# skip_notify = true + +# The Bash-it branch to update (default: "stable") +# bashit_branch = "stable" + +# Run specific steps - same options as the command line flag +# only = ["system", "emacs"] + +# Whether to self update +# +# this will be ignored if the binary is built without self update support +# +# available also via setting the environment variable TOPGRADE_NO_SELF_UPGRADE) +# no_self_update = true + +# Extra tracing filter directives +# These are prepended to the `--log-filter` argument +# See: https://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html#directives +# log_filters = ["topgrade::command=debug", "warn"] + + +# Commands to run before anything +[pre_commands] +# "Emacs Snapshot" = "rm -rf ~/.emacs.d/elpa.bak && cp -rl ~/.emacs.d/elpa ~/.emacs.d/elpa.bak" + + +# Commands to run after anything +[post_commands] +# "Emacs Snapshot" = "rm -rf ~/.emacs.d/elpa.bak && cp -rl ~/.emacs.d/elpa ~/.emacs.d/elpa.bak" + + +# Custom commands +[commands] +# "Python Environment" = "~/dev/.env/bin/pip install -i https://pypi.python.org/simple -U --upgrade-strategy eager jupyter" +# "Custom command using interactive shell (unix)" = "-i vim_upgrade" + + +[python] +# enable_pip_review = true ###disabled by default +# enable_pip_review_local = true ###disabled by default +# enable_pipupgrade = true ###disabled by default +# pipupgrade_arguments = "-y -u --pip-path pip" ###disabled by default + + +[composer] +# self_update = true + + +[brew] +# For the BrewCask step +# If `Repo Cask Upgrade` exists, then use the `-a` option. +# Otherwise, use the `--greedy` option. +# greedy_cask = true + +# For the BrewCask step +# If `Repo Cask Upgrade` does not exist, then use the `--greedy_latest` option. +# NOTE: the above entry `greedy_cask` contains this entry, though you can enable +# both of them, they won't clash with each other. +# greedy_latest = true + +# For the BrewFormula step +# Execute `brew autoremove` after the step. +# autoremove = true + +# For the BrewFormula step +# Upgrade formulae built from the HEAD branch; `brew upgrade --fetch-HEAD` +# fetch_head = true + + +[linux] +# Arch Package Manager to use. +# Allowed values: +# autodetect, aura, garuda_update, pacman, pamac, paru, pikaur, trizen, yay +arch_package_manager = "yay" + +# Arguments to pass yay (or paru) when updating packages +# yay_arguments = "--nodevel" + +# Arguments to pass dnf when updating packages +# dnf_arguments = "--refresh" + +# aura_aur_arguments = "-kx" + +# aura_pacman_arguments = "" +# garuda_update_arguments = "" + +show_arch_news = true + +# trizen_arguments = "--devel" + +# pikaur_arguments = "" + +# pamac_arguments = "--no-devel" + +# enable_tlmgr = true + +# emerge_sync_flags = "-q" + +# emerge_update_flags = "-uDNa --with-bdeps=y world" + +# redhat_distro_sync = false + +# suse_dup = false + +# rpm_ostree = false + +# nix_arguments = "--flake" + +# nix_env_arguments = "--prebuilt-only" + +# Extra Home Manager arguments +# home_manager_arguments = ["--flake", "file"] + + +[git] +# How many repos to pull at max in parallel +max_concurrency = 5 + +# Additional git repositories to pull +repos = [ + "~/code/*/" +] + +# Don't pull the predefined git repos +# pull_predefined = false + +# Arguments to pass Git when pulling Repositories +arguments = "--rebase --autostash" + + +[windows] +# Manually select Windows updates +# accept_all_updates = false + +# open_remotes_in_new_terminal = true + +# wsl_update_pre_release = true + +# wsl_update_use_web_download = true + +# Causes Topgrade to rename itself during the run to allow package managers +# to upgrade it. Use this only if you installed Topgrade by using a package +# manager such as Scoop or Cargo +# self_rename = true + + +[npm] +# Use sudo if the NPM directory isn't owned by the current user +# use_sudo = true + + +[yarn] +# Run `yarn global upgrade` with `sudo` +# use_sudo = true + + +[vim] +# For `vim-plug`, execute `PlugUpdate!` instead of `PlugUpdate` +force_plug_update = true + + +[firmware] +# Offer to update firmware; if false just check for and display available updates +upgrade = false + + +[vagrant] +# Vagrant directories +# directories = [] + +# power on vagrant boxes if needed +# power_on = true + +# Always suspend vagrant boxes instead of powering off +# always_suspend = true + + +[flatpak] +# Use sudo for updating the system-wide installation +# use_sudo = true + + +[distrobox] +# use_root = false + +# containers = ["archlinux-latest"] +[containers] +# Specify the containers to ignore while updating (Wildcard supported) +# ignored_containers = ["ghcr.io/rancher-sandbox/rancher-desktop/rdx-proxy:latest", "docker.io*"] diff --git a/dotfiles/common/.config/touchpad-indicator/touchpad-indicator.conf b/dotfiles/common/.config/touchpad-indicator/touchpad-indicator.conf new file mode 100644 index 0000000..51a9907 --- /dev/null +++ b/dotfiles/common/.config/touchpad-indicator/touchpad-indicator.conf @@ -0,0 +1 @@ +{"first-time": false, "version": "2.2.3-ubuntu20.04.0", "is_working": false, "autostart": false, "on_mouse_plugged": true, "on_start": -1, "on_end": 1, "disable_on_typing": true, "interval": 3600.0, "start_hidden": false, "show_notifications": false, "theme": "light", "touchpad_enabled": false, "natural_scrolling": false, "speed": 0.0, "tapping": true, "two_finger_scrolling": true, "edge_scrolling": false, "cicular_scrolling": true, "right-top-corner": 0, "right-bottom-corner": 0, "left-top-corner": 0, "left-bottom-corner": 0, "one-finger-tap": 0, "two-finger-tap": 0, "three-finger-tap": 0, "faulty-devices": ["11/2/1/0", "11/2/a/0", "11/2/5/7326", "11/2/6/0", "18/93a/274/100"]}
\ No newline at end of file diff --git a/dotfiles/common/.config/transmission-daemon b/dotfiles/common/.config/transmission-daemon new file mode 120000 index 0000000..e768f74 --- /dev/null +++ b/dotfiles/common/.config/transmission-daemon @@ -0,0 +1 @@ +transmission
\ No newline at end of file diff --git a/dotfiles/common/.config/transmission/settings.json b/dotfiles/common/.config/transmission/settings.json new file mode 100644 index 0000000..c232f9d --- /dev/null +++ b/dotfiles/common/.config/transmission/settings.json @@ -0,0 +1,129 @@ +{ + "alt-speed-down": 500, + "alt-speed-enabled": true, + "alt-speed-time-begin": 480, + "alt-speed-time-day": 127, + "alt-speed-time-enabled": true, + "alt-speed-time-end": 1380, + "alt-speed-up": 500, + "announce-ip": "", + "announce-ip-enabled": false, + "anti-brute-force-enabled": false, + "anti-brute-force-threshold": 100, + "bind-address-ipv4": "0.0.0.0", + "bind-address-ipv6": "::", + "blocklist-date": 0, + "blocklist-enabled": false, + "blocklist-updates-enabled": true, + "blocklist-url": "http://www.example.com/blocklist", + "cache-size-mb": 4, + "compact-view": false, + "default-trackers": "", + "details-window-height": 712, + "details-window-width": 831, + "dht-enabled": true, + "download-dir": "/home/cjennings/downloads/torrents/complete", + "download-queue-enabled": true, + "download-queue-size": 5, + "encryption": 1, + "filter-mode": "show-downloading", + "filter-trackers": "", + "idle-seeding-limit": 30, + "idle-seeding-limit-enabled": false, + "incomplete-dir": "/home/cjennings/downloads/torrents/incomplete", + "incomplete-dir-enabled": true, + "inhibit-desktop-hibernation": false, + "lpd-enabled": true, + "main-window-height": 981, + "main-window-is-maximized": false, + "main-window-layout-order": "menu,toolbar,filter,list,statusbar", + "main-window-width": 1504, + "main-window-x": -3016, + "main-window-y": 22, + "message-level": 4, + "open-dialog-dir": "/home/cjennings", + "peer-congestion-algorithm": "", + "peer-limit-global": 200, + "peer-limit-per-torrent": 50, + "peer-port": 51413, + "peer-port-random-high": 65535, + "peer-port-random-low": 49152, + "peer-port-random-on-start": false, + "peer-socket-tos": "le", + "pex-enabled": true, + "port-forwarding-enabled": true, + "preallocation": 1, + "prefetch-enabled": true, + "prompt-before-exit": true, + "queue-stalled-enabled": true, + "queue-stalled-minutes": 30, + "ratio-limit": 2, + "ratio-limit-enabled": false, + "read-clipboard": false, + "remote-session-enabled": false, + "remote-session-host": "localhost", + "remote-session-https": false, + "remote-session-password": "", + "remote-session-port": 9091, + "remote-session-requres-authentication": false, + "remote-session-username": "", + "rename-partial-files": true, + "rpc-authentication-required": true, + "rpc-bind-address": "0.0.0.0", + "rpc-enabled": true, + "rpc-host-whitelist": "", + "rpc-host-whitelist-enabled": true, + "rpc-password": "{bad68dff996a5c90ed8d070ed66477bc49fe9f9fWgWCPwIG", + "rpc-port": 9091, + "rpc-socket-mode": "0750", + "rpc-url": "/transmission/", + "rpc-username": "cjennings", + "rpc-whitelist": "127.0.0.1,::1", + "rpc-whitelist-enabled": true, + "scrape-paused-torrents-enabled": true, + "script-torrent-added-enabled": false, + "script-torrent-added-filename": "", + "script-torrent-done-enabled": false, + "script-torrent-done-filename": "", + "script-torrent-done-seeding-enabled": false, + "script-torrent-done-seeding-filename": "", + "seed-queue-enabled": false, + "seed-queue-size": 10, + "show-backup-trackers": false, + "show-extra-peer-details": false, + "show-filterbar": true, + "show-notification-area-icon": true, + "show-options-window": false, + "show-statusbar": true, + "show-toolbar": true, + "show-tracker-scrapes": false, + "sort-mode": "sort-by-progress", + "sort-reversed": false, + "speed-limit-down": 500, + "speed-limit-down-enabled": false, + "speed-limit-up": 100, + "speed-limit-up-enabled": false, + "start-added-torrents": true, + "start-minimized": true, + "statusbar-stats": "total-ratio", + "tcp-enabled": true, + "torrent-added-notification-enabled": true, + "torrent-added-verify-mode": "fast", + "torrent-complete-notification-enabled": false, + "torrent-complete-sound-command": [ + "canberra-gtk-play", + "-i", + "complete-download", + "-d", + "transmission torrent downloaded" + ], + "torrent-complete-sound-enabled": true, + "trash-can-enabled": true, + "trash-original-torrent-files": true, + "umask": "022", + "upload-slots-per-torrent": 8, + "user-has-given-informed-consent": true, + "utp-enabled": true, + "watch-dir": "/home/cjennings/downloads/torrents/files", + "watch-dir-enabled": true +} diff --git a/dotfiles/common/.config/user-dirs.dirs b/dotfiles/common/.config/user-dirs.dirs new file mode 100644 index 0000000..0db0cae --- /dev/null +++ b/dotfiles/common/.config/user-dirs.dirs @@ -0,0 +1,15 @@ +# This file is written by xdg-user-dirs-update +# If you want to change or add directories, just edit the line you're +# interested in. All local changes will be retained on the next run. +# Format is XDG_xxx_DIR="$HOME/yyy", where yyy is a shell-escaped +# homedir-relative path, or XDG_xxx_DIR="/yyy", where /yyy is an +# absolute path. No other format is supported. +# +XDG_DESKTOP_DIR="$HOME/" +XDG_DOWNLOAD_DIR="$HOME/downloads" +XDG_TEMPLATES_DIR="$HOME/" +XDG_PUBLICSHARE_DIR="$HOME/" +XDG_DOCUMENTS_DIR="$HOME/documents" +XDG_MUSIC_DIR="$HOME/music" +XDG_PICTURES_DIR="$HOME/pictures" +XDG_VIDEOS_DIR="$HOME/videos" diff --git a/dotfiles/common/.config/user-dirs.locale b/dotfiles/common/.config/user-dirs.locale new file mode 100644 index 0000000..3e0b419 --- /dev/null +++ b/dotfiles/common/.config/user-dirs.locale @@ -0,0 +1 @@ +en_US
\ No newline at end of file diff --git a/dotfiles/common/.config/yt-dlp/config b/dotfiles/common/.config/yt-dlp/config new file mode 100644 index 0000000..6b99261 --- /dev/null +++ b/dotfiles/common/.config/yt-dlp/config @@ -0,0 +1,20 @@ +# yt-dlp config +# Craig Jennings <c@cjennings.net> + +# Embed metadata into file +--embed-metadata + +# Best quality video+audio, fallback to best single file +--format bestvideo+bestaudio/best + +# Don't overwrite existing files +--no-overwrites + +# Continue on errors (useful for playlists) +--ignore-errors + +# Best audio quality for audio extraction (0=best, 9=worst) +--audio-quality 0 + +# Output template: ~/videos/channel-title.ext +-o ~/videos/%(channel)s-%(title)s.%(ext)s diff --git a/dotfiles/common/.config/zathura/zathurarc b/dotfiles/common/.config/zathura/zathurarc new file mode 100644 index 0000000..7f61084 --- /dev/null +++ b/dotfiles/common/.config/zathura/zathurarc @@ -0,0 +1,8 @@ +set selection-clipboard clipboard +set recolor true +map [normal] F2 bmark current +map [normal] F2 blist +map [fullscreen] F2 bmark current +map [fullscreen] F3 blist +map [normal] = zoom in +map [fullscreen] = zoom in
\ No newline at end of file |
