From 1de7bc1fc20ad1c90168e24df22fe179c7b9a45e Mon Sep 17 00:00:00 2001 From: yann Date: Mon, 23 Dec 2024 11:03:07 +0100 Subject: [PATCH] first commit --- README.md | 130 + dns-logo.png | Bin 0 -> 6718 bytes img/nord-logo.png | Bin 0 -> 37085 bytes install.sh | 8 + nord-logo-rouge.png | Bin 0 -> 16375 bytes nord-logo-vert.png | Bin 0 -> 16257 bytes nord-logo.png | Bin 0 -> 37085 bytes nordvpn.jpg | Bin 0 -> 1899 bytes nordvpntray.desktop | 7 + nordvpntray.py | 320 + nordvpntray.sh | 7 + requirements.txt | 9 + venv/bin/Activate.ps1 | 247 + venv/bin/activate | 70 + venv/bin/activate.csh | 27 + venv/bin/activate.fish | 69 + venv/bin/ping3 | 8 + venv/bin/pip | 8 + venv/bin/pip3 | 8 + venv/bin/pip3.12 | 8 + venv/bin/python | 1 + venv/bin/python3 | 1 + venv/bin/python3.12 | 1 + venv/bin/wheel | 8 + .../PyGObject/pygobject-3.0/pygobject.h | 627 ++ .../dbus-python/dbus-1.0/dbus/dbus-python.h | 106 + .../pkgconfig/dbus-python.pc | 11 + .../site-packages/PIL/BdfFontFile.py | 133 + .../site-packages/PIL/BlpImagePlugin.py | 493 + .../site-packages/PIL/BmpImagePlugin.py | 511 + .../site-packages/PIL/BufrStubImagePlugin.py | 76 + .../site-packages/PIL/ContainerIO.py | 173 + .../site-packages/PIL/CurImagePlugin.py | 75 + .../site-packages/PIL/DcxImagePlugin.py | 80 + .../site-packages/PIL/DdsImagePlugin.py | 575 ++ .../site-packages/PIL/EpsImagePlugin.py | 474 + .../python3.12/site-packages/PIL/ExifTags.py | 381 + .../site-packages/PIL/FitsImagePlugin.py | 152 + .../site-packages/PIL/FliImagePlugin.py | 175 + .../python3.12/site-packages/PIL/FontFile.py | 134 + .../site-packages/PIL/FpxImagePlugin.py | 257 + .../site-packages/PIL/FtexImagePlugin.py | 115 + .../site-packages/PIL/GbrImagePlugin.py | 103 + .../site-packages/PIL/GdImageFile.py | 102 + .../site-packages/PIL/GifImagePlugin.py | 1197 +++ .../site-packages/PIL/GimpGradientFile.py | 149 + .../site-packages/PIL/GimpPaletteFile.py | 58 + .../site-packages/PIL/GribStubImagePlugin.py | 76 + .../site-packages/PIL/Hdf5StubImagePlugin.py | 76 + .../site-packages/PIL/IcnsImagePlugin.py | 412 + .../site-packages/PIL/IcoImagePlugin.py | 381 + .../site-packages/PIL/ImImagePlugin.py | 386 + .../lib/python3.12/site-packages/PIL/Image.py | 4198 ++++++++ .../site-packages/PIL/ImageChops.py | 311 + .../python3.12/site-packages/PIL/ImageCms.py | 1125 +++ .../site-packages/PIL/ImageColor.py | 320 + .../python3.12/site-packages/PIL/ImageDraw.py | 1218 +++ .../site-packages/PIL/ImageDraw2.py | 243 + .../site-packages/PIL/ImageEnhance.py | 113 + .../python3.12/site-packages/PIL/ImageFile.py | 832 ++ .../site-packages/PIL/ImageFilter.py | 605 ++ .../python3.12/site-packages/PIL/ImageFont.py | 1338 +++ .../python3.12/site-packages/PIL/ImageGrab.py | 194 + .../python3.12/site-packages/PIL/ImageMath.py | 368 + .../python3.12/site-packages/PIL/ImageMode.py | 92 + .../site-packages/PIL/ImageMorph.py | 265 + .../python3.12/site-packages/PIL/ImageOps.py | 730 ++ .../site-packages/PIL/ImagePalette.py | 285 + .../python3.12/site-packages/PIL/ImagePath.py | 20 + .../python3.12/site-packages/PIL/ImageQt.py | 216 + .../site-packages/PIL/ImageSequence.py | 86 + .../python3.12/site-packages/PIL/ImageShow.py | 360 + .../python3.12/site-packages/PIL/ImageStat.py | 160 + .../python3.12/site-packages/PIL/ImageTk.py | 290 + .../site-packages/PIL/ImageTransform.py | 136 + .../python3.12/site-packages/PIL/ImageWin.py | 247 + .../site-packages/PIL/ImtImagePlugin.py | 103 + .../site-packages/PIL/IptcImagePlugin.py | 249 + .../site-packages/PIL/Jpeg2KImagePlugin.py | 443 + .../site-packages/PIL/JpegImagePlugin.py | 895 ++ .../site-packages/PIL/JpegPresets.py | 242 + .../site-packages/PIL/McIdasImagePlugin.py | 80 + .../site-packages/PIL/MicImagePlugin.py | 107 + .../site-packages/PIL/MpegImagePlugin.py | 88 + .../site-packages/PIL/MpoImagePlugin.py | 190 + .../site-packages/PIL/MspImagePlugin.py | 200 + .../python3.12/site-packages/PIL/PSDraw.py | 234 + .../site-packages/PIL/PaletteFile.py | 54 + .../site-packages/PIL/PalmImagePlugin.py | 232 + .../site-packages/PIL/PcdImagePlugin.py | 64 + .../site-packages/PIL/PcfFontFile.py | 254 + .../site-packages/PIL/PcxImagePlugin.py | 229 + .../site-packages/PIL/PdfImagePlugin.py | 311 + .../python3.12/site-packages/PIL/PdfParser.py | 1073 ++ .../site-packages/PIL/PixarImagePlugin.py | 74 + .../site-packages/PIL/PngImagePlugin.py | 1544 +++ .../site-packages/PIL/PpmImagePlugin.py | 375 + .../site-packages/PIL/PsdImagePlugin.py | 332 + .../site-packages/PIL/QoiImagePlugin.py | 115 + .../site-packages/PIL/SgiImagePlugin.py | 247 + .../site-packages/PIL/SpiderImagePlugin.py | 329 + .../site-packages/PIL/SunImagePlugin.py | 145 + .../lib/python3.12/site-packages/PIL/TarIO.py | 57 + .../site-packages/PIL/TgaImagePlugin.py | 264 + .../site-packages/PIL/TiffImagePlugin.py | 2271 +++++ .../python3.12/site-packages/PIL/TiffTags.py | 562 ++ .../site-packages/PIL/WalImageFile.py | 127 + .../site-packages/PIL/WebPImagePlugin.py | 323 + .../site-packages/PIL/WmfImagePlugin.py | 181 + .../site-packages/PIL/XVThumbImagePlugin.py | 85 + .../site-packages/PIL/XbmImagePlugin.py | 98 + .../site-packages/PIL/XpmImagePlugin.py | 127 + .../python3.12/site-packages/PIL/__init__.py | 86 + .../python3.12/site-packages/PIL/__main__.py | 7 + .../__pycache__/BdfFontFile.cpython-312.pyc | Bin 0 -> 4371 bytes .../BlpImagePlugin.cpython-312.pyc | Bin 0 -> 24085 bytes .../BmpImagePlugin.cpython-312.pyc | Bin 0 -> 17946 bytes .../BufrStubImagePlugin.cpython-312.pyc | Bin 0 -> 2691 bytes .../__pycache__/ContainerIO.cpython-312.pyc | Bin 0 -> 7019 bytes .../CurImagePlugin.cpython-312.pyc | Bin 0 -> 2369 bytes .../DcxImagePlugin.cpython-312.pyc | Bin 0 -> 2700 bytes .../DdsImagePlugin.cpython-312.pyc | Bin 0 -> 22693 bytes .../EpsImagePlugin.cpython-312.pyc | Bin 0 -> 15654 bytes .../PIL/__pycache__/ExifTags.cpython-312.pyc | Bin 0 -> 11554 bytes .../FitsImagePlugin.cpython-312.pyc | Bin 0 -> 6015 bytes .../FliImagePlugin.cpython-312.pyc | Bin 0 -> 6766 bytes .../PIL/__pycache__/FontFile.cpython-312.pyc | Bin 0 -> 4490 bytes .../FpxImagePlugin.cpython-312.pyc | Bin 0 -> 7689 bytes .../FtexImagePlugin.cpython-312.pyc | Bin 0 -> 5301 bytes .../GbrImagePlugin.cpython-312.pyc | Bin 0 -> 3702 bytes .../__pycache__/GdImageFile.cpython-312.pyc | Bin 0 -> 3434 bytes .../GifImagePlugin.cpython-312.pyc | Bin 0 -> 44805 bytes .../GimpGradientFile.cpython-312.pyc | Bin 0 -> 5456 bytes .../GimpPaletteFile.cpython-312.pyc | Bin 0 -> 2108 bytes .../GribStubImagePlugin.cpython-312.pyc | Bin 0 -> 2689 bytes .../Hdf5StubImagePlugin.cpython-312.pyc | Bin 0 -> 2664 bytes .../IcnsImagePlugin.cpython-312.pyc | Bin 0 -> 17267 bytes .../IcoImagePlugin.cpython-312.pyc | Bin 0 -> 15165 bytes .../__pycache__/ImImagePlugin.cpython-312.pyc | Bin 0 -> 12725 bytes .../PIL/__pycache__/Image.cpython-312.pyc | Bin 0 -> 172271 bytes .../__pycache__/ImageChops.cpython-312.pyc | Bin 0 -> 11239 bytes .../PIL/__pycache__/ImageCms.cpython-312.pyc | Bin 0 -> 43991 bytes .../__pycache__/ImageColor.cpython-312.pyc | Bin 0 -> 12488 bytes .../PIL/__pycache__/ImageDraw.cpython-312.pyc | Bin 0 -> 44201 bytes .../__pycache__/ImageDraw2.cpython-312.pyc | Bin 0 -> 9796 bytes .../__pycache__/ImageEnhance.cpython-312.pyc | Bin 0 -> 5401 bytes .../PIL/__pycache__/ImageFile.cpython-312.pyc | Bin 0 -> 31237 bytes .../__pycache__/ImageFilter.cpython-312.pyc | Bin 0 -> 23170 bytes .../PIL/__pycache__/ImageFont.cpython-312.pyc | Bin 0 -> 69179 bytes .../PIL/__pycache__/ImageGrab.cpython-312.pyc | Bin 0 -> 7008 bytes .../PIL/__pycache__/ImageMath.cpython-312.pyc | Bin 0 -> 16315 bytes .../PIL/__pycache__/ImageMode.cpython-312.pyc | Bin 0 -> 2813 bytes .../__pycache__/ImageMorph.cpython-312.pyc | Bin 0 -> 11326 bytes .../PIL/__pycache__/ImageOps.cpython-312.pyc | Bin 0 -> 29356 bytes .../__pycache__/ImagePalette.cpython-312.pyc | Bin 0 -> 12166 bytes .../PIL/__pycache__/ImagePath.cpython-312.pyc | Bin 0 -> 349 bytes .../PIL/__pycache__/ImageQt.cpython-312.pyc | Bin 0 -> 8449 bytes .../__pycache__/ImageSequence.cpython-312.pyc | Bin 0 -> 3380 bytes .../PIL/__pycache__/ImageShow.cpython-312.pyc | Bin 0 -> 13670 bytes .../PIL/__pycache__/ImageStat.cpython-312.pyc | Bin 0 -> 7372 bytes .../PIL/__pycache__/ImageTk.cpython-312.pyc | Bin 0 -> 10844 bytes .../ImageTransform.cpython-312.pyc | Bin 0 -> 5352 bytes .../PIL/__pycache__/ImageWin.cpython-312.pyc | Bin 0 -> 11862 bytes .../ImtImagePlugin.cpython-312.pyc | Bin 0 -> 2561 bytes .../IptcImagePlugin.cpython-312.pyc | Bin 0 -> 8873 bytes .../Jpeg2KImagePlugin.cpython-312.pyc | Bin 0 -> 18161 bytes .../JpegImagePlugin.cpython-312.pyc | Bin 0 -> 33077 bytes .../__pycache__/JpegPresets.cpython-312.pyc | Bin 0 -> 8128 bytes .../McIdasImagePlugin.cpython-312.pyc | Bin 0 -> 2233 bytes .../MicImagePlugin.cpython-312.pyc | Bin 0 -> 3798 bytes .../MpegImagePlugin.cpython-312.pyc | Bin 0 -> 3682 bytes .../MpoImagePlugin.cpython-312.pyc | Bin 0 -> 8125 bytes .../MspImagePlugin.cpython-312.pyc | Bin 0 -> 5957 bytes .../PIL/__pycache__/PSDraw.cpython-312.pyc | Bin 0 -> 7944 bytes .../__pycache__/PaletteFile.cpython-312.pyc | Bin 0 -> 1909 bytes .../PalmImagePlugin.cpython-312.pyc | Bin 0 -> 9698 bytes .../PcdImagePlugin.cpython-312.pyc | Bin 0 -> 2042 bytes .../__pycache__/PcfFontFile.cpython-312.pyc | Bin 0 -> 9911 bytes .../PcxImagePlugin.cpython-312.pyc | Bin 0 -> 7381 bytes .../PdfImagePlugin.cpython-312.pyc | Bin 0 -> 9770 bytes .../PIL/__pycache__/PdfParser.cpython-312.pyc | Bin 0 -> 52806 bytes .../PixarImagePlugin.cpython-312.pyc | Bin 0 -> 1966 bytes .../PngImagePlugin.cpython-312.pyc | Bin 0 -> 61920 bytes .../PpmImagePlugin.cpython-312.pyc | Bin 0 -> 14116 bytes .../PsdImagePlugin.cpython-312.pyc | Bin 0 -> 10835 bytes .../QoiImagePlugin.cpython-312.pyc | Bin 0 -> 6050 bytes .../SgiImagePlugin.cpython-312.pyc | Bin 0 -> 8421 bytes .../SpiderImagePlugin.cpython-312.pyc | Bin 0 -> 12236 bytes .../SunImagePlugin.cpython-312.pyc | Bin 0 -> 3420 bytes .../PIL/__pycache__/TarIO.cpython-312.pyc | Bin 0 -> 1905 bytes .../TgaImagePlugin.cpython-312.pyc | Bin 0 -> 8096 bytes .../TiffImagePlugin.cpython-312.pyc | Bin 0 -> 99258 bytes .../PIL/__pycache__/TiffTags.cpython-312.pyc | Bin 0 -> 18810 bytes .../__pycache__/WalImageFile.cpython-312.pyc | Bin 0 -> 4090 bytes .../WebPImagePlugin.cpython-312.pyc | Bin 0 -> 13218 bytes .../WmfImagePlugin.cpython-312.pyc | Bin 0 -> 6172 bytes .../XVThumbImagePlugin.cpython-312.pyc | Bin 0 -> 2608 bytes .../XbmImagePlugin.cpython-312.pyc | Bin 0 -> 4097 bytes .../XpmImagePlugin.cpython-312.pyc | Bin 0 -> 4247 bytes .../PIL/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2028 bytes .../PIL/__pycache__/__main__.cpython-312.pyc | Bin 0 -> 393 bytes .../PIL/__pycache__/_binary.cpython-312.pyc | Bin 0 -> 3436 bytes .../__pycache__/_deprecate.cpython-312.pyc | Bin 0 -> 2470 bytes .../_tkinter_finder.cpython-312.pyc | Bin 0 -> 766 bytes .../PIL/__pycache__/_typing.cpython-312.pyc | Bin 0 -> 2105 bytes .../PIL/__pycache__/_util.cpython-312.pyc | Bin 0 -> 1545 bytes .../PIL/__pycache__/_version.cpython-312.pyc | Bin 0 -> 265 bytes .../PIL/__pycache__/features.cpython-312.pyc | Bin 0 -> 13850 bytes .../PIL/__pycache__/report.cpython-312.pyc | Bin 0 -> 327 bytes .../python3.12/site-packages/PIL/_binary.py | 112 + .../site-packages/PIL/_deprecate.py | 69 + .../_imaging.cpython-312-x86_64-linux-gnu.so | Bin 0 -> 3115489 bytes .../python3.12/site-packages/PIL/_imaging.pyi | 31 + ...imagingcms.cpython-312-x86_64-linux-gnu.so | Bin 0 -> 145465 bytes .../site-packages/PIL/_imagingcms.pyi | 143 + ..._imagingft.cpython-312-x86_64-linux-gnu.so | Bin 0 -> 298281 bytes .../site-packages/PIL/_imagingft.pyi | 69 + ...magingmath.cpython-312-x86_64-linux-gnu.so | Bin 0 -> 156856 bytes .../site-packages/PIL/_imagingmath.pyi | 3 + ...agingmorph.cpython-312-x86_64-linux-gnu.so | Bin 0 -> 36112 bytes .../site-packages/PIL/_imagingmorph.pyi | 3 + ..._imagingtk.cpython-312-x86_64-linux-gnu.so | Bin 0 -> 46352 bytes .../site-packages/PIL/_imagingtk.pyi | 3 + .../site-packages/PIL/_tkinter_finder.py | 21 + .../python3.12/site-packages/PIL/_typing.py | 53 + .../lib/python3.12/site-packages/PIL/_util.py | 26 + .../python3.12/site-packages/PIL/_version.py | 4 + .../PIL/_webp.cpython-312-x86_64-linux-gnu.so | Bin 0 -> 84193 bytes .../python3.12/site-packages/PIL/_webp.pyi | 3 + .../python3.12/site-packages/PIL/features.py | 352 + .../lib/python3.12/site-packages/PIL/py.typed | 0 .../python3.12/site-packages/PIL/report.py | 5 + venv/lib/python3.12/site-packages/Xlib/X.py | 424 + venv/lib/python3.12/site-packages/Xlib/XK.py | 89 + .../python3.12/site-packages/Xlib/Xatom.py | 90 + .../site-packages/Xlib/Xcursorfont.py | 99 + .../python3.12/site-packages/Xlib/Xutil.py | 81 + .../python3.12/site-packages/Xlib/__init__.py | 39 + .../Xlib/__pycache__/X.cpython-312.pyc | Bin 0 -> 8618 bytes .../Xlib/__pycache__/XK.cpython-312.pyc | Bin 0 -> 2538 bytes .../Xlib/__pycache__/Xatom.cpython-312.pyc | Bin 0 -> 2002 bytes .../__pycache__/Xcursorfont.cpython-312.pyc | Bin 0 -> 2136 bytes .../Xlib/__pycache__/Xutil.cpython-312.pyc | Bin 0 -> 1721 bytes .../Xlib/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 453 bytes .../Xlib/__pycache__/display.cpython-312.pyc | Bin 0 -> 41861 bytes .../Xlib/__pycache__/error.cpython-312.pyc | Bin 0 -> 8992 bytes .../Xlib/__pycache__/rdb.cpython-312.pyc | Bin 0 -> 22226 bytes .../Xlib/__pycache__/threaded.cpython-312.pyc | Bin 0 -> 340 bytes .../Xlib/__pycache__/xauth.cpython-312.pyc | Bin 0 -> 4780 bytes .../python3.12/site-packages/Xlib/display.py | 951 ++ .../python3.12/site-packages/Xlib/error.py | 160 + .../site-packages/Xlib/ext/__init__.py | 46 + .../ext/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 692 bytes .../ext/__pycache__/composite.cpython-312.pyc | Bin 0 -> 10416 bytes .../ext/__pycache__/damage.cpython-312.pyc | Bin 0 -> 7525 bytes .../Xlib/ext/__pycache__/dpms.cpython-312.pyc | Bin 0 -> 9175 bytes .../Xlib/ext/__pycache__/ge.cpython-312.pyc | Bin 0 -> 3787 bytes .../ext/__pycache__/nvcontrol.cpython-312.pyc | Bin 0 -> 81826 bytes .../ext/__pycache__/randr.cpython-312.pyc | Bin 0 -> 59750 bytes .../ext/__pycache__/record.cpython-312.pyc | Bin 0 -> 13585 bytes .../Xlib/ext/__pycache__/res.cpython-312.pyc | Bin 0 -> 12934 bytes .../__pycache__/screensaver.cpython-312.pyc | Bin 0 -> 8695 bytes .../ext/__pycache__/security.cpython-312.pyc | Bin 0 -> 5258 bytes .../ext/__pycache__/shape.cpython-312.pyc | Bin 0 -> 14430 bytes .../ext/__pycache__/xfixes.cpython-312.pyc | Bin 0 -> 10005 bytes .../ext/__pycache__/xinerama.cpython-312.pyc | Bin 0 -> 10385 bytes .../ext/__pycache__/xinput.cpython-312.pyc | Bin 0 -> 32437 bytes .../ext/__pycache__/xtest.cpython-312.pyc | Bin 0 -> 5881 bytes .../site-packages/Xlib/ext/composite.py | 271 + .../site-packages/Xlib/ext/damage.py | 181 + .../python3.12/site-packages/Xlib/ext/dpms.py | 232 + .../python3.12/site-packages/Xlib/ext/ge.py | 112 + .../site-packages/Xlib/ext/nvcontrol.py | 5393 +++++++++++ .../site-packages/Xlib/ext/randr.py | 1292 +++ .../site-packages/Xlib/ext/record.py | 282 + .../python3.12/site-packages/Xlib/ext/res.py | 288 + .../site-packages/Xlib/ext/screensaver.py | 198 + .../site-packages/Xlib/ext/security.py | 139 + .../site-packages/Xlib/ext/shape.py | 297 + .../site-packages/Xlib/ext/xfixes.py | 200 + .../site-packages/Xlib/ext/xinerama.py | 222 + .../site-packages/Xlib/ext/xinput.py | 777 ++ .../site-packages/Xlib/ext/xtest.py | 122 + .../site-packages/Xlib/keysymdef/__init__.py | 42 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 377 bytes .../keysymdef/__pycache__/apl.cpython-312.pyc | Bin 0 -> 691 bytes .../__pycache__/arabic.cpython-312.pyc | Bin 0 -> 1772 bytes .../__pycache__/cyrillic.cpython-312.pyc | Bin 0 -> 3433 bytes .../__pycache__/greek.cpython-312.pyc | Bin 0 -> 2567 bytes .../__pycache__/hebrew.cpython-312.pyc | Bin 0 -> 1385 bytes .../__pycache__/katakana.cpython-312.pyc | Bin 0 -> 2062 bytes .../__pycache__/korean.cpython-312.pyc | Bin 0 -> 3853 bytes .../__pycache__/latin1.cpython-312.pyc | Bin 0 -> 4968 bytes .../__pycache__/latin2.cpython-312.pyc | Bin 0 -> 1666 bytes .../__pycache__/latin3.cpython-312.pyc | Bin 0 -> 811 bytes .../__pycache__/latin4.cpython-312.pyc | Bin 0 -> 1117 bytes .../__pycache__/miscellany.cpython-312.pyc | Bin 0 -> 4184 bytes .../__pycache__/publishing.cpython-312.pyc | Bin 0 -> 2783 bytes .../__pycache__/special.cpython-312.pyc | Bin 0 -> 860 bytes .../__pycache__/technical.cpython-312.pyc | Bin 0 -> 1764 bytes .../__pycache__/thai.cpython-312.pyc | Bin 0 -> 2807 bytes .../__pycache__/xf86.cpython-312.pyc | Bin 0 -> 6209 bytes .../__pycache__/xk3270.cpython-312.pyc | Bin 0 -> 1122 bytes .../keysymdef/__pycache__/xkb.cpython-312.pyc | Bin 0 -> 3796 bytes .../site-packages/Xlib/keysymdef/apl.py | 19 + .../site-packages/Xlib/keysymdef/arabic.py | 50 + .../site-packages/Xlib/keysymdef/cyrillic.py | 107 + .../site-packages/Xlib/keysymdef/greek.py | 74 + .../site-packages/Xlib/keysymdef/hebrew.py | 40 + .../site-packages/Xlib/keysymdef/katakana.py | 70 + .../site-packages/Xlib/keysymdef/korean.py | 107 + .../site-packages/Xlib/keysymdef/latin1.py | 195 + .../site-packages/Xlib/keysymdef/latin2.py | 57 + .../site-packages/Xlib/keysymdef/latin3.py | 22 + .../site-packages/Xlib/keysymdef/latin4.py | 36 + .../Xlib/keysymdef/miscellany.py | 169 + .../Xlib/keysymdef/publishing.py | 83 + .../site-packages/Xlib/keysymdef/special.py | 24 + .../site-packages/Xlib/keysymdef/technical.py | 49 + .../site-packages/Xlib/keysymdef/thai.py | 84 + .../site-packages/Xlib/keysymdef/xf86.py | 202 + .../site-packages/Xlib/keysymdef/xk3270.py | 30 + .../site-packages/Xlib/keysymdef/xkb.py | 100 + .../site-packages/Xlib/protocol/__init__.py | 28 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 257 bytes .../__pycache__/display.cpython-312.pyc | Bin 0 -> 33536 bytes .../__pycache__/event.cpython-312.pyc | Bin 0 -> 24841 bytes .../__pycache__/request.cpython-312.pyc | Bin 0 -> 101861 bytes .../protocol/__pycache__/rq.cpython-312.pyc | Bin 0 -> 59484 bytes .../__pycache__/structs.cpython-312.pyc | Bin 0 -> 8249 bytes .../site-packages/Xlib/protocol/display.py | 1075 +++ .../site-packages/Xlib/protocol/event.py | 434 + .../site-packages/Xlib/protocol/request.py | 1900 ++++ .../site-packages/Xlib/protocol/rq.py | 1463 +++ .../site-packages/Xlib/protocol/structs.py | 161 + venv/lib/python3.12/site-packages/Xlib/rdb.py | 712 ++ .../site-packages/Xlib/support/__init__.py | 26 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 239 bytes .../__pycache__/connect.cpython-312.pyc | Bin 0 -> 2842 bytes .../support/__pycache__/lock.cpython-312.pyc | Bin 0 -> 911 bytes .../__pycache__/unix_connect.cpython-312.pyc | Bin 0 -> 6889 bytes .../__pycache__/vms_connect.cpython-312.pyc | Bin 0 -> 1778 bytes .../site-packages/Xlib/support/connect.py | 102 + .../site-packages/Xlib/support/lock.py | 44 + .../Xlib/support/unix_connect.py | 217 + .../site-packages/Xlib/support/vms_connect.py | 74 + .../python3.12/site-packages/Xlib/threaded.py | 28 + .../python3.12/site-packages/Xlib/xauth.py | 134 + .../site-packages/Xlib/xobject/__init__.py | 29 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 273 bytes .../__pycache__/colormap.cpython-312.pyc | Bin 0 -> 6722 bytes .../__pycache__/cursor.cpython-312.pyc | Bin 0 -> 1480 bytes .../__pycache__/drawable.cpython-312.pyc | Bin 0 -> 39544 bytes .../__pycache__/fontable.cpython-312.pyc | Bin 0 -> 4644 bytes .../xobject/__pycache__/icccm.cpython-312.pyc | Bin 0 -> 2910 bytes .../__pycache__/resource.cpython-312.pyc | Bin 0 -> 2068 bytes .../site-packages/Xlib/xobject/colormap.py | 141 + .../site-packages/Xlib/xobject/cursor.py | 47 + .../site-packages/Xlib/xobject/drawable.py | 835 ++ .../site-packages/Xlib/xobject/fontable.py | 110 + .../site-packages/Xlib/xobject/icccm.py | 75 + .../site-packages/Xlib/xobject/resource.py | 54 + .../__pycache__/six.cpython-312.pyc | Bin 0 -> 41204 bytes ...s_bindings.cpython-312-x86_64-linux-gnu.so | Bin 0 -> 197240 bytes ...b_bindings.cpython-312-x86_64-linux-gnu.so | Bin 0 -> 29232 bytes .../bidict-0.23.1.dist-info/INSTALLER | 1 + .../bidict-0.23.1.dist-info/LICENSE | 376 + .../bidict-0.23.1.dist-info/METADATA | 260 + .../bidict-0.23.1.dist-info/RECORD | 31 + .../bidict-0.23.1.dist-info/WHEEL | 5 + .../bidict-0.23.1.dist-info/top_level.txt | 1 + .../site-packages/bidict/__init__.py | 103 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2490 bytes .../bidict/__pycache__/_abc.cpython-312.pyc | Bin 0 -> 2818 bytes .../bidict/__pycache__/_base.cpython-312.pyc | Bin 0 -> 23208 bytes .../__pycache__/_bidict.cpython-312.pyc | Bin 0 -> 8518 bytes .../bidict/__pycache__/_dup.cpython-312.pyc | Bin 0 -> 2249 bytes .../bidict/__pycache__/_exc.cpython-312.pyc | Bin 0 -> 1573 bytes .../__pycache__/_frozen.cpython-312.pyc | Bin 0 -> 1527 bytes .../bidict/__pycache__/_iter.cpython-312.pyc | Bin 0 -> 2363 bytes .../__pycache__/_orderedbase.cpython-312.pyc | Bin 0 -> 11158 bytes .../_orderedbidict.cpython-312.pyc | Bin 0 -> 7632 bytes .../__pycache__/_typing.cpython-312.pyc | Bin 0 -> 2309 bytes .../__pycache__/metadata.cpython-312.pyc | Bin 0 -> 561 bytes .../python3.12/site-packages/bidict/_abc.py | 79 + .../python3.12/site-packages/bidict/_base.py | 556 ++ .../site-packages/bidict/_bidict.py | 194 + .../python3.12/site-packages/bidict/_dup.py | 61 + .../python3.12/site-packages/bidict/_exc.py | 36 + .../site-packages/bidict/_frozen.py | 50 + .../python3.12/site-packages/bidict/_iter.py | 51 + .../site-packages/bidict/_orderedbase.py | 238 + .../site-packages/bidict/_orderedbidict.py | 172 + .../site-packages/bidict/_typing.py | 49 + .../site-packages/bidict/metadata.py | 14 + .../python3.12/site-packages/bidict/py.typed | 1 + .../site-packages/cairo/__init__.py | 25 + .../site-packages/cairo/__init__.pyi | 5889 +++++++++++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1208 bytes .../_cairo.cpython-312-x86_64-linux-gnu.so | Bin 0 -> 265512 bytes .../site-packages/cairo/include/py3cairo.h | 266 + .../python3.12/site-packages/cairo/py.typed | 0 .../python3.12/site-packages/dbus/__init__.py | 93 + .../dbus/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2150 bytes .../dbus/__pycache__/_compat.cpython-312.pyc | Bin 0 -> 467 bytes .../dbus/__pycache__/_dbus.cpython-312.pyc | Bin 0 -> 8710 bytes .../_expat_introspect_parser.cpython-312.pyc | Bin 0 -> 3186 bytes .../dbus/__pycache__/bus.cpython-312.pyc | Bin 0 -> 16566 bytes .../__pycache__/connection.cpython-312.pyc | Bin 0 -> 25124 bytes .../__pycache__/decorators.cpython-312.pyc | Bin 0 -> 14695 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 5201 bytes .../__pycache__/gi_service.cpython-312.pyc | Bin 0 -> 2718 bytes .../dbus/__pycache__/glib.cpython-312.pyc | Bin 0 -> 1130 bytes .../dbus/__pycache__/lowlevel.cpython-312.pyc | Bin 0 -> 756 bytes .../dbus/__pycache__/proxies.cpython-312.pyc | Bin 0 -> 24361 bytes .../dbus/__pycache__/server.cpython-312.pyc | Bin 0 -> 4062 bytes .../dbus/__pycache__/service.cpython-312.pyc | Bin 0 -> 31800 bytes .../dbus/__pycache__/types.cpython-312.pyc | Bin 0 -> 692 bytes .../python3.12/site-packages/dbus/_compat.py | 15 + .../python3.12/site-packages/dbus/_dbus.py | 229 + .../dbus/_expat_introspect_parser.py | 87 + venv/lib/python3.12/site-packages/dbus/bus.py | 434 + .../site-packages/dbus/connection.py | 651 ++ .../site-packages/dbus/decorators.py | 362 + .../site-packages/dbus/exceptions.py | 133 + .../site-packages/dbus/gi_service.py | 87 + .../lib/python3.12/site-packages/dbus/glib.py | 53 + .../python3.12/site-packages/dbus/lowlevel.py | 38 + .../site-packages/dbus/mainloop/__init__.py | 64 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 700 bytes .../mainloop/__pycache__/glib.cpython-312.pyc | Bin 0 -> 753 bytes .../site-packages/dbus/mainloop/glib.py | 43 + .../python3.12/site-packages/dbus/proxies.py | 567 ++ .../python3.12/site-packages/dbus/server.py | 119 + .../python3.12/site-packages/dbus/service.py | 840 ++ .../python3.12/site-packages/dbus/types.py | 15 + .../dbus_fast-2.24.4.dist-info/INSTALLER | 1 + .../dbus_fast-2.24.4.dist-info/LICENSE | 22 + .../dbus_fast-2.24.4.dist-info/METADATA | 262 + .../dbus_fast-2.24.4.dist-info/RECORD | 82 + .../dbus_fast-2.24.4.dist-info/WHEEL | 6 + .../site-packages/dbus_fast/__init__.py | 82 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1680 bytes .../__pycache__/__version__.cpython-312.pyc | Bin 0 -> 647 bytes .../__pycache__/auth.cpython-312.pyc | Bin 0 -> 5655 bytes .../__pycache__/constants.cpython-312.pyc | Bin 0 -> 6421 bytes .../__pycache__/errors.cpython-312.pyc | Bin 0 -> 5055 bytes .../__pycache__/introspection.cpython-312.pyc | Bin 0 -> 27518 bytes .../__pycache__/main.cpython-312.pyc | Bin 0 -> 362 bytes .../__pycache__/message.cpython-312.pyc | Bin 0 -> 14380 bytes .../__pycache__/message_bus.cpython-312.pyc | Bin 0 -> 52344 bytes .../__pycache__/proxy_object.cpython-312.pyc | Bin 0 -> 19349 bytes .../__pycache__/send_reply.cpython-312.pyc | Bin 0 -> 2808 bytes .../__pycache__/service.cpython-312.pyc | Bin 0 -> 28853 bytes .../__pycache__/signature.cpython-312.pyc | Bin 0 -> 20767 bytes .../__pycache__/unpack.cpython-312.pyc | Bin 0 -> 1270 bytes .../__pycache__/validators.cpython-312.pyc | Bin 0 -> 6544 bytes .../site-packages/dbus_fast/__version__.py | 10 + .../dbus_fast/_private/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 201 bytes .../_cython_compat.cpython-312.pyc | Bin 0 -> 669 bytes .../__pycache__/address.cpython-312.pyc | Bin 0 -> 5262 bytes .../__pycache__/constants.cpython-312.pyc | Bin 0 -> 755 bytes .../__pycache__/marshaller.cpython-312.pyc | Bin 0 -> 12243 bytes .../__pycache__/unmarshaller.cpython-312.pyc | Bin 0 -> 33755 bytes .../_private/__pycache__/util.cpython-312.pyc | Bin 0 -> 7831 bytes .../dbus_fast/_private/_cython_compat.py | 12 + .../address.cpython-312-x86_64-linux-gnu.so | Bin 0 -> 913656 bytes .../dbus_fast/_private/address.pxd | 15 + .../dbus_fast/_private/address.py | 116 + .../dbus_fast/_private/constants.py | 18 + ...marshaller.cpython-312-x86_64-linux-gnu.so | Bin 0 -> 1296552 bytes .../dbus_fast/_private/marshaller.pxd | 110 + .../dbus_fast/_private/marshaller.py | 229 + ...marshaller.cpython-312-x86_64-linux-gnu.so | Bin 0 -> 2134224 bytes .../dbus_fast/_private/unmarshaller.pxd | 241 + .../dbus_fast/_private/unmarshaller.py | 811 ++ .../site-packages/dbus_fast/_private/util.py | 172 + .../site-packages/dbus_fast/aio/__init__.py | 2 + .../aio/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 322 bytes .../__pycache__/message_bus.cpython-312.pyc | Bin 0 -> 25967 bytes .../message_reader.cpython-312.pyc | Bin 0 -> 1950 bytes .../__pycache__/proxy_object.cpython-312.pyc | Bin 0 -> 9337 bytes .../dbus_fast/aio/message_bus.py | 553 ++ ...age_reader.cpython-312-x86_64-linux-gnu.so | Bin 0 -> 530352 bytes .../dbus_fast/aio/message_reader.pxd | 13 + .../dbus_fast/aio/message_reader.py | 45 + .../dbus_fast/aio/proxy_object.py | 205 + .../site-packages/dbus_fast/auth.py | 127 + .../site-packages/dbus_fast/constants.py | 135 + .../site-packages/dbus_fast/errors.py | 84 + .../site-packages/dbus_fast/glib/__init__.py | 2 + .../glib/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 323 bytes .../__pycache__/message_bus.cpython-312.pyc | Bin 0 -> 22690 bytes .../__pycache__/proxy_object.cpython-312.pyc | Bin 0 -> 13306 bytes .../dbus_fast/glib/message_bus.py | 513 + .../dbus_fast/glib/proxy_object.py | 320 + .../site-packages/dbus_fast/introspection.py | 597 ++ .../site-packages/dbus_fast/main.py | 2 + .../message.cpython-312-x86_64-linux-gnu.so | Bin 0 -> 1188256 bytes .../site-packages/dbus_fast/message.pxd | 56 + .../site-packages/dbus_fast/message.py | 319 + ...essage_bus.cpython-312-x86_64-linux-gnu.so | Bin 0 -> 4405448 bytes .../site-packages/dbus_fast/message_bus.pxd | 70 + .../site-packages/dbus_fast/message_bus.py | 1299 +++ .../site-packages/dbus_fast/proxy_object.py | 341 + .../site-packages/dbus_fast/py.typed | 0 .../site-packages/dbus_fast/send_reply.py | 59 + .../service.cpython-312-x86_64-linux-gnu.so | Bin 0 -> 2882176 bytes .../site-packages/dbus_fast/service.pxd | 51 + .../site-packages/dbus_fast/service.py | 659 ++ .../signature.cpython-312-x86_64-linux-gnu.so | Bin 0 -> 2142408 bytes .../site-packages/dbus_fast/signature.pxd | 26 + .../site-packages/dbus_fast/signature.py | 456 + .../unpack.cpython-312-x86_64-linux-gnu.so | Bin 0 -> 341624 bytes .../site-packages/dbus_fast/unpack.pxd | 13 + .../site-packages/dbus_fast/unpack.py | 24 + .../site-packages/dbus_fast/validators.py | 199 + .../dbus_python-1.3.2.dist-info/INSTALLER | 1 + .../dbus_python-1.3.2.dist-info/METADATA | 60 + .../dbus_python-1.3.2.dist-info/RECORD | 43 + .../dbus_python-1.3.2.dist-info/REQUESTED | 0 .../dbus_python-1.3.2.dist-info/WHEEL | 4 + .../INSTALLER | 1 + .../desktop_notifier-6.0.0.dist-info/LICENSE | 22 + .../desktop_notifier-6.0.0.dist-info/METADATA | 233 + .../desktop_notifier-6.0.0.dist-info/RECORD | 33 + .../REQUESTED | 0 .../desktop_notifier-6.0.0.dist-info/WHEEL | 5 + .../top_level.txt | 1 + .../desktop_notifier/__init__.py | 40 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 827 bytes .../__pycache__/common.cpython-312.pyc | Bin 0 -> 9966 bytes .../__pycache__/main.cpython-312.pyc | Bin 0 -> 14612 bytes .../__pycache__/sync.cpython-312.pyc | Bin 0 -> 6467 bytes .../desktop_notifier/backends/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 208 bytes .../backends/__pycache__/base.cpython-312.pyc | Bin 0 -> 8495 bytes .../backends/__pycache__/dbus.cpython-312.pyc | Bin 0 -> 12287 bytes .../__pycache__/dummy.cpython-312.pyc | Bin 0 -> 2255 bytes .../__pycache__/macos.cpython-312.pyc | Bin 0 -> 19242 bytes .../__pycache__/macos_support.cpython-312.pyc | Bin 0 -> 2858 bytes .../__pycache__/winrt.cpython-312.pyc | Bin 0 -> 12839 bytes .../desktop_notifier/backends/base.py | 187 + .../desktop_notifier/backends/dbus.py | 299 + .../desktop_notifier/backends/dummy.py | 41 + .../desktop_notifier/backends/macos.py | 398 + .../backends/macos_support.py | 89 + .../desktop_notifier/backends/winrt.py | 313 + .../site-packages/desktop_notifier/common.py | 313 + .../site-packages/desktop_notifier/main.py | 343 + .../site-packages/desktop_notifier/py.typed | 0 .../desktop_notifier/resources/__init__.py | 1 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 209 bytes .../desktop_notifier/resources/python.png | Bin 0 -> 5526 bytes .../site-packages/desktop_notifier/sync.py | 134 + .../python3.12/site-packages/gi/__init__.py | 175 + .../gi/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 6075 bytes .../gi/__pycache__/_constants.cpython-312.pyc | Bin 0 -> 2582 bytes .../gi/__pycache__/_error.cpython-312.pyc | Bin 0 -> 2036 bytes .../__pycache__/_gtktemplate.cpython-312.pyc | Bin 0 -> 12536 bytes .../gi/__pycache__/_option.cpython-312.pyc | Bin 0 -> 17554 bytes .../__pycache__/_ossighelper.cpython-312.pyc | Bin 0 -> 10437 bytes .../_propertyhelper.cpython-312.pyc | Bin 0 -> 15814 bytes .../__pycache__/_signalhelper.cpython-312.pyc | Bin 0 -> 10656 bytes .../gi/__pycache__/docstring.cpython-312.pyc | Bin 0 -> 6890 bytes .../gi/__pycache__/events.cpython-312.pyc | Bin 0 -> 31268 bytes .../gi/__pycache__/importer.cpython-312.pyc | Bin 0 -> 5180 bytes .../gi/__pycache__/module.cpython-312.pyc | Bin 0 -> 9330 bytes .../__pycache__/pygtkcompat.cpython-312.pyc | Bin 0 -> 644 bytes .../gi/__pycache__/types.cpython-312.pyc | Bin 0 -> 13192 bytes .../python3.12/site-packages/gi/_constants.py | 47 + .../lib/python3.12/site-packages/gi/_error.py | 55 + .../gi/_gi.cpython-312-x86_64-linux-gnu.so | Bin 0 -> 443216 bytes .../_gi_cairo.cpython-312-x86_64-linux-gnu.so | Bin 0 -> 27568 bytes .../site-packages/gi/_gtktemplate.py | 307 + .../python3.12/site-packages/gi/_option.py | 379 + .../site-packages/gi/_ossighelper.py | 275 + .../site-packages/gi/_propertyhelper.py | 402 + .../site-packages/gi/_signalhelper.py | 249 + .../python3.12/site-packages/gi/docstring.py | 205 + .../lib/python3.12/site-packages/gi/events.py | 650 ++ .../python3.12/site-packages/gi/importer.py | 153 + .../lib/python3.12/site-packages/gi/module.py | 269 + .../gi/overrides/GIMarshallingTests.py | 72 + .../site-packages/gi/overrides/GLib.py | 882 ++ .../site-packages/gi/overrides/GObject.py | 692 ++ .../site-packages/gi/overrides/Gdk.py | 444 + .../site-packages/gi/overrides/GdkPixbuf.py | 53 + .../site-packages/gi/overrides/Gio.py | 615 ++ .../site-packages/gi/overrides/Gtk.py | 1707 ++++ .../site-packages/gi/overrides/Pango.py | 58 + .../site-packages/gi/overrides/__init__.py | 357 + .../GIMarshallingTests.cpython-312.pyc | Bin 0 -> 2653 bytes .../__pycache__/GLib.cpython-312.pyc | Bin 0 -> 38001 bytes .../__pycache__/GObject.cpython-312.pyc | Bin 0 -> 27847 bytes .../overrides/__pycache__/Gdk.cpython-312.pyc | Bin 0 -> 20373 bytes .../__pycache__/GdkPixbuf.cpython-312.pyc | Bin 0 -> 1515 bytes .../overrides/__pycache__/Gio.cpython-312.pyc | Bin 0 -> 26557 bytes .../overrides/__pycache__/Gtk.cpython-312.pyc | Bin 0 -> 85876 bytes .../__pycache__/Pango.cpython-312.pyc | Bin 0 -> 2136 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 15592 bytes .../__pycache__/keysyms.cpython-312.pyc | Bin 0 -> 1275 bytes .../site-packages/gi/overrides/keysyms.py | 53 + .../site-packages/gi/pygtkcompat.py | 26 + .../site-packages/gi/repository/__init__.py | 28 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 403 bytes venv/lib/python3.12/site-packages/gi/types.py | 350 + .../packaging-24.2.dist-info/INSTALLER | 1 + .../packaging-24.2.dist-info/LICENSE | 3 + .../packaging-24.2.dist-info/LICENSE.APACHE | 177 + .../packaging-24.2.dist-info/LICENSE.BSD | 23 + .../packaging-24.2.dist-info/METADATA | 102 + .../packaging-24.2.dist-info/RECORD | 40 + .../packaging-24.2.dist-info/WHEEL | 4 + .../site-packages/packaging/__init__.py | 15 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 557 bytes .../__pycache__/_elffile.cpython-312.pyc | Bin 0 -> 5022 bytes .../__pycache__/_manylinux.cpython-312.pyc | Bin 0 -> 9710 bytes .../__pycache__/_musllinux.cpython-312.pyc | Bin 0 -> 4553 bytes .../__pycache__/_parser.cpython-312.pyc | Bin 0 -> 13984 bytes .../__pycache__/_structures.cpython-312.pyc | Bin 0 -> 3240 bytes .../__pycache__/_tokenizer.cpython-312.pyc | Bin 0 -> 7914 bytes .../__pycache__/markers.cpython-312.pyc | Bin 0 -> 11373 bytes .../__pycache__/metadata.cpython-312.pyc | Bin 0 -> 27211 bytes .../__pycache__/requirements.cpython-312.pyc | Bin 0 -> 4409 bytes .../__pycache__/specifiers.cpython-312.pyc | Bin 0 -> 39017 bytes .../__pycache__/tags.cpython-312.pyc | Bin 0 -> 23004 bytes .../__pycache__/utils.cpython-312.pyc | Bin 0 -> 6634 bytes .../__pycache__/version.cpython-312.pyc | Bin 0 -> 20473 bytes .../site-packages/packaging/_elffile.py | 110 + .../site-packages/packaging/_manylinux.py | 263 + .../site-packages/packaging/_musllinux.py | 85 + .../site-packages/packaging/_parser.py | 354 + .../site-packages/packaging/_structures.py | 61 + .../site-packages/packaging/_tokenizer.py | 194 + .../packaging/licenses/__init__.py | 145 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 4107 bytes .../__pycache__/_spdx.cpython-312.pyc | Bin 0 -> 47363 bytes .../site-packages/packaging/licenses/_spdx.py | 759 ++ .../site-packages/packaging/markers.py | 331 + .../site-packages/packaging/metadata.py | 863 ++ .../site-packages/packaging/py.typed | 0 .../site-packages/packaging/requirements.py | 91 + .../site-packages/packaging/specifiers.py | 1020 ++ .../site-packages/packaging/tags.py | 617 ++ .../site-packages/packaging/utils.py | 163 + .../site-packages/packaging/version.py | 582 ++ .../pillow-11.0.0.dist-info/INSTALLER | 1 + .../pillow-11.0.0.dist-info/LICENSE | 1343 +++ .../pillow-11.0.0.dist-info/METADATA | 175 + .../pillow-11.0.0.dist-info/RECORD | 229 + .../pillow-11.0.0.dist-info/REQUESTED | 0 .../pillow-11.0.0.dist-info/WHEEL | 5 + .../pillow-11.0.0.dist-info/top_level.txt | 1 + .../pillow-11.0.0.dist-info/zip-safe | 1 + .../pillow.libs/libXau-154567c4.so.6.0.0 | Bin 0 -> 22081 bytes .../pillow.libs/libbrotlicommon-3ecfe81c.so.1 | Bin 0 -> 144425 bytes .../pillow.libs/libbrotlidec-ba690955.so.1 | Bin 0 -> 58225 bytes .../libfreetype-e7d5437d.so.6.20.1 | Bin 0 -> 1422625 bytes .../pillow.libs/libharfbuzz-144af51e.so.0 | Bin 0 -> 1583281 bytes .../pillow.libs/libjpeg-45e70d75.so.62.4.0 | Bin 0 -> 815793 bytes .../pillow.libs/liblcms2-e69eef39.so.2.0.16 | Bin 0 -> 514977 bytes .../pillow.libs/liblzma-c9407571.so.5.6.3 | Bin 0 -> 266201 bytes .../pillow.libs/libopenjp2-05423b53.so | Bin 0 -> 581737 bytes .../pillow.libs/libpng16-4cc6a9fc.so.16.44.0 | Bin 0 -> 281913 bytes .../pillow.libs/libsharpyuv-898c0cb5.so.0.1.0 | Bin 0 -> 42049 bytes .../pillow.libs/libtiff-0a86184d.so.6.0.2 | Bin 0 -> 725697 bytes .../pillow.libs/libwebp-2fd3cdca.so.7.1.9 | Bin 0 -> 759849 bytes .../libwebpdemux-f2642bcc.so.2.0.15 | Bin 0 -> 26121 bytes .../pillow.libs/libwebpmux-d524b4d5.so.3.1.0 | Bin 0 -> 54521 bytes .../pillow.libs/libxcb-b8a56d01.so.1.1.0 | Bin 0 -> 251425 bytes .../ping3-4.0.8.dist-info/INSTALLER | 1 + .../ping3-4.0.8.dist-info/LICENSE | 21 + .../ping3-4.0.8.dist-info/METADATA | 341 + .../ping3-4.0.8.dist-info/RECORD | 19 + .../ping3-4.0.8.dist-info/REQUESTED | 0 .../site-packages/ping3-4.0.8.dist-info/WHEEL | 5 + .../ping3-4.0.8.dist-info/entry_points.txt | 2 + .../ping3-4.0.8.dist-info/top_level.txt | 1 + .../site-packages/ping3/__init__.py | 359 + .../site-packages/ping3/__main__.py | 4 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 21532 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 327 bytes .../__pycache__/command_line.cpython-312.pyc | Bin 0 -> 3646 bytes .../ping3/__pycache__/enums.cpython-312.pyc | Bin 0 -> 2137 bytes .../ping3/__pycache__/errors.cpython-312.pyc | Bin 0 -> 3477 bytes .../site-packages/ping3/command_line.py | 37 + .../python3.12/site-packages/ping3/enums.py | 43 + .../python3.12/site-packages/ping3/errors.py | 44 + .../pip-24.3.1.dist-info/AUTHORS.txt | 799 ++ .../pip-24.3.1.dist-info/INSTALLER | 1 + .../pip-24.3.1.dist-info/LICENSE.txt | 20 + .../pip-24.3.1.dist-info/METADATA | 90 + .../site-packages/pip-24.3.1.dist-info/RECORD | 853 ++ .../pip-24.3.1.dist-info/REQUESTED | 0 .../site-packages/pip-24.3.1.dist-info/WHEEL | 5 + .../pip-24.3.1.dist-info/entry_points.txt | 3 + .../pip-24.3.1.dist-info/top_level.txt | 1 + .../python3.12/site-packages/pip/__init__.py | 13 + .../python3.12/site-packages/pip/__main__.py | 24 + .../site-packages/pip/__pip-runner__.py | 50 + .../pip/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 697 bytes .../pip/__pycache__/__main__.cpython-312.pyc | Bin 0 -> 851 bytes .../__pip-runner__.cpython-312.pyc | Bin 0 -> 2215 bytes .../site-packages/pip/_internal/__init__.py | 18 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 797 bytes .../__pycache__/build_env.cpython-312.pyc | Bin 0 -> 14509 bytes .../__pycache__/cache.cpython-312.pyc | Bin 0 -> 12677 bytes .../__pycache__/configuration.cpython-312.pyc | Bin 0 -> 17642 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 36855 bytes .../__pycache__/main.cpython-312.pyc | Bin 0 -> 680 bytes .../__pycache__/pyproject.cpython-312.pyc | Bin 0 -> 5128 bytes .../self_outdated_check.cpython-312.pyc | Bin 0 -> 10218 bytes .../__pycache__/wheel_builder.cpython-312.pyc | Bin 0 -> 13625 bytes .../site-packages/pip/_internal/build_env.py | 319 + .../site-packages/pip/_internal/cache.py | 290 + .../pip/_internal/cli/__init__.py | 4 + .../cli/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 288 bytes .../autocompletion.cpython-312.pyc | Bin 0 -> 8616 bytes .../__pycache__/base_command.cpython-312.pyc | Bin 0 -> 10204 bytes .../__pycache__/cmdoptions.cpython-312.pyc | Bin 0 -> 30405 bytes .../command_context.cpython-312.pyc | Bin 0 -> 1784 bytes .../__pycache__/index_command.cpython-312.pyc | Bin 0 -> 7134 bytes .../cli/__pycache__/main.cpython-312.pyc | Bin 0 -> 2310 bytes .../__pycache__/main_parser.cpython-312.pyc | Bin 0 -> 4916 bytes .../cli/__pycache__/parser.cpython-312.pyc | Bin 0 -> 15050 bytes .../__pycache__/progress_bars.cpython-312.pyc | Bin 0 -> 3854 bytes .../__pycache__/req_command.cpython-312.pyc | Bin 0 -> 12251 bytes .../cli/__pycache__/spinners.cpython-312.pyc | Bin 0 -> 7843 bytes .../__pycache__/status_codes.cpython-312.pyc | Bin 0 -> 385 bytes .../pip/_internal/cli/autocompletion.py | 176 + .../pip/_internal/cli/base_command.py | 231 + .../pip/_internal/cli/cmdoptions.py | 1075 +++ .../pip/_internal/cli/command_context.py | 27 + .../pip/_internal/cli/index_command.py | 170 + .../site-packages/pip/_internal/cli/main.py | 80 + .../pip/_internal/cli/main_parser.py | 134 + .../site-packages/pip/_internal/cli/parser.py | 294 + .../pip/_internal/cli/progress_bars.py | 94 + .../pip/_internal/cli/req_command.py | 329 + .../pip/_internal/cli/spinners.py | 159 + .../pip/_internal/cli/status_codes.py | 6 + .../pip/_internal/commands/__init__.py | 132 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 4012 bytes .../__pycache__/cache.cpython-312.pyc | Bin 0 -> 9711 bytes .../__pycache__/check.cpython-312.pyc | Bin 0 -> 2602 bytes .../__pycache__/completion.cpython-312.pyc | Bin 0 -> 5203 bytes .../__pycache__/configuration.cpython-312.pyc | Bin 0 -> 13173 bytes .../__pycache__/debug.cpython-312.pyc | Bin 0 -> 10078 bytes .../__pycache__/download.cpython-312.pyc | Bin 0 -> 7513 bytes .../__pycache__/freeze.cpython-312.pyc | Bin 0 -> 4395 bytes .../commands/__pycache__/hash.cpython-312.pyc | Bin 0 -> 2978 bytes .../commands/__pycache__/help.cpython-312.pyc | Bin 0 -> 1683 bytes .../__pycache__/index.cpython-312.pyc | Bin 0 -> 6681 bytes .../__pycache__/inspect.cpython-312.pyc | Bin 0 -> 3990 bytes .../__pycache__/install.cpython-312.pyc | Bin 0 -> 29124 bytes .../commands/__pycache__/list.cpython-312.pyc | Bin 0 -> 15767 bytes .../__pycache__/search.cpython-312.pyc | Bin 0 -> 7528 bytes .../commands/__pycache__/show.cpython-312.pyc | Bin 0 -> 10487 bytes .../__pycache__/uninstall.cpython-312.pyc | Bin 0 -> 4719 bytes .../__pycache__/wheel.cpython-312.pyc | Bin 0 -> 8875 bytes .../pip/_internal/commands/cache.py | 225 + .../pip/_internal/commands/check.py | 67 + .../pip/_internal/commands/completion.py | 130 + .../pip/_internal/commands/configuration.py | 280 + .../pip/_internal/commands/debug.py | 201 + .../pip/_internal/commands/download.py | 146 + .../pip/_internal/commands/freeze.py | 109 + .../pip/_internal/commands/hash.py | 59 + .../pip/_internal/commands/help.py | 41 + .../pip/_internal/commands/index.py | 139 + .../pip/_internal/commands/inspect.py | 92 + .../pip/_internal/commands/install.py | 783 ++ .../pip/_internal/commands/list.py | 375 + .../pip/_internal/commands/search.py | 172 + .../pip/_internal/commands/show.py | 217 + .../pip/_internal/commands/uninstall.py | 114 + .../pip/_internal/commands/wheel.py | 182 + .../pip/_internal/configuration.py | 383 + .../pip/_internal/distributions/__init__.py | 21 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 951 bytes .../__pycache__/base.cpython-312.pyc | Bin 0 -> 2903 bytes .../__pycache__/installed.cpython-312.pyc | Bin 0 -> 1710 bytes .../__pycache__/sdist.cpython-312.pyc | Bin 0 -> 8437 bytes .../__pycache__/wheel.cpython-312.pyc | Bin 0 -> 2291 bytes .../pip/_internal/distributions/base.py | 53 + .../pip/_internal/distributions/installed.py | 29 + .../pip/_internal/distributions/sdist.py | 158 + .../pip/_internal/distributions/wheel.py | 42 + .../site-packages/pip/_internal/exceptions.py | 809 ++ .../pip/_internal/index/__init__.py | 2 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 242 bytes .../__pycache__/collector.cpython-312.pyc | Bin 0 -> 21627 bytes .../package_finder.cpython-312.pyc | Bin 0 -> 40658 bytes .../index/__pycache__/sources.cpython-312.pyc | Bin 0 -> 12534 bytes .../pip/_internal/index/collector.py | 494 + .../pip/_internal/index/package_finder.py | 1020 ++ .../pip/_internal/index/sources.py | 284 + .../pip/_internal/locations/__init__.py | 456 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 16450 bytes .../__pycache__/_distutils.cpython-312.pyc | Bin 0 -> 6801 bytes .../__pycache__/_sysconfig.cpython-312.pyc | Bin 0 -> 8038 bytes .../__pycache__/base.cpython-312.pyc | Bin 0 -> 3791 bytes .../pip/_internal/locations/_distutils.py | 172 + .../pip/_internal/locations/_sysconfig.py | 214 + .../pip/_internal/locations/base.py | 81 + .../site-packages/pip/_internal/main.py | 12 + .../pip/_internal/metadata/__init__.py | 128 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 5879 bytes .../__pycache__/_json.cpython-312.pyc | Bin 0 -> 2936 bytes .../metadata/__pycache__/base.cpython-312.pyc | Bin 0 -> 35208 bytes .../__pycache__/pkg_resources.cpython-312.pyc | Bin 0 -> 16094 bytes .../pip/_internal/metadata/_json.py | 84 + .../pip/_internal/metadata/base.py | 688 ++ .../_internal/metadata/importlib/__init__.py | 6 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 368 bytes .../__pycache__/_compat.cpython-312.pyc | Bin 0 -> 4501 bytes .../__pycache__/_dists.cpython-312.pyc | Bin 0 -> 12575 bytes .../__pycache__/_envs.cpython-312.pyc | Bin 0 -> 11089 bytes .../_internal/metadata/importlib/_compat.py | 85 + .../_internal/metadata/importlib/_dists.py | 221 + .../pip/_internal/metadata/importlib/_envs.py | 189 + .../pip/_internal/metadata/pkg_resources.py | 301 + .../pip/_internal/models/__init__.py | 2 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 276 bytes .../__pycache__/candidate.cpython-312.pyc | Bin 0 -> 1614 bytes .../__pycache__/direct_url.cpython-312.pyc | Bin 0 -> 10854 bytes .../format_control.cpython-312.pyc | Bin 0 -> 4233 bytes .../models/__pycache__/index.cpython-312.pyc | Bin 0 -> 1704 bytes .../installation_report.cpython-312.pyc | Bin 0 -> 2287 bytes .../models/__pycache__/link.cpython-312.pyc | Bin 0 -> 26627 bytes .../models/__pycache__/scheme.cpython-312.pyc | Bin 0 -> 1033 bytes .../__pycache__/search_scope.cpython-312.pyc | Bin 0 -> 4997 bytes .../selection_prefs.cpython-312.pyc | Bin 0 -> 1861 bytes .../__pycache__/target_python.cpython-312.pyc | Bin 0 -> 4963 bytes .../models/__pycache__/wheel.cpython-312.pyc | Bin 0 -> 6562 bytes .../pip/_internal/models/candidate.py | 25 + .../pip/_internal/models/direct_url.py | 224 + .../pip/_internal/models/format_control.py | 78 + .../pip/_internal/models/index.py | 28 + .../_internal/models/installation_report.py | 56 + .../pip/_internal/models/link.py | 590 ++ .../pip/_internal/models/scheme.py | 25 + .../pip/_internal/models/search_scope.py | 127 + .../pip/_internal/models/selection_prefs.py | 53 + .../pip/_internal/models/target_python.py | 121 + .../pip/_internal/models/wheel.py | 118 + .../pip/_internal/network/__init__.py | 2 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 264 bytes .../network/__pycache__/auth.cpython-312.pyc | Bin 0 -> 22109 bytes .../network/__pycache__/cache.cpython-312.pyc | Bin 0 -> 6461 bytes .../__pycache__/download.cpython-312.pyc | Bin 0 -> 8489 bytes .../__pycache__/lazy_wheel.cpython-312.pyc | Bin 0 -> 11617 bytes .../__pycache__/session.cpython-312.pyc | Bin 0 -> 18884 bytes .../network/__pycache__/utils.cpython-312.pyc | Bin 0 -> 2265 bytes .../__pycache__/xmlrpc.cpython-312.pyc | Bin 0 -> 2959 bytes .../pip/_internal/network/auth.py | 566 ++ .../pip/_internal/network/cache.py | 106 + .../pip/_internal/network/download.py | 187 + .../pip/_internal/network/lazy_wheel.py | 210 + .../pip/_internal/network/session.py | 522 + .../pip/_internal/network/utils.py | 98 + .../pip/_internal/network/xmlrpc.py | 62 + .../pip/_internal/operations/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 207 bytes .../__pycache__/check.cpython-312.pyc | Bin 0 -> 7114 bytes .../__pycache__/freeze.cpython-312.pyc | Bin 0 -> 10138 bytes .../__pycache__/prepare.cpython-312.pyc | Bin 0 -> 25782 bytes .../_internal/operations/build/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 213 bytes .../__pycache__/build_tracker.cpython-312.pyc | Bin 0 -> 7677 bytes .../__pycache__/metadata.cpython-312.pyc | Bin 0 -> 1867 bytes .../metadata_editable.cpython-312.pyc | Bin 0 -> 1901 bytes .../metadata_legacy.cpython-312.pyc | Bin 0 -> 3021 bytes .../build/__pycache__/wheel.cpython-312.pyc | Bin 0 -> 1687 bytes .../wheel_editable.cpython-312.pyc | Bin 0 -> 2026 bytes .../__pycache__/wheel_legacy.cpython-312.pyc | Bin 0 -> 3856 bytes .../operations/build/build_tracker.py | 138 + .../_internal/operations/build/metadata.py | 39 + .../operations/build/metadata_editable.py | 41 + .../operations/build/metadata_legacy.py | 74 + .../pip/_internal/operations/build/wheel.py | 37 + .../operations/build/wheel_editable.py | 46 + .../operations/build/wheel_legacy.py | 102 + .../pip/_internal/operations/check.py | 181 + .../pip/_internal/operations/freeze.py | 258 + .../_internal/operations/install/__init__.py | 2 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 276 bytes .../editable_legacy.cpython-312.pyc | Bin 0 -> 1808 bytes .../install/__pycache__/wheel.cpython-312.pyc | Bin 0 -> 34113 bytes .../operations/install/editable_legacy.py | 47 + .../pip/_internal/operations/install/wheel.py | 741 ++ .../pip/_internal/operations/prepare.py | 732 ++ .../site-packages/pip/_internal/pyproject.py | 185 + .../pip/_internal/req/__init__.py | 90 + .../req/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 3455 bytes .../__pycache__/constructors.cpython-312.pyc | Bin 0 -> 21265 bytes .../req/__pycache__/req_file.cpython-312.pyc | Bin 0 -> 22133 bytes .../__pycache__/req_install.cpython-312.pyc | Bin 0 -> 38485 bytes .../req/__pycache__/req_set.cpython-312.pyc | Bin 0 -> 5493 bytes .../__pycache__/req_uninstall.cpython-312.pyc | Bin 0 -> 32104 bytes .../pip/_internal/req/constructors.py | 560 ++ .../pip/_internal/req/req_file.py | 574 ++ .../pip/_internal/req/req_install.py | 934 ++ .../pip/_internal/req/req_set.py | 82 + .../pip/_internal/req/req_uninstall.py | 633 ++ .../pip/_internal/resolution/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 207 bytes .../__pycache__/base.cpython-312.pyc | Bin 0 -> 1195 bytes .../pip/_internal/resolution/base.py | 20 + .../_internal/resolution/legacy/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 214 bytes .../__pycache__/resolver.cpython-312.pyc | Bin 0 -> 22589 bytes .../_internal/resolution/legacy/resolver.py | 597 ++ .../resolution/resolvelib/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 218 bytes .../__pycache__/base.cpython-312.pyc | Bin 0 -> 8159 bytes .../__pycache__/candidates.cpython-312.pyc | Bin 0 -> 29418 bytes .../__pycache__/factory.cpython-312.pyc | Bin 0 -> 32529 bytes .../found_candidates.cpython-312.pyc | Bin 0 -> 6803 bytes .../__pycache__/provider.cpython-312.pyc | Bin 0 -> 10533 bytes .../__pycache__/reporter.cpython-312.pyc | Bin 0 -> 5050 bytes .../__pycache__/requirements.cpython-312.pyc | Bin 0 -> 15366 bytes .../__pycache__/resolver.cpython-312.pyc | Bin 0 -> 12324 bytes .../_internal/resolution/resolvelib/base.py | 139 + .../resolution/resolvelib/candidates.py | 574 ++ .../resolution/resolvelib/factory.py | 823 ++ .../resolution/resolvelib/found_candidates.py | 174 + .../resolution/resolvelib/provider.py | 258 + .../resolution/resolvelib/reporter.py | 81 + .../resolution/resolvelib/requirements.py | 245 + .../resolution/resolvelib/resolver.py | 317 + .../pip/_internal/self_outdated_check.py | 244 + .../pip/_internal/utils/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 202 bytes .../__pycache__/_jaraco_text.cpython-312.pyc | Bin 0 -> 4537 bytes .../utils/__pycache__/_log.cpython-312.pyc | Bin 0 -> 1873 bytes .../utils/__pycache__/appdirs.cpython-312.pyc | Bin 0 -> 2417 bytes .../utils/__pycache__/compat.cpython-312.pyc | Bin 0 -> 2914 bytes .../compatibility_tags.cpython-312.pyc | Bin 0 -> 6357 bytes .../__pycache__/datetime.cpython-312.pyc | Bin 0 -> 691 bytes .../__pycache__/deprecation.cpython-312.pyc | Bin 0 -> 4198 bytes .../direct_url_helpers.cpython-312.pyc | Bin 0 -> 3543 bytes .../__pycache__/egg_link.cpython-312.pyc | Bin 0 -> 3213 bytes .../__pycache__/encoding.cpython-312.pyc | Bin 0 -> 2155 bytes .../__pycache__/entrypoints.cpython-312.pyc | Bin 0 -> 4000 bytes .../__pycache__/filesystem.cpython-312.pyc | Bin 0 -> 7336 bytes .../__pycache__/filetypes.cpython-312.pyc | Bin 0 -> 1171 bytes .../utils/__pycache__/glibc.cpython-312.pyc | Bin 0 -> 2426 bytes .../utils/__pycache__/hashes.cpython-312.pyc | Bin 0 -> 7610 bytes .../utils/__pycache__/logging.cpython-312.pyc | Bin 0 -> 13565 bytes .../utils/__pycache__/misc.cpython-312.pyc | Bin 0 -> 33458 bytes .../__pycache__/packaging.cpython-312.pyc | Bin 0 -> 2590 bytes .../utils/__pycache__/retry.cpython-312.pyc | Bin 0 -> 2115 bytes .../setuptools_build.cpython-312.pyc | Bin 0 -> 4557 bytes .../__pycache__/subprocess.cpython-312.pyc | Bin 0 -> 8646 bytes .../__pycache__/temp_dir.cpython-312.pyc | Bin 0 -> 12031 bytes .../__pycache__/unpacking.cpython-312.pyc | Bin 0 -> 13505 bytes .../utils/__pycache__/urls.cpython-312.pyc | Bin 0 -> 2084 bytes .../__pycache__/virtualenv.cpython-312.pyc | Bin 0 -> 4473 bytes .../utils/__pycache__/wheel.cpython-312.pyc | Bin 0 -> 5910 bytes .../pip/_internal/utils/_jaraco_text.py | 109 + .../site-packages/pip/_internal/utils/_log.py | 38 + .../pip/_internal/utils/appdirs.py | 52 + .../pip/_internal/utils/compat.py | 79 + .../pip/_internal/utils/compatibility_tags.py | 188 + .../pip/_internal/utils/datetime.py | 11 + .../pip/_internal/utils/deprecation.py | 124 + .../pip/_internal/utils/direct_url_helpers.py | 87 + .../pip/_internal/utils/egg_link.py | 80 + .../pip/_internal/utils/encoding.py | 36 + .../pip/_internal/utils/entrypoints.py | 84 + .../pip/_internal/utils/filesystem.py | 149 + .../pip/_internal/utils/filetypes.py | 27 + .../pip/_internal/utils/glibc.py | 101 + .../pip/_internal/utils/hashes.py | 147 + .../pip/_internal/utils/logging.py | 347 + .../site-packages/pip/_internal/utils/misc.py | 772 ++ .../pip/_internal/utils/packaging.py | 57 + .../pip/_internal/utils/retry.py | 42 + .../pip/_internal/utils/setuptools_build.py | 146 + .../pip/_internal/utils/subprocess.py | 245 + .../pip/_internal/utils/temp_dir.py | 296 + .../pip/_internal/utils/unpacking.py | 337 + .../site-packages/pip/_internal/utils/urls.py | 55 + .../pip/_internal/utils/virtualenv.py | 104 + .../pip/_internal/utils/wheel.py | 134 + .../pip/_internal/vcs/__init__.py | 15 + .../vcs/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 541 bytes .../vcs/__pycache__/bazaar.cpython-312.pyc | Bin 0 -> 5062 bytes .../vcs/__pycache__/git.cpython-312.pyc | Bin 0 -> 19027 bytes .../vcs/__pycache__/mercurial.cpython-312.pyc | Bin 0 -> 7615 bytes .../__pycache__/subversion.cpython-312.pyc | Bin 0 -> 12534 bytes .../versioncontrol.cpython-312.pyc | Bin 0 -> 29007 bytes .../site-packages/pip/_internal/vcs/bazaar.py | 112 + .../site-packages/pip/_internal/vcs/git.py | 527 + .../pip/_internal/vcs/mercurial.py | 163 + .../pip/_internal/vcs/subversion.py | 324 + .../pip/_internal/vcs/versioncontrol.py | 688 ++ .../pip/_internal/wheel_builder.py | 354 + .../site-packages/pip/_vendor/__init__.py | 116 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 4560 bytes .../typing_extensions.cpython-312.pyc | Bin 0 -> 139462 bytes .../pip/_vendor/cachecontrol/__init__.py | 28 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 913 bytes .../__pycache__/_cmd.cpython-312.pyc | Bin 0 -> 2657 bytes .../__pycache__/adapter.cpython-312.pyc | Bin 0 -> 6475 bytes .../__pycache__/cache.cpython-312.pyc | Bin 0 -> 3798 bytes .../__pycache__/controller.cpython-312.pyc | Bin 0 -> 16235 bytes .../__pycache__/filewrapper.cpython-312.pyc | Bin 0 -> 4358 bytes .../__pycache__/heuristics.cpython-312.pyc | Bin 0 -> 6705 bytes .../__pycache__/serialize.cpython-312.pyc | Bin 0 -> 5272 bytes .../__pycache__/wrapper.cpython-312.pyc | Bin 0 -> 1685 bytes .../pip/_vendor/cachecontrol/_cmd.py | 70 + .../pip/_vendor/cachecontrol/adapter.py | 161 + .../pip/_vendor/cachecontrol/cache.py | 74 + .../_vendor/cachecontrol/caches/__init__.py | 8 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 446 bytes .../__pycache__/file_cache.cpython-312.pyc | Bin 0 -> 7774 bytes .../__pycache__/redis_cache.cpython-312.pyc | Bin 0 -> 2744 bytes .../_vendor/cachecontrol/caches/file_cache.py | 182 + .../cachecontrol/caches/redis_cache.py | 48 + .../pip/_vendor/cachecontrol/controller.py | 499 + .../pip/_vendor/cachecontrol/filewrapper.py | 119 + .../pip/_vendor/cachecontrol/heuristics.py | 154 + .../pip/_vendor/cachecontrol/py.typed | 0 .../pip/_vendor/cachecontrol/serialize.py | 146 + .../pip/_vendor/cachecontrol/wrapper.py | 43 + .../pip/_vendor/certifi/__init__.py | 4 + .../pip/_vendor/certifi/__main__.py | 12 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 329 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 656 bytes .../certifi/__pycache__/core.cpython-312.pyc | Bin 0 -> 3222 bytes .../pip/_vendor/certifi/cacert.pem | 4929 ++++++++++ .../site-packages/pip/_vendor/certifi/core.py | 114 + .../pip/_vendor/certifi/py.typed | 0 .../pip/_vendor/distlib/__init__.py | 33 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1280 bytes .../__pycache__/compat.cpython-312.pyc | Bin 0 -> 45537 bytes .../__pycache__/database.cpython-312.pyc | Bin 0 -> 65592 bytes .../distlib/__pycache__/index.cpython-312.pyc | Bin 0 -> 24327 bytes .../__pycache__/locators.cpython-312.pyc | Bin 0 -> 59872 bytes .../__pycache__/manifest.cpython-312.pyc | Bin 0 -> 15087 bytes .../__pycache__/markers.cpython-312.pyc | Bin 0 -> 7665 bytes .../__pycache__/metadata.cpython-312.pyc | Bin 0 -> 41571 bytes .../__pycache__/resources.cpython-312.pyc | Bin 0 -> 17323 bytes .../__pycache__/scripts.cpython-312.pyc | Bin 0 -> 19764 bytes .../distlib/__pycache__/util.cpython-312.pyc | Bin 0 -> 88046 bytes .../__pycache__/version.cpython-312.pyc | Bin 0 -> 30355 bytes .../distlib/__pycache__/wheel.cpython-312.pyc | Bin 0 -> 52556 bytes .../pip/_vendor/distlib/compat.py | 1137 +++ .../pip/_vendor/distlib/database.py | 1329 +++ .../pip/_vendor/distlib/index.py | 508 + .../pip/_vendor/distlib/locators.py | 1295 +++ .../pip/_vendor/distlib/manifest.py | 384 + .../pip/_vendor/distlib/markers.py | 162 + .../pip/_vendor/distlib/metadata.py | 1031 ++ .../pip/_vendor/distlib/resources.py | 358 + .../pip/_vendor/distlib/scripts.py | 447 + .../site-packages/pip/_vendor/distlib/t32.exe | Bin 0 -> 97792 bytes .../pip/_vendor/distlib/t64-arm.exe | Bin 0 -> 182784 bytes .../site-packages/pip/_vendor/distlib/t64.exe | Bin 0 -> 108032 bytes .../site-packages/pip/_vendor/distlib/util.py | 1984 ++++ .../pip/_vendor/distlib/version.py | 750 ++ .../site-packages/pip/_vendor/distlib/w32.exe | Bin 0 -> 91648 bytes .../pip/_vendor/distlib/w64-arm.exe | Bin 0 -> 168448 bytes .../site-packages/pip/_vendor/distlib/w64.exe | Bin 0 -> 101888 bytes .../pip/_vendor/distlib/wheel.py | 1100 +++ .../pip/_vendor/distro/__init__.py | 54 + .../pip/_vendor/distro/__main__.py | 4 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 971 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 303 bytes .../distro/__pycache__/distro.cpython-312.pyc | Bin 0 -> 53803 bytes .../pip/_vendor/distro/distro.py | 1403 +++ .../site-packages/pip/_vendor/distro/py.typed | 0 .../pip/_vendor/idna/__init__.py | 44 + .../idna/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 892 bytes .../idna/__pycache__/codec.cpython-312.pyc | Bin 0 -> 4987 bytes .../idna/__pycache__/compat.cpython-312.pyc | Bin 0 -> 898 bytes .../idna/__pycache__/core.cpython-312.pyc | Bin 0 -> 15802 bytes .../idna/__pycache__/idnadata.cpython-312.pyc | Bin 0 -> 99487 bytes .../__pycache__/intranges.cpython-312.pyc | Bin 0 -> 2644 bytes .../__pycache__/package_data.cpython-312.pyc | Bin 0 -> 227 bytes .../__pycache__/uts46data.cpython-312.pyc | Bin 0 -> 158859 bytes .../site-packages/pip/_vendor/idna/codec.py | 118 + .../site-packages/pip/_vendor/idna/compat.py | 13 + .../site-packages/pip/_vendor/idna/core.py | 395 + .../pip/_vendor/idna/idnadata.py | 4245 ++++++++ .../pip/_vendor/idna/intranges.py | 54 + .../pip/_vendor/idna/package_data.py | 2 + .../site-packages/pip/_vendor/idna/py.typed | 0 .../pip/_vendor/idna/uts46data.py | 8598 +++++++++++++++++ .../pip/_vendor/msgpack/__init__.py | 55 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1752 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 2036 bytes .../msgpack/__pycache__/ext.cpython-312.pyc | Bin 0 -> 8181 bytes .../__pycache__/fallback.cpython-312.pyc | Bin 0 -> 42054 bytes .../pip/_vendor/msgpack/exceptions.py | 48 + .../site-packages/pip/_vendor/msgpack/ext.py | 168 + .../pip/_vendor/msgpack/fallback.py | 951 ++ .../pip/_vendor/packaging/__init__.py | 15 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 569 bytes .../__pycache__/_elffile.cpython-312.pyc | Bin 0 -> 4978 bytes .../__pycache__/_manylinux.cpython-312.pyc | Bin 0 -> 9696 bytes .../__pycache__/_musllinux.cpython-312.pyc | Bin 0 -> 4565 bytes .../__pycache__/_parser.cpython-312.pyc | Bin 0 -> 13996 bytes .../__pycache__/_structures.cpython-312.pyc | Bin 0 -> 3252 bytes .../__pycache__/_tokenizer.cpython-312.pyc | Bin 0 -> 7926 bytes .../__pycache__/markers.cpython-312.pyc | Bin 0 -> 11022 bytes .../__pycache__/metadata.cpython-312.pyc | Bin 0 -> 24964 bytes .../__pycache__/requirements.cpython-312.pyc | Bin 0 -> 4421 bytes .../__pycache__/specifiers.cpython-312.pyc | Bin 0 -> 38750 bytes .../__pycache__/tags.cpython-312.pyc | Bin 0 -> 23230 bytes .../__pycache__/utils.cpython-312.pyc | Bin 0 -> 7352 bytes .../__pycache__/version.cpython-312.pyc | Bin 0 -> 19518 bytes .../pip/_vendor/packaging/_elffile.py | 110 + .../pip/_vendor/packaging/_manylinux.py | 262 + .../pip/_vendor/packaging/_musllinux.py | 85 + .../pip/_vendor/packaging/_parser.py | 354 + .../pip/_vendor/packaging/_structures.py | 61 + .../pip/_vendor/packaging/_tokenizer.py | 194 + .../pip/_vendor/packaging/markers.py | 325 + .../pip/_vendor/packaging/metadata.py | 804 ++ .../pip/_vendor/packaging/py.typed | 0 .../pip/_vendor/packaging/requirements.py | 91 + .../pip/_vendor/packaging/specifiers.py | 1009 ++ .../pip/_vendor/packaging/tags.py | 627 ++ .../pip/_vendor/packaging/utils.py | 174 + .../pip/_vendor/packaging/version.py | 563 ++ .../pip/_vendor/pkg_resources/__init__.py | 3676 +++++++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 161272 bytes .../pip/_vendor/platformdirs/__init__.py | 627 ++ .../pip/_vendor/platformdirs/__main__.py | 55 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 19840 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 1959 bytes .../__pycache__/android.cpython-312.pyc | Bin 0 -> 10708 bytes .../__pycache__/api.cpython-312.pyc | Bin 0 -> 12922 bytes .../__pycache__/macos.cpython-312.pyc | Bin 0 -> 8018 bytes .../__pycache__/unix.cpython-312.pyc | Bin 0 -> 15048 bytes .../__pycache__/version.cpython-312.pyc | Bin 0 -> 608 bytes .../__pycache__/windows.cpython-312.pyc | Bin 0 -> 13685 bytes .../pip/_vendor/platformdirs/android.py | 249 + .../pip/_vendor/platformdirs/api.py | 292 + .../pip/_vendor/platformdirs/macos.py | 130 + .../pip/_vendor/platformdirs/py.typed | 0 .../pip/_vendor/platformdirs/unix.py | 275 + .../pip/_vendor/platformdirs/version.py | 16 + .../pip/_vendor/platformdirs/windows.py | 272 + .../pip/_vendor/pygments/__init__.py | 82 + .../pip/_vendor/pygments/__main__.py | 17 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 3500 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 746 bytes .../__pycache__/cmdline.cpython-312.pyc | Bin 0 -> 26596 bytes .../__pycache__/console.cpython-312.pyc | Bin 0 -> 2640 bytes .../__pycache__/filter.cpython-312.pyc | Bin 0 -> 3233 bytes .../__pycache__/formatter.cpython-312.pyc | Bin 0 -> 4732 bytes .../__pycache__/lexer.cpython-312.pyc | Bin 0 -> 38373 bytes .../__pycache__/modeline.cpython-312.pyc | Bin 0 -> 1571 bytes .../__pycache__/plugin.cpython-312.pyc | Bin 0 -> 2620 bytes .../__pycache__/regexopt.cpython-312.pyc | Bin 0 -> 4089 bytes .../__pycache__/scanner.cpython-312.pyc | Bin 0 -> 4768 bytes .../__pycache__/sphinxext.cpython-312.pyc | Bin 0 -> 12110 bytes .../__pycache__/style.cpython-312.pyc | Bin 0 -> 6705 bytes .../__pycache__/token.cpython-312.pyc | Bin 0 -> 8201 bytes .../__pycache__/unistring.cpython-312.pyc | Bin 0 -> 32984 bytes .../pygments/__pycache__/util.cpython-312.pyc | Bin 0 -> 14081 bytes .../pip/_vendor/pygments/cmdline.py | 668 ++ .../pip/_vendor/pygments/console.py | 70 + .../pip/_vendor/pygments/filter.py | 70 + .../pip/_vendor/pygments/filters/__init__.py | 940 ++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 37923 bytes .../pip/_vendor/pygments/formatter.py | 129 + .../_vendor/pygments/formatters/__init__.py | 157 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 6914 bytes .../__pycache__/_mapping.cpython-312.pyc | Bin 0 -> 4227 bytes .../__pycache__/bbcode.cpython-312.pyc | Bin 0 -> 4234 bytes .../__pycache__/groff.cpython-312.pyc | Bin 0 -> 7305 bytes .../__pycache__/html.cpython-312.pyc | Bin 0 -> 41038 bytes .../__pycache__/img.cpython-312.pyc | Bin 0 -> 28560 bytes .../__pycache__/irc.cpython-312.pyc | Bin 0 -> 6067 bytes .../__pycache__/latex.cpython-312.pyc | Bin 0 -> 20137 bytes .../__pycache__/other.cpython-312.pyc | Bin 0 -> 6889 bytes .../__pycache__/pangomarkup.cpython-312.pyc | Bin 0 -> 2970 bytes .../__pycache__/rtf.cpython-312.pyc | Bin 0 -> 13785 bytes .../__pycache__/svg.cpython-312.pyc | Bin 0 -> 9151 bytes .../__pycache__/terminal.cpython-312.pyc | Bin 0 -> 5831 bytes .../__pycache__/terminal256.cpython-312.pyc | Bin 0 -> 15130 bytes .../_vendor/pygments/formatters/_mapping.py | 23 + .../pip/_vendor/pygments/formatters/bbcode.py | 108 + .../pip/_vendor/pygments/formatters/groff.py | 170 + .../pip/_vendor/pygments/formatters/html.py | 987 ++ .../pip/_vendor/pygments/formatters/img.py | 685 ++ .../pip/_vendor/pygments/formatters/irc.py | 154 + .../pip/_vendor/pygments/formatters/latex.py | 518 + .../pip/_vendor/pygments/formatters/other.py | 160 + .../pygments/formatters/pangomarkup.py | 83 + .../pip/_vendor/pygments/formatters/rtf.py | 349 + .../pip/_vendor/pygments/formatters/svg.py | 185 + .../_vendor/pygments/formatters/terminal.py | 127 + .../pygments/formatters/terminal256.py | 338 + .../pip/_vendor/pygments/lexer.py | 963 ++ .../pip/_vendor/pygments/lexers/__init__.py | 362 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 14633 bytes .../__pycache__/_mapping.cpython-312.pyc | Bin 0 -> 68275 bytes .../lexers/__pycache__/python.cpython-312.pyc | Bin 0 -> 42979 bytes .../pip/_vendor/pygments/lexers/_mapping.py | 589 ++ .../pip/_vendor/pygments/lexers/python.py | 1198 +++ .../pip/_vendor/pygments/modeline.py | 43 + .../pip/_vendor/pygments/plugin.py | 72 + .../pip/_vendor/pygments/regexopt.py | 91 + .../pip/_vendor/pygments/scanner.py | 104 + .../pip/_vendor/pygments/sphinxext.py | 247 + .../pip/_vendor/pygments/style.py | 203 + .../pip/_vendor/pygments/styles/__init__.py | 61 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2676 bytes .../__pycache__/_mapping.cpython-312.pyc | Bin 0 -> 3660 bytes .../pip/_vendor/pygments/styles/_mapping.py | 54 + .../pip/_vendor/pygments/token.py | 214 + .../pip/_vendor/pygments/unistring.py | 153 + .../pip/_vendor/pygments/util.py | 324 + .../pip/_vendor/pyproject_hooks/__init__.py | 23 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 625 bytes .../__pycache__/_compat.cpython-312.pyc | Bin 0 -> 386 bytes .../__pycache__/_impl.cpython-312.pyc | Bin 0 -> 14705 bytes .../pip/_vendor/pyproject_hooks/_compat.py | 8 + .../pip/_vendor/pyproject_hooks/_impl.py | 330 + .../pyproject_hooks/_in_process/__init__.py | 18 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1092 bytes .../__pycache__/_in_process.cpython-312.pyc | Bin 0 -> 14365 bytes .../_in_process/_in_process.py | 353 + .../pip/_vendor/requests/__init__.py | 179 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 5265 bytes .../__pycache__/__version__.cpython-312.pyc | Bin 0 -> 596 bytes .../_internal_utils.cpython-312.pyc | Bin 0 -> 2036 bytes .../__pycache__/adapters.cpython-312.pyc | Bin 0 -> 28443 bytes .../requests/__pycache__/api.cpython-312.pyc | Bin 0 -> 7203 bytes .../requests/__pycache__/auth.cpython-312.pyc | Bin 0 -> 13933 bytes .../__pycache__/certs.cpython-312.pyc | Bin 0 -> 934 bytes .../__pycache__/compat.cpython-312.pyc | Bin 0 -> 1689 bytes .../__pycache__/cookies.cpython-312.pyc | Bin 0 -> 25210 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 7610 bytes .../requests/__pycache__/help.cpython-312.pyc | Bin 0 -> 4240 bytes .../__pycache__/hooks.cpython-312.pyc | Bin 0 -> 1063 bytes .../__pycache__/models.cpython-312.pyc | Bin 0 -> 35440 bytes .../__pycache__/packages.cpython-312.pyc | Bin 0 -> 1278 bytes .../__pycache__/sessions.cpython-312.pyc | Bin 0 -> 27858 bytes .../__pycache__/status_codes.cpython-312.pyc | Bin 0 -> 6035 bytes .../__pycache__/structures.cpython-312.pyc | Bin 0 -> 5635 bytes .../__pycache__/utils.cpython-312.pyc | Bin 0 -> 36378 bytes .../pip/_vendor/requests/__version__.py | 14 + .../pip/_vendor/requests/_internal_utils.py | 50 + .../pip/_vendor/requests/adapters.py | 719 ++ .../site-packages/pip/_vendor/requests/api.py | 157 + .../pip/_vendor/requests/auth.py | 314 + .../pip/_vendor/requests/certs.py | 24 + .../pip/_vendor/requests/compat.py | 78 + .../pip/_vendor/requests/cookies.py | 561 ++ .../pip/_vendor/requests/exceptions.py | 151 + .../pip/_vendor/requests/help.py | 127 + .../pip/_vendor/requests/hooks.py | 33 + .../pip/_vendor/requests/models.py | 1037 ++ .../pip/_vendor/requests/packages.py | 25 + .../pip/_vendor/requests/sessions.py | 831 ++ .../pip/_vendor/requests/status_codes.py | 128 + .../pip/_vendor/requests/structures.py | 99 + .../pip/_vendor/requests/utils.py | 1096 +++ .../pip/_vendor/resolvelib/__init__.py | 26 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 646 bytes .../__pycache__/providers.cpython-312.pyc | Bin 0 -> 6863 bytes .../__pycache__/reporters.cpython-312.pyc | Bin 0 -> 2666 bytes .../__pycache__/resolvers.cpython-312.pyc | Bin 0 -> 25892 bytes .../__pycache__/structs.cpython-312.pyc | Bin 0 -> 10512 bytes .../pip/_vendor/resolvelib/compat/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 212 bytes .../collections_abc.cpython-312.pyc | Bin 0 -> 432 bytes .../resolvelib/compat/collections_abc.py | 6 + .../pip/_vendor/resolvelib/providers.py | 133 + .../pip/_vendor/resolvelib/py.typed | 0 .../pip/_vendor/resolvelib/reporters.py | 43 + .../pip/_vendor/resolvelib/resolvers.py | 547 ++ .../pip/_vendor/resolvelib/structs.py | 170 + .../pip/_vendor/rich/__init__.py | 177 + .../pip/_vendor/rich/__main__.py | 273 + .../rich/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 7027 bytes .../rich/__pycache__/__main__.cpython-312.pyc | Bin 0 -> 10304 bytes .../__pycache__/_cell_widths.cpython-312.pyc | Bin 0 -> 7884 bytes .../__pycache__/_emoji_codes.cpython-312.pyc | Bin 0 -> 205988 bytes .../_emoji_replace.cpython-312.pyc | Bin 0 -> 1741 bytes .../_export_format.cpython-312.pyc | Bin 0 -> 2361 bytes .../__pycache__/_extension.cpython-312.pyc | Bin 0 -> 549 bytes .../rich/__pycache__/_fileno.cpython-312.pyc | Bin 0 -> 867 bytes .../rich/__pycache__/_inspect.cpython-312.pyc | Bin 0 -> 12085 bytes .../__pycache__/_log_render.cpython-312.pyc | Bin 0 -> 4159 bytes .../rich/__pycache__/_loop.cpython-312.pyc | Bin 0 -> 1882 bytes .../__pycache__/_null_file.cpython-312.pyc | Bin 0 -> 3632 bytes .../__pycache__/_palettes.cpython-312.pyc | Bin 0 -> 5172 bytes .../rich/__pycache__/_pick.cpython-312.pyc | Bin 0 -> 733 bytes .../rich/__pycache__/_ratio.cpython-312.pyc | Bin 0 -> 6582 bytes .../__pycache__/_spinners.cpython-312.pyc | Bin 0 -> 13191 bytes .../rich/__pycache__/_stack.cpython-312.pyc | Bin 0 -> 977 bytes .../rich/__pycache__/_timer.cpython-312.pyc | Bin 0 -> 877 bytes .../_win32_console.cpython-312.pyc | Bin 0 -> 28988 bytes .../rich/__pycache__/_windows.cpython-312.pyc | Bin 0 -> 2502 bytes .../_windows_renderer.cpython-312.pyc | Bin 0 -> 3575 bytes .../rich/__pycache__/_wrap.cpython-312.pyc | Bin 0 -> 3338 bytes .../rich/__pycache__/abc.cpython-312.pyc | Bin 0 -> 1620 bytes .../rich/__pycache__/align.cpython-312.pyc | Bin 0 -> 12299 bytes .../rich/__pycache__/ansi.cpython-312.pyc | Bin 0 -> 9078 bytes .../rich/__pycache__/bar.cpython-312.pyc | Bin 0 -> 4284 bytes .../rich/__pycache__/box.cpython-312.pyc | Bin 0 -> 11850 bytes .../rich/__pycache__/cells.cpython-312.pyc | Bin 0 -> 5822 bytes .../rich/__pycache__/color.cpython-312.pyc | Bin 0 -> 26581 bytes .../__pycache__/color_triplet.cpython-312.pyc | Bin 0 -> 1713 bytes .../rich/__pycache__/columns.cpython-312.pyc | Bin 0 -> 8596 bytes .../rich/__pycache__/console.cpython-312.pyc | Bin 0 -> 113448 bytes .../__pycache__/constrain.cpython-312.pyc | Bin 0 -> 2270 bytes .../__pycache__/containers.cpython-312.pyc | Bin 0 -> 9222 bytes .../rich/__pycache__/control.cpython-312.pyc | Bin 0 -> 10953 bytes .../default_styles.cpython-312.pyc | Bin 0 -> 10378 bytes .../rich/__pycache__/diagnose.cpython-312.pyc | Bin 0 -> 1500 bytes .../rich/__pycache__/emoji.cpython-312.pyc | Bin 0 -> 4224 bytes .../rich/__pycache__/errors.cpython-312.pyc | Bin 0 -> 1857 bytes .../__pycache__/file_proxy.cpython-312.pyc | Bin 0 -> 3583 bytes .../rich/__pycache__/filesize.cpython-312.pyc | Bin 0 -> 3084 bytes .../__pycache__/highlighter.cpython-312.pyc | Bin 0 -> 9899 bytes .../rich/__pycache__/json.cpython-312.pyc | Bin 0 -> 6047 bytes .../rich/__pycache__/jupyter.cpython-312.pyc | Bin 0 -> 5220 bytes .../rich/__pycache__/layout.cpython-312.pyc | Bin 0 -> 20170 bytes .../rich/__pycache__/live.cpython-312.pyc | Bin 0 -> 19021 bytes .../__pycache__/live_render.cpython-312.pyc | Bin 0 -> 4901 bytes .../rich/__pycache__/logging.cpython-312.pyc | Bin 0 -> 13566 bytes .../rich/__pycache__/markup.cpython-312.pyc | Bin 0 -> 9579 bytes .../rich/__pycache__/measure.cpython-312.pyc | Bin 0 -> 6390 bytes .../rich/__pycache__/padding.cpython-312.pyc | Bin 0 -> 7136 bytes .../rich/__pycache__/pager.cpython-312.pyc | Bin 0 -> 1823 bytes .../rich/__pycache__/palette.cpython-312.pyc | Bin 0 -> 5309 bytes .../rich/__pycache__/panel.cpython-312.pyc | Bin 0 -> 12195 bytes .../rich/__pycache__/pretty.cpython-312.pyc | Bin 0 -> 40159 bytes .../rich/__pycache__/progress.cpython-312.pyc | Bin 0 -> 74947 bytes .../__pycache__/progress_bar.cpython-312.pyc | Bin 0 -> 10389 bytes .../rich/__pycache__/prompt.cpython-312.pyc | Bin 0 -> 14799 bytes .../rich/__pycache__/protocol.cpython-312.pyc | Bin 0 -> 1804 bytes .../rich/__pycache__/region.cpython-312.pyc | Bin 0 -> 579 bytes .../rich/__pycache__/repr.cpython-312.pyc | Bin 0 -> 6625 bytes .../rich/__pycache__/rule.cpython-312.pyc | Bin 0 -> 6580 bytes .../rich/__pycache__/scope.cpython-312.pyc | Bin 0 -> 3837 bytes .../rich/__pycache__/screen.cpython-312.pyc | Bin 0 -> 2491 bytes .../rich/__pycache__/segment.cpython-312.pyc | Bin 0 -> 28127 bytes .../rich/__pycache__/spinner.cpython-312.pyc | Bin 0 -> 6076 bytes .../rich/__pycache__/status.cpython-312.pyc | Bin 0 -> 6073 bytes .../rich/__pycache__/style.cpython-312.pyc | Bin 0 -> 33512 bytes .../rich/__pycache__/styled.cpython-312.pyc | Bin 0 -> 2151 bytes .../rich/__pycache__/syntax.cpython-312.pyc | Bin 0 -> 39960 bytes .../rich/__pycache__/table.cpython-312.pyc | Bin 0 -> 43551 bytes .../terminal_theme.cpython-312.pyc | Bin 0 -> 3360 bytes .../rich/__pycache__/text.cpython-312.pyc | Bin 0 -> 60861 bytes .../rich/__pycache__/theme.cpython-312.pyc | Bin 0 -> 6347 bytes .../rich/__pycache__/themes.cpython-312.pyc | Bin 0 -> 326 bytes .../__pycache__/traceback.cpython-312.pyc | Bin 0 -> 31523 bytes .../rich/__pycache__/tree.cpython-312.pyc | Bin 0 -> 11448 bytes .../pip/_vendor/rich/_cell_widths.py | 454 + .../pip/_vendor/rich/_emoji_codes.py | 3610 +++++++ .../pip/_vendor/rich/_emoji_replace.py | 32 + .../pip/_vendor/rich/_export_format.py | 76 + .../pip/_vendor/rich/_extension.py | 10 + .../site-packages/pip/_vendor/rich/_fileno.py | 24 + .../pip/_vendor/rich/_inspect.py | 270 + .../pip/_vendor/rich/_log_render.py | 94 + .../site-packages/pip/_vendor/rich/_loop.py | 43 + .../pip/_vendor/rich/_null_file.py | 69 + .../pip/_vendor/rich/_palettes.py | 309 + .../site-packages/pip/_vendor/rich/_pick.py | 17 + .../site-packages/pip/_vendor/rich/_ratio.py | 159 + .../pip/_vendor/rich/_spinners.py | 482 + .../site-packages/pip/_vendor/rich/_stack.py | 16 + .../site-packages/pip/_vendor/rich/_timer.py | 19 + .../pip/_vendor/rich/_win32_console.py | 662 ++ .../pip/_vendor/rich/_windows.py | 71 + .../pip/_vendor/rich/_windows_renderer.py | 56 + .../site-packages/pip/_vendor/rich/_wrap.py | 93 + .../site-packages/pip/_vendor/rich/abc.py | 33 + .../site-packages/pip/_vendor/rich/align.py | 311 + .../site-packages/pip/_vendor/rich/ansi.py | 240 + .../site-packages/pip/_vendor/rich/bar.py | 93 + .../site-packages/pip/_vendor/rich/box.py | 480 + .../site-packages/pip/_vendor/rich/cells.py | 167 + .../site-packages/pip/_vendor/rich/color.py | 621 ++ .../pip/_vendor/rich/color_triplet.py | 38 + .../site-packages/pip/_vendor/rich/columns.py | 187 + .../site-packages/pip/_vendor/rich/console.py | 2633 +++++ .../pip/_vendor/rich/constrain.py | 37 + .../pip/_vendor/rich/containers.py | 167 + .../site-packages/pip/_vendor/rich/control.py | 225 + .../pip/_vendor/rich/default_styles.py | 190 + .../pip/_vendor/rich/diagnose.py | 37 + .../site-packages/pip/_vendor/rich/emoji.py | 96 + .../site-packages/pip/_vendor/rich/errors.py | 34 + .../pip/_vendor/rich/file_proxy.py | 57 + .../pip/_vendor/rich/filesize.py | 89 + .../pip/_vendor/rich/highlighter.py | 232 + .../site-packages/pip/_vendor/rich/json.py | 139 + .../site-packages/pip/_vendor/rich/jupyter.py | 101 + .../site-packages/pip/_vendor/rich/layout.py | 442 + .../site-packages/pip/_vendor/rich/live.py | 375 + .../pip/_vendor/rich/live_render.py | 112 + .../site-packages/pip/_vendor/rich/logging.py | 289 + .../site-packages/pip/_vendor/rich/markup.py | 251 + .../site-packages/pip/_vendor/rich/measure.py | 151 + .../site-packages/pip/_vendor/rich/padding.py | 141 + .../site-packages/pip/_vendor/rich/pager.py | 34 + .../site-packages/pip/_vendor/rich/palette.py | 100 + .../site-packages/pip/_vendor/rich/panel.py | 312 + .../site-packages/pip/_vendor/rich/pretty.py | 995 ++ .../pip/_vendor/rich/progress.py | 1699 ++++ .../pip/_vendor/rich/progress_bar.py | 223 + .../site-packages/pip/_vendor/rich/prompt.py | 375 + .../pip/_vendor/rich/protocol.py | 42 + .../site-packages/pip/_vendor/rich/py.typed | 0 .../site-packages/pip/_vendor/rich/region.py | 10 + .../site-packages/pip/_vendor/rich/repr.py | 149 + .../site-packages/pip/_vendor/rich/rule.py | 130 + .../site-packages/pip/_vendor/rich/scope.py | 86 + .../site-packages/pip/_vendor/rich/screen.py | 54 + .../site-packages/pip/_vendor/rich/segment.py | 738 ++ .../site-packages/pip/_vendor/rich/spinner.py | 137 + .../site-packages/pip/_vendor/rich/status.py | 131 + .../site-packages/pip/_vendor/rich/style.py | 796 ++ .../site-packages/pip/_vendor/rich/styled.py | 42 + .../site-packages/pip/_vendor/rich/syntax.py | 958 ++ .../site-packages/pip/_vendor/rich/table.py | 1000 ++ .../pip/_vendor/rich/terminal_theme.py | 153 + .../site-packages/pip/_vendor/rich/text.py | 1357 +++ .../site-packages/pip/_vendor/rich/theme.py | 115 + .../site-packages/pip/_vendor/rich/themes.py | 5 + .../pip/_vendor/rich/traceback.py | 753 ++ .../site-packages/pip/_vendor/rich/tree.py | 249 + .../pip/_vendor/tomli/__init__.py | 11 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 396 bytes .../tomli/__pycache__/_parser.cpython-312.pyc | Bin 0 -> 26911 bytes .../tomli/__pycache__/_re.cpython-312.pyc | Bin 0 -> 3920 bytes .../tomli/__pycache__/_types.cpython-312.pyc | Bin 0 -> 378 bytes .../pip/_vendor/tomli/_parser.py | 691 ++ .../site-packages/pip/_vendor/tomli/_re.py | 107 + .../site-packages/pip/_vendor/tomli/_types.py | 10 + .../site-packages/pip/_vendor/tomli/py.typed | 1 + .../pip/_vendor/truststore/__init__.py | 36 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1356 bytes .../__pycache__/_api.cpython-312.pyc | Bin 0 -> 16785 bytes .../__pycache__/_macos.cpython-312.pyc | Bin 0 -> 18999 bytes .../__pycache__/_openssl.cpython-312.pyc | Bin 0 -> 2217 bytes .../_ssl_constants.cpython-312.pyc | Bin 0 -> 1111 bytes .../__pycache__/_windows.cpython-312.pyc | Bin 0 -> 15777 bytes .../pip/_vendor/truststore/_api.py | 316 + .../pip/_vendor/truststore/_macos.py | 571 ++ .../pip/_vendor/truststore/_openssl.py | 66 + .../pip/_vendor/truststore/_ssl_constants.py | 31 + .../pip/_vendor/truststore/_windows.py | 567 ++ .../pip/_vendor/truststore/py.typed | 0 .../pip/_vendor/typing_extensions.py | 3641 +++++++ .../pip/_vendor/urllib3/__init__.py | 102 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 3417 bytes .../__pycache__/_collections.cpython-312.pyc | Bin 0 -> 16376 bytes .../__pycache__/_version.cpython-312.pyc | Bin 0 -> 230 bytes .../__pycache__/connection.cpython-312.pyc | Bin 0 -> 20415 bytes .../connectionpool.cpython-312.pyc | Bin 0 -> 36550 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 13505 bytes .../__pycache__/fields.cpython-312.pyc | Bin 0 -> 10414 bytes .../__pycache__/filepost.cpython-312.pyc | Bin 0 -> 4024 bytes .../__pycache__/poolmanager.cpython-312.pyc | Bin 0 -> 20441 bytes .../__pycache__/request.cpython-312.pyc | Bin 0 -> 7306 bytes .../__pycache__/response.cpython-312.pyc | Bin 0 -> 33955 bytes .../pip/_vendor/urllib3/_collections.py | 355 + .../pip/_vendor/urllib3/_version.py | 2 + .../pip/_vendor/urllib3/connection.py | 572 ++ .../pip/_vendor/urllib3/connectionpool.py | 1140 +++ .../pip/_vendor/urllib3/contrib/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 210 bytes .../_appengine_environ.cpython-312.pyc | Bin 0 -> 1860 bytes .../__pycache__/appengine.cpython-312.pyc | Bin 0 -> 11576 bytes .../__pycache__/ntlmpool.cpython-312.pyc | Bin 0 -> 5726 bytes .../__pycache__/pyopenssl.cpython-312.pyc | Bin 0 -> 24460 bytes .../securetransport.cpython-312.pyc | Bin 0 -> 35513 bytes .../contrib/__pycache__/socks.cpython-312.pyc | Bin 0 -> 7523 bytes .../urllib3/contrib/_appengine_environ.py | 36 + .../contrib/_securetransport/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 227 bytes .../__pycache__/bindings.cpython-312.pyc | Bin 0 -> 17439 bytes .../__pycache__/low_level.cpython-312.pyc | Bin 0 -> 14775 bytes .../contrib/_securetransport/bindings.py | 519 + .../contrib/_securetransport/low_level.py | 397 + .../pip/_vendor/urllib3/contrib/appengine.py | 314 + .../pip/_vendor/urllib3/contrib/ntlmpool.py | 130 + .../pip/_vendor/urllib3/contrib/pyopenssl.py | 518 + .../urllib3/contrib/securetransport.py | 920 ++ .../pip/_vendor/urllib3/contrib/socks.py | 216 + .../pip/_vendor/urllib3/exceptions.py | 323 + .../pip/_vendor/urllib3/fields.py | 274 + .../pip/_vendor/urllib3/filepost.py | 98 + .../pip/_vendor/urllib3/packages/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 211 bytes .../packages/__pycache__/six.cpython-312.pyc | Bin 0 -> 41267 bytes .../urllib3/packages/backports/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 221 bytes .../__pycache__/makefile.cpython-312.pyc | Bin 0 -> 1837 bytes .../weakref_finalize.cpython-312.pyc | Bin 0 -> 7348 bytes .../urllib3/packages/backports/makefile.py | 51 + .../packages/backports/weakref_finalize.py | 155 + .../pip/_vendor/urllib3/packages/six.py | 1076 +++ .../pip/_vendor/urllib3/poolmanager.py | 540 ++ .../pip/_vendor/urllib3/request.py | 191 + .../pip/_vendor/urllib3/response.py | 879 ++ .../pip/_vendor/urllib3/util/__init__.py | 49 + .../util/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1158 bytes .../__pycache__/connection.cpython-312.pyc | Bin 0 -> 4759 bytes .../util/__pycache__/proxy.cpython-312.pyc | Bin 0 -> 1564 bytes .../util/__pycache__/queue.cpython-312.pyc | Bin 0 -> 1364 bytes .../util/__pycache__/request.cpython-312.pyc | Bin 0 -> 4195 bytes .../util/__pycache__/response.cpython-312.pyc | Bin 0 -> 3004 bytes .../util/__pycache__/retry.cpython-312.pyc | Bin 0 -> 21734 bytes .../util/__pycache__/ssl_.cpython-312.pyc | Bin 0 -> 15376 bytes .../ssl_match_hostname.cpython-312.pyc | Bin 0 -> 5063 bytes .../__pycache__/ssltransport.cpython-312.pyc | Bin 0 -> 10765 bytes .../util/__pycache__/timeout.cpython-312.pyc | Bin 0 -> 11151 bytes .../util/__pycache__/url.cpython-312.pyc | Bin 0 -> 15797 bytes .../util/__pycache__/wait.cpython-312.pyc | Bin 0 -> 4415 bytes .../pip/_vendor/urllib3/util/connection.py | 149 + .../pip/_vendor/urllib3/util/proxy.py | 57 + .../pip/_vendor/urllib3/util/queue.py | 22 + .../pip/_vendor/urllib3/util/request.py | 137 + .../pip/_vendor/urllib3/util/response.py | 107 + .../pip/_vendor/urllib3/util/retry.py | 622 ++ .../pip/_vendor/urllib3/util/ssl_.py | 504 + .../urllib3/util/ssl_match_hostname.py | 159 + .../pip/_vendor/urllib3/util/ssltransport.py | 221 + .../pip/_vendor/urllib3/util/timeout.py | 271 + .../pip/_vendor/urllib3/util/url.py | 435 + .../pip/_vendor/urllib3/util/wait.py | 152 + .../site-packages/pip/_vendor/vendor.txt | 18 + .../lib/python3.12/site-packages/pip/py.typed | 4 + .../plyer-2.1.0.dist-info/INSTALLER | 1 + .../plyer-2.1.0.dist-info/LICENSE | 19 + .../plyer-2.1.0.dist-info/METADATA | 737 ++ .../plyer-2.1.0.dist-info/RECORD | 301 + .../plyer-2.1.0.dist-info/REQUESTED | 0 .../site-packages/plyer-2.1.0.dist-info/WHEEL | 6 + .../plyer-2.1.0.dist-info/top_level.txt | 1 + .../site-packages/plyer/__init__.py | 124 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 3397 bytes .../plyer/__pycache__/utils.cpython-312.pyc | Bin 0 -> 11544 bytes .../site-packages/plyer/facades/__init__.py | 51 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2425 bytes .../__pycache__/accelerometer.cpython-312.pyc | Bin 0 -> 2684 bytes .../facades/__pycache__/audio.cpython-312.pyc | Bin 0 -> 3200 bytes .../__pycache__/barometer.cpython-312.pyc | Bin 0 -> 1766 bytes .../__pycache__/battery.cpython-312.pyc | Bin 0 -> 1787 bytes .../__pycache__/bluetooth.cpython-312.pyc | Bin 0 -> 1417 bytes .../__pycache__/brightness.cpython-312.pyc | Bin 0 -> 1992 bytes .../facades/__pycache__/call.cpython-312.pyc | Bin 0 -> 1710 bytes .../__pycache__/camera.cpython-312.pyc | Bin 0 -> 3040 bytes .../__pycache__/compass.cpython-312.pyc | Bin 0 -> 3919 bytes .../facades/__pycache__/cpu.cpython-312.pyc | Bin 0 -> 3175 bytes .../__pycache__/devicename.cpython-312.pyc | Bin 0 -> 1372 bytes .../facades/__pycache__/email.cpython-312.pyc | Bin 0 -> 1946 bytes .../__pycache__/filechooser.cpython-312.pyc | Bin 0 -> 3432 bytes .../facades/__pycache__/flash.cpython-312.pyc | Bin 0 -> 2085 bytes .../facades/__pycache__/gps.cpython-312.pyc | Bin 0 -> 3472 bytes .../__pycache__/gravity.cpython-312.pyc | Bin 0 -> 1730 bytes .../__pycache__/gyroscope.cpython-312.pyc | Bin 0 -> 4632 bytes .../__pycache__/humidity.cpython-312.pyc | Bin 0 -> 1702 bytes .../__pycache__/irblaster.cpython-312.pyc | Bin 0 -> 3791 bytes .../__pycache__/keystore.cpython-312.pyc | Bin 0 -> 1513 bytes .../facades/__pycache__/light.cpython-312.pyc | Bin 0 -> 1783 bytes .../__pycache__/notification.cpython-312.pyc | Bin 0 -> 3201 bytes .../__pycache__/orientation.cpython-312.pyc | Bin 0 -> 2798 bytes .../__pycache__/processors.cpython-312.pyc | Bin 0 -> 1630 bytes .../__pycache__/proximity.cpython-312.pyc | Bin 0 -> 2113 bytes .../__pycache__/screenshot.cpython-312.pyc | Bin 0 -> 1897 bytes .../facades/__pycache__/sms.cpython-312.pyc | Bin 0 -> 1420 bytes .../spatialorientation.cpython-312.pyc | Bin 0 -> 2634 bytes .../__pycache__/storagepath.cpython-312.pyc | Bin 0 -> 5545 bytes .../facades/__pycache__/stt.cpython-312.pyc | Bin 0 -> 5012 bytes .../__pycache__/temperature.cpython-312.pyc | Bin 0 -> 1843 bytes .../facades/__pycache__/tts.cpython-312.pyc | Bin 0 -> 1195 bytes .../__pycache__/uniqueid.cpython-312.pyc | Bin 0 -> 1656 bytes .../__pycache__/vibrator.cpython-312.pyc | Bin 0 -> 3246 bytes .../facades/__pycache__/wifi.cpython-312.pyc | Bin 0 -> 5968 bytes .../plyer/facades/accelerometer.py | 75 + .../site-packages/plyer/facades/audio.py | 103 + .../site-packages/plyer/facades/barometer.py | 36 + .../site-packages/plyer/facades/battery.py | 54 + .../site-packages/plyer/facades/bluetooth.py | 43 + .../site-packages/plyer/facades/brightness.py | 58 + .../site-packages/plyer/facades/call.py | 59 + .../site-packages/plyer/facades/camera.py | 88 + .../site-packages/plyer/facades/compass.py | 113 + .../site-packages/plyer/facades/cpu.py | 92 + .../site-packages/plyer/facades/devicename.py | 44 + .../site-packages/plyer/facades/email.py | 58 + .../plyer/facades/filechooser.py | 74 + .../site-packages/plyer/facades/flash.py | 77 + .../site-packages/plyer/facades/gps.py | 96 + .../site-packages/plyer/facades/gravity.py | 38 + .../site-packages/plyer/facades/gyroscope.py | 126 + .../site-packages/plyer/facades/humidity.py | 34 + .../site-packages/plyer/facades/irblaster.py | 104 + .../site-packages/plyer/facades/keystore.py | 32 + .../site-packages/plyer/facades/light.py | 39 + .../plyer/facades/notification.py | 93 + .../plyer/facades/orientation.py | 81 + .../site-packages/plyer/facades/processors.py | 42 + .../site-packages/plyer/facades/proximity.py | 44 + .../site-packages/plyer/facades/screenshot.py | 57 + .../site-packages/plyer/facades/sms.py | 51 + .../plyer/facades/spatialorientation.py | 54 + .../plyer/facades/storagepath.py | 135 + .../site-packages/plyer/facades/stt.py | 188 + .../plyer/facades/temperature.py | 41 + .../site-packages/plyer/facades/tts.py | 39 + .../site-packages/plyer/facades/uniqueid.py | 54 + .../site-packages/plyer/facades/vibrator.py | 97 + .../site-packages/plyer/facades/wifi.py | 187 + .../site-packages/plyer/platforms/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 198 bytes .../plyer/platforms/android/__init__.py | 18 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 906 bytes .../__pycache__/accelerometer.cpython-312.pyc | Bin 0 -> 4405 bytes .../android/__pycache__/audio.cpython-312.pyc | Bin 0 -> 3282 bytes .../__pycache__/barometer.cpython-312.pyc | Bin 0 -> 3946 bytes .../__pycache__/battery.cpython-312.pyc | Bin 0 -> 2146 bytes .../__pycache__/bluetooth.cpython-312.pyc | Bin 0 -> 1303 bytes .../__pycache__/brightness.cpython-312.pyc | Bin 0 -> 1761 bytes .../android/__pycache__/call.cpython-312.pyc | Bin 0 -> 1623 bytes .../__pycache__/camera.cpython-312.pyc | Bin 0 -> 3694 bytes .../__pycache__/compass.cpython-312.pyc | Bin 0 -> 6391 bytes .../__pycache__/devicename.cpython-312.pyc | Bin 0 -> 1412 bytes .../android/__pycache__/email.cpython-312.pyc | Bin 0 -> 2336 bytes .../__pycache__/filechooser.cpython-312.pyc | Bin 0 -> 15507 bytes .../android/__pycache__/flash.cpython-312.pyc | Bin 0 -> 3017 bytes .../android/__pycache__/gps.cpython-312.pyc | Bin 0 -> 4855 bytes .../__pycache__/gravity.cpython-312.pyc | Bin 0 -> 4354 bytes .../__pycache__/gyroscope.cpython-312.pyc | Bin 0 -> 6457 bytes .../__pycache__/humidity.cpython-312.pyc | Bin 0 -> 6232 bytes .../__pycache__/irblaster.cpython-312.pyc | Bin 0 -> 2817 bytes .../__pycache__/keystore.cpython-312.pyc | Bin 0 -> 1594 bytes .../android/__pycache__/light.cpython-312.pyc | Bin 0 -> 3825 bytes .../__pycache__/notification.cpython-312.pyc | Bin 0 -> 8557 bytes .../__pycache__/orientation.cpython-312.pyc | Bin 0 -> 2419 bytes .../__pycache__/proximity.cpython-312.pyc | Bin 0 -> 3919 bytes .../android/__pycache__/sms.cpython-312.pyc | Bin 0 -> 1133 bytes .../spatialorientation.cpython-312.pyc | Bin 0 -> 6395 bytes .../__pycache__/storagepath.cpython-312.pyc | Bin 0 -> 4048 bytes .../android/__pycache__/stt.cpython-312.pyc | Bin 0 -> 11333 bytes .../__pycache__/temperature.cpython-312.pyc | Bin 0 -> 3994 bytes .../android/__pycache__/tts.cpython-312.pyc | Bin 0 -> 1588 bytes .../__pycache__/uniqueid.cpython-312.pyc | Bin 0 -> 1221 bytes .../__pycache__/vibrator.cpython-312.pyc | Bin 0 -> 2996 bytes .../plyer/platforms/android/accelerometer.py | 79 + .../plyer/platforms/android/audio.py | 58 + .../plyer/platforms/android/barometer.py | 65 + .../plyer/platforms/android/battery.py | 47 + .../plyer/platforms/android/bluetooth.py | 32 + .../plyer/platforms/android/brightness.py | 34 + .../plyer/platforms/android/call.py | 29 + .../plyer/platforms/android/camera.py | 59 + .../plyer/platforms/android/compass.py | 119 + .../plyer/platforms/android/devicename.py | 33 + .../plyer/platforms/android/email.py | 58 + .../plyer/platforms/android/filechooser.py | 447 + .../plyer/platforms/android/flash.py | 55 + .../plyer/platforms/android/gps.py | 82 + .../plyer/platforms/android/gravity.py | 84 + .../plyer/platforms/android/gyroscope.py | 119 + .../plyer/platforms/android/humidity.py | 107 + .../plyer/platforms/android/irblaster.py | 55 + .../plyer/platforms/android/keystore.py | 25 + .../plyer/platforms/android/light.py | 63 + .../plyer/platforms/android/notification.py | 201 + .../plyer/platforms/android/orientation.py | 43 + .../plyer/platforms/android/proximity.py | 69 + .../plyer/platforms/android/sms.py | 25 + .../platforms/android/spatialorientation.py | 118 + .../plyer/platforms/android/storagepath.py | 69 + .../plyer/platforms/android/stt.py | 252 + .../plyer/platforms/android/temperature.py | 66 + .../plyer/platforms/android/tts.py | 34 + .../plyer/platforms/android/uniqueid.py | 28 + .../plyer/platforms/android/vibrator.py | 63 + .../plyer/platforms/ios/__init__.py | 0 .../ios/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 202 bytes .../__pycache__/accelerometer.cpython-312.pyc | Bin 0 -> 2074 bytes .../ios/__pycache__/barometer.cpython-312.pyc | Bin 0 -> 1695 bytes .../ios/__pycache__/battery.cpython-312.pyc | Bin 0 -> 1960 bytes .../__pycache__/brightness.cpython-312.pyc | Bin 0 -> 1451 bytes .../ios/__pycache__/call.cpython-312.pyc | Bin 0 -> 1407 bytes .../ios/__pycache__/camera.cpython-312.pyc | Bin 0 -> 2321 bytes .../ios/__pycache__/compass.cpython-312.pyc | Bin 0 -> 2927 bytes .../ios/__pycache__/email.cpython-312.pyc | Bin 0 -> 2126 bytes .../__pycache__/filechooser.cpython-312.pyc | Bin 0 -> 3857 bytes .../ios/__pycache__/flash.cpython-312.pyc | Bin 0 -> 2439 bytes .../ios/__pycache__/gps.cpython-312.pyc | Bin 0 -> 3735 bytes .../ios/__pycache__/gravity.cpython-312.pyc | Bin 0 -> 1792 bytes .../ios/__pycache__/gyroscope.cpython-312.pyc | Bin 0 -> 3552 bytes .../ios/__pycache__/keystore.cpython-312.pyc | Bin 0 -> 1383 bytes .../ios/__pycache__/sms.cpython-312.pyc | Bin 0 -> 1786 bytes .../spatialorientation.cpython-312.pyc | Bin 0 -> 1957 bytes .../__pycache__/storagepath.cpython-312.pyc | Bin 0 -> 3870 bytes .../ios/__pycache__/tts.cpython-312.pyc | Bin 0 -> 2124 bytes .../ios/__pycache__/uniqueid.cpython-312.pyc | Bin 0 -> 1280 bytes .../ios/__pycache__/vibrator.cpython-312.pyc | Bin 0 -> 2022 bytes .../plyer/platforms/ios/accelerometer.py | 34 + .../plyer/platforms/ios/barometer.py | 31 + .../plyer/platforms/ios/battery.py | 47 + .../plyer/platforms/ios/brightness.py | 27 + .../site-packages/plyer/platforms/ios/call.py | 29 + .../plyer/platforms/ios/camera.py | 52 + .../plyer/platforms/ios/compass.py | 43 + .../plyer/platforms/ios/email.py | 52 + .../plyer/platforms/ios/filechooser.py | 81 + .../plyer/platforms/ios/flash.py | 50 + .../site-packages/plyer/platforms/ios/gps.py | 80 + .../plyer/platforms/ios/gravity.py | 31 + .../plyer/platforms/ios/gyroscope.py | 55 + .../plyer/platforms/ios/keystore.py | 23 + .../site-packages/plyer/platforms/ios/sms.py | 43 + .../plyer/platforms/ios/spatialorientation.py | 31 + .../plyer/platforms/ios/storagepath.py | 62 + .../site-packages/plyer/platforms/ios/tts.py | 37 + .../plyer/platforms/ios/uniqueid.py | 27 + .../plyer/platforms/ios/vibrator.py | 43 + .../plyer/platforms/linux/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 204 bytes .../__pycache__/accelerometer.cpython-312.pyc | Bin 0 -> 1742 bytes .../linux/__pycache__/battery.cpython-312.pyc | Bin 0 -> 4012 bytes .../__pycache__/brightness.cpython-312.pyc | Bin 0 -> 1575 bytes .../linux/__pycache__/cpu.cpython-312.pyc | Bin 0 -> 4936 bytes .../__pycache__/devicename.cpython-312.pyc | Bin 0 -> 983 bytes .../linux/__pycache__/email.cpython-312.pyc | Bin 0 -> 1895 bytes .../__pycache__/filechooser.cpython-312.pyc | Bin 0 -> 10340 bytes .../__pycache__/keystore.cpython-312.pyc | Bin 0 -> 1150 bytes .../__pycache__/notification.cpython-312.pyc | Bin 0 -> 4850 bytes .../__pycache__/orientation.cpython-312.pyc | Bin 0 -> 1828 bytes .../__pycache__/processors.cpython-312.pyc | Bin 0 -> 1519 bytes .../__pycache__/screenshot.cpython-312.pyc | Bin 0 -> 1613 bytes .../__pycache__/storagepath.cpython-312.pyc | Bin 0 -> 4018 bytes .../linux/__pycache__/tts.cpython-312.pyc | Bin 0 -> 1535 bytes .../__pycache__/uniqueid.cpython-312.pyc | Bin 0 -> 1828 bytes .../linux/__pycache__/wifi.cpython-312.pyc | Bin 0 -> 17384 bytes .../plyer/platforms/linux/accelerometer.py | 35 + .../plyer/platforms/linux/battery.py | 102 + .../plyer/platforms/linux/brightness.py | 29 + .../plyer/platforms/linux/cpu.py | 116 + .../plyer/platforms/linux/devicename.py | 23 + .../plyer/platforms/linux/email.py | 47 + .../plyer/platforms/linux/filechooser.py | 269 + .../plyer/platforms/linux/keystore.py | 19 + .../plyer/platforms/linux/notification.py | 108 + .../plyer/platforms/linux/orientation.py | 27 + .../plyer/platforms/linux/processors.py | 37 + .../plyer/platforms/linux/screenshot.py | 29 + .../plyer/platforms/linux/storagepath.py | 72 + .../plyer/platforms/linux/tts.py | 25 + .../plyer/platforms/linux/uniqueid.py | 47 + .../plyer/platforms/linux/wifi.py | 482 + .../plyer/platforms/macosx/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 205 bytes .../__pycache__/accelerometer.cpython-312.pyc | Bin 0 -> 1385 bytes .../macosx/__pycache__/audio.cpython-312.pyc | Bin 0 -> 3794 bytes .../__pycache__/battery.cpython-312.pyc | Bin 0 -> 2408 bytes .../__pycache__/bluetooth.cpython-312.pyc | Bin 0 -> 2042 bytes .../macosx/__pycache__/cpu.cpython-312.pyc | Bin 0 -> 2338 bytes .../__pycache__/devicename.cpython-312.pyc | Bin 0 -> 981 bytes .../macosx/__pycache__/email.cpython-312.pyc | Bin 0 -> 1890 bytes .../__pycache__/filechooser.cpython-312.pyc | Bin 0 -> 5495 bytes .../__pycache__/keystore.cpython-312.pyc | Bin 0 -> 1145 bytes .../__pycache__/notification.cpython-312.pyc | Bin 0 -> 2463 bytes .../__pycache__/screenshot.cpython-312.pyc | Bin 0 -> 1532 bytes .../__pycache__/storagepath.cpython-312.pyc | Bin 0 -> 3948 bytes .../macosx/__pycache__/tts.cpython-312.pyc | Bin 0 -> 1530 bytes .../__pycache__/uniqueid.cpython-312.pyc | Bin 0 -> 1935 bytes .../macosx/__pycache__/wifi.cpython-312.pyc | Bin 0 -> 7152 bytes .../plyer/platforms/macosx/accelerometer.py | 25 + .../plyer/platforms/macosx/audio.py | 90 + .../plyer/platforms/macosx/battery.py | 59 + .../plyer/platforms/macosx/bluetooth.py | 54 + .../plyer/platforms/macosx/cpu.py | 62 + .../plyer/platforms/macosx/devicename.py | 23 + .../plyer/platforms/macosx/email.py | 49 + .../plyer/platforms/macosx/filechooser.py | 126 + .../plyer/platforms/macosx/keystore.py | 19 + .../plyer/platforms/macosx/libs/__init__.py | 0 .../libs/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 210 bytes .../osx_motion_sensor.cpython-312.pyc | Bin 0 -> 4645 bytes .../__pycache__/osx_paths.cpython-312.pyc | Bin 0 -> 1321 bytes .../macosx/libs/osx_motion_sensor.py | 128 + .../plyer/platforms/macosx/libs/osx_paths.py | 21 + .../plyer/platforms/macosx/notification.py | 51 + .../plyer/platforms/macosx/screenshot.py | 27 + .../plyer/platforms/macosx/storagepath.py | 62 + .../plyer/platforms/macosx/tts.py | 25 + .../plyer/platforms/macosx/uniqueid.py | 47 + .../plyer/platforms/macosx/wifi.py | 147 + .../plyer/platforms/win/__init__.py | 0 .../win/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 202 bytes .../win/__pycache__/audio.cpython-312.pyc | Bin 0 -> 10323 bytes .../win/__pycache__/battery.cpython-312.pyc | Bin 0 -> 1419 bytes .../win/__pycache__/cpu.cpython-312.pyc | Bin 0 -> 7447 bytes .../__pycache__/devicename.cpython-312.pyc | Bin 0 -> 974 bytes .../win/__pycache__/email.cpython-312.pyc | Bin 0 -> 1807 bytes .../__pycache__/filechooser.cpython-312.pyc | Bin 0 -> 10538 bytes .../win/__pycache__/keystore.cpython-312.pyc | Bin 0 -> 1140 bytes .../__pycache__/notification.cpython-312.pyc | Bin 0 -> 1125 bytes .../__pycache__/screenshot.cpython-312.pyc | Bin 0 -> 3970 bytes .../__pycache__/storagepath.cpython-312.pyc | Bin 0 -> 2753 bytes .../win/__pycache__/tts.cpython-312.pyc | Bin 0 -> 1026 bytes .../win/__pycache__/uniqueid.cpython-312.pyc | Bin 0 -> 1484 bytes .../win/__pycache__/wifi.cpython-312.pyc | Bin 0 -> 5596 bytes .../plyer/platforms/win/audio.py | 398 + .../plyer/platforms/win/battery.py | 36 + .../site-packages/plyer/platforms/win/cpu.py | 252 + .../plyer/platforms/win/devicename.py | 23 + .../plyer/platforms/win/email.py | 46 + .../plyer/platforms/win/filechooser.py | 162 + .../plyer/platforms/win/keystore.py | 19 + .../plyer/platforms/win/libs/__init__.py | 0 .../libs/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 207 bytes .../__pycache__/balloontip.cpython-312.pyc | Bin 0 -> 7678 bytes .../__pycache__/batterystatus.cpython-312.pyc | Bin 0 -> 1232 bytes .../__pycache__/wifi_defs.cpython-312.pyc | Bin 0 -> 16451 bytes .../__pycache__/win_api_defs.cpython-312.pyc | Bin 0 -> 9248 bytes .../plyer/platforms/win/libs/balloontip.py | 206 + .../plyer/platforms/win/libs/batterystatus.py | 24 + .../plyer/platforms/win/libs/wifi_defs.py | 572 ++ .../plyer/platforms/win/libs/win_api_defs.py | 250 + .../plyer/platforms/win/notification.py | 24 + .../plyer/platforms/win/screenshot.py | 107 + .../plyer/platforms/win/storagepath.py | 53 + .../site-packages/plyer/platforms/win/tts.py | 16 + .../plyer/platforms/win/uniqueid.py | 36 + .../site-packages/plyer/platforms/win/wifi.py | 121 + .../python3.12/site-packages/plyer/utils.py | 290 + .../pycairo-1.27.0.dist-info/INSTALLER | 1 + .../pycairo-1.27.0.dist-info/METADATA | 71 + .../pycairo-1.27.0.dist-info/RECORD | 10 + .../pycairo-1.27.0.dist-info/WHEEL | 4 + .../pygobject-3.50.0.dist-info/INSTALLER | 1 + .../pygobject-3.50.0.dist-info/METADATA | 75 + .../pygobject-3.50.0.dist-info/RECORD | 64 + .../pygobject-3.50.0.dist-info/REQUESTED | 0 .../pygobject-3.50.0.dist-info/WHEEL | 4 + .../site-packages/pygtkcompat/__init__.py | 20 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 437 bytes .../generictreemodel.cpython-312.pyc | Bin 0 -> 18975 bytes .../__pycache__/pygtkcompat.cpython-312.pyc | Bin 0 -> 32373 bytes .../pygtkcompat/generictreemodel.py | 426 + .../site-packages/pygtkcompat/pygtkcompat.py | 628 ++ .../pystray-0.19.5.dist-info/COPYING | 674 ++ .../pystray-0.19.5.dist-info/COPYING.LGPL | 165 + .../pystray-0.19.5.dist-info/INSTALLER | 1 + .../pystray-0.19.5.dist-info/METADATA | 269 + .../pystray-0.19.5.dist-info/RECORD | 35 + .../pystray-0.19.5.dist-info/REQUESTED | 0 .../pystray-0.19.5.dist-info/WHEEL | 6 + .../pystray-0.19.5.dist-info/top_level.txt | 1 + .../pystray-0.19.5.dist-info/zip-safe | 1 + .../site-packages/pystray/__init__.py | 67 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 2787 bytes .../__pycache__/_appindicator.cpython-312.pyc | Bin 0 -> 5212 bytes .../pystray/__pycache__/_base.cpython-312.pyc | Bin 0 -> 28258 bytes .../__pycache__/_darwin.cpython-312.pyc | Bin 0 -> 13027 bytes .../__pycache__/_dummy.cpython-312.pyc | Bin 0 -> 361 bytes .../pystray/__pycache__/_gtk.cpython-312.pyc | Bin 0 -> 3583 bytes .../pystray/__pycache__/_info.cpython-312.pyc | Bin 0 -> 264 bytes .../__pycache__/_win32.cpython-312.pyc | Bin 0 -> 19063 bytes .../pystray/__pycache__/_xorg.cpython-312.pyc | Bin 0 -> 21314 bytes .../site-packages/pystray/_appindicator.py | 104 + .../python3.12/site-packages/pystray/_base.py | 682 ++ .../site-packages/pystray/_darwin.py | 268 + .../site-packages/pystray/_dummy.py | 23 + .../python3.12/site-packages/pystray/_gtk.py | 75 + .../python3.12/site-packages/pystray/_info.py | 19 + .../site-packages/pystray/_util/__init__.py | 49 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1606 bytes .../_util/__pycache__/gtk.cpython-312.pyc | Bin 0 -> 8376 bytes .../__pycache__/notify_dbus.cpython-312.pyc | Bin 0 -> 3139 bytes .../_util/__pycache__/win32.cpython-312.pyc | Bin 0 -> 13032 bytes .../site-packages/pystray/_util/gtk.py | 183 + .../pystray/_util/notify_dbus.py | 102 + .../site-packages/pystray/_util/win32.py | 358 + .../site-packages/pystray/_win32.py | 418 + .../python3.12/site-packages/pystray/_xorg.py | 490 + .../python_xlib-0.33.dist-info/INSTALLER | 1 + .../python_xlib-0.33.dist-info/LICENSE | 504 + .../python_xlib-0.33.dist-info/METADATA | 158 + .../python_xlib-0.33.dist-info/RECORD | 136 + .../python_xlib-0.33.dist-info/WHEEL | 6 + .../python_xlib-0.33.dist-info/top_level.txt | 1 + .../six-1.16.0.dist-info/INSTALLER | 1 + .../six-1.16.0.dist-info/LICENSE | 18 + .../six-1.16.0.dist-info/METADATA | 49 + .../site-packages/six-1.16.0.dist-info/RECORD | 8 + .../site-packages/six-1.16.0.dist-info/WHEEL | 6 + .../six-1.16.0.dist-info/top_level.txt | 1 + venv/lib/python3.12/site-packages/six.py | 998 ++ .../urllib3-2.2.3.dist-info/INSTALLER | 1 + .../urllib3-2.2.3.dist-info/METADATA | 155 + .../urllib3-2.2.3.dist-info/RECORD | 80 + .../urllib3-2.2.3.dist-info/REQUESTED | 0 .../urllib3-2.2.3.dist-info/WHEEL | 4 + .../licenses/LICENSE.txt | 21 + .../site-packages/urllib3/__init__.py | 211 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 7315 bytes .../_base_connection.cpython-312.pyc | Bin 0 -> 6862 bytes .../__pycache__/_collections.cpython-312.pyc | Bin 0 -> 22604 bytes .../_request_methods.cpython-312.pyc | Bin 0 -> 10631 bytes .../__pycache__/_version.cpython-312.pyc | Bin 0 -> 592 bytes .../__pycache__/connection.cpython-312.pyc | Bin 0 -> 35745 bytes .../connectionpool.cpython-312.pyc | Bin 0 -> 39743 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 15837 bytes .../__pycache__/fields.cpython-312.pyc | Bin 0 -> 12059 bytes .../__pycache__/filepost.cpython-312.pyc | Bin 0 -> 3508 bytes .../__pycache__/poolmanager.cpython-312.pyc | Bin 0 -> 24036 bytes .../__pycache__/response.cpython-312.pyc | Bin 0 -> 50448 bytes .../site-packages/urllib3/_base_connection.py | 172 + .../site-packages/urllib3/_collections.py | 483 + .../site-packages/urllib3/_request_methods.py | 278 + .../site-packages/urllib3/_version.py | 16 + .../site-packages/urllib3/connection.py | 1033 ++ .../site-packages/urllib3/connectionpool.py | 1182 +++ .../site-packages/urllib3/contrib/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 198 bytes .../__pycache__/pyopenssl.cpython-312.pyc | Bin 0 -> 27279 bytes .../contrib/__pycache__/socks.cpython-312.pyc | Bin 0 -> 8176 bytes .../urllib3/contrib/emscripten/__init__.py | 16 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 906 bytes .../__pycache__/connection.cpython-312.pyc | Bin 0 -> 10240 bytes .../__pycache__/fetch.cpython-312.pyc | Bin 0 -> 18376 bytes .../__pycache__/request.cpython-312.pyc | Bin 0 -> 1426 bytes .../__pycache__/response.cpython-312.pyc | Bin 0 -> 12703 bytes .../urllib3/contrib/emscripten/connection.py | 254 + .../emscripten/emscripten_fetch_worker.js | 110 + .../urllib3/contrib/emscripten/fetch.py | 418 + .../urllib3/contrib/emscripten/request.py | 22 + .../urllib3/contrib/emscripten/response.py | 285 + .../urllib3/contrib/pyopenssl.py | 552 ++ .../site-packages/urllib3/contrib/socks.py | 228 + .../site-packages/urllib3/exceptions.py | 321 + .../site-packages/urllib3/fields.py | 341 + .../site-packages/urllib3/filepost.py | 89 + .../site-packages/urllib3/http2/__init__.py | 53 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1751 bytes .../__pycache__/connection.cpython-312.pyc | Bin 0 -> 16972 bytes .../http2/__pycache__/probe.cpython-312.pyc | Bin 0 -> 3662 bytes .../site-packages/urllib3/http2/connection.py | 356 + .../site-packages/urllib3/http2/probe.py | 87 + .../site-packages/urllib3/poolmanager.py | 637 ++ .../python3.12/site-packages/urllib3/py.typed | 2 + .../site-packages/urllib3/response.py | 1265 +++ .../site-packages/urllib3/util/__init__.py | 42 + .../util/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1011 bytes .../__pycache__/connection.cpython-312.pyc | Bin 0 -> 4740 bytes .../util/__pycache__/proxy.cpython-312.pyc | Bin 0 -> 1223 bytes .../util/__pycache__/request.cpython-312.pyc | Bin 0 -> 8037 bytes .../util/__pycache__/response.cpython-312.pyc | Bin 0 -> 2882 bytes .../util/__pycache__/retry.cpython-312.pyc | Bin 0 -> 20297 bytes .../util/__pycache__/ssl_.cpython-312.pyc | Bin 0 -> 16711 bytes .../ssl_match_hostname.cpython-312.pyc | Bin 0 -> 5543 bytes .../__pycache__/ssltransport.cpython-312.pyc | Bin 0 -> 13313 bytes .../util/__pycache__/timeout.cpython-312.pyc | Bin 0 -> 11695 bytes .../util/__pycache__/url.cpython-312.pyc | Bin 0 -> 16229 bytes .../util/__pycache__/util.cpython-312.pyc | Bin 0 -> 2000 bytes .../util/__pycache__/wait.cpython-312.pyc | Bin 0 -> 3446 bytes .../site-packages/urllib3/util/connection.py | 137 + .../site-packages/urllib3/util/proxy.py | 43 + .../site-packages/urllib3/util/request.py | 256 + .../site-packages/urllib3/util/response.py | 101 + .../site-packages/urllib3/util/retry.py | 533 + .../site-packages/urllib3/util/ssl_.py | 513 + .../urllib3/util/ssl_match_hostname.py | 159 + .../urllib3/util/ssltransport.py | 276 + .../site-packages/urllib3/util/timeout.py | 275 + .../site-packages/urllib3/util/url.py | 471 + .../site-packages/urllib3/util/util.py | 42 + .../site-packages/urllib3/util/wait.py | 124 + .../wheel-0.45.1.dist-info/INSTALLER | 1 + .../wheel-0.45.1.dist-info/LICENSE.txt | 21 + .../wheel-0.45.1.dist-info/METADATA | 66 + .../wheel-0.45.1.dist-info/RECORD | 68 + .../wheel-0.45.1.dist-info/REQUESTED | 0 .../wheel-0.45.1.dist-info/WHEEL | 4 + .../wheel-0.45.1.dist-info/entry_points.txt | 6 + .../site-packages/wheel/__init__.py | 3 + .../site-packages/wheel/__main__.py | 23 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 267 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 1002 bytes .../__pycache__/_bdist_wheel.cpython-312.pyc | Bin 0 -> 25971 bytes .../_setuptools_logging.cpython-312.pyc | Bin 0 -> 1413 bytes .../__pycache__/bdist_wheel.cpython-312.pyc | Bin 0 -> 779 bytes .../macosx_libfile.cpython-312.pyc | Bin 0 -> 16221 bytes .../__pycache__/metadata.cpython-312.pyc | Bin 0 -> 8632 bytes .../wheel/__pycache__/util.cpython-312.pyc | Bin 0 -> 955 bytes .../__pycache__/wheelfile.cpython-312.pyc | Bin 0 -> 11459 bytes .../site-packages/wheel/_bdist_wheel.py | 613 ++ .../wheel/_setuptools_logging.py | 26 + .../site-packages/wheel/bdist_wheel.py | 26 + .../site-packages/wheel/cli/__init__.py | 155 + .../cli/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 6930 bytes .../cli/__pycache__/convert.cpython-312.pyc | Bin 0 -> 16072 bytes .../cli/__pycache__/pack.cpython-312.pyc | Bin 0 -> 4453 bytes .../cli/__pycache__/tags.cpython-312.pyc | Bin 0 -> 6719 bytes .../cli/__pycache__/unpack.cpython-312.pyc | Bin 0 -> 1518 bytes .../site-packages/wheel/cli/convert.py | 332 + .../site-packages/wheel/cli/pack.py | 85 + .../site-packages/wheel/cli/tags.py | 139 + .../site-packages/wheel/cli/unpack.py | 30 + .../site-packages/wheel/macosx_libfile.py | 482 + .../site-packages/wheel/metadata.py | 183 + .../python3.12/site-packages/wheel/util.py | 17 + .../site-packages/wheel/vendored/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 197 bytes .../wheel/vendored/packaging/LICENSE | 3 + .../wheel/vendored/packaging/LICENSE.APACHE | 177 + .../wheel/vendored/packaging/LICENSE.BSD | 23 + .../wheel/vendored/packaging/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 207 bytes .../__pycache__/_elffile.cpython-312.pyc | Bin 0 -> 5033 bytes .../__pycache__/_manylinux.cpython-312.pyc | Bin 0 -> 9860 bytes .../__pycache__/_musllinux.cpython-312.pyc | Bin 0 -> 4573 bytes .../__pycache__/_parser.cpython-312.pyc | Bin 0 -> 14063 bytes .../__pycache__/_structures.cpython-312.pyc | Bin 0 -> 3255 bytes .../__pycache__/_tokenizer.cpython-312.pyc | Bin 0 -> 7955 bytes .../__pycache__/markers.cpython-312.pyc | Bin 0 -> 10526 bytes .../__pycache__/requirements.cpython-312.pyc | Bin 0 -> 4468 bytes .../__pycache__/specifiers.cpython-312.pyc | Bin 0 -> 39538 bytes .../__pycache__/tags.cpython-312.pyc | Bin 0 -> 21666 bytes .../__pycache__/utils.cpython-312.pyc | Bin 0 -> 7300 bytes .../__pycache__/version.cpython-312.pyc | Bin 0 -> 20016 bytes .../wheel/vendored/packaging/_elffile.py | 108 + .../wheel/vendored/packaging/_manylinux.py | 260 + .../wheel/vendored/packaging/_musllinux.py | 83 + .../wheel/vendored/packaging/_parser.py | 356 + .../wheel/vendored/packaging/_structures.py | 61 + .../wheel/vendored/packaging/_tokenizer.py | 192 + .../wheel/vendored/packaging/markers.py | 253 + .../wheel/vendored/packaging/requirements.py | 90 + .../wheel/vendored/packaging/specifiers.py | 1011 ++ .../wheel/vendored/packaging/tags.py | 571 ++ .../wheel/vendored/packaging/utils.py | 172 + .../wheel/vendored/packaging/version.py | 561 ++ .../site-packages/wheel/vendored/vendor.txt | 1 + .../site-packages/wheel/wheelfile.py | 227 + venv/lib64 | 1 + venv/pyvenv.cfg | 5 + 2053 files changed, 272658 insertions(+) create mode 100644 README.md create mode 100755 dns-logo.png create mode 100644 img/nord-logo.png create mode 100755 install.sh create mode 100644 nord-logo-rouge.png create mode 100644 nord-logo-vert.png create mode 100644 nord-logo.png create mode 100644 nordvpn.jpg create mode 100644 nordvpntray.desktop create mode 100755 nordvpntray.py create mode 100755 nordvpntray.sh create mode 100644 requirements.txt create mode 100644 venv/bin/Activate.ps1 create mode 100644 venv/bin/activate create mode 100644 venv/bin/activate.csh create mode 100644 venv/bin/activate.fish create mode 100755 venv/bin/ping3 create mode 100755 venv/bin/pip create mode 100755 venv/bin/pip3 create mode 100755 venv/bin/pip3.12 create mode 120000 venv/bin/python create mode 120000 venv/bin/python3 create mode 120000 venv/bin/python3.12 create mode 100755 venv/bin/wheel create mode 100644 venv/include/site/python3.12/PyGObject/pygobject-3.0/pygobject.h create mode 100644 venv/include/site/python3.12/dbus-python/dbus-1.0/dbus/dbus-python.h create mode 100644 venv/lib/python3.12/site-packages/.dbus_python.mesonpy.libs/pkgconfig/dbus-python.pc create mode 100644 venv/lib/python3.12/site-packages/PIL/BdfFontFile.py create mode 100644 venv/lib/python3.12/site-packages/PIL/BlpImagePlugin.py create mode 100644 venv/lib/python3.12/site-packages/PIL/BmpImagePlugin.py create mode 100644 venv/lib/python3.12/site-packages/PIL/BufrStubImagePlugin.py create mode 100644 venv/lib/python3.12/site-packages/PIL/ContainerIO.py create mode 100644 venv/lib/python3.12/site-packages/PIL/CurImagePlugin.py create mode 100644 venv/lib/python3.12/site-packages/PIL/DcxImagePlugin.py create mode 100644 venv/lib/python3.12/site-packages/PIL/DdsImagePlugin.py create mode 100644 venv/lib/python3.12/site-packages/PIL/EpsImagePlugin.py create mode 100644 venv/lib/python3.12/site-packages/PIL/ExifTags.py create mode 100644 venv/lib/python3.12/site-packages/PIL/FitsImagePlugin.py create mode 100644 venv/lib/python3.12/site-packages/PIL/FliImagePlugin.py create mode 100644 venv/lib/python3.12/site-packages/PIL/FontFile.py create mode 100644 venv/lib/python3.12/site-packages/PIL/FpxImagePlugin.py create mode 100644 venv/lib/python3.12/site-packages/PIL/FtexImagePlugin.py create mode 100644 venv/lib/python3.12/site-packages/PIL/GbrImagePlugin.py create mode 100644 venv/lib/python3.12/site-packages/PIL/GdImageFile.py create mode 100644 venv/lib/python3.12/site-packages/PIL/GifImagePlugin.py create mode 100644 venv/lib/python3.12/site-packages/PIL/GimpGradientFile.py create mode 100644 venv/lib/python3.12/site-packages/PIL/GimpPaletteFile.py create mode 100644 venv/lib/python3.12/site-packages/PIL/GribStubImagePlugin.py create mode 100644 venv/lib/python3.12/site-packages/PIL/Hdf5StubImagePlugin.py create mode 100644 venv/lib/python3.12/site-packages/PIL/IcnsImagePlugin.py create mode 100644 venv/lib/python3.12/site-packages/PIL/IcoImagePlugin.py create mode 100644 venv/lib/python3.12/site-packages/PIL/ImImagePlugin.py create mode 100644 venv/lib/python3.12/site-packages/PIL/Image.py create mode 100644 venv/lib/python3.12/site-packages/PIL/ImageChops.py create mode 100644 venv/lib/python3.12/site-packages/PIL/ImageCms.py create mode 100644 venv/lib/python3.12/site-packages/PIL/ImageColor.py create mode 100644 venv/lib/python3.12/site-packages/PIL/ImageDraw.py create mode 100644 venv/lib/python3.12/site-packages/PIL/ImageDraw2.py create mode 100644 venv/lib/python3.12/site-packages/PIL/ImageEnhance.py create mode 100644 venv/lib/python3.12/site-packages/PIL/ImageFile.py create mode 100644 venv/lib/python3.12/site-packages/PIL/ImageFilter.py create mode 100644 venv/lib/python3.12/site-packages/PIL/ImageFont.py create mode 100644 venv/lib/python3.12/site-packages/PIL/ImageGrab.py create mode 100644 venv/lib/python3.12/site-packages/PIL/ImageMath.py create mode 100644 venv/lib/python3.12/site-packages/PIL/ImageMode.py create mode 100644 venv/lib/python3.12/site-packages/PIL/ImageMorph.py create mode 100644 venv/lib/python3.12/site-packages/PIL/ImageOps.py create mode 100644 venv/lib/python3.12/site-packages/PIL/ImagePalette.py create mode 100644 venv/lib/python3.12/site-packages/PIL/ImagePath.py create mode 100644 venv/lib/python3.12/site-packages/PIL/ImageQt.py create mode 100644 venv/lib/python3.12/site-packages/PIL/ImageSequence.py create mode 100644 venv/lib/python3.12/site-packages/PIL/ImageShow.py create mode 100644 venv/lib/python3.12/site-packages/PIL/ImageStat.py create mode 100644 venv/lib/python3.12/site-packages/PIL/ImageTk.py create mode 100644 venv/lib/python3.12/site-packages/PIL/ImageTransform.py create mode 100644 venv/lib/python3.12/site-packages/PIL/ImageWin.py create mode 100644 venv/lib/python3.12/site-packages/PIL/ImtImagePlugin.py create mode 100644 venv/lib/python3.12/site-packages/PIL/IptcImagePlugin.py create mode 100644 venv/lib/python3.12/site-packages/PIL/Jpeg2KImagePlugin.py create mode 100644 venv/lib/python3.12/site-packages/PIL/JpegImagePlugin.py create mode 100644 venv/lib/python3.12/site-packages/PIL/JpegPresets.py create mode 100644 venv/lib/python3.12/site-packages/PIL/McIdasImagePlugin.py create mode 100644 venv/lib/python3.12/site-packages/PIL/MicImagePlugin.py create mode 100644 venv/lib/python3.12/site-packages/PIL/MpegImagePlugin.py create mode 100644 venv/lib/python3.12/site-packages/PIL/MpoImagePlugin.py create mode 100644 venv/lib/python3.12/site-packages/PIL/MspImagePlugin.py create mode 100644 venv/lib/python3.12/site-packages/PIL/PSDraw.py create mode 100644 venv/lib/python3.12/site-packages/PIL/PaletteFile.py create mode 100644 venv/lib/python3.12/site-packages/PIL/PalmImagePlugin.py create mode 100644 venv/lib/python3.12/site-packages/PIL/PcdImagePlugin.py create mode 100644 venv/lib/python3.12/site-packages/PIL/PcfFontFile.py create mode 100644 venv/lib/python3.12/site-packages/PIL/PcxImagePlugin.py create mode 100644 venv/lib/python3.12/site-packages/PIL/PdfImagePlugin.py create mode 100644 venv/lib/python3.12/site-packages/PIL/PdfParser.py create mode 100644 venv/lib/python3.12/site-packages/PIL/PixarImagePlugin.py create mode 100644 venv/lib/python3.12/site-packages/PIL/PngImagePlugin.py create mode 100644 venv/lib/python3.12/site-packages/PIL/PpmImagePlugin.py create mode 100644 venv/lib/python3.12/site-packages/PIL/PsdImagePlugin.py create mode 100644 venv/lib/python3.12/site-packages/PIL/QoiImagePlugin.py create mode 100644 venv/lib/python3.12/site-packages/PIL/SgiImagePlugin.py create mode 100644 venv/lib/python3.12/site-packages/PIL/SpiderImagePlugin.py create mode 100644 venv/lib/python3.12/site-packages/PIL/SunImagePlugin.py create mode 100644 venv/lib/python3.12/site-packages/PIL/TarIO.py create mode 100644 venv/lib/python3.12/site-packages/PIL/TgaImagePlugin.py create mode 100644 venv/lib/python3.12/site-packages/PIL/TiffImagePlugin.py create mode 100644 venv/lib/python3.12/site-packages/PIL/TiffTags.py create mode 100644 venv/lib/python3.12/site-packages/PIL/WalImageFile.py create mode 100644 venv/lib/python3.12/site-packages/PIL/WebPImagePlugin.py create mode 100644 venv/lib/python3.12/site-packages/PIL/WmfImagePlugin.py create mode 100644 venv/lib/python3.12/site-packages/PIL/XVThumbImagePlugin.py create mode 100644 venv/lib/python3.12/site-packages/PIL/XbmImagePlugin.py create mode 100644 venv/lib/python3.12/site-packages/PIL/XpmImagePlugin.py create mode 100644 venv/lib/python3.12/site-packages/PIL/__init__.py create mode 100644 venv/lib/python3.12/site-packages/PIL/__main__.py create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/BdfFontFile.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/BlpImagePlugin.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/BmpImagePlugin.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/BufrStubImagePlugin.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/ContainerIO.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/CurImagePlugin.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/DcxImagePlugin.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/DdsImagePlugin.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/EpsImagePlugin.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/ExifTags.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/FitsImagePlugin.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/FliImagePlugin.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/FontFile.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/FpxImagePlugin.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/FtexImagePlugin.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/GbrImagePlugin.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/GdImageFile.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/GifImagePlugin.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/GimpGradientFile.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/GimpPaletteFile.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/GribStubImagePlugin.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/Hdf5StubImagePlugin.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/IcnsImagePlugin.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/IcoImagePlugin.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/ImImagePlugin.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/Image.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/ImageChops.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/ImageCms.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/ImageColor.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/ImageDraw.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/ImageDraw2.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/ImageEnhance.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/ImageFile.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/ImageFilter.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/ImageFont.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/ImageGrab.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/ImageMath.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/ImageMode.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/ImageMorph.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/ImageOps.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/ImagePalette.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/ImagePath.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/ImageQt.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/ImageSequence.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/ImageShow.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/ImageStat.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/ImageTk.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/ImageTransform.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/ImageWin.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/ImtImagePlugin.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/IptcImagePlugin.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/Jpeg2KImagePlugin.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/JpegImagePlugin.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/JpegPresets.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/McIdasImagePlugin.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/MicImagePlugin.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/MpegImagePlugin.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/MpoImagePlugin.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/MspImagePlugin.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/PSDraw.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/PaletteFile.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/PalmImagePlugin.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/PcdImagePlugin.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/PcfFontFile.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/PcxImagePlugin.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/PdfImagePlugin.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/PdfParser.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/PixarImagePlugin.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/PngImagePlugin.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/PpmImagePlugin.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/PsdImagePlugin.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/QoiImagePlugin.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/SgiImagePlugin.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/SpiderImagePlugin.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/SunImagePlugin.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/TarIO.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/TgaImagePlugin.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/TiffImagePlugin.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/TiffTags.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/WalImageFile.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/WebPImagePlugin.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/WmfImagePlugin.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/XVThumbImagePlugin.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/XbmImagePlugin.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/XpmImagePlugin.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/__main__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/_binary.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/_deprecate.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/_tkinter_finder.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/_typing.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/_util.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/_version.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/features.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/__pycache__/report.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/PIL/_binary.py create mode 100644 venv/lib/python3.12/site-packages/PIL/_deprecate.py create mode 100755 venv/lib/python3.12/site-packages/PIL/_imaging.cpython-312-x86_64-linux-gnu.so create mode 100644 venv/lib/python3.12/site-packages/PIL/_imaging.pyi create mode 100755 venv/lib/python3.12/site-packages/PIL/_imagingcms.cpython-312-x86_64-linux-gnu.so create mode 100644 venv/lib/python3.12/site-packages/PIL/_imagingcms.pyi create mode 100755 venv/lib/python3.12/site-packages/PIL/_imagingft.cpython-312-x86_64-linux-gnu.so create mode 100644 venv/lib/python3.12/site-packages/PIL/_imagingft.pyi create mode 100755 venv/lib/python3.12/site-packages/PIL/_imagingmath.cpython-312-x86_64-linux-gnu.so create mode 100644 venv/lib/python3.12/site-packages/PIL/_imagingmath.pyi create mode 100755 venv/lib/python3.12/site-packages/PIL/_imagingmorph.cpython-312-x86_64-linux-gnu.so create mode 100644 venv/lib/python3.12/site-packages/PIL/_imagingmorph.pyi create mode 100755 venv/lib/python3.12/site-packages/PIL/_imagingtk.cpython-312-x86_64-linux-gnu.so create mode 100644 venv/lib/python3.12/site-packages/PIL/_imagingtk.pyi create mode 100644 venv/lib/python3.12/site-packages/PIL/_tkinter_finder.py create mode 100644 venv/lib/python3.12/site-packages/PIL/_typing.py create mode 100644 venv/lib/python3.12/site-packages/PIL/_util.py create mode 100644 venv/lib/python3.12/site-packages/PIL/_version.py create mode 100755 venv/lib/python3.12/site-packages/PIL/_webp.cpython-312-x86_64-linux-gnu.so create mode 100644 venv/lib/python3.12/site-packages/PIL/_webp.pyi create mode 100644 venv/lib/python3.12/site-packages/PIL/features.py create mode 100644 venv/lib/python3.12/site-packages/PIL/py.typed create mode 100644 venv/lib/python3.12/site-packages/PIL/report.py create mode 100644 venv/lib/python3.12/site-packages/Xlib/X.py create mode 100644 venv/lib/python3.12/site-packages/Xlib/XK.py create mode 100644 venv/lib/python3.12/site-packages/Xlib/Xatom.py create mode 100644 venv/lib/python3.12/site-packages/Xlib/Xcursorfont.py create mode 100644 venv/lib/python3.12/site-packages/Xlib/Xutil.py create mode 100644 venv/lib/python3.12/site-packages/Xlib/__init__.py create mode 100644 venv/lib/python3.12/site-packages/Xlib/__pycache__/X.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/Xlib/__pycache__/XK.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/Xlib/__pycache__/Xatom.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/Xlib/__pycache__/Xcursorfont.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/Xlib/__pycache__/Xutil.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/Xlib/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/Xlib/__pycache__/display.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/Xlib/__pycache__/error.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/Xlib/__pycache__/rdb.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/Xlib/__pycache__/threaded.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/Xlib/__pycache__/xauth.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/Xlib/display.py create mode 100644 venv/lib/python3.12/site-packages/Xlib/error.py create mode 100644 venv/lib/python3.12/site-packages/Xlib/ext/__init__.py create mode 100644 venv/lib/python3.12/site-packages/Xlib/ext/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/Xlib/ext/__pycache__/composite.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/Xlib/ext/__pycache__/damage.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/Xlib/ext/__pycache__/dpms.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/Xlib/ext/__pycache__/ge.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/Xlib/ext/__pycache__/nvcontrol.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/Xlib/ext/__pycache__/randr.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/Xlib/ext/__pycache__/record.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/Xlib/ext/__pycache__/res.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/Xlib/ext/__pycache__/screensaver.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/Xlib/ext/__pycache__/security.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/Xlib/ext/__pycache__/shape.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/Xlib/ext/__pycache__/xfixes.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/Xlib/ext/__pycache__/xinerama.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/Xlib/ext/__pycache__/xinput.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/Xlib/ext/__pycache__/xtest.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/Xlib/ext/composite.py create mode 100644 venv/lib/python3.12/site-packages/Xlib/ext/damage.py create mode 100644 venv/lib/python3.12/site-packages/Xlib/ext/dpms.py create mode 100644 venv/lib/python3.12/site-packages/Xlib/ext/ge.py create mode 100644 venv/lib/python3.12/site-packages/Xlib/ext/nvcontrol.py create mode 100644 venv/lib/python3.12/site-packages/Xlib/ext/randr.py create mode 100644 venv/lib/python3.12/site-packages/Xlib/ext/record.py create mode 100644 venv/lib/python3.12/site-packages/Xlib/ext/res.py create mode 100644 venv/lib/python3.12/site-packages/Xlib/ext/screensaver.py create mode 100644 venv/lib/python3.12/site-packages/Xlib/ext/security.py create mode 100644 venv/lib/python3.12/site-packages/Xlib/ext/shape.py create mode 100644 venv/lib/python3.12/site-packages/Xlib/ext/xfixes.py create mode 100644 venv/lib/python3.12/site-packages/Xlib/ext/xinerama.py create mode 100644 venv/lib/python3.12/site-packages/Xlib/ext/xinput.py create mode 100644 venv/lib/python3.12/site-packages/Xlib/ext/xtest.py create mode 100644 venv/lib/python3.12/site-packages/Xlib/keysymdef/__init__.py create mode 100644 venv/lib/python3.12/site-packages/Xlib/keysymdef/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/Xlib/keysymdef/__pycache__/apl.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/Xlib/keysymdef/__pycache__/arabic.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/Xlib/keysymdef/__pycache__/cyrillic.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/Xlib/keysymdef/__pycache__/greek.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/Xlib/keysymdef/__pycache__/hebrew.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/Xlib/keysymdef/__pycache__/katakana.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/Xlib/keysymdef/__pycache__/korean.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/Xlib/keysymdef/__pycache__/latin1.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/Xlib/keysymdef/__pycache__/latin2.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/Xlib/keysymdef/__pycache__/latin3.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/Xlib/keysymdef/__pycache__/latin4.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/Xlib/keysymdef/__pycache__/miscellany.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/Xlib/keysymdef/__pycache__/publishing.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/Xlib/keysymdef/__pycache__/special.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/Xlib/keysymdef/__pycache__/technical.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/Xlib/keysymdef/__pycache__/thai.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/Xlib/keysymdef/__pycache__/xf86.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/Xlib/keysymdef/__pycache__/xk3270.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/Xlib/keysymdef/__pycache__/xkb.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/Xlib/keysymdef/apl.py create mode 100644 venv/lib/python3.12/site-packages/Xlib/keysymdef/arabic.py create mode 100644 venv/lib/python3.12/site-packages/Xlib/keysymdef/cyrillic.py create mode 100644 venv/lib/python3.12/site-packages/Xlib/keysymdef/greek.py create mode 100644 venv/lib/python3.12/site-packages/Xlib/keysymdef/hebrew.py create mode 100644 venv/lib/python3.12/site-packages/Xlib/keysymdef/katakana.py create mode 100644 venv/lib/python3.12/site-packages/Xlib/keysymdef/korean.py create mode 100644 venv/lib/python3.12/site-packages/Xlib/keysymdef/latin1.py create mode 100644 venv/lib/python3.12/site-packages/Xlib/keysymdef/latin2.py create mode 100644 venv/lib/python3.12/site-packages/Xlib/keysymdef/latin3.py create mode 100644 venv/lib/python3.12/site-packages/Xlib/keysymdef/latin4.py create mode 100644 venv/lib/python3.12/site-packages/Xlib/keysymdef/miscellany.py create mode 100644 venv/lib/python3.12/site-packages/Xlib/keysymdef/publishing.py create mode 100644 venv/lib/python3.12/site-packages/Xlib/keysymdef/special.py create mode 100644 venv/lib/python3.12/site-packages/Xlib/keysymdef/technical.py create mode 100644 venv/lib/python3.12/site-packages/Xlib/keysymdef/thai.py create mode 100644 venv/lib/python3.12/site-packages/Xlib/keysymdef/xf86.py create mode 100644 venv/lib/python3.12/site-packages/Xlib/keysymdef/xk3270.py create mode 100644 venv/lib/python3.12/site-packages/Xlib/keysymdef/xkb.py create mode 100644 venv/lib/python3.12/site-packages/Xlib/protocol/__init__.py create mode 100644 venv/lib/python3.12/site-packages/Xlib/protocol/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/Xlib/protocol/__pycache__/display.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/Xlib/protocol/__pycache__/event.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/Xlib/protocol/__pycache__/request.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/Xlib/protocol/__pycache__/rq.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/Xlib/protocol/__pycache__/structs.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/Xlib/protocol/display.py create mode 100644 venv/lib/python3.12/site-packages/Xlib/protocol/event.py create mode 100644 venv/lib/python3.12/site-packages/Xlib/protocol/request.py create mode 100644 venv/lib/python3.12/site-packages/Xlib/protocol/rq.py create mode 100644 venv/lib/python3.12/site-packages/Xlib/protocol/structs.py create mode 100644 venv/lib/python3.12/site-packages/Xlib/rdb.py create mode 100644 venv/lib/python3.12/site-packages/Xlib/support/__init__.py create mode 100644 venv/lib/python3.12/site-packages/Xlib/support/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/Xlib/support/__pycache__/connect.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/Xlib/support/__pycache__/lock.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/Xlib/support/__pycache__/unix_connect.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/Xlib/support/__pycache__/vms_connect.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/Xlib/support/connect.py create mode 100644 venv/lib/python3.12/site-packages/Xlib/support/lock.py create mode 100644 venv/lib/python3.12/site-packages/Xlib/support/unix_connect.py create mode 100644 venv/lib/python3.12/site-packages/Xlib/support/vms_connect.py create mode 100644 venv/lib/python3.12/site-packages/Xlib/threaded.py create mode 100644 venv/lib/python3.12/site-packages/Xlib/xauth.py create mode 100644 venv/lib/python3.12/site-packages/Xlib/xobject/__init__.py create mode 100644 venv/lib/python3.12/site-packages/Xlib/xobject/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/Xlib/xobject/__pycache__/colormap.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/Xlib/xobject/__pycache__/cursor.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/Xlib/xobject/__pycache__/drawable.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/Xlib/xobject/__pycache__/fontable.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/Xlib/xobject/__pycache__/icccm.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/Xlib/xobject/__pycache__/resource.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/Xlib/xobject/colormap.py create mode 100644 venv/lib/python3.12/site-packages/Xlib/xobject/cursor.py create mode 100644 venv/lib/python3.12/site-packages/Xlib/xobject/drawable.py create mode 100644 venv/lib/python3.12/site-packages/Xlib/xobject/fontable.py create mode 100644 venv/lib/python3.12/site-packages/Xlib/xobject/icccm.py create mode 100644 venv/lib/python3.12/site-packages/Xlib/xobject/resource.py create mode 100644 venv/lib/python3.12/site-packages/__pycache__/six.cpython-312.pyc create mode 100755 venv/lib/python3.12/site-packages/_dbus_bindings.cpython-312-x86_64-linux-gnu.so create mode 100755 venv/lib/python3.12/site-packages/_dbus_glib_bindings.cpython-312-x86_64-linux-gnu.so create mode 100644 venv/lib/python3.12/site-packages/bidict-0.23.1.dist-info/INSTALLER create mode 100644 venv/lib/python3.12/site-packages/bidict-0.23.1.dist-info/LICENSE create mode 100644 venv/lib/python3.12/site-packages/bidict-0.23.1.dist-info/METADATA create mode 100644 venv/lib/python3.12/site-packages/bidict-0.23.1.dist-info/RECORD create mode 100644 venv/lib/python3.12/site-packages/bidict-0.23.1.dist-info/WHEEL create mode 100644 venv/lib/python3.12/site-packages/bidict-0.23.1.dist-info/top_level.txt create mode 100644 venv/lib/python3.12/site-packages/bidict/__init__.py create mode 100644 venv/lib/python3.12/site-packages/bidict/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/bidict/__pycache__/_abc.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/bidict/__pycache__/_base.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/bidict/__pycache__/_bidict.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/bidict/__pycache__/_dup.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/bidict/__pycache__/_exc.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/bidict/__pycache__/_frozen.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/bidict/__pycache__/_iter.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/bidict/__pycache__/_orderedbase.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/bidict/__pycache__/_orderedbidict.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/bidict/__pycache__/_typing.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/bidict/__pycache__/metadata.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/bidict/_abc.py create mode 100644 venv/lib/python3.12/site-packages/bidict/_base.py create mode 100644 venv/lib/python3.12/site-packages/bidict/_bidict.py create mode 100644 venv/lib/python3.12/site-packages/bidict/_dup.py create mode 100644 venv/lib/python3.12/site-packages/bidict/_exc.py create mode 100644 venv/lib/python3.12/site-packages/bidict/_frozen.py create mode 100644 venv/lib/python3.12/site-packages/bidict/_iter.py create mode 100644 venv/lib/python3.12/site-packages/bidict/_orderedbase.py create mode 100644 venv/lib/python3.12/site-packages/bidict/_orderedbidict.py create mode 100644 venv/lib/python3.12/site-packages/bidict/_typing.py create mode 100644 venv/lib/python3.12/site-packages/bidict/metadata.py create mode 100644 venv/lib/python3.12/site-packages/bidict/py.typed create mode 100755 venv/lib/python3.12/site-packages/cairo/__init__.py create mode 100644 venv/lib/python3.12/site-packages/cairo/__init__.pyi create mode 100644 venv/lib/python3.12/site-packages/cairo/__pycache__/__init__.cpython-312.pyc create mode 100755 venv/lib/python3.12/site-packages/cairo/_cairo.cpython-312-x86_64-linux-gnu.so create mode 100644 venv/lib/python3.12/site-packages/cairo/include/py3cairo.h create mode 100644 venv/lib/python3.12/site-packages/cairo/py.typed create mode 100644 venv/lib/python3.12/site-packages/dbus/__init__.py create mode 100644 venv/lib/python3.12/site-packages/dbus/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/dbus/__pycache__/_compat.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/dbus/__pycache__/_dbus.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/dbus/__pycache__/_expat_introspect_parser.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/dbus/__pycache__/bus.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/dbus/__pycache__/connection.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/dbus/__pycache__/decorators.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/dbus/__pycache__/exceptions.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/dbus/__pycache__/gi_service.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/dbus/__pycache__/glib.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/dbus/__pycache__/lowlevel.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/dbus/__pycache__/proxies.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/dbus/__pycache__/server.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/dbus/__pycache__/service.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/dbus/__pycache__/types.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/dbus/_compat.py create mode 100644 venv/lib/python3.12/site-packages/dbus/_dbus.py create mode 100644 venv/lib/python3.12/site-packages/dbus/_expat_introspect_parser.py create mode 100644 venv/lib/python3.12/site-packages/dbus/bus.py create mode 100644 venv/lib/python3.12/site-packages/dbus/connection.py create mode 100644 venv/lib/python3.12/site-packages/dbus/decorators.py create mode 100644 venv/lib/python3.12/site-packages/dbus/exceptions.py create mode 100644 venv/lib/python3.12/site-packages/dbus/gi_service.py create mode 100644 venv/lib/python3.12/site-packages/dbus/glib.py create mode 100644 venv/lib/python3.12/site-packages/dbus/lowlevel.py create mode 100644 venv/lib/python3.12/site-packages/dbus/mainloop/__init__.py create mode 100644 venv/lib/python3.12/site-packages/dbus/mainloop/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/dbus/mainloop/__pycache__/glib.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/dbus/mainloop/glib.py create mode 100644 venv/lib/python3.12/site-packages/dbus/proxies.py create mode 100644 venv/lib/python3.12/site-packages/dbus/server.py create mode 100644 venv/lib/python3.12/site-packages/dbus/service.py create mode 100644 venv/lib/python3.12/site-packages/dbus/types.py create mode 100644 venv/lib/python3.12/site-packages/dbus_fast-2.24.4.dist-info/INSTALLER create mode 100644 venv/lib/python3.12/site-packages/dbus_fast-2.24.4.dist-info/LICENSE create mode 100644 venv/lib/python3.12/site-packages/dbus_fast-2.24.4.dist-info/METADATA create mode 100644 venv/lib/python3.12/site-packages/dbus_fast-2.24.4.dist-info/RECORD create mode 100644 venv/lib/python3.12/site-packages/dbus_fast-2.24.4.dist-info/WHEEL create mode 100644 venv/lib/python3.12/site-packages/dbus_fast/__init__.py create mode 100644 venv/lib/python3.12/site-packages/dbus_fast/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/dbus_fast/__pycache__/__version__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/dbus_fast/__pycache__/auth.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/dbus_fast/__pycache__/constants.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/dbus_fast/__pycache__/errors.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/dbus_fast/__pycache__/introspection.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/dbus_fast/__pycache__/main.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/dbus_fast/__pycache__/message.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/dbus_fast/__pycache__/message_bus.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/dbus_fast/__pycache__/proxy_object.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/dbus_fast/__pycache__/send_reply.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/dbus_fast/__pycache__/service.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/dbus_fast/__pycache__/signature.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/dbus_fast/__pycache__/unpack.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/dbus_fast/__pycache__/validators.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/dbus_fast/__version__.py create mode 100644 venv/lib/python3.12/site-packages/dbus_fast/_private/__init__.py create mode 100644 venv/lib/python3.12/site-packages/dbus_fast/_private/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/dbus_fast/_private/__pycache__/_cython_compat.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/dbus_fast/_private/__pycache__/address.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/dbus_fast/_private/__pycache__/constants.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/dbus_fast/_private/__pycache__/marshaller.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/dbus_fast/_private/__pycache__/unmarshaller.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/dbus_fast/_private/__pycache__/util.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/dbus_fast/_private/_cython_compat.py create mode 100755 venv/lib/python3.12/site-packages/dbus_fast/_private/address.cpython-312-x86_64-linux-gnu.so create mode 100644 venv/lib/python3.12/site-packages/dbus_fast/_private/address.pxd create mode 100644 venv/lib/python3.12/site-packages/dbus_fast/_private/address.py create mode 100644 venv/lib/python3.12/site-packages/dbus_fast/_private/constants.py create mode 100755 venv/lib/python3.12/site-packages/dbus_fast/_private/marshaller.cpython-312-x86_64-linux-gnu.so create mode 100644 venv/lib/python3.12/site-packages/dbus_fast/_private/marshaller.pxd create mode 100644 venv/lib/python3.12/site-packages/dbus_fast/_private/marshaller.py create mode 100755 venv/lib/python3.12/site-packages/dbus_fast/_private/unmarshaller.cpython-312-x86_64-linux-gnu.so create mode 100644 venv/lib/python3.12/site-packages/dbus_fast/_private/unmarshaller.pxd create mode 100644 venv/lib/python3.12/site-packages/dbus_fast/_private/unmarshaller.py create mode 100644 venv/lib/python3.12/site-packages/dbus_fast/_private/util.py create mode 100644 venv/lib/python3.12/site-packages/dbus_fast/aio/__init__.py create mode 100644 venv/lib/python3.12/site-packages/dbus_fast/aio/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/dbus_fast/aio/__pycache__/message_bus.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/dbus_fast/aio/__pycache__/message_reader.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/dbus_fast/aio/__pycache__/proxy_object.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/dbus_fast/aio/message_bus.py create mode 100755 venv/lib/python3.12/site-packages/dbus_fast/aio/message_reader.cpython-312-x86_64-linux-gnu.so create mode 100644 venv/lib/python3.12/site-packages/dbus_fast/aio/message_reader.pxd create mode 100644 venv/lib/python3.12/site-packages/dbus_fast/aio/message_reader.py create mode 100644 venv/lib/python3.12/site-packages/dbus_fast/aio/proxy_object.py create mode 100644 venv/lib/python3.12/site-packages/dbus_fast/auth.py create mode 100644 venv/lib/python3.12/site-packages/dbus_fast/constants.py create mode 100644 venv/lib/python3.12/site-packages/dbus_fast/errors.py create mode 100644 venv/lib/python3.12/site-packages/dbus_fast/glib/__init__.py create mode 100644 venv/lib/python3.12/site-packages/dbus_fast/glib/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/dbus_fast/glib/__pycache__/message_bus.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/dbus_fast/glib/__pycache__/proxy_object.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/dbus_fast/glib/message_bus.py create mode 100644 venv/lib/python3.12/site-packages/dbus_fast/glib/proxy_object.py create mode 100644 venv/lib/python3.12/site-packages/dbus_fast/introspection.py create mode 100644 venv/lib/python3.12/site-packages/dbus_fast/main.py create mode 100755 venv/lib/python3.12/site-packages/dbus_fast/message.cpython-312-x86_64-linux-gnu.so create mode 100644 venv/lib/python3.12/site-packages/dbus_fast/message.pxd create mode 100644 venv/lib/python3.12/site-packages/dbus_fast/message.py create mode 100755 venv/lib/python3.12/site-packages/dbus_fast/message_bus.cpython-312-x86_64-linux-gnu.so create mode 100644 venv/lib/python3.12/site-packages/dbus_fast/message_bus.pxd create mode 100644 venv/lib/python3.12/site-packages/dbus_fast/message_bus.py create mode 100644 venv/lib/python3.12/site-packages/dbus_fast/proxy_object.py create mode 100644 venv/lib/python3.12/site-packages/dbus_fast/py.typed create mode 100644 venv/lib/python3.12/site-packages/dbus_fast/send_reply.py create mode 100755 venv/lib/python3.12/site-packages/dbus_fast/service.cpython-312-x86_64-linux-gnu.so create mode 100644 venv/lib/python3.12/site-packages/dbus_fast/service.pxd create mode 100644 venv/lib/python3.12/site-packages/dbus_fast/service.py create mode 100755 venv/lib/python3.12/site-packages/dbus_fast/signature.cpython-312-x86_64-linux-gnu.so create mode 100644 venv/lib/python3.12/site-packages/dbus_fast/signature.pxd create mode 100644 venv/lib/python3.12/site-packages/dbus_fast/signature.py create mode 100755 venv/lib/python3.12/site-packages/dbus_fast/unpack.cpython-312-x86_64-linux-gnu.so create mode 100644 venv/lib/python3.12/site-packages/dbus_fast/unpack.pxd create mode 100644 venv/lib/python3.12/site-packages/dbus_fast/unpack.py create mode 100644 venv/lib/python3.12/site-packages/dbus_fast/validators.py create mode 100644 venv/lib/python3.12/site-packages/dbus_python-1.3.2.dist-info/INSTALLER create mode 100644 venv/lib/python3.12/site-packages/dbus_python-1.3.2.dist-info/METADATA create mode 100644 venv/lib/python3.12/site-packages/dbus_python-1.3.2.dist-info/RECORD create mode 100644 venv/lib/python3.12/site-packages/dbus_python-1.3.2.dist-info/REQUESTED create mode 100644 venv/lib/python3.12/site-packages/dbus_python-1.3.2.dist-info/WHEEL create mode 100644 venv/lib/python3.12/site-packages/desktop_notifier-6.0.0.dist-info/INSTALLER create mode 100644 venv/lib/python3.12/site-packages/desktop_notifier-6.0.0.dist-info/LICENSE create mode 100644 venv/lib/python3.12/site-packages/desktop_notifier-6.0.0.dist-info/METADATA create mode 100644 venv/lib/python3.12/site-packages/desktop_notifier-6.0.0.dist-info/RECORD create mode 100644 venv/lib/python3.12/site-packages/desktop_notifier-6.0.0.dist-info/REQUESTED create mode 100644 venv/lib/python3.12/site-packages/desktop_notifier-6.0.0.dist-info/WHEEL create mode 100644 venv/lib/python3.12/site-packages/desktop_notifier-6.0.0.dist-info/top_level.txt create mode 100644 venv/lib/python3.12/site-packages/desktop_notifier/__init__.py create mode 100644 venv/lib/python3.12/site-packages/desktop_notifier/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/desktop_notifier/__pycache__/common.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/desktop_notifier/__pycache__/main.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/desktop_notifier/__pycache__/sync.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/desktop_notifier/backends/__init__.py create mode 100644 venv/lib/python3.12/site-packages/desktop_notifier/backends/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/desktop_notifier/backends/__pycache__/base.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/desktop_notifier/backends/__pycache__/dbus.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/desktop_notifier/backends/__pycache__/dummy.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/desktop_notifier/backends/__pycache__/macos.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/desktop_notifier/backends/__pycache__/macos_support.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/desktop_notifier/backends/__pycache__/winrt.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/desktop_notifier/backends/base.py create mode 100644 venv/lib/python3.12/site-packages/desktop_notifier/backends/dbus.py create mode 100644 venv/lib/python3.12/site-packages/desktop_notifier/backends/dummy.py create mode 100644 venv/lib/python3.12/site-packages/desktop_notifier/backends/macos.py create mode 100644 venv/lib/python3.12/site-packages/desktop_notifier/backends/macos_support.py create mode 100644 venv/lib/python3.12/site-packages/desktop_notifier/backends/winrt.py create mode 100644 venv/lib/python3.12/site-packages/desktop_notifier/common.py create mode 100644 venv/lib/python3.12/site-packages/desktop_notifier/main.py create mode 100644 venv/lib/python3.12/site-packages/desktop_notifier/py.typed create mode 100644 venv/lib/python3.12/site-packages/desktop_notifier/resources/__init__.py create mode 100644 venv/lib/python3.12/site-packages/desktop_notifier/resources/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/desktop_notifier/resources/python.png create mode 100644 venv/lib/python3.12/site-packages/desktop_notifier/sync.py create mode 100644 venv/lib/python3.12/site-packages/gi/__init__.py create mode 100644 venv/lib/python3.12/site-packages/gi/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/gi/__pycache__/_constants.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/gi/__pycache__/_error.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/gi/__pycache__/_gtktemplate.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/gi/__pycache__/_option.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/gi/__pycache__/_ossighelper.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/gi/__pycache__/_propertyhelper.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/gi/__pycache__/_signalhelper.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/gi/__pycache__/docstring.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/gi/__pycache__/events.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/gi/__pycache__/importer.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/gi/__pycache__/module.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/gi/__pycache__/pygtkcompat.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/gi/__pycache__/types.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/gi/_constants.py create mode 100644 venv/lib/python3.12/site-packages/gi/_error.py create mode 100755 venv/lib/python3.12/site-packages/gi/_gi.cpython-312-x86_64-linux-gnu.so create mode 100755 venv/lib/python3.12/site-packages/gi/_gi_cairo.cpython-312-x86_64-linux-gnu.so create mode 100644 venv/lib/python3.12/site-packages/gi/_gtktemplate.py create mode 100644 venv/lib/python3.12/site-packages/gi/_option.py create mode 100644 venv/lib/python3.12/site-packages/gi/_ossighelper.py create mode 100644 venv/lib/python3.12/site-packages/gi/_propertyhelper.py create mode 100644 venv/lib/python3.12/site-packages/gi/_signalhelper.py create mode 100644 venv/lib/python3.12/site-packages/gi/docstring.py create mode 100644 venv/lib/python3.12/site-packages/gi/events.py create mode 100644 venv/lib/python3.12/site-packages/gi/importer.py create mode 100644 venv/lib/python3.12/site-packages/gi/module.py create mode 100644 venv/lib/python3.12/site-packages/gi/overrides/GIMarshallingTests.py create mode 100644 venv/lib/python3.12/site-packages/gi/overrides/GLib.py create mode 100644 venv/lib/python3.12/site-packages/gi/overrides/GObject.py create mode 100644 venv/lib/python3.12/site-packages/gi/overrides/Gdk.py create mode 100644 venv/lib/python3.12/site-packages/gi/overrides/GdkPixbuf.py create mode 100644 venv/lib/python3.12/site-packages/gi/overrides/Gio.py create mode 100644 venv/lib/python3.12/site-packages/gi/overrides/Gtk.py create mode 100644 venv/lib/python3.12/site-packages/gi/overrides/Pango.py create mode 100644 venv/lib/python3.12/site-packages/gi/overrides/__init__.py create mode 100644 venv/lib/python3.12/site-packages/gi/overrides/__pycache__/GIMarshallingTests.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/gi/overrides/__pycache__/GLib.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/gi/overrides/__pycache__/GObject.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/gi/overrides/__pycache__/Gdk.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/gi/overrides/__pycache__/GdkPixbuf.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/gi/overrides/__pycache__/Gio.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/gi/overrides/__pycache__/Gtk.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/gi/overrides/__pycache__/Pango.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/gi/overrides/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/gi/overrides/__pycache__/keysyms.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/gi/overrides/keysyms.py create mode 100644 venv/lib/python3.12/site-packages/gi/pygtkcompat.py create mode 100644 venv/lib/python3.12/site-packages/gi/repository/__init__.py create mode 100644 venv/lib/python3.12/site-packages/gi/repository/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/gi/types.py create mode 100644 venv/lib/python3.12/site-packages/packaging-24.2.dist-info/INSTALLER create mode 100644 venv/lib/python3.12/site-packages/packaging-24.2.dist-info/LICENSE create mode 100644 venv/lib/python3.12/site-packages/packaging-24.2.dist-info/LICENSE.APACHE create mode 100644 venv/lib/python3.12/site-packages/packaging-24.2.dist-info/LICENSE.BSD create mode 100644 venv/lib/python3.12/site-packages/packaging-24.2.dist-info/METADATA create mode 100644 venv/lib/python3.12/site-packages/packaging-24.2.dist-info/RECORD create mode 100644 venv/lib/python3.12/site-packages/packaging-24.2.dist-info/WHEEL create mode 100644 venv/lib/python3.12/site-packages/packaging/__init__.py create mode 100644 venv/lib/python3.12/site-packages/packaging/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/packaging/__pycache__/_elffile.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/packaging/__pycache__/_manylinux.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/packaging/__pycache__/_musllinux.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/packaging/__pycache__/_parser.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/packaging/__pycache__/_structures.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/packaging/__pycache__/_tokenizer.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/packaging/__pycache__/markers.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/packaging/__pycache__/metadata.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/packaging/__pycache__/requirements.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/packaging/__pycache__/specifiers.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/packaging/__pycache__/tags.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/packaging/__pycache__/utils.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/packaging/__pycache__/version.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/packaging/_elffile.py create mode 100644 venv/lib/python3.12/site-packages/packaging/_manylinux.py create mode 100644 venv/lib/python3.12/site-packages/packaging/_musllinux.py create mode 100644 venv/lib/python3.12/site-packages/packaging/_parser.py create mode 100644 venv/lib/python3.12/site-packages/packaging/_structures.py create mode 100644 venv/lib/python3.12/site-packages/packaging/_tokenizer.py create mode 100644 venv/lib/python3.12/site-packages/packaging/licenses/__init__.py create mode 100644 venv/lib/python3.12/site-packages/packaging/licenses/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/packaging/licenses/__pycache__/_spdx.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/packaging/licenses/_spdx.py create mode 100644 venv/lib/python3.12/site-packages/packaging/markers.py create mode 100644 venv/lib/python3.12/site-packages/packaging/metadata.py create mode 100644 venv/lib/python3.12/site-packages/packaging/py.typed create mode 100644 venv/lib/python3.12/site-packages/packaging/requirements.py create mode 100644 venv/lib/python3.12/site-packages/packaging/specifiers.py create mode 100644 venv/lib/python3.12/site-packages/packaging/tags.py create mode 100644 venv/lib/python3.12/site-packages/packaging/utils.py create mode 100644 venv/lib/python3.12/site-packages/packaging/version.py create mode 100644 venv/lib/python3.12/site-packages/pillow-11.0.0.dist-info/INSTALLER create mode 100644 venv/lib/python3.12/site-packages/pillow-11.0.0.dist-info/LICENSE create mode 100644 venv/lib/python3.12/site-packages/pillow-11.0.0.dist-info/METADATA create mode 100644 venv/lib/python3.12/site-packages/pillow-11.0.0.dist-info/RECORD create mode 100644 venv/lib/python3.12/site-packages/pillow-11.0.0.dist-info/REQUESTED create mode 100644 venv/lib/python3.12/site-packages/pillow-11.0.0.dist-info/WHEEL create mode 100644 venv/lib/python3.12/site-packages/pillow-11.0.0.dist-info/top_level.txt create mode 100644 venv/lib/python3.12/site-packages/pillow-11.0.0.dist-info/zip-safe create mode 100755 venv/lib/python3.12/site-packages/pillow.libs/libXau-154567c4.so.6.0.0 create mode 100755 venv/lib/python3.12/site-packages/pillow.libs/libbrotlicommon-3ecfe81c.so.1 create mode 100755 venv/lib/python3.12/site-packages/pillow.libs/libbrotlidec-ba690955.so.1 create mode 100755 venv/lib/python3.12/site-packages/pillow.libs/libfreetype-e7d5437d.so.6.20.1 create mode 100755 venv/lib/python3.12/site-packages/pillow.libs/libharfbuzz-144af51e.so.0 create mode 100755 venv/lib/python3.12/site-packages/pillow.libs/libjpeg-45e70d75.so.62.4.0 create mode 100755 venv/lib/python3.12/site-packages/pillow.libs/liblcms2-e69eef39.so.2.0.16 create mode 100755 venv/lib/python3.12/site-packages/pillow.libs/liblzma-c9407571.so.5.6.3 create mode 100755 venv/lib/python3.12/site-packages/pillow.libs/libopenjp2-05423b53.so create mode 100755 venv/lib/python3.12/site-packages/pillow.libs/libpng16-4cc6a9fc.so.16.44.0 create mode 100755 venv/lib/python3.12/site-packages/pillow.libs/libsharpyuv-898c0cb5.so.0.1.0 create mode 100755 venv/lib/python3.12/site-packages/pillow.libs/libtiff-0a86184d.so.6.0.2 create mode 100755 venv/lib/python3.12/site-packages/pillow.libs/libwebp-2fd3cdca.so.7.1.9 create mode 100755 venv/lib/python3.12/site-packages/pillow.libs/libwebpdemux-f2642bcc.so.2.0.15 create mode 100755 venv/lib/python3.12/site-packages/pillow.libs/libwebpmux-d524b4d5.so.3.1.0 create mode 100755 venv/lib/python3.12/site-packages/pillow.libs/libxcb-b8a56d01.so.1.1.0 create mode 100644 venv/lib/python3.12/site-packages/ping3-4.0.8.dist-info/INSTALLER create mode 100644 venv/lib/python3.12/site-packages/ping3-4.0.8.dist-info/LICENSE create mode 100644 venv/lib/python3.12/site-packages/ping3-4.0.8.dist-info/METADATA create mode 100644 venv/lib/python3.12/site-packages/ping3-4.0.8.dist-info/RECORD create mode 100644 venv/lib/python3.12/site-packages/ping3-4.0.8.dist-info/REQUESTED create mode 100644 venv/lib/python3.12/site-packages/ping3-4.0.8.dist-info/WHEEL create mode 100644 venv/lib/python3.12/site-packages/ping3-4.0.8.dist-info/entry_points.txt create mode 100644 venv/lib/python3.12/site-packages/ping3-4.0.8.dist-info/top_level.txt create mode 100644 venv/lib/python3.12/site-packages/ping3/__init__.py create mode 100644 venv/lib/python3.12/site-packages/ping3/__main__.py create mode 100644 venv/lib/python3.12/site-packages/ping3/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/ping3/__pycache__/__main__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/ping3/__pycache__/command_line.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/ping3/__pycache__/enums.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/ping3/__pycache__/errors.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/ping3/command_line.py create mode 100644 venv/lib/python3.12/site-packages/ping3/enums.py create mode 100644 venv/lib/python3.12/site-packages/ping3/errors.py create mode 100644 venv/lib/python3.12/site-packages/pip-24.3.1.dist-info/AUTHORS.txt create mode 100644 venv/lib/python3.12/site-packages/pip-24.3.1.dist-info/INSTALLER create mode 100644 venv/lib/python3.12/site-packages/pip-24.3.1.dist-info/LICENSE.txt create mode 100644 venv/lib/python3.12/site-packages/pip-24.3.1.dist-info/METADATA create mode 100644 venv/lib/python3.12/site-packages/pip-24.3.1.dist-info/RECORD create mode 100644 venv/lib/python3.12/site-packages/pip-24.3.1.dist-info/REQUESTED create mode 100644 venv/lib/python3.12/site-packages/pip-24.3.1.dist-info/WHEEL create mode 100644 venv/lib/python3.12/site-packages/pip-24.3.1.dist-info/entry_points.txt create mode 100644 venv/lib/python3.12/site-packages/pip-24.3.1.dist-info/top_level.txt create mode 100644 venv/lib/python3.12/site-packages/pip/__init__.py create mode 100644 venv/lib/python3.12/site-packages/pip/__main__.py create mode 100644 venv/lib/python3.12/site-packages/pip/__pip-runner__.py create mode 100644 venv/lib/python3.12/site-packages/pip/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/__pycache__/__main__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/__pycache__/__pip-runner__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/__init__.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/__pycache__/build_env.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/__pycache__/cache.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/__pycache__/configuration.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/__pycache__/exceptions.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/__pycache__/main.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/__pycache__/pyproject.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/build_env.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/cache.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/cli/__init__.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/index_command.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/main.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/parser.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/progress_bars.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/req_command.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/spinners.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/cli/autocompletion.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/cli/base_command.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/cli/cmdoptions.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/cli/command_context.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/cli/index_command.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/cli/main.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/cli/main_parser.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/cli/parser.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/cli/progress_bars.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/cli/req_command.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/cli/spinners.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/cli/status_codes.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/__init__.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/cache.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/check.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/completion.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/debug.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/download.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/hash.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/help.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/index.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/inspect.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/install.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/list.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/search.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/show.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/cache.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/check.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/completion.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/configuration.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/debug.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/download.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/freeze.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/hash.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/help.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/index.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/inspect.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/install.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/list.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/search.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/show.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/uninstall.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/commands/wheel.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/configuration.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/distributions/__init__.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/base.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/installed.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/sdist.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/distributions/base.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/distributions/installed.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/distributions/sdist.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/distributions/wheel.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/exceptions.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/index/__init__.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/index/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/index/__pycache__/collector.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/index/__pycache__/package_finder.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/index/__pycache__/sources.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/index/collector.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/index/package_finder.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/index/sources.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/locations/__init__.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/_distutils.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/_sysconfig.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/base.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/locations/_distutils.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/locations/_sysconfig.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/locations/base.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/main.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/metadata/__init__.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/_json.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/base.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/pkg_resources.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/metadata/_json.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/metadata/base.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__init__.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/_compat.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/_dists.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/_envs.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_compat.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_dists.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_envs.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/metadata/pkg_resources.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/models/__init__.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/candidate.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/direct_url.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/format_control.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/index.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/installation_report.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/link.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/scheme.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/search_scope.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/selection_prefs.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/target_python.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/wheel.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/models/candidate.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/models/direct_url.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/models/format_control.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/models/index.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/models/installation_report.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/models/link.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/models/scheme.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/models/search_scope.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/models/selection_prefs.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/models/target_python.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/models/wheel.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/network/__init__.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/auth.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/cache.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/download.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/lazy_wheel.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/session.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/utils.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/xmlrpc.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/network/auth.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/network/cache.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/network/download.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/network/lazy_wheel.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/network/session.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/network/utils.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/network/xmlrpc.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/operations/__init__.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/check.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/operations/build/__init__.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/build_tracker.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/metadata.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/metadata_editable.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/wheel.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/wheel_editable.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/operations/build/build_tracker.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/operations/build/metadata.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/operations/build/metadata_editable.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/operations/build/metadata_legacy.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/operations/build/wheel.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/operations/build/wheel_editable.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/operations/build/wheel_legacy.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/operations/check.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/operations/freeze.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/operations/install/__init__.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/operations/install/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/operations/install/__pycache__/editable_legacy.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/operations/install/__pycache__/wheel.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/operations/install/editable_legacy.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/operations/install/wheel.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/operations/prepare.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/pyproject.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/req/__init__.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/constructors.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_file.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_install.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_set.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/req/constructors.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/req/req_file.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/req/req_set.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/req/req_uninstall.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/resolution/__init__.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/resolution/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/resolution/__pycache__/base.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/resolution/base.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/__init__.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/__pycache__/resolver.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/resolver.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__init__.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/base.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/base.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/candidates.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/factory.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/provider.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/reporter.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/requirements.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/resolver.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/self_outdated_check.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__init__.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/_jaraco_text.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/_log.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/compat.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/compatibility_tags.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/datetime.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/direct_url_helpers.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/egg_link.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/entrypoints.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/filetypes.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/logging.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/misc.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/retry.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/subprocess.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/unpacking.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/urls.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/virtualenv.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/wheel.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/_jaraco_text.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/_log.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/appdirs.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/compat.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/compatibility_tags.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/datetime.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/deprecation.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/direct_url_helpers.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/egg_link.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/encoding.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/entrypoints.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/filesystem.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/filetypes.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/glibc.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/hashes.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/logging.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/misc.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/packaging.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/retry.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/setuptools_build.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/subprocess.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/temp_dir.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/unpacking.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/urls.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/virtualenv.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/utils/wheel.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/vcs/__init__.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/git.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/versioncontrol.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/vcs/bazaar.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/vcs/git.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/vcs/mercurial.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/vcs/subversion.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/vcs/versioncontrol.py create mode 100644 venv/lib/python3.12/site-packages/pip/_internal/wheel_builder.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/__init__.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/__pycache__/typing_extensions.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__init__.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/_cmd.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/adapter.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/cache.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__init__.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/controller.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/filewrapper.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/heuristics.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/py.typed create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/serialize.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/wrapper.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/certifi/__init__.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/certifi/__main__.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/certifi/cacert.pem create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/certifi/core.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/certifi/py.typed create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/__init__.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/compat.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/database.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/index.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/locators.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/manifest.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/markers.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/metadata.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/resources.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/scripts.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/t32.exe create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/t64-arm.exe create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/t64.exe create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/util.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/version.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/w32.exe create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/w64-arm.exe create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/w64.exe create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distlib/wheel.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distro/__init__.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distro/__main__.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distro/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distro/__pycache__/__main__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distro/__pycache__/distro.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distro/distro.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/distro/py.typed create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/idna/__init__.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/core.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/intranges.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/package_data.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/idna/codec.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/idna/compat.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/idna/core.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/idna/idnadata.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/idna/intranges.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/idna/package_data.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/idna/py.typed create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/idna/uts46data.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__init__.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/ext.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/fallback.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/msgpack/exceptions.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/msgpack/ext.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/msgpack/fallback.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/packaging/__init__.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_elffile.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_manylinux.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_musllinux.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_parser.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_tokenizer.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/markers.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/metadata.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/tags.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/version.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/packaging/_elffile.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/packaging/_manylinux.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/packaging/_musllinux.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/packaging/_parser.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/packaging/_structures.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/packaging/_tokenizer.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/packaging/markers.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/packaging/metadata.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/packaging/py.typed create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/packaging/requirements.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/packaging/specifiers.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/packaging/tags.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/packaging/utils.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/packaging/version.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pkg_resources/__init__.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__init__.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__main__.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/__main__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/android.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/api.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/macos.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/unix.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/version.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/windows.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/android.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/api.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/macos.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/py.typed create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/unix.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/version.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/windows.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/__init__.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/__main__.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/__main__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/cmdline.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/console.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/filter.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/formatter.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/lexer.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/modeline.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/plugin.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/regexopt.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/scanner.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/sphinxext.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/style.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/token.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/unistring.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/util.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/cmdline.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/console.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/filter.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/filters/__init__.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/filters/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatter.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__init__.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/_mapping.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/bbcode.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/groff.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/html.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/img.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/irc.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/latex.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/other.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/pangomarkup.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/rtf.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/svg.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal256.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/_mapping.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/bbcode.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/groff.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/html.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/img.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/irc.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/latex.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/other.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/pangomarkup.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/rtf.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/svg.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/terminal.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/terminal256.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexer.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/__init__.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/__pycache__/_mapping.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/__pycache__/python.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/_mapping.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/python.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/modeline.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/plugin.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/regexopt.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/scanner.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/sphinxext.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/style.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/styles/__init__.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/styles/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/styles/__pycache__/_mapping.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/styles/_mapping.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/token.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/unistring.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pygments/util.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__init__.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_compat.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_impl.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_compat.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_impl.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/__init__.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/_in_process.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/__init__.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/_internal_utils.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/api.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/compat.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/help.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/models.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/packages.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/__version__.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/_internal_utils.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/adapters.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/api.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/auth.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/certs.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/compat.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/cookies.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/exceptions.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/help.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/hooks.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/models.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/packages.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/sessions.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/status_codes.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/structures.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/requests/utils.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__init__.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/providers.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/reporters.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/resolvers.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/structs.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/__init__.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/__pycache__/collections_abc.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/collections_abc.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/providers.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/py.typed create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/reporters.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/resolvers.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/structs.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__init__.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__main__.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/__main__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_cell_widths.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_emoji_codes.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_emoji_replace.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_export_format.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_extension.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_fileno.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_inspect.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_log_render.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_loop.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_null_file.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_palettes.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_pick.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_ratio.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_spinners.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_stack.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_timer.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_win32_console.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_windows.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_windows_renderer.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_wrap.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/abc.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/align.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/ansi.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/bar.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/box.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/cells.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/color.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/color_triplet.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/columns.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/console.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/constrain.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/containers.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/control.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/default_styles.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/diagnose.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/emoji.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/errors.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/file_proxy.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/filesize.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/highlighter.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/json.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/jupyter.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/layout.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/live.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/live_render.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/logging.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/markup.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/measure.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/padding.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/pager.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/palette.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/panel.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/pretty.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/progress.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/progress_bar.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/prompt.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/protocol.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/region.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/repr.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/rule.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/scope.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/screen.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/segment.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/spinner.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/status.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/style.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/styled.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/syntax.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/table.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/terminal_theme.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/text.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/theme.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/themes.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/traceback.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/tree.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/_cell_widths.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/_emoji_codes.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/_emoji_replace.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/_export_format.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/_extension.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/_fileno.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/_inspect.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/_log_render.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/_loop.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/_null_file.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/_palettes.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/_pick.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/_ratio.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/_spinners.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/_stack.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/_timer.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/_win32_console.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/_windows.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/_windows_renderer.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/_wrap.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/abc.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/align.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/ansi.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/bar.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/box.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/cells.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/color.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/color_triplet.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/columns.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/console.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/constrain.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/containers.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/control.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/default_styles.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/diagnose.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/emoji.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/errors.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/file_proxy.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/filesize.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/highlighter.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/json.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/jupyter.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/layout.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/live.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/live_render.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/logging.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/markup.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/measure.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/padding.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/pager.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/palette.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/panel.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/pretty.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/progress.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/progress_bar.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/prompt.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/protocol.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/py.typed create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/region.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/repr.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/rule.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/scope.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/screen.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/segment.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/spinner.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/status.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/style.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/styled.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/syntax.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/table.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/terminal_theme.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/text.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/theme.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/themes.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/traceback.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/rich/tree.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/tomli/__init__.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/_parser.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/_re.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/_types.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/tomli/_parser.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/tomli/_re.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/tomli/_types.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/tomli/py.typed create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/truststore/__init__.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_api.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_macos.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_openssl.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_ssl_constants.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_windows.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/truststore/_api.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/truststore/_macos.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/truststore/_openssl.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/truststore/_ssl_constants.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/truststore/_windows.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/truststore/py.typed create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/typing_extensions.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__init__.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/_collections.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/_version.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/connection.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/exceptions.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/fields.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/filepost.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/poolmanager.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/request.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/response.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/_collections.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/_version.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/connection.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/connectionpool.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__init__.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/appengine.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/securetransport.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/socks.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/exceptions.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/fields.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/filepost.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/__init__.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/__pycache__/six.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/weakref_finalize.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/weakref_finalize.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/six.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/poolmanager.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/request.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/response.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__init__.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/connection.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/proxy.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/queue.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/response.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/retry.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_match_hostname.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/ssltransport.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/timeout.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/url.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/wait.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/connection.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/proxy.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/queue.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/request.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/response.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/retry.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/ssl_.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/ssl_match_hostname.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/ssltransport.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/timeout.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/url.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/wait.py create mode 100644 venv/lib/python3.12/site-packages/pip/_vendor/vendor.txt create mode 100644 venv/lib/python3.12/site-packages/pip/py.typed create mode 100644 venv/lib/python3.12/site-packages/plyer-2.1.0.dist-info/INSTALLER create mode 100644 venv/lib/python3.12/site-packages/plyer-2.1.0.dist-info/LICENSE create mode 100644 venv/lib/python3.12/site-packages/plyer-2.1.0.dist-info/METADATA create mode 100644 venv/lib/python3.12/site-packages/plyer-2.1.0.dist-info/RECORD create mode 100644 venv/lib/python3.12/site-packages/plyer-2.1.0.dist-info/REQUESTED create mode 100644 venv/lib/python3.12/site-packages/plyer-2.1.0.dist-info/WHEEL create mode 100644 venv/lib/python3.12/site-packages/plyer-2.1.0.dist-info/top_level.txt create mode 100644 venv/lib/python3.12/site-packages/plyer/__init__.py create mode 100644 venv/lib/python3.12/site-packages/plyer/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/__pycache__/utils.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/facades/__init__.py create mode 100644 venv/lib/python3.12/site-packages/plyer/facades/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/facades/__pycache__/accelerometer.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/facades/__pycache__/audio.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/facades/__pycache__/barometer.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/facades/__pycache__/battery.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/facades/__pycache__/bluetooth.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/facades/__pycache__/brightness.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/facades/__pycache__/call.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/facades/__pycache__/camera.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/facades/__pycache__/compass.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/facades/__pycache__/cpu.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/facades/__pycache__/devicename.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/facades/__pycache__/email.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/facades/__pycache__/filechooser.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/facades/__pycache__/flash.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/facades/__pycache__/gps.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/facades/__pycache__/gravity.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/facades/__pycache__/gyroscope.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/facades/__pycache__/humidity.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/facades/__pycache__/irblaster.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/facades/__pycache__/keystore.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/facades/__pycache__/light.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/facades/__pycache__/notification.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/facades/__pycache__/orientation.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/facades/__pycache__/processors.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/facades/__pycache__/proximity.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/facades/__pycache__/screenshot.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/facades/__pycache__/sms.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/facades/__pycache__/spatialorientation.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/facades/__pycache__/storagepath.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/facades/__pycache__/stt.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/facades/__pycache__/temperature.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/facades/__pycache__/tts.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/facades/__pycache__/uniqueid.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/facades/__pycache__/vibrator.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/facades/__pycache__/wifi.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/facades/accelerometer.py create mode 100644 venv/lib/python3.12/site-packages/plyer/facades/audio.py create mode 100644 venv/lib/python3.12/site-packages/plyer/facades/barometer.py create mode 100644 venv/lib/python3.12/site-packages/plyer/facades/battery.py create mode 100644 venv/lib/python3.12/site-packages/plyer/facades/bluetooth.py create mode 100644 venv/lib/python3.12/site-packages/plyer/facades/brightness.py create mode 100644 venv/lib/python3.12/site-packages/plyer/facades/call.py create mode 100644 venv/lib/python3.12/site-packages/plyer/facades/camera.py create mode 100644 venv/lib/python3.12/site-packages/plyer/facades/compass.py create mode 100644 venv/lib/python3.12/site-packages/plyer/facades/cpu.py create mode 100644 venv/lib/python3.12/site-packages/plyer/facades/devicename.py create mode 100644 venv/lib/python3.12/site-packages/plyer/facades/email.py create mode 100644 venv/lib/python3.12/site-packages/plyer/facades/filechooser.py create mode 100644 venv/lib/python3.12/site-packages/plyer/facades/flash.py create mode 100644 venv/lib/python3.12/site-packages/plyer/facades/gps.py create mode 100644 venv/lib/python3.12/site-packages/plyer/facades/gravity.py create mode 100644 venv/lib/python3.12/site-packages/plyer/facades/gyroscope.py create mode 100644 venv/lib/python3.12/site-packages/plyer/facades/humidity.py create mode 100644 venv/lib/python3.12/site-packages/plyer/facades/irblaster.py create mode 100644 venv/lib/python3.12/site-packages/plyer/facades/keystore.py create mode 100644 venv/lib/python3.12/site-packages/plyer/facades/light.py create mode 100644 venv/lib/python3.12/site-packages/plyer/facades/notification.py create mode 100644 venv/lib/python3.12/site-packages/plyer/facades/orientation.py create mode 100644 venv/lib/python3.12/site-packages/plyer/facades/processors.py create mode 100644 venv/lib/python3.12/site-packages/plyer/facades/proximity.py create mode 100644 venv/lib/python3.12/site-packages/plyer/facades/screenshot.py create mode 100644 venv/lib/python3.12/site-packages/plyer/facades/sms.py create mode 100644 venv/lib/python3.12/site-packages/plyer/facades/spatialorientation.py create mode 100644 venv/lib/python3.12/site-packages/plyer/facades/storagepath.py create mode 100644 venv/lib/python3.12/site-packages/plyer/facades/stt.py create mode 100644 venv/lib/python3.12/site-packages/plyer/facades/temperature.py create mode 100644 venv/lib/python3.12/site-packages/plyer/facades/tts.py create mode 100644 venv/lib/python3.12/site-packages/plyer/facades/uniqueid.py create mode 100644 venv/lib/python3.12/site-packages/plyer/facades/vibrator.py create mode 100644 venv/lib/python3.12/site-packages/plyer/facades/wifi.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/__init__.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/android/__init__.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/android/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/android/__pycache__/accelerometer.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/android/__pycache__/audio.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/android/__pycache__/barometer.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/android/__pycache__/battery.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/android/__pycache__/bluetooth.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/android/__pycache__/brightness.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/android/__pycache__/call.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/android/__pycache__/camera.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/android/__pycache__/compass.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/android/__pycache__/devicename.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/android/__pycache__/email.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/android/__pycache__/filechooser.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/android/__pycache__/flash.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/android/__pycache__/gps.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/android/__pycache__/gravity.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/android/__pycache__/gyroscope.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/android/__pycache__/humidity.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/android/__pycache__/irblaster.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/android/__pycache__/keystore.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/android/__pycache__/light.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/android/__pycache__/notification.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/android/__pycache__/orientation.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/android/__pycache__/proximity.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/android/__pycache__/sms.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/android/__pycache__/spatialorientation.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/android/__pycache__/storagepath.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/android/__pycache__/stt.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/android/__pycache__/temperature.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/android/__pycache__/tts.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/android/__pycache__/uniqueid.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/android/__pycache__/vibrator.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/android/accelerometer.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/android/audio.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/android/barometer.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/android/battery.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/android/bluetooth.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/android/brightness.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/android/call.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/android/camera.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/android/compass.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/android/devicename.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/android/email.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/android/filechooser.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/android/flash.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/android/gps.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/android/gravity.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/android/gyroscope.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/android/humidity.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/android/irblaster.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/android/keystore.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/android/light.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/android/notification.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/android/orientation.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/android/proximity.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/android/sms.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/android/spatialorientation.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/android/storagepath.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/android/stt.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/android/temperature.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/android/tts.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/android/uniqueid.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/android/vibrator.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/ios/__init__.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/ios/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/ios/__pycache__/accelerometer.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/ios/__pycache__/barometer.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/ios/__pycache__/battery.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/ios/__pycache__/brightness.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/ios/__pycache__/call.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/ios/__pycache__/camera.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/ios/__pycache__/compass.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/ios/__pycache__/email.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/ios/__pycache__/filechooser.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/ios/__pycache__/flash.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/ios/__pycache__/gps.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/ios/__pycache__/gravity.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/ios/__pycache__/gyroscope.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/ios/__pycache__/keystore.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/ios/__pycache__/sms.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/ios/__pycache__/spatialorientation.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/ios/__pycache__/storagepath.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/ios/__pycache__/tts.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/ios/__pycache__/uniqueid.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/ios/__pycache__/vibrator.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/ios/accelerometer.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/ios/barometer.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/ios/battery.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/ios/brightness.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/ios/call.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/ios/camera.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/ios/compass.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/ios/email.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/ios/filechooser.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/ios/flash.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/ios/gps.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/ios/gravity.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/ios/gyroscope.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/ios/keystore.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/ios/sms.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/ios/spatialorientation.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/ios/storagepath.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/ios/tts.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/ios/uniqueid.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/ios/vibrator.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/linux/__init__.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/linux/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/linux/__pycache__/accelerometer.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/linux/__pycache__/battery.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/linux/__pycache__/brightness.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/linux/__pycache__/cpu.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/linux/__pycache__/devicename.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/linux/__pycache__/email.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/linux/__pycache__/filechooser.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/linux/__pycache__/keystore.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/linux/__pycache__/notification.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/linux/__pycache__/orientation.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/linux/__pycache__/processors.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/linux/__pycache__/screenshot.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/linux/__pycache__/storagepath.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/linux/__pycache__/tts.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/linux/__pycache__/uniqueid.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/linux/__pycache__/wifi.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/linux/accelerometer.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/linux/battery.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/linux/brightness.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/linux/cpu.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/linux/devicename.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/linux/email.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/linux/filechooser.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/linux/keystore.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/linux/notification.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/linux/orientation.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/linux/processors.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/linux/screenshot.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/linux/storagepath.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/linux/tts.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/linux/uniqueid.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/linux/wifi.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/macosx/__init__.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/macosx/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/macosx/__pycache__/accelerometer.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/macosx/__pycache__/audio.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/macosx/__pycache__/battery.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/macosx/__pycache__/bluetooth.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/macosx/__pycache__/cpu.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/macosx/__pycache__/devicename.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/macosx/__pycache__/email.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/macosx/__pycache__/filechooser.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/macosx/__pycache__/keystore.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/macosx/__pycache__/notification.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/macosx/__pycache__/screenshot.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/macosx/__pycache__/storagepath.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/macosx/__pycache__/tts.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/macosx/__pycache__/uniqueid.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/macosx/__pycache__/wifi.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/macosx/accelerometer.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/macosx/audio.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/macosx/battery.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/macosx/bluetooth.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/macosx/cpu.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/macosx/devicename.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/macosx/email.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/macosx/filechooser.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/macosx/keystore.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/macosx/libs/__init__.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/macosx/libs/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/macosx/libs/__pycache__/osx_motion_sensor.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/macosx/libs/__pycache__/osx_paths.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/macosx/libs/osx_motion_sensor.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/macosx/libs/osx_paths.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/macosx/notification.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/macosx/screenshot.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/macosx/storagepath.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/macosx/tts.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/macosx/uniqueid.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/macosx/wifi.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/win/__init__.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/win/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/win/__pycache__/audio.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/win/__pycache__/battery.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/win/__pycache__/cpu.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/win/__pycache__/devicename.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/win/__pycache__/email.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/win/__pycache__/filechooser.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/win/__pycache__/keystore.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/win/__pycache__/notification.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/win/__pycache__/screenshot.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/win/__pycache__/storagepath.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/win/__pycache__/tts.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/win/__pycache__/uniqueid.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/win/__pycache__/wifi.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/win/audio.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/win/battery.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/win/cpu.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/win/devicename.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/win/email.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/win/filechooser.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/win/keystore.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/win/libs/__init__.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/win/libs/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/win/libs/__pycache__/balloontip.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/win/libs/__pycache__/batterystatus.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/win/libs/__pycache__/wifi_defs.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/win/libs/__pycache__/win_api_defs.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/win/libs/balloontip.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/win/libs/batterystatus.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/win/libs/wifi_defs.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/win/libs/win_api_defs.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/win/notification.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/win/screenshot.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/win/storagepath.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/win/tts.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/win/uniqueid.py create mode 100644 venv/lib/python3.12/site-packages/plyer/platforms/win/wifi.py create mode 100644 venv/lib/python3.12/site-packages/plyer/utils.py create mode 100644 venv/lib/python3.12/site-packages/pycairo-1.27.0.dist-info/INSTALLER create mode 100644 venv/lib/python3.12/site-packages/pycairo-1.27.0.dist-info/METADATA create mode 100644 venv/lib/python3.12/site-packages/pycairo-1.27.0.dist-info/RECORD create mode 100644 venv/lib/python3.12/site-packages/pycairo-1.27.0.dist-info/WHEEL create mode 100644 venv/lib/python3.12/site-packages/pygobject-3.50.0.dist-info/INSTALLER create mode 100644 venv/lib/python3.12/site-packages/pygobject-3.50.0.dist-info/METADATA create mode 100644 venv/lib/python3.12/site-packages/pygobject-3.50.0.dist-info/RECORD create mode 100644 venv/lib/python3.12/site-packages/pygobject-3.50.0.dist-info/REQUESTED create mode 100644 venv/lib/python3.12/site-packages/pygobject-3.50.0.dist-info/WHEEL create mode 100644 venv/lib/python3.12/site-packages/pygtkcompat/__init__.py create mode 100644 venv/lib/python3.12/site-packages/pygtkcompat/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pygtkcompat/__pycache__/generictreemodel.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pygtkcompat/__pycache__/pygtkcompat.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pygtkcompat/generictreemodel.py create mode 100644 venv/lib/python3.12/site-packages/pygtkcompat/pygtkcompat.py create mode 100644 venv/lib/python3.12/site-packages/pystray-0.19.5.dist-info/COPYING create mode 100644 venv/lib/python3.12/site-packages/pystray-0.19.5.dist-info/COPYING.LGPL create mode 100644 venv/lib/python3.12/site-packages/pystray-0.19.5.dist-info/INSTALLER create mode 100644 venv/lib/python3.12/site-packages/pystray-0.19.5.dist-info/METADATA create mode 100644 venv/lib/python3.12/site-packages/pystray-0.19.5.dist-info/RECORD create mode 100644 venv/lib/python3.12/site-packages/pystray-0.19.5.dist-info/REQUESTED create mode 100644 venv/lib/python3.12/site-packages/pystray-0.19.5.dist-info/WHEEL create mode 100644 venv/lib/python3.12/site-packages/pystray-0.19.5.dist-info/top_level.txt create mode 100644 venv/lib/python3.12/site-packages/pystray-0.19.5.dist-info/zip-safe create mode 100644 venv/lib/python3.12/site-packages/pystray/__init__.py create mode 100644 venv/lib/python3.12/site-packages/pystray/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pystray/__pycache__/_appindicator.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pystray/__pycache__/_base.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pystray/__pycache__/_darwin.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pystray/__pycache__/_dummy.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pystray/__pycache__/_gtk.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pystray/__pycache__/_info.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pystray/__pycache__/_win32.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pystray/__pycache__/_xorg.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pystray/_appindicator.py create mode 100644 venv/lib/python3.12/site-packages/pystray/_base.py create mode 100644 venv/lib/python3.12/site-packages/pystray/_darwin.py create mode 100644 venv/lib/python3.12/site-packages/pystray/_dummy.py create mode 100644 venv/lib/python3.12/site-packages/pystray/_gtk.py create mode 100644 venv/lib/python3.12/site-packages/pystray/_info.py create mode 100644 venv/lib/python3.12/site-packages/pystray/_util/__init__.py create mode 100644 venv/lib/python3.12/site-packages/pystray/_util/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pystray/_util/__pycache__/gtk.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pystray/_util/__pycache__/notify_dbus.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pystray/_util/__pycache__/win32.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/pystray/_util/gtk.py create mode 100644 venv/lib/python3.12/site-packages/pystray/_util/notify_dbus.py create mode 100644 venv/lib/python3.12/site-packages/pystray/_util/win32.py create mode 100644 venv/lib/python3.12/site-packages/pystray/_win32.py create mode 100644 venv/lib/python3.12/site-packages/pystray/_xorg.py create mode 100644 venv/lib/python3.12/site-packages/python_xlib-0.33.dist-info/INSTALLER create mode 100644 venv/lib/python3.12/site-packages/python_xlib-0.33.dist-info/LICENSE create mode 100644 venv/lib/python3.12/site-packages/python_xlib-0.33.dist-info/METADATA create mode 100644 venv/lib/python3.12/site-packages/python_xlib-0.33.dist-info/RECORD create mode 100644 venv/lib/python3.12/site-packages/python_xlib-0.33.dist-info/WHEEL create mode 100644 venv/lib/python3.12/site-packages/python_xlib-0.33.dist-info/top_level.txt create mode 100644 venv/lib/python3.12/site-packages/six-1.16.0.dist-info/INSTALLER create mode 100644 venv/lib/python3.12/site-packages/six-1.16.0.dist-info/LICENSE create mode 100644 venv/lib/python3.12/site-packages/six-1.16.0.dist-info/METADATA create mode 100644 venv/lib/python3.12/site-packages/six-1.16.0.dist-info/RECORD create mode 100644 venv/lib/python3.12/site-packages/six-1.16.0.dist-info/WHEEL create mode 100644 venv/lib/python3.12/site-packages/six-1.16.0.dist-info/top_level.txt create mode 100644 venv/lib/python3.12/site-packages/six.py create mode 100644 venv/lib/python3.12/site-packages/urllib3-2.2.3.dist-info/INSTALLER create mode 100644 venv/lib/python3.12/site-packages/urllib3-2.2.3.dist-info/METADATA create mode 100644 venv/lib/python3.12/site-packages/urllib3-2.2.3.dist-info/RECORD create mode 100644 venv/lib/python3.12/site-packages/urllib3-2.2.3.dist-info/REQUESTED create mode 100644 venv/lib/python3.12/site-packages/urllib3-2.2.3.dist-info/WHEEL create mode 100644 venv/lib/python3.12/site-packages/urllib3-2.2.3.dist-info/licenses/LICENSE.txt create mode 100644 venv/lib/python3.12/site-packages/urllib3/__init__.py create mode 100644 venv/lib/python3.12/site-packages/urllib3/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/urllib3/__pycache__/_base_connection.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/urllib3/__pycache__/_collections.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/urllib3/__pycache__/_request_methods.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/urllib3/__pycache__/_version.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/urllib3/__pycache__/connection.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/urllib3/__pycache__/connectionpool.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/urllib3/__pycache__/exceptions.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/urllib3/__pycache__/fields.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/urllib3/__pycache__/filepost.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/urllib3/__pycache__/poolmanager.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/urllib3/__pycache__/response.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/urllib3/_base_connection.py create mode 100644 venv/lib/python3.12/site-packages/urllib3/_collections.py create mode 100644 venv/lib/python3.12/site-packages/urllib3/_request_methods.py create mode 100644 venv/lib/python3.12/site-packages/urllib3/_version.py create mode 100644 venv/lib/python3.12/site-packages/urllib3/connection.py create mode 100644 venv/lib/python3.12/site-packages/urllib3/connectionpool.py create mode 100644 venv/lib/python3.12/site-packages/urllib3/contrib/__init__.py create mode 100644 venv/lib/python3.12/site-packages/urllib3/contrib/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/urllib3/contrib/__pycache__/pyopenssl.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/urllib3/contrib/__pycache__/socks.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/urllib3/contrib/emscripten/__init__.py create mode 100644 venv/lib/python3.12/site-packages/urllib3/contrib/emscripten/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/urllib3/contrib/emscripten/__pycache__/connection.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/urllib3/contrib/emscripten/__pycache__/fetch.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/urllib3/contrib/emscripten/__pycache__/request.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/urllib3/contrib/emscripten/__pycache__/response.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/urllib3/contrib/emscripten/connection.py create mode 100644 venv/lib/python3.12/site-packages/urllib3/contrib/emscripten/emscripten_fetch_worker.js create mode 100644 venv/lib/python3.12/site-packages/urllib3/contrib/emscripten/fetch.py create mode 100644 venv/lib/python3.12/site-packages/urllib3/contrib/emscripten/request.py create mode 100644 venv/lib/python3.12/site-packages/urllib3/contrib/emscripten/response.py create mode 100644 venv/lib/python3.12/site-packages/urllib3/contrib/pyopenssl.py create mode 100644 venv/lib/python3.12/site-packages/urllib3/contrib/socks.py create mode 100644 venv/lib/python3.12/site-packages/urllib3/exceptions.py create mode 100644 venv/lib/python3.12/site-packages/urllib3/fields.py create mode 100644 venv/lib/python3.12/site-packages/urllib3/filepost.py create mode 100644 venv/lib/python3.12/site-packages/urllib3/http2/__init__.py create mode 100644 venv/lib/python3.12/site-packages/urllib3/http2/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/urllib3/http2/__pycache__/connection.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/urllib3/http2/__pycache__/probe.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/urllib3/http2/connection.py create mode 100644 venv/lib/python3.12/site-packages/urllib3/http2/probe.py create mode 100644 venv/lib/python3.12/site-packages/urllib3/poolmanager.py create mode 100644 venv/lib/python3.12/site-packages/urllib3/py.typed create mode 100644 venv/lib/python3.12/site-packages/urllib3/response.py create mode 100644 venv/lib/python3.12/site-packages/urllib3/util/__init__.py create mode 100644 venv/lib/python3.12/site-packages/urllib3/util/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/urllib3/util/__pycache__/connection.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/urllib3/util/__pycache__/proxy.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/urllib3/util/__pycache__/request.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/urllib3/util/__pycache__/response.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/urllib3/util/__pycache__/retry.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/urllib3/util/__pycache__/ssl_.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/urllib3/util/__pycache__/ssl_match_hostname.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/urllib3/util/__pycache__/ssltransport.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/urllib3/util/__pycache__/timeout.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/urllib3/util/__pycache__/url.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/urllib3/util/__pycache__/util.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/urllib3/util/__pycache__/wait.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/urllib3/util/connection.py create mode 100644 venv/lib/python3.12/site-packages/urllib3/util/proxy.py create mode 100644 venv/lib/python3.12/site-packages/urllib3/util/request.py create mode 100644 venv/lib/python3.12/site-packages/urllib3/util/response.py create mode 100644 venv/lib/python3.12/site-packages/urllib3/util/retry.py create mode 100644 venv/lib/python3.12/site-packages/urllib3/util/ssl_.py create mode 100644 venv/lib/python3.12/site-packages/urllib3/util/ssl_match_hostname.py create mode 100644 venv/lib/python3.12/site-packages/urllib3/util/ssltransport.py create mode 100644 venv/lib/python3.12/site-packages/urllib3/util/timeout.py create mode 100644 venv/lib/python3.12/site-packages/urllib3/util/url.py create mode 100644 venv/lib/python3.12/site-packages/urllib3/util/util.py create mode 100644 venv/lib/python3.12/site-packages/urllib3/util/wait.py create mode 100644 venv/lib/python3.12/site-packages/wheel-0.45.1.dist-info/INSTALLER create mode 100644 venv/lib/python3.12/site-packages/wheel-0.45.1.dist-info/LICENSE.txt create mode 100644 venv/lib/python3.12/site-packages/wheel-0.45.1.dist-info/METADATA create mode 100644 venv/lib/python3.12/site-packages/wheel-0.45.1.dist-info/RECORD create mode 100644 venv/lib/python3.12/site-packages/wheel-0.45.1.dist-info/REQUESTED create mode 100644 venv/lib/python3.12/site-packages/wheel-0.45.1.dist-info/WHEEL create mode 100644 venv/lib/python3.12/site-packages/wheel-0.45.1.dist-info/entry_points.txt create mode 100644 venv/lib/python3.12/site-packages/wheel/__init__.py create mode 100644 venv/lib/python3.12/site-packages/wheel/__main__.py create mode 100644 venv/lib/python3.12/site-packages/wheel/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/wheel/__pycache__/__main__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/wheel/__pycache__/_bdist_wheel.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/wheel/__pycache__/_setuptools_logging.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/wheel/__pycache__/bdist_wheel.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/wheel/__pycache__/macosx_libfile.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/wheel/__pycache__/metadata.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/wheel/__pycache__/util.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/wheel/__pycache__/wheelfile.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/wheel/_bdist_wheel.py create mode 100644 venv/lib/python3.12/site-packages/wheel/_setuptools_logging.py create mode 100644 venv/lib/python3.12/site-packages/wheel/bdist_wheel.py create mode 100644 venv/lib/python3.12/site-packages/wheel/cli/__init__.py create mode 100644 venv/lib/python3.12/site-packages/wheel/cli/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/wheel/cli/__pycache__/convert.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/wheel/cli/__pycache__/pack.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/wheel/cli/__pycache__/tags.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/wheel/cli/__pycache__/unpack.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/wheel/cli/convert.py create mode 100644 venv/lib/python3.12/site-packages/wheel/cli/pack.py create mode 100644 venv/lib/python3.12/site-packages/wheel/cli/tags.py create mode 100644 venv/lib/python3.12/site-packages/wheel/cli/unpack.py create mode 100644 venv/lib/python3.12/site-packages/wheel/macosx_libfile.py create mode 100644 venv/lib/python3.12/site-packages/wheel/metadata.py create mode 100644 venv/lib/python3.12/site-packages/wheel/util.py create mode 100644 venv/lib/python3.12/site-packages/wheel/vendored/__init__.py create mode 100644 venv/lib/python3.12/site-packages/wheel/vendored/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/wheel/vendored/packaging/LICENSE create mode 100644 venv/lib/python3.12/site-packages/wheel/vendored/packaging/LICENSE.APACHE create mode 100644 venv/lib/python3.12/site-packages/wheel/vendored/packaging/LICENSE.BSD create mode 100644 venv/lib/python3.12/site-packages/wheel/vendored/packaging/__init__.py create mode 100644 venv/lib/python3.12/site-packages/wheel/vendored/packaging/__pycache__/__init__.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/wheel/vendored/packaging/__pycache__/_elffile.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/wheel/vendored/packaging/__pycache__/_manylinux.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/wheel/vendored/packaging/__pycache__/_musllinux.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/wheel/vendored/packaging/__pycache__/_parser.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/wheel/vendored/packaging/__pycache__/_structures.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/wheel/vendored/packaging/__pycache__/_tokenizer.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/wheel/vendored/packaging/__pycache__/markers.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/wheel/vendored/packaging/__pycache__/requirements.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/wheel/vendored/packaging/__pycache__/specifiers.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/wheel/vendored/packaging/__pycache__/tags.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/wheel/vendored/packaging/__pycache__/utils.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/wheel/vendored/packaging/__pycache__/version.cpython-312.pyc create mode 100644 venv/lib/python3.12/site-packages/wheel/vendored/packaging/_elffile.py create mode 100644 venv/lib/python3.12/site-packages/wheel/vendored/packaging/_manylinux.py create mode 100644 venv/lib/python3.12/site-packages/wheel/vendored/packaging/_musllinux.py create mode 100644 venv/lib/python3.12/site-packages/wheel/vendored/packaging/_parser.py create mode 100644 venv/lib/python3.12/site-packages/wheel/vendored/packaging/_structures.py create mode 100644 venv/lib/python3.12/site-packages/wheel/vendored/packaging/_tokenizer.py create mode 100644 venv/lib/python3.12/site-packages/wheel/vendored/packaging/markers.py create mode 100644 venv/lib/python3.12/site-packages/wheel/vendored/packaging/requirements.py create mode 100644 venv/lib/python3.12/site-packages/wheel/vendored/packaging/specifiers.py create mode 100644 venv/lib/python3.12/site-packages/wheel/vendored/packaging/tags.py create mode 100644 venv/lib/python3.12/site-packages/wheel/vendored/packaging/utils.py create mode 100644 venv/lib/python3.12/site-packages/wheel/vendored/packaging/version.py create mode 100644 venv/lib/python3.12/site-packages/wheel/vendored/vendor.txt create mode 100644 venv/lib/python3.12/site-packages/wheel/wheelfile.py create mode 120000 venv/lib64 create mode 100644 venv/pyvenv.cfg diff --git a/README.md b/README.md new file mode 100644 index 0000000..a486748 --- /dev/null +++ b/README.md @@ -0,0 +1,130 @@ +## NordVPN systray + +### Développement + +Prérequis, l'application nordvpn est installée + +* Le **dossier développement** qui contient tous les modules nécessaire ainsi que les binaires +`/srv/media/dplus/python-dev/nordvpntray` +* Le **dossier final après installation** +$HOME/.local/share/nordvpntray + +Créer un projet python `nordvpntray` + +```bash +# Crée le dossier si inexistant +mkdir $HOME/media/dplus/python-dev/nordvpntray +# aller dans le dossier +cd $HOME/media/dplus/python-dev/nordvpntray +``` + +Pour créer un environnement, utilisez la commande `python -m venv ` +Créer un environnement pour l'application + + python3 -m venv venv + +activer l'environnement virtuel + + source venv/bin/activate + +On arrive sur un prompt : `(venv) [yann@PC1 nordvpntray]$` + +Mettre à jour pip dans l'environnement + + pip install --upgrade pip + +Les modules à installer + +fichier requirements.txt + +``` +pystray +pillow +ping3 +plyer +desktop-notifier +dbus-python +wheel +urllib3 +PyGObject +``` + +Installer les modules supplémentaires + + pip install -r requirements.txt + +Projet sur éditeur python "Wing Personal 10" +$HOME/media/dplus/python-dev/nordvpntray.wpr + +Créer les scripts + +Aller dans le dossier développement + + cd /srv/media/dplus/python-dev/nordvpntray + +Créer un script de lancement : `nordvpntray.sh` + +```bash +# Lancement nordvpntray +# Dossier travail +cd $HOME/.local/share/nordvpntray +# Chemin +export PATH="$HOME/.local/share/nordvpntray/venv/bin:$PATH" +# Exécution script +python nordvpntray.py +``` + +Le rendre exécutable + + chmod +x nordvpntray.sh + +Créer icône bureau `nordvpntray.desktop` + +``` +[Desktop Entry] +Version=1.0 +Type=Application +Name=NordVPN Graphique +Comment=Etat du service nordvpn +Icon=nordvpn +Exec=nordvpntray +``` + +Le script d'installation `install.sh` + +```bash +# copie dossier +cp -r ../nordvpntray $HOME/.local/share/ +# Icône bureau +mkdir -p $HOME/.local/share/applications/ +cp nordvpntray.desktop $HOME/.local/share/applications/ +# on met le script en lien dans /usr/local/bin/ +sudo ln -s $HOME/.local/share/nordvpntray/nordvpntray.sh /usr/local/bin/nordvpntray +``` + +### Installation + +#### Prérequis + + [Application NordVPN](https://static.rnmkcy.eu/2024/11/23/NordVPN.html) + +#### nordvpntray + +Cloner le dépot + + git clone https://gitea.rnmkcy.eu/yann/nordvpntray + + cd nordvpntray + ./install.sh + +Lancement en début de session XFCE + +* Paramètres --> Gestionnaire de Paramètres --> Session et démarrage +* Démarrage automatique d'application + * +Ajouter + * Nom: nordvpntray + * Description : NordVPN Graphique + * Commande: nordvpntray + * Déclencher à la connexion + * OK +* Fermer diff --git a/dns-logo.png b/dns-logo.png new file mode 100755 index 0000000000000000000000000000000000000000..3e3b0d2fed90117ed74a609432b23bbba706f3b1 GIT binary patch literal 6718 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�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 literal 0 HcmV?d00001 diff --git a/install.sh b/install.sh new file mode 100755 index 0000000..7a5b8cd --- /dev/null +++ b/install.sh @@ -0,0 +1,8 @@ +# copie dossier +cp -r ../nordvpntray $HOME/.local/share/ +# Icône bureau +mkdir -p $HOME/.local/share/applications/ +cp nordvpntray.desktop $HOME/.local/share/applications/ +# on met le script en lien dans /usr/local/bin/ +sudo ln -s $HOME/.local/share/nordvpntray/nordvpntray.sh /usr/local/bin/nordvpntray + diff --git a/nord-logo-rouge.png b/nord-logo-rouge.png new file mode 100644 index 0000000000000000000000000000000000000000..6da60c44d38f2319bd5a46be1c98cf3aa135241c GIT binary patch literal 16375 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 literal 0 HcmV?d00001 diff --git a/nord-logo-vert.png b/nord-logo-vert.png new file mode 100644 index 0000000000000000000000000000000000000000..8fe1da87300cfd6f11c5938b5f89a6958d8202ef GIT binary patch literal 16257 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%0DV7&ux&k1Bmow_i$G@Ftx- zNzv}Km2>DUCyAPT$719m?uM7UGunRGM%(4rc@RnzW?AilEl_V_!w53-Jh&FYF*oe^ z0`WRM4h71-KA8U{?X{sI7_=WJQEq(i8bHcTfS&bwy`E$+#m-y$s4DkG_oAlav08+{ z?~J!X*zlLts(mkLM>_WWVjQ(HRPIbO2liE|Xb^CU%ZwC5L-0$~O@a=XH8#E#v)<~b zPajV0yd+iG6fb>+%op97T9pk{GT0*1o^R{;1L9>2g`RH6MKLini zAU-N-mN2HyQ1N)UqvL32g7%M#-wA&b@@z}J-H-Or+w%Y!NyWG2;s*ZzAKSDp5dZ)H literal 0 HcmV?d00001 diff --git a/nord-logo.png b/nord-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..fe0a46259cc4509f69c9fdae8e1845df014bb7ef GIT binary patch literal 37085 zcmV)gK%~EkP)$d50@63G9bI!fHv&$}Qo7tJ&dw=5Y&fIeDDbM-W=kF5E;q-vh z15OW=a1XeOq3zjh)`cTm3~h1R;Pimg1EtjiMFC=^)n!g=ogQ#{pqP5V0kL8l4W}(m z4>�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 literal 0 HcmV?d00001 diff --git a/nordvpn.jpg b/nordvpn.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a04fc8b10113749cfdd2e15c675f7d5e76d75ca4 GIT binary patch literal 1899 zcmbtTX;4#F6h6sINM!Y~D9RF6F@#tNqvH+;qKOgVfukUbB!LhmY#}H`K*iRj%Ah1N zh*Urj1aXR}h*s;)h=O5>3TO)gDlWKSV>OlZ2HJ5tqdz)5ciuhUobR0P-uulw-F;mT zjOPV#1As&VAfW}iN91CzpI>AUu{?mwUo=XPbK`_k8D%(qI(J05DdNf*br~`%GdwmA@?5QlqORtBXY|I0o_UUxP?f|qx zfKNMgI&G;=_vr`#b|2u9;`4lh0@*o)>bak5E=2%l*#KuQey$110qT***1sl3B}a{( zgQ1-q69e$J0>C5;zyf(~xcdL{V}2uTy*?bd2N0SLz;6a9I0!HWoo5!I>jpodViXDm zqoR#Ur5ezT=`<8(Mn>a|aWivs+ziJpCfH82u$*j#`iK*lI^ z#CeSe5{8keG>l9e<4A}BDsDitaP;)0n+HcFZQW-jD6w?n5Xsy2UwMs&Y)C*R|4R?3 zBpOCBAS2Qp*DI2#81@tF8--kq8;baPWq=grd54 z#V%fZ>|T>B^@+UrD7HWE{E4OMOsQL?UFhZ=7u~Bj++S00W=F>>um0INbGMh2X+={< zB>vqmtOI+hbdY*ArNxwvU9eTxV43*J0vH2Fw8%ObfA6GhU} zgsx@1zfT>Eh^{{O;3zkQw_wuay#9?HpJwy-v@H&m)B?e3{Fv@mJh(?qtBV&j(BQB#+sRlb;|9dbQW z$PK@HWQ$_!{^bW)+XsVtu6!%1CvF)#oPDIe$;4bbR&JQPX#H?;@oDkWni=xdJNK{1 z8J5KDIg_Lg7Ms69d;KOy#yX-e0T=>f12Mknw)4(x!7-YiE6Inri5n{JqE1rF$t!;eE>O zukXCI%F1!SW9n!A=(M}nF?oLOgs!$tOcxRUGI+snYpH^JDGRpz$*85`u5I~zykq@> z9|qWEl8q@pR%YJk(Q;Bws$|b>C5$1NC#hvxR zr*cO4Oy-HgamvW%><3v55%XK7?{&Q$&zV;qsr71+K4d1=_a_MX({N3VGi|`Vk}8>* zR$cy7+n(2ViXnY$*?wHPj#ah%8!(&V^0&7b+a368VB-gH6;}BfS_1;q-#R8vijAP0mtI2(o+WtL@Y;0 zTFICp`Y60or`+90RYh^~KAcQf4n1L>6g9lOK_(POpZhX-LEFoj3(Xbf^hjOjUkF8R A$^ZZW literal 0 HcmV?d00001 diff --git a/nordvpntray.desktop b/nordvpntray.desktop new file mode 100644 index 0000000..4ce48f3 --- /dev/null +++ b/nordvpntray.desktop @@ -0,0 +1,7 @@ +[Desktop Entry] +Version=1.0 +Type=Application +Name=NordVPN Graphique +Comment=Etat du service nordvpn +Icon=nordvpn +Exec=nordvpn sh $HOME/.local/share/nordvpntray/nordvpntray.sh diff --git a/nordvpntray.py b/nordvpntray.py new file mode 100755 index 0000000..ab70ac9 --- /dev/null +++ b/nordvpntray.py @@ -0,0 +1,320 @@ +import pystray +from PIL import Image +import threading # Import the threading module for creating threads + +from desktop_notifier import DesktopNotifier, Urgency, Button, ReplyField, DEFAULT_SOUND +from plyer import notification + +from urllib.request import Request +from urllib.request import urlopen +from urllib.request import URLError +import sys,os +import gobject +import json +import signal +import subprocess +from random import randint +from platform import system as system_name +from subprocess import call as system_call + +def ping(host): + fn = open(os.devnull, 'w') + param = '-n' if system_name().lower() == 'windows' else '-c' + command = ['ping', param, '1', host] + retcode = system_call(command, stdout=fn, stderr=subprocess.STDOUT) + fn.close() + return retcode == 0 + +def desktop_notifier(title, message, timeout=10, app_icon=None): + notification.notify( + title=title, + message=message, + timeout=timeout, + app_icon=app_icon, + ) + +def dns_leak(): + # Test fuites DNS + leak_id = randint(1000000, 9999999) + for x in range(0, 10): + ping('.'.join([str(x), str(leak_id), "bash.ws"])) + + response = urlopen("https://bash.ws/dnsleak/test/"+str(leak_id)+"?json") + dnsleak = "https://bash.ws/dnsleak/test/"+str(leak_id)+"?json" + '\n ' + data = response.read().decode("utf-8") + parsed_data = json.loads(data) + + dnsleak = dnsleak + '\n ' + "Votre IP " + for dns_server in parsed_data: + if dns_server['type'] == "ip": + if dns_server['country_name']: + if dns_server['asn']: + dnsleak = dnsleak + dns_server['ip'] + '\n ' + " [" + dns_server['country_name'] + ", " + dns_server['asn'] + "]" + '\n ' + else: + dnsleak = dnsleak + dns_server['ip'] + '\n ' + " [" + dns_server['country_name'] +" ]" + '\n ' + else: + dnsleak = dnsleak + dns_server['ip'] + '\n ' + + servers = 0 + for dns_server in parsed_data: + if dns_server['type'] == "dns": + servers = servers + 1 + + if servers == 0: + dnsleak = dnsleak + "No DNS servers found" + else: + dnsleak = dnsleak + '\n ' + "Vous utilisez " + str(servers) + " serveur(s) DNS " + for dns_server in parsed_data: + if dns_server['type'] == "dns": + if dns_server['country_name']: + if dns_server['asn']: + dnsleak = dnsleak + dns_server['ip'] + '\n ' + " [" + dns_server['country_name'] + ", " + dns_server['asn'] + "]" + '\n ' + else: + dnsleak = dnsleak + dns_server['ip'] + '\n ' + " [" + dns_server['country_name'] + "]" + '\n ' + else: + dnsleak = dnsleak + dns_server['ip'] + '\n ' + + dnsleak = dnsleak + '\n ' + "Conclusion:" + for dns_server in parsed_data: + if dns_server['type'] == "conclusion": + if dns_server['ip']: + dnsleak = dnsleak + dns_server['ip'] + # Retour dnsleak + # print(dnsleak) + return dnsleak + +def NordVPN(commande, option=""): + global connexion, stest + match commande: + case "status": + sortie=os.popen("nordvpn status", "r").read() + titre="Statut VPN" + case "settings": + sortie=os.popen("nordvpn settings", "r").read() + titre="Paramètres VPN" + case "test": + sortie="Pour les tests" + titre="TESTS" + #desktop_notifier(titre, "Ceci est test",10,"/home/yann/media/dplus/python-dev/nordvpn-yan/nordvpn.jpg") + if stest: + stest = False + icon.icon = connected_img + else: + stest = True + icon.icon = disconnected_img + case "connect": + titre="Connexion VPN" + if not connexion: + sortie=os.popen("nordvpn connect", "r").read() + connexion = True + print(sortie) + icon.icon = connected_img + cmdcli=os.popen("nordvpn status", "r").read() + if not "Disconnected" in cmdcli: + # VPN actif + for line in cmdcli.split('\n'): + if "Server:" in line: + # Extraire le serveur avec suppression espaces début fin + serveur=line[len("Server:"):].strip() + icon.title=serveur + else: + print(sortie) + sortie="Connexion VPN active" + case "disconnect": + titre="Déconnexion VPN" + sortie=os.popen("nordvpn disconnect", "r").read() + if "You are not connected to NordVPN" in sortie: + sortie="Vous n'êtes pas connecté à NordVPN" + print(sortie) + connexion = False + print(sortie) + icon.icon = disconnected_img + icon.title="Déconnecté" + case "login": + titre="Connexion Compte" + if not connexion: + sortie=os.popen("nordvpn login", "r").read() + else: + sortie=os.popen("nordvpn account", "r").read() + case "dnsleak": + # appel fonction et affichage + titre="DNS Leak test (fuites)" + sortie=dns_leak() + case "countries": + # groupes de serveur + titre="Groupes de serveur" + sortie=os.popen("nordvpn countries", "r").read() + case "groups": + # groupes de serveur + titre="Groupes de serveur" + sortie=os.popen("nordvpn groups", "r").read() + case "version": + titre="Version NordVPN" + sortie=os.popen("nordvpn version", "r").read() + case "_": + print("Oops, quelque chose s'est mal passé 🤯") + + # analyse résultat des commandes bash nordvpn + print(sortie) + message = sortie.replace("Server", "Serveur") + message = message.replace("Hostname", "Nom hôte") + message = message.replace("Country", "Pays") + message = message.replace("City", "Ville") + message = message.replace("Current technology", "Technologie actuelle") + message = message.replace("Current protocol", "Protocole actuel") + message = message.replace("Transfer", "Transfert") + message = message.replace("Uptime", "Temps de fonction") + message = message.replace("Connected", "Connecté") + message = message.replace("Disconnected", "Déconnecté") + message = message.replace("second", "seconde") + message = message.replace("Disabled", "Inactif") + message = message.replace("Enabled", "Actif") + message = message.replace("disabled", "Inactif") + message = message.replace("enabled", "Actif") + message = message.replace("Connecting to", "Se connecter à") + message = message.replace("You are connected to", "Vous êtes connecté à") + if commande=="disconnect": + message="Vous êtes déconnecté de NordVPN" + desktop_notifier(titre, message,10,"/home/yann/media/dplus/python-dev/nordvpn-yan/nordvpn.jpg") + #print(message) + + +def after_click(icon, query): + match str(query): + case "Status": + NordVPN("status") + case "Paramètres": + NordVPN("settings") + case "Connexion VPN rapide": + NordVPN("connect") + case "Déconnexion VPN": + NordVPN("disconnect") + case "Fuites DNS": + NordVPN("dnsleak") + case "Connexion/Infos Compte": + NordVPN("login") + case "TEST": + NordVPN("test") + case "Groupes de serveurs": + NordVPN("groups") + case "Pays": + NordVPN("countries") + case "Version": + NordVPN("version") + case "Quitter": + icon.stop() + +def desktop_notifier(title, message, timeout=10, app_icon=""): + notification.notify( + title=title, + message=message, + timeout=timeout, + app_icon=app_icon, + toast=True, + app_name='Desktop Notifier', + # Add more customizations here + ) + +def vpnactif(): + # Tester si la connexion VPN est active + cmdcli=os.popen("nordvpn status", "r").read() + print(cmdcli) + if not "Disconnected" in cmdcli: + # VPN actif + for line in cmdcli.split('\n'): + if "Server:" in line: + # Extraire le serveur avec suppression espaces début fin + serveur=line[len("Server:"):].strip() + icon.title=serveur + return True + else: + # VPN inactif + icon.title="VPN inactif" + return False + +''' +def update_icon(): + global connexion + if connexion: + icon.icon = connected_img + print("thread update_icon connected_img") + else: + icon.icon = disconnected_img + print("thread update_icon disconnected_img") +''' + +def on_clicked(icon, item): + global state + state = not item.checked + +''' +# Départ programme +On regarde si le service nordvpnd est actif +''' + +state = False + +# on regarde si le service nordvpnd est actif pour afficher la couleur du bouton +etat=os.popen("systemctl is-active nordvpnd.service").read() +if 'inactive' in etat: + # nordvpnd inactif + print("Service nordvpnd inactif") + desktop_notifier("Service nordvpnd", "Le service NordVPN daemon est inactif",10,"/home/yann/media/dplus/python-dev/nordvpn-yan/nordvpn.jpg") + # On arrête le script + sys.exit("Service nordvpnd inactif") +else: + print("Service nordvpnd actif") + +# Définir les images pour le systray +connected_img = Image.open("/home/yann/media/dplus/python-dev/nordvpntray/nord-logo-vert.png") # image connexion NordVPN active +disconnected_img = Image.open("/home/yann/media/dplus/python-dev/nordvpntray/nord-logo-rouge.png") # image connexion NordVPN inactive + +stest = True + +icon = pystray.Icon("VPN") + +# Test si connexion active +if vpnactif(): + # VPN actif + connexion = True + icon.icon = connected_img + print("VPN actif") +else: + # VPN inactif + connexion = False + icon.icon = disconnected_img + icon.title="Déconnecté" + print("VPN inactif") + +icon.menu= pystray.Menu( + pystray.MenuItem("Status", + after_click), + pystray.MenuItem("Paramètres", + after_click), + pystray.MenuItem("Fuites DNS", + after_click), + pystray.MenuItem("Connexion VPN rapide", + after_click), + pystray.MenuItem("Déconnexion VPN", + after_click), + pystray.MenuItem("Connexion/Infos Compte", + after_click), + pystray.MenuItem("TEST", + after_click), + pystray.MenuItem("Listes", + pystray.Menu( + pystray.MenuItem('Groupes de serveurs', + after_click), + pystray.MenuItem('Pays', + after_click), + pystray.MenuItem('On/Off', + on_clicked,checked=lambda item: state), + pystray.MenuItem('Version', + after_click) + + )), + pystray.MenuItem("Quitter", + after_click) + ) + +icon.run() diff --git a/nordvpntray.sh b/nordvpntray.sh new file mode 100755 index 0000000..aa8febe --- /dev/null +++ b/nordvpntray.sh @@ -0,0 +1,7 @@ +# Lancement nordvpntray +# Dossier travail +cd $HOME/.local/share/nordvpntray +# Chemin +export PATH="$HOME/.local/share/nordvpntray/venv/bin:$PATH" +# Exécution script +python nordvpntray.py diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..df26192 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,9 @@ +pystray +pillow +ping3 +plyer +desktop-notifier +dbus-python +wheel +urllib3 +PyGObject diff --git a/venv/bin/Activate.ps1 b/venv/bin/Activate.ps1 new file mode 100644 index 0000000..b49d77b --- /dev/null +++ b/venv/bin/Activate.ps1 @@ -0,0 +1,247 @@ +<# +.Synopsis +Activate a Python virtual environment for the current PowerShell session. + +.Description +Pushes the python executable for a virtual environment to the front of the +$Env:PATH environment variable and sets the prompt to signify that you are +in a Python virtual environment. Makes use of the command line switches as +well as the `pyvenv.cfg` file values present in the virtual environment. + +.Parameter VenvDir +Path to the directory that contains the virtual environment to activate. The +default value for this is the parent of the directory that the Activate.ps1 +script is located within. + +.Parameter Prompt +The prompt prefix to display when this virtual environment is activated. By +default, this prompt is the name of the virtual environment folder (VenvDir) +surrounded by parentheses and followed by a single space (ie. '(.venv) '). + +.Example +Activate.ps1 +Activates the Python virtual environment that contains the Activate.ps1 script. + +.Example +Activate.ps1 -Verbose +Activates the Python virtual environment that contains the Activate.ps1 script, +and shows extra information about the activation as it executes. + +.Example +Activate.ps1 -VenvDir C:\Users\MyUser\Common\.venv +Activates the Python virtual environment located in the specified location. + +.Example +Activate.ps1 -Prompt "MyPython" +Activates the Python virtual environment that contains the Activate.ps1 script, +and prefixes the current prompt with the specified string (surrounded in +parentheses) while the virtual environment is active. + +.Notes +On Windows, it may be required to enable this Activate.ps1 script by setting the +execution policy for the user. You can do this by issuing the following PowerShell +command: + +PS C:\> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser + +For more information on Execution Policies: +https://go.microsoft.com/fwlink/?LinkID=135170 + +#> +Param( + [Parameter(Mandatory = $false)] + [String] + $VenvDir, + [Parameter(Mandatory = $false)] + [String] + $Prompt +) + +<# Function declarations --------------------------------------------------- #> + +<# +.Synopsis +Remove all shell session elements added by the Activate script, including the +addition of the virtual environment's Python executable from the beginning of +the PATH variable. + +.Parameter NonDestructive +If present, do not remove this function from the global namespace for the +session. + +#> +function global:deactivate ([switch]$NonDestructive) { + # Revert to original values + + # The prior prompt: + if (Test-Path -Path Function:_OLD_VIRTUAL_PROMPT) { + Copy-Item -Path Function:_OLD_VIRTUAL_PROMPT -Destination Function:prompt + Remove-Item -Path Function:_OLD_VIRTUAL_PROMPT + } + + # The prior PYTHONHOME: + if (Test-Path -Path Env:_OLD_VIRTUAL_PYTHONHOME) { + Copy-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME -Destination Env:PYTHONHOME + Remove-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME + } + + # The prior PATH: + if (Test-Path -Path Env:_OLD_VIRTUAL_PATH) { + Copy-Item -Path Env:_OLD_VIRTUAL_PATH -Destination Env:PATH + Remove-Item -Path Env:_OLD_VIRTUAL_PATH + } + + # Just remove the VIRTUAL_ENV altogether: + if (Test-Path -Path Env:VIRTUAL_ENV) { + Remove-Item -Path env:VIRTUAL_ENV + } + + # Just remove VIRTUAL_ENV_PROMPT altogether. + if (Test-Path -Path Env:VIRTUAL_ENV_PROMPT) { + Remove-Item -Path env:VIRTUAL_ENV_PROMPT + } + + # Just remove the _PYTHON_VENV_PROMPT_PREFIX altogether: + if (Get-Variable -Name "_PYTHON_VENV_PROMPT_PREFIX" -ErrorAction SilentlyContinue) { + Remove-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Scope Global -Force + } + + # Leave deactivate function in the global namespace if requested: + if (-not $NonDestructive) { + Remove-Item -Path function:deactivate + } +} + +<# +.Description +Get-PyVenvConfig parses the values from the pyvenv.cfg file located in the +given folder, and returns them in a map. + +For each line in the pyvenv.cfg file, if that line can be parsed into exactly +two strings separated by `=` (with any amount of whitespace surrounding the =) +then it is considered a `key = value` line. The left hand string is the key, +the right hand is the value. + +If the value starts with a `'` or a `"` then the first and last character is +stripped from the value before being captured. + +.Parameter ConfigDir +Path to the directory that contains the `pyvenv.cfg` file. +#> +function Get-PyVenvConfig( + [String] + $ConfigDir +) { + Write-Verbose "Given ConfigDir=$ConfigDir, obtain values in pyvenv.cfg" + + # Ensure the file exists, and issue a warning if it doesn't (but still allow the function to continue). + $pyvenvConfigPath = Join-Path -Resolve -Path $ConfigDir -ChildPath 'pyvenv.cfg' -ErrorAction Continue + + # An empty map will be returned if no config file is found. + $pyvenvConfig = @{ } + + if ($pyvenvConfigPath) { + + Write-Verbose "File exists, parse `key = value` lines" + $pyvenvConfigContent = Get-Content -Path $pyvenvConfigPath + + $pyvenvConfigContent | ForEach-Object { + $keyval = $PSItem -split "\s*=\s*", 2 + if ($keyval[0] -and $keyval[1]) { + $val = $keyval[1] + + # Remove extraneous quotations around a string value. + if ("'""".Contains($val.Substring(0, 1))) { + $val = $val.Substring(1, $val.Length - 2) + } + + $pyvenvConfig[$keyval[0]] = $val + Write-Verbose "Adding Key: '$($keyval[0])'='$val'" + } + } + } + return $pyvenvConfig +} + + +<# Begin Activate script --------------------------------------------------- #> + +# Determine the containing directory of this script +$VenvExecPath = Split-Path -Parent $MyInvocation.MyCommand.Definition +$VenvExecDir = Get-Item -Path $VenvExecPath + +Write-Verbose "Activation script is located in path: '$VenvExecPath'" +Write-Verbose "VenvExecDir Fullname: '$($VenvExecDir.FullName)" +Write-Verbose "VenvExecDir Name: '$($VenvExecDir.Name)" + +# Set values required in priority: CmdLine, ConfigFile, Default +# First, get the location of the virtual environment, it might not be +# VenvExecDir if specified on the command line. +if ($VenvDir) { + Write-Verbose "VenvDir given as parameter, using '$VenvDir' to determine values" +} +else { + Write-Verbose "VenvDir not given as a parameter, using parent directory name as VenvDir." + $VenvDir = $VenvExecDir.Parent.FullName.TrimEnd("\\/") + Write-Verbose "VenvDir=$VenvDir" +} + +# Next, read the `pyvenv.cfg` file to determine any required value such +# as `prompt`. +$pyvenvCfg = Get-PyVenvConfig -ConfigDir $VenvDir + +# Next, set the prompt from the command line, or the config file, or +# just use the name of the virtual environment folder. +if ($Prompt) { + Write-Verbose "Prompt specified as argument, using '$Prompt'" +} +else { + Write-Verbose "Prompt not specified as argument to script, checking pyvenv.cfg value" + if ($pyvenvCfg -and $pyvenvCfg['prompt']) { + Write-Verbose " Setting based on value in pyvenv.cfg='$($pyvenvCfg['prompt'])'" + $Prompt = $pyvenvCfg['prompt']; + } + else { + Write-Verbose " Setting prompt based on parent's directory's name. (Is the directory name passed to venv module when creating the virtual environment)" + Write-Verbose " Got leaf-name of $VenvDir='$(Split-Path -Path $venvDir -Leaf)'" + $Prompt = Split-Path -Path $venvDir -Leaf + } +} + +Write-Verbose "Prompt = '$Prompt'" +Write-Verbose "VenvDir='$VenvDir'" + +# Deactivate any currently active virtual environment, but leave the +# deactivate function in place. +deactivate -nondestructive + +# Now set the environment variable VIRTUAL_ENV, used by many tools to determine +# that there is an activated venv. +$env:VIRTUAL_ENV = $VenvDir + +if (-not $Env:VIRTUAL_ENV_DISABLE_PROMPT) { + + Write-Verbose "Setting prompt to '$Prompt'" + + # Set the prompt to include the env name + # Make sure _OLD_VIRTUAL_PROMPT is global + function global:_OLD_VIRTUAL_PROMPT { "" } + Copy-Item -Path function:prompt -Destination function:_OLD_VIRTUAL_PROMPT + New-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Description "Python virtual environment prompt prefix" -Scope Global -Option ReadOnly -Visibility Public -Value $Prompt + + function global:prompt { + Write-Host -NoNewline -ForegroundColor Green "($_PYTHON_VENV_PROMPT_PREFIX) " + _OLD_VIRTUAL_PROMPT + } + $env:VIRTUAL_ENV_PROMPT = $Prompt +} + +# Clear PYTHONHOME +if (Test-Path -Path Env:PYTHONHOME) { + Copy-Item -Path Env:PYTHONHOME -Destination Env:_OLD_VIRTUAL_PYTHONHOME + Remove-Item -Path Env:PYTHONHOME +} + +# Add the venv to the PATH +Copy-Item -Path Env:PATH -Destination Env:_OLD_VIRTUAL_PATH +$Env:PATH = "$VenvExecDir$([System.IO.Path]::PathSeparator)$Env:PATH" diff --git a/venv/bin/activate b/venv/bin/activate new file mode 100644 index 0000000..40acb1f --- /dev/null +++ b/venv/bin/activate @@ -0,0 +1,70 @@ +# This file must be used with "source bin/activate" *from bash* +# You cannot run it directly + +deactivate () { + # reset old environment variables + if [ -n "${_OLD_VIRTUAL_PATH:-}" ] ; then + PATH="${_OLD_VIRTUAL_PATH:-}" + export PATH + unset _OLD_VIRTUAL_PATH + fi + if [ -n "${_OLD_VIRTUAL_PYTHONHOME:-}" ] ; then + PYTHONHOME="${_OLD_VIRTUAL_PYTHONHOME:-}" + export PYTHONHOME + unset _OLD_VIRTUAL_PYTHONHOME + fi + + # Call hash to forget past commands. Without forgetting + # past commands the $PATH changes we made may not be respected + hash -r 2> /dev/null + + if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then + PS1="${_OLD_VIRTUAL_PS1:-}" + export PS1 + unset _OLD_VIRTUAL_PS1 + fi + + unset VIRTUAL_ENV + unset VIRTUAL_ENV_PROMPT + if [ ! "${1:-}" = "nondestructive" ] ; then + # Self destruct! + unset -f deactivate + fi +} + +# unset irrelevant variables +deactivate nondestructive + +# on Windows, a path can contain colons and backslashes and has to be converted: +if [ "${OSTYPE:-}" = "cygwin" ] || [ "${OSTYPE:-}" = "msys" ] ; then + # transform D:\path\to\venv to /d/path/to/venv on MSYS + # and to /cygdrive/d/path/to/venv on Cygwin + export VIRTUAL_ENV=$(cygpath "/srv/media/dplus/python-dev/nordvpntray/venv") +else + # use the path as-is + export VIRTUAL_ENV="/srv/media/dplus/python-dev/nordvpntray/venv" +fi + +_OLD_VIRTUAL_PATH="$PATH" +PATH="$VIRTUAL_ENV/bin:$PATH" +export PATH + +# unset PYTHONHOME if set +# this will fail if PYTHONHOME is set to the empty string (which is bad anyway) +# could use `if (set -u; : $PYTHONHOME) ;` in bash +if [ -n "${PYTHONHOME:-}" ] ; then + _OLD_VIRTUAL_PYTHONHOME="${PYTHONHOME:-}" + unset PYTHONHOME +fi + +if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT:-}" ] ; then + _OLD_VIRTUAL_PS1="${PS1:-}" + PS1="(venv) ${PS1:-}" + export PS1 + VIRTUAL_ENV_PROMPT="(venv) " + export VIRTUAL_ENV_PROMPT +fi + +# Call hash to forget past commands. Without forgetting +# past commands the $PATH changes we made may not be respected +hash -r 2> /dev/null diff --git a/venv/bin/activate.csh b/venv/bin/activate.csh new file mode 100644 index 0000000..730f397 --- /dev/null +++ b/venv/bin/activate.csh @@ -0,0 +1,27 @@ +# This file must be used with "source bin/activate.csh" *from csh*. +# You cannot run it directly. + +# Created by Davide Di Blasi . +# Ported to Python 3.3 venv by Andrew Svetlov + +alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PATH" && unset _OLD_VIRTUAL_PATH; rehash; test $?_OLD_VIRTUAL_PROMPT != 0 && set prompt="$_OLD_VIRTUAL_PROMPT" && unset _OLD_VIRTUAL_PROMPT; unsetenv VIRTUAL_ENV; unsetenv VIRTUAL_ENV_PROMPT; test "\!:*" != "nondestructive" && unalias deactivate' + +# Unset irrelevant variables. +deactivate nondestructive + +setenv VIRTUAL_ENV "/srv/media/dplus/python-dev/nordvpntray/venv" + +set _OLD_VIRTUAL_PATH="$PATH" +setenv PATH "$VIRTUAL_ENV/bin:$PATH" + + +set _OLD_VIRTUAL_PROMPT="$prompt" + +if (! "$?VIRTUAL_ENV_DISABLE_PROMPT") then + set prompt = "(venv) $prompt" + setenv VIRTUAL_ENV_PROMPT "(venv) " +endif + +alias pydoc python -m pydoc + +rehash diff --git a/venv/bin/activate.fish b/venv/bin/activate.fish new file mode 100644 index 0000000..c3114bc --- /dev/null +++ b/venv/bin/activate.fish @@ -0,0 +1,69 @@ +# This file must be used with "source /bin/activate.fish" *from fish* +# (https://fishshell.com/). You cannot run it directly. + +function deactivate -d "Exit virtual environment and return to normal shell environment" + # reset old environment variables + if test -n "$_OLD_VIRTUAL_PATH" + set -gx PATH $_OLD_VIRTUAL_PATH + set -e _OLD_VIRTUAL_PATH + end + if test -n "$_OLD_VIRTUAL_PYTHONHOME" + set -gx PYTHONHOME $_OLD_VIRTUAL_PYTHONHOME + set -e _OLD_VIRTUAL_PYTHONHOME + end + + if test -n "$_OLD_FISH_PROMPT_OVERRIDE" + set -e _OLD_FISH_PROMPT_OVERRIDE + # prevents error when using nested fish instances (Issue #93858) + if functions -q _old_fish_prompt + functions -e fish_prompt + functions -c _old_fish_prompt fish_prompt + functions -e _old_fish_prompt + end + end + + set -e VIRTUAL_ENV + set -e VIRTUAL_ENV_PROMPT + if test "$argv[1]" != "nondestructive" + # Self-destruct! + functions -e deactivate + end +end + +# Unset irrelevant variables. +deactivate nondestructive + +set -gx VIRTUAL_ENV "/srv/media/dplus/python-dev/nordvpntray/venv" + +set -gx _OLD_VIRTUAL_PATH $PATH +set -gx PATH "$VIRTUAL_ENV/bin" $PATH + +# Unset PYTHONHOME if set. +if set -q PYTHONHOME + set -gx _OLD_VIRTUAL_PYTHONHOME $PYTHONHOME + set -e PYTHONHOME +end + +if test -z "$VIRTUAL_ENV_DISABLE_PROMPT" + # fish uses a function instead of an env var to generate the prompt. + + # Save the current fish_prompt function as the function _old_fish_prompt. + functions -c fish_prompt _old_fish_prompt + + # With the original prompt function renamed, we can override with our own. + function fish_prompt + # Save the return status of the last command. + set -l old_status $status + + # Output the venv prompt; color taken from the blue of the Python logo. + printf "%s%s%s" (set_color 4B8BBE) "(venv) " (set_color normal) + + # Restore the return status of the previous command. + echo "exit $old_status" | . + # Output the original/"old" prompt. + _old_fish_prompt + end + + set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV" + set -gx VIRTUAL_ENV_PROMPT "(venv) " +end diff --git a/venv/bin/ping3 b/venv/bin/ping3 new file mode 100755 index 0000000..f7c3f6d --- /dev/null +++ b/venv/bin/ping3 @@ -0,0 +1,8 @@ +#!/srv/media/dplus/python-dev/nordvpntray/venv/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from ping3.command_line import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/venv/bin/pip b/venv/bin/pip new file mode 100755 index 0000000..9161173 --- /dev/null +++ b/venv/bin/pip @@ -0,0 +1,8 @@ +#!/srv/media/dplus/python-dev/nordvpntray/venv/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from pip._internal.cli.main import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/venv/bin/pip3 b/venv/bin/pip3 new file mode 100755 index 0000000..9161173 --- /dev/null +++ b/venv/bin/pip3 @@ -0,0 +1,8 @@ +#!/srv/media/dplus/python-dev/nordvpntray/venv/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from pip._internal.cli.main import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/venv/bin/pip3.12 b/venv/bin/pip3.12 new file mode 100755 index 0000000..9161173 --- /dev/null +++ b/venv/bin/pip3.12 @@ -0,0 +1,8 @@ +#!/srv/media/dplus/python-dev/nordvpntray/venv/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from pip._internal.cli.main import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/venv/bin/python b/venv/bin/python new file mode 120000 index 0000000..b8a0adb --- /dev/null +++ b/venv/bin/python @@ -0,0 +1 @@ +python3 \ No newline at end of file diff --git a/venv/bin/python3 b/venv/bin/python3 new file mode 120000 index 0000000..ae65fda --- /dev/null +++ b/venv/bin/python3 @@ -0,0 +1 @@ +/usr/bin/python3 \ No newline at end of file diff --git a/venv/bin/python3.12 b/venv/bin/python3.12 new file mode 120000 index 0000000..b8a0adb --- /dev/null +++ b/venv/bin/python3.12 @@ -0,0 +1 @@ +python3 \ No newline at end of file diff --git a/venv/bin/wheel b/venv/bin/wheel new file mode 100755 index 0000000..7082852 --- /dev/null +++ b/venv/bin/wheel @@ -0,0 +1,8 @@ +#!/srv/media/dplus/python-dev/nordvpntray/venv/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from wheel.cli import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/venv/include/site/python3.12/PyGObject/pygobject-3.0/pygobject.h b/venv/include/site/python3.12/PyGObject/pygobject-3.0/pygobject.h new file mode 100644 index 0000000..3a96454 --- /dev/null +++ b/venv/include/site/python3.12/PyGObject/pygobject-3.0/pygobject.h @@ -0,0 +1,627 @@ +/* -*- Mode: C; c-basic-offset: 4 -*- */ +#ifndef _PYGOBJECT_H_ +#define _PYGOBJECT_H_ + +#include + +#include +#include + +G_BEGIN_DECLS + +/* PyGClosure is a _private_ structure */ +typedef void (* PyClosureExceptionHandler) (GValue *ret, guint n_param_values, const GValue *params); +typedef struct _PyGClosure PyGClosure; +typedef struct _PyGObjectData PyGObjectData; + +struct _PyGClosure { + GClosure closure; + PyObject *callback; + PyObject *extra_args; /* tuple of extra args to pass to callback */ + PyObject *swap_data; /* other object for gtk_signal_connect__object */ + PyClosureExceptionHandler exception_handler; +}; + +typedef enum { + PYGOBJECT_USING_TOGGLE_REF = 1 << 0, + PYGOBJECT_IS_FLOATING_REF = 1 << 1, + PYGOBJECT_GOBJECT_WAS_FLOATING = 1 << 2 +} PyGObjectFlags; + + /* closures is just an alias for what is found in the + * PyGObjectData */ +typedef struct { + PyObject_HEAD + GObject *obj; + PyObject *inst_dict; /* the instance dictionary -- must be last */ + PyObject *weakreflist; /* list of weak references */ + + /*< private >*/ + /* using union to preserve ABI compatibility (structure size + * must not change) */ + union { + GSList *closures; /* stale field; no longer updated DO-NOT-USE! */ + PyGObjectFlags flags; + } private_flags; + +} PyGObject; + +#define pygobject_get(v) (((PyGObject *)(v))->obj) +#define pygobject_check(v,base) (PyObject_TypeCheck(v,base)) + +typedef struct { + PyObject_HEAD + gpointer boxed; + GType gtype; + gboolean free_on_dealloc; +} PyGBoxed; + +#define pyg_boxed_get(v,t) ((t *)((PyGBoxed *)(v))->boxed) +#define pyg_boxed_get_ptr(v) (((PyGBoxed *)(v))->boxed) +#define pyg_boxed_set_ptr(v,p) (((PyGBoxed *)(v))->boxed = (gpointer)p) +#define pyg_boxed_check(v,typecode) (PyObject_TypeCheck(v, &PyGBoxed_Type) && ((PyGBoxed *)(v))->gtype == typecode) + +typedef struct { + PyObject_HEAD + gpointer pointer; + GType gtype; +} PyGPointer; + +#define pyg_pointer_get(v,t) ((t *)((PyGPointer *)(v))->pointer) +#define pyg_pointer_get_ptr(v) (((PyGPointer *)(v))->pointer) +#define pyg_pointer_set_ptr(v,p) (((PyGPointer *)(v))->pointer = (gpointer)p) +#define pyg_pointer_check(v,typecode) (PyObject_TypeCheck(v, &PyGPointer_Type) && ((PyGPointer *)(v))->gtype == typecode) + +typedef void (*PyGFatalExceptionFunc) (void); +typedef void (*PyGThreadBlockFunc) (void); + +typedef int (*PyGClassInitFunc) (gpointer gclass, PyTypeObject *pyclass); +typedef PyTypeObject * (*PyGTypeRegistrationFunction) (const gchar *name, + gpointer data); + +struct _PyGObject_Functions { + /* + * All field names in here are considered private, + * use the macros below instead, which provides stability + */ + void (* register_class)(PyObject *dict, const gchar *class_name, + GType gtype, PyTypeObject *type, PyObject *bases); + void (* register_wrapper)(PyObject *self); + PyTypeObject *(* lookup_class)(GType type); + PyObject *(* newgobj)(GObject *obj); + + GClosure *(* closure_new)(PyObject *callback, PyObject *extra_args, + PyObject *swap_data); + void (* object_watch_closure)(PyObject *self, GClosure *closure); + GDestroyNotify destroy_notify; + + GType (* type_from_object)(PyObject *obj); + PyObject *(* type_wrapper_new)(GType type); + + gint (* enum_get_value)(GType enum_type, PyObject *obj, gint *val); + gint (* flags_get_value)(GType flag_type, PyObject *obj, guint *val); + void (* register_gtype_custom)(GType gtype, + PyObject *(* from_func)(const GValue *value), + int (* to_func)(GValue *value, PyObject *obj)); + int (* value_from_pyobject)(GValue *value, PyObject *obj); + PyObject *(* value_as_pyobject)(const GValue *value, gboolean copy_boxed); + + void (* register_interface)(PyObject *dict, const gchar *class_name, + GType gtype, PyTypeObject *type); + + PyTypeObject *boxed_type; + void (* register_boxed)(PyObject *dict, const gchar *class_name, + GType boxed_type, PyTypeObject *type); + PyObject *(* boxed_new)(GType boxed_type, gpointer boxed, + gboolean copy_boxed, gboolean own_ref); + + PyTypeObject *pointer_type; + void (* register_pointer)(PyObject *dict, const gchar *class_name, + GType pointer_type, PyTypeObject *type); + PyObject *(* pointer_new)(GType boxed_type, gpointer pointer); + + void (* enum_add_constants)(PyObject *module, GType enum_type, + const gchar *strip_prefix); + void (* flags_add_constants)(PyObject *module, GType flags_type, + const gchar *strip_prefix); + + const gchar *(* constant_strip_prefix)(const gchar *name, + const gchar *strip_prefix); + + gboolean (* error_check)(GError **error); + + /* hooks to register handlers for getting GDK threads to cooperate + * with python threading */ + void (* set_thread_block_funcs) (PyGThreadBlockFunc block_threads_func, + PyGThreadBlockFunc unblock_threads_func); + PyGThreadBlockFunc block_threads; + PyGThreadBlockFunc unblock_threads; + + PyTypeObject *paramspec_type; + PyObject *(* paramspec_new)(GParamSpec *spec); + GParamSpec *(*paramspec_get)(PyObject *tuple); + int (*pyobj_to_unichar_conv)(PyObject *pyobj, void* ptr); +G_GNUC_BEGIN_IGNORE_DEPRECATIONS + gboolean (*parse_constructor_args)(GType obj_type, + char **arg_names, + char **prop_names, + GParameter *params, + guint *nparams, + PyObject **py_args); +G_GNUC_END_IGNORE_DEPRECATIONS + PyObject *(* param_gvalue_as_pyobject) (const GValue* gvalue, + gboolean copy_boxed, + const GParamSpec* pspec); + int (* gvalue_from_param_pyobject) (GValue* value, + PyObject* py_obj, + const GParamSpec* pspec); + PyTypeObject *enum_type; + PyObject *(*enum_add)(PyObject *module, + const char *type_name_, + const char *strip_prefix, + GType gtype); + PyObject* (*enum_from_gtype)(GType gtype, int value); + + PyTypeObject *flags_type; + PyObject *(*flags_add)(PyObject *module, + const char *type_name_, + const char *strip_prefix, + GType gtype); + PyObject* (*flags_from_gtype)(GType gtype, guint value); + + gboolean threads_enabled; + int (*enable_threads) (void); + + int (*gil_state_ensure) (void); + void (*gil_state_release) (int flag); + + void (*register_class_init) (GType gtype, PyGClassInitFunc class_init); + void (*register_interface_info) (GType gtype, const GInterfaceInfo *info); + void (*closure_set_exception_handler) (GClosure *closure, PyClosureExceptionHandler handler); + + void (*add_warning_redirection) (const char *domain, + PyObject *warning); + void (*disable_warning_redirections) (void); + + /* type_register_custom API now removed, but leave a pointer here to not + * break ABI. */ + void *_type_register_custom; + + gboolean (*gerror_exception_check) (GError **error); + PyObject* (*option_group_new) (GOptionGroup *group); + GType (* type_from_object_strict) (PyObject *obj, gboolean strict); + + PyObject *(* newgobj_full)(GObject *obj, gboolean steal, gpointer g_class); + PyTypeObject *object_type; + int (* value_from_pyobject_with_error)(GValue *value, PyObject *obj); +}; + + +/* Deprecated, only available for API compatibility. */ +#define pyg_threads_enabled TRUE +#define pyg_gil_state_ensure PyGILState_Ensure +#define pyg_gil_state_release PyGILState_Release +#define pyg_begin_allow_threads Py_BEGIN_ALLOW_THREADS +#define pyg_end_allow_threads Py_END_ALLOW_THREADS +#define pyg_enable_threads() +#define pyg_set_thread_block_funcs(a, b) +#define pyg_block_threads() +#define pyg_unblock_threads() + + +#ifndef _INSIDE_PYGOBJECT_ + +#if defined(NO_IMPORT) || defined(NO_IMPORT_PYGOBJECT) +extern struct _PyGObject_Functions *_PyGObject_API; +#else +struct _PyGObject_Functions *_PyGObject_API; +#endif + +#define pygobject_register_class (_PyGObject_API->register_class) +#define pygobject_register_wrapper (_PyGObject_API->register_wrapper) +#define pygobject_lookup_class (_PyGObject_API->lookup_class) +#define pygobject_new (_PyGObject_API->newgobj) +#define pygobject_new_full (_PyGObject_API->newgobj_full) +#define PyGObject_Type (*_PyGObject_API->object_type) +#define pyg_closure_new (_PyGObject_API->closure_new) +#define pygobject_watch_closure (_PyGObject_API->object_watch_closure) +#define pyg_closure_set_exception_handler (_PyGObject_API->closure_set_exception_handler) +#define pyg_destroy_notify (_PyGObject_API->destroy_notify) +#define pyg_type_from_object_strict (_PyGObject_API->type_from_object_strict) +#define pyg_type_from_object (_PyGObject_API->type_from_object) +#define pyg_type_wrapper_new (_PyGObject_API->type_wrapper_new) +#define pyg_enum_get_value (_PyGObject_API->enum_get_value) +#define pyg_flags_get_value (_PyGObject_API->flags_get_value) +#define pyg_register_gtype_custom (_PyGObject_API->register_gtype_custom) +#define pyg_value_from_pyobject (_PyGObject_API->value_from_pyobject) +#define pyg_value_from_pyobject_with_error (_PyGObject_API->value_from_pyobject_with_error) +#define pyg_value_as_pyobject (_PyGObject_API->value_as_pyobject) +#define pyg_register_interface (_PyGObject_API->register_interface) +#define PyGBoxed_Type (*_PyGObject_API->boxed_type) +#define pyg_register_boxed (_PyGObject_API->register_boxed) +#define pyg_boxed_new (_PyGObject_API->boxed_new) +#define PyGPointer_Type (*_PyGObject_API->pointer_type) +#define pyg_register_pointer (_PyGObject_API->register_pointer) +#define pyg_pointer_new (_PyGObject_API->pointer_new) +#define pyg_enum_add_constants (_PyGObject_API->enum_add_constants) +#define pyg_flags_add_constants (_PyGObject_API->flags_add_constants) +#define pyg_constant_strip_prefix (_PyGObject_API->constant_strip_prefix) +#define pyg_error_check (_PyGObject_API->error_check) +#define PyGParamSpec_Type (*_PyGObject_API->paramspec_type) +#define pyg_param_spec_new (_PyGObject_API->paramspec_new) +#define pyg_param_spec_from_object (_PyGObject_API->paramspec_get) +#define pyg_pyobj_to_unichar_conv (_PyGObject_API->pyobj_to_unichar_conv) +#define pyg_parse_constructor_args (_PyGObject_API->parse_constructor_args) +#define pyg_param_gvalue_as_pyobject (_PyGObject_API->value_as_pyobject) +#define pyg_param_gvalue_from_pyobject (_PyGObject_API->gvalue_from_param_pyobject) +#define PyGEnum_Type (*_PyGObject_API->enum_type) +#define pyg_enum_add (_PyGObject_API->enum_add) +#define pyg_enum_from_gtype (_PyGObject_API->enum_from_gtype) +#define PyGFlags_Type (*_PyGObject_API->flags_type) +#define pyg_flags_add (_PyGObject_API->flags_add) +#define pyg_flags_from_gtype (_PyGObject_API->flags_from_gtype) +#define pyg_register_class_init (_PyGObject_API->register_class_init) +#define pyg_register_interface_info (_PyGObject_API->register_interface_info) +#define pyg_add_warning_redirection (_PyGObject_API->add_warning_redirection) +#define pyg_disable_warning_redirections (_PyGObject_API->disable_warning_redirections) +#define pyg_gerror_exception_check (_PyGObject_API->gerror_exception_check) +#define pyg_option_group_new (_PyGObject_API->option_group_new) + + +/** + * pygobject_init: + * @req_major: minimum version major number, or -1 + * @req_minor: minimum version minor number, or -1 + * @req_micro: minimum version micro number, or -1 + * + * Imports and initializes the 'gobject' python module. Can + * optionally check for a required minimum version if @req_major, + * @req_minor, and @req_micro are all different from -1. + * + * Returns: a new reference to the gobject module on success, NULL in + * case of failure (and raises ImportError). + **/ +static inline PyObject * +pygobject_init(int req_major, int req_minor, int req_micro) +{ + PyObject *gobject, *cobject; + + gobject = PyImport_ImportModule("gi._gobject"); + if (!gobject) { + if (PyErr_Occurred()) + { + PyObject *type, *value, *traceback; + PyObject *py_orig_exc; + PyErr_Fetch(&type, &value, &traceback); + py_orig_exc = PyObject_Repr(value); + Py_XDECREF(type); + Py_XDECREF(value); + Py_XDECREF(traceback); + + +#if PY_VERSION_HEX < 0x03000000 + PyErr_Format(PyExc_ImportError, + "could not import gobject (error was: %s)", + PyString_AsString(py_orig_exc)); +#else + { + /* Can not use PyErr_Format because it doesn't have + * a format string for dealing with PyUnicode objects + * like PyUnicode_FromFormat has + */ + PyObject *errmsg = PyUnicode_FromFormat("could not import gobject (error was: %U)", + py_orig_exc); + + if (errmsg) { + PyErr_SetObject(PyExc_ImportError, + errmsg); + Py_DECREF(errmsg); + } + /* if errmsg is NULL then we might have OOM + * PyErr should already be set and trying to + * return our own error would be futile + */ + } +#endif + Py_DECREF(py_orig_exc); + } else { + PyErr_SetString(PyExc_ImportError, + "could not import gobject (no error given)"); + } + return NULL; + } + + cobject = PyObject_GetAttrString(gobject, "_PyGObject_API"); + if (cobject && PyCapsule_CheckExact(cobject)) { + _PyGObject_API = (struct _PyGObject_Functions *) PyCapsule_GetPointer(cobject, "gobject._PyGObject_API"); + Py_DECREF (cobject); + } else { + PyErr_SetString(PyExc_ImportError, + "could not import gobject (could not find _PyGObject_API object)"); + Py_XDECREF (cobject); + Py_DECREF(gobject); + return NULL; + } + + if (req_major != -1) + { + int found_major, found_minor, found_micro; + PyObject *version; + + version = PyObject_GetAttrString(gobject, "pygobject_version"); + if (!version) { + PyErr_SetString(PyExc_ImportError, + "could not import gobject (version too old)"); + Py_DECREF(gobject); + return NULL; + } + if (!PyArg_ParseTuple(version, "iii", + &found_major, &found_minor, &found_micro)) { + PyErr_SetString(PyExc_ImportError, + "could not import gobject (version has invalid format)"); + Py_DECREF(version); + Py_DECREF(gobject); + return NULL; + } + Py_DECREF(version); + if (req_major != found_major || + req_minor > found_minor || + (req_minor == found_minor && req_micro > found_micro)) { + PyErr_Format(PyExc_ImportError, + "could not import gobject (version mismatch, %d.%d.%d is required, " + "found %d.%d.%d)", req_major, req_minor, req_micro, + found_major, found_minor, found_micro); + Py_DECREF(gobject); + return NULL; + } + } + return gobject; +} + +/** + * PYLIST_FROMGLIBLIST: + * @type: the type of the GLib list e.g. #GList or #GSList + * @prefix: the prefix of functions that manipulate a list of the type + * given by type. + * + * A macro that creates a type specific code block which converts a GLib + * list (#GSList or #GList) to a Python list. The first two args of the macro + * are used to specify the type and list function prefix so that the type + * specific macros can be generated. + * + * The rest of the args are for the standard args for the type specific + * macro(s) created from this macro. + */ + #define PYLIST_FROMGLIBLIST(type,prefix,py_list,list,item_convert_func,\ + list_free,list_item_free) \ +G_STMT_START \ +{ \ + gint i, len; \ + PyObject *item; \ + void (*glib_list_free)(type*) = list_free; \ + GFunc glib_list_item_free = (GFunc)list_item_free; \ + \ + len = prefix##_length(list); \ + py_list = PyList_New(len); \ + for (i = 0; i < len; i++) { \ + gpointer list_item = prefix##_nth_data(list, i); \ + \ + item = item_convert_func; \ + PyList_SetItem(py_list, i, item); \ + } \ + if (glib_list_item_free != NULL) \ + prefix##_foreach(list, glib_list_item_free, NULL); \ + if (glib_list_free != NULL) \ + glib_list_free(list); \ +} G_STMT_END + +/** + * PYLIST_FROMGLIST: + * @py_list: the name of the Python list + * + * @list: the #GList to be converted to a Python list + * + * @item_convert_func: the function that converts a list item to a Python + * object. The function must refer to the list item using "@list_item" and + * must return a #PyObject* object. An example conversion function is: + * [[ + * PyString_FromString(list_item) + * ]] + * A more elaborate function is: + * [[ + * pyg_boxed_new(GTK_TYPE_RECENT_INFO, list_item, TRUE, TRUE) + * ]] + * @list_free: the name of a function that takes a single arg (the list) and + * frees its memory. Can be NULL if the list should not be freed. An example + * is: + * [[ + * g_list_free + * ]] + * @list_item_free: the name of a #GFunc function that frees the memory used + * by the items in the list or %NULL if the list items do not have to be + * freed. A simple example is: + * [[ + * g_free + * ]] + * + * A macro that adds code that converts a #GList to a Python list. + * + */ +#define PYLIST_FROMGLIST(py_list,list,item_convert_func,list_free,\ + list_item_free) \ + PYLIST_FROMGLIBLIST(GList,g_list,py_list,list,item_convert_func,\ + list_free,list_item_free) + +/** + * PYLIST_FROMGSLIST: + * @py_list: the name of the Python list + * + * @list: the #GSList to be converted to a Python list + * + * @item_convert_func: the function that converts a list item to a Python + * object. The function must refer to the list item using "@list_item" and + * must return a #PyObject* object. An example conversion function is: + * [[ + * PyString_FromString(list_item) + * ]] + * A more elaborate function is: + * [[ + * pyg_boxed_new(GTK_TYPE_RECENT_INFO, list_item, TRUE, TRUE) + * ]] + * @list_free: the name of a function that takes a single arg (the list) and + * frees its memory. Can be %NULL if the list should not be freed. An example + * is: + * [[ + * g_list_free + * ]] + * @list_item_free: the name of a #GFunc function that frees the memory used + * by the items in the list or %NULL if the list items do not have to be + * freed. A simple example is: + * [[ + * g_free + * ]] + * + * A macro that adds code that converts a #GSList to a Python list. + * + */ +#define PYLIST_FROMGSLIST(py_list,list,item_convert_func,list_free,\ + list_item_free) \ + PYLIST_FROMGLIBLIST(GSList,g_slist,py_list,list,item_convert_func,\ + list_free,list_item_free) + +/** + * PYLIST_ASGLIBLIST + * @type: the type of the GLib list e.g. GList or GSList + * @prefix: the prefix of functions that manipulate a list of the type + * given by type e.g. g_list or g_slist + * + * A macro that creates a type specific code block to be used to convert a + * Python list to a GLib list (GList or GSList). The first two args of the + * macro are used to specify the type and list function prefix so that the + * type specific macros can be generated. + * + * The rest of the args are for the standard args for the type specific + * macro(s) created from this macro. + */ +#define PYLIST_ASGLIBLIST(type,prefix,py_list,list,check_func,\ + convert_func,child_free_func,errormsg,errorreturn) \ +G_STMT_START \ +{ \ + Py_ssize_t i, n_list; \ + GFunc glib_child_free_func = (GFunc)child_free_func; \ + \ + if (!(py_list = PySequence_Fast(py_list, ""))) { \ + errormsg; \ + return errorreturn; \ + } \ + n_list = PySequence_Fast_GET_SIZE(py_list); \ + for (i = 0; i < n_list; i++) { \ + PyObject *py_item = PySequence_Fast_GET_ITEM(py_list, i); \ + \ + if (!check_func) { \ + if (glib_child_free_func) \ + prefix##_foreach(list, glib_child_free_func, NULL); \ + prefix##_free(list); \ + Py_DECREF(py_list); \ + errormsg; \ + return errorreturn; \ + } \ + list = prefix##_prepend(list, convert_func); \ + }; \ + Py_DECREF(py_list); \ + list = prefix##_reverse(list); \ +} \ +G_STMT_END +/** + * PYLIST_ASGLIST + * @py_list: the Python list to be converted + * @list: the #GList list to be converted + * @check_func: the expression that takes a #PyObject* arg (must be named + * @py_item) and returns an int value indicating if the Python object matches + * the required list item type (0 - %False or 1 - %True). An example is: + * [[ + * (PyString_Check(py_item)||PyUnicode_Check(py_item)) + * ]] + * @convert_func: the function that takes a #PyObject* arg (must be named + * py_item) and returns a pointer to the converted list object. An example + * is: + * [[ + * pygobject_get(py_item) + * ]] + * @child_free_func: the name of a #GFunc function that frees a GLib list + * item or %NULL if the list item does not have to be freed. This function is + * used to help free the items in a partially created list if there is an + * error. An example is: + * [[ + * g_free + * ]] + * @errormsg: a function that sets up a Python error message. An example is: + * [[ + * PyErr_SetString(PyExc_TypeError, "strings must be a sequence of" "strings + * or unicode objects") + * ]] + * @errorreturn: the value to return if an error occurs, e.g.: + * [[ + * %NULL + * ]] + * + * A macro that creates code that converts a Python list to a #GList. The + * returned list must be freed using the appropriate list free function when + * it's no longer needed. If an error occurs the child_free_func is used to + * release the memory used by the list items and then the list memory is + * freed. + */ +#define PYLIST_ASGLIST(py_list,list,check_func,convert_func,child_free_func,\ + errormsg,errorreturn) \ + PYLIST_ASGLIBLIST(GList,g_list,py_list,list,check_func,convert_func,\ + child_free_func,errormsg,errorreturn) + +/** + * PYLIST_ASGSLIST + * @py_list: the Python list to be converted + * @list: the #GSList list to be converted + * @check_func: the expression that takes a #PyObject* arg (must be named + * @py_item) and returns an int value indicating if the Python object matches + * the required list item type (0 - %False or 1 - %True). An example is: + * [[ + * (PyString_Check(py_item)||PyUnicode_Check(py_item)) + * ]] + * @convert_func: the function that takes a #PyObject* arg (must be named + * py_item) and returns a pointer to the converted list object. An example + * is: + * [[ + * pygobject_get(py_item) + * ]] + * @child_free_func: the name of a #GFunc function that frees a GLib list + * item or %NULL if the list item does not have to be freed. This function is + * used to help free the items in a partially created list if there is an + * error. An example is: + * [[ + * g_free + * ]] + * @errormsg: a function that sets up a Python error message. An example is: + * [[ + * PyErr_SetString(PyExc_TypeError, "strings must be a sequence of" "strings + * or unicode objects") + * ]] + * @errorreturn: the value to return if an error occurs, e.g.: + * [[ + * %NULL + * ]] + * + * A macro that creates code that converts a Python list to a #GSList. The + * returned list must be freed using the appropriate list free function when + * it's no longer needed. If an error occurs the child_free_func is used to + * release the memory used by the list items and then the list memory is + * freed. + */ +#define PYLIST_ASGSLIST(py_list,list,check_func,convert_func,child_free_func,\ + errormsg,errorreturn) \ + PYLIST_ASGLIBLIST(GSList,g_slist,py_list,list,check_func,convert_func,\ + child_free_func,errormsg,errorreturn) + +#endif /* !_INSIDE_PYGOBJECT_ */ + +G_END_DECLS + +#endif /* !_PYGOBJECT_H_ */ diff --git a/venv/include/site/python3.12/dbus-python/dbus-1.0/dbus/dbus-python.h b/venv/include/site/python3.12/dbus-python/dbus-1.0/dbus/dbus-python.h new file mode 100644 index 0000000..72a9bf1 --- /dev/null +++ b/venv/include/site/python3.12/dbus-python/dbus-1.0/dbus/dbus-python.h @@ -0,0 +1,106 @@ +/* C API for _dbus_bindings, used by _dbus_glib_bindings and any third-party + * main loop integration which might happen in future. + * + * This file is currently Python-version-independent - please keep it that way. + * + * Copyright (C) 2006 Collabora Ltd. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifndef DBUS_PYTHON_H +#define DBUS_PYTHON_H + +#include +#include + +#define PYDBUS_CAPSULE_NAME "_dbus_bindings._C_API" + +DBUS_BEGIN_DECLS + +typedef void (*_dbus_py_func_ptr)(void); + +typedef dbus_bool_t (*_dbus_py_conn_setup_func)(DBusConnection *, void *); +typedef dbus_bool_t (*_dbus_py_srv_setup_func)(DBusServer *, void *); +typedef void (*_dbus_py_free_func)(void *); + +#define DBUS_BINDINGS_API_COUNT 3 + +#ifdef INSIDE_DBUS_PYTHON_BINDINGS + +extern DBusConnection *DBusPyConnection_BorrowDBusConnection(PyObject *); +extern PyObject *DBusPyNativeMainLoop_New4(_dbus_py_conn_setup_func, + _dbus_py_srv_setup_func, + _dbus_py_free_func, + void *); + +#else + +static PyObject *_dbus_bindings_module = NULL; +static _dbus_py_func_ptr *dbus_bindings_API; + +#define DBusPyConnection_BorrowDBusConnection \ + (*(DBusConnection *(*)(PyObject *))dbus_bindings_API[1]) +#define DBusPyNativeMainLoop_New4 \ + ((PyObject *(*)(_dbus_py_conn_setup_func, _dbus_py_srv_setup_func, \ + _dbus_py_free_func, void *))dbus_bindings_API[2]) + +static int +import_dbus_bindings(const char *this_module_name) +{ + PyObject *c_api; + int count; + + _dbus_bindings_module = PyImport_ImportModule("_dbus_bindings"); + if (!_dbus_bindings_module) { + return -1; + } + c_api = PyObject_GetAttrString(_dbus_bindings_module, "_C_API"); + if (c_api == NULL) return -1; + dbus_bindings_API = NULL; + if (PyCapsule_IsValid(c_api, PYDBUS_CAPSULE_NAME)) { + dbus_bindings_API = (_dbus_py_func_ptr *)PyCapsule_GetPointer( + c_api, PYDBUS_CAPSULE_NAME); + } + Py_CLEAR(c_api); + if (!dbus_bindings_API) { + PyErr_SetString(PyExc_RuntimeError, "C API is not a PyCapsule"); + return -1; + } + count = *(int *)dbus_bindings_API[0]; + if (count < DBUS_BINDINGS_API_COUNT) { + PyErr_Format(PyExc_RuntimeError, + "_dbus_bindings has API version %d but %s needs " + "_dbus_bindings API version at least %d", + count, this_module_name, + DBUS_BINDINGS_API_COUNT); + return -1; + } + return 0; +} + +#endif + +DBUS_END_DECLS + +#endif diff --git a/venv/lib/python3.12/site-packages/.dbus_python.mesonpy.libs/pkgconfig/dbus-python.pc b/venv/lib/python3.12/site-packages/.dbus_python.mesonpy.libs/pkgconfig/dbus-python.pc new file mode 100644 index 0000000..f858f42 --- /dev/null +++ b/venv/lib/python3.12/site-packages/.dbus_python.mesonpy.libs/pkgconfig/dbus-python.pc @@ -0,0 +1,11 @@ +prefix=/usr/local +includedir=${prefix}/include + +exec_prefix=${prefix} +datarootdir=${prefix}/share + +Name: dbus-python +Description: Python bindings for D-Bus +Version: 1.3.2 +Requires: dbus-1 >= 1.8 +Cflags: -I${includedir}/dbus-1.0 diff --git a/venv/lib/python3.12/site-packages/PIL/BdfFontFile.py b/venv/lib/python3.12/site-packages/PIL/BdfFontFile.py new file mode 100644 index 0000000..bc1416c --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/BdfFontFile.py @@ -0,0 +1,133 @@ +# +# The Python Imaging Library +# $Id$ +# +# bitmap distribution font (bdf) file parser +# +# history: +# 1996-05-16 fl created (as bdf2pil) +# 1997-08-25 fl converted to FontFile driver +# 2001-05-25 fl removed bogus __init__ call +# 2002-11-20 fl robustification (from Kevin Cazabon, Dmitry Vasiliev) +# 2003-04-22 fl more robustification (from Graham Dumpleton) +# +# Copyright (c) 1997-2003 by Secret Labs AB. +# Copyright (c) 1997-2003 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# + +""" +Parse X Bitmap Distribution Format (BDF) +""" +from __future__ import annotations + +from typing import BinaryIO + +from . import FontFile, Image + +bdf_slant = { + "R": "Roman", + "I": "Italic", + "O": "Oblique", + "RI": "Reverse Italic", + "RO": "Reverse Oblique", + "OT": "Other", +} + +bdf_spacing = {"P": "Proportional", "M": "Monospaced", "C": "Cell"} + + +def bdf_char( + f: BinaryIO, +) -> ( + tuple[ + str, + int, + tuple[tuple[int, int], tuple[int, int, int, int], tuple[int, int, int, int]], + Image.Image, + ] + | None +): + # skip to STARTCHAR + while True: + s = f.readline() + if not s: + return None + if s[:9] == b"STARTCHAR": + break + id = s[9:].strip().decode("ascii") + + # load symbol properties + props = {} + while True: + s = f.readline() + if not s or s[:6] == b"BITMAP": + break + i = s.find(b" ") + props[s[:i].decode("ascii")] = s[i + 1 : -1].decode("ascii") + + # load bitmap + bitmap = bytearray() + while True: + s = f.readline() + if not s or s[:7] == b"ENDCHAR": + break + bitmap += s[:-1] + + # The word BBX + # followed by the width in x (BBw), height in y (BBh), + # and x and y displacement (BBxoff0, BByoff0) + # of the lower left corner from the origin of the character. + width, height, x_disp, y_disp = (int(p) for p in props["BBX"].split()) + + # The word DWIDTH + # followed by the width in x and y of the character in device pixels. + dwx, dwy = (int(p) for p in props["DWIDTH"].split()) + + bbox = ( + (dwx, dwy), + (x_disp, -y_disp - height, width + x_disp, -y_disp), + (0, 0, width, height), + ) + + try: + im = Image.frombytes("1", (width, height), bitmap, "hex", "1") + except ValueError: + # deal with zero-width characters + im = Image.new("1", (width, height)) + + return id, int(props["ENCODING"]), bbox, im + + +class BdfFontFile(FontFile.FontFile): + """Font file plugin for the X11 BDF format.""" + + def __init__(self, fp: BinaryIO) -> None: + super().__init__() + + s = fp.readline() + if s[:13] != b"STARTFONT 2.1": + msg = "not a valid BDF file" + raise SyntaxError(msg) + + props = {} + comments = [] + + while True: + s = fp.readline() + if not s or s[:13] == b"ENDPROPERTIES": + break + i = s.find(b" ") + props[s[:i].decode("ascii")] = s[i + 1 : -1].decode("ascii") + if s[:i] in [b"COMMENT", b"COPYRIGHT"]: + if s.find(b"LogicalFontDescription") < 0: + comments.append(s[i + 1 : -1].decode("ascii")) + + while True: + c = bdf_char(fp) + if not c: + break + id, ch, (xy, dst, src), im = c + if 0 <= ch < len(self.glyph): + self.glyph[ch] = xy, dst, src, im diff --git a/venv/lib/python3.12/site-packages/PIL/BlpImagePlugin.py b/venv/lib/python3.12/site-packages/PIL/BlpImagePlugin.py new file mode 100644 index 0000000..e560563 --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/BlpImagePlugin.py @@ -0,0 +1,493 @@ +""" +Blizzard Mipmap Format (.blp) +Jerome Leclanche + +The contents of this file are hereby released in the public domain (CC0) +Full text of the CC0 license: + https://creativecommons.org/publicdomain/zero/1.0/ + +BLP1 files, used mostly in Warcraft III, are not fully supported. +All types of BLP2 files used in World of Warcraft are supported. + +The BLP file structure consists of a header, up to 16 mipmaps of the +texture + +Texture sizes must be powers of two, though the two dimensions do +not have to be equal; 512x256 is valid, but 512x200 is not. +The first mipmap (mipmap #0) is the full size image; each subsequent +mipmap halves both dimensions. The final mipmap should be 1x1. + +BLP files come in many different flavours: +* JPEG-compressed (type == 0) - only supported for BLP1. +* RAW images (type == 1, encoding == 1). Each mipmap is stored as an + array of 8-bit values, one per pixel, left to right, top to bottom. + Each value is an index to the palette. +* DXT-compressed (type == 1, encoding == 2): +- DXT1 compression is used if alpha_encoding == 0. + - An additional alpha bit is used if alpha_depth == 1. + - DXT3 compression is used if alpha_encoding == 1. + - DXT5 compression is used if alpha_encoding == 7. +""" + +from __future__ import annotations + +import abc +import os +import struct +from enum import IntEnum +from io import BytesIO +from typing import IO + +from . import Image, ImageFile + + +class Format(IntEnum): + JPEG = 0 + + +class Encoding(IntEnum): + UNCOMPRESSED = 1 + DXT = 2 + UNCOMPRESSED_RAW_BGRA = 3 + + +class AlphaEncoding(IntEnum): + DXT1 = 0 + DXT3 = 1 + DXT5 = 7 + + +def unpack_565(i: int) -> tuple[int, int, int]: + return ((i >> 11) & 0x1F) << 3, ((i >> 5) & 0x3F) << 2, (i & 0x1F) << 3 + + +def decode_dxt1( + data: bytes, alpha: bool = False +) -> tuple[bytearray, bytearray, bytearray, bytearray]: + """ + input: one "row" of data (i.e. will produce 4*width pixels) + """ + + blocks = len(data) // 8 # number of blocks in row + ret = (bytearray(), bytearray(), bytearray(), bytearray()) + + for block_index in range(blocks): + # Decode next 8-byte block. + idx = block_index * 8 + color0, color1, bits = struct.unpack_from("> 2 + + a = 0xFF + if control == 0: + r, g, b = r0, g0, b0 + elif control == 1: + r, g, b = r1, g1, b1 + elif control == 2: + if color0 > color1: + r = (2 * r0 + r1) // 3 + g = (2 * g0 + g1) // 3 + b = (2 * b0 + b1) // 3 + else: + r = (r0 + r1) // 2 + g = (g0 + g1) // 2 + b = (b0 + b1) // 2 + elif control == 3: + if color0 > color1: + r = (2 * r1 + r0) // 3 + g = (2 * g1 + g0) // 3 + b = (2 * b1 + b0) // 3 + else: + r, g, b, a = 0, 0, 0, 0 + + if alpha: + ret[j].extend([r, g, b, a]) + else: + ret[j].extend([r, g, b]) + + return ret + + +def decode_dxt3(data: bytes) -> tuple[bytearray, bytearray, bytearray, bytearray]: + """ + input: one "row" of data (i.e. will produce 4*width pixels) + """ + + blocks = len(data) // 16 # number of blocks in row + ret = (bytearray(), bytearray(), bytearray(), bytearray()) + + for block_index in range(blocks): + idx = block_index * 16 + block = data[idx : idx + 16] + # Decode next 16-byte block. + bits = struct.unpack_from("<8B", block) + color0, color1 = struct.unpack_from(">= 4 + else: + high = True + a &= 0xF + a *= 17 # We get a value between 0 and 15 + + color_code = (code >> 2 * (4 * j + i)) & 0x03 + + if color_code == 0: + r, g, b = r0, g0, b0 + elif color_code == 1: + r, g, b = r1, g1, b1 + elif color_code == 2: + r = (2 * r0 + r1) // 3 + g = (2 * g0 + g1) // 3 + b = (2 * b0 + b1) // 3 + elif color_code == 3: + r = (2 * r1 + r0) // 3 + g = (2 * g1 + g0) // 3 + b = (2 * b1 + b0) // 3 + + ret[j].extend([r, g, b, a]) + + return ret + + +def decode_dxt5(data: bytes) -> tuple[bytearray, bytearray, bytearray, bytearray]: + """ + input: one "row" of data (i.e. will produce 4 * width pixels) + """ + + blocks = len(data) // 16 # number of blocks in row + ret = (bytearray(), bytearray(), bytearray(), bytearray()) + + for block_index in range(blocks): + idx = block_index * 16 + block = data[idx : idx + 16] + # Decode next 16-byte block. + a0, a1 = struct.unpack_from("> alphacode_index) & 0x07 + elif alphacode_index == 15: + alphacode = (alphacode2 >> 15) | ((alphacode1 << 1) & 0x06) + else: # alphacode_index >= 18 and alphacode_index <= 45 + alphacode = (alphacode1 >> (alphacode_index - 16)) & 0x07 + + if alphacode == 0: + a = a0 + elif alphacode == 1: + a = a1 + elif a0 > a1: + a = ((8 - alphacode) * a0 + (alphacode - 1) * a1) // 7 + elif alphacode == 6: + a = 0 + elif alphacode == 7: + a = 255 + else: + a = ((6 - alphacode) * a0 + (alphacode - 1) * a1) // 5 + + color_code = (code >> 2 * (4 * j + i)) & 0x03 + + if color_code == 0: + r, g, b = r0, g0, b0 + elif color_code == 1: + r, g, b = r1, g1, b1 + elif color_code == 2: + r = (2 * r0 + r1) // 3 + g = (2 * g0 + g1) // 3 + b = (2 * b0 + b1) // 3 + elif color_code == 3: + r = (2 * r1 + r0) // 3 + g = (2 * g1 + g0) // 3 + b = (2 * b1 + b0) // 3 + + ret[j].extend([r, g, b, a]) + + return ret + + +class BLPFormatError(NotImplementedError): + pass + + +def _accept(prefix: bytes) -> bool: + return prefix[:4] in (b"BLP1", b"BLP2") + + +class BlpImageFile(ImageFile.ImageFile): + """ + Blizzard Mipmap Format + """ + + format = "BLP" + format_description = "Blizzard Mipmap Format" + + def _open(self) -> None: + self.magic = self.fp.read(4) + + self.fp.seek(5, os.SEEK_CUR) + (self._blp_alpha_depth,) = struct.unpack(" tuple[int, int]: + try: + self._read_blp_header() + self._load() + except struct.error as e: + msg = "Truncated BLP file" + raise OSError(msg) from e + return -1, 0 + + @abc.abstractmethod + def _load(self) -> None: + pass + + def _read_blp_header(self) -> None: + assert self.fd is not None + self.fd.seek(4) + (self._blp_compression,) = struct.unpack(" bytes: + assert self.fd is not None + return ImageFile._safe_read(self.fd, length) + + def _read_palette(self) -> list[tuple[int, int, int, int]]: + ret = [] + for i in range(256): + try: + b, g, r, a = struct.unpack("<4B", self._safe_read(4)) + except struct.error: + break + ret.append((b, g, r, a)) + return ret + + def _read_bgra(self, palette: list[tuple[int, int, int, int]]) -> bytearray: + data = bytearray() + _data = BytesIO(self._safe_read(self._blp_lengths[0])) + while True: + try: + (offset,) = struct.unpack(" None: + if self._blp_compression == Format.JPEG: + self._decode_jpeg_stream() + + elif self._blp_compression == 1: + if self._blp_encoding in (4, 5): + palette = self._read_palette() + data = self._read_bgra(palette) + self.set_as_raw(data) + else: + msg = f"Unsupported BLP encoding {repr(self._blp_encoding)}" + raise BLPFormatError(msg) + else: + msg = f"Unsupported BLP compression {repr(self._blp_encoding)}" + raise BLPFormatError(msg) + + def _decode_jpeg_stream(self) -> None: + from .JpegImagePlugin import JpegImageFile + + (jpeg_header_size,) = struct.unpack(" None: + palette = self._read_palette() + + assert self.fd is not None + self.fd.seek(self._blp_offsets[0]) + + if self._blp_compression == 1: + # Uncompressed or DirectX compression + + if self._blp_encoding == Encoding.UNCOMPRESSED: + data = self._read_bgra(palette) + + elif self._blp_encoding == Encoding.DXT: + data = bytearray() + if self._blp_alpha_encoding == AlphaEncoding.DXT1: + linesize = (self.size[0] + 3) // 4 * 8 + for yb in range((self.size[1] + 3) // 4): + for d in decode_dxt1( + self._safe_read(linesize), alpha=bool(self._blp_alpha_depth) + ): + data += d + + elif self._blp_alpha_encoding == AlphaEncoding.DXT3: + linesize = (self.size[0] + 3) // 4 * 16 + for yb in range((self.size[1] + 3) // 4): + for d in decode_dxt3(self._safe_read(linesize)): + data += d + + elif self._blp_alpha_encoding == AlphaEncoding.DXT5: + linesize = (self.size[0] + 3) // 4 * 16 + for yb in range((self.size[1] + 3) // 4): + for d in decode_dxt5(self._safe_read(linesize)): + data += d + else: + msg = f"Unsupported alpha encoding {repr(self._blp_alpha_encoding)}" + raise BLPFormatError(msg) + else: + msg = f"Unknown BLP encoding {repr(self._blp_encoding)}" + raise BLPFormatError(msg) + + else: + msg = f"Unknown BLP compression {repr(self._blp_compression)}" + raise BLPFormatError(msg) + + self.set_as_raw(data) + + +class BLPEncoder(ImageFile.PyEncoder): + _pushes_fd = True + + def _write_palette(self) -> bytes: + data = b"" + assert self.im is not None + palette = self.im.getpalette("RGBA", "RGBA") + for i in range(len(palette) // 4): + r, g, b, a = palette[i * 4 : (i + 1) * 4] + data += struct.pack("<4B", b, g, r, a) + while len(data) < 256 * 4: + data += b"\x00" * 4 + return data + + def encode(self, bufsize: int) -> tuple[int, int, bytes]: + palette_data = self._write_palette() + + offset = 20 + 16 * 4 * 2 + len(palette_data) + data = struct.pack("<16I", offset, *((0,) * 15)) + + assert self.im is not None + w, h = self.im.size + data += struct.pack("<16I", w * h, *((0,) * 15)) + + data += palette_data + + for y in range(h): + for x in range(w): + data += struct.pack(" None: + if im.mode != "P": + msg = "Unsupported BLP image mode" + raise ValueError(msg) + + magic = b"BLP1" if im.encoderinfo.get("blp_version") == "BLP1" else b"BLP2" + fp.write(magic) + + assert im.palette is not None + fp.write(struct.pack(" mode, rawmode + 1: ("P", "P;1"), + 4: ("P", "P;4"), + 8: ("P", "P"), + 16: ("RGB", "BGR;15"), + 24: ("RGB", "BGR"), + 32: ("RGB", "BGRX"), +} + + +def _accept(prefix: bytes) -> bool: + return prefix[:2] == b"BM" + + +def _dib_accept(prefix: bytes) -> bool: + return i32(prefix) in [12, 40, 52, 56, 64, 108, 124] + + +# ============================================================================= +# Image plugin for the Windows BMP format. +# ============================================================================= +class BmpImageFile(ImageFile.ImageFile): + """Image plugin for the Windows Bitmap format (BMP)""" + + # ------------------------------------------------------------- Description + format_description = "Windows Bitmap" + format = "BMP" + + # -------------------------------------------------- BMP Compression values + COMPRESSIONS = {"RAW": 0, "RLE8": 1, "RLE4": 2, "BITFIELDS": 3, "JPEG": 4, "PNG": 5} + for k, v in COMPRESSIONS.items(): + vars()[k] = v + + def _bitmap(self, header: int = 0, offset: int = 0) -> None: + """Read relevant info about the BMP""" + read, seek = self.fp.read, self.fp.seek + if header: + seek(header) + # read bmp header size @offset 14 (this is part of the header size) + file_info: dict[str, bool | int | tuple[int, ...]] = { + "header_size": i32(read(4)), + "direction": -1, + } + + # -------------------- If requested, read header at a specific position + # read the rest of the bmp header, without its size + assert isinstance(file_info["header_size"], int) + header_data = ImageFile._safe_read(self.fp, file_info["header_size"] - 4) + + # ------------------------------- Windows Bitmap v2, IBM OS/2 Bitmap v1 + # ----- This format has different offsets because of width/height types + # 12: BITMAPCOREHEADER/OS21XBITMAPHEADER + if file_info["header_size"] == 12: + file_info["width"] = i16(header_data, 0) + file_info["height"] = i16(header_data, 2) + file_info["planes"] = i16(header_data, 4) + file_info["bits"] = i16(header_data, 6) + file_info["compression"] = self.COMPRESSIONS["RAW"] + file_info["palette_padding"] = 3 + + # --------------------------------------------- Windows Bitmap v3 to v5 + # 40: BITMAPINFOHEADER + # 52: BITMAPV2HEADER + # 56: BITMAPV3HEADER + # 64: BITMAPCOREHEADER2/OS22XBITMAPHEADER + # 108: BITMAPV4HEADER + # 124: BITMAPV5HEADER + elif file_info["header_size"] in (40, 52, 56, 64, 108, 124): + file_info["y_flip"] = header_data[7] == 0xFF + file_info["direction"] = 1 if file_info["y_flip"] else -1 + file_info["width"] = i32(header_data, 0) + file_info["height"] = ( + i32(header_data, 4) + if not file_info["y_flip"] + else 2**32 - i32(header_data, 4) + ) + file_info["planes"] = i16(header_data, 8) + file_info["bits"] = i16(header_data, 10) + file_info["compression"] = i32(header_data, 12) + # byte size of pixel data + file_info["data_size"] = i32(header_data, 16) + file_info["pixels_per_meter"] = ( + i32(header_data, 20), + i32(header_data, 24), + ) + file_info["colors"] = i32(header_data, 28) + file_info["palette_padding"] = 4 + assert isinstance(file_info["pixels_per_meter"], tuple) + self.info["dpi"] = tuple(x / 39.3701 for x in file_info["pixels_per_meter"]) + if file_info["compression"] == self.COMPRESSIONS["BITFIELDS"]: + masks = ["r_mask", "g_mask", "b_mask"] + if len(header_data) >= 48: + if len(header_data) >= 52: + masks.append("a_mask") + else: + file_info["a_mask"] = 0x0 + for idx, mask in enumerate(masks): + file_info[mask] = i32(header_data, 36 + idx * 4) + else: + # 40 byte headers only have the three components in the + # bitfields masks, ref: + # https://msdn.microsoft.com/en-us/library/windows/desktop/dd183376(v=vs.85).aspx + # See also + # https://github.com/python-pillow/Pillow/issues/1293 + # There is a 4th component in the RGBQuad, in the alpha + # location, but it is listed as a reserved component, + # and it is not generally an alpha channel + file_info["a_mask"] = 0x0 + for mask in masks: + file_info[mask] = i32(read(4)) + assert isinstance(file_info["r_mask"], int) + assert isinstance(file_info["g_mask"], int) + assert isinstance(file_info["b_mask"], int) + assert isinstance(file_info["a_mask"], int) + file_info["rgb_mask"] = ( + file_info["r_mask"], + file_info["g_mask"], + file_info["b_mask"], + ) + file_info["rgba_mask"] = ( + file_info["r_mask"], + file_info["g_mask"], + file_info["b_mask"], + file_info["a_mask"], + ) + else: + msg = f"Unsupported BMP header type ({file_info['header_size']})" + raise OSError(msg) + + # ------------------ Special case : header is reported 40, which + # ---------------------- is shorter than real size for bpp >= 16 + assert isinstance(file_info["width"], int) + assert isinstance(file_info["height"], int) + self._size = file_info["width"], file_info["height"] + + # ------- If color count was not found in the header, compute from bits + assert isinstance(file_info["bits"], int) + file_info["colors"] = ( + file_info["colors"] + if file_info.get("colors", 0) + else (1 << file_info["bits"]) + ) + assert isinstance(file_info["colors"], int) + if offset == 14 + file_info["header_size"] and file_info["bits"] <= 8: + offset += 4 * file_info["colors"] + + # ---------------------- Check bit depth for unusual unsupported values + self._mode, raw_mode = BIT2MODE.get(file_info["bits"], ("", "")) + if not self.mode: + msg = f"Unsupported BMP pixel depth ({file_info['bits']})" + raise OSError(msg) + + # ---------------- Process BMP with Bitfields compression (not palette) + decoder_name = "raw" + if file_info["compression"] == self.COMPRESSIONS["BITFIELDS"]: + SUPPORTED: dict[int, list[tuple[int, ...]]] = { + 32: [ + (0xFF0000, 0xFF00, 0xFF, 0x0), + (0xFF000000, 0xFF0000, 0xFF00, 0x0), + (0xFF000000, 0xFF00, 0xFF, 0x0), + (0xFF000000, 0xFF0000, 0xFF00, 0xFF), + (0xFF, 0xFF00, 0xFF0000, 0xFF000000), + (0xFF0000, 0xFF00, 0xFF, 0xFF000000), + (0xFF000000, 0xFF00, 0xFF, 0xFF0000), + (0x0, 0x0, 0x0, 0x0), + ], + 24: [(0xFF0000, 0xFF00, 0xFF)], + 16: [(0xF800, 0x7E0, 0x1F), (0x7C00, 0x3E0, 0x1F)], + } + MASK_MODES = { + (32, (0xFF0000, 0xFF00, 0xFF, 0x0)): "BGRX", + (32, (0xFF000000, 0xFF0000, 0xFF00, 0x0)): "XBGR", + (32, (0xFF000000, 0xFF00, 0xFF, 0x0)): "BGXR", + (32, (0xFF000000, 0xFF0000, 0xFF00, 0xFF)): "ABGR", + (32, (0xFF, 0xFF00, 0xFF0000, 0xFF000000)): "RGBA", + (32, (0xFF0000, 0xFF00, 0xFF, 0xFF000000)): "BGRA", + (32, (0xFF000000, 0xFF00, 0xFF, 0xFF0000)): "BGAR", + (32, (0x0, 0x0, 0x0, 0x0)): "BGRA", + (24, (0xFF0000, 0xFF00, 0xFF)): "BGR", + (16, (0xF800, 0x7E0, 0x1F)): "BGR;16", + (16, (0x7C00, 0x3E0, 0x1F)): "BGR;15", + } + if file_info["bits"] in SUPPORTED: + if ( + file_info["bits"] == 32 + and file_info["rgba_mask"] in SUPPORTED[file_info["bits"]] + ): + assert isinstance(file_info["rgba_mask"], tuple) + raw_mode = MASK_MODES[(file_info["bits"], file_info["rgba_mask"])] + self._mode = "RGBA" if "A" in raw_mode else self.mode + elif ( + file_info["bits"] in (24, 16) + and file_info["rgb_mask"] in SUPPORTED[file_info["bits"]] + ): + assert isinstance(file_info["rgb_mask"], tuple) + raw_mode = MASK_MODES[(file_info["bits"], file_info["rgb_mask"])] + else: + msg = "Unsupported BMP bitfields layout" + raise OSError(msg) + else: + msg = "Unsupported BMP bitfields layout" + raise OSError(msg) + elif file_info["compression"] == self.COMPRESSIONS["RAW"]: + if file_info["bits"] == 32 and header == 22: # 32-bit .cur offset + raw_mode, self._mode = "BGRA", "RGBA" + elif file_info["compression"] in ( + self.COMPRESSIONS["RLE8"], + self.COMPRESSIONS["RLE4"], + ): + decoder_name = "bmp_rle" + else: + msg = f"Unsupported BMP compression ({file_info['compression']})" + raise OSError(msg) + + # --------------- Once the header is processed, process the palette/LUT + if self.mode == "P": # Paletted for 1, 4 and 8 bit images + # ---------------------------------------------------- 1-bit images + if not (0 < file_info["colors"] <= 65536): + msg = f"Unsupported BMP Palette size ({file_info['colors']})" + raise OSError(msg) + else: + assert isinstance(file_info["palette_padding"], int) + padding = file_info["palette_padding"] + palette = read(padding * file_info["colors"]) + grayscale = True + indices = ( + (0, 255) + if file_info["colors"] == 2 + else list(range(file_info["colors"])) + ) + + # ----------------- Check if grayscale and ignore palette if so + for ind, val in enumerate(indices): + rgb = palette[ind * padding : ind * padding + 3] + if rgb != o8(val) * 3: + grayscale = False + + # ------- If all colors are gray, white or black, ditch palette + if grayscale: + self._mode = "1" if file_info["colors"] == 2 else "L" + raw_mode = self.mode + else: + self._mode = "P" + self.palette = ImagePalette.raw( + "BGRX" if padding == 4 else "BGR", palette + ) + + # ---------------------------- Finally set the tile data for the plugin + self.info["compression"] = file_info["compression"] + args: list[Any] = [raw_mode] + if decoder_name == "bmp_rle": + args.append(file_info["compression"] == self.COMPRESSIONS["RLE4"]) + else: + assert isinstance(file_info["width"], int) + args.append(((file_info["width"] * file_info["bits"] + 31) >> 3) & (~3)) + args.append(file_info["direction"]) + self.tile = [ + ImageFile._Tile( + decoder_name, + (0, 0, file_info["width"], file_info["height"]), + offset or self.fp.tell(), + tuple(args), + ) + ] + + def _open(self) -> None: + """Open file, check magic number and read header""" + # read 14 bytes: magic number, filesize, reserved, header final offset + head_data = self.fp.read(14) + # choke if the file does not have the required magic bytes + if not _accept(head_data): + msg = "Not a BMP file" + raise SyntaxError(msg) + # read the start position of the BMP image data (u32) + offset = i32(head_data, 10) + # load bitmap information (offset=raster info) + self._bitmap(offset=offset) + + +class BmpRleDecoder(ImageFile.PyDecoder): + _pulls_fd = True + + def decode(self, buffer: bytes | Image.SupportsArrayInterface) -> tuple[int, int]: + assert self.fd is not None + rle4 = self.args[1] + data = bytearray() + x = 0 + dest_length = self.state.xsize * self.state.ysize + while len(data) < dest_length: + pixels = self.fd.read(1) + byte = self.fd.read(1) + if not pixels or not byte: + break + num_pixels = pixels[0] + if num_pixels: + # encoded mode + if x + num_pixels > self.state.xsize: + # Too much data for row + num_pixels = max(0, self.state.xsize - x) + if rle4: + first_pixel = o8(byte[0] >> 4) + second_pixel = o8(byte[0] & 0x0F) + for index in range(num_pixels): + if index % 2 == 0: + data += first_pixel + else: + data += second_pixel + else: + data += byte * num_pixels + x += num_pixels + else: + if byte[0] == 0: + # end of line + while len(data) % self.state.xsize != 0: + data += b"\x00" + x = 0 + elif byte[0] == 1: + # end of bitmap + break + elif byte[0] == 2: + # delta + bytes_read = self.fd.read(2) + if len(bytes_read) < 2: + break + right, up = self.fd.read(2) + data += b"\x00" * (right + up * self.state.xsize) + x = len(data) % self.state.xsize + else: + # absolute mode + if rle4: + # 2 pixels per byte + byte_count = byte[0] // 2 + bytes_read = self.fd.read(byte_count) + for byte_read in bytes_read: + data += o8(byte_read >> 4) + data += o8(byte_read & 0x0F) + else: + byte_count = byte[0] + bytes_read = self.fd.read(byte_count) + data += bytes_read + if len(bytes_read) < byte_count: + break + x += byte[0] + + # align to 16-bit word boundary + if self.fd.tell() % 2 != 0: + self.fd.seek(1, os.SEEK_CUR) + rawmode = "L" if self.mode == "L" else "P" + self.set_as_raw(bytes(data), rawmode, (0, self.args[-1])) + return -1, 0 + + +# ============================================================================= +# Image plugin for the DIB format (BMP alias) +# ============================================================================= +class DibImageFile(BmpImageFile): + format = "DIB" + format_description = "Windows Bitmap" + + def _open(self) -> None: + self._bitmap() + + +# +# -------------------------------------------------------------------- +# Write BMP file + + +SAVE = { + "1": ("1", 1, 2), + "L": ("L", 8, 256), + "P": ("P", 8, 256), + "RGB": ("BGR", 24, 0), + "RGBA": ("BGRA", 32, 0), +} + + +def _dib_save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + _save(im, fp, filename, False) + + +def _save( + im: Image.Image, fp: IO[bytes], filename: str | bytes, bitmap_header: bool = True +) -> None: + try: + rawmode, bits, colors = SAVE[im.mode] + except KeyError as e: + msg = f"cannot write mode {im.mode} as BMP" + raise OSError(msg) from e + + info = im.encoderinfo + + dpi = info.get("dpi", (96, 96)) + + # 1 meter == 39.3701 inches + ppm = tuple(int(x * 39.3701 + 0.5) for x in dpi) + + stride = ((im.size[0] * bits + 7) // 8 + 3) & (~3) + header = 40 # or 64 for OS/2 version 2 + image = stride * im.size[1] + + if im.mode == "1": + palette = b"".join(o8(i) * 4 for i in (0, 255)) + elif im.mode == "L": + palette = b"".join(o8(i) * 4 for i in range(256)) + elif im.mode == "P": + palette = im.im.getpalette("RGB", "BGRX") + colors = len(palette) // 4 + else: + palette = None + + # bitmap header + if bitmap_header: + offset = 14 + header + colors * 4 + file_size = offset + image + if file_size > 2**32 - 1: + msg = "File size is too large for the BMP format" + raise ValueError(msg) + fp.write( + b"BM" # file type (magic) + + o32(file_size) # file size + + o32(0) # reserved + + o32(offset) # image data offset + ) + + # bitmap info header + fp.write( + o32(header) # info header size + + o32(im.size[0]) # width + + o32(im.size[1]) # height + + o16(1) # planes + + o16(bits) # depth + + o32(0) # compression (0=uncompressed) + + o32(image) # size of bitmap + + o32(ppm[0]) # resolution + + o32(ppm[1]) # resolution + + o32(colors) # colors used + + o32(colors) # colors important + ) + + fp.write(b"\0" * (header - 40)) # padding (for OS/2 format) + + if palette: + fp.write(palette) + + ImageFile._save( + im, fp, [ImageFile._Tile("raw", (0, 0) + im.size, 0, (rawmode, stride, -1))] + ) + + +# +# -------------------------------------------------------------------- +# Registry + + +Image.register_open(BmpImageFile.format, BmpImageFile, _accept) +Image.register_save(BmpImageFile.format, _save) + +Image.register_extension(BmpImageFile.format, ".bmp") + +Image.register_mime(BmpImageFile.format, "image/bmp") + +Image.register_decoder("bmp_rle", BmpRleDecoder) + +Image.register_open(DibImageFile.format, DibImageFile, _dib_accept) +Image.register_save(DibImageFile.format, _dib_save) + +Image.register_extension(DibImageFile.format, ".dib") + +Image.register_mime(DibImageFile.format, "image/bmp") diff --git a/venv/lib/python3.12/site-packages/PIL/BufrStubImagePlugin.py b/venv/lib/python3.12/site-packages/PIL/BufrStubImagePlugin.py new file mode 100644 index 0000000..0ee2f65 --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/BufrStubImagePlugin.py @@ -0,0 +1,76 @@ +# +# The Python Imaging Library +# $Id$ +# +# BUFR stub adapter +# +# Copyright (c) 1996-2003 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +from typing import IO + +from . import Image, ImageFile + +_handler = None + + +def register_handler(handler: ImageFile.StubHandler | None) -> None: + """ + Install application-specific BUFR image handler. + + :param handler: Handler object. + """ + global _handler + _handler = handler + + +# -------------------------------------------------------------------- +# Image adapter + + +def _accept(prefix: bytes) -> bool: + return prefix[:4] == b"BUFR" or prefix[:4] == b"ZCZC" + + +class BufrStubImageFile(ImageFile.StubImageFile): + format = "BUFR" + format_description = "BUFR" + + def _open(self) -> None: + offset = self.fp.tell() + + if not _accept(self.fp.read(4)): + msg = "Not a BUFR file" + raise SyntaxError(msg) + + self.fp.seek(offset) + + # make something up + self._mode = "F" + self._size = 1, 1 + + loader = self._load() + if loader: + loader.open(self) + + def _load(self) -> ImageFile.StubHandler | None: + return _handler + + +def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + if _handler is None or not hasattr(_handler, "save"): + msg = "BUFR save handler not installed" + raise OSError(msg) + _handler.save(im, fp, filename) + + +# -------------------------------------------------------------------- +# Registry + +Image.register_open(BufrStubImageFile.format, BufrStubImageFile, _accept) +Image.register_save(BufrStubImageFile.format, _save) + +Image.register_extension(BufrStubImageFile.format, ".bufr") diff --git a/venv/lib/python3.12/site-packages/PIL/ContainerIO.py b/venv/lib/python3.12/site-packages/PIL/ContainerIO.py new file mode 100644 index 0000000..ec9e66c --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/ContainerIO.py @@ -0,0 +1,173 @@ +# +# The Python Imaging Library. +# $Id$ +# +# a class to read from a container file +# +# History: +# 1995-06-18 fl Created +# 1995-09-07 fl Added readline(), readlines() +# +# Copyright (c) 1997-2001 by Secret Labs AB +# Copyright (c) 1995 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import io +from collections.abc import Iterable +from typing import IO, AnyStr, NoReturn + + +class ContainerIO(IO[AnyStr]): + """ + A file object that provides read access to a part of an existing + file (for example a TAR file). + """ + + def __init__(self, file: IO[AnyStr], offset: int, length: int) -> None: + """ + Create file object. + + :param file: Existing file. + :param offset: Start of region, in bytes. + :param length: Size of region, in bytes. + """ + self.fh: IO[AnyStr] = file + self.pos = 0 + self.offset = offset + self.length = length + self.fh.seek(offset) + + ## + # Always false. + + def isatty(self) -> bool: + return False + + def seekable(self) -> bool: + return True + + def seek(self, offset: int, mode: int = io.SEEK_SET) -> int: + """ + Move file pointer. + + :param offset: Offset in bytes. + :param mode: Starting position. Use 0 for beginning of region, 1 + for current offset, and 2 for end of region. You cannot move + the pointer outside the defined region. + :returns: Offset from start of region, in bytes. + """ + if mode == 1: + self.pos = self.pos + offset + elif mode == 2: + self.pos = self.length + offset + else: + self.pos = offset + # clamp + self.pos = max(0, min(self.pos, self.length)) + self.fh.seek(self.offset + self.pos) + return self.pos + + def tell(self) -> int: + """ + Get current file pointer. + + :returns: Offset from start of region, in bytes. + """ + return self.pos + + def readable(self) -> bool: + return True + + def read(self, n: int = -1) -> AnyStr: + """ + Read data. + + :param n: Number of bytes to read. If omitted, zero or negative, + read until end of region. + :returns: An 8-bit string. + """ + if n > 0: + n = min(n, self.length - self.pos) + else: + n = self.length - self.pos + if n <= 0: # EOF + return b"" if "b" in self.fh.mode else "" # type: ignore[return-value] + self.pos = self.pos + n + return self.fh.read(n) + + def readline(self, n: int = -1) -> AnyStr: + """ + Read a line of text. + + :param n: Number of bytes to read. If omitted, zero or negative, + read until end of line. + :returns: An 8-bit string. + """ + s: AnyStr = b"" if "b" in self.fh.mode else "" # type: ignore[assignment] + newline_character = b"\n" if "b" in self.fh.mode else "\n" + while True: + c = self.read(1) + if not c: + break + s = s + c + if c == newline_character or len(s) == n: + break + return s + + def readlines(self, n: int | None = -1) -> list[AnyStr]: + """ + Read multiple lines of text. + + :param n: Number of lines to read. If omitted, zero, negative or None, + read until end of region. + :returns: A list of 8-bit strings. + """ + lines = [] + while True: + s = self.readline() + if not s: + break + lines.append(s) + if len(lines) == n: + break + return lines + + def writable(self) -> bool: + return False + + def write(self, b: AnyStr) -> NoReturn: + raise NotImplementedError() + + def writelines(self, lines: Iterable[AnyStr]) -> NoReturn: + raise NotImplementedError() + + def truncate(self, size: int | None = None) -> int: + raise NotImplementedError() + + def __enter__(self) -> ContainerIO[AnyStr]: + return self + + def __exit__(self, *args: object) -> None: + self.close() + + def __iter__(self) -> ContainerIO[AnyStr]: + return self + + def __next__(self) -> AnyStr: + line = self.readline() + if not line: + msg = "end of region" + raise StopIteration(msg) + return line + + def fileno(self) -> int: + return self.fh.fileno() + + def flush(self) -> None: + self.fh.flush() + + def close(self) -> None: + self.fh.close() diff --git a/venv/lib/python3.12/site-packages/PIL/CurImagePlugin.py b/venv/lib/python3.12/site-packages/PIL/CurImagePlugin.py new file mode 100644 index 0000000..c4be0ce --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/CurImagePlugin.py @@ -0,0 +1,75 @@ +# +# The Python Imaging Library. +# $Id$ +# +# Windows Cursor support for PIL +# +# notes: +# uses BmpImagePlugin.py to read the bitmap data. +# +# history: +# 96-05-27 fl Created +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1996. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +from . import BmpImagePlugin, Image, ImageFile +from ._binary import i16le as i16 +from ._binary import i32le as i32 + +# +# -------------------------------------------------------------------- + + +def _accept(prefix: bytes) -> bool: + return prefix[:4] == b"\0\0\2\0" + + +## +# Image plugin for Windows Cursor files. + + +class CurImageFile(BmpImagePlugin.BmpImageFile): + format = "CUR" + format_description = "Windows Cursor" + + def _open(self) -> None: + offset = self.fp.tell() + + # check magic + s = self.fp.read(6) + if not _accept(s): + msg = "not a CUR file" + raise SyntaxError(msg) + + # pick the largest cursor in the file + m = b"" + for i in range(i16(s, 4)): + s = self.fp.read(16) + if not m: + m = s + elif s[0] > m[0] and s[1] > m[1]: + m = s + if not m: + msg = "No cursors were found" + raise TypeError(msg) + + # load as bitmap + self._bitmap(i32(m, 12) + offset) + + # patch up the bitmap height + self._size = self.size[0], self.size[1] // 2 + d, e, o, a = self.tile[0] + self.tile[0] = ImageFile._Tile(d, (0, 0) + self.size, o, a) + + +# +# -------------------------------------------------------------------- + +Image.register_open(CurImageFile.format, CurImageFile, _accept) + +Image.register_extension(CurImageFile.format, ".cur") diff --git a/venv/lib/python3.12/site-packages/PIL/DcxImagePlugin.py b/venv/lib/python3.12/site-packages/PIL/DcxImagePlugin.py new file mode 100644 index 0000000..f67f27d --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/DcxImagePlugin.py @@ -0,0 +1,80 @@ +# +# The Python Imaging Library. +# $Id$ +# +# DCX file handling +# +# DCX is a container file format defined by Intel, commonly used +# for fax applications. Each DCX file consists of a directory +# (a list of file offsets) followed by a set of (usually 1-bit) +# PCX files. +# +# History: +# 1995-09-09 fl Created +# 1996-03-20 fl Properly derived from PcxImageFile. +# 1998-07-15 fl Renamed offset attribute to avoid name clash +# 2002-07-30 fl Fixed file handling +# +# Copyright (c) 1997-98 by Secret Labs AB. +# Copyright (c) 1995-96 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +from . import Image +from ._binary import i32le as i32 +from .PcxImagePlugin import PcxImageFile + +MAGIC = 0x3ADE68B1 # QUIZ: what's this value, then? + + +def _accept(prefix: bytes) -> bool: + return len(prefix) >= 4 and i32(prefix) == MAGIC + + +## +# Image plugin for the Intel DCX format. + + +class DcxImageFile(PcxImageFile): + format = "DCX" + format_description = "Intel DCX" + _close_exclusive_fp_after_loading = False + + def _open(self) -> None: + # Header + s = self.fp.read(4) + if not _accept(s): + msg = "not a DCX file" + raise SyntaxError(msg) + + # Component directory + self._offset = [] + for i in range(1024): + offset = i32(self.fp.read(4)) + if not offset: + break + self._offset.append(offset) + + self._fp = self.fp + self.frame = -1 + self.n_frames = len(self._offset) + self.is_animated = self.n_frames > 1 + self.seek(0) + + def seek(self, frame: int) -> None: + if not self._seek_check(frame): + return + self.frame = frame + self.fp = self._fp + self.fp.seek(self._offset[frame]) + PcxImageFile._open(self) + + def tell(self) -> int: + return self.frame + + +Image.register_open(DcxImageFile.format, DcxImageFile, _accept) + +Image.register_extension(DcxImageFile.format, ".dcx") diff --git a/venv/lib/python3.12/site-packages/PIL/DdsImagePlugin.py b/venv/lib/python3.12/site-packages/PIL/DdsImagePlugin.py new file mode 100644 index 0000000..1b64082 --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/DdsImagePlugin.py @@ -0,0 +1,575 @@ +""" +A Pillow loader for .dds files (S3TC-compressed aka DXTC) +Jerome Leclanche + +Documentation: +https://web.archive.org/web/20170802060935/http://oss.sgi.com/projects/ogl-sample/registry/EXT/texture_compression_s3tc.txt + +The contents of this file are hereby released in the public domain (CC0) +Full text of the CC0 license: +https://creativecommons.org/publicdomain/zero/1.0/ +""" + +from __future__ import annotations + +import io +import struct +import sys +from enum import IntEnum, IntFlag +from typing import IO + +from . import Image, ImageFile, ImagePalette +from ._binary import i32le as i32 +from ._binary import o8 +from ._binary import o32le as o32 + +# Magic ("DDS ") +DDS_MAGIC = 0x20534444 + + +# DDS flags +class DDSD(IntFlag): + CAPS = 0x1 + HEIGHT = 0x2 + WIDTH = 0x4 + PITCH = 0x8 + PIXELFORMAT = 0x1000 + MIPMAPCOUNT = 0x20000 + LINEARSIZE = 0x80000 + DEPTH = 0x800000 + + +# DDS caps +class DDSCAPS(IntFlag): + COMPLEX = 0x8 + TEXTURE = 0x1000 + MIPMAP = 0x400000 + + +class DDSCAPS2(IntFlag): + CUBEMAP = 0x200 + CUBEMAP_POSITIVEX = 0x400 + CUBEMAP_NEGATIVEX = 0x800 + CUBEMAP_POSITIVEY = 0x1000 + CUBEMAP_NEGATIVEY = 0x2000 + CUBEMAP_POSITIVEZ = 0x4000 + CUBEMAP_NEGATIVEZ = 0x8000 + VOLUME = 0x200000 + + +# Pixel Format +class DDPF(IntFlag): + ALPHAPIXELS = 0x1 + ALPHA = 0x2 + FOURCC = 0x4 + PALETTEINDEXED8 = 0x20 + RGB = 0x40 + LUMINANCE = 0x20000 + + +# dxgiformat.h +class DXGI_FORMAT(IntEnum): + UNKNOWN = 0 + R32G32B32A32_TYPELESS = 1 + R32G32B32A32_FLOAT = 2 + R32G32B32A32_UINT = 3 + R32G32B32A32_SINT = 4 + R32G32B32_TYPELESS = 5 + R32G32B32_FLOAT = 6 + R32G32B32_UINT = 7 + R32G32B32_SINT = 8 + R16G16B16A16_TYPELESS = 9 + R16G16B16A16_FLOAT = 10 + R16G16B16A16_UNORM = 11 + R16G16B16A16_UINT = 12 + R16G16B16A16_SNORM = 13 + R16G16B16A16_SINT = 14 + R32G32_TYPELESS = 15 + R32G32_FLOAT = 16 + R32G32_UINT = 17 + R32G32_SINT = 18 + R32G8X24_TYPELESS = 19 + D32_FLOAT_S8X24_UINT = 20 + R32_FLOAT_X8X24_TYPELESS = 21 + X32_TYPELESS_G8X24_UINT = 22 + R10G10B10A2_TYPELESS = 23 + R10G10B10A2_UNORM = 24 + R10G10B10A2_UINT = 25 + R11G11B10_FLOAT = 26 + R8G8B8A8_TYPELESS = 27 + R8G8B8A8_UNORM = 28 + R8G8B8A8_UNORM_SRGB = 29 + R8G8B8A8_UINT = 30 + R8G8B8A8_SNORM = 31 + R8G8B8A8_SINT = 32 + R16G16_TYPELESS = 33 + R16G16_FLOAT = 34 + R16G16_UNORM = 35 + R16G16_UINT = 36 + R16G16_SNORM = 37 + R16G16_SINT = 38 + R32_TYPELESS = 39 + D32_FLOAT = 40 + R32_FLOAT = 41 + R32_UINT = 42 + R32_SINT = 43 + R24G8_TYPELESS = 44 + D24_UNORM_S8_UINT = 45 + R24_UNORM_X8_TYPELESS = 46 + X24_TYPELESS_G8_UINT = 47 + R8G8_TYPELESS = 48 + R8G8_UNORM = 49 + R8G8_UINT = 50 + R8G8_SNORM = 51 + R8G8_SINT = 52 + R16_TYPELESS = 53 + R16_FLOAT = 54 + D16_UNORM = 55 + R16_UNORM = 56 + R16_UINT = 57 + R16_SNORM = 58 + R16_SINT = 59 + R8_TYPELESS = 60 + R8_UNORM = 61 + R8_UINT = 62 + R8_SNORM = 63 + R8_SINT = 64 + A8_UNORM = 65 + R1_UNORM = 66 + R9G9B9E5_SHAREDEXP = 67 + R8G8_B8G8_UNORM = 68 + G8R8_G8B8_UNORM = 69 + BC1_TYPELESS = 70 + BC1_UNORM = 71 + BC1_UNORM_SRGB = 72 + BC2_TYPELESS = 73 + BC2_UNORM = 74 + BC2_UNORM_SRGB = 75 + BC3_TYPELESS = 76 + BC3_UNORM = 77 + BC3_UNORM_SRGB = 78 + BC4_TYPELESS = 79 + BC4_UNORM = 80 + BC4_SNORM = 81 + BC5_TYPELESS = 82 + BC5_UNORM = 83 + BC5_SNORM = 84 + B5G6R5_UNORM = 85 + B5G5R5A1_UNORM = 86 + B8G8R8A8_UNORM = 87 + B8G8R8X8_UNORM = 88 + R10G10B10_XR_BIAS_A2_UNORM = 89 + B8G8R8A8_TYPELESS = 90 + B8G8R8A8_UNORM_SRGB = 91 + B8G8R8X8_TYPELESS = 92 + B8G8R8X8_UNORM_SRGB = 93 + BC6H_TYPELESS = 94 + BC6H_UF16 = 95 + BC6H_SF16 = 96 + BC7_TYPELESS = 97 + BC7_UNORM = 98 + BC7_UNORM_SRGB = 99 + AYUV = 100 + Y410 = 101 + Y416 = 102 + NV12 = 103 + P010 = 104 + P016 = 105 + OPAQUE_420 = 106 + YUY2 = 107 + Y210 = 108 + Y216 = 109 + NV11 = 110 + AI44 = 111 + IA44 = 112 + P8 = 113 + A8P8 = 114 + B4G4R4A4_UNORM = 115 + P208 = 130 + V208 = 131 + V408 = 132 + SAMPLER_FEEDBACK_MIN_MIP_OPAQUE = 189 + SAMPLER_FEEDBACK_MIP_REGION_USED_OPAQUE = 190 + + +class D3DFMT(IntEnum): + UNKNOWN = 0 + R8G8B8 = 20 + A8R8G8B8 = 21 + X8R8G8B8 = 22 + R5G6B5 = 23 + X1R5G5B5 = 24 + A1R5G5B5 = 25 + A4R4G4B4 = 26 + R3G3B2 = 27 + A8 = 28 + A8R3G3B2 = 29 + X4R4G4B4 = 30 + A2B10G10R10 = 31 + A8B8G8R8 = 32 + X8B8G8R8 = 33 + G16R16 = 34 + A2R10G10B10 = 35 + A16B16G16R16 = 36 + A8P8 = 40 + P8 = 41 + L8 = 50 + A8L8 = 51 + A4L4 = 52 + V8U8 = 60 + L6V5U5 = 61 + X8L8V8U8 = 62 + Q8W8V8U8 = 63 + V16U16 = 64 + A2W10V10U10 = 67 + D16_LOCKABLE = 70 + D32 = 71 + D15S1 = 73 + D24S8 = 75 + D24X8 = 77 + D24X4S4 = 79 + D16 = 80 + D32F_LOCKABLE = 82 + D24FS8 = 83 + D32_LOCKABLE = 84 + S8_LOCKABLE = 85 + L16 = 81 + VERTEXDATA = 100 + INDEX16 = 101 + INDEX32 = 102 + Q16W16V16U16 = 110 + R16F = 111 + G16R16F = 112 + A16B16G16R16F = 113 + R32F = 114 + G32R32F = 115 + A32B32G32R32F = 116 + CxV8U8 = 117 + A1 = 118 + A2B10G10R10_XR_BIAS = 119 + BINARYBUFFER = 199 + + UYVY = i32(b"UYVY") + R8G8_B8G8 = i32(b"RGBG") + YUY2 = i32(b"YUY2") + G8R8_G8B8 = i32(b"GRGB") + DXT1 = i32(b"DXT1") + DXT2 = i32(b"DXT2") + DXT3 = i32(b"DXT3") + DXT4 = i32(b"DXT4") + DXT5 = i32(b"DXT5") + DX10 = i32(b"DX10") + BC4S = i32(b"BC4S") + BC4U = i32(b"BC4U") + BC5S = i32(b"BC5S") + BC5U = i32(b"BC5U") + ATI1 = i32(b"ATI1") + ATI2 = i32(b"ATI2") + MULTI2_ARGB8 = i32(b"MET1") + + +# Backward compatibility layer +module = sys.modules[__name__] +for item in DDSD: + assert item.name is not None + setattr(module, f"DDSD_{item.name}", item.value) +for item1 in DDSCAPS: + assert item1.name is not None + setattr(module, f"DDSCAPS_{item1.name}", item1.value) +for item2 in DDSCAPS2: + assert item2.name is not None + setattr(module, f"DDSCAPS2_{item2.name}", item2.value) +for item3 in DDPF: + assert item3.name is not None + setattr(module, f"DDPF_{item3.name}", item3.value) + +DDS_FOURCC = DDPF.FOURCC +DDS_RGB = DDPF.RGB +DDS_RGBA = DDPF.RGB | DDPF.ALPHAPIXELS +DDS_LUMINANCE = DDPF.LUMINANCE +DDS_LUMINANCEA = DDPF.LUMINANCE | DDPF.ALPHAPIXELS +DDS_ALPHA = DDPF.ALPHA +DDS_PAL8 = DDPF.PALETTEINDEXED8 + +DDS_HEADER_FLAGS_TEXTURE = DDSD.CAPS | DDSD.HEIGHT | DDSD.WIDTH | DDSD.PIXELFORMAT +DDS_HEADER_FLAGS_MIPMAP = DDSD.MIPMAPCOUNT +DDS_HEADER_FLAGS_VOLUME = DDSD.DEPTH +DDS_HEADER_FLAGS_PITCH = DDSD.PITCH +DDS_HEADER_FLAGS_LINEARSIZE = DDSD.LINEARSIZE + +DDS_HEIGHT = DDSD.HEIGHT +DDS_WIDTH = DDSD.WIDTH + +DDS_SURFACE_FLAGS_TEXTURE = DDSCAPS.TEXTURE +DDS_SURFACE_FLAGS_MIPMAP = DDSCAPS.COMPLEX | DDSCAPS.MIPMAP +DDS_SURFACE_FLAGS_CUBEMAP = DDSCAPS.COMPLEX + +DDS_CUBEMAP_POSITIVEX = DDSCAPS2.CUBEMAP | DDSCAPS2.CUBEMAP_POSITIVEX +DDS_CUBEMAP_NEGATIVEX = DDSCAPS2.CUBEMAP | DDSCAPS2.CUBEMAP_NEGATIVEX +DDS_CUBEMAP_POSITIVEY = DDSCAPS2.CUBEMAP | DDSCAPS2.CUBEMAP_POSITIVEY +DDS_CUBEMAP_NEGATIVEY = DDSCAPS2.CUBEMAP | DDSCAPS2.CUBEMAP_NEGATIVEY +DDS_CUBEMAP_POSITIVEZ = DDSCAPS2.CUBEMAP | DDSCAPS2.CUBEMAP_POSITIVEZ +DDS_CUBEMAP_NEGATIVEZ = DDSCAPS2.CUBEMAP | DDSCAPS2.CUBEMAP_NEGATIVEZ + +DXT1_FOURCC = D3DFMT.DXT1 +DXT3_FOURCC = D3DFMT.DXT3 +DXT5_FOURCC = D3DFMT.DXT5 + +DXGI_FORMAT_R8G8B8A8_TYPELESS = DXGI_FORMAT.R8G8B8A8_TYPELESS +DXGI_FORMAT_R8G8B8A8_UNORM = DXGI_FORMAT.R8G8B8A8_UNORM +DXGI_FORMAT_R8G8B8A8_UNORM_SRGB = DXGI_FORMAT.R8G8B8A8_UNORM_SRGB +DXGI_FORMAT_BC5_TYPELESS = DXGI_FORMAT.BC5_TYPELESS +DXGI_FORMAT_BC5_UNORM = DXGI_FORMAT.BC5_UNORM +DXGI_FORMAT_BC5_SNORM = DXGI_FORMAT.BC5_SNORM +DXGI_FORMAT_BC6H_UF16 = DXGI_FORMAT.BC6H_UF16 +DXGI_FORMAT_BC6H_SF16 = DXGI_FORMAT.BC6H_SF16 +DXGI_FORMAT_BC7_TYPELESS = DXGI_FORMAT.BC7_TYPELESS +DXGI_FORMAT_BC7_UNORM = DXGI_FORMAT.BC7_UNORM +DXGI_FORMAT_BC7_UNORM_SRGB = DXGI_FORMAT.BC7_UNORM_SRGB + + +class DdsImageFile(ImageFile.ImageFile): + format = "DDS" + format_description = "DirectDraw Surface" + + def _open(self) -> None: + if not _accept(self.fp.read(4)): + msg = "not a DDS file" + raise SyntaxError(msg) + (header_size,) = struct.unpack(" None: + pass + + +class DdsRgbDecoder(ImageFile.PyDecoder): + _pulls_fd = True + + def decode(self, buffer: bytes | Image.SupportsArrayInterface) -> tuple[int, int]: + assert self.fd is not None + bitcount, masks = self.args + + # Some masks will be padded with zeros, e.g. R 0b11 G 0b1100 + # Calculate how many zeros each mask is padded with + mask_offsets = [] + # And the maximum value of each channel without the padding + mask_totals = [] + for mask in masks: + offset = 0 + if mask != 0: + while mask >> (offset + 1) << (offset + 1) == mask: + offset += 1 + mask_offsets.append(offset) + mask_totals.append(mask >> offset) + + data = bytearray() + bytecount = bitcount // 8 + dest_length = self.state.xsize * self.state.ysize * len(masks) + while len(data) < dest_length: + value = int.from_bytes(self.fd.read(bytecount), "little") + for i, mask in enumerate(masks): + masked_value = value & mask + # Remove the zero padding, and scale it to 8 bits + data += o8( + int(((masked_value >> mask_offsets[i]) / mask_totals[i]) * 255) + ) + self.set_as_raw(data) + return -1, 0 + + +def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + if im.mode not in ("RGB", "RGBA", "L", "LA"): + msg = f"cannot write mode {im.mode} as DDS" + raise OSError(msg) + + alpha = im.mode[-1] == "A" + if im.mode[0] == "L": + pixel_flags = DDPF.LUMINANCE + rawmode = im.mode + if alpha: + rgba_mask = [0x000000FF, 0x000000FF, 0x000000FF] + else: + rgba_mask = [0xFF000000, 0xFF000000, 0xFF000000] + else: + pixel_flags = DDPF.RGB + rawmode = im.mode[::-1] + rgba_mask = [0x00FF0000, 0x0000FF00, 0x000000FF] + + if alpha: + r, g, b, a = im.split() + im = Image.merge("RGBA", (a, r, g, b)) + if alpha: + pixel_flags |= DDPF.ALPHAPIXELS + rgba_mask.append(0xFF000000 if alpha else 0) + + flags = DDSD.CAPS | DDSD.HEIGHT | DDSD.WIDTH | DDSD.PITCH | DDSD.PIXELFORMAT + bitcount = len(im.getbands()) * 8 + pitch = (im.width * bitcount + 7) // 8 + + fp.write( + o32(DDS_MAGIC) + + struct.pack( + "<7I", + 124, # header size + flags, # flags + im.height, + im.width, + pitch, + 0, # depth + 0, # mipmaps + ) + + struct.pack("11I", *((0,) * 11)) # reserved + # pfsize, pfflags, fourcc, bitcount + + struct.pack("<4I", 32, pixel_flags, 0, bitcount) + + struct.pack("<4I", *rgba_mask) # dwRGBABitMask + + struct.pack("<5I", DDSCAPS.TEXTURE, 0, 0, 0, 0) + ) + ImageFile._save( + im, fp, [ImageFile._Tile("raw", (0, 0) + im.size, 0, (rawmode, 0, 1))] + ) + + +def _accept(prefix: bytes) -> bool: + return prefix[:4] == b"DDS " + + +Image.register_open(DdsImageFile.format, DdsImageFile, _accept) +Image.register_decoder("dds_rgb", DdsRgbDecoder) +Image.register_save(DdsImageFile.format, _save) +Image.register_extension(DdsImageFile.format, ".dds") diff --git a/venv/lib/python3.12/site-packages/PIL/EpsImagePlugin.py b/venv/lib/python3.12/site-packages/PIL/EpsImagePlugin.py new file mode 100644 index 0000000..fb1e301 --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/EpsImagePlugin.py @@ -0,0 +1,474 @@ +# +# The Python Imaging Library. +# $Id$ +# +# EPS file handling +# +# History: +# 1995-09-01 fl Created (0.1) +# 1996-05-18 fl Don't choke on "atend" fields, Ghostscript interface (0.2) +# 1996-08-22 fl Don't choke on floating point BoundingBox values +# 1996-08-23 fl Handle files from Macintosh (0.3) +# 2001-02-17 fl Use 're' instead of 'regex' (Python 2.1) (0.4) +# 2003-09-07 fl Check gs.close status (from Federico Di Gregorio) (0.5) +# 2014-05-07 e Handling of EPS with binary preview and fixed resolution +# resizing +# +# Copyright (c) 1997-2003 by Secret Labs AB. +# Copyright (c) 1995-2003 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import io +import os +import re +import subprocess +import sys +import tempfile +from typing import IO + +from . import Image, ImageFile +from ._binary import i32le as i32 + +# -------------------------------------------------------------------- + + +split = re.compile(r"^%%([^:]*):[ \t]*(.*)[ \t]*$") +field = re.compile(r"^%[%!\w]([^:]*)[ \t]*$") + +gs_binary: str | bool | None = None +gs_windows_binary = None + + +def has_ghostscript() -> bool: + global gs_binary, gs_windows_binary + if gs_binary is None: + if sys.platform.startswith("win"): + if gs_windows_binary is None: + import shutil + + for binary in ("gswin32c", "gswin64c", "gs"): + if shutil.which(binary) is not None: + gs_windows_binary = binary + break + else: + gs_windows_binary = False + gs_binary = gs_windows_binary + else: + try: + subprocess.check_call(["gs", "--version"], stdout=subprocess.DEVNULL) + gs_binary = "gs" + except OSError: + gs_binary = False + return gs_binary is not False + + +def Ghostscript( + tile: list[ImageFile._Tile], + size: tuple[int, int], + fp: IO[bytes], + scale: int = 1, + transparency: bool = False, +) -> Image.core.ImagingCore: + """Render an image using Ghostscript""" + global gs_binary + if not has_ghostscript(): + msg = "Unable to locate Ghostscript on paths" + raise OSError(msg) + assert isinstance(gs_binary, str) + + # Unpack decoder tile + args = tile[0].args + assert isinstance(args, tuple) + length, bbox = args + + # Hack to support hi-res rendering + scale = int(scale) or 1 + width = size[0] * scale + height = size[1] * scale + # resolution is dependent on bbox and size + res_x = 72.0 * width / (bbox[2] - bbox[0]) + res_y = 72.0 * height / (bbox[3] - bbox[1]) + + out_fd, outfile = tempfile.mkstemp() + os.close(out_fd) + + infile_temp = None + if hasattr(fp, "name") and os.path.exists(fp.name): + infile = fp.name + else: + in_fd, infile_temp = tempfile.mkstemp() + os.close(in_fd) + infile = infile_temp + + # Ignore length and offset! + # Ghostscript can read it + # Copy whole file to read in Ghostscript + with open(infile_temp, "wb") as f: + # fetch length of fp + fp.seek(0, io.SEEK_END) + fsize = fp.tell() + # ensure start position + # go back + fp.seek(0) + lengthfile = fsize + while lengthfile > 0: + s = fp.read(min(lengthfile, 100 * 1024)) + if not s: + break + lengthfile -= len(s) + f.write(s) + + if transparency: + # "RGBA" + device = "pngalpha" + else: + # "pnmraw" automatically chooses between + # PBM ("1"), PGM ("L"), and PPM ("RGB"). + device = "pnmraw" + + # Build Ghostscript command + command = [ + gs_binary, + "-q", # quiet mode + f"-g{width:d}x{height:d}", # set output geometry (pixels) + f"-r{res_x:f}x{res_y:f}", # set input DPI (dots per inch) + "-dBATCH", # exit after processing + "-dNOPAUSE", # don't pause between pages + "-dSAFER", # safe mode + f"-sDEVICE={device}", + f"-sOutputFile={outfile}", # output file + # adjust for image origin + "-c", + f"{-bbox[0]} {-bbox[1]} translate", + "-f", + infile, # input file + # showpage (see https://bugs.ghostscript.com/show_bug.cgi?id=698272) + "-c", + "showpage", + ] + + # push data through Ghostscript + try: + startupinfo = None + if sys.platform.startswith("win"): + startupinfo = subprocess.STARTUPINFO() + startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW + subprocess.check_call(command, startupinfo=startupinfo) + with Image.open(outfile) as out_im: + out_im.load() + return out_im.im.copy() + finally: + try: + os.unlink(outfile) + if infile_temp: + os.unlink(infile_temp) + except OSError: + pass + + +def _accept(prefix: bytes) -> bool: + return prefix[:4] == b"%!PS" or (len(prefix) >= 4 and i32(prefix) == 0xC6D3D0C5) + + +## +# Image plugin for Encapsulated PostScript. This plugin supports only +# a few variants of this format. + + +class EpsImageFile(ImageFile.ImageFile): + """EPS File Parser for the Python Imaging Library""" + + format = "EPS" + format_description = "Encapsulated Postscript" + + mode_map = {1: "L", 2: "LAB", 3: "RGB", 4: "CMYK"} + + def _open(self) -> None: + (length, offset) = self._find_offset(self.fp) + + # go to offset - start of "%!PS" + self.fp.seek(offset) + + self._mode = "RGB" + + # When reading header comments, the first comment is used. + # When reading trailer comments, the last comment is used. + bounding_box: list[int] | None = None + imagedata_size: tuple[int, int] | None = None + + byte_arr = bytearray(255) + bytes_mv = memoryview(byte_arr) + bytes_read = 0 + reading_header_comments = True + reading_trailer_comments = False + trailer_reached = False + + def check_required_header_comments() -> None: + """ + The EPS specification requires that some headers exist. + This should be checked when the header comments formally end, + when image data starts, or when the file ends, whichever comes first. + """ + if "PS-Adobe" not in self.info: + msg = 'EPS header missing "%!PS-Adobe" comment' + raise SyntaxError(msg) + if "BoundingBox" not in self.info: + msg = 'EPS header missing "%%BoundingBox" comment' + raise SyntaxError(msg) + + def read_comment(s: str) -> bool: + nonlocal bounding_box, reading_trailer_comments + try: + m = split.match(s) + except re.error as e: + msg = "not an EPS file" + raise SyntaxError(msg) from e + + if not m: + return False + + k, v = m.group(1, 2) + self.info[k] = v + if k == "BoundingBox": + if v == "(atend)": + reading_trailer_comments = True + elif not bounding_box or (trailer_reached and reading_trailer_comments): + try: + # Note: The DSC spec says that BoundingBox + # fields should be integers, but some drivers + # put floating point values there anyway. + bounding_box = [int(float(i)) for i in v.split()] + except Exception: + pass + return True + + while True: + byte = self.fp.read(1) + if byte == b"": + # if we didn't read a byte we must be at the end of the file + if bytes_read == 0: + if reading_header_comments: + check_required_header_comments() + break + elif byte in b"\r\n": + # if we read a line ending character, ignore it and parse what + # we have already read. if we haven't read any other characters, + # continue reading + if bytes_read == 0: + continue + else: + # ASCII/hexadecimal lines in an EPS file must not exceed + # 255 characters, not including line ending characters + if bytes_read >= 255: + # only enforce this for lines starting with a "%", + # otherwise assume it's binary data + if byte_arr[0] == ord("%"): + msg = "not an EPS file" + raise SyntaxError(msg) + else: + if reading_header_comments: + check_required_header_comments() + reading_header_comments = False + # reset bytes_read so we can keep reading + # data until the end of the line + bytes_read = 0 + byte_arr[bytes_read] = byte[0] + bytes_read += 1 + continue + + if reading_header_comments: + # Load EPS header + + # if this line doesn't start with a "%", + # or does start with "%%EndComments", + # then we've reached the end of the header/comments + if byte_arr[0] != ord("%") or bytes_mv[:13] == b"%%EndComments": + check_required_header_comments() + reading_header_comments = False + continue + + s = str(bytes_mv[:bytes_read], "latin-1") + if not read_comment(s): + m = field.match(s) + if m: + k = m.group(1) + if k[:8] == "PS-Adobe": + self.info["PS-Adobe"] = k[9:] + else: + self.info[k] = "" + elif s[0] == "%": + # handle non-DSC PostScript comments that some + # tools mistakenly put in the Comments section + pass + else: + msg = "bad EPS header" + raise OSError(msg) + elif bytes_mv[:11] == b"%ImageData:": + # Check for an "ImageData" descriptor + # https://www.adobe.com/devnet-apps/photoshop/fileformatashtml/#50577413_pgfId-1035096 + + # If we've already read an "ImageData" descriptor, + # don't read another one. + if imagedata_size: + bytes_read = 0 + continue + + # Values: + # columns + # rows + # bit depth (1 or 8) + # mode (1: L, 2: LAB, 3: RGB, 4: CMYK) + # number of padding channels + # block size (number of bytes per row per channel) + # binary/ascii (1: binary, 2: ascii) + # data start identifier (the image data follows after a single line + # consisting only of this quoted value) + image_data_values = byte_arr[11:bytes_read].split(None, 7) + columns, rows, bit_depth, mode_id = ( + int(value) for value in image_data_values[:4] + ) + + if bit_depth == 1: + self._mode = "1" + elif bit_depth == 8: + try: + self._mode = self.mode_map[mode_id] + except ValueError: + break + else: + break + + # Parse the columns and rows after checking the bit depth and mode + # in case the bit depth and/or mode are invalid. + imagedata_size = columns, rows + elif bytes_mv[:5] == b"%%EOF": + break + elif trailer_reached and reading_trailer_comments: + # Load EPS trailer + s = str(bytes_mv[:bytes_read], "latin-1") + read_comment(s) + elif bytes_mv[:9] == b"%%Trailer": + trailer_reached = True + bytes_read = 0 + + # A "BoundingBox" is always required, + # even if an "ImageData" descriptor size exists. + if not bounding_box: + msg = "cannot determine EPS bounding box" + raise OSError(msg) + + # An "ImageData" size takes precedence over the "BoundingBox". + self._size = imagedata_size or ( + bounding_box[2] - bounding_box[0], + bounding_box[3] - bounding_box[1], + ) + + self.tile = [ + ImageFile._Tile("eps", (0, 0) + self.size, offset, (length, bounding_box)) + ] + + def _find_offset(self, fp: IO[bytes]) -> tuple[int, int]: + s = fp.read(4) + + if s == b"%!PS": + # for HEAD without binary preview + fp.seek(0, io.SEEK_END) + length = fp.tell() + offset = 0 + elif i32(s) == 0xC6D3D0C5: + # FIX for: Some EPS file not handled correctly / issue #302 + # EPS can contain binary data + # or start directly with latin coding + # more info see: + # https://web.archive.org/web/20160528181353/http://partners.adobe.com/public/developer/en/ps/5002.EPSF_Spec.pdf + s = fp.read(8) + offset = i32(s) + length = i32(s, 4) + else: + msg = "not an EPS file" + raise SyntaxError(msg) + + return length, offset + + def load( + self, scale: int = 1, transparency: bool = False + ) -> Image.core.PixelAccess | None: + # Load EPS via Ghostscript + if self.tile: + self.im = Ghostscript(self.tile, self.size, self.fp, scale, transparency) + self._mode = self.im.mode + self._size = self.im.size + self.tile = [] + return Image.Image.load(self) + + def load_seek(self, pos: int) -> None: + # we can't incrementally load, so force ImageFile.parser to + # use our custom load method by defining this method. + pass + + +# -------------------------------------------------------------------- + + +def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes, eps: int = 1) -> None: + """EPS Writer for the Python Imaging Library.""" + + # make sure image data is available + im.load() + + # determine PostScript image mode + if im.mode == "L": + operator = (8, 1, b"image") + elif im.mode == "RGB": + operator = (8, 3, b"false 3 colorimage") + elif im.mode == "CMYK": + operator = (8, 4, b"false 4 colorimage") + else: + msg = "image mode is not supported" + raise ValueError(msg) + + if eps: + # write EPS header + fp.write(b"%!PS-Adobe-3.0 EPSF-3.0\n") + fp.write(b"%%Creator: PIL 0.1 EpsEncode\n") + # fp.write("%%CreationDate: %s"...) + fp.write(b"%%%%BoundingBox: 0 0 %d %d\n" % im.size) + fp.write(b"%%Pages: 1\n") + fp.write(b"%%EndComments\n") + fp.write(b"%%Page: 1 1\n") + fp.write(b"%%ImageData: %d %d " % im.size) + fp.write(b'%d %d 0 1 1 "%s"\n' % operator) + + # image header + fp.write(b"gsave\n") + fp.write(b"10 dict begin\n") + fp.write(b"/buf %d string def\n" % (im.size[0] * operator[1])) + fp.write(b"%d %d scale\n" % im.size) + fp.write(b"%d %d 8\n" % im.size) # <= bits + fp.write(b"[%d 0 0 -%d 0 %d]\n" % (im.size[0], im.size[1], im.size[1])) + fp.write(b"{ currentfile buf readhexstring pop } bind\n") + fp.write(operator[2] + b"\n") + if hasattr(fp, "flush"): + fp.flush() + + ImageFile._save(im, fp, [ImageFile._Tile("eps", (0, 0) + im.size, 0, None)]) + + fp.write(b"\n%%%%EndBinary\n") + fp.write(b"grestore end\n") + if hasattr(fp, "flush"): + fp.flush() + + +# -------------------------------------------------------------------- + + +Image.register_open(EpsImageFile.format, EpsImageFile, _accept) + +Image.register_save(EpsImageFile.format, _save) + +Image.register_extensions(EpsImageFile.format, [".ps", ".eps"]) + +Image.register_mime(EpsImageFile.format, "application/postscript") diff --git a/venv/lib/python3.12/site-packages/PIL/ExifTags.py b/venv/lib/python3.12/site-packages/PIL/ExifTags.py new file mode 100644 index 0000000..39b4aa5 --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/ExifTags.py @@ -0,0 +1,381 @@ +# +# The Python Imaging Library. +# $Id$ +# +# EXIF tags +# +# Copyright (c) 2003 by Secret Labs AB +# +# See the README file for information on usage and redistribution. +# + +""" +This module provides constants and clear-text names for various +well-known EXIF tags. +""" +from __future__ import annotations + +from enum import IntEnum + + +class Base(IntEnum): + # possibly incomplete + InteropIndex = 0x0001 + ProcessingSoftware = 0x000B + NewSubfileType = 0x00FE + SubfileType = 0x00FF + ImageWidth = 0x0100 + ImageLength = 0x0101 + BitsPerSample = 0x0102 + Compression = 0x0103 + PhotometricInterpretation = 0x0106 + Thresholding = 0x0107 + CellWidth = 0x0108 + CellLength = 0x0109 + FillOrder = 0x010A + DocumentName = 0x010D + ImageDescription = 0x010E + Make = 0x010F + Model = 0x0110 + StripOffsets = 0x0111 + Orientation = 0x0112 + SamplesPerPixel = 0x0115 + RowsPerStrip = 0x0116 + StripByteCounts = 0x0117 + MinSampleValue = 0x0118 + MaxSampleValue = 0x0119 + XResolution = 0x011A + YResolution = 0x011B + PlanarConfiguration = 0x011C + PageName = 0x011D + FreeOffsets = 0x0120 + FreeByteCounts = 0x0121 + GrayResponseUnit = 0x0122 + GrayResponseCurve = 0x0123 + T4Options = 0x0124 + T6Options = 0x0125 + ResolutionUnit = 0x0128 + PageNumber = 0x0129 + TransferFunction = 0x012D + Software = 0x0131 + DateTime = 0x0132 + Artist = 0x013B + HostComputer = 0x013C + Predictor = 0x013D + WhitePoint = 0x013E + PrimaryChromaticities = 0x013F + ColorMap = 0x0140 + HalftoneHints = 0x0141 + TileWidth = 0x0142 + TileLength = 0x0143 + TileOffsets = 0x0144 + TileByteCounts = 0x0145 + SubIFDs = 0x014A + InkSet = 0x014C + InkNames = 0x014D + NumberOfInks = 0x014E + DotRange = 0x0150 + TargetPrinter = 0x0151 + ExtraSamples = 0x0152 + SampleFormat = 0x0153 + SMinSampleValue = 0x0154 + SMaxSampleValue = 0x0155 + TransferRange = 0x0156 + ClipPath = 0x0157 + XClipPathUnits = 0x0158 + YClipPathUnits = 0x0159 + Indexed = 0x015A + JPEGTables = 0x015B + OPIProxy = 0x015F + JPEGProc = 0x0200 + JpegIFOffset = 0x0201 + JpegIFByteCount = 0x0202 + JpegRestartInterval = 0x0203 + JpegLosslessPredictors = 0x0205 + JpegPointTransforms = 0x0206 + JpegQTables = 0x0207 + JpegDCTables = 0x0208 + JpegACTables = 0x0209 + YCbCrCoefficients = 0x0211 + YCbCrSubSampling = 0x0212 + YCbCrPositioning = 0x0213 + ReferenceBlackWhite = 0x0214 + XMLPacket = 0x02BC + RelatedImageFileFormat = 0x1000 + RelatedImageWidth = 0x1001 + RelatedImageLength = 0x1002 + Rating = 0x4746 + RatingPercent = 0x4749 + ImageID = 0x800D + CFARepeatPatternDim = 0x828D + BatteryLevel = 0x828F + Copyright = 0x8298 + ExposureTime = 0x829A + FNumber = 0x829D + IPTCNAA = 0x83BB + ImageResources = 0x8649 + ExifOffset = 0x8769 + InterColorProfile = 0x8773 + ExposureProgram = 0x8822 + SpectralSensitivity = 0x8824 + GPSInfo = 0x8825 + ISOSpeedRatings = 0x8827 + OECF = 0x8828 + Interlace = 0x8829 + TimeZoneOffset = 0x882A + SelfTimerMode = 0x882B + SensitivityType = 0x8830 + StandardOutputSensitivity = 0x8831 + RecommendedExposureIndex = 0x8832 + ISOSpeed = 0x8833 + ISOSpeedLatitudeyyy = 0x8834 + ISOSpeedLatitudezzz = 0x8835 + ExifVersion = 0x9000 + DateTimeOriginal = 0x9003 + DateTimeDigitized = 0x9004 + OffsetTime = 0x9010 + OffsetTimeOriginal = 0x9011 + OffsetTimeDigitized = 0x9012 + ComponentsConfiguration = 0x9101 + CompressedBitsPerPixel = 0x9102 + ShutterSpeedValue = 0x9201 + ApertureValue = 0x9202 + BrightnessValue = 0x9203 + ExposureBiasValue = 0x9204 + MaxApertureValue = 0x9205 + SubjectDistance = 0x9206 + MeteringMode = 0x9207 + LightSource = 0x9208 + Flash = 0x9209 + FocalLength = 0x920A + Noise = 0x920D + ImageNumber = 0x9211 + SecurityClassification = 0x9212 + ImageHistory = 0x9213 + TIFFEPStandardID = 0x9216 + MakerNote = 0x927C + UserComment = 0x9286 + SubsecTime = 0x9290 + SubsecTimeOriginal = 0x9291 + SubsecTimeDigitized = 0x9292 + AmbientTemperature = 0x9400 + Humidity = 0x9401 + Pressure = 0x9402 + WaterDepth = 0x9403 + Acceleration = 0x9404 + CameraElevationAngle = 0x9405 + XPTitle = 0x9C9B + XPComment = 0x9C9C + XPAuthor = 0x9C9D + XPKeywords = 0x9C9E + XPSubject = 0x9C9F + FlashPixVersion = 0xA000 + ColorSpace = 0xA001 + ExifImageWidth = 0xA002 + ExifImageHeight = 0xA003 + RelatedSoundFile = 0xA004 + ExifInteroperabilityOffset = 0xA005 + FlashEnergy = 0xA20B + SpatialFrequencyResponse = 0xA20C + FocalPlaneXResolution = 0xA20E + FocalPlaneYResolution = 0xA20F + FocalPlaneResolutionUnit = 0xA210 + SubjectLocation = 0xA214 + ExposureIndex = 0xA215 + SensingMethod = 0xA217 + FileSource = 0xA300 + SceneType = 0xA301 + CFAPattern = 0xA302 + CustomRendered = 0xA401 + ExposureMode = 0xA402 + WhiteBalance = 0xA403 + DigitalZoomRatio = 0xA404 + FocalLengthIn35mmFilm = 0xA405 + SceneCaptureType = 0xA406 + GainControl = 0xA407 + Contrast = 0xA408 + Saturation = 0xA409 + Sharpness = 0xA40A + DeviceSettingDescription = 0xA40B + SubjectDistanceRange = 0xA40C + ImageUniqueID = 0xA420 + CameraOwnerName = 0xA430 + BodySerialNumber = 0xA431 + LensSpecification = 0xA432 + LensMake = 0xA433 + LensModel = 0xA434 + LensSerialNumber = 0xA435 + CompositeImage = 0xA460 + CompositeImageCount = 0xA461 + CompositeImageExposureTimes = 0xA462 + Gamma = 0xA500 + PrintImageMatching = 0xC4A5 + DNGVersion = 0xC612 + DNGBackwardVersion = 0xC613 + UniqueCameraModel = 0xC614 + LocalizedCameraModel = 0xC615 + CFAPlaneColor = 0xC616 + CFALayout = 0xC617 + LinearizationTable = 0xC618 + BlackLevelRepeatDim = 0xC619 + BlackLevel = 0xC61A + BlackLevelDeltaH = 0xC61B + BlackLevelDeltaV = 0xC61C + WhiteLevel = 0xC61D + DefaultScale = 0xC61E + DefaultCropOrigin = 0xC61F + DefaultCropSize = 0xC620 + ColorMatrix1 = 0xC621 + ColorMatrix2 = 0xC622 + CameraCalibration1 = 0xC623 + CameraCalibration2 = 0xC624 + ReductionMatrix1 = 0xC625 + ReductionMatrix2 = 0xC626 + AnalogBalance = 0xC627 + AsShotNeutral = 0xC628 + AsShotWhiteXY = 0xC629 + BaselineExposure = 0xC62A + BaselineNoise = 0xC62B + BaselineSharpness = 0xC62C + BayerGreenSplit = 0xC62D + LinearResponseLimit = 0xC62E + CameraSerialNumber = 0xC62F + LensInfo = 0xC630 + ChromaBlurRadius = 0xC631 + AntiAliasStrength = 0xC632 + ShadowScale = 0xC633 + DNGPrivateData = 0xC634 + MakerNoteSafety = 0xC635 + CalibrationIlluminant1 = 0xC65A + CalibrationIlluminant2 = 0xC65B + BestQualityScale = 0xC65C + RawDataUniqueID = 0xC65D + OriginalRawFileName = 0xC68B + OriginalRawFileData = 0xC68C + ActiveArea = 0xC68D + MaskedAreas = 0xC68E + AsShotICCProfile = 0xC68F + AsShotPreProfileMatrix = 0xC690 + CurrentICCProfile = 0xC691 + CurrentPreProfileMatrix = 0xC692 + ColorimetricReference = 0xC6BF + CameraCalibrationSignature = 0xC6F3 + ProfileCalibrationSignature = 0xC6F4 + AsShotProfileName = 0xC6F6 + NoiseReductionApplied = 0xC6F7 + ProfileName = 0xC6F8 + ProfileHueSatMapDims = 0xC6F9 + ProfileHueSatMapData1 = 0xC6FA + ProfileHueSatMapData2 = 0xC6FB + ProfileToneCurve = 0xC6FC + ProfileEmbedPolicy = 0xC6FD + ProfileCopyright = 0xC6FE + ForwardMatrix1 = 0xC714 + ForwardMatrix2 = 0xC715 + PreviewApplicationName = 0xC716 + PreviewApplicationVersion = 0xC717 + PreviewSettingsName = 0xC718 + PreviewSettingsDigest = 0xC719 + PreviewColorSpace = 0xC71A + PreviewDateTime = 0xC71B + RawImageDigest = 0xC71C + OriginalRawFileDigest = 0xC71D + SubTileBlockSize = 0xC71E + RowInterleaveFactor = 0xC71F + ProfileLookTableDims = 0xC725 + ProfileLookTableData = 0xC726 + OpcodeList1 = 0xC740 + OpcodeList2 = 0xC741 + OpcodeList3 = 0xC74E + NoiseProfile = 0xC761 + + +"""Maps EXIF tags to tag names.""" +TAGS = { + **{i.value: i.name for i in Base}, + 0x920C: "SpatialFrequencyResponse", + 0x9214: "SubjectLocation", + 0x9215: "ExposureIndex", + 0x828E: "CFAPattern", + 0x920B: "FlashEnergy", + 0x9216: "TIFF/EPStandardID", +} + + +class GPS(IntEnum): + GPSVersionID = 0 + GPSLatitudeRef = 1 + GPSLatitude = 2 + GPSLongitudeRef = 3 + GPSLongitude = 4 + GPSAltitudeRef = 5 + GPSAltitude = 6 + GPSTimeStamp = 7 + GPSSatellites = 8 + GPSStatus = 9 + GPSMeasureMode = 10 + GPSDOP = 11 + GPSSpeedRef = 12 + GPSSpeed = 13 + GPSTrackRef = 14 + GPSTrack = 15 + GPSImgDirectionRef = 16 + GPSImgDirection = 17 + GPSMapDatum = 18 + GPSDestLatitudeRef = 19 + GPSDestLatitude = 20 + GPSDestLongitudeRef = 21 + GPSDestLongitude = 22 + GPSDestBearingRef = 23 + GPSDestBearing = 24 + GPSDestDistanceRef = 25 + GPSDestDistance = 26 + GPSProcessingMethod = 27 + GPSAreaInformation = 28 + GPSDateStamp = 29 + GPSDifferential = 30 + GPSHPositioningError = 31 + + +"""Maps EXIF GPS tags to tag names.""" +GPSTAGS = {i.value: i.name for i in GPS} + + +class Interop(IntEnum): + InteropIndex = 1 + InteropVersion = 2 + RelatedImageFileFormat = 4096 + RelatedImageWidth = 4097 + RelatedImageHeight = 4098 + + +class IFD(IntEnum): + Exif = 34665 + GPSInfo = 34853 + Makernote = 37500 + Interop = 40965 + IFD1 = -1 + + +class LightSource(IntEnum): + Unknown = 0 + Daylight = 1 + Fluorescent = 2 + Tungsten = 3 + Flash = 4 + Fine = 9 + Cloudy = 10 + Shade = 11 + DaylightFluorescent = 12 + DayWhiteFluorescent = 13 + CoolWhiteFluorescent = 14 + WhiteFluorescent = 15 + StandardLightA = 17 + StandardLightB = 18 + StandardLightC = 19 + D55 = 20 + D65 = 21 + D75 = 22 + D50 = 23 + ISO = 24 + Other = 255 diff --git a/venv/lib/python3.12/site-packages/PIL/FitsImagePlugin.py b/venv/lib/python3.12/site-packages/PIL/FitsImagePlugin.py new file mode 100644 index 0000000..6bbd264 --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/FitsImagePlugin.py @@ -0,0 +1,152 @@ +# +# The Python Imaging Library +# $Id$ +# +# FITS file handling +# +# Copyright (c) 1998-2003 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import gzip +import math + +from . import Image, ImageFile + + +def _accept(prefix: bytes) -> bool: + return prefix[:6] == b"SIMPLE" + + +class FitsImageFile(ImageFile.ImageFile): + format = "FITS" + format_description = "FITS" + + def _open(self) -> None: + assert self.fp is not None + + headers: dict[bytes, bytes] = {} + header_in_progress = False + decoder_name = "" + while True: + header = self.fp.read(80) + if not header: + msg = "Truncated FITS file" + raise OSError(msg) + keyword = header[:8].strip() + if keyword in (b"SIMPLE", b"XTENSION"): + header_in_progress = True + elif headers and not header_in_progress: + # This is now a data unit + break + elif keyword == b"END": + # Seek to the end of the header unit + self.fp.seek(math.ceil(self.fp.tell() / 2880) * 2880) + if not decoder_name: + decoder_name, offset, args = self._parse_headers(headers) + + header_in_progress = False + continue + + if decoder_name: + # Keep going to read past the headers + continue + + value = header[8:].split(b"/")[0].strip() + if value.startswith(b"="): + value = value[1:].strip() + if not headers and (not _accept(keyword) or value != b"T"): + msg = "Not a FITS file" + raise SyntaxError(msg) + headers[keyword] = value + + if not decoder_name: + msg = "No image data" + raise ValueError(msg) + + offset += self.fp.tell() - 80 + self.tile = [ImageFile._Tile(decoder_name, (0, 0) + self.size, offset, args)] + + def _get_size( + self, headers: dict[bytes, bytes], prefix: bytes + ) -> tuple[int, int] | None: + naxis = int(headers[prefix + b"NAXIS"]) + if naxis == 0: + return None + + if naxis == 1: + return 1, int(headers[prefix + b"NAXIS1"]) + else: + return int(headers[prefix + b"NAXIS1"]), int(headers[prefix + b"NAXIS2"]) + + def _parse_headers( + self, headers: dict[bytes, bytes] + ) -> tuple[str, int, tuple[str | int, ...]]: + prefix = b"" + decoder_name = "raw" + offset = 0 + if ( + headers.get(b"XTENSION") == b"'BINTABLE'" + and headers.get(b"ZIMAGE") == b"T" + and headers[b"ZCMPTYPE"] == b"'GZIP_1 '" + ): + no_prefix_size = self._get_size(headers, prefix) or (0, 0) + number_of_bits = int(headers[b"BITPIX"]) + offset = no_prefix_size[0] * no_prefix_size[1] * (number_of_bits // 8) + + prefix = b"Z" + decoder_name = "fits_gzip" + + size = self._get_size(headers, prefix) + if not size: + return "", 0, () + + self._size = size + + number_of_bits = int(headers[prefix + b"BITPIX"]) + if number_of_bits == 8: + self._mode = "L" + elif number_of_bits == 16: + self._mode = "I;16" + elif number_of_bits == 32: + self._mode = "I" + elif number_of_bits in (-32, -64): + self._mode = "F" + + args: tuple[str | int, ...] + if decoder_name == "raw": + args = (self.mode, 0, -1) + else: + args = (number_of_bits,) + return decoder_name, offset, args + + +class FitsGzipDecoder(ImageFile.PyDecoder): + _pulls_fd = True + + def decode(self, buffer: bytes | Image.SupportsArrayInterface) -> tuple[int, int]: + assert self.fd is not None + value = gzip.decompress(self.fd.read()) + + rows = [] + offset = 0 + number_of_bits = min(self.args[0] // 8, 4) + for y in range(self.state.ysize): + row = bytearray() + for x in range(self.state.xsize): + row += value[offset + (4 - number_of_bits) : offset + 4] + offset += 4 + rows.append(row) + self.set_as_raw(bytes([pixel for row in rows[::-1] for pixel in row])) + return -1, 0 + + +# -------------------------------------------------------------------- +# Registry + +Image.register_open(FitsImageFile.format, FitsImageFile, _accept) +Image.register_decoder("fits_gzip", FitsGzipDecoder) + +Image.register_extensions(FitsImageFile.format, [".fit", ".fits"]) diff --git a/venv/lib/python3.12/site-packages/PIL/FliImagePlugin.py b/venv/lib/python3.12/site-packages/PIL/FliImagePlugin.py new file mode 100644 index 0000000..666390b --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/FliImagePlugin.py @@ -0,0 +1,175 @@ +# +# The Python Imaging Library. +# $Id$ +# +# FLI/FLC file handling. +# +# History: +# 95-09-01 fl Created +# 97-01-03 fl Fixed parser, setup decoder tile +# 98-07-15 fl Renamed offset attribute to avoid name clash +# +# Copyright (c) Secret Labs AB 1997-98. +# Copyright (c) Fredrik Lundh 1995-97. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import os + +from . import Image, ImageFile, ImagePalette +from ._binary import i16le as i16 +from ._binary import i32le as i32 +from ._binary import o8 + +# +# decoder + + +def _accept(prefix: bytes) -> bool: + return ( + len(prefix) >= 6 + and i16(prefix, 4) in [0xAF11, 0xAF12] + and i16(prefix, 14) in [0, 3] # flags + ) + + +## +# Image plugin for the FLI/FLC animation format. Use the seek +# method to load individual frames. + + +class FliImageFile(ImageFile.ImageFile): + format = "FLI" + format_description = "Autodesk FLI/FLC Animation" + _close_exclusive_fp_after_loading = False + + def _open(self) -> None: + # HEAD + s = self.fp.read(128) + if not (_accept(s) and s[20:22] == b"\x00\x00"): + msg = "not an FLI/FLC file" + raise SyntaxError(msg) + + # frames + self.n_frames = i16(s, 6) + self.is_animated = self.n_frames > 1 + + # image characteristics + self._mode = "P" + self._size = i16(s, 8), i16(s, 10) + + # animation speed + duration = i32(s, 16) + magic = i16(s, 4) + if magic == 0xAF11: + duration = (duration * 1000) // 70 + self.info["duration"] = duration + + # look for palette + palette = [(a, a, a) for a in range(256)] + + s = self.fp.read(16) + + self.__offset = 128 + + if i16(s, 4) == 0xF100: + # prefix chunk; ignore it + self.__offset = self.__offset + i32(s) + self.fp.seek(self.__offset) + s = self.fp.read(16) + + if i16(s, 4) == 0xF1FA: + # look for palette chunk + number_of_subchunks = i16(s, 6) + chunk_size: int | None = None + for _ in range(number_of_subchunks): + if chunk_size is not None: + self.fp.seek(chunk_size - 6, os.SEEK_CUR) + s = self.fp.read(6) + chunk_type = i16(s, 4) + if chunk_type in (4, 11): + self._palette(palette, 2 if chunk_type == 11 else 0) + break + chunk_size = i32(s) + if not chunk_size: + break + + self.palette = ImagePalette.raw( + "RGB", b"".join(o8(r) + o8(g) + o8(b) for (r, g, b) in palette) + ) + + # set things up to decode first frame + self.__frame = -1 + self._fp = self.fp + self.__rewind = self.fp.tell() + self.seek(0) + + def _palette(self, palette: list[tuple[int, int, int]], shift: int) -> None: + # load palette + + i = 0 + for e in range(i16(self.fp.read(2))): + s = self.fp.read(2) + i = i + s[0] + n = s[1] + if n == 0: + n = 256 + s = self.fp.read(n * 3) + for n in range(0, len(s), 3): + r = s[n] << shift + g = s[n + 1] << shift + b = s[n + 2] << shift + palette[i] = (r, g, b) + i += 1 + + def seek(self, frame: int) -> None: + if not self._seek_check(frame): + return + if frame < self.__frame: + self._seek(0) + + for f in range(self.__frame + 1, frame + 1): + self._seek(f) + + def _seek(self, frame: int) -> None: + if frame == 0: + self.__frame = -1 + self._fp.seek(self.__rewind) + self.__offset = 128 + else: + # ensure that the previous frame was loaded + self.load() + + if frame != self.__frame + 1: + msg = f"cannot seek to frame {frame}" + raise ValueError(msg) + self.__frame = frame + + # move to next frame + self.fp = self._fp + self.fp.seek(self.__offset) + + s = self.fp.read(4) + if not s: + msg = "missing frame size" + raise EOFError(msg) + + framesize = i32(s) + + self.decodermaxblock = framesize + self.tile = [ImageFile._Tile("fli", (0, 0) + self.size, self.__offset, None)] + + self.__offset += framesize + + def tell(self) -> int: + return self.__frame + + +# +# registry + +Image.register_open(FliImageFile.format, FliImageFile, _accept) + +Image.register_extensions(FliImageFile.format, [".fli", ".flc"]) diff --git a/venv/lib/python3.12/site-packages/PIL/FontFile.py b/venv/lib/python3.12/site-packages/PIL/FontFile.py new file mode 100644 index 0000000..1e0c1c1 --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/FontFile.py @@ -0,0 +1,134 @@ +# +# The Python Imaging Library +# $Id$ +# +# base class for raster font file parsers +# +# history: +# 1997-06-05 fl created +# 1997-08-19 fl restrict image width +# +# Copyright (c) 1997-1998 by Secret Labs AB +# Copyright (c) 1997-1998 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import os +from typing import BinaryIO + +from . import Image, _binary + +WIDTH = 800 + + +def puti16( + fp: BinaryIO, values: tuple[int, int, int, int, int, int, int, int, int, int] +) -> None: + """Write network order (big-endian) 16-bit sequence""" + for v in values: + if v < 0: + v += 65536 + fp.write(_binary.o16be(v)) + + +class FontFile: + """Base class for raster font file handlers.""" + + bitmap: Image.Image | None = None + + def __init__(self) -> None: + self.info: dict[bytes, bytes | int] = {} + self.glyph: list[ + tuple[ + tuple[int, int], + tuple[int, int, int, int], + tuple[int, int, int, int], + Image.Image, + ] + | None + ] = [None] * 256 + + def __getitem__(self, ix: int) -> ( + tuple[ + tuple[int, int], + tuple[int, int, int, int], + tuple[int, int, int, int], + Image.Image, + ] + | None + ): + return self.glyph[ix] + + def compile(self) -> None: + """Create metrics and bitmap""" + + if self.bitmap: + return + + # create bitmap large enough to hold all data + h = w = maxwidth = 0 + lines = 1 + for glyph in self.glyph: + if glyph: + d, dst, src, im = glyph + h = max(h, src[3] - src[1]) + w = w + (src[2] - src[0]) + if w > WIDTH: + lines += 1 + w = src[2] - src[0] + maxwidth = max(maxwidth, w) + + xsize = maxwidth + ysize = lines * h + + if xsize == 0 and ysize == 0: + return + + self.ysize = h + + # paste glyphs into bitmap + self.bitmap = Image.new("1", (xsize, ysize)) + self.metrics: list[ + tuple[tuple[int, int], tuple[int, int, int, int], tuple[int, int, int, int]] + | None + ] = [None] * 256 + x = y = 0 + for i in range(256): + glyph = self[i] + if glyph: + d, dst, src, im = glyph + xx = src[2] - src[0] + x0, y0 = x, y + x = x + xx + if x > WIDTH: + x, y = 0, y + h + x0, y0 = x, y + x = xx + s = src[0] + x0, src[1] + y0, src[2] + x0, src[3] + y0 + self.bitmap.paste(im.crop(src), s) + self.metrics[i] = d, dst, s + + def save(self, filename: str) -> None: + """Save font""" + + self.compile() + + # font data + if not self.bitmap: + msg = "No bitmap created" + raise ValueError(msg) + self.bitmap.save(os.path.splitext(filename)[0] + ".pbm", "PNG") + + # font metrics + with open(os.path.splitext(filename)[0] + ".pil", "wb") as fp: + fp.write(b"PILfont\n") + fp.write(f";;;;;;{self.ysize};\n".encode("ascii")) # HACK!!! + fp.write(b"DATA\n") + for id in range(256): + m = self.metrics[id] + if not m: + puti16(fp, (0,) * 10) + else: + puti16(fp, m[0] + m[1] + m[2]) diff --git a/venv/lib/python3.12/site-packages/PIL/FpxImagePlugin.py b/venv/lib/python3.12/site-packages/PIL/FpxImagePlugin.py new file mode 100644 index 0000000..8fef510 --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/FpxImagePlugin.py @@ -0,0 +1,257 @@ +# +# THIS IS WORK IN PROGRESS +# +# The Python Imaging Library. +# $Id$ +# +# FlashPix support for PIL +# +# History: +# 97-01-25 fl Created (reads uncompressed RGB images only) +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1997. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import olefile + +from . import Image, ImageFile +from ._binary import i32le as i32 + +# we map from colour field tuples to (mode, rawmode) descriptors +MODES = { + # opacity + (0x00007FFE,): ("A", "L"), + # monochrome + (0x00010000,): ("L", "L"), + (0x00018000, 0x00017FFE): ("RGBA", "LA"), + # photo YCC + (0x00020000, 0x00020001, 0x00020002): ("RGB", "YCC;P"), + (0x00028000, 0x00028001, 0x00028002, 0x00027FFE): ("RGBA", "YCCA;P"), + # standard RGB (NIFRGB) + (0x00030000, 0x00030001, 0x00030002): ("RGB", "RGB"), + (0x00038000, 0x00038001, 0x00038002, 0x00037FFE): ("RGBA", "RGBA"), +} + + +# +# -------------------------------------------------------------------- + + +def _accept(prefix: bytes) -> bool: + return prefix[:8] == olefile.MAGIC + + +## +# Image plugin for the FlashPix images. + + +class FpxImageFile(ImageFile.ImageFile): + format = "FPX" + format_description = "FlashPix" + + def _open(self) -> None: + # + # read the OLE directory and see if this is a likely + # to be a FlashPix file + + try: + self.ole = olefile.OleFileIO(self.fp) + except OSError as e: + msg = "not an FPX file; invalid OLE file" + raise SyntaxError(msg) from e + + root = self.ole.root + if not root or root.clsid != "56616700-C154-11CE-8553-00AA00A1F95B": + msg = "not an FPX file; bad root CLSID" + raise SyntaxError(msg) + + self._open_index(1) + + def _open_index(self, index: int = 1) -> None: + # + # get the Image Contents Property Set + + prop = self.ole.getproperties( + [f"Data Object Store {index:06d}", "\005Image Contents"] + ) + + # size (highest resolution) + + assert isinstance(prop[0x1000002], int) + assert isinstance(prop[0x1000003], int) + self._size = prop[0x1000002], prop[0x1000003] + + size = max(self.size) + i = 1 + while size > 64: + size = size // 2 + i += 1 + self.maxid = i - 1 + + # mode. instead of using a single field for this, flashpix + # requires you to specify the mode for each channel in each + # resolution subimage, and leaves it to the decoder to make + # sure that they all match. for now, we'll cheat and assume + # that this is always the case. + + id = self.maxid << 16 + + s = prop[0x2000002 | id] + + if not isinstance(s, bytes) or (bands := i32(s, 4)) > 4: + msg = "Invalid number of bands" + raise OSError(msg) + + # note: for now, we ignore the "uncalibrated" flag + colors = tuple(i32(s, 8 + i * 4) & 0x7FFFFFFF for i in range(bands)) + + self._mode, self.rawmode = MODES[colors] + + # load JPEG tables, if any + self.jpeg = {} + for i in range(256): + id = 0x3000001 | (i << 16) + if id in prop: + self.jpeg[i] = prop[id] + + self._open_subimage(1, self.maxid) + + def _open_subimage(self, index: int = 1, subimage: int = 0) -> None: + # + # setup tile descriptors for a given subimage + + stream = [ + f"Data Object Store {index:06d}", + f"Resolution {subimage:04d}", + "Subimage 0000 Header", + ] + + fp = self.ole.openstream(stream) + + # skip prefix + fp.read(28) + + # header stream + s = fp.read(36) + + size = i32(s, 4), i32(s, 8) + # tilecount = i32(s, 12) + tilesize = i32(s, 16), i32(s, 20) + # channels = i32(s, 24) + offset = i32(s, 28) + length = i32(s, 32) + + if size != self.size: + msg = "subimage mismatch" + raise OSError(msg) + + # get tile descriptors + fp.seek(28 + offset) + s = fp.read(i32(s, 12) * length) + + x = y = 0 + xsize, ysize = size + xtile, ytile = tilesize + self.tile = [] + + for i in range(0, len(s), length): + x1 = min(xsize, x + xtile) + y1 = min(ysize, y + ytile) + + compression = i32(s, i + 8) + + if compression == 0: + self.tile.append( + ImageFile._Tile( + "raw", + (x, y, x1, y1), + i32(s, i) + 28, + (self.rawmode,), + ) + ) + + elif compression == 1: + # FIXME: the fill decoder is not implemented + self.tile.append( + ImageFile._Tile( + "fill", + (x, y, x1, y1), + i32(s, i) + 28, + (self.rawmode, s[12:16]), + ) + ) + + elif compression == 2: + internal_color_conversion = s[14] + jpeg_tables = s[15] + rawmode = self.rawmode + + if internal_color_conversion: + # The image is stored as usual (usually YCbCr). + if rawmode == "RGBA": + # For "RGBA", data is stored as YCbCrA based on + # negative RGB. The following trick works around + # this problem : + jpegmode, rawmode = "YCbCrK", "CMYK" + else: + jpegmode = None # let the decoder decide + + else: + # The image is stored as defined by rawmode + jpegmode = rawmode + + self.tile.append( + ImageFile._Tile( + "jpeg", + (x, y, x1, y1), + i32(s, i) + 28, + (rawmode, jpegmode), + ) + ) + + # FIXME: jpeg tables are tile dependent; the prefix + # data must be placed in the tile descriptor itself! + + if jpeg_tables: + self.tile_prefix = self.jpeg[jpeg_tables] + + else: + msg = "unknown/invalid compression" + raise OSError(msg) + + x = x + xtile + if x >= xsize: + x, y = 0, y + ytile + if y >= ysize: + break # isn't really required + + self.stream = stream + self._fp = self.fp + self.fp = None + + def load(self) -> Image.core.PixelAccess | None: + if not self.fp: + self.fp = self.ole.openstream(self.stream[:2] + ["Subimage 0000 Data"]) + + return ImageFile.ImageFile.load(self) + + def close(self) -> None: + self.ole.close() + super().close() + + def __exit__(self, *args: object) -> None: + self.ole.close() + super().__exit__() + + +# +# -------------------------------------------------------------------- + + +Image.register_open(FpxImageFile.format, FpxImageFile, _accept) + +Image.register_extension(FpxImageFile.format, ".fpx") diff --git a/venv/lib/python3.12/site-packages/PIL/FtexImagePlugin.py b/venv/lib/python3.12/site-packages/PIL/FtexImagePlugin.py new file mode 100644 index 0000000..ddb469b --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/FtexImagePlugin.py @@ -0,0 +1,115 @@ +""" +A Pillow loader for .ftc and .ftu files (FTEX) +Jerome Leclanche + +The contents of this file are hereby released in the public domain (CC0) +Full text of the CC0 license: + https://creativecommons.org/publicdomain/zero/1.0/ + +Independence War 2: Edge Of Chaos - Texture File Format - 16 October 2001 + +The textures used for 3D objects in Independence War 2: Edge Of Chaos are in a +packed custom format called FTEX. This file format uses file extensions FTC +and FTU. +* FTC files are compressed textures (using standard texture compression). +* FTU files are not compressed. +Texture File Format +The FTC and FTU texture files both use the same format. This +has the following structure: +{header} +{format_directory} +{data} +Where: +{header} = { + u32:magic, + u32:version, + u32:width, + u32:height, + u32:mipmap_count, + u32:format_count +} + +* The "magic" number is "FTEX". +* "width" and "height" are the dimensions of the texture. +* "mipmap_count" is the number of mipmaps in the texture. +* "format_count" is the number of texture formats (different versions of the +same texture) in this file. + +{format_directory} = format_count * { u32:format, u32:where } + +The format value is 0 for DXT1 compressed textures and 1 for 24-bit RGB +uncompressed textures. +The texture data for a format starts at the position "where" in the file. + +Each set of texture data in the file has the following structure: +{data} = format_count * { u32:mipmap_size, mipmap_size * { u8 } } +* "mipmap_size" is the number of bytes in that mip level. For compressed +textures this is the size of the texture data compressed with DXT1. For 24 bit +uncompressed textures, this is 3 * width * height. Following this are the image +bytes for that mipmap level. + +Note: All data is stored in little-Endian (Intel) byte order. +""" + +from __future__ import annotations + +import struct +from enum import IntEnum +from io import BytesIO + +from . import Image, ImageFile + +MAGIC = b"FTEX" + + +class Format(IntEnum): + DXT1 = 0 + UNCOMPRESSED = 1 + + +class FtexImageFile(ImageFile.ImageFile): + format = "FTEX" + format_description = "Texture File Format (IW2:EOC)" + + def _open(self) -> None: + if not _accept(self.fp.read(4)): + msg = "not an FTEX file" + raise SyntaxError(msg) + struct.unpack(" None: + pass + + +def _accept(prefix: bytes) -> bool: + return prefix[:4] == MAGIC + + +Image.register_open(FtexImageFile.format, FtexImageFile, _accept) +Image.register_extensions(FtexImageFile.format, [".ftc", ".ftu"]) diff --git a/venv/lib/python3.12/site-packages/PIL/GbrImagePlugin.py b/venv/lib/python3.12/site-packages/PIL/GbrImagePlugin.py new file mode 100644 index 0000000..f319d7e --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/GbrImagePlugin.py @@ -0,0 +1,103 @@ +# +# The Python Imaging Library +# +# load a GIMP brush file +# +# History: +# 96-03-14 fl Created +# 16-01-08 es Version 2 +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1996. +# Copyright (c) Eric Soroos 2016. +# +# See the README file for information on usage and redistribution. +# +# +# See https://github.com/GNOME/gimp/blob/mainline/devel-docs/gbr.txt for +# format documentation. +# +# This code Interprets version 1 and 2 .gbr files. +# Version 1 files are obsolete, and should not be used for new +# brushes. +# Version 2 files are saved by GIMP v2.8 (at least) +# Version 3 files have a format specifier of 18 for 16bit floats in +# the color depth field. This is currently unsupported by Pillow. +from __future__ import annotations + +from . import Image, ImageFile +from ._binary import i32be as i32 + + +def _accept(prefix: bytes) -> bool: + return len(prefix) >= 8 and i32(prefix, 0) >= 20 and i32(prefix, 4) in (1, 2) + + +## +# Image plugin for the GIMP brush format. + + +class GbrImageFile(ImageFile.ImageFile): + format = "GBR" + format_description = "GIMP brush file" + + def _open(self) -> None: + header_size = i32(self.fp.read(4)) + if header_size < 20: + msg = "not a GIMP brush" + raise SyntaxError(msg) + version = i32(self.fp.read(4)) + if version not in (1, 2): + msg = f"Unsupported GIMP brush version: {version}" + raise SyntaxError(msg) + + width = i32(self.fp.read(4)) + height = i32(self.fp.read(4)) + color_depth = i32(self.fp.read(4)) + if width <= 0 or height <= 0: + msg = "not a GIMP brush" + raise SyntaxError(msg) + if color_depth not in (1, 4): + msg = f"Unsupported GIMP brush color depth: {color_depth}" + raise SyntaxError(msg) + + if version == 1: + comment_length = header_size - 20 + else: + comment_length = header_size - 28 + magic_number = self.fp.read(4) + if magic_number != b"GIMP": + msg = "not a GIMP brush, bad magic number" + raise SyntaxError(msg) + self.info["spacing"] = i32(self.fp.read(4)) + + comment = self.fp.read(comment_length)[:-1] + + if color_depth == 1: + self._mode = "L" + else: + self._mode = "RGBA" + + self._size = width, height + + self.info["comment"] = comment + + # Image might not be small + Image._decompression_bomb_check(self.size) + + # Data is an uncompressed block of w * h * bytes/pixel + self._data_size = width * height * color_depth + + def load(self) -> Image.core.PixelAccess | None: + if self._im is None: + self.im = Image.core.new(self.mode, self.size) + self.frombytes(self.fp.read(self._data_size)) + return Image.Image.load(self) + + +# +# registry + + +Image.register_open(GbrImageFile.format, GbrImageFile, _accept) +Image.register_extension(GbrImageFile.format, ".gbr") diff --git a/venv/lib/python3.12/site-packages/PIL/GdImageFile.py b/venv/lib/python3.12/site-packages/PIL/GdImageFile.py new file mode 100644 index 0000000..f1b4969 --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/GdImageFile.py @@ -0,0 +1,102 @@ +# +# The Python Imaging Library. +# $Id$ +# +# GD file handling +# +# History: +# 1996-04-12 fl Created +# +# Copyright (c) 1997 by Secret Labs AB. +# Copyright (c) 1996 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# + + +""" +.. note:: + This format cannot be automatically recognized, so the + class is not registered for use with :py:func:`PIL.Image.open()`. To open a + gd file, use the :py:func:`PIL.GdImageFile.open()` function instead. + +.. warning:: + THE GD FORMAT IS NOT DESIGNED FOR DATA INTERCHANGE. This + implementation is provided for convenience and demonstrational + purposes only. +""" +from __future__ import annotations + +from typing import IO + +from . import ImageFile, ImagePalette, UnidentifiedImageError +from ._binary import i16be as i16 +from ._binary import i32be as i32 +from ._typing import StrOrBytesPath + + +class GdImageFile(ImageFile.ImageFile): + """ + Image plugin for the GD uncompressed format. Note that this format + is not supported by the standard :py:func:`PIL.Image.open()` function. To use + this plugin, you have to import the :py:mod:`PIL.GdImageFile` module and + use the :py:func:`PIL.GdImageFile.open()` function. + """ + + format = "GD" + format_description = "GD uncompressed images" + + def _open(self) -> None: + # Header + assert self.fp is not None + + s = self.fp.read(1037) + + if i16(s) not in [65534, 65535]: + msg = "Not a valid GD 2.x .gd file" + raise SyntaxError(msg) + + self._mode = "L" # FIXME: "P" + self._size = i16(s, 2), i16(s, 4) + + true_color = s[6] + true_color_offset = 2 if true_color else 0 + + # transparency index + tindex = i32(s, 7 + true_color_offset) + if tindex < 256: + self.info["transparency"] = tindex + + self.palette = ImagePalette.raw( + "XBGR", s[7 + true_color_offset + 4 : 7 + true_color_offset + 4 + 256 * 4] + ) + + self.tile = [ + ImageFile._Tile( + "raw", + (0, 0) + self.size, + 7 + true_color_offset + 4 + 256 * 4, + ("L", 0, 1), + ) + ] + + +def open(fp: StrOrBytesPath | IO[bytes], mode: str = "r") -> GdImageFile: + """ + Load texture from a GD image file. + + :param fp: GD file name, or an opened file handle. + :param mode: Optional mode. In this version, if the mode argument + is given, it must be "r". + :returns: An image instance. + :raises OSError: If the image could not be read. + """ + if mode != "r": + msg = "bad mode" + raise ValueError(msg) + + try: + return GdImageFile(fp) + except SyntaxError as e: + msg = "cannot identify this image file" + raise UnidentifiedImageError(msg) from e diff --git a/venv/lib/python3.12/site-packages/PIL/GifImagePlugin.py b/venv/lib/python3.12/site-packages/PIL/GifImagePlugin.py new file mode 100644 index 0000000..57c2917 --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/GifImagePlugin.py @@ -0,0 +1,1197 @@ +# +# The Python Imaging Library. +# $Id$ +# +# GIF file handling +# +# History: +# 1995-09-01 fl Created +# 1996-12-14 fl Added interlace support +# 1996-12-30 fl Added animation support +# 1997-01-05 fl Added write support, fixed local colour map bug +# 1997-02-23 fl Make sure to load raster data in getdata() +# 1997-07-05 fl Support external decoder (0.4) +# 1998-07-09 fl Handle all modes when saving (0.5) +# 1998-07-15 fl Renamed offset attribute to avoid name clash +# 2001-04-16 fl Added rewind support (seek to frame 0) (0.6) +# 2001-04-17 fl Added palette optimization (0.7) +# 2002-06-06 fl Added transparency support for save (0.8) +# 2004-02-24 fl Disable interlacing for small images +# +# Copyright (c) 1997-2004 by Secret Labs AB +# Copyright (c) 1995-2004 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import itertools +import math +import os +import subprocess +from enum import IntEnum +from functools import cached_property +from typing import IO, TYPE_CHECKING, Any, Literal, NamedTuple, Union + +from . import ( + Image, + ImageChops, + ImageFile, + ImageMath, + ImageOps, + ImagePalette, + ImageSequence, +) +from ._binary import i16le as i16 +from ._binary import o8 +from ._binary import o16le as o16 + +if TYPE_CHECKING: + from . import _imaging + from ._typing import Buffer + + +class LoadingStrategy(IntEnum): + """.. versionadded:: 9.1.0""" + + RGB_AFTER_FIRST = 0 + RGB_AFTER_DIFFERENT_PALETTE_ONLY = 1 + RGB_ALWAYS = 2 + + +#: .. versionadded:: 9.1.0 +LOADING_STRATEGY = LoadingStrategy.RGB_AFTER_FIRST + +# -------------------------------------------------------------------- +# Identify/read GIF files + + +def _accept(prefix: bytes) -> bool: + return prefix[:6] in [b"GIF87a", b"GIF89a"] + + +## +# Image plugin for GIF images. This plugin supports both GIF87 and +# GIF89 images. + + +class GifImageFile(ImageFile.ImageFile): + format = "GIF" + format_description = "Compuserve GIF" + _close_exclusive_fp_after_loading = False + + global_palette = None + + def data(self) -> bytes | None: + s = self.fp.read(1) + if s and s[0]: + return self.fp.read(s[0]) + return None + + def _is_palette_needed(self, p: bytes) -> bool: + for i in range(0, len(p), 3): + if not (i // 3 == p[i] == p[i + 1] == p[i + 2]): + return True + return False + + def _open(self) -> None: + # Screen + s = self.fp.read(13) + if not _accept(s): + msg = "not a GIF file" + raise SyntaxError(msg) + + self.info["version"] = s[:6] + self._size = i16(s, 6), i16(s, 8) + self.tile = [] + flags = s[10] + bits = (flags & 7) + 1 + + if flags & 128: + # get global palette + self.info["background"] = s[11] + # check if palette contains colour indices + p = self.fp.read(3 << bits) + if self._is_palette_needed(p): + p = ImagePalette.raw("RGB", p) + self.global_palette = self.palette = p + + self._fp = self.fp # FIXME: hack + self.__rewind = self.fp.tell() + self._n_frames: int | None = None + self._seek(0) # get ready to read first frame + + @property + def n_frames(self) -> int: + if self._n_frames is None: + current = self.tell() + try: + while True: + self._seek(self.tell() + 1, False) + except EOFError: + self._n_frames = self.tell() + 1 + self.seek(current) + return self._n_frames + + @cached_property + def is_animated(self) -> bool: + if self._n_frames is not None: + return self._n_frames != 1 + + current = self.tell() + if current: + return True + + try: + self._seek(1, False) + is_animated = True + except EOFError: + is_animated = False + + self.seek(current) + return is_animated + + def seek(self, frame: int) -> None: + if not self._seek_check(frame): + return + if frame < self.__frame: + self._im = None + self._seek(0) + + last_frame = self.__frame + for f in range(self.__frame + 1, frame + 1): + try: + self._seek(f) + except EOFError as e: + self.seek(last_frame) + msg = "no more images in GIF file" + raise EOFError(msg) from e + + def _seek(self, frame: int, update_image: bool = True) -> None: + if frame == 0: + # rewind + self.__offset = 0 + self.dispose: _imaging.ImagingCore | None = None + self.__frame = -1 + self._fp.seek(self.__rewind) + self.disposal_method = 0 + if "comment" in self.info: + del self.info["comment"] + else: + # ensure that the previous frame was loaded + if self.tile and update_image: + self.load() + + if frame != self.__frame + 1: + msg = f"cannot seek to frame {frame}" + raise ValueError(msg) + + self.fp = self._fp + if self.__offset: + # backup to last frame + self.fp.seek(self.__offset) + while self.data(): + pass + self.__offset = 0 + + s = self.fp.read(1) + if not s or s == b";": + msg = "no more images in GIF file" + raise EOFError(msg) + + palette: ImagePalette.ImagePalette | Literal[False] | None = None + + info: dict[str, Any] = {} + frame_transparency = None + interlace = None + frame_dispose_extent = None + while True: + if not s: + s = self.fp.read(1) + if not s or s == b";": + break + + elif s == b"!": + # + # extensions + # + s = self.fp.read(1) + block = self.data() + if s[0] == 249 and block is not None: + # + # graphic control extension + # + flags = block[0] + if flags & 1: + frame_transparency = block[3] + info["duration"] = i16(block, 1) * 10 + + # disposal method - find the value of bits 4 - 6 + dispose_bits = 0b00011100 & flags + dispose_bits = dispose_bits >> 2 + if dispose_bits: + # only set the dispose if it is not + # unspecified. I'm not sure if this is + # correct, but it seems to prevent the last + # frame from looking odd for some animations + self.disposal_method = dispose_bits + elif s[0] == 254: + # + # comment extension + # + comment = b"" + + # Read this comment block + while block: + comment += block + block = self.data() + + if "comment" in info: + # If multiple comment blocks in frame, separate with \n + info["comment"] += b"\n" + comment + else: + info["comment"] = comment + s = None + continue + elif s[0] == 255 and frame == 0 and block is not None: + # + # application extension + # + info["extension"] = block, self.fp.tell() + if block[:11] == b"NETSCAPE2.0": + block = self.data() + if block and len(block) >= 3 and block[0] == 1: + self.info["loop"] = i16(block, 1) + while self.data(): + pass + + elif s == b",": + # + # local image + # + s = self.fp.read(9) + + # extent + x0, y0 = i16(s, 0), i16(s, 2) + x1, y1 = x0 + i16(s, 4), y0 + i16(s, 6) + if (x1 > self.size[0] or y1 > self.size[1]) and update_image: + self._size = max(x1, self.size[0]), max(y1, self.size[1]) + Image._decompression_bomb_check(self._size) + frame_dispose_extent = x0, y0, x1, y1 + flags = s[8] + + interlace = (flags & 64) != 0 + + if flags & 128: + bits = (flags & 7) + 1 + p = self.fp.read(3 << bits) + if self._is_palette_needed(p): + palette = ImagePalette.raw("RGB", p) + else: + palette = False + + # image data + bits = self.fp.read(1)[0] + self.__offset = self.fp.tell() + break + s = None + + if interlace is None: + msg = "image not found in GIF frame" + raise EOFError(msg) + + self.__frame = frame + if not update_image: + return + + self.tile = [] + + if self.dispose: + self.im.paste(self.dispose, self.dispose_extent) + + self._frame_palette = palette if palette is not None else self.global_palette + self._frame_transparency = frame_transparency + if frame == 0: + if self._frame_palette: + if LOADING_STRATEGY == LoadingStrategy.RGB_ALWAYS: + self._mode = "RGBA" if frame_transparency is not None else "RGB" + else: + self._mode = "P" + else: + self._mode = "L" + + if palette: + self.palette = palette + elif self.global_palette: + from copy import copy + + self.palette = copy(self.global_palette) + else: + self.palette = None + else: + if self.mode == "P": + if ( + LOADING_STRATEGY != LoadingStrategy.RGB_AFTER_DIFFERENT_PALETTE_ONLY + or palette + ): + if "transparency" in self.info: + self.im.putpalettealpha(self.info["transparency"], 0) + self.im = self.im.convert("RGBA", Image.Dither.FLOYDSTEINBERG) + self._mode = "RGBA" + del self.info["transparency"] + else: + self._mode = "RGB" + self.im = self.im.convert("RGB", Image.Dither.FLOYDSTEINBERG) + + def _rgb(color: int) -> tuple[int, int, int]: + if self._frame_palette: + if color * 3 + 3 > len(self._frame_palette.palette): + color = 0 + return tuple(self._frame_palette.palette[color * 3 : color * 3 + 3]) + else: + return (color, color, color) + + self.dispose = None + self.dispose_extent = frame_dispose_extent + if self.dispose_extent and self.disposal_method >= 2: + try: + if self.disposal_method == 2: + # replace with background colour + + # only dispose the extent in this frame + x0, y0, x1, y1 = self.dispose_extent + dispose_size = (x1 - x0, y1 - y0) + + Image._decompression_bomb_check(dispose_size) + + # by convention, attempt to use transparency first + dispose_mode = "P" + color = self.info.get("transparency", frame_transparency) + if color is not None: + if self.mode in ("RGB", "RGBA"): + dispose_mode = "RGBA" + color = _rgb(color) + (0,) + else: + color = self.info.get("background", 0) + if self.mode in ("RGB", "RGBA"): + dispose_mode = "RGB" + color = _rgb(color) + self.dispose = Image.core.fill(dispose_mode, dispose_size, color) + else: + # replace with previous contents + if self._im is not None: + # only dispose the extent in this frame + self.dispose = self._crop(self.im, self.dispose_extent) + elif frame_transparency is not None: + x0, y0, x1, y1 = self.dispose_extent + dispose_size = (x1 - x0, y1 - y0) + + Image._decompression_bomb_check(dispose_size) + dispose_mode = "P" + color = frame_transparency + if self.mode in ("RGB", "RGBA"): + dispose_mode = "RGBA" + color = _rgb(frame_transparency) + (0,) + self.dispose = Image.core.fill( + dispose_mode, dispose_size, color + ) + except AttributeError: + pass + + if interlace is not None: + transparency = -1 + if frame_transparency is not None: + if frame == 0: + if LOADING_STRATEGY != LoadingStrategy.RGB_ALWAYS: + self.info["transparency"] = frame_transparency + elif self.mode not in ("RGB", "RGBA"): + transparency = frame_transparency + self.tile = [ + ImageFile._Tile( + "gif", + (x0, y0, x1, y1), + self.__offset, + (bits, interlace, transparency), + ) + ] + + if info.get("comment"): + self.info["comment"] = info["comment"] + for k in ["duration", "extension"]: + if k in info: + self.info[k] = info[k] + elif k in self.info: + del self.info[k] + + def load_prepare(self) -> None: + temp_mode = "P" if self._frame_palette else "L" + self._prev_im = None + if self.__frame == 0: + if self._frame_transparency is not None: + self.im = Image.core.fill( + temp_mode, self.size, self._frame_transparency + ) + elif self.mode in ("RGB", "RGBA"): + self._prev_im = self.im + if self._frame_palette: + self.im = Image.core.fill("P", self.size, self._frame_transparency or 0) + self.im.putpalette("RGB", *self._frame_palette.getdata()) + else: + self._im = None + if not self._prev_im and self._im is not None and self.size != self.im.size: + expanded_im = Image.core.fill(self.im.mode, self.size) + if self._frame_palette: + expanded_im.putpalette("RGB", *self._frame_palette.getdata()) + expanded_im.paste(self.im, (0, 0) + self.im.size) + + self.im = expanded_im + self._mode = temp_mode + self._frame_palette = None + + super().load_prepare() + + def load_end(self) -> None: + if self.__frame == 0: + if self.mode == "P" and LOADING_STRATEGY == LoadingStrategy.RGB_ALWAYS: + if self._frame_transparency is not None: + self.im.putpalettealpha(self._frame_transparency, 0) + self._mode = "RGBA" + else: + self._mode = "RGB" + self.im = self.im.convert(self.mode, Image.Dither.FLOYDSTEINBERG) + return + if not self._prev_im: + return + if self.size != self._prev_im.size: + if self._frame_transparency is not None: + expanded_im = Image.core.fill("RGBA", self.size) + else: + expanded_im = Image.core.fill("P", self.size) + expanded_im.putpalette("RGB", "RGB", self.im.getpalette()) + expanded_im = expanded_im.convert("RGB") + expanded_im.paste(self._prev_im, (0, 0) + self._prev_im.size) + + self._prev_im = expanded_im + assert self._prev_im is not None + if self._frame_transparency is not None: + self.im.putpalettealpha(self._frame_transparency, 0) + frame_im = self.im.convert("RGBA") + else: + frame_im = self.im.convert("RGB") + + assert self.dispose_extent is not None + frame_im = self._crop(frame_im, self.dispose_extent) + + self.im = self._prev_im + self._mode = self.im.mode + if frame_im.mode == "RGBA": + self.im.paste(frame_im, self.dispose_extent, frame_im) + else: + self.im.paste(frame_im, self.dispose_extent) + + def tell(self) -> int: + return self.__frame + + +# -------------------------------------------------------------------- +# Write GIF files + + +RAWMODE = {"1": "L", "L": "L", "P": "P"} + + +def _normalize_mode(im: Image.Image) -> Image.Image: + """ + Takes an image (or frame), returns an image in a mode that is appropriate + for saving in a Gif. + + It may return the original image, or it may return an image converted to + palette or 'L' mode. + + :param im: Image object + :returns: Image object + """ + if im.mode in RAWMODE: + im.load() + return im + if Image.getmodebase(im.mode) == "RGB": + im = im.convert("P", palette=Image.Palette.ADAPTIVE) + assert im.palette is not None + if im.palette.mode == "RGBA": + for rgba in im.palette.colors: + if rgba[3] == 0: + im.info["transparency"] = im.palette.colors[rgba] + break + return im + return im.convert("L") + + +_Palette = Union[bytes, bytearray, list[int], ImagePalette.ImagePalette] + + +def _normalize_palette( + im: Image.Image, palette: _Palette | None, info: dict[str, Any] +) -> Image.Image: + """ + Normalizes the palette for image. + - Sets the palette to the incoming palette, if provided. + - Ensures that there's a palette for L mode images + - Optimizes the palette if necessary/desired. + + :param im: Image object + :param palette: bytes object containing the source palette, or .... + :param info: encoderinfo + :returns: Image object + """ + source_palette = None + if palette: + # a bytes palette + if isinstance(palette, (bytes, bytearray, list)): + source_palette = bytearray(palette[:768]) + if isinstance(palette, ImagePalette.ImagePalette): + source_palette = bytearray(palette.palette) + + if im.mode == "P": + if not source_palette: + im_palette = im.getpalette(None) + assert im_palette is not None + source_palette = bytearray(im_palette) + else: # L-mode + if not source_palette: + source_palette = bytearray(i // 3 for i in range(768)) + im.palette = ImagePalette.ImagePalette("RGB", palette=source_palette) + assert source_palette is not None + + if palette: + used_palette_colors: list[int | None] = [] + assert im.palette is not None + for i in range(0, len(source_palette), 3): + source_color = tuple(source_palette[i : i + 3]) + index = im.palette.colors.get(source_color) + if index in used_palette_colors: + index = None + used_palette_colors.append(index) + for i, index in enumerate(used_palette_colors): + if index is None: + for j in range(len(used_palette_colors)): + if j not in used_palette_colors: + used_palette_colors[i] = j + break + dest_map: list[int] = [] + for index in used_palette_colors: + assert index is not None + dest_map.append(index) + im = im.remap_palette(dest_map) + else: + optimized_palette_colors = _get_optimize(im, info) + if optimized_palette_colors is not None: + im = im.remap_palette(optimized_palette_colors, source_palette) + if "transparency" in info: + try: + info["transparency"] = optimized_palette_colors.index( + info["transparency"] + ) + except ValueError: + del info["transparency"] + return im + + assert im.palette is not None + im.palette.palette = source_palette + return im + + +def _write_single_frame( + im: Image.Image, + fp: IO[bytes], + palette: _Palette | None, +) -> None: + im_out = _normalize_mode(im) + for k, v in im_out.info.items(): + if isinstance(k, str): + im.encoderinfo.setdefault(k, v) + im_out = _normalize_palette(im_out, palette, im.encoderinfo) + + for s in _get_global_header(im_out, im.encoderinfo): + fp.write(s) + + # local image header + flags = 0 + if get_interlace(im): + flags = flags | 64 + _write_local_header(fp, im, (0, 0), flags) + + im_out.encoderconfig = (8, get_interlace(im)) + ImageFile._save( + im_out, fp, [ImageFile._Tile("gif", (0, 0) + im.size, 0, RAWMODE[im_out.mode])] + ) + + fp.write(b"\0") # end of image data + + +def _getbbox( + base_im: Image.Image, im_frame: Image.Image +) -> tuple[Image.Image, tuple[int, int, int, int] | None]: + palette_bytes = [ + bytes(im.palette.palette) if im.palette else b"" for im in (base_im, im_frame) + ] + if palette_bytes[0] != palette_bytes[1]: + im_frame = im_frame.convert("RGBA") + base_im = base_im.convert("RGBA") + delta = ImageChops.subtract_modulo(im_frame, base_im) + return delta, delta.getbbox(alpha_only=False) + + +class _Frame(NamedTuple): + im: Image.Image + bbox: tuple[int, int, int, int] | None + encoderinfo: dict[str, Any] + + +def _write_multiple_frames( + im: Image.Image, fp: IO[bytes], palette: _Palette | None +) -> bool: + duration = im.encoderinfo.get("duration") + disposal = im.encoderinfo.get("disposal", im.info.get("disposal")) + + im_frames: list[_Frame] = [] + previous_im: Image.Image | None = None + frame_count = 0 + background_im = None + for imSequence in itertools.chain([im], im.encoderinfo.get("append_images", [])): + for im_frame in ImageSequence.Iterator(imSequence): + # a copy is required here since seek can still mutate the image + im_frame = _normalize_mode(im_frame.copy()) + if frame_count == 0: + for k, v in im_frame.info.items(): + if k == "transparency": + continue + if isinstance(k, str): + im.encoderinfo.setdefault(k, v) + + encoderinfo = im.encoderinfo.copy() + if "transparency" in im_frame.info: + encoderinfo.setdefault("transparency", im_frame.info["transparency"]) + im_frame = _normalize_palette(im_frame, palette, encoderinfo) + if isinstance(duration, (list, tuple)): + encoderinfo["duration"] = duration[frame_count] + elif duration is None and "duration" in im_frame.info: + encoderinfo["duration"] = im_frame.info["duration"] + if isinstance(disposal, (list, tuple)): + encoderinfo["disposal"] = disposal[frame_count] + frame_count += 1 + + diff_frame = None + if im_frames and previous_im: + # delta frame + delta, bbox = _getbbox(previous_im, im_frame) + if not bbox: + # This frame is identical to the previous frame + if encoderinfo.get("duration"): + im_frames[-1].encoderinfo["duration"] += encoderinfo["duration"] + continue + if im_frames[-1].encoderinfo.get("disposal") == 2: + if background_im is None: + color = im.encoderinfo.get( + "transparency", im.info.get("transparency", (0, 0, 0)) + ) + background = _get_background(im_frame, color) + background_im = Image.new("P", im_frame.size, background) + assert im_frames[0].im.palette is not None + background_im.putpalette(im_frames[0].im.palette) + bbox = _getbbox(background_im, im_frame)[1] + elif encoderinfo.get("optimize") and im_frame.mode != "1": + if "transparency" not in encoderinfo: + assert im_frame.palette is not None + try: + encoderinfo["transparency"] = ( + im_frame.palette._new_color_index(im_frame) + ) + except ValueError: + pass + if "transparency" in encoderinfo: + # When the delta is zero, fill the image with transparency + diff_frame = im_frame.copy() + fill = Image.new("P", delta.size, encoderinfo["transparency"]) + if delta.mode == "RGBA": + r, g, b, a = delta.split() + mask = ImageMath.lambda_eval( + lambda args: args["convert"]( + args["max"]( + args["max"]( + args["max"](args["r"], args["g"]), args["b"] + ), + args["a"], + ) + * 255, + "1", + ), + r=r, + g=g, + b=b, + a=a, + ) + else: + if delta.mode == "P": + # Convert to L without considering palette + delta_l = Image.new("L", delta.size) + delta_l.putdata(delta.getdata()) + delta = delta_l + mask = ImageMath.lambda_eval( + lambda args: args["convert"](args["im"] * 255, "1"), + im=delta, + ) + diff_frame.paste(fill, mask=ImageOps.invert(mask)) + else: + bbox = None + previous_im = im_frame + im_frames.append(_Frame(diff_frame or im_frame, bbox, encoderinfo)) + + if len(im_frames) == 1: + if "duration" in im.encoderinfo: + # Since multiple frames will not be written, use the combined duration + im.encoderinfo["duration"] = im_frames[0].encoderinfo["duration"] + return False + + for frame_data in im_frames: + im_frame = frame_data.im + if not frame_data.bbox: + # global header + for s in _get_global_header(im_frame, frame_data.encoderinfo): + fp.write(s) + offset = (0, 0) + else: + # compress difference + if not palette: + frame_data.encoderinfo["include_color_table"] = True + + im_frame = im_frame.crop(frame_data.bbox) + offset = frame_data.bbox[:2] + _write_frame_data(fp, im_frame, offset, frame_data.encoderinfo) + return True + + +def _save_all(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + _save(im, fp, filename, save_all=True) + + +def _save( + im: Image.Image, fp: IO[bytes], filename: str | bytes, save_all: bool = False +) -> None: + # header + if "palette" in im.encoderinfo or "palette" in im.info: + palette = im.encoderinfo.get("palette", im.info.get("palette")) + else: + palette = None + im.encoderinfo.setdefault("optimize", True) + + if not save_all or not _write_multiple_frames(im, fp, palette): + _write_single_frame(im, fp, palette) + + fp.write(b";") # end of file + + if hasattr(fp, "flush"): + fp.flush() + + +def get_interlace(im: Image.Image) -> int: + interlace = im.encoderinfo.get("interlace", 1) + + # workaround for @PIL153 + if min(im.size) < 16: + interlace = 0 + + return interlace + + +def _write_local_header( + fp: IO[bytes], im: Image.Image, offset: tuple[int, int], flags: int +) -> None: + try: + transparency = im.encoderinfo["transparency"] + except KeyError: + transparency = None + + if "duration" in im.encoderinfo: + duration = int(im.encoderinfo["duration"] / 10) + else: + duration = 0 + + disposal = int(im.encoderinfo.get("disposal", 0)) + + if transparency is not None or duration != 0 or disposal: + packed_flag = 1 if transparency is not None else 0 + packed_flag |= disposal << 2 + + fp.write( + b"!" + + o8(249) # extension intro + + o8(4) # length + + o8(packed_flag) # packed fields + + o16(duration) # duration + + o8(transparency or 0) # transparency index + + o8(0) + ) + + include_color_table = im.encoderinfo.get("include_color_table") + if include_color_table: + palette_bytes = _get_palette_bytes(im) + color_table_size = _get_color_table_size(palette_bytes) + if color_table_size: + flags = flags | 128 # local color table flag + flags = flags | color_table_size + + fp.write( + b"," + + o16(offset[0]) # offset + + o16(offset[1]) + + o16(im.size[0]) # size + + o16(im.size[1]) + + o8(flags) # flags + ) + if include_color_table and color_table_size: + fp.write(_get_header_palette(palette_bytes)) + fp.write(o8(8)) # bits + + +def _save_netpbm(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + # Unused by default. + # To use, uncomment the register_save call at the end of the file. + # + # If you need real GIF compression and/or RGB quantization, you + # can use the external NETPBM/PBMPLUS utilities. See comments + # below for information on how to enable this. + tempfile = im._dump() + + try: + with open(filename, "wb") as f: + if im.mode != "RGB": + subprocess.check_call( + ["ppmtogif", tempfile], stdout=f, stderr=subprocess.DEVNULL + ) + else: + # Pipe ppmquant output into ppmtogif + # "ppmquant 256 %s | ppmtogif > %s" % (tempfile, filename) + quant_cmd = ["ppmquant", "256", tempfile] + togif_cmd = ["ppmtogif"] + quant_proc = subprocess.Popen( + quant_cmd, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL + ) + togif_proc = subprocess.Popen( + togif_cmd, + stdin=quant_proc.stdout, + stdout=f, + stderr=subprocess.DEVNULL, + ) + + # Allow ppmquant to receive SIGPIPE if ppmtogif exits + assert quant_proc.stdout is not None + quant_proc.stdout.close() + + retcode = quant_proc.wait() + if retcode: + raise subprocess.CalledProcessError(retcode, quant_cmd) + + retcode = togif_proc.wait() + if retcode: + raise subprocess.CalledProcessError(retcode, togif_cmd) + finally: + try: + os.unlink(tempfile) + except OSError: + pass + + +# Force optimization so that we can test performance against +# cases where it took lots of memory and time previously. +_FORCE_OPTIMIZE = False + + +def _get_optimize(im: Image.Image, info: dict[str, Any]) -> list[int] | None: + """ + Palette optimization is a potentially expensive operation. + + This function determines if the palette should be optimized using + some heuristics, then returns the list of palette entries in use. + + :param im: Image object + :param info: encoderinfo + :returns: list of indexes of palette entries in use, or None + """ + if im.mode in ("P", "L") and info and info.get("optimize"): + # Potentially expensive operation. + + # The palette saves 3 bytes per color not used, but palette + # lengths are restricted to 3*(2**N) bytes. Max saving would + # be 768 -> 6 bytes if we went all the way down to 2 colors. + # * If we're over 128 colors, we can't save any space. + # * If there aren't any holes, it's not worth collapsing. + # * If we have a 'large' image, the palette is in the noise. + + # create the new palette if not every color is used + optimise = _FORCE_OPTIMIZE or im.mode == "L" + if optimise or im.width * im.height < 512 * 512: + # check which colors are used + used_palette_colors = [] + for i, count in enumerate(im.histogram()): + if count: + used_palette_colors.append(i) + + if optimise or max(used_palette_colors) >= len(used_palette_colors): + return used_palette_colors + + assert im.palette is not None + num_palette_colors = len(im.palette.palette) // Image.getmodebands( + im.palette.mode + ) + current_palette_size = 1 << (num_palette_colors - 1).bit_length() + if ( + # check that the palette would become smaller when saved + len(used_palette_colors) <= current_palette_size // 2 + # check that the palette is not already the smallest possible size + and current_palette_size > 2 + ): + return used_palette_colors + return None + + +def _get_color_table_size(palette_bytes: bytes) -> int: + # calculate the palette size for the header + if not palette_bytes: + return 0 + elif len(palette_bytes) < 9: + return 1 + else: + return math.ceil(math.log(len(palette_bytes) // 3, 2)) - 1 + + +def _get_header_palette(palette_bytes: bytes) -> bytes: + """ + Returns the palette, null padded to the next power of 2 (*3) bytes + suitable for direct inclusion in the GIF header + + :param palette_bytes: Unpadded palette bytes, in RGBRGB form + :returns: Null padded palette + """ + color_table_size = _get_color_table_size(palette_bytes) + + # add the missing amount of bytes + # the palette has to be 2< 0: + palette_bytes += o8(0) * 3 * actual_target_size_diff + return palette_bytes + + +def _get_palette_bytes(im: Image.Image) -> bytes: + """ + Gets the palette for inclusion in the gif header + + :param im: Image object + :returns: Bytes, len<=768 suitable for inclusion in gif header + """ + if not im.palette: + return b"" + + palette = bytes(im.palette.palette) + if im.palette.mode == "RGBA": + palette = b"".join(palette[i * 4 : i * 4 + 3] for i in range(len(palette) // 3)) + return palette + + +def _get_background( + im: Image.Image, + info_background: int | tuple[int, int, int] | tuple[int, int, int, int] | None, +) -> int: + background = 0 + if info_background: + if isinstance(info_background, tuple): + # WebPImagePlugin stores an RGBA value in info["background"] + # So it must be converted to the same format as GifImagePlugin's + # info["background"] - a global color table index + assert im.palette is not None + try: + background = im.palette.getcolor(info_background, im) + except ValueError as e: + if str(e) not in ( + # If all 256 colors are in use, + # then there is no need for the background color + "cannot allocate more than 256 colors", + # Ignore non-opaque WebP background + "cannot add non-opaque RGBA color to RGB palette", + ): + raise + else: + background = info_background + return background + + +def _get_global_header(im: Image.Image, info: dict[str, Any]) -> list[bytes]: + """Return a list of strings representing a GIF header""" + + # Header Block + # https://www.matthewflickinger.com/lab/whatsinagif/bits_and_bytes.asp + + version = b"87a" + if im.info.get("version") == b"89a" or ( + info + and ( + "transparency" in info + or info.get("loop") is not None + or info.get("duration") + or info.get("comment") + ) + ): + version = b"89a" + + background = _get_background(im, info.get("background")) + + palette_bytes = _get_palette_bytes(im) + color_table_size = _get_color_table_size(palette_bytes) + + header = [ + b"GIF" # signature + + version # version + + o16(im.size[0]) # canvas width + + o16(im.size[1]), # canvas height + # Logical Screen Descriptor + # size of global color table + global color table flag + o8(color_table_size + 128), # packed fields + # background + reserved/aspect + o8(background) + o8(0), + # Global Color Table + _get_header_palette(palette_bytes), + ] + if info.get("loop") is not None: + header.append( + b"!" + + o8(255) # extension intro + + o8(11) + + b"NETSCAPE2.0" + + o8(3) + + o8(1) + + o16(info["loop"]) # number of loops + + o8(0) + ) + if info.get("comment"): + comment_block = b"!" + o8(254) # extension intro + + comment = info["comment"] + if isinstance(comment, str): + comment = comment.encode() + for i in range(0, len(comment), 255): + subblock = comment[i : i + 255] + comment_block += o8(len(subblock)) + subblock + + comment_block += o8(0) + header.append(comment_block) + return header + + +def _write_frame_data( + fp: IO[bytes], + im_frame: Image.Image, + offset: tuple[int, int], + params: dict[str, Any], +) -> None: + try: + im_frame.encoderinfo = params + + # local image header + _write_local_header(fp, im_frame, offset, 0) + + ImageFile._save( + im_frame, + fp, + [ImageFile._Tile("gif", (0, 0) + im_frame.size, 0, RAWMODE[im_frame.mode])], + ) + + fp.write(b"\0") # end of image data + finally: + del im_frame.encoderinfo + + +# -------------------------------------------------------------------- +# Legacy GIF utilities + + +def getheader( + im: Image.Image, palette: _Palette | None = None, info: dict[str, Any] | None = None +) -> tuple[list[bytes], list[int] | None]: + """ + Legacy Method to get Gif data from image. + + Warning:: May modify image data. + + :param im: Image object + :param palette: bytes object containing the source palette, or .... + :param info: encoderinfo + :returns: tuple of(list of header items, optimized palette) + + """ + if info is None: + info = {} + + used_palette_colors = _get_optimize(im, info) + + if "background" not in info and "background" in im.info: + info["background"] = im.info["background"] + + im_mod = _normalize_palette(im, palette, info) + im.palette = im_mod.palette + im.im = im_mod.im + header = _get_global_header(im, info) + + return header, used_palette_colors + + +def getdata( + im: Image.Image, offset: tuple[int, int] = (0, 0), **params: Any +) -> list[bytes]: + """ + Legacy Method + + Return a list of strings representing this image. + The first string is a local image header, the rest contains + encoded image data. + + To specify duration, add the time in milliseconds, + e.g. ``getdata(im_frame, duration=1000)`` + + :param im: Image object + :param offset: Tuple of (x, y) pixels. Defaults to (0, 0) + :param \\**params: e.g. duration or other encoder info parameters + :returns: List of bytes containing GIF encoded frame data + + """ + from io import BytesIO + + class Collector(BytesIO): + data = [] + + def write(self, data: Buffer) -> int: + self.data.append(data) + return len(data) + + im.load() # make sure raster data is available + + fp = Collector() + + _write_frame_data(fp, im, offset, params) + + return fp.data + + +# -------------------------------------------------------------------- +# Registry + +Image.register_open(GifImageFile.format, GifImageFile, _accept) +Image.register_save(GifImageFile.format, _save) +Image.register_save_all(GifImageFile.format, _save_all) +Image.register_extension(GifImageFile.format, ".gif") +Image.register_mime(GifImageFile.format, "image/gif") + +# +# Uncomment the following line if you wish to use NETPBM/PBMPLUS +# instead of the built-in "uncompressed" GIF encoder + +# Image.register_save(GifImageFile.format, _save_netpbm) diff --git a/venv/lib/python3.12/site-packages/PIL/GimpGradientFile.py b/venv/lib/python3.12/site-packages/PIL/GimpGradientFile.py new file mode 100644 index 0000000..220eac5 --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/GimpGradientFile.py @@ -0,0 +1,149 @@ +# +# Python Imaging Library +# $Id$ +# +# stuff to read (and render) GIMP gradient files +# +# History: +# 97-08-23 fl Created +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1997. +# +# See the README file for information on usage and redistribution. +# + +""" +Stuff to translate curve segments to palette values (derived from +the corresponding code in GIMP, written by Federico Mena Quintero. +See the GIMP distribution for more information.) +""" +from __future__ import annotations + +from math import log, pi, sin, sqrt +from typing import IO, Callable + +from ._binary import o8 + +EPSILON = 1e-10 +"""""" # Enable auto-doc for data member + + +def linear(middle: float, pos: float) -> float: + if pos <= middle: + if middle < EPSILON: + return 0.0 + else: + return 0.5 * pos / middle + else: + pos = pos - middle + middle = 1.0 - middle + if middle < EPSILON: + return 1.0 + else: + return 0.5 + 0.5 * pos / middle + + +def curved(middle: float, pos: float) -> float: + return pos ** (log(0.5) / log(max(middle, EPSILON))) + + +def sine(middle: float, pos: float) -> float: + return (sin((-pi / 2.0) + pi * linear(middle, pos)) + 1.0) / 2.0 + + +def sphere_increasing(middle: float, pos: float) -> float: + return sqrt(1.0 - (linear(middle, pos) - 1.0) ** 2) + + +def sphere_decreasing(middle: float, pos: float) -> float: + return 1.0 - sqrt(1.0 - linear(middle, pos) ** 2) + + +SEGMENTS = [linear, curved, sine, sphere_increasing, sphere_decreasing] +"""""" # Enable auto-doc for data member + + +class GradientFile: + gradient: ( + list[ + tuple[ + float, + float, + float, + list[float], + list[float], + Callable[[float, float], float], + ] + ] + | None + ) = None + + def getpalette(self, entries: int = 256) -> tuple[bytes, str]: + assert self.gradient is not None + palette = [] + + ix = 0 + x0, x1, xm, rgb0, rgb1, segment = self.gradient[ix] + + for i in range(entries): + x = i / (entries - 1) + + while x1 < x: + ix += 1 + x0, x1, xm, rgb0, rgb1, segment = self.gradient[ix] + + w = x1 - x0 + + if w < EPSILON: + scale = segment(0.5, 0.5) + else: + scale = segment((xm - x0) / w, (x - x0) / w) + + # expand to RGBA + r = o8(int(255 * ((rgb1[0] - rgb0[0]) * scale + rgb0[0]) + 0.5)) + g = o8(int(255 * ((rgb1[1] - rgb0[1]) * scale + rgb0[1]) + 0.5)) + b = o8(int(255 * ((rgb1[2] - rgb0[2]) * scale + rgb0[2]) + 0.5)) + a = o8(int(255 * ((rgb1[3] - rgb0[3]) * scale + rgb0[3]) + 0.5)) + + # add to palette + palette.append(r + g + b + a) + + return b"".join(palette), "RGBA" + + +class GimpGradientFile(GradientFile): + """File handler for GIMP's gradient format.""" + + def __init__(self, fp: IO[bytes]) -> None: + if fp.readline()[:13] != b"GIMP Gradient": + msg = "not a GIMP gradient file" + raise SyntaxError(msg) + + line = fp.readline() + + # GIMP 1.2 gradient files don't contain a name, but GIMP 1.3 files do + if line.startswith(b"Name: "): + line = fp.readline().strip() + + count = int(line) + + self.gradient = [] + + for i in range(count): + s = fp.readline().split() + w = [float(x) for x in s[:11]] + + x0, x1 = w[0], w[2] + xm = w[1] + rgb0 = w[3:7] + rgb1 = w[7:11] + + segment = SEGMENTS[int(s[11])] + cspace = int(s[12]) + + if cspace != 0: + msg = "cannot handle HSV colour space" + raise OSError(msg) + + self.gradient.append((x0, x1, xm, rgb0, rgb1, segment)) diff --git a/venv/lib/python3.12/site-packages/PIL/GimpPaletteFile.py b/venv/lib/python3.12/site-packages/PIL/GimpPaletteFile.py new file mode 100644 index 0000000..4cad0eb --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/GimpPaletteFile.py @@ -0,0 +1,58 @@ +# +# Python Imaging Library +# $Id$ +# +# stuff to read GIMP palette files +# +# History: +# 1997-08-23 fl Created +# 2004-09-07 fl Support GIMP 2.0 palette files. +# +# Copyright (c) Secret Labs AB 1997-2004. All rights reserved. +# Copyright (c) Fredrik Lundh 1997-2004. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import re +from typing import IO + +from ._binary import o8 + + +class GimpPaletteFile: + """File handler for GIMP's palette format.""" + + rawmode = "RGB" + + def __init__(self, fp: IO[bytes]) -> None: + palette = [o8(i) * 3 for i in range(256)] + + if fp.readline()[:12] != b"GIMP Palette": + msg = "not a GIMP palette file" + raise SyntaxError(msg) + + for i in range(256): + s = fp.readline() + if not s: + break + + # skip fields and comment lines + if re.match(rb"\w+:|#", s): + continue + if len(s) > 100: + msg = "bad palette file" + raise SyntaxError(msg) + + v = tuple(map(int, s.split()[:3])) + if len(v) != 3: + msg = "bad palette entry" + raise ValueError(msg) + + palette[i] = o8(v[0]) + o8(v[1]) + o8(v[2]) + + self.palette = b"".join(palette) + + def getpalette(self) -> tuple[bytes, str]: + return self.palette, self.rawmode diff --git a/venv/lib/python3.12/site-packages/PIL/GribStubImagePlugin.py b/venv/lib/python3.12/site-packages/PIL/GribStubImagePlugin.py new file mode 100644 index 0000000..e9aa084 --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/GribStubImagePlugin.py @@ -0,0 +1,76 @@ +# +# The Python Imaging Library +# $Id$ +# +# GRIB stub adapter +# +# Copyright (c) 1996-2003 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +from typing import IO + +from . import Image, ImageFile + +_handler = None + + +def register_handler(handler: ImageFile.StubHandler | None) -> None: + """ + Install application-specific GRIB image handler. + + :param handler: Handler object. + """ + global _handler + _handler = handler + + +# -------------------------------------------------------------------- +# Image adapter + + +def _accept(prefix: bytes) -> bool: + return prefix[:4] == b"GRIB" and prefix[7] == 1 + + +class GribStubImageFile(ImageFile.StubImageFile): + format = "GRIB" + format_description = "GRIB" + + def _open(self) -> None: + offset = self.fp.tell() + + if not _accept(self.fp.read(8)): + msg = "Not a GRIB file" + raise SyntaxError(msg) + + self.fp.seek(offset) + + # make something up + self._mode = "F" + self._size = 1, 1 + + loader = self._load() + if loader: + loader.open(self) + + def _load(self) -> ImageFile.StubHandler | None: + return _handler + + +def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + if _handler is None or not hasattr(_handler, "save"): + msg = "GRIB save handler not installed" + raise OSError(msg) + _handler.save(im, fp, filename) + + +# -------------------------------------------------------------------- +# Registry + +Image.register_open(GribStubImageFile.format, GribStubImageFile, _accept) +Image.register_save(GribStubImageFile.format, _save) + +Image.register_extension(GribStubImageFile.format, ".grib") diff --git a/venv/lib/python3.12/site-packages/PIL/Hdf5StubImagePlugin.py b/venv/lib/python3.12/site-packages/PIL/Hdf5StubImagePlugin.py new file mode 100644 index 0000000..cc9e73d --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/Hdf5StubImagePlugin.py @@ -0,0 +1,76 @@ +# +# The Python Imaging Library +# $Id$ +# +# HDF5 stub adapter +# +# Copyright (c) 2000-2003 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +from typing import IO + +from . import Image, ImageFile + +_handler = None + + +def register_handler(handler: ImageFile.StubHandler | None) -> None: + """ + Install application-specific HDF5 image handler. + + :param handler: Handler object. + """ + global _handler + _handler = handler + + +# -------------------------------------------------------------------- +# Image adapter + + +def _accept(prefix: bytes) -> bool: + return prefix[:8] == b"\x89HDF\r\n\x1a\n" + + +class HDF5StubImageFile(ImageFile.StubImageFile): + format = "HDF5" + format_description = "HDF5" + + def _open(self) -> None: + offset = self.fp.tell() + + if not _accept(self.fp.read(8)): + msg = "Not an HDF file" + raise SyntaxError(msg) + + self.fp.seek(offset) + + # make something up + self._mode = "F" + self._size = 1, 1 + + loader = self._load() + if loader: + loader.open(self) + + def _load(self) -> ImageFile.StubHandler | None: + return _handler + + +def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + if _handler is None or not hasattr(_handler, "save"): + msg = "HDF5 save handler not installed" + raise OSError(msg) + _handler.save(im, fp, filename) + + +# -------------------------------------------------------------------- +# Registry + +Image.register_open(HDF5StubImageFile.format, HDF5StubImageFile, _accept) +Image.register_save(HDF5StubImageFile.format, _save) + +Image.register_extensions(HDF5StubImageFile.format, [".h5", ".hdf"]) diff --git a/venv/lib/python3.12/site-packages/PIL/IcnsImagePlugin.py b/venv/lib/python3.12/site-packages/PIL/IcnsImagePlugin.py new file mode 100644 index 0000000..9757b2b --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/IcnsImagePlugin.py @@ -0,0 +1,412 @@ +# +# The Python Imaging Library. +# $Id$ +# +# macOS icns file decoder, based on icns.py by Bob Ippolito. +# +# history: +# 2004-10-09 fl Turned into a PIL plugin; removed 2.3 dependencies. +# 2020-04-04 Allow saving on all operating systems. +# +# Copyright (c) 2004 by Bob Ippolito. +# Copyright (c) 2004 by Secret Labs. +# Copyright (c) 2004 by Fredrik Lundh. +# Copyright (c) 2014 by Alastair Houghton. +# Copyright (c) 2020 by Pan Jing. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import io +import os +import struct +import sys +from typing import IO + +from . import Image, ImageFile, PngImagePlugin, features +from ._deprecate import deprecate + +enable_jpeg2k = features.check_codec("jpg_2000") +if enable_jpeg2k: + from . import Jpeg2KImagePlugin + +MAGIC = b"icns" +HEADERSIZE = 8 + + +def nextheader(fobj: IO[bytes]) -> tuple[bytes, int]: + return struct.unpack(">4sI", fobj.read(HEADERSIZE)) + + +def read_32t( + fobj: IO[bytes], start_length: tuple[int, int], size: tuple[int, int, int] +) -> dict[str, Image.Image]: + # The 128x128 icon seems to have an extra header for some reason. + (start, length) = start_length + fobj.seek(start) + sig = fobj.read(4) + if sig != b"\x00\x00\x00\x00": + msg = "Unknown signature, expecting 0x00000000" + raise SyntaxError(msg) + return read_32(fobj, (start + 4, length - 4), size) + + +def read_32( + fobj: IO[bytes], start_length: tuple[int, int], size: tuple[int, int, int] +) -> dict[str, Image.Image]: + """ + Read a 32bit RGB icon resource. Seems to be either uncompressed or + an RLE packbits-like scheme. + """ + (start, length) = start_length + fobj.seek(start) + pixel_size = (size[0] * size[2], size[1] * size[2]) + sizesq = pixel_size[0] * pixel_size[1] + if length == sizesq * 3: + # uncompressed ("RGBRGBGB") + indata = fobj.read(length) + im = Image.frombuffer("RGB", pixel_size, indata, "raw", "RGB", 0, 1) + else: + # decode image + im = Image.new("RGB", pixel_size, None) + for band_ix in range(3): + data = [] + bytesleft = sizesq + while bytesleft > 0: + byte = fobj.read(1) + if not byte: + break + byte_int = byte[0] + if byte_int & 0x80: + blocksize = byte_int - 125 + byte = fobj.read(1) + for i in range(blocksize): + data.append(byte) + else: + blocksize = byte_int + 1 + data.append(fobj.read(blocksize)) + bytesleft -= blocksize + if bytesleft <= 0: + break + if bytesleft != 0: + msg = f"Error reading channel [{repr(bytesleft)} left]" + raise SyntaxError(msg) + band = Image.frombuffer("L", pixel_size, b"".join(data), "raw", "L", 0, 1) + im.im.putband(band.im, band_ix) + return {"RGB": im} + + +def read_mk( + fobj: IO[bytes], start_length: tuple[int, int], size: tuple[int, int, int] +) -> dict[str, Image.Image]: + # Alpha masks seem to be uncompressed + start = start_length[0] + fobj.seek(start) + pixel_size = (size[0] * size[2], size[1] * size[2]) + sizesq = pixel_size[0] * pixel_size[1] + band = Image.frombuffer("L", pixel_size, fobj.read(sizesq), "raw", "L", 0, 1) + return {"A": band} + + +def read_png_or_jpeg2000( + fobj: IO[bytes], start_length: tuple[int, int], size: tuple[int, int, int] +) -> dict[str, Image.Image]: + (start, length) = start_length + fobj.seek(start) + sig = fobj.read(12) + + im: Image.Image + if sig[:8] == b"\x89PNG\x0d\x0a\x1a\x0a": + fobj.seek(start) + im = PngImagePlugin.PngImageFile(fobj) + Image._decompression_bomb_check(im.size) + return {"RGBA": im} + elif ( + sig[:4] == b"\xff\x4f\xff\x51" + or sig[:4] == b"\x0d\x0a\x87\x0a" + or sig == b"\x00\x00\x00\x0cjP \x0d\x0a\x87\x0a" + ): + if not enable_jpeg2k: + msg = ( + "Unsupported icon subimage format (rebuild PIL " + "with JPEG 2000 support to fix this)" + ) + raise ValueError(msg) + # j2k, jpc or j2c + fobj.seek(start) + jp2kstream = fobj.read(length) + f = io.BytesIO(jp2kstream) + im = Jpeg2KImagePlugin.Jpeg2KImageFile(f) + Image._decompression_bomb_check(im.size) + if im.mode != "RGBA": + im = im.convert("RGBA") + return {"RGBA": im} + else: + msg = "Unsupported icon subimage format" + raise ValueError(msg) + + +class IcnsFile: + SIZES = { + (512, 512, 2): [(b"ic10", read_png_or_jpeg2000)], + (512, 512, 1): [(b"ic09", read_png_or_jpeg2000)], + (256, 256, 2): [(b"ic14", read_png_or_jpeg2000)], + (256, 256, 1): [(b"ic08", read_png_or_jpeg2000)], + (128, 128, 2): [(b"ic13", read_png_or_jpeg2000)], + (128, 128, 1): [ + (b"ic07", read_png_or_jpeg2000), + (b"it32", read_32t), + (b"t8mk", read_mk), + ], + (64, 64, 1): [(b"icp6", read_png_or_jpeg2000)], + (32, 32, 2): [(b"ic12", read_png_or_jpeg2000)], + (48, 48, 1): [(b"ih32", read_32), (b"h8mk", read_mk)], + (32, 32, 1): [ + (b"icp5", read_png_or_jpeg2000), + (b"il32", read_32), + (b"l8mk", read_mk), + ], + (16, 16, 2): [(b"ic11", read_png_or_jpeg2000)], + (16, 16, 1): [ + (b"icp4", read_png_or_jpeg2000), + (b"is32", read_32), + (b"s8mk", read_mk), + ], + } + + def __init__(self, fobj: IO[bytes]) -> None: + """ + fobj is a file-like object as an icns resource + """ + # signature : (start, length) + self.dct = {} + self.fobj = fobj + sig, filesize = nextheader(fobj) + if not _accept(sig): + msg = "not an icns file" + raise SyntaxError(msg) + i = HEADERSIZE + while i < filesize: + sig, blocksize = nextheader(fobj) + if blocksize <= 0: + msg = "invalid block header" + raise SyntaxError(msg) + i += HEADERSIZE + blocksize -= HEADERSIZE + self.dct[sig] = (i, blocksize) + fobj.seek(blocksize, io.SEEK_CUR) + i += blocksize + + def itersizes(self) -> list[tuple[int, int, int]]: + sizes = [] + for size, fmts in self.SIZES.items(): + for fmt, reader in fmts: + if fmt in self.dct: + sizes.append(size) + break + return sizes + + def bestsize(self) -> tuple[int, int, int]: + sizes = self.itersizes() + if not sizes: + msg = "No 32bit icon resources found" + raise SyntaxError(msg) + return max(sizes) + + def dataforsize(self, size: tuple[int, int, int]) -> dict[str, Image.Image]: + """ + Get an icon resource as {channel: array}. Note that + the arrays are bottom-up like windows bitmaps and will likely + need to be flipped or transposed in some way. + """ + dct = {} + for code, reader in self.SIZES[size]: + desc = self.dct.get(code) + if desc is not None: + dct.update(reader(self.fobj, desc, size)) + return dct + + def getimage( + self, size: tuple[int, int] | tuple[int, int, int] | None = None + ) -> Image.Image: + if size is None: + size = self.bestsize() + elif len(size) == 2: + size = (size[0], size[1], 1) + channels = self.dataforsize(size) + + im = channels.get("RGBA") + if im: + return im + + im = channels["RGB"].copy() + try: + im.putalpha(channels["A"]) + except KeyError: + pass + return im + + +## +# Image plugin for Mac OS icons. + + +class IcnsImageFile(ImageFile.ImageFile): + """ + PIL image support for Mac OS .icns files. + Chooses the best resolution, but will possibly load + a different size image if you mutate the size attribute + before calling 'load'. + + The info dictionary has a key 'sizes' that is a list + of sizes that the icns file has. + """ + + format = "ICNS" + format_description = "Mac OS icns resource" + + def _open(self) -> None: + self.icns = IcnsFile(self.fp) + self._mode = "RGBA" + self.info["sizes"] = self.icns.itersizes() + self.best_size = self.icns.bestsize() + self.size = ( + self.best_size[0] * self.best_size[2], + self.best_size[1] * self.best_size[2], + ) + + @property # type: ignore[override] + def size(self) -> tuple[int, int] | tuple[int, int, int]: + return self._size + + @size.setter + def size(self, value: tuple[int, int] | tuple[int, int, int]) -> None: + if len(value) == 3: + deprecate("Setting size to (width, height, scale)", 12, "load(scale)") + if value in self.info["sizes"]: + self._size = value # type: ignore[assignment] + return + else: + # Check that a matching size exists, + # or that there is a scale that would create a size that matches + for size in self.info["sizes"]: + simple_size = size[0] * size[2], size[1] * size[2] + scale = simple_size[0] // value[0] + if simple_size[1] / value[1] == scale: + self._size = value + return + msg = "This is not one of the allowed sizes of this image" + raise ValueError(msg) + + def load(self, scale: int | None = None) -> Image.core.PixelAccess | None: + if scale is not None or len(self.size) == 3: + if scale is None and len(self.size) == 3: + scale = self.size[2] + assert scale is not None + width, height = self.size[:2] + self.size = width * scale, height * scale + self.best_size = width, height, scale + + px = Image.Image.load(self) + if self._im is not None and self.im.size == self.size: + # Already loaded + return px + self.load_prepare() + # This is likely NOT the best way to do it, but whatever. + im = self.icns.getimage(self.best_size) + + # If this is a PNG or JPEG 2000, it won't be loaded yet + px = im.load() + + self.im = im.im + self._mode = im.mode + self.size = im.size + + return px + + +def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + """ + Saves the image as a series of PNG files, + that are then combined into a .icns file. + """ + if hasattr(fp, "flush"): + fp.flush() + + sizes = { + b"ic07": 128, + b"ic08": 256, + b"ic09": 512, + b"ic10": 1024, + b"ic11": 32, + b"ic12": 64, + b"ic13": 256, + b"ic14": 512, + } + provided_images = {im.width: im for im in im.encoderinfo.get("append_images", [])} + size_streams = {} + for size in set(sizes.values()): + image = ( + provided_images[size] + if size in provided_images + else im.resize((size, size)) + ) + + temp = io.BytesIO() + image.save(temp, "png") + size_streams[size] = temp.getvalue() + + entries = [] + for type, size in sizes.items(): + stream = size_streams[size] + entries.append((type, HEADERSIZE + len(stream), stream)) + + # Header + fp.write(MAGIC) + file_length = HEADERSIZE # Header + file_length += HEADERSIZE + 8 * len(entries) # TOC + file_length += sum(entry[1] for entry in entries) + fp.write(struct.pack(">i", file_length)) + + # TOC + fp.write(b"TOC ") + fp.write(struct.pack(">i", HEADERSIZE + len(entries) * HEADERSIZE)) + for entry in entries: + fp.write(entry[0]) + fp.write(struct.pack(">i", entry[1])) + + # Data + for entry in entries: + fp.write(entry[0]) + fp.write(struct.pack(">i", entry[1])) + fp.write(entry[2]) + + if hasattr(fp, "flush"): + fp.flush() + + +def _accept(prefix: bytes) -> bool: + return prefix[:4] == MAGIC + + +Image.register_open(IcnsImageFile.format, IcnsImageFile, _accept) +Image.register_extension(IcnsImageFile.format, ".icns") + +Image.register_save(IcnsImageFile.format, _save) +Image.register_mime(IcnsImageFile.format, "image/icns") + +if __name__ == "__main__": + if len(sys.argv) < 2: + print("Syntax: python3 IcnsImagePlugin.py [file]") + sys.exit() + + with open(sys.argv[1], "rb") as fp: + imf = IcnsImageFile(fp) + for size in imf.info["sizes"]: + width, height, scale = imf.size = size + imf.save(f"out-{width}-{height}-{scale}.png") + with Image.open(sys.argv[1]) as im: + im.save("out.png") + if sys.platform == "windows": + os.startfile("out.png") diff --git a/venv/lib/python3.12/site-packages/PIL/IcoImagePlugin.py b/venv/lib/python3.12/site-packages/PIL/IcoImagePlugin.py new file mode 100644 index 0000000..e879f18 --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/IcoImagePlugin.py @@ -0,0 +1,381 @@ +# +# The Python Imaging Library. +# $Id$ +# +# Windows Icon support for PIL +# +# History: +# 96-05-27 fl Created +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1996. +# +# See the README file for information on usage and redistribution. +# + +# This plugin is a refactored version of Win32IconImagePlugin by Bryan Davis +# . +# https://code.google.com/archive/p/casadebender/wikis/Win32IconImagePlugin.wiki +# +# Icon format references: +# * https://en.wikipedia.org/wiki/ICO_(file_format) +# * https://msdn.microsoft.com/en-us/library/ms997538.aspx +from __future__ import annotations + +import warnings +from io import BytesIO +from math import ceil, log +from typing import IO, NamedTuple + +from . import BmpImagePlugin, Image, ImageFile, PngImagePlugin +from ._binary import i16le as i16 +from ._binary import i32le as i32 +from ._binary import o8 +from ._binary import o16le as o16 +from ._binary import o32le as o32 + +# +# -------------------------------------------------------------------- + +_MAGIC = b"\0\0\1\0" + + +def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + fp.write(_MAGIC) # (2+2) + bmp = im.encoderinfo.get("bitmap_format") == "bmp" + sizes = im.encoderinfo.get( + "sizes", + [(16, 16), (24, 24), (32, 32), (48, 48), (64, 64), (128, 128), (256, 256)], + ) + frames = [] + provided_ims = [im] + im.encoderinfo.get("append_images", []) + width, height = im.size + for size in sorted(set(sizes)): + if size[0] > width or size[1] > height or size[0] > 256 or size[1] > 256: + continue + + for provided_im in provided_ims: + if provided_im.size != size: + continue + frames.append(provided_im) + if bmp: + bits = BmpImagePlugin.SAVE[provided_im.mode][1] + bits_used = [bits] + for other_im in provided_ims: + if other_im.size != size: + continue + bits = BmpImagePlugin.SAVE[other_im.mode][1] + if bits not in bits_used: + # Another image has been supplied for this size + # with a different bit depth + frames.append(other_im) + bits_used.append(bits) + break + else: + # TODO: invent a more convenient method for proportional scalings + frame = provided_im.copy() + frame.thumbnail(size, Image.Resampling.LANCZOS, reducing_gap=None) + frames.append(frame) + fp.write(o16(len(frames))) # idCount(2) + offset = fp.tell() + len(frames) * 16 + for frame in frames: + width, height = frame.size + # 0 means 256 + fp.write(o8(width if width < 256 else 0)) # bWidth(1) + fp.write(o8(height if height < 256 else 0)) # bHeight(1) + + bits, colors = BmpImagePlugin.SAVE[frame.mode][1:] if bmp else (32, 0) + fp.write(o8(colors)) # bColorCount(1) + fp.write(b"\0") # bReserved(1) + fp.write(b"\0\0") # wPlanes(2) + fp.write(o16(bits)) # wBitCount(2) + + image_io = BytesIO() + if bmp: + frame.save(image_io, "dib") + + if bits != 32: + and_mask = Image.new("1", size) + ImageFile._save( + and_mask, + image_io, + [ImageFile._Tile("raw", (0, 0) + size, 0, ("1", 0, -1))], + ) + else: + frame.save(image_io, "png") + image_io.seek(0) + image_bytes = image_io.read() + if bmp: + image_bytes = image_bytes[:8] + o32(height * 2) + image_bytes[12:] + bytes_len = len(image_bytes) + fp.write(o32(bytes_len)) # dwBytesInRes(4) + fp.write(o32(offset)) # dwImageOffset(4) + current = fp.tell() + fp.seek(offset) + fp.write(image_bytes) + offset = offset + bytes_len + fp.seek(current) + + +def _accept(prefix: bytes) -> bool: + return prefix[:4] == _MAGIC + + +class IconHeader(NamedTuple): + width: int + height: int + nb_color: int + reserved: int + planes: int + bpp: int + size: int + offset: int + dim: tuple[int, int] + square: int + color_depth: int + + +class IcoFile: + def __init__(self, buf: IO[bytes]) -> None: + """ + Parse image from file-like object containing ico file data + """ + + # check magic + s = buf.read(6) + if not _accept(s): + msg = "not an ICO file" + raise SyntaxError(msg) + + self.buf = buf + self.entry = [] + + # Number of items in file + self.nb_items = i16(s, 4) + + # Get headers for each item + for i in range(self.nb_items): + s = buf.read(16) + + # See Wikipedia + width = s[0] or 256 + height = s[1] or 256 + + # No. of colors in image (0 if >=8bpp) + nb_color = s[2] + bpp = i16(s, 6) + icon_header = IconHeader( + width=width, + height=height, + nb_color=nb_color, + reserved=s[3], + planes=i16(s, 4), + bpp=i16(s, 6), + size=i32(s, 8), + offset=i32(s, 12), + dim=(width, height), + square=width * height, + # See Wikipedia notes about color depth. + # We need this just to differ images with equal sizes + color_depth=bpp or (nb_color != 0 and ceil(log(nb_color, 2))) or 256, + ) + + self.entry.append(icon_header) + + self.entry = sorted(self.entry, key=lambda x: x.color_depth) + # ICO images are usually squares + self.entry = sorted(self.entry, key=lambda x: x.square, reverse=True) + + def sizes(self) -> set[tuple[int, int]]: + """ + Get a set of all available icon sizes and color depths. + """ + return {(h.width, h.height) for h in self.entry} + + def getentryindex(self, size: tuple[int, int], bpp: int | bool = False) -> int: + for i, h in enumerate(self.entry): + if size == h.dim and (bpp is False or bpp == h.color_depth): + return i + return 0 + + def getimage(self, size: tuple[int, int], bpp: int | bool = False) -> Image.Image: + """ + Get an image from the icon + """ + return self.frame(self.getentryindex(size, bpp)) + + def frame(self, idx: int) -> Image.Image: + """ + Get an image from frame idx + """ + + header = self.entry[idx] + + self.buf.seek(header.offset) + data = self.buf.read(8) + self.buf.seek(header.offset) + + im: Image.Image + if data[:8] == PngImagePlugin._MAGIC: + # png frame + im = PngImagePlugin.PngImageFile(self.buf) + Image._decompression_bomb_check(im.size) + else: + # XOR + AND mask bmp frame + im = BmpImagePlugin.DibImageFile(self.buf) + Image._decompression_bomb_check(im.size) + + # change tile dimension to only encompass XOR image + im._size = (im.size[0], int(im.size[1] / 2)) + d, e, o, a = im.tile[0] + im.tile[0] = ImageFile._Tile(d, (0, 0) + im.size, o, a) + + # figure out where AND mask image starts + if header.bpp == 32: + # 32-bit color depth icon image allows semitransparent areas + # PIL's DIB format ignores transparency bits, recover them. + # The DIB is packed in BGRX byte order where X is the alpha + # channel. + + # Back up to start of bmp data + self.buf.seek(o) + # extract every 4th byte (eg. 3,7,11,15,...) + alpha_bytes = self.buf.read(im.size[0] * im.size[1] * 4)[3::4] + + # convert to an 8bpp grayscale image + try: + mask = Image.frombuffer( + "L", # 8bpp + im.size, # (w, h) + alpha_bytes, # source chars + "raw", # raw decoder + ("L", 0, -1), # 8bpp inverted, unpadded, reversed + ) + except ValueError: + if ImageFile.LOAD_TRUNCATED_IMAGES: + mask = None + else: + raise + else: + # get AND image from end of bitmap + w = im.size[0] + if (w % 32) > 0: + # bitmap row data is aligned to word boundaries + w += 32 - (im.size[0] % 32) + + # the total mask data is + # padded row size * height / bits per char + + total_bytes = int((w * im.size[1]) / 8) + and_mask_offset = header.offset + header.size - total_bytes + + self.buf.seek(and_mask_offset) + mask_data = self.buf.read(total_bytes) + + # convert raw data to image + try: + mask = Image.frombuffer( + "1", # 1 bpp + im.size, # (w, h) + mask_data, # source chars + "raw", # raw decoder + ("1;I", int(w / 8), -1), # 1bpp inverted, padded, reversed + ) + except ValueError: + if ImageFile.LOAD_TRUNCATED_IMAGES: + mask = None + else: + raise + + # now we have two images, im is XOR image and mask is AND image + + # apply mask image as alpha channel + if mask: + im = im.convert("RGBA") + im.putalpha(mask) + + return im + + +## +# Image plugin for Windows Icon files. + + +class IcoImageFile(ImageFile.ImageFile): + """ + PIL read-only image support for Microsoft Windows .ico files. + + By default the largest resolution image in the file will be loaded. This + can be changed by altering the 'size' attribute before calling 'load'. + + The info dictionary has a key 'sizes' that is a list of the sizes available + in the icon file. + + Handles classic, XP and Vista icon formats. + + When saving, PNG compression is used. Support for this was only added in + Windows Vista. If you are unable to view the icon in Windows, convert the + image to "RGBA" mode before saving. + + This plugin is a refactored version of Win32IconImagePlugin by Bryan Davis + . + https://code.google.com/archive/p/casadebender/wikis/Win32IconImagePlugin.wiki + """ + + format = "ICO" + format_description = "Windows Icon" + + def _open(self) -> None: + self.ico = IcoFile(self.fp) + self.info["sizes"] = self.ico.sizes() + self.size = self.ico.entry[0].dim + self.load() + + @property + def size(self) -> tuple[int, int]: + return self._size + + @size.setter + def size(self, value: tuple[int, int]) -> None: + if value not in self.info["sizes"]: + msg = "This is not one of the allowed sizes of this image" + raise ValueError(msg) + self._size = value + + def load(self) -> Image.core.PixelAccess | None: + if self._im is not None and self.im.size == self.size: + # Already loaded + return Image.Image.load(self) + im = self.ico.getimage(self.size) + # if tile is PNG, it won't really be loaded yet + im.load() + self.im = im.im + self._mode = im.mode + if im.palette: + self.palette = im.palette + if im.size != self.size: + warnings.warn("Image was not the expected size") + + index = self.ico.getentryindex(self.size) + sizes = list(self.info["sizes"]) + sizes[index] = im.size + self.info["sizes"] = set(sizes) + + self.size = im.size + return None + + def load_seek(self, pos: int) -> None: + # Flag the ImageFile.Parser so that it + # just does all the decode at the end. + pass + + +# +# -------------------------------------------------------------------- + + +Image.register_open(IcoImageFile.format, IcoImageFile, _accept) +Image.register_save(IcoImageFile.format, _save) +Image.register_extension(IcoImageFile.format, ".ico") + +Image.register_mime(IcoImageFile.format, "image/x-icon") diff --git a/venv/lib/python3.12/site-packages/PIL/ImImagePlugin.py b/venv/lib/python3.12/site-packages/PIL/ImImagePlugin.py new file mode 100644 index 0000000..f9f4734 --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/ImImagePlugin.py @@ -0,0 +1,386 @@ +# +# The Python Imaging Library. +# $Id$ +# +# IFUNC IM file handling for PIL +# +# history: +# 1995-09-01 fl Created. +# 1997-01-03 fl Save palette images +# 1997-01-08 fl Added sequence support +# 1997-01-23 fl Added P and RGB save support +# 1997-05-31 fl Read floating point images +# 1997-06-22 fl Save floating point images +# 1997-08-27 fl Read and save 1-bit images +# 1998-06-25 fl Added support for RGB+LUT images +# 1998-07-02 fl Added support for YCC images +# 1998-07-15 fl Renamed offset attribute to avoid name clash +# 1998-12-29 fl Added I;16 support +# 2001-02-17 fl Use 're' instead of 'regex' (Python 2.1) (0.7) +# 2003-09-26 fl Added LA/PA support +# +# Copyright (c) 1997-2003 by Secret Labs AB. +# Copyright (c) 1995-2001 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import os +import re +from typing import IO, Any + +from . import Image, ImageFile, ImagePalette + +# -------------------------------------------------------------------- +# Standard tags + +COMMENT = "Comment" +DATE = "Date" +EQUIPMENT = "Digitalization equipment" +FRAMES = "File size (no of images)" +LUT = "Lut" +NAME = "Name" +SCALE = "Scale (x,y)" +SIZE = "Image size (x*y)" +MODE = "Image type" + +TAGS = { + COMMENT: 0, + DATE: 0, + EQUIPMENT: 0, + FRAMES: 0, + LUT: 0, + NAME: 0, + SCALE: 0, + SIZE: 0, + MODE: 0, +} + +OPEN = { + # ifunc93/p3cfunc formats + "0 1 image": ("1", "1"), + "L 1 image": ("1", "1"), + "Greyscale image": ("L", "L"), + "Grayscale image": ("L", "L"), + "RGB image": ("RGB", "RGB;L"), + "RLB image": ("RGB", "RLB"), + "RYB image": ("RGB", "RLB"), + "B1 image": ("1", "1"), + "B2 image": ("P", "P;2"), + "B4 image": ("P", "P;4"), + "X 24 image": ("RGB", "RGB"), + "L 32 S image": ("I", "I;32"), + "L 32 F image": ("F", "F;32"), + # old p3cfunc formats + "RGB3 image": ("RGB", "RGB;T"), + "RYB3 image": ("RGB", "RYB;T"), + # extensions + "LA image": ("LA", "LA;L"), + "PA image": ("LA", "PA;L"), + "RGBA image": ("RGBA", "RGBA;L"), + "RGBX image": ("RGB", "RGBX;L"), + "CMYK image": ("CMYK", "CMYK;L"), + "YCC image": ("YCbCr", "YCbCr;L"), +} + +# ifunc95 extensions +for i in ["8", "8S", "16", "16S", "32", "32F"]: + OPEN[f"L {i} image"] = ("F", f"F;{i}") + OPEN[f"L*{i} image"] = ("F", f"F;{i}") +for i in ["16", "16L", "16B"]: + OPEN[f"L {i} image"] = (f"I;{i}", f"I;{i}") + OPEN[f"L*{i} image"] = (f"I;{i}", f"I;{i}") +for i in ["32S"]: + OPEN[f"L {i} image"] = ("I", f"I;{i}") + OPEN[f"L*{i} image"] = ("I", f"I;{i}") +for j in range(2, 33): + OPEN[f"L*{j} image"] = ("F", f"F;{j}") + + +# -------------------------------------------------------------------- +# Read IM directory + +split = re.compile(rb"^([A-Za-z][^:]*):[ \t]*(.*)[ \t]*$") + + +def number(s: Any) -> float: + try: + return int(s) + except ValueError: + return float(s) + + +## +# Image plugin for the IFUNC IM file format. + + +class ImImageFile(ImageFile.ImageFile): + format = "IM" + format_description = "IFUNC Image Memory" + _close_exclusive_fp_after_loading = False + + def _open(self) -> None: + # Quick rejection: if there's not an LF among the first + # 100 bytes, this is (probably) not a text header. + + if b"\n" not in self.fp.read(100): + msg = "not an IM file" + raise SyntaxError(msg) + self.fp.seek(0) + + n = 0 + + # Default values + self.info[MODE] = "L" + self.info[SIZE] = (512, 512) + self.info[FRAMES] = 1 + + self.rawmode = "L" + + while True: + s = self.fp.read(1) + + # Some versions of IFUNC uses \n\r instead of \r\n... + if s == b"\r": + continue + + if not s or s == b"\0" or s == b"\x1A": + break + + # FIXME: this may read whole file if not a text file + s = s + self.fp.readline() + + if len(s) > 100: + msg = "not an IM file" + raise SyntaxError(msg) + + if s[-2:] == b"\r\n": + s = s[:-2] + elif s[-1:] == b"\n": + s = s[:-1] + + try: + m = split.match(s) + except re.error as e: + msg = "not an IM file" + raise SyntaxError(msg) from e + + if m: + k, v = m.group(1, 2) + + # Don't know if this is the correct encoding, + # but a decent guess (I guess) + k = k.decode("latin-1", "replace") + v = v.decode("latin-1", "replace") + + # Convert value as appropriate + if k in [FRAMES, SCALE, SIZE]: + v = v.replace("*", ",") + v = tuple(map(number, v.split(","))) + if len(v) == 1: + v = v[0] + elif k == MODE and v in OPEN: + v, self.rawmode = OPEN[v] + + # Add to dictionary. Note that COMMENT tags are + # combined into a list of strings. + if k == COMMENT: + if k in self.info: + self.info[k].append(v) + else: + self.info[k] = [v] + else: + self.info[k] = v + + if k in TAGS: + n += 1 + + else: + msg = f"Syntax error in IM header: {s.decode('ascii', 'replace')}" + raise SyntaxError(msg) + + if not n: + msg = "Not an IM file" + raise SyntaxError(msg) + + # Basic attributes + self._size = self.info[SIZE] + self._mode = self.info[MODE] + + # Skip forward to start of image data + while s and s[:1] != b"\x1A": + s = self.fp.read(1) + if not s: + msg = "File truncated" + raise SyntaxError(msg) + + if LUT in self.info: + # convert lookup table to palette or lut attribute + palette = self.fp.read(768) + greyscale = 1 # greyscale palette + linear = 1 # linear greyscale palette + for i in range(256): + if palette[i] == palette[i + 256] == palette[i + 512]: + if palette[i] != i: + linear = 0 + else: + greyscale = 0 + if self.mode in ["L", "LA", "P", "PA"]: + if greyscale: + if not linear: + self.lut = list(palette[:256]) + else: + if self.mode in ["L", "P"]: + self._mode = self.rawmode = "P" + elif self.mode in ["LA", "PA"]: + self._mode = "PA" + self.rawmode = "PA;L" + self.palette = ImagePalette.raw("RGB;L", palette) + elif self.mode == "RGB": + if not greyscale or not linear: + self.lut = list(palette) + + self.frame = 0 + + self.__offset = offs = self.fp.tell() + + self._fp = self.fp # FIXME: hack + + if self.rawmode[:2] == "F;": + # ifunc95 formats + try: + # use bit decoder (if necessary) + bits = int(self.rawmode[2:]) + if bits not in [8, 16, 32]: + self.tile = [ + ImageFile._Tile( + "bit", (0, 0) + self.size, offs, (bits, 8, 3, 0, -1) + ) + ] + return + except ValueError: + pass + + if self.rawmode in ["RGB;T", "RYB;T"]: + # Old LabEye/3PC files. Would be very surprised if anyone + # ever stumbled upon such a file ;-) + size = self.size[0] * self.size[1] + self.tile = [ + ImageFile._Tile("raw", (0, 0) + self.size, offs, ("G", 0, -1)), + ImageFile._Tile("raw", (0, 0) + self.size, offs + size, ("R", 0, -1)), + ImageFile._Tile( + "raw", (0, 0) + self.size, offs + 2 * size, ("B", 0, -1) + ), + ] + else: + # LabEye/IFUNC files + self.tile = [ + ImageFile._Tile("raw", (0, 0) + self.size, offs, (self.rawmode, 0, -1)) + ] + + @property + def n_frames(self) -> int: + return self.info[FRAMES] + + @property + def is_animated(self) -> bool: + return self.info[FRAMES] > 1 + + def seek(self, frame: int) -> None: + if not self._seek_check(frame): + return + + self.frame = frame + + if self.mode == "1": + bits = 1 + else: + bits = 8 * len(self.mode) + + size = ((self.size[0] * bits + 7) // 8) * self.size[1] + offs = self.__offset + frame * size + + self.fp = self._fp + + self.tile = [ + ImageFile._Tile("raw", (0, 0) + self.size, offs, (self.rawmode, 0, -1)) + ] + + def tell(self) -> int: + return self.frame + + +# +# -------------------------------------------------------------------- +# Save IM files + + +SAVE = { + # mode: (im type, raw mode) + "1": ("0 1", "1"), + "L": ("Greyscale", "L"), + "LA": ("LA", "LA;L"), + "P": ("Greyscale", "P"), + "PA": ("LA", "PA;L"), + "I": ("L 32S", "I;32S"), + "I;16": ("L 16", "I;16"), + "I;16L": ("L 16L", "I;16L"), + "I;16B": ("L 16B", "I;16B"), + "F": ("L 32F", "F;32F"), + "RGB": ("RGB", "RGB;L"), + "RGBA": ("RGBA", "RGBA;L"), + "RGBX": ("RGBX", "RGBX;L"), + "CMYK": ("CMYK", "CMYK;L"), + "YCbCr": ("YCC", "YCbCr;L"), +} + + +def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + try: + image_type, rawmode = SAVE[im.mode] + except KeyError as e: + msg = f"Cannot save {im.mode} images as IM" + raise ValueError(msg) from e + + frames = im.encoderinfo.get("frames", 1) + + fp.write(f"Image type: {image_type} image\r\n".encode("ascii")) + if filename: + # Each line must be 100 characters or less, + # or: SyntaxError("not an IM file") + # 8 characters are used for "Name: " and "\r\n" + # Keep just the filename, ditch the potentially overlong path + if isinstance(filename, bytes): + filename = filename.decode("ascii") + name, ext = os.path.splitext(os.path.basename(filename)) + name = "".join([name[: 92 - len(ext)], ext]) + + fp.write(f"Name: {name}\r\n".encode("ascii")) + fp.write(("Image size (x*y): %d*%d\r\n" % im.size).encode("ascii")) + fp.write(f"File size (no of images): {frames}\r\n".encode("ascii")) + if im.mode in ["P", "PA"]: + fp.write(b"Lut: 1\r\n") + fp.write(b"\000" * (511 - fp.tell()) + b"\032") + if im.mode in ["P", "PA"]: + im_palette = im.im.getpalette("RGB", "RGB;L") + colors = len(im_palette) // 3 + palette = b"" + for i in range(3): + palette += im_palette[colors * i : colors * (i + 1)] + palette += b"\x00" * (256 - colors) + fp.write(palette) # 768 bytes + ImageFile._save( + im, fp, [ImageFile._Tile("raw", (0, 0) + im.size, 0, (rawmode, 0, -1))] + ) + + +# +# -------------------------------------------------------------------- +# Registry + + +Image.register_open(ImImageFile.format, ImImageFile) +Image.register_save(ImImageFile.format, _save) + +Image.register_extension(ImImageFile.format, ".im") diff --git a/venv/lib/python3.12/site-packages/PIL/Image.py b/venv/lib/python3.12/site-packages/PIL/Image.py new file mode 100644 index 0000000..4427039 --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/Image.py @@ -0,0 +1,4198 @@ +# +# The Python Imaging Library. +# $Id$ +# +# the Image class wrapper +# +# partial release history: +# 1995-09-09 fl Created +# 1996-03-11 fl PIL release 0.0 (proof of concept) +# 1996-04-30 fl PIL release 0.1b1 +# 1999-07-28 fl PIL release 1.0 final +# 2000-06-07 fl PIL release 1.1 +# 2000-10-20 fl PIL release 1.1.1 +# 2001-05-07 fl PIL release 1.1.2 +# 2002-03-15 fl PIL release 1.1.3 +# 2003-05-10 fl PIL release 1.1.4 +# 2005-03-28 fl PIL release 1.1.5 +# 2006-12-02 fl PIL release 1.1.6 +# 2009-11-15 fl PIL release 1.1.7 +# +# Copyright (c) 1997-2009 by Secret Labs AB. All rights reserved. +# Copyright (c) 1995-2009 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# + +from __future__ import annotations + +import abc +import atexit +import builtins +import io +import logging +import math +import os +import re +import struct +import sys +import tempfile +import warnings +from collections.abc import Callable, Iterator, MutableMapping, Sequence +from enum import IntEnum +from types import ModuleType +from typing import ( + IO, + TYPE_CHECKING, + Any, + Literal, + Protocol, + cast, +) + +# VERSION was removed in Pillow 6.0.0. +# PILLOW_VERSION was removed in Pillow 9.0.0. +# Use __version__ instead. +from . import ( + ExifTags, + ImageMode, + TiffTags, + UnidentifiedImageError, + __version__, + _plugins, +) +from ._binary import i32le, o32be, o32le +from ._deprecate import deprecate +from ._util import DeferredError, is_path + +ElementTree: ModuleType | None +try: + from defusedxml import ElementTree +except ImportError: + ElementTree = None + +logger = logging.getLogger(__name__) + + +class DecompressionBombWarning(RuntimeWarning): + pass + + +class DecompressionBombError(Exception): + pass + + +WARN_POSSIBLE_FORMATS: bool = False + +# Limit to around a quarter gigabyte for a 24-bit (3 bpp) image +MAX_IMAGE_PIXELS: int | None = int(1024 * 1024 * 1024 // 4 // 3) + + +try: + # If the _imaging C module is not present, Pillow will not load. + # Note that other modules should not refer to _imaging directly; + # import Image and use the Image.core variable instead. + # Also note that Image.core is not a publicly documented interface, + # and should be considered private and subject to change. + from . import _imaging as core + + if __version__ != getattr(core, "PILLOW_VERSION", None): + msg = ( + "The _imaging extension was built for another version of Pillow or PIL:\n" + f"Core version: {getattr(core, 'PILLOW_VERSION', None)}\n" + f"Pillow version: {__version__}" + ) + raise ImportError(msg) + +except ImportError as v: + core = DeferredError.new(ImportError("The _imaging C module is not installed.")) + # Explanations for ways that we know we might have an import error + if str(v).startswith("Module use of python"): + # The _imaging C module is present, but not compiled for + # the right version (windows only). Print a warning, if + # possible. + warnings.warn( + "The _imaging extension was built for another version of Python.", + RuntimeWarning, + ) + elif str(v).startswith("The _imaging extension"): + warnings.warn(str(v), RuntimeWarning) + # Fail here anyway. Don't let people run with a mostly broken Pillow. + # see docs/porting.rst + raise + + +def isImageType(t: Any) -> TypeGuard[Image]: + """ + Checks if an object is an image object. + + .. warning:: + + This function is for internal use only. + + :param t: object to check if it's an image + :returns: True if the object is an image + """ + deprecate("Image.isImageType(im)", 12, "isinstance(im, Image.Image)") + return hasattr(t, "im") + + +# +# Constants + + +# transpose +class Transpose(IntEnum): + FLIP_LEFT_RIGHT = 0 + FLIP_TOP_BOTTOM = 1 + ROTATE_90 = 2 + ROTATE_180 = 3 + ROTATE_270 = 4 + TRANSPOSE = 5 + TRANSVERSE = 6 + + +# transforms (also defined in Imaging.h) +class Transform(IntEnum): + AFFINE = 0 + EXTENT = 1 + PERSPECTIVE = 2 + QUAD = 3 + MESH = 4 + + +# resampling filters (also defined in Imaging.h) +class Resampling(IntEnum): + NEAREST = 0 + BOX = 4 + BILINEAR = 2 + HAMMING = 5 + BICUBIC = 3 + LANCZOS = 1 + + +_filters_support = { + Resampling.BOX: 0.5, + Resampling.BILINEAR: 1.0, + Resampling.HAMMING: 1.0, + Resampling.BICUBIC: 2.0, + Resampling.LANCZOS: 3.0, +} + + +# dithers +class Dither(IntEnum): + NONE = 0 + ORDERED = 1 # Not yet implemented + RASTERIZE = 2 # Not yet implemented + FLOYDSTEINBERG = 3 # default + + +# palettes/quantizers +class Palette(IntEnum): + WEB = 0 + ADAPTIVE = 1 + + +class Quantize(IntEnum): + MEDIANCUT = 0 + MAXCOVERAGE = 1 + FASTOCTREE = 2 + LIBIMAGEQUANT = 3 + + +module = sys.modules[__name__] +for enum in (Transpose, Transform, Resampling, Dither, Palette, Quantize): + for item in enum: + setattr(module, item.name, item.value) + + +if hasattr(core, "DEFAULT_STRATEGY"): + DEFAULT_STRATEGY = core.DEFAULT_STRATEGY + FILTERED = core.FILTERED + HUFFMAN_ONLY = core.HUFFMAN_ONLY + RLE = core.RLE + FIXED = core.FIXED + + +# -------------------------------------------------------------------- +# Registries + +if TYPE_CHECKING: + import mmap + from xml.etree.ElementTree import Element + + from IPython.lib.pretty import PrettyPrinter + + from . import ImageFile, ImageFilter, ImagePalette, ImageQt, TiffImagePlugin + from ._typing import CapsuleType, NumpyArray, StrOrBytesPath, TypeGuard +ID: list[str] = [] +OPEN: dict[ + str, + tuple[ + Callable[[IO[bytes], str | bytes], ImageFile.ImageFile], + Callable[[bytes], bool | str] | None, + ], +] = {} +MIME: dict[str, str] = {} +SAVE: dict[str, Callable[[Image, IO[bytes], str | bytes], None]] = {} +SAVE_ALL: dict[str, Callable[[Image, IO[bytes], str | bytes], None]] = {} +EXTENSION: dict[str, str] = {} +DECODERS: dict[str, type[ImageFile.PyDecoder]] = {} +ENCODERS: dict[str, type[ImageFile.PyEncoder]] = {} + +# -------------------------------------------------------------------- +# Modes + +_ENDIAN = "<" if sys.byteorder == "little" else ">" + + +def _conv_type_shape(im: Image) -> tuple[tuple[int, ...], str]: + m = ImageMode.getmode(im.mode) + shape: tuple[int, ...] = (im.height, im.width) + extra = len(m.bands) + if extra != 1: + shape += (extra,) + return shape, m.typestr + + +MODES = [ + "1", + "CMYK", + "F", + "HSV", + "I", + "I;16", + "I;16B", + "I;16L", + "I;16N", + "L", + "LA", + "La", + "LAB", + "P", + "PA", + "RGB", + "RGBA", + "RGBa", + "RGBX", + "YCbCr", +] + +# raw modes that may be memory mapped. NOTE: if you change this, you +# may have to modify the stride calculation in map.c too! +_MAPMODES = ("L", "P", "RGBX", "RGBA", "CMYK", "I;16", "I;16L", "I;16B") + + +def getmodebase(mode: str) -> str: + """ + Gets the "base" mode for given mode. This function returns "L" for + images that contain grayscale data, and "RGB" for images that + contain color data. + + :param mode: Input mode. + :returns: "L" or "RGB". + :exception KeyError: If the input mode was not a standard mode. + """ + return ImageMode.getmode(mode).basemode + + +def getmodetype(mode: str) -> str: + """ + Gets the storage type mode. Given a mode, this function returns a + single-layer mode suitable for storing individual bands. + + :param mode: Input mode. + :returns: "L", "I", or "F". + :exception KeyError: If the input mode was not a standard mode. + """ + return ImageMode.getmode(mode).basetype + + +def getmodebandnames(mode: str) -> tuple[str, ...]: + """ + Gets a list of individual band names. Given a mode, this function returns + a tuple containing the names of individual bands (use + :py:method:`~PIL.Image.getmodetype` to get the mode used to store each + individual band. + + :param mode: Input mode. + :returns: A tuple containing band names. The length of the tuple + gives the number of bands in an image of the given mode. + :exception KeyError: If the input mode was not a standard mode. + """ + return ImageMode.getmode(mode).bands + + +def getmodebands(mode: str) -> int: + """ + Gets the number of individual bands for this mode. + + :param mode: Input mode. + :returns: The number of bands in this mode. + :exception KeyError: If the input mode was not a standard mode. + """ + return len(ImageMode.getmode(mode).bands) + + +# -------------------------------------------------------------------- +# Helpers + +_initialized = 0 + + +def preinit() -> None: + """ + Explicitly loads BMP, GIF, JPEG, PPM and PPM file format drivers. + + It is called when opening or saving images. + """ + + global _initialized + if _initialized >= 1: + return + + try: + from . import BmpImagePlugin + + assert BmpImagePlugin + except ImportError: + pass + try: + from . import GifImagePlugin + + assert GifImagePlugin + except ImportError: + pass + try: + from . import JpegImagePlugin + + assert JpegImagePlugin + except ImportError: + pass + try: + from . import PpmImagePlugin + + assert PpmImagePlugin + except ImportError: + pass + try: + from . import PngImagePlugin + + assert PngImagePlugin + except ImportError: + pass + + _initialized = 1 + + +def init() -> bool: + """ + Explicitly initializes the Python Imaging Library. This function + loads all available file format drivers. + + It is called when opening or saving images if :py:meth:`~preinit()` is + insufficient, and by :py:meth:`~PIL.features.pilinfo`. + """ + + global _initialized + if _initialized >= 2: + return False + + parent_name = __name__.rpartition(".")[0] + for plugin in _plugins: + try: + logger.debug("Importing %s", plugin) + __import__(f"{parent_name}.{plugin}", globals(), locals(), []) + except ImportError as e: + logger.debug("Image: failed to import %s: %s", plugin, e) + + if OPEN or SAVE: + _initialized = 2 + return True + return False + + +# -------------------------------------------------------------------- +# Codec factories (used by tobytes/frombytes and ImageFile.load) + + +def _getdecoder( + mode: str, decoder_name: str, args: Any, extra: tuple[Any, ...] = () +) -> core.ImagingDecoder | ImageFile.PyDecoder: + # tweak arguments + if args is None: + args = () + elif not isinstance(args, tuple): + args = (args,) + + try: + decoder = DECODERS[decoder_name] + except KeyError: + pass + else: + return decoder(mode, *args + extra) + + try: + # get decoder + decoder = getattr(core, f"{decoder_name}_decoder") + except AttributeError as e: + msg = f"decoder {decoder_name} not available" + raise OSError(msg) from e + return decoder(mode, *args + extra) + + +def _getencoder( + mode: str, encoder_name: str, args: Any, extra: tuple[Any, ...] = () +) -> core.ImagingEncoder | ImageFile.PyEncoder: + # tweak arguments + if args is None: + args = () + elif not isinstance(args, tuple): + args = (args,) + + try: + encoder = ENCODERS[encoder_name] + except KeyError: + pass + else: + return encoder(mode, *args + extra) + + try: + # get encoder + encoder = getattr(core, f"{encoder_name}_encoder") + except AttributeError as e: + msg = f"encoder {encoder_name} not available" + raise OSError(msg) from e + return encoder(mode, *args + extra) + + +# -------------------------------------------------------------------- +# Simple expression analyzer + + +class ImagePointTransform: + """ + Used with :py:meth:`~PIL.Image.Image.point` for single band images with more than + 8 bits, this represents an affine transformation, where the value is multiplied by + ``scale`` and ``offset`` is added. + """ + + def __init__(self, scale: float, offset: float) -> None: + self.scale = scale + self.offset = offset + + def __neg__(self) -> ImagePointTransform: + return ImagePointTransform(-self.scale, -self.offset) + + def __add__(self, other: ImagePointTransform | float) -> ImagePointTransform: + if isinstance(other, ImagePointTransform): + return ImagePointTransform( + self.scale + other.scale, self.offset + other.offset + ) + return ImagePointTransform(self.scale, self.offset + other) + + __radd__ = __add__ + + def __sub__(self, other: ImagePointTransform | float) -> ImagePointTransform: + return self + -other + + def __rsub__(self, other: ImagePointTransform | float) -> ImagePointTransform: + return other + -self + + def __mul__(self, other: ImagePointTransform | float) -> ImagePointTransform: + if isinstance(other, ImagePointTransform): + return NotImplemented + return ImagePointTransform(self.scale * other, self.offset * other) + + __rmul__ = __mul__ + + def __truediv__(self, other: ImagePointTransform | float) -> ImagePointTransform: + if isinstance(other, ImagePointTransform): + return NotImplemented + return ImagePointTransform(self.scale / other, self.offset / other) + + +def _getscaleoffset( + expr: Callable[[ImagePointTransform], ImagePointTransform | float] +) -> tuple[float, float]: + a = expr(ImagePointTransform(1, 0)) + return (a.scale, a.offset) if isinstance(a, ImagePointTransform) else (0, a) + + +# -------------------------------------------------------------------- +# Implementation wrapper + + +class SupportsGetData(Protocol): + def getdata( + self, + ) -> tuple[Transform, Sequence[int]]: ... + + +class Image: + """ + This class represents an image object. To create + :py:class:`~PIL.Image.Image` objects, use the appropriate factory + functions. There's hardly ever any reason to call the Image constructor + directly. + + * :py:func:`~PIL.Image.open` + * :py:func:`~PIL.Image.new` + * :py:func:`~PIL.Image.frombytes` + """ + + format: str | None = None + format_description: str | None = None + _close_exclusive_fp_after_loading = True + + def __init__(self) -> None: + # FIXME: take "new" parameters / other image? + # FIXME: turn mode and size into delegating properties? + self._im: core.ImagingCore | DeferredError | None = None + self._mode = "" + self._size = (0, 0) + self.palette: ImagePalette.ImagePalette | None = None + self.info: dict[str | tuple[int, int], Any] = {} + self.readonly = 0 + self._exif: Exif | None = None + + @property + def im(self) -> core.ImagingCore: + if isinstance(self._im, DeferredError): + raise self._im.ex + assert self._im is not None + return self._im + + @im.setter + def im(self, im: core.ImagingCore) -> None: + self._im = im + + @property + def width(self) -> int: + return self.size[0] + + @property + def height(self) -> int: + return self.size[1] + + @property + def size(self) -> tuple[int, int]: + return self._size + + @property + def mode(self) -> str: + return self._mode + + def _new(self, im: core.ImagingCore) -> Image: + new = Image() + new.im = im + new._mode = im.mode + new._size = im.size + if im.mode in ("P", "PA"): + if self.palette: + new.palette = self.palette.copy() + else: + from . import ImagePalette + + new.palette = ImagePalette.ImagePalette() + new.info = self.info.copy() + return new + + # Context manager support + def __enter__(self): + return self + + def _close_fp(self): + if getattr(self, "_fp", False): + if self._fp != self.fp: + self._fp.close() + self._fp = DeferredError(ValueError("Operation on closed image")) + if self.fp: + self.fp.close() + + def __exit__(self, *args): + if hasattr(self, "fp"): + if getattr(self, "_exclusive_fp", False): + self._close_fp() + self.fp = None + + def close(self) -> None: + """ + Closes the file pointer, if possible. + + This operation will destroy the image core and release its memory. + The image data will be unusable afterward. + + This function is required to close images that have multiple frames or + have not had their file read and closed by the + :py:meth:`~PIL.Image.Image.load` method. See :ref:`file-handling` for + more information. + """ + if hasattr(self, "fp"): + try: + self._close_fp() + self.fp = None + except Exception as msg: + logger.debug("Error closing: %s", msg) + + if getattr(self, "map", None): + self.map: mmap.mmap | None = None + + # Instead of simply setting to None, we're setting up a + # deferred error that will better explain that the core image + # object is gone. + self._im = DeferredError(ValueError("Operation on closed image")) + + def _copy(self) -> None: + self.load() + self.im = self.im.copy() + self.readonly = 0 + + def _ensure_mutable(self) -> None: + if self.readonly: + self._copy() + else: + self.load() + + def _dump( + self, file: str | None = None, format: str | None = None, **options: Any + ) -> str: + suffix = "" + if format: + suffix = f".{format}" + + if not file: + f, filename = tempfile.mkstemp(suffix) + os.close(f) + else: + filename = file + if not filename.endswith(suffix): + filename = filename + suffix + + self.load() + + if not format or format == "PPM": + self.im.save_ppm(filename) + else: + self.save(filename, format, **options) + + return filename + + def __eq__(self, other: object) -> bool: + if self.__class__ is not other.__class__: + return False + assert isinstance(other, Image) + return ( + self.mode == other.mode + and self.size == other.size + and self.info == other.info + and self.getpalette() == other.getpalette() + and self.tobytes() == other.tobytes() + ) + + def __repr__(self) -> str: + return "<%s.%s image mode=%s size=%dx%d at 0x%X>" % ( + self.__class__.__module__, + self.__class__.__name__, + self.mode, + self.size[0], + self.size[1], + id(self), + ) + + def _repr_pretty_(self, p: PrettyPrinter, cycle: bool) -> None: + """IPython plain text display support""" + + # Same as __repr__ but without unpredictable id(self), + # to keep Jupyter notebook `text/plain` output stable. + p.text( + "<%s.%s image mode=%s size=%dx%d>" + % ( + self.__class__.__module__, + self.__class__.__name__, + self.mode, + self.size[0], + self.size[1], + ) + ) + + def _repr_image(self, image_format: str, **kwargs: Any) -> bytes | None: + """Helper function for iPython display hook. + + :param image_format: Image format. + :returns: image as bytes, saved into the given format. + """ + b = io.BytesIO() + try: + self.save(b, image_format, **kwargs) + except Exception: + return None + return b.getvalue() + + def _repr_png_(self) -> bytes | None: + """iPython display hook support for PNG format. + + :returns: PNG version of the image as bytes + """ + return self._repr_image("PNG", compress_level=1) + + def _repr_jpeg_(self) -> bytes | None: + """iPython display hook support for JPEG format. + + :returns: JPEG version of the image as bytes + """ + return self._repr_image("JPEG") + + @property + def __array_interface__(self) -> dict[str, str | bytes | int | tuple[int, ...]]: + # numpy array interface support + new: dict[str, str | bytes | int | tuple[int, ...]] = {"version": 3} + if self.mode == "1": + # Binary images need to be extended from bits to bytes + # See: https://github.com/python-pillow/Pillow/issues/350 + new["data"] = self.tobytes("raw", "L") + else: + new["data"] = self.tobytes() + new["shape"], new["typestr"] = _conv_type_shape(self) + return new + + def __getstate__(self) -> list[Any]: + im_data = self.tobytes() # load image first + return [self.info, self.mode, self.size, self.getpalette(), im_data] + + def __setstate__(self, state: list[Any]) -> None: + Image.__init__(self) + info, mode, size, palette, data = state + self.info = info + self._mode = mode + self._size = size + self.im = core.new(mode, size) + if mode in ("L", "LA", "P", "PA") and palette: + self.putpalette(palette) + self.frombytes(data) + + def tobytes(self, encoder_name: str = "raw", *args: Any) -> bytes: + """ + Return image as a bytes object. + + .. warning:: + + This method returns the raw image data from the internal + storage. For compressed image data (e.g. PNG, JPEG) use + :meth:`~.save`, with a BytesIO parameter for in-memory + data. + + :param encoder_name: What encoder to use. The default is to + use the standard "raw" encoder. + + A list of C encoders can be seen under + codecs section of the function array in + :file:`_imaging.c`. Python encoders are + registered within the relevant plugins. + :param args: Extra arguments to the encoder. + :returns: A :py:class:`bytes` object. + """ + + encoder_args: Any = args + if len(encoder_args) == 1 and isinstance(encoder_args[0], tuple): + # may pass tuple instead of argument list + encoder_args = encoder_args[0] + + if encoder_name == "raw" and encoder_args == (): + encoder_args = self.mode + + self.load() + + if self.width == 0 or self.height == 0: + return b"" + + # unpack data + e = _getencoder(self.mode, encoder_name, encoder_args) + e.setimage(self.im) + + bufsize = max(65536, self.size[0] * 4) # see RawEncode.c + + output = [] + while True: + bytes_consumed, errcode, data = e.encode(bufsize) + output.append(data) + if errcode: + break + if errcode < 0: + msg = f"encoder error {errcode} in tobytes" + raise RuntimeError(msg) + + return b"".join(output) + + def tobitmap(self, name: str = "image") -> bytes: + """ + Returns the image converted to an X11 bitmap. + + .. note:: This method only works for mode "1" images. + + :param name: The name prefix to use for the bitmap variables. + :returns: A string containing an X11 bitmap. + :raises ValueError: If the mode is not "1" + """ + + self.load() + if self.mode != "1": + msg = "not a bitmap" + raise ValueError(msg) + data = self.tobytes("xbm") + return b"".join( + [ + f"#define {name}_width {self.size[0]}\n".encode("ascii"), + f"#define {name}_height {self.size[1]}\n".encode("ascii"), + f"static char {name}_bits[] = {{\n".encode("ascii"), + data, + b"};", + ] + ) + + def frombytes( + self, + data: bytes | bytearray | SupportsArrayInterface, + decoder_name: str = "raw", + *args: Any, + ) -> None: + """ + Loads this image with pixel data from a bytes object. + + This method is similar to the :py:func:`~PIL.Image.frombytes` function, + but loads data into this image instead of creating a new image object. + """ + + if self.width == 0 or self.height == 0: + return + + decoder_args: Any = args + if len(decoder_args) == 1 and isinstance(decoder_args[0], tuple): + # may pass tuple instead of argument list + decoder_args = decoder_args[0] + + # default format + if decoder_name == "raw" and decoder_args == (): + decoder_args = self.mode + + # unpack data + d = _getdecoder(self.mode, decoder_name, decoder_args) + d.setimage(self.im) + s = d.decode(data) + + if s[0] >= 0: + msg = "not enough image data" + raise ValueError(msg) + if s[1] != 0: + msg = "cannot decode image data" + raise ValueError(msg) + + def load(self) -> core.PixelAccess | None: + """ + Allocates storage for the image and loads the pixel data. In + normal cases, you don't need to call this method, since the + Image class automatically loads an opened image when it is + accessed for the first time. + + If the file associated with the image was opened by Pillow, then this + method will close it. The exception to this is if the image has + multiple frames, in which case the file will be left open for seek + operations. See :ref:`file-handling` for more information. + + :returns: An image access object. + :rtype: :py:class:`.PixelAccess` + """ + if self._im is not None and self.palette and self.palette.dirty: + # realize palette + mode, arr = self.palette.getdata() + self.im.putpalette(self.palette.mode, mode, arr) + self.palette.dirty = 0 + self.palette.rawmode = None + if "transparency" in self.info and mode in ("LA", "PA"): + if isinstance(self.info["transparency"], int): + self.im.putpalettealpha(self.info["transparency"], 0) + else: + self.im.putpalettealphas(self.info["transparency"]) + self.palette.mode = "RGBA" + else: + self.palette.palette = self.im.getpalette( + self.palette.mode, self.palette.mode + ) + + if self._im is not None: + return self.im.pixel_access(self.readonly) + return None + + def verify(self) -> None: + """ + Verifies the contents of a file. For data read from a file, this + method attempts to determine if the file is broken, without + actually decoding the image data. If this method finds any + problems, it raises suitable exceptions. If you need to load + the image after using this method, you must reopen the image + file. + """ + pass + + def convert( + self, + mode: str | None = None, + matrix: tuple[float, ...] | None = None, + dither: Dither | None = None, + palette: Palette = Palette.WEB, + colors: int = 256, + ) -> Image: + """ + Returns a converted copy of this image. For the "P" mode, this + method translates pixels through the palette. If mode is + omitted, a mode is chosen so that all information in the image + and the palette can be represented without a palette. + + This supports all possible conversions between "L", "RGB" and "CMYK". The + ``matrix`` argument only supports "L" and "RGB". + + When translating a color image to grayscale (mode "L"), + the library uses the ITU-R 601-2 luma transform:: + + L = R * 299/1000 + G * 587/1000 + B * 114/1000 + + The default method of converting a grayscale ("L") or "RGB" + image into a bilevel (mode "1") image uses Floyd-Steinberg + dither to approximate the original image luminosity levels. If + dither is ``None``, all values larger than 127 are set to 255 (white), + all other values to 0 (black). To use other thresholds, use the + :py:meth:`~PIL.Image.Image.point` method. + + When converting from "RGBA" to "P" without a ``matrix`` argument, + this passes the operation to :py:meth:`~PIL.Image.Image.quantize`, + and ``dither`` and ``palette`` are ignored. + + When converting from "PA", if an "RGBA" palette is present, the alpha + channel from the image will be used instead of the values from the palette. + + :param mode: The requested mode. See: :ref:`concept-modes`. + :param matrix: An optional conversion matrix. If given, this + should be 4- or 12-tuple containing floating point values. + :param dither: Dithering method, used when converting from + mode "RGB" to "P" or from "RGB" or "L" to "1". + Available methods are :data:`Dither.NONE` or :data:`Dither.FLOYDSTEINBERG` + (default). Note that this is not used when ``matrix`` is supplied. + :param palette: Palette to use when converting from mode "RGB" + to "P". Available palettes are :data:`Palette.WEB` or + :data:`Palette.ADAPTIVE`. + :param colors: Number of colors to use for the :data:`Palette.ADAPTIVE` + palette. Defaults to 256. + :rtype: :py:class:`~PIL.Image.Image` + :returns: An :py:class:`~PIL.Image.Image` object. + """ + + if mode in ("BGR;15", "BGR;16", "BGR;24"): + deprecate(mode, 12) + + self.load() + + has_transparency = "transparency" in self.info + if not mode and self.mode == "P": + # determine default mode + if self.palette: + mode = self.palette.mode + else: + mode = "RGB" + if mode == "RGB" and has_transparency: + mode = "RGBA" + if not mode or (mode == self.mode and not matrix): + return self.copy() + + if matrix: + # matrix conversion + if mode not in ("L", "RGB"): + msg = "illegal conversion" + raise ValueError(msg) + im = self.im.convert_matrix(mode, matrix) + new_im = self._new(im) + if has_transparency and self.im.bands == 3: + transparency = new_im.info["transparency"] + + def convert_transparency( + m: tuple[float, ...], v: tuple[int, int, int] + ) -> int: + value = m[0] * v[0] + m[1] * v[1] + m[2] * v[2] + m[3] * 0.5 + return max(0, min(255, int(value))) + + if mode == "L": + transparency = convert_transparency(matrix, transparency) + elif len(mode) == 3: + transparency = tuple( + convert_transparency(matrix[i * 4 : i * 4 + 4], transparency) + for i in range(0, len(transparency)) + ) + new_im.info["transparency"] = transparency + return new_im + + if mode == "P" and self.mode == "RGBA": + return self.quantize(colors) + + trns = None + delete_trns = False + # transparency handling + if has_transparency: + if (self.mode in ("1", "L", "I", "I;16") and mode in ("LA", "RGBA")) or ( + self.mode == "RGB" and mode in ("La", "LA", "RGBa", "RGBA") + ): + # Use transparent conversion to promote from transparent + # color to an alpha channel. + new_im = self._new( + self.im.convert_transparent(mode, self.info["transparency"]) + ) + del new_im.info["transparency"] + return new_im + elif self.mode in ("L", "RGB", "P") and mode in ("L", "RGB", "P"): + t = self.info["transparency"] + if isinstance(t, bytes): + # Dragons. This can't be represented by a single color + warnings.warn( + "Palette images with Transparency expressed in bytes should be " + "converted to RGBA images" + ) + delete_trns = True + else: + # get the new transparency color. + # use existing conversions + trns_im = new(self.mode, (1, 1)) + if self.mode == "P": + assert self.palette is not None + trns_im.putpalette(self.palette, self.palette.mode) + if isinstance(t, tuple): + err = "Couldn't allocate a palette color for transparency" + assert trns_im.palette is not None + try: + t = trns_im.palette.getcolor(t, self) + except ValueError as e: + if str(e) == "cannot allocate more than 256 colors": + # If all 256 colors are in use, + # then there is no need for transparency + t = None + else: + raise ValueError(err) from e + if t is None: + trns = None + else: + trns_im.putpixel((0, 0), t) + + if mode in ("L", "RGB"): + trns_im = trns_im.convert(mode) + else: + # can't just retrieve the palette number, got to do it + # after quantization. + trns_im = trns_im.convert("RGB") + trns = trns_im.getpixel((0, 0)) + + elif self.mode == "P" and mode in ("LA", "PA", "RGBA"): + t = self.info["transparency"] + delete_trns = True + + if isinstance(t, bytes): + self.im.putpalettealphas(t) + elif isinstance(t, int): + self.im.putpalettealpha(t, 0) + else: + msg = "Transparency for P mode should be bytes or int" + raise ValueError(msg) + + if mode == "P" and palette == Palette.ADAPTIVE: + im = self.im.quantize(colors) + new_im = self._new(im) + from . import ImagePalette + + new_im.palette = ImagePalette.ImagePalette( + "RGB", new_im.im.getpalette("RGB") + ) + if delete_trns: + # This could possibly happen if we requantize to fewer colors. + # The transparency would be totally off in that case. + del new_im.info["transparency"] + if trns is not None: + try: + new_im.info["transparency"] = new_im.palette.getcolor( + cast(tuple[int, ...], trns), # trns was converted to RGB + new_im, + ) + except Exception: + # if we can't make a transparent color, don't leave the old + # transparency hanging around to mess us up. + del new_im.info["transparency"] + warnings.warn("Couldn't allocate palette entry for transparency") + return new_im + + if "LAB" in (self.mode, mode): + im = self + if mode == "LAB": + if im.mode not in ("RGB", "RGBA", "RGBX"): + im = im.convert("RGBA") + other_mode = im.mode + else: + other_mode = mode + if other_mode in ("RGB", "RGBA", "RGBX"): + from . import ImageCms + + srgb = ImageCms.createProfile("sRGB") + lab = ImageCms.createProfile("LAB") + profiles = [lab, srgb] if im.mode == "LAB" else [srgb, lab] + transform = ImageCms.buildTransform( + profiles[0], profiles[1], im.mode, mode + ) + return transform.apply(im) + + # colorspace conversion + if dither is None: + dither = Dither.FLOYDSTEINBERG + + try: + im = self.im.convert(mode, dither) + except ValueError: + try: + # normalize source image and try again + modebase = getmodebase(self.mode) + if modebase == self.mode: + raise + im = self.im.convert(modebase) + im = im.convert(mode, dither) + except KeyError as e: + msg = "illegal conversion" + raise ValueError(msg) from e + + new_im = self._new(im) + if mode == "P" and palette != Palette.ADAPTIVE: + from . import ImagePalette + + new_im.palette = ImagePalette.ImagePalette("RGB", im.getpalette("RGB")) + if delete_trns: + # crash fail if we leave a bytes transparency in an rgb/l mode. + del new_im.info["transparency"] + if trns is not None: + if new_im.mode == "P" and new_im.palette: + try: + new_im.info["transparency"] = new_im.palette.getcolor( + cast(tuple[int, ...], trns), new_im # trns was converted to RGB + ) + except ValueError as e: + del new_im.info["transparency"] + if str(e) != "cannot allocate more than 256 colors": + # If all 256 colors are in use, + # then there is no need for transparency + warnings.warn( + "Couldn't allocate palette entry for transparency" + ) + else: + new_im.info["transparency"] = trns + return new_im + + def quantize( + self, + colors: int = 256, + method: int | None = None, + kmeans: int = 0, + palette: Image | None = None, + dither: Dither = Dither.FLOYDSTEINBERG, + ) -> Image: + """ + Convert the image to 'P' mode with the specified number + of colors. + + :param colors: The desired number of colors, <= 256 + :param method: :data:`Quantize.MEDIANCUT` (median cut), + :data:`Quantize.MAXCOVERAGE` (maximum coverage), + :data:`Quantize.FASTOCTREE` (fast octree), + :data:`Quantize.LIBIMAGEQUANT` (libimagequant; check support + using :py:func:`PIL.features.check_feature` with + ``feature="libimagequant"``). + + By default, :data:`Quantize.MEDIANCUT` will be used. + + The exception to this is RGBA images. :data:`Quantize.MEDIANCUT` + and :data:`Quantize.MAXCOVERAGE` do not support RGBA images, so + :data:`Quantize.FASTOCTREE` is used by default instead. + :param kmeans: Integer greater than or equal to zero. + :param palette: Quantize to the palette of given + :py:class:`PIL.Image.Image`. + :param dither: Dithering method, used when converting from + mode "RGB" to "P" or from "RGB" or "L" to "1". + Available methods are :data:`Dither.NONE` or :data:`Dither.FLOYDSTEINBERG` + (default). + :returns: A new image + """ + + self.load() + + if method is None: + # defaults: + method = Quantize.MEDIANCUT + if self.mode == "RGBA": + method = Quantize.FASTOCTREE + + if self.mode == "RGBA" and method not in ( + Quantize.FASTOCTREE, + Quantize.LIBIMAGEQUANT, + ): + # Caller specified an invalid mode. + msg = ( + "Fast Octree (method == 2) and libimagequant (method == 3) " + "are the only valid methods for quantizing RGBA images" + ) + raise ValueError(msg) + + if palette: + # use palette from reference image + palette.load() + if palette.mode != "P": + msg = "bad mode for palette image" + raise ValueError(msg) + if self.mode not in {"RGB", "L"}: + msg = "only RGB or L mode images can be quantized to a palette" + raise ValueError(msg) + im = self.im.convert("P", dither, palette.im) + new_im = self._new(im) + assert palette.palette is not None + new_im.palette = palette.palette.copy() + return new_im + + if kmeans < 0: + msg = "kmeans must not be negative" + raise ValueError(msg) + + im = self._new(self.im.quantize(colors, method, kmeans)) + + from . import ImagePalette + + mode = im.im.getpalettemode() + palette_data = im.im.getpalette(mode, mode)[: colors * len(mode)] + im.palette = ImagePalette.ImagePalette(mode, palette_data) + + return im + + def copy(self) -> Image: + """ + Copies this image. Use this method if you wish to paste things + into an image, but still retain the original. + + :rtype: :py:class:`~PIL.Image.Image` + :returns: An :py:class:`~PIL.Image.Image` object. + """ + self.load() + return self._new(self.im.copy()) + + __copy__ = copy + + def crop(self, box: tuple[float, float, float, float] | None = None) -> Image: + """ + Returns a rectangular region from this image. The box is a + 4-tuple defining the left, upper, right, and lower pixel + coordinate. See :ref:`coordinate-system`. + + Note: Prior to Pillow 3.4.0, this was a lazy operation. + + :param box: The crop rectangle, as a (left, upper, right, lower)-tuple. + :rtype: :py:class:`~PIL.Image.Image` + :returns: An :py:class:`~PIL.Image.Image` object. + """ + + if box is None: + return self.copy() + + if box[2] < box[0]: + msg = "Coordinate 'right' is less than 'left'" + raise ValueError(msg) + elif box[3] < box[1]: + msg = "Coordinate 'lower' is less than 'upper'" + raise ValueError(msg) + + self.load() + return self._new(self._crop(self.im, box)) + + def _crop( + self, im: core.ImagingCore, box: tuple[float, float, float, float] + ) -> core.ImagingCore: + """ + Returns a rectangular region from the core image object im. + + This is equivalent to calling im.crop((x0, y0, x1, y1)), but + includes additional sanity checks. + + :param im: a core image object + :param box: The crop rectangle, as a (left, upper, right, lower)-tuple. + :returns: A core image object. + """ + + x0, y0, x1, y1 = map(int, map(round, box)) + + absolute_values = (abs(x1 - x0), abs(y1 - y0)) + + _decompression_bomb_check(absolute_values) + + return im.crop((x0, y0, x1, y1)) + + def draft( + self, mode: str | None, size: tuple[int, int] | None + ) -> tuple[str, tuple[int, int, float, float]] | None: + """ + Configures the image file loader so it returns a version of the + image that as closely as possible matches the given mode and + size. For example, you can use this method to convert a color + JPEG to grayscale while loading it. + + If any changes are made, returns a tuple with the chosen ``mode`` and + ``box`` with coordinates of the original image within the altered one. + + Note that this method modifies the :py:class:`~PIL.Image.Image` object + in place. If the image has already been loaded, this method has no + effect. + + Note: This method is not implemented for most images. It is + currently implemented only for JPEG and MPO images. + + :param mode: The requested mode. + :param size: The requested size in pixels, as a 2-tuple: + (width, height). + """ + pass + + def _expand(self, xmargin: int, ymargin: int | None = None) -> Image: + if ymargin is None: + ymargin = xmargin + self.load() + return self._new(self.im.expand(xmargin, ymargin)) + + def filter(self, filter: ImageFilter.Filter | type[ImageFilter.Filter]) -> Image: + """ + Filters this image using the given filter. For a list of + available filters, see the :py:mod:`~PIL.ImageFilter` module. + + :param filter: Filter kernel. + :returns: An :py:class:`~PIL.Image.Image` object.""" + + from . import ImageFilter + + self.load() + + if callable(filter): + filter = filter() + if not hasattr(filter, "filter"): + msg = "filter argument should be ImageFilter.Filter instance or class" + raise TypeError(msg) + + multiband = isinstance(filter, ImageFilter.MultibandFilter) + if self.im.bands == 1 or multiband: + return self._new(filter.filter(self.im)) + + ims = [ + self._new(filter.filter(self.im.getband(c))) for c in range(self.im.bands) + ] + return merge(self.mode, ims) + + def getbands(self) -> tuple[str, ...]: + """ + Returns a tuple containing the name of each band in this image. + For example, ``getbands`` on an RGB image returns ("R", "G", "B"). + + :returns: A tuple containing band names. + :rtype: tuple + """ + return ImageMode.getmode(self.mode).bands + + def getbbox(self, *, alpha_only: bool = True) -> tuple[int, int, int, int] | None: + """ + Calculates the bounding box of the non-zero regions in the + image. + + :param alpha_only: Optional flag, defaulting to ``True``. + If ``True`` and the image has an alpha channel, trim transparent pixels. + Otherwise, trim pixels when all channels are zero. + Keyword-only argument. + :returns: The bounding box is returned as a 4-tuple defining the + left, upper, right, and lower pixel coordinate. See + :ref:`coordinate-system`. If the image is completely empty, this + method returns None. + + """ + + self.load() + return self.im.getbbox(alpha_only) + + def getcolors( + self, maxcolors: int = 256 + ) -> list[tuple[int, tuple[int, ...]]] | list[tuple[int, float]] | None: + """ + Returns a list of colors used in this image. + + The colors will be in the image's mode. For example, an RGB image will + return a tuple of (red, green, blue) color values, and a P image will + return the index of the color in the palette. + + :param maxcolors: Maximum number of colors. If this number is + exceeded, this method returns None. The default limit is + 256 colors. + :returns: An unsorted list of (count, pixel) values. + """ + + self.load() + if self.mode in ("1", "L", "P"): + h = self.im.histogram() + out: list[tuple[int, float]] = [(h[i], i) for i in range(256) if h[i]] + if len(out) > maxcolors: + return None + return out + return self.im.getcolors(maxcolors) + + def getdata(self, band: int | None = None) -> core.ImagingCore: + """ + Returns the contents of this image as a sequence object + containing pixel values. The sequence object is flattened, so + that values for line one follow directly after the values of + line zero, and so on. + + Note that the sequence object returned by this method is an + internal PIL data type, which only supports certain sequence + operations. To convert it to an ordinary sequence (e.g. for + printing), use ``list(im.getdata())``. + + :param band: What band to return. The default is to return + all bands. To return a single band, pass in the index + value (e.g. 0 to get the "R" band from an "RGB" image). + :returns: A sequence-like object. + """ + + self.load() + if band is not None: + return self.im.getband(band) + return self.im # could be abused + + def getextrema(self) -> tuple[float, float] | tuple[tuple[int, int], ...]: + """ + Gets the minimum and maximum pixel values for each band in + the image. + + :returns: For a single-band image, a 2-tuple containing the + minimum and maximum pixel value. For a multi-band image, + a tuple containing one 2-tuple for each band. + """ + + self.load() + if self.im.bands > 1: + return tuple(self.im.getband(i).getextrema() for i in range(self.im.bands)) + return self.im.getextrema() + + def getxmp(self) -> dict[str, Any]: + """ + Returns a dictionary containing the XMP tags. + Requires defusedxml to be installed. + + :returns: XMP tags in a dictionary. + """ + + def get_name(tag: str) -> str: + return re.sub("^{[^}]+}", "", tag) + + def get_value(element: Element) -> str | dict[str, Any] | None: + value: dict[str, Any] = {get_name(k): v for k, v in element.attrib.items()} + children = list(element) + if children: + for child in children: + name = get_name(child.tag) + child_value = get_value(child) + if name in value: + if not isinstance(value[name], list): + value[name] = [value[name]] + value[name].append(child_value) + else: + value[name] = child_value + elif value: + if element.text: + value["text"] = element.text + else: + return element.text + return value + + if ElementTree is None: + warnings.warn("XMP data cannot be read without defusedxml dependency") + return {} + if "xmp" not in self.info: + return {} + root = ElementTree.fromstring(self.info["xmp"].rstrip(b"\x00")) + return {get_name(root.tag): get_value(root)} + + def getexif(self) -> Exif: + """ + Gets EXIF data from the image. + + :returns: an :py:class:`~PIL.Image.Exif` object. + """ + if self._exif is None: + self._exif = Exif() + elif self._exif._loaded: + return self._exif + self._exif._loaded = True + + exif_info = self.info.get("exif") + if exif_info is None: + if "Raw profile type exif" in self.info: + exif_info = bytes.fromhex( + "".join(self.info["Raw profile type exif"].split("\n")[3:]) + ) + elif hasattr(self, "tag_v2"): + self._exif.bigtiff = self.tag_v2._bigtiff + self._exif.endian = self.tag_v2._endian + self._exif.load_from_fp(self.fp, self.tag_v2._offset) + if exif_info is not None: + self._exif.load(exif_info) + + # XMP tags + if ExifTags.Base.Orientation not in self._exif: + xmp_tags = self.info.get("XML:com.adobe.xmp") + if xmp_tags: + match = re.search(r'tiff:Orientation(="|>)([0-9])', xmp_tags) + if match: + self._exif[ExifTags.Base.Orientation] = int(match[2]) + + return self._exif + + def _reload_exif(self) -> None: + if self._exif is None or not self._exif._loaded: + return + self._exif._loaded = False + self.getexif() + + def get_child_images(self) -> list[ImageFile.ImageFile]: + child_images = [] + exif = self.getexif() + ifds = [] + if ExifTags.Base.SubIFDs in exif: + subifd_offsets = exif[ExifTags.Base.SubIFDs] + if subifd_offsets: + if not isinstance(subifd_offsets, tuple): + subifd_offsets = (subifd_offsets,) + for subifd_offset in subifd_offsets: + ifds.append((exif._get_ifd_dict(subifd_offset), subifd_offset)) + ifd1 = exif.get_ifd(ExifTags.IFD.IFD1) + if ifd1 and ifd1.get(513): + assert exif._info is not None + ifds.append((ifd1, exif._info.next)) + + offset = None + for ifd, ifd_offset in ifds: + current_offset = self.fp.tell() + if offset is None: + offset = current_offset + + fp = self.fp + if ifd is not None: + thumbnail_offset = ifd.get(513) + if thumbnail_offset is not None: + thumbnail_offset += getattr(self, "_exif_offset", 0) + self.fp.seek(thumbnail_offset) + data = self.fp.read(ifd.get(514)) + fp = io.BytesIO(data) + + with open(fp) as im: + from . import TiffImagePlugin + + if thumbnail_offset is None and isinstance( + im, TiffImagePlugin.TiffImageFile + ): + im._frame_pos = [ifd_offset] + im._seek(0) + im.load() + child_images.append(im) + + if offset is not None: + self.fp.seek(offset) + return child_images + + def getim(self) -> CapsuleType: + """ + Returns a capsule that points to the internal image memory. + + :returns: A capsule object. + """ + + self.load() + return self.im.ptr + + def getpalette(self, rawmode: str | None = "RGB") -> list[int] | None: + """ + Returns the image palette as a list. + + :param rawmode: The mode in which to return the palette. ``None`` will + return the palette in its current mode. + + .. versionadded:: 9.1.0 + + :returns: A list of color values [r, g, b, ...], or None if the + image has no palette. + """ + + self.load() + try: + mode = self.im.getpalettemode() + except ValueError: + return None # no palette + if rawmode is None: + rawmode = mode + return list(self.im.getpalette(mode, rawmode)) + + @property + def has_transparency_data(self) -> bool: + """ + Determine if an image has transparency data, whether in the form of an + alpha channel, a palette with an alpha channel, or a "transparency" key + in the info dictionary. + + Note the image might still appear solid, if all of the values shown + within are opaque. + + :returns: A boolean. + """ + if ( + self.mode in ("LA", "La", "PA", "RGBA", "RGBa") + or "transparency" in self.info + ): + return True + if self.mode == "P": + assert self.palette is not None + return self.palette.mode.endswith("A") + return False + + def apply_transparency(self) -> None: + """ + If a P mode image has a "transparency" key in the info dictionary, + remove the key and instead apply the transparency to the palette. + Otherwise, the image is unchanged. + """ + if self.mode != "P" or "transparency" not in self.info: + return + + from . import ImagePalette + + palette = self.getpalette("RGBA") + assert palette is not None + transparency = self.info["transparency"] + if isinstance(transparency, bytes): + for i, alpha in enumerate(transparency): + palette[i * 4 + 3] = alpha + else: + palette[transparency * 4 + 3] = 0 + self.palette = ImagePalette.ImagePalette("RGBA", bytes(palette)) + self.palette.dirty = 1 + + del self.info["transparency"] + + def getpixel( + self, xy: tuple[int, int] | list[int] + ) -> float | tuple[int, ...] | None: + """ + Returns the pixel value at a given position. + + :param xy: The coordinate, given as (x, y). See + :ref:`coordinate-system`. + :returns: The pixel value. If the image is a multi-layer image, + this method returns a tuple. + """ + + self.load() + return self.im.getpixel(tuple(xy)) + + def getprojection(self) -> tuple[list[int], list[int]]: + """ + Get projection to x and y axes + + :returns: Two sequences, indicating where there are non-zero + pixels along the X-axis and the Y-axis, respectively. + """ + + self.load() + x, y = self.im.getprojection() + return list(x), list(y) + + def histogram( + self, mask: Image | None = None, extrema: tuple[float, float] | None = None + ) -> list[int]: + """ + Returns a histogram for the image. The histogram is returned as a + list of pixel counts, one for each pixel value in the source + image. Counts are grouped into 256 bins for each band, even if + the image has more than 8 bits per band. If the image has more + than one band, the histograms for all bands are concatenated (for + example, the histogram for an "RGB" image contains 768 values). + + A bilevel image (mode "1") is treated as a grayscale ("L") image + by this method. + + If a mask is provided, the method returns a histogram for those + parts of the image where the mask image is non-zero. The mask + image must have the same size as the image, and be either a + bi-level image (mode "1") or a grayscale image ("L"). + + :param mask: An optional mask. + :param extrema: An optional tuple of manually-specified extrema. + :returns: A list containing pixel counts. + """ + self.load() + if mask: + mask.load() + return self.im.histogram((0, 0), mask.im) + if self.mode in ("I", "F"): + return self.im.histogram( + extrema if extrema is not None else self.getextrema() + ) + return self.im.histogram() + + def entropy( + self, mask: Image | None = None, extrema: tuple[float, float] | None = None + ) -> float: + """ + Calculates and returns the entropy for the image. + + A bilevel image (mode "1") is treated as a grayscale ("L") + image by this method. + + If a mask is provided, the method employs the histogram for + those parts of the image where the mask image is non-zero. + The mask image must have the same size as the image, and be + either a bi-level image (mode "1") or a grayscale image ("L"). + + :param mask: An optional mask. + :param extrema: An optional tuple of manually-specified extrema. + :returns: A float value representing the image entropy + """ + self.load() + if mask: + mask.load() + return self.im.entropy((0, 0), mask.im) + if self.mode in ("I", "F"): + return self.im.entropy( + extrema if extrema is not None else self.getextrema() + ) + return self.im.entropy() + + def paste( + self, + im: Image | str | float | tuple[float, ...], + box: Image | tuple[int, int, int, int] | tuple[int, int] | None = None, + mask: Image | None = None, + ) -> None: + """ + Pastes another image into this image. The box argument is either + a 2-tuple giving the upper left corner, a 4-tuple defining the + left, upper, right, and lower pixel coordinate, or None (same as + (0, 0)). See :ref:`coordinate-system`. If a 4-tuple is given, the size + of the pasted image must match the size of the region. + + If the modes don't match, the pasted image is converted to the mode of + this image (see the :py:meth:`~PIL.Image.Image.convert` method for + details). + + Instead of an image, the source can be a integer or tuple + containing pixel values. The method then fills the region + with the given color. When creating RGB images, you can + also use color strings as supported by the ImageColor module. + + If a mask is given, this method updates only the regions + indicated by the mask. You can use either "1", "L", "LA", "RGBA" + or "RGBa" images (if present, the alpha band is used as mask). + Where the mask is 255, the given image is copied as is. Where + the mask is 0, the current value is preserved. Intermediate + values will mix the two images together, including their alpha + channels if they have them. + + See :py:meth:`~PIL.Image.Image.alpha_composite` if you want to + combine images with respect to their alpha channels. + + :param im: Source image or pixel value (integer, float or tuple). + :param box: An optional 4-tuple giving the region to paste into. + If a 2-tuple is used instead, it's treated as the upper left + corner. If omitted or None, the source is pasted into the + upper left corner. + + If an image is given as the second argument and there is no + third, the box defaults to (0, 0), and the second argument + is interpreted as a mask image. + :param mask: An optional mask image. + """ + + if isinstance(box, Image): + if mask is not None: + msg = "If using second argument as mask, third argument must be None" + raise ValueError(msg) + # abbreviated paste(im, mask) syntax + mask = box + box = None + + if box is None: + box = (0, 0) + + if len(box) == 2: + # upper left corner given; get size from image or mask + if isinstance(im, Image): + size = im.size + elif isinstance(mask, Image): + size = mask.size + else: + # FIXME: use self.size here? + msg = "cannot determine region size; use 4-item box" + raise ValueError(msg) + box += (box[0] + size[0], box[1] + size[1]) + + source: core.ImagingCore | str | float | tuple[float, ...] + if isinstance(im, str): + from . import ImageColor + + source = ImageColor.getcolor(im, self.mode) + elif isinstance(im, Image): + im.load() + if self.mode != im.mode: + if self.mode != "RGB" or im.mode not in ("LA", "RGBA", "RGBa"): + # should use an adapter for this! + im = im.convert(self.mode) + source = im.im + else: + source = im + + self._ensure_mutable() + + if mask: + mask.load() + self.im.paste(source, box, mask.im) + else: + self.im.paste(source, box) + + def alpha_composite( + self, im: Image, dest: Sequence[int] = (0, 0), source: Sequence[int] = (0, 0) + ) -> None: + """'In-place' analog of Image.alpha_composite. Composites an image + onto this image. + + :param im: image to composite over this one + :param dest: Optional 2 tuple (left, top) specifying the upper + left corner in this (destination) image. + :param source: Optional 2 (left, top) tuple for the upper left + corner in the overlay source image, or 4 tuple (left, top, right, + bottom) for the bounds of the source rectangle + + Performance Note: Not currently implemented in-place in the core layer. + """ + + if not isinstance(source, (list, tuple)): + msg = "Source must be a list or tuple" + raise ValueError(msg) + if not isinstance(dest, (list, tuple)): + msg = "Destination must be a list or tuple" + raise ValueError(msg) + + if len(source) == 4: + overlay_crop_box = tuple(source) + elif len(source) == 2: + overlay_crop_box = tuple(source) + im.size + else: + msg = "Source must be a sequence of length 2 or 4" + raise ValueError(msg) + + if not len(dest) == 2: + msg = "Destination must be a sequence of length 2" + raise ValueError(msg) + if min(source) < 0: + msg = "Source must be non-negative" + raise ValueError(msg) + + # over image, crop if it's not the whole image. + if overlay_crop_box == (0, 0) + im.size: + overlay = im + else: + overlay = im.crop(overlay_crop_box) + + # target for the paste + box = tuple(dest) + (dest[0] + overlay.width, dest[1] + overlay.height) + + # destination image. don't copy if we're using the whole image. + if box == (0, 0) + self.size: + background = self + else: + background = self.crop(box) + + result = alpha_composite(background, overlay) + self.paste(result, box) + + def point( + self, + lut: ( + Sequence[float] + | NumpyArray + | Callable[[int], float] + | Callable[[ImagePointTransform], ImagePointTransform | float] + | ImagePointHandler + ), + mode: str | None = None, + ) -> Image: + """ + Maps this image through a lookup table or function. + + :param lut: A lookup table, containing 256 (or 65536 if + self.mode=="I" and mode == "L") values per band in the + image. A function can be used instead, it should take a + single argument. The function is called once for each + possible pixel value, and the resulting table is applied to + all bands of the image. + + It may also be an :py:class:`~PIL.Image.ImagePointHandler` + object:: + + class Example(Image.ImagePointHandler): + def point(self, im: Image) -> Image: + # Return result + :param mode: Output mode (default is same as input). This can only be used if + the source image has mode "L" or "P", and the output has mode "1" or the + source image mode is "I" and the output mode is "L". + :returns: An :py:class:`~PIL.Image.Image` object. + """ + + self.load() + + if isinstance(lut, ImagePointHandler): + return lut.point(self) + + if callable(lut): + # if it isn't a list, it should be a function + if self.mode in ("I", "I;16", "F"): + # check if the function can be used with point_transform + # UNDONE wiredfool -- I think this prevents us from ever doing + # a gamma function point transform on > 8bit images. + scale, offset = _getscaleoffset(lut) # type: ignore[arg-type] + return self._new(self.im.point_transform(scale, offset)) + # for other modes, convert the function to a table + flatLut = [lut(i) for i in range(256)] * self.im.bands # type: ignore[arg-type] + else: + flatLut = lut + + if self.mode == "F": + # FIXME: _imaging returns a confusing error message for this case + msg = "point operation not supported for this mode" + raise ValueError(msg) + + if mode != "F": + flatLut = [round(i) for i in flatLut] + return self._new(self.im.point(flatLut, mode)) + + def putalpha(self, alpha: Image | int) -> None: + """ + Adds or replaces the alpha layer in this image. If the image + does not have an alpha layer, it's converted to "LA" or "RGBA". + The new layer must be either "L" or "1". + + :param alpha: The new alpha layer. This can either be an "L" or "1" + image having the same size as this image, or an integer. + """ + + self._ensure_mutable() + + if self.mode not in ("LA", "PA", "RGBA"): + # attempt to promote self to a matching alpha mode + try: + mode = getmodebase(self.mode) + "A" + try: + self.im.setmode(mode) + except (AttributeError, ValueError) as e: + # do things the hard way + im = self.im.convert(mode) + if im.mode not in ("LA", "PA", "RGBA"): + msg = "alpha channel could not be added" + raise ValueError(msg) from e # sanity check + self.im = im + self._mode = self.im.mode + except KeyError as e: + msg = "illegal image mode" + raise ValueError(msg) from e + + if self.mode in ("LA", "PA"): + band = 1 + else: + band = 3 + + if isinstance(alpha, Image): + # alpha layer + if alpha.mode not in ("1", "L"): + msg = "illegal image mode" + raise ValueError(msg) + alpha.load() + if alpha.mode == "1": + alpha = alpha.convert("L") + else: + # constant alpha + try: + self.im.fillband(band, alpha) + except (AttributeError, ValueError): + # do things the hard way + alpha = new("L", self.size, alpha) + else: + return + + self.im.putband(alpha.im, band) + + def putdata( + self, + data: Sequence[float] | Sequence[Sequence[int]] | core.ImagingCore | NumpyArray, + scale: float = 1.0, + offset: float = 0.0, + ) -> None: + """ + Copies pixel data from a flattened sequence object into the image. The + values should start at the upper left corner (0, 0), continue to the + end of the line, followed directly by the first value of the second + line, and so on. Data will be read until either the image or the + sequence ends. The scale and offset values are used to adjust the + sequence values: **pixel = value*scale + offset**. + + :param data: A flattened sequence object. + :param scale: An optional scale value. The default is 1.0. + :param offset: An optional offset value. The default is 0.0. + """ + + self._ensure_mutable() + + self.im.putdata(data, scale, offset) + + def putpalette( + self, + data: ImagePalette.ImagePalette | bytes | Sequence[int], + rawmode: str = "RGB", + ) -> None: + """ + Attaches a palette to this image. The image must be a "P", "PA", "L" + or "LA" image. + + The palette sequence must contain at most 256 colors, made up of one + integer value for each channel in the raw mode. + For example, if the raw mode is "RGB", then it can contain at most 768 + values, made up of red, green and blue values for the corresponding pixel + index in the 256 colors. + If the raw mode is "RGBA", then it can contain at most 1024 values, + containing red, green, blue and alpha values. + + Alternatively, an 8-bit string may be used instead of an integer sequence. + + :param data: A palette sequence (either a list or a string). + :param rawmode: The raw mode of the palette. Either "RGB", "RGBA", or a mode + that can be transformed to "RGB" or "RGBA" (e.g. "R", "BGR;15", "RGBA;L"). + """ + from . import ImagePalette + + if self.mode not in ("L", "LA", "P", "PA"): + msg = "illegal image mode" + raise ValueError(msg) + if isinstance(data, ImagePalette.ImagePalette): + if data.rawmode is not None: + palette = ImagePalette.raw(data.rawmode, data.palette) + else: + palette = ImagePalette.ImagePalette(palette=data.palette) + palette.dirty = 1 + else: + if not isinstance(data, bytes): + data = bytes(data) + palette = ImagePalette.raw(rawmode, data) + self._mode = "PA" if "A" in self.mode else "P" + self.palette = palette + self.palette.mode = "RGBA" if "A" in rawmode else "RGB" + self.load() # install new palette + + def putpixel( + self, xy: tuple[int, int], value: float | tuple[int, ...] | list[int] + ) -> None: + """ + Modifies the pixel at the given position. The color is given as + a single numerical value for single-band images, and a tuple for + multi-band images. In addition to this, RGB and RGBA tuples are + accepted for P and PA images. + + Note that this method is relatively slow. For more extensive changes, + use :py:meth:`~PIL.Image.Image.paste` or the :py:mod:`~PIL.ImageDraw` + module instead. + + See: + + * :py:meth:`~PIL.Image.Image.paste` + * :py:meth:`~PIL.Image.Image.putdata` + * :py:mod:`~PIL.ImageDraw` + + :param xy: The pixel coordinate, given as (x, y). See + :ref:`coordinate-system`. + :param value: The pixel value. + """ + + if self.readonly: + self._copy() + self.load() + + if ( + self.mode in ("P", "PA") + and isinstance(value, (list, tuple)) + and len(value) in [3, 4] + ): + # RGB or RGBA value for a P or PA image + if self.mode == "PA": + alpha = value[3] if len(value) == 4 else 255 + value = value[:3] + assert self.palette is not None + palette_index = self.palette.getcolor(tuple(value), self) + value = (palette_index, alpha) if self.mode == "PA" else palette_index + return self.im.putpixel(xy, value) + + def remap_palette( + self, dest_map: list[int], source_palette: bytes | bytearray | None = None + ) -> Image: + """ + Rewrites the image to reorder the palette. + + :param dest_map: A list of indexes into the original palette. + e.g. ``[1,0]`` would swap a two item palette, and ``list(range(256))`` + is the identity transform. + :param source_palette: Bytes or None. + :returns: An :py:class:`~PIL.Image.Image` object. + + """ + from . import ImagePalette + + if self.mode not in ("L", "P"): + msg = "illegal image mode" + raise ValueError(msg) + + bands = 3 + palette_mode = "RGB" + if source_palette is None: + if self.mode == "P": + self.load() + palette_mode = self.im.getpalettemode() + if palette_mode == "RGBA": + bands = 4 + source_palette = self.im.getpalette(palette_mode, palette_mode) + else: # L-mode + source_palette = bytearray(i // 3 for i in range(768)) + elif len(source_palette) > 768: + bands = 4 + palette_mode = "RGBA" + + palette_bytes = b"" + new_positions = [0] * 256 + + # pick only the used colors from the palette + for i, oldPosition in enumerate(dest_map): + palette_bytes += source_palette[ + oldPosition * bands : oldPosition * bands + bands + ] + new_positions[oldPosition] = i + + # replace the palette color id of all pixel with the new id + + # Palette images are [0..255], mapped through a 1 or 3 + # byte/color map. We need to remap the whole image + # from palette 1 to palette 2. New_positions is + # an array of indexes into palette 1. Palette 2 is + # palette 1 with any holes removed. + + # We're going to leverage the convert mechanism to use the + # C code to remap the image from palette 1 to palette 2, + # by forcing the source image into 'L' mode and adding a + # mapping 'L' mode palette, then converting back to 'L' + # sans palette thus converting the image bytes, then + # assigning the optimized RGB palette. + + # perf reference, 9500x4000 gif, w/~135 colors + # 14 sec prepatch, 1 sec postpatch with optimization forced. + + mapping_palette = bytearray(new_positions) + + m_im = self.copy() + m_im._mode = "P" + + m_im.palette = ImagePalette.ImagePalette( + palette_mode, palette=mapping_palette * bands + ) + # possibly set palette dirty, then + # m_im.putpalette(mapping_palette, 'L') # converts to 'P' + # or just force it. + # UNDONE -- this is part of the general issue with palettes + m_im.im.putpalette(palette_mode, palette_mode + ";L", m_im.palette.tobytes()) + + m_im = m_im.convert("L") + + m_im.putpalette(palette_bytes, palette_mode) + m_im.palette = ImagePalette.ImagePalette(palette_mode, palette=palette_bytes) + + if "transparency" in self.info: + try: + m_im.info["transparency"] = dest_map.index(self.info["transparency"]) + except ValueError: + if "transparency" in m_im.info: + del m_im.info["transparency"] + + return m_im + + def _get_safe_box( + self, + size: tuple[int, int], + resample: Resampling, + box: tuple[float, float, float, float], + ) -> tuple[int, int, int, int]: + """Expands the box so it includes adjacent pixels + that may be used by resampling with the given resampling filter. + """ + filter_support = _filters_support[resample] - 0.5 + scale_x = (box[2] - box[0]) / size[0] + scale_y = (box[3] - box[1]) / size[1] + support_x = filter_support * scale_x + support_y = filter_support * scale_y + + return ( + max(0, int(box[0] - support_x)), + max(0, int(box[1] - support_y)), + min(self.size[0], math.ceil(box[2] + support_x)), + min(self.size[1], math.ceil(box[3] + support_y)), + ) + + def resize( + self, + size: tuple[int, int] | list[int] | NumpyArray, + resample: int | None = None, + box: tuple[float, float, float, float] | None = None, + reducing_gap: float | None = None, + ) -> Image: + """ + Returns a resized copy of this image. + + :param size: The requested size in pixels, as a tuple or array: + (width, height). + :param resample: An optional resampling filter. This can be + one of :py:data:`Resampling.NEAREST`, :py:data:`Resampling.BOX`, + :py:data:`Resampling.BILINEAR`, :py:data:`Resampling.HAMMING`, + :py:data:`Resampling.BICUBIC` or :py:data:`Resampling.LANCZOS`. + If the image has mode "1" or "P", it is always set to + :py:data:`Resampling.NEAREST`. If the image mode is "BGR;15", + "BGR;16" or "BGR;24", then the default filter is + :py:data:`Resampling.NEAREST`. Otherwise, the default filter is + :py:data:`Resampling.BICUBIC`. See: :ref:`concept-filters`. + :param box: An optional 4-tuple of floats providing + the source image region to be scaled. + The values must be within (0, 0, width, height) rectangle. + If omitted or None, the entire source is used. + :param reducing_gap: Apply optimization by resizing the image + in two steps. First, reducing the image by integer times + using :py:meth:`~PIL.Image.Image.reduce`. + Second, resizing using regular resampling. The last step + changes size no less than by ``reducing_gap`` times. + ``reducing_gap`` may be None (no first step is performed) + or should be greater than 1.0. The bigger ``reducing_gap``, + the closer the result to the fair resampling. + The smaller ``reducing_gap``, the faster resizing. + With ``reducing_gap`` greater or equal to 3.0, the result is + indistinguishable from fair resampling in most cases. + The default value is None (no optimization). + :returns: An :py:class:`~PIL.Image.Image` object. + """ + + if resample is None: + bgr = self.mode.startswith("BGR;") + resample = Resampling.NEAREST if bgr else Resampling.BICUBIC + elif resample not in ( + Resampling.NEAREST, + Resampling.BILINEAR, + Resampling.BICUBIC, + Resampling.LANCZOS, + Resampling.BOX, + Resampling.HAMMING, + ): + msg = f"Unknown resampling filter ({resample})." + + filters = [ + f"{filter[1]} ({filter[0]})" + for filter in ( + (Resampling.NEAREST, "Image.Resampling.NEAREST"), + (Resampling.LANCZOS, "Image.Resampling.LANCZOS"), + (Resampling.BILINEAR, "Image.Resampling.BILINEAR"), + (Resampling.BICUBIC, "Image.Resampling.BICUBIC"), + (Resampling.BOX, "Image.Resampling.BOX"), + (Resampling.HAMMING, "Image.Resampling.HAMMING"), + ) + ] + msg += f" Use {', '.join(filters[:-1])} or {filters[-1]}" + raise ValueError(msg) + + if reducing_gap is not None and reducing_gap < 1.0: + msg = "reducing_gap must be 1.0 or greater" + raise ValueError(msg) + + if box is None: + box = (0, 0) + self.size + + size = tuple(size) + if self.size == size and box == (0, 0) + self.size: + return self.copy() + + if self.mode in ("1", "P"): + resample = Resampling.NEAREST + + if self.mode in ["LA", "RGBA"] and resample != Resampling.NEAREST: + im = self.convert({"LA": "La", "RGBA": "RGBa"}[self.mode]) + im = im.resize(size, resample, box) + return im.convert(self.mode) + + self.load() + + if reducing_gap is not None and resample != Resampling.NEAREST: + factor_x = int((box[2] - box[0]) / size[0] / reducing_gap) or 1 + factor_y = int((box[3] - box[1]) / size[1] / reducing_gap) or 1 + if factor_x > 1 or factor_y > 1: + reduce_box = self._get_safe_box(size, cast(Resampling, resample), box) + factor = (factor_x, factor_y) + self = ( + self.reduce(factor, box=reduce_box) + if callable(self.reduce) + else Image.reduce(self, factor, box=reduce_box) + ) + box = ( + (box[0] - reduce_box[0]) / factor_x, + (box[1] - reduce_box[1]) / factor_y, + (box[2] - reduce_box[0]) / factor_x, + (box[3] - reduce_box[1]) / factor_y, + ) + + return self._new(self.im.resize(size, resample, box)) + + def reduce( + self, + factor: int | tuple[int, int], + box: tuple[int, int, int, int] | None = None, + ) -> Image: + """ + Returns a copy of the image reduced ``factor`` times. + If the size of the image is not dividable by ``factor``, + the resulting size will be rounded up. + + :param factor: A greater than 0 integer or tuple of two integers + for width and height separately. + :param box: An optional 4-tuple of ints providing + the source image region to be reduced. + The values must be within ``(0, 0, width, height)`` rectangle. + If omitted or ``None``, the entire source is used. + """ + if not isinstance(factor, (list, tuple)): + factor = (factor, factor) + + if box is None: + box = (0, 0) + self.size + + if factor == (1, 1) and box == (0, 0) + self.size: + return self.copy() + + if self.mode in ["LA", "RGBA"]: + im = self.convert({"LA": "La", "RGBA": "RGBa"}[self.mode]) + im = im.reduce(factor, box) + return im.convert(self.mode) + + self.load() + + return self._new(self.im.reduce(factor, box)) + + def rotate( + self, + angle: float, + resample: Resampling = Resampling.NEAREST, + expand: int | bool = False, + center: tuple[float, float] | None = None, + translate: tuple[int, int] | None = None, + fillcolor: float | tuple[float, ...] | str | None = None, + ) -> Image: + """ + Returns a rotated copy of this image. This method returns a + copy of this image, rotated the given number of degrees counter + clockwise around its centre. + + :param angle: In degrees counter clockwise. + :param resample: An optional resampling filter. This can be + one of :py:data:`Resampling.NEAREST` (use nearest neighbour), + :py:data:`Resampling.BILINEAR` (linear interpolation in a 2x2 + environment), or :py:data:`Resampling.BICUBIC` (cubic spline + interpolation in a 4x4 environment). If omitted, or if the image has + mode "1" or "P", it is set to :py:data:`Resampling.NEAREST`. + See :ref:`concept-filters`. + :param expand: Optional expansion flag. If true, expands the output + image to make it large enough to hold the entire rotated image. + If false or omitted, make the output image the same size as the + input image. Note that the expand flag assumes rotation around + the center and no translation. + :param center: Optional center of rotation (a 2-tuple). Origin is + the upper left corner. Default is the center of the image. + :param translate: An optional post-rotate translation (a 2-tuple). + :param fillcolor: An optional color for area outside the rotated image. + :returns: An :py:class:`~PIL.Image.Image` object. + """ + + angle = angle % 360.0 + + # Fast paths regardless of filter, as long as we're not + # translating or changing the center. + if not (center or translate): + if angle == 0: + return self.copy() + if angle == 180: + return self.transpose(Transpose.ROTATE_180) + if angle in (90, 270) and (expand or self.width == self.height): + return self.transpose( + Transpose.ROTATE_90 if angle == 90 else Transpose.ROTATE_270 + ) + + # Calculate the affine matrix. Note that this is the reverse + # transformation (from destination image to source) because we + # want to interpolate the (discrete) destination pixel from + # the local area around the (floating) source pixel. + + # The matrix we actually want (note that it operates from the right): + # (1, 0, tx) (1, 0, cx) ( cos a, sin a, 0) (1, 0, -cx) + # (0, 1, ty) * (0, 1, cy) * (-sin a, cos a, 0) * (0, 1, -cy) + # (0, 0, 1) (0, 0, 1) ( 0, 0, 1) (0, 0, 1) + + # The reverse matrix is thus: + # (1, 0, cx) ( cos -a, sin -a, 0) (1, 0, -cx) (1, 0, -tx) + # (0, 1, cy) * (-sin -a, cos -a, 0) * (0, 1, -cy) * (0, 1, -ty) + # (0, 0, 1) ( 0, 0, 1) (0, 0, 1) (0, 0, 1) + + # In any case, the final translation may be updated at the end to + # compensate for the expand flag. + + w, h = self.size + + if translate is None: + post_trans = (0, 0) + else: + post_trans = translate + if center is None: + center = (w / 2, h / 2) + + angle = -math.radians(angle) + matrix = [ + round(math.cos(angle), 15), + round(math.sin(angle), 15), + 0.0, + round(-math.sin(angle), 15), + round(math.cos(angle), 15), + 0.0, + ] + + def transform(x: float, y: float, matrix: list[float]) -> tuple[float, float]: + (a, b, c, d, e, f) = matrix + return a * x + b * y + c, d * x + e * y + f + + matrix[2], matrix[5] = transform( + -center[0] - post_trans[0], -center[1] - post_trans[1], matrix + ) + matrix[2] += center[0] + matrix[5] += center[1] + + if expand: + # calculate output size + xx = [] + yy = [] + for x, y in ((0, 0), (w, 0), (w, h), (0, h)): + transformed_x, transformed_y = transform(x, y, matrix) + xx.append(transformed_x) + yy.append(transformed_y) + nw = math.ceil(max(xx)) - math.floor(min(xx)) + nh = math.ceil(max(yy)) - math.floor(min(yy)) + + # We multiply a translation matrix from the right. Because of its + # special form, this is the same as taking the image of the + # translation vector as new translation vector. + matrix[2], matrix[5] = transform(-(nw - w) / 2.0, -(nh - h) / 2.0, matrix) + w, h = nw, nh + + return self.transform( + (w, h), Transform.AFFINE, matrix, resample, fillcolor=fillcolor + ) + + def save( + self, fp: StrOrBytesPath | IO[bytes], format: str | None = None, **params: Any + ) -> None: + """ + Saves this image under the given filename. If no format is + specified, the format to use is determined from the filename + extension, if possible. + + Keyword options can be used to provide additional instructions + to the writer. If a writer doesn't recognise an option, it is + silently ignored. The available options are described in the + :doc:`image format documentation + <../handbook/image-file-formats>` for each writer. + + You can use a file object instead of a filename. In this case, + you must always specify the format. The file object must + implement the ``seek``, ``tell``, and ``write`` + methods, and be opened in binary mode. + + :param fp: A filename (string), os.PathLike object or file object. + :param format: Optional format override. If omitted, the + format to use is determined from the filename extension. + If a file object was used instead of a filename, this + parameter should always be used. + :param params: Extra parameters to the image writer. + :returns: None + :exception ValueError: If the output format could not be determined + from the file name. Use the format option to solve this. + :exception OSError: If the file could not be written. The file + may have been created, and may contain partial data. + """ + + filename: str | bytes = "" + open_fp = False + if is_path(fp): + filename = os.path.realpath(os.fspath(fp)) + open_fp = True + elif fp == sys.stdout: + try: + fp = sys.stdout.buffer + except AttributeError: + pass + if not filename and hasattr(fp, "name") and is_path(fp.name): + # only set the name for metadata purposes + filename = os.path.realpath(os.fspath(fp.name)) + + # may mutate self! + self._ensure_mutable() + + save_all = params.pop("save_all", False) + self.encoderinfo = params + self.encoderconfig: tuple[Any, ...] = () + + preinit() + + filename_ext = os.path.splitext(filename)[1].lower() + ext = filename_ext.decode() if isinstance(filename_ext, bytes) else filename_ext + + if not format: + if ext not in EXTENSION: + init() + try: + format = EXTENSION[ext] + except KeyError as e: + msg = f"unknown file extension: {ext}" + raise ValueError(msg) from e + + if format.upper() not in SAVE: + init() + if save_all: + save_handler = SAVE_ALL[format.upper()] + else: + save_handler = SAVE[format.upper()] + + created = False + if open_fp: + created = not os.path.exists(filename) + if params.get("append", False): + # Open also for reading ("+"), because TIFF save_all + # writer needs to go back and edit the written data. + fp = builtins.open(filename, "r+b") + else: + fp = builtins.open(filename, "w+b") + else: + fp = cast(IO[bytes], fp) + + try: + save_handler(self, fp, filename) + except Exception: + if open_fp: + fp.close() + if created: + try: + os.remove(filename) + except PermissionError: + pass + raise + if open_fp: + fp.close() + + def seek(self, frame: int) -> None: + """ + Seeks to the given frame in this sequence file. If you seek + beyond the end of the sequence, the method raises an + ``EOFError`` exception. When a sequence file is opened, the + library automatically seeks to frame 0. + + See :py:meth:`~PIL.Image.Image.tell`. + + If defined, :attr:`~PIL.Image.Image.n_frames` refers to the + number of available frames. + + :param frame: Frame number, starting at 0. + :exception EOFError: If the call attempts to seek beyond the end + of the sequence. + """ + + # overridden by file handlers + if frame != 0: + msg = "no more images in file" + raise EOFError(msg) + + def show(self, title: str | None = None) -> None: + """ + Displays this image. This method is mainly intended for debugging purposes. + + This method calls :py:func:`PIL.ImageShow.show` internally. You can use + :py:func:`PIL.ImageShow.register` to override its default behaviour. + + The image is first saved to a temporary file. By default, it will be in + PNG format. + + On Unix, the image is then opened using the **xdg-open**, **display**, + **gm**, **eog** or **xv** utility, depending on which one can be found. + + On macOS, the image is opened with the native Preview application. + + On Windows, the image is opened with the standard PNG display utility. + + :param title: Optional title to use for the image window, where possible. + """ + + _show(self, title=title) + + def split(self) -> tuple[Image, ...]: + """ + Split this image into individual bands. This method returns a + tuple of individual image bands from an image. For example, + splitting an "RGB" image creates three new images each + containing a copy of one of the original bands (red, green, + blue). + + If you need only one band, :py:meth:`~PIL.Image.Image.getchannel` + method can be more convenient and faster. + + :returns: A tuple containing bands. + """ + + self.load() + if self.im.bands == 1: + return (self.copy(),) + return tuple(map(self._new, self.im.split())) + + def getchannel(self, channel: int | str) -> Image: + """ + Returns an image containing a single channel of the source image. + + :param channel: What channel to return. Could be index + (0 for "R" channel of "RGB") or channel name + ("A" for alpha channel of "RGBA"). + :returns: An image in "L" mode. + + .. versionadded:: 4.3.0 + """ + self.load() + + if isinstance(channel, str): + try: + channel = self.getbands().index(channel) + except ValueError as e: + msg = f'The image has no channel "{channel}"' + raise ValueError(msg) from e + + return self._new(self.im.getband(channel)) + + def tell(self) -> int: + """ + Returns the current frame number. See :py:meth:`~PIL.Image.Image.seek`. + + If defined, :attr:`~PIL.Image.Image.n_frames` refers to the + number of available frames. + + :returns: Frame number, starting with 0. + """ + return 0 + + def thumbnail( + self, + size: tuple[float, float], + resample: Resampling = Resampling.BICUBIC, + reducing_gap: float | None = 2.0, + ) -> None: + """ + Make this image into a thumbnail. This method modifies the + image to contain a thumbnail version of itself, no larger than + the given size. This method calculates an appropriate thumbnail + size to preserve the aspect of the image, calls the + :py:meth:`~PIL.Image.Image.draft` method to configure the file reader + (where applicable), and finally resizes the image. + + Note that this function modifies the :py:class:`~PIL.Image.Image` + object in place. If you need to use the full resolution image as well, + apply this method to a :py:meth:`~PIL.Image.Image.copy` of the original + image. + + :param size: The requested size in pixels, as a 2-tuple: + (width, height). + :param resample: Optional resampling filter. This can be one + of :py:data:`Resampling.NEAREST`, :py:data:`Resampling.BOX`, + :py:data:`Resampling.BILINEAR`, :py:data:`Resampling.HAMMING`, + :py:data:`Resampling.BICUBIC` or :py:data:`Resampling.LANCZOS`. + If omitted, it defaults to :py:data:`Resampling.BICUBIC`. + (was :py:data:`Resampling.NEAREST` prior to version 2.5.0). + See: :ref:`concept-filters`. + :param reducing_gap: Apply optimization by resizing the image + in two steps. First, reducing the image by integer times + using :py:meth:`~PIL.Image.Image.reduce` or + :py:meth:`~PIL.Image.Image.draft` for JPEG images. + Second, resizing using regular resampling. The last step + changes size no less than by ``reducing_gap`` times. + ``reducing_gap`` may be None (no first step is performed) + or should be greater than 1.0. The bigger ``reducing_gap``, + the closer the result to the fair resampling. + The smaller ``reducing_gap``, the faster resizing. + With ``reducing_gap`` greater or equal to 3.0, the result is + indistinguishable from fair resampling in most cases. + The default value is 2.0 (very close to fair resampling + while still being faster in many cases). + :returns: None + """ + + provided_size = tuple(map(math.floor, size)) + + def preserve_aspect_ratio() -> tuple[int, int] | None: + def round_aspect(number: float, key: Callable[[int], float]) -> int: + return max(min(math.floor(number), math.ceil(number), key=key), 1) + + x, y = provided_size + if x >= self.width and y >= self.height: + return None + + aspect = self.width / self.height + if x / y >= aspect: + x = round_aspect(y * aspect, key=lambda n: abs(aspect - n / y)) + else: + y = round_aspect( + x / aspect, key=lambda n: 0 if n == 0 else abs(aspect - x / n) + ) + return x, y + + preserved_size = preserve_aspect_ratio() + if preserved_size is None: + return + final_size = preserved_size + + box = None + if reducing_gap is not None: + res = self.draft( + None, (int(size[0] * reducing_gap), int(size[1] * reducing_gap)) + ) + if res is not None: + box = res[1] + + if self.size != final_size: + im = self.resize(final_size, resample, box=box, reducing_gap=reducing_gap) + + self.im = im.im + self._size = final_size + self._mode = self.im.mode + + self.readonly = 0 + + # FIXME: the different transform methods need further explanation + # instead of bloating the method docs, add a separate chapter. + def transform( + self, + size: tuple[int, int], + method: Transform | ImageTransformHandler | SupportsGetData, + data: Sequence[Any] | None = None, + resample: int = Resampling.NEAREST, + fill: int = 1, + fillcolor: float | tuple[float, ...] | str | None = None, + ) -> Image: + """ + Transforms this image. This method creates a new image with the + given size, and the same mode as the original, and copies data + to the new image using the given transform. + + :param size: The output size in pixels, as a 2-tuple: + (width, height). + :param method: The transformation method. This is one of + :py:data:`Transform.EXTENT` (cut out a rectangular subregion), + :py:data:`Transform.AFFINE` (affine transform), + :py:data:`Transform.PERSPECTIVE` (perspective transform), + :py:data:`Transform.QUAD` (map a quadrilateral to a rectangle), or + :py:data:`Transform.MESH` (map a number of source quadrilaterals + in one operation). + + It may also be an :py:class:`~PIL.Image.ImageTransformHandler` + object:: + + class Example(Image.ImageTransformHandler): + def transform(self, size, data, resample, fill=1): + # Return result + + Implementations of :py:class:`~PIL.Image.ImageTransformHandler` + for some of the :py:class:`Transform` methods are provided + in :py:mod:`~PIL.ImageTransform`. + + It may also be an object with a ``method.getdata`` method + that returns a tuple supplying new ``method`` and ``data`` values:: + + class Example: + def getdata(self): + method = Image.Transform.EXTENT + data = (0, 0, 100, 100) + return method, data + :param data: Extra data to the transformation method. + :param resample: Optional resampling filter. It can be one of + :py:data:`Resampling.NEAREST` (use nearest neighbour), + :py:data:`Resampling.BILINEAR` (linear interpolation in a 2x2 + environment), or :py:data:`Resampling.BICUBIC` (cubic spline + interpolation in a 4x4 environment). If omitted, or if the image + has mode "1" or "P", it is set to :py:data:`Resampling.NEAREST`. + See: :ref:`concept-filters`. + :param fill: If ``method`` is an + :py:class:`~PIL.Image.ImageTransformHandler` object, this is one of + the arguments passed to it. Otherwise, it is unused. + :param fillcolor: Optional fill color for the area outside the + transform in the output image. + :returns: An :py:class:`~PIL.Image.Image` object. + """ + + if self.mode in ("LA", "RGBA") and resample != Resampling.NEAREST: + return ( + self.convert({"LA": "La", "RGBA": "RGBa"}[self.mode]) + .transform(size, method, data, resample, fill, fillcolor) + .convert(self.mode) + ) + + if isinstance(method, ImageTransformHandler): + return method.transform(size, self, resample=resample, fill=fill) + + if hasattr(method, "getdata"): + # compatibility w. old-style transform objects + method, data = method.getdata() + + if data is None: + msg = "missing method data" + raise ValueError(msg) + + im = new(self.mode, size, fillcolor) + if self.mode == "P" and self.palette: + im.palette = self.palette.copy() + im.info = self.info.copy() + if method == Transform.MESH: + # list of quads + for box, quad in data: + im.__transformer( + box, self, Transform.QUAD, quad, resample, fillcolor is None + ) + else: + im.__transformer( + (0, 0) + size, self, method, data, resample, fillcolor is None + ) + + return im + + def __transformer( + self, + box: tuple[int, int, int, int], + image: Image, + method: Transform, + data: Sequence[float], + resample: int = Resampling.NEAREST, + fill: bool = True, + ) -> None: + w = box[2] - box[0] + h = box[3] - box[1] + + if method == Transform.AFFINE: + data = data[:6] + + elif method == Transform.EXTENT: + # convert extent to an affine transform + x0, y0, x1, y1 = data + xs = (x1 - x0) / w + ys = (y1 - y0) / h + method = Transform.AFFINE + data = (xs, 0, x0, 0, ys, y0) + + elif method == Transform.PERSPECTIVE: + data = data[:8] + + elif method == Transform.QUAD: + # quadrilateral warp. data specifies the four corners + # given as NW, SW, SE, and NE. + nw = data[:2] + sw = data[2:4] + se = data[4:6] + ne = data[6:8] + x0, y0 = nw + As = 1.0 / w + At = 1.0 / h + data = ( + x0, + (ne[0] - x0) * As, + (sw[0] - x0) * At, + (se[0] - sw[0] - ne[0] + x0) * As * At, + y0, + (ne[1] - y0) * As, + (sw[1] - y0) * At, + (se[1] - sw[1] - ne[1] + y0) * As * At, + ) + + else: + msg = "unknown transformation method" + raise ValueError(msg) + + if resample not in ( + Resampling.NEAREST, + Resampling.BILINEAR, + Resampling.BICUBIC, + ): + if resample in (Resampling.BOX, Resampling.HAMMING, Resampling.LANCZOS): + unusable: dict[int, str] = { + Resampling.BOX: "Image.Resampling.BOX", + Resampling.HAMMING: "Image.Resampling.HAMMING", + Resampling.LANCZOS: "Image.Resampling.LANCZOS", + } + msg = unusable[resample] + f" ({resample}) cannot be used." + else: + msg = f"Unknown resampling filter ({resample})." + + filters = [ + f"{filter[1]} ({filter[0]})" + for filter in ( + (Resampling.NEAREST, "Image.Resampling.NEAREST"), + (Resampling.BILINEAR, "Image.Resampling.BILINEAR"), + (Resampling.BICUBIC, "Image.Resampling.BICUBIC"), + ) + ] + msg += f" Use {', '.join(filters[:-1])} or {filters[-1]}" + raise ValueError(msg) + + image.load() + + self.load() + + if image.mode in ("1", "P"): + resample = Resampling.NEAREST + + self.im.transform(box, image.im, method, data, resample, fill) + + def transpose(self, method: Transpose) -> Image: + """ + Transpose image (flip or rotate in 90 degree steps) + + :param method: One of :py:data:`Transpose.FLIP_LEFT_RIGHT`, + :py:data:`Transpose.FLIP_TOP_BOTTOM`, :py:data:`Transpose.ROTATE_90`, + :py:data:`Transpose.ROTATE_180`, :py:data:`Transpose.ROTATE_270`, + :py:data:`Transpose.TRANSPOSE` or :py:data:`Transpose.TRANSVERSE`. + :returns: Returns a flipped or rotated copy of this image. + """ + + self.load() + return self._new(self.im.transpose(method)) + + def effect_spread(self, distance: int) -> Image: + """ + Randomly spread pixels in an image. + + :param distance: Distance to spread pixels. + """ + self.load() + return self._new(self.im.effect_spread(distance)) + + def toqimage(self) -> ImageQt.ImageQt: + """Returns a QImage copy of this image""" + from . import ImageQt + + if not ImageQt.qt_is_installed: + msg = "Qt bindings are not installed" + raise ImportError(msg) + return ImageQt.toqimage(self) + + def toqpixmap(self) -> ImageQt.QPixmap: + """Returns a QPixmap copy of this image""" + from . import ImageQt + + if not ImageQt.qt_is_installed: + msg = "Qt bindings are not installed" + raise ImportError(msg) + return ImageQt.toqpixmap(self) + + +# -------------------------------------------------------------------- +# Abstract handlers. + + +class ImagePointHandler: + """ + Used as a mixin by point transforms + (for use with :py:meth:`~PIL.Image.Image.point`) + """ + + @abc.abstractmethod + def point(self, im: Image) -> Image: + pass + + +class ImageTransformHandler: + """ + Used as a mixin by geometry transforms + (for use with :py:meth:`~PIL.Image.Image.transform`) + """ + + @abc.abstractmethod + def transform( + self, + size: tuple[int, int], + image: Image, + **options: Any, + ) -> Image: + pass + + +# -------------------------------------------------------------------- +# Factories + +# +# Debugging + + +def _wedge() -> Image: + """Create grayscale wedge (for debugging only)""" + + return Image()._new(core.wedge("L")) + + +def _check_size(size: Any) -> None: + """ + Common check to enforce type and sanity check on size tuples + + :param size: Should be a 2 tuple of (width, height) + :returns: None, or raises a ValueError + """ + + if not isinstance(size, (list, tuple)): + msg = "Size must be a list or tuple" + raise ValueError(msg) + if len(size) != 2: + msg = "Size must be a sequence of length 2" + raise ValueError(msg) + if size[0] < 0 or size[1] < 0: + msg = "Width and height must be >= 0" + raise ValueError(msg) + + +def new( + mode: str, + size: tuple[int, int] | list[int], + color: float | tuple[float, ...] | str | None = 0, +) -> Image: + """ + Creates a new image with the given mode and size. + + :param mode: The mode to use for the new image. See: + :ref:`concept-modes`. + :param size: A 2-tuple, containing (width, height) in pixels. + :param color: What color to use for the image. Default is black. + If given, this should be a single integer or floating point value + for single-band modes, and a tuple for multi-band modes (one value + per band). When creating RGB or HSV images, you can also use color + strings as supported by the ImageColor module. If the color is + None, the image is not initialised. + :returns: An :py:class:`~PIL.Image.Image` object. + """ + + if mode in ("BGR;15", "BGR;16", "BGR;24"): + deprecate(mode, 12) + + _check_size(size) + + if color is None: + # don't initialize + return Image()._new(core.new(mode, size)) + + if isinstance(color, str): + # css3-style specifier + + from . import ImageColor + + color = ImageColor.getcolor(color, mode) + + im = Image() + if ( + mode == "P" + and isinstance(color, (list, tuple)) + and all(isinstance(i, int) for i in color) + ): + color_ints: tuple[int, ...] = cast(tuple[int, ...], tuple(color)) + if len(color_ints) == 3 or len(color_ints) == 4: + # RGB or RGBA value for a P image + from . import ImagePalette + + im.palette = ImagePalette.ImagePalette() + color = im.palette.getcolor(color_ints) + return im._new(core.fill(mode, size, color)) + + +def frombytes( + mode: str, + size: tuple[int, int], + data: bytes | bytearray | SupportsArrayInterface, + decoder_name: str = "raw", + *args: Any, +) -> Image: + """ + Creates a copy of an image memory from pixel data in a buffer. + + In its simplest form, this function takes three arguments + (mode, size, and unpacked pixel data). + + You can also use any pixel decoder supported by PIL. For more + information on available decoders, see the section + :ref:`Writing Your Own File Codec `. + + Note that this function decodes pixel data only, not entire images. + If you have an entire image in a string, wrap it in a + :py:class:`~io.BytesIO` object, and use :py:func:`~PIL.Image.open` to load + it. + + :param mode: The image mode. See: :ref:`concept-modes`. + :param size: The image size. + :param data: A byte buffer containing raw data for the given mode. + :param decoder_name: What decoder to use. + :param args: Additional parameters for the given decoder. + :returns: An :py:class:`~PIL.Image.Image` object. + """ + + _check_size(size) + + im = new(mode, size) + if im.width != 0 and im.height != 0: + decoder_args: Any = args + if len(decoder_args) == 1 and isinstance(decoder_args[0], tuple): + # may pass tuple instead of argument list + decoder_args = decoder_args[0] + + if decoder_name == "raw" and decoder_args == (): + decoder_args = mode + + im.frombytes(data, decoder_name, decoder_args) + return im + + +def frombuffer( + mode: str, + size: tuple[int, int], + data: bytes | SupportsArrayInterface, + decoder_name: str = "raw", + *args: Any, +) -> Image: + """ + Creates an image memory referencing pixel data in a byte buffer. + + This function is similar to :py:func:`~PIL.Image.frombytes`, but uses data + in the byte buffer, where possible. This means that changes to the + original buffer object are reflected in this image). Not all modes can + share memory; supported modes include "L", "RGBX", "RGBA", and "CMYK". + + Note that this function decodes pixel data only, not entire images. + If you have an entire image file in a string, wrap it in a + :py:class:`~io.BytesIO` object, and use :py:func:`~PIL.Image.open` to load it. + + The default parameters used for the "raw" decoder differs from that used for + :py:func:`~PIL.Image.frombytes`. This is a bug, and will probably be fixed in a + future release. The current release issues a warning if you do this; to disable + the warning, you should provide the full set of parameters. See below for details. + + :param mode: The image mode. See: :ref:`concept-modes`. + :param size: The image size. + :param data: A bytes or other buffer object containing raw + data for the given mode. + :param decoder_name: What decoder to use. + :param args: Additional parameters for the given decoder. For the + default encoder ("raw"), it's recommended that you provide the + full set of parameters:: + + frombuffer(mode, size, data, "raw", mode, 0, 1) + + :returns: An :py:class:`~PIL.Image.Image` object. + + .. versionadded:: 1.1.4 + """ + + _check_size(size) + + # may pass tuple instead of argument list + if len(args) == 1 and isinstance(args[0], tuple): + args = args[0] + + if decoder_name == "raw": + if args == (): + args = mode, 0, 1 + if args[0] in _MAPMODES: + im = new(mode, (0, 0)) + im = im._new(core.map_buffer(data, size, decoder_name, 0, args)) + if mode == "P": + from . import ImagePalette + + im.palette = ImagePalette.ImagePalette("RGB", im.im.getpalette("RGB")) + im.readonly = 1 + return im + + return frombytes(mode, size, data, decoder_name, args) + + +class SupportsArrayInterface(Protocol): + """ + An object that has an ``__array_interface__`` dictionary. + """ + + @property + def __array_interface__(self) -> dict[str, Any]: + raise NotImplementedError() + + +def fromarray(obj: SupportsArrayInterface, mode: str | None = None) -> Image: + """ + Creates an image memory from an object exporting the array interface + (using the buffer protocol):: + + from PIL import Image + import numpy as np + a = np.zeros((5, 5)) + im = Image.fromarray(a) + + If ``obj`` is not contiguous, then the ``tobytes`` method is called + and :py:func:`~PIL.Image.frombuffer` is used. + + In the case of NumPy, be aware that Pillow modes do not always correspond + to NumPy dtypes. Pillow modes only offer 1-bit pixels, 8-bit pixels, + 32-bit signed integer pixels, and 32-bit floating point pixels. + + Pillow images can also be converted to arrays:: + + from PIL import Image + import numpy as np + im = Image.open("hopper.jpg") + a = np.asarray(im) + + When converting Pillow images to arrays however, only pixel values are + transferred. This means that P and PA mode images will lose their palette. + + :param obj: Object with array interface + :param mode: Optional mode to use when reading ``obj``. Will be determined from + type if ``None``. + + This will not be used to convert the data after reading, but will be used to + change how the data is read:: + + from PIL import Image + import numpy as np + a = np.full((1, 1), 300) + im = Image.fromarray(a, mode="L") + im.getpixel((0, 0)) # 44 + im = Image.fromarray(a, mode="RGB") + im.getpixel((0, 0)) # (44, 1, 0) + + See: :ref:`concept-modes` for general information about modes. + :returns: An image object. + + .. versionadded:: 1.1.6 + """ + arr = obj.__array_interface__ + shape = arr["shape"] + ndim = len(shape) + strides = arr.get("strides", None) + if mode is None: + try: + typekey = (1, 1) + shape[2:], arr["typestr"] + except KeyError as e: + msg = "Cannot handle this data type" + raise TypeError(msg) from e + try: + mode, rawmode = _fromarray_typemap[typekey] + except KeyError as e: + typekey_shape, typestr = typekey + msg = f"Cannot handle this data type: {typekey_shape}, {typestr}" + raise TypeError(msg) from e + else: + rawmode = mode + if mode in ["1", "L", "I", "P", "F"]: + ndmax = 2 + elif mode == "RGB": + ndmax = 3 + else: + ndmax = 4 + if ndim > ndmax: + msg = f"Too many dimensions: {ndim} > {ndmax}." + raise ValueError(msg) + + size = 1 if ndim == 1 else shape[1], shape[0] + if strides is not None: + if hasattr(obj, "tobytes"): + obj = obj.tobytes() + elif hasattr(obj, "tostring"): + obj = obj.tostring() + else: + msg = "'strides' requires either tobytes() or tostring()" + raise ValueError(msg) + + return frombuffer(mode, size, obj, "raw", rawmode, 0, 1) + + +def fromqimage(im: ImageQt.QImage) -> ImageFile.ImageFile: + """Creates an image instance from a QImage image""" + from . import ImageQt + + if not ImageQt.qt_is_installed: + msg = "Qt bindings are not installed" + raise ImportError(msg) + return ImageQt.fromqimage(im) + + +def fromqpixmap(im: ImageQt.QPixmap) -> ImageFile.ImageFile: + """Creates an image instance from a QPixmap image""" + from . import ImageQt + + if not ImageQt.qt_is_installed: + msg = "Qt bindings are not installed" + raise ImportError(msg) + return ImageQt.fromqpixmap(im) + + +_fromarray_typemap = { + # (shape, typestr) => mode, rawmode + # first two members of shape are set to one + ((1, 1), "|b1"): ("1", "1;8"), + ((1, 1), "|u1"): ("L", "L"), + ((1, 1), "|i1"): ("I", "I;8"), + ((1, 1), "u2"): ("I", "I;16B"), + ((1, 1), "i2"): ("I", "I;16BS"), + ((1, 1), "u4"): ("I", "I;32B"), + ((1, 1), "i4"): ("I", "I;32BS"), + ((1, 1), "f4"): ("F", "F;32BF"), + ((1, 1), "f8"): ("F", "F;64BF"), + ((1, 1, 2), "|u1"): ("LA", "LA"), + ((1, 1, 3), "|u1"): ("RGB", "RGB"), + ((1, 1, 4), "|u1"): ("RGBA", "RGBA"), + # shortcuts: + ((1, 1), f"{_ENDIAN}i4"): ("I", "I"), + ((1, 1), f"{_ENDIAN}f4"): ("F", "F"), +} + + +def _decompression_bomb_check(size: tuple[int, int]) -> None: + if MAX_IMAGE_PIXELS is None: + return + + pixels = max(1, size[0]) * max(1, size[1]) + + if pixels > 2 * MAX_IMAGE_PIXELS: + msg = ( + f"Image size ({pixels} pixels) exceeds limit of {2 * MAX_IMAGE_PIXELS} " + "pixels, could be decompression bomb DOS attack." + ) + raise DecompressionBombError(msg) + + if pixels > MAX_IMAGE_PIXELS: + warnings.warn( + f"Image size ({pixels} pixels) exceeds limit of {MAX_IMAGE_PIXELS} pixels, " + "could be decompression bomb DOS attack.", + DecompressionBombWarning, + ) + + +def open( + fp: StrOrBytesPath | IO[bytes], + mode: Literal["r"] = "r", + formats: list[str] | tuple[str, ...] | None = None, +) -> ImageFile.ImageFile: + """ + Opens and identifies the given image file. + + This is a lazy operation; this function identifies the file, but + the file remains open and the actual image data is not read from + the file until you try to process the data (or call the + :py:meth:`~PIL.Image.Image.load` method). See + :py:func:`~PIL.Image.new`. See :ref:`file-handling`. + + :param fp: A filename (string), os.PathLike object or a file object. + The file object must implement ``file.read``, + ``file.seek``, and ``file.tell`` methods, + and be opened in binary mode. The file object will also seek to zero + before reading. + :param mode: The mode. If given, this argument must be "r". + :param formats: A list or tuple of formats to attempt to load the file in. + This can be used to restrict the set of formats checked. + Pass ``None`` to try all supported formats. You can print the set of + available formats by running ``python3 -m PIL`` or using + the :py:func:`PIL.features.pilinfo` function. + :returns: An :py:class:`~PIL.Image.Image` object. + :exception FileNotFoundError: If the file cannot be found. + :exception PIL.UnidentifiedImageError: If the image cannot be opened and + identified. + :exception ValueError: If the ``mode`` is not "r", or if a ``StringIO`` + instance is used for ``fp``. + :exception TypeError: If ``formats`` is not ``None``, a list or a tuple. + """ + + if mode != "r": + msg = f"bad mode {repr(mode)}" # type: ignore[unreachable] + raise ValueError(msg) + elif isinstance(fp, io.StringIO): + msg = ( # type: ignore[unreachable] + "StringIO cannot be used to open an image. " + "Binary data must be used instead." + ) + raise ValueError(msg) + + if formats is None: + formats = ID + elif not isinstance(formats, (list, tuple)): + msg = "formats must be a list or tuple" # type: ignore[unreachable] + raise TypeError(msg) + + exclusive_fp = False + filename: str | bytes = "" + if is_path(fp): + filename = os.path.realpath(os.fspath(fp)) + + if filename: + fp = builtins.open(filename, "rb") + exclusive_fp = True + else: + fp = cast(IO[bytes], fp) + + try: + fp.seek(0) + except (AttributeError, io.UnsupportedOperation): + fp = io.BytesIO(fp.read()) + exclusive_fp = True + + prefix = fp.read(16) + + preinit() + + warning_messages: list[str] = [] + + def _open_core( + fp: IO[bytes], + filename: str | bytes, + prefix: bytes, + formats: list[str] | tuple[str, ...], + ) -> ImageFile.ImageFile | None: + for i in formats: + i = i.upper() + if i not in OPEN: + init() + try: + factory, accept = OPEN[i] + result = not accept or accept(prefix) + if isinstance(result, str): + warning_messages.append(result) + elif result: + fp.seek(0) + im = factory(fp, filename) + _decompression_bomb_check(im.size) + return im + except (SyntaxError, IndexError, TypeError, struct.error) as e: + if WARN_POSSIBLE_FORMATS: + warning_messages.append(i + " opening failed. " + str(e)) + except BaseException: + if exclusive_fp: + fp.close() + raise + return None + + im = _open_core(fp, filename, prefix, formats) + + if im is None and formats is ID: + checked_formats = ID.copy() + if init(): + im = _open_core( + fp, + filename, + prefix, + tuple(format for format in formats if format not in checked_formats), + ) + + if im: + im._exclusive_fp = exclusive_fp + return im + + if exclusive_fp: + fp.close() + for message in warning_messages: + warnings.warn(message) + msg = "cannot identify image file %r" % (filename if filename else fp) + raise UnidentifiedImageError(msg) + + +# +# Image processing. + + +def alpha_composite(im1: Image, im2: Image) -> Image: + """ + Alpha composite im2 over im1. + + :param im1: The first image. Must have mode RGBA. + :param im2: The second image. Must have mode RGBA, and the same size as + the first image. + :returns: An :py:class:`~PIL.Image.Image` object. + """ + + im1.load() + im2.load() + return im1._new(core.alpha_composite(im1.im, im2.im)) + + +def blend(im1: Image, im2: Image, alpha: float) -> Image: + """ + Creates a new image by interpolating between two input images, using + a constant alpha:: + + out = image1 * (1.0 - alpha) + image2 * alpha + + :param im1: The first image. + :param im2: The second image. Must have the same mode and size as + the first image. + :param alpha: The interpolation alpha factor. If alpha is 0.0, a + copy of the first image is returned. If alpha is 1.0, a copy of + the second image is returned. There are no restrictions on the + alpha value. If necessary, the result is clipped to fit into + the allowed output range. + :returns: An :py:class:`~PIL.Image.Image` object. + """ + + im1.load() + im2.load() + return im1._new(core.blend(im1.im, im2.im, alpha)) + + +def composite(image1: Image, image2: Image, mask: Image) -> Image: + """ + Create composite image by blending images using a transparency mask. + + :param image1: The first image. + :param image2: The second image. Must have the same mode and + size as the first image. + :param mask: A mask image. This image can have mode + "1", "L", or "RGBA", and must have the same size as the + other two images. + """ + + image = image2.copy() + image.paste(image1, None, mask) + return image + + +def eval(image: Image, *args: Callable[[int], float]) -> Image: + """ + Applies the function (which should take one argument) to each pixel + in the given image. If the image has more than one band, the same + function is applied to each band. Note that the function is + evaluated once for each possible pixel value, so you cannot use + random components or other generators. + + :param image: The input image. + :param function: A function object, taking one integer argument. + :returns: An :py:class:`~PIL.Image.Image` object. + """ + + return image.point(args[0]) + + +def merge(mode: str, bands: Sequence[Image]) -> Image: + """ + Merge a set of single band images into a new multiband image. + + :param mode: The mode to use for the output image. See: + :ref:`concept-modes`. + :param bands: A sequence containing one single-band image for + each band in the output image. All bands must have the + same size. + :returns: An :py:class:`~PIL.Image.Image` object. + """ + + if getmodebands(mode) != len(bands) or "*" in mode: + msg = "wrong number of bands" + raise ValueError(msg) + for band in bands[1:]: + if band.mode != getmodetype(mode): + msg = "mode mismatch" + raise ValueError(msg) + if band.size != bands[0].size: + msg = "size mismatch" + raise ValueError(msg) + for band in bands: + band.load() + return bands[0]._new(core.merge(mode, *[b.im for b in bands])) + + +# -------------------------------------------------------------------- +# Plugin registry + + +def register_open( + id: str, + factory: ( + Callable[[IO[bytes], str | bytes], ImageFile.ImageFile] + | type[ImageFile.ImageFile] + ), + accept: Callable[[bytes], bool | str] | None = None, +) -> None: + """ + Register an image file plugin. This function should not be used + in application code. + + :param id: An image format identifier. + :param factory: An image file factory method. + :param accept: An optional function that can be used to quickly + reject images having another format. + """ + id = id.upper() + if id not in ID: + ID.append(id) + OPEN[id] = factory, accept + + +def register_mime(id: str, mimetype: str) -> None: + """ + Registers an image MIME type by populating ``Image.MIME``. This function + should not be used in application code. + + ``Image.MIME`` provides a mapping from image format identifiers to mime + formats, but :py:meth:`~PIL.ImageFile.ImageFile.get_format_mimetype` can + provide a different result for specific images. + + :param id: An image format identifier. + :param mimetype: The image MIME type for this format. + """ + MIME[id.upper()] = mimetype + + +def register_save( + id: str, driver: Callable[[Image, IO[bytes], str | bytes], None] +) -> None: + """ + Registers an image save function. This function should not be + used in application code. + + :param id: An image format identifier. + :param driver: A function to save images in this format. + """ + SAVE[id.upper()] = driver + + +def register_save_all( + id: str, driver: Callable[[Image, IO[bytes], str | bytes], None] +) -> None: + """ + Registers an image function to save all the frames + of a multiframe format. This function should not be + used in application code. + + :param id: An image format identifier. + :param driver: A function to save images in this format. + """ + SAVE_ALL[id.upper()] = driver + + +def register_extension(id: str, extension: str) -> None: + """ + Registers an image extension. This function should not be + used in application code. + + :param id: An image format identifier. + :param extension: An extension used for this format. + """ + EXTENSION[extension.lower()] = id.upper() + + +def register_extensions(id: str, extensions: list[str]) -> None: + """ + Registers image extensions. This function should not be + used in application code. + + :param id: An image format identifier. + :param extensions: A list of extensions used for this format. + """ + for extension in extensions: + register_extension(id, extension) + + +def registered_extensions() -> dict[str, str]: + """ + Returns a dictionary containing all file extensions belonging + to registered plugins + """ + init() + return EXTENSION + + +def register_decoder(name: str, decoder: type[ImageFile.PyDecoder]) -> None: + """ + Registers an image decoder. This function should not be + used in application code. + + :param name: The name of the decoder + :param decoder: An ImageFile.PyDecoder object + + .. versionadded:: 4.1.0 + """ + DECODERS[name] = decoder + + +def register_encoder(name: str, encoder: type[ImageFile.PyEncoder]) -> None: + """ + Registers an image encoder. This function should not be + used in application code. + + :param name: The name of the encoder + :param encoder: An ImageFile.PyEncoder object + + .. versionadded:: 4.1.0 + """ + ENCODERS[name] = encoder + + +# -------------------------------------------------------------------- +# Simple display support. + + +def _show(image: Image, **options: Any) -> None: + from . import ImageShow + + ImageShow.show(image, **options) + + +# -------------------------------------------------------------------- +# Effects + + +def effect_mandelbrot( + size: tuple[int, int], extent: tuple[float, float, float, float], quality: int +) -> Image: + """ + Generate a Mandelbrot set covering the given extent. + + :param size: The requested size in pixels, as a 2-tuple: + (width, height). + :param extent: The extent to cover, as a 4-tuple: + (x0, y0, x1, y1). + :param quality: Quality. + """ + return Image()._new(core.effect_mandelbrot(size, extent, quality)) + + +def effect_noise(size: tuple[int, int], sigma: float) -> Image: + """ + Generate Gaussian noise centered around 128. + + :param size: The requested size in pixels, as a 2-tuple: + (width, height). + :param sigma: Standard deviation of noise. + """ + return Image()._new(core.effect_noise(size, sigma)) + + +def linear_gradient(mode: str) -> Image: + """ + Generate 256x256 linear gradient from black to white, top to bottom. + + :param mode: Input mode. + """ + return Image()._new(core.linear_gradient(mode)) + + +def radial_gradient(mode: str) -> Image: + """ + Generate 256x256 radial gradient from black to white, centre to edge. + + :param mode: Input mode. + """ + return Image()._new(core.radial_gradient(mode)) + + +# -------------------------------------------------------------------- +# Resources + + +def _apply_env_variables(env: dict[str, str] | None = None) -> None: + env_dict = env if env is not None else os.environ + + for var_name, setter in [ + ("PILLOW_ALIGNMENT", core.set_alignment), + ("PILLOW_BLOCK_SIZE", core.set_block_size), + ("PILLOW_BLOCKS_MAX", core.set_blocks_max), + ]: + if var_name not in env_dict: + continue + + var = env_dict[var_name].lower() + + units = 1 + for postfix, mul in [("k", 1024), ("m", 1024 * 1024)]: + if var.endswith(postfix): + units = mul + var = var[: -len(postfix)] + + try: + var_int = int(var) * units + except ValueError: + warnings.warn(f"{var_name} is not int") + continue + + try: + setter(var_int) + except ValueError as e: + warnings.warn(f"{var_name}: {e}") + + +_apply_env_variables() +atexit.register(core.clear_cache) + + +if TYPE_CHECKING: + _ExifBase = MutableMapping[int, Any] +else: + _ExifBase = MutableMapping + + +class Exif(_ExifBase): + """ + This class provides read and write access to EXIF image data:: + + from PIL import Image + im = Image.open("exif.png") + exif = im.getexif() # Returns an instance of this class + + Information can be read and written, iterated over or deleted:: + + print(exif[274]) # 1 + exif[274] = 2 + for k, v in exif.items(): + print("Tag", k, "Value", v) # Tag 274 Value 2 + del exif[274] + + To access information beyond IFD0, :py:meth:`~PIL.Image.Exif.get_ifd` + returns a dictionary:: + + from PIL import ExifTags + im = Image.open("exif_gps.jpg") + exif = im.getexif() + gps_ifd = exif.get_ifd(ExifTags.IFD.GPSInfo) + print(gps_ifd) + + Other IFDs include ``ExifTags.IFD.Exif``, ``ExifTags.IFD.Makernote``, + ``ExifTags.IFD.Interop`` and ``ExifTags.IFD.IFD1``. + + :py:mod:`~PIL.ExifTags` also has enum classes to provide names for data:: + + print(exif[ExifTags.Base.Software]) # PIL + print(gps_ifd[ExifTags.GPS.GPSDateStamp]) # 1999:99:99 99:99:99 + """ + + endian: str | None = None + bigtiff = False + _loaded = False + + def __init__(self) -> None: + self._data: dict[int, Any] = {} + self._hidden_data: dict[int, Any] = {} + self._ifds: dict[int, dict[int, Any]] = {} + self._info: TiffImagePlugin.ImageFileDirectory_v2 | None = None + self._loaded_exif: bytes | None = None + + def _fixup(self, value: Any) -> Any: + try: + if len(value) == 1 and isinstance(value, tuple): + return value[0] + except Exception: + pass + return value + + def _fixup_dict(self, src_dict: dict[int, Any]) -> dict[int, Any]: + # Helper function + # returns a dict with any single item tuples/lists as individual values + return {k: self._fixup(v) for k, v in src_dict.items()} + + def _get_ifd_dict( + self, offset: int, group: int | None = None + ) -> dict[int, Any] | None: + try: + # an offset pointer to the location of the nested embedded IFD. + # It should be a long, but may be corrupted. + self.fp.seek(offset) + except (KeyError, TypeError): + return None + else: + from . import TiffImagePlugin + + info = TiffImagePlugin.ImageFileDirectory_v2(self.head, group=group) + info.load(self.fp) + return self._fixup_dict(dict(info)) + + def _get_head(self) -> bytes: + version = b"\x2B" if self.bigtiff else b"\x2A" + if self.endian == "<": + head = b"II" + version + b"\x00" + o32le(8) + else: + head = b"MM\x00" + version + o32be(8) + if self.bigtiff: + head += o32le(8) if self.endian == "<" else o32be(8) + head += b"\x00\x00\x00\x00" + return head + + def load(self, data: bytes) -> None: + # Extract EXIF information. This is highly experimental, + # and is likely to be replaced with something better in a future + # version. + + # The EXIF record consists of a TIFF file embedded in a JPEG + # application marker (!). + if data == self._loaded_exif: + return + self._loaded_exif = data + self._data.clear() + self._hidden_data.clear() + self._ifds.clear() + while data and data.startswith(b"Exif\x00\x00"): + data = data[6:] + if not data: + self._info = None + return + + self.fp: IO[bytes] = io.BytesIO(data) + self.head = self.fp.read(8) + # process dictionary + from . import TiffImagePlugin + + self._info = TiffImagePlugin.ImageFileDirectory_v2(self.head) + self.endian = self._info._endian + self.fp.seek(self._info.next) + self._info.load(self.fp) + + def load_from_fp(self, fp: IO[bytes], offset: int | None = None) -> None: + self._loaded_exif = None + self._data.clear() + self._hidden_data.clear() + self._ifds.clear() + + # process dictionary + from . import TiffImagePlugin + + self.fp = fp + if offset is not None: + self.head = self._get_head() + else: + self.head = self.fp.read(8) + self._info = TiffImagePlugin.ImageFileDirectory_v2(self.head) + if self.endian is None: + self.endian = self._info._endian + if offset is None: + offset = self._info.next + self.fp.tell() + self.fp.seek(offset) + self._info.load(self.fp) + + def _get_merged_dict(self) -> dict[int, Any]: + merged_dict = dict(self) + + # get EXIF extension + if ExifTags.IFD.Exif in self: + ifd = self._get_ifd_dict(self[ExifTags.IFD.Exif], ExifTags.IFD.Exif) + if ifd: + merged_dict.update(ifd) + + # GPS + if ExifTags.IFD.GPSInfo in self: + merged_dict[ExifTags.IFD.GPSInfo] = self._get_ifd_dict( + self[ExifTags.IFD.GPSInfo], ExifTags.IFD.GPSInfo + ) + + return merged_dict + + def tobytes(self, offset: int = 8) -> bytes: + from . import TiffImagePlugin + + head = self._get_head() + ifd = TiffImagePlugin.ImageFileDirectory_v2(ifh=head) + for tag, value in self.items(): + if tag in [ + ExifTags.IFD.Exif, + ExifTags.IFD.GPSInfo, + ] and not isinstance(value, dict): + value = self.get_ifd(tag) + if ( + tag == ExifTags.IFD.Exif + and ExifTags.IFD.Interop in value + and not isinstance(value[ExifTags.IFD.Interop], dict) + ): + value = value.copy() + value[ExifTags.IFD.Interop] = self.get_ifd(ExifTags.IFD.Interop) + ifd[tag] = value + return b"Exif\x00\x00" + head + ifd.tobytes(offset) + + def get_ifd(self, tag: int) -> dict[int, Any]: + if tag not in self._ifds: + if tag == ExifTags.IFD.IFD1: + if self._info is not None and self._info.next != 0: + ifd = self._get_ifd_dict(self._info.next) + if ifd is not None: + self._ifds[tag] = ifd + elif tag in [ExifTags.IFD.Exif, ExifTags.IFD.GPSInfo]: + offset = self._hidden_data.get(tag, self.get(tag)) + if offset is not None: + ifd = self._get_ifd_dict(offset, tag) + if ifd is not None: + self._ifds[tag] = ifd + elif tag in [ExifTags.IFD.Interop, ExifTags.IFD.Makernote]: + if ExifTags.IFD.Exif not in self._ifds: + self.get_ifd(ExifTags.IFD.Exif) + tag_data = self._ifds[ExifTags.IFD.Exif][tag] + if tag == ExifTags.IFD.Makernote: + from .TiffImagePlugin import ImageFileDirectory_v2 + + if tag_data[:8] == b"FUJIFILM": + ifd_offset = i32le(tag_data, 8) + ifd_data = tag_data[ifd_offset:] + + makernote = {} + for i in range(0, struct.unpack(" 4: + (offset,) = struct.unpack("H", tag_data[:2])[0]): + ifd_tag, typ, count, data = struct.unpack( + ">HHL4s", tag_data[i * 12 + 2 : (i + 1) * 12 + 2] + ) + if ifd_tag == 0x1101: + # CameraInfo + (offset,) = struct.unpack(">L", data) + self.fp.seek(offset) + + camerainfo: dict[str, int | bytes] = { + "ModelID": self.fp.read(4) + } + + self.fp.read(4) + # Seconds since 2000 + camerainfo["TimeStamp"] = i32le(self.fp.read(12)) + + self.fp.read(4) + camerainfo["InternalSerialNumber"] = self.fp.read(4) + + self.fp.read(12) + parallax = self.fp.read(4) + handler = ImageFileDirectory_v2._load_dispatch[ + TiffTags.FLOAT + ][1] + camerainfo["Parallax"] = handler( + ImageFileDirectory_v2(), parallax, False + )[0] + + self.fp.read(4) + camerainfo["Category"] = self.fp.read(2) + + makernote = {0x1101: camerainfo} + self._ifds[tag] = makernote + else: + # Interop + ifd = self._get_ifd_dict(tag_data, tag) + if ifd is not None: + self._ifds[tag] = ifd + ifd = self._ifds.setdefault(tag, {}) + if tag == ExifTags.IFD.Exif and self._hidden_data: + ifd = { + k: v + for (k, v) in ifd.items() + if k not in (ExifTags.IFD.Interop, ExifTags.IFD.Makernote) + } + return ifd + + def hide_offsets(self) -> None: + for tag in (ExifTags.IFD.Exif, ExifTags.IFD.GPSInfo): + if tag in self: + self._hidden_data[tag] = self[tag] + del self[tag] + + def __str__(self) -> str: + if self._info is not None: + # Load all keys into self._data + for tag in self._info: + self[tag] + + return str(self._data) + + def __len__(self) -> int: + keys = set(self._data) + if self._info is not None: + keys.update(self._info) + return len(keys) + + def __getitem__(self, tag: int) -> Any: + if self._info is not None and tag not in self._data and tag in self._info: + self._data[tag] = self._fixup(self._info[tag]) + del self._info[tag] + return self._data[tag] + + def __contains__(self, tag: object) -> bool: + return tag in self._data or (self._info is not None and tag in self._info) + + def __setitem__(self, tag: int, value: Any) -> None: + if self._info is not None and tag in self._info: + del self._info[tag] + self._data[tag] = value + + def __delitem__(self, tag: int) -> None: + if self._info is not None and tag in self._info: + del self._info[tag] + else: + del self._data[tag] + + def __iter__(self) -> Iterator[int]: + keys = set(self._data) + if self._info is not None: + keys.update(self._info) + return iter(keys) diff --git a/venv/lib/python3.12/site-packages/PIL/ImageChops.py b/venv/lib/python3.12/site-packages/PIL/ImageChops.py new file mode 100644 index 0000000..29a5c99 --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/ImageChops.py @@ -0,0 +1,311 @@ +# +# The Python Imaging Library. +# $Id$ +# +# standard channel operations +# +# History: +# 1996-03-24 fl Created +# 1996-08-13 fl Added logical operations (for "1" images) +# 2000-10-12 fl Added offset method (from Image.py) +# +# Copyright (c) 1997-2000 by Secret Labs AB +# Copyright (c) 1996-2000 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +from __future__ import annotations + +from . import Image + + +def constant(image: Image.Image, value: int) -> Image.Image: + """Fill a channel with a given gray level. + + :rtype: :py:class:`~PIL.Image.Image` + """ + + return Image.new("L", image.size, value) + + +def duplicate(image: Image.Image) -> Image.Image: + """Copy a channel. Alias for :py:meth:`PIL.Image.Image.copy`. + + :rtype: :py:class:`~PIL.Image.Image` + """ + + return image.copy() + + +def invert(image: Image.Image) -> Image.Image: + """ + Invert an image (channel). :: + + out = MAX - image + + :rtype: :py:class:`~PIL.Image.Image` + """ + + image.load() + return image._new(image.im.chop_invert()) + + +def lighter(image1: Image.Image, image2: Image.Image) -> Image.Image: + """ + Compares the two images, pixel by pixel, and returns a new image containing + the lighter values. :: + + out = max(image1, image2) + + :rtype: :py:class:`~PIL.Image.Image` + """ + + image1.load() + image2.load() + return image1._new(image1.im.chop_lighter(image2.im)) + + +def darker(image1: Image.Image, image2: Image.Image) -> Image.Image: + """ + Compares the two images, pixel by pixel, and returns a new image containing + the darker values. :: + + out = min(image1, image2) + + :rtype: :py:class:`~PIL.Image.Image` + """ + + image1.load() + image2.load() + return image1._new(image1.im.chop_darker(image2.im)) + + +def difference(image1: Image.Image, image2: Image.Image) -> Image.Image: + """ + Returns the absolute value of the pixel-by-pixel difference between the two + images. :: + + out = abs(image1 - image2) + + :rtype: :py:class:`~PIL.Image.Image` + """ + + image1.load() + image2.load() + return image1._new(image1.im.chop_difference(image2.im)) + + +def multiply(image1: Image.Image, image2: Image.Image) -> Image.Image: + """ + Superimposes two images on top of each other. + + If you multiply an image with a solid black image, the result is black. If + you multiply with a solid white image, the image is unaffected. :: + + out = image1 * image2 / MAX + + :rtype: :py:class:`~PIL.Image.Image` + """ + + image1.load() + image2.load() + return image1._new(image1.im.chop_multiply(image2.im)) + + +def screen(image1: Image.Image, image2: Image.Image) -> Image.Image: + """ + Superimposes two inverted images on top of each other. :: + + out = MAX - ((MAX - image1) * (MAX - image2) / MAX) + + :rtype: :py:class:`~PIL.Image.Image` + """ + + image1.load() + image2.load() + return image1._new(image1.im.chop_screen(image2.im)) + + +def soft_light(image1: Image.Image, image2: Image.Image) -> Image.Image: + """ + Superimposes two images on top of each other using the Soft Light algorithm + + :rtype: :py:class:`~PIL.Image.Image` + """ + + image1.load() + image2.load() + return image1._new(image1.im.chop_soft_light(image2.im)) + + +def hard_light(image1: Image.Image, image2: Image.Image) -> Image.Image: + """ + Superimposes two images on top of each other using the Hard Light algorithm + + :rtype: :py:class:`~PIL.Image.Image` + """ + + image1.load() + image2.load() + return image1._new(image1.im.chop_hard_light(image2.im)) + + +def overlay(image1: Image.Image, image2: Image.Image) -> Image.Image: + """ + Superimposes two images on top of each other using the Overlay algorithm + + :rtype: :py:class:`~PIL.Image.Image` + """ + + image1.load() + image2.load() + return image1._new(image1.im.chop_overlay(image2.im)) + + +def add( + image1: Image.Image, image2: Image.Image, scale: float = 1.0, offset: float = 0 +) -> Image.Image: + """ + Adds two images, dividing the result by scale and adding the + offset. If omitted, scale defaults to 1.0, and offset to 0.0. :: + + out = ((image1 + image2) / scale + offset) + + :rtype: :py:class:`~PIL.Image.Image` + """ + + image1.load() + image2.load() + return image1._new(image1.im.chop_add(image2.im, scale, offset)) + + +def subtract( + image1: Image.Image, image2: Image.Image, scale: float = 1.0, offset: float = 0 +) -> Image.Image: + """ + Subtracts two images, dividing the result by scale and adding the offset. + If omitted, scale defaults to 1.0, and offset to 0.0. :: + + out = ((image1 - image2) / scale + offset) + + :rtype: :py:class:`~PIL.Image.Image` + """ + + image1.load() + image2.load() + return image1._new(image1.im.chop_subtract(image2.im, scale, offset)) + + +def add_modulo(image1: Image.Image, image2: Image.Image) -> Image.Image: + """Add two images, without clipping the result. :: + + out = ((image1 + image2) % MAX) + + :rtype: :py:class:`~PIL.Image.Image` + """ + + image1.load() + image2.load() + return image1._new(image1.im.chop_add_modulo(image2.im)) + + +def subtract_modulo(image1: Image.Image, image2: Image.Image) -> Image.Image: + """Subtract two images, without clipping the result. :: + + out = ((image1 - image2) % MAX) + + :rtype: :py:class:`~PIL.Image.Image` + """ + + image1.load() + image2.load() + return image1._new(image1.im.chop_subtract_modulo(image2.im)) + + +def logical_and(image1: Image.Image, image2: Image.Image) -> Image.Image: + """Logical AND between two images. + + Both of the images must have mode "1". If you would like to perform a + logical AND on an image with a mode other than "1", try + :py:meth:`~PIL.ImageChops.multiply` instead, using a black-and-white mask + as the second image. :: + + out = ((image1 and image2) % MAX) + + :rtype: :py:class:`~PIL.Image.Image` + """ + + image1.load() + image2.load() + return image1._new(image1.im.chop_and(image2.im)) + + +def logical_or(image1: Image.Image, image2: Image.Image) -> Image.Image: + """Logical OR between two images. + + Both of the images must have mode "1". :: + + out = ((image1 or image2) % MAX) + + :rtype: :py:class:`~PIL.Image.Image` + """ + + image1.load() + image2.load() + return image1._new(image1.im.chop_or(image2.im)) + + +def logical_xor(image1: Image.Image, image2: Image.Image) -> Image.Image: + """Logical XOR between two images. + + Both of the images must have mode "1". :: + + out = ((bool(image1) != bool(image2)) % MAX) + + :rtype: :py:class:`~PIL.Image.Image` + """ + + image1.load() + image2.load() + return image1._new(image1.im.chop_xor(image2.im)) + + +def blend(image1: Image.Image, image2: Image.Image, alpha: float) -> Image.Image: + """Blend images using constant transparency weight. Alias for + :py:func:`PIL.Image.blend`. + + :rtype: :py:class:`~PIL.Image.Image` + """ + + return Image.blend(image1, image2, alpha) + + +def composite( + image1: Image.Image, image2: Image.Image, mask: Image.Image +) -> Image.Image: + """Create composite using transparency mask. Alias for + :py:func:`PIL.Image.composite`. + + :rtype: :py:class:`~PIL.Image.Image` + """ + + return Image.composite(image1, image2, mask) + + +def offset(image: Image.Image, xoffset: int, yoffset: int | None = None) -> Image.Image: + """Returns a copy of the image where data has been offset by the given + distances. Data wraps around the edges. If ``yoffset`` is omitted, it + is assumed to be equal to ``xoffset``. + + :param image: Input image. + :param xoffset: The horizontal distance. + :param yoffset: The vertical distance. If omitted, both + distances are set to the same value. + :rtype: :py:class:`~PIL.Image.Image` + """ + + if yoffset is None: + yoffset = xoffset + image.load() + return image._new(image.im.offset(xoffset, yoffset)) diff --git a/venv/lib/python3.12/site-packages/PIL/ImageCms.py b/venv/lib/python3.12/site-packages/PIL/ImageCms.py new file mode 100644 index 0000000..fdfbee7 --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/ImageCms.py @@ -0,0 +1,1125 @@ +# The Python Imaging Library. +# $Id$ + +# Optional color management support, based on Kevin Cazabon's PyCMS +# library. + +# Originally released under LGPL. Graciously donated to PIL in +# March 2009, for distribution under the standard PIL license + +# History: + +# 2009-03-08 fl Added to PIL. + +# Copyright (C) 2002-2003 Kevin Cazabon +# Copyright (c) 2009 by Fredrik Lundh +# Copyright (c) 2013 by Eric Soroos + +# See the README file for information on usage and redistribution. See +# below for the original description. +from __future__ import annotations + +import operator +import sys +from enum import IntEnum, IntFlag +from functools import reduce +from typing import Any, Literal, SupportsFloat, SupportsInt, Union + +from . import Image, __version__ +from ._deprecate import deprecate +from ._typing import SupportsRead + +try: + from . import _imagingcms as core + + _CmsProfileCompatible = Union[ + str, SupportsRead[bytes], core.CmsProfile, "ImageCmsProfile" + ] +except ImportError as ex: + # Allow error import for doc purposes, but error out when accessing + # anything in core. + from ._util import DeferredError + + core = DeferredError.new(ex) + +_DESCRIPTION = """ +pyCMS + + a Python / PIL interface to the littleCMS ICC Color Management System + Copyright (C) 2002-2003 Kevin Cazabon + kevin@cazabon.com + https://www.cazabon.com + + pyCMS home page: https://www.cazabon.com/pyCMS + littleCMS home page: https://www.littlecms.com + (littleCMS is Copyright (C) 1998-2001 Marti Maria) + + Originally released under LGPL. Graciously donated to PIL in + March 2009, for distribution under the standard PIL license + + The pyCMS.py module provides a "clean" interface between Python/PIL and + pyCMSdll, taking care of some of the more complex handling of the direct + pyCMSdll functions, as well as error-checking and making sure that all + relevant data is kept together. + + While it is possible to call pyCMSdll functions directly, it's not highly + recommended. + + Version History: + + 1.0.0 pil Oct 2013 Port to LCMS 2. + + 0.1.0 pil mod March 10, 2009 + + Renamed display profile to proof profile. The proof + profile is the profile of the device that is being + simulated, not the profile of the device which is + actually used to display/print the final simulation + (that'd be the output profile) - also see LCMSAPI.txt + input colorspace -> using 'renderingIntent' -> proof + colorspace -> using 'proofRenderingIntent' -> output + colorspace + + Added LCMS FLAGS support. + Added FLAGS["SOFTPROOFING"] as default flag for + buildProofTransform (otherwise the proof profile/intent + would be ignored). + + 0.1.0 pil March 2009 - added to PIL, as PIL.ImageCms + + 0.0.2 alpha Jan 6, 2002 + + Added try/except statements around type() checks of + potential CObjects... Python won't let you use type() + on them, and raises a TypeError (stupid, if you ask + me!) + + Added buildProofTransformFromOpenProfiles() function. + Additional fixes in DLL, see DLL code for details. + + 0.0.1 alpha first public release, Dec. 26, 2002 + + Known to-do list with current version (of Python interface, not pyCMSdll): + + none + +""" + +_VERSION = "1.0.0 pil" + + +def __getattr__(name: str) -> Any: + if name == "DESCRIPTION": + deprecate("PIL.ImageCms.DESCRIPTION", 12) + return _DESCRIPTION + elif name == "VERSION": + deprecate("PIL.ImageCms.VERSION", 12) + return _VERSION + elif name == "FLAGS": + deprecate("PIL.ImageCms.FLAGS", 12, "PIL.ImageCms.Flags") + return _FLAGS + msg = f"module '{__name__}' has no attribute '{name}'" + raise AttributeError(msg) + + +# --------------------------------------------------------------------. + + +# +# intent/direction values + + +class Intent(IntEnum): + PERCEPTUAL = 0 + RELATIVE_COLORIMETRIC = 1 + SATURATION = 2 + ABSOLUTE_COLORIMETRIC = 3 + + +class Direction(IntEnum): + INPUT = 0 + OUTPUT = 1 + PROOF = 2 + + +# +# flags + + +class Flags(IntFlag): + """Flags and documentation are taken from ``lcms2.h``.""" + + NONE = 0 + NOCACHE = 0x0040 + """Inhibit 1-pixel cache""" + NOOPTIMIZE = 0x0100 + """Inhibit optimizations""" + NULLTRANSFORM = 0x0200 + """Don't transform anyway""" + GAMUTCHECK = 0x1000 + """Out of Gamut alarm""" + SOFTPROOFING = 0x4000 + """Do softproofing""" + BLACKPOINTCOMPENSATION = 0x2000 + NOWHITEONWHITEFIXUP = 0x0004 + """Don't fix scum dot""" + HIGHRESPRECALC = 0x0400 + """Use more memory to give better accuracy""" + LOWRESPRECALC = 0x0800 + """Use less memory to minimize resources""" + # this should be 8BITS_DEVICELINK, but that is not a valid name in Python: + USE_8BITS_DEVICELINK = 0x0008 + """Create 8 bits devicelinks""" + GUESSDEVICECLASS = 0x0020 + """Guess device class (for ``transform2devicelink``)""" + KEEP_SEQUENCE = 0x0080 + """Keep profile sequence for devicelink creation""" + FORCE_CLUT = 0x0002 + """Force CLUT optimization""" + CLUT_POST_LINEARIZATION = 0x0001 + """create postlinearization tables if possible""" + CLUT_PRE_LINEARIZATION = 0x0010 + """create prelinearization tables if possible""" + NONEGATIVES = 0x8000 + """Prevent negative numbers in floating point transforms""" + COPY_ALPHA = 0x04000000 + """Alpha channels are copied on ``cmsDoTransform()``""" + NODEFAULTRESOURCEDEF = 0x01000000 + + _GRIDPOINTS_1 = 1 << 16 + _GRIDPOINTS_2 = 2 << 16 + _GRIDPOINTS_4 = 4 << 16 + _GRIDPOINTS_8 = 8 << 16 + _GRIDPOINTS_16 = 16 << 16 + _GRIDPOINTS_32 = 32 << 16 + _GRIDPOINTS_64 = 64 << 16 + _GRIDPOINTS_128 = 128 << 16 + + @staticmethod + def GRIDPOINTS(n: int) -> Flags: + """ + Fine-tune control over number of gridpoints + + :param n: :py:class:`int` in range ``0 <= n <= 255`` + """ + return Flags.NONE | ((n & 0xFF) << 16) + + +_MAX_FLAG = reduce(operator.or_, Flags) + + +_FLAGS = { + "MATRIXINPUT": 1, + "MATRIXOUTPUT": 2, + "MATRIXONLY": (1 | 2), + "NOWHITEONWHITEFIXUP": 4, # Don't hot fix scum dot + # Don't create prelinearization tables on precalculated transforms + # (internal use): + "NOPRELINEARIZATION": 16, + "GUESSDEVICECLASS": 32, # Guess device class (for transform2devicelink) + "NOTCACHE": 64, # Inhibit 1-pixel cache + "NOTPRECALC": 256, + "NULLTRANSFORM": 512, # Don't transform anyway + "HIGHRESPRECALC": 1024, # Use more memory to give better accuracy + "LOWRESPRECALC": 2048, # Use less memory to minimize resources + "WHITEBLACKCOMPENSATION": 8192, + "BLACKPOINTCOMPENSATION": 8192, + "GAMUTCHECK": 4096, # Out of Gamut alarm + "SOFTPROOFING": 16384, # Do softproofing + "PRESERVEBLACK": 32768, # Black preservation + "NODEFAULTRESOURCEDEF": 16777216, # CRD special + "GRIDPOINTS": lambda n: (n & 0xFF) << 16, # Gridpoints +} + + +# --------------------------------------------------------------------. +# Experimental PIL-level API +# --------------------------------------------------------------------. + +## +# Profile. + + +class ImageCmsProfile: + def __init__(self, profile: str | SupportsRead[bytes] | core.CmsProfile) -> None: + """ + :param profile: Either a string representing a filename, + a file like object containing a profile or a + low-level profile object + + """ + + if isinstance(profile, str): + if sys.platform == "win32": + profile_bytes_path = profile.encode() + try: + profile_bytes_path.decode("ascii") + except UnicodeDecodeError: + with open(profile, "rb") as f: + self._set(core.profile_frombytes(f.read())) + return + self._set(core.profile_open(profile), profile) + elif hasattr(profile, "read"): + self._set(core.profile_frombytes(profile.read())) + elif isinstance(profile, core.CmsProfile): + self._set(profile) + else: + msg = "Invalid type for Profile" # type: ignore[unreachable] + raise TypeError(msg) + + def _set(self, profile: core.CmsProfile, filename: str | None = None) -> None: + self.profile = profile + self.filename = filename + self.product_name = None # profile.product_name + self.product_info = None # profile.product_info + + def tobytes(self) -> bytes: + """ + Returns the profile in a format suitable for embedding in + saved images. + + :returns: a bytes object containing the ICC profile. + """ + + return core.profile_tobytes(self.profile) + + +class ImageCmsTransform(Image.ImagePointHandler): + """ + Transform. This can be used with the procedural API, or with the standard + :py:func:`~PIL.Image.Image.point` method. + + Will return the output profile in the ``output.info['icc_profile']``. + """ + + def __init__( + self, + input: ImageCmsProfile, + output: ImageCmsProfile, + input_mode: str, + output_mode: str, + intent: Intent = Intent.PERCEPTUAL, + proof: ImageCmsProfile | None = None, + proof_intent: Intent = Intent.ABSOLUTE_COLORIMETRIC, + flags: Flags = Flags.NONE, + ): + supported_modes = ( + "RGB", + "RGBA", + "RGBX", + "CMYK", + "I;16", + "I;16L", + "I;16B", + "YCbCr", + "LAB", + "L", + "1", + ) + for mode in (input_mode, output_mode): + if mode not in supported_modes: + deprecate( + mode, + 12, + { + "L;16": "I;16 or I;16L", + "L:16B": "I;16B", + "YCCA": "YCbCr", + "YCC": "YCbCr", + }.get(mode), + ) + if proof is None: + self.transform = core.buildTransform( + input.profile, output.profile, input_mode, output_mode, intent, flags + ) + else: + self.transform = core.buildProofTransform( + input.profile, + output.profile, + proof.profile, + input_mode, + output_mode, + intent, + proof_intent, + flags, + ) + # Note: inputMode and outputMode are for pyCMS compatibility only + self.input_mode = self.inputMode = input_mode + self.output_mode = self.outputMode = output_mode + + self.output_profile = output + + def point(self, im: Image.Image) -> Image.Image: + return self.apply(im) + + def apply(self, im: Image.Image, imOut: Image.Image | None = None) -> Image.Image: + if imOut is None: + imOut = Image.new(self.output_mode, im.size, None) + self.transform.apply(im.getim(), imOut.getim()) + imOut.info["icc_profile"] = self.output_profile.tobytes() + return imOut + + def apply_in_place(self, im: Image.Image) -> Image.Image: + if im.mode != self.output_mode: + msg = "mode mismatch" + raise ValueError(msg) # wrong output mode + self.transform.apply(im.getim(), im.getim()) + im.info["icc_profile"] = self.output_profile.tobytes() + return im + + +def get_display_profile(handle: SupportsInt | None = None) -> ImageCmsProfile | None: + """ + (experimental) Fetches the profile for the current display device. + + :returns: ``None`` if the profile is not known. + """ + + if sys.platform != "win32": + return None + + from . import ImageWin # type: ignore[unused-ignore, unreachable] + + if isinstance(handle, ImageWin.HDC): + profile = core.get_display_profile_win32(int(handle), 1) + else: + profile = core.get_display_profile_win32(int(handle or 0)) + if profile is None: + return None + return ImageCmsProfile(profile) + + +# --------------------------------------------------------------------. +# pyCMS compatible layer +# --------------------------------------------------------------------. + + +class PyCMSError(Exception): + """(pyCMS) Exception class. + This is used for all errors in the pyCMS API.""" + + pass + + +def profileToProfile( + im: Image.Image, + inputProfile: _CmsProfileCompatible, + outputProfile: _CmsProfileCompatible, + renderingIntent: Intent = Intent.PERCEPTUAL, + outputMode: str | None = None, + inPlace: bool = False, + flags: Flags = Flags.NONE, +) -> Image.Image | None: + """ + (pyCMS) Applies an ICC transformation to a given image, mapping from + ``inputProfile`` to ``outputProfile``. + + If the input or output profiles specified are not valid filenames, a + :exc:`PyCMSError` will be raised. If ``inPlace`` is ``True`` and + ``outputMode != im.mode``, a :exc:`PyCMSError` will be raised. + If an error occurs during application of the profiles, + a :exc:`PyCMSError` will be raised. + If ``outputMode`` is not a mode supported by the ``outputProfile`` (or by pyCMS), + a :exc:`PyCMSError` will be raised. + + This function applies an ICC transformation to im from ``inputProfile``'s + color space to ``outputProfile``'s color space using the specified rendering + intent to decide how to handle out-of-gamut colors. + + ``outputMode`` can be used to specify that a color mode conversion is to + be done using these profiles, but the specified profiles must be able + to handle that mode. I.e., if converting im from RGB to CMYK using + profiles, the input profile must handle RGB data, and the output + profile must handle CMYK data. + + :param im: An open :py:class:`~PIL.Image.Image` object (i.e. Image.new(...) + or Image.open(...), etc.) + :param inputProfile: String, as a valid filename path to the ICC input + profile you wish to use for this image, or a profile object + :param outputProfile: String, as a valid filename path to the ICC output + profile you wish to use for this image, or a profile object + :param renderingIntent: Integer (0-3) specifying the rendering intent you + wish to use for the transform + + ImageCms.Intent.PERCEPTUAL = 0 (DEFAULT) + ImageCms.Intent.RELATIVE_COLORIMETRIC = 1 + ImageCms.Intent.SATURATION = 2 + ImageCms.Intent.ABSOLUTE_COLORIMETRIC = 3 + + see the pyCMS documentation for details on rendering intents and what + they do. + :param outputMode: A valid PIL mode for the output image (i.e. "RGB", + "CMYK", etc.). Note: if rendering the image "inPlace", outputMode + MUST be the same mode as the input, or omitted completely. If + omitted, the outputMode will be the same as the mode of the input + image (im.mode) + :param inPlace: Boolean. If ``True``, the original image is modified in-place, + and ``None`` is returned. If ``False`` (default), a new + :py:class:`~PIL.Image.Image` object is returned with the transform applied. + :param flags: Integer (0-...) specifying additional flags + :returns: Either None or a new :py:class:`~PIL.Image.Image` object, depending on + the value of ``inPlace`` + :exception PyCMSError: + """ + + if outputMode is None: + outputMode = im.mode + + if not isinstance(renderingIntent, int) or not (0 <= renderingIntent <= 3): + msg = "renderingIntent must be an integer between 0 and 3" + raise PyCMSError(msg) + + if not isinstance(flags, int) or not (0 <= flags <= _MAX_FLAG): + msg = f"flags must be an integer between 0 and {_MAX_FLAG}" + raise PyCMSError(msg) + + try: + if not isinstance(inputProfile, ImageCmsProfile): + inputProfile = ImageCmsProfile(inputProfile) + if not isinstance(outputProfile, ImageCmsProfile): + outputProfile = ImageCmsProfile(outputProfile) + transform = ImageCmsTransform( + inputProfile, + outputProfile, + im.mode, + outputMode, + renderingIntent, + flags=flags, + ) + if inPlace: + transform.apply_in_place(im) + imOut = None + else: + imOut = transform.apply(im) + except (OSError, TypeError, ValueError) as v: + raise PyCMSError(v) from v + + return imOut + + +def getOpenProfile( + profileFilename: str | SupportsRead[bytes] | core.CmsProfile, +) -> ImageCmsProfile: + """ + (pyCMS) Opens an ICC profile file. + + The PyCMSProfile object can be passed back into pyCMS for use in creating + transforms and such (as in ImageCms.buildTransformFromOpenProfiles()). + + If ``profileFilename`` is not a valid filename for an ICC profile, + a :exc:`PyCMSError` will be raised. + + :param profileFilename: String, as a valid filename path to the ICC profile + you wish to open, or a file-like object. + :returns: A CmsProfile class object. + :exception PyCMSError: + """ + + try: + return ImageCmsProfile(profileFilename) + except (OSError, TypeError, ValueError) as v: + raise PyCMSError(v) from v + + +def buildTransform( + inputProfile: _CmsProfileCompatible, + outputProfile: _CmsProfileCompatible, + inMode: str, + outMode: str, + renderingIntent: Intent = Intent.PERCEPTUAL, + flags: Flags = Flags.NONE, +) -> ImageCmsTransform: + """ + (pyCMS) Builds an ICC transform mapping from the ``inputProfile`` to the + ``outputProfile``. Use applyTransform to apply the transform to a given + image. + + If the input or output profiles specified are not valid filenames, a + :exc:`PyCMSError` will be raised. If an error occurs during creation + of the transform, a :exc:`PyCMSError` will be raised. + + If ``inMode`` or ``outMode`` are not a mode supported by the ``outputProfile`` + (or by pyCMS), a :exc:`PyCMSError` will be raised. + + This function builds and returns an ICC transform from the ``inputProfile`` + to the ``outputProfile`` using the ``renderingIntent`` to determine what to do + with out-of-gamut colors. It will ONLY work for converting images that + are in ``inMode`` to images that are in ``outMode`` color format (PIL mode, + i.e. "RGB", "RGBA", "CMYK", etc.). + + Building the transform is a fair part of the overhead in + ImageCms.profileToProfile(), so if you're planning on converting multiple + images using the same input/output settings, this can save you time. + Once you have a transform object, it can be used with + ImageCms.applyProfile() to convert images without the need to re-compute + the lookup table for the transform. + + The reason pyCMS returns a class object rather than a handle directly + to the transform is that it needs to keep track of the PIL input/output + modes that the transform is meant for. These attributes are stored in + the ``inMode`` and ``outMode`` attributes of the object (which can be + manually overridden if you really want to, but I don't know of any + time that would be of use, or would even work). + + :param inputProfile: String, as a valid filename path to the ICC input + profile you wish to use for this transform, or a profile object + :param outputProfile: String, as a valid filename path to the ICC output + profile you wish to use for this transform, or a profile object + :param inMode: String, as a valid PIL mode that the appropriate profile + also supports (i.e. "RGB", "RGBA", "CMYK", etc.) + :param outMode: String, as a valid PIL mode that the appropriate profile + also supports (i.e. "RGB", "RGBA", "CMYK", etc.) + :param renderingIntent: Integer (0-3) specifying the rendering intent you + wish to use for the transform + + ImageCms.Intent.PERCEPTUAL = 0 (DEFAULT) + ImageCms.Intent.RELATIVE_COLORIMETRIC = 1 + ImageCms.Intent.SATURATION = 2 + ImageCms.Intent.ABSOLUTE_COLORIMETRIC = 3 + + see the pyCMS documentation for details on rendering intents and what + they do. + :param flags: Integer (0-...) specifying additional flags + :returns: A CmsTransform class object. + :exception PyCMSError: + """ + + if not isinstance(renderingIntent, int) or not (0 <= renderingIntent <= 3): + msg = "renderingIntent must be an integer between 0 and 3" + raise PyCMSError(msg) + + if not isinstance(flags, int) or not (0 <= flags <= _MAX_FLAG): + msg = f"flags must be an integer between 0 and {_MAX_FLAG}" + raise PyCMSError(msg) + + try: + if not isinstance(inputProfile, ImageCmsProfile): + inputProfile = ImageCmsProfile(inputProfile) + if not isinstance(outputProfile, ImageCmsProfile): + outputProfile = ImageCmsProfile(outputProfile) + return ImageCmsTransform( + inputProfile, outputProfile, inMode, outMode, renderingIntent, flags=flags + ) + except (OSError, TypeError, ValueError) as v: + raise PyCMSError(v) from v + + +def buildProofTransform( + inputProfile: _CmsProfileCompatible, + outputProfile: _CmsProfileCompatible, + proofProfile: _CmsProfileCompatible, + inMode: str, + outMode: str, + renderingIntent: Intent = Intent.PERCEPTUAL, + proofRenderingIntent: Intent = Intent.ABSOLUTE_COLORIMETRIC, + flags: Flags = Flags.SOFTPROOFING, +) -> ImageCmsTransform: + """ + (pyCMS) Builds an ICC transform mapping from the ``inputProfile`` to the + ``outputProfile``, but tries to simulate the result that would be + obtained on the ``proofProfile`` device. + + If the input, output, or proof profiles specified are not valid + filenames, a :exc:`PyCMSError` will be raised. + + If an error occurs during creation of the transform, + a :exc:`PyCMSError` will be raised. + + If ``inMode`` or ``outMode`` are not a mode supported by the ``outputProfile`` + (or by pyCMS), a :exc:`PyCMSError` will be raised. + + This function builds and returns an ICC transform from the ``inputProfile`` + to the ``outputProfile``, but tries to simulate the result that would be + obtained on the ``proofProfile`` device using ``renderingIntent`` and + ``proofRenderingIntent`` to determine what to do with out-of-gamut + colors. This is known as "soft-proofing". It will ONLY work for + converting images that are in ``inMode`` to images that are in outMode + color format (PIL mode, i.e. "RGB", "RGBA", "CMYK", etc.). + + Usage of the resulting transform object is exactly the same as with + ImageCms.buildTransform(). + + Proof profiling is generally used when using an output device to get a + good idea of what the final printed/displayed image would look like on + the ``proofProfile`` device when it's quicker and easier to use the + output device for judging color. Generally, this means that the + output device is a monitor, or a dye-sub printer (etc.), and the simulated + device is something more expensive, complicated, or time consuming + (making it difficult to make a real print for color judgement purposes). + + Soft-proofing basically functions by adjusting the colors on the + output device to match the colors of the device being simulated. However, + when the simulated device has a much wider gamut than the output + device, you may obtain marginal results. + + :param inputProfile: String, as a valid filename path to the ICC input + profile you wish to use for this transform, or a profile object + :param outputProfile: String, as a valid filename path to the ICC output + (monitor, usually) profile you wish to use for this transform, or a + profile object + :param proofProfile: String, as a valid filename path to the ICC proof + profile you wish to use for this transform, or a profile object + :param inMode: String, as a valid PIL mode that the appropriate profile + also supports (i.e. "RGB", "RGBA", "CMYK", etc.) + :param outMode: String, as a valid PIL mode that the appropriate profile + also supports (i.e. "RGB", "RGBA", "CMYK", etc.) + :param renderingIntent: Integer (0-3) specifying the rendering intent you + wish to use for the input->proof (simulated) transform + + ImageCms.Intent.PERCEPTUAL = 0 (DEFAULT) + ImageCms.Intent.RELATIVE_COLORIMETRIC = 1 + ImageCms.Intent.SATURATION = 2 + ImageCms.Intent.ABSOLUTE_COLORIMETRIC = 3 + + see the pyCMS documentation for details on rendering intents and what + they do. + :param proofRenderingIntent: Integer (0-3) specifying the rendering intent + you wish to use for proof->output transform + + ImageCms.Intent.PERCEPTUAL = 0 (DEFAULT) + ImageCms.Intent.RELATIVE_COLORIMETRIC = 1 + ImageCms.Intent.SATURATION = 2 + ImageCms.Intent.ABSOLUTE_COLORIMETRIC = 3 + + see the pyCMS documentation for details on rendering intents and what + they do. + :param flags: Integer (0-...) specifying additional flags + :returns: A CmsTransform class object. + :exception PyCMSError: + """ + + if not isinstance(renderingIntent, int) or not (0 <= renderingIntent <= 3): + msg = "renderingIntent must be an integer between 0 and 3" + raise PyCMSError(msg) + + if not isinstance(flags, int) or not (0 <= flags <= _MAX_FLAG): + msg = f"flags must be an integer between 0 and {_MAX_FLAG}" + raise PyCMSError(msg) + + try: + if not isinstance(inputProfile, ImageCmsProfile): + inputProfile = ImageCmsProfile(inputProfile) + if not isinstance(outputProfile, ImageCmsProfile): + outputProfile = ImageCmsProfile(outputProfile) + if not isinstance(proofProfile, ImageCmsProfile): + proofProfile = ImageCmsProfile(proofProfile) + return ImageCmsTransform( + inputProfile, + outputProfile, + inMode, + outMode, + renderingIntent, + proofProfile, + proofRenderingIntent, + flags, + ) + except (OSError, TypeError, ValueError) as v: + raise PyCMSError(v) from v + + +buildTransformFromOpenProfiles = buildTransform +buildProofTransformFromOpenProfiles = buildProofTransform + + +def applyTransform( + im: Image.Image, transform: ImageCmsTransform, inPlace: bool = False +) -> Image.Image | None: + """ + (pyCMS) Applies a transform to a given image. + + If ``im.mode != transform.input_mode``, a :exc:`PyCMSError` is raised. + + If ``inPlace`` is ``True`` and ``transform.input_mode != transform.output_mode``, a + :exc:`PyCMSError` is raised. + + If ``im.mode``, ``transform.input_mode`` or ``transform.output_mode`` is not + supported by pyCMSdll or the profiles you used for the transform, a + :exc:`PyCMSError` is raised. + + If an error occurs while the transform is being applied, + a :exc:`PyCMSError` is raised. + + This function applies a pre-calculated transform (from + ImageCms.buildTransform() or ImageCms.buildTransformFromOpenProfiles()) + to an image. The transform can be used for multiple images, saving + considerable calculation time if doing the same conversion multiple times. + + If you want to modify im in-place instead of receiving a new image as + the return value, set ``inPlace`` to ``True``. This can only be done if + ``transform.input_mode`` and ``transform.output_mode`` are the same, because we + can't change the mode in-place (the buffer sizes for some modes are + different). The default behavior is to return a new :py:class:`~PIL.Image.Image` + object of the same dimensions in mode ``transform.output_mode``. + + :param im: An :py:class:`~PIL.Image.Image` object, and ``im.mode`` must be the same + as the ``input_mode`` supported by the transform. + :param transform: A valid CmsTransform class object + :param inPlace: Bool. If ``True``, ``im`` is modified in place and ``None`` is + returned, if ``False``, a new :py:class:`~PIL.Image.Image` object with the + transform applied is returned (and ``im`` is not changed). The default is + ``False``. + :returns: Either ``None``, or a new :py:class:`~PIL.Image.Image` object, + depending on the value of ``inPlace``. The profile will be returned in + the image's ``info['icc_profile']``. + :exception PyCMSError: + """ + + try: + if inPlace: + transform.apply_in_place(im) + imOut = None + else: + imOut = transform.apply(im) + except (TypeError, ValueError) as v: + raise PyCMSError(v) from v + + return imOut + + +def createProfile( + colorSpace: Literal["LAB", "XYZ", "sRGB"], colorTemp: SupportsFloat = 0 +) -> core.CmsProfile: + """ + (pyCMS) Creates a profile. + + If colorSpace not in ``["LAB", "XYZ", "sRGB"]``, + a :exc:`PyCMSError` is raised. + + If using LAB and ``colorTemp`` is not a positive integer, + a :exc:`PyCMSError` is raised. + + If an error occurs while creating the profile, + a :exc:`PyCMSError` is raised. + + Use this function to create common profiles on-the-fly instead of + having to supply a profile on disk and knowing the path to it. It + returns a normal CmsProfile object that can be passed to + ImageCms.buildTransformFromOpenProfiles() to create a transform to apply + to images. + + :param colorSpace: String, the color space of the profile you wish to + create. + Currently only "LAB", "XYZ", and "sRGB" are supported. + :param colorTemp: Positive number for the white point for the profile, in + degrees Kelvin (i.e. 5000, 6500, 9600, etc.). The default is for D50 + illuminant if omitted (5000k). colorTemp is ONLY applied to LAB + profiles, and is ignored for XYZ and sRGB. + :returns: A CmsProfile class object + :exception PyCMSError: + """ + + if colorSpace not in ["LAB", "XYZ", "sRGB"]: + msg = ( + f"Color space not supported for on-the-fly profile creation ({colorSpace})" + ) + raise PyCMSError(msg) + + if colorSpace == "LAB": + try: + colorTemp = float(colorTemp) + except (TypeError, ValueError) as e: + msg = f'Color temperature must be numeric, "{colorTemp}" not valid' + raise PyCMSError(msg) from e + + try: + return core.createProfile(colorSpace, colorTemp) + except (TypeError, ValueError) as v: + raise PyCMSError(v) from v + + +def getProfileName(profile: _CmsProfileCompatible) -> str: + """ + + (pyCMS) Gets the internal product name for the given profile. + + If ``profile`` isn't a valid CmsProfile object or filename to a profile, + a :exc:`PyCMSError` is raised If an error occurs while trying + to obtain the name tag, a :exc:`PyCMSError` is raised. + + Use this function to obtain the INTERNAL name of the profile (stored + in an ICC tag in the profile itself), usually the one used when the + profile was originally created. Sometimes this tag also contains + additional information supplied by the creator. + + :param profile: EITHER a valid CmsProfile object, OR a string of the + filename of an ICC profile. + :returns: A string containing the internal name of the profile as stored + in an ICC tag. + :exception PyCMSError: + """ + + try: + # add an extra newline to preserve pyCMS compatibility + if not isinstance(profile, ImageCmsProfile): + profile = ImageCmsProfile(profile) + # do it in python, not c. + # // name was "%s - %s" (model, manufacturer) || Description , + # // but if the Model and Manufacturer were the same or the model + # // was long, Just the model, in 1.x + model = profile.profile.model + manufacturer = profile.profile.manufacturer + + if not (model or manufacturer): + return (profile.profile.profile_description or "") + "\n" + if not manufacturer or (model and len(model) > 30): + return f"{model}\n" + return f"{model} - {manufacturer}\n" + + except (AttributeError, OSError, TypeError, ValueError) as v: + raise PyCMSError(v) from v + + +def getProfileInfo(profile: _CmsProfileCompatible) -> str: + """ + (pyCMS) Gets the internal product information for the given profile. + + If ``profile`` isn't a valid CmsProfile object or filename to a profile, + a :exc:`PyCMSError` is raised. + + If an error occurs while trying to obtain the info tag, + a :exc:`PyCMSError` is raised. + + Use this function to obtain the information stored in the profile's + info tag. This often contains details about the profile, and how it + was created, as supplied by the creator. + + :param profile: EITHER a valid CmsProfile object, OR a string of the + filename of an ICC profile. + :returns: A string containing the internal profile information stored in + an ICC tag. + :exception PyCMSError: + """ + + try: + if not isinstance(profile, ImageCmsProfile): + profile = ImageCmsProfile(profile) + # add an extra newline to preserve pyCMS compatibility + # Python, not C. the white point bits weren't working well, + # so skipping. + # info was description \r\n\r\n copyright \r\n\r\n K007 tag \r\n\r\n whitepoint + description = profile.profile.profile_description + cpright = profile.profile.copyright + elements = [element for element in (description, cpright) if element] + return "\r\n\r\n".join(elements) + "\r\n\r\n" + + except (AttributeError, OSError, TypeError, ValueError) as v: + raise PyCMSError(v) from v + + +def getProfileCopyright(profile: _CmsProfileCompatible) -> str: + """ + (pyCMS) Gets the copyright for the given profile. + + If ``profile`` isn't a valid CmsProfile object or filename to a profile, a + :exc:`PyCMSError` is raised. + + If an error occurs while trying to obtain the copyright tag, + a :exc:`PyCMSError` is raised. + + Use this function to obtain the information stored in the profile's + copyright tag. + + :param profile: EITHER a valid CmsProfile object, OR a string of the + filename of an ICC profile. + :returns: A string containing the internal profile information stored in + an ICC tag. + :exception PyCMSError: + """ + try: + # add an extra newline to preserve pyCMS compatibility + if not isinstance(profile, ImageCmsProfile): + profile = ImageCmsProfile(profile) + return (profile.profile.copyright or "") + "\n" + except (AttributeError, OSError, TypeError, ValueError) as v: + raise PyCMSError(v) from v + + +def getProfileManufacturer(profile: _CmsProfileCompatible) -> str: + """ + (pyCMS) Gets the manufacturer for the given profile. + + If ``profile`` isn't a valid CmsProfile object or filename to a profile, a + :exc:`PyCMSError` is raised. + + If an error occurs while trying to obtain the manufacturer tag, a + :exc:`PyCMSError` is raised. + + Use this function to obtain the information stored in the profile's + manufacturer tag. + + :param profile: EITHER a valid CmsProfile object, OR a string of the + filename of an ICC profile. + :returns: A string containing the internal profile information stored in + an ICC tag. + :exception PyCMSError: + """ + try: + # add an extra newline to preserve pyCMS compatibility + if not isinstance(profile, ImageCmsProfile): + profile = ImageCmsProfile(profile) + return (profile.profile.manufacturer or "") + "\n" + except (AttributeError, OSError, TypeError, ValueError) as v: + raise PyCMSError(v) from v + + +def getProfileModel(profile: _CmsProfileCompatible) -> str: + """ + (pyCMS) Gets the model for the given profile. + + If ``profile`` isn't a valid CmsProfile object or filename to a profile, a + :exc:`PyCMSError` is raised. + + If an error occurs while trying to obtain the model tag, + a :exc:`PyCMSError` is raised. + + Use this function to obtain the information stored in the profile's + model tag. + + :param profile: EITHER a valid CmsProfile object, OR a string of the + filename of an ICC profile. + :returns: A string containing the internal profile information stored in + an ICC tag. + :exception PyCMSError: + """ + + try: + # add an extra newline to preserve pyCMS compatibility + if not isinstance(profile, ImageCmsProfile): + profile = ImageCmsProfile(profile) + return (profile.profile.model or "") + "\n" + except (AttributeError, OSError, TypeError, ValueError) as v: + raise PyCMSError(v) from v + + +def getProfileDescription(profile: _CmsProfileCompatible) -> str: + """ + (pyCMS) Gets the description for the given profile. + + If ``profile`` isn't a valid CmsProfile object or filename to a profile, a + :exc:`PyCMSError` is raised. + + If an error occurs while trying to obtain the description tag, + a :exc:`PyCMSError` is raised. + + Use this function to obtain the information stored in the profile's + description tag. + + :param profile: EITHER a valid CmsProfile object, OR a string of the + filename of an ICC profile. + :returns: A string containing the internal profile information stored in an + ICC tag. + :exception PyCMSError: + """ + + try: + # add an extra newline to preserve pyCMS compatibility + if not isinstance(profile, ImageCmsProfile): + profile = ImageCmsProfile(profile) + return (profile.profile.profile_description or "") + "\n" + except (AttributeError, OSError, TypeError, ValueError) as v: + raise PyCMSError(v) from v + + +def getDefaultIntent(profile: _CmsProfileCompatible) -> int: + """ + (pyCMS) Gets the default intent name for the given profile. + + If ``profile`` isn't a valid CmsProfile object or filename to a profile, a + :exc:`PyCMSError` is raised. + + If an error occurs while trying to obtain the default intent, a + :exc:`PyCMSError` is raised. + + Use this function to determine the default (and usually best optimized) + rendering intent for this profile. Most profiles support multiple + rendering intents, but are intended mostly for one type of conversion. + If you wish to use a different intent than returned, use + ImageCms.isIntentSupported() to verify it will work first. + + :param profile: EITHER a valid CmsProfile object, OR a string of the + filename of an ICC profile. + :returns: Integer 0-3 specifying the default rendering intent for this + profile. + + ImageCms.Intent.PERCEPTUAL = 0 (DEFAULT) + ImageCms.Intent.RELATIVE_COLORIMETRIC = 1 + ImageCms.Intent.SATURATION = 2 + ImageCms.Intent.ABSOLUTE_COLORIMETRIC = 3 + + see the pyCMS documentation for details on rendering intents and what + they do. + :exception PyCMSError: + """ + + try: + if not isinstance(profile, ImageCmsProfile): + profile = ImageCmsProfile(profile) + return profile.profile.rendering_intent + except (AttributeError, OSError, TypeError, ValueError) as v: + raise PyCMSError(v) from v + + +def isIntentSupported( + profile: _CmsProfileCompatible, intent: Intent, direction: Direction +) -> Literal[-1, 1]: + """ + (pyCMS) Checks if a given intent is supported. + + Use this function to verify that you can use your desired + ``intent`` with ``profile``, and that ``profile`` can be used for the + input/output/proof profile as you desire. + + Some profiles are created specifically for one "direction", can cannot + be used for others. Some profiles can only be used for certain + rendering intents, so it's best to either verify this before trying + to create a transform with them (using this function), or catch the + potential :exc:`PyCMSError` that will occur if they don't + support the modes you select. + + :param profile: EITHER a valid CmsProfile object, OR a string of the + filename of an ICC profile. + :param intent: Integer (0-3) specifying the rendering intent you wish to + use with this profile + + ImageCms.Intent.PERCEPTUAL = 0 (DEFAULT) + ImageCms.Intent.RELATIVE_COLORIMETRIC = 1 + ImageCms.Intent.SATURATION = 2 + ImageCms.Intent.ABSOLUTE_COLORIMETRIC = 3 + + see the pyCMS documentation for details on rendering intents and what + they do. + :param direction: Integer specifying if the profile is to be used for + input, output, or proof + + INPUT = 0 (or use ImageCms.Direction.INPUT) + OUTPUT = 1 (or use ImageCms.Direction.OUTPUT) + PROOF = 2 (or use ImageCms.Direction.PROOF) + + :returns: 1 if the intent/direction are supported, -1 if they are not. + :exception PyCMSError: + """ + + try: + if not isinstance(profile, ImageCmsProfile): + profile = ImageCmsProfile(profile) + # FIXME: I get different results for the same data w. different + # compilers. Bug in LittleCMS or in the binding? + if profile.profile.is_intent_supported(intent, direction): + return 1 + else: + return -1 + except (AttributeError, OSError, TypeError, ValueError) as v: + raise PyCMSError(v) from v + + +def versions() -> tuple[str, str | None, str, str]: + """ + (pyCMS) Fetches versions. + """ + + deprecate( + "PIL.ImageCms.versions()", + 12, + '(PIL.features.version("littlecms2"), sys.version, PIL.__version__)', + ) + return _VERSION, core.littlecms_version, sys.version.split()[0], __version__ diff --git a/venv/lib/python3.12/site-packages/PIL/ImageColor.py b/venv/lib/python3.12/site-packages/PIL/ImageColor.py new file mode 100644 index 0000000..9a15a8e --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/ImageColor.py @@ -0,0 +1,320 @@ +# +# The Python Imaging Library +# $Id$ +# +# map CSS3-style colour description strings to RGB +# +# History: +# 2002-10-24 fl Added support for CSS-style color strings +# 2002-12-15 fl Added RGBA support +# 2004-03-27 fl Fixed remaining int() problems for Python 1.5.2 +# 2004-07-19 fl Fixed gray/grey spelling issues +# 2009-03-05 fl Fixed rounding error in grayscale calculation +# +# Copyright (c) 2002-2004 by Secret Labs AB +# Copyright (c) 2002-2004 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import re +from functools import lru_cache + +from . import Image + + +@lru_cache +def getrgb(color: str) -> tuple[int, int, int] | tuple[int, int, int, int]: + """ + Convert a color string to an RGB or RGBA tuple. If the string cannot be + parsed, this function raises a :py:exc:`ValueError` exception. + + .. versionadded:: 1.1.4 + + :param color: A color string + :return: ``(red, green, blue[, alpha])`` + """ + if len(color) > 100: + msg = "color specifier is too long" + raise ValueError(msg) + color = color.lower() + + rgb = colormap.get(color, None) + if rgb: + if isinstance(rgb, tuple): + return rgb + rgb_tuple = getrgb(rgb) + assert len(rgb_tuple) == 3 + colormap[color] = rgb_tuple + return rgb_tuple + + # check for known string formats + if re.match("#[a-f0-9]{3}$", color): + return int(color[1] * 2, 16), int(color[2] * 2, 16), int(color[3] * 2, 16) + + if re.match("#[a-f0-9]{4}$", color): + return ( + int(color[1] * 2, 16), + int(color[2] * 2, 16), + int(color[3] * 2, 16), + int(color[4] * 2, 16), + ) + + if re.match("#[a-f0-9]{6}$", color): + return int(color[1:3], 16), int(color[3:5], 16), int(color[5:7], 16) + + if re.match("#[a-f0-9]{8}$", color): + return ( + int(color[1:3], 16), + int(color[3:5], 16), + int(color[5:7], 16), + int(color[7:9], 16), + ) + + m = re.match(r"rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$", color) + if m: + return int(m.group(1)), int(m.group(2)), int(m.group(3)) + + m = re.match(r"rgb\(\s*(\d+)%\s*,\s*(\d+)%\s*,\s*(\d+)%\s*\)$", color) + if m: + return ( + int((int(m.group(1)) * 255) / 100.0 + 0.5), + int((int(m.group(2)) * 255) / 100.0 + 0.5), + int((int(m.group(3)) * 255) / 100.0 + 0.5), + ) + + m = re.match( + r"hsl\(\s*(\d+\.?\d*)\s*,\s*(\d+\.?\d*)%\s*,\s*(\d+\.?\d*)%\s*\)$", color + ) + if m: + from colorsys import hls_to_rgb + + rgb_floats = hls_to_rgb( + float(m.group(1)) / 360.0, + float(m.group(3)) / 100.0, + float(m.group(2)) / 100.0, + ) + return ( + int(rgb_floats[0] * 255 + 0.5), + int(rgb_floats[1] * 255 + 0.5), + int(rgb_floats[2] * 255 + 0.5), + ) + + m = re.match( + r"hs[bv]\(\s*(\d+\.?\d*)\s*,\s*(\d+\.?\d*)%\s*,\s*(\d+\.?\d*)%\s*\)$", color + ) + if m: + from colorsys import hsv_to_rgb + + rgb_floats = hsv_to_rgb( + float(m.group(1)) / 360.0, + float(m.group(2)) / 100.0, + float(m.group(3)) / 100.0, + ) + return ( + int(rgb_floats[0] * 255 + 0.5), + int(rgb_floats[1] * 255 + 0.5), + int(rgb_floats[2] * 255 + 0.5), + ) + + m = re.match(r"rgba\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$", color) + if m: + return int(m.group(1)), int(m.group(2)), int(m.group(3)), int(m.group(4)) + msg = f"unknown color specifier: {repr(color)}" + raise ValueError(msg) + + +@lru_cache +def getcolor(color: str, mode: str) -> int | tuple[int, ...]: + """ + Same as :py:func:`~PIL.ImageColor.getrgb` for most modes. However, if + ``mode`` is HSV, converts the RGB value to a HSV value, or if ``mode`` is + not color or a palette image, converts the RGB value to a grayscale value. + If the string cannot be parsed, this function raises a :py:exc:`ValueError` + exception. + + .. versionadded:: 1.1.4 + + :param color: A color string + :param mode: Convert result to this mode + :return: ``graylevel, (graylevel, alpha) or (red, green, blue[, alpha])`` + """ + # same as getrgb, but converts the result to the given mode + rgb, alpha = getrgb(color), 255 + if len(rgb) == 4: + alpha = rgb[3] + rgb = rgb[:3] + + if mode == "HSV": + from colorsys import rgb_to_hsv + + r, g, b = rgb + h, s, v = rgb_to_hsv(r / 255, g / 255, b / 255) + return int(h * 255), int(s * 255), int(v * 255) + elif Image.getmodebase(mode) == "L": + r, g, b = rgb + # ITU-R Recommendation 601-2 for nonlinear RGB + # scaled to 24 bits to match the convert's implementation. + graylevel = (r * 19595 + g * 38470 + b * 7471 + 0x8000) >> 16 + if mode[-1] == "A": + return graylevel, alpha + return graylevel + elif mode[-1] == "A": + return rgb + (alpha,) + return rgb + + +colormap: dict[str, str | tuple[int, int, int]] = { + # X11 colour table from https://drafts.csswg.org/css-color-4/, with + # gray/grey spelling issues fixed. This is a superset of HTML 4.0 + # colour names used in CSS 1. + "aliceblue": "#f0f8ff", + "antiquewhite": "#faebd7", + "aqua": "#00ffff", + "aquamarine": "#7fffd4", + "azure": "#f0ffff", + "beige": "#f5f5dc", + "bisque": "#ffe4c4", + "black": "#000000", + "blanchedalmond": "#ffebcd", + "blue": "#0000ff", + "blueviolet": "#8a2be2", + "brown": "#a52a2a", + "burlywood": "#deb887", + "cadetblue": "#5f9ea0", + "chartreuse": "#7fff00", + "chocolate": "#d2691e", + "coral": "#ff7f50", + "cornflowerblue": "#6495ed", + "cornsilk": "#fff8dc", + "crimson": "#dc143c", + "cyan": "#00ffff", + "darkblue": "#00008b", + "darkcyan": "#008b8b", + "darkgoldenrod": "#b8860b", + "darkgray": "#a9a9a9", + "darkgrey": "#a9a9a9", + "darkgreen": "#006400", + "darkkhaki": "#bdb76b", + "darkmagenta": "#8b008b", + "darkolivegreen": "#556b2f", + "darkorange": "#ff8c00", + "darkorchid": "#9932cc", + "darkred": "#8b0000", + "darksalmon": "#e9967a", + "darkseagreen": "#8fbc8f", + "darkslateblue": "#483d8b", + "darkslategray": "#2f4f4f", + "darkslategrey": "#2f4f4f", + "darkturquoise": "#00ced1", + "darkviolet": "#9400d3", + "deeppink": "#ff1493", + "deepskyblue": "#00bfff", + "dimgray": "#696969", + "dimgrey": "#696969", + "dodgerblue": "#1e90ff", + "firebrick": "#b22222", + "floralwhite": "#fffaf0", + "forestgreen": "#228b22", + "fuchsia": "#ff00ff", + "gainsboro": "#dcdcdc", + "ghostwhite": "#f8f8ff", + "gold": "#ffd700", + "goldenrod": "#daa520", + "gray": "#808080", + "grey": "#808080", + "green": "#008000", + "greenyellow": "#adff2f", + "honeydew": "#f0fff0", + "hotpink": "#ff69b4", + "indianred": "#cd5c5c", + "indigo": "#4b0082", + "ivory": "#fffff0", + "khaki": "#f0e68c", + "lavender": "#e6e6fa", + "lavenderblush": "#fff0f5", + "lawngreen": "#7cfc00", + "lemonchiffon": "#fffacd", + "lightblue": "#add8e6", + "lightcoral": "#f08080", + "lightcyan": "#e0ffff", + "lightgoldenrodyellow": "#fafad2", + "lightgreen": "#90ee90", + "lightgray": "#d3d3d3", + "lightgrey": "#d3d3d3", + "lightpink": "#ffb6c1", + "lightsalmon": "#ffa07a", + "lightseagreen": "#20b2aa", + "lightskyblue": "#87cefa", + "lightslategray": "#778899", + "lightslategrey": "#778899", + "lightsteelblue": "#b0c4de", + "lightyellow": "#ffffe0", + "lime": "#00ff00", + "limegreen": "#32cd32", + "linen": "#faf0e6", + "magenta": "#ff00ff", + "maroon": "#800000", + "mediumaquamarine": "#66cdaa", + "mediumblue": "#0000cd", + "mediumorchid": "#ba55d3", + "mediumpurple": "#9370db", + "mediumseagreen": "#3cb371", + "mediumslateblue": "#7b68ee", + "mediumspringgreen": "#00fa9a", + "mediumturquoise": "#48d1cc", + "mediumvioletred": "#c71585", + "midnightblue": "#191970", + "mintcream": "#f5fffa", + "mistyrose": "#ffe4e1", + "moccasin": "#ffe4b5", + "navajowhite": "#ffdead", + "navy": "#000080", + "oldlace": "#fdf5e6", + "olive": "#808000", + "olivedrab": "#6b8e23", + "orange": "#ffa500", + "orangered": "#ff4500", + "orchid": "#da70d6", + "palegoldenrod": "#eee8aa", + "palegreen": "#98fb98", + "paleturquoise": "#afeeee", + "palevioletred": "#db7093", + "papayawhip": "#ffefd5", + "peachpuff": "#ffdab9", + "peru": "#cd853f", + "pink": "#ffc0cb", + "plum": "#dda0dd", + "powderblue": "#b0e0e6", + "purple": "#800080", + "rebeccapurple": "#663399", + "red": "#ff0000", + "rosybrown": "#bc8f8f", + "royalblue": "#4169e1", + "saddlebrown": "#8b4513", + "salmon": "#fa8072", + "sandybrown": "#f4a460", + "seagreen": "#2e8b57", + "seashell": "#fff5ee", + "sienna": "#a0522d", + "silver": "#c0c0c0", + "skyblue": "#87ceeb", + "slateblue": "#6a5acd", + "slategray": "#708090", + "slategrey": "#708090", + "snow": "#fffafa", + "springgreen": "#00ff7f", + "steelblue": "#4682b4", + "tan": "#d2b48c", + "teal": "#008080", + "thistle": "#d8bfd8", + "tomato": "#ff6347", + "turquoise": "#40e0d0", + "violet": "#ee82ee", + "wheat": "#f5deb3", + "white": "#ffffff", + "whitesmoke": "#f5f5f5", + "yellow": "#ffff00", + "yellowgreen": "#9acd32", +} diff --git a/venv/lib/python3.12/site-packages/PIL/ImageDraw.py b/venv/lib/python3.12/site-packages/PIL/ImageDraw.py new file mode 100644 index 0000000..d8e4c0c --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/ImageDraw.py @@ -0,0 +1,1218 @@ +# +# The Python Imaging Library +# $Id$ +# +# drawing interface operations +# +# History: +# 1996-04-13 fl Created (experimental) +# 1996-08-07 fl Filled polygons, ellipses. +# 1996-08-13 fl Added text support +# 1998-06-28 fl Handle I and F images +# 1998-12-29 fl Added arc; use arc primitive to draw ellipses +# 1999-01-10 fl Added shape stuff (experimental) +# 1999-02-06 fl Added bitmap support +# 1999-02-11 fl Changed all primitives to take options +# 1999-02-20 fl Fixed backwards compatibility +# 2000-10-12 fl Copy on write, when necessary +# 2001-02-18 fl Use default ink for bitmap/text also in fill mode +# 2002-10-24 fl Added support for CSS-style color strings +# 2002-12-10 fl Added experimental support for RGBA-on-RGB drawing +# 2002-12-11 fl Refactored low-level drawing API (work in progress) +# 2004-08-26 fl Made Draw() a factory function, added getdraw() support +# 2004-09-04 fl Added width support to line primitive +# 2004-09-10 fl Added font mode handling +# 2006-06-19 fl Added font bearing support (getmask2) +# +# Copyright (c) 1997-2006 by Secret Labs AB +# Copyright (c) 1996-2006 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import math +import struct +from collections.abc import Sequence +from types import ModuleType +from typing import TYPE_CHECKING, Any, AnyStr, Callable, Union, cast + +from . import Image, ImageColor +from ._deprecate import deprecate +from ._typing import Coords + +# experimental access to the outline API +Outline: Callable[[], Image.core._Outline] | None +try: + Outline = Image.core.outline +except AttributeError: + Outline = None + +if TYPE_CHECKING: + from . import ImageDraw2, ImageFont + +_Ink = Union[float, tuple[int, ...], str] + +""" +A simple 2D drawing interface for PIL images. +

+Application code should use the Draw factory, instead of +directly. +""" + + +class ImageDraw: + font: ( + ImageFont.ImageFont | ImageFont.FreeTypeFont | ImageFont.TransposedFont | None + ) = None + + def __init__(self, im: Image.Image, mode: str | None = None) -> None: + """ + Create a drawing instance. + + :param im: The image to draw in. + :param mode: Optional mode to use for color values. For RGB + images, this argument can be RGB or RGBA (to blend the + drawing into the image). For all other modes, this argument + must be the same as the image mode. If omitted, the mode + defaults to the mode of the image. + """ + im.load() + if im.readonly: + im._copy() # make it writeable + blend = 0 + if mode is None: + mode = im.mode + if mode != im.mode: + if mode == "RGBA" and im.mode == "RGB": + blend = 1 + else: + msg = "mode mismatch" + raise ValueError(msg) + if mode == "P": + self.palette = im.palette + else: + self.palette = None + self._image = im + self.im = im.im + self.draw = Image.core.draw(self.im, blend) + self.mode = mode + if mode in ("I", "F"): + self.ink = self.draw.draw_ink(1) + else: + self.ink = self.draw.draw_ink(-1) + if mode in ("1", "P", "I", "F"): + # FIXME: fix Fill2 to properly support matte for I+F images + self.fontmode = "1" + else: + self.fontmode = "L" # aliasing is okay for other modes + self.fill = False + + def getfont( + self, + ) -> ImageFont.ImageFont | ImageFont.FreeTypeFont | ImageFont.TransposedFont: + """ + Get the current default font. + + To set the default font for this ImageDraw instance:: + + from PIL import ImageDraw, ImageFont + draw.font = ImageFont.truetype("Tests/fonts/FreeMono.ttf") + + To set the default font for all future ImageDraw instances:: + + from PIL import ImageDraw, ImageFont + ImageDraw.ImageDraw.font = ImageFont.truetype("Tests/fonts/FreeMono.ttf") + + If the current default font is ``None``, + it is initialized with ``ImageFont.load_default()``. + + :returns: An image font.""" + if not self.font: + # FIXME: should add a font repository + from . import ImageFont + + self.font = ImageFont.load_default() + return self.font + + def _getfont( + self, font_size: float | None + ) -> ImageFont.ImageFont | ImageFont.FreeTypeFont | ImageFont.TransposedFont: + if font_size is not None: + from . import ImageFont + + return ImageFont.load_default(font_size) + else: + return self.getfont() + + def _getink( + self, ink: _Ink | None, fill: _Ink | None = None + ) -> tuple[int | None, int | None]: + result_ink = None + result_fill = None + if ink is None and fill is None: + if self.fill: + result_fill = self.ink + else: + result_ink = self.ink + else: + if ink is not None: + if isinstance(ink, str): + ink = ImageColor.getcolor(ink, self.mode) + if self.palette and isinstance(ink, tuple): + ink = self.palette.getcolor(ink, self._image) + result_ink = self.draw.draw_ink(ink) + if fill is not None: + if isinstance(fill, str): + fill = ImageColor.getcolor(fill, self.mode) + if self.palette and isinstance(fill, tuple): + fill = self.palette.getcolor(fill, self._image) + result_fill = self.draw.draw_ink(fill) + return result_ink, result_fill + + def arc( + self, + xy: Coords, + start: float, + end: float, + fill: _Ink | None = None, + width: int = 1, + ) -> None: + """Draw an arc.""" + ink, fill = self._getink(fill) + if ink is not None: + self.draw.draw_arc(xy, start, end, ink, width) + + def bitmap( + self, xy: Sequence[int], bitmap: Image.Image, fill: _Ink | None = None + ) -> None: + """Draw a bitmap.""" + bitmap.load() + ink, fill = self._getink(fill) + if ink is None: + ink = fill + if ink is not None: + self.draw.draw_bitmap(xy, bitmap.im, ink) + + def chord( + self, + xy: Coords, + start: float, + end: float, + fill: _Ink | None = None, + outline: _Ink | None = None, + width: int = 1, + ) -> None: + """Draw a chord.""" + ink, fill_ink = self._getink(outline, fill) + if fill_ink is not None: + self.draw.draw_chord(xy, start, end, fill_ink, 1) + if ink is not None and ink != fill_ink and width != 0: + self.draw.draw_chord(xy, start, end, ink, 0, width) + + def ellipse( + self, + xy: Coords, + fill: _Ink | None = None, + outline: _Ink | None = None, + width: int = 1, + ) -> None: + """Draw an ellipse.""" + ink, fill_ink = self._getink(outline, fill) + if fill_ink is not None: + self.draw.draw_ellipse(xy, fill_ink, 1) + if ink is not None and ink != fill_ink and width != 0: + self.draw.draw_ellipse(xy, ink, 0, width) + + def circle( + self, + xy: Sequence[float], + radius: float, + fill: _Ink | None = None, + outline: _Ink | None = None, + width: int = 1, + ) -> None: + """Draw a circle given center coordinates and a radius.""" + ellipse_xy = (xy[0] - radius, xy[1] - radius, xy[0] + radius, xy[1] + radius) + self.ellipse(ellipse_xy, fill, outline, width) + + def line( + self, + xy: Coords, + fill: _Ink | None = None, + width: int = 0, + joint: str | None = None, + ) -> None: + """Draw a line, or a connected sequence of line segments.""" + ink = self._getink(fill)[0] + if ink is not None: + self.draw.draw_lines(xy, ink, width) + if joint == "curve" and width > 4: + points: Sequence[Sequence[float]] + if isinstance(xy[0], (list, tuple)): + points = cast(Sequence[Sequence[float]], xy) + else: + points = [ + cast(Sequence[float], tuple(xy[i : i + 2])) + for i in range(0, len(xy), 2) + ] + for i in range(1, len(points) - 1): + point = points[i] + angles = [ + math.degrees(math.atan2(end[0] - start[0], start[1] - end[1])) + % 360 + for start, end in ( + (points[i - 1], point), + (point, points[i + 1]), + ) + ] + if angles[0] == angles[1]: + # This is a straight line, so no joint is required + continue + + def coord_at_angle( + coord: Sequence[float], angle: float + ) -> tuple[float, ...]: + x, y = coord + angle -= 90 + distance = width / 2 - 1 + return tuple( + p + (math.floor(p_d) if p_d > 0 else math.ceil(p_d)) + for p, p_d in ( + (x, distance * math.cos(math.radians(angle))), + (y, distance * math.sin(math.radians(angle))), + ) + ) + + flipped = ( + angles[1] > angles[0] and angles[1] - 180 > angles[0] + ) or (angles[1] < angles[0] and angles[1] + 180 > angles[0]) + coords = [ + (point[0] - width / 2 + 1, point[1] - width / 2 + 1), + (point[0] + width / 2 - 1, point[1] + width / 2 - 1), + ] + if flipped: + start, end = (angles[1] + 90, angles[0] + 90) + else: + start, end = (angles[0] - 90, angles[1] - 90) + self.pieslice(coords, start - 90, end - 90, fill) + + if width > 8: + # Cover potential gaps between the line and the joint + if flipped: + gap_coords = [ + coord_at_angle(point, angles[0] + 90), + point, + coord_at_angle(point, angles[1] + 90), + ] + else: + gap_coords = [ + coord_at_angle(point, angles[0] - 90), + point, + coord_at_angle(point, angles[1] - 90), + ] + self.line(gap_coords, fill, width=3) + + def shape( + self, + shape: Image.core._Outline, + fill: _Ink | None = None, + outline: _Ink | None = None, + ) -> None: + """(Experimental) Draw a shape.""" + shape.close() + ink, fill_ink = self._getink(outline, fill) + if fill_ink is not None: + self.draw.draw_outline(shape, fill_ink, 1) + if ink is not None and ink != fill_ink: + self.draw.draw_outline(shape, ink, 0) + + def pieslice( + self, + xy: Coords, + start: float, + end: float, + fill: _Ink | None = None, + outline: _Ink | None = None, + width: int = 1, + ) -> None: + """Draw a pieslice.""" + ink, fill_ink = self._getink(outline, fill) + if fill_ink is not None: + self.draw.draw_pieslice(xy, start, end, fill_ink, 1) + if ink is not None and ink != fill_ink and width != 0: + self.draw.draw_pieslice(xy, start, end, ink, 0, width) + + def point(self, xy: Coords, fill: _Ink | None = None) -> None: + """Draw one or more individual pixels.""" + ink, fill = self._getink(fill) + if ink is not None: + self.draw.draw_points(xy, ink) + + def polygon( + self, + xy: Coords, + fill: _Ink | None = None, + outline: _Ink | None = None, + width: int = 1, + ) -> None: + """Draw a polygon.""" + ink, fill_ink = self._getink(outline, fill) + if fill_ink is not None: + self.draw.draw_polygon(xy, fill_ink, 1) + if ink is not None and ink != fill_ink and width != 0: + if width == 1: + self.draw.draw_polygon(xy, ink, 0, width) + elif self.im is not None: + # To avoid expanding the polygon outwards, + # use the fill as a mask + mask = Image.new("1", self.im.size) + mask_ink = self._getink(1)[0] + + fill_im = mask.copy() + draw = Draw(fill_im) + draw.draw.draw_polygon(xy, mask_ink, 1) + + ink_im = mask.copy() + draw = Draw(ink_im) + width = width * 2 - 1 + draw.draw.draw_polygon(xy, mask_ink, 0, width) + + mask.paste(ink_im, mask=fill_im) + + im = Image.new(self.mode, self.im.size) + draw = Draw(im) + draw.draw.draw_polygon(xy, ink, 0, width) + self.im.paste(im.im, (0, 0) + im.size, mask.im) + + def regular_polygon( + self, + bounding_circle: Sequence[Sequence[float] | float], + n_sides: int, + rotation: float = 0, + fill: _Ink | None = None, + outline: _Ink | None = None, + width: int = 1, + ) -> None: + """Draw a regular polygon.""" + xy = _compute_regular_polygon_vertices(bounding_circle, n_sides, rotation) + self.polygon(xy, fill, outline, width) + + def rectangle( + self, + xy: Coords, + fill: _Ink | None = None, + outline: _Ink | None = None, + width: int = 1, + ) -> None: + """Draw a rectangle.""" + ink, fill_ink = self._getink(outline, fill) + if fill_ink is not None: + self.draw.draw_rectangle(xy, fill_ink, 1) + if ink is not None and ink != fill_ink and width != 0: + self.draw.draw_rectangle(xy, ink, 0, width) + + def rounded_rectangle( + self, + xy: Coords, + radius: float = 0, + fill: _Ink | None = None, + outline: _Ink | None = None, + width: int = 1, + *, + corners: tuple[bool, bool, bool, bool] | None = None, + ) -> None: + """Draw a rounded rectangle.""" + if isinstance(xy[0], (list, tuple)): + (x0, y0), (x1, y1) = cast(Sequence[Sequence[float]], xy) + else: + x0, y0, x1, y1 = cast(Sequence[float], xy) + if x1 < x0: + msg = "x1 must be greater than or equal to x0" + raise ValueError(msg) + if y1 < y0: + msg = "y1 must be greater than or equal to y0" + raise ValueError(msg) + if corners is None: + corners = (True, True, True, True) + + d = radius * 2 + + x0 = round(x0) + y0 = round(y0) + x1 = round(x1) + y1 = round(y1) + full_x, full_y = False, False + if all(corners): + full_x = d >= x1 - x0 - 1 + if full_x: + # The two left and two right corners are joined + d = x1 - x0 + full_y = d >= y1 - y0 - 1 + if full_y: + # The two top and two bottom corners are joined + d = y1 - y0 + if full_x and full_y: + # If all corners are joined, that is a circle + return self.ellipse(xy, fill, outline, width) + + if d == 0 or not any(corners): + # If the corners have no curve, + # or there are no corners, + # that is a rectangle + return self.rectangle(xy, fill, outline, width) + + r = int(d // 2) + ink, fill_ink = self._getink(outline, fill) + + def draw_corners(pieslice: bool) -> None: + parts: tuple[tuple[tuple[float, float, float, float], int, int], ...] + if full_x: + # Draw top and bottom halves + parts = ( + ((x0, y0, x0 + d, y0 + d), 180, 360), + ((x0, y1 - d, x0 + d, y1), 0, 180), + ) + elif full_y: + # Draw left and right halves + parts = ( + ((x0, y0, x0 + d, y0 + d), 90, 270), + ((x1 - d, y0, x1, y0 + d), 270, 90), + ) + else: + # Draw four separate corners + parts = tuple( + part + for i, part in enumerate( + ( + ((x0, y0, x0 + d, y0 + d), 180, 270), + ((x1 - d, y0, x1, y0 + d), 270, 360), + ((x1 - d, y1 - d, x1, y1), 0, 90), + ((x0, y1 - d, x0 + d, y1), 90, 180), + ) + ) + if corners[i] + ) + for part in parts: + if pieslice: + self.draw.draw_pieslice(*(part + (fill_ink, 1))) + else: + self.draw.draw_arc(*(part + (ink, width))) + + if fill_ink is not None: + draw_corners(True) + + if full_x: + self.draw.draw_rectangle((x0, y0 + r + 1, x1, y1 - r - 1), fill_ink, 1) + elif x1 - r - 1 > x0 + r + 1: + self.draw.draw_rectangle((x0 + r + 1, y0, x1 - r - 1, y1), fill_ink, 1) + if not full_x and not full_y: + left = [x0, y0, x0 + r, y1] + if corners[0]: + left[1] += r + 1 + if corners[3]: + left[3] -= r + 1 + self.draw.draw_rectangle(left, fill_ink, 1) + + right = [x1 - r, y0, x1, y1] + if corners[1]: + right[1] += r + 1 + if corners[2]: + right[3] -= r + 1 + self.draw.draw_rectangle(right, fill_ink, 1) + if ink is not None and ink != fill_ink and width != 0: + draw_corners(False) + + if not full_x: + top = [x0, y0, x1, y0 + width - 1] + if corners[0]: + top[0] += r + 1 + if corners[1]: + top[2] -= r + 1 + self.draw.draw_rectangle(top, ink, 1) + + bottom = [x0, y1 - width + 1, x1, y1] + if corners[3]: + bottom[0] += r + 1 + if corners[2]: + bottom[2] -= r + 1 + self.draw.draw_rectangle(bottom, ink, 1) + if not full_y: + left = [x0, y0, x0 + width - 1, y1] + if corners[0]: + left[1] += r + 1 + if corners[3]: + left[3] -= r + 1 + self.draw.draw_rectangle(left, ink, 1) + + right = [x1 - width + 1, y0, x1, y1] + if corners[1]: + right[1] += r + 1 + if corners[2]: + right[3] -= r + 1 + self.draw.draw_rectangle(right, ink, 1) + + def _multiline_check(self, text: AnyStr) -> bool: + split_character = "\n" if isinstance(text, str) else b"\n" + + return split_character in text + + def _multiline_split(self, text: AnyStr) -> list[AnyStr]: + return text.split("\n" if isinstance(text, str) else b"\n") + + def _multiline_spacing( + self, + font: ImageFont.ImageFont | ImageFont.FreeTypeFont | ImageFont.TransposedFont, + spacing: float, + stroke_width: float, + ) -> float: + return ( + self.textbbox((0, 0), "A", font, stroke_width=stroke_width)[3] + + stroke_width + + spacing + ) + + def text( + self, + xy: tuple[float, float], + text: AnyStr, + fill: _Ink | None = None, + font: ( + ImageFont.ImageFont + | ImageFont.FreeTypeFont + | ImageFont.TransposedFont + | None + ) = None, + anchor: str | None = None, + spacing: float = 4, + align: str = "left", + direction: str | None = None, + features: list[str] | None = None, + language: str | None = None, + stroke_width: float = 0, + stroke_fill: _Ink | None = None, + embedded_color: bool = False, + *args: Any, + **kwargs: Any, + ) -> None: + """Draw text.""" + if embedded_color and self.mode not in ("RGB", "RGBA"): + msg = "Embedded color supported only in RGB and RGBA modes" + raise ValueError(msg) + + if font is None: + font = self._getfont(kwargs.get("font_size")) + + if self._multiline_check(text): + return self.multiline_text( + xy, + text, + fill, + font, + anchor, + spacing, + align, + direction, + features, + language, + stroke_width, + stroke_fill, + embedded_color, + ) + + def getink(fill: _Ink | None) -> int: + ink, fill_ink = self._getink(fill) + if ink is None: + assert fill_ink is not None + return fill_ink + return ink + + def draw_text(ink: int, stroke_width: float = 0) -> None: + mode = self.fontmode + if stroke_width == 0 and embedded_color: + mode = "RGBA" + coord = [] + for i in range(2): + coord.append(int(xy[i])) + start = (math.modf(xy[0])[0], math.modf(xy[1])[0]) + try: + mask, offset = font.getmask2( # type: ignore[union-attr,misc] + text, + mode, + direction=direction, + features=features, + language=language, + stroke_width=stroke_width, + anchor=anchor, + ink=ink, + start=start, + *args, + **kwargs, + ) + coord = [coord[0] + offset[0], coord[1] + offset[1]] + except AttributeError: + try: + mask = font.getmask( # type: ignore[misc] + text, + mode, + direction, + features, + language, + stroke_width, + anchor, + ink, + start=start, + *args, + **kwargs, + ) + except TypeError: + mask = font.getmask(text) + if mode == "RGBA": + # font.getmask2(mode="RGBA") returns color in RGB bands and mask in A + # extract mask and set text alpha + color, mask = mask, mask.getband(3) + ink_alpha = struct.pack("i", ink)[3] + color.fillband(3, ink_alpha) + x, y = coord + if self.im is not None: + self.im.paste( + color, (x, y, x + mask.size[0], y + mask.size[1]), mask + ) + else: + self.draw.draw_bitmap(coord, mask, ink) + + ink = getink(fill) + if ink is not None: + stroke_ink = None + if stroke_width: + stroke_ink = getink(stroke_fill) if stroke_fill is not None else ink + + if stroke_ink is not None: + # Draw stroked text + draw_text(stroke_ink, stroke_width) + + # Draw normal text + draw_text(ink, 0) + else: + # Only draw normal text + draw_text(ink) + + def multiline_text( + self, + xy: tuple[float, float], + text: AnyStr, + fill: _Ink | None = None, + font: ( + ImageFont.ImageFont + | ImageFont.FreeTypeFont + | ImageFont.TransposedFont + | None + ) = None, + anchor: str | None = None, + spacing: float = 4, + align: str = "left", + direction: str | None = None, + features: list[str] | None = None, + language: str | None = None, + stroke_width: float = 0, + stroke_fill: _Ink | None = None, + embedded_color: bool = False, + *, + font_size: float | None = None, + ) -> None: + if direction == "ttb": + msg = "ttb direction is unsupported for multiline text" + raise ValueError(msg) + + if anchor is None: + anchor = "la" + elif len(anchor) != 2: + msg = "anchor must be a 2 character string" + raise ValueError(msg) + elif anchor[1] in "tb": + msg = "anchor not supported for multiline text" + raise ValueError(msg) + + if font is None: + font = self._getfont(font_size) + + widths = [] + max_width: float = 0 + lines = self._multiline_split(text) + line_spacing = self._multiline_spacing(font, spacing, stroke_width) + for line in lines: + line_width = self.textlength( + line, font, direction=direction, features=features, language=language + ) + widths.append(line_width) + max_width = max(max_width, line_width) + + top = xy[1] + if anchor[1] == "m": + top -= (len(lines) - 1) * line_spacing / 2.0 + elif anchor[1] == "d": + top -= (len(lines) - 1) * line_spacing + + for idx, line in enumerate(lines): + left = xy[0] + width_difference = max_width - widths[idx] + + # first align left by anchor + if anchor[0] == "m": + left -= width_difference / 2.0 + elif anchor[0] == "r": + left -= width_difference + + # then align by align parameter + if align == "left": + pass + elif align == "center": + left += width_difference / 2.0 + elif align == "right": + left += width_difference + else: + msg = 'align must be "left", "center" or "right"' + raise ValueError(msg) + + self.text( + (left, top), + line, + fill, + font, + anchor, + direction=direction, + features=features, + language=language, + stroke_width=stroke_width, + stroke_fill=stroke_fill, + embedded_color=embedded_color, + ) + top += line_spacing + + def textlength( + self, + text: AnyStr, + font: ( + ImageFont.ImageFont + | ImageFont.FreeTypeFont + | ImageFont.TransposedFont + | None + ) = None, + direction: str | None = None, + features: list[str] | None = None, + language: str | None = None, + embedded_color: bool = False, + *, + font_size: float | None = None, + ) -> float: + """Get the length of a given string, in pixels with 1/64 precision.""" + if self._multiline_check(text): + msg = "can't measure length of multiline text" + raise ValueError(msg) + if embedded_color and self.mode not in ("RGB", "RGBA"): + msg = "Embedded color supported only in RGB and RGBA modes" + raise ValueError(msg) + + if font is None: + font = self._getfont(font_size) + mode = "RGBA" if embedded_color else self.fontmode + return font.getlength(text, mode, direction, features, language) + + def textbbox( + self, + xy: tuple[float, float], + text: AnyStr, + font: ( + ImageFont.ImageFont + | ImageFont.FreeTypeFont + | ImageFont.TransposedFont + | None + ) = None, + anchor: str | None = None, + spacing: float = 4, + align: str = "left", + direction: str | None = None, + features: list[str] | None = None, + language: str | None = None, + stroke_width: float = 0, + embedded_color: bool = False, + *, + font_size: float | None = None, + ) -> tuple[float, float, float, float]: + """Get the bounding box of a given string, in pixels.""" + if embedded_color and self.mode not in ("RGB", "RGBA"): + msg = "Embedded color supported only in RGB and RGBA modes" + raise ValueError(msg) + + if font is None: + font = self._getfont(font_size) + + if self._multiline_check(text): + return self.multiline_textbbox( + xy, + text, + font, + anchor, + spacing, + align, + direction, + features, + language, + stroke_width, + embedded_color, + ) + + mode = "RGBA" if embedded_color else self.fontmode + bbox = font.getbbox( + text, mode, direction, features, language, stroke_width, anchor + ) + return bbox[0] + xy[0], bbox[1] + xy[1], bbox[2] + xy[0], bbox[3] + xy[1] + + def multiline_textbbox( + self, + xy: tuple[float, float], + text: AnyStr, + font: ( + ImageFont.ImageFont + | ImageFont.FreeTypeFont + | ImageFont.TransposedFont + | None + ) = None, + anchor: str | None = None, + spacing: float = 4, + align: str = "left", + direction: str | None = None, + features: list[str] | None = None, + language: str | None = None, + stroke_width: float = 0, + embedded_color: bool = False, + *, + font_size: float | None = None, + ) -> tuple[float, float, float, float]: + if direction == "ttb": + msg = "ttb direction is unsupported for multiline text" + raise ValueError(msg) + + if anchor is None: + anchor = "la" + elif len(anchor) != 2: + msg = "anchor must be a 2 character string" + raise ValueError(msg) + elif anchor[1] in "tb": + msg = "anchor not supported for multiline text" + raise ValueError(msg) + + if font is None: + font = self._getfont(font_size) + + widths = [] + max_width: float = 0 + lines = self._multiline_split(text) + line_spacing = self._multiline_spacing(font, spacing, stroke_width) + for line in lines: + line_width = self.textlength( + line, + font, + direction=direction, + features=features, + language=language, + embedded_color=embedded_color, + ) + widths.append(line_width) + max_width = max(max_width, line_width) + + top = xy[1] + if anchor[1] == "m": + top -= (len(lines) - 1) * line_spacing / 2.0 + elif anchor[1] == "d": + top -= (len(lines) - 1) * line_spacing + + bbox: tuple[float, float, float, float] | None = None + + for idx, line in enumerate(lines): + left = xy[0] + width_difference = max_width - widths[idx] + + # first align left by anchor + if anchor[0] == "m": + left -= width_difference / 2.0 + elif anchor[0] == "r": + left -= width_difference + + # then align by align parameter + if align == "left": + pass + elif align == "center": + left += width_difference / 2.0 + elif align == "right": + left += width_difference + else: + msg = 'align must be "left", "center" or "right"' + raise ValueError(msg) + + bbox_line = self.textbbox( + (left, top), + line, + font, + anchor, + direction=direction, + features=features, + language=language, + stroke_width=stroke_width, + embedded_color=embedded_color, + ) + if bbox is None: + bbox = bbox_line + else: + bbox = ( + min(bbox[0], bbox_line[0]), + min(bbox[1], bbox_line[1]), + max(bbox[2], bbox_line[2]), + max(bbox[3], bbox_line[3]), + ) + + top += line_spacing + + if bbox is None: + return xy[0], xy[1], xy[0], xy[1] + return bbox + + +def Draw(im: Image.Image, mode: str | None = None) -> ImageDraw: + """ + A simple 2D drawing interface for PIL images. + + :param im: The image to draw in. + :param mode: Optional mode to use for color values. For RGB + images, this argument can be RGB or RGBA (to blend the + drawing into the image). For all other modes, this argument + must be the same as the image mode. If omitted, the mode + defaults to the mode of the image. + """ + try: + return getattr(im, "getdraw")(mode) + except AttributeError: + return ImageDraw(im, mode) + + +def getdraw( + im: Image.Image | None = None, hints: list[str] | None = None +) -> tuple[ImageDraw2.Draw | None, ModuleType]: + """ + :param im: The image to draw in. + :param hints: An optional list of hints. Deprecated. + :returns: A (drawing context, drawing resource factory) tuple. + """ + if hints is not None: + deprecate("'hints' parameter", 12) + from . import ImageDraw2 + + draw = ImageDraw2.Draw(im) if im is not None else None + return draw, ImageDraw2 + + +def floodfill( + image: Image.Image, + xy: tuple[int, int], + value: float | tuple[int, ...], + border: float | tuple[int, ...] | None = None, + thresh: float = 0, +) -> None: + """ + .. warning:: This method is experimental. + + Fills a bounded region with a given color. + + :param image: Target image. + :param xy: Seed position (a 2-item coordinate tuple). See + :ref:`coordinate-system`. + :param value: Fill color. + :param border: Optional border value. If given, the region consists of + pixels with a color different from the border color. If not given, + the region consists of pixels having the same color as the seed + pixel. + :param thresh: Optional threshold value which specifies a maximum + tolerable difference of a pixel value from the 'background' in + order for it to be replaced. Useful for filling regions of + non-homogeneous, but similar, colors. + """ + # based on an implementation by Eric S. Raymond + # amended by yo1995 @20180806 + pixel = image.load() + assert pixel is not None + x, y = xy + try: + background = pixel[x, y] + if _color_diff(value, background) <= thresh: + return # seed point already has fill color + pixel[x, y] = value + except (ValueError, IndexError): + return # seed point outside image + edge = {(x, y)} + # use a set to keep record of current and previous edge pixels + # to reduce memory consumption + full_edge = set() + while edge: + new_edge = set() + for x, y in edge: # 4 adjacent method + for s, t in ((x + 1, y), (x - 1, y), (x, y + 1), (x, y - 1)): + # If already processed, or if a coordinate is negative, skip + if (s, t) in full_edge or s < 0 or t < 0: + continue + try: + p = pixel[s, t] + except (ValueError, IndexError): + pass + else: + full_edge.add((s, t)) + if border is None: + fill = _color_diff(p, background) <= thresh + else: + fill = p not in (value, border) + if fill: + pixel[s, t] = value + new_edge.add((s, t)) + full_edge = edge # discard pixels processed + edge = new_edge + + +def _compute_regular_polygon_vertices( + bounding_circle: Sequence[Sequence[float] | float], n_sides: int, rotation: float +) -> list[tuple[float, float]]: + """ + Generate a list of vertices for a 2D regular polygon. + + :param bounding_circle: The bounding circle is a sequence defined + by a point and radius. The polygon is inscribed in this circle. + (e.g. ``bounding_circle=(x, y, r)`` or ``((x, y), r)``) + :param n_sides: Number of sides + (e.g. ``n_sides=3`` for a triangle, ``6`` for a hexagon) + :param rotation: Apply an arbitrary rotation to the polygon + (e.g. ``rotation=90``, applies a 90 degree rotation) + :return: List of regular polygon vertices + (e.g. ``[(25, 50), (50, 50), (50, 25), (25, 25)]``) + + How are the vertices computed? + 1. Compute the following variables + - theta: Angle between the apothem & the nearest polygon vertex + - side_length: Length of each polygon edge + - centroid: Center of bounding circle (1st, 2nd elements of bounding_circle) + - polygon_radius: Polygon radius (last element of bounding_circle) + - angles: Location of each polygon vertex in polar grid + (e.g. A square with 0 degree rotation => [225.0, 315.0, 45.0, 135.0]) + + 2. For each angle in angles, get the polygon vertex at that angle + The vertex is computed using the equation below. + X= xcos(φ) + ysin(φ) + Y= −xsin(φ) + ycos(φ) + + Note: + φ = angle in degrees + x = 0 + y = polygon_radius + + The formula above assumes rotation around the origin. + In our case, we are rotating around the centroid. + To account for this, we use the formula below + X = xcos(φ) + ysin(φ) + centroid_x + Y = −xsin(φ) + ycos(φ) + centroid_y + """ + # 1. Error Handling + # 1.1 Check `n_sides` has an appropriate value + if not isinstance(n_sides, int): + msg = "n_sides should be an int" # type: ignore[unreachable] + raise TypeError(msg) + if n_sides < 3: + msg = "n_sides should be an int > 2" + raise ValueError(msg) + + # 1.2 Check `bounding_circle` has an appropriate value + if not isinstance(bounding_circle, (list, tuple)): + msg = "bounding_circle should be a sequence" + raise TypeError(msg) + + if len(bounding_circle) == 3: + if not all(isinstance(i, (int, float)) for i in bounding_circle): + msg = "bounding_circle should only contain numeric data" + raise ValueError(msg) + + *centroid, polygon_radius = cast(list[float], list(bounding_circle)) + elif len(bounding_circle) == 2 and isinstance(bounding_circle[0], (list, tuple)): + if not all( + isinstance(i, (int, float)) for i in bounding_circle[0] + ) or not isinstance(bounding_circle[1], (int, float)): + msg = "bounding_circle should only contain numeric data" + raise ValueError(msg) + + if len(bounding_circle[0]) != 2: + msg = "bounding_circle centre should contain 2D coordinates (e.g. (x, y))" + raise ValueError(msg) + + centroid = cast(list[float], list(bounding_circle[0])) + polygon_radius = cast(float, bounding_circle[1]) + else: + msg = ( + "bounding_circle should contain 2D coordinates " + "and a radius (e.g. (x, y, r) or ((x, y), r) )" + ) + raise ValueError(msg) + + if polygon_radius <= 0: + msg = "bounding_circle radius should be > 0" + raise ValueError(msg) + + # 1.3 Check `rotation` has an appropriate value + if not isinstance(rotation, (int, float)): + msg = "rotation should be an int or float" # type: ignore[unreachable] + raise ValueError(msg) + + # 2. Define Helper Functions + def _apply_rotation(point: list[float], degrees: float) -> tuple[float, float]: + return ( + round( + point[0] * math.cos(math.radians(360 - degrees)) + - point[1] * math.sin(math.radians(360 - degrees)) + + centroid[0], + 2, + ), + round( + point[1] * math.cos(math.radians(360 - degrees)) + + point[0] * math.sin(math.radians(360 - degrees)) + + centroid[1], + 2, + ), + ) + + def _compute_polygon_vertex(angle: float) -> tuple[float, float]: + start_point = [polygon_radius, 0] + return _apply_rotation(start_point, angle) + + def _get_angles(n_sides: int, rotation: float) -> list[float]: + angles = [] + degrees = 360 / n_sides + # Start with the bottom left polygon vertex + current_angle = (270 - 0.5 * degrees) + rotation + for _ in range(0, n_sides): + angles.append(current_angle) + current_angle += degrees + if current_angle > 360: + current_angle -= 360 + return angles + + # 3. Variable Declarations + angles = _get_angles(n_sides, rotation) + + # 4. Compute Vertices + return [_compute_polygon_vertex(angle) for angle in angles] + + +def _color_diff( + color1: float | tuple[int, ...], color2: float | tuple[int, ...] +) -> float: + """ + Uses 1-norm distance to calculate difference between two values. + """ + first = color1 if isinstance(color1, tuple) else (color1,) + second = color2 if isinstance(color2, tuple) else (color2,) + + return sum(abs(first[i] - second[i]) for i in range(0, len(second))) diff --git a/venv/lib/python3.12/site-packages/PIL/ImageDraw2.py b/venv/lib/python3.12/site-packages/PIL/ImageDraw2.py new file mode 100644 index 0000000..3d68658 --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/ImageDraw2.py @@ -0,0 +1,243 @@ +# +# The Python Imaging Library +# $Id$ +# +# WCK-style drawing interface operations +# +# History: +# 2003-12-07 fl created +# 2005-05-15 fl updated; added to PIL as ImageDraw2 +# 2005-05-15 fl added text support +# 2005-05-20 fl added arc/chord/pieslice support +# +# Copyright (c) 2003-2005 by Secret Labs AB +# Copyright (c) 2003-2005 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + + +""" +(Experimental) WCK-style drawing interface operations + +.. seealso:: :py:mod:`PIL.ImageDraw` +""" +from __future__ import annotations + +from typing import Any, AnyStr, BinaryIO + +from . import Image, ImageColor, ImageDraw, ImageFont, ImagePath +from ._typing import Coords, StrOrBytesPath + + +class Pen: + """Stores an outline color and width.""" + + def __init__(self, color: str, width: int = 1, opacity: int = 255) -> None: + self.color = ImageColor.getrgb(color) + self.width = width + + +class Brush: + """Stores a fill color""" + + def __init__(self, color: str, opacity: int = 255) -> None: + self.color = ImageColor.getrgb(color) + + +class Font: + """Stores a TrueType font and color""" + + def __init__( + self, color: str, file: StrOrBytesPath | BinaryIO, size: float = 12 + ) -> None: + # FIXME: add support for bitmap fonts + self.color = ImageColor.getrgb(color) + self.font = ImageFont.truetype(file, size) + + +class Draw: + """ + (Experimental) WCK-style drawing interface + """ + + def __init__( + self, + image: Image.Image | str, + size: tuple[int, int] | list[int] | None = None, + color: float | tuple[float, ...] | str | None = None, + ) -> None: + if isinstance(image, str): + if size is None: + msg = "If image argument is mode string, size must be a list or tuple" + raise ValueError(msg) + image = Image.new(image, size, color) + self.draw = ImageDraw.Draw(image) + self.image = image + self.transform: tuple[float, float, float, float, float, float] | None = None + + def flush(self) -> Image.Image: + return self.image + + def render( + self, + op: str, + xy: Coords, + pen: Pen | Brush | None, + brush: Brush | Pen | None = None, + **kwargs: Any, + ) -> None: + # handle color arguments + outline = fill = None + width = 1 + if isinstance(pen, Pen): + outline = pen.color + width = pen.width + elif isinstance(brush, Pen): + outline = brush.color + width = brush.width + if isinstance(brush, Brush): + fill = brush.color + elif isinstance(pen, Brush): + fill = pen.color + # handle transformation + if self.transform: + path = ImagePath.Path(xy) + path.transform(self.transform) + xy = path + # render the item + if op in ("arc", "line"): + kwargs.setdefault("fill", outline) + else: + kwargs.setdefault("fill", fill) + kwargs.setdefault("outline", outline) + if op == "line": + kwargs.setdefault("width", width) + getattr(self.draw, op)(xy, **kwargs) + + def settransform(self, offset: tuple[float, float]) -> None: + """Sets a transformation offset.""" + (xoffset, yoffset) = offset + self.transform = (1, 0, xoffset, 0, 1, yoffset) + + def arc( + self, + xy: Coords, + pen: Pen | Brush | None, + start: float, + end: float, + *options: Any, + ) -> None: + """ + Draws an arc (a portion of a circle outline) between the start and end + angles, inside the given bounding box. + + .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.arc` + """ + self.render("arc", xy, pen, *options, start=start, end=end) + + def chord( + self, + xy: Coords, + pen: Pen | Brush | None, + start: float, + end: float, + *options: Any, + ) -> None: + """ + Same as :py:meth:`~PIL.ImageDraw2.Draw.arc`, but connects the end points + with a straight line. + + .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.chord` + """ + self.render("chord", xy, pen, *options, start=start, end=end) + + def ellipse(self, xy: Coords, pen: Pen | Brush | None, *options: Any) -> None: + """ + Draws an ellipse inside the given bounding box. + + .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.ellipse` + """ + self.render("ellipse", xy, pen, *options) + + def line(self, xy: Coords, pen: Pen | Brush | None, *options: Any) -> None: + """ + Draws a line between the coordinates in the ``xy`` list. + + .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.line` + """ + self.render("line", xy, pen, *options) + + def pieslice( + self, + xy: Coords, + pen: Pen | Brush | None, + start: float, + end: float, + *options: Any, + ) -> None: + """ + Same as arc, but also draws straight lines between the end points and the + center of the bounding box. + + .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.pieslice` + """ + self.render("pieslice", xy, pen, *options, start=start, end=end) + + def polygon(self, xy: Coords, pen: Pen | Brush | None, *options: Any) -> None: + """ + Draws a polygon. + + The polygon outline consists of straight lines between the given + coordinates, plus a straight line between the last and the first + coordinate. + + + .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.polygon` + """ + self.render("polygon", xy, pen, *options) + + def rectangle(self, xy: Coords, pen: Pen | Brush | None, *options: Any) -> None: + """ + Draws a rectangle. + + .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.rectangle` + """ + self.render("rectangle", xy, pen, *options) + + def text(self, xy: tuple[float, float], text: AnyStr, font: Font) -> None: + """ + Draws the string at the given position. + + .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.text` + """ + if self.transform: + path = ImagePath.Path(xy) + path.transform(self.transform) + xy = path + self.draw.text(xy, text, font=font.font, fill=font.color) + + def textbbox( + self, xy: tuple[float, float], text: AnyStr, font: Font + ) -> tuple[float, float, float, float]: + """ + Returns bounding box (in pixels) of given text. + + :return: ``(left, top, right, bottom)`` bounding box + + .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.textbbox` + """ + if self.transform: + path = ImagePath.Path(xy) + path.transform(self.transform) + xy = path + return self.draw.textbbox(xy, text, font=font.font) + + def textlength(self, text: AnyStr, font: Font) -> float: + """ + Returns length (in pixels) of given text. + This is the amount by which following text should be offset. + + .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.textlength` + """ + return self.draw.textlength(text, font=font.font) diff --git a/venv/lib/python3.12/site-packages/PIL/ImageEnhance.py b/venv/lib/python3.12/site-packages/PIL/ImageEnhance.py new file mode 100644 index 0000000..0e7e6dd --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/ImageEnhance.py @@ -0,0 +1,113 @@ +# +# The Python Imaging Library. +# $Id$ +# +# image enhancement classes +# +# For a background, see "Image Processing By Interpolation and +# Extrapolation", Paul Haeberli and Douglas Voorhies. Available +# at http://www.graficaobscura.com/interp/index.html +# +# History: +# 1996-03-23 fl Created +# 2009-06-16 fl Fixed mean calculation +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1996. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +from . import Image, ImageFilter, ImageStat + + +class _Enhance: + image: Image.Image + degenerate: Image.Image + + def enhance(self, factor: float) -> Image.Image: + """ + Returns an enhanced image. + + :param factor: A floating point value controlling the enhancement. + Factor 1.0 always returns a copy of the original image, + lower factors mean less color (brightness, contrast, + etc), and higher values more. There are no restrictions + on this value. + :rtype: :py:class:`~PIL.Image.Image` + """ + return Image.blend(self.degenerate, self.image, factor) + + +class Color(_Enhance): + """Adjust image color balance. + + This class can be used to adjust the colour balance of an image, in + a manner similar to the controls on a colour TV set. An enhancement + factor of 0.0 gives a black and white image. A factor of 1.0 gives + the original image. + """ + + def __init__(self, image: Image.Image) -> None: + self.image = image + self.intermediate_mode = "L" + if "A" in image.getbands(): + self.intermediate_mode = "LA" + + if self.intermediate_mode != image.mode: + image = image.convert(self.intermediate_mode).convert(image.mode) + self.degenerate = image + + +class Contrast(_Enhance): + """Adjust image contrast. + + This class can be used to control the contrast of an image, similar + to the contrast control on a TV set. An enhancement factor of 0.0 + gives a solid gray image. A factor of 1.0 gives the original image. + """ + + def __init__(self, image: Image.Image) -> None: + self.image = image + if image.mode != "L": + image = image.convert("L") + mean = int(ImageStat.Stat(image).mean[0] + 0.5) + self.degenerate = Image.new("L", image.size, mean) + if self.degenerate.mode != self.image.mode: + self.degenerate = self.degenerate.convert(self.image.mode) + + if "A" in self.image.getbands(): + self.degenerate.putalpha(self.image.getchannel("A")) + + +class Brightness(_Enhance): + """Adjust image brightness. + + This class can be used to control the brightness of an image. An + enhancement factor of 0.0 gives a black image. A factor of 1.0 gives the + original image. + """ + + def __init__(self, image: Image.Image) -> None: + self.image = image + self.degenerate = Image.new(image.mode, image.size, 0) + + if "A" in image.getbands(): + self.degenerate.putalpha(image.getchannel("A")) + + +class Sharpness(_Enhance): + """Adjust image sharpness. + + This class can be used to adjust the sharpness of an image. An + enhancement factor of 0.0 gives a blurred image, a factor of 1.0 gives the + original image, and a factor of 2.0 gives a sharpened image. + """ + + def __init__(self, image: Image.Image) -> None: + self.image = image + self.degenerate = image.filter(ImageFilter.SMOOTH) + + if "A" in image.getbands(): + self.degenerate.putalpha(image.getchannel("A")) diff --git a/venv/lib/python3.12/site-packages/PIL/ImageFile.py b/venv/lib/python3.12/site-packages/PIL/ImageFile.py new file mode 100644 index 0000000..d69d845 --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/ImageFile.py @@ -0,0 +1,832 @@ +# +# The Python Imaging Library. +# $Id$ +# +# base class for image file handlers +# +# history: +# 1995-09-09 fl Created +# 1996-03-11 fl Fixed load mechanism. +# 1996-04-15 fl Added pcx/xbm decoders. +# 1996-04-30 fl Added encoders. +# 1996-12-14 fl Added load helpers +# 1997-01-11 fl Use encode_to_file where possible +# 1997-08-27 fl Flush output in _save +# 1998-03-05 fl Use memory mapping for some modes +# 1999-02-04 fl Use memory mapping also for "I;16" and "I;16B" +# 1999-05-31 fl Added image parser +# 2000-10-12 fl Set readonly flag on memory-mapped images +# 2002-03-20 fl Use better messages for common decoder errors +# 2003-04-21 fl Fall back on mmap/map_buffer if map is not available +# 2003-10-30 fl Added StubImageFile class +# 2004-02-25 fl Made incremental parser more robust +# +# Copyright (c) 1997-2004 by Secret Labs AB +# Copyright (c) 1995-2004 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import abc +import io +import itertools +import os +import struct +import sys +from typing import IO, TYPE_CHECKING, Any, NamedTuple, cast + +from . import Image +from ._deprecate import deprecate +from ._util import is_path + +if TYPE_CHECKING: + from ._typing import StrOrBytesPath + +MAXBLOCK = 65536 + +SAFEBLOCK = 1024 * 1024 + +LOAD_TRUNCATED_IMAGES = False +"""Whether or not to load truncated image files. User code may change this.""" + +ERRORS = { + -1: "image buffer overrun error", + -2: "decoding error", + -3: "unknown error", + -8: "bad configuration", + -9: "out of memory error", +} +""" +Dict of known error codes returned from :meth:`.PyDecoder.decode`, +:meth:`.PyEncoder.encode` :meth:`.PyEncoder.encode_to_pyfd` and +:meth:`.PyEncoder.encode_to_file`. +""" + + +# +# -------------------------------------------------------------------- +# Helpers + + +def _get_oserror(error: int, *, encoder: bool) -> OSError: + try: + msg = Image.core.getcodecstatus(error) + except AttributeError: + msg = ERRORS.get(error) + if not msg: + msg = f"{'encoder' if encoder else 'decoder'} error {error}" + msg += f" when {'writing' if encoder else 'reading'} image file" + return OSError(msg) + + +def raise_oserror(error: int) -> OSError: + deprecate( + "raise_oserror", + 12, + action="It is only useful for translating error codes returned by a codec's " + "decode() method, which ImageFile already does automatically.", + ) + raise _get_oserror(error, encoder=False) + + +def _tilesort(t: _Tile) -> int: + # sort on offset + return t[2] + + +class _Tile(NamedTuple): + codec_name: str + extents: tuple[int, int, int, int] | None + offset: int + args: tuple[Any, ...] | str | None + + +# +# -------------------------------------------------------------------- +# ImageFile base class + + +class ImageFile(Image.Image): + """Base class for image file format handlers.""" + + def __init__( + self, fp: StrOrBytesPath | IO[bytes], filename: str | bytes | None = None + ) -> None: + super().__init__() + + self._min_frame = 0 + + self.custom_mimetype: str | None = None + + self.tile: list[_Tile] = [] + """ A list of tile descriptors, or ``None`` """ + + self.readonly = 1 # until we know better + + self.decoderconfig: tuple[Any, ...] = () + self.decodermaxblock = MAXBLOCK + + if is_path(fp): + # filename + self.fp = open(fp, "rb") + self.filename = os.path.realpath(os.fspath(fp)) + self._exclusive_fp = True + else: + # stream + self.fp = cast(IO[bytes], fp) + self.filename = filename if filename is not None else "" + # can be overridden + self._exclusive_fp = False + + try: + try: + self._open() + except ( + IndexError, # end of data + TypeError, # end of data (ord) + KeyError, # unsupported mode + EOFError, # got header but not the first frame + struct.error, + ) as v: + raise SyntaxError(v) from v + + if not self.mode or self.size[0] <= 0 or self.size[1] <= 0: + msg = "not identified by this driver" + raise SyntaxError(msg) + except BaseException: + # close the file only if we have opened it this constructor + if self._exclusive_fp: + self.fp.close() + raise + + def _open(self) -> None: + pass + + def get_format_mimetype(self) -> str | None: + if self.custom_mimetype: + return self.custom_mimetype + if self.format is not None: + return Image.MIME.get(self.format.upper()) + return None + + def __setstate__(self, state: list[Any]) -> None: + self.tile = [] + super().__setstate__(state) + + def verify(self) -> None: + """Check file integrity""" + + # raise exception if something's wrong. must be called + # directly after open, and closes file when finished. + if self._exclusive_fp: + self.fp.close() + self.fp = None + + def load(self) -> Image.core.PixelAccess | None: + """Load image data based on tile list""" + + if not self.tile and self._im is None: + msg = "cannot load this image" + raise OSError(msg) + + pixel = Image.Image.load(self) + if not self.tile: + return pixel + + self.map: mmap.mmap | None = None + use_mmap = self.filename and len(self.tile) == 1 + # As of pypy 2.1.0, memory mapping was failing here. + use_mmap = use_mmap and not hasattr(sys, "pypy_version_info") + + readonly = 0 + + # look for read/seek overrides + if hasattr(self, "load_read"): + read = self.load_read + # don't use mmap if there are custom read/seek functions + use_mmap = False + else: + read = self.fp.read + + if hasattr(self, "load_seek"): + seek = self.load_seek + use_mmap = False + else: + seek = self.fp.seek + + if use_mmap: + # try memory mapping + decoder_name, extents, offset, args = self.tile[0] + if isinstance(args, str): + args = (args, 0, 1) + if ( + decoder_name == "raw" + and isinstance(args, tuple) + and len(args) >= 3 + and args[0] == self.mode + and args[0] in Image._MAPMODES + ): + try: + # use mmap, if possible + import mmap + + with open(self.filename) as fp: + self.map = mmap.mmap(fp.fileno(), 0, access=mmap.ACCESS_READ) + if offset + self.size[1] * args[1] > self.map.size(): + msg = "buffer is not large enough" + raise OSError(msg) + self.im = Image.core.map_buffer( + self.map, self.size, decoder_name, offset, args + ) + readonly = 1 + # After trashing self.im, + # we might need to reload the palette data. + if self.palette: + self.palette.dirty = 1 + except (AttributeError, OSError, ImportError): + self.map = None + + self.load_prepare() + err_code = -3 # initialize to unknown error + if not self.map: + # sort tiles in file order + self.tile.sort(key=_tilesort) + + # FIXME: This is a hack to handle TIFF's JpegTables tag. + prefix = getattr(self, "tile_prefix", b"") + + # Remove consecutive duplicates that only differ by their offset + self.tile = [ + list(tiles)[-1] + for _, tiles in itertools.groupby( + self.tile, lambda tile: (tile[0], tile[1], tile[3]) + ) + ] + for decoder_name, extents, offset, args in self.tile: + seek(offset) + decoder = Image._getdecoder( + self.mode, decoder_name, args, self.decoderconfig + ) + try: + decoder.setimage(self.im, extents) + if decoder.pulls_fd: + decoder.setfd(self.fp) + err_code = decoder.decode(b"")[1] + else: + b = prefix + while True: + try: + s = read(self.decodermaxblock) + except (IndexError, struct.error) as e: + # truncated png/gif + if LOAD_TRUNCATED_IMAGES: + break + else: + msg = "image file is truncated" + raise OSError(msg) from e + + if not s: # truncated jpeg + if LOAD_TRUNCATED_IMAGES: + break + else: + msg = ( + "image file is truncated " + f"({len(b)} bytes not processed)" + ) + raise OSError(msg) + + b = b + s + n, err_code = decoder.decode(b) + if n < 0: + break + b = b[n:] + finally: + # Need to cleanup here to prevent leaks + decoder.cleanup() + + self.tile = [] + self.readonly = readonly + + self.load_end() + + if self._exclusive_fp and self._close_exclusive_fp_after_loading: + self.fp.close() + self.fp = None + + if not self.map and not LOAD_TRUNCATED_IMAGES and err_code < 0: + # still raised if decoder fails to return anything + raise _get_oserror(err_code, encoder=False) + + return Image.Image.load(self) + + def load_prepare(self) -> None: + # create image memory if necessary + if self._im is None: + self.im = Image.core.new(self.mode, self.size) + # create palette (optional) + if self.mode == "P": + Image.Image.load(self) + + def load_end(self) -> None: + # may be overridden + pass + + # may be defined for contained formats + # def load_seek(self, pos: int) -> None: + # pass + + # may be defined for blocked formats (e.g. PNG) + # def load_read(self, read_bytes: int) -> bytes: + # pass + + def _seek_check(self, frame: int) -> bool: + if ( + frame < self._min_frame + # Only check upper limit on frames if additional seek operations + # are not required to do so + or ( + not (hasattr(self, "_n_frames") and self._n_frames is None) + and frame >= getattr(self, "n_frames") + self._min_frame + ) + ): + msg = "attempt to seek outside sequence" + raise EOFError(msg) + + return self.tell() != frame + + +class StubHandler: + def open(self, im: StubImageFile) -> None: + pass + + @abc.abstractmethod + def load(self, im: StubImageFile) -> Image.Image: + pass + + +class StubImageFile(ImageFile): + """ + Base class for stub image loaders. + + A stub loader is an image loader that can identify files of a + certain format, but relies on external code to load the file. + """ + + def _open(self) -> None: + msg = "StubImageFile subclass must implement _open" + raise NotImplementedError(msg) + + def load(self) -> Image.core.PixelAccess | None: + loader = self._load() + if loader is None: + msg = f"cannot find loader for this {self.format} file" + raise OSError(msg) + image = loader.load(self) + assert image is not None + # become the other object (!) + self.__class__ = image.__class__ # type: ignore[assignment] + self.__dict__ = image.__dict__ + return image.load() + + def _load(self) -> StubHandler | None: + """(Hook) Find actual image loader.""" + msg = "StubImageFile subclass must implement _load" + raise NotImplementedError(msg) + + +class Parser: + """ + Incremental image parser. This class implements the standard + feed/close consumer interface. + """ + + incremental = None + image: Image.Image | None = None + data: bytes | None = None + decoder: Image.core.ImagingDecoder | PyDecoder | None = None + offset = 0 + finished = 0 + + def reset(self) -> None: + """ + (Consumer) Reset the parser. Note that you can only call this + method immediately after you've created a parser; parser + instances cannot be reused. + """ + assert self.data is None, "cannot reuse parsers" + + def feed(self, data: bytes) -> None: + """ + (Consumer) Feed data to the parser. + + :param data: A string buffer. + :exception OSError: If the parser failed to parse the image file. + """ + # collect data + + if self.finished: + return + + if self.data is None: + self.data = data + else: + self.data = self.data + data + + # parse what we have + if self.decoder: + if self.offset > 0: + # skip header + skip = min(len(self.data), self.offset) + self.data = self.data[skip:] + self.offset = self.offset - skip + if self.offset > 0 or not self.data: + return + + n, e = self.decoder.decode(self.data) + + if n < 0: + # end of stream + self.data = None + self.finished = 1 + if e < 0: + # decoding error + self.image = None + raise _get_oserror(e, encoder=False) + else: + # end of image + return + self.data = self.data[n:] + + elif self.image: + # if we end up here with no decoder, this file cannot + # be incrementally parsed. wait until we've gotten all + # available data + pass + + else: + # attempt to open this file + try: + with io.BytesIO(self.data) as fp: + im = Image.open(fp) + except OSError: + pass # not enough data + else: + flag = hasattr(im, "load_seek") or hasattr(im, "load_read") + if flag or len(im.tile) != 1: + # custom load code, or multiple tiles + self.decode = None + else: + # initialize decoder + im.load_prepare() + d, e, o, a = im.tile[0] + im.tile = [] + self.decoder = Image._getdecoder(im.mode, d, a, im.decoderconfig) + self.decoder.setimage(im.im, e) + + # calculate decoder offset + self.offset = o + if self.offset <= len(self.data): + self.data = self.data[self.offset :] + self.offset = 0 + + self.image = im + + def __enter__(self) -> Parser: + return self + + def __exit__(self, *args: object) -> None: + self.close() + + def close(self) -> Image.Image: + """ + (Consumer) Close the stream. + + :returns: An image object. + :exception OSError: If the parser failed to parse the image file either + because it cannot be identified or cannot be + decoded. + """ + # finish decoding + if self.decoder: + # get rid of what's left in the buffers + self.feed(b"") + self.data = self.decoder = None + if not self.finished: + msg = "image was incomplete" + raise OSError(msg) + if not self.image: + msg = "cannot parse this image" + raise OSError(msg) + if self.data: + # incremental parsing not possible; reopen the file + # not that we have all data + with io.BytesIO(self.data) as fp: + try: + self.image = Image.open(fp) + finally: + self.image.load() + return self.image + + +# -------------------------------------------------------------------- + + +def _save(im: Image.Image, fp: IO[bytes], tile: list[_Tile], bufsize: int = 0) -> None: + """Helper to save image based on tile list + + :param im: Image object. + :param fp: File object. + :param tile: Tile list. + :param bufsize: Optional buffer size + """ + + im.load() + if not hasattr(im, "encoderconfig"): + im.encoderconfig = () + tile.sort(key=_tilesort) + # FIXME: make MAXBLOCK a configuration parameter + # It would be great if we could have the encoder specify what it needs + # But, it would need at least the image size in most cases. RawEncode is + # a tricky case. + bufsize = max(MAXBLOCK, bufsize, im.size[0] * 4) # see RawEncode.c + try: + fh = fp.fileno() + fp.flush() + _encode_tile(im, fp, tile, bufsize, fh) + except (AttributeError, io.UnsupportedOperation) as exc: + _encode_tile(im, fp, tile, bufsize, None, exc) + if hasattr(fp, "flush"): + fp.flush() + + +def _encode_tile( + im: Image.Image, + fp: IO[bytes], + tile: list[_Tile], + bufsize: int, + fh: int | None, + exc: BaseException | None = None, +) -> None: + for encoder_name, extents, offset, args in tile: + if offset > 0: + fp.seek(offset) + encoder = Image._getencoder(im.mode, encoder_name, args, im.encoderconfig) + try: + encoder.setimage(im.im, extents) + if encoder.pushes_fd: + encoder.setfd(fp) + errcode = encoder.encode_to_pyfd()[1] + else: + if exc: + # compress to Python file-compatible object + while True: + errcode, data = encoder.encode(bufsize)[1:] + fp.write(data) + if errcode: + break + else: + # slight speedup: compress to real file object + assert fh is not None + errcode = encoder.encode_to_file(fh, bufsize) + if errcode < 0: + raise _get_oserror(errcode, encoder=True) from exc + finally: + encoder.cleanup() + + +def _safe_read(fp: IO[bytes], size: int) -> bytes: + """ + Reads large blocks in a safe way. Unlike fp.read(n), this function + doesn't trust the user. If the requested size is larger than + SAFEBLOCK, the file is read block by block. + + :param fp: File handle. Must implement a read method. + :param size: Number of bytes to read. + :returns: A string containing size bytes of data. + + Raises an OSError if the file is truncated and the read cannot be completed + + """ + if size <= 0: + return b"" + if size <= SAFEBLOCK: + data = fp.read(size) + if len(data) < size: + msg = "Truncated File Read" + raise OSError(msg) + return data + blocks: list[bytes] = [] + remaining_size = size + while remaining_size > 0: + block = fp.read(min(remaining_size, SAFEBLOCK)) + if not block: + break + blocks.append(block) + remaining_size -= len(block) + if sum(len(block) for block in blocks) < size: + msg = "Truncated File Read" + raise OSError(msg) + return b"".join(blocks) + + +class PyCodecState: + def __init__(self) -> None: + self.xsize = 0 + self.ysize = 0 + self.xoff = 0 + self.yoff = 0 + + def extents(self) -> tuple[int, int, int, int]: + return self.xoff, self.yoff, self.xoff + self.xsize, self.yoff + self.ysize + + +class PyCodec: + fd: IO[bytes] | None + + def __init__(self, mode: str, *args: Any) -> None: + self.im: Image.core.ImagingCore | None = None + self.state = PyCodecState() + self.fd = None + self.mode = mode + self.init(args) + + def init(self, args: tuple[Any, ...]) -> None: + """ + Override to perform codec specific initialization + + :param args: Tuple of arg items from the tile entry + :returns: None + """ + self.args = args + + def cleanup(self) -> None: + """ + Override to perform codec specific cleanup + + :returns: None + """ + pass + + def setfd(self, fd: IO[bytes]) -> None: + """ + Called from ImageFile to set the Python file-like object + + :param fd: A Python file-like object + :returns: None + """ + self.fd = fd + + def setimage( + self, + im: Image.core.ImagingCore, + extents: tuple[int, int, int, int] | None = None, + ) -> None: + """ + Called from ImageFile to set the core output image for the codec + + :param im: A core image object + :param extents: a 4 tuple of (x0, y0, x1, y1) defining the rectangle + for this tile + :returns: None + """ + + # following c code + self.im = im + + if extents: + (x0, y0, x1, y1) = extents + else: + (x0, y0, x1, y1) = (0, 0, 0, 0) + + if x0 == 0 and x1 == 0: + self.state.xsize, self.state.ysize = self.im.size + else: + self.state.xoff = x0 + self.state.yoff = y0 + self.state.xsize = x1 - x0 + self.state.ysize = y1 - y0 + + if self.state.xsize <= 0 or self.state.ysize <= 0: + msg = "Size cannot be negative" + raise ValueError(msg) + + if ( + self.state.xsize + self.state.xoff > self.im.size[0] + or self.state.ysize + self.state.yoff > self.im.size[1] + ): + msg = "Tile cannot extend outside image" + raise ValueError(msg) + + +class PyDecoder(PyCodec): + """ + Python implementation of a format decoder. Override this class and + add the decoding logic in the :meth:`decode` method. + + See :ref:`Writing Your Own File Codec in Python` + """ + + _pulls_fd = False + + @property + def pulls_fd(self) -> bool: + return self._pulls_fd + + def decode(self, buffer: bytes | Image.SupportsArrayInterface) -> tuple[int, int]: + """ + Override to perform the decoding process. + + :param buffer: A bytes object with the data to be decoded. + :returns: A tuple of ``(bytes consumed, errcode)``. + If finished with decoding return -1 for the bytes consumed. + Err codes are from :data:`.ImageFile.ERRORS`. + """ + msg = "unavailable in base decoder" + raise NotImplementedError(msg) + + def set_as_raw( + self, data: bytes, rawmode: str | None = None, extra: tuple[Any, ...] = () + ) -> None: + """ + Convenience method to set the internal image from a stream of raw data + + :param data: Bytes to be set + :param rawmode: The rawmode to be used for the decoder. + If not specified, it will default to the mode of the image + :param extra: Extra arguments for the decoder. + :returns: None + """ + + if not rawmode: + rawmode = self.mode + d = Image._getdecoder(self.mode, "raw", rawmode, extra) + assert self.im is not None + d.setimage(self.im, self.state.extents()) + s = d.decode(data) + + if s[0] >= 0: + msg = "not enough image data" + raise ValueError(msg) + if s[1] != 0: + msg = "cannot decode image data" + raise ValueError(msg) + + +class PyEncoder(PyCodec): + """ + Python implementation of a format encoder. Override this class and + add the decoding logic in the :meth:`encode` method. + + See :ref:`Writing Your Own File Codec in Python` + """ + + _pushes_fd = False + + @property + def pushes_fd(self) -> bool: + return self._pushes_fd + + def encode(self, bufsize: int) -> tuple[int, int, bytes]: + """ + Override to perform the encoding process. + + :param bufsize: Buffer size. + :returns: A tuple of ``(bytes encoded, errcode, bytes)``. + If finished with encoding return 1 for the error code. + Err codes are from :data:`.ImageFile.ERRORS`. + """ + msg = "unavailable in base encoder" + raise NotImplementedError(msg) + + def encode_to_pyfd(self) -> tuple[int, int]: + """ + If ``pushes_fd`` is ``True``, then this method will be used, + and ``encode()`` will only be called once. + + :returns: A tuple of ``(bytes consumed, errcode)``. + Err codes are from :data:`.ImageFile.ERRORS`. + """ + if not self.pushes_fd: + return 0, -8 # bad configuration + bytes_consumed, errcode, data = self.encode(0) + if data: + assert self.fd is not None + self.fd.write(data) + return bytes_consumed, errcode + + def encode_to_file(self, fh: int, bufsize: int) -> int: + """ + :param fh: File handle. + :param bufsize: Buffer size. + + :returns: If finished successfully, return 0. + Otherwise, return an error code. Err codes are from + :data:`.ImageFile.ERRORS`. + """ + errcode = 0 + while errcode == 0: + status, errcode, buf = self.encode(bufsize) + if status > 0: + os.write(fh, buf[status:]) + return errcode diff --git a/venv/lib/python3.12/site-packages/PIL/ImageFilter.py b/venv/lib/python3.12/site-packages/PIL/ImageFilter.py new file mode 100644 index 0000000..8b0974b --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/ImageFilter.py @@ -0,0 +1,605 @@ +# +# The Python Imaging Library. +# $Id$ +# +# standard filters +# +# History: +# 1995-11-27 fl Created +# 2002-06-08 fl Added rank and mode filters +# 2003-09-15 fl Fixed rank calculation in rank filter; added expand call +# +# Copyright (c) 1997-2003 by Secret Labs AB. +# Copyright (c) 1995-2002 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import abc +import functools +from collections.abc import Sequence +from types import ModuleType +from typing import TYPE_CHECKING, Any, Callable, cast + +if TYPE_CHECKING: + from . import _imaging + from ._typing import NumpyArray + + +class Filter: + @abc.abstractmethod + def filter(self, image: _imaging.ImagingCore) -> _imaging.ImagingCore: + pass + + +class MultibandFilter(Filter): + pass + + +class BuiltinFilter(MultibandFilter): + filterargs: tuple[Any, ...] + + def filter(self, image: _imaging.ImagingCore) -> _imaging.ImagingCore: + if image.mode == "P": + msg = "cannot filter palette images" + raise ValueError(msg) + return image.filter(*self.filterargs) + + +class Kernel(BuiltinFilter): + """ + Create a convolution kernel. This only supports 3x3 and 5x5 integer and floating + point kernels. + + Kernels can only be applied to "L" and "RGB" images. + + :param size: Kernel size, given as (width, height). This must be (3,3) or (5,5). + :param kernel: A sequence containing kernel weights. The kernel will be flipped + vertically before being applied to the image. + :param scale: Scale factor. If given, the result for each pixel is divided by this + value. The default is the sum of the kernel weights. + :param offset: Offset. If given, this value is added to the result, after it has + been divided by the scale factor. + """ + + name = "Kernel" + + def __init__( + self, + size: tuple[int, int], + kernel: Sequence[float], + scale: float | None = None, + offset: float = 0, + ) -> None: + if scale is None: + # default scale is sum of kernel + scale = functools.reduce(lambda a, b: a + b, kernel) + if size[0] * size[1] != len(kernel): + msg = "not enough coefficients in kernel" + raise ValueError(msg) + self.filterargs = size, scale, offset, kernel + + +class RankFilter(Filter): + """ + Create a rank filter. The rank filter sorts all pixels in + a window of the given size, and returns the ``rank``'th value. + + :param size: The kernel size, in pixels. + :param rank: What pixel value to pick. Use 0 for a min filter, + ``size * size / 2`` for a median filter, ``size * size - 1`` + for a max filter, etc. + """ + + name = "Rank" + + def __init__(self, size: int, rank: int) -> None: + self.size = size + self.rank = rank + + def filter(self, image: _imaging.ImagingCore) -> _imaging.ImagingCore: + if image.mode == "P": + msg = "cannot filter palette images" + raise ValueError(msg) + image = image.expand(self.size // 2, self.size // 2) + return image.rankfilter(self.size, self.rank) + + +class MedianFilter(RankFilter): + """ + Create a median filter. Picks the median pixel value in a window with the + given size. + + :param size: The kernel size, in pixels. + """ + + name = "Median" + + def __init__(self, size: int = 3) -> None: + self.size = size + self.rank = size * size // 2 + + +class MinFilter(RankFilter): + """ + Create a min filter. Picks the lowest pixel value in a window with the + given size. + + :param size: The kernel size, in pixels. + """ + + name = "Min" + + def __init__(self, size: int = 3) -> None: + self.size = size + self.rank = 0 + + +class MaxFilter(RankFilter): + """ + Create a max filter. Picks the largest pixel value in a window with the + given size. + + :param size: The kernel size, in pixels. + """ + + name = "Max" + + def __init__(self, size: int = 3) -> None: + self.size = size + self.rank = size * size - 1 + + +class ModeFilter(Filter): + """ + Create a mode filter. Picks the most frequent pixel value in a box with the + given size. Pixel values that occur only once or twice are ignored; if no + pixel value occurs more than twice, the original pixel value is preserved. + + :param size: The kernel size, in pixels. + """ + + name = "Mode" + + def __init__(self, size: int = 3) -> None: + self.size = size + + def filter(self, image: _imaging.ImagingCore) -> _imaging.ImagingCore: + return image.modefilter(self.size) + + +class GaussianBlur(MultibandFilter): + """Blurs the image with a sequence of extended box filters, which + approximates a Gaussian kernel. For details on accuracy see + + + :param radius: Standard deviation of the Gaussian kernel. Either a sequence of two + numbers for x and y, or a single number for both. + """ + + name = "GaussianBlur" + + def __init__(self, radius: float | Sequence[float] = 2) -> None: + self.radius = radius + + def filter(self, image: _imaging.ImagingCore) -> _imaging.ImagingCore: + xy = self.radius + if isinstance(xy, (int, float)): + xy = (xy, xy) + if xy == (0, 0): + return image.copy() + return image.gaussian_blur(xy) + + +class BoxBlur(MultibandFilter): + """Blurs the image by setting each pixel to the average value of the pixels + in a square box extending radius pixels in each direction. + Supports float radius of arbitrary size. Uses an optimized implementation + which runs in linear time relative to the size of the image + for any radius value. + + :param radius: Size of the box in a direction. Either a sequence of two numbers for + x and y, or a single number for both. + + Radius 0 does not blur, returns an identical image. + Radius 1 takes 1 pixel in each direction, i.e. 9 pixels in total. + """ + + name = "BoxBlur" + + def __init__(self, radius: float | Sequence[float]) -> None: + xy = radius if isinstance(radius, (tuple, list)) else (radius, radius) + if xy[0] < 0 or xy[1] < 0: + msg = "radius must be >= 0" + raise ValueError(msg) + self.radius = radius + + def filter(self, image: _imaging.ImagingCore) -> _imaging.ImagingCore: + xy = self.radius + if isinstance(xy, (int, float)): + xy = (xy, xy) + if xy == (0, 0): + return image.copy() + return image.box_blur(xy) + + +class UnsharpMask(MultibandFilter): + """Unsharp mask filter. + + See Wikipedia's entry on `digital unsharp masking`_ for an explanation of + the parameters. + + :param radius: Blur Radius + :param percent: Unsharp strength, in percent + :param threshold: Threshold controls the minimum brightness change that + will be sharpened + + .. _digital unsharp masking: https://en.wikipedia.org/wiki/Unsharp_masking#Digital_unsharp_masking + + """ + + name = "UnsharpMask" + + def __init__( + self, radius: float = 2, percent: int = 150, threshold: int = 3 + ) -> None: + self.radius = radius + self.percent = percent + self.threshold = threshold + + def filter(self, image: _imaging.ImagingCore) -> _imaging.ImagingCore: + return image.unsharp_mask(self.radius, self.percent, self.threshold) + + +class BLUR(BuiltinFilter): + name = "Blur" + # fmt: off + filterargs = (5, 5), 16, 0, ( + 1, 1, 1, 1, 1, + 1, 0, 0, 0, 1, + 1, 0, 0, 0, 1, + 1, 0, 0, 0, 1, + 1, 1, 1, 1, 1, + ) + # fmt: on + + +class CONTOUR(BuiltinFilter): + name = "Contour" + # fmt: off + filterargs = (3, 3), 1, 255, ( + -1, -1, -1, + -1, 8, -1, + -1, -1, -1, + ) + # fmt: on + + +class DETAIL(BuiltinFilter): + name = "Detail" + # fmt: off + filterargs = (3, 3), 6, 0, ( + 0, -1, 0, + -1, 10, -1, + 0, -1, 0, + ) + # fmt: on + + +class EDGE_ENHANCE(BuiltinFilter): + name = "Edge-enhance" + # fmt: off + filterargs = (3, 3), 2, 0, ( + -1, -1, -1, + -1, 10, -1, + -1, -1, -1, + ) + # fmt: on + + +class EDGE_ENHANCE_MORE(BuiltinFilter): + name = "Edge-enhance More" + # fmt: off + filterargs = (3, 3), 1, 0, ( + -1, -1, -1, + -1, 9, -1, + -1, -1, -1, + ) + # fmt: on + + +class EMBOSS(BuiltinFilter): + name = "Emboss" + # fmt: off + filterargs = (3, 3), 1, 128, ( + -1, 0, 0, + 0, 1, 0, + 0, 0, 0, + ) + # fmt: on + + +class FIND_EDGES(BuiltinFilter): + name = "Find Edges" + # fmt: off + filterargs = (3, 3), 1, 0, ( + -1, -1, -1, + -1, 8, -1, + -1, -1, -1, + ) + # fmt: on + + +class SHARPEN(BuiltinFilter): + name = "Sharpen" + # fmt: off + filterargs = (3, 3), 16, 0, ( + -2, -2, -2, + -2, 32, -2, + -2, -2, -2, + ) + # fmt: on + + +class SMOOTH(BuiltinFilter): + name = "Smooth" + # fmt: off + filterargs = (3, 3), 13, 0, ( + 1, 1, 1, + 1, 5, 1, + 1, 1, 1, + ) + # fmt: on + + +class SMOOTH_MORE(BuiltinFilter): + name = "Smooth More" + # fmt: off + filterargs = (5, 5), 100, 0, ( + 1, 1, 1, 1, 1, + 1, 5, 5, 5, 1, + 1, 5, 44, 5, 1, + 1, 5, 5, 5, 1, + 1, 1, 1, 1, 1, + ) + # fmt: on + + +class Color3DLUT(MultibandFilter): + """Three-dimensional color lookup table. + + Transforms 3-channel pixels using the values of the channels as coordinates + in the 3D lookup table and interpolating the nearest elements. + + This method allows you to apply almost any color transformation + in constant time by using pre-calculated decimated tables. + + .. versionadded:: 5.2.0 + + :param size: Size of the table. One int or tuple of (int, int, int). + Minimal size in any dimension is 2, maximum is 65. + :param table: Flat lookup table. A list of ``channels * size**3`` + float elements or a list of ``size**3`` channels-sized + tuples with floats. Channels are changed first, + then first dimension, then second, then third. + Value 0.0 corresponds lowest value of output, 1.0 highest. + :param channels: Number of channels in the table. Could be 3 or 4. + Default is 3. + :param target_mode: A mode for the result image. Should have not less + than ``channels`` channels. Default is ``None``, + which means that mode wouldn't be changed. + """ + + name = "Color 3D LUT" + + def __init__( + self, + size: int | tuple[int, int, int], + table: Sequence[float] | Sequence[Sequence[int]] | NumpyArray, + channels: int = 3, + target_mode: str | None = None, + **kwargs: bool, + ) -> None: + if channels not in (3, 4): + msg = "Only 3 or 4 output channels are supported" + raise ValueError(msg) + self.size = size = self._check_size(size) + self.channels = channels + self.mode = target_mode + + # Hidden flag `_copy_table=False` could be used to avoid extra copying + # of the table if the table is specially made for the constructor. + copy_table = kwargs.get("_copy_table", True) + items = size[0] * size[1] * size[2] + wrong_size = False + + numpy: ModuleType | None = None + if hasattr(table, "shape"): + try: + import numpy + except ImportError: + pass + + if numpy and isinstance(table, numpy.ndarray): + numpy_table: NumpyArray = table + if copy_table: + numpy_table = numpy_table.copy() + + if numpy_table.shape in [ + (items * channels,), + (items, channels), + (size[2], size[1], size[0], channels), + ]: + table = numpy_table.reshape(items * channels) + else: + wrong_size = True + + else: + if copy_table: + table = list(table) + + # Convert to a flat list + if table and isinstance(table[0], (list, tuple)): + raw_table = cast(Sequence[Sequence[int]], table) + flat_table: list[int] = [] + for pixel in raw_table: + if len(pixel) != channels: + msg = ( + "The elements of the table should " + f"have a length of {channels}." + ) + raise ValueError(msg) + flat_table.extend(pixel) + table = flat_table + + if wrong_size or len(table) != items * channels: + msg = ( + "The table should have either channels * size**3 float items " + "or size**3 items of channels-sized tuples with floats. " + f"Table should be: {channels}x{size[0]}x{size[1]}x{size[2]}. " + f"Actual length: {len(table)}" + ) + raise ValueError(msg) + self.table = table + + @staticmethod + def _check_size(size: Any) -> tuple[int, int, int]: + try: + _, _, _ = size + except ValueError as e: + msg = "Size should be either an integer or a tuple of three integers." + raise ValueError(msg) from e + except TypeError: + size = (size, size, size) + size = tuple(int(x) for x in size) + for size_1d in size: + if not 2 <= size_1d <= 65: + msg = "Size should be in [2, 65] range." + raise ValueError(msg) + return size + + @classmethod + def generate( + cls, + size: int | tuple[int, int, int], + callback: Callable[[float, float, float], tuple[float, ...]], + channels: int = 3, + target_mode: str | None = None, + ) -> Color3DLUT: + """Generates new LUT using provided callback. + + :param size: Size of the table. Passed to the constructor. + :param callback: Function with three parameters which correspond + three color channels. Will be called ``size**3`` + times with values from 0.0 to 1.0 and should return + a tuple with ``channels`` elements. + :param channels: The number of channels which should return callback. + :param target_mode: Passed to the constructor of the resulting + lookup table. + """ + size_1d, size_2d, size_3d = cls._check_size(size) + if channels not in (3, 4): + msg = "Only 3 or 4 output channels are supported" + raise ValueError(msg) + + table: list[float] = [0] * (size_1d * size_2d * size_3d * channels) + idx_out = 0 + for b in range(size_3d): + for g in range(size_2d): + for r in range(size_1d): + table[idx_out : idx_out + channels] = callback( + r / (size_1d - 1), g / (size_2d - 1), b / (size_3d - 1) + ) + idx_out += channels + + return cls( + (size_1d, size_2d, size_3d), + table, + channels=channels, + target_mode=target_mode, + _copy_table=False, + ) + + def transform( + self, + callback: Callable[..., tuple[float, ...]], + with_normals: bool = False, + channels: int | None = None, + target_mode: str | None = None, + ) -> Color3DLUT: + """Transforms the table values using provided callback and returns + a new LUT with altered values. + + :param callback: A function which takes old lookup table values + and returns a new set of values. The number + of arguments which function should take is + ``self.channels`` or ``3 + self.channels`` + if ``with_normals`` flag is set. + Should return a tuple of ``self.channels`` or + ``channels`` elements if it is set. + :param with_normals: If true, ``callback`` will be called with + coordinates in the color cube as the first + three arguments. Otherwise, ``callback`` + will be called only with actual color values. + :param channels: The number of channels in the resulting lookup table. + :param target_mode: Passed to the constructor of the resulting + lookup table. + """ + if channels not in (None, 3, 4): + msg = "Only 3 or 4 output channels are supported" + raise ValueError(msg) + ch_in = self.channels + ch_out = channels or ch_in + size_1d, size_2d, size_3d = self.size + + table = [0] * (size_1d * size_2d * size_3d * ch_out) + idx_in = 0 + idx_out = 0 + for b in range(size_3d): + for g in range(size_2d): + for r in range(size_1d): + values = self.table[idx_in : idx_in + ch_in] + if with_normals: + values = callback( + r / (size_1d - 1), + g / (size_2d - 1), + b / (size_3d - 1), + *values, + ) + else: + values = callback(*values) + table[idx_out : idx_out + ch_out] = values + idx_in += ch_in + idx_out += ch_out + + return type(self)( + self.size, + table, + channels=ch_out, + target_mode=target_mode or self.mode, + _copy_table=False, + ) + + def __repr__(self) -> str: + r = [ + f"{self.__class__.__name__} from {self.table.__class__.__name__}", + "size={:d}x{:d}x{:d}".format(*self.size), + f"channels={self.channels:d}", + ] + if self.mode: + r.append(f"target_mode={self.mode}") + return "<{}>".format(" ".join(r)) + + def filter(self, image: _imaging.ImagingCore) -> _imaging.ImagingCore: + from . import Image + + return image.color_lut_3d( + self.mode or image.mode, + Image.Resampling.BILINEAR, + self.channels, + self.size[0], + self.size[1], + self.size[2], + self.table, + ) diff --git a/venv/lib/python3.12/site-packages/PIL/ImageFont.py b/venv/lib/python3.12/site-packages/PIL/ImageFont.py new file mode 100644 index 0000000..b694b81 --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/ImageFont.py @@ -0,0 +1,1338 @@ +# +# The Python Imaging Library. +# $Id$ +# +# PIL raster font management +# +# History: +# 1996-08-07 fl created (experimental) +# 1997-08-25 fl minor adjustments to handle fonts from pilfont 0.3 +# 1999-02-06 fl rewrote most font management stuff in C +# 1999-03-17 fl take pth files into account in load_path (from Richard Jones) +# 2001-02-17 fl added freetype support +# 2001-05-09 fl added TransposedFont wrapper class +# 2002-03-04 fl make sure we have a "L" or "1" font +# 2002-12-04 fl skip non-directory entries in the system path +# 2003-04-29 fl add embedded default font +# 2003-09-27 fl added support for truetype charmap encodings +# +# Todo: +# Adapt to PILFONT2 format (16-bit fonts, compressed, single file) +# +# Copyright (c) 1997-2003 by Secret Labs AB +# Copyright (c) 1996-2003 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +from __future__ import annotations + +import base64 +import os +import sys +import warnings +from enum import IntEnum +from io import BytesIO +from types import ModuleType +from typing import IO, TYPE_CHECKING, Any, BinaryIO, TypedDict, cast + +from . import Image, features +from ._typing import StrOrBytesPath +from ._util import DeferredError, is_path + +if TYPE_CHECKING: + from . import ImageFile + from ._imaging import ImagingFont + from ._imagingft import Font + + +class Axis(TypedDict): + minimum: int | None + default: int | None + maximum: int | None + name: bytes | None + + +class Layout(IntEnum): + BASIC = 0 + RAQM = 1 + + +MAX_STRING_LENGTH = 1_000_000 + + +core: ModuleType | DeferredError +try: + from . import _imagingft as core +except ImportError as ex: + core = DeferredError.new(ex) + + +def _string_length_check(text: str | bytes | bytearray) -> None: + if MAX_STRING_LENGTH is not None and len(text) > MAX_STRING_LENGTH: + msg = "too many characters in string" + raise ValueError(msg) + + +# FIXME: add support for pilfont2 format (see FontFile.py) + +# -------------------------------------------------------------------- +# Font metrics format: +# "PILfont" LF +# fontdescriptor LF +# (optional) key=value... LF +# "DATA" LF +# binary data: 256*10*2 bytes (dx, dy, dstbox, srcbox) +# +# To place a character, cut out srcbox and paste at dstbox, +# relative to the character position. Then move the character +# position according to dx, dy. +# -------------------------------------------------------------------- + + +class ImageFont: + """PIL font wrapper""" + + font: ImagingFont + + def _load_pilfont(self, filename: str) -> None: + with open(filename, "rb") as fp: + image: ImageFile.ImageFile | None = None + root = os.path.splitext(filename)[0] + + for ext in (".png", ".gif", ".pbm"): + if image: + image.close() + try: + fullname = root + ext + image = Image.open(fullname) + except Exception: + pass + else: + if image and image.mode in ("1", "L"): + break + else: + if image: + image.close() + + msg = f"cannot find glyph data file {root}.{{gif|pbm|png}}" + raise OSError(msg) + + self.file = fullname + + self._load_pilfont_data(fp, image) + image.close() + + def _load_pilfont_data(self, file: IO[bytes], image: Image.Image) -> None: + # read PILfont header + if file.readline() != b"PILfont\n": + msg = "Not a PILfont file" + raise SyntaxError(msg) + file.readline().split(b";") + self.info = [] # FIXME: should be a dictionary + while True: + s = file.readline() + if not s or s == b"DATA\n": + break + self.info.append(s) + + # read PILfont metrics + data = file.read(256 * 20) + + # check image + if image.mode not in ("1", "L"): + msg = "invalid font image mode" + raise TypeError(msg) + + image.load() + + self.font = Image.core.font(image.im, data) + + def getmask( + self, text: str | bytes, mode: str = "", *args: Any, **kwargs: Any + ) -> Image.core.ImagingCore: + """ + Create a bitmap for the text. + + If the font uses antialiasing, the bitmap should have mode ``L`` and use a + maximum value of 255. Otherwise, it should have mode ``1``. + + :param text: Text to render. + :param mode: Used by some graphics drivers to indicate what mode the + driver prefers; if empty, the renderer may return either + mode. Note that the mode is always a string, to simplify + C-level implementations. + + .. versionadded:: 1.1.5 + + :return: An internal PIL storage memory instance as defined by the + :py:mod:`PIL.Image.core` interface module. + """ + _string_length_check(text) + Image._decompression_bomb_check(self.font.getsize(text)) + return self.font.getmask(text, mode) + + def getbbox( + self, text: str | bytes | bytearray, *args: Any, **kwargs: Any + ) -> tuple[int, int, int, int]: + """ + Returns bounding box (in pixels) of given text. + + .. versionadded:: 9.2.0 + + :param text: Text to render. + + :return: ``(left, top, right, bottom)`` bounding box + """ + _string_length_check(text) + width, height = self.font.getsize(text) + return 0, 0, width, height + + def getlength( + self, text: str | bytes | bytearray, *args: Any, **kwargs: Any + ) -> int: + """ + Returns length (in pixels) of given text. + This is the amount by which following text should be offset. + + .. versionadded:: 9.2.0 + """ + _string_length_check(text) + width, height = self.font.getsize(text) + return width + + +## +# Wrapper for FreeType fonts. Application code should use the +# truetype factory function to create font objects. + + +class FreeTypeFont: + """FreeType font wrapper (requires _imagingft service)""" + + font: Font + font_bytes: bytes + + def __init__( + self, + font: StrOrBytesPath | BinaryIO, + size: float = 10, + index: int = 0, + encoding: str = "", + layout_engine: Layout | None = None, + ) -> None: + # FIXME: use service provider instead + + if isinstance(core, DeferredError): + raise core.ex + + if size <= 0: + msg = f"font size must be greater than 0, not {size}" + raise ValueError(msg) + + self.path = font + self.size = size + self.index = index + self.encoding = encoding + + try: + from packaging.version import parse as parse_version + except ImportError: + pass + else: + if freetype_version := features.version_module("freetype2"): + if parse_version(freetype_version) < parse_version("2.9.1"): + warnings.warn( + "Support for FreeType 2.9.0 is deprecated and will be removed " + "in Pillow 12 (2025-10-15). Please upgrade to FreeType 2.9.1 " + "or newer, preferably FreeType 2.10.4 which fixes " + "CVE-2020-15999.", + DeprecationWarning, + ) + + if layout_engine not in (Layout.BASIC, Layout.RAQM): + layout_engine = Layout.BASIC + if core.HAVE_RAQM: + layout_engine = Layout.RAQM + elif layout_engine == Layout.RAQM and not core.HAVE_RAQM: + warnings.warn( + "Raqm layout was requested, but Raqm is not available. " + "Falling back to basic layout." + ) + layout_engine = Layout.BASIC + + self.layout_engine = layout_engine + + def load_from_bytes(f: IO[bytes]) -> None: + self.font_bytes = f.read() + self.font = core.getfont( + "", size, index, encoding, self.font_bytes, layout_engine + ) + + if is_path(font): + font = os.path.realpath(os.fspath(font)) + if sys.platform == "win32": + font_bytes_path = font if isinstance(font, bytes) else font.encode() + try: + font_bytes_path.decode("ascii") + except UnicodeDecodeError: + # FreeType cannot load fonts with non-ASCII characters on Windows + # So load it into memory first + with open(font, "rb") as f: + load_from_bytes(f) + return + self.font = core.getfont( + font, size, index, encoding, layout_engine=layout_engine + ) + else: + load_from_bytes(cast(IO[bytes], font)) + + def __getstate__(self) -> list[Any]: + return [self.path, self.size, self.index, self.encoding, self.layout_engine] + + def __setstate__(self, state: list[Any]) -> None: + path, size, index, encoding, layout_engine = state + FreeTypeFont.__init__(self, path, size, index, encoding, layout_engine) + + def getname(self) -> tuple[str | None, str | None]: + """ + :return: A tuple of the font family (e.g. Helvetica) and the font style + (e.g. Bold) + """ + return self.font.family, self.font.style + + def getmetrics(self) -> tuple[int, int]: + """ + :return: A tuple of the font ascent (the distance from the baseline to + the highest outline point) and descent (the distance from the + baseline to the lowest outline point, a negative value) + """ + return self.font.ascent, self.font.descent + + def getlength( + self, + text: str | bytes, + mode: str = "", + direction: str | None = None, + features: list[str] | None = None, + language: str | None = None, + ) -> float: + """ + Returns length (in pixels with 1/64 precision) of given text when rendered + in font with provided direction, features, and language. + + This is the amount by which following text should be offset. + Text bounding box may extend past the length in some fonts, + e.g. when using italics or accents. + + The result is returned as a float; it is a whole number if using basic layout. + + Note that the sum of two lengths may not equal the length of a concatenated + string due to kerning. If you need to adjust for kerning, include the following + character and subtract its length. + + For example, instead of :: + + hello = font.getlength("Hello") + world = font.getlength("World") + hello_world = hello + world # not adjusted for kerning + assert hello_world == font.getlength("HelloWorld") # may fail + + use :: + + hello = font.getlength("HelloW") - font.getlength("W") # adjusted for kerning + world = font.getlength("World") + hello_world = hello + world # adjusted for kerning + assert hello_world == font.getlength("HelloWorld") # True + + or disable kerning with (requires libraqm) :: + + hello = draw.textlength("Hello", font, features=["-kern"]) + world = draw.textlength("World", font, features=["-kern"]) + hello_world = hello + world # kerning is disabled, no need to adjust + assert hello_world == draw.textlength("HelloWorld", font, features=["-kern"]) + + .. versionadded:: 8.0.0 + + :param text: Text to measure. + :param mode: Used by some graphics drivers to indicate what mode the + driver prefers; if empty, the renderer may return either + mode. Note that the mode is always a string, to simplify + C-level implementations. + + :param direction: Direction of the text. It can be 'rtl' (right to + left), 'ltr' (left to right) or 'ttb' (top to bottom). + Requires libraqm. + + :param features: A list of OpenType font features to be used during text + layout. This is usually used to turn on optional + font features that are not enabled by default, + for example 'dlig' or 'ss01', but can be also + used to turn off default font features for + example '-liga' to disable ligatures or '-kern' + to disable kerning. To get all supported + features, see + https://learn.microsoft.com/en-us/typography/opentype/spec/featurelist + Requires libraqm. + + :param language: Language of the text. Different languages may use + different glyph shapes or ligatures. This parameter tells + the font which language the text is in, and to apply the + correct substitutions as appropriate, if available. + It should be a `BCP 47 language code + `_ + Requires libraqm. + + :return: Either width for horizontal text, or height for vertical text. + """ + _string_length_check(text) + return self.font.getlength(text, mode, direction, features, language) / 64 + + def getbbox( + self, + text: str | bytes, + mode: str = "", + direction: str | None = None, + features: list[str] | None = None, + language: str | None = None, + stroke_width: float = 0, + anchor: str | None = None, + ) -> tuple[float, float, float, float]: + """ + Returns bounding box (in pixels) of given text relative to given anchor + when rendered in font with provided direction, features, and language. + + Use :py:meth:`getlength()` to get the offset of following text with + 1/64 pixel precision. The bounding box includes extra margins for + some fonts, e.g. italics or accents. + + .. versionadded:: 8.0.0 + + :param text: Text to render. + :param mode: Used by some graphics drivers to indicate what mode the + driver prefers; if empty, the renderer may return either + mode. Note that the mode is always a string, to simplify + C-level implementations. + + :param direction: Direction of the text. It can be 'rtl' (right to + left), 'ltr' (left to right) or 'ttb' (top to bottom). + Requires libraqm. + + :param features: A list of OpenType font features to be used during text + layout. This is usually used to turn on optional + font features that are not enabled by default, + for example 'dlig' or 'ss01', but can be also + used to turn off default font features for + example '-liga' to disable ligatures or '-kern' + to disable kerning. To get all supported + features, see + https://learn.microsoft.com/en-us/typography/opentype/spec/featurelist + Requires libraqm. + + :param language: Language of the text. Different languages may use + different glyph shapes or ligatures. This parameter tells + the font which language the text is in, and to apply the + correct substitutions as appropriate, if available. + It should be a `BCP 47 language code + `_ + Requires libraqm. + + :param stroke_width: The width of the text stroke. + + :param anchor: The text anchor alignment. Determines the relative location of + the anchor to the text. The default alignment is top left, + specifically ``la`` for horizontal text and ``lt`` for + vertical text. See :ref:`text-anchors` for details. + + :return: ``(left, top, right, bottom)`` bounding box + """ + _string_length_check(text) + size, offset = self.font.getsize( + text, mode, direction, features, language, anchor + ) + left, top = offset[0] - stroke_width, offset[1] - stroke_width + width, height = size[0] + 2 * stroke_width, size[1] + 2 * stroke_width + return left, top, left + width, top + height + + def getmask( + self, + text: str | bytes, + mode: str = "", + direction: str | None = None, + features: list[str] | None = None, + language: str | None = None, + stroke_width: float = 0, + anchor: str | None = None, + ink: int = 0, + start: tuple[float, float] | None = None, + ) -> Image.core.ImagingCore: + """ + Create a bitmap for the text. + + If the font uses antialiasing, the bitmap should have mode ``L`` and use a + maximum value of 255. If the font has embedded color data, the bitmap + should have mode ``RGBA``. Otherwise, it should have mode ``1``. + + :param text: Text to render. + :param mode: Used by some graphics drivers to indicate what mode the + driver prefers; if empty, the renderer may return either + mode. Note that the mode is always a string, to simplify + C-level implementations. + + .. versionadded:: 1.1.5 + + :param direction: Direction of the text. It can be 'rtl' (right to + left), 'ltr' (left to right) or 'ttb' (top to bottom). + Requires libraqm. + + .. versionadded:: 4.2.0 + + :param features: A list of OpenType font features to be used during text + layout. This is usually used to turn on optional + font features that are not enabled by default, + for example 'dlig' or 'ss01', but can be also + used to turn off default font features for + example '-liga' to disable ligatures or '-kern' + to disable kerning. To get all supported + features, see + https://learn.microsoft.com/en-us/typography/opentype/spec/featurelist + Requires libraqm. + + .. versionadded:: 4.2.0 + + :param language: Language of the text. Different languages may use + different glyph shapes or ligatures. This parameter tells + the font which language the text is in, and to apply the + correct substitutions as appropriate, if available. + It should be a `BCP 47 language code + `_ + Requires libraqm. + + .. versionadded:: 6.0.0 + + :param stroke_width: The width of the text stroke. + + .. versionadded:: 6.2.0 + + :param anchor: The text anchor alignment. Determines the relative location of + the anchor to the text. The default alignment is top left, + specifically ``la`` for horizontal text and ``lt`` for + vertical text. See :ref:`text-anchors` for details. + + .. versionadded:: 8.0.0 + + :param ink: Foreground ink for rendering in RGBA mode. + + .. versionadded:: 8.0.0 + + :param start: Tuple of horizontal and vertical offset, as text may render + differently when starting at fractional coordinates. + + .. versionadded:: 9.4.0 + + :return: An internal PIL storage memory instance as defined by the + :py:mod:`PIL.Image.core` interface module. + """ + return self.getmask2( + text, + mode, + direction=direction, + features=features, + language=language, + stroke_width=stroke_width, + anchor=anchor, + ink=ink, + start=start, + )[0] + + def getmask2( + self, + text: str | bytes, + mode: str = "", + direction: str | None = None, + features: list[str] | None = None, + language: str | None = None, + stroke_width: float = 0, + anchor: str | None = None, + ink: int = 0, + start: tuple[float, float] | None = None, + *args: Any, + **kwargs: Any, + ) -> tuple[Image.core.ImagingCore, tuple[int, int]]: + """ + Create a bitmap for the text. + + If the font uses antialiasing, the bitmap should have mode ``L`` and use a + maximum value of 255. If the font has embedded color data, the bitmap + should have mode ``RGBA``. Otherwise, it should have mode ``1``. + + :param text: Text to render. + :param mode: Used by some graphics drivers to indicate what mode the + driver prefers; if empty, the renderer may return either + mode. Note that the mode is always a string, to simplify + C-level implementations. + + .. versionadded:: 1.1.5 + + :param direction: Direction of the text. It can be 'rtl' (right to + left), 'ltr' (left to right) or 'ttb' (top to bottom). + Requires libraqm. + + .. versionadded:: 4.2.0 + + :param features: A list of OpenType font features to be used during text + layout. This is usually used to turn on optional + font features that are not enabled by default, + for example 'dlig' or 'ss01', but can be also + used to turn off default font features for + example '-liga' to disable ligatures or '-kern' + to disable kerning. To get all supported + features, see + https://learn.microsoft.com/en-us/typography/opentype/spec/featurelist + Requires libraqm. + + .. versionadded:: 4.2.0 + + :param language: Language of the text. Different languages may use + different glyph shapes or ligatures. This parameter tells + the font which language the text is in, and to apply the + correct substitutions as appropriate, if available. + It should be a `BCP 47 language code + `_ + Requires libraqm. + + .. versionadded:: 6.0.0 + + :param stroke_width: The width of the text stroke. + + .. versionadded:: 6.2.0 + + :param anchor: The text anchor alignment. Determines the relative location of + the anchor to the text. The default alignment is top left, + specifically ``la`` for horizontal text and ``lt`` for + vertical text. See :ref:`text-anchors` for details. + + .. versionadded:: 8.0.0 + + :param ink: Foreground ink for rendering in RGBA mode. + + .. versionadded:: 8.0.0 + + :param start: Tuple of horizontal and vertical offset, as text may render + differently when starting at fractional coordinates. + + .. versionadded:: 9.4.0 + + :return: A tuple of an internal PIL storage memory instance as defined by the + :py:mod:`PIL.Image.core` interface module, and the text offset, the + gap between the starting coordinate and the first marking + """ + _string_length_check(text) + if start is None: + start = (0, 0) + + def fill(width: int, height: int) -> Image.core.ImagingCore: + size = (width, height) + Image._decompression_bomb_check(size) + return Image.core.fill("RGBA" if mode == "RGBA" else "L", size) + + return self.font.render( + text, + fill, + mode, + direction, + features, + language, + stroke_width, + anchor, + ink, + start[0], + start[1], + ) + + def font_variant( + self, + font: StrOrBytesPath | BinaryIO | None = None, + size: float | None = None, + index: int | None = None, + encoding: str | None = None, + layout_engine: Layout | None = None, + ) -> FreeTypeFont: + """ + Create a copy of this FreeTypeFont object, + using any specified arguments to override the settings. + + Parameters are identical to the parameters used to initialize this + object. + + :return: A FreeTypeFont object. + """ + if font is None: + try: + font = BytesIO(self.font_bytes) + except AttributeError: + font = self.path + return FreeTypeFont( + font=font, + size=self.size if size is None else size, + index=self.index if index is None else index, + encoding=self.encoding if encoding is None else encoding, + layout_engine=layout_engine or self.layout_engine, + ) + + def get_variation_names(self) -> list[bytes]: + """ + :returns: A list of the named styles in a variation font. + :exception OSError: If the font is not a variation font. + """ + try: + names = self.font.getvarnames() + except AttributeError as e: + msg = "FreeType 2.9.1 or greater is required" + raise NotImplementedError(msg) from e + return [name.replace(b"\x00", b"") for name in names] + + def set_variation_by_name(self, name: str | bytes) -> None: + """ + :param name: The name of the style. + :exception OSError: If the font is not a variation font. + """ + names = self.get_variation_names() + if not isinstance(name, bytes): + name = name.encode() + index = names.index(name) + 1 + + if index == getattr(self, "_last_variation_index", None): + # When the same name is set twice in a row, + # there is an 'unknown freetype error' + # https://savannah.nongnu.org/bugs/?56186 + return + self._last_variation_index = index + + self.font.setvarname(index) + + def get_variation_axes(self) -> list[Axis]: + """ + :returns: A list of the axes in a variation font. + :exception OSError: If the font is not a variation font. + """ + try: + axes = self.font.getvaraxes() + except AttributeError as e: + msg = "FreeType 2.9.1 or greater is required" + raise NotImplementedError(msg) from e + for axis in axes: + if axis["name"]: + axis["name"] = axis["name"].replace(b"\x00", b"") + return axes + + def set_variation_by_axes(self, axes: list[float]) -> None: + """ + :param axes: A list of values for each axis. + :exception OSError: If the font is not a variation font. + """ + try: + self.font.setvaraxes(axes) + except AttributeError as e: + msg = "FreeType 2.9.1 or greater is required" + raise NotImplementedError(msg) from e + + +class TransposedFont: + """Wrapper for writing rotated or mirrored text""" + + def __init__( + self, font: ImageFont | FreeTypeFont, orientation: Image.Transpose | None = None + ): + """ + Wrapper that creates a transposed font from any existing font + object. + + :param font: A font object. + :param orientation: An optional orientation. If given, this should + be one of Image.Transpose.FLIP_LEFT_RIGHT, Image.Transpose.FLIP_TOP_BOTTOM, + Image.Transpose.ROTATE_90, Image.Transpose.ROTATE_180, or + Image.Transpose.ROTATE_270. + """ + self.font = font + self.orientation = orientation # any 'transpose' argument, or None + + def getmask( + self, text: str | bytes, mode: str = "", *args: Any, **kwargs: Any + ) -> Image.core.ImagingCore: + im = self.font.getmask(text, mode, *args, **kwargs) + if self.orientation is not None: + return im.transpose(self.orientation) + return im + + def getbbox( + self, text: str | bytes, *args: Any, **kwargs: Any + ) -> tuple[int, int, float, float]: + # TransposedFont doesn't support getmask2, move top-left point to (0, 0) + # this has no effect on ImageFont and simulates anchor="lt" for FreeTypeFont + left, top, right, bottom = self.font.getbbox(text, *args, **kwargs) + width = right - left + height = bottom - top + if self.orientation in (Image.Transpose.ROTATE_90, Image.Transpose.ROTATE_270): + return 0, 0, height, width + return 0, 0, width, height + + def getlength(self, text: str | bytes, *args: Any, **kwargs: Any) -> float: + if self.orientation in (Image.Transpose.ROTATE_90, Image.Transpose.ROTATE_270): + msg = "text length is undefined for text rotated by 90 or 270 degrees" + raise ValueError(msg) + return self.font.getlength(text, *args, **kwargs) + + +def load(filename: str) -> ImageFont: + """ + Load a font file. This function loads a font object from the given + bitmap font file, and returns the corresponding font object. For loading TrueType + or OpenType fonts instead, see :py:func:`~PIL.ImageFont.truetype`. + + :param filename: Name of font file. + :return: A font object. + :exception OSError: If the file could not be read. + """ + f = ImageFont() + f._load_pilfont(filename) + return f + + +def truetype( + font: StrOrBytesPath | BinaryIO, + size: float = 10, + index: int = 0, + encoding: str = "", + layout_engine: Layout | None = None, +) -> FreeTypeFont: + """ + Load a TrueType or OpenType font from a file or file-like object, + and create a font object. This function loads a font object from the given + file or file-like object, and creates a font object for a font of the given + size. For loading bitmap fonts instead, see :py:func:`~PIL.ImageFont.load` + and :py:func:`~PIL.ImageFont.load_path`. + + Pillow uses FreeType to open font files. On Windows, be aware that FreeType + will keep the file open as long as the FreeTypeFont object exists. Windows + limits the number of files that can be open in C at once to 512, so if many + fonts are opened simultaneously and that limit is approached, an + ``OSError`` may be thrown, reporting that FreeType "cannot open resource". + A workaround would be to copy the file(s) into memory, and open that instead. + + This function requires the _imagingft service. + + :param font: A filename or file-like object containing a TrueType font. + If the file is not found in this filename, the loader may also + search in other directories, such as: + + * The :file:`fonts/` directory on Windows, + * :file:`/Library/Fonts/`, :file:`/System/Library/Fonts/` + and :file:`~/Library/Fonts/` on macOS. + * :file:`~/.local/share/fonts`, :file:`/usr/local/share/fonts`, + and :file:`/usr/share/fonts` on Linux; or those specified by + the ``XDG_DATA_HOME`` and ``XDG_DATA_DIRS`` environment variables + for user-installed and system-wide fonts, respectively. + + :param size: The requested size, in pixels. + :param index: Which font face to load (default is first available face). + :param encoding: Which font encoding to use (default is Unicode). Possible + encodings include (see the FreeType documentation for more + information): + + * "unic" (Unicode) + * "symb" (Microsoft Symbol) + * "ADOB" (Adobe Standard) + * "ADBE" (Adobe Expert) + * "ADBC" (Adobe Custom) + * "armn" (Apple Roman) + * "sjis" (Shift JIS) + * "gb " (PRC) + * "big5" + * "wans" (Extended Wansung) + * "joha" (Johab) + * "lat1" (Latin-1) + + This specifies the character set to use. It does not alter the + encoding of any text provided in subsequent operations. + :param layout_engine: Which layout engine to use, if available: + :attr:`.ImageFont.Layout.BASIC` or :attr:`.ImageFont.Layout.RAQM`. + If it is available, Raqm layout will be used by default. + Otherwise, basic layout will be used. + + Raqm layout is recommended for all non-English text. If Raqm layout + is not required, basic layout will have better performance. + + You can check support for Raqm layout using + :py:func:`PIL.features.check_feature` with ``feature="raqm"``. + + .. versionadded:: 4.2.0 + :return: A font object. + :exception OSError: If the file could not be read. + :exception ValueError: If the font size is not greater than zero. + """ + + def freetype(font: StrOrBytesPath | BinaryIO) -> FreeTypeFont: + return FreeTypeFont(font, size, index, encoding, layout_engine) + + try: + return freetype(font) + except OSError: + if not is_path(font): + raise + ttf_filename = os.path.basename(font) + + dirs = [] + if sys.platform == "win32": + # check the windows font repository + # NOTE: must use uppercase WINDIR, to work around bugs in + # 1.5.2's os.environ.get() + windir = os.environ.get("WINDIR") + if windir: + dirs.append(os.path.join(windir, "fonts")) + elif sys.platform in ("linux", "linux2"): + data_home = os.environ.get("XDG_DATA_HOME") + if not data_home: + # The freedesktop spec defines the following default directory for + # when XDG_DATA_HOME is unset or empty. This user-level directory + # takes precedence over system-level directories. + data_home = os.path.expanduser("~/.local/share") + xdg_dirs = [data_home] + + data_dirs = os.environ.get("XDG_DATA_DIRS") + if not data_dirs: + # Similarly, defaults are defined for the system-level directories + data_dirs = "/usr/local/share:/usr/share" + xdg_dirs += data_dirs.split(":") + + dirs += [os.path.join(xdg_dir, "fonts") for xdg_dir in xdg_dirs] + elif sys.platform == "darwin": + dirs += [ + "/Library/Fonts", + "/System/Library/Fonts", + os.path.expanduser("~/Library/Fonts"), + ] + + ext = os.path.splitext(ttf_filename)[1] + first_font_with_a_different_extension = None + for directory in dirs: + for walkroot, walkdir, walkfilenames in os.walk(directory): + for walkfilename in walkfilenames: + if ext and walkfilename == ttf_filename: + return freetype(os.path.join(walkroot, walkfilename)) + elif not ext and os.path.splitext(walkfilename)[0] == ttf_filename: + fontpath = os.path.join(walkroot, walkfilename) + if os.path.splitext(fontpath)[1] == ".ttf": + return freetype(fontpath) + if not ext and first_font_with_a_different_extension is None: + first_font_with_a_different_extension = fontpath + if first_font_with_a_different_extension: + return freetype(first_font_with_a_different_extension) + raise + + +def load_path(filename: str | bytes) -> ImageFont: + """ + Load font file. Same as :py:func:`~PIL.ImageFont.load`, but searches for a + bitmap font along the Python path. + + :param filename: Name of font file. + :return: A font object. + :exception OSError: If the file could not be read. + """ + if not isinstance(filename, str): + filename = filename.decode("utf-8") + for directory in sys.path: + try: + return load(os.path.join(directory, filename)) + except OSError: + pass + msg = f'cannot find font file "{filename}" in sys.path' + if os.path.exists(filename): + msg += f', did you mean ImageFont.load("{filename}") instead?' + + raise OSError(msg) + + +def load_default_imagefont() -> ImageFont: + f = ImageFont() + f._load_pilfont_data( + # courB08 + BytesIO( + base64.b64decode( + b""" +UElMZm9udAo7Ozs7OzsxMDsKREFUQQoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAA//8AAQAAAAAAAAABAAEA +BgAAAAH/+gADAAAAAQAAAAMABgAGAAAAAf/6AAT//QADAAAABgADAAYAAAAA//kABQABAAYAAAAL +AAgABgAAAAD/+AAFAAEACwAAABAACQAGAAAAAP/5AAUAAAAQAAAAFQAHAAYAAP////oABQAAABUA +AAAbAAYABgAAAAH/+QAE//wAGwAAAB4AAwAGAAAAAf/5AAQAAQAeAAAAIQAIAAYAAAAB//kABAAB +ACEAAAAkAAgABgAAAAD/+QAE//0AJAAAACgABAAGAAAAAP/6AAX//wAoAAAALQAFAAYAAAAB//8A +BAACAC0AAAAwAAMABgAAAAD//AAF//0AMAAAADUAAQAGAAAAAf//AAMAAAA1AAAANwABAAYAAAAB +//kABQABADcAAAA7AAgABgAAAAD/+QAFAAAAOwAAAEAABwAGAAAAAP/5AAYAAABAAAAARgAHAAYA +AAAA//kABQAAAEYAAABLAAcABgAAAAD/+QAFAAAASwAAAFAABwAGAAAAAP/5AAYAAABQAAAAVgAH +AAYAAAAA//kABQAAAFYAAABbAAcABgAAAAD/+QAFAAAAWwAAAGAABwAGAAAAAP/5AAUAAABgAAAA +ZQAHAAYAAAAA//kABQAAAGUAAABqAAcABgAAAAD/+QAFAAAAagAAAG8ABwAGAAAAAf/8AAMAAABv +AAAAcQAEAAYAAAAA//wAAwACAHEAAAB0AAYABgAAAAD/+gAE//8AdAAAAHgABQAGAAAAAP/7AAT/ +/gB4AAAAfAADAAYAAAAB//oABf//AHwAAACAAAUABgAAAAD/+gAFAAAAgAAAAIUABgAGAAAAAP/5 +AAYAAQCFAAAAiwAIAAYAAP////oABgAAAIsAAACSAAYABgAA////+gAFAAAAkgAAAJgABgAGAAAA +AP/6AAUAAACYAAAAnQAGAAYAAP////oABQAAAJ0AAACjAAYABgAA////+gAFAAAAowAAAKkABgAG +AAD////6AAUAAACpAAAArwAGAAYAAAAA//oABQAAAK8AAAC0AAYABgAA////+gAGAAAAtAAAALsA +BgAGAAAAAP/6AAQAAAC7AAAAvwAGAAYAAP////oABQAAAL8AAADFAAYABgAA////+gAGAAAAxQAA +AMwABgAGAAD////6AAUAAADMAAAA0gAGAAYAAP////oABQAAANIAAADYAAYABgAA////+gAGAAAA +2AAAAN8ABgAGAAAAAP/6AAUAAADfAAAA5AAGAAYAAP////oABQAAAOQAAADqAAYABgAAAAD/+gAF +AAEA6gAAAO8ABwAGAAD////6AAYAAADvAAAA9gAGAAYAAAAA//oABQAAAPYAAAD7AAYABgAA//// ++gAFAAAA+wAAAQEABgAGAAD////6AAYAAAEBAAABCAAGAAYAAP////oABgAAAQgAAAEPAAYABgAA +////+gAGAAABDwAAARYABgAGAAAAAP/6AAYAAAEWAAABHAAGAAYAAP////oABgAAARwAAAEjAAYA +BgAAAAD/+gAFAAABIwAAASgABgAGAAAAAf/5AAQAAQEoAAABKwAIAAYAAAAA//kABAABASsAAAEv +AAgABgAAAAH/+QAEAAEBLwAAATIACAAGAAAAAP/5AAX//AEyAAABNwADAAYAAAAAAAEABgACATcA +AAE9AAEABgAAAAH/+QAE//wBPQAAAUAAAwAGAAAAAP/7AAYAAAFAAAABRgAFAAYAAP////kABQAA +AUYAAAFMAAcABgAAAAD/+wAFAAABTAAAAVEABQAGAAAAAP/5AAYAAAFRAAABVwAHAAYAAAAA//sA +BQAAAVcAAAFcAAUABgAAAAD/+QAFAAABXAAAAWEABwAGAAAAAP/7AAYAAgFhAAABZwAHAAYAAP// +//kABQAAAWcAAAFtAAcABgAAAAD/+QAGAAABbQAAAXMABwAGAAAAAP/5AAQAAgFzAAABdwAJAAYA +AP////kABgAAAXcAAAF+AAcABgAAAAD/+QAGAAABfgAAAYQABwAGAAD////7AAUAAAGEAAABigAF +AAYAAP////sABQAAAYoAAAGQAAUABgAAAAD/+wAFAAABkAAAAZUABQAGAAD////7AAUAAgGVAAAB +mwAHAAYAAAAA//sABgACAZsAAAGhAAcABgAAAAD/+wAGAAABoQAAAacABQAGAAAAAP/7AAYAAAGn +AAABrQAFAAYAAAAA//kABgAAAa0AAAGzAAcABgAA////+wAGAAABswAAAboABQAGAAD////7AAUA +AAG6AAABwAAFAAYAAP////sABgAAAcAAAAHHAAUABgAAAAD/+wAGAAABxwAAAc0ABQAGAAD////7 +AAYAAgHNAAAB1AAHAAYAAAAA//sABQAAAdQAAAHZAAUABgAAAAH/+QAFAAEB2QAAAd0ACAAGAAAA +Av/6AAMAAQHdAAAB3gAHAAYAAAAA//kABAABAd4AAAHiAAgABgAAAAD/+wAF//0B4gAAAecAAgAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAB +//sAAwACAecAAAHpAAcABgAAAAD/+QAFAAEB6QAAAe4ACAAGAAAAAP/5AAYAAAHuAAAB9AAHAAYA +AAAA//oABf//AfQAAAH5AAUABgAAAAD/+QAGAAAB+QAAAf8ABwAGAAAAAv/5AAMAAgH/AAACAAAJ +AAYAAAAA//kABQABAgAAAAIFAAgABgAAAAH/+gAE//sCBQAAAggAAQAGAAAAAP/5AAYAAAIIAAAC +DgAHAAYAAAAB//kABf/+Ag4AAAISAAUABgAA////+wAGAAACEgAAAhkABQAGAAAAAP/7AAX//gIZ +AAACHgADAAYAAAAA//wABf/9Ah4AAAIjAAEABgAAAAD/+QAHAAACIwAAAioABwAGAAAAAP/6AAT/ ++wIqAAACLgABAAYAAAAA//kABP/8Ai4AAAIyAAMABgAAAAD/+gAFAAACMgAAAjcABgAGAAAAAf/5 +AAT//QI3AAACOgAEAAYAAAAB//kABP/9AjoAAAI9AAQABgAAAAL/+QAE//sCPQAAAj8AAgAGAAD/ +///7AAYAAgI/AAACRgAHAAYAAAAA//kABgABAkYAAAJMAAgABgAAAAH//AAD//0CTAAAAk4AAQAG +AAAAAf//AAQAAgJOAAACUQADAAYAAAAB//kABP/9AlEAAAJUAAQABgAAAAH/+QAF//4CVAAAAlgA +BQAGAAD////7AAYAAAJYAAACXwAFAAYAAP////kABgAAAl8AAAJmAAcABgAA////+QAGAAACZgAA +Am0ABwAGAAD////5AAYAAAJtAAACdAAHAAYAAAAA//sABQACAnQAAAJ5AAcABgAA////9wAGAAAC +eQAAAoAACQAGAAD////3AAYAAAKAAAAChwAJAAYAAP////cABgAAAocAAAKOAAkABgAA////9wAG +AAACjgAAApUACQAGAAD////4AAYAAAKVAAACnAAIAAYAAP////cABgAAApwAAAKjAAkABgAA//// ++gAGAAACowAAAqoABgAGAAAAAP/6AAUAAgKqAAACrwAIAAYAAP////cABQAAAq8AAAK1AAkABgAA +////9wAFAAACtQAAArsACQAGAAD////3AAUAAAK7AAACwQAJAAYAAP////gABQAAAsEAAALHAAgA +BgAAAAD/9wAEAAACxwAAAssACQAGAAAAAP/3AAQAAALLAAACzwAJAAYAAAAA//cABAAAAs8AAALT +AAkABgAAAAD/+AAEAAAC0wAAAtcACAAGAAD////6AAUAAALXAAAC3QAGAAYAAP////cABgAAAt0A +AALkAAkABgAAAAD/9wAFAAAC5AAAAukACQAGAAAAAP/3AAUAAALpAAAC7gAJAAYAAAAA//cABQAA +Au4AAALzAAkABgAAAAD/9wAFAAAC8wAAAvgACQAGAAAAAP/4AAUAAAL4AAAC/QAIAAYAAAAA//oA +Bf//Av0AAAMCAAUABgAA////+gAGAAADAgAAAwkABgAGAAD////3AAYAAAMJAAADEAAJAAYAAP// +//cABgAAAxAAAAMXAAkABgAA////9wAGAAADFwAAAx4ACQAGAAD////4AAYAAAAAAAoABwASAAYA +AP////cABgAAAAcACgAOABMABgAA////+gAFAAAADgAKABQAEAAGAAD////6AAYAAAAUAAoAGwAQ +AAYAAAAA//gABgAAABsACgAhABIABgAAAAD/+AAGAAAAIQAKACcAEgAGAAAAAP/4AAYAAAAnAAoA +LQASAAYAAAAA//gABgAAAC0ACgAzABIABgAAAAD/+QAGAAAAMwAKADkAEQAGAAAAAP/3AAYAAAA5 +AAoAPwATAAYAAP////sABQAAAD8ACgBFAA8ABgAAAAD/+wAFAAIARQAKAEoAEQAGAAAAAP/4AAUA +AABKAAoATwASAAYAAAAA//gABQAAAE8ACgBUABIABgAAAAD/+AAFAAAAVAAKAFkAEgAGAAAAAP/5 +AAUAAABZAAoAXgARAAYAAAAA//gABgAAAF4ACgBkABIABgAAAAD/+AAGAAAAZAAKAGoAEgAGAAAA +AP/4AAYAAABqAAoAcAASAAYAAAAA//kABgAAAHAACgB2ABEABgAAAAD/+AAFAAAAdgAKAHsAEgAG +AAD////4AAYAAAB7AAoAggASAAYAAAAA//gABQAAAIIACgCHABIABgAAAAD/+AAFAAAAhwAKAIwA +EgAGAAAAAP/4AAUAAACMAAoAkQASAAYAAAAA//gABQAAAJEACgCWABIABgAAAAD/+QAFAAAAlgAK +AJsAEQAGAAAAAP/6AAX//wCbAAoAoAAPAAYAAAAA//oABQABAKAACgClABEABgAA////+AAGAAAA +pQAKAKwAEgAGAAD////4AAYAAACsAAoAswASAAYAAP////gABgAAALMACgC6ABIABgAA////+QAG +AAAAugAKAMEAEQAGAAD////4AAYAAgDBAAoAyAAUAAYAAP////kABQACAMgACgDOABMABgAA//// ++QAGAAIAzgAKANUAEw== +""" + ) + ), + Image.open( + BytesIO( + base64.b64decode( + b""" +iVBORw0KGgoAAAANSUhEUgAAAx4AAAAUAQAAAAArMtZoAAAEwElEQVR4nABlAJr/AHVE4czCI/4u +Mc4b7vuds/xzjz5/3/7u/n9vMe7vnfH/9++vPn/xyf5zhxzjt8GHw8+2d83u8x27199/nxuQ6Od9 +M43/5z2I+9n9ZtmDBwMQECDRQw/eQIQohJXxpBCNVE6QCCAAAAD//wBlAJr/AgALyj1t/wINwq0g +LeNZUworuN1cjTPIzrTX6ofHWeo3v336qPzfEwRmBnHTtf95/fglZK5N0PDgfRTslpGBvz7LFc4F +IUXBWQGjQ5MGCx34EDFPwXiY4YbYxavpnhHFrk14CDAAAAD//wBlAJr/AgKqRooH2gAgPeggvUAA +Bu2WfgPoAwzRAABAAAAAAACQgLz/3Uv4Gv+gX7BJgDeeGP6AAAD1NMDzKHD7ANWr3loYbxsAD791 +NAADfcoIDyP44K/jv4Y63/Z+t98Ovt+ub4T48LAAAAD//wBlAJr/AuplMlADJAAAAGuAphWpqhMx +in0A/fRvAYBABPgBwBUgABBQ/sYAyv9g0bCHgOLoGAAAAAAAREAAwI7nr0ArYpow7aX8//9LaP/9 +SjdavWA8ePHeBIKB//81/83ndznOaXx379wAAAD//wBlAJr/AqDxW+D3AABAAbUh/QMnbQag/gAY +AYDAAACgtgD/gOqAAAB5IA/8AAAk+n9w0AAA8AAAmFRJuPo27ciC0cD5oeW4E7KA/wD3ECMAn2tt +y8PgwH8AfAxFzC0JzeAMtratAsC/ffwAAAD//wBlAJr/BGKAyCAA4AAAAvgeYTAwHd1kmQF5chkG +ABoMIHcL5xVpTfQbUqzlAAAErwAQBgAAEOClA5D9il08AEh/tUzdCBsXkbgACED+woQg8Si9VeqY +lODCn7lmF6NhnAEYgAAA/NMIAAAAAAD//2JgjLZgVGBg5Pv/Tvpc8hwGBjYGJADjHDrAwPzAjv/H +/Wf3PzCwtzcwHmBgYGcwbZz8wHaCAQMDOwMDQ8MCBgYOC3W7mp+f0w+wHOYxO3OG+e376hsMZjk3 +AAAAAP//YmCMY2A4wMAIN5e5gQETPD6AZisDAwMDgzSDAAPjByiHcQMDAwMDg1nOze1lByRu5/47 +c4859311AYNZzg0AAAAA//9iYGDBYihOIIMuwIjGL39/fwffA8b//xv/P2BPtzzHwCBjUQAAAAD/ +/yLFBrIBAAAA//9i1HhcwdhizX7u8NZNzyLbvT97bfrMf/QHI8evOwcSqGUJAAAA//9iYBB81iSw +pEE170Qrg5MIYydHqwdDQRMrAwcVrQAAAAD//2J4x7j9AAMDn8Q/BgYLBoaiAwwMjPdvMDBYM1Tv +oJodAAAAAP//Yqo/83+dxePWlxl3npsel9lvLfPcqlE9725C+acfVLMEAAAA//9i+s9gwCoaaGMR +evta/58PTEWzr21hufPjA8N+qlnBwAAAAAD//2JiWLci5v1+HmFXDqcnULE/MxgYGBj+f6CaJQAA +AAD//2Ji2FrkY3iYpYC5qDeGgeEMAwPDvwQBBoYvcTwOVLMEAAAA//9isDBgkP///0EOg9z35v// +Gc/eeW7BwPj5+QGZhANUswMAAAD//2JgqGBgYGBgqEMXlvhMPUsAAAAA//8iYDd1AAAAAP//AwDR +w7IkEbzhVQAAAABJRU5ErkJggg== +""" + ) + ) + ), + ) + return f + + +def load_default(size: float | None = None) -> FreeTypeFont | ImageFont: + """If FreeType support is available, load a version of Aileron Regular, + https://dotcolon.net/font/aileron, with a more limited character set. + + Otherwise, load a "better than nothing" font. + + .. versionadded:: 1.1.4 + + :param size: The font size of Aileron Regular. + + .. versionadded:: 10.1.0 + + :return: A font object. + """ + if isinstance(core, ModuleType) or size is not None: + return truetype( + BytesIO( + base64.b64decode( + b""" +AAEAAAAPAIAAAwBwRkZUTYwDlUAAADFoAAAAHEdERUYAqADnAAAo8AAAACRHUE9ThhmITwAAKfgAA +AduR1NVQnHxefoAACkUAAAA4k9TLzJovoHLAAABeAAAAGBjbWFw5lFQMQAAA6gAAAGqZ2FzcP//AA +MAACjoAAAACGdseWYmRXoPAAAGQAAAHfhoZWFkE18ayQAAAPwAAAA2aGhlYQboArEAAAE0AAAAJGh +tdHjjERZ8AAAB2AAAAdBsb2NhuOexrgAABVQAAADqbWF4cAC7AEYAAAFYAAAAIG5hbWUr+h5lAAAk +OAAAA6Jwb3N0D3oPTQAAJ9wAAAEKAAEAAAABGhxJDqIhXw889QALA+gAAAAA0Bqf2QAAAADhCh2h/ +2r/LgOxAyAAAAAIAAIAAAAAAAAAAQAAA8r/GgAAA7j/av9qA7EAAQAAAAAAAAAAAAAAAAAAAHQAAQ +AAAHQAQwAFAAAAAAACAAAAAQABAAAAQAAAAAAAAAADAfoBkAAFAAgCigJYAAAASwKKAlgAAAFeADI +BPgAAAAAFAAAAAAAAAAAAAAcAAAAAAAAAAAAAAABVS1dOAEAAIPsCAwL/GgDIA8oA5iAAAJMAAAAA +AhICsgAAACAAAwH0AAAAAAAAAU0AAADYAAAA8gA5AVMAVgJEAEYCRAA1AuQAKQKOAEAAsAArATsAZ +AE7AB4CMABVAkQAUADc/+EBEgAgANwAJQEv//sCRAApAkQAggJEADwCRAAtAkQAIQJEADkCRAArAk +QAMgJEACwCRAAxANwAJQDc/+ECRABnAkQAUAJEAEQB8wAjA1QANgJ/AB0CcwBkArsALwLFAGQCSwB +kAjcAZALGAC8C2gBkAQgAZAIgADcCYQBkAj8AZANiAGQCzgBkAuEALwJWAGQC3QAvAmsAZAJJADQC +ZAAiAqoAXgJuACADuAAaAnEAGQJFABMCTwAuATMAYgEv//sBJwAiAkQAUAH0ADIBLAApAhMAJAJjA +EoCEQAeAmcAHgIlAB4BIgAVAmcAHgJRAEoA7gA+AOn/8wIKAEoA9wBGA1cASgJRAEoCSgAeAmMASg +JnAB4BSgBKAcsAGAE5ABQCUABCAgIAAQMRAAEB4v/6AgEAAQHOABQBLwBAAPoAYAEvACECRABNA0Y +AJAItAHgBKgAcAkQAUAEsAHQAygAgAi0AOQD3ADYA9wAWAaEANgGhABYCbAAlAYMAeAGDADkA6/9q +AhsAFAIKABUB/QAVAAAAAwAAAAMAAAAcAAEAAAAAAKQAAwABAAAAHAAEAIgAAAAeABAAAwAOAH4Aq +QCrALEAtAC3ALsgGSAdICYgOiBEISL7Av//AAAAIACpAKsAsAC0ALcAuyAYIBwgJiA5IEQhIvsB// +//4/+5/7j/tP+y/7D/reBR4E/gR+A14CzfTwVxAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAEGAAABAAAAAAAAAAECAAAAAgAAAAAAAAAAAAAAAAAAAAEAAAMEBQYHCAkKCwwNDg8QERIT +FBUWFxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMT +U5PUFFSU1RVVldYWVpbXF1eX2BhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAA +AAAAAAYnFmAAAAAABlAAAAAAAAAAAAAAAAAAAAAAAAAAAAY2htAAAAAAAAAABrbGlqAAAAAHAAbm9 +ycwBnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmACYAJgAmAD4AUgCCAMoBCgFO +AVwBcgGIAaYBvAHKAdYB6AH2AgwCIAJKAogCpgLWAw4DIgNkA5wDugPUA+gD/AQQBEYEogS8BPoFJ +gVSBWoFgAWwBcoF1gX6BhQGJAZMBmgGiga0BuIHGgdUB2YHkAeiB8AH3AfyCAoIHAgqCDoITghcCG +oIogjSCPoJKglYCXwJwgnqCgIKKApACl4Klgq8CtwLDAs8C1YLjAuyC9oL7gwMDCYMSAxgDKAMrAz +qDQoNTA1mDYQNoA2uDcAN2g3oDfYODA4iDkoOXA5sDnoOnA7EDvwAAAAFAAAAAAH0ArwAAwAGAAkA +DAAPAAAxESERAxMhExcRASELARETAfT6qv6syKr+jgFUqsiqArz9RAGLAP/+1P8B/v3VAP8BLP4CA +P8AAgA5//IAuQKyAAMACwAANyMDMwIyFhQGIiY0oE4MZk84JCQ4JLQB/v3AJDgkJDgAAgBWAeUBPA +LfAAMABwAAEyMnMxcjJzOmRgpagkYKWgHl+vr6AAAAAAIARgAAAf4CsgAbAB8AAAEHMxUjByM3Iwc +jNyM1MzcjNTM3MwczNzMHMxUrAQczAZgdZXEvOi9bLzovWmYdZXEvOi9bLzovWp9bHlsBn4w429vb +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 +EQQ/BCQvEjQCFQZWFSEWQv40AcxCDiUblhP9uSEAAAAAAAAWAQ4AAQAAAAAAAAATACgAAQAAAAAAA +QAHAEwAAQAAAAAAAgAHAGQAAQAAAAAAAwAaAKIAAQAAAAAABAAHAM0AAQAAAAAABQA8AU8AAQAAAA +AABgAPAawAAQAAAAAACAALAdQAAQAAAAAACQALAfgAAQAAAAAACwAXAjQAAQAAAAAADAAXAnwAAwA +BBAkAAAAmAAAAAwABBAkAAQAOADwAAwABBAkAAgAOAFQAAwABBAkAAwA0AGwAAwABBAkABAAOAL0A +AwABBAkABQB4ANUAAwABBAkABgAeAYwAAwABBAkACAAWAbwAAwABBAkACQAWAeAAAwABBAkACwAuA +gQAAwABBAkADAAuAkwATgBvACAAUgBpAGcAaAB0AHMAIABSAGUAcwBlAHIAdgBlAGQALgAATm8gUm +lnaHRzIFJlc2VydmVkLgAAQQBpAGwAZQByAG8AbgAAQWlsZXJvbgAAUgBlAGcAdQBsAGEAcgAAUmV +ndWxhcgAAMQAuADEAMAAyADsAVQBLAFcATgA7AEEAaQBsAGUAcgBvAG4ALQBSAGUAZwB1AGwAYQBy +AAAxLjEwMjtVS1dOO0FpbGVyb24tUmVndWxhcgAAQQBpAGwAZQByAG8AbgAAQWlsZXJvbgAAVgBlA +HIAcwBpAG8AbgAgADEALgAxADAAMgA7AFAAUwAgADAAMAAxAC4AMQAwADIAOwBoAG8AdABjAG8Abg +B2ACAAMQAuADAALgA3ADAAOwBtAGEAawBlAG8AdABmAC4AbABpAGIAMgAuADUALgA1ADgAMwAyADk +AAFZlcnNpb24gMS4xMDI7UFMgMDAxLjEwMjtob3Rjb252IDEuMC43MDttYWtlb3RmLmxpYjIuNS41 +ODMyOQAAQQBpAGwAZQByAG8AbgAtAFIAZQBnAHUAbABhAHIAAEFpbGVyb24tUmVndWxhcgAAUwBvA +HIAYQAgAFMAYQBnAGEAbgBvAABTb3JhIFNhZ2FubwAAUwBvAHIAYQAgAFMAYQBnAGEAbgBvAABTb3 +JhIFNhZ2FubwAAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAGQAbwB0AGMAbwBsAG8AbgAuAG4AZQB0AAB +odHRwOi8vd3d3LmRvdGNvbG9uLm5ldAAAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAGQAbwB0AGMAbwBs +AG8AbgAuAG4AZQB0AABodHRwOi8vd3d3LmRvdGNvbG9uLm5ldAAAAAACAAAAAAAA/4MAMgAAAAAAA +AAAAAAAAAAAAAAAAAAAAHQAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATAB +QAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMAA +xADIAMwA0ADUANgA3ADgAOQA6ADsAPAA9AD4APwBAAEEAQgBDAEQARQBGAEcASABJAEoASwBMAE0A +TgBPAFAAUQBSAFMAVABVAFYAVwBYAFkAWgBbAFwAXQBeAF8AYABhAIsAqQCDAJMAjQDDAKoAtgC3A +LQAtQCrAL4AvwC8AIwAwADBAAAAAAAB//8AAgABAAAADAAAABwAAAACAAIAAwBxAAEAcgBzAAIABA +AAAAIAAAABAAAACgBMAGYAAkRGTFQADmxhdG4AGgAEAAAAAP//AAEAAAAWAANDQVQgAB5NT0wgABZ +ST00gABYAAP//AAEAAAAA//8AAgAAAAEAAmxpZ2EADmxvY2wAFAAAAAEAAQAAAAEAAAACAAYAEAAG +AAAAAgASADQABAAAAAEATAADAAAAAgAQABYAAQAcAAAAAQABAE8AAQABAGcAAQABAE8AAwAAAAIAE +AAWAAEAHAAAAAEAAQAvAAEAAQBnAAEAAQAvAAEAGgABAAgAAgAGAAwAcwACAE8AcgACAEwAAQABAE +kAAAABAAAACgBGAGAAAkRGTFQADmxhdG4AHAAEAAAAAP//AAIAAAABABYAA0NBVCAAFk1PTCAAFlJ +PTSAAFgAA//8AAgAAAAEAAmNwc3AADmtlcm4AFAAAAAEAAAAAAAEAAQACAAYADgABAAAAAQASAAIA +AAACAB4ANgABAAoABQAFAAoAAgABACQAPQAAAAEAEgAEAAAAAQAMAAEAOP/nAAEAAQAkAAIGigAEA +AAFJAXKABoAGQAA//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAD/sv+4/+z/7v/MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAD/xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/9T/6AAAAAD/8QAA +ABD/vQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/7gAAAAAAAAAAAAAAAAAA//MAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABIAAAAAAAAAAP/5AAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/gAAD/4AAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//L/9AAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAA/+gAAAAAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/zAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/mAAAAAAAAAAAAAAAAAAD +/4gAA//AAAAAA//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/+AAAAAAAAP/OAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/zv/qAAAAAP/0AAAACAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/ZAAD/egAA/1kAAAAA/5D/rgAAAAAAAAAAAA +AAAAAAAAAAAAAAAAD/9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAD/8AAA/7b/8P+wAAD/8P/E/98AAAAA/8P/+P/0//oAAAAAAAAAAAAA//gA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+AAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/w//C/9MAAP/SAAD/9wAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAD/yAAA/+kAAAAA//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9wAAAAD//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAP/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAP/cAAAAAAAAAAAAAAAA/7YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAP/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/6AAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAkAFAAEAAAAAQACwAAABcA +BgAAAAAAAAAIAA4AAAAAAAsAEgAAAAAAAAATABkAAwANAAAAAQAJAAAAAAAAAAAAAAAAAAAAGAAAA +AAABwAAAAAAAAAAAAAAFQAFAAAAAAAYABgAAAAUAAAACgAAAAwAAgAPABEAFgAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAEAEQBdAAYAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAcAAAAAAAAABwAAAAAACAAAAAAAAAAAAAcAAAAHAAAAEwAJ +ABUADgAPAAAACwAQAAAAAAAAAAAAAAAAAAUAGAACAAIAAgAAAAIAGAAXAAAAGAAAABYAFgACABYAA +gAWAAAAEQADAAoAFAAMAA0ABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASAAAAEgAGAAEAHgAkAC +YAJwApACoALQAuAC8AMgAzADcAOAA5ADoAPAA9AEUASABOAE8AUgBTAFUAVwBZAFoAWwBcAF0AcwA +AAAAAAQAAAADa3tfFAAAAANAan9kAAAAA4QodoQ== +""" + ) + ), + 10 if size is None else size, + layout_engine=Layout.BASIC, + ) + return load_default_imagefont() diff --git a/venv/lib/python3.12/site-packages/PIL/ImageGrab.py b/venv/lib/python3.12/site-packages/PIL/ImageGrab.py new file mode 100644 index 0000000..e27ca7e --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/ImageGrab.py @@ -0,0 +1,194 @@ +# +# The Python Imaging Library +# $Id$ +# +# screen grabber +# +# History: +# 2001-04-26 fl created +# 2001-09-17 fl use builtin driver, if present +# 2002-11-19 fl added grabclipboard support +# +# Copyright (c) 2001-2002 by Secret Labs AB +# Copyright (c) 2001-2002 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import io +import os +import shutil +import subprocess +import sys +import tempfile + +from . import Image + + +def grab( + bbox: tuple[int, int, int, int] | None = None, + include_layered_windows: bool = False, + all_screens: bool = False, + xdisplay: str | None = None, +) -> Image.Image: + im: Image.Image + if xdisplay is None: + if sys.platform == "darwin": + fh, filepath = tempfile.mkstemp(".png") + os.close(fh) + args = ["screencapture"] + if bbox: + left, top, right, bottom = bbox + args += ["-R", f"{left},{top},{right-left},{bottom-top}"] + subprocess.call(args + ["-x", filepath]) + im = Image.open(filepath) + im.load() + os.unlink(filepath) + if bbox: + im_resized = im.resize((right - left, bottom - top)) + im.close() + return im_resized + return im + elif sys.platform == "win32": + offset, size, data = Image.core.grabscreen_win32( + include_layered_windows, all_screens + ) + im = Image.frombytes( + "RGB", + size, + data, + # RGB, 32-bit line padding, origin lower left corner + "raw", + "BGR", + (size[0] * 3 + 3) & -4, + -1, + ) + if bbox: + x0, y0 = offset + left, top, right, bottom = bbox + im = im.crop((left - x0, top - y0, right - x0, bottom - y0)) + return im + # Cast to Optional[str] needed for Windows and macOS. + display_name: str | None = xdisplay + try: + if not Image.core.HAVE_XCB: + msg = "Pillow was built without XCB support" + raise OSError(msg) + size, data = Image.core.grabscreen_x11(display_name) + except OSError: + if ( + display_name is None + and sys.platform not in ("darwin", "win32") + and shutil.which("gnome-screenshot") + ): + fh, filepath = tempfile.mkstemp(".png") + os.close(fh) + subprocess.call(["gnome-screenshot", "-f", filepath]) + im = Image.open(filepath) + im.load() + os.unlink(filepath) + if bbox: + im_cropped = im.crop(bbox) + im.close() + return im_cropped + return im + else: + raise + else: + im = Image.frombytes("RGB", size, data, "raw", "BGRX", size[0] * 4, 1) + if bbox: + im = im.crop(bbox) + return im + + +def grabclipboard() -> Image.Image | list[str] | None: + if sys.platform == "darwin": + fh, filepath = tempfile.mkstemp(".png") + os.close(fh) + commands = [ + 'set theFile to (open for access POSIX file "' + + filepath + + '" with write permission)', + "try", + " write (the clipboard as «class PNGf») to theFile", + "end try", + "close access theFile", + ] + script = ["osascript"] + for command in commands: + script += ["-e", command] + subprocess.call(script) + + im = None + if os.stat(filepath).st_size != 0: + im = Image.open(filepath) + im.load() + os.unlink(filepath) + return im + elif sys.platform == "win32": + fmt, data = Image.core.grabclipboard_win32() + if fmt == "file": # CF_HDROP + import struct + + o = struct.unpack_from("I", data)[0] + if data[16] != 0: + files = data[o:].decode("utf-16le").split("\0") + else: + files = data[o:].decode("mbcs").split("\0") + return files[: files.index("")] + if isinstance(data, bytes): + data = io.BytesIO(data) + if fmt == "png": + from . import PngImagePlugin + + return PngImagePlugin.PngImageFile(data) + elif fmt == "DIB": + from . import BmpImagePlugin + + return BmpImagePlugin.DibImageFile(data) + return None + else: + if os.getenv("WAYLAND_DISPLAY"): + session_type = "wayland" + elif os.getenv("DISPLAY"): + session_type = "x11" + else: # Session type check failed + session_type = None + + if shutil.which("wl-paste") and session_type in ("wayland", None): + args = ["wl-paste", "-t", "image"] + elif shutil.which("xclip") and session_type in ("x11", None): + args = ["xclip", "-selection", "clipboard", "-t", "image/png", "-o"] + else: + msg = "wl-paste or xclip is required for ImageGrab.grabclipboard() on Linux" + raise NotImplementedError(msg) + + p = subprocess.run(args, capture_output=True) + if p.returncode != 0: + err = p.stderr + for silent_error in [ + # wl-paste, when the clipboard is empty + b"Nothing is copied", + # Ubuntu/Debian wl-paste, when the clipboard is empty + b"No selection", + # Ubuntu/Debian wl-paste, when an image isn't available + b"No suitable type of content copied", + # wl-paste or Ubuntu/Debian xclip, when an image isn't available + b" not available", + # xclip, when an image isn't available + b"cannot convert ", + # xclip, when the clipboard isn't initialized + b"xclip: Error: There is no owner for the ", + ]: + if silent_error in err: + return None + msg = f"{args[0]} error" + if err: + msg += f": {err.strip().decode()}" + raise ChildProcessError(msg) + + data = io.BytesIO(p.stdout) + im = Image.open(data) + im.load() + return im diff --git a/venv/lib/python3.12/site-packages/PIL/ImageMath.py b/venv/lib/python3.12/site-packages/PIL/ImageMath.py new file mode 100644 index 0000000..484797f --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/ImageMath.py @@ -0,0 +1,368 @@ +# +# The Python Imaging Library +# $Id$ +# +# a simple math add-on for the Python Imaging Library +# +# History: +# 1999-02-15 fl Original PIL Plus release +# 2005-05-05 fl Simplified and cleaned up for PIL 1.1.6 +# 2005-09-12 fl Fixed int() and float() for Python 2.4.1 +# +# Copyright (c) 1999-2005 by Secret Labs AB +# Copyright (c) 2005 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import builtins +from types import CodeType +from typing import Any, Callable + +from . import Image, _imagingmath +from ._deprecate import deprecate + + +class _Operand: + """Wraps an image operand, providing standard operators""" + + def __init__(self, im: Image.Image): + self.im = im + + def __fixup(self, im1: _Operand | float) -> Image.Image: + # convert image to suitable mode + if isinstance(im1, _Operand): + # argument was an image. + if im1.im.mode in ("1", "L"): + return im1.im.convert("I") + elif im1.im.mode in ("I", "F"): + return im1.im + else: + msg = f"unsupported mode: {im1.im.mode}" + raise ValueError(msg) + else: + # argument was a constant + if isinstance(im1, (int, float)) and self.im.mode in ("1", "L", "I"): + return Image.new("I", self.im.size, im1) + else: + return Image.new("F", self.im.size, im1) + + def apply( + self, + op: str, + im1: _Operand | float, + im2: _Operand | float | None = None, + mode: str | None = None, + ) -> _Operand: + im_1 = self.__fixup(im1) + if im2 is None: + # unary operation + out = Image.new(mode or im_1.mode, im_1.size, None) + try: + op = getattr(_imagingmath, f"{op}_{im_1.mode}") + except AttributeError as e: + msg = f"bad operand type for '{op}'" + raise TypeError(msg) from e + _imagingmath.unop(op, out.getim(), im_1.getim()) + else: + # binary operation + im_2 = self.__fixup(im2) + if im_1.mode != im_2.mode: + # convert both arguments to floating point + if im_1.mode != "F": + im_1 = im_1.convert("F") + if im_2.mode != "F": + im_2 = im_2.convert("F") + if im_1.size != im_2.size: + # crop both arguments to a common size + size = ( + min(im_1.size[0], im_2.size[0]), + min(im_1.size[1], im_2.size[1]), + ) + if im_1.size != size: + im_1 = im_1.crop((0, 0) + size) + if im_2.size != size: + im_2 = im_2.crop((0, 0) + size) + out = Image.new(mode or im_1.mode, im_1.size, None) + try: + op = getattr(_imagingmath, f"{op}_{im_1.mode}") + except AttributeError as e: + msg = f"bad operand type for '{op}'" + raise TypeError(msg) from e + _imagingmath.binop(op, out.getim(), im_1.getim(), im_2.getim()) + return _Operand(out) + + # unary operators + def __bool__(self) -> bool: + # an image is "true" if it contains at least one non-zero pixel + return self.im.getbbox() is not None + + def __abs__(self) -> _Operand: + return self.apply("abs", self) + + def __pos__(self) -> _Operand: + return self + + def __neg__(self) -> _Operand: + return self.apply("neg", self) + + # binary operators + def __add__(self, other: _Operand | float) -> _Operand: + return self.apply("add", self, other) + + def __radd__(self, other: _Operand | float) -> _Operand: + return self.apply("add", other, self) + + def __sub__(self, other: _Operand | float) -> _Operand: + return self.apply("sub", self, other) + + def __rsub__(self, other: _Operand | float) -> _Operand: + return self.apply("sub", other, self) + + def __mul__(self, other: _Operand | float) -> _Operand: + return self.apply("mul", self, other) + + def __rmul__(self, other: _Operand | float) -> _Operand: + return self.apply("mul", other, self) + + def __truediv__(self, other: _Operand | float) -> _Operand: + return self.apply("div", self, other) + + def __rtruediv__(self, other: _Operand | float) -> _Operand: + return self.apply("div", other, self) + + def __mod__(self, other: _Operand | float) -> _Operand: + return self.apply("mod", self, other) + + def __rmod__(self, other: _Operand | float) -> _Operand: + return self.apply("mod", other, self) + + def __pow__(self, other: _Operand | float) -> _Operand: + return self.apply("pow", self, other) + + def __rpow__(self, other: _Operand | float) -> _Operand: + return self.apply("pow", other, self) + + # bitwise + def __invert__(self) -> _Operand: + return self.apply("invert", self) + + def __and__(self, other: _Operand | float) -> _Operand: + return self.apply("and", self, other) + + def __rand__(self, other: _Operand | float) -> _Operand: + return self.apply("and", other, self) + + def __or__(self, other: _Operand | float) -> _Operand: + return self.apply("or", self, other) + + def __ror__(self, other: _Operand | float) -> _Operand: + return self.apply("or", other, self) + + def __xor__(self, other: _Operand | float) -> _Operand: + return self.apply("xor", self, other) + + def __rxor__(self, other: _Operand | float) -> _Operand: + return self.apply("xor", other, self) + + def __lshift__(self, other: _Operand | float) -> _Operand: + return self.apply("lshift", self, other) + + def __rshift__(self, other: _Operand | float) -> _Operand: + return self.apply("rshift", self, other) + + # logical + def __eq__(self, other: _Operand | float) -> _Operand: # type: ignore[override] + return self.apply("eq", self, other) + + def __ne__(self, other: _Operand | float) -> _Operand: # type: ignore[override] + return self.apply("ne", self, other) + + def __lt__(self, other: _Operand | float) -> _Operand: + return self.apply("lt", self, other) + + def __le__(self, other: _Operand | float) -> _Operand: + return self.apply("le", self, other) + + def __gt__(self, other: _Operand | float) -> _Operand: + return self.apply("gt", self, other) + + def __ge__(self, other: _Operand | float) -> _Operand: + return self.apply("ge", self, other) + + +# conversions +def imagemath_int(self: _Operand) -> _Operand: + return _Operand(self.im.convert("I")) + + +def imagemath_float(self: _Operand) -> _Operand: + return _Operand(self.im.convert("F")) + + +# logical +def imagemath_equal(self: _Operand, other: _Operand | float | None) -> _Operand: + return self.apply("eq", self, other, mode="I") + + +def imagemath_notequal(self: _Operand, other: _Operand | float | None) -> _Operand: + return self.apply("ne", self, other, mode="I") + + +def imagemath_min(self: _Operand, other: _Operand | float | None) -> _Operand: + return self.apply("min", self, other) + + +def imagemath_max(self: _Operand, other: _Operand | float | None) -> _Operand: + return self.apply("max", self, other) + + +def imagemath_convert(self: _Operand, mode: str) -> _Operand: + return _Operand(self.im.convert(mode)) + + +ops = { + "int": imagemath_int, + "float": imagemath_float, + "equal": imagemath_equal, + "notequal": imagemath_notequal, + "min": imagemath_min, + "max": imagemath_max, + "convert": imagemath_convert, +} + + +def lambda_eval( + expression: Callable[[dict[str, Any]], Any], + options: dict[str, Any] = {}, + **kw: Any, +) -> Any: + """ + Returns the result of an image function. + + :py:mod:`~PIL.ImageMath` only supports single-layer images. To process multi-band + images, use the :py:meth:`~PIL.Image.Image.split` method or + :py:func:`~PIL.Image.merge` function. + + :param expression: A function that receives a dictionary. + :param options: Values to add to the function's dictionary. Deprecated. + You can instead use one or more keyword arguments. + :param **kw: Values to add to the function's dictionary. + :return: The expression result. This is usually an image object, but can + also be an integer, a floating point value, or a pixel tuple, + depending on the expression. + """ + + if options: + deprecate( + "ImageMath.lambda_eval options", + 12, + "ImageMath.lambda_eval keyword arguments", + ) + + args: dict[str, Any] = ops.copy() + args.update(options) + args.update(kw) + for k, v in args.items(): + if isinstance(v, Image.Image): + args[k] = _Operand(v) + + out = expression(args) + try: + return out.im + except AttributeError: + return out + + +def unsafe_eval( + expression: str, + options: dict[str, Any] = {}, + **kw: Any, +) -> Any: + """ + Evaluates an image expression. This uses Python's ``eval()`` function to process + the expression string, and carries the security risks of doing so. It is not + recommended to process expressions without considering this. + :py:meth:`~lambda_eval` is a more secure alternative. + + :py:mod:`~PIL.ImageMath` only supports single-layer images. To process multi-band + images, use the :py:meth:`~PIL.Image.Image.split` method or + :py:func:`~PIL.Image.merge` function. + + :param expression: A string containing a Python-style expression. + :param options: Values to add to the evaluation context. Deprecated. + You can instead use one or more keyword arguments. + :param **kw: Values to add to the evaluation context. + :return: The evaluated expression. This is usually an image object, but can + also be an integer, a floating point value, or a pixel tuple, + depending on the expression. + """ + + if options: + deprecate( + "ImageMath.unsafe_eval options", + 12, + "ImageMath.unsafe_eval keyword arguments", + ) + + # build execution namespace + args: dict[str, Any] = ops.copy() + for k in list(options.keys()) + list(kw.keys()): + if "__" in k or hasattr(builtins, k): + msg = f"'{k}' not allowed" + raise ValueError(msg) + + args.update(options) + args.update(kw) + for k, v in args.items(): + if isinstance(v, Image.Image): + args[k] = _Operand(v) + + compiled_code = compile(expression, "", "eval") + + def scan(code: CodeType) -> None: + for const in code.co_consts: + if type(const) is type(compiled_code): + scan(const) + + for name in code.co_names: + if name not in args and name != "abs": + msg = f"'{name}' not allowed" + raise ValueError(msg) + + scan(compiled_code) + out = builtins.eval(expression, {"__builtins": {"abs": abs}}, args) + try: + return out.im + except AttributeError: + return out + + +def eval( + expression: str, + _dict: dict[str, Any] = {}, + **kw: Any, +) -> Any: + """ + Evaluates an image expression. + + Deprecated. Use lambda_eval() or unsafe_eval() instead. + + :param expression: A string containing a Python-style expression. + :param _dict: Values to add to the evaluation context. You + can either use a dictionary, or one or more keyword + arguments. + :return: The evaluated expression. This is usually an image object, but can + also be an integer, a floating point value, or a pixel tuple, + depending on the expression. + + .. deprecated:: 10.3.0 + """ + + deprecate( + "ImageMath.eval", + 12, + "ImageMath.lambda_eval or ImageMath.unsafe_eval", + ) + return unsafe_eval(expression, _dict, **kw) diff --git a/venv/lib/python3.12/site-packages/PIL/ImageMode.py b/venv/lib/python3.12/site-packages/PIL/ImageMode.py new file mode 100644 index 0000000..92a08d2 --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/ImageMode.py @@ -0,0 +1,92 @@ +# +# The Python Imaging Library. +# $Id$ +# +# standard mode descriptors +# +# History: +# 2006-03-20 fl Added +# +# Copyright (c) 2006 by Secret Labs AB. +# Copyright (c) 2006 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import sys +from functools import lru_cache +from typing import NamedTuple + +from ._deprecate import deprecate + + +class ModeDescriptor(NamedTuple): + """Wrapper for mode strings.""" + + mode: str + bands: tuple[str, ...] + basemode: str + basetype: str + typestr: str + + def __str__(self) -> str: + return self.mode + + +@lru_cache +def getmode(mode: str) -> ModeDescriptor: + """Gets a mode descriptor for the given mode.""" + endian = "<" if sys.byteorder == "little" else ">" + + modes = { + # core modes + # Bits need to be extended to bytes + "1": ("L", "L", ("1",), "|b1"), + "L": ("L", "L", ("L",), "|u1"), + "I": ("L", "I", ("I",), f"{endian}i4"), + "F": ("L", "F", ("F",), f"{endian}f4"), + "P": ("P", "L", ("P",), "|u1"), + "RGB": ("RGB", "L", ("R", "G", "B"), "|u1"), + "RGBX": ("RGB", "L", ("R", "G", "B", "X"), "|u1"), + "RGBA": ("RGB", "L", ("R", "G", "B", "A"), "|u1"), + "CMYK": ("RGB", "L", ("C", "M", "Y", "K"), "|u1"), + "YCbCr": ("RGB", "L", ("Y", "Cb", "Cr"), "|u1"), + # UNDONE - unsigned |u1i1i1 + "LAB": ("RGB", "L", ("L", "A", "B"), "|u1"), + "HSV": ("RGB", "L", ("H", "S", "V"), "|u1"), + # extra experimental modes + "RGBa": ("RGB", "L", ("R", "G", "B", "a"), "|u1"), + "BGR;15": ("RGB", "L", ("B", "G", "R"), "|u1"), + "BGR;16": ("RGB", "L", ("B", "G", "R"), "|u1"), + "BGR;24": ("RGB", "L", ("B", "G", "R"), "|u1"), + "LA": ("L", "L", ("L", "A"), "|u1"), + "La": ("L", "L", ("L", "a"), "|u1"), + "PA": ("RGB", "L", ("P", "A"), "|u1"), + } + if mode in modes: + if mode in ("BGR;15", "BGR;16", "BGR;24"): + deprecate(mode, 12) + base_mode, base_type, bands, type_str = modes[mode] + return ModeDescriptor(mode, bands, base_mode, base_type, type_str) + + mapping_modes = { + # I;16 == I;16L, and I;32 == I;32L + "I;16": "u2", + "I;16BS": ">i2", + "I;16N": f"{endian}u2", + "I;16NS": f"{endian}i2", + "I;32": "u4", + "I;32L": "i4", + "I;32LS": " +from __future__ import annotations + +import re + +from . import Image, _imagingmorph + +LUT_SIZE = 1 << 9 + +# fmt: off +ROTATION_MATRIX = [ + 6, 3, 0, + 7, 4, 1, + 8, 5, 2, +] +MIRROR_MATRIX = [ + 2, 1, 0, + 5, 4, 3, + 8, 7, 6, +] +# fmt: on + + +class LutBuilder: + """A class for building a MorphLut from a descriptive language + + The input patterns is a list of a strings sequences like these:: + + 4:(... + .1. + 111)->1 + + (whitespaces including linebreaks are ignored). The option 4 + describes a series of symmetry operations (in this case a + 4-rotation), the pattern is described by: + + - . or X - Ignore + - 1 - Pixel is on + - 0 - Pixel is off + + The result of the operation is described after "->" string. + + The default is to return the current pixel value, which is + returned if no other match is found. + + Operations: + + - 4 - 4 way rotation + - N - Negate + - 1 - Dummy op for no other operation (an op must always be given) + - M - Mirroring + + Example:: + + lb = LutBuilder(patterns = ["4:(... .1. 111)->1"]) + lut = lb.build_lut() + + """ + + def __init__( + self, patterns: list[str] | None = None, op_name: str | None = None + ) -> None: + if patterns is not None: + self.patterns = patterns + else: + self.patterns = [] + self.lut: bytearray | None = None + if op_name is not None: + known_patterns = { + "corner": ["1:(... ... ...)->0", "4:(00. 01. ...)->1"], + "dilation4": ["4:(... .0. .1.)->1"], + "dilation8": ["4:(... .0. .1.)->1", "4:(... .0. ..1)->1"], + "erosion4": ["4:(... .1. .0.)->0"], + "erosion8": ["4:(... .1. .0.)->0", "4:(... .1. ..0)->0"], + "edge": [ + "1:(... ... ...)->0", + "4:(.0. .1. ...)->1", + "4:(01. .1. ...)->1", + ], + } + if op_name not in known_patterns: + msg = f"Unknown pattern {op_name}!" + raise Exception(msg) + + self.patterns = known_patterns[op_name] + + def add_patterns(self, patterns: list[str]) -> None: + self.patterns += patterns + + def build_default_lut(self) -> None: + symbols = [0, 1] + m = 1 << 4 # pos of current pixel + self.lut = bytearray(symbols[(i & m) > 0] for i in range(LUT_SIZE)) + + def get_lut(self) -> bytearray | None: + return self.lut + + def _string_permute(self, pattern: str, permutation: list[int]) -> str: + """string_permute takes a pattern and a permutation and returns the + string permuted according to the permutation list. + """ + assert len(permutation) == 9 + return "".join(pattern[p] for p in permutation) + + def _pattern_permute( + self, basic_pattern: str, options: str, basic_result: int + ) -> list[tuple[str, int]]: + """pattern_permute takes a basic pattern and its result and clones + the pattern according to the modifications described in the $options + parameter. It returns a list of all cloned patterns.""" + patterns = [(basic_pattern, basic_result)] + + # rotations + if "4" in options: + res = patterns[-1][1] + for i in range(4): + patterns.append( + (self._string_permute(patterns[-1][0], ROTATION_MATRIX), res) + ) + # mirror + if "M" in options: + n = len(patterns) + for pattern, res in patterns[:n]: + patterns.append((self._string_permute(pattern, MIRROR_MATRIX), res)) + + # negate + if "N" in options: + n = len(patterns) + for pattern, res in patterns[:n]: + # Swap 0 and 1 + pattern = pattern.replace("0", "Z").replace("1", "0").replace("Z", "1") + res = 1 - int(res) + patterns.append((pattern, res)) + + return patterns + + def build_lut(self) -> bytearray: + """Compile all patterns into a morphology lut. + + TBD :Build based on (file) morphlut:modify_lut + """ + self.build_default_lut() + assert self.lut is not None + patterns = [] + + # Parse and create symmetries of the patterns strings + for p in self.patterns: + m = re.search(r"(\w*):?\s*\((.+?)\)\s*->\s*(\d)", p.replace("\n", "")) + if not m: + msg = 'Syntax error in pattern "' + p + '"' + raise Exception(msg) + options = m.group(1) + pattern = m.group(2) + result = int(m.group(3)) + + # Get rid of spaces + pattern = pattern.replace(" ", "").replace("\n", "") + + patterns += self._pattern_permute(pattern, options, result) + + # compile the patterns into regular expressions for speed + compiled_patterns = [] + for pattern in patterns: + p = pattern[0].replace(".", "X").replace("X", "[01]") + compiled_patterns.append((re.compile(p), pattern[1])) + + # Step through table and find patterns that match. + # Note that all the patterns are searched. The last one + # caught overrides + for i in range(LUT_SIZE): + # Build the bit pattern + bitpattern = bin(i)[2:] + bitpattern = ("0" * (9 - len(bitpattern)) + bitpattern)[::-1] + + for pattern, r in compiled_patterns: + if pattern.match(bitpattern): + self.lut[i] = [0, 1][r] + + return self.lut + + +class MorphOp: + """A class for binary morphological operators""" + + def __init__( + self, + lut: bytearray | None = None, + op_name: str | None = None, + patterns: list[str] | None = None, + ) -> None: + """Create a binary morphological operator""" + self.lut = lut + if op_name is not None: + self.lut = LutBuilder(op_name=op_name).build_lut() + elif patterns is not None: + self.lut = LutBuilder(patterns=patterns).build_lut() + + def apply(self, image: Image.Image) -> tuple[int, Image.Image]: + """Run a single morphological operation on an image + + Returns a tuple of the number of changed pixels and the + morphed image""" + if self.lut is None: + msg = "No operator loaded" + raise Exception(msg) + + if image.mode != "L": + msg = "Image mode must be L" + raise ValueError(msg) + outimage = Image.new(image.mode, image.size, None) + count = _imagingmorph.apply(bytes(self.lut), image.getim(), outimage.getim()) + return count, outimage + + def match(self, image: Image.Image) -> list[tuple[int, int]]: + """Get a list of coordinates matching the morphological operation on + an image. + + Returns a list of tuples of (x,y) coordinates + of all matching pixels. See :ref:`coordinate-system`.""" + if self.lut is None: + msg = "No operator loaded" + raise Exception(msg) + + if image.mode != "L": + msg = "Image mode must be L" + raise ValueError(msg) + return _imagingmorph.match(bytes(self.lut), image.getim()) + + def get_on_pixels(self, image: Image.Image) -> list[tuple[int, int]]: + """Get a list of all turned on pixels in a binary image + + Returns a list of tuples of (x,y) coordinates + of all matching pixels. See :ref:`coordinate-system`.""" + + if image.mode != "L": + msg = "Image mode must be L" + raise ValueError(msg) + return _imagingmorph.get_on_pixels(image.getim()) + + def load_lut(self, filename: str) -> None: + """Load an operator from an mrl file""" + with open(filename, "rb") as f: + self.lut = bytearray(f.read()) + + if len(self.lut) != LUT_SIZE: + self.lut = None + msg = "Wrong size operator file!" + raise Exception(msg) + + def save_lut(self, filename: str) -> None: + """Save an operator to an mrl file""" + if self.lut is None: + msg = "No operator loaded" + raise Exception(msg) + with open(filename, "wb") as f: + f.write(self.lut) + + def set_lut(self, lut: bytearray | None) -> None: + """Set the lut from an external source""" + self.lut = lut diff --git a/venv/lib/python3.12/site-packages/PIL/ImageOps.py b/venv/lib/python3.12/site-packages/PIL/ImageOps.py new file mode 100644 index 0000000..44aad0c --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/ImageOps.py @@ -0,0 +1,730 @@ +# +# The Python Imaging Library. +# $Id$ +# +# standard image operations +# +# History: +# 2001-10-20 fl Created +# 2001-10-23 fl Added autocontrast operator +# 2001-12-18 fl Added Kevin's fit operator +# 2004-03-14 fl Fixed potential division by zero in equalize +# 2005-05-05 fl Fixed equalize for low number of values +# +# Copyright (c) 2001-2004 by Secret Labs AB +# Copyright (c) 2001-2004 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import functools +import operator +import re +from collections.abc import Sequence +from typing import Protocol, cast + +from . import ExifTags, Image, ImagePalette + +# +# helpers + + +def _border(border: int | tuple[int, ...]) -> tuple[int, int, int, int]: + if isinstance(border, tuple): + if len(border) == 2: + left, top = right, bottom = border + elif len(border) == 4: + left, top, right, bottom = border + else: + left = top = right = bottom = border + return left, top, right, bottom + + +def _color(color: str | int | tuple[int, ...], mode: str) -> int | tuple[int, ...]: + if isinstance(color, str): + from . import ImageColor + + color = ImageColor.getcolor(color, mode) + return color + + +def _lut(image: Image.Image, lut: list[int]) -> Image.Image: + if image.mode == "P": + # FIXME: apply to lookup table, not image data + msg = "mode P support coming soon" + raise NotImplementedError(msg) + elif image.mode in ("L", "RGB"): + if image.mode == "RGB" and len(lut) == 256: + lut = lut + lut + lut + return image.point(lut) + else: + msg = f"not supported for mode {image.mode}" + raise OSError(msg) + + +# +# actions + + +def autocontrast( + image: Image.Image, + cutoff: float | tuple[float, float] = 0, + ignore: int | Sequence[int] | None = None, + mask: Image.Image | None = None, + preserve_tone: bool = False, +) -> Image.Image: + """ + Maximize (normalize) image contrast. This function calculates a + histogram of the input image (or mask region), removes ``cutoff`` percent of the + lightest and darkest pixels from the histogram, and remaps the image + so that the darkest pixel becomes black (0), and the lightest + becomes white (255). + + :param image: The image to process. + :param cutoff: The percent to cut off from the histogram on the low and + high ends. Either a tuple of (low, high), or a single + number for both. + :param ignore: The background pixel value (use None for no background). + :param mask: Histogram used in contrast operation is computed using pixels + within the mask. If no mask is given the entire image is used + for histogram computation. + :param preserve_tone: Preserve image tone in Photoshop-like style autocontrast. + + .. versionadded:: 8.2.0 + + :return: An image. + """ + if preserve_tone: + histogram = image.convert("L").histogram(mask) + else: + histogram = image.histogram(mask) + + lut = [] + for layer in range(0, len(histogram), 256): + h = histogram[layer : layer + 256] + if ignore is not None: + # get rid of outliers + if isinstance(ignore, int): + h[ignore] = 0 + else: + for ix in ignore: + h[ix] = 0 + if cutoff: + # cut off pixels from both ends of the histogram + if not isinstance(cutoff, tuple): + cutoff = (cutoff, cutoff) + # get number of pixels + n = 0 + for ix in range(256): + n = n + h[ix] + # remove cutoff% pixels from the low end + cut = int(n * cutoff[0] // 100) + for lo in range(256): + if cut > h[lo]: + cut = cut - h[lo] + h[lo] = 0 + else: + h[lo] -= cut + cut = 0 + if cut <= 0: + break + # remove cutoff% samples from the high end + cut = int(n * cutoff[1] // 100) + for hi in range(255, -1, -1): + if cut > h[hi]: + cut = cut - h[hi] + h[hi] = 0 + else: + h[hi] -= cut + cut = 0 + if cut <= 0: + break + # find lowest/highest samples after preprocessing + for lo in range(256): + if h[lo]: + break + for hi in range(255, -1, -1): + if h[hi]: + break + if hi <= lo: + # don't bother + lut.extend(list(range(256))) + else: + scale = 255.0 / (hi - lo) + offset = -lo * scale + for ix in range(256): + ix = int(ix * scale + offset) + if ix < 0: + ix = 0 + elif ix > 255: + ix = 255 + lut.append(ix) + return _lut(image, lut) + + +def colorize( + image: Image.Image, + black: str | tuple[int, ...], + white: str | tuple[int, ...], + mid: str | int | tuple[int, ...] | None = None, + blackpoint: int = 0, + whitepoint: int = 255, + midpoint: int = 127, +) -> Image.Image: + """ + Colorize grayscale image. + This function calculates a color wedge which maps all black pixels in + the source image to the first color and all white pixels to the + second color. If ``mid`` is specified, it uses three-color mapping. + The ``black`` and ``white`` arguments should be RGB tuples or color names; + optionally you can use three-color mapping by also specifying ``mid``. + Mapping positions for any of the colors can be specified + (e.g. ``blackpoint``), where these parameters are the integer + value corresponding to where the corresponding color should be mapped. + These parameters must have logical order, such that + ``blackpoint <= midpoint <= whitepoint`` (if ``mid`` is specified). + + :param image: The image to colorize. + :param black: The color to use for black input pixels. + :param white: The color to use for white input pixels. + :param mid: The color to use for midtone input pixels. + :param blackpoint: an int value [0, 255] for the black mapping. + :param whitepoint: an int value [0, 255] for the white mapping. + :param midpoint: an int value [0, 255] for the midtone mapping. + :return: An image. + """ + + # Initial asserts + assert image.mode == "L" + if mid is None: + assert 0 <= blackpoint <= whitepoint <= 255 + else: + assert 0 <= blackpoint <= midpoint <= whitepoint <= 255 + + # Define colors from arguments + rgb_black = cast(Sequence[int], _color(black, "RGB")) + rgb_white = cast(Sequence[int], _color(white, "RGB")) + rgb_mid = cast(Sequence[int], _color(mid, "RGB")) if mid is not None else None + + # Empty lists for the mapping + red = [] + green = [] + blue = [] + + # Create the low-end values + for i in range(0, blackpoint): + red.append(rgb_black[0]) + green.append(rgb_black[1]) + blue.append(rgb_black[2]) + + # Create the mapping (2-color) + if rgb_mid is None: + range_map = range(0, whitepoint - blackpoint) + + for i in range_map: + red.append( + rgb_black[0] + i * (rgb_white[0] - rgb_black[0]) // len(range_map) + ) + green.append( + rgb_black[1] + i * (rgb_white[1] - rgb_black[1]) // len(range_map) + ) + blue.append( + rgb_black[2] + i * (rgb_white[2] - rgb_black[2]) // len(range_map) + ) + + # Create the mapping (3-color) + else: + range_map1 = range(0, midpoint - blackpoint) + range_map2 = range(0, whitepoint - midpoint) + + for i in range_map1: + red.append( + rgb_black[0] + i * (rgb_mid[0] - rgb_black[0]) // len(range_map1) + ) + green.append( + rgb_black[1] + i * (rgb_mid[1] - rgb_black[1]) // len(range_map1) + ) + blue.append( + rgb_black[2] + i * (rgb_mid[2] - rgb_black[2]) // len(range_map1) + ) + for i in range_map2: + red.append(rgb_mid[0] + i * (rgb_white[0] - rgb_mid[0]) // len(range_map2)) + green.append( + rgb_mid[1] + i * (rgb_white[1] - rgb_mid[1]) // len(range_map2) + ) + blue.append(rgb_mid[2] + i * (rgb_white[2] - rgb_mid[2]) // len(range_map2)) + + # Create the high-end values + for i in range(0, 256 - whitepoint): + red.append(rgb_white[0]) + green.append(rgb_white[1]) + blue.append(rgb_white[2]) + + # Return converted image + image = image.convert("RGB") + return _lut(image, red + green + blue) + + +def contain( + image: Image.Image, size: tuple[int, int], method: int = Image.Resampling.BICUBIC +) -> Image.Image: + """ + Returns a resized version of the image, set to the maximum width and height + within the requested size, while maintaining the original aspect ratio. + + :param image: The image to resize. + :param size: The requested output size in pixels, given as a + (width, height) tuple. + :param method: Resampling method to use. Default is + :py:attr:`~PIL.Image.Resampling.BICUBIC`. + See :ref:`concept-filters`. + :return: An image. + """ + + im_ratio = image.width / image.height + dest_ratio = size[0] / size[1] + + if im_ratio != dest_ratio: + if im_ratio > dest_ratio: + new_height = round(image.height / image.width * size[0]) + if new_height != size[1]: + size = (size[0], new_height) + else: + new_width = round(image.width / image.height * size[1]) + if new_width != size[0]: + size = (new_width, size[1]) + return image.resize(size, resample=method) + + +def cover( + image: Image.Image, size: tuple[int, int], method: int = Image.Resampling.BICUBIC +) -> Image.Image: + """ + Returns a resized version of the image, so that the requested size is + covered, while maintaining the original aspect ratio. + + :param image: The image to resize. + :param size: The requested output size in pixels, given as a + (width, height) tuple. + :param method: Resampling method to use. Default is + :py:attr:`~PIL.Image.Resampling.BICUBIC`. + See :ref:`concept-filters`. + :return: An image. + """ + + im_ratio = image.width / image.height + dest_ratio = size[0] / size[1] + + if im_ratio != dest_ratio: + if im_ratio < dest_ratio: + new_height = round(image.height / image.width * size[0]) + if new_height != size[1]: + size = (size[0], new_height) + else: + new_width = round(image.width / image.height * size[1]) + if new_width != size[0]: + size = (new_width, size[1]) + return image.resize(size, resample=method) + + +def pad( + image: Image.Image, + size: tuple[int, int], + method: int = Image.Resampling.BICUBIC, + color: str | int | tuple[int, ...] | None = None, + centering: tuple[float, float] = (0.5, 0.5), +) -> Image.Image: + """ + Returns a resized and padded version of the image, expanded to fill the + requested aspect ratio and size. + + :param image: The image to resize and crop. + :param size: The requested output size in pixels, given as a + (width, height) tuple. + :param method: Resampling method to use. Default is + :py:attr:`~PIL.Image.Resampling.BICUBIC`. + See :ref:`concept-filters`. + :param color: The background color of the padded image. + :param centering: Control the position of the original image within the + padded version. + + (0.5, 0.5) will keep the image centered + (0, 0) will keep the image aligned to the top left + (1, 1) will keep the image aligned to the bottom + right + :return: An image. + """ + + resized = contain(image, size, method) + if resized.size == size: + out = resized + else: + out = Image.new(image.mode, size, color) + if resized.palette: + palette = resized.getpalette() + if palette is not None: + out.putpalette(palette) + if resized.width != size[0]: + x = round((size[0] - resized.width) * max(0, min(centering[0], 1))) + out.paste(resized, (x, 0)) + else: + y = round((size[1] - resized.height) * max(0, min(centering[1], 1))) + out.paste(resized, (0, y)) + return out + + +def crop(image: Image.Image, border: int = 0) -> Image.Image: + """ + Remove border from image. The same amount of pixels are removed + from all four sides. This function works on all image modes. + + .. seealso:: :py:meth:`~PIL.Image.Image.crop` + + :param image: The image to crop. + :param border: The number of pixels to remove. + :return: An image. + """ + left, top, right, bottom = _border(border) + return image.crop((left, top, image.size[0] - right, image.size[1] - bottom)) + + +def scale( + image: Image.Image, factor: float, resample: int = Image.Resampling.BICUBIC +) -> Image.Image: + """ + Returns a rescaled image by a specific factor given in parameter. + A factor greater than 1 expands the image, between 0 and 1 contracts the + image. + + :param image: The image to rescale. + :param factor: The expansion factor, as a float. + :param resample: Resampling method to use. Default is + :py:attr:`~PIL.Image.Resampling.BICUBIC`. + See :ref:`concept-filters`. + :returns: An :py:class:`~PIL.Image.Image` object. + """ + if factor == 1: + return image.copy() + elif factor <= 0: + msg = "the factor must be greater than 0" + raise ValueError(msg) + else: + size = (round(factor * image.width), round(factor * image.height)) + return image.resize(size, resample) + + +class SupportsGetMesh(Protocol): + """ + An object that supports the ``getmesh`` method, taking an image as an + argument, and returning a list of tuples. Each tuple contains two tuples, + the source box as a tuple of 4 integers, and a tuple of 8 integers for the + final quadrilateral, in order of top left, bottom left, bottom right, top + right. + """ + + def getmesh( + self, image: Image.Image + ) -> list[ + tuple[tuple[int, int, int, int], tuple[int, int, int, int, int, int, int, int]] + ]: ... + + +def deform( + image: Image.Image, + deformer: SupportsGetMesh, + resample: int = Image.Resampling.BILINEAR, +) -> Image.Image: + """ + Deform the image. + + :param image: The image to deform. + :param deformer: A deformer object. Any object that implements a + ``getmesh`` method can be used. + :param resample: An optional resampling filter. Same values possible as + in the PIL.Image.transform function. + :return: An image. + """ + return image.transform( + image.size, Image.Transform.MESH, deformer.getmesh(image), resample + ) + + +def equalize(image: Image.Image, mask: Image.Image | None = None) -> Image.Image: + """ + Equalize the image histogram. This function applies a non-linear + mapping to the input image, in order to create a uniform + distribution of grayscale values in the output image. + + :param image: The image to equalize. + :param mask: An optional mask. If given, only the pixels selected by + the mask are included in the analysis. + :return: An image. + """ + if image.mode == "P": + image = image.convert("RGB") + h = image.histogram(mask) + lut = [] + for b in range(0, len(h), 256): + histo = [_f for _f in h[b : b + 256] if _f] + if len(histo) <= 1: + lut.extend(list(range(256))) + else: + step = (functools.reduce(operator.add, histo) - histo[-1]) // 255 + if not step: + lut.extend(list(range(256))) + else: + n = step // 2 + for i in range(256): + lut.append(n // step) + n = n + h[i + b] + return _lut(image, lut) + + +def expand( + image: Image.Image, + border: int | tuple[int, ...] = 0, + fill: str | int | tuple[int, ...] = 0, +) -> Image.Image: + """ + Add border to the image + + :param image: The image to expand. + :param border: Border width, in pixels. + :param fill: Pixel fill value (a color value). Default is 0 (black). + :return: An image. + """ + left, top, right, bottom = _border(border) + width = left + image.size[0] + right + height = top + image.size[1] + bottom + color = _color(fill, image.mode) + if image.palette: + palette = ImagePalette.ImagePalette(palette=image.getpalette()) + if isinstance(color, tuple) and (len(color) == 3 or len(color) == 4): + color = palette.getcolor(color) + else: + palette = None + out = Image.new(image.mode, (width, height), color) + if palette: + out.putpalette(palette.palette) + out.paste(image, (left, top)) + return out + + +def fit( + image: Image.Image, + size: tuple[int, int], + method: int = Image.Resampling.BICUBIC, + bleed: float = 0.0, + centering: tuple[float, float] = (0.5, 0.5), +) -> Image.Image: + """ + Returns a resized and cropped version of the image, cropped to the + requested aspect ratio and size. + + This function was contributed by Kevin Cazabon. + + :param image: The image to resize and crop. + :param size: The requested output size in pixels, given as a + (width, height) tuple. + :param method: Resampling method to use. Default is + :py:attr:`~PIL.Image.Resampling.BICUBIC`. + See :ref:`concept-filters`. + :param bleed: Remove a border around the outside of the image from all + four edges. The value is a decimal percentage (use 0.01 for + one percent). The default value is 0 (no border). + Cannot be greater than or equal to 0.5. + :param centering: Control the cropping position. Use (0.5, 0.5) for + center cropping (e.g. if cropping the width, take 50% off + of the left side, and therefore 50% off the right side). + (0.0, 0.0) will crop from the top left corner (i.e. if + cropping the width, take all of the crop off of the right + side, and if cropping the height, take all of it off the + bottom). (1.0, 0.0) will crop from the bottom left + corner, etc. (i.e. if cropping the width, take all of the + crop off the left side, and if cropping the height take + none from the top, and therefore all off the bottom). + :return: An image. + """ + + # by Kevin Cazabon, Feb 17/2000 + # kevin@cazabon.com + # https://www.cazabon.com + + centering_x, centering_y = centering + + if not 0.0 <= centering_x <= 1.0: + centering_x = 0.5 + if not 0.0 <= centering_y <= 1.0: + centering_y = 0.5 + + if not 0.0 <= bleed < 0.5: + bleed = 0.0 + + # calculate the area to use for resizing and cropping, subtracting + # the 'bleed' around the edges + + # number of pixels to trim off on Top and Bottom, Left and Right + bleed_pixels = (bleed * image.size[0], bleed * image.size[1]) + + live_size = ( + image.size[0] - bleed_pixels[0] * 2, + image.size[1] - bleed_pixels[1] * 2, + ) + + # calculate the aspect ratio of the live_size + live_size_ratio = live_size[0] / live_size[1] + + # calculate the aspect ratio of the output image + output_ratio = size[0] / size[1] + + # figure out if the sides or top/bottom will be cropped off + if live_size_ratio == output_ratio: + # live_size is already the needed ratio + crop_width = live_size[0] + crop_height = live_size[1] + elif live_size_ratio >= output_ratio: + # live_size is wider than what's needed, crop the sides + crop_width = output_ratio * live_size[1] + crop_height = live_size[1] + else: + # live_size is taller than what's needed, crop the top and bottom + crop_width = live_size[0] + crop_height = live_size[0] / output_ratio + + # make the crop + crop_left = bleed_pixels[0] + (live_size[0] - crop_width) * centering_x + crop_top = bleed_pixels[1] + (live_size[1] - crop_height) * centering_y + + crop = (crop_left, crop_top, crop_left + crop_width, crop_top + crop_height) + + # resize the image and return it + return image.resize(size, method, box=crop) + + +def flip(image: Image.Image) -> Image.Image: + """ + Flip the image vertically (top to bottom). + + :param image: The image to flip. + :return: An image. + """ + return image.transpose(Image.Transpose.FLIP_TOP_BOTTOM) + + +def grayscale(image: Image.Image) -> Image.Image: + """ + Convert the image to grayscale. + + :param image: The image to convert. + :return: An image. + """ + return image.convert("L") + + +def invert(image: Image.Image) -> Image.Image: + """ + Invert (negate) the image. + + :param image: The image to invert. + :return: An image. + """ + lut = list(range(255, -1, -1)) + return image.point(lut) if image.mode == "1" else _lut(image, lut) + + +def mirror(image: Image.Image) -> Image.Image: + """ + Flip image horizontally (left to right). + + :param image: The image to mirror. + :return: An image. + """ + return image.transpose(Image.Transpose.FLIP_LEFT_RIGHT) + + +def posterize(image: Image.Image, bits: int) -> Image.Image: + """ + Reduce the number of bits for each color channel. + + :param image: The image to posterize. + :param bits: The number of bits to keep for each channel (1-8). + :return: An image. + """ + mask = ~(2 ** (8 - bits) - 1) + lut = [i & mask for i in range(256)] + return _lut(image, lut) + + +def solarize(image: Image.Image, threshold: int = 128) -> Image.Image: + """ + Invert all pixel values above a threshold. + + :param image: The image to solarize. + :param threshold: All pixels above this grayscale level are inverted. + :return: An image. + """ + lut = [] + for i in range(256): + if i < threshold: + lut.append(i) + else: + lut.append(255 - i) + return _lut(image, lut) + + +def exif_transpose(image: Image.Image, *, in_place: bool = False) -> Image.Image | None: + """ + If an image has an EXIF Orientation tag, other than 1, transpose the image + accordingly, and remove the orientation data. + + :param image: The image to transpose. + :param in_place: Boolean. Keyword-only argument. + If ``True``, the original image is modified in-place, and ``None`` is returned. + If ``False`` (default), a new :py:class:`~PIL.Image.Image` object is returned + with the transposition applied. If there is no transposition, a copy of the + image will be returned. + """ + image.load() + image_exif = image.getexif() + orientation = image_exif.get(ExifTags.Base.Orientation, 1) + method = { + 2: Image.Transpose.FLIP_LEFT_RIGHT, + 3: Image.Transpose.ROTATE_180, + 4: Image.Transpose.FLIP_TOP_BOTTOM, + 5: Image.Transpose.TRANSPOSE, + 6: Image.Transpose.ROTATE_270, + 7: Image.Transpose.TRANSVERSE, + 8: Image.Transpose.ROTATE_90, + }.get(orientation) + if method is not None: + transposed_image = image.transpose(method) + if in_place: + image.im = transposed_image.im + image._size = transposed_image._size + exif_image = image if in_place else transposed_image + + exif = exif_image.getexif() + if ExifTags.Base.Orientation in exif: + del exif[ExifTags.Base.Orientation] + if "exif" in exif_image.info: + exif_image.info["exif"] = exif.tobytes() + elif "Raw profile type exif" in exif_image.info: + exif_image.info["Raw profile type exif"] = exif.tobytes().hex() + for key in ("XML:com.adobe.xmp", "xmp"): + if key in exif_image.info: + for pattern in ( + r'tiff:Orientation="([0-9])"', + r"([0-9])", + ): + value = exif_image.info[key] + exif_image.info[key] = ( + re.sub(pattern, "", value) + if isinstance(value, str) + else re.sub(pattern.encode(), b"", value) + ) + if not in_place: + return transposed_image + elif not in_place: + return image.copy() + return None diff --git a/venv/lib/python3.12/site-packages/PIL/ImagePalette.py b/venv/lib/python3.12/site-packages/PIL/ImagePalette.py new file mode 100644 index 0000000..183f855 --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/ImagePalette.py @@ -0,0 +1,285 @@ +# +# The Python Imaging Library. +# $Id$ +# +# image palette object +# +# History: +# 1996-03-11 fl Rewritten. +# 1997-01-03 fl Up and running. +# 1997-08-23 fl Added load hack +# 2001-04-16 fl Fixed randint shadow bug in random() +# +# Copyright (c) 1997-2001 by Secret Labs AB +# Copyright (c) 1996-1997 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import array +from collections.abc import Sequence +from typing import IO, TYPE_CHECKING + +from . import GimpGradientFile, GimpPaletteFile, ImageColor, PaletteFile + +if TYPE_CHECKING: + from . import Image + + +class ImagePalette: + """ + Color palette for palette mapped images + + :param mode: The mode to use for the palette. See: + :ref:`concept-modes`. Defaults to "RGB" + :param palette: An optional palette. If given, it must be a bytearray, + an array or a list of ints between 0-255. The list must consist of + all channels for one color followed by the next color (e.g. RGBRGBRGB). + Defaults to an empty palette. + """ + + def __init__( + self, + mode: str = "RGB", + palette: Sequence[int] | bytes | bytearray | None = None, + ) -> None: + self.mode = mode + self.rawmode: str | None = None # if set, palette contains raw data + self.palette = palette or bytearray() + self.dirty: int | None = None + + @property + def palette(self) -> Sequence[int] | bytes | bytearray: + return self._palette + + @palette.setter + def palette(self, palette: Sequence[int] | bytes | bytearray) -> None: + self._colors: dict[tuple[int, ...], int] | None = None + self._palette = palette + + @property + def colors(self) -> dict[tuple[int, ...], int]: + if self._colors is None: + mode_len = len(self.mode) + self._colors = {} + for i in range(0, len(self.palette), mode_len): + color = tuple(self.palette[i : i + mode_len]) + if color in self._colors: + continue + self._colors[color] = i // mode_len + return self._colors + + @colors.setter + def colors(self, colors: dict[tuple[int, ...], int]) -> None: + self._colors = colors + + def copy(self) -> ImagePalette: + new = ImagePalette() + + new.mode = self.mode + new.rawmode = self.rawmode + if self.palette is not None: + new.palette = self.palette[:] + new.dirty = self.dirty + + return new + + def getdata(self) -> tuple[str, Sequence[int] | bytes | bytearray]: + """ + Get palette contents in format suitable for the low-level + ``im.putpalette`` primitive. + + .. warning:: This method is experimental. + """ + if self.rawmode: + return self.rawmode, self.palette + return self.mode, self.tobytes() + + def tobytes(self) -> bytes: + """Convert palette to bytes. + + .. warning:: This method is experimental. + """ + if self.rawmode: + msg = "palette contains raw palette data" + raise ValueError(msg) + if isinstance(self.palette, bytes): + return self.palette + arr = array.array("B", self.palette) + return arr.tobytes() + + # Declare tostring as an alias for tobytes + tostring = tobytes + + def _new_color_index( + self, image: Image.Image | None = None, e: Exception | None = None + ) -> int: + if not isinstance(self.palette, bytearray): + self._palette = bytearray(self.palette) + index = len(self.palette) // 3 + special_colors: tuple[int | tuple[int, ...] | None, ...] = () + if image: + special_colors = ( + image.info.get("background"), + image.info.get("transparency"), + ) + while index in special_colors: + index += 1 + if index >= 256: + if image: + # Search for an unused index + for i, count in reversed(list(enumerate(image.histogram()))): + if count == 0 and i not in special_colors: + index = i + break + if index >= 256: + msg = "cannot allocate more than 256 colors" + raise ValueError(msg) from e + return index + + def getcolor( + self, + color: tuple[int, ...], + image: Image.Image | None = None, + ) -> int: + """Given an rgb tuple, allocate palette entry. + + .. warning:: This method is experimental. + """ + if self.rawmode: + msg = "palette contains raw palette data" + raise ValueError(msg) + if isinstance(color, tuple): + if self.mode == "RGB": + if len(color) == 4: + if color[3] != 255: + msg = "cannot add non-opaque RGBA color to RGB palette" + raise ValueError(msg) + color = color[:3] + elif self.mode == "RGBA": + if len(color) == 3: + color += (255,) + try: + return self.colors[color] + except KeyError as e: + # allocate new color slot + index = self._new_color_index(image, e) + assert isinstance(self._palette, bytearray) + self.colors[color] = index + if index * 3 < len(self.palette): + self._palette = ( + self._palette[: index * 3] + + bytes(color) + + self._palette[index * 3 + 3 :] + ) + else: + self._palette += bytes(color) + self.dirty = 1 + return index + else: + msg = f"unknown color specifier: {repr(color)}" # type: ignore[unreachable] + raise ValueError(msg) + + def save(self, fp: str | IO[str]) -> None: + """Save palette to text file. + + .. warning:: This method is experimental. + """ + if self.rawmode: + msg = "palette contains raw palette data" + raise ValueError(msg) + if isinstance(fp, str): + fp = open(fp, "w") + fp.write("# Palette\n") + fp.write(f"# Mode: {self.mode}\n") + for i in range(256): + fp.write(f"{i}") + for j in range(i * len(self.mode), (i + 1) * len(self.mode)): + try: + fp.write(f" {self.palette[j]}") + except IndexError: + fp.write(" 0") + fp.write("\n") + fp.close() + + +# -------------------------------------------------------------------- +# Internal + + +def raw(rawmode: str, data: Sequence[int] | bytes | bytearray) -> ImagePalette: + palette = ImagePalette() + palette.rawmode = rawmode + palette.palette = data + palette.dirty = 1 + return palette + + +# -------------------------------------------------------------------- +# Factories + + +def make_linear_lut(black: int, white: float) -> list[int]: + if black == 0: + return [int(white * i // 255) for i in range(256)] + + msg = "unavailable when black is non-zero" + raise NotImplementedError(msg) # FIXME + + +def make_gamma_lut(exp: float) -> list[int]: + return [int(((i / 255.0) ** exp) * 255.0 + 0.5) for i in range(256)] + + +def negative(mode: str = "RGB") -> ImagePalette: + palette = list(range(256 * len(mode))) + palette.reverse() + return ImagePalette(mode, [i // len(mode) for i in palette]) + + +def random(mode: str = "RGB") -> ImagePalette: + from random import randint + + palette = [randint(0, 255) for _ in range(256 * len(mode))] + return ImagePalette(mode, palette) + + +def sepia(white: str = "#fff0c0") -> ImagePalette: + bands = [make_linear_lut(0, band) for band in ImageColor.getrgb(white)] + return ImagePalette("RGB", [bands[i % 3][i // 3] for i in range(256 * 3)]) + + +def wedge(mode: str = "RGB") -> ImagePalette: + palette = list(range(256 * len(mode))) + return ImagePalette(mode, [i // len(mode) for i in palette]) + + +def load(filename: str) -> tuple[bytes, str]: + # FIXME: supports GIMP gradients only + + with open(filename, "rb") as fp: + paletteHandlers: list[ + type[ + GimpPaletteFile.GimpPaletteFile + | GimpGradientFile.GimpGradientFile + | PaletteFile.PaletteFile + ] + ] = [ + GimpPaletteFile.GimpPaletteFile, + GimpGradientFile.GimpGradientFile, + PaletteFile.PaletteFile, + ] + for paletteHandler in paletteHandlers: + try: + fp.seek(0) + lut = paletteHandler(fp).getpalette() + if lut: + break + except (SyntaxError, ValueError): + pass + else: + msg = "cannot load palette" + raise OSError(msg) + + return lut # data, rawmode diff --git a/venv/lib/python3.12/site-packages/PIL/ImagePath.py b/venv/lib/python3.12/site-packages/PIL/ImagePath.py new file mode 100644 index 0000000..77e8a60 --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/ImagePath.py @@ -0,0 +1,20 @@ +# +# The Python Imaging Library +# $Id$ +# +# path interface +# +# History: +# 1996-11-04 fl Created +# 2002-04-14 fl Added documentation stub class +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1996. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +from . import Image + +Path = Image.core.path diff --git a/venv/lib/python3.12/site-packages/PIL/ImageQt.py b/venv/lib/python3.12/site-packages/PIL/ImageQt.py new file mode 100644 index 0000000..a3d6471 --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/ImageQt.py @@ -0,0 +1,216 @@ +# +# The Python Imaging Library. +# $Id$ +# +# a simple Qt image interface. +# +# history: +# 2006-06-03 fl: created +# 2006-06-04 fl: inherit from QImage instead of wrapping it +# 2006-06-05 fl: removed toimage helper; move string support to ImageQt +# 2013-11-13 fl: add support for Qt5 (aurelien.ballier@cyclonit.com) +# +# Copyright (c) 2006 by Secret Labs AB +# Copyright (c) 2006 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import sys +from io import BytesIO +from typing import TYPE_CHECKING, Any, Callable, Union + +from . import Image +from ._util import is_path + +if TYPE_CHECKING: + import PyQt6 + import PySide6 + + from . import ImageFile + + QBuffer: type + QByteArray = Union[PyQt6.QtCore.QByteArray, PySide6.QtCore.QByteArray] + QIODevice = Union[PyQt6.QtCore.QIODevice, PySide6.QtCore.QIODevice] + QImage = Union[PyQt6.QtGui.QImage, PySide6.QtGui.QImage] + QPixmap = Union[PyQt6.QtGui.QPixmap, PySide6.QtGui.QPixmap] + +qt_version: str | None +qt_versions = [ + ["6", "PyQt6"], + ["side6", "PySide6"], +] + +# If a version has already been imported, attempt it first +qt_versions.sort(key=lambda version: version[1] in sys.modules, reverse=True) +for version, qt_module in qt_versions: + try: + qRgba: Callable[[int, int, int, int], int] + if qt_module == "PyQt6": + from PyQt6.QtCore import QBuffer, QIODevice + from PyQt6.QtGui import QImage, QPixmap, qRgba + elif qt_module == "PySide6": + from PySide6.QtCore import QBuffer, QIODevice + from PySide6.QtGui import QImage, QPixmap, qRgba + except (ImportError, RuntimeError): + continue + qt_is_installed = True + qt_version = version + break +else: + qt_is_installed = False + qt_version = None + + +def rgb(r: int, g: int, b: int, a: int = 255) -> int: + """(Internal) Turns an RGB color into a Qt compatible color integer.""" + # use qRgb to pack the colors, and then turn the resulting long + # into a negative integer with the same bitpattern. + return qRgba(r, g, b, a) & 0xFFFFFFFF + + +def fromqimage(im: QImage | QPixmap) -> ImageFile.ImageFile: + """ + :param im: QImage or PIL ImageQt object + """ + buffer = QBuffer() + qt_openmode: object + if qt_version == "6": + try: + qt_openmode = getattr(QIODevice, "OpenModeFlag") + except AttributeError: + qt_openmode = getattr(QIODevice, "OpenMode") + else: + qt_openmode = QIODevice + buffer.open(getattr(qt_openmode, "ReadWrite")) + # preserve alpha channel with png + # otherwise ppm is more friendly with Image.open + if im.hasAlphaChannel(): + im.save(buffer, "png") + else: + im.save(buffer, "ppm") + + b = BytesIO() + b.write(buffer.data()) + buffer.close() + b.seek(0) + + return Image.open(b) + + +def fromqpixmap(im: QPixmap) -> ImageFile.ImageFile: + return fromqimage(im) + + +def align8to32(bytes: bytes, width: int, mode: str) -> bytes: + """ + converts each scanline of data from 8 bit to 32 bit aligned + """ + + bits_per_pixel = {"1": 1, "L": 8, "P": 8, "I;16": 16}[mode] + + # calculate bytes per line and the extra padding if needed + bits_per_line = bits_per_pixel * width + full_bytes_per_line, remaining_bits_per_line = divmod(bits_per_line, 8) + bytes_per_line = full_bytes_per_line + (1 if remaining_bits_per_line else 0) + + extra_padding = -bytes_per_line % 4 + + # already 32 bit aligned by luck + if not extra_padding: + return bytes + + new_data = [ + bytes[i * bytes_per_line : (i + 1) * bytes_per_line] + b"\x00" * extra_padding + for i in range(len(bytes) // bytes_per_line) + ] + + return b"".join(new_data) + + +def _toqclass_helper(im: Image.Image | str | QByteArray) -> dict[str, Any]: + data = None + colortable = None + exclusive_fp = False + + # handle filename, if given instead of image name + if hasattr(im, "toUtf8"): + # FIXME - is this really the best way to do this? + im = str(im.toUtf8(), "utf-8") + if is_path(im): + im = Image.open(im) + exclusive_fp = True + assert isinstance(im, Image.Image) + + qt_format = getattr(QImage, "Format") if qt_version == "6" else QImage + if im.mode == "1": + format = getattr(qt_format, "Format_Mono") + elif im.mode == "L": + format = getattr(qt_format, "Format_Indexed8") + colortable = [rgb(i, i, i) for i in range(256)] + elif im.mode == "P": + format = getattr(qt_format, "Format_Indexed8") + palette = im.getpalette() + assert palette is not None + colortable = [rgb(*palette[i : i + 3]) for i in range(0, len(palette), 3)] + elif im.mode == "RGB": + # Populate the 4th channel with 255 + im = im.convert("RGBA") + + data = im.tobytes("raw", "BGRA") + format = getattr(qt_format, "Format_RGB32") + elif im.mode == "RGBA": + data = im.tobytes("raw", "BGRA") + format = getattr(qt_format, "Format_ARGB32") + elif im.mode == "I;16": + im = im.point(lambda i: i * 256) + + format = getattr(qt_format, "Format_Grayscale16") + else: + if exclusive_fp: + im.close() + msg = f"unsupported image mode {repr(im.mode)}" + raise ValueError(msg) + + size = im.size + __data = data or align8to32(im.tobytes(), size[0], im.mode) + if exclusive_fp: + im.close() + return {"data": __data, "size": size, "format": format, "colortable": colortable} + + +if qt_is_installed: + + class ImageQt(QImage): # type: ignore[misc] + def __init__(self, im: Image.Image | str | QByteArray) -> None: + """ + An PIL image wrapper for Qt. This is a subclass of PyQt's QImage + class. + + :param im: A PIL Image object, or a file name (given either as + Python string or a PyQt string object). + """ + im_data = _toqclass_helper(im) + # must keep a reference, or Qt will crash! + # All QImage constructors that take data operate on an existing + # buffer, so this buffer has to hang on for the life of the image. + # Fixes https://github.com/python-pillow/Pillow/issues/1370 + self.__data = im_data["data"] + super().__init__( + self.__data, + im_data["size"][0], + im_data["size"][1], + im_data["format"], + ) + if im_data["colortable"]: + self.setColorTable(im_data["colortable"]) + + +def toqimage(im: Image.Image | str | QByteArray) -> ImageQt: + return ImageQt(im) + + +def toqpixmap(im: Image.Image | str | QByteArray) -> QPixmap: + qimage = toqimage(im) + return getattr(QPixmap, "fromImage")(qimage) diff --git a/venv/lib/python3.12/site-packages/PIL/ImageSequence.py b/venv/lib/python3.12/site-packages/PIL/ImageSequence.py new file mode 100644 index 0000000..a6fc340 --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/ImageSequence.py @@ -0,0 +1,86 @@ +# +# The Python Imaging Library. +# $Id$ +# +# sequence support classes +# +# history: +# 1997-02-20 fl Created +# +# Copyright (c) 1997 by Secret Labs AB. +# Copyright (c) 1997 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# + +## +from __future__ import annotations + +from typing import Callable + +from . import Image + + +class Iterator: + """ + This class implements an iterator object that can be used to loop + over an image sequence. + + You can use the ``[]`` operator to access elements by index. This operator + will raise an :py:exc:`IndexError` if you try to access a nonexistent + frame. + + :param im: An image object. + """ + + def __init__(self, im: Image.Image) -> None: + if not hasattr(im, "seek"): + msg = "im must have seek method" + raise AttributeError(msg) + self.im = im + self.position = getattr(self.im, "_min_frame", 0) + + def __getitem__(self, ix: int) -> Image.Image: + try: + self.im.seek(ix) + return self.im + except EOFError as e: + msg = "end of sequence" + raise IndexError(msg) from e + + def __iter__(self) -> Iterator: + return self + + def __next__(self) -> Image.Image: + try: + self.im.seek(self.position) + self.position += 1 + return self.im + except EOFError as e: + msg = "end of sequence" + raise StopIteration(msg) from e + + +def all_frames( + im: Image.Image | list[Image.Image], + func: Callable[[Image.Image], Image.Image] | None = None, +) -> list[Image.Image]: + """ + Applies a given function to all frames in an image or a list of images. + The frames are returned as a list of separate images. + + :param im: An image, or a list of images. + :param func: The function to apply to all of the image frames. + :returns: A list of images. + """ + if not isinstance(im, list): + im = [im] + + ims = [] + for imSequence in im: + current = imSequence.tell() + + ims += [im_frame.copy() for im_frame in Iterator(imSequence)] + + imSequence.seek(current) + return [func(im) for im in ims] if func else ims diff --git a/venv/lib/python3.12/site-packages/PIL/ImageShow.py b/venv/lib/python3.12/site-packages/PIL/ImageShow.py new file mode 100644 index 0000000..d62893d --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/ImageShow.py @@ -0,0 +1,360 @@ +# +# The Python Imaging Library. +# $Id$ +# +# im.show() drivers +# +# History: +# 2008-04-06 fl Created +# +# Copyright (c) Secret Labs AB 2008. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import abc +import os +import shutil +import subprocess +import sys +from shlex import quote +from typing import Any + +from . import Image + +_viewers = [] + + +def register(viewer: type[Viewer] | Viewer, order: int = 1) -> None: + """ + The :py:func:`register` function is used to register additional viewers:: + + from PIL import ImageShow + ImageShow.register(MyViewer()) # MyViewer will be used as a last resort + ImageShow.register(MySecondViewer(), 0) # MySecondViewer will be prioritised + ImageShow.register(ImageShow.XVViewer(), 0) # XVViewer will be prioritised + + :param viewer: The viewer to be registered. + :param order: + Zero or a negative integer to prepend this viewer to the list, + a positive integer to append it. + """ + if isinstance(viewer, type) and issubclass(viewer, Viewer): + viewer = viewer() + if order > 0: + _viewers.append(viewer) + else: + _viewers.insert(0, viewer) + + +def show(image: Image.Image, title: str | None = None, **options: Any) -> bool: + r""" + Display a given image. + + :param image: An image object. + :param title: Optional title. Not all viewers can display the title. + :param \**options: Additional viewer options. + :returns: ``True`` if a suitable viewer was found, ``False`` otherwise. + """ + for viewer in _viewers: + if viewer.show(image, title=title, **options): + return True + return False + + +class Viewer: + """Base class for viewers.""" + + # main api + + def show(self, image: Image.Image, **options: Any) -> int: + """ + The main function for displaying an image. + Converts the given image to the target format and displays it. + """ + + if not ( + image.mode in ("1", "RGBA") + or (self.format == "PNG" and image.mode in ("I;16", "LA")) + ): + base = Image.getmodebase(image.mode) + if image.mode != base: + image = image.convert(base) + + return self.show_image(image, **options) + + # hook methods + + format: str | None = None + """The format to convert the image into.""" + options: dict[str, Any] = {} + """Additional options used to convert the image.""" + + def get_format(self, image: Image.Image) -> str | None: + """Return format name, or ``None`` to save as PGM/PPM.""" + return self.format + + def get_command(self, file: str, **options: Any) -> str: + """ + Returns the command used to display the file. + Not implemented in the base class. + """ + msg = "unavailable in base viewer" + raise NotImplementedError(msg) + + def save_image(self, image: Image.Image) -> str: + """Save to temporary file and return filename.""" + return image._dump(format=self.get_format(image), **self.options) + + def show_image(self, image: Image.Image, **options: Any) -> int: + """Display the given image.""" + return self.show_file(self.save_image(image), **options) + + def show_file(self, path: str, **options: Any) -> int: + """ + Display given file. + """ + if not os.path.exists(path): + raise FileNotFoundError + os.system(self.get_command(path, **options)) # nosec + return 1 + + +# -------------------------------------------------------------------- + + +class WindowsViewer(Viewer): + """The default viewer on Windows is the default system application for PNG files.""" + + format = "PNG" + options = {"compress_level": 1, "save_all": True} + + def get_command(self, file: str, **options: Any) -> str: + return ( + f'start "Pillow" /WAIT "{file}" ' + "&& ping -n 4 127.0.0.1 >NUL " + f'&& del /f "{file}"' + ) + + def show_file(self, path: str, **options: Any) -> int: + """ + Display given file. + """ + if not os.path.exists(path): + raise FileNotFoundError + subprocess.Popen( + self.get_command(path, **options), + shell=True, + creationflags=getattr(subprocess, "CREATE_NO_WINDOW"), + ) # nosec + return 1 + + +if sys.platform == "win32": + register(WindowsViewer) + + +class MacViewer(Viewer): + """The default viewer on macOS using ``Preview.app``.""" + + format = "PNG" + options = {"compress_level": 1, "save_all": True} + + def get_command(self, file: str, **options: Any) -> str: + # on darwin open returns immediately resulting in the temp + # file removal while app is opening + command = "open -a Preview.app" + command = f"({command} {quote(file)}; sleep 20; rm -f {quote(file)})&" + return command + + def show_file(self, path: str, **options: Any) -> int: + """ + Display given file. + """ + if not os.path.exists(path): + raise FileNotFoundError + subprocess.call(["open", "-a", "Preview.app", path]) + executable = sys.executable or shutil.which("python3") + if executable: + subprocess.Popen( + [ + executable, + "-c", + "import os, sys, time; time.sleep(20); os.remove(sys.argv[1])", + path, + ] + ) + return 1 + + +if sys.platform == "darwin": + register(MacViewer) + + +class UnixViewer(Viewer): + format = "PNG" + options = {"compress_level": 1, "save_all": True} + + @abc.abstractmethod + def get_command_ex(self, file: str, **options: Any) -> tuple[str, str]: + pass + + def get_command(self, file: str, **options: Any) -> str: + command = self.get_command_ex(file, **options)[0] + return f"{command} {quote(file)}" + + +class XDGViewer(UnixViewer): + """ + The freedesktop.org ``xdg-open`` command. + """ + + def get_command_ex(self, file: str, **options: Any) -> tuple[str, str]: + command = executable = "xdg-open" + return command, executable + + def show_file(self, path: str, **options: Any) -> int: + """ + Display given file. + """ + if not os.path.exists(path): + raise FileNotFoundError + subprocess.Popen(["xdg-open", path]) + return 1 + + +class DisplayViewer(UnixViewer): + """ + The ImageMagick ``display`` command. + This viewer supports the ``title`` parameter. + """ + + def get_command_ex( + self, file: str, title: str | None = None, **options: Any + ) -> tuple[str, str]: + command = executable = "display" + if title: + command += f" -title {quote(title)}" + return command, executable + + def show_file(self, path: str, **options: Any) -> int: + """ + Display given file. + """ + if not os.path.exists(path): + raise FileNotFoundError + args = ["display"] + title = options.get("title") + if title: + args += ["-title", title] + args.append(path) + + subprocess.Popen(args) + return 1 + + +class GmDisplayViewer(UnixViewer): + """The GraphicsMagick ``gm display`` command.""" + + def get_command_ex(self, file: str, **options: Any) -> tuple[str, str]: + executable = "gm" + command = "gm display" + return command, executable + + def show_file(self, path: str, **options: Any) -> int: + """ + Display given file. + """ + if not os.path.exists(path): + raise FileNotFoundError + subprocess.Popen(["gm", "display", path]) + return 1 + + +class EogViewer(UnixViewer): + """The GNOME Image Viewer ``eog`` command.""" + + def get_command_ex(self, file: str, **options: Any) -> tuple[str, str]: + executable = "eog" + command = "eog -n" + return command, executable + + def show_file(self, path: str, **options: Any) -> int: + """ + Display given file. + """ + if not os.path.exists(path): + raise FileNotFoundError + subprocess.Popen(["eog", "-n", path]) + return 1 + + +class XVViewer(UnixViewer): + """ + The X Viewer ``xv`` command. + This viewer supports the ``title`` parameter. + """ + + def get_command_ex( + self, file: str, title: str | None = None, **options: Any + ) -> tuple[str, str]: + # note: xv is pretty outdated. most modern systems have + # imagemagick's display command instead. + command = executable = "xv" + if title: + command += f" -name {quote(title)}" + return command, executable + + def show_file(self, path: str, **options: Any) -> int: + """ + Display given file. + """ + if not os.path.exists(path): + raise FileNotFoundError + args = ["xv"] + title = options.get("title") + if title: + args += ["-name", title] + args.append(path) + + subprocess.Popen(args) + return 1 + + +if sys.platform not in ("win32", "darwin"): # unixoids + if shutil.which("xdg-open"): + register(XDGViewer) + if shutil.which("display"): + register(DisplayViewer) + if shutil.which("gm"): + register(GmDisplayViewer) + if shutil.which("eog"): + register(EogViewer) + if shutil.which("xv"): + register(XVViewer) + + +class IPythonViewer(Viewer): + """The viewer for IPython frontends.""" + + def show_image(self, image: Image.Image, **options: Any) -> int: + ipython_display(image) + return 1 + + +try: + from IPython.display import display as ipython_display +except ImportError: + pass +else: + register(IPythonViewer) + + +if __name__ == "__main__": + if len(sys.argv) < 2: + print("Syntax: python3 ImageShow.py imagefile [title]") + sys.exit() + + with Image.open(sys.argv[1]) as im: + print(show(im, *sys.argv[2:])) diff --git a/venv/lib/python3.12/site-packages/PIL/ImageStat.py b/venv/lib/python3.12/site-packages/PIL/ImageStat.py new file mode 100644 index 0000000..8bc5045 --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/ImageStat.py @@ -0,0 +1,160 @@ +# +# The Python Imaging Library. +# $Id$ +# +# global image statistics +# +# History: +# 1996-04-05 fl Created +# 1997-05-21 fl Added mask; added rms, var, stddev attributes +# 1997-08-05 fl Added median +# 1998-07-05 hk Fixed integer overflow error +# +# Notes: +# This class shows how to implement delayed evaluation of attributes. +# To get a certain value, simply access the corresponding attribute. +# The __getattr__ dispatcher takes care of the rest. +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1996-97. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import math +from functools import cached_property + +from . import Image + + +class Stat: + def __init__( + self, image_or_list: Image.Image | list[int], mask: Image.Image | None = None + ) -> None: + """ + Calculate statistics for the given image. If a mask is included, + only the regions covered by that mask are included in the + statistics. You can also pass in a previously calculated histogram. + + :param image: A PIL image, or a precalculated histogram. + + .. note:: + + For a PIL image, calculations rely on the + :py:meth:`~PIL.Image.Image.histogram` method. The pixel counts are + grouped into 256 bins, even if the image has more than 8 bits per + channel. So ``I`` and ``F`` mode images have a maximum ``mean``, + ``median`` and ``rms`` of 255, and cannot have an ``extrema`` maximum + of more than 255. + + :param mask: An optional mask. + """ + if isinstance(image_or_list, Image.Image): + self.h = image_or_list.histogram(mask) + elif isinstance(image_or_list, list): + self.h = image_or_list + else: + msg = "first argument must be image or list" # type: ignore[unreachable] + raise TypeError(msg) + self.bands = list(range(len(self.h) // 256)) + + @cached_property + def extrema(self) -> list[tuple[int, int]]: + """ + Min/max values for each band in the image. + + .. note:: + This relies on the :py:meth:`~PIL.Image.Image.histogram` method, and + simply returns the low and high bins used. This is correct for + images with 8 bits per channel, but fails for other modes such as + ``I`` or ``F``. Instead, use :py:meth:`~PIL.Image.Image.getextrema` to + return per-band extrema for the image. This is more correct and + efficient because, for non-8-bit modes, the histogram method uses + :py:meth:`~PIL.Image.Image.getextrema` to determine the bins used. + """ + + def minmax(histogram: list[int]) -> tuple[int, int]: + res_min, res_max = 255, 0 + for i in range(256): + if histogram[i]: + res_min = i + break + for i in range(255, -1, -1): + if histogram[i]: + res_max = i + break + return res_min, res_max + + return [minmax(self.h[i:]) for i in range(0, len(self.h), 256)] + + @cached_property + def count(self) -> list[int]: + """Total number of pixels for each band in the image.""" + return [sum(self.h[i : i + 256]) for i in range(0, len(self.h), 256)] + + @cached_property + def sum(self) -> list[float]: + """Sum of all pixels for each band in the image.""" + + v = [] + for i in range(0, len(self.h), 256): + layer_sum = 0.0 + for j in range(256): + layer_sum += j * self.h[i + j] + v.append(layer_sum) + return v + + @cached_property + def sum2(self) -> list[float]: + """Squared sum of all pixels for each band in the image.""" + + v = [] + for i in range(0, len(self.h), 256): + sum2 = 0.0 + for j in range(256): + sum2 += (j**2) * float(self.h[i + j]) + v.append(sum2) + return v + + @cached_property + def mean(self) -> list[float]: + """Average (arithmetic mean) pixel level for each band in the image.""" + return [self.sum[i] / self.count[i] for i in self.bands] + + @cached_property + def median(self) -> list[int]: + """Median pixel level for each band in the image.""" + + v = [] + for i in self.bands: + s = 0 + half = self.count[i] // 2 + b = i * 256 + for j in range(256): + s = s + self.h[b + j] + if s > half: + break + v.append(j) + return v + + @cached_property + def rms(self) -> list[float]: + """RMS (root-mean-square) for each band in the image.""" + return [math.sqrt(self.sum2[i] / self.count[i]) for i in self.bands] + + @cached_property + def var(self) -> list[float]: + """Variance for each band in the image.""" + return [ + (self.sum2[i] - (self.sum[i] ** 2.0) / self.count[i]) / self.count[i] + for i in self.bands + ] + + @cached_property + def stddev(self) -> list[float]: + """Standard deviation for each band in the image.""" + return [math.sqrt(self.var[i]) for i in self.bands] + + +Global = Stat # compatibility diff --git a/venv/lib/python3.12/site-packages/PIL/ImageTk.py b/venv/lib/python3.12/site-packages/PIL/ImageTk.py new file mode 100644 index 0000000..bf29fdb --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/ImageTk.py @@ -0,0 +1,290 @@ +# +# The Python Imaging Library. +# $Id$ +# +# a Tk display interface +# +# History: +# 96-04-08 fl Created +# 96-09-06 fl Added getimage method +# 96-11-01 fl Rewritten, removed image attribute and crop method +# 97-05-09 fl Use PyImagingPaste method instead of image type +# 97-05-12 fl Minor tweaks to match the IFUNC95 interface +# 97-05-17 fl Support the "pilbitmap" booster patch +# 97-06-05 fl Added file= and data= argument to image constructors +# 98-03-09 fl Added width and height methods to Image classes +# 98-07-02 fl Use default mode for "P" images without palette attribute +# 98-07-02 fl Explicitly destroy Tkinter image objects +# 99-07-24 fl Support multiple Tk interpreters (from Greg Couch) +# 99-07-26 fl Automatically hook into Tkinter (if possible) +# 99-08-15 fl Hook uses _imagingtk instead of _imaging +# +# Copyright (c) 1997-1999 by Secret Labs AB +# Copyright (c) 1996-1997 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import tkinter +from io import BytesIO +from typing import TYPE_CHECKING, Any, cast + +from . import Image, ImageFile + +if TYPE_CHECKING: + from ._typing import CapsuleType + +# -------------------------------------------------------------------- +# Check for Tkinter interface hooks + + +def _get_image_from_kw(kw: dict[str, Any]) -> ImageFile.ImageFile | None: + source = None + if "file" in kw: + source = kw.pop("file") + elif "data" in kw: + source = BytesIO(kw.pop("data")) + if not source: + return None + return Image.open(source) + + +def _pyimagingtkcall( + command: str, photo: PhotoImage | tkinter.PhotoImage, ptr: CapsuleType +) -> None: + tk = photo.tk + try: + tk.call(command, photo, repr(ptr)) + except tkinter.TclError: + # activate Tkinter hook + # may raise an error if it cannot attach to Tkinter + from . import _imagingtk + + _imagingtk.tkinit(tk.interpaddr()) + tk.call(command, photo, repr(ptr)) + + +# -------------------------------------------------------------------- +# PhotoImage + + +class PhotoImage: + """ + A Tkinter-compatible photo image. This can be used + everywhere Tkinter expects an image object. If the image is an RGBA + image, pixels having alpha 0 are treated as transparent. + + The constructor takes either a PIL image, or a mode and a size. + Alternatively, you can use the ``file`` or ``data`` options to initialize + the photo image object. + + :param image: Either a PIL image, or a mode string. If a mode string is + used, a size must also be given. + :param size: If the first argument is a mode string, this defines the size + of the image. + :keyword file: A filename to load the image from (using + ``Image.open(file)``). + :keyword data: An 8-bit string containing image data (as loaded from an + image file). + """ + + def __init__( + self, + image: Image.Image | str | None = None, + size: tuple[int, int] | None = None, + **kw: Any, + ) -> None: + # Tk compatibility: file or data + if image is None: + image = _get_image_from_kw(kw) + + if image is None: + msg = "Image is required" + raise ValueError(msg) + elif isinstance(image, str): + mode = image + image = None + + if size is None: + msg = "If first argument is mode, size is required" + raise ValueError(msg) + else: + # got an image instead of a mode + mode = image.mode + if mode == "P": + # palette mapped data + image.apply_transparency() + image.load() + mode = image.palette.mode if image.palette else "RGB" + size = image.size + kw["width"], kw["height"] = size + + if mode not in ["1", "L", "RGB", "RGBA"]: + mode = Image.getmodebase(mode) + + self.__mode = mode + self.__size = size + self.__photo = tkinter.PhotoImage(**kw) + self.tk = self.__photo.tk + if image: + self.paste(image) + + def __del__(self) -> None: + try: + name = self.__photo.name + except AttributeError: + return + self.__photo.name = None + try: + self.__photo.tk.call("image", "delete", name) + except Exception: + pass # ignore internal errors + + def __str__(self) -> str: + """ + Get the Tkinter photo image identifier. This method is automatically + called by Tkinter whenever a PhotoImage object is passed to a Tkinter + method. + + :return: A Tkinter photo image identifier (a string). + """ + return str(self.__photo) + + def width(self) -> int: + """ + Get the width of the image. + + :return: The width, in pixels. + """ + return self.__size[0] + + def height(self) -> int: + """ + Get the height of the image. + + :return: The height, in pixels. + """ + return self.__size[1] + + def paste(self, im: Image.Image) -> None: + """ + Paste a PIL image into the photo image. Note that this can + be very slow if the photo image is displayed. + + :param im: A PIL image. The size must match the target region. If the + mode does not match, the image is converted to the mode of + the bitmap image. + """ + # convert to blittable + ptr = im.getim() + image = im.im + if not image.isblock() or im.mode != self.__mode: + block = Image.core.new_block(self.__mode, im.size) + image.convert2(block, image) # convert directly between buffers + ptr = block.ptr + + _pyimagingtkcall("PyImagingPhoto", self.__photo, ptr) + + +# -------------------------------------------------------------------- +# BitmapImage + + +class BitmapImage: + """ + A Tkinter-compatible bitmap image. This can be used everywhere Tkinter + expects an image object. + + The given image must have mode "1". Pixels having value 0 are treated as + transparent. Options, if any, are passed on to Tkinter. The most commonly + used option is ``foreground``, which is used to specify the color for the + non-transparent parts. See the Tkinter documentation for information on + how to specify colours. + + :param image: A PIL image. + """ + + def __init__(self, image: Image.Image | None = None, **kw: Any) -> None: + # Tk compatibility: file or data + if image is None: + image = _get_image_from_kw(kw) + + if image is None: + msg = "Image is required" + raise ValueError(msg) + self.__mode = image.mode + self.__size = image.size + + self.__photo = tkinter.BitmapImage(data=image.tobitmap(), **kw) + + def __del__(self) -> None: + try: + name = self.__photo.name + except AttributeError: + return + self.__photo.name = None + try: + self.__photo.tk.call("image", "delete", name) + except Exception: + pass # ignore internal errors + + def width(self) -> int: + """ + Get the width of the image. + + :return: The width, in pixels. + """ + return self.__size[0] + + def height(self) -> int: + """ + Get the height of the image. + + :return: The height, in pixels. + """ + return self.__size[1] + + def __str__(self) -> str: + """ + Get the Tkinter bitmap image identifier. This method is automatically + called by Tkinter whenever a BitmapImage object is passed to a Tkinter + method. + + :return: A Tkinter bitmap image identifier (a string). + """ + return str(self.__photo) + + +def getimage(photo: PhotoImage) -> Image.Image: + """Copies the contents of a PhotoImage to a PIL image memory.""" + im = Image.new("RGBA", (photo.width(), photo.height())) + + _pyimagingtkcall("PyImagingPhotoGet", photo, im.getim()) + + return im + + +def _show(image: Image.Image, title: str | None) -> None: + """Helper for the Image.show method.""" + + class UI(tkinter.Label): + def __init__(self, master: tkinter.Toplevel, im: Image.Image) -> None: + self.image: BitmapImage | PhotoImage + if im.mode == "1": + self.image = BitmapImage(im, foreground="white", master=master) + else: + self.image = PhotoImage(im, master=master) + if TYPE_CHECKING: + image = cast(tkinter._Image, self.image) + else: + image = self.image + super().__init__(master, image=image, bg="black", bd=0) + + if not getattr(tkinter, "_default_root"): + msg = "tkinter not initialized" + raise OSError(msg) + top = tkinter.Toplevel() + if title: + top.title(title) + UI(top, image).pack() diff --git a/venv/lib/python3.12/site-packages/PIL/ImageTransform.py b/venv/lib/python3.12/site-packages/PIL/ImageTransform.py new file mode 100644 index 0000000..a3d8f44 --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/ImageTransform.py @@ -0,0 +1,136 @@ +# +# The Python Imaging Library. +# $Id$ +# +# transform wrappers +# +# History: +# 2002-04-08 fl Created +# +# Copyright (c) 2002 by Secret Labs AB +# Copyright (c) 2002 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +from collections.abc import Sequence +from typing import Any + +from . import Image + + +class Transform(Image.ImageTransformHandler): + """Base class for other transforms defined in :py:mod:`~PIL.ImageTransform`.""" + + method: Image.Transform + + def __init__(self, data: Sequence[Any]) -> None: + self.data = data + + def getdata(self) -> tuple[Image.Transform, Sequence[int]]: + return self.method, self.data + + def transform( + self, + size: tuple[int, int], + image: Image.Image, + **options: Any, + ) -> Image.Image: + """Perform the transform. Called from :py:meth:`.Image.transform`.""" + # can be overridden + method, data = self.getdata() + return image.transform(size, method, data, **options) + + +class AffineTransform(Transform): + """ + Define an affine image transform. + + This function takes a 6-tuple (a, b, c, d, e, f) which contain the first + two rows from an affine transform matrix. For each pixel (x, y) in the + output image, the new value is taken from a position (a x + b y + c, + d x + e y + f) in the input image, rounded to nearest pixel. + + This function can be used to scale, translate, rotate, and shear the + original image. + + See :py:meth:`.Image.transform` + + :param matrix: A 6-tuple (a, b, c, d, e, f) containing the first two rows + from an affine transform matrix. + """ + + method = Image.Transform.AFFINE + + +class PerspectiveTransform(Transform): + """ + Define a perspective image transform. + + This function takes an 8-tuple (a, b, c, d, e, f, g, h). For each pixel + (x, y) in the output image, the new value is taken from a position + ((a x + b y + c) / (g x + h y + 1), (d x + e y + f) / (g x + h y + 1)) in + the input image, rounded to nearest pixel. + + This function can be used to scale, translate, rotate, and shear the + original image. + + See :py:meth:`.Image.transform` + + :param matrix: An 8-tuple (a, b, c, d, e, f, g, h). + """ + + method = Image.Transform.PERSPECTIVE + + +class ExtentTransform(Transform): + """ + Define a transform to extract a subregion from an image. + + Maps a rectangle (defined by two corners) from the image to a rectangle of + the given size. The resulting image will contain data sampled from between + the corners, such that (x0, y0) in the input image will end up at (0,0) in + the output image, and (x1, y1) at size. + + This method can be used to crop, stretch, shrink, or mirror an arbitrary + rectangle in the current image. It is slightly slower than crop, but about + as fast as a corresponding resize operation. + + See :py:meth:`.Image.transform` + + :param bbox: A 4-tuple (x0, y0, x1, y1) which specifies two points in the + input image's coordinate system. See :ref:`coordinate-system`. + """ + + method = Image.Transform.EXTENT + + +class QuadTransform(Transform): + """ + Define a quad image transform. + + Maps a quadrilateral (a region defined by four corners) from the image to a + rectangle of the given size. + + See :py:meth:`.Image.transform` + + :param xy: An 8-tuple (x0, y0, x1, y1, x2, y2, x3, y3) which contain the + upper left, lower left, lower right, and upper right corner of the + source quadrilateral. + """ + + method = Image.Transform.QUAD + + +class MeshTransform(Transform): + """ + Define a mesh image transform. A mesh transform consists of one or more + individual quad transforms. + + See :py:meth:`.Image.transform` + + :param data: A list of (bbox, quad) tuples. + """ + + method = Image.Transform.MESH diff --git a/venv/lib/python3.12/site-packages/PIL/ImageWin.py b/venv/lib/python3.12/site-packages/PIL/ImageWin.py new file mode 100644 index 0000000..98c28f2 --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/ImageWin.py @@ -0,0 +1,247 @@ +# +# The Python Imaging Library. +# $Id$ +# +# a Windows DIB display interface +# +# History: +# 1996-05-20 fl Created +# 1996-09-20 fl Fixed subregion exposure +# 1997-09-21 fl Added draw primitive (for tzPrint) +# 2003-05-21 fl Added experimental Window/ImageWindow classes +# 2003-09-05 fl Added fromstring/tostring methods +# +# Copyright (c) Secret Labs AB 1997-2003. +# Copyright (c) Fredrik Lundh 1996-2003. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +from . import Image + + +class HDC: + """ + Wraps an HDC integer. The resulting object can be passed to the + :py:meth:`~PIL.ImageWin.Dib.draw` and :py:meth:`~PIL.ImageWin.Dib.expose` + methods. + """ + + def __init__(self, dc: int) -> None: + self.dc = dc + + def __int__(self) -> int: + return self.dc + + +class HWND: + """ + Wraps an HWND integer. The resulting object can be passed to the + :py:meth:`~PIL.ImageWin.Dib.draw` and :py:meth:`~PIL.ImageWin.Dib.expose` + methods, instead of a DC. + """ + + def __init__(self, wnd: int) -> None: + self.wnd = wnd + + def __int__(self) -> int: + return self.wnd + + +class Dib: + """ + A Windows bitmap with the given mode and size. The mode can be one of "1", + "L", "P", or "RGB". + + If the display requires a palette, this constructor creates a suitable + palette and associates it with the image. For an "L" image, 128 graylevels + are allocated. For an "RGB" image, a 6x6x6 colour cube is used, together + with 20 graylevels. + + To make sure that palettes work properly under Windows, you must call the + ``palette`` method upon certain events from Windows. + + :param image: Either a PIL image, or a mode string. If a mode string is + used, a size must also be given. The mode can be one of "1", + "L", "P", or "RGB". + :param size: If the first argument is a mode string, this + defines the size of the image. + """ + + def __init__( + self, image: Image.Image | str, size: tuple[int, int] | None = None + ) -> None: + if isinstance(image, str): + mode = image + image = "" + if size is None: + msg = "If first argument is mode, size is required" + raise ValueError(msg) + else: + mode = image.mode + size = image.size + if mode not in ["1", "L", "P", "RGB"]: + mode = Image.getmodebase(mode) + self.image = Image.core.display(mode, size) + self.mode = mode + self.size = size + if image: + assert not isinstance(image, str) + self.paste(image) + + def expose(self, handle: int | HDC | HWND) -> None: + """ + Copy the bitmap contents to a device context. + + :param handle: Device context (HDC), cast to a Python integer, or an + HDC or HWND instance. In PythonWin, you can use + ``CDC.GetHandleAttrib()`` to get a suitable handle. + """ + handle_int = int(handle) + if isinstance(handle, HWND): + dc = self.image.getdc(handle_int) + try: + self.image.expose(dc) + finally: + self.image.releasedc(handle_int, dc) + else: + self.image.expose(handle_int) + + def draw( + self, + handle: int | HDC | HWND, + dst: tuple[int, int, int, int], + src: tuple[int, int, int, int] | None = None, + ) -> None: + """ + Same as expose, but allows you to specify where to draw the image, and + what part of it to draw. + + The destination and source areas are given as 4-tuple rectangles. If + the source is omitted, the entire image is copied. If the source and + the destination have different sizes, the image is resized as + necessary. + """ + if src is None: + src = (0, 0) + self.size + handle_int = int(handle) + if isinstance(handle, HWND): + dc = self.image.getdc(handle_int) + try: + self.image.draw(dc, dst, src) + finally: + self.image.releasedc(handle_int, dc) + else: + self.image.draw(handle_int, dst, src) + + def query_palette(self, handle: int | HDC | HWND) -> int: + """ + Installs the palette associated with the image in the given device + context. + + This method should be called upon **QUERYNEWPALETTE** and + **PALETTECHANGED** events from Windows. If this method returns a + non-zero value, one or more display palette entries were changed, and + the image should be redrawn. + + :param handle: Device context (HDC), cast to a Python integer, or an + HDC or HWND instance. + :return: The number of entries that were changed (if one or more entries, + this indicates that the image should be redrawn). + """ + handle_int = int(handle) + if isinstance(handle, HWND): + handle = self.image.getdc(handle_int) + try: + result = self.image.query_palette(handle) + finally: + self.image.releasedc(handle, handle) + else: + result = self.image.query_palette(handle_int) + return result + + def paste( + self, im: Image.Image, box: tuple[int, int, int, int] | None = None + ) -> None: + """ + Paste a PIL image into the bitmap image. + + :param im: A PIL image. The size must match the target region. + If the mode does not match, the image is converted to the + mode of the bitmap image. + :param box: A 4-tuple defining the left, upper, right, and + lower pixel coordinate. See :ref:`coordinate-system`. If + None is given instead of a tuple, all of the image is + assumed. + """ + im.load() + if self.mode != im.mode: + im = im.convert(self.mode) + if box: + self.image.paste(im.im, box) + else: + self.image.paste(im.im) + + def frombytes(self, buffer: bytes) -> None: + """ + Load display memory contents from byte data. + + :param buffer: A buffer containing display data (usually + data returned from :py:func:`~PIL.ImageWin.Dib.tobytes`) + """ + self.image.frombytes(buffer) + + def tobytes(self) -> bytes: + """ + Copy display memory contents to bytes object. + + :return: A bytes object containing display data. + """ + return self.image.tobytes() + + +class Window: + """Create a Window with the given title size.""" + + def __init__( + self, title: str = "PIL", width: int | None = None, height: int | None = None + ) -> None: + self.hwnd = Image.core.createwindow( + title, self.__dispatcher, width or 0, height or 0 + ) + + def __dispatcher(self, action: str, *args: int) -> None: + getattr(self, f"ui_handle_{action}")(*args) + + def ui_handle_clear(self, dc: int, x0: int, y0: int, x1: int, y1: int) -> None: + pass + + def ui_handle_damage(self, x0: int, y0: int, x1: int, y1: int) -> None: + pass + + def ui_handle_destroy(self) -> None: + pass + + def ui_handle_repair(self, dc: int, x0: int, y0: int, x1: int, y1: int) -> None: + pass + + def ui_handle_resize(self, width: int, height: int) -> None: + pass + + def mainloop(self) -> None: + Image.core.eventloop() + + +class ImageWindow(Window): + """Create an image window which displays the given image.""" + + def __init__(self, image: Image.Image | Dib, title: str = "PIL") -> None: + if not isinstance(image, Dib): + image = Dib(image) + self.image = image + width, height = image.size + super().__init__(title, width=width, height=height) + + def ui_handle_repair(self, dc: int, x0: int, y0: int, x1: int, y1: int) -> None: + self.image.draw(dc, (x0, y0, x1, y1)) diff --git a/venv/lib/python3.12/site-packages/PIL/ImtImagePlugin.py b/venv/lib/python3.12/site-packages/PIL/ImtImagePlugin.py new file mode 100644 index 0000000..594c565 --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/ImtImagePlugin.py @@ -0,0 +1,103 @@ +# +# The Python Imaging Library. +# $Id$ +# +# IM Tools support for PIL +# +# history: +# 1996-05-27 fl Created (read 8-bit images only) +# 2001-02-17 fl Use 're' instead of 'regex' (Python 2.1) (0.2) +# +# Copyright (c) Secret Labs AB 1997-2001. +# Copyright (c) Fredrik Lundh 1996-2001. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import re + +from . import Image, ImageFile + +# +# -------------------------------------------------------------------- + +field = re.compile(rb"([a-z]*) ([^ \r\n]*)") + + +## +# Image plugin for IM Tools images. + + +class ImtImageFile(ImageFile.ImageFile): + format = "IMT" + format_description = "IM Tools" + + def _open(self) -> None: + # Quick rejection: if there's not a LF among the first + # 100 bytes, this is (probably) not a text header. + + assert self.fp is not None + + buffer = self.fp.read(100) + if b"\n" not in buffer: + msg = "not an IM file" + raise SyntaxError(msg) + + xsize = ysize = 0 + + while True: + if buffer: + s = buffer[:1] + buffer = buffer[1:] + else: + s = self.fp.read(1) + if not s: + break + + if s == b"\x0C": + # image data begins + self.tile = [ + ImageFile._Tile( + "raw", + (0, 0) + self.size, + self.fp.tell() - len(buffer), + (self.mode, 0, 1), + ) + ] + + break + + else: + # read key/value pair + if b"\n" not in buffer: + buffer += self.fp.read(100) + lines = buffer.split(b"\n") + s += lines.pop(0) + buffer = b"\n".join(lines) + if len(s) == 1 or len(s) > 100: + break + if s[0] == ord(b"*"): + continue # comment + + m = field.match(s) + if not m: + break + k, v = m.group(1, 2) + if k == b"width": + xsize = int(v) + self._size = xsize, ysize + elif k == b"height": + ysize = int(v) + self._size = xsize, ysize + elif k == b"pixel" and v == b"n8": + self._mode = "L" + + +# +# -------------------------------------------------------------------- + +Image.register_open(ImtImageFile.format, ImtImageFile) + +# +# no extension registered (".im" is simply too common) diff --git a/venv/lib/python3.12/site-packages/PIL/IptcImagePlugin.py b/venv/lib/python3.12/site-packages/PIL/IptcImagePlugin.py new file mode 100644 index 0000000..60ab7c8 --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/IptcImagePlugin.py @@ -0,0 +1,249 @@ +# +# The Python Imaging Library. +# $Id$ +# +# IPTC/NAA file handling +# +# history: +# 1995-10-01 fl Created +# 1998-03-09 fl Cleaned up and added to PIL +# 2002-06-18 fl Added getiptcinfo helper +# +# Copyright (c) Secret Labs AB 1997-2002. +# Copyright (c) Fredrik Lundh 1995. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +from collections.abc import Sequence +from io import BytesIO +from typing import cast + +from . import Image, ImageFile +from ._binary import i16be as i16 +from ._binary import i32be as i32 +from ._deprecate import deprecate + +COMPRESSION = {1: "raw", 5: "jpeg"} + + +def __getattr__(name: str) -> bytes: + if name == "PAD": + deprecate("IptcImagePlugin.PAD", 12) + return b"\0\0\0\0" + msg = f"module '{__name__}' has no attribute '{name}'" + raise AttributeError(msg) + + +# +# Helpers + + +def _i(c: bytes) -> int: + return i32((b"\0\0\0\0" + c)[-4:]) + + +def _i8(c: int | bytes) -> int: + return c if isinstance(c, int) else c[0] + + +def i(c: bytes) -> int: + """.. deprecated:: 10.2.0""" + deprecate("IptcImagePlugin.i", 12) + return _i(c) + + +def dump(c: Sequence[int | bytes]) -> None: + """.. deprecated:: 10.2.0""" + deprecate("IptcImagePlugin.dump", 12) + for i in c: + print(f"{_i8(i):02x}", end=" ") + print() + + +## +# Image plugin for IPTC/NAA datastreams. To read IPTC/NAA fields +# from TIFF and JPEG files, use the getiptcinfo function. + + +class IptcImageFile(ImageFile.ImageFile): + format = "IPTC" + format_description = "IPTC/NAA" + + def getint(self, key: tuple[int, int]) -> int: + return _i(self.info[key]) + + def field(self) -> tuple[tuple[int, int] | None, int]: + # + # get a IPTC field header + s = self.fp.read(5) + if not s.strip(b"\x00"): + return None, 0 + + tag = s[1], s[2] + + # syntax + if s[0] != 0x1C or tag[0] not in [1, 2, 3, 4, 5, 6, 7, 8, 9, 240]: + msg = "invalid IPTC/NAA file" + raise SyntaxError(msg) + + # field size + size = s[3] + if size > 132: + msg = "illegal field length in IPTC/NAA file" + raise OSError(msg) + elif size == 128: + size = 0 + elif size > 128: + size = _i(self.fp.read(size - 128)) + else: + size = i16(s, 3) + + return tag, size + + def _open(self) -> None: + # load descriptive fields + while True: + offset = self.fp.tell() + tag, size = self.field() + if not tag or tag == (8, 10): + break + if size: + tagdata = self.fp.read(size) + else: + tagdata = None + if tag in self.info: + if isinstance(self.info[tag], list): + self.info[tag].append(tagdata) + else: + self.info[tag] = [self.info[tag], tagdata] + else: + self.info[tag] = tagdata + + # mode + layers = self.info[(3, 60)][0] + component = self.info[(3, 60)][1] + if (3, 65) in self.info: + id = self.info[(3, 65)][0] - 1 + else: + id = 0 + if layers == 1 and not component: + self._mode = "L" + elif layers == 3 and component: + self._mode = "RGB"[id] + elif layers == 4 and component: + self._mode = "CMYK"[id] + + # size + self._size = self.getint((3, 20)), self.getint((3, 30)) + + # compression + try: + compression = COMPRESSION[self.getint((3, 120))] + except KeyError as e: + msg = "Unknown IPTC image compression" + raise OSError(msg) from e + + # tile + if tag == (8, 10): + self.tile = [ + ImageFile._Tile("iptc", (0, 0) + self.size, offset, compression) + ] + + def load(self) -> Image.core.PixelAccess | None: + if len(self.tile) != 1 or self.tile[0][0] != "iptc": + return ImageFile.ImageFile.load(self) + + offset, compression = self.tile[0][2:] + + self.fp.seek(offset) + + # Copy image data to temporary file + o = BytesIO() + if compression == "raw": + # To simplify access to the extracted file, + # prepend a PPM header + o.write(b"P5\n%d %d\n255\n" % self.size) + while True: + type, size = self.field() + if type != (8, 10): + break + while size > 0: + s = self.fp.read(min(size, 8192)) + if not s: + break + o.write(s) + size -= len(s) + + with Image.open(o) as _im: + _im.load() + self.im = _im.im + return None + + +Image.register_open(IptcImageFile.format, IptcImageFile) + +Image.register_extension(IptcImageFile.format, ".iim") + + +def getiptcinfo( + im: ImageFile.ImageFile, +) -> dict[tuple[int, int], bytes | list[bytes]] | None: + """ + Get IPTC information from TIFF, JPEG, or IPTC file. + + :param im: An image containing IPTC data. + :returns: A dictionary containing IPTC information, or None if + no IPTC information block was found. + """ + from . import JpegImagePlugin, TiffImagePlugin + + data = None + + info: dict[tuple[int, int], bytes | list[bytes]] = {} + if isinstance(im, IptcImageFile): + # return info dictionary right away + for k, v in im.info.items(): + if isinstance(k, tuple): + info[k] = v + return info + + elif isinstance(im, JpegImagePlugin.JpegImageFile): + # extract the IPTC/NAA resource + photoshop = im.info.get("photoshop") + if photoshop: + data = photoshop.get(0x0404) + + elif isinstance(im, TiffImagePlugin.TiffImageFile): + # get raw data from the IPTC/NAA tag (PhotoShop tags the data + # as 4-byte integers, so we cannot use the get method...) + try: + data = im.tag_v2[TiffImagePlugin.IPTC_NAA_CHUNK] + except KeyError: + pass + + if data is None: + return None # no properties + + # create an IptcImagePlugin object without initializing it + class FakeImage: + pass + + fake_im = FakeImage() + fake_im.__class__ = IptcImageFile # type: ignore[assignment] + iptc_im = cast(IptcImageFile, fake_im) + + # parse the IPTC information chunk + iptc_im.info = {} + iptc_im.fp = BytesIO(data) + + try: + iptc_im._open() + except (IndexError, KeyError): + pass # expected failure + + for k, v in iptc_im.info.items(): + if isinstance(k, tuple): + info[k] = v + return info diff --git a/venv/lib/python3.12/site-packages/PIL/Jpeg2KImagePlugin.py b/venv/lib/python3.12/site-packages/PIL/Jpeg2KImagePlugin.py new file mode 100644 index 0000000..b6ebd56 --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/Jpeg2KImagePlugin.py @@ -0,0 +1,443 @@ +# +# The Python Imaging Library +# $Id$ +# +# JPEG2000 file handling +# +# History: +# 2014-03-12 ajh Created +# 2021-06-30 rogermb Extract dpi information from the 'resc' header box +# +# Copyright (c) 2014 Coriolis Systems Limited +# Copyright (c) 2014 Alastair Houghton +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import io +import os +import struct +from collections.abc import Callable +from typing import IO, cast + +from . import Image, ImageFile, ImagePalette, _binary + + +class BoxReader: + """ + A small helper class to read fields stored in JPEG2000 header boxes + and to easily step into and read sub-boxes. + """ + + def __init__(self, fp: IO[bytes], length: int = -1) -> None: + self.fp = fp + self.has_length = length >= 0 + self.length = length + self.remaining_in_box = -1 + + def _can_read(self, num_bytes: int) -> bool: + if self.has_length and self.fp.tell() + num_bytes > self.length: + # Outside box: ensure we don't read past the known file length + return False + if self.remaining_in_box >= 0: + # Inside box contents: ensure read does not go past box boundaries + return num_bytes <= self.remaining_in_box + else: + return True # No length known, just read + + def _read_bytes(self, num_bytes: int) -> bytes: + if not self._can_read(num_bytes): + msg = "Not enough data in header" + raise SyntaxError(msg) + + data = self.fp.read(num_bytes) + if len(data) < num_bytes: + msg = f"Expected to read {num_bytes} bytes but only got {len(data)}." + raise OSError(msg) + + if self.remaining_in_box > 0: + self.remaining_in_box -= num_bytes + return data + + def read_fields(self, field_format: str) -> tuple[int | bytes, ...]: + size = struct.calcsize(field_format) + data = self._read_bytes(size) + return struct.unpack(field_format, data) + + def read_boxes(self) -> BoxReader: + size = self.remaining_in_box + data = self._read_bytes(size) + return BoxReader(io.BytesIO(data), size) + + def has_next_box(self) -> bool: + if self.has_length: + return self.fp.tell() + self.remaining_in_box < self.length + else: + return True + + def next_box_type(self) -> bytes: + # Skip the rest of the box if it has not been read + if self.remaining_in_box > 0: + self.fp.seek(self.remaining_in_box, os.SEEK_CUR) + self.remaining_in_box = -1 + + # Read the length and type of the next box + lbox, tbox = cast(tuple[int, bytes], self.read_fields(">I4s")) + if lbox == 1: + lbox = cast(int, self.read_fields(">Q")[0]) + hlen = 16 + else: + hlen = 8 + + if lbox < hlen or not self._can_read(lbox - hlen): + msg = "Invalid header length" + raise SyntaxError(msg) + + self.remaining_in_box = lbox - hlen + return tbox + + +def _parse_codestream(fp: IO[bytes]) -> tuple[tuple[int, int], str]: + """Parse the JPEG 2000 codestream to extract the size and component + count from the SIZ marker segment, returning a PIL (size, mode) tuple.""" + + hdr = fp.read(2) + lsiz = _binary.i16be(hdr) + siz = hdr + fp.read(lsiz - 2) + lsiz, rsiz, xsiz, ysiz, xosiz, yosiz, _, _, _, _, csiz = struct.unpack_from( + ">HHIIIIIIIIH", siz + ) + + size = (xsiz - xosiz, ysiz - yosiz) + if csiz == 1: + ssiz = struct.unpack_from(">B", siz, 38) + if (ssiz[0] & 0x7F) + 1 > 8: + mode = "I;16" + else: + mode = "L" + elif csiz == 2: + mode = "LA" + elif csiz == 3: + mode = "RGB" + elif csiz == 4: + mode = "RGBA" + else: + msg = "unable to determine J2K image mode" + raise SyntaxError(msg) + + return size, mode + + +def _res_to_dpi(num: int, denom: int, exp: int) -> float | None: + """Convert JPEG2000's (numerator, denominator, exponent-base-10) resolution, + calculated as (num / denom) * 10^exp and stored in dots per meter, + to floating-point dots per inch.""" + if denom == 0: + return None + return (254 * num * (10**exp)) / (10000 * denom) + + +def _parse_jp2_header( + fp: IO[bytes], +) -> tuple[ + tuple[int, int], + str, + str | None, + tuple[float, float] | None, + ImagePalette.ImagePalette | None, +]: + """Parse the JP2 header box to extract size, component count, + color space information, and optionally DPI information, + returning a (size, mode, mimetype, dpi) tuple.""" + + # Find the JP2 header box + reader = BoxReader(fp) + header = None + mimetype = None + while reader.has_next_box(): + tbox = reader.next_box_type() + + if tbox == b"jp2h": + header = reader.read_boxes() + break + elif tbox == b"ftyp": + if reader.read_fields(">4s")[0] == b"jpx ": + mimetype = "image/jpx" + assert header is not None + + size = None + mode = None + bpc = None + nc = None + dpi = None # 2-tuple of DPI info, or None + palette = None + + while header.has_next_box(): + tbox = header.next_box_type() + + if tbox == b"ihdr": + height, width, nc, bpc = header.read_fields(">IIHB") + assert isinstance(height, int) + assert isinstance(width, int) + assert isinstance(bpc, int) + size = (width, height) + if nc == 1 and (bpc & 0x7F) > 8: + mode = "I;16" + elif nc == 1: + mode = "L" + elif nc == 2: + mode = "LA" + elif nc == 3: + mode = "RGB" + elif nc == 4: + mode = "RGBA" + elif tbox == b"colr" and nc == 4: + meth, _, _, enumcs = header.read_fields(">BBBI") + if meth == 1 and enumcs == 12: + mode = "CMYK" + elif tbox == b"pclr" and mode in ("L", "LA"): + ne, npc = header.read_fields(">HB") + assert isinstance(ne, int) + assert isinstance(npc, int) + max_bitdepth = 0 + for bitdepth in header.read_fields(">" + ("B" * npc)): + assert isinstance(bitdepth, int) + if bitdepth > max_bitdepth: + max_bitdepth = bitdepth + if max_bitdepth <= 8: + palette = ImagePalette.ImagePalette("RGBA" if npc == 4 else "RGB") + for i in range(ne): + color: list[int] = [] + for value in header.read_fields(">" + ("B" * npc)): + assert isinstance(value, int) + color.append(value) + palette.getcolor(tuple(color)) + mode = "P" if mode == "L" else "PA" + elif tbox == b"res ": + res = header.read_boxes() + while res.has_next_box(): + tres = res.next_box_type() + if tres == b"resc": + vrcn, vrcd, hrcn, hrcd, vrce, hrce = res.read_fields(">HHHHBB") + assert isinstance(vrcn, int) + assert isinstance(vrcd, int) + assert isinstance(hrcn, int) + assert isinstance(hrcd, int) + assert isinstance(vrce, int) + assert isinstance(hrce, int) + hres = _res_to_dpi(hrcn, hrcd, hrce) + vres = _res_to_dpi(vrcn, vrcd, vrce) + if hres is not None and vres is not None: + dpi = (hres, vres) + break + + if size is None or mode is None: + msg = "Malformed JP2 header" + raise SyntaxError(msg) + + return size, mode, mimetype, dpi, palette + + +## +# Image plugin for JPEG2000 images. + + +class Jpeg2KImageFile(ImageFile.ImageFile): + format = "JPEG2000" + format_description = "JPEG 2000 (ISO 15444)" + + def _open(self) -> None: + sig = self.fp.read(4) + if sig == b"\xff\x4f\xff\x51": + self.codec = "j2k" + self._size, self._mode = _parse_codestream(self.fp) + else: + sig = sig + self.fp.read(8) + + if sig == b"\x00\x00\x00\x0cjP \x0d\x0a\x87\x0a": + self.codec = "jp2" + header = _parse_jp2_header(self.fp) + self._size, self._mode, self.custom_mimetype, dpi, self.palette = header + if dpi is not None: + self.info["dpi"] = dpi + if self.fp.read(12).endswith(b"jp2c\xff\x4f\xff\x51"): + self._parse_comment() + else: + msg = "not a JPEG 2000 file" + raise SyntaxError(msg) + + self._reduce = 0 + self.layers = 0 + + fd = -1 + length = -1 + + try: + fd = self.fp.fileno() + length = os.fstat(fd).st_size + except Exception: + fd = -1 + try: + pos = self.fp.tell() + self.fp.seek(0, io.SEEK_END) + length = self.fp.tell() + self.fp.seek(pos) + except Exception: + length = -1 + + self.tile = [ + ImageFile._Tile( + "jpeg2k", + (0, 0) + self.size, + 0, + (self.codec, self._reduce, self.layers, fd, length), + ) + ] + + def _parse_comment(self) -> None: + hdr = self.fp.read(2) + length = _binary.i16be(hdr) + self.fp.seek(length - 2, os.SEEK_CUR) + + while True: + marker = self.fp.read(2) + if not marker: + break + typ = marker[1] + if typ in (0x90, 0xD9): + # Start of tile or end of codestream + break + hdr = self.fp.read(2) + length = _binary.i16be(hdr) + if typ == 0x64: + # Comment + self.info["comment"] = self.fp.read(length - 2)[2:] + break + else: + self.fp.seek(length - 2, os.SEEK_CUR) + + @property # type: ignore[override] + def reduce( + self, + ) -> ( + Callable[[int | tuple[int, int], tuple[int, int, int, int] | None], Image.Image] + | int + ): + # https://github.com/python-pillow/Pillow/issues/4343 found that the + # new Image 'reduce' method was shadowed by this plugin's 'reduce' + # property. This attempts to allow for both scenarios + return self._reduce or super().reduce + + @reduce.setter + def reduce(self, value: int) -> None: + self._reduce = value + + def load(self) -> Image.core.PixelAccess | None: + if self.tile and self._reduce: + power = 1 << self._reduce + adjust = power >> 1 + self._size = ( + int((self.size[0] + adjust) / power), + int((self.size[1] + adjust) / power), + ) + + # Update the reduce and layers settings + t = self.tile[0] + assert isinstance(t[3], tuple) + t3 = (t[3][0], self._reduce, self.layers, t[3][3], t[3][4]) + self.tile = [ImageFile._Tile(t[0], (0, 0) + self.size, t[2], t3)] + + return ImageFile.ImageFile.load(self) + + +def _accept(prefix: bytes) -> bool: + return ( + prefix[:4] == b"\xff\x4f\xff\x51" + or prefix[:12] == b"\x00\x00\x00\x0cjP \x0d\x0a\x87\x0a" + ) + + +# ------------------------------------------------------------ +# Save support + + +def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + # Get the keyword arguments + info = im.encoderinfo + + if isinstance(filename, str): + filename = filename.encode() + if filename.endswith(b".j2k") or info.get("no_jp2", False): + kind = "j2k" + else: + kind = "jp2" + + offset = info.get("offset", None) + tile_offset = info.get("tile_offset", None) + tile_size = info.get("tile_size", None) + quality_mode = info.get("quality_mode", "rates") + quality_layers = info.get("quality_layers", None) + if quality_layers is not None and not ( + isinstance(quality_layers, (list, tuple)) + and all( + isinstance(quality_layer, (int, float)) for quality_layer in quality_layers + ) + ): + msg = "quality_layers must be a sequence of numbers" + raise ValueError(msg) + + num_resolutions = info.get("num_resolutions", 0) + cblk_size = info.get("codeblock_size", None) + precinct_size = info.get("precinct_size", None) + irreversible = info.get("irreversible", False) + progression = info.get("progression", "LRCP") + cinema_mode = info.get("cinema_mode", "no") + mct = info.get("mct", 0) + signed = info.get("signed", False) + comment = info.get("comment") + if isinstance(comment, str): + comment = comment.encode() + plt = info.get("plt", False) + + fd = -1 + if hasattr(fp, "fileno"): + try: + fd = fp.fileno() + except Exception: + fd = -1 + + im.encoderconfig = ( + offset, + tile_offset, + tile_size, + quality_mode, + quality_layers, + num_resolutions, + cblk_size, + precinct_size, + irreversible, + progression, + cinema_mode, + mct, + signed, + fd, + comment, + plt, + ) + + ImageFile._save(im, fp, [ImageFile._Tile("jpeg2k", (0, 0) + im.size, 0, kind)]) + + +# ------------------------------------------------------------ +# Registry stuff + + +Image.register_open(Jpeg2KImageFile.format, Jpeg2KImageFile, _accept) +Image.register_save(Jpeg2KImageFile.format, _save) + +Image.register_extensions( + Jpeg2KImageFile.format, [".jp2", ".j2k", ".jpc", ".jpf", ".jpx", ".j2c"] +) + +Image.register_mime(Jpeg2KImageFile.format, "image/jp2") diff --git a/venv/lib/python3.12/site-packages/PIL/JpegImagePlugin.py b/venv/lib/python3.12/site-packages/PIL/JpegImagePlugin.py new file mode 100644 index 0000000..6510e07 --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/JpegImagePlugin.py @@ -0,0 +1,895 @@ +# +# The Python Imaging Library. +# $Id$ +# +# JPEG (JFIF) file handling +# +# See "Digital Compression and Coding of Continuous-Tone Still Images, +# Part 1, Requirements and Guidelines" (CCITT T.81 / ISO 10918-1) +# +# History: +# 1995-09-09 fl Created +# 1995-09-13 fl Added full parser +# 1996-03-25 fl Added hack to use the IJG command line utilities +# 1996-05-05 fl Workaround Photoshop 2.5 CMYK polarity bug +# 1996-05-28 fl Added draft support, JFIF version (0.1) +# 1996-12-30 fl Added encoder options, added progression property (0.2) +# 1997-08-27 fl Save mode 1 images as BW (0.3) +# 1998-07-12 fl Added YCbCr to draft and save methods (0.4) +# 1998-10-19 fl Don't hang on files using 16-bit DQT's (0.4.1) +# 2001-04-16 fl Extract DPI settings from JFIF files (0.4.2) +# 2002-07-01 fl Skip pad bytes before markers; identify Exif files (0.4.3) +# 2003-04-25 fl Added experimental EXIF decoder (0.5) +# 2003-06-06 fl Added experimental EXIF GPSinfo decoder +# 2003-09-13 fl Extract COM markers +# 2009-09-06 fl Added icc_profile support (from Florian Hoech) +# 2009-03-06 fl Changed CMYK handling; always use Adobe polarity (0.6) +# 2009-03-08 fl Added subsampling support (from Justin Huff). +# +# Copyright (c) 1997-2003 by Secret Labs AB. +# Copyright (c) 1995-1996 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import array +import io +import math +import os +import struct +import subprocess +import sys +import tempfile +import warnings +from typing import IO, TYPE_CHECKING, Any + +from . import Image, ImageFile +from ._binary import i16be as i16 +from ._binary import i32be as i32 +from ._binary import o8 +from ._binary import o16be as o16 +from ._deprecate import deprecate +from .JpegPresets import presets + +if TYPE_CHECKING: + from .MpoImagePlugin import MpoImageFile + +# +# Parser + + +def Skip(self: JpegImageFile, marker: int) -> None: + n = i16(self.fp.read(2)) - 2 + ImageFile._safe_read(self.fp, n) + + +def APP(self: JpegImageFile, marker: int) -> None: + # + # Application marker. Store these in the APP dictionary. + # Also look for well-known application markers. + + n = i16(self.fp.read(2)) - 2 + s = ImageFile._safe_read(self.fp, n) + + app = "APP%d" % (marker & 15) + + self.app[app] = s # compatibility + self.applist.append((app, s)) + + if marker == 0xFFE0 and s[:4] == b"JFIF": + # extract JFIF information + self.info["jfif"] = version = i16(s, 5) # version + self.info["jfif_version"] = divmod(version, 256) + # extract JFIF properties + try: + jfif_unit = s[7] + jfif_density = i16(s, 8), i16(s, 10) + except Exception: + pass + else: + if jfif_unit == 1: + self.info["dpi"] = jfif_density + self.info["jfif_unit"] = jfif_unit + self.info["jfif_density"] = jfif_density + elif marker == 0xFFE1 and s[:6] == b"Exif\0\0": + # extract EXIF information + if "exif" in self.info: + self.info["exif"] += s[6:] + else: + self.info["exif"] = s + self._exif_offset = self.fp.tell() - n + 6 + elif marker == 0xFFE1 and s[:29] == b"http://ns.adobe.com/xap/1.0/\x00": + self.info["xmp"] = s.split(b"\x00", 1)[1] + elif marker == 0xFFE2 and s[:5] == b"FPXR\0": + # extract FlashPix information (incomplete) + self.info["flashpix"] = s # FIXME: value will change + elif marker == 0xFFE2 and s[:12] == b"ICC_PROFILE\0": + # Since an ICC profile can be larger than the maximum size of + # a JPEG marker (64K), we need provisions to split it into + # multiple markers. The format defined by the ICC specifies + # one or more APP2 markers containing the following data: + # Identifying string ASCII "ICC_PROFILE\0" (12 bytes) + # Marker sequence number 1, 2, etc (1 byte) + # Number of markers Total of APP2's used (1 byte) + # Profile data (remainder of APP2 data) + # Decoders should use the marker sequence numbers to + # reassemble the profile, rather than assuming that the APP2 + # markers appear in the correct sequence. + self.icclist.append(s) + elif marker == 0xFFED and s[:14] == b"Photoshop 3.0\x00": + # parse the image resource block + offset = 14 + photoshop = self.info.setdefault("photoshop", {}) + while s[offset : offset + 4] == b"8BIM": + try: + offset += 4 + # resource code + code = i16(s, offset) + offset += 2 + # resource name (usually empty) + name_len = s[offset] + # name = s[offset+1:offset+1+name_len] + offset += 1 + name_len + offset += offset & 1 # align + # resource data block + size = i32(s, offset) + offset += 4 + data = s[offset : offset + size] + if code == 0x03ED: # ResolutionInfo + photoshop[code] = { + "XResolution": i32(data, 0) / 65536, + "DisplayedUnitsX": i16(data, 4), + "YResolution": i32(data, 8) / 65536, + "DisplayedUnitsY": i16(data, 12), + } + else: + photoshop[code] = data + offset += size + offset += offset & 1 # align + except struct.error: + break # insufficient data + + elif marker == 0xFFEE and s[:5] == b"Adobe": + self.info["adobe"] = i16(s, 5) + # extract Adobe custom properties + try: + adobe_transform = s[11] + except IndexError: + pass + else: + self.info["adobe_transform"] = adobe_transform + elif marker == 0xFFE2 and s[:4] == b"MPF\0": + # extract MPO information + self.info["mp"] = s[4:] + # offset is current location minus buffer size + # plus constant header size + self.info["mpoffset"] = self.fp.tell() - n + 4 + + +def COM(self: JpegImageFile, marker: int) -> None: + # + # Comment marker. Store these in the APP dictionary. + n = i16(self.fp.read(2)) - 2 + s = ImageFile._safe_read(self.fp, n) + + self.info["comment"] = s + self.app["COM"] = s # compatibility + self.applist.append(("COM", s)) + + +def SOF(self: JpegImageFile, marker: int) -> None: + # + # Start of frame marker. Defines the size and mode of the + # image. JPEG is colour blind, so we use some simple + # heuristics to map the number of layers to an appropriate + # mode. Note that this could be made a bit brighter, by + # looking for JFIF and Adobe APP markers. + + n = i16(self.fp.read(2)) - 2 + s = ImageFile._safe_read(self.fp, n) + self._size = i16(s, 3), i16(s, 1) + + self.bits = s[0] + if self.bits != 8: + msg = f"cannot handle {self.bits}-bit layers" + raise SyntaxError(msg) + + self.layers = s[5] + if self.layers == 1: + self._mode = "L" + elif self.layers == 3: + self._mode = "RGB" + elif self.layers == 4: + self._mode = "CMYK" + else: + msg = f"cannot handle {self.layers}-layer images" + raise SyntaxError(msg) + + if marker in [0xFFC2, 0xFFC6, 0xFFCA, 0xFFCE]: + self.info["progressive"] = self.info["progression"] = 1 + + if self.icclist: + # fixup icc profile + self.icclist.sort() # sort by sequence number + if self.icclist[0][13] == len(self.icclist): + profile = [p[14:] for p in self.icclist] + icc_profile = b"".join(profile) + else: + icc_profile = None # wrong number of fragments + self.info["icc_profile"] = icc_profile + self.icclist = [] + + for i in range(6, len(s), 3): + t = s[i : i + 3] + # 4-tuples: id, vsamp, hsamp, qtable + self.layer.append((t[0], t[1] // 16, t[1] & 15, t[2])) + + +def DQT(self: JpegImageFile, marker: int) -> None: + # + # Define quantization table. Note that there might be more + # than one table in each marker. + + # FIXME: The quantization tables can be used to estimate the + # compression quality. + + n = i16(self.fp.read(2)) - 2 + s = ImageFile._safe_read(self.fp, n) + while len(s): + v = s[0] + precision = 1 if (v // 16 == 0) else 2 # in bytes + qt_length = 1 + precision * 64 + if len(s) < qt_length: + msg = "bad quantization table marker" + raise SyntaxError(msg) + data = array.array("B" if precision == 1 else "H", s[1:qt_length]) + if sys.byteorder == "little" and precision > 1: + data.byteswap() # the values are always big-endian + self.quantization[v & 15] = [data[i] for i in zigzag_index] + s = s[qt_length:] + + +# +# JPEG marker table + +MARKER = { + 0xFFC0: ("SOF0", "Baseline DCT", SOF), + 0xFFC1: ("SOF1", "Extended Sequential DCT", SOF), + 0xFFC2: ("SOF2", "Progressive DCT", SOF), + 0xFFC3: ("SOF3", "Spatial lossless", SOF), + 0xFFC4: ("DHT", "Define Huffman table", Skip), + 0xFFC5: ("SOF5", "Differential sequential DCT", SOF), + 0xFFC6: ("SOF6", "Differential progressive DCT", SOF), + 0xFFC7: ("SOF7", "Differential spatial", SOF), + 0xFFC8: ("JPG", "Extension", None), + 0xFFC9: ("SOF9", "Extended sequential DCT (AC)", SOF), + 0xFFCA: ("SOF10", "Progressive DCT (AC)", SOF), + 0xFFCB: ("SOF11", "Spatial lossless DCT (AC)", SOF), + 0xFFCC: ("DAC", "Define arithmetic coding conditioning", Skip), + 0xFFCD: ("SOF13", "Differential sequential DCT (AC)", SOF), + 0xFFCE: ("SOF14", "Differential progressive DCT (AC)", SOF), + 0xFFCF: ("SOF15", "Differential spatial (AC)", SOF), + 0xFFD0: ("RST0", "Restart 0", None), + 0xFFD1: ("RST1", "Restart 1", None), + 0xFFD2: ("RST2", "Restart 2", None), + 0xFFD3: ("RST3", "Restart 3", None), + 0xFFD4: ("RST4", "Restart 4", None), + 0xFFD5: ("RST5", "Restart 5", None), + 0xFFD6: ("RST6", "Restart 6", None), + 0xFFD7: ("RST7", "Restart 7", None), + 0xFFD8: ("SOI", "Start of image", None), + 0xFFD9: ("EOI", "End of image", None), + 0xFFDA: ("SOS", "Start of scan", Skip), + 0xFFDB: ("DQT", "Define quantization table", DQT), + 0xFFDC: ("DNL", "Define number of lines", Skip), + 0xFFDD: ("DRI", "Define restart interval", Skip), + 0xFFDE: ("DHP", "Define hierarchical progression", SOF), + 0xFFDF: ("EXP", "Expand reference component", Skip), + 0xFFE0: ("APP0", "Application segment 0", APP), + 0xFFE1: ("APP1", "Application segment 1", APP), + 0xFFE2: ("APP2", "Application segment 2", APP), + 0xFFE3: ("APP3", "Application segment 3", APP), + 0xFFE4: ("APP4", "Application segment 4", APP), + 0xFFE5: ("APP5", "Application segment 5", APP), + 0xFFE6: ("APP6", "Application segment 6", APP), + 0xFFE7: ("APP7", "Application segment 7", APP), + 0xFFE8: ("APP8", "Application segment 8", APP), + 0xFFE9: ("APP9", "Application segment 9", APP), + 0xFFEA: ("APP10", "Application segment 10", APP), + 0xFFEB: ("APP11", "Application segment 11", APP), + 0xFFEC: ("APP12", "Application segment 12", APP), + 0xFFED: ("APP13", "Application segment 13", APP), + 0xFFEE: ("APP14", "Application segment 14", APP), + 0xFFEF: ("APP15", "Application segment 15", APP), + 0xFFF0: ("JPG0", "Extension 0", None), + 0xFFF1: ("JPG1", "Extension 1", None), + 0xFFF2: ("JPG2", "Extension 2", None), + 0xFFF3: ("JPG3", "Extension 3", None), + 0xFFF4: ("JPG4", "Extension 4", None), + 0xFFF5: ("JPG5", "Extension 5", None), + 0xFFF6: ("JPG6", "Extension 6", None), + 0xFFF7: ("JPG7", "Extension 7", None), + 0xFFF8: ("JPG8", "Extension 8", None), + 0xFFF9: ("JPG9", "Extension 9", None), + 0xFFFA: ("JPG10", "Extension 10", None), + 0xFFFB: ("JPG11", "Extension 11", None), + 0xFFFC: ("JPG12", "Extension 12", None), + 0xFFFD: ("JPG13", "Extension 13", None), + 0xFFFE: ("COM", "Comment", COM), +} + + +def _accept(prefix: bytes) -> bool: + # Magic number was taken from https://en.wikipedia.org/wiki/JPEG + return prefix[:3] == b"\xFF\xD8\xFF" + + +## +# Image plugin for JPEG and JFIF images. + + +class JpegImageFile(ImageFile.ImageFile): + format = "JPEG" + format_description = "JPEG (ISO 10918)" + + def _open(self) -> None: + s = self.fp.read(3) + + if not _accept(s): + msg = "not a JPEG file" + raise SyntaxError(msg) + s = b"\xFF" + + # Create attributes + self.bits = self.layers = 0 + self._exif_offset = 0 + + # JPEG specifics (internal) + self.layer: list[tuple[int, int, int, int]] = [] + self._huffman_dc: dict[Any, Any] = {} + self._huffman_ac: dict[Any, Any] = {} + self.quantization: dict[int, list[int]] = {} + self.app: dict[str, bytes] = {} # compatibility + self.applist: list[tuple[str, bytes]] = [] + self.icclist: list[bytes] = [] + + while True: + i = s[0] + if i == 0xFF: + s = s + self.fp.read(1) + i = i16(s) + else: + # Skip non-0xFF junk + s = self.fp.read(1) + continue + + if i in MARKER: + name, description, handler = MARKER[i] + if handler is not None: + handler(self, i) + if i == 0xFFDA: # start of scan + rawmode = self.mode + if self.mode == "CMYK": + rawmode = "CMYK;I" # assume adobe conventions + self.tile = [ + ImageFile._Tile("jpeg", (0, 0) + self.size, 0, (rawmode, "")) + ] + # self.__offset = self.fp.tell() + break + s = self.fp.read(1) + elif i in {0, 0xFFFF}: + # padded marker or junk; move on + s = b"\xff" + elif i == 0xFF00: # Skip extraneous data (escaped 0xFF) + s = self.fp.read(1) + else: + msg = "no marker found" + raise SyntaxError(msg) + + self._read_dpi_from_exif() + + def __getattr__(self, name: str) -> Any: + if name in ("huffman_ac", "huffman_dc"): + deprecate(name, 12) + return getattr(self, "_" + name) + raise AttributeError(name) + + def load_read(self, read_bytes: int) -> bytes: + """ + internal: read more image data + For premature EOF and LOAD_TRUNCATED_IMAGES adds EOI marker + so libjpeg can finish decoding + """ + s = self.fp.read(read_bytes) + + if not s and ImageFile.LOAD_TRUNCATED_IMAGES and not hasattr(self, "_ended"): + # Premature EOF. + # Pretend file is finished adding EOI marker + self._ended = True + return b"\xFF\xD9" + + return s + + def draft( + self, mode: str | None, size: tuple[int, int] | None + ) -> tuple[str, tuple[int, int, float, float]] | None: + if len(self.tile) != 1: + return None + + # Protect from second call + if self.decoderconfig: + return None + + d, e, o, a = self.tile[0] + scale = 1 + original_size = self.size + + assert isinstance(a, tuple) + if a[0] == "RGB" and mode in ["L", "YCbCr"]: + self._mode = mode + a = mode, "" + + if size: + scale = min(self.size[0] // size[0], self.size[1] // size[1]) + for s in [8, 4, 2, 1]: + if scale >= s: + break + assert e is not None + e = ( + e[0], + e[1], + (e[2] - e[0] + s - 1) // s + e[0], + (e[3] - e[1] + s - 1) // s + e[1], + ) + self._size = ((self.size[0] + s - 1) // s, (self.size[1] + s - 1) // s) + scale = s + + self.tile = [ImageFile._Tile(d, e, o, a)] + self.decoderconfig = (scale, 0) + + box = (0, 0, original_size[0] / scale, original_size[1] / scale) + return self.mode, box + + def load_djpeg(self) -> None: + # ALTERNATIVE: handle JPEGs via the IJG command line utilities + + f, path = tempfile.mkstemp() + os.close(f) + if os.path.exists(self.filename): + subprocess.check_call(["djpeg", "-outfile", path, self.filename]) + else: + try: + os.unlink(path) + except OSError: + pass + + msg = "Invalid Filename" + raise ValueError(msg) + + try: + with Image.open(path) as _im: + _im.load() + self.im = _im.im + finally: + try: + os.unlink(path) + except OSError: + pass + + self._mode = self.im.mode + self._size = self.im.size + + self.tile = [] + + def _getexif(self) -> dict[int, Any] | None: + return _getexif(self) + + def _read_dpi_from_exif(self) -> None: + # If DPI isn't in JPEG header, fetch from EXIF + if "dpi" in self.info or "exif" not in self.info: + return + try: + exif = self.getexif() + resolution_unit = exif[0x0128] + x_resolution = exif[0x011A] + try: + dpi = float(x_resolution[0]) / x_resolution[1] + except TypeError: + dpi = x_resolution + if math.isnan(dpi): + msg = "DPI is not a number" + raise ValueError(msg) + if resolution_unit == 3: # cm + # 1 dpcm = 2.54 dpi + dpi *= 2.54 + self.info["dpi"] = dpi, dpi + except ( + struct.error, # truncated EXIF + KeyError, # dpi not included + SyntaxError, # invalid/unreadable EXIF + TypeError, # dpi is an invalid float + ValueError, # dpi is an invalid float + ZeroDivisionError, # invalid dpi rational value + ): + self.info["dpi"] = 72, 72 + + def _getmp(self) -> dict[int, Any] | None: + return _getmp(self) + + +def _getexif(self: JpegImageFile) -> dict[int, Any] | None: + if "exif" not in self.info: + return None + return self.getexif()._get_merged_dict() + + +def _getmp(self: JpegImageFile) -> dict[int, Any] | None: + # Extract MP information. This method was inspired by the "highly + # experimental" _getexif version that's been in use for years now, + # itself based on the ImageFileDirectory class in the TIFF plugin. + + # The MP record essentially consists of a TIFF file embedded in a JPEG + # application marker. + try: + data = self.info["mp"] + except KeyError: + return None + file_contents = io.BytesIO(data) + head = file_contents.read(8) + endianness = ">" if head[:4] == b"\x4d\x4d\x00\x2a" else "<" + # process dictionary + from . import TiffImagePlugin + + try: + info = TiffImagePlugin.ImageFileDirectory_v2(head) + file_contents.seek(info.next) + info.load(file_contents) + mp = dict(info) + except Exception as e: + msg = "malformed MP Index (unreadable directory)" + raise SyntaxError(msg) from e + # it's an error not to have a number of images + try: + quant = mp[0xB001] + except KeyError as e: + msg = "malformed MP Index (no number of images)" + raise SyntaxError(msg) from e + # get MP entries + mpentries = [] + try: + rawmpentries = mp[0xB002] + for entrynum in range(0, quant): + unpackedentry = struct.unpack_from( + f"{endianness}LLLHH", rawmpentries, entrynum * 16 + ) + labels = ("Attribute", "Size", "DataOffset", "EntryNo1", "EntryNo2") + mpentry = dict(zip(labels, unpackedentry)) + mpentryattr = { + "DependentParentImageFlag": bool(mpentry["Attribute"] & (1 << 31)), + "DependentChildImageFlag": bool(mpentry["Attribute"] & (1 << 30)), + "RepresentativeImageFlag": bool(mpentry["Attribute"] & (1 << 29)), + "Reserved": (mpentry["Attribute"] & (3 << 27)) >> 27, + "ImageDataFormat": (mpentry["Attribute"] & (7 << 24)) >> 24, + "MPType": mpentry["Attribute"] & 0x00FFFFFF, + } + if mpentryattr["ImageDataFormat"] == 0: + mpentryattr["ImageDataFormat"] = "JPEG" + else: + msg = "unsupported picture format in MPO" + raise SyntaxError(msg) + mptypemap = { + 0x000000: "Undefined", + 0x010001: "Large Thumbnail (VGA Equivalent)", + 0x010002: "Large Thumbnail (Full HD Equivalent)", + 0x020001: "Multi-Frame Image (Panorama)", + 0x020002: "Multi-Frame Image: (Disparity)", + 0x020003: "Multi-Frame Image: (Multi-Angle)", + 0x030000: "Baseline MP Primary Image", + } + mpentryattr["MPType"] = mptypemap.get(mpentryattr["MPType"], "Unknown") + mpentry["Attribute"] = mpentryattr + mpentries.append(mpentry) + mp[0xB002] = mpentries + except KeyError as e: + msg = "malformed MP Index (bad MP Entry)" + raise SyntaxError(msg) from e + # Next we should try and parse the individual image unique ID list; + # we don't because I've never seen this actually used in a real MPO + # file and so can't test it. + return mp + + +# -------------------------------------------------------------------- +# stuff to save JPEG files + +RAWMODE = { + "1": "L", + "L": "L", + "RGB": "RGB", + "RGBX": "RGB", + "CMYK": "CMYK;I", # assume adobe conventions + "YCbCr": "YCbCr", +} + +# fmt: off +zigzag_index = ( + 0, 1, 5, 6, 14, 15, 27, 28, + 2, 4, 7, 13, 16, 26, 29, 42, + 3, 8, 12, 17, 25, 30, 41, 43, + 9, 11, 18, 24, 31, 40, 44, 53, + 10, 19, 23, 32, 39, 45, 52, 54, + 20, 22, 33, 38, 46, 51, 55, 60, + 21, 34, 37, 47, 50, 56, 59, 61, + 35, 36, 48, 49, 57, 58, 62, 63, +) + +samplings = { + (1, 1, 1, 1, 1, 1): 0, + (2, 1, 1, 1, 1, 1): 1, + (2, 2, 1, 1, 1, 1): 2, +} +# fmt: on + + +def get_sampling(im: Image.Image) -> int: + # There's no subsampling when images have only 1 layer + # (grayscale images) or when they are CMYK (4 layers), + # so set subsampling to the default value. + # + # NOTE: currently Pillow can't encode JPEG to YCCK format. + # If YCCK support is added in the future, subsampling code will have + # to be updated (here and in JpegEncode.c) to deal with 4 layers. + if not isinstance(im, JpegImageFile) or im.layers in (1, 4): + return -1 + sampling = im.layer[0][1:3] + im.layer[1][1:3] + im.layer[2][1:3] + return samplings.get(sampling, -1) + + +def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + if im.width == 0 or im.height == 0: + msg = "cannot write empty image as JPEG" + raise ValueError(msg) + + try: + rawmode = RAWMODE[im.mode] + except KeyError as e: + msg = f"cannot write mode {im.mode} as JPEG" + raise OSError(msg) from e + + info = im.encoderinfo + + dpi = [round(x) for x in info.get("dpi", (0, 0))] + + quality = info.get("quality", -1) + subsampling = info.get("subsampling", -1) + qtables = info.get("qtables") + + if quality == "keep": + quality = -1 + subsampling = "keep" + qtables = "keep" + elif quality in presets: + preset = presets[quality] + quality = -1 + subsampling = preset.get("subsampling", -1) + qtables = preset.get("quantization") + elif not isinstance(quality, int): + msg = "Invalid quality setting" + raise ValueError(msg) + else: + if subsampling in presets: + subsampling = presets[subsampling].get("subsampling", -1) + if isinstance(qtables, str) and qtables in presets: + qtables = presets[qtables].get("quantization") + + if subsampling == "4:4:4": + subsampling = 0 + elif subsampling == "4:2:2": + subsampling = 1 + elif subsampling == "4:2:0": + subsampling = 2 + elif subsampling == "4:1:1": + # For compatibility. Before Pillow 4.3, 4:1:1 actually meant 4:2:0. + # Set 4:2:0 if someone is still using that value. + subsampling = 2 + elif subsampling == "keep": + if im.format != "JPEG": + msg = "Cannot use 'keep' when original image is not a JPEG" + raise ValueError(msg) + subsampling = get_sampling(im) + + def validate_qtables( + qtables: ( + str | tuple[list[int], ...] | list[list[int]] | dict[int, list[int]] | None + ) + ) -> list[list[int]] | None: + if qtables is None: + return qtables + if isinstance(qtables, str): + try: + lines = [ + int(num) + for line in qtables.splitlines() + for num in line.split("#", 1)[0].split() + ] + except ValueError as e: + msg = "Invalid quantization table" + raise ValueError(msg) from e + else: + qtables = [lines[s : s + 64] for s in range(0, len(lines), 64)] + if isinstance(qtables, (tuple, list, dict)): + if isinstance(qtables, dict): + qtables = [ + qtables[key] for key in range(len(qtables)) if key in qtables + ] + elif isinstance(qtables, tuple): + qtables = list(qtables) + if not (0 < len(qtables) < 5): + msg = "None or too many quantization tables" + raise ValueError(msg) + for idx, table in enumerate(qtables): + try: + if len(table) != 64: + msg = "Invalid quantization table" + raise TypeError(msg) + table_array = array.array("H", table) + except TypeError as e: + msg = "Invalid quantization table" + raise ValueError(msg) from e + else: + qtables[idx] = list(table_array) + return qtables + + if qtables == "keep": + if im.format != "JPEG": + msg = "Cannot use 'keep' when original image is not a JPEG" + raise ValueError(msg) + qtables = getattr(im, "quantization", None) + qtables = validate_qtables(qtables) + + extra = info.get("extra", b"") + + MAX_BYTES_IN_MARKER = 65533 + xmp = info.get("xmp", im.info.get("xmp")) + if xmp: + overhead_len = 29 # b"http://ns.adobe.com/xap/1.0/\x00" + max_data_bytes_in_marker = MAX_BYTES_IN_MARKER - overhead_len + if len(xmp) > max_data_bytes_in_marker: + msg = "XMP data is too long" + raise ValueError(msg) + size = o16(2 + overhead_len + len(xmp)) + extra += b"\xFF\xE1" + size + b"http://ns.adobe.com/xap/1.0/\x00" + xmp + + icc_profile = info.get("icc_profile") + if icc_profile: + overhead_len = 14 # b"ICC_PROFILE\0" + o8(i) + o8(len(markers)) + max_data_bytes_in_marker = MAX_BYTES_IN_MARKER - overhead_len + markers = [] + while icc_profile: + markers.append(icc_profile[:max_data_bytes_in_marker]) + icc_profile = icc_profile[max_data_bytes_in_marker:] + i = 1 + for marker in markers: + size = o16(2 + overhead_len + len(marker)) + extra += ( + b"\xFF\xE2" + + size + + b"ICC_PROFILE\0" + + o8(i) + + o8(len(markers)) + + marker + ) + i += 1 + + comment = info.get("comment", im.info.get("comment")) + + # "progressive" is the official name, but older documentation + # says "progression" + # FIXME: issue a warning if the wrong form is used (post-1.1.7) + progressive = info.get("progressive", False) or info.get("progression", False) + + optimize = info.get("optimize", False) + + exif = info.get("exif", b"") + if isinstance(exif, Image.Exif): + exif = exif.tobytes() + if len(exif) > MAX_BYTES_IN_MARKER: + msg = "EXIF data is too long" + raise ValueError(msg) + + # get keyword arguments + im.encoderconfig = ( + quality, + progressive, + info.get("smooth", 0), + optimize, + info.get("keep_rgb", False), + info.get("streamtype", 0), + dpi[0], + dpi[1], + subsampling, + info.get("restart_marker_blocks", 0), + info.get("restart_marker_rows", 0), + qtables, + comment, + extra, + exif, + ) + + # if we optimize, libjpeg needs a buffer big enough to hold the whole image + # in a shot. Guessing on the size, at im.size bytes. (raw pixel size is + # channels*size, this is a value that's been used in a django patch. + # https://github.com/matthewwithanm/django-imagekit/issues/50 + bufsize = 0 + if optimize or progressive: + # CMYK can be bigger + if im.mode == "CMYK": + bufsize = 4 * im.size[0] * im.size[1] + # keep sets quality to -1, but the actual value may be high. + elif quality >= 95 or quality == -1: + bufsize = 2 * im.size[0] * im.size[1] + else: + bufsize = im.size[0] * im.size[1] + if exif: + bufsize += len(exif) + 5 + if extra: + bufsize += len(extra) + 1 + else: + # The EXIF info needs to be written as one block, + APP1, + one spare byte. + # Ensure that our buffer is big enough. Same with the icc_profile block. + bufsize = max(bufsize, len(exif) + 5, len(extra) + 1) + + ImageFile._save( + im, fp, [ImageFile._Tile("jpeg", (0, 0) + im.size, 0, rawmode)], bufsize + ) + + +def _save_cjpeg(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + # ALTERNATIVE: handle JPEGs via the IJG command line utilities. + tempfile = im._dump() + subprocess.check_call(["cjpeg", "-outfile", filename, tempfile]) + try: + os.unlink(tempfile) + except OSError: + pass + + +## +# Factory for making JPEG and MPO instances +def jpeg_factory( + fp: IO[bytes], filename: str | bytes | None = None +) -> JpegImageFile | MpoImageFile: + im = JpegImageFile(fp, filename) + try: + mpheader = im._getmp() + if mpheader is not None and mpheader[45057] > 1: + for segment, content in im.applist: + if segment == "APP1" and b' hdrgm:Version="' in content: + # Ultra HDR images are not yet supported + return im + # It's actually an MPO + from .MpoImagePlugin import MpoImageFile + + # Don't reload everything, just convert it. + im = MpoImageFile.adopt(im, mpheader) + except (TypeError, IndexError): + # It is really a JPEG + pass + except SyntaxError: + warnings.warn( + "Image appears to be a malformed MPO file, it will be " + "interpreted as a base JPEG file" + ) + return im + + +# --------------------------------------------------------------------- +# Registry stuff + +Image.register_open(JpegImageFile.format, jpeg_factory, _accept) +Image.register_save(JpegImageFile.format, _save) + +Image.register_extensions(JpegImageFile.format, [".jfif", ".jpe", ".jpg", ".jpeg"]) + +Image.register_mime(JpegImageFile.format, "image/jpeg") diff --git a/venv/lib/python3.12/site-packages/PIL/JpegPresets.py b/venv/lib/python3.12/site-packages/PIL/JpegPresets.py new file mode 100644 index 0000000..d0e64a3 --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/JpegPresets.py @@ -0,0 +1,242 @@ +""" +JPEG quality settings equivalent to the Photoshop settings. +Can be used when saving JPEG files. + +The following presets are available by default: +``web_low``, ``web_medium``, ``web_high``, ``web_very_high``, ``web_maximum``, +``low``, ``medium``, ``high``, ``maximum``. +More presets can be added to the :py:data:`presets` dict if needed. + +To apply the preset, specify:: + + quality="preset_name" + +To apply only the quantization table:: + + qtables="preset_name" + +To apply only the subsampling setting:: + + subsampling="preset_name" + +Example:: + + im.save("image_name.jpg", quality="web_high") + +Subsampling +----------- + +Subsampling is the practice of encoding images by implementing less resolution +for chroma information than for luma information. +(ref.: https://en.wikipedia.org/wiki/Chroma_subsampling) + +Possible subsampling values are 0, 1 and 2 that correspond to 4:4:4, 4:2:2 and +4:2:0. + +You can get the subsampling of a JPEG with the +:func:`.JpegImagePlugin.get_sampling` function. + +In JPEG compressed data a JPEG marker is used instead of an EXIF tag. +(ref.: https://exiv2.org/tags.html) + + +Quantization tables +------------------- + +They are values use by the DCT (Discrete cosine transform) to remove +*unnecessary* information from the image (the lossy part of the compression). +(ref.: https://en.wikipedia.org/wiki/Quantization_matrix#Quantization_matrices, +https://en.wikipedia.org/wiki/JPEG#Quantization) + +You can get the quantization tables of a JPEG with:: + + im.quantization + +This will return a dict with a number of lists. You can pass this dict +directly as the qtables argument when saving a JPEG. + +The quantization table format in presets is a list with sublists. These formats +are interchangeable. + +Libjpeg ref.: +https://web.archive.org/web/20120328125543/http://www.jpegcameras.com/libjpeg/libjpeg-3.html + +""" + +from __future__ import annotations + +# fmt: off +presets = { + 'web_low': {'subsampling': 2, # "4:2:0" + 'quantization': [ + [20, 16, 25, 39, 50, 46, 62, 68, + 16, 18, 23, 38, 38, 53, 65, 68, + 25, 23, 31, 38, 53, 65, 68, 68, + 39, 38, 38, 53, 65, 68, 68, 68, + 50, 38, 53, 65, 68, 68, 68, 68, + 46, 53, 65, 68, 68, 68, 68, 68, + 62, 65, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68], + [21, 25, 32, 38, 54, 68, 68, 68, + 25, 28, 24, 38, 54, 68, 68, 68, + 32, 24, 32, 43, 66, 68, 68, 68, + 38, 38, 43, 53, 68, 68, 68, 68, + 54, 54, 66, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68] + ]}, + 'web_medium': {'subsampling': 2, # "4:2:0" + 'quantization': [ + [16, 11, 11, 16, 23, 27, 31, 30, + 11, 12, 12, 15, 20, 23, 23, 30, + 11, 12, 13, 16, 23, 26, 35, 47, + 16, 15, 16, 23, 26, 37, 47, 64, + 23, 20, 23, 26, 39, 51, 64, 64, + 27, 23, 26, 37, 51, 64, 64, 64, + 31, 23, 35, 47, 64, 64, 64, 64, + 30, 30, 47, 64, 64, 64, 64, 64], + [17, 15, 17, 21, 20, 26, 38, 48, + 15, 19, 18, 17, 20, 26, 35, 43, + 17, 18, 20, 22, 26, 30, 46, 53, + 21, 17, 22, 28, 30, 39, 53, 64, + 20, 20, 26, 30, 39, 48, 64, 64, + 26, 26, 30, 39, 48, 63, 64, 64, + 38, 35, 46, 53, 64, 64, 64, 64, + 48, 43, 53, 64, 64, 64, 64, 64] + ]}, + 'web_high': {'subsampling': 0, # "4:4:4" + 'quantization': [ + [6, 4, 4, 6, 9, 11, 12, 16, + 4, 5, 5, 6, 8, 10, 12, 12, + 4, 5, 5, 6, 10, 12, 14, 19, + 6, 6, 6, 11, 12, 15, 19, 28, + 9, 8, 10, 12, 16, 20, 27, 31, + 11, 10, 12, 15, 20, 27, 31, 31, + 12, 12, 14, 19, 27, 31, 31, 31, + 16, 12, 19, 28, 31, 31, 31, 31], + [7, 7, 13, 24, 26, 31, 31, 31, + 7, 12, 16, 21, 31, 31, 31, 31, + 13, 16, 17, 31, 31, 31, 31, 31, + 24, 21, 31, 31, 31, 31, 31, 31, + 26, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31] + ]}, + 'web_very_high': {'subsampling': 0, # "4:4:4" + 'quantization': [ + [2, 2, 2, 2, 3, 4, 5, 6, + 2, 2, 2, 2, 3, 4, 5, 6, + 2, 2, 2, 2, 4, 5, 7, 9, + 2, 2, 2, 4, 5, 7, 9, 12, + 3, 3, 4, 5, 8, 10, 12, 12, + 4, 4, 5, 7, 10, 12, 12, 12, + 5, 5, 7, 9, 12, 12, 12, 12, + 6, 6, 9, 12, 12, 12, 12, 12], + [3, 3, 5, 9, 13, 15, 15, 15, + 3, 4, 6, 11, 14, 12, 12, 12, + 5, 6, 9, 14, 12, 12, 12, 12, + 9, 11, 14, 12, 12, 12, 12, 12, + 13, 14, 12, 12, 12, 12, 12, 12, + 15, 12, 12, 12, 12, 12, 12, 12, + 15, 12, 12, 12, 12, 12, 12, 12, + 15, 12, 12, 12, 12, 12, 12, 12] + ]}, + 'web_maximum': {'subsampling': 0, # "4:4:4" + 'quantization': [ + [1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 2, + 1, 1, 1, 1, 1, 1, 2, 2, + 1, 1, 1, 1, 1, 2, 2, 3, + 1, 1, 1, 1, 2, 2, 3, 3, + 1, 1, 1, 2, 2, 3, 3, 3, + 1, 1, 2, 2, 3, 3, 3, 3], + [1, 1, 1, 2, 2, 3, 3, 3, + 1, 1, 1, 2, 3, 3, 3, 3, + 1, 1, 1, 3, 3, 3, 3, 3, + 2, 2, 3, 3, 3, 3, 3, 3, + 2, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3] + ]}, + 'low': {'subsampling': 2, # "4:2:0" + 'quantization': [ + [18, 14, 14, 21, 30, 35, 34, 17, + 14, 16, 16, 19, 26, 23, 12, 12, + 14, 16, 17, 21, 23, 12, 12, 12, + 21, 19, 21, 23, 12, 12, 12, 12, + 30, 26, 23, 12, 12, 12, 12, 12, + 35, 23, 12, 12, 12, 12, 12, 12, + 34, 12, 12, 12, 12, 12, 12, 12, + 17, 12, 12, 12, 12, 12, 12, 12], + [20, 19, 22, 27, 20, 20, 17, 17, + 19, 25, 23, 14, 14, 12, 12, 12, + 22, 23, 14, 14, 12, 12, 12, 12, + 27, 14, 14, 12, 12, 12, 12, 12, + 20, 14, 12, 12, 12, 12, 12, 12, + 20, 12, 12, 12, 12, 12, 12, 12, + 17, 12, 12, 12, 12, 12, 12, 12, + 17, 12, 12, 12, 12, 12, 12, 12] + ]}, + 'medium': {'subsampling': 2, # "4:2:0" + 'quantization': [ + [12, 8, 8, 12, 17, 21, 24, 17, + 8, 9, 9, 11, 15, 19, 12, 12, + 8, 9, 10, 12, 19, 12, 12, 12, + 12, 11, 12, 21, 12, 12, 12, 12, + 17, 15, 19, 12, 12, 12, 12, 12, + 21, 19, 12, 12, 12, 12, 12, 12, + 24, 12, 12, 12, 12, 12, 12, 12, + 17, 12, 12, 12, 12, 12, 12, 12], + [13, 11, 13, 16, 20, 20, 17, 17, + 11, 14, 14, 14, 14, 12, 12, 12, + 13, 14, 14, 14, 12, 12, 12, 12, + 16, 14, 14, 12, 12, 12, 12, 12, + 20, 14, 12, 12, 12, 12, 12, 12, + 20, 12, 12, 12, 12, 12, 12, 12, + 17, 12, 12, 12, 12, 12, 12, 12, + 17, 12, 12, 12, 12, 12, 12, 12] + ]}, + 'high': {'subsampling': 0, # "4:4:4" + 'quantization': [ + [6, 4, 4, 6, 9, 11, 12, 16, + 4, 5, 5, 6, 8, 10, 12, 12, + 4, 5, 5, 6, 10, 12, 12, 12, + 6, 6, 6, 11, 12, 12, 12, 12, + 9, 8, 10, 12, 12, 12, 12, 12, + 11, 10, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, + 16, 12, 12, 12, 12, 12, 12, 12], + [7, 7, 13, 24, 20, 20, 17, 17, + 7, 12, 16, 14, 14, 12, 12, 12, + 13, 16, 14, 14, 12, 12, 12, 12, + 24, 14, 14, 12, 12, 12, 12, 12, + 20, 14, 12, 12, 12, 12, 12, 12, + 20, 12, 12, 12, 12, 12, 12, 12, + 17, 12, 12, 12, 12, 12, 12, 12, + 17, 12, 12, 12, 12, 12, 12, 12] + ]}, + 'maximum': {'subsampling': 0, # "4:4:4" + 'quantization': [ + [2, 2, 2, 2, 3, 4, 5, 6, + 2, 2, 2, 2, 3, 4, 5, 6, + 2, 2, 2, 2, 4, 5, 7, 9, + 2, 2, 2, 4, 5, 7, 9, 12, + 3, 3, 4, 5, 8, 10, 12, 12, + 4, 4, 5, 7, 10, 12, 12, 12, + 5, 5, 7, 9, 12, 12, 12, 12, + 6, 6, 9, 12, 12, 12, 12, 12], + [3, 3, 5, 9, 13, 15, 15, 15, + 3, 4, 6, 10, 14, 12, 12, 12, + 5, 6, 9, 14, 12, 12, 12, 12, + 9, 10, 14, 12, 12, 12, 12, 12, + 13, 14, 12, 12, 12, 12, 12, 12, + 15, 12, 12, 12, 12, 12, 12, 12, + 15, 12, 12, 12, 12, 12, 12, 12, + 15, 12, 12, 12, 12, 12, 12, 12] + ]}, +} +# fmt: on diff --git a/venv/lib/python3.12/site-packages/PIL/McIdasImagePlugin.py b/venv/lib/python3.12/site-packages/PIL/McIdasImagePlugin.py new file mode 100644 index 0000000..5dd031b --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/McIdasImagePlugin.py @@ -0,0 +1,80 @@ +# +# The Python Imaging Library. +# $Id$ +# +# Basic McIdas support for PIL +# +# History: +# 1997-05-05 fl Created (8-bit images only) +# 2009-03-08 fl Added 16/32-bit support. +# +# Thanks to Richard Jones and Craig Swank for specs and samples. +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1997. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import struct + +from . import Image, ImageFile + + +def _accept(prefix: bytes) -> bool: + return prefix[:8] == b"\x00\x00\x00\x00\x00\x00\x00\x04" + + +## +# Image plugin for McIdas area images. + + +class McIdasImageFile(ImageFile.ImageFile): + format = "MCIDAS" + format_description = "McIdas area file" + + def _open(self) -> None: + # parse area file directory + assert self.fp is not None + + s = self.fp.read(256) + if not _accept(s) or len(s) != 256: + msg = "not an McIdas area file" + raise SyntaxError(msg) + + self.area_descriptor_raw = s + self.area_descriptor = w = [0] + list(struct.unpack("!64i", s)) + + # get mode + if w[11] == 1: + mode = rawmode = "L" + elif w[11] == 2: + # FIXME: add memory map support + mode = "I" + rawmode = "I;16B" + elif w[11] == 4: + # FIXME: add memory map support + mode = "I" + rawmode = "I;32B" + else: + msg = "unsupported McIdas format" + raise SyntaxError(msg) + + self._mode = mode + self._size = w[10], w[9] + + offset = w[34] + w[15] + stride = w[15] + w[10] * w[11] * w[14] + + self.tile = [ + ImageFile._Tile("raw", (0, 0) + self.size, offset, (rawmode, stride, 1)) + ] + + +# -------------------------------------------------------------------- +# registry + +Image.register_open(McIdasImageFile.format, McIdasImageFile, _accept) + +# no default extension diff --git a/venv/lib/python3.12/site-packages/PIL/MicImagePlugin.py b/venv/lib/python3.12/site-packages/PIL/MicImagePlugin.py new file mode 100644 index 0000000..5f23a34 --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/MicImagePlugin.py @@ -0,0 +1,107 @@ +# +# The Python Imaging Library. +# $Id$ +# +# Microsoft Image Composer support for PIL +# +# Notes: +# uses TiffImagePlugin.py to read the actual image streams +# +# History: +# 97-01-20 fl Created +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1997. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import olefile + +from . import Image, TiffImagePlugin + +# +# -------------------------------------------------------------------- + + +def _accept(prefix: bytes) -> bool: + return prefix[:8] == olefile.MAGIC + + +## +# Image plugin for Microsoft's Image Composer file format. + + +class MicImageFile(TiffImagePlugin.TiffImageFile): + format = "MIC" + format_description = "Microsoft Image Composer" + _close_exclusive_fp_after_loading = False + + def _open(self) -> None: + # read the OLE directory and see if this is a likely + # to be a Microsoft Image Composer file + + try: + self.ole = olefile.OleFileIO(self.fp) + except OSError as e: + msg = "not an MIC file; invalid OLE file" + raise SyntaxError(msg) from e + + # find ACI subfiles with Image members (maybe not the + # best way to identify MIC files, but what the... ;-) + + self.images = [ + path + for path in self.ole.listdir() + if path[1:] and path[0][-4:] == ".ACI" and path[1] == "Image" + ] + + # if we didn't find any images, this is probably not + # an MIC file. + if not self.images: + msg = "not an MIC file; no image entries" + raise SyntaxError(msg) + + self.frame = -1 + self._n_frames = len(self.images) + self.is_animated = self._n_frames > 1 + + self.__fp = self.fp + self.seek(0) + + def seek(self, frame: int) -> None: + if not self._seek_check(frame): + return + try: + filename = self.images[frame] + except IndexError as e: + msg = "no such frame" + raise EOFError(msg) from e + + self.fp = self.ole.openstream(filename) + + TiffImagePlugin.TiffImageFile._open(self) + + self.frame = frame + + def tell(self) -> int: + return self.frame + + def close(self) -> None: + self.__fp.close() + self.ole.close() + super().close() + + def __exit__(self, *args: object) -> None: + self.__fp.close() + self.ole.close() + super().__exit__() + + +# +# -------------------------------------------------------------------- + +Image.register_open(MicImageFile.format, MicImageFile, _accept) + +Image.register_extension(MicImageFile.format, ".mic") diff --git a/venv/lib/python3.12/site-packages/PIL/MpegImagePlugin.py b/venv/lib/python3.12/site-packages/PIL/MpegImagePlugin.py new file mode 100644 index 0000000..ad4d3e9 --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/MpegImagePlugin.py @@ -0,0 +1,88 @@ +# +# The Python Imaging Library. +# $Id$ +# +# MPEG file handling +# +# History: +# 95-09-09 fl Created +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1995. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +from . import Image, ImageFile +from ._binary import i8 +from ._typing import SupportsRead + +# +# Bitstream parser + + +class BitStream: + def __init__(self, fp: SupportsRead[bytes]) -> None: + self.fp = fp + self.bits = 0 + self.bitbuffer = 0 + + def next(self) -> int: + return i8(self.fp.read(1)) + + def peek(self, bits: int) -> int: + while self.bits < bits: + c = self.next() + if c < 0: + self.bits = 0 + continue + self.bitbuffer = (self.bitbuffer << 8) + c + self.bits += 8 + return self.bitbuffer >> (self.bits - bits) & (1 << bits) - 1 + + def skip(self, bits: int) -> None: + while self.bits < bits: + self.bitbuffer = (self.bitbuffer << 8) + i8(self.fp.read(1)) + self.bits += 8 + self.bits = self.bits - bits + + def read(self, bits: int) -> int: + v = self.peek(bits) + self.bits = self.bits - bits + return v + + +def _accept(prefix: bytes) -> bool: + return prefix[:4] == b"\x00\x00\x01\xb3" + + +## +# Image plugin for MPEG streams. This plugin can identify a stream, +# but it cannot read it. + + +class MpegImageFile(ImageFile.ImageFile): + format = "MPEG" + format_description = "MPEG" + + def _open(self) -> None: + assert self.fp is not None + + s = BitStream(self.fp) + if s.read(32) != 0x1B3: + msg = "not an MPEG file" + raise SyntaxError(msg) + + self._mode = "RGB" + self._size = s.read(12), s.read(12) + + +# -------------------------------------------------------------------- +# Registry stuff + +Image.register_open(MpegImageFile.format, MpegImageFile, _accept) + +Image.register_extensions(MpegImageFile.format, [".mpg", ".mpeg"]) + +Image.register_mime(MpegImageFile.format, "video/mpeg") diff --git a/venv/lib/python3.12/site-packages/PIL/MpoImagePlugin.py b/venv/lib/python3.12/site-packages/PIL/MpoImagePlugin.py new file mode 100644 index 0000000..71f89a0 --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/MpoImagePlugin.py @@ -0,0 +1,190 @@ +# +# The Python Imaging Library. +# $Id$ +# +# MPO file handling +# +# See "Multi-Picture Format" (CIPA DC-007-Translation 2009, Standard of the +# Camera & Imaging Products Association) +# +# The multi-picture object combines multiple JPEG images (with a modified EXIF +# data format) into a single file. While it can theoretically be used much like +# a GIF animation, it is commonly used to represent 3D photographs and is (as +# of this writing) the most commonly used format by 3D cameras. +# +# History: +# 2014-03-13 Feneric Created +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import itertools +import os +import struct +from typing import IO, Any, cast + +from . import ( + Image, + ImageFile, + ImageSequence, + JpegImagePlugin, + TiffImagePlugin, +) +from ._binary import o32le + + +def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + JpegImagePlugin._save(im, fp, filename) + + +def _save_all(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + append_images = im.encoderinfo.get("append_images", []) + if not append_images and not getattr(im, "is_animated", False): + _save(im, fp, filename) + return + + mpf_offset = 28 + offsets: list[int] = [] + for imSequence in itertools.chain([im], append_images): + for im_frame in ImageSequence.Iterator(imSequence): + if not offsets: + # APP2 marker + im_frame.encoderinfo["extra"] = ( + b"\xFF\xE2" + struct.pack(">H", 6 + 82) + b"MPF\0" + b" " * 82 + ) + exif = im_frame.encoderinfo.get("exif") + if isinstance(exif, Image.Exif): + exif = exif.tobytes() + im_frame.encoderinfo["exif"] = exif + if exif: + mpf_offset += 4 + len(exif) + + JpegImagePlugin._save(im_frame, fp, filename) + offsets.append(fp.tell()) + else: + im_frame.save(fp, "JPEG") + offsets.append(fp.tell() - offsets[-1]) + + ifd = TiffImagePlugin.ImageFileDirectory_v2() + ifd[0xB000] = b"0100" + ifd[0xB001] = len(offsets) + + mpentries = b"" + data_offset = 0 + for i, size in enumerate(offsets): + if i == 0: + mptype = 0x030000 # Baseline MP Primary Image + else: + mptype = 0x000000 # Undefined + mpentries += struct.pack(" None: + self.fp.seek(0) # prep the fp in order to pass the JPEG test + JpegImagePlugin.JpegImageFile._open(self) + self._after_jpeg_open() + + def _after_jpeg_open(self, mpheader: dict[int, Any] | None = None) -> None: + self.mpinfo = mpheader if mpheader is not None else self._getmp() + if self.mpinfo is None: + msg = "Image appears to be a malformed MPO file" + raise ValueError(msg) + self.n_frames = self.mpinfo[0xB001] + self.__mpoffsets = [ + mpent["DataOffset"] + self.info["mpoffset"] for mpent in self.mpinfo[0xB002] + ] + self.__mpoffsets[0] = 0 + # Note that the following assertion will only be invalid if something + # gets broken within JpegImagePlugin. + assert self.n_frames == len(self.__mpoffsets) + del self.info["mpoffset"] # no longer needed + self.is_animated = self.n_frames > 1 + self._fp = self.fp # FIXME: hack + self._fp.seek(self.__mpoffsets[0]) # get ready to read first frame + self.__frame = 0 + self.offset = 0 + # for now we can only handle reading and individual frame extraction + self.readonly = 1 + + def load_seek(self, pos: int) -> None: + self._fp.seek(pos) + + def seek(self, frame: int) -> None: + if not self._seek_check(frame): + return + self.fp = self._fp + self.offset = self.__mpoffsets[frame] + + original_exif = self.info.get("exif") + if "exif" in self.info: + del self.info["exif"] + + self.fp.seek(self.offset + 2) # skip SOI marker + if not self.fp.read(2): + msg = "No data found for frame" + raise ValueError(msg) + self.fp.seek(self.offset) + JpegImagePlugin.JpegImageFile._open(self) + if self.info.get("exif") != original_exif: + self._reload_exif() + + self.tile = [ + ImageFile._Tile("jpeg", (0, 0) + self.size, self.offset, self.tile[0][-1]) + ] + self.__frame = frame + + def tell(self) -> int: + return self.__frame + + @staticmethod + def adopt( + jpeg_instance: JpegImagePlugin.JpegImageFile, + mpheader: dict[int, Any] | None = None, + ) -> MpoImageFile: + """ + Transform the instance of JpegImageFile into + an instance of MpoImageFile. + After the call, the JpegImageFile is extended + to be an MpoImageFile. + + This is essentially useful when opening a JPEG + file that reveals itself as an MPO, to avoid + double call to _open. + """ + jpeg_instance.__class__ = MpoImageFile + mpo_instance = cast(MpoImageFile, jpeg_instance) + mpo_instance._after_jpeg_open(mpheader) + return mpo_instance + + +# --------------------------------------------------------------------- +# Registry stuff + +# Note that since MPO shares a factory with JPEG, we do not need to do a +# separate registration for it here. +# Image.register_open(MpoImageFile.format, +# JpegImagePlugin.jpeg_factory, _accept) +Image.register_save(MpoImageFile.format, _save) +Image.register_save_all(MpoImageFile.format, _save_all) + +Image.register_extension(MpoImageFile.format, ".mpo") + +Image.register_mime(MpoImageFile.format, "image/mpo") diff --git a/venv/lib/python3.12/site-packages/PIL/MspImagePlugin.py b/venv/lib/python3.12/site-packages/PIL/MspImagePlugin.py new file mode 100644 index 0000000..f3460a7 --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/MspImagePlugin.py @@ -0,0 +1,200 @@ +# +# The Python Imaging Library. +# +# MSP file handling +# +# This is the format used by the Paint program in Windows 1 and 2. +# +# History: +# 95-09-05 fl Created +# 97-01-03 fl Read/write MSP images +# 17-02-21 es Fixed RLE interpretation +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1995-97. +# Copyright (c) Eric Soroos 2017. +# +# See the README file for information on usage and redistribution. +# +# More info on this format: https://archive.org/details/gg243631 +# Page 313: +# Figure 205. Windows Paint Version 1: "DanM" Format +# Figure 206. Windows Paint Version 2: "LinS" Format. Used in Windows V2.03 +# +# See also: https://www.fileformat.info/format/mspaint/egff.htm +from __future__ import annotations + +import io +import struct +from typing import IO + +from . import Image, ImageFile +from ._binary import i16le as i16 +from ._binary import o16le as o16 + +# +# read MSP files + + +def _accept(prefix: bytes) -> bool: + return prefix[:4] in [b"DanM", b"LinS"] + + +## +# Image plugin for Windows MSP images. This plugin supports both +# uncompressed (Windows 1.0). + + +class MspImageFile(ImageFile.ImageFile): + format = "MSP" + format_description = "Windows Paint" + + def _open(self) -> None: + # Header + assert self.fp is not None + + s = self.fp.read(32) + if not _accept(s): + msg = "not an MSP file" + raise SyntaxError(msg) + + # Header checksum + checksum = 0 + for i in range(0, 32, 2): + checksum = checksum ^ i16(s, i) + if checksum != 0: + msg = "bad MSP checksum" + raise SyntaxError(msg) + + self._mode = "1" + self._size = i16(s, 4), i16(s, 6) + + if s[:4] == b"DanM": + self.tile = [ImageFile._Tile("raw", (0, 0) + self.size, 32, ("1", 0, 1))] + else: + self.tile = [ImageFile._Tile("MSP", (0, 0) + self.size, 32, None)] + + +class MspDecoder(ImageFile.PyDecoder): + # The algo for the MSP decoder is from + # https://www.fileformat.info/format/mspaint/egff.htm + # cc-by-attribution -- That page references is taken from the + # Encyclopedia of Graphics File Formats and is licensed by + # O'Reilly under the Creative Common/Attribution license + # + # For RLE encoded files, the 32byte header is followed by a scan + # line map, encoded as one 16bit word of encoded byte length per + # line. + # + # NOTE: the encoded length of the line can be 0. This was not + # handled in the previous version of this encoder, and there's no + # mention of how to handle it in the documentation. From the few + # examples I've seen, I've assumed that it is a fill of the + # background color, in this case, white. + # + # + # Pseudocode of the decoder: + # Read a BYTE value as the RunType + # If the RunType value is zero + # Read next byte as the RunCount + # Read the next byte as the RunValue + # Write the RunValue byte RunCount times + # If the RunType value is non-zero + # Use this value as the RunCount + # Read and write the next RunCount bytes literally + # + # e.g.: + # 0x00 03 ff 05 00 01 02 03 04 + # would yield the bytes: + # 0xff ff ff 00 01 02 03 04 + # + # which are then interpreted as a bit packed mode '1' image + + _pulls_fd = True + + def decode(self, buffer: bytes | Image.SupportsArrayInterface) -> tuple[int, int]: + assert self.fd is not None + + img = io.BytesIO() + blank_line = bytearray((0xFF,) * ((self.state.xsize + 7) // 8)) + try: + self.fd.seek(32) + rowmap = struct.unpack_from( + f"<{self.state.ysize}H", self.fd.read(self.state.ysize * 2) + ) + except struct.error as e: + msg = "Truncated MSP file in row map" + raise OSError(msg) from e + + for x, rowlen in enumerate(rowmap): + try: + if rowlen == 0: + img.write(blank_line) + continue + row = self.fd.read(rowlen) + if len(row) != rowlen: + msg = f"Truncated MSP file, expected {rowlen} bytes on row {x}" + raise OSError(msg) + idx = 0 + while idx < rowlen: + runtype = row[idx] + idx += 1 + if runtype == 0: + (runcount, runval) = struct.unpack_from("Bc", row, idx) + img.write(runval * runcount) + idx += 2 + else: + runcount = runtype + img.write(row[idx : idx + runcount]) + idx += runcount + + except struct.error as e: + msg = f"Corrupted MSP file in row {x}" + raise OSError(msg) from e + + self.set_as_raw(img.getvalue(), "1") + + return -1, 0 + + +Image.register_decoder("MSP", MspDecoder) + + +# +# write MSP files (uncompressed only) + + +def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + if im.mode != "1": + msg = f"cannot write mode {im.mode} as MSP" + raise OSError(msg) + + # create MSP header + header = [0] * 16 + + header[0], header[1] = i16(b"Da"), i16(b"nM") # version 1 + header[2], header[3] = im.size + header[4], header[5] = 1, 1 + header[6], header[7] = 1, 1 + header[8], header[9] = im.size + + checksum = 0 + for h in header: + checksum = checksum ^ h + header[12] = checksum # FIXME: is this the right field? + + # header + for h in header: + fp.write(o16(h)) + + # image body + ImageFile._save(im, fp, [ImageFile._Tile("raw", (0, 0) + im.size, 32, ("1", 0, 1))]) + + +# +# registry + +Image.register_open(MspImageFile.format, MspImageFile, _accept) +Image.register_save(MspImageFile.format, _save) + +Image.register_extension(MspImageFile.format, ".msp") diff --git a/venv/lib/python3.12/site-packages/PIL/PSDraw.py b/venv/lib/python3.12/site-packages/PIL/PSDraw.py new file mode 100644 index 0000000..02939d2 --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/PSDraw.py @@ -0,0 +1,234 @@ +# +# The Python Imaging Library +# $Id$ +# +# Simple PostScript graphics interface +# +# History: +# 1996-04-20 fl Created +# 1999-01-10 fl Added gsave/grestore to image method +# 2005-05-04 fl Fixed floating point issue in image (from Eric Etheridge) +# +# Copyright (c) 1997-2005 by Secret Labs AB. All rights reserved. +# Copyright (c) 1996 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import sys +from typing import IO, TYPE_CHECKING + +from . import EpsImagePlugin + +## +# Simple PostScript graphics interface. + + +class PSDraw: + """ + Sets up printing to the given file. If ``fp`` is omitted, + ``sys.stdout.buffer`` is assumed. + """ + + def __init__(self, fp: IO[bytes] | None = None) -> None: + if not fp: + fp = sys.stdout.buffer + self.fp = fp + + def begin_document(self, id: str | None = None) -> None: + """Set up printing of a document. (Write PostScript DSC header.)""" + # FIXME: incomplete + self.fp.write( + b"%!PS-Adobe-3.0\n" + b"save\n" + b"/showpage { } def\n" + b"%%EndComments\n" + b"%%BeginDocument\n" + ) + # self.fp.write(ERROR_PS) # debugging! + self.fp.write(EDROFF_PS) + self.fp.write(VDI_PS) + self.fp.write(b"%%EndProlog\n") + self.isofont: dict[bytes, int] = {} + + def end_document(self) -> None: + """Ends printing. (Write PostScript DSC footer.)""" + self.fp.write(b"%%EndDocument\nrestore showpage\n%%End\n") + if hasattr(self.fp, "flush"): + self.fp.flush() + + def setfont(self, font: str, size: int) -> None: + """ + Selects which font to use. + + :param font: A PostScript font name + :param size: Size in points. + """ + font_bytes = bytes(font, "UTF-8") + if font_bytes not in self.isofont: + # reencode font + self.fp.write( + b"/PSDraw-%s ISOLatin1Encoding /%s E\n" % (font_bytes, font_bytes) + ) + self.isofont[font_bytes] = 1 + # rough + self.fp.write(b"/F0 %d /PSDraw-%s F\n" % (size, font_bytes)) + + def line(self, xy0: tuple[int, int], xy1: tuple[int, int]) -> None: + """ + Draws a line between the two points. Coordinates are given in + PostScript point coordinates (72 points per inch, (0, 0) is the lower + left corner of the page). + """ + self.fp.write(b"%d %d %d %d Vl\n" % (*xy0, *xy1)) + + def rectangle(self, box: tuple[int, int, int, int]) -> None: + """ + Draws a rectangle. + + :param box: A tuple of four integers, specifying left, bottom, width and + height. + """ + self.fp.write(b"%d %d M 0 %d %d Vr\n" % box) + + def text(self, xy: tuple[int, int], text: str) -> None: + """ + Draws text at the given position. You must use + :py:meth:`~PIL.PSDraw.PSDraw.setfont` before calling this method. + """ + text_bytes = bytes(text, "UTF-8") + text_bytes = b"\\(".join(text_bytes.split(b"(")) + text_bytes = b"\\)".join(text_bytes.split(b")")) + self.fp.write(b"%d %d M (%s) S\n" % (xy + (text_bytes,))) + + if TYPE_CHECKING: + from . import Image + + def image( + self, box: tuple[int, int, int, int], im: Image.Image, dpi: int | None = None + ) -> None: + """Draw a PIL image, centered in the given box.""" + # default resolution depends on mode + if not dpi: + if im.mode == "1": + dpi = 200 # fax + else: + dpi = 100 # grayscale + # image size (on paper) + x = im.size[0] * 72 / dpi + y = im.size[1] * 72 / dpi + # max allowed size + xmax = float(box[2] - box[0]) + ymax = float(box[3] - box[1]) + if x > xmax: + y = y * xmax / x + x = xmax + if y > ymax: + x = x * ymax / y + y = ymax + dx = (xmax - x) / 2 + box[0] + dy = (ymax - y) / 2 + box[1] + self.fp.write(b"gsave\n%f %f translate\n" % (dx, dy)) + if (x, y) != im.size: + # EpsImagePlugin._save prints the image at (0,0,xsize,ysize) + sx = x / im.size[0] + sy = y / im.size[1] + self.fp.write(b"%f %f scale\n" % (sx, sy)) + EpsImagePlugin._save(im, self.fp, "", 0) + self.fp.write(b"\ngrestore\n") + + +# -------------------------------------------------------------------- +# PostScript driver + +# +# EDROFF.PS -- PostScript driver for Edroff 2 +# +# History: +# 94-01-25 fl: created (edroff 2.04) +# +# Copyright (c) Fredrik Lundh 1994. +# + + +EDROFF_PS = b"""\ +/S { show } bind def +/P { moveto show } bind def +/M { moveto } bind def +/X { 0 rmoveto } bind def +/Y { 0 exch rmoveto } bind def +/E { findfont + dup maxlength dict begin + { + 1 index /FID ne { def } { pop pop } ifelse + } forall + /Encoding exch def + dup /FontName exch def + currentdict end definefont pop +} bind def +/F { findfont exch scalefont dup setfont + [ exch /setfont cvx ] cvx bind def +} bind def +""" + +# +# VDI.PS -- PostScript driver for VDI meta commands +# +# History: +# 94-01-25 fl: created (edroff 2.04) +# +# Copyright (c) Fredrik Lundh 1994. +# + +VDI_PS = b"""\ +/Vm { moveto } bind def +/Va { newpath arcn stroke } bind def +/Vl { moveto lineto stroke } bind def +/Vc { newpath 0 360 arc closepath } bind def +/Vr { exch dup 0 rlineto + exch dup 0 exch rlineto + exch neg 0 rlineto + 0 exch neg rlineto + setgray fill } bind def +/Tm matrix def +/Ve { Tm currentmatrix pop + translate scale newpath 0 0 .5 0 360 arc closepath + Tm setmatrix +} bind def +/Vf { currentgray exch setgray fill setgray } bind def +""" + +# +# ERROR.PS -- Error handler +# +# History: +# 89-11-21 fl: created (pslist 1.10) +# + +ERROR_PS = b"""\ +/landscape false def +/errorBUF 200 string def +/errorNL { currentpoint 10 sub exch pop 72 exch moveto } def +errordict begin /handleerror { + initmatrix /Courier findfont 10 scalefont setfont + newpath 72 720 moveto $error begin /newerror false def + (PostScript Error) show errorNL errorNL + (Error: ) show + /errorname load errorBUF cvs show errorNL errorNL + (Command: ) show + /command load dup type /stringtype ne { errorBUF cvs } if show + errorNL errorNL + (VMstatus: ) show + vmstatus errorBUF cvs show ( bytes available, ) show + errorBUF cvs show ( bytes used at level ) show + errorBUF cvs show errorNL errorNL + (Operand stargck: ) show errorNL /ostargck load { + dup type /stringtype ne { errorBUF cvs } if 72 0 rmoveto show errorNL + } forall errorNL + (Execution stargck: ) show errorNL /estargck load { + dup type /stringtype ne { errorBUF cvs } if 72 0 rmoveto show errorNL + } forall + end showpage +} def end +""" diff --git a/venv/lib/python3.12/site-packages/PIL/PaletteFile.py b/venv/lib/python3.12/site-packages/PIL/PaletteFile.py new file mode 100644 index 0000000..81652e5 --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/PaletteFile.py @@ -0,0 +1,54 @@ +# +# Python Imaging Library +# $Id$ +# +# stuff to read simple, teragon-style palette files +# +# History: +# 97-08-23 fl Created +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1997. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +from typing import IO + +from ._binary import o8 + + +class PaletteFile: + """File handler for Teragon-style palette files.""" + + rawmode = "RGB" + + def __init__(self, fp: IO[bytes]) -> None: + palette = [o8(i) * 3 for i in range(256)] + + while True: + s = fp.readline() + + if not s: + break + if s[:1] == b"#": + continue + if len(s) > 100: + msg = "bad palette file" + raise SyntaxError(msg) + + v = [int(x) for x in s.split()] + try: + [i, r, g, b] = v + except ValueError: + [i, r] = v + g = b = r + + if 0 <= i <= 255: + palette[i] = o8(r) + o8(g) + o8(b) + + self.palette = b"".join(palette) + + def getpalette(self) -> tuple[bytes, str]: + return self.palette, self.rawmode diff --git a/venv/lib/python3.12/site-packages/PIL/PalmImagePlugin.py b/venv/lib/python3.12/site-packages/PIL/PalmImagePlugin.py new file mode 100644 index 0000000..b332453 --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/PalmImagePlugin.py @@ -0,0 +1,232 @@ +# +# The Python Imaging Library. +# $Id$ +# + +## +# Image plugin for Palm pixmap images (output only). +## +from __future__ import annotations + +from typing import IO + +from . import Image, ImageFile +from ._binary import o8 +from ._binary import o16be as o16b + +# fmt: off +_Palm8BitColormapValues = ( + (255, 255, 255), (255, 204, 255), (255, 153, 255), (255, 102, 255), + (255, 51, 255), (255, 0, 255), (255, 255, 204), (255, 204, 204), + (255, 153, 204), (255, 102, 204), (255, 51, 204), (255, 0, 204), + (255, 255, 153), (255, 204, 153), (255, 153, 153), (255, 102, 153), + (255, 51, 153), (255, 0, 153), (204, 255, 255), (204, 204, 255), + (204, 153, 255), (204, 102, 255), (204, 51, 255), (204, 0, 255), + (204, 255, 204), (204, 204, 204), (204, 153, 204), (204, 102, 204), + (204, 51, 204), (204, 0, 204), (204, 255, 153), (204, 204, 153), + (204, 153, 153), (204, 102, 153), (204, 51, 153), (204, 0, 153), + (153, 255, 255), (153, 204, 255), (153, 153, 255), (153, 102, 255), + (153, 51, 255), (153, 0, 255), (153, 255, 204), (153, 204, 204), + (153, 153, 204), (153, 102, 204), (153, 51, 204), (153, 0, 204), + (153, 255, 153), (153, 204, 153), (153, 153, 153), (153, 102, 153), + (153, 51, 153), (153, 0, 153), (102, 255, 255), (102, 204, 255), + (102, 153, 255), (102, 102, 255), (102, 51, 255), (102, 0, 255), + (102, 255, 204), (102, 204, 204), (102, 153, 204), (102, 102, 204), + (102, 51, 204), (102, 0, 204), (102, 255, 153), (102, 204, 153), + (102, 153, 153), (102, 102, 153), (102, 51, 153), (102, 0, 153), + (51, 255, 255), (51, 204, 255), (51, 153, 255), (51, 102, 255), + (51, 51, 255), (51, 0, 255), (51, 255, 204), (51, 204, 204), + (51, 153, 204), (51, 102, 204), (51, 51, 204), (51, 0, 204), + (51, 255, 153), (51, 204, 153), (51, 153, 153), (51, 102, 153), + (51, 51, 153), (51, 0, 153), (0, 255, 255), (0, 204, 255), + (0, 153, 255), (0, 102, 255), (0, 51, 255), (0, 0, 255), + (0, 255, 204), (0, 204, 204), (0, 153, 204), (0, 102, 204), + (0, 51, 204), (0, 0, 204), (0, 255, 153), (0, 204, 153), + (0, 153, 153), (0, 102, 153), (0, 51, 153), (0, 0, 153), + (255, 255, 102), (255, 204, 102), (255, 153, 102), (255, 102, 102), + (255, 51, 102), (255, 0, 102), (255, 255, 51), (255, 204, 51), + (255, 153, 51), (255, 102, 51), (255, 51, 51), (255, 0, 51), + (255, 255, 0), (255, 204, 0), (255, 153, 0), (255, 102, 0), + (255, 51, 0), (255, 0, 0), (204, 255, 102), (204, 204, 102), + (204, 153, 102), (204, 102, 102), (204, 51, 102), (204, 0, 102), + (204, 255, 51), (204, 204, 51), (204, 153, 51), (204, 102, 51), + (204, 51, 51), (204, 0, 51), (204, 255, 0), (204, 204, 0), + (204, 153, 0), (204, 102, 0), (204, 51, 0), (204, 0, 0), + (153, 255, 102), (153, 204, 102), (153, 153, 102), (153, 102, 102), + (153, 51, 102), (153, 0, 102), (153, 255, 51), (153, 204, 51), + (153, 153, 51), (153, 102, 51), (153, 51, 51), (153, 0, 51), + (153, 255, 0), (153, 204, 0), (153, 153, 0), (153, 102, 0), + (153, 51, 0), (153, 0, 0), (102, 255, 102), (102, 204, 102), + (102, 153, 102), (102, 102, 102), (102, 51, 102), (102, 0, 102), + (102, 255, 51), (102, 204, 51), (102, 153, 51), (102, 102, 51), + (102, 51, 51), (102, 0, 51), (102, 255, 0), (102, 204, 0), + (102, 153, 0), (102, 102, 0), (102, 51, 0), (102, 0, 0), + (51, 255, 102), (51, 204, 102), (51, 153, 102), (51, 102, 102), + (51, 51, 102), (51, 0, 102), (51, 255, 51), (51, 204, 51), + (51, 153, 51), (51, 102, 51), (51, 51, 51), (51, 0, 51), + (51, 255, 0), (51, 204, 0), (51, 153, 0), (51, 102, 0), + (51, 51, 0), (51, 0, 0), (0, 255, 102), (0, 204, 102), + (0, 153, 102), (0, 102, 102), (0, 51, 102), (0, 0, 102), + (0, 255, 51), (0, 204, 51), (0, 153, 51), (0, 102, 51), + (0, 51, 51), (0, 0, 51), (0, 255, 0), (0, 204, 0), + (0, 153, 0), (0, 102, 0), (0, 51, 0), (17, 17, 17), + (34, 34, 34), (68, 68, 68), (85, 85, 85), (119, 119, 119), + (136, 136, 136), (170, 170, 170), (187, 187, 187), (221, 221, 221), + (238, 238, 238), (192, 192, 192), (128, 0, 0), (128, 0, 128), + (0, 128, 0), (0, 128, 128), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0)) +# fmt: on + + +# so build a prototype image to be used for palette resampling +def build_prototype_image() -> Image.Image: + image = Image.new("L", (1, len(_Palm8BitColormapValues))) + image.putdata(list(range(len(_Palm8BitColormapValues)))) + palettedata: tuple[int, ...] = () + for colormapValue in _Palm8BitColormapValues: + palettedata += colormapValue + palettedata += (0, 0, 0) * (256 - len(_Palm8BitColormapValues)) + image.putpalette(palettedata) + return image + + +Palm8BitColormapImage = build_prototype_image() + +# OK, we now have in Palm8BitColormapImage, +# a "P"-mode image with the right palette +# +# -------------------------------------------------------------------- + +_FLAGS = {"custom-colormap": 0x4000, "is-compressed": 0x8000, "has-transparent": 0x2000} + +_COMPRESSION_TYPES = {"none": 0xFF, "rle": 0x01, "scanline": 0x00} + + +# +# -------------------------------------------------------------------- + +## +# (Internal) Image save plugin for the Palm format. + + +def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + if im.mode == "P": + # we assume this is a color Palm image with the standard colormap, + # unless the "info" dict has a "custom-colormap" field + + rawmode = "P" + bpp = 8 + version = 1 + + elif im.mode == "L": + if im.encoderinfo.get("bpp") in (1, 2, 4): + # this is 8-bit grayscale, so we shift it to get the high-order bits, + # and invert it because + # Palm does grayscale from white (0) to black (1) + bpp = im.encoderinfo["bpp"] + maxval = (1 << bpp) - 1 + shift = 8 - bpp + im = im.point(lambda x: maxval - (x >> shift)) + elif im.info.get("bpp") in (1, 2, 4): + # here we assume that even though the inherent mode is 8-bit grayscale, + # only the lower bpp bits are significant. + # We invert them to match the Palm. + bpp = im.info["bpp"] + maxval = (1 << bpp) - 1 + im = im.point(lambda x: maxval - (x & maxval)) + else: + msg = f"cannot write mode {im.mode} as Palm" + raise OSError(msg) + + # we ignore the palette here + im._mode = "P" + rawmode = f"P;{bpp}" + version = 1 + + elif im.mode == "1": + # monochrome -- write it inverted, as is the Palm standard + rawmode = "1;I" + bpp = 1 + version = 0 + + else: + msg = f"cannot write mode {im.mode} as Palm" + raise OSError(msg) + + # + # make sure image data is available + im.load() + + # write header + + cols = im.size[0] + rows = im.size[1] + + rowbytes = int((cols + (16 // bpp - 1)) / (16 // bpp)) * 2 + transparent_index = 0 + compression_type = _COMPRESSION_TYPES["none"] + + flags = 0 + if im.mode == "P" and "custom-colormap" in im.info: + assert im.palette is not None + flags = flags & _FLAGS["custom-colormap"] + colormapsize = 4 * 256 + 2 + colormapmode = im.palette.mode + colormap = im.getdata().getpalette() + else: + colormapsize = 0 + + if "offset" in im.info: + offset = (rowbytes * rows + 16 + 3 + colormapsize) // 4 + else: + offset = 0 + + fp.write(o16b(cols) + o16b(rows) + o16b(rowbytes) + o16b(flags)) + fp.write(o8(bpp)) + fp.write(o8(version)) + fp.write(o16b(offset)) + fp.write(o8(transparent_index)) + fp.write(o8(compression_type)) + fp.write(o16b(0)) # reserved by Palm + + # now write colormap if necessary + + if colormapsize > 0: + fp.write(o16b(256)) + for i in range(256): + fp.write(o8(i)) + if colormapmode == "RGB": + fp.write( + o8(colormap[3 * i]) + + o8(colormap[3 * i + 1]) + + o8(colormap[3 * i + 2]) + ) + elif colormapmode == "RGBA": + fp.write( + o8(colormap[4 * i]) + + o8(colormap[4 * i + 1]) + + o8(colormap[4 * i + 2]) + ) + + # now convert data to raw form + ImageFile._save( + im, fp, [ImageFile._Tile("raw", (0, 0) + im.size, 0, (rawmode, rowbytes, 1))] + ) + + if hasattr(fp, "flush"): + fp.flush() + + +# +# -------------------------------------------------------------------- + +Image.register_save("Palm", _save) + +Image.register_extension("Palm", ".palm") + +Image.register_mime("Palm", "image/palm") diff --git a/venv/lib/python3.12/site-packages/PIL/PcdImagePlugin.py b/venv/lib/python3.12/site-packages/PIL/PcdImagePlugin.py new file mode 100644 index 0000000..e8ea800 --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/PcdImagePlugin.py @@ -0,0 +1,64 @@ +# +# The Python Imaging Library. +# $Id$ +# +# PCD file handling +# +# History: +# 96-05-10 fl Created +# 96-05-27 fl Added draft mode (128x192, 256x384) +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1996. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +from . import Image, ImageFile + +## +# Image plugin for PhotoCD images. This plugin only reads the 768x512 +# image from the file; higher resolutions are encoded in a proprietary +# encoding. + + +class PcdImageFile(ImageFile.ImageFile): + format = "PCD" + format_description = "Kodak PhotoCD" + + def _open(self) -> None: + # rough + assert self.fp is not None + + self.fp.seek(2048) + s = self.fp.read(2048) + + if s[:4] != b"PCD_": + msg = "not a PCD file" + raise SyntaxError(msg) + + orientation = s[1538] & 3 + self.tile_post_rotate = None + if orientation == 1: + self.tile_post_rotate = 90 + elif orientation == 3: + self.tile_post_rotate = -90 + + self._mode = "RGB" + self._size = 768, 512 # FIXME: not correct for rotated images! + self.tile = [ImageFile._Tile("pcd", (0, 0) + self.size, 96 * 2048, None)] + + def load_end(self) -> None: + if self.tile_post_rotate: + # Handle rotated PCDs + self.im = self.im.rotate(self.tile_post_rotate) + self._size = self.im.size + + +# +# registry + +Image.register_open(PcdImageFile.format, PcdImageFile) + +Image.register_extension(PcdImageFile.format, ".pcd") diff --git a/venv/lib/python3.12/site-packages/PIL/PcfFontFile.py b/venv/lib/python3.12/site-packages/PIL/PcfFontFile.py new file mode 100644 index 0000000..0d1968b --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/PcfFontFile.py @@ -0,0 +1,254 @@ +# +# THIS IS WORK IN PROGRESS +# +# The Python Imaging Library +# $Id$ +# +# portable compiled font file parser +# +# history: +# 1997-08-19 fl created +# 2003-09-13 fl fixed loading of unicode fonts +# +# Copyright (c) 1997-2003 by Secret Labs AB. +# Copyright (c) 1997-2003 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import io +from typing import BinaryIO, Callable + +from . import FontFile, Image +from ._binary import i8 +from ._binary import i16be as b16 +from ._binary import i16le as l16 +from ._binary import i32be as b32 +from ._binary import i32le as l32 + +# -------------------------------------------------------------------- +# declarations + +PCF_MAGIC = 0x70636601 # "\x01fcp" + +PCF_PROPERTIES = 1 << 0 +PCF_ACCELERATORS = 1 << 1 +PCF_METRICS = 1 << 2 +PCF_BITMAPS = 1 << 3 +PCF_INK_METRICS = 1 << 4 +PCF_BDF_ENCODINGS = 1 << 5 +PCF_SWIDTHS = 1 << 6 +PCF_GLYPH_NAMES = 1 << 7 +PCF_BDF_ACCELERATORS = 1 << 8 + +BYTES_PER_ROW: list[Callable[[int], int]] = [ + lambda bits: ((bits + 7) >> 3), + lambda bits: ((bits + 15) >> 3) & ~1, + lambda bits: ((bits + 31) >> 3) & ~3, + lambda bits: ((bits + 63) >> 3) & ~7, +] + + +def sz(s: bytes, o: int) -> bytes: + return s[o : s.index(b"\0", o)] + + +class PcfFontFile(FontFile.FontFile): + """Font file plugin for the X11 PCF format.""" + + name = "name" + + def __init__(self, fp: BinaryIO, charset_encoding: str = "iso8859-1"): + self.charset_encoding = charset_encoding + + magic = l32(fp.read(4)) + if magic != PCF_MAGIC: + msg = "not a PCF file" + raise SyntaxError(msg) + + super().__init__() + + count = l32(fp.read(4)) + self.toc = {} + for i in range(count): + type = l32(fp.read(4)) + self.toc[type] = l32(fp.read(4)), l32(fp.read(4)), l32(fp.read(4)) + + self.fp = fp + + self.info = self._load_properties() + + metrics = self._load_metrics() + bitmaps = self._load_bitmaps(metrics) + encoding = self._load_encoding() + + # + # create glyph structure + + for ch, ix in enumerate(encoding): + if ix is not None: + ( + xsize, + ysize, + left, + right, + width, + ascent, + descent, + attributes, + ) = metrics[ix] + self.glyph[ch] = ( + (width, 0), + (left, descent - ysize, xsize + left, descent), + (0, 0, xsize, ysize), + bitmaps[ix], + ) + + def _getformat( + self, tag: int + ) -> tuple[BinaryIO, int, Callable[[bytes], int], Callable[[bytes], int]]: + format, size, offset = self.toc[tag] + + fp = self.fp + fp.seek(offset) + + format = l32(fp.read(4)) + + if format & 4: + i16, i32 = b16, b32 + else: + i16, i32 = l16, l32 + + return fp, format, i16, i32 + + def _load_properties(self) -> dict[bytes, bytes | int]: + # + # font properties + + properties = {} + + fp, format, i16, i32 = self._getformat(PCF_PROPERTIES) + + nprops = i32(fp.read(4)) + + # read property description + p = [(i32(fp.read(4)), i8(fp.read(1)), i32(fp.read(4))) for _ in range(nprops)] + + if nprops & 3: + fp.seek(4 - (nprops & 3), io.SEEK_CUR) # pad + + data = fp.read(i32(fp.read(4))) + + for k, s, v in p: + property_value: bytes | int = sz(data, v) if s else v + properties[sz(data, k)] = property_value + + return properties + + def _load_metrics(self) -> list[tuple[int, int, int, int, int, int, int, int]]: + # + # font metrics + + metrics: list[tuple[int, int, int, int, int, int, int, int]] = [] + + fp, format, i16, i32 = self._getformat(PCF_METRICS) + + append = metrics.append + + if (format & 0xFF00) == 0x100: + # "compressed" metrics + for i in range(i16(fp.read(2))): + left = i8(fp.read(1)) - 128 + right = i8(fp.read(1)) - 128 + width = i8(fp.read(1)) - 128 + ascent = i8(fp.read(1)) - 128 + descent = i8(fp.read(1)) - 128 + xsize = right - left + ysize = ascent + descent + append((xsize, ysize, left, right, width, ascent, descent, 0)) + + else: + # "jumbo" metrics + for i in range(i32(fp.read(4))): + left = i16(fp.read(2)) + right = i16(fp.read(2)) + width = i16(fp.read(2)) + ascent = i16(fp.read(2)) + descent = i16(fp.read(2)) + attributes = i16(fp.read(2)) + xsize = right - left + ysize = ascent + descent + append((xsize, ysize, left, right, width, ascent, descent, attributes)) + + return metrics + + def _load_bitmaps( + self, metrics: list[tuple[int, int, int, int, int, int, int, int]] + ) -> list[Image.Image]: + # + # bitmap data + + fp, format, i16, i32 = self._getformat(PCF_BITMAPS) + + nbitmaps = i32(fp.read(4)) + + if nbitmaps != len(metrics): + msg = "Wrong number of bitmaps" + raise OSError(msg) + + offsets = [i32(fp.read(4)) for _ in range(nbitmaps)] + + bitmap_sizes = [i32(fp.read(4)) for _ in range(4)] + + # byteorder = format & 4 # non-zero => MSB + bitorder = format & 8 # non-zero => MSB + padindex = format & 3 + + bitmapsize = bitmap_sizes[padindex] + offsets.append(bitmapsize) + + data = fp.read(bitmapsize) + + pad = BYTES_PER_ROW[padindex] + mode = "1;R" + if bitorder: + mode = "1" + + bitmaps = [] + for i in range(nbitmaps): + xsize, ysize = metrics[i][:2] + b, e = offsets[i : i + 2] + bitmaps.append( + Image.frombytes("1", (xsize, ysize), data[b:e], "raw", mode, pad(xsize)) + ) + + return bitmaps + + def _load_encoding(self) -> list[int | None]: + fp, format, i16, i32 = self._getformat(PCF_BDF_ENCODINGS) + + first_col, last_col = i16(fp.read(2)), i16(fp.read(2)) + first_row, last_row = i16(fp.read(2)), i16(fp.read(2)) + + i16(fp.read(2)) # default + + nencoding = (last_col - first_col + 1) * (last_row - first_row + 1) + + # map character code to bitmap index + encoding: list[int | None] = [None] * min(256, nencoding) + + encoding_offsets = [i16(fp.read(2)) for _ in range(nencoding)] + + for i in range(first_col, len(encoding)): + try: + encoding_offset = encoding_offsets[ + ord(bytearray([i]).decode(self.charset_encoding)) + ] + if encoding_offset != 0xFFFF: + encoding[i] = encoding_offset + except UnicodeDecodeError: + # character is not supported in selected encoding + pass + + return encoding diff --git a/venv/lib/python3.12/site-packages/PIL/PcxImagePlugin.py b/venv/lib/python3.12/site-packages/PIL/PcxImagePlugin.py new file mode 100644 index 0000000..8445d5c --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/PcxImagePlugin.py @@ -0,0 +1,229 @@ +# +# The Python Imaging Library. +# $Id$ +# +# PCX file handling +# +# This format was originally used by ZSoft's popular PaintBrush +# program for the IBM PC. It is also supported by many MS-DOS and +# Windows applications, including the Windows PaintBrush program in +# Windows 3. +# +# history: +# 1995-09-01 fl Created +# 1996-05-20 fl Fixed RGB support +# 1997-01-03 fl Fixed 2-bit and 4-bit support +# 1999-02-03 fl Fixed 8-bit support (broken in 1.0b1) +# 1999-02-07 fl Added write support +# 2002-06-09 fl Made 2-bit and 4-bit support a bit more robust +# 2002-07-30 fl Seek from to current position, not beginning of file +# 2003-06-03 fl Extract DPI settings (info["dpi"]) +# +# Copyright (c) 1997-2003 by Secret Labs AB. +# Copyright (c) 1995-2003 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import io +import logging +from typing import IO + +from . import Image, ImageFile, ImagePalette +from ._binary import i16le as i16 +from ._binary import o8 +from ._binary import o16le as o16 + +logger = logging.getLogger(__name__) + + +def _accept(prefix: bytes) -> bool: + return prefix[0] == 10 and prefix[1] in [0, 2, 3, 5] + + +## +# Image plugin for Paintbrush images. + + +class PcxImageFile(ImageFile.ImageFile): + format = "PCX" + format_description = "Paintbrush" + + def _open(self) -> None: + # header + assert self.fp is not None + + s = self.fp.read(128) + if not _accept(s): + msg = "not a PCX file" + raise SyntaxError(msg) + + # image + bbox = i16(s, 4), i16(s, 6), i16(s, 8) + 1, i16(s, 10) + 1 + if bbox[2] <= bbox[0] or bbox[3] <= bbox[1]: + msg = "bad PCX image size" + raise SyntaxError(msg) + logger.debug("BBox: %s %s %s %s", *bbox) + + # format + version = s[1] + bits = s[3] + planes = s[65] + provided_stride = i16(s, 66) + logger.debug( + "PCX version %s, bits %s, planes %s, stride %s", + version, + bits, + planes, + provided_stride, + ) + + self.info["dpi"] = i16(s, 12), i16(s, 14) + + if bits == 1 and planes == 1: + mode = rawmode = "1" + + elif bits == 1 and planes in (2, 4): + mode = "P" + rawmode = "P;%dL" % planes + self.palette = ImagePalette.raw("RGB", s[16:64]) + + elif version == 5 and bits == 8 and planes == 1: + mode = rawmode = "L" + # FIXME: hey, this doesn't work with the incremental loader !!! + self.fp.seek(-769, io.SEEK_END) + s = self.fp.read(769) + if len(s) == 769 and s[0] == 12: + # check if the palette is linear grayscale + for i in range(256): + if s[i * 3 + 1 : i * 3 + 4] != o8(i) * 3: + mode = rawmode = "P" + break + if mode == "P": + self.palette = ImagePalette.raw("RGB", s[1:]) + self.fp.seek(128) + + elif version == 5 and bits == 8 and planes == 3: + mode = "RGB" + rawmode = "RGB;L" + + else: + msg = "unknown PCX mode" + raise OSError(msg) + + self._mode = mode + self._size = bbox[2] - bbox[0], bbox[3] - bbox[1] + + # Don't trust the passed in stride. + # Calculate the approximate position for ourselves. + # CVE-2020-35653 + stride = (self._size[0] * bits + 7) // 8 + + # While the specification states that this must be even, + # not all images follow this + if provided_stride != stride: + stride += stride % 2 + + bbox = (0, 0) + self.size + logger.debug("size: %sx%s", *self.size) + + self.tile = [ + ImageFile._Tile("pcx", bbox, self.fp.tell(), (rawmode, planes * stride)) + ] + + +# -------------------------------------------------------------------- +# save PCX files + + +SAVE = { + # mode: (version, bits, planes, raw mode) + "1": (2, 1, 1, "1"), + "L": (5, 8, 1, "L"), + "P": (5, 8, 1, "P"), + "RGB": (5, 8, 3, "RGB;L"), +} + + +def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + try: + version, bits, planes, rawmode = SAVE[im.mode] + except KeyError as e: + msg = f"Cannot save {im.mode} images as PCX" + raise ValueError(msg) from e + + # bytes per plane + stride = (im.size[0] * bits + 7) // 8 + # stride should be even + stride += stride % 2 + # Stride needs to be kept in sync with the PcxEncode.c version. + # Ideally it should be passed in in the state, but the bytes value + # gets overwritten. + + logger.debug( + "PcxImagePlugin._save: xwidth: %d, bits: %d, stride: %d", + im.size[0], + bits, + stride, + ) + + # under windows, we could determine the current screen size with + # "Image.core.display_mode()[1]", but I think that's overkill... + + screen = im.size + + dpi = 100, 100 + + # PCX header + fp.write( + o8(10) + + o8(version) + + o8(1) + + o8(bits) + + o16(0) + + o16(0) + + o16(im.size[0] - 1) + + o16(im.size[1] - 1) + + o16(dpi[0]) + + o16(dpi[1]) + + b"\0" * 24 + + b"\xFF" * 24 + + b"\0" + + o8(planes) + + o16(stride) + + o16(1) + + o16(screen[0]) + + o16(screen[1]) + + b"\0" * 54 + ) + + assert fp.tell() == 128 + + ImageFile._save( + im, fp, [ImageFile._Tile("pcx", (0, 0) + im.size, 0, (rawmode, bits * planes))] + ) + + if im.mode == "P": + # colour palette + fp.write(o8(12)) + palette = im.im.getpalette("RGB", "RGB") + palette += b"\x00" * (768 - len(palette)) + fp.write(palette) # 768 bytes + elif im.mode == "L": + # grayscale palette + fp.write(o8(12)) + for i in range(256): + fp.write(o8(i) * 3) + + +# -------------------------------------------------------------------- +# registry + + +Image.register_open(PcxImageFile.format, PcxImageFile, _accept) +Image.register_save(PcxImageFile.format, _save) + +Image.register_extension(PcxImageFile.format, ".pcx") + +Image.register_mime(PcxImageFile.format, "image/x-pcx") diff --git a/venv/lib/python3.12/site-packages/PIL/PdfImagePlugin.py b/venv/lib/python3.12/site-packages/PIL/PdfImagePlugin.py new file mode 100644 index 0000000..e9c20dd --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/PdfImagePlugin.py @@ -0,0 +1,311 @@ +# +# The Python Imaging Library. +# $Id$ +# +# PDF (Acrobat) file handling +# +# History: +# 1996-07-16 fl Created +# 1997-01-18 fl Fixed header +# 2004-02-21 fl Fixes for 1/L/CMYK images, etc. +# 2004-02-24 fl Fixes for 1 and P images. +# +# Copyright (c) 1997-2004 by Secret Labs AB. All rights reserved. +# Copyright (c) 1996-1997 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# + +## +# Image plugin for PDF images (output only). +## +from __future__ import annotations + +import io +import math +import os +import time +from typing import IO, Any + +from . import Image, ImageFile, ImageSequence, PdfParser, __version__, features + +# +# -------------------------------------------------------------------- + +# object ids: +# 1. catalogue +# 2. pages +# 3. image +# 4. page +# 5. page contents + + +def _save_all(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + _save(im, fp, filename, save_all=True) + + +## +# (Internal) Image save plugin for the PDF format. + + +def _write_image( + im: Image.Image, + filename: str | bytes, + existing_pdf: PdfParser.PdfParser, + image_refs: list[PdfParser.IndirectReference], +) -> tuple[PdfParser.IndirectReference, str]: + # FIXME: Should replace ASCIIHexDecode with RunLengthDecode + # (packbits) or LZWDecode (tiff/lzw compression). Note that + # PDF 1.2 also supports Flatedecode (zip compression). + + params = None + decode = None + + # + # Get image characteristics + + width, height = im.size + + dict_obj: dict[str, Any] = {"BitsPerComponent": 8} + if im.mode == "1": + if features.check("libtiff"): + decode_filter = "CCITTFaxDecode" + dict_obj["BitsPerComponent"] = 1 + params = PdfParser.PdfArray( + [ + PdfParser.PdfDict( + { + "K": -1, + "BlackIs1": True, + "Columns": width, + "Rows": height, + } + ) + ] + ) + else: + decode_filter = "DCTDecode" + dict_obj["ColorSpace"] = PdfParser.PdfName("DeviceGray") + procset = "ImageB" # grayscale + elif im.mode == "L": + decode_filter = "DCTDecode" + # params = f"<< /Predictor 15 /Columns {width-2} >>" + dict_obj["ColorSpace"] = PdfParser.PdfName("DeviceGray") + procset = "ImageB" # grayscale + elif im.mode == "LA": + decode_filter = "JPXDecode" + # params = f"<< /Predictor 15 /Columns {width-2} >>" + procset = "ImageB" # grayscale + dict_obj["SMaskInData"] = 1 + elif im.mode == "P": + decode_filter = "ASCIIHexDecode" + palette = im.getpalette() + assert palette is not None + dict_obj["ColorSpace"] = [ + PdfParser.PdfName("Indexed"), + PdfParser.PdfName("DeviceRGB"), + len(palette) // 3 - 1, + PdfParser.PdfBinary(palette), + ] + procset = "ImageI" # indexed color + + if "transparency" in im.info: + smask = im.convert("LA").getchannel("A") + smask.encoderinfo = {} + + image_ref = _write_image(smask, filename, existing_pdf, image_refs)[0] + dict_obj["SMask"] = image_ref + elif im.mode == "RGB": + decode_filter = "DCTDecode" + dict_obj["ColorSpace"] = PdfParser.PdfName("DeviceRGB") + procset = "ImageC" # color images + elif im.mode == "RGBA": + decode_filter = "JPXDecode" + procset = "ImageC" # color images + dict_obj["SMaskInData"] = 1 + elif im.mode == "CMYK": + decode_filter = "DCTDecode" + dict_obj["ColorSpace"] = PdfParser.PdfName("DeviceCMYK") + procset = "ImageC" # color images + decode = [1, 0, 1, 0, 1, 0, 1, 0] + else: + msg = f"cannot save mode {im.mode}" + raise ValueError(msg) + + # + # image + + op = io.BytesIO() + + if decode_filter == "ASCIIHexDecode": + ImageFile._save(im, op, [ImageFile._Tile("hex", (0, 0) + im.size, 0, im.mode)]) + elif decode_filter == "CCITTFaxDecode": + im.save( + op, + "TIFF", + compression="group4", + # use a single strip + strip_size=math.ceil(width / 8) * height, + ) + elif decode_filter == "DCTDecode": + Image.SAVE["JPEG"](im, op, filename) + elif decode_filter == "JPXDecode": + del dict_obj["BitsPerComponent"] + Image.SAVE["JPEG2000"](im, op, filename) + else: + msg = f"unsupported PDF filter ({decode_filter})" + raise ValueError(msg) + + stream = op.getvalue() + filter: PdfParser.PdfArray | PdfParser.PdfName + if decode_filter == "CCITTFaxDecode": + stream = stream[8:] + filter = PdfParser.PdfArray([PdfParser.PdfName(decode_filter)]) + else: + filter = PdfParser.PdfName(decode_filter) + + image_ref = image_refs.pop(0) + existing_pdf.write_obj( + image_ref, + stream=stream, + Type=PdfParser.PdfName("XObject"), + Subtype=PdfParser.PdfName("Image"), + Width=width, # * 72.0 / x_resolution, + Height=height, # * 72.0 / y_resolution, + Filter=filter, + Decode=decode, + DecodeParms=params, + **dict_obj, + ) + + return image_ref, procset + + +def _save( + im: Image.Image, fp: IO[bytes], filename: str | bytes, save_all: bool = False +) -> None: + is_appending = im.encoderinfo.get("append", False) + filename_str = filename.decode() if isinstance(filename, bytes) else filename + if is_appending: + existing_pdf = PdfParser.PdfParser(f=fp, filename=filename_str, mode="r+b") + else: + existing_pdf = PdfParser.PdfParser(f=fp, filename=filename_str, mode="w+b") + + dpi = im.encoderinfo.get("dpi") + if dpi: + x_resolution = dpi[0] + y_resolution = dpi[1] + else: + x_resolution = y_resolution = im.encoderinfo.get("resolution", 72.0) + + info = { + "title": ( + None if is_appending else os.path.splitext(os.path.basename(filename))[0] + ), + "author": None, + "subject": None, + "keywords": None, + "creator": None, + "producer": None, + "creationDate": None if is_appending else time.gmtime(), + "modDate": None if is_appending else time.gmtime(), + } + for k, default in info.items(): + v = im.encoderinfo.get(k) if k in im.encoderinfo else default + if v: + existing_pdf.info[k[0].upper() + k[1:]] = v + + # + # make sure image data is available + im.load() + + existing_pdf.start_writing() + existing_pdf.write_header() + existing_pdf.write_comment(f"created by Pillow {__version__} PDF driver") + + # + # pages + ims = [im] + if save_all: + append_images = im.encoderinfo.get("append_images", []) + for append_im in append_images: + append_im.encoderinfo = im.encoderinfo.copy() + ims.append(append_im) + number_of_pages = 0 + image_refs = [] + page_refs = [] + contents_refs = [] + for im in ims: + im_number_of_pages = 1 + if save_all: + im_number_of_pages = getattr(im, "n_frames", 1) + number_of_pages += im_number_of_pages + for i in range(im_number_of_pages): + image_refs.append(existing_pdf.next_object_id(0)) + if im.mode == "P" and "transparency" in im.info: + image_refs.append(existing_pdf.next_object_id(0)) + + page_refs.append(existing_pdf.next_object_id(0)) + contents_refs.append(existing_pdf.next_object_id(0)) + existing_pdf.pages.append(page_refs[-1]) + + # + # catalog and list of pages + existing_pdf.write_catalog() + + page_number = 0 + for im_sequence in ims: + im_pages: ImageSequence.Iterator | list[Image.Image] = ( + ImageSequence.Iterator(im_sequence) if save_all else [im_sequence] + ) + for im in im_pages: + image_ref, procset = _write_image(im, filename, existing_pdf, image_refs) + + # + # page + + existing_pdf.write_page( + page_refs[page_number], + Resources=PdfParser.PdfDict( + ProcSet=[PdfParser.PdfName("PDF"), PdfParser.PdfName(procset)], + XObject=PdfParser.PdfDict(image=image_ref), + ), + MediaBox=[ + 0, + 0, + im.width * 72.0 / x_resolution, + im.height * 72.0 / y_resolution, + ], + Contents=contents_refs[page_number], + ) + + # + # page contents + + page_contents = b"q %f 0 0 %f 0 0 cm /image Do Q\n" % ( + im.width * 72.0 / x_resolution, + im.height * 72.0 / y_resolution, + ) + + existing_pdf.write_obj(contents_refs[page_number], stream=page_contents) + + page_number += 1 + + # + # trailer + existing_pdf.write_xref_and_trailer() + if hasattr(fp, "flush"): + fp.flush() + existing_pdf.close() + + +# +# -------------------------------------------------------------------- + + +Image.register_save("PDF", _save) +Image.register_save_all("PDF", _save_all) + +Image.register_extension("PDF", ".pdf") + +Image.register_mime("PDF", "application/pdf") diff --git a/venv/lib/python3.12/site-packages/PIL/PdfParser.py b/venv/lib/python3.12/site-packages/PIL/PdfParser.py new file mode 100644 index 0000000..7cb2d24 --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/PdfParser.py @@ -0,0 +1,1073 @@ +from __future__ import annotations + +import calendar +import codecs +import collections +import mmap +import os +import re +import time +import zlib +from typing import IO, TYPE_CHECKING, Any, NamedTuple, Union + + +# see 7.9.2.2 Text String Type on page 86 and D.3 PDFDocEncoding Character Set +# on page 656 +def encode_text(s: str) -> bytes: + return codecs.BOM_UTF16_BE + s.encode("utf_16_be") + + +PDFDocEncoding = { + 0x16: "\u0017", + 0x18: "\u02D8", + 0x19: "\u02C7", + 0x1A: "\u02C6", + 0x1B: "\u02D9", + 0x1C: "\u02DD", + 0x1D: "\u02DB", + 0x1E: "\u02DA", + 0x1F: "\u02DC", + 0x80: "\u2022", + 0x81: "\u2020", + 0x82: "\u2021", + 0x83: "\u2026", + 0x84: "\u2014", + 0x85: "\u2013", + 0x86: "\u0192", + 0x87: "\u2044", + 0x88: "\u2039", + 0x89: "\u203A", + 0x8A: "\u2212", + 0x8B: "\u2030", + 0x8C: "\u201E", + 0x8D: "\u201C", + 0x8E: "\u201D", + 0x8F: "\u2018", + 0x90: "\u2019", + 0x91: "\u201A", + 0x92: "\u2122", + 0x93: "\uFB01", + 0x94: "\uFB02", + 0x95: "\u0141", + 0x96: "\u0152", + 0x97: "\u0160", + 0x98: "\u0178", + 0x99: "\u017D", + 0x9A: "\u0131", + 0x9B: "\u0142", + 0x9C: "\u0153", + 0x9D: "\u0161", + 0x9E: "\u017E", + 0xA0: "\u20AC", +} + + +def decode_text(b: bytes) -> str: + if b[: len(codecs.BOM_UTF16_BE)] == codecs.BOM_UTF16_BE: + return b[len(codecs.BOM_UTF16_BE) :].decode("utf_16_be") + else: + return "".join(PDFDocEncoding.get(byte, chr(byte)) for byte in b) + + +class PdfFormatError(RuntimeError): + """An error that probably indicates a syntactic or semantic error in the + PDF file structure""" + + pass + + +def check_format_condition(condition: bool, error_message: str) -> None: + if not condition: + raise PdfFormatError(error_message) + + +class IndirectReferenceTuple(NamedTuple): + object_id: int + generation: int + + +class IndirectReference(IndirectReferenceTuple): + def __str__(self) -> str: + return f"{self.object_id} {self.generation} R" + + def __bytes__(self) -> bytes: + return self.__str__().encode("us-ascii") + + def __eq__(self, other: object) -> bool: + if self.__class__ is not other.__class__: + return False + assert isinstance(other, IndirectReference) + return other.object_id == self.object_id and other.generation == self.generation + + def __ne__(self, other: object) -> bool: + return not (self == other) + + def __hash__(self) -> int: + return hash((self.object_id, self.generation)) + + +class IndirectObjectDef(IndirectReference): + def __str__(self) -> str: + return f"{self.object_id} {self.generation} obj" + + +class XrefTable: + def __init__(self) -> None: + self.existing_entries: dict[int, tuple[int, int]] = ( + {} + ) # object ID => (offset, generation) + self.new_entries: dict[int, tuple[int, int]] = ( + {} + ) # object ID => (offset, generation) + self.deleted_entries = {0: 65536} # object ID => generation + self.reading_finished = False + + def __setitem__(self, key: int, value: tuple[int, int]) -> None: + if self.reading_finished: + self.new_entries[key] = value + else: + self.existing_entries[key] = value + if key in self.deleted_entries: + del self.deleted_entries[key] + + def __getitem__(self, key: int) -> tuple[int, int]: + try: + return self.new_entries[key] + except KeyError: + return self.existing_entries[key] + + def __delitem__(self, key: int) -> None: + if key in self.new_entries: + generation = self.new_entries[key][1] + 1 + del self.new_entries[key] + self.deleted_entries[key] = generation + elif key in self.existing_entries: + generation = self.existing_entries[key][1] + 1 + self.deleted_entries[key] = generation + elif key in self.deleted_entries: + generation = self.deleted_entries[key] + else: + msg = f"object ID {key} cannot be deleted because it doesn't exist" + raise IndexError(msg) + + def __contains__(self, key: int) -> bool: + return key in self.existing_entries or key in self.new_entries + + def __len__(self) -> int: + return len( + set(self.existing_entries.keys()) + | set(self.new_entries.keys()) + | set(self.deleted_entries.keys()) + ) + + def keys(self) -> set[int]: + return ( + set(self.existing_entries.keys()) - set(self.deleted_entries.keys()) + ) | set(self.new_entries.keys()) + + def write(self, f: IO[bytes]) -> int: + keys = sorted(set(self.new_entries.keys()) | set(self.deleted_entries.keys())) + deleted_keys = sorted(set(self.deleted_entries.keys())) + startxref = f.tell() + f.write(b"xref\n") + while keys: + # find a contiguous sequence of object IDs + prev: int | None = None + for index, key in enumerate(keys): + if prev is None or prev + 1 == key: + prev = key + else: + contiguous_keys = keys[:index] + keys = keys[index:] + break + else: + contiguous_keys = keys + keys = [] + f.write(b"%d %d\n" % (contiguous_keys[0], len(contiguous_keys))) + for object_id in contiguous_keys: + if object_id in self.new_entries: + f.write(b"%010d %05d n \n" % self.new_entries[object_id]) + else: + this_deleted_object_id = deleted_keys.pop(0) + check_format_condition( + object_id == this_deleted_object_id, + f"expected the next deleted object ID to be {object_id}, " + f"instead found {this_deleted_object_id}", + ) + try: + next_in_linked_list = deleted_keys[0] + except IndexError: + next_in_linked_list = 0 + f.write( + b"%010d %05d f \n" + % (next_in_linked_list, self.deleted_entries[object_id]) + ) + return startxref + + +class PdfName: + name: bytes + + def __init__(self, name: PdfName | bytes | str) -> None: + if isinstance(name, PdfName): + self.name = name.name + elif isinstance(name, bytes): + self.name = name + else: + self.name = name.encode("us-ascii") + + def name_as_str(self) -> str: + return self.name.decode("us-ascii") + + def __eq__(self, other: object) -> bool: + return ( + isinstance(other, PdfName) and other.name == self.name + ) or other == self.name + + def __hash__(self) -> int: + return hash(self.name) + + def __repr__(self) -> str: + return f"{self.__class__.__name__}({repr(self.name)})" + + @classmethod + def from_pdf_stream(cls, data: bytes) -> PdfName: + return cls(PdfParser.interpret_name(data)) + + allowed_chars = set(range(33, 127)) - {ord(c) for c in "#%/()<>[]{}"} + + def __bytes__(self) -> bytes: + result = bytearray(b"/") + for b in self.name: + if b in self.allowed_chars: + result.append(b) + else: + result.extend(b"#%02X" % b) + return bytes(result) + + +class PdfArray(list[Any]): + def __bytes__(self) -> bytes: + return b"[ " + b" ".join(pdf_repr(x) for x in self) + b" ]" + + +if TYPE_CHECKING: + _DictBase = collections.UserDict[Union[str, bytes], Any] +else: + _DictBase = collections.UserDict + + +class PdfDict(_DictBase): + def __setattr__(self, key: str, value: Any) -> None: + if key == "data": + collections.UserDict.__setattr__(self, key, value) + else: + self[key.encode("us-ascii")] = value + + def __getattr__(self, key: str) -> str | time.struct_time: + try: + value = self[key.encode("us-ascii")] + except KeyError as e: + raise AttributeError(key) from e + if isinstance(value, bytes): + value = decode_text(value) + if key.endswith("Date"): + if value.startswith("D:"): + value = value[2:] + + relationship = "Z" + if len(value) > 17: + relationship = value[14] + offset = int(value[15:17]) * 60 + if len(value) > 20: + offset += int(value[18:20]) + + format = "%Y%m%d%H%M%S"[: len(value) - 2] + value = time.strptime(value[: len(format) + 2], format) + if relationship in ["+", "-"]: + offset *= 60 + if relationship == "+": + offset *= -1 + value = time.gmtime(calendar.timegm(value) + offset) + return value + + def __bytes__(self) -> bytes: + out = bytearray(b"<<") + for key, value in self.items(): + if value is None: + continue + value = pdf_repr(value) + out.extend(b"\n") + out.extend(bytes(PdfName(key))) + out.extend(b" ") + out.extend(value) + out.extend(b"\n>>") + return bytes(out) + + +class PdfBinary: + def __init__(self, data: list[int] | bytes) -> None: + self.data = data + + def __bytes__(self) -> bytes: + return b"<%s>" % b"".join(b"%02X" % b for b in self.data) + + +class PdfStream: + def __init__(self, dictionary: PdfDict, buf: bytes) -> None: + self.dictionary = dictionary + self.buf = buf + + def decode(self) -> bytes: + try: + filter = self.dictionary[b"Filter"] + except KeyError: + return self.buf + if filter == b"FlateDecode": + try: + expected_length = self.dictionary[b"DL"] + except KeyError: + expected_length = self.dictionary[b"Length"] + return zlib.decompress(self.buf, bufsize=int(expected_length)) + else: + msg = f"stream filter {repr(filter)} unknown/unsupported" + raise NotImplementedError(msg) + + +def pdf_repr(x: Any) -> bytes: + if x is True: + return b"true" + elif x is False: + return b"false" + elif x is None: + return b"null" + elif isinstance(x, (PdfName, PdfDict, PdfArray, PdfBinary)): + return bytes(x) + elif isinstance(x, (int, float)): + return str(x).encode("us-ascii") + elif isinstance(x, time.struct_time): + return b"(D:" + time.strftime("%Y%m%d%H%M%SZ", x).encode("us-ascii") + b")" + elif isinstance(x, dict): + return bytes(PdfDict(x)) + elif isinstance(x, list): + return bytes(PdfArray(x)) + elif isinstance(x, str): + return pdf_repr(encode_text(x)) + elif isinstance(x, bytes): + # XXX escape more chars? handle binary garbage + x = x.replace(b"\\", b"\\\\") + x = x.replace(b"(", b"\\(") + x = x.replace(b")", b"\\)") + return b"(" + x + b")" + else: + return bytes(x) + + +class PdfParser: + """Based on + https://www.adobe.com/content/dam/acom/en/devnet/acrobat/pdfs/PDF32000_2008.pdf + Supports PDF up to 1.4 + """ + + def __init__( + self, + filename: str | None = None, + f: IO[bytes] | None = None, + buf: bytes | bytearray | None = None, + start_offset: int = 0, + mode: str = "rb", + ) -> None: + if buf and f: + msg = "specify buf or f or filename, but not both buf and f" + raise RuntimeError(msg) + self.filename = filename + self.buf: bytes | bytearray | mmap.mmap | None = buf + self.f = f + self.start_offset = start_offset + self.should_close_buf = False + self.should_close_file = False + if filename is not None and f is None: + self.f = f = open(filename, mode) + self.should_close_file = True + if f is not None: + self.buf = self.get_buf_from_file(f) + self.should_close_buf = True + if not filename and hasattr(f, "name"): + self.filename = f.name + self.cached_objects: dict[IndirectReference, Any] = {} + self.root_ref: IndirectReference | None + self.info_ref: IndirectReference | None + self.pages_ref: IndirectReference | None + self.last_xref_section_offset: int | None + if self.buf: + self.read_pdf_info() + else: + self.file_size_total = self.file_size_this = 0 + self.root = PdfDict() + self.root_ref = None + self.info = PdfDict() + self.info_ref = None + self.page_tree_root = PdfDict() + self.pages: list[IndirectReference] = [] + self.orig_pages: list[IndirectReference] = [] + self.pages_ref = None + self.last_xref_section_offset = None + self.trailer_dict: dict[bytes, Any] = {} + self.xref_table = XrefTable() + self.xref_table.reading_finished = True + if f: + self.seek_end() + + def __enter__(self) -> PdfParser: + return self + + def __exit__(self, *args: object) -> None: + self.close() + + def start_writing(self) -> None: + self.close_buf() + self.seek_end() + + def close_buf(self) -> None: + if isinstance(self.buf, mmap.mmap): + self.buf.close() + self.buf = None + + def close(self) -> None: + if self.should_close_buf: + self.close_buf() + if self.f is not None and self.should_close_file: + self.f.close() + self.f = None + + def seek_end(self) -> None: + assert self.f is not None + self.f.seek(0, os.SEEK_END) + + def write_header(self) -> None: + assert self.f is not None + self.f.write(b"%PDF-1.4\n") + + def write_comment(self, s: str) -> None: + assert self.f is not None + self.f.write(f"% {s}\n".encode()) + + def write_catalog(self) -> IndirectReference: + assert self.f is not None + self.del_root() + self.root_ref = self.next_object_id(self.f.tell()) + self.pages_ref = self.next_object_id(0) + self.rewrite_pages() + self.write_obj(self.root_ref, Type=PdfName(b"Catalog"), Pages=self.pages_ref) + self.write_obj( + self.pages_ref, + Type=PdfName(b"Pages"), + Count=len(self.pages), + Kids=self.pages, + ) + return self.root_ref + + def rewrite_pages(self) -> None: + pages_tree_nodes_to_delete = [] + for i, page_ref in enumerate(self.orig_pages): + page_info = self.cached_objects[page_ref] + del self.xref_table[page_ref.object_id] + pages_tree_nodes_to_delete.append(page_info[PdfName(b"Parent")]) + if page_ref not in self.pages: + # the page has been deleted + continue + # make dict keys into strings for passing to write_page + stringified_page_info = {} + for key, value in page_info.items(): + # key should be a PdfName + stringified_page_info[key.name_as_str()] = value + stringified_page_info["Parent"] = self.pages_ref + new_page_ref = self.write_page(None, **stringified_page_info) + for j, cur_page_ref in enumerate(self.pages): + if cur_page_ref == page_ref: + # replace the page reference with the new one + self.pages[j] = new_page_ref + # delete redundant Pages tree nodes from xref table + for pages_tree_node_ref in pages_tree_nodes_to_delete: + while pages_tree_node_ref: + pages_tree_node = self.cached_objects[pages_tree_node_ref] + if pages_tree_node_ref.object_id in self.xref_table: + del self.xref_table[pages_tree_node_ref.object_id] + pages_tree_node_ref = pages_tree_node.get(b"Parent", None) + self.orig_pages = [] + + def write_xref_and_trailer( + self, new_root_ref: IndirectReference | None = None + ) -> None: + assert self.f is not None + if new_root_ref: + self.del_root() + self.root_ref = new_root_ref + if self.info: + self.info_ref = self.write_obj(None, self.info) + start_xref = self.xref_table.write(self.f) + num_entries = len(self.xref_table) + trailer_dict: dict[str | bytes, Any] = { + b"Root": self.root_ref, + b"Size": num_entries, + } + if self.last_xref_section_offset is not None: + trailer_dict[b"Prev"] = self.last_xref_section_offset + if self.info: + trailer_dict[b"Info"] = self.info_ref + self.last_xref_section_offset = start_xref + self.f.write( + b"trailer\n" + + bytes(PdfDict(trailer_dict)) + + b"\nstartxref\n%d\n%%%%EOF" % start_xref + ) + + def write_page( + self, ref: int | IndirectReference | None, *objs: Any, **dict_obj: Any + ) -> IndirectReference: + obj_ref = self.pages[ref] if isinstance(ref, int) else ref + if "Type" not in dict_obj: + dict_obj["Type"] = PdfName(b"Page") + if "Parent" not in dict_obj: + dict_obj["Parent"] = self.pages_ref + return self.write_obj(obj_ref, *objs, **dict_obj) + + def write_obj( + self, ref: IndirectReference | None, *objs: Any, **dict_obj: Any + ) -> IndirectReference: + assert self.f is not None + f = self.f + if ref is None: + ref = self.next_object_id(f.tell()) + else: + self.xref_table[ref.object_id] = (f.tell(), ref.generation) + f.write(bytes(IndirectObjectDef(*ref))) + stream = dict_obj.pop("stream", None) + if stream is not None: + dict_obj["Length"] = len(stream) + if dict_obj: + f.write(pdf_repr(dict_obj)) + for obj in objs: + f.write(pdf_repr(obj)) + if stream is not None: + f.write(b"stream\n") + f.write(stream) + f.write(b"\nendstream\n") + f.write(b"endobj\n") + return ref + + def del_root(self) -> None: + if self.root_ref is None: + return + del self.xref_table[self.root_ref.object_id] + del self.xref_table[self.root[b"Pages"].object_id] + + @staticmethod + def get_buf_from_file(f: IO[bytes]) -> bytes | mmap.mmap: + if hasattr(f, "getbuffer"): + return f.getbuffer() + elif hasattr(f, "getvalue"): + return f.getvalue() + else: + try: + return mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ) + except ValueError: # cannot mmap an empty file + return b"" + + def read_pdf_info(self) -> None: + assert self.buf is not None + self.file_size_total = len(self.buf) + self.file_size_this = self.file_size_total - self.start_offset + self.read_trailer() + check_format_condition( + self.trailer_dict.get(b"Root") is not None, "Root is missing" + ) + self.root_ref = self.trailer_dict[b"Root"] + assert self.root_ref is not None + self.info_ref = self.trailer_dict.get(b"Info", None) + self.root = PdfDict(self.read_indirect(self.root_ref)) + if self.info_ref is None: + self.info = PdfDict() + else: + self.info = PdfDict(self.read_indirect(self.info_ref)) + check_format_condition(b"Type" in self.root, "/Type missing in Root") + check_format_condition( + self.root[b"Type"] == b"Catalog", "/Type in Root is not /Catalog" + ) + check_format_condition( + self.root.get(b"Pages") is not None, "/Pages missing in Root" + ) + check_format_condition( + isinstance(self.root[b"Pages"], IndirectReference), + "/Pages in Root is not an indirect reference", + ) + self.pages_ref = self.root[b"Pages"] + assert self.pages_ref is not None + self.page_tree_root = self.read_indirect(self.pages_ref) + self.pages = self.linearize_page_tree(self.page_tree_root) + # save the original list of page references + # in case the user modifies, adds or deletes some pages + # and we need to rewrite the pages and their list + self.orig_pages = self.pages[:] + + def next_object_id(self, offset: int | None = None) -> IndirectReference: + try: + # TODO: support reuse of deleted objects + reference = IndirectReference(max(self.xref_table.keys()) + 1, 0) + except ValueError: + reference = IndirectReference(1, 0) + if offset is not None: + self.xref_table[reference.object_id] = (offset, 0) + return reference + + delimiter = rb"[][()<>{}/%]" + delimiter_or_ws = rb"[][()<>{}/%\000\011\012\014\015\040]" + whitespace = rb"[\000\011\012\014\015\040]" + whitespace_or_hex = rb"[\000\011\012\014\015\0400-9a-fA-F]" + whitespace_optional = whitespace + b"*" + whitespace_mandatory = whitespace + b"+" + # No "\012" aka "\n" or "\015" aka "\r": + whitespace_optional_no_nl = rb"[\000\011\014\040]*" + newline_only = rb"[\r\n]+" + newline = whitespace_optional_no_nl + newline_only + whitespace_optional_no_nl + re_trailer_end = re.compile( + whitespace_mandatory + + rb"trailer" + + whitespace_optional + + rb"<<(.*>>)" + + newline + + rb"startxref" + + newline + + rb"([0-9]+)" + + newline + + rb"%%EOF" + + whitespace_optional + + rb"$", + re.DOTALL, + ) + re_trailer_prev = re.compile( + whitespace_optional + + rb"trailer" + + whitespace_optional + + rb"<<(.*?>>)" + + newline + + rb"startxref" + + newline + + rb"([0-9]+)" + + newline + + rb"%%EOF" + + whitespace_optional, + re.DOTALL, + ) + + def read_trailer(self) -> None: + assert self.buf is not None + search_start_offset = len(self.buf) - 16384 + if search_start_offset < self.start_offset: + search_start_offset = self.start_offset + m = self.re_trailer_end.search(self.buf, search_start_offset) + check_format_condition(m is not None, "trailer end not found") + # make sure we found the LAST trailer + last_match = m + while m: + last_match = m + m = self.re_trailer_end.search(self.buf, m.start() + 16) + if not m: + m = last_match + assert m is not None + trailer_data = m.group(1) + self.last_xref_section_offset = int(m.group(2)) + self.trailer_dict = self.interpret_trailer(trailer_data) + self.xref_table = XrefTable() + self.read_xref_table(xref_section_offset=self.last_xref_section_offset) + if b"Prev" in self.trailer_dict: + self.read_prev_trailer(self.trailer_dict[b"Prev"]) + + def read_prev_trailer(self, xref_section_offset: int) -> None: + assert self.buf is not None + trailer_offset = self.read_xref_table(xref_section_offset=xref_section_offset) + m = self.re_trailer_prev.search( + self.buf[trailer_offset : trailer_offset + 16384] + ) + check_format_condition(m is not None, "previous trailer not found") + assert m is not None + trailer_data = m.group(1) + check_format_condition( + int(m.group(2)) == xref_section_offset, + "xref section offset in previous trailer doesn't match what was expected", + ) + trailer_dict = self.interpret_trailer(trailer_data) + if b"Prev" in trailer_dict: + self.read_prev_trailer(trailer_dict[b"Prev"]) + + re_whitespace_optional = re.compile(whitespace_optional) + re_name = re.compile( + whitespace_optional + + rb"/([!-$&'*-.0-;=?-Z\\^-z|~]+)(?=" + + delimiter_or_ws + + rb")" + ) + re_dict_start = re.compile(whitespace_optional + rb"<<") + re_dict_end = re.compile(whitespace_optional + rb">>" + whitespace_optional) + + @classmethod + def interpret_trailer(cls, trailer_data: bytes) -> dict[bytes, Any]: + trailer = {} + offset = 0 + while True: + m = cls.re_name.match(trailer_data, offset) + if not m: + m = cls.re_dict_end.match(trailer_data, offset) + check_format_condition( + m is not None and m.end() == len(trailer_data), + "name not found in trailer, remaining data: " + + repr(trailer_data[offset:]), + ) + break + key = cls.interpret_name(m.group(1)) + assert isinstance(key, bytes) + value, value_offset = cls.get_value(trailer_data, m.end()) + trailer[key] = value + if value_offset is None: + break + offset = value_offset + check_format_condition( + b"Size" in trailer and isinstance(trailer[b"Size"], int), + "/Size not in trailer or not an integer", + ) + check_format_condition( + b"Root" in trailer and isinstance(trailer[b"Root"], IndirectReference), + "/Root not in trailer or not an indirect reference", + ) + return trailer + + re_hashes_in_name = re.compile(rb"([^#]*)(#([0-9a-fA-F]{2}))?") + + @classmethod + def interpret_name(cls, raw: bytes, as_text: bool = False) -> str | bytes: + name = b"" + for m in cls.re_hashes_in_name.finditer(raw): + if m.group(3): + name += m.group(1) + bytearray.fromhex(m.group(3).decode("us-ascii")) + else: + name += m.group(1) + if as_text: + return name.decode("utf-8") + else: + return bytes(name) + + re_null = re.compile(whitespace_optional + rb"null(?=" + delimiter_or_ws + rb")") + re_true = re.compile(whitespace_optional + rb"true(?=" + delimiter_or_ws + rb")") + re_false = re.compile(whitespace_optional + rb"false(?=" + delimiter_or_ws + rb")") + re_int = re.compile( + whitespace_optional + rb"([-+]?[0-9]+)(?=" + delimiter_or_ws + rb")" + ) + re_real = re.compile( + whitespace_optional + + rb"([-+]?([0-9]+\.[0-9]*|[0-9]*\.[0-9]+))(?=" + + delimiter_or_ws + + rb")" + ) + re_array_start = re.compile(whitespace_optional + rb"\[") + re_array_end = re.compile(whitespace_optional + rb"]") + re_string_hex = re.compile( + whitespace_optional + rb"<(" + whitespace_or_hex + rb"*)>" + ) + re_string_lit = re.compile(whitespace_optional + rb"\(") + re_indirect_reference = re.compile( + whitespace_optional + + rb"([-+]?[0-9]+)" + + whitespace_mandatory + + rb"([-+]?[0-9]+)" + + whitespace_mandatory + + rb"R(?=" + + delimiter_or_ws + + rb")" + ) + re_indirect_def_start = re.compile( + whitespace_optional + + rb"([-+]?[0-9]+)" + + whitespace_mandatory + + rb"([-+]?[0-9]+)" + + whitespace_mandatory + + rb"obj(?=" + + delimiter_or_ws + + rb")" + ) + re_indirect_def_end = re.compile( + whitespace_optional + rb"endobj(?=" + delimiter_or_ws + rb")" + ) + re_comment = re.compile( + rb"(" + whitespace_optional + rb"%[^\r\n]*" + newline + rb")*" + ) + re_stream_start = re.compile(whitespace_optional + rb"stream\r?\n") + re_stream_end = re.compile( + whitespace_optional + rb"endstream(?=" + delimiter_or_ws + rb")" + ) + + @classmethod + def get_value( + cls, + data: bytes | bytearray | mmap.mmap, + offset: int, + expect_indirect: IndirectReference | None = None, + max_nesting: int = -1, + ) -> tuple[Any, int | None]: + if max_nesting == 0: + return None, None + m = cls.re_comment.match(data, offset) + if m: + offset = m.end() + m = cls.re_indirect_def_start.match(data, offset) + if m: + check_format_condition( + int(m.group(1)) > 0, + "indirect object definition: object ID must be greater than 0", + ) + check_format_condition( + int(m.group(2)) >= 0, + "indirect object definition: generation must be non-negative", + ) + check_format_condition( + expect_indirect is None + or expect_indirect + == IndirectReference(int(m.group(1)), int(m.group(2))), + "indirect object definition different than expected", + ) + object, object_offset = cls.get_value( + data, m.end(), max_nesting=max_nesting - 1 + ) + if object_offset is None: + return object, None + m = cls.re_indirect_def_end.match(data, object_offset) + check_format_condition( + m is not None, "indirect object definition end not found" + ) + assert m is not None + return object, m.end() + check_format_condition( + not expect_indirect, "indirect object definition not found" + ) + m = cls.re_indirect_reference.match(data, offset) + if m: + check_format_condition( + int(m.group(1)) > 0, + "indirect object reference: object ID must be greater than 0", + ) + check_format_condition( + int(m.group(2)) >= 0, + "indirect object reference: generation must be non-negative", + ) + return IndirectReference(int(m.group(1)), int(m.group(2))), m.end() + m = cls.re_dict_start.match(data, offset) + if m: + offset = m.end() + result: dict[Any, Any] = {} + m = cls.re_dict_end.match(data, offset) + current_offset: int | None = offset + while not m: + assert current_offset is not None + key, current_offset = cls.get_value( + data, current_offset, max_nesting=max_nesting - 1 + ) + if current_offset is None: + return result, None + value, current_offset = cls.get_value( + data, current_offset, max_nesting=max_nesting - 1 + ) + result[key] = value + if current_offset is None: + return result, None + m = cls.re_dict_end.match(data, current_offset) + current_offset = m.end() + m = cls.re_stream_start.match(data, current_offset) + if m: + stream_len = result.get(b"Length") + if stream_len is None or not isinstance(stream_len, int): + msg = f"bad or missing Length in stream dict ({stream_len})" + raise PdfFormatError(msg) + stream_data = data[m.end() : m.end() + stream_len] + m = cls.re_stream_end.match(data, m.end() + stream_len) + check_format_condition(m is not None, "stream end not found") + assert m is not None + current_offset = m.end() + return PdfStream(PdfDict(result), stream_data), current_offset + return PdfDict(result), current_offset + m = cls.re_array_start.match(data, offset) + if m: + offset = m.end() + results = [] + m = cls.re_array_end.match(data, offset) + current_offset = offset + while not m: + assert current_offset is not None + value, current_offset = cls.get_value( + data, current_offset, max_nesting=max_nesting - 1 + ) + results.append(value) + if current_offset is None: + return results, None + m = cls.re_array_end.match(data, current_offset) + return results, m.end() + m = cls.re_null.match(data, offset) + if m: + return None, m.end() + m = cls.re_true.match(data, offset) + if m: + return True, m.end() + m = cls.re_false.match(data, offset) + if m: + return False, m.end() + m = cls.re_name.match(data, offset) + if m: + return PdfName(cls.interpret_name(m.group(1))), m.end() + m = cls.re_int.match(data, offset) + if m: + return int(m.group(1)), m.end() + m = cls.re_real.match(data, offset) + if m: + # XXX Decimal instead of float??? + return float(m.group(1)), m.end() + m = cls.re_string_hex.match(data, offset) + if m: + # filter out whitespace + hex_string = bytearray( + b for b in m.group(1) if b in b"0123456789abcdefABCDEF" + ) + if len(hex_string) % 2 == 1: + # append a 0 if the length is not even - yes, at the end + hex_string.append(ord(b"0")) + return bytearray.fromhex(hex_string.decode("us-ascii")), m.end() + m = cls.re_string_lit.match(data, offset) + if m: + return cls.get_literal_string(data, m.end()) + # return None, offset # fallback (only for debugging) + msg = f"unrecognized object: {repr(data[offset : offset + 32])}" + raise PdfFormatError(msg) + + re_lit_str_token = re.compile( + rb"(\\[nrtbf()\\])|(\\[0-9]{1,3})|(\\(\r\n|\r|\n))|(\r\n|\r|\n)|(\()|(\))" + ) + escaped_chars = { + b"n": b"\n", + b"r": b"\r", + b"t": b"\t", + b"b": b"\b", + b"f": b"\f", + b"(": b"(", + b")": b")", + b"\\": b"\\", + ord(b"n"): b"\n", + ord(b"r"): b"\r", + ord(b"t"): b"\t", + ord(b"b"): b"\b", + ord(b"f"): b"\f", + ord(b"("): b"(", + ord(b")"): b")", + ord(b"\\"): b"\\", + } + + @classmethod + def get_literal_string( + cls, data: bytes | bytearray | mmap.mmap, offset: int + ) -> tuple[bytes, int]: + nesting_depth = 0 + result = bytearray() + for m in cls.re_lit_str_token.finditer(data, offset): + result.extend(data[offset : m.start()]) + if m.group(1): + result.extend(cls.escaped_chars[m.group(1)[1]]) + elif m.group(2): + result.append(int(m.group(2)[1:], 8)) + elif m.group(3): + pass + elif m.group(5): + result.extend(b"\n") + elif m.group(6): + result.extend(b"(") + nesting_depth += 1 + elif m.group(7): + if nesting_depth == 0: + return bytes(result), m.end() + result.extend(b")") + nesting_depth -= 1 + offset = m.end() + msg = "unfinished literal string" + raise PdfFormatError(msg) + + re_xref_section_start = re.compile(whitespace_optional + rb"xref" + newline) + re_xref_subsection_start = re.compile( + whitespace_optional + + rb"([0-9]+)" + + whitespace_mandatory + + rb"([0-9]+)" + + whitespace_optional + + newline_only + ) + re_xref_entry = re.compile(rb"([0-9]{10}) ([0-9]{5}) ([fn])( \r| \n|\r\n)") + + def read_xref_table(self, xref_section_offset: int) -> int: + assert self.buf is not None + subsection_found = False + m = self.re_xref_section_start.match( + self.buf, xref_section_offset + self.start_offset + ) + check_format_condition(m is not None, "xref section start not found") + assert m is not None + offset = m.end() + while True: + m = self.re_xref_subsection_start.match(self.buf, offset) + if not m: + check_format_condition( + subsection_found, "xref subsection start not found" + ) + break + subsection_found = True + offset = m.end() + first_object = int(m.group(1)) + num_objects = int(m.group(2)) + for i in range(first_object, first_object + num_objects): + m = self.re_xref_entry.match(self.buf, offset) + check_format_condition(m is not None, "xref entry not found") + assert m is not None + offset = m.end() + is_free = m.group(3) == b"f" + if not is_free: + generation = int(m.group(2)) + new_entry = (int(m.group(1)), generation) + if i not in self.xref_table: + self.xref_table[i] = new_entry + return offset + + def read_indirect(self, ref: IndirectReference, max_nesting: int = -1) -> Any: + offset, generation = self.xref_table[ref[0]] + check_format_condition( + generation == ref[1], + f"expected to find generation {ref[1]} for object ID {ref[0]} in xref " + f"table, instead found generation {generation} at offset {offset}", + ) + assert self.buf is not None + value = self.get_value( + self.buf, + offset + self.start_offset, + expect_indirect=IndirectReference(*ref), + max_nesting=max_nesting, + )[0] + self.cached_objects[ref] = value + return value + + def linearize_page_tree( + self, node: PdfDict | None = None + ) -> list[IndirectReference]: + page_node = node if node is not None else self.page_tree_root + check_format_condition( + page_node[b"Type"] == b"Pages", "/Type of page tree node is not /Pages" + ) + pages = [] + for kid in page_node[b"Kids"]: + kid_object = self.read_indirect(kid) + if kid_object[b"Type"] == b"Page": + pages.append(kid) + else: + pages.extend(self.linearize_page_tree(node=kid_object)) + return pages diff --git a/venv/lib/python3.12/site-packages/PIL/PixarImagePlugin.py b/venv/lib/python3.12/site-packages/PIL/PixarImagePlugin.py new file mode 100644 index 0000000..36f565f --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/PixarImagePlugin.py @@ -0,0 +1,74 @@ +# +# The Python Imaging Library. +# $Id$ +# +# PIXAR raster support for PIL +# +# history: +# 97-01-29 fl Created +# +# notes: +# This is incomplete; it is based on a few samples created with +# Photoshop 2.5 and 3.0, and a summary description provided by +# Greg Coats . Hopefully, "L" and +# "RGBA" support will be added in future versions. +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1997. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +from . import Image, ImageFile +from ._binary import i16le as i16 + +# +# helpers + + +def _accept(prefix: bytes) -> bool: + return prefix[:4] == b"\200\350\000\000" + + +## +# Image plugin for PIXAR raster images. + + +class PixarImageFile(ImageFile.ImageFile): + format = "PIXAR" + format_description = "PIXAR raster image" + + def _open(self) -> None: + # assuming a 4-byte magic label + assert self.fp is not None + + s = self.fp.read(4) + if not _accept(s): + msg = "not a PIXAR file" + raise SyntaxError(msg) + + # read rest of header + s = s + self.fp.read(508) + + self._size = i16(s, 418), i16(s, 416) + + # get channel/depth descriptions + mode = i16(s, 424), i16(s, 426) + + if mode == (14, 2): + self._mode = "RGB" + # FIXME: to be continued... + + # create tile descriptor (assuming "dumped") + self.tile = [ + ImageFile._Tile("raw", (0, 0) + self.size, 1024, (self.mode, 0, 1)) + ] + + +# +# -------------------------------------------------------------------- + +Image.register_open(PixarImageFile.format, PixarImageFile, _accept) + +Image.register_extension(PixarImageFile.format, ".pxr") diff --git a/venv/lib/python3.12/site-packages/PIL/PngImagePlugin.py b/venv/lib/python3.12/site-packages/PIL/PngImagePlugin.py new file mode 100644 index 0000000..4e12272 --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/PngImagePlugin.py @@ -0,0 +1,1544 @@ +# +# The Python Imaging Library. +# $Id$ +# +# PNG support code +# +# See "PNG (Portable Network Graphics) Specification, version 1.0; +# W3C Recommendation", 1996-10-01, Thomas Boutell (ed.). +# +# history: +# 1996-05-06 fl Created (couldn't resist it) +# 1996-12-14 fl Upgraded, added read and verify support (0.2) +# 1996-12-15 fl Separate PNG stream parser +# 1996-12-29 fl Added write support, added getchunks +# 1996-12-30 fl Eliminated circular references in decoder (0.3) +# 1998-07-12 fl Read/write 16-bit images as mode I (0.4) +# 2001-02-08 fl Added transparency support (from Zircon) (0.5) +# 2001-04-16 fl Don't close data source in "open" method (0.6) +# 2004-02-24 fl Don't even pretend to support interlaced files (0.7) +# 2004-08-31 fl Do basic sanity check on chunk identifiers (0.8) +# 2004-09-20 fl Added PngInfo chunk container +# 2004-12-18 fl Added DPI read support (based on code by Niki Spahiev) +# 2008-08-13 fl Added tRNS support for RGB images +# 2009-03-06 fl Support for preserving ICC profiles (by Florian Hoech) +# 2009-03-08 fl Added zTXT support (from Lowell Alleman) +# 2009-03-29 fl Read interlaced PNG files (from Conrado Porto Lopes Gouvua) +# +# Copyright (c) 1997-2009 by Secret Labs AB +# Copyright (c) 1996 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import itertools +import logging +import re +import struct +import warnings +import zlib +from collections.abc import Callable +from enum import IntEnum +from typing import IO, TYPE_CHECKING, Any, NamedTuple, NoReturn, cast + +from . import Image, ImageChops, ImageFile, ImagePalette, ImageSequence +from ._binary import i16be as i16 +from ._binary import i32be as i32 +from ._binary import o8 +from ._binary import o16be as o16 +from ._binary import o32be as o32 + +if TYPE_CHECKING: + from . import _imaging + +logger = logging.getLogger(__name__) + +is_cid = re.compile(rb"\w\w\w\w").match + + +_MAGIC = b"\211PNG\r\n\032\n" + + +_MODES = { + # supported bits/color combinations, and corresponding modes/rawmodes + # Grayscale + (1, 0): ("1", "1"), + (2, 0): ("L", "L;2"), + (4, 0): ("L", "L;4"), + (8, 0): ("L", "L"), + (16, 0): ("I;16", "I;16B"), + # Truecolour + (8, 2): ("RGB", "RGB"), + (16, 2): ("RGB", "RGB;16B"), + # Indexed-colour + (1, 3): ("P", "P;1"), + (2, 3): ("P", "P;2"), + (4, 3): ("P", "P;4"), + (8, 3): ("P", "P"), + # Grayscale with alpha + (8, 4): ("LA", "LA"), + (16, 4): ("RGBA", "LA;16B"), # LA;16B->LA not yet available + # Truecolour with alpha + (8, 6): ("RGBA", "RGBA"), + (16, 6): ("RGBA", "RGBA;16B"), +} + + +_simple_palette = re.compile(b"^\xff*\x00\xff*$") + +MAX_TEXT_CHUNK = ImageFile.SAFEBLOCK +""" +Maximum decompressed size for a iTXt or zTXt chunk. +Eliminates decompression bombs where compressed chunks can expand 1000x. +See :ref:`Text in PNG File Format`. +""" +MAX_TEXT_MEMORY = 64 * MAX_TEXT_CHUNK +""" +Set the maximum total text chunk size. +See :ref:`Text in PNG File Format`. +""" + + +# APNG frame disposal modes +class Disposal(IntEnum): + OP_NONE = 0 + """ + No disposal is done on this frame before rendering the next frame. + See :ref:`Saving APNG sequences`. + """ + OP_BACKGROUND = 1 + """ + This frame’s modified region is cleared to fully transparent black before rendering + the next frame. + See :ref:`Saving APNG sequences`. + """ + OP_PREVIOUS = 2 + """ + This frame’s modified region is reverted to the previous frame’s contents before + rendering the next frame. + See :ref:`Saving APNG sequences`. + """ + + +# APNG frame blend modes +class Blend(IntEnum): + OP_SOURCE = 0 + """ + All color components of this frame, including alpha, overwrite the previous output + image contents. + See :ref:`Saving APNG sequences`. + """ + OP_OVER = 1 + """ + This frame should be alpha composited with the previous output image contents. + See :ref:`Saving APNG sequences`. + """ + + +def _safe_zlib_decompress(s: bytes) -> bytes: + dobj = zlib.decompressobj() + plaintext = dobj.decompress(s, MAX_TEXT_CHUNK) + if dobj.unconsumed_tail: + msg = "Decompressed data too large for PngImagePlugin.MAX_TEXT_CHUNK" + raise ValueError(msg) + return plaintext + + +def _crc32(data: bytes, seed: int = 0) -> int: + return zlib.crc32(data, seed) & 0xFFFFFFFF + + +# -------------------------------------------------------------------- +# Support classes. Suitable for PNG and related formats like MNG etc. + + +class ChunkStream: + def __init__(self, fp: IO[bytes]) -> None: + self.fp: IO[bytes] | None = fp + self.queue: list[tuple[bytes, int, int]] | None = [] + + def read(self) -> tuple[bytes, int, int]: + """Fetch a new chunk. Returns header information.""" + cid = None + + assert self.fp is not None + if self.queue: + cid, pos, length = self.queue.pop() + self.fp.seek(pos) + else: + s = self.fp.read(8) + cid = s[4:] + pos = self.fp.tell() + length = i32(s) + + if not is_cid(cid): + if not ImageFile.LOAD_TRUNCATED_IMAGES: + msg = f"broken PNG file (chunk {repr(cid)})" + raise SyntaxError(msg) + + return cid, pos, length + + def __enter__(self) -> ChunkStream: + return self + + def __exit__(self, *args: object) -> None: + self.close() + + def close(self) -> None: + self.queue = self.fp = None + + def push(self, cid: bytes, pos: int, length: int) -> None: + assert self.queue is not None + self.queue.append((cid, pos, length)) + + def call(self, cid: bytes, pos: int, length: int) -> bytes: + """Call the appropriate chunk handler""" + + logger.debug("STREAM %r %s %s", cid, pos, length) + return getattr(self, f"chunk_{cid.decode('ascii')}")(pos, length) + + def crc(self, cid: bytes, data: bytes) -> None: + """Read and verify checksum""" + + # Skip CRC checks for ancillary chunks if allowed to load truncated + # images + # 5th byte of first char is 1 [specs, section 5.4] + if ImageFile.LOAD_TRUNCATED_IMAGES and (cid[0] >> 5 & 1): + self.crc_skip(cid, data) + return + + assert self.fp is not None + try: + crc1 = _crc32(data, _crc32(cid)) + crc2 = i32(self.fp.read(4)) + if crc1 != crc2: + msg = f"broken PNG file (bad header checksum in {repr(cid)})" + raise SyntaxError(msg) + except struct.error as e: + msg = f"broken PNG file (incomplete checksum in {repr(cid)})" + raise SyntaxError(msg) from e + + def crc_skip(self, cid: bytes, data: bytes) -> None: + """Read checksum""" + + assert self.fp is not None + self.fp.read(4) + + def verify(self, endchunk: bytes = b"IEND") -> list[bytes]: + # Simple approach; just calculate checksum for all remaining + # blocks. Must be called directly after open. + + cids = [] + + assert self.fp is not None + while True: + try: + cid, pos, length = self.read() + except struct.error as e: + msg = "truncated PNG file" + raise OSError(msg) from e + + if cid == endchunk: + break + self.crc(cid, ImageFile._safe_read(self.fp, length)) + cids.append(cid) + + return cids + + +class iTXt(str): + """ + Subclass of string to allow iTXt chunks to look like strings while + keeping their extra information + + """ + + lang: str | bytes | None + tkey: str | bytes | None + + @staticmethod + def __new__( + cls, text: str, lang: str | None = None, tkey: str | None = None + ) -> iTXt: + """ + :param cls: the class to use when creating the instance + :param text: value for this key + :param lang: language code + :param tkey: UTF-8 version of the key name + """ + + self = str.__new__(cls, text) + self.lang = lang + self.tkey = tkey + return self + + +class PngInfo: + """ + PNG chunk container (for use with save(pnginfo=)) + + """ + + def __init__(self) -> None: + self.chunks: list[tuple[bytes, bytes, bool]] = [] + + def add(self, cid: bytes, data: bytes, after_idat: bool = False) -> None: + """Appends an arbitrary chunk. Use with caution. + + :param cid: a byte string, 4 bytes long. + :param data: a byte string of the encoded data + :param after_idat: for use with private chunks. Whether the chunk + should be written after IDAT + + """ + + self.chunks.append((cid, data, after_idat)) + + def add_itxt( + self, + key: str | bytes, + value: str | bytes, + lang: str | bytes = "", + tkey: str | bytes = "", + zip: bool = False, + ) -> None: + """Appends an iTXt chunk. + + :param key: latin-1 encodable text key name + :param value: value for this key + :param lang: language code + :param tkey: UTF-8 version of the key name + :param zip: compression flag + + """ + + if not isinstance(key, bytes): + key = key.encode("latin-1", "strict") + if not isinstance(value, bytes): + value = value.encode("utf-8", "strict") + if not isinstance(lang, bytes): + lang = lang.encode("utf-8", "strict") + if not isinstance(tkey, bytes): + tkey = tkey.encode("utf-8", "strict") + + if zip: + self.add( + b"iTXt", + key + b"\0\x01\0" + lang + b"\0" + tkey + b"\0" + zlib.compress(value), + ) + else: + self.add(b"iTXt", key + b"\0\0\0" + lang + b"\0" + tkey + b"\0" + value) + + def add_text( + self, key: str | bytes, value: str | bytes | iTXt, zip: bool = False + ) -> None: + """Appends a text chunk. + + :param key: latin-1 encodable text key name + :param value: value for this key, text or an + :py:class:`PIL.PngImagePlugin.iTXt` instance + :param zip: compression flag + + """ + if isinstance(value, iTXt): + return self.add_itxt( + key, + value, + value.lang if value.lang is not None else b"", + value.tkey if value.tkey is not None else b"", + zip=zip, + ) + + # The tEXt chunk stores latin-1 text + if not isinstance(value, bytes): + try: + value = value.encode("latin-1", "strict") + except UnicodeError: + return self.add_itxt(key, value, zip=zip) + + if not isinstance(key, bytes): + key = key.encode("latin-1", "strict") + + if zip: + self.add(b"zTXt", key + b"\0\0" + zlib.compress(value)) + else: + self.add(b"tEXt", key + b"\0" + value) + + +# -------------------------------------------------------------------- +# PNG image stream (IHDR/IEND) + + +class _RewindState(NamedTuple): + info: dict[str | tuple[int, int], Any] + tile: list[ImageFile._Tile] + seq_num: int | None + + +class PngStream(ChunkStream): + def __init__(self, fp: IO[bytes]) -> None: + super().__init__(fp) + + # local copies of Image attributes + self.im_info: dict[str | tuple[int, int], Any] = {} + self.im_text: dict[str, str | iTXt] = {} + self.im_size = (0, 0) + self.im_mode = "" + self.im_tile: list[ImageFile._Tile] = [] + self.im_palette: tuple[str, bytes] | None = None + self.im_custom_mimetype: str | None = None + self.im_n_frames: int | None = None + self._seq_num: int | None = None + self.rewind_state = _RewindState({}, [], None) + + self.text_memory = 0 + + def check_text_memory(self, chunklen: int) -> None: + self.text_memory += chunklen + if self.text_memory > MAX_TEXT_MEMORY: + msg = ( + "Too much memory used in text chunks: " + f"{self.text_memory}>MAX_TEXT_MEMORY" + ) + raise ValueError(msg) + + def save_rewind(self) -> None: + self.rewind_state = _RewindState( + self.im_info.copy(), + self.im_tile, + self._seq_num, + ) + + def rewind(self) -> None: + self.im_info = self.rewind_state.info.copy() + self.im_tile = self.rewind_state.tile + self._seq_num = self.rewind_state.seq_num + + def chunk_iCCP(self, pos: int, length: int) -> bytes: + # ICC profile + assert self.fp is not None + s = ImageFile._safe_read(self.fp, length) + # according to PNG spec, the iCCP chunk contains: + # Profile name 1-79 bytes (character string) + # Null separator 1 byte (null character) + # Compression method 1 byte (0) + # Compressed profile n bytes (zlib with deflate compression) + i = s.find(b"\0") + logger.debug("iCCP profile name %r", s[:i]) + comp_method = s[i + 1] + logger.debug("Compression method %s", comp_method) + if comp_method != 0: + msg = f"Unknown compression method {comp_method} in iCCP chunk" + raise SyntaxError(msg) + try: + icc_profile = _safe_zlib_decompress(s[i + 2 :]) + except ValueError: + if ImageFile.LOAD_TRUNCATED_IMAGES: + icc_profile = None + else: + raise + except zlib.error: + icc_profile = None # FIXME + self.im_info["icc_profile"] = icc_profile + return s + + def chunk_IHDR(self, pos: int, length: int) -> bytes: + # image header + assert self.fp is not None + s = ImageFile._safe_read(self.fp, length) + if length < 13: + if ImageFile.LOAD_TRUNCATED_IMAGES: + return s + msg = "Truncated IHDR chunk" + raise ValueError(msg) + self.im_size = i32(s, 0), i32(s, 4) + try: + self.im_mode, self.im_rawmode = _MODES[(s[8], s[9])] + except Exception: + pass + if s[12]: + self.im_info["interlace"] = 1 + if s[11]: + msg = "unknown filter category" + raise SyntaxError(msg) + return s + + def chunk_IDAT(self, pos: int, length: int) -> NoReturn: + # image data + if "bbox" in self.im_info: + tile = [ImageFile._Tile("zip", self.im_info["bbox"], pos, self.im_rawmode)] + else: + if self.im_n_frames is not None: + self.im_info["default_image"] = True + tile = [ImageFile._Tile("zip", (0, 0) + self.im_size, pos, self.im_rawmode)] + self.im_tile = tile + self.im_idat = length + msg = "image data found" + raise EOFError(msg) + + def chunk_IEND(self, pos: int, length: int) -> NoReturn: + msg = "end of PNG image" + raise EOFError(msg) + + def chunk_PLTE(self, pos: int, length: int) -> bytes: + # palette + assert self.fp is not None + s = ImageFile._safe_read(self.fp, length) + if self.im_mode == "P": + self.im_palette = "RGB", s + return s + + def chunk_tRNS(self, pos: int, length: int) -> bytes: + # transparency + assert self.fp is not None + s = ImageFile._safe_read(self.fp, length) + if self.im_mode == "P": + if _simple_palette.match(s): + # tRNS contains only one full-transparent entry, + # other entries are full opaque + i = s.find(b"\0") + if i >= 0: + self.im_info["transparency"] = i + else: + # otherwise, we have a byte string with one alpha value + # for each palette entry + self.im_info["transparency"] = s + elif self.im_mode in ("1", "L", "I;16"): + self.im_info["transparency"] = i16(s) + elif self.im_mode == "RGB": + self.im_info["transparency"] = i16(s), i16(s, 2), i16(s, 4) + return s + + def chunk_gAMA(self, pos: int, length: int) -> bytes: + # gamma setting + assert self.fp is not None + s = ImageFile._safe_read(self.fp, length) + self.im_info["gamma"] = i32(s) / 100000.0 + return s + + def chunk_cHRM(self, pos: int, length: int) -> bytes: + # chromaticity, 8 unsigned ints, actual value is scaled by 100,000 + # WP x,y, Red x,y, Green x,y Blue x,y + + assert self.fp is not None + s = ImageFile._safe_read(self.fp, length) + raw_vals = struct.unpack(">%dI" % (len(s) // 4), s) + self.im_info["chromaticity"] = tuple(elt / 100000.0 for elt in raw_vals) + return s + + def chunk_sRGB(self, pos: int, length: int) -> bytes: + # srgb rendering intent, 1 byte + # 0 perceptual + # 1 relative colorimetric + # 2 saturation + # 3 absolute colorimetric + + assert self.fp is not None + s = ImageFile._safe_read(self.fp, length) + if length < 1: + if ImageFile.LOAD_TRUNCATED_IMAGES: + return s + msg = "Truncated sRGB chunk" + raise ValueError(msg) + self.im_info["srgb"] = s[0] + return s + + def chunk_pHYs(self, pos: int, length: int) -> bytes: + # pixels per unit + assert self.fp is not None + s = ImageFile._safe_read(self.fp, length) + if length < 9: + if ImageFile.LOAD_TRUNCATED_IMAGES: + return s + msg = "Truncated pHYs chunk" + raise ValueError(msg) + px, py = i32(s, 0), i32(s, 4) + unit = s[8] + if unit == 1: # meter + dpi = px * 0.0254, py * 0.0254 + self.im_info["dpi"] = dpi + elif unit == 0: + self.im_info["aspect"] = px, py + return s + + def chunk_tEXt(self, pos: int, length: int) -> bytes: + # text + assert self.fp is not None + s = ImageFile._safe_read(self.fp, length) + try: + k, v = s.split(b"\0", 1) + except ValueError: + # fallback for broken tEXt tags + k = s + v = b"" + if k: + k_str = k.decode("latin-1", "strict") + v_str = v.decode("latin-1", "replace") + + self.im_info[k_str] = v if k == b"exif" else v_str + self.im_text[k_str] = v_str + self.check_text_memory(len(v_str)) + + return s + + def chunk_zTXt(self, pos: int, length: int) -> bytes: + # compressed text + assert self.fp is not None + s = ImageFile._safe_read(self.fp, length) + try: + k, v = s.split(b"\0", 1) + except ValueError: + k = s + v = b"" + if v: + comp_method = v[0] + else: + comp_method = 0 + if comp_method != 0: + msg = f"Unknown compression method {comp_method} in zTXt chunk" + raise SyntaxError(msg) + try: + v = _safe_zlib_decompress(v[1:]) + except ValueError: + if ImageFile.LOAD_TRUNCATED_IMAGES: + v = b"" + else: + raise + except zlib.error: + v = b"" + + if k: + k_str = k.decode("latin-1", "strict") + v_str = v.decode("latin-1", "replace") + + self.im_info[k_str] = self.im_text[k_str] = v_str + self.check_text_memory(len(v_str)) + + return s + + def chunk_iTXt(self, pos: int, length: int) -> bytes: + # international text + assert self.fp is not None + r = s = ImageFile._safe_read(self.fp, length) + try: + k, r = r.split(b"\0", 1) + except ValueError: + return s + if len(r) < 2: + return s + cf, cm, r = r[0], r[1], r[2:] + try: + lang, tk, v = r.split(b"\0", 2) + except ValueError: + return s + if cf != 0: + if cm == 0: + try: + v = _safe_zlib_decompress(v) + except ValueError: + if ImageFile.LOAD_TRUNCATED_IMAGES: + return s + else: + raise + except zlib.error: + return s + else: + return s + if k == b"XML:com.adobe.xmp": + self.im_info["xmp"] = v + try: + k_str = k.decode("latin-1", "strict") + lang_str = lang.decode("utf-8", "strict") + tk_str = tk.decode("utf-8", "strict") + v_str = v.decode("utf-8", "strict") + except UnicodeError: + return s + + self.im_info[k_str] = self.im_text[k_str] = iTXt(v_str, lang_str, tk_str) + self.check_text_memory(len(v_str)) + + return s + + def chunk_eXIf(self, pos: int, length: int) -> bytes: + assert self.fp is not None + s = ImageFile._safe_read(self.fp, length) + self.im_info["exif"] = b"Exif\x00\x00" + s + return s + + # APNG chunks + def chunk_acTL(self, pos: int, length: int) -> bytes: + assert self.fp is not None + s = ImageFile._safe_read(self.fp, length) + if length < 8: + if ImageFile.LOAD_TRUNCATED_IMAGES: + return s + msg = "APNG contains truncated acTL chunk" + raise ValueError(msg) + if self.im_n_frames is not None: + self.im_n_frames = None + warnings.warn("Invalid APNG, will use default PNG image if possible") + return s + n_frames = i32(s) + if n_frames == 0 or n_frames > 0x80000000: + warnings.warn("Invalid APNG, will use default PNG image if possible") + return s + self.im_n_frames = n_frames + self.im_info["loop"] = i32(s, 4) + self.im_custom_mimetype = "image/apng" + return s + + def chunk_fcTL(self, pos: int, length: int) -> bytes: + assert self.fp is not None + s = ImageFile._safe_read(self.fp, length) + if length < 26: + if ImageFile.LOAD_TRUNCATED_IMAGES: + return s + msg = "APNG contains truncated fcTL chunk" + raise ValueError(msg) + seq = i32(s) + if (self._seq_num is None and seq != 0) or ( + self._seq_num is not None and self._seq_num != seq - 1 + ): + msg = "APNG contains frame sequence errors" + raise SyntaxError(msg) + self._seq_num = seq + width, height = i32(s, 4), i32(s, 8) + px, py = i32(s, 12), i32(s, 16) + im_w, im_h = self.im_size + if px + width > im_w or py + height > im_h: + msg = "APNG contains invalid frames" + raise SyntaxError(msg) + self.im_info["bbox"] = (px, py, px + width, py + height) + delay_num, delay_den = i16(s, 20), i16(s, 22) + if delay_den == 0: + delay_den = 100 + self.im_info["duration"] = float(delay_num) / float(delay_den) * 1000 + self.im_info["disposal"] = s[24] + self.im_info["blend"] = s[25] + return s + + def chunk_fdAT(self, pos: int, length: int) -> bytes: + assert self.fp is not None + if length < 4: + if ImageFile.LOAD_TRUNCATED_IMAGES: + s = ImageFile._safe_read(self.fp, length) + return s + msg = "APNG contains truncated fDAT chunk" + raise ValueError(msg) + s = ImageFile._safe_read(self.fp, 4) + seq = i32(s) + if self._seq_num != seq - 1: + msg = "APNG contains frame sequence errors" + raise SyntaxError(msg) + self._seq_num = seq + return self.chunk_IDAT(pos + 4, length - 4) + + +# -------------------------------------------------------------------- +# PNG reader + + +def _accept(prefix: bytes) -> bool: + return prefix[:8] == _MAGIC + + +## +# Image plugin for PNG images. + + +class PngImageFile(ImageFile.ImageFile): + format = "PNG" + format_description = "Portable network graphics" + + def _open(self) -> None: + if not _accept(self.fp.read(8)): + msg = "not a PNG file" + raise SyntaxError(msg) + self._fp = self.fp + self.__frame = 0 + + # + # Parse headers up to the first IDAT or fDAT chunk + + self.private_chunks: list[tuple[bytes, bytes] | tuple[bytes, bytes, bool]] = [] + self.png: PngStream | None = PngStream(self.fp) + + while True: + # + # get next chunk + + cid, pos, length = self.png.read() + + try: + s = self.png.call(cid, pos, length) + except EOFError: + break + except AttributeError: + logger.debug("%r %s %s (unknown)", cid, pos, length) + s = ImageFile._safe_read(self.fp, length) + if cid[1:2].islower(): + self.private_chunks.append((cid, s)) + + self.png.crc(cid, s) + + # + # Copy relevant attributes from the PngStream. An alternative + # would be to let the PngStream class modify these attributes + # directly, but that introduces circular references which are + # difficult to break if things go wrong in the decoder... + # (believe me, I've tried ;-) + + self._mode = self.png.im_mode + self._size = self.png.im_size + self.info = self.png.im_info + self._text: dict[str, str | iTXt] | None = None + self.tile = self.png.im_tile + self.custom_mimetype = self.png.im_custom_mimetype + self.n_frames = self.png.im_n_frames or 1 + self.default_image = self.info.get("default_image", False) + + if self.png.im_palette: + rawmode, data = self.png.im_palette + self.palette = ImagePalette.raw(rawmode, data) + + if cid == b"fdAT": + self.__prepare_idat = length - 4 + else: + self.__prepare_idat = length # used by load_prepare() + + if self.png.im_n_frames is not None: + self._close_exclusive_fp_after_loading = False + self.png.save_rewind() + self.__rewind_idat = self.__prepare_idat + self.__rewind = self._fp.tell() + if self.default_image: + # IDAT chunk contains default image and not first animation frame + self.n_frames += 1 + self._seek(0) + self.is_animated = self.n_frames > 1 + + @property + def text(self) -> dict[str, str | iTXt]: + # experimental + if self._text is None: + # iTxt, tEXt and zTXt chunks may appear at the end of the file + # So load the file to ensure that they are read + if self.is_animated: + frame = self.__frame + # for APNG, seek to the final frame before loading + self.seek(self.n_frames - 1) + self.load() + if self.is_animated: + self.seek(frame) + assert self._text is not None + return self._text + + def verify(self) -> None: + """Verify PNG file""" + + if self.fp is None: + msg = "verify must be called directly after open" + raise RuntimeError(msg) + + # back up to beginning of IDAT block + self.fp.seek(self.tile[0][2] - 8) + + assert self.png is not None + self.png.verify() + self.png.close() + + if self._exclusive_fp: + self.fp.close() + self.fp = None + + def seek(self, frame: int) -> None: + if not self._seek_check(frame): + return + if frame < self.__frame: + self._seek(0, True) + + last_frame = self.__frame + for f in range(self.__frame + 1, frame + 1): + try: + self._seek(f) + except EOFError as e: + self.seek(last_frame) + msg = "no more images in APNG file" + raise EOFError(msg) from e + + def _seek(self, frame: int, rewind: bool = False) -> None: + assert self.png is not None + + self.dispose: _imaging.ImagingCore | None + dispose_extent = None + if frame == 0: + if rewind: + self._fp.seek(self.__rewind) + self.png.rewind() + self.__prepare_idat = self.__rewind_idat + self._im = None + self.info = self.png.im_info + self.tile = self.png.im_tile + self.fp = self._fp + self._prev_im = None + self.dispose = None + self.default_image = self.info.get("default_image", False) + self.dispose_op = self.info.get("disposal") + self.blend_op = self.info.get("blend") + dispose_extent = self.info.get("bbox") + self.__frame = 0 + else: + if frame != self.__frame + 1: + msg = f"cannot seek to frame {frame}" + raise ValueError(msg) + + # ensure previous frame was loaded + self.load() + + if self.dispose: + self.im.paste(self.dispose, self.dispose_extent) + self._prev_im = self.im.copy() + + self.fp = self._fp + + # advance to the next frame + if self.__prepare_idat: + ImageFile._safe_read(self.fp, self.__prepare_idat) + self.__prepare_idat = 0 + frame_start = False + while True: + self.fp.read(4) # CRC + + try: + cid, pos, length = self.png.read() + except (struct.error, SyntaxError): + break + + if cid == b"IEND": + msg = "No more images in APNG file" + raise EOFError(msg) + if cid == b"fcTL": + if frame_start: + # there must be at least one fdAT chunk between fcTL chunks + msg = "APNG missing frame data" + raise SyntaxError(msg) + frame_start = True + + try: + self.png.call(cid, pos, length) + except UnicodeDecodeError: + break + except EOFError: + if cid == b"fdAT": + length -= 4 + if frame_start: + self.__prepare_idat = length + break + ImageFile._safe_read(self.fp, length) + except AttributeError: + logger.debug("%r %s %s (unknown)", cid, pos, length) + ImageFile._safe_read(self.fp, length) + + self.__frame = frame + self.tile = self.png.im_tile + self.dispose_op = self.info.get("disposal") + self.blend_op = self.info.get("blend") + dispose_extent = self.info.get("bbox") + + if not self.tile: + msg = "image not found in APNG frame" + raise EOFError(msg) + if dispose_extent: + self.dispose_extent: tuple[float, float, float, float] = dispose_extent + + # setup frame disposal (actual disposal done when needed in the next _seek()) + if self._prev_im is None and self.dispose_op == Disposal.OP_PREVIOUS: + self.dispose_op = Disposal.OP_BACKGROUND + + self.dispose = None + if self.dispose_op == Disposal.OP_PREVIOUS: + if self._prev_im: + self.dispose = self._prev_im.copy() + self.dispose = self._crop(self.dispose, self.dispose_extent) + elif self.dispose_op == Disposal.OP_BACKGROUND: + self.dispose = Image.core.fill(self.mode, self.size) + self.dispose = self._crop(self.dispose, self.dispose_extent) + + def tell(self) -> int: + return self.__frame + + def load_prepare(self) -> None: + """internal: prepare to read PNG file""" + + if self.info.get("interlace"): + self.decoderconfig = self.decoderconfig + (1,) + + self.__idat = self.__prepare_idat # used by load_read() + ImageFile.ImageFile.load_prepare(self) + + def load_read(self, read_bytes: int) -> bytes: + """internal: read more image data""" + + assert self.png is not None + while self.__idat == 0: + # end of chunk, skip forward to next one + + self.fp.read(4) # CRC + + cid, pos, length = self.png.read() + + if cid not in [b"IDAT", b"DDAT", b"fdAT"]: + self.png.push(cid, pos, length) + return b"" + + if cid == b"fdAT": + try: + self.png.call(cid, pos, length) + except EOFError: + pass + self.__idat = length - 4 # sequence_num has already been read + else: + self.__idat = length # empty chunks are allowed + + # read more data from this chunk + if read_bytes <= 0: + read_bytes = self.__idat + else: + read_bytes = min(read_bytes, self.__idat) + + self.__idat = self.__idat - read_bytes + + return self.fp.read(read_bytes) + + def load_end(self) -> None: + """internal: finished reading image data""" + assert self.png is not None + if self.__idat != 0: + self.fp.read(self.__idat) + while True: + self.fp.read(4) # CRC + + try: + cid, pos, length = self.png.read() + except (struct.error, SyntaxError): + break + + if cid == b"IEND": + break + elif cid == b"fcTL" and self.is_animated: + # start of the next frame, stop reading + self.__prepare_idat = 0 + self.png.push(cid, pos, length) + break + + try: + self.png.call(cid, pos, length) + except UnicodeDecodeError: + break + except EOFError: + if cid == b"fdAT": + length -= 4 + try: + ImageFile._safe_read(self.fp, length) + except OSError as e: + if ImageFile.LOAD_TRUNCATED_IMAGES: + break + else: + raise e + except AttributeError: + logger.debug("%r %s %s (unknown)", cid, pos, length) + s = ImageFile._safe_read(self.fp, length) + if cid[1:2].islower(): + self.private_chunks.append((cid, s, True)) + self._text = self.png.im_text + if not self.is_animated: + self.png.close() + self.png = None + else: + if self._prev_im and self.blend_op == Blend.OP_OVER: + updated = self._crop(self.im, self.dispose_extent) + if self.im.mode == "RGB" and "transparency" in self.info: + mask = updated.convert_transparent( + "RGBA", self.info["transparency"] + ) + else: + if self.im.mode == "P" and "transparency" in self.info: + t = self.info["transparency"] + if isinstance(t, bytes): + updated.putpalettealphas(t) + elif isinstance(t, int): + updated.putpalettealpha(t) + mask = updated.convert("RGBA") + self._prev_im.paste(updated, self.dispose_extent, mask) + self.im = self._prev_im + + def _getexif(self) -> dict[int, Any] | None: + if "exif" not in self.info: + self.load() + if "exif" not in self.info and "Raw profile type exif" not in self.info: + return None + return self.getexif()._get_merged_dict() + + def getexif(self) -> Image.Exif: + if "exif" not in self.info: + self.load() + + return super().getexif() + + +# -------------------------------------------------------------------- +# PNG writer + +_OUTMODES = { + # supported PIL modes, and corresponding rawmode, bit depth and color type + "1": ("1", b"\x01", b"\x00"), + "L;1": ("L;1", b"\x01", b"\x00"), + "L;2": ("L;2", b"\x02", b"\x00"), + "L;4": ("L;4", b"\x04", b"\x00"), + "L": ("L", b"\x08", b"\x00"), + "LA": ("LA", b"\x08", b"\x04"), + "I": ("I;16B", b"\x10", b"\x00"), + "I;16": ("I;16B", b"\x10", b"\x00"), + "I;16B": ("I;16B", b"\x10", b"\x00"), + "P;1": ("P;1", b"\x01", b"\x03"), + "P;2": ("P;2", b"\x02", b"\x03"), + "P;4": ("P;4", b"\x04", b"\x03"), + "P": ("P", b"\x08", b"\x03"), + "RGB": ("RGB", b"\x08", b"\x02"), + "RGBA": ("RGBA", b"\x08", b"\x06"), +} + + +def putchunk(fp: IO[bytes], cid: bytes, *data: bytes) -> None: + """Write a PNG chunk (including CRC field)""" + + byte_data = b"".join(data) + + fp.write(o32(len(byte_data)) + cid) + fp.write(byte_data) + crc = _crc32(byte_data, _crc32(cid)) + fp.write(o32(crc)) + + +class _idat: + # wrap output from the encoder in IDAT chunks + + def __init__(self, fp: IO[bytes], chunk: Callable[..., None]) -> None: + self.fp = fp + self.chunk = chunk + + def write(self, data: bytes) -> None: + self.chunk(self.fp, b"IDAT", data) + + +class _fdat: + # wrap encoder output in fdAT chunks + + def __init__(self, fp: IO[bytes], chunk: Callable[..., None], seq_num: int) -> None: + self.fp = fp + self.chunk = chunk + self.seq_num = seq_num + + def write(self, data: bytes) -> None: + self.chunk(self.fp, b"fdAT", o32(self.seq_num), data) + self.seq_num += 1 + + +class _Frame(NamedTuple): + im: Image.Image + bbox: tuple[int, int, int, int] | None + encoderinfo: dict[str, Any] + + +def _write_multiple_frames( + im: Image.Image, + fp: IO[bytes], + chunk: Callable[..., None], + mode: str, + rawmode: str, + default_image: Image.Image | None, + append_images: list[Image.Image], +) -> Image.Image | None: + duration = im.encoderinfo.get("duration") + loop = im.encoderinfo.get("loop", im.info.get("loop", 0)) + disposal = im.encoderinfo.get("disposal", im.info.get("disposal", Disposal.OP_NONE)) + blend = im.encoderinfo.get("blend", im.info.get("blend", Blend.OP_SOURCE)) + + if default_image: + chain = itertools.chain(append_images) + else: + chain = itertools.chain([im], append_images) + + im_frames: list[_Frame] = [] + frame_count = 0 + for im_seq in chain: + for im_frame in ImageSequence.Iterator(im_seq): + if im_frame.mode == mode: + im_frame = im_frame.copy() + else: + im_frame = im_frame.convert(mode) + encoderinfo = im.encoderinfo.copy() + if isinstance(duration, (list, tuple)): + encoderinfo["duration"] = duration[frame_count] + elif duration is None and "duration" in im_frame.info: + encoderinfo["duration"] = im_frame.info["duration"] + if isinstance(disposal, (list, tuple)): + encoderinfo["disposal"] = disposal[frame_count] + if isinstance(blend, (list, tuple)): + encoderinfo["blend"] = blend[frame_count] + frame_count += 1 + + if im_frames: + previous = im_frames[-1] + prev_disposal = previous.encoderinfo.get("disposal") + prev_blend = previous.encoderinfo.get("blend") + if prev_disposal == Disposal.OP_PREVIOUS and len(im_frames) < 2: + prev_disposal = Disposal.OP_BACKGROUND + + if prev_disposal == Disposal.OP_BACKGROUND: + base_im = previous.im.copy() + dispose = Image.core.fill("RGBA", im.size, (0, 0, 0, 0)) + bbox = previous.bbox + if bbox: + dispose = dispose.crop(bbox) + else: + bbox = (0, 0) + im.size + base_im.paste(dispose, bbox) + elif prev_disposal == Disposal.OP_PREVIOUS: + base_im = im_frames[-2].im + else: + base_im = previous.im + delta = ImageChops.subtract_modulo( + im_frame.convert("RGBA"), base_im.convert("RGBA") + ) + bbox = delta.getbbox(alpha_only=False) + if ( + not bbox + and prev_disposal == encoderinfo.get("disposal") + and prev_blend == encoderinfo.get("blend") + and "duration" in encoderinfo + ): + previous.encoderinfo["duration"] += encoderinfo["duration"] + continue + else: + bbox = None + im_frames.append(_Frame(im_frame, bbox, encoderinfo)) + + if len(im_frames) == 1 and not default_image: + return im_frames[0].im + + # animation control + chunk( + fp, + b"acTL", + o32(len(im_frames)), # 0: num_frames + o32(loop), # 4: num_plays + ) + + # default image IDAT (if it exists) + if default_image: + if im.mode != mode: + im = im.convert(mode) + ImageFile._save( + im, + cast(IO[bytes], _idat(fp, chunk)), + [ImageFile._Tile("zip", (0, 0) + im.size, 0, rawmode)], + ) + + seq_num = 0 + for frame, frame_data in enumerate(im_frames): + im_frame = frame_data.im + if not frame_data.bbox: + bbox = (0, 0) + im_frame.size + else: + bbox = frame_data.bbox + im_frame = im_frame.crop(bbox) + size = im_frame.size + encoderinfo = frame_data.encoderinfo + frame_duration = int(round(encoderinfo.get("duration", 0))) + frame_disposal = encoderinfo.get("disposal", disposal) + frame_blend = encoderinfo.get("blend", blend) + # frame control + chunk( + fp, + b"fcTL", + o32(seq_num), # sequence_number + o32(size[0]), # width + o32(size[1]), # height + o32(bbox[0]), # x_offset + o32(bbox[1]), # y_offset + o16(frame_duration), # delay_numerator + o16(1000), # delay_denominator + o8(frame_disposal), # dispose_op + o8(frame_blend), # blend_op + ) + seq_num += 1 + # frame data + if frame == 0 and not default_image: + # first frame must be in IDAT chunks for backwards compatibility + ImageFile._save( + im_frame, + cast(IO[bytes], _idat(fp, chunk)), + [ImageFile._Tile("zip", (0, 0) + im_frame.size, 0, rawmode)], + ) + else: + fdat_chunks = _fdat(fp, chunk, seq_num) + ImageFile._save( + im_frame, + cast(IO[bytes], fdat_chunks), + [ImageFile._Tile("zip", (0, 0) + im_frame.size, 0, rawmode)], + ) + seq_num = fdat_chunks.seq_num + return None + + +def _save_all(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + _save(im, fp, filename, save_all=True) + + +def _save( + im: Image.Image, + fp: IO[bytes], + filename: str | bytes, + chunk: Callable[..., None] = putchunk, + save_all: bool = False, +) -> None: + # save an image to disk (called by the save method) + + if save_all: + default_image = im.encoderinfo.get( + "default_image", im.info.get("default_image") + ) + modes = set() + sizes = set() + append_images = im.encoderinfo.get("append_images", []) + for im_seq in itertools.chain([im], append_images): + for im_frame in ImageSequence.Iterator(im_seq): + modes.add(im_frame.mode) + sizes.add(im_frame.size) + for mode in ("RGBA", "RGB", "P"): + if mode in modes: + break + else: + mode = modes.pop() + size = tuple(max(frame_size[i] for frame_size in sizes) for i in range(2)) + else: + size = im.size + mode = im.mode + + outmode = mode + if mode == "P": + # + # attempt to minimize storage requirements for palette images + if "bits" in im.encoderinfo: + # number of bits specified by user + colors = min(1 << im.encoderinfo["bits"], 256) + else: + # check palette contents + if im.palette: + colors = max(min(len(im.palette.getdata()[1]) // 3, 256), 1) + else: + colors = 256 + + if colors <= 16: + if colors <= 2: + bits = 1 + elif colors <= 4: + bits = 2 + else: + bits = 4 + outmode += f";{bits}" + + # encoder options + im.encoderconfig = ( + im.encoderinfo.get("optimize", False), + im.encoderinfo.get("compress_level", -1), + im.encoderinfo.get("compress_type", -1), + im.encoderinfo.get("dictionary", b""), + ) + + # get the corresponding PNG mode + try: + rawmode, bit_depth, color_type = _OUTMODES[outmode] + except KeyError as e: + msg = f"cannot write mode {mode} as PNG" + raise OSError(msg) from e + + # + # write minimal PNG file + + fp.write(_MAGIC) + + chunk( + fp, + b"IHDR", + o32(size[0]), # 0: size + o32(size[1]), + bit_depth, + color_type, + b"\0", # 10: compression + b"\0", # 11: filter category + b"\0", # 12: interlace flag + ) + + chunks = [b"cHRM", b"gAMA", b"sBIT", b"sRGB", b"tIME"] + + icc = im.encoderinfo.get("icc_profile", im.info.get("icc_profile")) + if icc: + # ICC profile + # according to PNG spec, the iCCP chunk contains: + # Profile name 1-79 bytes (character string) + # Null separator 1 byte (null character) + # Compression method 1 byte (0) + # Compressed profile n bytes (zlib with deflate compression) + name = b"ICC Profile" + data = name + b"\0\0" + zlib.compress(icc) + chunk(fp, b"iCCP", data) + + # You must either have sRGB or iCCP. + # Disallow sRGB chunks when an iCCP-chunk has been emitted. + chunks.remove(b"sRGB") + + info = im.encoderinfo.get("pnginfo") + if info: + chunks_multiple_allowed = [b"sPLT", b"iTXt", b"tEXt", b"zTXt"] + for info_chunk in info.chunks: + cid, data = info_chunk[:2] + if cid in chunks: + chunks.remove(cid) + chunk(fp, cid, data) + elif cid in chunks_multiple_allowed: + chunk(fp, cid, data) + elif cid[1:2].islower(): + # Private chunk + after_idat = len(info_chunk) == 3 and info_chunk[2] + if not after_idat: + chunk(fp, cid, data) + + if im.mode == "P": + palette_byte_number = colors * 3 + palette_bytes = im.im.getpalette("RGB")[:palette_byte_number] + while len(palette_bytes) < palette_byte_number: + palette_bytes += b"\0" + chunk(fp, b"PLTE", palette_bytes) + + transparency = im.encoderinfo.get("transparency", im.info.get("transparency", None)) + + if transparency or transparency == 0: + if im.mode == "P": + # limit to actual palette size + alpha_bytes = colors + if isinstance(transparency, bytes): + chunk(fp, b"tRNS", transparency[:alpha_bytes]) + else: + transparency = max(0, min(255, transparency)) + alpha = b"\xFF" * transparency + b"\0" + chunk(fp, b"tRNS", alpha[:alpha_bytes]) + elif im.mode in ("1", "L", "I", "I;16"): + transparency = max(0, min(65535, transparency)) + chunk(fp, b"tRNS", o16(transparency)) + elif im.mode == "RGB": + red, green, blue = transparency + chunk(fp, b"tRNS", o16(red) + o16(green) + o16(blue)) + else: + if "transparency" in im.encoderinfo: + # don't bother with transparency if it's an RGBA + # and it's in the info dict. It's probably just stale. + msg = "cannot use transparency for this mode" + raise OSError(msg) + else: + if im.mode == "P" and im.im.getpalettemode() == "RGBA": + alpha = im.im.getpalette("RGBA", "A") + alpha_bytes = colors + chunk(fp, b"tRNS", alpha[:alpha_bytes]) + + dpi = im.encoderinfo.get("dpi") + if dpi: + chunk( + fp, + b"pHYs", + o32(int(dpi[0] / 0.0254 + 0.5)), + o32(int(dpi[1] / 0.0254 + 0.5)), + b"\x01", + ) + + if info: + chunks = [b"bKGD", b"hIST"] + for info_chunk in info.chunks: + cid, data = info_chunk[:2] + if cid in chunks: + chunks.remove(cid) + chunk(fp, cid, data) + + exif = im.encoderinfo.get("exif") + if exif: + if isinstance(exif, Image.Exif): + exif = exif.tobytes(8) + if exif.startswith(b"Exif\x00\x00"): + exif = exif[6:] + chunk(fp, b"eXIf", exif) + + single_im: Image.Image | None = im + if save_all: + single_im = _write_multiple_frames( + im, fp, chunk, mode, rawmode, default_image, append_images + ) + if single_im: + ImageFile._save( + single_im, + cast(IO[bytes], _idat(fp, chunk)), + [ImageFile._Tile("zip", (0, 0) + single_im.size, 0, rawmode)], + ) + + if info: + for info_chunk in info.chunks: + cid, data = info_chunk[:2] + if cid[1:2].islower(): + # Private chunk + after_idat = len(info_chunk) == 3 and info_chunk[2] + if after_idat: + chunk(fp, cid, data) + + chunk(fp, b"IEND", b"") + + if hasattr(fp, "flush"): + fp.flush() + + +# -------------------------------------------------------------------- +# PNG chunk converter + + +def getchunks(im: Image.Image, **params: Any) -> list[tuple[bytes, bytes, bytes]]: + """Return a list of PNG chunks representing this image.""" + from io import BytesIO + + chunks = [] + + def append(fp: IO[bytes], cid: bytes, *data: bytes) -> None: + byte_data = b"".join(data) + crc = o32(_crc32(byte_data, _crc32(cid))) + chunks.append((cid, byte_data, crc)) + + fp = BytesIO() + + try: + im.encoderinfo = params + _save(im, fp, "", append) + finally: + del im.encoderinfo + + return chunks + + +# -------------------------------------------------------------------- +# Registry + +Image.register_open(PngImageFile.format, PngImageFile, _accept) +Image.register_save(PngImageFile.format, _save) +Image.register_save_all(PngImageFile.format, _save_all) + +Image.register_extensions(PngImageFile.format, [".png", ".apng"]) + +Image.register_mime(PngImageFile.format, "image/png") diff --git a/venv/lib/python3.12/site-packages/PIL/PpmImagePlugin.py b/venv/lib/python3.12/site-packages/PIL/PpmImagePlugin.py new file mode 100644 index 0000000..4e779df --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/PpmImagePlugin.py @@ -0,0 +1,375 @@ +# +# The Python Imaging Library. +# $Id$ +# +# PPM support for PIL +# +# History: +# 96-03-24 fl Created +# 98-03-06 fl Write RGBA images (as RGB, that is) +# +# Copyright (c) Secret Labs AB 1997-98. +# Copyright (c) Fredrik Lundh 1996. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import math +from typing import IO + +from . import Image, ImageFile +from ._binary import i16be as i16 +from ._binary import o8 +from ._binary import o32le as o32 + +# +# -------------------------------------------------------------------- + +b_whitespace = b"\x20\x09\x0a\x0b\x0c\x0d" + +MODES = { + # standard + b"P1": "1", + b"P2": "L", + b"P3": "RGB", + b"P4": "1", + b"P5": "L", + b"P6": "RGB", + # extensions + b"P0CMYK": "CMYK", + b"Pf": "F", + # PIL extensions (for test purposes only) + b"PyP": "P", + b"PyRGBA": "RGBA", + b"PyCMYK": "CMYK", +} + + +def _accept(prefix: bytes) -> bool: + return prefix[0:1] == b"P" and prefix[1] in b"0123456fy" + + +## +# Image plugin for PBM, PGM, and PPM images. + + +class PpmImageFile(ImageFile.ImageFile): + format = "PPM" + format_description = "Pbmplus image" + + def _read_magic(self) -> bytes: + assert self.fp is not None + + magic = b"" + # read until whitespace or longest available magic number + for _ in range(6): + c = self.fp.read(1) + if not c or c in b_whitespace: + break + magic += c + return magic + + def _read_token(self) -> bytes: + assert self.fp is not None + + token = b"" + while len(token) <= 10: # read until next whitespace or limit of 10 characters + c = self.fp.read(1) + if not c: + break + elif c in b_whitespace: # token ended + if not token: + # skip whitespace at start + continue + break + elif c == b"#": + # ignores rest of the line; stops at CR, LF or EOF + while self.fp.read(1) not in b"\r\n": + pass + continue + token += c + if not token: + # Token was not even 1 byte + msg = "Reached EOF while reading header" + raise ValueError(msg) + elif len(token) > 10: + msg = f"Token too long in file header: {token.decode()}" + raise ValueError(msg) + return token + + def _open(self) -> None: + assert self.fp is not None + + magic_number = self._read_magic() + try: + mode = MODES[magic_number] + except KeyError: + msg = "not a PPM file" + raise SyntaxError(msg) + self._mode = mode + + if magic_number in (b"P1", b"P4"): + self.custom_mimetype = "image/x-portable-bitmap" + elif magic_number in (b"P2", b"P5"): + self.custom_mimetype = "image/x-portable-graymap" + elif magic_number in (b"P3", b"P6"): + self.custom_mimetype = "image/x-portable-pixmap" + + self._size = int(self._read_token()), int(self._read_token()) + + decoder_name = "raw" + if magic_number in (b"P1", b"P2", b"P3"): + decoder_name = "ppm_plain" + + args: str | tuple[str | int, ...] + if mode == "1": + args = "1;I" + elif mode == "F": + scale = float(self._read_token()) + if scale == 0.0 or not math.isfinite(scale): + msg = "scale must be finite and non-zero" + raise ValueError(msg) + self.info["scale"] = abs(scale) + + rawmode = "F;32F" if scale < 0 else "F;32BF" + args = (rawmode, 0, -1) + else: + maxval = int(self._read_token()) + if not 0 < maxval < 65536: + msg = "maxval must be greater than 0 and less than 65536" + raise ValueError(msg) + if maxval > 255 and mode == "L": + self._mode = "I" + + rawmode = mode + if decoder_name != "ppm_plain": + # If maxval matches a bit depth, use the raw decoder directly + if maxval == 65535 and mode == "L": + rawmode = "I;16B" + elif maxval != 255: + decoder_name = "ppm" + + args = rawmode if decoder_name == "raw" else (rawmode, maxval) + self.tile = [ + ImageFile._Tile(decoder_name, (0, 0) + self.size, self.fp.tell(), args) + ] + + +# +# -------------------------------------------------------------------- + + +class PpmPlainDecoder(ImageFile.PyDecoder): + _pulls_fd = True + _comment_spans: bool + + def _read_block(self) -> bytes: + assert self.fd is not None + + return self.fd.read(ImageFile.SAFEBLOCK) + + def _find_comment_end(self, block: bytes, start: int = 0) -> int: + a = block.find(b"\n", start) + b = block.find(b"\r", start) + return min(a, b) if a * b > 0 else max(a, b) # lowest nonnegative index (or -1) + + def _ignore_comments(self, block: bytes) -> bytes: + if self._comment_spans: + # Finish current comment + while block: + comment_end = self._find_comment_end(block) + if comment_end != -1: + # Comment ends in this block + # Delete tail of comment + block = block[comment_end + 1 :] + break + else: + # Comment spans whole block + # So read the next block, looking for the end + block = self._read_block() + + # Search for any further comments + self._comment_spans = False + while True: + comment_start = block.find(b"#") + if comment_start == -1: + # No comment found + break + comment_end = self._find_comment_end(block, comment_start) + if comment_end != -1: + # Comment ends in this block + # Delete comment + block = block[:comment_start] + block[comment_end + 1 :] + else: + # Comment continues to next block(s) + block = block[:comment_start] + self._comment_spans = True + break + return block + + def _decode_bitonal(self) -> bytearray: + """ + This is a separate method because in the plain PBM format, all data tokens are + exactly one byte, so the inter-token whitespace is optional. + """ + data = bytearray() + total_bytes = self.state.xsize * self.state.ysize + + while len(data) != total_bytes: + block = self._read_block() # read next block + if not block: + # eof + break + + block = self._ignore_comments(block) + + tokens = b"".join(block.split()) + for token in tokens: + if token not in (48, 49): + msg = b"Invalid token for this mode: %s" % bytes([token]) + raise ValueError(msg) + data = (data + tokens)[:total_bytes] + invert = bytes.maketrans(b"01", b"\xFF\x00") + return data.translate(invert) + + def _decode_blocks(self, maxval: int) -> bytearray: + data = bytearray() + max_len = 10 + out_byte_count = 4 if self.mode == "I" else 1 + out_max = 65535 if self.mode == "I" else 255 + bands = Image.getmodebands(self.mode) + total_bytes = self.state.xsize * self.state.ysize * bands * out_byte_count + + half_token = b"" + while len(data) != total_bytes: + block = self._read_block() # read next block + if not block: + if half_token: + block = bytearray(b" ") # flush half_token + else: + # eof + break + + block = self._ignore_comments(block) + + if half_token: + block = half_token + block # stitch half_token to new block + half_token = b"" + + tokens = block.split() + + if block and not block[-1:].isspace(): # block might split token + half_token = tokens.pop() # save half token for later + if len(half_token) > max_len: # prevent buildup of half_token + msg = ( + b"Token too long found in data: %s" % half_token[: max_len + 1] + ) + raise ValueError(msg) + + for token in tokens: + if len(token) > max_len: + msg = b"Token too long found in data: %s" % token[: max_len + 1] + raise ValueError(msg) + value = int(token) + if value < 0: + msg_str = f"Channel value is negative: {value}" + raise ValueError(msg_str) + if value > maxval: + msg_str = f"Channel value too large for this mode: {value}" + raise ValueError(msg_str) + value = round(value / maxval * out_max) + data += o32(value) if self.mode == "I" else o8(value) + if len(data) == total_bytes: # finished! + break + return data + + def decode(self, buffer: bytes | Image.SupportsArrayInterface) -> tuple[int, int]: + self._comment_spans = False + if self.mode == "1": + data = self._decode_bitonal() + rawmode = "1;8" + else: + maxval = self.args[-1] + data = self._decode_blocks(maxval) + rawmode = "I;32" if self.mode == "I" else self.mode + self.set_as_raw(bytes(data), rawmode) + return -1, 0 + + +class PpmDecoder(ImageFile.PyDecoder): + _pulls_fd = True + + def decode(self, buffer: bytes | Image.SupportsArrayInterface) -> tuple[int, int]: + assert self.fd is not None + + data = bytearray() + maxval = self.args[-1] + in_byte_count = 1 if maxval < 256 else 2 + out_byte_count = 4 if self.mode == "I" else 1 + out_max = 65535 if self.mode == "I" else 255 + bands = Image.getmodebands(self.mode) + dest_length = self.state.xsize * self.state.ysize * bands * out_byte_count + while len(data) < dest_length: + pixels = self.fd.read(in_byte_count * bands) + if len(pixels) < in_byte_count * bands: + # eof + break + for b in range(bands): + value = ( + pixels[b] if in_byte_count == 1 else i16(pixels, b * in_byte_count) + ) + value = min(out_max, round(value / maxval * out_max)) + data += o32(value) if self.mode == "I" else o8(value) + rawmode = "I;32" if self.mode == "I" else self.mode + self.set_as_raw(bytes(data), rawmode) + return -1, 0 + + +# +# -------------------------------------------------------------------- + + +def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + if im.mode == "1": + rawmode, head = "1;I", b"P4" + elif im.mode == "L": + rawmode, head = "L", b"P5" + elif im.mode in ("I", "I;16"): + rawmode, head = "I;16B", b"P5" + elif im.mode in ("RGB", "RGBA"): + rawmode, head = "RGB", b"P6" + elif im.mode == "F": + rawmode, head = "F;32F", b"Pf" + else: + msg = f"cannot write mode {im.mode} as PPM" + raise OSError(msg) + fp.write(head + b"\n%d %d\n" % im.size) + if head == b"P6": + fp.write(b"255\n") + elif head == b"P5": + if rawmode == "L": + fp.write(b"255\n") + else: + fp.write(b"65535\n") + elif head == b"Pf": + fp.write(b"-1.0\n") + row_order = -1 if im.mode == "F" else 1 + ImageFile._save( + im, fp, [ImageFile._Tile("raw", (0, 0) + im.size, 0, (rawmode, 0, row_order))] + ) + + +# +# -------------------------------------------------------------------- + + +Image.register_open(PpmImageFile.format, PpmImageFile, _accept) +Image.register_save(PpmImageFile.format, _save) + +Image.register_decoder("ppm", PpmDecoder) +Image.register_decoder("ppm_plain", PpmPlainDecoder) + +Image.register_extensions(PpmImageFile.format, [".pbm", ".pgm", ".ppm", ".pnm", ".pfm"]) + +Image.register_mime(PpmImageFile.format, "image/x-portable-anymap") diff --git a/venv/lib/python3.12/site-packages/PIL/PsdImagePlugin.py b/venv/lib/python3.12/site-packages/PIL/PsdImagePlugin.py new file mode 100644 index 0000000..8ff5e39 --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/PsdImagePlugin.py @@ -0,0 +1,332 @@ +# +# The Python Imaging Library +# $Id$ +# +# Adobe PSD 2.5/3.0 file handling +# +# History: +# 1995-09-01 fl Created +# 1997-01-03 fl Read most PSD images +# 1997-01-18 fl Fixed P and CMYK support +# 2001-10-21 fl Added seek/tell support (for layers) +# +# Copyright (c) 1997-2001 by Secret Labs AB. +# Copyright (c) 1995-2001 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import io +from functools import cached_property +from typing import IO + +from . import Image, ImageFile, ImagePalette +from ._binary import i8 +from ._binary import i16be as i16 +from ._binary import i32be as i32 +from ._binary import si16be as si16 +from ._binary import si32be as si32 + +MODES = { + # (photoshop mode, bits) -> (pil mode, required channels) + (0, 1): ("1", 1), + (0, 8): ("L", 1), + (1, 8): ("L", 1), + (2, 8): ("P", 1), + (3, 8): ("RGB", 3), + (4, 8): ("CMYK", 4), + (7, 8): ("L", 1), # FIXME: multilayer + (8, 8): ("L", 1), # duotone + (9, 8): ("LAB", 3), +} + + +# --------------------------------------------------------------------. +# read PSD images + + +def _accept(prefix: bytes) -> bool: + return prefix[:4] == b"8BPS" + + +## +# Image plugin for Photoshop images. + + +class PsdImageFile(ImageFile.ImageFile): + format = "PSD" + format_description = "Adobe Photoshop" + _close_exclusive_fp_after_loading = False + + def _open(self) -> None: + read = self.fp.read + + # + # header + + s = read(26) + if not _accept(s) or i16(s, 4) != 1: + msg = "not a PSD file" + raise SyntaxError(msg) + + psd_bits = i16(s, 22) + psd_channels = i16(s, 12) + psd_mode = i16(s, 24) + + mode, channels = MODES[(psd_mode, psd_bits)] + + if channels > psd_channels: + msg = "not enough channels" + raise OSError(msg) + if mode == "RGB" and psd_channels == 4: + mode = "RGBA" + channels = 4 + + self._mode = mode + self._size = i32(s, 18), i32(s, 14) + + # + # color mode data + + size = i32(read(4)) + if size: + data = read(size) + if mode == "P" and size == 768: + self.palette = ImagePalette.raw("RGB;L", data) + + # + # image resources + + self.resources = [] + + size = i32(read(4)) + if size: + # load resources + end = self.fp.tell() + size + while self.fp.tell() < end: + read(4) # signature + id = i16(read(2)) + name = read(i8(read(1))) + if not (len(name) & 1): + read(1) # padding + data = read(i32(read(4))) + if len(data) & 1: + read(1) # padding + self.resources.append((id, name, data)) + if id == 1039: # ICC profile + self.info["icc_profile"] = data + + # + # layer and mask information + + self._layers_position = None + + size = i32(read(4)) + if size: + end = self.fp.tell() + size + size = i32(read(4)) + if size: + self._layers_position = self.fp.tell() + self._layers_size = size + self.fp.seek(end) + self._n_frames: int | None = None + + # + # image descriptor + + self.tile = _maketile(self.fp, mode, (0, 0) + self.size, channels) + + # keep the file open + self._fp = self.fp + self.frame = 1 + self._min_frame = 1 + + @cached_property + def layers( + self, + ) -> list[tuple[str, str, tuple[int, int, int, int], list[ImageFile._Tile]]]: + layers = [] + if self._layers_position is not None: + self._fp.seek(self._layers_position) + _layer_data = io.BytesIO(ImageFile._safe_read(self._fp, self._layers_size)) + layers = _layerinfo(_layer_data, self._layers_size) + self._n_frames = len(layers) + return layers + + @property + def n_frames(self) -> int: + if self._n_frames is None: + self._n_frames = len(self.layers) + return self._n_frames + + @property + def is_animated(self) -> bool: + return len(self.layers) > 1 + + def seek(self, layer: int) -> None: + if not self._seek_check(layer): + return + + # seek to given layer (1..max) + try: + _, mode, _, tile = self.layers[layer - 1] + self._mode = mode + self.tile = tile + self.frame = layer + self.fp = self._fp + except IndexError as e: + msg = "no such layer" + raise EOFError(msg) from e + + def tell(self) -> int: + # return layer number (0=image, 1..max=layers) + return self.frame + + +def _layerinfo( + fp: IO[bytes], ct_bytes: int +) -> list[tuple[str, str, tuple[int, int, int, int], list[ImageFile._Tile]]]: + # read layerinfo block + layers = [] + + def read(size: int) -> bytes: + return ImageFile._safe_read(fp, size) + + ct = si16(read(2)) + + # sanity check + if ct_bytes < (abs(ct) * 20): + msg = "Layer block too short for number of layers requested" + raise SyntaxError(msg) + + for _ in range(abs(ct)): + # bounding box + y0 = si32(read(4)) + x0 = si32(read(4)) + y1 = si32(read(4)) + x1 = si32(read(4)) + + # image info + bands = [] + ct_types = i16(read(2)) + if ct_types > 4: + fp.seek(ct_types * 6 + 12, io.SEEK_CUR) + size = i32(read(4)) + fp.seek(size, io.SEEK_CUR) + continue + + for _ in range(ct_types): + type = i16(read(2)) + + if type == 65535: + b = "A" + else: + b = "RGBA"[type] + + bands.append(b) + read(4) # size + + # figure out the image mode + bands.sort() + if bands == ["R"]: + mode = "L" + elif bands == ["B", "G", "R"]: + mode = "RGB" + elif bands == ["A", "B", "G", "R"]: + mode = "RGBA" + else: + mode = "" # unknown + + # skip over blend flags and extra information + read(12) # filler + name = "" + size = i32(read(4)) # length of the extra data field + if size: + data_end = fp.tell() + size + + length = i32(read(4)) + if length: + fp.seek(length - 16, io.SEEK_CUR) + + length = i32(read(4)) + if length: + fp.seek(length, io.SEEK_CUR) + + length = i8(read(1)) + if length: + # Don't know the proper encoding, + # Latin-1 should be a good guess + name = read(length).decode("latin-1", "replace") + + fp.seek(data_end) + layers.append((name, mode, (x0, y0, x1, y1))) + + # get tiles + layerinfo = [] + for i, (name, mode, bbox) in enumerate(layers): + tile = [] + for m in mode: + t = _maketile(fp, m, bbox, 1) + if t: + tile.extend(t) + layerinfo.append((name, mode, bbox, tile)) + + return layerinfo + + +def _maketile( + file: IO[bytes], mode: str, bbox: tuple[int, int, int, int], channels: int +) -> list[ImageFile._Tile]: + tiles = [] + read = file.read + + compression = i16(read(2)) + + xsize = bbox[2] - bbox[0] + ysize = bbox[3] - bbox[1] + + offset = file.tell() + + if compression == 0: + # + # raw compression + for channel in range(channels): + layer = mode[channel] + if mode == "CMYK": + layer += ";I" + tiles.append(ImageFile._Tile("raw", bbox, offset, layer)) + offset = offset + xsize * ysize + + elif compression == 1: + # + # packbits compression + i = 0 + bytecount = read(channels * ysize * 2) + offset = file.tell() + for channel in range(channels): + layer = mode[channel] + if mode == "CMYK": + layer += ";I" + tiles.append(ImageFile._Tile("packbits", bbox, offset, layer)) + for y in range(ysize): + offset = offset + i16(bytecount, i) + i += 2 + + file.seek(offset) + + if offset & 1: + read(1) # padding + + return tiles + + +# -------------------------------------------------------------------- +# registry + + +Image.register_open(PsdImageFile.format, PsdImageFile, _accept) + +Image.register_extension(PsdImageFile.format, ".psd") + +Image.register_mime(PsdImageFile.format, "image/vnd.adobe.photoshop") diff --git a/venv/lib/python3.12/site-packages/PIL/QoiImagePlugin.py b/venv/lib/python3.12/site-packages/PIL/QoiImagePlugin.py new file mode 100644 index 0000000..010d3f9 --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/QoiImagePlugin.py @@ -0,0 +1,115 @@ +# +# The Python Imaging Library. +# +# QOI support for PIL +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import os + +from . import Image, ImageFile +from ._binary import i32be as i32 + + +def _accept(prefix: bytes) -> bool: + return prefix[:4] == b"qoif" + + +class QoiImageFile(ImageFile.ImageFile): + format = "QOI" + format_description = "Quite OK Image" + + def _open(self) -> None: + if not _accept(self.fp.read(4)): + msg = "not a QOI file" + raise SyntaxError(msg) + + self._size = i32(self.fp.read(4)), i32(self.fp.read(4)) + + channels = self.fp.read(1)[0] + self._mode = "RGB" if channels == 3 else "RGBA" + + self.fp.seek(1, os.SEEK_CUR) # colorspace + self.tile = [ImageFile._Tile("qoi", (0, 0) + self._size, self.fp.tell(), None)] + + +class QoiDecoder(ImageFile.PyDecoder): + _pulls_fd = True + _previous_pixel: bytes | bytearray | None = None + _previously_seen_pixels: dict[int, bytes | bytearray] = {} + + def _add_to_previous_pixels(self, value: bytes | bytearray) -> None: + self._previous_pixel = value + + r, g, b, a = value + hash_value = (r * 3 + g * 5 + b * 7 + a * 11) % 64 + self._previously_seen_pixels[hash_value] = value + + def decode(self, buffer: bytes | Image.SupportsArrayInterface) -> tuple[int, int]: + assert self.fd is not None + + self._previously_seen_pixels = {} + self._add_to_previous_pixels(bytearray((0, 0, 0, 255))) + + data = bytearray() + bands = Image.getmodebands(self.mode) + dest_length = self.state.xsize * self.state.ysize * bands + while len(data) < dest_length: + byte = self.fd.read(1)[0] + value: bytes | bytearray + if byte == 0b11111110 and self._previous_pixel: # QOI_OP_RGB + value = bytearray(self.fd.read(3)) + self._previous_pixel[3:] + elif byte == 0b11111111: # QOI_OP_RGBA + value = self.fd.read(4) + else: + op = byte >> 6 + if op == 0: # QOI_OP_INDEX + op_index = byte & 0b00111111 + value = self._previously_seen_pixels.get( + op_index, bytearray((0, 0, 0, 0)) + ) + elif op == 1 and self._previous_pixel: # QOI_OP_DIFF + value = bytearray( + ( + (self._previous_pixel[0] + ((byte & 0b00110000) >> 4) - 2) + % 256, + (self._previous_pixel[1] + ((byte & 0b00001100) >> 2) - 2) + % 256, + (self._previous_pixel[2] + (byte & 0b00000011) - 2) % 256, + self._previous_pixel[3], + ) + ) + elif op == 2 and self._previous_pixel: # QOI_OP_LUMA + second_byte = self.fd.read(1)[0] + diff_green = (byte & 0b00111111) - 32 + diff_red = ((second_byte & 0b11110000) >> 4) - 8 + diff_blue = (second_byte & 0b00001111) - 8 + + value = bytearray( + tuple( + (self._previous_pixel[i] + diff_green + diff) % 256 + for i, diff in enumerate((diff_red, 0, diff_blue)) + ) + ) + value += self._previous_pixel[3:] + elif op == 3 and self._previous_pixel: # QOI_OP_RUN + run_length = (byte & 0b00111111) + 1 + value = self._previous_pixel + if bands == 3: + value = value[:3] + data += value * run_length + continue + self._add_to_previous_pixels(value) + + if bands == 3: + value = value[:3] + data += value + self.set_as_raw(data) + return -1, 0 + + +Image.register_open(QoiImageFile.format, QoiImageFile, _accept) +Image.register_decoder("qoi", QoiDecoder) +Image.register_extension(QoiImageFile.format, ".qoi") diff --git a/venv/lib/python3.12/site-packages/PIL/SgiImagePlugin.py b/venv/lib/python3.12/site-packages/PIL/SgiImagePlugin.py new file mode 100644 index 0000000..44254b7 --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/SgiImagePlugin.py @@ -0,0 +1,247 @@ +# +# The Python Imaging Library. +# $Id$ +# +# SGI image file handling +# +# See "The SGI Image File Format (Draft version 0.97)", Paul Haeberli. +# +# +# +# History: +# 2017-22-07 mb Add RLE decompression +# 2016-16-10 mb Add save method without compression +# 1995-09-10 fl Created +# +# Copyright (c) 2016 by Mickael Bonfill. +# Copyright (c) 2008 by Karsten Hiddemann. +# Copyright (c) 1997 by Secret Labs AB. +# Copyright (c) 1995 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import os +import struct +from typing import IO + +from . import Image, ImageFile +from ._binary import i16be as i16 +from ._binary import o8 + + +def _accept(prefix: bytes) -> bool: + return len(prefix) >= 2 and i16(prefix) == 474 + + +MODES = { + (1, 1, 1): "L", + (1, 2, 1): "L", + (2, 1, 1): "L;16B", + (2, 2, 1): "L;16B", + (1, 3, 3): "RGB", + (2, 3, 3): "RGB;16B", + (1, 3, 4): "RGBA", + (2, 3, 4): "RGBA;16B", +} + + +## +# Image plugin for SGI images. +class SgiImageFile(ImageFile.ImageFile): + format = "SGI" + format_description = "SGI Image File Format" + + def _open(self) -> None: + # HEAD + assert self.fp is not None + + headlen = 512 + s = self.fp.read(headlen) + + if not _accept(s): + msg = "Not an SGI image file" + raise ValueError(msg) + + # compression : verbatim or RLE + compression = s[2] + + # bpc : 1 or 2 bytes (8bits or 16bits) + bpc = s[3] + + # dimension : 1, 2 or 3 (depending on xsize, ysize and zsize) + dimension = i16(s, 4) + + # xsize : width + xsize = i16(s, 6) + + # ysize : height + ysize = i16(s, 8) + + # zsize : channels count + zsize = i16(s, 10) + + # layout + layout = bpc, dimension, zsize + + # determine mode from bits/zsize + rawmode = "" + try: + rawmode = MODES[layout] + except KeyError: + pass + + if rawmode == "": + msg = "Unsupported SGI image mode" + raise ValueError(msg) + + self._size = xsize, ysize + self._mode = rawmode.split(";")[0] + if self.mode == "RGB": + self.custom_mimetype = "image/rgb" + + # orientation -1 : scanlines begins at the bottom-left corner + orientation = -1 + + # decoder info + if compression == 0: + pagesize = xsize * ysize * bpc + if bpc == 2: + self.tile = [ + ImageFile._Tile( + "SGI16", + (0, 0) + self.size, + headlen, + (self.mode, 0, orientation), + ) + ] + else: + self.tile = [] + offset = headlen + for layer in self.mode: + self.tile.append( + ImageFile._Tile( + "raw", (0, 0) + self.size, offset, (layer, 0, orientation) + ) + ) + offset += pagesize + elif compression == 1: + self.tile = [ + ImageFile._Tile( + "sgi_rle", (0, 0) + self.size, headlen, (rawmode, orientation, bpc) + ) + ] + + +def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + if im.mode not in {"RGB", "RGBA", "L"}: + msg = "Unsupported SGI image mode" + raise ValueError(msg) + + # Get the keyword arguments + info = im.encoderinfo + + # Byte-per-pixel precision, 1 = 8bits per pixel + bpc = info.get("bpc", 1) + + if bpc not in (1, 2): + msg = "Unsupported number of bytes per pixel" + raise ValueError(msg) + + # Flip the image, since the origin of SGI file is the bottom-left corner + orientation = -1 + # Define the file as SGI File Format + magic_number = 474 + # Run-Length Encoding Compression - Unsupported at this time + rle = 0 + + # Number of dimensions (x,y,z) + dim = 3 + # X Dimension = width / Y Dimension = height + x, y = im.size + if im.mode == "L" and y == 1: + dim = 1 + elif im.mode == "L": + dim = 2 + # Z Dimension: Number of channels + z = len(im.mode) + + if dim in {1, 2}: + z = 1 + + # assert we've got the right number of bands. + if len(im.getbands()) != z: + msg = f"incorrect number of bands in SGI write: {z} vs {len(im.getbands())}" + raise ValueError(msg) + + # Minimum Byte value + pinmin = 0 + # Maximum Byte value (255 = 8bits per pixel) + pinmax = 255 + # Image name (79 characters max, truncated below in write) + img_name = os.path.splitext(os.path.basename(filename))[0] + if isinstance(img_name, str): + img_name = img_name.encode("ascii", "ignore") + # Standard representation of pixel in the file + colormap = 0 + fp.write(struct.pack(">h", magic_number)) + fp.write(o8(rle)) + fp.write(o8(bpc)) + fp.write(struct.pack(">H", dim)) + fp.write(struct.pack(">H", x)) + fp.write(struct.pack(">H", y)) + fp.write(struct.pack(">H", z)) + fp.write(struct.pack(">l", pinmin)) + fp.write(struct.pack(">l", pinmax)) + fp.write(struct.pack("4s", b"")) # dummy + fp.write(struct.pack("79s", img_name)) # truncates to 79 chars + fp.write(struct.pack("s", b"")) # force null byte after img_name + fp.write(struct.pack(">l", colormap)) + fp.write(struct.pack("404s", b"")) # dummy + + rawmode = "L" + if bpc == 2: + rawmode = "L;16B" + + for channel in im.split(): + fp.write(channel.tobytes("raw", rawmode, 0, orientation)) + + if hasattr(fp, "flush"): + fp.flush() + + +class SGI16Decoder(ImageFile.PyDecoder): + _pulls_fd = True + + def decode(self, buffer: bytes | Image.SupportsArrayInterface) -> tuple[int, int]: + assert self.fd is not None + assert self.im is not None + + rawmode, stride, orientation = self.args + pagesize = self.state.xsize * self.state.ysize + zsize = len(self.mode) + self.fd.seek(512) + + for band in range(zsize): + channel = Image.new("L", (self.state.xsize, self.state.ysize)) + channel.frombytes( + self.fd.read(2 * pagesize), "raw", "L;16B", stride, orientation + ) + self.im.putband(channel.im, band) + + return -1, 0 + + +# +# registry + + +Image.register_decoder("SGI16", SGI16Decoder) +Image.register_open(SgiImageFile.format, SgiImageFile, _accept) +Image.register_save(SgiImageFile.format, _save) +Image.register_mime(SgiImageFile.format, "image/sgi") + +Image.register_extensions(SgiImageFile.format, [".bw", ".rgb", ".rgba", ".sgi"]) + +# End of file diff --git a/venv/lib/python3.12/site-packages/PIL/SpiderImagePlugin.py b/venv/lib/python3.12/site-packages/PIL/SpiderImagePlugin.py new file mode 100644 index 0000000..075073f --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/SpiderImagePlugin.py @@ -0,0 +1,329 @@ +# +# The Python Imaging Library. +# +# SPIDER image file handling +# +# History: +# 2004-08-02 Created BB +# 2006-03-02 added save method +# 2006-03-13 added support for stack images +# +# Copyright (c) 2004 by Health Research Inc. (HRI) RENSSELAER, NY 12144. +# Copyright (c) 2004 by William Baxter. +# Copyright (c) 2004 by Secret Labs AB. +# Copyright (c) 2004 by Fredrik Lundh. +# + +## +# Image plugin for the Spider image format. This format is used +# by the SPIDER software, in processing image data from electron +# microscopy and tomography. +## + +# +# SpiderImagePlugin.py +# +# The Spider image format is used by SPIDER software, in processing +# image data from electron microscopy and tomography. +# +# Spider home page: +# https://spider.wadsworth.org/spider_doc/spider/docs/spider.html +# +# Details about the Spider image format: +# https://spider.wadsworth.org/spider_doc/spider/docs/image_doc.html +# +from __future__ import annotations + +import os +import struct +import sys +from typing import IO, TYPE_CHECKING, Any, cast + +from . import Image, ImageFile + + +def isInt(f: Any) -> int: + try: + i = int(f) + if f - i == 0: + return 1 + else: + return 0 + except (ValueError, OverflowError): + return 0 + + +iforms = [1, 3, -11, -12, -21, -22] + + +# There is no magic number to identify Spider files, so just check a +# series of header locations to see if they have reasonable values. +# Returns no. of bytes in the header, if it is a valid Spider header, +# otherwise returns 0 + + +def isSpiderHeader(t: tuple[float, ...]) -> int: + h = (99,) + t # add 1 value so can use spider header index start=1 + # header values 1,2,5,12,13,22,23 should be integers + for i in [1, 2, 5, 12, 13, 22, 23]: + if not isInt(h[i]): + return 0 + # check iform + iform = int(h[5]) + if iform not in iforms: + return 0 + # check other header values + labrec = int(h[13]) # no. records in file header + labbyt = int(h[22]) # total no. of bytes in header + lenbyt = int(h[23]) # record length in bytes + if labbyt != (labrec * lenbyt): + return 0 + # looks like a valid header + return labbyt + + +def isSpiderImage(filename: str) -> int: + with open(filename, "rb") as fp: + f = fp.read(92) # read 23 * 4 bytes + t = struct.unpack(">23f", f) # try big-endian first + hdrlen = isSpiderHeader(t) + if hdrlen == 0: + t = struct.unpack("<23f", f) # little-endian + hdrlen = isSpiderHeader(t) + return hdrlen + + +class SpiderImageFile(ImageFile.ImageFile): + format = "SPIDER" + format_description = "Spider 2D image" + _close_exclusive_fp_after_loading = False + + def _open(self) -> None: + # check header + n = 27 * 4 # read 27 float values + f = self.fp.read(n) + + try: + self.bigendian = 1 + t = struct.unpack(">27f", f) # try big-endian first + hdrlen = isSpiderHeader(t) + if hdrlen == 0: + self.bigendian = 0 + t = struct.unpack("<27f", f) # little-endian + hdrlen = isSpiderHeader(t) + if hdrlen == 0: + msg = "not a valid Spider file" + raise SyntaxError(msg) + except struct.error as e: + msg = "not a valid Spider file" + raise SyntaxError(msg) from e + + h = (99,) + t # add 1 value : spider header index starts at 1 + iform = int(h[5]) + if iform != 1: + msg = "not a Spider 2D image" + raise SyntaxError(msg) + + self._size = int(h[12]), int(h[2]) # size in pixels (width, height) + self.istack = int(h[24]) + self.imgnumber = int(h[27]) + + if self.istack == 0 and self.imgnumber == 0: + # stk=0, img=0: a regular 2D image + offset = hdrlen + self._nimages = 1 + elif self.istack > 0 and self.imgnumber == 0: + # stk>0, img=0: Opening the stack for the first time + self.imgbytes = int(h[12]) * int(h[2]) * 4 + self.hdrlen = hdrlen + self._nimages = int(h[26]) + # Point to the first image in the stack + offset = hdrlen * 2 + self.imgnumber = 1 + elif self.istack == 0 and self.imgnumber > 0: + # stk=0, img>0: an image within the stack + offset = hdrlen + self.stkoffset + self.istack = 2 # So Image knows it's still a stack + else: + msg = "inconsistent stack header values" + raise SyntaxError(msg) + + if self.bigendian: + self.rawmode = "F;32BF" + else: + self.rawmode = "F;32F" + self._mode = "F" + + self.tile = [ + ImageFile._Tile("raw", (0, 0) + self.size, offset, (self.rawmode, 0, 1)) + ] + self._fp = self.fp # FIXME: hack + + @property + def n_frames(self) -> int: + return self._nimages + + @property + def is_animated(self) -> bool: + return self._nimages > 1 + + # 1st image index is zero (although SPIDER imgnumber starts at 1) + def tell(self) -> int: + if self.imgnumber < 1: + return 0 + else: + return self.imgnumber - 1 + + def seek(self, frame: int) -> None: + if self.istack == 0: + msg = "attempt to seek in a non-stack file" + raise EOFError(msg) + if not self._seek_check(frame): + return + self.stkoffset = self.hdrlen + frame * (self.hdrlen + self.imgbytes) + self.fp = self._fp + self.fp.seek(self.stkoffset) + self._open() + + # returns a byte image after rescaling to 0..255 + def convert2byte(self, depth: int = 255) -> Image.Image: + extrema = self.getextrema() + assert isinstance(extrema[0], float) + minimum, maximum = cast(tuple[float, float], extrema) + m: float = 1 + if maximum != minimum: + m = depth / (maximum - minimum) + b = -m * minimum + return self.point(lambda i: i * m + b).convert("L") + + if TYPE_CHECKING: + from . import ImageTk + + # returns a ImageTk.PhotoImage object, after rescaling to 0..255 + def tkPhotoImage(self) -> ImageTk.PhotoImage: + from . import ImageTk + + return ImageTk.PhotoImage(self.convert2byte(), palette=256) + + +# -------------------------------------------------------------------- +# Image series + + +# given a list of filenames, return a list of images +def loadImageSeries(filelist: list[str] | None = None) -> list[SpiderImageFile] | None: + """create a list of :py:class:`~PIL.Image.Image` objects for use in a montage""" + if filelist is None or len(filelist) < 1: + return None + + imglist = [] + for img in filelist: + if not os.path.exists(img): + print(f"unable to find {img}") + continue + try: + with Image.open(img) as im: + im = im.convert2byte() + except Exception: + if not isSpiderImage(img): + print(f"{img} is not a Spider image file") + continue + im.info["filename"] = img + imglist.append(im) + return imglist + + +# -------------------------------------------------------------------- +# For saving images in Spider format + + +def makeSpiderHeader(im: Image.Image) -> list[bytes]: + nsam, nrow = im.size + lenbyt = nsam * 4 # There are labrec records in the header + labrec = int(1024 / lenbyt) + if 1024 % lenbyt != 0: + labrec += 1 + labbyt = labrec * lenbyt + nvalues = int(labbyt / 4) + if nvalues < 23: + return [] + + hdr = [0.0] * nvalues + + # NB these are Fortran indices + hdr[1] = 1.0 # nslice (=1 for an image) + hdr[2] = float(nrow) # number of rows per slice + hdr[3] = float(nrow) # number of records in the image + hdr[5] = 1.0 # iform for 2D image + hdr[12] = float(nsam) # number of pixels per line + hdr[13] = float(labrec) # number of records in file header + hdr[22] = float(labbyt) # total number of bytes in header + hdr[23] = float(lenbyt) # record length in bytes + + # adjust for Fortran indexing + hdr = hdr[1:] + hdr.append(0.0) + # pack binary data into a string + return [struct.pack("f", v) for v in hdr] + + +def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + if im.mode[0] != "F": + im = im.convert("F") + + hdr = makeSpiderHeader(im) + if len(hdr) < 256: + msg = "Error creating Spider header" + raise OSError(msg) + + # write the SPIDER header + fp.writelines(hdr) + + rawmode = "F;32NF" # 32-bit native floating point + ImageFile._save( + im, fp, [ImageFile._Tile("raw", (0, 0) + im.size, 0, (rawmode, 0, 1))] + ) + + +def _save_spider(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + # get the filename extension and register it with Image + filename_ext = os.path.splitext(filename)[1] + ext = filename_ext.decode() if isinstance(filename_ext, bytes) else filename_ext + Image.register_extension(SpiderImageFile.format, ext) + _save(im, fp, filename) + + +# -------------------------------------------------------------------- + + +Image.register_open(SpiderImageFile.format, SpiderImageFile) +Image.register_save(SpiderImageFile.format, _save_spider) + +if __name__ == "__main__": + if len(sys.argv) < 2: + print("Syntax: python3 SpiderImagePlugin.py [infile] [outfile]") + sys.exit() + + filename = sys.argv[1] + if not isSpiderImage(filename): + print("input image must be in Spider format") + sys.exit() + + with Image.open(filename) as im: + print(f"image: {im}") + print(f"format: {im.format}") + print(f"size: {im.size}") + print(f"mode: {im.mode}") + print("max, min: ", end=" ") + print(im.getextrema()) + + if len(sys.argv) > 2: + outfile = sys.argv[2] + + # perform some image operation + im = im.transpose(Image.Transpose.FLIP_LEFT_RIGHT) + print( + f"saving a flipped version of {os.path.basename(filename)} " + f"as {outfile} " + ) + im.save(outfile, SpiderImageFile.format) diff --git a/venv/lib/python3.12/site-packages/PIL/SunImagePlugin.py b/venv/lib/python3.12/site-packages/PIL/SunImagePlugin.py new file mode 100644 index 0000000..8912379 --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/SunImagePlugin.py @@ -0,0 +1,145 @@ +# +# The Python Imaging Library. +# $Id$ +# +# Sun image file handling +# +# History: +# 1995-09-10 fl Created +# 1996-05-28 fl Fixed 32-bit alignment +# 1998-12-29 fl Import ImagePalette module +# 2001-12-18 fl Fixed palette loading (from Jean-Claude Rimbault) +# +# Copyright (c) 1997-2001 by Secret Labs AB +# Copyright (c) 1995-1996 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +from . import Image, ImageFile, ImagePalette +from ._binary import i32be as i32 + + +def _accept(prefix: bytes) -> bool: + return len(prefix) >= 4 and i32(prefix) == 0x59A66A95 + + +## +# Image plugin for Sun raster files. + + +class SunImageFile(ImageFile.ImageFile): + format = "SUN" + format_description = "Sun Raster File" + + def _open(self) -> None: + # The Sun Raster file header is 32 bytes in length + # and has the following format: + + # typedef struct _SunRaster + # { + # DWORD MagicNumber; /* Magic (identification) number */ + # DWORD Width; /* Width of image in pixels */ + # DWORD Height; /* Height of image in pixels */ + # DWORD Depth; /* Number of bits per pixel */ + # DWORD Length; /* Size of image data in bytes */ + # DWORD Type; /* Type of raster file */ + # DWORD ColorMapType; /* Type of color map */ + # DWORD ColorMapLength; /* Size of the color map in bytes */ + # } SUNRASTER; + + assert self.fp is not None + + # HEAD + s = self.fp.read(32) + if not _accept(s): + msg = "not an SUN raster file" + raise SyntaxError(msg) + + offset = 32 + + self._size = i32(s, 4), i32(s, 8) + + depth = i32(s, 12) + # data_length = i32(s, 16) # unreliable, ignore. + file_type = i32(s, 20) + palette_type = i32(s, 24) # 0: None, 1: RGB, 2: Raw/arbitrary + palette_length = i32(s, 28) + + if depth == 1: + self._mode, rawmode = "1", "1;I" + elif depth == 4: + self._mode, rawmode = "L", "L;4" + elif depth == 8: + self._mode = rawmode = "L" + elif depth == 24: + if file_type == 3: + self._mode, rawmode = "RGB", "RGB" + else: + self._mode, rawmode = "RGB", "BGR" + elif depth == 32: + if file_type == 3: + self._mode, rawmode = "RGB", "RGBX" + else: + self._mode, rawmode = "RGB", "BGRX" + else: + msg = "Unsupported Mode/Bit Depth" + raise SyntaxError(msg) + + if palette_length: + if palette_length > 1024: + msg = "Unsupported Color Palette Length" + raise SyntaxError(msg) + + if palette_type != 1: + msg = "Unsupported Palette Type" + raise SyntaxError(msg) + + offset = offset + palette_length + self.palette = ImagePalette.raw("RGB;L", self.fp.read(palette_length)) + if self.mode == "L": + self._mode = "P" + rawmode = rawmode.replace("L", "P") + + # 16 bit boundaries on stride + stride = ((self.size[0] * depth + 15) // 16) * 2 + + # file type: Type is the version (or flavor) of the bitmap + # file. The following values are typically found in the Type + # field: + # 0000h Old + # 0001h Standard + # 0002h Byte-encoded + # 0003h RGB format + # 0004h TIFF format + # 0005h IFF format + # FFFFh Experimental + + # Old and standard are the same, except for the length tag. + # byte-encoded is run-length-encoded + # RGB looks similar to standard, but RGB byte order + # TIFF and IFF mean that they were converted from T/IFF + # Experimental means that it's something else. + # (https://www.fileformat.info/format/sunraster/egff.htm) + + if file_type in (0, 1, 3, 4, 5): + self.tile = [ + ImageFile._Tile("raw", (0, 0) + self.size, offset, (rawmode, stride)) + ] + elif file_type == 2: + self.tile = [ + ImageFile._Tile("sun_rle", (0, 0) + self.size, offset, rawmode) + ] + else: + msg = "Unsupported Sun Raster file type" + raise SyntaxError(msg) + + +# +# registry + + +Image.register_open(SunImageFile.format, SunImageFile, _accept) + +Image.register_extension(SunImageFile.format, ".ras") diff --git a/venv/lib/python3.12/site-packages/PIL/TarIO.py b/venv/lib/python3.12/site-packages/PIL/TarIO.py new file mode 100644 index 0000000..779288b --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/TarIO.py @@ -0,0 +1,57 @@ +# +# The Python Imaging Library. +# $Id$ +# +# read files from within a tar file +# +# History: +# 95-06-18 fl Created +# 96-05-28 fl Open files in binary mode +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1995-96. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import io + +from . import ContainerIO + + +class TarIO(ContainerIO.ContainerIO[bytes]): + """A file object that provides read access to a given member of a TAR file.""" + + def __init__(self, tarfile: str, file: str) -> None: + """ + Create file object. + + :param tarfile: Name of TAR file. + :param file: Name of member file. + """ + self.fh = open(tarfile, "rb") + + while True: + s = self.fh.read(512) + if len(s) != 512: + msg = "unexpected end of tar file" + raise OSError(msg) + + name = s[:100].decode("utf-8") + i = name.find("\0") + if i == 0: + msg = "cannot find subfile" + raise OSError(msg) + if i > 0: + name = name[:i] + + size = int(s[124:135], 8) + + if file == name: + break + + self.fh.seek((size + 511) & (~511), io.SEEK_CUR) + + # Open region + super().__init__(self.fh, self.fh.tell(), size) diff --git a/venv/lib/python3.12/site-packages/PIL/TgaImagePlugin.py b/venv/lib/python3.12/site-packages/PIL/TgaImagePlugin.py new file mode 100644 index 0000000..90d5b5c --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/TgaImagePlugin.py @@ -0,0 +1,264 @@ +# +# The Python Imaging Library. +# $Id$ +# +# TGA file handling +# +# History: +# 95-09-01 fl created (reads 24-bit files only) +# 97-01-04 fl support more TGA versions, including compressed images +# 98-07-04 fl fixed orientation and alpha layer bugs +# 98-09-11 fl fixed orientation for runlength decoder +# +# Copyright (c) Secret Labs AB 1997-98. +# Copyright (c) Fredrik Lundh 1995-97. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import warnings +from typing import IO + +from . import Image, ImageFile, ImagePalette +from ._binary import i16le as i16 +from ._binary import o8 +from ._binary import o16le as o16 + +# +# -------------------------------------------------------------------- +# Read RGA file + + +MODES = { + # map imagetype/depth to rawmode + (1, 8): "P", + (3, 1): "1", + (3, 8): "L", + (3, 16): "LA", + (2, 16): "BGRA;15Z", + (2, 24): "BGR", + (2, 32): "BGRA", +} + + +## +# Image plugin for Targa files. + + +class TgaImageFile(ImageFile.ImageFile): + format = "TGA" + format_description = "Targa" + + def _open(self) -> None: + # process header + assert self.fp is not None + + s = self.fp.read(18) + + id_len = s[0] + + colormaptype = s[1] + imagetype = s[2] + + depth = s[16] + + flags = s[17] + + self._size = i16(s, 12), i16(s, 14) + + # validate header fields + if ( + colormaptype not in (0, 1) + or self.size[0] <= 0 + or self.size[1] <= 0 + or depth not in (1, 8, 16, 24, 32) + ): + msg = "not a TGA file" + raise SyntaxError(msg) + + # image mode + if imagetype in (3, 11): + self._mode = "L" + if depth == 1: + self._mode = "1" # ??? + elif depth == 16: + self._mode = "LA" + elif imagetype in (1, 9): + self._mode = "P" if colormaptype else "L" + elif imagetype in (2, 10): + self._mode = "RGB" if depth == 24 else "RGBA" + else: + msg = "unknown TGA mode" + raise SyntaxError(msg) + + # orientation + orientation = flags & 0x30 + self._flip_horizontally = orientation in [0x10, 0x30] + if orientation in [0x20, 0x30]: + orientation = 1 + elif orientation in [0, 0x10]: + orientation = -1 + else: + msg = "unknown TGA orientation" + raise SyntaxError(msg) + + self.info["orientation"] = orientation + + if imagetype & 8: + self.info["compression"] = "tga_rle" + + if id_len: + self.info["id_section"] = self.fp.read(id_len) + + if colormaptype: + # read palette + start, size, mapdepth = i16(s, 3), i16(s, 5), s[7] + if mapdepth == 16: + self.palette = ImagePalette.raw( + "BGRA;15Z", bytes(2 * start) + self.fp.read(2 * size) + ) + self.palette.mode = "RGBA" + elif mapdepth == 24: + self.palette = ImagePalette.raw( + "BGR", bytes(3 * start) + self.fp.read(3 * size) + ) + elif mapdepth == 32: + self.palette = ImagePalette.raw( + "BGRA", bytes(4 * start) + self.fp.read(4 * size) + ) + else: + msg = "unknown TGA map depth" + raise SyntaxError(msg) + + # setup tile descriptor + try: + rawmode = MODES[(imagetype & 7, depth)] + if imagetype & 8: + # compressed + self.tile = [ + ImageFile._Tile( + "tga_rle", + (0, 0) + self.size, + self.fp.tell(), + (rawmode, orientation, depth), + ) + ] + else: + self.tile = [ + ImageFile._Tile( + "raw", + (0, 0) + self.size, + self.fp.tell(), + (rawmode, 0, orientation), + ) + ] + except KeyError: + pass # cannot decode + + def load_end(self) -> None: + if self._flip_horizontally: + self.im = self.im.transpose(Image.Transpose.FLIP_LEFT_RIGHT) + + +# +# -------------------------------------------------------------------- +# Write TGA file + + +SAVE = { + "1": ("1", 1, 0, 3), + "L": ("L", 8, 0, 3), + "LA": ("LA", 16, 0, 3), + "P": ("P", 8, 1, 1), + "RGB": ("BGR", 24, 0, 2), + "RGBA": ("BGRA", 32, 0, 2), +} + + +def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + try: + rawmode, bits, colormaptype, imagetype = SAVE[im.mode] + except KeyError as e: + msg = f"cannot write mode {im.mode} as TGA" + raise OSError(msg) from e + + if "rle" in im.encoderinfo: + rle = im.encoderinfo["rle"] + else: + compression = im.encoderinfo.get("compression", im.info.get("compression")) + rle = compression == "tga_rle" + if rle: + imagetype += 8 + + id_section = im.encoderinfo.get("id_section", im.info.get("id_section", "")) + id_len = len(id_section) + if id_len > 255: + id_len = 255 + id_section = id_section[:255] + warnings.warn("id_section has been trimmed to 255 characters") + + if colormaptype: + palette = im.im.getpalette("RGB", "BGR") + colormaplength, colormapentry = len(palette) // 3, 24 + else: + colormaplength, colormapentry = 0, 0 + + if im.mode in ("LA", "RGBA"): + flags = 8 + else: + flags = 0 + + orientation = im.encoderinfo.get("orientation", im.info.get("orientation", -1)) + if orientation > 0: + flags = flags | 0x20 + + fp.write( + o8(id_len) + + o8(colormaptype) + + o8(imagetype) + + o16(0) # colormapfirst + + o16(colormaplength) + + o8(colormapentry) + + o16(0) + + o16(0) + + o16(im.size[0]) + + o16(im.size[1]) + + o8(bits) + + o8(flags) + ) + + if id_section: + fp.write(id_section) + + if colormaptype: + fp.write(palette) + + if rle: + ImageFile._save( + im, + fp, + [ImageFile._Tile("tga_rle", (0, 0) + im.size, 0, (rawmode, orientation))], + ) + else: + ImageFile._save( + im, + fp, + [ImageFile._Tile("raw", (0, 0) + im.size, 0, (rawmode, 0, orientation))], + ) + + # write targa version 2 footer + fp.write(b"\000" * 8 + b"TRUEVISION-XFILE." + b"\000") + + +# +# -------------------------------------------------------------------- +# Registry + + +Image.register_open(TgaImageFile.format, TgaImageFile) +Image.register_save(TgaImageFile.format, _save) + +Image.register_extensions(TgaImageFile.format, [".tga", ".icb", ".vda", ".vst"]) + +Image.register_mime(TgaImageFile.format, "image/x-tga") diff --git a/venv/lib/python3.12/site-packages/PIL/TiffImagePlugin.py b/venv/lib/python3.12/site-packages/PIL/TiffImagePlugin.py new file mode 100644 index 0000000..ff5a6f9 --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/TiffImagePlugin.py @@ -0,0 +1,2271 @@ +# +# The Python Imaging Library. +# $Id$ +# +# TIFF file handling +# +# TIFF is a flexible, if somewhat aged, image file format originally +# defined by Aldus. Although TIFF supports a wide variety of pixel +# layouts and compression methods, the name doesn't really stand for +# "thousands of incompatible file formats," it just feels that way. +# +# To read TIFF data from a stream, the stream must be seekable. For +# progressive decoding, make sure to use TIFF files where the tag +# directory is placed first in the file. +# +# History: +# 1995-09-01 fl Created +# 1996-05-04 fl Handle JPEGTABLES tag +# 1996-05-18 fl Fixed COLORMAP support +# 1997-01-05 fl Fixed PREDICTOR support +# 1997-08-27 fl Added support for rational tags (from Perry Stoll) +# 1998-01-10 fl Fixed seek/tell (from Jan Blom) +# 1998-07-15 fl Use private names for internal variables +# 1999-06-13 fl Rewritten for PIL 1.0 (1.0) +# 2000-10-11 fl Additional fixes for Python 2.0 (1.1) +# 2001-04-17 fl Fixed rewind support (seek to frame 0) (1.2) +# 2001-05-12 fl Added write support for more tags (from Greg Couch) (1.3) +# 2001-12-18 fl Added workaround for broken Matrox library +# 2002-01-18 fl Don't mess up if photometric tag is missing (D. Alan Stewart) +# 2003-05-19 fl Check FILLORDER tag +# 2003-09-26 fl Added RGBa support +# 2004-02-24 fl Added DPI support; fixed rational write support +# 2005-02-07 fl Added workaround for broken Corel Draw 10 files +# 2006-01-09 fl Added support for float/double tags (from Russell Nelson) +# +# Copyright (c) 1997-2006 by Secret Labs AB. All rights reserved. +# Copyright (c) 1995-1997 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import io +import itertools +import logging +import math +import os +import struct +import warnings +from collections.abc import Iterator, MutableMapping +from fractions import Fraction +from numbers import Number, Rational +from typing import IO, TYPE_CHECKING, Any, Callable, NoReturn, cast + +from . import ExifTags, Image, ImageFile, ImageOps, ImagePalette, TiffTags +from ._binary import i16be as i16 +from ._binary import i32be as i32 +from ._binary import o8 +from ._deprecate import deprecate +from ._typing import StrOrBytesPath +from ._util import is_path +from .TiffTags import TYPES + +if TYPE_CHECKING: + from ._typing import Buffer, IntegralLike + +logger = logging.getLogger(__name__) + +# Set these to true to force use of libtiff for reading or writing. +READ_LIBTIFF = False +WRITE_LIBTIFF = False +STRIP_SIZE = 65536 + +II = b"II" # little-endian (Intel style) +MM = b"MM" # big-endian (Motorola style) + +# +# -------------------------------------------------------------------- +# Read TIFF files + +# a few tag names, just to make the code below a bit more readable +OSUBFILETYPE = 255 +IMAGEWIDTH = 256 +IMAGELENGTH = 257 +BITSPERSAMPLE = 258 +COMPRESSION = 259 +PHOTOMETRIC_INTERPRETATION = 262 +FILLORDER = 266 +IMAGEDESCRIPTION = 270 +STRIPOFFSETS = 273 +SAMPLESPERPIXEL = 277 +ROWSPERSTRIP = 278 +STRIPBYTECOUNTS = 279 +X_RESOLUTION = 282 +Y_RESOLUTION = 283 +PLANAR_CONFIGURATION = 284 +RESOLUTION_UNIT = 296 +TRANSFERFUNCTION = 301 +SOFTWARE = 305 +DATE_TIME = 306 +ARTIST = 315 +PREDICTOR = 317 +COLORMAP = 320 +TILEWIDTH = 322 +TILELENGTH = 323 +TILEOFFSETS = 324 +TILEBYTECOUNTS = 325 +SUBIFD = 330 +EXTRASAMPLES = 338 +SAMPLEFORMAT = 339 +JPEGTABLES = 347 +YCBCRSUBSAMPLING = 530 +REFERENCEBLACKWHITE = 532 +COPYRIGHT = 33432 +IPTC_NAA_CHUNK = 33723 # newsphoto properties +PHOTOSHOP_CHUNK = 34377 # photoshop properties +ICCPROFILE = 34675 +EXIFIFD = 34665 +XMP = 700 +JPEGQUALITY = 65537 # pseudo-tag by libtiff + +# https://github.com/imagej/ImageJA/blob/master/src/main/java/ij/io/TiffDecoder.java +IMAGEJ_META_DATA_BYTE_COUNTS = 50838 +IMAGEJ_META_DATA = 50839 + +COMPRESSION_INFO = { + # Compression => pil compression name + 1: "raw", + 2: "tiff_ccitt", + 3: "group3", + 4: "group4", + 5: "tiff_lzw", + 6: "tiff_jpeg", # obsolete + 7: "jpeg", + 8: "tiff_adobe_deflate", + 32771: "tiff_raw_16", # 16-bit padding + 32773: "packbits", + 32809: "tiff_thunderscan", + 32946: "tiff_deflate", + 34676: "tiff_sgilog", + 34677: "tiff_sgilog24", + 34925: "lzma", + 50000: "zstd", + 50001: "webp", +} + +COMPRESSION_INFO_REV = {v: k for k, v in COMPRESSION_INFO.items()} + +OPEN_INFO = { + # (ByteOrder, PhotoInterpretation, SampleFormat, FillOrder, BitsPerSample, + # ExtraSamples) => mode, rawmode + (II, 0, (1,), 1, (1,), ()): ("1", "1;I"), + (MM, 0, (1,), 1, (1,), ()): ("1", "1;I"), + (II, 0, (1,), 2, (1,), ()): ("1", "1;IR"), + (MM, 0, (1,), 2, (1,), ()): ("1", "1;IR"), + (II, 1, (1,), 1, (1,), ()): ("1", "1"), + (MM, 1, (1,), 1, (1,), ()): ("1", "1"), + (II, 1, (1,), 2, (1,), ()): ("1", "1;R"), + (MM, 1, (1,), 2, (1,), ()): ("1", "1;R"), + (II, 0, (1,), 1, (2,), ()): ("L", "L;2I"), + (MM, 0, (1,), 1, (2,), ()): ("L", "L;2I"), + (II, 0, (1,), 2, (2,), ()): ("L", "L;2IR"), + (MM, 0, (1,), 2, (2,), ()): ("L", "L;2IR"), + (II, 1, (1,), 1, (2,), ()): ("L", "L;2"), + (MM, 1, (1,), 1, (2,), ()): ("L", "L;2"), + (II, 1, (1,), 2, (2,), ()): ("L", "L;2R"), + (MM, 1, (1,), 2, (2,), ()): ("L", "L;2R"), + (II, 0, (1,), 1, (4,), ()): ("L", "L;4I"), + (MM, 0, (1,), 1, (4,), ()): ("L", "L;4I"), + (II, 0, (1,), 2, (4,), ()): ("L", "L;4IR"), + (MM, 0, (1,), 2, (4,), ()): ("L", "L;4IR"), + (II, 1, (1,), 1, (4,), ()): ("L", "L;4"), + (MM, 1, (1,), 1, (4,), ()): ("L", "L;4"), + (II, 1, (1,), 2, (4,), ()): ("L", "L;4R"), + (MM, 1, (1,), 2, (4,), ()): ("L", "L;4R"), + (II, 0, (1,), 1, (8,), ()): ("L", "L;I"), + (MM, 0, (1,), 1, (8,), ()): ("L", "L;I"), + (II, 0, (1,), 2, (8,), ()): ("L", "L;IR"), + (MM, 0, (1,), 2, (8,), ()): ("L", "L;IR"), + (II, 1, (1,), 1, (8,), ()): ("L", "L"), + (MM, 1, (1,), 1, (8,), ()): ("L", "L"), + (II, 1, (2,), 1, (8,), ()): ("L", "L"), + (MM, 1, (2,), 1, (8,), ()): ("L", "L"), + (II, 1, (1,), 2, (8,), ()): ("L", "L;R"), + (MM, 1, (1,), 2, (8,), ()): ("L", "L;R"), + (II, 1, (1,), 1, (12,), ()): ("I;16", "I;12"), + (II, 0, (1,), 1, (16,), ()): ("I;16", "I;16"), + (II, 1, (1,), 1, (16,), ()): ("I;16", "I;16"), + (MM, 1, (1,), 1, (16,), ()): ("I;16B", "I;16B"), + (II, 1, (1,), 2, (16,), ()): ("I;16", "I;16R"), + (II, 1, (2,), 1, (16,), ()): ("I", "I;16S"), + (MM, 1, (2,), 1, (16,), ()): ("I", "I;16BS"), + (II, 0, (3,), 1, (32,), ()): ("F", "F;32F"), + (MM, 0, (3,), 1, (32,), ()): ("F", "F;32BF"), + (II, 1, (1,), 1, (32,), ()): ("I", "I;32N"), + (II, 1, (2,), 1, (32,), ()): ("I", "I;32S"), + (MM, 1, (2,), 1, (32,), ()): ("I", "I;32BS"), + (II, 1, (3,), 1, (32,), ()): ("F", "F;32F"), + (MM, 1, (3,), 1, (32,), ()): ("F", "F;32BF"), + (II, 1, (1,), 1, (8, 8), (2,)): ("LA", "LA"), + (MM, 1, (1,), 1, (8, 8), (2,)): ("LA", "LA"), + (II, 2, (1,), 1, (8, 8, 8), ()): ("RGB", "RGB"), + (MM, 2, (1,), 1, (8, 8, 8), ()): ("RGB", "RGB"), + (II, 2, (1,), 2, (8, 8, 8), ()): ("RGB", "RGB;R"), + (MM, 2, (1,), 2, (8, 8, 8), ()): ("RGB", "RGB;R"), + (II, 2, (1,), 1, (8, 8, 8, 8), ()): ("RGBA", "RGBA"), # missing ExtraSamples + (MM, 2, (1,), 1, (8, 8, 8, 8), ()): ("RGBA", "RGBA"), # missing ExtraSamples + (II, 2, (1,), 1, (8, 8, 8, 8), (0,)): ("RGB", "RGBX"), + (MM, 2, (1,), 1, (8, 8, 8, 8), (0,)): ("RGB", "RGBX"), + (II, 2, (1,), 1, (8, 8, 8, 8, 8), (0, 0)): ("RGB", "RGBXX"), + (MM, 2, (1,), 1, (8, 8, 8, 8, 8), (0, 0)): ("RGB", "RGBXX"), + (II, 2, (1,), 1, (8, 8, 8, 8, 8, 8), (0, 0, 0)): ("RGB", "RGBXXX"), + (MM, 2, (1,), 1, (8, 8, 8, 8, 8, 8), (0, 0, 0)): ("RGB", "RGBXXX"), + (II, 2, (1,), 1, (8, 8, 8, 8), (1,)): ("RGBA", "RGBa"), + (MM, 2, (1,), 1, (8, 8, 8, 8), (1,)): ("RGBA", "RGBa"), + (II, 2, (1,), 1, (8, 8, 8, 8, 8), (1, 0)): ("RGBA", "RGBaX"), + (MM, 2, (1,), 1, (8, 8, 8, 8, 8), (1, 0)): ("RGBA", "RGBaX"), + (II, 2, (1,), 1, (8, 8, 8, 8, 8, 8), (1, 0, 0)): ("RGBA", "RGBaXX"), + (MM, 2, (1,), 1, (8, 8, 8, 8, 8, 8), (1, 0, 0)): ("RGBA", "RGBaXX"), + (II, 2, (1,), 1, (8, 8, 8, 8), (2,)): ("RGBA", "RGBA"), + (MM, 2, (1,), 1, (8, 8, 8, 8), (2,)): ("RGBA", "RGBA"), + (II, 2, (1,), 1, (8, 8, 8, 8, 8), (2, 0)): ("RGBA", "RGBAX"), + (MM, 2, (1,), 1, (8, 8, 8, 8, 8), (2, 0)): ("RGBA", "RGBAX"), + (II, 2, (1,), 1, (8, 8, 8, 8, 8, 8), (2, 0, 0)): ("RGBA", "RGBAXX"), + (MM, 2, (1,), 1, (8, 8, 8, 8, 8, 8), (2, 0, 0)): ("RGBA", "RGBAXX"), + (II, 2, (1,), 1, (8, 8, 8, 8), (999,)): ("RGBA", "RGBA"), # Corel Draw 10 + (MM, 2, (1,), 1, (8, 8, 8, 8), (999,)): ("RGBA", "RGBA"), # Corel Draw 10 + (II, 2, (1,), 1, (16, 16, 16), ()): ("RGB", "RGB;16L"), + (MM, 2, (1,), 1, (16, 16, 16), ()): ("RGB", "RGB;16B"), + (II, 2, (1,), 1, (16, 16, 16, 16), ()): ("RGBA", "RGBA;16L"), + (MM, 2, (1,), 1, (16, 16, 16, 16), ()): ("RGBA", "RGBA;16B"), + (II, 2, (1,), 1, (16, 16, 16, 16), (0,)): ("RGB", "RGBX;16L"), + (MM, 2, (1,), 1, (16, 16, 16, 16), (0,)): ("RGB", "RGBX;16B"), + (II, 2, (1,), 1, (16, 16, 16, 16), (1,)): ("RGBA", "RGBa;16L"), + (MM, 2, (1,), 1, (16, 16, 16, 16), (1,)): ("RGBA", "RGBa;16B"), + (II, 2, (1,), 1, (16, 16, 16, 16), (2,)): ("RGBA", "RGBA;16L"), + (MM, 2, (1,), 1, (16, 16, 16, 16), (2,)): ("RGBA", "RGBA;16B"), + (II, 3, (1,), 1, (1,), ()): ("P", "P;1"), + (MM, 3, (1,), 1, (1,), ()): ("P", "P;1"), + (II, 3, (1,), 2, (1,), ()): ("P", "P;1R"), + (MM, 3, (1,), 2, (1,), ()): ("P", "P;1R"), + (II, 3, (1,), 1, (2,), ()): ("P", "P;2"), + (MM, 3, (1,), 1, (2,), ()): ("P", "P;2"), + (II, 3, (1,), 2, (2,), ()): ("P", "P;2R"), + (MM, 3, (1,), 2, (2,), ()): ("P", "P;2R"), + (II, 3, (1,), 1, (4,), ()): ("P", "P;4"), + (MM, 3, (1,), 1, (4,), ()): ("P", "P;4"), + (II, 3, (1,), 2, (4,), ()): ("P", "P;4R"), + (MM, 3, (1,), 2, (4,), ()): ("P", "P;4R"), + (II, 3, (1,), 1, (8,), ()): ("P", "P"), + (MM, 3, (1,), 1, (8,), ()): ("P", "P"), + (II, 3, (1,), 1, (8, 8), (0,)): ("P", "PX"), + (II, 3, (1,), 1, (8, 8), (2,)): ("PA", "PA"), + (MM, 3, (1,), 1, (8, 8), (2,)): ("PA", "PA"), + (II, 3, (1,), 2, (8,), ()): ("P", "P;R"), + (MM, 3, (1,), 2, (8,), ()): ("P", "P;R"), + (II, 5, (1,), 1, (8, 8, 8, 8), ()): ("CMYK", "CMYK"), + (MM, 5, (1,), 1, (8, 8, 8, 8), ()): ("CMYK", "CMYK"), + (II, 5, (1,), 1, (8, 8, 8, 8, 8), (0,)): ("CMYK", "CMYKX"), + (MM, 5, (1,), 1, (8, 8, 8, 8, 8), (0,)): ("CMYK", "CMYKX"), + (II, 5, (1,), 1, (8, 8, 8, 8, 8, 8), (0, 0)): ("CMYK", "CMYKXX"), + (MM, 5, (1,), 1, (8, 8, 8, 8, 8, 8), (0, 0)): ("CMYK", "CMYKXX"), + (II, 5, (1,), 1, (16, 16, 16, 16), ()): ("CMYK", "CMYK;16L"), + (MM, 5, (1,), 1, (16, 16, 16, 16), ()): ("CMYK", "CMYK;16B"), + (II, 6, (1,), 1, (8,), ()): ("L", "L"), + (MM, 6, (1,), 1, (8,), ()): ("L", "L"), + # JPEG compressed images handled by LibTiff and auto-converted to RGBX + # Minimal Baseline TIFF requires YCbCr images to have 3 SamplesPerPixel + (II, 6, (1,), 1, (8, 8, 8), ()): ("RGB", "RGBX"), + (MM, 6, (1,), 1, (8, 8, 8), ()): ("RGB", "RGBX"), + (II, 8, (1,), 1, (8, 8, 8), ()): ("LAB", "LAB"), + (MM, 8, (1,), 1, (8, 8, 8), ()): ("LAB", "LAB"), +} + +MAX_SAMPLESPERPIXEL = max(len(key_tp[4]) for key_tp in OPEN_INFO) + +PREFIXES = [ + b"MM\x00\x2A", # Valid TIFF header with big-endian byte order + b"II\x2A\x00", # Valid TIFF header with little-endian byte order + b"MM\x2A\x00", # Invalid TIFF header, assume big-endian + b"II\x00\x2A", # Invalid TIFF header, assume little-endian + b"MM\x00\x2B", # BigTIFF with big-endian byte order + b"II\x2B\x00", # BigTIFF with little-endian byte order +] + +if not getattr(Image.core, "libtiff_support_custom_tags", True): + deprecate("Support for LibTIFF earlier than version 4", 12) + + +def _accept(prefix: bytes) -> bool: + return prefix[:4] in PREFIXES + + +def _limit_rational( + val: float | Fraction | IFDRational, max_val: int +) -> tuple[IntegralLike, IntegralLike]: + inv = abs(float(val)) > 1 + n_d = IFDRational(1 / val if inv else val).limit_rational(max_val) + return n_d[::-1] if inv else n_d + + +def _limit_signed_rational( + val: IFDRational, max_val: int, min_val: int +) -> tuple[IntegralLike, IntegralLike]: + frac = Fraction(val) + n_d: tuple[IntegralLike, IntegralLike] = frac.numerator, frac.denominator + + if min(float(i) for i in n_d) < min_val: + n_d = _limit_rational(val, abs(min_val)) + + n_d_float = tuple(float(i) for i in n_d) + if max(n_d_float) > max_val: + n_d = _limit_rational(n_d_float[0] / n_d_float[1], max_val) + + return n_d + + +## +# Wrapper for TIFF IFDs. + +_load_dispatch = {} +_write_dispatch = {} + + +def _delegate(op: str) -> Any: + def delegate( + self: IFDRational, *args: tuple[float, ...] + ) -> bool | float | Fraction: + return getattr(self._val, op)(*args) + + return delegate + + +class IFDRational(Rational): + """Implements a rational class where 0/0 is a legal value to match + the in the wild use of exif rationals. + + e.g., DigitalZoomRatio - 0.00/0.00 indicates that no digital zoom was used + """ + + """ If the denominator is 0, store this as a float('nan'), otherwise store + as a fractions.Fraction(). Delegate as appropriate + + """ + + __slots__ = ("_numerator", "_denominator", "_val") + + def __init__( + self, value: float | Fraction | IFDRational, denominator: int = 1 + ) -> None: + """ + :param value: either an integer numerator, a + float/rational/other number, or an IFDRational + :param denominator: Optional integer denominator + """ + self._val: Fraction | float + if isinstance(value, IFDRational): + self._numerator = value.numerator + self._denominator = value.denominator + self._val = value._val + return + + if isinstance(value, Fraction): + self._numerator = value.numerator + self._denominator = value.denominator + else: + if TYPE_CHECKING: + self._numerator = cast(IntegralLike, value) + else: + self._numerator = value + self._denominator = denominator + + if denominator == 0: + self._val = float("nan") + elif denominator == 1: + self._val = Fraction(value) + elif int(value) == value: + self._val = Fraction(int(value), denominator) + else: + self._val = Fraction(value / denominator) + + @property + def numerator(self) -> IntegralLike: + return self._numerator + + @property + def denominator(self) -> int: + return self._denominator + + def limit_rational(self, max_denominator: int) -> tuple[IntegralLike, int]: + """ + + :param max_denominator: Integer, the maximum denominator value + :returns: Tuple of (numerator, denominator) + """ + + if self.denominator == 0: + return self.numerator, self.denominator + + assert isinstance(self._val, Fraction) + f = self._val.limit_denominator(max_denominator) + return f.numerator, f.denominator + + def __repr__(self) -> str: + return str(float(self._val)) + + def __hash__(self) -> int: + return self._val.__hash__() + + def __eq__(self, other: object) -> bool: + val = self._val + if isinstance(other, IFDRational): + other = other._val + if isinstance(other, float): + val = float(val) + return val == other + + def __getstate__(self) -> list[float | Fraction | IntegralLike]: + return [self._val, self._numerator, self._denominator] + + def __setstate__(self, state: list[float | Fraction | IntegralLike]) -> None: + IFDRational.__init__(self, 0) + _val, _numerator, _denominator = state + assert isinstance(_val, (float, Fraction)) + self._val = _val + if TYPE_CHECKING: + self._numerator = cast(IntegralLike, _numerator) + else: + self._numerator = _numerator + assert isinstance(_denominator, int) + self._denominator = _denominator + + """ a = ['add','radd', 'sub', 'rsub', 'mul', 'rmul', + 'truediv', 'rtruediv', 'floordiv', 'rfloordiv', + 'mod','rmod', 'pow','rpow', 'pos', 'neg', + 'abs', 'trunc', 'lt', 'gt', 'le', 'ge', 'bool', + 'ceil', 'floor', 'round'] + print("\n".join("__%s__ = _delegate('__%s__')" % (s,s) for s in a)) + """ + + __add__ = _delegate("__add__") + __radd__ = _delegate("__radd__") + __sub__ = _delegate("__sub__") + __rsub__ = _delegate("__rsub__") + __mul__ = _delegate("__mul__") + __rmul__ = _delegate("__rmul__") + __truediv__ = _delegate("__truediv__") + __rtruediv__ = _delegate("__rtruediv__") + __floordiv__ = _delegate("__floordiv__") + __rfloordiv__ = _delegate("__rfloordiv__") + __mod__ = _delegate("__mod__") + __rmod__ = _delegate("__rmod__") + __pow__ = _delegate("__pow__") + __rpow__ = _delegate("__rpow__") + __pos__ = _delegate("__pos__") + __neg__ = _delegate("__neg__") + __abs__ = _delegate("__abs__") + __trunc__ = _delegate("__trunc__") + __lt__ = _delegate("__lt__") + __gt__ = _delegate("__gt__") + __le__ = _delegate("__le__") + __ge__ = _delegate("__ge__") + __bool__ = _delegate("__bool__") + __ceil__ = _delegate("__ceil__") + __floor__ = _delegate("__floor__") + __round__ = _delegate("__round__") + # Python >= 3.11 + if hasattr(Fraction, "__int__"): + __int__ = _delegate("__int__") + + +_LoaderFunc = Callable[["ImageFileDirectory_v2", bytes, bool], Any] + + +def _register_loader(idx: int, size: int) -> Callable[[_LoaderFunc], _LoaderFunc]: + def decorator(func: _LoaderFunc) -> _LoaderFunc: + from .TiffTags import TYPES + + if func.__name__.startswith("load_"): + TYPES[idx] = func.__name__[5:].replace("_", " ") + _load_dispatch[idx] = size, func # noqa: F821 + return func + + return decorator + + +def _register_writer(idx: int) -> Callable[[Callable[..., Any]], Callable[..., Any]]: + def decorator(func: Callable[..., Any]) -> Callable[..., Any]: + _write_dispatch[idx] = func # noqa: F821 + return func + + return decorator + + +def _register_basic(idx_fmt_name: tuple[int, str, str]) -> None: + from .TiffTags import TYPES + + idx, fmt, name = idx_fmt_name + TYPES[idx] = name + size = struct.calcsize(f"={fmt}") + + def basic_handler( + self: ImageFileDirectory_v2, data: bytes, legacy_api: bool = True + ) -> tuple[Any, ...]: + return self._unpack(f"{len(data) // size}{fmt}", data) + + _load_dispatch[idx] = size, basic_handler # noqa: F821 + _write_dispatch[idx] = lambda self, *values: ( # noqa: F821 + b"".join(self._pack(fmt, value) for value in values) + ) + + +if TYPE_CHECKING: + _IFDv2Base = MutableMapping[int, Any] +else: + _IFDv2Base = MutableMapping + + +class ImageFileDirectory_v2(_IFDv2Base): + """This class represents a TIFF tag directory. To speed things up, we + don't decode tags unless they're asked for. + + Exposes a dictionary interface of the tags in the directory:: + + ifd = ImageFileDirectory_v2() + ifd[key] = 'Some Data' + ifd.tagtype[key] = TiffTags.ASCII + print(ifd[key]) + 'Some Data' + + Individual values are returned as the strings or numbers, sequences are + returned as tuples of the values. + + The tiff metadata type of each item is stored in a dictionary of + tag types in + :attr:`~PIL.TiffImagePlugin.ImageFileDirectory_v2.tagtype`. The types + are read from a tiff file, guessed from the type added, or added + manually. + + Data Structures: + + * ``self.tagtype = {}`` + + * Key: numerical TIFF tag number + * Value: integer corresponding to the data type from + :py:data:`.TiffTags.TYPES` + + .. versionadded:: 3.0.0 + + 'Internal' data structures: + + * ``self._tags_v2 = {}`` + + * Key: numerical TIFF tag number + * Value: decoded data, as tuple for multiple values + + * ``self._tagdata = {}`` + + * Key: numerical TIFF tag number + * Value: undecoded byte string from file + + * ``self._tags_v1 = {}`` + + * Key: numerical TIFF tag number + * Value: decoded data in the v1 format + + Tags will be found in the private attributes ``self._tagdata``, and in + ``self._tags_v2`` once decoded. + + ``self.legacy_api`` is a value for internal use, and shouldn't be changed + from outside code. In cooperation with + :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1`, if ``legacy_api`` + is true, then decoded tags will be populated into both ``_tags_v1`` and + ``_tags_v2``. ``_tags_v2`` will be used if this IFD is used in the TIFF + save routine. Tags should be read from ``_tags_v1`` if + ``legacy_api == true``. + + """ + + _load_dispatch: dict[int, tuple[int, _LoaderFunc]] = {} + _write_dispatch: dict[int, Callable[..., Any]] = {} + + def __init__( + self, + ifh: bytes = b"II\052\0\0\0\0\0", + prefix: bytes | None = None, + group: int | None = None, + ) -> None: + """Initialize an ImageFileDirectory. + + To construct an ImageFileDirectory from a real file, pass the 8-byte + magic header to the constructor. To only set the endianness, pass it + as the 'prefix' keyword argument. + + :param ifh: One of the accepted magic headers (cf. PREFIXES); also sets + endianness. + :param prefix: Override the endianness of the file. + """ + if not _accept(ifh): + msg = f"not a TIFF file (header {repr(ifh)} not valid)" + raise SyntaxError(msg) + self._prefix = prefix if prefix is not None else ifh[:2] + if self._prefix == MM: + self._endian = ">" + elif self._prefix == II: + self._endian = "<" + else: + msg = "not a TIFF IFD" + raise SyntaxError(msg) + self._bigtiff = ifh[2] == 43 + self.group = group + self.tagtype: dict[int, int] = {} + """ Dictionary of tag types """ + self.reset() + self.next = ( + self._unpack("Q", ifh[8:])[0] + if self._bigtiff + else self._unpack("L", ifh[4:])[0] + ) + self._legacy_api = False + + prefix = property(lambda self: self._prefix) + offset = property(lambda self: self._offset) + + @property + def legacy_api(self) -> bool: + return self._legacy_api + + @legacy_api.setter + def legacy_api(self, value: bool) -> NoReturn: + msg = "Not allowing setting of legacy api" + raise Exception(msg) + + def reset(self) -> None: + self._tags_v1: dict[int, Any] = {} # will remain empty if legacy_api is false + self._tags_v2: dict[int, Any] = {} # main tag storage + self._tagdata: dict[int, bytes] = {} + self.tagtype = {} # added 2008-06-05 by Florian Hoech + self._next = None + self._offset: int | None = None + + def __str__(self) -> str: + return str(dict(self)) + + def named(self) -> dict[str, Any]: + """ + :returns: dict of name|key: value + + Returns the complete tag dictionary, with named tags where possible. + """ + return { + TiffTags.lookup(code, self.group).name: value + for code, value in self.items() + } + + def __len__(self) -> int: + return len(set(self._tagdata) | set(self._tags_v2)) + + def __getitem__(self, tag: int) -> Any: + if tag not in self._tags_v2: # unpack on the fly + data = self._tagdata[tag] + typ = self.tagtype[tag] + size, handler = self._load_dispatch[typ] + self[tag] = handler(self, data, self.legacy_api) # check type + val = self._tags_v2[tag] + if self.legacy_api and not isinstance(val, (tuple, bytes)): + val = (val,) + return val + + def __contains__(self, tag: object) -> bool: + return tag in self._tags_v2 or tag in self._tagdata + + def __setitem__(self, tag: int, value: Any) -> None: + self._setitem(tag, value, self.legacy_api) + + def _setitem(self, tag: int, value: Any, legacy_api: bool) -> None: + basetypes = (Number, bytes, str) + + info = TiffTags.lookup(tag, self.group) + values = [value] if isinstance(value, basetypes) else value + + if tag not in self.tagtype: + if info.type: + self.tagtype[tag] = info.type + else: + self.tagtype[tag] = TiffTags.UNDEFINED + if all(isinstance(v, IFDRational) for v in values): + self.tagtype[tag] = ( + TiffTags.RATIONAL + if all(v >= 0 for v in values) + else TiffTags.SIGNED_RATIONAL + ) + elif all(isinstance(v, int) for v in values): + if all(0 <= v < 2**16 for v in values): + self.tagtype[tag] = TiffTags.SHORT + elif all(-(2**15) < v < 2**15 for v in values): + self.tagtype[tag] = TiffTags.SIGNED_SHORT + else: + self.tagtype[tag] = ( + TiffTags.LONG + if all(v >= 0 for v in values) + else TiffTags.SIGNED_LONG + ) + elif all(isinstance(v, float) for v in values): + self.tagtype[tag] = TiffTags.DOUBLE + elif all(isinstance(v, str) for v in values): + self.tagtype[tag] = TiffTags.ASCII + elif all(isinstance(v, bytes) for v in values): + self.tagtype[tag] = TiffTags.BYTE + + if self.tagtype[tag] == TiffTags.UNDEFINED: + values = [ + v.encode("ascii", "replace") if isinstance(v, str) else v + for v in values + ] + elif self.tagtype[tag] == TiffTags.RATIONAL: + values = [float(v) if isinstance(v, int) else v for v in values] + + is_ifd = self.tagtype[tag] == TiffTags.LONG and isinstance(values, dict) + if not is_ifd: + values = tuple(info.cvt_enum(value) for value in values) + + dest = self._tags_v1 if legacy_api else self._tags_v2 + + # Three branches: + # Spec'd length == 1, Actual length 1, store as element + # Spec'd length == 1, Actual > 1, Warn and truncate. Formerly barfed. + # No Spec, Actual length 1, Formerly (<4.2) returned a 1 element tuple. + # Don't mess with the legacy api, since it's frozen. + if not is_ifd and ( + (info.length == 1) + or self.tagtype[tag] == TiffTags.BYTE + or (info.length is None and len(values) == 1 and not legacy_api) + ): + # Don't mess with the legacy api, since it's frozen. + if legacy_api and self.tagtype[tag] in [ + TiffTags.RATIONAL, + TiffTags.SIGNED_RATIONAL, + ]: # rationals + values = (values,) + try: + (dest[tag],) = values + except ValueError: + # We've got a builtin tag with 1 expected entry + warnings.warn( + f"Metadata Warning, tag {tag} had too many entries: " + f"{len(values)}, expected 1" + ) + dest[tag] = values[0] + + else: + # Spec'd length > 1 or undefined + # Unspec'd, and length > 1 + dest[tag] = values + + def __delitem__(self, tag: int) -> None: + self._tags_v2.pop(tag, None) + self._tags_v1.pop(tag, None) + self._tagdata.pop(tag, None) + + def __iter__(self) -> Iterator[int]: + return iter(set(self._tagdata) | set(self._tags_v2)) + + def _unpack(self, fmt: str, data: bytes) -> tuple[Any, ...]: + return struct.unpack(self._endian + fmt, data) + + def _pack(self, fmt: str, *values: Any) -> bytes: + return struct.pack(self._endian + fmt, *values) + + list( + map( + _register_basic, + [ + (TiffTags.SHORT, "H", "short"), + (TiffTags.LONG, "L", "long"), + (TiffTags.SIGNED_BYTE, "b", "signed byte"), + (TiffTags.SIGNED_SHORT, "h", "signed short"), + (TiffTags.SIGNED_LONG, "l", "signed long"), + (TiffTags.FLOAT, "f", "float"), + (TiffTags.DOUBLE, "d", "double"), + (TiffTags.IFD, "L", "long"), + (TiffTags.LONG8, "Q", "long8"), + ], + ) + ) + + @_register_loader(1, 1) # Basic type, except for the legacy API. + def load_byte(self, data: bytes, legacy_api: bool = True) -> bytes: + return data + + @_register_writer(1) # Basic type, except for the legacy API. + def write_byte(self, data: bytes | int | IFDRational) -> bytes: + if isinstance(data, IFDRational): + data = int(data) + if isinstance(data, int): + data = bytes((data,)) + return data + + @_register_loader(2, 1) + def load_string(self, data: bytes, legacy_api: bool = True) -> str: + if data.endswith(b"\0"): + data = data[:-1] + return data.decode("latin-1", "replace") + + @_register_writer(2) + def write_string(self, value: str | bytes | int) -> bytes: + # remerge of https://github.com/python-pillow/Pillow/pull/1416 + if isinstance(value, int): + value = str(value) + if not isinstance(value, bytes): + value = value.encode("ascii", "replace") + return value + b"\0" + + @_register_loader(5, 8) + def load_rational( + self, data: bytes, legacy_api: bool = True + ) -> tuple[tuple[int, int] | IFDRational, ...]: + vals = self._unpack(f"{len(data) // 4}L", data) + + def combine(a: int, b: int) -> tuple[int, int] | IFDRational: + return (a, b) if legacy_api else IFDRational(a, b) + + return tuple(combine(num, denom) for num, denom in zip(vals[::2], vals[1::2])) + + @_register_writer(5) + def write_rational(self, *values: IFDRational) -> bytes: + return b"".join( + self._pack("2L", *_limit_rational(frac, 2**32 - 1)) for frac in values + ) + + @_register_loader(7, 1) + def load_undefined(self, data: bytes, legacy_api: bool = True) -> bytes: + return data + + @_register_writer(7) + def write_undefined(self, value: bytes | int | IFDRational) -> bytes: + if isinstance(value, IFDRational): + value = int(value) + if isinstance(value, int): + value = str(value).encode("ascii", "replace") + return value + + @_register_loader(10, 8) + def load_signed_rational( + self, data: bytes, legacy_api: bool = True + ) -> tuple[tuple[int, int] | IFDRational, ...]: + vals = self._unpack(f"{len(data) // 4}l", data) + + def combine(a: int, b: int) -> tuple[int, int] | IFDRational: + return (a, b) if legacy_api else IFDRational(a, b) + + return tuple(combine(num, denom) for num, denom in zip(vals[::2], vals[1::2])) + + @_register_writer(10) + def write_signed_rational(self, *values: IFDRational) -> bytes: + return b"".join( + self._pack("2l", *_limit_signed_rational(frac, 2**31 - 1, -(2**31))) + for frac in values + ) + + def _ensure_read(self, fp: IO[bytes], size: int) -> bytes: + ret = fp.read(size) + if len(ret) != size: + msg = ( + "Corrupt EXIF data. " + f"Expecting to read {size} bytes but only got {len(ret)}. " + ) + raise OSError(msg) + return ret + + def load(self, fp: IO[bytes]) -> None: + self.reset() + self._offset = fp.tell() + + try: + tag_count = ( + self._unpack("Q", self._ensure_read(fp, 8)) + if self._bigtiff + else self._unpack("H", self._ensure_read(fp, 2)) + )[0] + for i in range(tag_count): + tag, typ, count, data = ( + self._unpack("HHQ8s", self._ensure_read(fp, 20)) + if self._bigtiff + else self._unpack("HHL4s", self._ensure_read(fp, 12)) + ) + + tagname = TiffTags.lookup(tag, self.group).name + typname = TYPES.get(typ, "unknown") + msg = f"tag: {tagname} ({tag}) - type: {typname} ({typ})" + + try: + unit_size, handler = self._load_dispatch[typ] + except KeyError: + logger.debug("%s - unsupported type %s", msg, typ) + continue # ignore unsupported type + size = count * unit_size + if size > (8 if self._bigtiff else 4): + here = fp.tell() + (offset,) = self._unpack("Q" if self._bigtiff else "L", data) + msg += f" Tag Location: {here} - Data Location: {offset}" + fp.seek(offset) + data = ImageFile._safe_read(fp, size) + fp.seek(here) + else: + data = data[:size] + + if len(data) != size: + warnings.warn( + "Possibly corrupt EXIF data. " + f"Expecting to read {size} bytes but only got {len(data)}." + f" Skipping tag {tag}" + ) + logger.debug(msg) + continue + + if not data: + logger.debug(msg) + continue + + self._tagdata[tag] = data + self.tagtype[tag] = typ + + msg += " - value: " + ( + "" % size if size > 32 else repr(data) + ) + logger.debug(msg) + + (self.next,) = ( + self._unpack("Q", self._ensure_read(fp, 8)) + if self._bigtiff + else self._unpack("L", self._ensure_read(fp, 4)) + ) + except OSError as msg: + warnings.warn(str(msg)) + return + + def tobytes(self, offset: int = 0) -> bytes: + # FIXME What about tagdata? + result = self._pack("H", len(self._tags_v2)) + + entries: list[tuple[int, int, int, bytes, bytes]] = [] + offset = offset + len(result) + len(self._tags_v2) * 12 + 4 + stripoffsets = None + + # pass 1: convert tags to binary format + # always write tags in ascending order + for tag, value in sorted(self._tags_v2.items()): + if tag == STRIPOFFSETS: + stripoffsets = len(entries) + typ = self.tagtype[tag] + logger.debug("Tag %s, Type: %s, Value: %s", tag, typ, repr(value)) + is_ifd = typ == TiffTags.LONG and isinstance(value, dict) + if is_ifd: + if self._endian == "<": + ifh = b"II\x2A\x00\x08\x00\x00\x00" + else: + ifh = b"MM\x00\x2A\x00\x00\x00\x08" + ifd = ImageFileDirectory_v2(ifh, group=tag) + values = self._tags_v2[tag] + for ifd_tag, ifd_value in values.items(): + ifd[ifd_tag] = ifd_value + data = ifd.tobytes(offset) + else: + values = value if isinstance(value, tuple) else (value,) + data = self._write_dispatch[typ](self, *values) + + tagname = TiffTags.lookup(tag, self.group).name + typname = "ifd" if is_ifd else TYPES.get(typ, "unknown") + msg = f"save: {tagname} ({tag}) - type: {typname} ({typ})" + msg += " - value: " + ( + "" % len(data) if len(data) >= 16 else str(values) + ) + logger.debug(msg) + + # count is sum of lengths for string and arbitrary data + if is_ifd: + count = 1 + elif typ in [TiffTags.BYTE, TiffTags.ASCII, TiffTags.UNDEFINED]: + count = len(data) + else: + count = len(values) + # figure out if data fits into the entry + if len(data) <= 4: + entries.append((tag, typ, count, data.ljust(4, b"\0"), b"")) + else: + entries.append((tag, typ, count, self._pack("L", offset), data)) + offset += (len(data) + 1) // 2 * 2 # pad to word + + # update strip offset data to point beyond auxiliary data + if stripoffsets is not None: + tag, typ, count, value, data = entries[stripoffsets] + if data: + size, handler = self._load_dispatch[typ] + values = [val + offset for val in handler(self, data, self.legacy_api)] + data = self._write_dispatch[typ](self, *values) + else: + value = self._pack("L", self._unpack("L", value)[0] + offset) + entries[stripoffsets] = tag, typ, count, value, data + + # pass 2: write entries to file + for tag, typ, count, value, data in entries: + logger.debug("%s %s %s %s %s", tag, typ, count, repr(value), repr(data)) + result += self._pack("HHL4s", tag, typ, count, value) + + # -- overwrite here for multi-page -- + result += b"\0\0\0\0" # end of entries + + # pass 3: write auxiliary data to file + for tag, typ, count, value, data in entries: + result += data + if len(data) & 1: + result += b"\0" + + return result + + def save(self, fp: IO[bytes]) -> int: + if fp.tell() == 0: # skip TIFF header on subsequent pages + # tiff header -- PIL always starts the first IFD at offset 8 + fp.write(self._prefix + self._pack("HL", 42, 8)) + + offset = fp.tell() + result = self.tobytes(offset) + fp.write(result) + return offset + len(result) + + +ImageFileDirectory_v2._load_dispatch = _load_dispatch +ImageFileDirectory_v2._write_dispatch = _write_dispatch +for idx, name in TYPES.items(): + name = name.replace(" ", "_") + setattr(ImageFileDirectory_v2, f"load_{name}", _load_dispatch[idx][1]) + setattr(ImageFileDirectory_v2, f"write_{name}", _write_dispatch[idx]) +del _load_dispatch, _write_dispatch, idx, name + + +# Legacy ImageFileDirectory support. +class ImageFileDirectory_v1(ImageFileDirectory_v2): + """This class represents the **legacy** interface to a TIFF tag directory. + + Exposes a dictionary interface of the tags in the directory:: + + ifd = ImageFileDirectory_v1() + ifd[key] = 'Some Data' + ifd.tagtype[key] = TiffTags.ASCII + print(ifd[key]) + ('Some Data',) + + Also contains a dictionary of tag types as read from the tiff image file, + :attr:`~PIL.TiffImagePlugin.ImageFileDirectory_v1.tagtype`. + + Values are returned as a tuple. + + .. deprecated:: 3.0.0 + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self._legacy_api = True + + tags = property(lambda self: self._tags_v1) + tagdata = property(lambda self: self._tagdata) + + # defined in ImageFileDirectory_v2 + tagtype: dict[int, int] + """Dictionary of tag types""" + + @classmethod + def from_v2(cls, original: ImageFileDirectory_v2) -> ImageFileDirectory_v1: + """Returns an + :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1` + instance with the same data as is contained in the original + :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v2` + instance. + + :returns: :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1` + + """ + + ifd = cls(prefix=original.prefix) + ifd._tagdata = original._tagdata + ifd.tagtype = original.tagtype + ifd.next = original.next # an indicator for multipage tiffs + return ifd + + def to_v2(self) -> ImageFileDirectory_v2: + """Returns an + :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v2` + instance with the same data as is contained in the original + :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1` + instance. + + :returns: :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v2` + + """ + + ifd = ImageFileDirectory_v2(prefix=self.prefix) + ifd._tagdata = dict(self._tagdata) + ifd.tagtype = dict(self.tagtype) + ifd._tags_v2 = dict(self._tags_v2) + return ifd + + def __contains__(self, tag: object) -> bool: + return tag in self._tags_v1 or tag in self._tagdata + + def __len__(self) -> int: + return len(set(self._tagdata) | set(self._tags_v1)) + + def __iter__(self) -> Iterator[int]: + return iter(set(self._tagdata) | set(self._tags_v1)) + + def __setitem__(self, tag: int, value: Any) -> None: + for legacy_api in (False, True): + self._setitem(tag, value, legacy_api) + + def __getitem__(self, tag: int) -> Any: + if tag not in self._tags_v1: # unpack on the fly + data = self._tagdata[tag] + typ = self.tagtype[tag] + size, handler = self._load_dispatch[typ] + for legacy in (False, True): + self._setitem(tag, handler(self, data, legacy), legacy) + val = self._tags_v1[tag] + if not isinstance(val, (tuple, bytes)): + val = (val,) + return val + + +# undone -- switch this pointer +ImageFileDirectory = ImageFileDirectory_v1 + + +## +# Image plugin for TIFF files. + + +class TiffImageFile(ImageFile.ImageFile): + format = "TIFF" + format_description = "Adobe TIFF" + _close_exclusive_fp_after_loading = False + + def __init__( + self, + fp: StrOrBytesPath | IO[bytes], + filename: str | bytes | None = None, + ) -> None: + self.tag_v2: ImageFileDirectory_v2 + """ Image file directory (tag dictionary) """ + + self.tag: ImageFileDirectory_v1 + """ Legacy tag entries """ + + super().__init__(fp, filename) + + def _open(self) -> None: + """Open the first image in a TIFF file""" + + # Header + ifh = self.fp.read(8) + if ifh[2] == 43: + ifh += self.fp.read(8) + + self.tag_v2 = ImageFileDirectory_v2(ifh) + + # setup frame pointers + self.__first = self.__next = self.tag_v2.next + self.__frame = -1 + self._fp = self.fp + self._frame_pos: list[int] = [] + self._n_frames: int | None = None + + logger.debug("*** TiffImageFile._open ***") + logger.debug("- __first: %s", self.__first) + logger.debug("- ifh: %s", repr(ifh)) # Use repr to avoid str(bytes) + + # and load the first frame + self._seek(0) + + @property + def n_frames(self) -> int: + current_n_frames = self._n_frames + if current_n_frames is None: + current = self.tell() + self._seek(len(self._frame_pos)) + while self._n_frames is None: + self._seek(self.tell() + 1) + self.seek(current) + assert self._n_frames is not None + return self._n_frames + + def seek(self, frame: int) -> None: + """Select a given frame as current image""" + if not self._seek_check(frame): + return + self._seek(frame) + if self._im is not None and ( + self.im.size != self._tile_size or self.im.mode != self.mode + ): + # The core image will no longer be used + self._im = None + + def _seek(self, frame: int) -> None: + self.fp = self._fp + + # reset buffered io handle in case fp + # was passed to libtiff, invalidating the buffer + self.fp.tell() + + while len(self._frame_pos) <= frame: + if not self.__next: + msg = "no more images in TIFF file" + raise EOFError(msg) + logger.debug( + "Seeking to frame %s, on frame %s, __next %s, location: %s", + frame, + self.__frame, + self.__next, + self.fp.tell(), + ) + if self.__next >= 2**63: + msg = "Unable to seek to frame" + raise ValueError(msg) + self.fp.seek(self.__next) + self._frame_pos.append(self.__next) + logger.debug("Loading tags, location: %s", self.fp.tell()) + self.tag_v2.load(self.fp) + if self.tag_v2.next in self._frame_pos: + # This IFD has already been processed + # Declare this to be the end of the image + self.__next = 0 + else: + self.__next = self.tag_v2.next + if self.__next == 0: + self._n_frames = frame + 1 + if len(self._frame_pos) == 1: + self.is_animated = self.__next != 0 + self.__frame += 1 + self.fp.seek(self._frame_pos[frame]) + self.tag_v2.load(self.fp) + if XMP in self.tag_v2: + self.info["xmp"] = self.tag_v2[XMP] + elif "xmp" in self.info: + del self.info["xmp"] + self._reload_exif() + # fill the legacy tag/ifd entries + self.tag = self.ifd = ImageFileDirectory_v1.from_v2(self.tag_v2) + self.__frame = frame + self._setup() + + def tell(self) -> int: + """Return the current frame number""" + return self.__frame + + def get_photoshop_blocks(self) -> dict[int, dict[str, bytes]]: + """ + Returns a dictionary of Photoshop "Image Resource Blocks". + The keys are the image resource ID. For more information, see + https://www.adobe.com/devnet-apps/photoshop/fileformatashtml/#50577409_pgfId-1037727 + + :returns: Photoshop "Image Resource Blocks" in a dictionary. + """ + blocks = {} + val = self.tag_v2.get(ExifTags.Base.ImageResources) + if val: + while val[:4] == b"8BIM": + id = i16(val[4:6]) + n = math.ceil((val[6] + 1) / 2) * 2 + size = i32(val[6 + n : 10 + n]) + data = val[10 + n : 10 + n + size] + blocks[id] = {"data": data} + + val = val[math.ceil((10 + n + size) / 2) * 2 :] + return blocks + + def load(self) -> Image.core.PixelAccess | None: + if self.tile and self.use_load_libtiff: + return self._load_libtiff() + return super().load() + + def load_prepare(self) -> None: + if self._im is None: + Image._decompression_bomb_check(self._tile_size) + self.im = Image.core.new(self.mode, self._tile_size) + ImageFile.ImageFile.load_prepare(self) + + def load_end(self) -> None: + # allow closing if we're on the first frame, there's no next + # This is the ImageFile.load path only, libtiff specific below. + if not self.is_animated: + self._close_exclusive_fp_after_loading = True + + # reset buffered io handle in case fp + # was passed to libtiff, invalidating the buffer + self.fp.tell() + + # load IFD data from fp before it is closed + exif = self.getexif() + for key in TiffTags.TAGS_V2_GROUPS: + if key not in exif: + continue + exif.get_ifd(key) + + ImageOps.exif_transpose(self, in_place=True) + if ExifTags.Base.Orientation in self.tag_v2: + del self.tag_v2[ExifTags.Base.Orientation] + + def _load_libtiff(self) -> Image.core.PixelAccess | None: + """Overload method triggered when we detect a compressed tiff + Calls out to libtiff""" + + Image.Image.load(self) + + self.load_prepare() + + if not len(self.tile) == 1: + msg = "Not exactly one tile" + raise OSError(msg) + + # (self._compression, (extents tuple), + # 0, (rawmode, self._compression, fp)) + extents = self.tile[0][1] + args = self.tile[0][3] + + # To be nice on memory footprint, if there's a + # file descriptor, use that instead of reading + # into a string in python. + try: + fp = hasattr(self.fp, "fileno") and self.fp.fileno() + # flush the file descriptor, prevents error on pypy 2.4+ + # should also eliminate the need for fp.tell + # in _seek + if hasattr(self.fp, "flush"): + self.fp.flush() + except OSError: + # io.BytesIO have a fileno, but returns an OSError if + # it doesn't use a file descriptor. + fp = False + + if fp: + assert isinstance(args, tuple) + args_list = list(args) + args_list[2] = fp + args = tuple(args_list) + + decoder = Image._getdecoder(self.mode, "libtiff", args, self.decoderconfig) + try: + decoder.setimage(self.im, extents) + except ValueError as e: + msg = "Couldn't set the image" + raise OSError(msg) from e + + close_self_fp = self._exclusive_fp and not self.is_animated + if hasattr(self.fp, "getvalue"): + # We've got a stringio like thing passed in. Yay for all in memory. + # The decoder needs the entire file in one shot, so there's not + # a lot we can do here other than give it the entire file. + # unless we could do something like get the address of the + # underlying string for stringio. + # + # Rearranging for supporting byteio items, since they have a fileno + # that returns an OSError if there's no underlying fp. Easier to + # deal with here by reordering. + logger.debug("have getvalue. just sending in a string from getvalue") + n, err = decoder.decode(self.fp.getvalue()) + elif fp: + # we've got a actual file on disk, pass in the fp. + logger.debug("have fileno, calling fileno version of the decoder.") + if not close_self_fp: + self.fp.seek(0) + # 4 bytes, otherwise the trace might error out + n, err = decoder.decode(b"fpfp") + else: + # we have something else. + logger.debug("don't have fileno or getvalue. just reading") + self.fp.seek(0) + # UNDONE -- so much for that buffer size thing. + n, err = decoder.decode(self.fp.read()) + + self.tile = [] + self.readonly = 0 + + self.load_end() + + if close_self_fp: + self.fp.close() + self.fp = None # might be shared + + if err < 0: + raise OSError(err) + + return Image.Image.load(self) + + def _setup(self) -> None: + """Setup this image object based on current tags""" + + if 0xBC01 in self.tag_v2: + msg = "Windows Media Photo files not yet supported" + raise OSError(msg) + + # extract relevant tags + self._compression = COMPRESSION_INFO[self.tag_v2.get(COMPRESSION, 1)] + self._planar_configuration = self.tag_v2.get(PLANAR_CONFIGURATION, 1) + + # photometric is a required tag, but not everyone is reading + # the specification + photo = self.tag_v2.get(PHOTOMETRIC_INTERPRETATION, 0) + + # old style jpeg compression images most certainly are YCbCr + if self._compression == "tiff_jpeg": + photo = 6 + + fillorder = self.tag_v2.get(FILLORDER, 1) + + logger.debug("*** Summary ***") + logger.debug("- compression: %s", self._compression) + logger.debug("- photometric_interpretation: %s", photo) + logger.debug("- planar_configuration: %s", self._planar_configuration) + logger.debug("- fill_order: %s", fillorder) + logger.debug("- YCbCr subsampling: %s", self.tag_v2.get(YCBCRSUBSAMPLING)) + + # size + xsize = self.tag_v2.get(IMAGEWIDTH) + ysize = self.tag_v2.get(IMAGELENGTH) + if not isinstance(xsize, int) or not isinstance(ysize, int): + msg = "Invalid dimensions" + raise ValueError(msg) + self._tile_size = xsize, ysize + orientation = self.tag_v2.get(ExifTags.Base.Orientation) + if orientation in (5, 6, 7, 8): + self._size = ysize, xsize + else: + self._size = xsize, ysize + + logger.debug("- size: %s", self.size) + + sample_format = self.tag_v2.get(SAMPLEFORMAT, (1,)) + if len(sample_format) > 1 and max(sample_format) == min(sample_format) == 1: + # SAMPLEFORMAT is properly per band, so an RGB image will + # be (1,1,1). But, we don't support per band pixel types, + # and anything more than one band is a uint8. So, just + # take the first element. Revisit this if adding support + # for more exotic images. + sample_format = (1,) + + bps_tuple = self.tag_v2.get(BITSPERSAMPLE, (1,)) + extra_tuple = self.tag_v2.get(EXTRASAMPLES, ()) + if photo in (2, 6, 8): # RGB, YCbCr, LAB + bps_count = 3 + elif photo == 5: # CMYK + bps_count = 4 + else: + bps_count = 1 + bps_count += len(extra_tuple) + bps_actual_count = len(bps_tuple) + samples_per_pixel = self.tag_v2.get( + SAMPLESPERPIXEL, + 3 if self._compression == "tiff_jpeg" and photo in (2, 6) else 1, + ) + + if samples_per_pixel > MAX_SAMPLESPERPIXEL: + # DOS check, samples_per_pixel can be a Long, and we extend the tuple below + logger.error( + "More samples per pixel than can be decoded: %s", samples_per_pixel + ) + msg = "Invalid value for samples per pixel" + raise SyntaxError(msg) + + if samples_per_pixel < bps_actual_count: + # If a file has more values in bps_tuple than expected, + # remove the excess. + bps_tuple = bps_tuple[:samples_per_pixel] + elif samples_per_pixel > bps_actual_count and bps_actual_count == 1: + # If a file has only one value in bps_tuple, when it should have more, + # presume it is the same number of bits for all of the samples. + bps_tuple = bps_tuple * samples_per_pixel + + if len(bps_tuple) != samples_per_pixel: + msg = "unknown data organization" + raise SyntaxError(msg) + + # mode: check photometric interpretation and bits per pixel + key = ( + self.tag_v2.prefix, + photo, + sample_format, + fillorder, + bps_tuple, + extra_tuple, + ) + logger.debug("format key: %s", key) + try: + self._mode, rawmode = OPEN_INFO[key] + except KeyError as e: + logger.debug("- unsupported format") + msg = "unknown pixel mode" + raise SyntaxError(msg) from e + + logger.debug("- raw mode: %s", rawmode) + logger.debug("- pil mode: %s", self.mode) + + self.info["compression"] = self._compression + + xres = self.tag_v2.get(X_RESOLUTION, 1) + yres = self.tag_v2.get(Y_RESOLUTION, 1) + + if xres and yres: + resunit = self.tag_v2.get(RESOLUTION_UNIT) + if resunit == 2: # dots per inch + self.info["dpi"] = (xres, yres) + elif resunit == 3: # dots per centimeter. convert to dpi + self.info["dpi"] = (xres * 2.54, yres * 2.54) + elif resunit is None: # used to default to 1, but now 2) + self.info["dpi"] = (xres, yres) + # For backward compatibility, + # we also preserve the old behavior + self.info["resolution"] = xres, yres + else: # No absolute unit of measurement + self.info["resolution"] = xres, yres + + # build tile descriptors + x = y = layer = 0 + self.tile = [] + self.use_load_libtiff = READ_LIBTIFF or self._compression != "raw" + if self.use_load_libtiff: + # Decoder expects entire file as one tile. + # There's a buffer size limit in load (64k) + # so large g4 images will fail if we use that + # function. + # + # Setup the one tile for the whole image, then + # use the _load_libtiff function. + + # libtiff handles the fillmode for us, so 1;IR should + # actually be 1;I. Including the R double reverses the + # bits, so stripes of the image are reversed. See + # https://github.com/python-pillow/Pillow/issues/279 + if fillorder == 2: + # Replace fillorder with fillorder=1 + key = key[:3] + (1,) + key[4:] + logger.debug("format key: %s", key) + # this should always work, since all the + # fillorder==2 modes have a corresponding + # fillorder=1 mode + self._mode, rawmode = OPEN_INFO[key] + # libtiff always returns the bytes in native order. + # we're expecting image byte order. So, if the rawmode + # contains I;16, we need to convert from native to image + # byte order. + if rawmode == "I;16": + rawmode = "I;16N" + if ";16B" in rawmode: + rawmode = rawmode.replace(";16B", ";16N") + if ";16L" in rawmode: + rawmode = rawmode.replace(";16L", ";16N") + + # YCbCr images with new jpeg compression with pixels in one plane + # unpacked straight into RGB values + if ( + photo == 6 + and self._compression == "jpeg" + and self._planar_configuration == 1 + ): + rawmode = "RGB" + + # Offset in the tile tuple is 0, we go from 0,0 to + # w,h, and we only do this once -- eds + a = (rawmode, self._compression, False, self.tag_v2.offset) + self.tile.append(ImageFile._Tile("libtiff", (0, 0, xsize, ysize), 0, a)) + + elif STRIPOFFSETS in self.tag_v2 or TILEOFFSETS in self.tag_v2: + # striped image + if STRIPOFFSETS in self.tag_v2: + offsets = self.tag_v2[STRIPOFFSETS] + h = self.tag_v2.get(ROWSPERSTRIP, ysize) + w = xsize + else: + # tiled image + offsets = self.tag_v2[TILEOFFSETS] + tilewidth = self.tag_v2.get(TILEWIDTH) + h = self.tag_v2.get(TILELENGTH) + if not isinstance(tilewidth, int) or not isinstance(h, int): + msg = "Invalid tile dimensions" + raise ValueError(msg) + w = tilewidth + + for offset in offsets: + if x + w > xsize: + stride = w * sum(bps_tuple) / 8 # bytes per line + else: + stride = 0 + + tile_rawmode = rawmode + if self._planar_configuration == 2: + # each band on it's own layer + tile_rawmode = rawmode[layer] + # adjust stride width accordingly + stride /= bps_count + + args = (tile_rawmode, int(stride), 1) + self.tile.append( + ImageFile._Tile( + self._compression, + (x, y, min(x + w, xsize), min(y + h, ysize)), + offset, + args, + ) + ) + x = x + w + if x >= xsize: + x, y = 0, y + h + if y >= ysize: + x = y = 0 + layer += 1 + else: + logger.debug("- unsupported data organization") + msg = "unknown data organization" + raise SyntaxError(msg) + + # Fix up info. + if ICCPROFILE in self.tag_v2: + self.info["icc_profile"] = self.tag_v2[ICCPROFILE] + + # fixup palette descriptor + + if self.mode in ["P", "PA"]: + palette = [o8(b // 256) for b in self.tag_v2[COLORMAP]] + self.palette = ImagePalette.raw("RGB;L", b"".join(palette)) + + +# +# -------------------------------------------------------------------- +# Write TIFF files + +# little endian is default except for image modes with +# explicit big endian byte-order + +SAVE_INFO = { + # mode => rawmode, byteorder, photometrics, + # sampleformat, bitspersample, extra + "1": ("1", II, 1, 1, (1,), None), + "L": ("L", II, 1, 1, (8,), None), + "LA": ("LA", II, 1, 1, (8, 8), 2), + "P": ("P", II, 3, 1, (8,), None), + "PA": ("PA", II, 3, 1, (8, 8), 2), + "I": ("I;32S", II, 1, 2, (32,), None), + "I;16": ("I;16", II, 1, 1, (16,), None), + "I;16S": ("I;16S", II, 1, 2, (16,), None), + "F": ("F;32F", II, 1, 3, (32,), None), + "RGB": ("RGB", II, 2, 1, (8, 8, 8), None), + "RGBX": ("RGBX", II, 2, 1, (8, 8, 8, 8), 0), + "RGBA": ("RGBA", II, 2, 1, (8, 8, 8, 8), 2), + "CMYK": ("CMYK", II, 5, 1, (8, 8, 8, 8), None), + "YCbCr": ("YCbCr", II, 6, 1, (8, 8, 8), None), + "LAB": ("LAB", II, 8, 1, (8, 8, 8), None), + "I;32BS": ("I;32BS", MM, 1, 2, (32,), None), + "I;16B": ("I;16B", MM, 1, 1, (16,), None), + "I;16BS": ("I;16BS", MM, 1, 2, (16,), None), + "F;32BF": ("F;32BF", MM, 1, 3, (32,), None), +} + + +def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + try: + rawmode, prefix, photo, format, bits, extra = SAVE_INFO[im.mode] + except KeyError as e: + msg = f"cannot write mode {im.mode} as TIFF" + raise OSError(msg) from e + + ifd = ImageFileDirectory_v2(prefix=prefix) + + encoderinfo = im.encoderinfo + encoderconfig = im.encoderconfig + try: + compression = encoderinfo["compression"] + except KeyError: + compression = im.info.get("compression") + if isinstance(compression, int): + # compression value may be from BMP. Ignore it + compression = None + if compression is None: + compression = "raw" + elif compression == "tiff_jpeg": + # OJPEG is obsolete, so use new-style JPEG compression instead + compression = "jpeg" + elif compression == "tiff_deflate": + compression = "tiff_adobe_deflate" + + libtiff = WRITE_LIBTIFF or compression != "raw" + + # required for color libtiff images + ifd[PLANAR_CONFIGURATION] = 1 + + ifd[IMAGEWIDTH] = im.size[0] + ifd[IMAGELENGTH] = im.size[1] + + # write any arbitrary tags passed in as an ImageFileDirectory + if "tiffinfo" in encoderinfo: + info = encoderinfo["tiffinfo"] + elif "exif" in encoderinfo: + info = encoderinfo["exif"] + if isinstance(info, bytes): + exif = Image.Exif() + exif.load(info) + info = exif + else: + info = {} + logger.debug("Tiffinfo Keys: %s", list(info)) + if isinstance(info, ImageFileDirectory_v1): + info = info.to_v2() + for key in info: + if isinstance(info, Image.Exif) and key in TiffTags.TAGS_V2_GROUPS: + ifd[key] = info.get_ifd(key) + else: + ifd[key] = info.get(key) + try: + ifd.tagtype[key] = info.tagtype[key] + except Exception: + pass # might not be an IFD. Might not have populated type + + legacy_ifd = {} + if hasattr(im, "tag"): + legacy_ifd = im.tag.to_v2() + + supplied_tags = {**legacy_ifd, **getattr(im, "tag_v2", {})} + for tag in ( + # IFD offset that may not be correct in the saved image + EXIFIFD, + # Determined by the image format and should not be copied from legacy_ifd. + SAMPLEFORMAT, + ): + if tag in supplied_tags: + del supplied_tags[tag] + + # additions written by Greg Couch, gregc@cgl.ucsf.edu + # inspired by image-sig posting from Kevin Cazabon, kcazabon@home.com + if hasattr(im, "tag_v2"): + # preserve tags from original TIFF image file + for key in ( + RESOLUTION_UNIT, + X_RESOLUTION, + Y_RESOLUTION, + IPTC_NAA_CHUNK, + PHOTOSHOP_CHUNK, + XMP, + ): + if key in im.tag_v2: + if key == IPTC_NAA_CHUNK and im.tag_v2.tagtype[key] not in ( + TiffTags.BYTE, + TiffTags.UNDEFINED, + ): + del supplied_tags[key] + else: + ifd[key] = im.tag_v2[key] + ifd.tagtype[key] = im.tag_v2.tagtype[key] + + # preserve ICC profile (should also work when saving other formats + # which support profiles as TIFF) -- 2008-06-06 Florian Hoech + icc = encoderinfo.get("icc_profile", im.info.get("icc_profile")) + if icc: + ifd[ICCPROFILE] = icc + + for key, name in [ + (IMAGEDESCRIPTION, "description"), + (X_RESOLUTION, "resolution"), + (Y_RESOLUTION, "resolution"), + (X_RESOLUTION, "x_resolution"), + (Y_RESOLUTION, "y_resolution"), + (RESOLUTION_UNIT, "resolution_unit"), + (SOFTWARE, "software"), + (DATE_TIME, "date_time"), + (ARTIST, "artist"), + (COPYRIGHT, "copyright"), + ]: + if name in encoderinfo: + ifd[key] = encoderinfo[name] + + dpi = encoderinfo.get("dpi") + if dpi: + ifd[RESOLUTION_UNIT] = 2 + ifd[X_RESOLUTION] = dpi[0] + ifd[Y_RESOLUTION] = dpi[1] + + if bits != (1,): + ifd[BITSPERSAMPLE] = bits + if len(bits) != 1: + ifd[SAMPLESPERPIXEL] = len(bits) + if extra is not None: + ifd[EXTRASAMPLES] = extra + if format != 1: + ifd[SAMPLEFORMAT] = format + + if PHOTOMETRIC_INTERPRETATION not in ifd: + ifd[PHOTOMETRIC_INTERPRETATION] = photo + elif im.mode in ("1", "L") and ifd[PHOTOMETRIC_INTERPRETATION] == 0: + if im.mode == "1": + inverted_im = im.copy() + px = inverted_im.load() + if px is not None: + for y in range(inverted_im.height): + for x in range(inverted_im.width): + px[x, y] = 0 if px[x, y] == 255 else 255 + im = inverted_im + else: + im = ImageOps.invert(im) + + if im.mode in ["P", "PA"]: + lut = im.im.getpalette("RGB", "RGB;L") + colormap = [] + colors = len(lut) // 3 + for i in range(3): + colormap += [v * 256 for v in lut[colors * i : colors * (i + 1)]] + colormap += [0] * (256 - colors) + ifd[COLORMAP] = colormap + # data orientation + w, h = ifd[IMAGEWIDTH], ifd[IMAGELENGTH] + stride = len(bits) * ((w * bits[0] + 7) // 8) + if ROWSPERSTRIP not in ifd: + # aim for given strip size (64 KB by default) when using libtiff writer + if libtiff: + im_strip_size = encoderinfo.get("strip_size", STRIP_SIZE) + rows_per_strip = 1 if stride == 0 else min(im_strip_size // stride, h) + # JPEG encoder expects multiple of 8 rows + if compression == "jpeg": + rows_per_strip = min(((rows_per_strip + 7) // 8) * 8, h) + else: + rows_per_strip = h + if rows_per_strip == 0: + rows_per_strip = 1 + ifd[ROWSPERSTRIP] = rows_per_strip + strip_byte_counts = 1 if stride == 0 else stride * ifd[ROWSPERSTRIP] + strips_per_image = (h + ifd[ROWSPERSTRIP] - 1) // ifd[ROWSPERSTRIP] + if strip_byte_counts >= 2**16: + ifd.tagtype[STRIPBYTECOUNTS] = TiffTags.LONG + ifd[STRIPBYTECOUNTS] = (strip_byte_counts,) * (strips_per_image - 1) + ( + stride * h - strip_byte_counts * (strips_per_image - 1), + ) + ifd[STRIPOFFSETS] = tuple( + range(0, strip_byte_counts * strips_per_image, strip_byte_counts) + ) # this is adjusted by IFD writer + # no compression by default: + ifd[COMPRESSION] = COMPRESSION_INFO_REV.get(compression, 1) + + if im.mode == "YCbCr": + for tag, default_value in { + YCBCRSUBSAMPLING: (1, 1), + REFERENCEBLACKWHITE: (0, 255, 128, 255, 128, 255), + }.items(): + ifd.setdefault(tag, default_value) + + blocklist = [TILEWIDTH, TILELENGTH, TILEOFFSETS, TILEBYTECOUNTS] + if libtiff: + if "quality" in encoderinfo: + quality = encoderinfo["quality"] + if not isinstance(quality, int) or quality < 0 or quality > 100: + msg = "Invalid quality setting" + raise ValueError(msg) + if compression != "jpeg": + msg = "quality setting only supported for 'jpeg' compression" + raise ValueError(msg) + ifd[JPEGQUALITY] = quality + + logger.debug("Saving using libtiff encoder") + logger.debug("Items: %s", sorted(ifd.items())) + _fp = 0 + if hasattr(fp, "fileno"): + try: + fp.seek(0) + _fp = fp.fileno() + except io.UnsupportedOperation: + pass + + # optional types for non core tags + types = {} + # STRIPOFFSETS and STRIPBYTECOUNTS are added by the library + # based on the data in the strip. + # OSUBFILETYPE is deprecated. + # The other tags expect arrays with a certain length (fixed or depending on + # BITSPERSAMPLE, etc), passing arrays with a different length will result in + # segfaults. Block these tags until we add extra validation. + # SUBIFD may also cause a segfault. + blocklist += [ + OSUBFILETYPE, + REFERENCEBLACKWHITE, + STRIPBYTECOUNTS, + STRIPOFFSETS, + TRANSFERFUNCTION, + SUBIFD, + ] + + # bits per sample is a single short in the tiff directory, not a list. + atts: dict[int, Any] = {BITSPERSAMPLE: bits[0]} + # Merge the ones that we have with (optional) more bits from + # the original file, e.g x,y resolution so that we can + # save(load('')) == original file. + for tag, value in itertools.chain(ifd.items(), supplied_tags.items()): + # Libtiff can only process certain core items without adding + # them to the custom dictionary. + # Custom items are supported for int, float, unicode, string and byte + # values. Other types and tuples require a tagtype. + if tag not in TiffTags.LIBTIFF_CORE: + if not getattr(Image.core, "libtiff_support_custom_tags", False): + continue + + if tag in ifd.tagtype: + types[tag] = ifd.tagtype[tag] + elif not (isinstance(value, (int, float, str, bytes))): + continue + else: + type = TiffTags.lookup(tag).type + if type: + types[tag] = type + if tag not in atts and tag not in blocklist: + if isinstance(value, str): + atts[tag] = value.encode("ascii", "replace") + b"\0" + elif isinstance(value, IFDRational): + atts[tag] = float(value) + else: + atts[tag] = value + + if SAMPLEFORMAT in atts and len(atts[SAMPLEFORMAT]) == 1: + atts[SAMPLEFORMAT] = atts[SAMPLEFORMAT][0] + + logger.debug("Converted items: %s", sorted(atts.items())) + + # libtiff always expects the bytes in native order. + # we're storing image byte order. So, if the rawmode + # contains I;16, we need to convert from native to image + # byte order. + if im.mode in ("I;16B", "I;16"): + rawmode = "I;16N" + + # Pass tags as sorted list so that the tags are set in a fixed order. + # This is required by libtiff for some tags. For example, the JPEGQUALITY + # pseudo tag requires that the COMPRESS tag was already set. + tags = list(atts.items()) + tags.sort() + a = (rawmode, compression, _fp, filename, tags, types) + encoder = Image._getencoder(im.mode, "libtiff", a, encoderconfig) + encoder.setimage(im.im, (0, 0) + im.size) + while True: + errcode, data = encoder.encode(ImageFile.MAXBLOCK)[1:] + if not _fp: + fp.write(data) + if errcode: + break + if errcode < 0: + msg = f"encoder error {errcode} when writing image file" + raise OSError(msg) + + else: + for tag in blocklist: + del ifd[tag] + offset = ifd.save(fp) + + ImageFile._save( + im, + fp, + [ImageFile._Tile("raw", (0, 0) + im.size, offset, (rawmode, stride, 1))], + ) + + # -- helper for multi-page save -- + if "_debug_multipage" in encoderinfo: + # just to access o32 and o16 (using correct byte order) + setattr(im, "_debug_multipage", ifd) + + +class AppendingTiffWriter(io.BytesIO): + fieldSizes = [ + 0, # None + 1, # byte + 1, # ascii + 2, # short + 4, # long + 8, # rational + 1, # sbyte + 1, # undefined + 2, # sshort + 4, # slong + 8, # srational + 4, # float + 8, # double + 4, # ifd + 2, # unicode + 4, # complex + 8, # long8 + ] + + Tags = { + 273, # StripOffsets + 288, # FreeOffsets + 324, # TileOffsets + 519, # JPEGQTables + 520, # JPEGDCTables + 521, # JPEGACTables + } + + def __init__(self, fn: StrOrBytesPath | IO[bytes], new: bool = False) -> None: + self.f: IO[bytes] + if is_path(fn): + self.name = fn + self.close_fp = True + try: + self.f = open(fn, "w+b" if new else "r+b") + except OSError: + self.f = open(fn, "w+b") + else: + self.f = cast(IO[bytes], fn) + self.close_fp = False + self.beginning = self.f.tell() + self.setup() + + def setup(self) -> None: + # Reset everything. + self.f.seek(self.beginning, os.SEEK_SET) + + self.whereToWriteNewIFDOffset: int | None = None + self.offsetOfNewPage = 0 + + self.IIMM = iimm = self.f.read(4) + if not iimm: + # empty file - first page + self.isFirst = True + return + + self.isFirst = False + if iimm == b"II\x2a\x00": + self.setEndian("<") + elif iimm == b"MM\x00\x2a": + self.setEndian(">") + else: + msg = "Invalid TIFF file header" + raise RuntimeError(msg) + + self.skipIFDs() + self.goToEnd() + + def finalize(self) -> None: + if self.isFirst: + return + + # fix offsets + self.f.seek(self.offsetOfNewPage) + + iimm = self.f.read(4) + if not iimm: + # Make it easy to finish a frame without committing to a new one. + return + + if iimm != self.IIMM: + msg = "IIMM of new page doesn't match IIMM of first page" + raise RuntimeError(msg) + + ifd_offset = self.readLong() + ifd_offset += self.offsetOfNewPage + assert self.whereToWriteNewIFDOffset is not None + self.f.seek(self.whereToWriteNewIFDOffset) + self.writeLong(ifd_offset) + self.f.seek(ifd_offset) + self.fixIFD() + + def newFrame(self) -> None: + # Call this to finish a frame. + self.finalize() + self.setup() + + def __enter__(self) -> AppendingTiffWriter: + return self + + def __exit__(self, *args: object) -> None: + if self.close_fp: + self.close() + + def tell(self) -> int: + return self.f.tell() - self.offsetOfNewPage + + def seek(self, offset: int, whence: int = io.SEEK_SET) -> int: + """ + :param offset: Distance to seek. + :param whence: Whether the distance is relative to the start, + end or current position. + :returns: The resulting position, relative to the start. + """ + if whence == os.SEEK_SET: + offset += self.offsetOfNewPage + + self.f.seek(offset, whence) + return self.tell() + + def goToEnd(self) -> None: + self.f.seek(0, os.SEEK_END) + pos = self.f.tell() + + # pad to 16 byte boundary + pad_bytes = 16 - pos % 16 + if 0 < pad_bytes < 16: + self.f.write(bytes(pad_bytes)) + self.offsetOfNewPage = self.f.tell() + + def setEndian(self, endian: str) -> None: + self.endian = endian + self.longFmt = f"{self.endian}L" + self.shortFmt = f"{self.endian}H" + self.tagFormat = f"{self.endian}HHL" + + def skipIFDs(self) -> None: + while True: + ifd_offset = self.readLong() + if ifd_offset == 0: + self.whereToWriteNewIFDOffset = self.f.tell() - 4 + break + + self.f.seek(ifd_offset) + num_tags = self.readShort() + self.f.seek(num_tags * 12, os.SEEK_CUR) + + def write(self, data: Buffer, /) -> int: + return self.f.write(data) + + def _fmt(self, field_size: int) -> str: + try: + return {2: "H", 4: "L", 8: "Q"}[field_size] + except KeyError: + msg = "offset is not supported" + raise RuntimeError(msg) + + def _read(self, field_size: int) -> int: + (value,) = struct.unpack( + self.endian + self._fmt(field_size), self.f.read(field_size) + ) + return value + + def readShort(self) -> int: + return self._read(2) + + def readLong(self) -> int: + return self._read(4) + + @staticmethod + def _verify_bytes_written(bytes_written: int | None, expected: int) -> None: + if bytes_written is not None and bytes_written != expected: + msg = f"wrote only {bytes_written} bytes but wanted {expected}" + raise RuntimeError(msg) + + def rewriteLastShortToLong(self, value: int) -> None: + self.f.seek(-2, os.SEEK_CUR) + bytes_written = self.f.write(struct.pack(self.longFmt, value)) + self._verify_bytes_written(bytes_written, 4) + + def _rewriteLast(self, value: int, field_size: int) -> None: + self.f.seek(-field_size, os.SEEK_CUR) + bytes_written = self.f.write( + struct.pack(self.endian + self._fmt(field_size), value) + ) + self._verify_bytes_written(bytes_written, field_size) + + def rewriteLastShort(self, value: int) -> None: + return self._rewriteLast(value, 2) + + def rewriteLastLong(self, value: int) -> None: + return self._rewriteLast(value, 4) + + def writeShort(self, value: int) -> None: + bytes_written = self.f.write(struct.pack(self.shortFmt, value)) + self._verify_bytes_written(bytes_written, 2) + + def writeLong(self, value: int) -> None: + bytes_written = self.f.write(struct.pack(self.longFmt, value)) + self._verify_bytes_written(bytes_written, 4) + + def close(self) -> None: + self.finalize() + if self.close_fp: + self.f.close() + + def fixIFD(self) -> None: + num_tags = self.readShort() + + for i in range(num_tags): + tag, field_type, count = struct.unpack(self.tagFormat, self.f.read(8)) + + field_size = self.fieldSizes[field_type] + total_size = field_size * count + is_local = total_size <= 4 + if not is_local: + offset = self.readLong() + self.offsetOfNewPage + self.rewriteLastLong(offset) + + if tag in self.Tags: + cur_pos = self.f.tell() + + if is_local: + self._fixOffsets(count, field_size) + self.f.seek(cur_pos + 4) + else: + self.f.seek(offset) + self._fixOffsets(count, field_size) + self.f.seek(cur_pos) + + elif is_local: + # skip the locally stored value that is not an offset + self.f.seek(4, os.SEEK_CUR) + + def _fixOffsets(self, count: int, field_size: int) -> None: + for i in range(count): + offset = self._read(field_size) + offset += self.offsetOfNewPage + if field_size == 2 and offset >= 65536: + # offset is now too large - we must convert shorts to longs + if count != 1: + msg = "not implemented" + raise RuntimeError(msg) # XXX TODO + + # simple case - the offset is just one and therefore it is + # local (not referenced with another offset) + self.rewriteLastShortToLong(offset) + self.f.seek(-10, os.SEEK_CUR) + self.writeShort(TiffTags.LONG) # rewrite the type to LONG + self.f.seek(8, os.SEEK_CUR) + else: + self._rewriteLast(offset, field_size) + + def fixOffsets( + self, count: int, isShort: bool = False, isLong: bool = False + ) -> None: + if isShort: + field_size = 2 + elif isLong: + field_size = 4 + else: + field_size = 0 + return self._fixOffsets(count, field_size) + + +def _save_all(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + encoderinfo = im.encoderinfo.copy() + encoderconfig = im.encoderconfig + append_images = list(encoderinfo.get("append_images", [])) + if not hasattr(im, "n_frames") and not append_images: + return _save(im, fp, filename) + + cur_idx = im.tell() + try: + with AppendingTiffWriter(fp) as tf: + for ims in [im] + append_images: + ims.encoderinfo = encoderinfo + ims.encoderconfig = encoderconfig + if not hasattr(ims, "n_frames"): + nfr = 1 + else: + nfr = ims.n_frames + + for idx in range(nfr): + ims.seek(idx) + ims.load() + _save(ims, tf, filename) + tf.newFrame() + finally: + im.seek(cur_idx) + + +# +# -------------------------------------------------------------------- +# Register + +Image.register_open(TiffImageFile.format, TiffImageFile, _accept) +Image.register_save(TiffImageFile.format, _save) +Image.register_save_all(TiffImageFile.format, _save_all) + +Image.register_extensions(TiffImageFile.format, [".tif", ".tiff"]) + +Image.register_mime(TiffImageFile.format, "image/tiff") diff --git a/venv/lib/python3.12/site-packages/PIL/TiffTags.py b/venv/lib/python3.12/site-packages/PIL/TiffTags.py new file mode 100644 index 0000000..86adaa4 --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/TiffTags.py @@ -0,0 +1,562 @@ +# +# The Python Imaging Library. +# $Id$ +# +# TIFF tags +# +# This module provides clear-text names for various well-known +# TIFF tags. the TIFF codec works just fine without it. +# +# Copyright (c) Secret Labs AB 1999. +# +# See the README file for information on usage and redistribution. +# + +## +# This module provides constants and clear-text names for various +# well-known TIFF tags. +## +from __future__ import annotations + +from typing import NamedTuple + + +class _TagInfo(NamedTuple): + value: int | None + name: str + type: int | None + length: int | None + enum: dict[str, int] + + +class TagInfo(_TagInfo): + __slots__: list[str] = [] + + def __new__( + cls, + value: int | None = None, + name: str = "unknown", + type: int | None = None, + length: int | None = None, + enum: dict[str, int] | None = None, + ) -> TagInfo: + return super().__new__(cls, value, name, type, length, enum or {}) + + def cvt_enum(self, value: str) -> int | str: + # Using get will call hash(value), which can be expensive + # for some types (e.g. Fraction). Since self.enum is rarely + # used, it's usually better to test it first. + return self.enum.get(value, value) if self.enum else value + + +def lookup(tag: int, group: int | None = None) -> TagInfo: + """ + :param tag: Integer tag number + :param group: Which :py:data:`~PIL.TiffTags.TAGS_V2_GROUPS` to look in + + .. versionadded:: 8.3.0 + + :returns: Taginfo namedtuple, From the ``TAGS_V2`` info if possible, + otherwise just populating the value and name from ``TAGS``. + If the tag is not recognized, "unknown" is returned for the name + + """ + + if group is not None: + info = TAGS_V2_GROUPS[group].get(tag) if group in TAGS_V2_GROUPS else None + else: + info = TAGS_V2.get(tag) + return info or TagInfo(tag, TAGS.get(tag, "unknown")) + + +## +# Map tag numbers to tag info. +# +# id: (Name, Type, Length[, enum_values]) +# +# The length here differs from the length in the tiff spec. For +# numbers, the tiff spec is for the number of fields returned. We +# agree here. For string-like types, the tiff spec uses the length of +# field in bytes. In Pillow, we are using the number of expected +# fields, in general 1 for string-like types. + + +BYTE = 1 +ASCII = 2 +SHORT = 3 +LONG = 4 +RATIONAL = 5 +SIGNED_BYTE = 6 +UNDEFINED = 7 +SIGNED_SHORT = 8 +SIGNED_LONG = 9 +SIGNED_RATIONAL = 10 +FLOAT = 11 +DOUBLE = 12 +IFD = 13 +LONG8 = 16 + +_tags_v2: dict[int, tuple[str, int, int] | tuple[str, int, int, dict[str, int]]] = { + 254: ("NewSubfileType", LONG, 1), + 255: ("SubfileType", SHORT, 1), + 256: ("ImageWidth", LONG, 1), + 257: ("ImageLength", LONG, 1), + 258: ("BitsPerSample", SHORT, 0), + 259: ( + "Compression", + SHORT, + 1, + { + "Uncompressed": 1, + "CCITT 1d": 2, + "Group 3 Fax": 3, + "Group 4 Fax": 4, + "LZW": 5, + "JPEG": 6, + "PackBits": 32773, + }, + ), + 262: ( + "PhotometricInterpretation", + SHORT, + 1, + { + "WhiteIsZero": 0, + "BlackIsZero": 1, + "RGB": 2, + "RGB Palette": 3, + "Transparency Mask": 4, + "CMYK": 5, + "YCbCr": 6, + "CieLAB": 8, + "CFA": 32803, # TIFF/EP, Adobe DNG + "LinearRaw": 32892, # Adobe DNG + }, + ), + 263: ("Threshholding", SHORT, 1), + 264: ("CellWidth", SHORT, 1), + 265: ("CellLength", SHORT, 1), + 266: ("FillOrder", SHORT, 1), + 269: ("DocumentName", ASCII, 1), + 270: ("ImageDescription", ASCII, 1), + 271: ("Make", ASCII, 1), + 272: ("Model", ASCII, 1), + 273: ("StripOffsets", LONG, 0), + 274: ("Orientation", SHORT, 1), + 277: ("SamplesPerPixel", SHORT, 1), + 278: ("RowsPerStrip", LONG, 1), + 279: ("StripByteCounts", LONG, 0), + 280: ("MinSampleValue", SHORT, 0), + 281: ("MaxSampleValue", SHORT, 0), + 282: ("XResolution", RATIONAL, 1), + 283: ("YResolution", RATIONAL, 1), + 284: ("PlanarConfiguration", SHORT, 1, {"Contiguous": 1, "Separate": 2}), + 285: ("PageName", ASCII, 1), + 286: ("XPosition", RATIONAL, 1), + 287: ("YPosition", RATIONAL, 1), + 288: ("FreeOffsets", LONG, 1), + 289: ("FreeByteCounts", LONG, 1), + 290: ("GrayResponseUnit", SHORT, 1), + 291: ("GrayResponseCurve", SHORT, 0), + 292: ("T4Options", LONG, 1), + 293: ("T6Options", LONG, 1), + 296: ("ResolutionUnit", SHORT, 1, {"none": 1, "inch": 2, "cm": 3}), + 297: ("PageNumber", SHORT, 2), + 301: ("TransferFunction", SHORT, 0), + 305: ("Software", ASCII, 1), + 306: ("DateTime", ASCII, 1), + 315: ("Artist", ASCII, 1), + 316: ("HostComputer", ASCII, 1), + 317: ("Predictor", SHORT, 1, {"none": 1, "Horizontal Differencing": 2}), + 318: ("WhitePoint", RATIONAL, 2), + 319: ("PrimaryChromaticities", RATIONAL, 6), + 320: ("ColorMap", SHORT, 0), + 321: ("HalftoneHints", SHORT, 2), + 322: ("TileWidth", LONG, 1), + 323: ("TileLength", LONG, 1), + 324: ("TileOffsets", LONG, 0), + 325: ("TileByteCounts", LONG, 0), + 330: ("SubIFDs", LONG, 0), + 332: ("InkSet", SHORT, 1), + 333: ("InkNames", ASCII, 1), + 334: ("NumberOfInks", SHORT, 1), + 336: ("DotRange", SHORT, 0), + 337: ("TargetPrinter", ASCII, 1), + 338: ("ExtraSamples", SHORT, 0), + 339: ("SampleFormat", SHORT, 0), + 340: ("SMinSampleValue", DOUBLE, 0), + 341: ("SMaxSampleValue", DOUBLE, 0), + 342: ("TransferRange", SHORT, 6), + 347: ("JPEGTables", UNDEFINED, 1), + # obsolete JPEG tags + 512: ("JPEGProc", SHORT, 1), + 513: ("JPEGInterchangeFormat", LONG, 1), + 514: ("JPEGInterchangeFormatLength", LONG, 1), + 515: ("JPEGRestartInterval", SHORT, 1), + 517: ("JPEGLosslessPredictors", SHORT, 0), + 518: ("JPEGPointTransforms", SHORT, 0), + 519: ("JPEGQTables", LONG, 0), + 520: ("JPEGDCTables", LONG, 0), + 521: ("JPEGACTables", LONG, 0), + 529: ("YCbCrCoefficients", RATIONAL, 3), + 530: ("YCbCrSubSampling", SHORT, 2), + 531: ("YCbCrPositioning", SHORT, 1), + 532: ("ReferenceBlackWhite", RATIONAL, 6), + 700: ("XMP", BYTE, 0), + 33432: ("Copyright", ASCII, 1), + 33723: ("IptcNaaInfo", UNDEFINED, 1), + 34377: ("PhotoshopInfo", BYTE, 0), + # FIXME add more tags here + 34665: ("ExifIFD", LONG, 1), + 34675: ("ICCProfile", UNDEFINED, 1), + 34853: ("GPSInfoIFD", LONG, 1), + 36864: ("ExifVersion", UNDEFINED, 1), + 37724: ("ImageSourceData", UNDEFINED, 1), + 40965: ("InteroperabilityIFD", LONG, 1), + 41730: ("CFAPattern", UNDEFINED, 1), + # MPInfo + 45056: ("MPFVersion", UNDEFINED, 1), + 45057: ("NumberOfImages", LONG, 1), + 45058: ("MPEntry", UNDEFINED, 1), + 45059: ("ImageUIDList", UNDEFINED, 0), # UNDONE, check + 45060: ("TotalFrames", LONG, 1), + 45313: ("MPIndividualNum", LONG, 1), + 45569: ("PanOrientation", LONG, 1), + 45570: ("PanOverlap_H", RATIONAL, 1), + 45571: ("PanOverlap_V", RATIONAL, 1), + 45572: ("BaseViewpointNum", LONG, 1), + 45573: ("ConvergenceAngle", SIGNED_RATIONAL, 1), + 45574: ("BaselineLength", RATIONAL, 1), + 45575: ("VerticalDivergence", SIGNED_RATIONAL, 1), + 45576: ("AxisDistance_X", SIGNED_RATIONAL, 1), + 45577: ("AxisDistance_Y", SIGNED_RATIONAL, 1), + 45578: ("AxisDistance_Z", SIGNED_RATIONAL, 1), + 45579: ("YawAngle", SIGNED_RATIONAL, 1), + 45580: ("PitchAngle", SIGNED_RATIONAL, 1), + 45581: ("RollAngle", SIGNED_RATIONAL, 1), + 40960: ("FlashPixVersion", UNDEFINED, 1), + 50741: ("MakerNoteSafety", SHORT, 1, {"Unsafe": 0, "Safe": 1}), + 50780: ("BestQualityScale", RATIONAL, 1), + 50838: ("ImageJMetaDataByteCounts", LONG, 0), # Can be more than one + 50839: ("ImageJMetaData", UNDEFINED, 1), # see Issue #2006 +} +_tags_v2_groups = { + # ExifIFD + 34665: { + 36864: ("ExifVersion", UNDEFINED, 1), + 40960: ("FlashPixVersion", UNDEFINED, 1), + 40965: ("InteroperabilityIFD", LONG, 1), + 41730: ("CFAPattern", UNDEFINED, 1), + }, + # GPSInfoIFD + 34853: { + 0: ("GPSVersionID", BYTE, 4), + 1: ("GPSLatitudeRef", ASCII, 2), + 2: ("GPSLatitude", RATIONAL, 3), + 3: ("GPSLongitudeRef", ASCII, 2), + 4: ("GPSLongitude", RATIONAL, 3), + 5: ("GPSAltitudeRef", BYTE, 1), + 6: ("GPSAltitude", RATIONAL, 1), + 7: ("GPSTimeStamp", RATIONAL, 3), + 8: ("GPSSatellites", ASCII, 0), + 9: ("GPSStatus", ASCII, 2), + 10: ("GPSMeasureMode", ASCII, 2), + 11: ("GPSDOP", RATIONAL, 1), + 12: ("GPSSpeedRef", ASCII, 2), + 13: ("GPSSpeed", RATIONAL, 1), + 14: ("GPSTrackRef", ASCII, 2), + 15: ("GPSTrack", RATIONAL, 1), + 16: ("GPSImgDirectionRef", ASCII, 2), + 17: ("GPSImgDirection", RATIONAL, 1), + 18: ("GPSMapDatum", ASCII, 0), + 19: ("GPSDestLatitudeRef", ASCII, 2), + 20: ("GPSDestLatitude", RATIONAL, 3), + 21: ("GPSDestLongitudeRef", ASCII, 2), + 22: ("GPSDestLongitude", RATIONAL, 3), + 23: ("GPSDestBearingRef", ASCII, 2), + 24: ("GPSDestBearing", RATIONAL, 1), + 25: ("GPSDestDistanceRef", ASCII, 2), + 26: ("GPSDestDistance", RATIONAL, 1), + 27: ("GPSProcessingMethod", UNDEFINED, 0), + 28: ("GPSAreaInformation", UNDEFINED, 0), + 29: ("GPSDateStamp", ASCII, 11), + 30: ("GPSDifferential", SHORT, 1), + }, + # InteroperabilityIFD + 40965: {1: ("InteropIndex", ASCII, 1), 2: ("InteropVersion", UNDEFINED, 1)}, +} + +# Legacy Tags structure +# these tags aren't included above, but were in the previous versions +TAGS: dict[int | tuple[int, int], str] = { + 347: "JPEGTables", + 700: "XMP", + # Additional Exif Info + 32932: "Wang Annotation", + 33434: "ExposureTime", + 33437: "FNumber", + 33445: "MD FileTag", + 33446: "MD ScalePixel", + 33447: "MD ColorTable", + 33448: "MD LabName", + 33449: "MD SampleInfo", + 33450: "MD PrepDate", + 33451: "MD PrepTime", + 33452: "MD FileUnits", + 33550: "ModelPixelScaleTag", + 33723: "IptcNaaInfo", + 33918: "INGR Packet Data Tag", + 33919: "INGR Flag Registers", + 33920: "IrasB Transformation Matrix", + 33922: "ModelTiepointTag", + 34264: "ModelTransformationTag", + 34377: "PhotoshopInfo", + 34735: "GeoKeyDirectoryTag", + 34736: "GeoDoubleParamsTag", + 34737: "GeoAsciiParamsTag", + 34850: "ExposureProgram", + 34852: "SpectralSensitivity", + 34855: "ISOSpeedRatings", + 34856: "OECF", + 34864: "SensitivityType", + 34865: "StandardOutputSensitivity", + 34866: "RecommendedExposureIndex", + 34867: "ISOSpeed", + 34868: "ISOSpeedLatitudeyyy", + 34869: "ISOSpeedLatitudezzz", + 34908: "HylaFAX FaxRecvParams", + 34909: "HylaFAX FaxSubAddress", + 34910: "HylaFAX FaxRecvTime", + 36864: "ExifVersion", + 36867: "DateTimeOriginal", + 36868: "DateTimeDigitized", + 37121: "ComponentsConfiguration", + 37122: "CompressedBitsPerPixel", + 37724: "ImageSourceData", + 37377: "ShutterSpeedValue", + 37378: "ApertureValue", + 37379: "BrightnessValue", + 37380: "ExposureBiasValue", + 37381: "MaxApertureValue", + 37382: "SubjectDistance", + 37383: "MeteringMode", + 37384: "LightSource", + 37385: "Flash", + 37386: "FocalLength", + 37396: "SubjectArea", + 37500: "MakerNote", + 37510: "UserComment", + 37520: "SubSec", + 37521: "SubSecTimeOriginal", + 37522: "SubsecTimeDigitized", + 40960: "FlashPixVersion", + 40961: "ColorSpace", + 40962: "PixelXDimension", + 40963: "PixelYDimension", + 40964: "RelatedSoundFile", + 40965: "InteroperabilityIFD", + 41483: "FlashEnergy", + 41484: "SpatialFrequencyResponse", + 41486: "FocalPlaneXResolution", + 41487: "FocalPlaneYResolution", + 41488: "FocalPlaneResolutionUnit", + 41492: "SubjectLocation", + 41493: "ExposureIndex", + 41495: "SensingMethod", + 41728: "FileSource", + 41729: "SceneType", + 41730: "CFAPattern", + 41985: "CustomRendered", + 41986: "ExposureMode", + 41987: "WhiteBalance", + 41988: "DigitalZoomRatio", + 41989: "FocalLengthIn35mmFilm", + 41990: "SceneCaptureType", + 41991: "GainControl", + 41992: "Contrast", + 41993: "Saturation", + 41994: "Sharpness", + 41995: "DeviceSettingDescription", + 41996: "SubjectDistanceRange", + 42016: "ImageUniqueID", + 42032: "CameraOwnerName", + 42033: "BodySerialNumber", + 42034: "LensSpecification", + 42035: "LensMake", + 42036: "LensModel", + 42037: "LensSerialNumber", + 42112: "GDAL_METADATA", + 42113: "GDAL_NODATA", + 42240: "Gamma", + 50215: "Oce Scanjob Description", + 50216: "Oce Application Selector", + 50217: "Oce Identification Number", + 50218: "Oce ImageLogic Characteristics", + # Adobe DNG + 50706: "DNGVersion", + 50707: "DNGBackwardVersion", + 50708: "UniqueCameraModel", + 50709: "LocalizedCameraModel", + 50710: "CFAPlaneColor", + 50711: "CFALayout", + 50712: "LinearizationTable", + 50713: "BlackLevelRepeatDim", + 50714: "BlackLevel", + 50715: "BlackLevelDeltaH", + 50716: "BlackLevelDeltaV", + 50717: "WhiteLevel", + 50718: "DefaultScale", + 50719: "DefaultCropOrigin", + 50720: "DefaultCropSize", + 50721: "ColorMatrix1", + 50722: "ColorMatrix2", + 50723: "CameraCalibration1", + 50724: "CameraCalibration2", + 50725: "ReductionMatrix1", + 50726: "ReductionMatrix2", + 50727: "AnalogBalance", + 50728: "AsShotNeutral", + 50729: "AsShotWhiteXY", + 50730: "BaselineExposure", + 50731: "BaselineNoise", + 50732: "BaselineSharpness", + 50733: "BayerGreenSplit", + 50734: "LinearResponseLimit", + 50735: "CameraSerialNumber", + 50736: "LensInfo", + 50737: "ChromaBlurRadius", + 50738: "AntiAliasStrength", + 50740: "DNGPrivateData", + 50778: "CalibrationIlluminant1", + 50779: "CalibrationIlluminant2", + 50784: "Alias Layer Metadata", +} + +TAGS_V2: dict[int, TagInfo] = {} +TAGS_V2_GROUPS: dict[int, dict[int, TagInfo]] = {} + + +def _populate() -> None: + for k, v in _tags_v2.items(): + # Populate legacy structure. + TAGS[k] = v[0] + if len(v) == 4: + for sk, sv in v[3].items(): + TAGS[(k, sv)] = sk + + TAGS_V2[k] = TagInfo(k, *v) + + for group, tags in _tags_v2_groups.items(): + TAGS_V2_GROUPS[group] = {k: TagInfo(k, *v) for k, v in tags.items()} + + +_populate() +## +# Map type numbers to type names -- defined in ImageFileDirectory. + +TYPES: dict[int, str] = {} + +# +# These tags are handled by default in libtiff, without +# adding to the custom dictionary. From tif_dir.c, searching for +# case TIFFTAG in the _TIFFVSetField function: +# Line: item. +# 148: case TIFFTAG_SUBFILETYPE: +# 151: case TIFFTAG_IMAGEWIDTH: +# 154: case TIFFTAG_IMAGELENGTH: +# 157: case TIFFTAG_BITSPERSAMPLE: +# 181: case TIFFTAG_COMPRESSION: +# 202: case TIFFTAG_PHOTOMETRIC: +# 205: case TIFFTAG_THRESHHOLDING: +# 208: case TIFFTAG_FILLORDER: +# 214: case TIFFTAG_ORIENTATION: +# 221: case TIFFTAG_SAMPLESPERPIXEL: +# 228: case TIFFTAG_ROWSPERSTRIP: +# 238: case TIFFTAG_MINSAMPLEVALUE: +# 241: case TIFFTAG_MAXSAMPLEVALUE: +# 244: case TIFFTAG_SMINSAMPLEVALUE: +# 247: case TIFFTAG_SMAXSAMPLEVALUE: +# 250: case TIFFTAG_XRESOLUTION: +# 256: case TIFFTAG_YRESOLUTION: +# 262: case TIFFTAG_PLANARCONFIG: +# 268: case TIFFTAG_XPOSITION: +# 271: case TIFFTAG_YPOSITION: +# 274: case TIFFTAG_RESOLUTIONUNIT: +# 280: case TIFFTAG_PAGENUMBER: +# 284: case TIFFTAG_HALFTONEHINTS: +# 288: case TIFFTAG_COLORMAP: +# 294: case TIFFTAG_EXTRASAMPLES: +# 298: case TIFFTAG_MATTEING: +# 305: case TIFFTAG_TILEWIDTH: +# 316: case TIFFTAG_TILELENGTH: +# 327: case TIFFTAG_TILEDEPTH: +# 333: case TIFFTAG_DATATYPE: +# 344: case TIFFTAG_SAMPLEFORMAT: +# 361: case TIFFTAG_IMAGEDEPTH: +# 364: case TIFFTAG_SUBIFD: +# 376: case TIFFTAG_YCBCRPOSITIONING: +# 379: case TIFFTAG_YCBCRSUBSAMPLING: +# 383: case TIFFTAG_TRANSFERFUNCTION: +# 389: case TIFFTAG_REFERENCEBLACKWHITE: +# 393: case TIFFTAG_INKNAMES: + +# Following pseudo-tags are also handled by default in libtiff: +# TIFFTAG_JPEGQUALITY 65537 + +# some of these are not in our TAGS_V2 dict and were included from tiff.h + +# This list also exists in encode.c +LIBTIFF_CORE = { + 255, + 256, + 257, + 258, + 259, + 262, + 263, + 266, + 274, + 277, + 278, + 280, + 281, + 340, + 341, + 282, + 283, + 284, + 286, + 287, + 296, + 297, + 321, + 320, + 338, + 32995, + 322, + 323, + 32998, + 32996, + 339, + 32997, + 330, + 531, + 530, + 301, + 532, + 333, + # as above + 269, # this has been in our tests forever, and works + 65537, +} + +LIBTIFF_CORE.remove(255) # We don't have support for subfiletypes +LIBTIFF_CORE.remove(322) # We don't have support for writing tiled images with libtiff +LIBTIFF_CORE.remove(323) # Tiled images +LIBTIFF_CORE.remove(333) # Ink Names either + +# Note to advanced users: There may be combinations of these +# parameters and values that when added properly, will work and +# produce valid tiff images that may work in your application. +# It is safe to add and remove tags from this set from Pillow's point +# of view so long as you test against libtiff. diff --git a/venv/lib/python3.12/site-packages/PIL/WalImageFile.py b/venv/lib/python3.12/site-packages/PIL/WalImageFile.py new file mode 100644 index 0000000..87e3287 --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/WalImageFile.py @@ -0,0 +1,127 @@ +# +# The Python Imaging Library. +# $Id$ +# +# WAL file handling +# +# History: +# 2003-04-23 fl created +# +# Copyright (c) 2003 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# + +""" +This reader is based on the specification available from: +https://www.flipcode.com/archives/Quake_2_BSP_File_Format.shtml +and has been tested with a few sample files found using google. + +.. note:: + This format cannot be automatically recognized, so the reader + is not registered for use with :py:func:`PIL.Image.open()`. + To open a WAL file, use the :py:func:`PIL.WalImageFile.open()` function instead. +""" +from __future__ import annotations + +from typing import IO + +from . import Image, ImageFile +from ._binary import i32le as i32 +from ._typing import StrOrBytesPath + + +class WalImageFile(ImageFile.ImageFile): + format = "WAL" + format_description = "Quake2 Texture" + + def _open(self) -> None: + self._mode = "P" + + # read header fields + header = self.fp.read(32 + 24 + 32 + 12) + self._size = i32(header, 32), i32(header, 36) + Image._decompression_bomb_check(self.size) + + # load pixel data + offset = i32(header, 40) + self.fp.seek(offset) + + # strings are null-terminated + self.info["name"] = header[:32].split(b"\0", 1)[0] + next_name = header[56 : 56 + 32].split(b"\0", 1)[0] + if next_name: + self.info["next_name"] = next_name + + def load(self) -> Image.core.PixelAccess | None: + if self._im is None: + self.im = Image.core.new(self.mode, self.size) + self.frombytes(self.fp.read(self.size[0] * self.size[1])) + self.putpalette(quake2palette) + return Image.Image.load(self) + + +def open(filename: StrOrBytesPath | IO[bytes]) -> WalImageFile: + """ + Load texture from a Quake2 WAL texture file. + + By default, a Quake2 standard palette is attached to the texture. + To override the palette, use the :py:func:`PIL.Image.Image.putpalette()` method. + + :param filename: WAL file name, or an opened file handle. + :returns: An image instance. + """ + return WalImageFile(filename) + + +quake2palette = ( + # default palette taken from piffo 0.93 by Hans Häggström + b"\x01\x01\x01\x0b\x0b\x0b\x12\x12\x12\x17\x17\x17\x1b\x1b\x1b\x1e" + b"\x1e\x1e\x22\x22\x22\x26\x26\x26\x29\x29\x29\x2c\x2c\x2c\x2f\x2f" + b"\x2f\x32\x32\x32\x35\x35\x35\x37\x37\x37\x3a\x3a\x3a\x3c\x3c\x3c" + b"\x24\x1e\x13\x22\x1c\x12\x20\x1b\x12\x1f\x1a\x10\x1d\x19\x10\x1b" + b"\x17\x0f\x1a\x16\x0f\x18\x14\x0d\x17\x13\x0d\x16\x12\x0d\x14\x10" + b"\x0b\x13\x0f\x0b\x10\x0d\x0a\x0f\x0b\x0a\x0d\x0b\x07\x0b\x0a\x07" + b"\x23\x23\x26\x22\x22\x25\x22\x20\x23\x21\x1f\x22\x20\x1e\x20\x1f" + b"\x1d\x1e\x1d\x1b\x1c\x1b\x1a\x1a\x1a\x19\x19\x18\x17\x17\x17\x16" + b"\x16\x14\x14\x14\x13\x13\x13\x10\x10\x10\x0f\x0f\x0f\x0d\x0d\x0d" + b"\x2d\x28\x20\x29\x24\x1c\x27\x22\x1a\x25\x1f\x17\x38\x2e\x1e\x31" + b"\x29\x1a\x2c\x25\x17\x26\x20\x14\x3c\x30\x14\x37\x2c\x13\x33\x28" + b"\x12\x2d\x24\x10\x28\x1f\x0f\x22\x1a\x0b\x1b\x14\x0a\x13\x0f\x07" + b"\x31\x1a\x16\x30\x17\x13\x2e\x16\x10\x2c\x14\x0d\x2a\x12\x0b\x27" + b"\x0f\x0a\x25\x0f\x07\x21\x0d\x01\x1e\x0b\x01\x1c\x0b\x01\x1a\x0b" + b"\x01\x18\x0a\x01\x16\x0a\x01\x13\x0a\x01\x10\x07\x01\x0d\x07\x01" + b"\x29\x23\x1e\x27\x21\x1c\x26\x20\x1b\x25\x1f\x1a\x23\x1d\x19\x21" + b"\x1c\x18\x20\x1b\x17\x1e\x19\x16\x1c\x18\x14\x1b\x17\x13\x19\x14" + b"\x10\x17\x13\x0f\x14\x10\x0d\x12\x0f\x0b\x0f\x0b\x0a\x0b\x0a\x07" + b"\x26\x1a\x0f\x23\x19\x0f\x20\x17\x0f\x1c\x16\x0f\x19\x13\x0d\x14" + b"\x10\x0b\x10\x0d\x0a\x0b\x0a\x07\x33\x22\x1f\x35\x29\x26\x37\x2f" + b"\x2d\x39\x35\x34\x37\x39\x3a\x33\x37\x39\x30\x34\x36\x2b\x31\x34" + b"\x27\x2e\x31\x22\x2b\x2f\x1d\x28\x2c\x17\x25\x2a\x0f\x20\x26\x0d" + b"\x1e\x25\x0b\x1c\x22\x0a\x1b\x20\x07\x19\x1e\x07\x17\x1b\x07\x14" + b"\x18\x01\x12\x16\x01\x0f\x12\x01\x0b\x0d\x01\x07\x0a\x01\x01\x01" + b"\x2c\x21\x21\x2a\x1f\x1f\x29\x1d\x1d\x27\x1c\x1c\x26\x1a\x1a\x24" + b"\x18\x18\x22\x17\x17\x21\x16\x16\x1e\x13\x13\x1b\x12\x12\x18\x10" + b"\x10\x16\x0d\x0d\x12\x0b\x0b\x0d\x0a\x0a\x0a\x07\x07\x01\x01\x01" + b"\x2e\x30\x29\x2d\x2e\x27\x2b\x2c\x26\x2a\x2a\x24\x28\x29\x23\x27" + b"\x27\x21\x26\x26\x1f\x24\x24\x1d\x22\x22\x1c\x1f\x1f\x1a\x1c\x1c" + b"\x18\x19\x19\x16\x17\x17\x13\x13\x13\x10\x0f\x0f\x0d\x0b\x0b\x0a" + b"\x30\x1e\x1b\x2d\x1c\x19\x2c\x1a\x17\x2a\x19\x14\x28\x17\x13\x26" + b"\x16\x10\x24\x13\x0f\x21\x12\x0d\x1f\x10\x0b\x1c\x0f\x0a\x19\x0d" + b"\x0a\x16\x0b\x07\x12\x0a\x07\x0f\x07\x01\x0a\x01\x01\x01\x01\x01" + b"\x28\x29\x38\x26\x27\x36\x25\x26\x34\x24\x24\x31\x22\x22\x2f\x20" + b"\x21\x2d\x1e\x1f\x2a\x1d\x1d\x27\x1b\x1b\x25\x19\x19\x21\x17\x17" + b"\x1e\x14\x14\x1b\x13\x12\x17\x10\x0f\x13\x0d\x0b\x0f\x0a\x07\x07" + b"\x2f\x32\x29\x2d\x30\x26\x2b\x2e\x24\x29\x2c\x21\x27\x2a\x1e\x25" + b"\x28\x1c\x23\x26\x1a\x21\x25\x18\x1e\x22\x14\x1b\x1f\x10\x19\x1c" + b"\x0d\x17\x1a\x0a\x13\x17\x07\x10\x13\x01\x0d\x0f\x01\x0a\x0b\x01" + b"\x01\x3f\x01\x13\x3c\x0b\x1b\x39\x10\x20\x35\x14\x23\x31\x17\x23" + b"\x2d\x18\x23\x29\x18\x3f\x3f\x3f\x3f\x3f\x39\x3f\x3f\x31\x3f\x3f" + b"\x2a\x3f\x3f\x20\x3f\x3f\x14\x3f\x3c\x12\x3f\x39\x0f\x3f\x35\x0b" + b"\x3f\x32\x07\x3f\x2d\x01\x3d\x2a\x01\x3b\x26\x01\x39\x21\x01\x37" + b"\x1d\x01\x34\x1a\x01\x32\x16\x01\x2f\x12\x01\x2d\x0f\x01\x2a\x0b" + b"\x01\x27\x07\x01\x23\x01\x01\x1d\x01\x01\x17\x01\x01\x10\x01\x01" + b"\x3d\x01\x01\x19\x19\x3f\x3f\x01\x01\x01\x01\x3f\x16\x16\x13\x10" + b"\x10\x0f\x0d\x0d\x0b\x3c\x2e\x2a\x36\x27\x20\x30\x21\x18\x29\x1b" + b"\x10\x3c\x39\x37\x37\x32\x2f\x31\x2c\x28\x2b\x26\x21\x30\x22\x20" +) diff --git a/venv/lib/python3.12/site-packages/PIL/WebPImagePlugin.py b/venv/lib/python3.12/site-packages/PIL/WebPImagePlugin.py new file mode 100644 index 0000000..64188f2 --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/WebPImagePlugin.py @@ -0,0 +1,323 @@ +from __future__ import annotations + +from io import BytesIO +from typing import IO, Any + +from . import Image, ImageFile + +try: + from . import _webp + + SUPPORTED = True +except ImportError: + SUPPORTED = False + + +_VP8_MODES_BY_IDENTIFIER = { + b"VP8 ": "RGB", + b"VP8X": "RGBA", + b"VP8L": "RGBA", # lossless +} + + +def _accept(prefix: bytes) -> bool | str: + is_riff_file_format = prefix[:4] == b"RIFF" + is_webp_file = prefix[8:12] == b"WEBP" + is_valid_vp8_mode = prefix[12:16] in _VP8_MODES_BY_IDENTIFIER + + if is_riff_file_format and is_webp_file and is_valid_vp8_mode: + if not SUPPORTED: + return ( + "image file could not be identified because WEBP support not installed" + ) + return True + return False + + +class WebPImageFile(ImageFile.ImageFile): + format = "WEBP" + format_description = "WebP image" + __loaded = 0 + __logical_frame = 0 + + def _open(self) -> None: + # Use the newer AnimDecoder API to parse the (possibly) animated file, + # and access muxed chunks like ICC/EXIF/XMP. + self._decoder = _webp.WebPAnimDecoder(self.fp.read()) + + # Get info from decoder + width, height, loop_count, bgcolor, frame_count, mode = self._decoder.get_info() + self._size = width, height + self.info["loop"] = loop_count + bg_a, bg_r, bg_g, bg_b = ( + (bgcolor >> 24) & 0xFF, + (bgcolor >> 16) & 0xFF, + (bgcolor >> 8) & 0xFF, + bgcolor & 0xFF, + ) + self.info["background"] = (bg_r, bg_g, bg_b, bg_a) + self.n_frames = frame_count + self.is_animated = self.n_frames > 1 + self._mode = "RGB" if mode == "RGBX" else mode + self.rawmode = mode + self.tile = [] + + # Attempt to read ICC / EXIF / XMP chunks from file + icc_profile = self._decoder.get_chunk("ICCP") + exif = self._decoder.get_chunk("EXIF") + xmp = self._decoder.get_chunk("XMP ") + if icc_profile: + self.info["icc_profile"] = icc_profile + if exif: + self.info["exif"] = exif + if xmp: + self.info["xmp"] = xmp + + # Initialize seek state + self._reset(reset=False) + + def _getexif(self) -> dict[int, Any] | None: + if "exif" not in self.info: + return None + return self.getexif()._get_merged_dict() + + def seek(self, frame: int) -> None: + if not self._seek_check(frame): + return + + # Set logical frame to requested position + self.__logical_frame = frame + + def _reset(self, reset: bool = True) -> None: + if reset: + self._decoder.reset() + self.__physical_frame = 0 + self.__loaded = -1 + self.__timestamp = 0 + + def _get_next(self) -> tuple[bytes, int, int]: + # Get next frame + ret = self._decoder.get_next() + self.__physical_frame += 1 + + # Check if an error occurred + if ret is None: + self._reset() # Reset just to be safe + self.seek(0) + msg = "failed to decode next frame in WebP file" + raise EOFError(msg) + + # Compute duration + data, timestamp = ret + duration = timestamp - self.__timestamp + self.__timestamp = timestamp + + # libwebp gives frame end, adjust to start of frame + timestamp -= duration + return data, timestamp, duration + + def _seek(self, frame: int) -> None: + if self.__physical_frame == frame: + return # Nothing to do + if frame < self.__physical_frame: + self._reset() # Rewind to beginning + while self.__physical_frame < frame: + self._get_next() # Advance to the requested frame + + def load(self) -> Image.core.PixelAccess | None: + if self.__loaded != self.__logical_frame: + self._seek(self.__logical_frame) + + # We need to load the image data for this frame + data, timestamp, duration = self._get_next() + self.info["timestamp"] = timestamp + self.info["duration"] = duration + self.__loaded = self.__logical_frame + + # Set tile + if self.fp and self._exclusive_fp: + self.fp.close() + self.fp = BytesIO(data) + self.tile = [ImageFile._Tile("raw", (0, 0) + self.size, 0, self.rawmode)] + + return super().load() + + def load_seek(self, pos: int) -> None: + pass + + def tell(self) -> int: + return self.__logical_frame + + +def _convert_frame(im: Image.Image) -> Image.Image: + # Make sure image mode is supported + if im.mode not in ("RGBX", "RGBA", "RGB"): + im = im.convert("RGBA" if im.has_transparency_data else "RGB") + return im + + +def _save_all(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + encoderinfo = im.encoderinfo.copy() + append_images = list(encoderinfo.get("append_images", [])) + + # If total frame count is 1, then save using the legacy API, which + # will preserve non-alpha modes + total = 0 + for ims in [im] + append_images: + total += getattr(ims, "n_frames", 1) + if total == 1: + _save(im, fp, filename) + return + + background: int | tuple[int, ...] = (0, 0, 0, 0) + if "background" in encoderinfo: + background = encoderinfo["background"] + elif "background" in im.info: + background = im.info["background"] + if isinstance(background, int): + # GifImagePlugin stores a global color table index in + # info["background"]. So it must be converted to an RGBA value + palette = im.getpalette() + if palette: + r, g, b = palette[background * 3 : (background + 1) * 3] + background = (r, g, b, 255) + else: + background = (background, background, background, 255) + + duration = im.encoderinfo.get("duration", im.info.get("duration", 0)) + loop = im.encoderinfo.get("loop", 0) + minimize_size = im.encoderinfo.get("minimize_size", False) + kmin = im.encoderinfo.get("kmin", None) + kmax = im.encoderinfo.get("kmax", None) + allow_mixed = im.encoderinfo.get("allow_mixed", False) + verbose = False + lossless = im.encoderinfo.get("lossless", False) + quality = im.encoderinfo.get("quality", 80) + alpha_quality = im.encoderinfo.get("alpha_quality", 100) + method = im.encoderinfo.get("method", 0) + icc_profile = im.encoderinfo.get("icc_profile") or "" + exif = im.encoderinfo.get("exif", "") + if isinstance(exif, Image.Exif): + exif = exif.tobytes() + xmp = im.encoderinfo.get("xmp", "") + if allow_mixed: + lossless = False + + # Sensible keyframe defaults are from gif2webp.c script + if kmin is None: + kmin = 9 if lossless else 3 + if kmax is None: + kmax = 17 if lossless else 5 + + # Validate background color + if ( + not isinstance(background, (list, tuple)) + or len(background) != 4 + or not all(0 <= v < 256 for v in background) + ): + msg = f"Background color is not an RGBA tuple clamped to (0-255): {background}" + raise OSError(msg) + + # Convert to packed uint + bg_r, bg_g, bg_b, bg_a = background + background = (bg_a << 24) | (bg_r << 16) | (bg_g << 8) | (bg_b << 0) + + # Setup the WebP animation encoder + enc = _webp.WebPAnimEncoder( + im.size[0], + im.size[1], + background, + loop, + minimize_size, + kmin, + kmax, + allow_mixed, + verbose, + ) + + # Add each frame + frame_idx = 0 + timestamp = 0 + cur_idx = im.tell() + try: + for ims in [im] + append_images: + # Get # of frames in this image + nfr = getattr(ims, "n_frames", 1) + + for idx in range(nfr): + ims.seek(idx) + + frame = _convert_frame(ims) + + # Append the frame to the animation encoder + enc.add( + frame.getim(), + round(timestamp), + lossless, + quality, + alpha_quality, + method, + ) + + # Update timestamp and frame index + if isinstance(duration, (list, tuple)): + timestamp += duration[frame_idx] + else: + timestamp += duration + frame_idx += 1 + + finally: + im.seek(cur_idx) + + # Force encoder to flush frames + enc.add(None, round(timestamp), lossless, quality, alpha_quality, 0) + + # Get the final output from the encoder + data = enc.assemble(icc_profile, exif, xmp) + if data is None: + msg = "cannot write file as WebP (encoder returned None)" + raise OSError(msg) + + fp.write(data) + + +def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + lossless = im.encoderinfo.get("lossless", False) + quality = im.encoderinfo.get("quality", 80) + alpha_quality = im.encoderinfo.get("alpha_quality", 100) + icc_profile = im.encoderinfo.get("icc_profile") or "" + exif = im.encoderinfo.get("exif", b"") + if isinstance(exif, Image.Exif): + exif = exif.tobytes() + if exif.startswith(b"Exif\x00\x00"): + exif = exif[6:] + xmp = im.encoderinfo.get("xmp", "") + method = im.encoderinfo.get("method", 4) + exact = 1 if im.encoderinfo.get("exact") else 0 + + im = _convert_frame(im) + + data = _webp.WebPEncode( + im.getim(), + lossless, + float(quality), + float(alpha_quality), + icc_profile, + method, + exact, + exif, + xmp, + ) + if data is None: + msg = "cannot write file as WebP (encoder returned None)" + raise OSError(msg) + + fp.write(data) + + +Image.register_open(WebPImageFile.format, WebPImageFile, _accept) +if SUPPORTED: + Image.register_save(WebPImageFile.format, _save) + Image.register_save_all(WebPImageFile.format, _save_all) + Image.register_extension(WebPImageFile.format, ".webp") + Image.register_mime(WebPImageFile.format, "image/webp") diff --git a/venv/lib/python3.12/site-packages/PIL/WmfImagePlugin.py b/venv/lib/python3.12/site-packages/PIL/WmfImagePlugin.py new file mode 100644 index 0000000..68f8a74 --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/WmfImagePlugin.py @@ -0,0 +1,181 @@ +# +# The Python Imaging Library +# $Id$ +# +# WMF stub codec +# +# history: +# 1996-12-14 fl Created +# 2004-02-22 fl Turned into a stub driver +# 2004-02-23 fl Added EMF support +# +# Copyright (c) Secret Labs AB 1997-2004. All rights reserved. +# Copyright (c) Fredrik Lundh 1996. +# +# See the README file for information on usage and redistribution. +# +# WMF/EMF reference documentation: +# https://winprotocoldoc.blob.core.windows.net/productionwindowsarchives/MS-WMF/[MS-WMF].pdf +# http://wvware.sourceforge.net/caolan/index.html +# http://wvware.sourceforge.net/caolan/ora-wmf.html +from __future__ import annotations + +from typing import IO + +from . import Image, ImageFile +from ._binary import i16le as word +from ._binary import si16le as short +from ._binary import si32le as _long + +_handler = None + + +def register_handler(handler: ImageFile.StubHandler | None) -> None: + """ + Install application-specific WMF image handler. + + :param handler: Handler object. + """ + global _handler + _handler = handler + + +if hasattr(Image.core, "drawwmf"): + # install default handler (windows only) + + class WmfHandler(ImageFile.StubHandler): + def open(self, im: ImageFile.StubImageFile) -> None: + im._mode = "RGB" + self.bbox = im.info["wmf_bbox"] + + def load(self, im: ImageFile.StubImageFile) -> Image.Image: + im.fp.seek(0) # rewind + return Image.frombytes( + "RGB", + im.size, + Image.core.drawwmf(im.fp.read(), im.size, self.bbox), + "raw", + "BGR", + (im.size[0] * 3 + 3) & -4, + -1, + ) + + register_handler(WmfHandler()) + +# +# -------------------------------------------------------------------- +# Read WMF file + + +def _accept(prefix: bytes) -> bool: + return ( + prefix[:6] == b"\xd7\xcd\xc6\x9a\x00\x00" or prefix[:4] == b"\x01\x00\x00\x00" + ) + + +## +# Image plugin for Windows metafiles. + + +class WmfStubImageFile(ImageFile.StubImageFile): + format = "WMF" + format_description = "Windows Metafile" + + def _open(self) -> None: + self._inch = None + + # check placable header + s = self.fp.read(80) + + if s[:6] == b"\xd7\xcd\xc6\x9a\x00\x00": + # placeable windows metafile + + # get units per inch + self._inch = word(s, 14) + + # get bounding box + x0 = short(s, 6) + y0 = short(s, 8) + x1 = short(s, 10) + y1 = short(s, 12) + + # normalize size to 72 dots per inch + self.info["dpi"] = 72 + size = ( + (x1 - x0) * self.info["dpi"] // self._inch, + (y1 - y0) * self.info["dpi"] // self._inch, + ) + + self.info["wmf_bbox"] = x0, y0, x1, y1 + + # sanity check (standard metafile header) + if s[22:26] != b"\x01\x00\t\x00": + msg = "Unsupported WMF file format" + raise SyntaxError(msg) + + elif s[:4] == b"\x01\x00\x00\x00" and s[40:44] == b" EMF": + # enhanced metafile + + # get bounding box + x0 = _long(s, 8) + y0 = _long(s, 12) + x1 = _long(s, 16) + y1 = _long(s, 20) + + # get frame (in 0.01 millimeter units) + frame = _long(s, 24), _long(s, 28), _long(s, 32), _long(s, 36) + + size = x1 - x0, y1 - y0 + + # calculate dots per inch from bbox and frame + xdpi = 2540.0 * (x1 - y0) / (frame[2] - frame[0]) + ydpi = 2540.0 * (y1 - y0) / (frame[3] - frame[1]) + + self.info["wmf_bbox"] = x0, y0, x1, y1 + + if xdpi == ydpi: + self.info["dpi"] = xdpi + else: + self.info["dpi"] = xdpi, ydpi + + else: + msg = "Unsupported file format" + raise SyntaxError(msg) + + self._mode = "RGB" + self._size = size + + loader = self._load() + if loader: + loader.open(self) + + def _load(self) -> ImageFile.StubHandler | None: + return _handler + + def load(self, dpi: int | None = None) -> Image.core.PixelAccess | None: + if dpi is not None and self._inch is not None: + self.info["dpi"] = dpi + x0, y0, x1, y1 = self.info["wmf_bbox"] + self._size = ( + (x1 - x0) * self.info["dpi"] // self._inch, + (y1 - y0) * self.info["dpi"] // self._inch, + ) + return super().load() + + +def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + if _handler is None or not hasattr(_handler, "save"): + msg = "WMF save handler not installed" + raise OSError(msg) + _handler.save(im, fp, filename) + + +# +# -------------------------------------------------------------------- +# Registry stuff + + +Image.register_open(WmfStubImageFile.format, WmfStubImageFile, _accept) +Image.register_save(WmfStubImageFile.format, _save) + +Image.register_extensions(WmfStubImageFile.format, [".wmf", ".emf"]) diff --git a/venv/lib/python3.12/site-packages/PIL/XVThumbImagePlugin.py b/venv/lib/python3.12/site-packages/PIL/XVThumbImagePlugin.py new file mode 100644 index 0000000..5d1f201 --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/XVThumbImagePlugin.py @@ -0,0 +1,85 @@ +# +# The Python Imaging Library. +# $Id$ +# +# XV Thumbnail file handler by Charles E. "Gene" Cash +# (gcash@magicnet.net) +# +# see xvcolor.c and xvbrowse.c in the sources to John Bradley's XV, +# available from ftp://ftp.cis.upenn.edu/pub/xv/ +# +# history: +# 98-08-15 cec created (b/w only) +# 98-12-09 cec added color palette +# 98-12-28 fl added to PIL (with only a few very minor modifications) +# +# To do: +# FIXME: make save work (this requires quantization support) +# +from __future__ import annotations + +from . import Image, ImageFile, ImagePalette +from ._binary import o8 + +_MAGIC = b"P7 332" + +# standard color palette for thumbnails (RGB332) +PALETTE = b"" +for r in range(8): + for g in range(8): + for b in range(4): + PALETTE = PALETTE + ( + o8((r * 255) // 7) + o8((g * 255) // 7) + o8((b * 255) // 3) + ) + + +def _accept(prefix: bytes) -> bool: + return prefix[:6] == _MAGIC + + +## +# Image plugin for XV thumbnail images. + + +class XVThumbImageFile(ImageFile.ImageFile): + format = "XVThumb" + format_description = "XV thumbnail image" + + def _open(self) -> None: + # check magic + assert self.fp is not None + + if not _accept(self.fp.read(6)): + msg = "not an XV thumbnail file" + raise SyntaxError(msg) + + # Skip to beginning of next line + self.fp.readline() + + # skip info comments + while True: + s = self.fp.readline() + if not s: + msg = "Unexpected EOF reading XV thumbnail file" + raise SyntaxError(msg) + if s[0] != 35: # ie. when not a comment: '#' + break + + # parse header line (already read) + s = s.strip().split() + + self._mode = "P" + self._size = int(s[0]), int(s[1]) + + self.palette = ImagePalette.raw("RGB", PALETTE) + + self.tile = [ + ImageFile._Tile( + "raw", (0, 0) + self.size, self.fp.tell(), (self.mode, 0, 1) + ) + ] + + +# -------------------------------------------------------------------- + +Image.register_open(XVThumbImageFile.format, XVThumbImageFile, _accept) diff --git a/venv/lib/python3.12/site-packages/PIL/XbmImagePlugin.py b/venv/lib/python3.12/site-packages/PIL/XbmImagePlugin.py new file mode 100644 index 0000000..f3d490a --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/XbmImagePlugin.py @@ -0,0 +1,98 @@ +# +# The Python Imaging Library. +# $Id$ +# +# XBM File handling +# +# History: +# 1995-09-08 fl Created +# 1996-11-01 fl Added save support +# 1997-07-07 fl Made header parser more tolerant +# 1997-07-22 fl Fixed yet another parser bug +# 2001-02-17 fl Use 're' instead of 'regex' (Python 2.1) (0.4) +# 2001-05-13 fl Added hotspot handling (based on code from Bernhard Herzog) +# 2004-02-24 fl Allow some whitespace before first #define +# +# Copyright (c) 1997-2004 by Secret Labs AB +# Copyright (c) 1996-1997 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import re +from typing import IO + +from . import Image, ImageFile + +# XBM header +xbm_head = re.compile( + rb"\s*#define[ \t]+.*_width[ \t]+(?P[0-9]+)[\r\n]+" + b"#define[ \t]+.*_height[ \t]+(?P[0-9]+)[\r\n]+" + b"(?P" + b"#define[ \t]+[^_]*_x_hot[ \t]+(?P[0-9]+)[\r\n]+" + b"#define[ \t]+[^_]*_y_hot[ \t]+(?P[0-9]+)[\r\n]+" + b")?" + rb"[\000-\377]*_bits\[]" +) + + +def _accept(prefix: bytes) -> bool: + return prefix.lstrip()[:7] == b"#define" + + +## +# Image plugin for X11 bitmaps. + + +class XbmImageFile(ImageFile.ImageFile): + format = "XBM" + format_description = "X11 Bitmap" + + def _open(self) -> None: + assert self.fp is not None + + m = xbm_head.match(self.fp.read(512)) + + if not m: + msg = "not a XBM file" + raise SyntaxError(msg) + + xsize = int(m.group("width")) + ysize = int(m.group("height")) + + if m.group("hotspot"): + self.info["hotspot"] = (int(m.group("xhot")), int(m.group("yhot"))) + + self._mode = "1" + self._size = xsize, ysize + + self.tile = [ImageFile._Tile("xbm", (0, 0) + self.size, m.end(), None)] + + +def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + if im.mode != "1": + msg = f"cannot write mode {im.mode} as XBM" + raise OSError(msg) + + fp.write(f"#define im_width {im.size[0]}\n".encode("ascii")) + fp.write(f"#define im_height {im.size[1]}\n".encode("ascii")) + + hotspot = im.encoderinfo.get("hotspot") + if hotspot: + fp.write(f"#define im_x_hot {hotspot[0]}\n".encode("ascii")) + fp.write(f"#define im_y_hot {hotspot[1]}\n".encode("ascii")) + + fp.write(b"static char im_bits[] = {\n") + + ImageFile._save(im, fp, [ImageFile._Tile("xbm", (0, 0) + im.size, 0, None)]) + + fp.write(b"};\n") + + +Image.register_open(XbmImageFile.format, XbmImageFile, _accept) +Image.register_save(XbmImageFile.format, _save) + +Image.register_extension(XbmImageFile.format, ".xbm") + +Image.register_mime(XbmImageFile.format, "image/xbm") diff --git a/venv/lib/python3.12/site-packages/PIL/XpmImagePlugin.py b/venv/lib/python3.12/site-packages/PIL/XpmImagePlugin.py new file mode 100644 index 0000000..1fc6c0c --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/XpmImagePlugin.py @@ -0,0 +1,127 @@ +# +# The Python Imaging Library. +# $Id$ +# +# XPM File handling +# +# History: +# 1996-12-29 fl Created +# 2001-02-17 fl Use 're' instead of 'regex' (Python 2.1) (0.7) +# +# Copyright (c) Secret Labs AB 1997-2001. +# Copyright (c) Fredrik Lundh 1996-2001. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import re + +from . import Image, ImageFile, ImagePalette +from ._binary import o8 + +# XPM header +xpm_head = re.compile(b'"([0-9]*) ([0-9]*) ([0-9]*) ([0-9]*)') + + +def _accept(prefix: bytes) -> bool: + return prefix[:9] == b"/* XPM */" + + +## +# Image plugin for X11 pixel maps. + + +class XpmImageFile(ImageFile.ImageFile): + format = "XPM" + format_description = "X11 Pixel Map" + + def _open(self) -> None: + if not _accept(self.fp.read(9)): + msg = "not an XPM file" + raise SyntaxError(msg) + + # skip forward to next string + while True: + s = self.fp.readline() + if not s: + msg = "broken XPM file" + raise SyntaxError(msg) + m = xpm_head.match(s) + if m: + break + + self._size = int(m.group(1)), int(m.group(2)) + + pal = int(m.group(3)) + bpp = int(m.group(4)) + + if pal > 256 or bpp != 1: + msg = "cannot read this XPM file" + raise ValueError(msg) + + # + # load palette description + + palette = [b"\0\0\0"] * 256 + + for _ in range(pal): + s = self.fp.readline() + if s[-2:] == b"\r\n": + s = s[:-2] + elif s[-1:] in b"\r\n": + s = s[:-1] + + c = s[1] + s = s[2:-2].split() + + for i in range(0, len(s), 2): + if s[i] == b"c": + # process colour key + rgb = s[i + 1] + if rgb == b"None": + self.info["transparency"] = c + elif rgb[:1] == b"#": + # FIXME: handle colour names (see ImagePalette.py) + rgb = int(rgb[1:], 16) + palette[c] = ( + o8((rgb >> 16) & 255) + o8((rgb >> 8) & 255) + o8(rgb & 255) + ) + else: + # unknown colour + msg = "cannot read this XPM file" + raise ValueError(msg) + break + + else: + # missing colour key + msg = "cannot read this XPM file" + raise ValueError(msg) + + self._mode = "P" + self.palette = ImagePalette.raw("RGB", b"".join(palette)) + + self.tile = [ + ImageFile._Tile("raw", (0, 0) + self.size, self.fp.tell(), ("P", 0, 1)) + ] + + def load_read(self, read_bytes: int) -> bytes: + # + # load all image data in one chunk + + xsize, ysize = self.size + + s = [self.fp.readline()[1 : xsize + 1].ljust(xsize) for i in range(ysize)] + + return b"".join(s) + + +# +# Registry + + +Image.register_open(XpmImageFile.format, XpmImageFile, _accept) + +Image.register_extension(XpmImageFile.format, ".xpm") + +Image.register_mime(XpmImageFile.format, "image/xpm") diff --git a/venv/lib/python3.12/site-packages/PIL/__init__.py b/venv/lib/python3.12/site-packages/PIL/__init__.py new file mode 100644 index 0000000..09546fe --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/__init__.py @@ -0,0 +1,86 @@ +"""Pillow (Fork of the Python Imaging Library) + +Pillow is the friendly PIL fork by Jeffrey A. Clark and contributors. + https://github.com/python-pillow/Pillow/ + +Pillow is forked from PIL 1.1.7. + +PIL is the Python Imaging Library by Fredrik Lundh and contributors. +Copyright (c) 1999 by Secret Labs AB. + +Use PIL.__version__ for this Pillow version. + +;-) +""" + +from __future__ import annotations + +from . import _version + +# VERSION was removed in Pillow 6.0.0. +# PILLOW_VERSION was removed in Pillow 9.0.0. +# Use __version__ instead. +__version__ = _version.__version__ +del _version + + +_plugins = [ + "BlpImagePlugin", + "BmpImagePlugin", + "BufrStubImagePlugin", + "CurImagePlugin", + "DcxImagePlugin", + "DdsImagePlugin", + "EpsImagePlugin", + "FitsImagePlugin", + "FliImagePlugin", + "FpxImagePlugin", + "FtexImagePlugin", + "GbrImagePlugin", + "GifImagePlugin", + "GribStubImagePlugin", + "Hdf5StubImagePlugin", + "IcnsImagePlugin", + "IcoImagePlugin", + "ImImagePlugin", + "ImtImagePlugin", + "IptcImagePlugin", + "JpegImagePlugin", + "Jpeg2KImagePlugin", + "McIdasImagePlugin", + "MicImagePlugin", + "MpegImagePlugin", + "MpoImagePlugin", + "MspImagePlugin", + "PalmImagePlugin", + "PcdImagePlugin", + "PcxImagePlugin", + "PdfImagePlugin", + "PixarImagePlugin", + "PngImagePlugin", + "PpmImagePlugin", + "PsdImagePlugin", + "QoiImagePlugin", + "SgiImagePlugin", + "SpiderImagePlugin", + "SunImagePlugin", + "TgaImagePlugin", + "TiffImagePlugin", + "WebPImagePlugin", + "WmfImagePlugin", + "XbmImagePlugin", + "XpmImagePlugin", + "XVThumbImagePlugin", +] + + +class UnidentifiedImageError(OSError): + """ + Raised in :py:meth:`PIL.Image.open` if an image cannot be opened and identified. + + If a PNG image raises this error, setting :data:`.ImageFile.LOAD_TRUNCATED_IMAGES` + to true may allow the image to be opened after all. The setting will ignore missing + data and checksum failures. + """ + + pass diff --git a/venv/lib/python3.12/site-packages/PIL/__main__.py b/venv/lib/python3.12/site-packages/PIL/__main__.py new file mode 100644 index 0000000..043156e --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/__main__.py @@ -0,0 +1,7 @@ +from __future__ import annotations + +import sys + +from .features import pilinfo + +pilinfo(supported_formats="--report" not in sys.argv) diff --git a/venv/lib/python3.12/site-packages/PIL/__pycache__/BdfFontFile.cpython-312.pyc b/venv/lib/python3.12/site-packages/PIL/__pycache__/BdfFontFile.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e49f6792ce20ec24de91645fdb48c040f2653a72 GIT binary patch literal 4371 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

6uq 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 aixfEq|C1{JjjSCzH#K8FqKwflAx z;>f50p*EF=Odq+n*0s8gonTf|LA%Ec{AjKEx)-WZcP7GpDi_Lg}-PO_t(i?nZ%OT&Q;i(1oE&h5>Biiz;DyjHWbVyMzs@rzi z)m^h}J1`B6U3dx^B&m?6jFt2W=CuhnYFaE?Kutg>Lni1}1cW-N5uH?NDm0sK*MP=s z$JH%M(<>FrEQsw7ITcngi)KMP_2uXnnu)t>mv!5)7*DqguVWRR>!o1vn0D6JYUS}s zR&dk8CVQWHk$l4sA`Ul12LsZc8ySaBXG+X4^^8%mrkqTr>Rv9}hYU8IvCG_;uGlWu ztC?wLPiHK1yrF+LJ#skXm@Ye1(F<1~G$(U$?DNd2sUpARPK}EsT(qVpOgmkvdOJ9q zFddiiAQ0XGZ%42=Z7|G{%}%l-dHw7bOvtvhA$UaE-Ub2FhEN>@h+f%G$P9HNw6!MT z+9i^bvrlEPc5uMl2_bhnclth_pjzRqXwLZG&tqWYh4Xr$z$z~9hS@N>?tx*BtVg>R zh8ITWk1ZuvquL+QqjyK|9lm$+?q?77t?oU#A|K_QU{`>rNderp_QFz~Fp{GN$%PD> zli-mJ#Rx$OD28fCz}2dp3VU7KvWC#{WQ==TBCujbB96epVIn4*?`#Q^VDU07Hx{l@ zw^8-vP2S;`eF-Fcxq;$DQAGpW7Oyq;#V%7LdFW6+88Xb8 zk-&~!fu_Zq-z3!}o~TKacyKRKjRbK~QiWei$?_dwGaJvAT}}6^s))&^qp1+b+=wC7 z?uCjKPj;DQ2|#!}j%rR$?S!J-3%N1s)WHhmg zo?0#z9p-vc$(is}G+xn({r#BKimkNI-hF4<4Pa?6~;alO`v0Jf)uht?% zn=0uWn3sQQU+)#{32ZsIICy7hUVR+xT8|}epSyK#Nq!jHxhauY!UuQ*0T2T;Fn9zG z5&Ct4f%yc5N3$GZk)m7_5t{nn$TbjO`-Pa1+rRXKB~xb4Z= zvd!R(puEZRp=N_kW2XsvUQH85VQ6-FTQ9ME-fPd}`Ak_T$MX4ar*x~KQHy0>(p@j% z^Sr^F0yitz)j2jA5idvJiCDxr@m`$bfEG>?hMQ!)qkC?2ePH*B+_xpim0iz>IRYKiRAq*uFtEQln6xjoq;h zQc@O>sZX=n-Qrq7F}Of9xY;z*zloTUk~#i=zzf6CU6*^|3zr1=`3Ninz(Zz<51>T^ zs|Yj8vFW{nZhQrQA2cUW`wk3n&f)k8E_^Mlzv1r*3&-VJO>1r7Z`_42Doz0o0Y)4%>8WnDV%ig2#tGrr zxi}_YC|0 z0vlklIp4#uDN#!Q>mzi}Kcx3xvg=7SJ{Q?i!!)@yMCq|-kv`hL)b^-9v)Z3|Mqsja zSf+b7dkF2BQy!7-RnooE^VXxDgR4CUSJEebORkZzb<+Kc?jBnsN1l*=RP?Ws{*{3P Sj|N6o2Sy%z@Q@rANA^De)J!%2 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/PIL/__pycache__/ContainerIO.cpython-312.pyc b/venv/lib/python3.12/site-packages/PIL/__pycache__/ContainerIO.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6f1f8c9903753e51bb57de691aa5b46725ccea7c GIT binary patch literal 7019 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/PIL/__pycache__/DdsImagePlugin.cpython-312.pyc b/venv/lib/python3.12/site-packages/PIL/__pycache__/DdsImagePlugin.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..985f127f775a0724e250483b8a48c81ac9f7d552 GIT binary patch literal 22693 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/PIL/__pycache__/EpsImagePlugin.cpython-312.pyc b/venv/lib/python3.12/site-packages/PIL/__pycache__/EpsImagePlugin.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e7242c5a49b83693c2da080eae3ddd952da81ea1 GIT binary patch literal 15654 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 G&i6lho+^6) literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/PIL/__pycache__/FitsImagePlugin.cpython-312.pyc b/venv/lib/python3.12/site-packages/PIL/__pycache__/FitsImagePlugin.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f5ea1a2b82c609cb611dc8b2f1864919586144f5 GIT binary patch literal 6015 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 CenLn9 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/PIL/__pycache__/FliImagePlugin.cpython-312.pyc b/venv/lib/python3.12/site-packages/PIL/__pycache__/FliImagePlugin.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..461efc656f73af56c608d95f7e99c3447372cd12 GIT binary patch literal 6766 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/PIL/__pycache__/FpxImagePlugin.cpython-312.pyc b/venv/lib/python3.12/site-packages/PIL/__pycache__/FpxImagePlugin.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7491e093b9fd2153c5fb860e25674fffda2229bc GIT binary patch literal 7689 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 BbZ-Cv literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/PIL/__pycache__/FtexImagePlugin.cpython-312.pyc b/venv/lib/python3.12/site-packages/PIL/__pycache__/FtexImagePlugin.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..798ef681e4cb83e8fc9dd71830a9b4b2338afd74 GIT binary patch literal 5301 zcmcIoU2GKB6`t9h{qcC$2HX5B32?Ik*-PzRW0ICy5XJFdO~IgGLgaw9W5Af(HRg?EV)Q+jJMvjD(N)>OZOkeucbMDOSF4UB^ zQRm^#nS0MY=iKl7+_U?~cw83X`NL%Y*q`Ep@GXA$Psk<2Em;(VML`vY1yxi7x>yJd z2SlWUdT=-hZ%LO5q2Ump3+drPWHLd|eZK^_JXYIL|ZAoL4r&4+?2)6jCz zl|LNgv$ZfAqw;u@ufFmwbH>#jYWzcKxGo^jn(+e_4xgg&apKdJH;vOeUxp~~y~)a| zPi?cGN9)kItY1q`TEn3{e;* zdCKU>6k$}SibYkT8NfhEu{5GFi z^$>GpoaW%{aF7?PLrj2Ck&8<1eUOnWS+-d~QK&Yj=sHXy`e`y$2GUyvr5>_i2B4zB z>4CRfM(_0vT}aDE@YC}lY66IgU@jV4Hoc`}X~r0_Y}lo+@0qR=FN;!nPQ@)y~7_YPP zRd-KT)fixIvMHES6WDq!e9DkRaHNklZs^&~kyNmmJc zfSWKQRIT83$W`tPce0h!ljt-8;30JG0+~?s66AT zygPKXD)RiZSscZqoTcNnwh_%HZ}-0?myAk~mRTWME1(bz7ru>;n01f}4DuH!1g~gX znhoIr?n3JTGq+@6WrTzFD!Dwds9U7G%E3iev5|it%sgP92ao4zOPi*xo?o;0;o^6k z%mQ2xN>yyzcy(mThEl;Tf>Qx6(dh)$(^%fBz?402VmJZdURZH$PsgAOS{1aD8YDBi z#ueG|8UYV%kA7=e_%S#GPXTzl;g7rhbmu1c*`PrhQQ18PMuDAo&jESp9YvN0O`CR- zF1R#Y{4H>#$)ME1xpmF9b=uZzsG0)z%K%(YdWxVtVlt>CY56hUjw#WpRSc+YaG^jk z9fa=)@b*GxA^8@_54tO0c~n|0)DwqU9y9qCv$d!?l4-im~v zJFyFc-Dl67d%O4i`QDzp!WIY+{_(Sn#U?TZ3P;YUMZIKYic@ypG}=@;kul)d6Gg*j z%2Z~88WR~^8}ZhUrH^)GAm(Ws-brvmD|2q(bfyo2gP-)AUK-Pkba9Gd-^GV6AgmY+ z9|{|_v1>gWjZMEi&35|BPr>20AzO!F`Cs9HmMaMDQAmxb61>Axp;Xj~mz5*Tj)WLb z?;rBgt@@&F8MxTd*?YD-mGfW+C4zv6LaQcj8Q`Hs!7i`O2;-hToX;D^y|%G>P8FBE zUH;pOtASb3hCa%DX38AD673p)cAPh-{+Ih!ga4CWA35O#(xv}GddNSG-yY5gSwxFJ z|4%)a;54&=*`OK*jTH=oYUKSE2&TX(;e{xEuXA$!(roBCSYhlw^URd75?|zj@8#c1 z5NET1%6}S}GhyF{vymCeZt%_C?q>*M%Z{nhYRv6D}{bhs_8FVG%;f%dxRXiup1_A9dF_H^~0yuqRF|~g8pdNKIHo@D(rZ9>B`sjWHm}w z>&ajC9=H|18NW^M4BfkU_u{=vcQ38HvYcJtdvZQL7hVW$L}S+@^O5VZ`PjmR2ho={ z69;eYzq$Xm{S1HNLUfp|UuIJ-{jd-dr9@XxL%F0Af-2l*d09shmP%IFs_uhgwJ^dp`xFP;A+vl@Hlk!L!Y#rHaxcVa;&|J3_!l-1}1oEK|2n!1?^i1)_YkeDu)b3nJE*zcf{PnK2+5@Z70dC2(g#Qfju>|nE0jy4lcjO!( zM;b9rJ=FlkC99e_w`m#-wIXr>wZ(+OxMF9VLiumRwOgq=i+HPEhl|Mh8!P<$QaJ%L=*iS$Vp4$334BrJsQT$urm?-^yTolAt zzZK%&2z$Q~cK=m4@F-e;E%YQD5O>X8d?LW>iF{a$FAO|vYF=wof);ZXI5OP** zx)ypUG_DDa3uhiSwX8L@+-Y0c^FZj@5E8hOSQ8RUZ4dXQ*Y>6F?_Sxx+WzLBg)R=} FKLJa!DW?Dc literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/PIL/__pycache__/GbrImagePlugin.cpython-312.pyc b/venv/lib/python3.12/site-packages/PIL/__pycache__/GbrImagePlugin.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6f4afeffa08b91969e6d5ecb083cb49cc62e51a1 GIT binary patch literal 3702 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 hFX))~9e)-&DMdE)&y(Y=<+Qq(O(*6KuKgk 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/PIL/__pycache__/GimpGradientFile.cpython-312.pyc b/venv/lib/python3.12/site-packages/PIL/__pycache__/GimpGradientFile.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..01475c16940dc866aefc6d5255b9c19ddb074987 GIT binary patch literal 5456 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 Lr+$q{NmuVbZI;{p literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/PIL/__pycache__/GimpPaletteFile.cpython-312.pyc b/venv/lib/python3.12/site-packages/PIL/__pycache__/GimpPaletteFile.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0d48e24623833dd2cb1122da6557cf7fcd56d23c GIT binary patch literal 2108 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 S+<$PT|KNiokH~RxWd8$-hDx;n literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/PIL/__pycache__/Hdf5StubImagePlugin.cpython-312.pyc b/venv/lib/python3.12/site-packages/PIL/__pycache__/Hdf5StubImagePlugin.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b9becc86c8a4b481f97dc2011b76eea54fa66c6b GIT binary patch literal 2664 zcmZ`*O>7%Q6rR~#uO0uy`FCT5c9oV=1F>mo5h{ou0ih8ztyICm2w5A?INfx;HnW>F zwv0$oB~n0Yq8`!%2M!#la_Ny1;?BhpDGjS0Dgi>hMM}B!#Cx+|yFYZSo%d$mdoyp| zeD95aO{L-l+Rqo?pZ{GatFN}m6^ysD<@Wlj6vp85J6~ZG6*`7wo z@x;PJ$oD8u@V;;jN~G=no;2j1Vw>Dl0*#KP5$gBo|68&IOU^4j>qaCua1V`g)K8d> zQ}ayEsyQwUm6q~aInVt*Nv18E&z4aVHsm21bT0il#K4Dn6x^dogn9W5#F0D@1O<`8U$&<#ZKx)+H z7I@jqOP$#p)Q^=qcHnWe!@B5@@qiUvu~evXW|;+6w-?<)z2Tj&Ia7=;6`Y!2OLfN+ zW}~pgouz_p&2{82=Z_vMxR%GK>Sp-@xaJnl&U{!n#VRMxd5d#02xslZdCSSy8~%Xc z^Ooyz5jrALusZ_A?SpQG?Dms^%%xL%Fd&bF4FM#>HUtcY4dI#vm|i$S$T^ZzXYXM^ zUF@zvpi=Q{{03f>UKhM#EeFRGNf7(dl36bEx+jKVG>KN|!3x<)46aSC9bG-y9-rDu zOtrNs(GP+$eBBm8Y3~qBZ4ge1l#!ysXiao@$pR_9JmLlwK?>$OV7<({ur-FaU}1uk3-_QGrq;1(&N zMKkjR3i49$JSe*!bO6A?(T&V{W@BP~;@bXI{jc=cnzwOr{o+Pzz4iUu*S^?JKesb< zaP^%#L(g0<|28z)PEOv9C9g)WM6V{VB-cLPj!o?9WNds@`!>EaD#=|~GP|C=HnFPz zkr>=b4qg4=$_LlATghj3RgxSE0Nz0W_yC0oK8Ztw{suwEf(A)OX9dC{M}^E9R1MB3 z3}FBFgcy<6KQG=cvO@F8$b&l7(1%sB~uaTKNj;EGihwes%iNX(+aH*N@!N4$6Qw)%^Jr zO)Y<(RlqeYDFRbNf=VIbG2$~6roV@I%=gq#EGoMK9 zPsItT;d;Vo8NCI9g$EHzl|{fJKuKUUecfx+EoWY6I3NP6m%s~=x3e$Y&K}#!9=rL`Pt!Ng+#>JF GyZaAplS4KD literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/PIL/__pycache__/IcnsImagePlugin.cpython-312.pyc b/venv/lib/python3.12/site-packages/PIL/__pycache__/IcnsImagePlugin.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3e00de3c03da6259f397679a71d195cf058f1fb4 GIT binary patch literal 17267 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 B5-$J% literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/PIL/__pycache__/ImImagePlugin.cpython-312.pyc b/venv/lib/python3.12/site-packages/PIL/__pycache__/ImImagePlugin.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..94a41ed3e721fc9825c8a111b6c91556b9e98dde GIT binary patch literal 12725 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/PIL/__pycache__/Image.cpython-312.pyc b/venv/lib/python3.12/site-packages/PIL/__pycache__/Image.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..14c96e9195600810fc3ece434b4b88bd6b728650 GIT binary patch literal 172271 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%0De}E3~ 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageChops.cpython-312.pyc b/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageChops.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..71b6db4edd470a055c3813581b9e360ace7b7913 GIT binary patch literal 11239 zcmd^FO>7&-72c&t{gAR`D~>2Tjx%%Ntpr}uQ6a#hA9+E>_^jM%52}BWtr=mpZkOhcAcqhx7`{&0)3{HO2N+pkA1x3Af{6RkUeV;6Aj0_*_n0DJ)O0l?jW zy8#~rd{BQx?*!~z@fN1X@jR{{&=2Z+fU&FGm3Z`XB1l55#a_BD*t-dUY4x_phf7K#H1*1}re!gW zWpbE8q-d3C$`Q4o#b}ufE^w@QL2Mp_^K-UbIS1 zZ?Wv=>_SpECVC4t*C&bv7gOoQoF;lLbIfahBGrGS*D+lqS=2IDfY<58WO~J9hH`e% zNfpc0<_w7HYCy09Z;RvaJcQz!@chFP(ot-GIDGTD;(>KyTJ2@AQ^ENzO z^1&oG;)7jO*85Fkx_)X$2-Ehjn{`nn4YkD<2LgE@S^VL`eA~a%(_w!wtbda=--t#Uz zPf!~bplgQ`iN1aA&2!h!-;M2j2LyiCxS4w|_gUxR`Od?Y&YnsvITub!f(I9EeQAFP zJoiCx^b$Sf#FJ7R^WC60 ze~^k!6xCM2cJJM@p=zUifd`LxI!i9FCa)XckCDglcaEcg80=OevA3Up^ZDy9+zm&) zN^I9VCvKd0cj9LGz4B-A1urb4(G+>E%YDM4^3({Fl9{{_@dVd?( z0)@~n6vE=1R`Nd@Xgmb|zqBD4=$nuCebo8Mo{#rb;wLIGY{)0Kkql@LV^0@syHqL~ z+{_nkhqj6O7Qt+A*DjJM7+NOBY_OVpM$mAUmF*JCmn_#TTCk^lE5Nf-Axoyt#w=KW zQvde|LBT$R5zKUCQ;H2|#SE6KE4kk2H5>-N$t?G64Vawk z*c#h>mw96ip3_Nlbyl;I14C2jic5CZW#`G#WSTW@a~yy3n_j?j%W!~tL|BL`nHdc< zCc(_N@UMBsW81n6-QHWq)TS8voW}L9iJ>{5UX!7L#(psK7x?oO72Sq?`zEU7ucGoGjfdh7dbM7ljOIk{I8zbr$f^X zzQgZ!(7p1x;N=-z4;o`VOgAS?-B*sDA%)YslhG_#?>M|`y5B4i*x9UOxMX56J8!zM zlX|?)x{=jjh5^0J`cr-K=r6m|qrOz%Y8F+uZ@@q9*;KT<%C|ob8W+F&|INeB(}HHu2HR zpFUfO4^?7k=fY>DQrJGi^lwiwjKNKtA(q$8`wdBy$KaH}w&fD#c?N~Ow$&0PO?Iaw z3BaEuAz3Ow&Gp7pX#8YDQnYBafBM*;J1g<$DzV|Y@bGrpTHb~xS|T=dJ|nMg#xje= zr3&dj^~Pg#7~8zEkj5OA|481}OP0NIqlpF@p8{k5Ld^Ayxt;&-#@x>@d5dC8xVyN9 zw}`vD#a7_2%{5uvzP!f}c>K2w@p)iAKJZcY6Z2zue4nbs&di0+Y@-FNQ9$CnJ&tgb z#m-zfyXd*AZv~!H=V^F&e8-=3<-x(@xGbkl7z|6yU|xr3j{s!Yu|cheXWKcdm>w6M;iR zgFz#Yi<)#NC1C|6rNbz%IadTWg!afo=@#T;)E zs>|jp86Nc+j>ci|`ilU+*AGo~&&RuGI`8b6g+uy@O6=%d_~>@x_wRjvzxp*Xe9X2j z?-Y|@2TrlY`y+`hUhY>{<9>a)Q|o!K9yv92dt`m~uescD)~#Rlcy%8ht(S^2txT)a zA^#LAqQ*C#whUhf!pSb&aekr(bhK7*D4bl#l-Z;~&bdGWMO}SoONC4@iDHaUZajY? zB-2zPVmOjk0tZ6PD&{nYzS}(ngsiBDnkh#H~^=#=n&``^gYD zkjud`h_&04_TsxSgXE$u>3)b+NAh12tfh`(3DLqdgQYb4F42sNeF2(v5Y0~CIQ{;y zTgPUwt@O=>`-GagkO>m45yNn=)~=xfCrjvBXj=VI=-w$fTaf?(f%Tkrw=rwFNN}}Z z&(^m!8uDZWJ;SL~4}~V%?;~q>O=B=2;pr z$+aS~BDh_`(x9$}4iC04g+@oq63Zye5;(PeSBvQiOn8K3tP)bF$VwW+$RCzqhoL?? zdetB3XBJ^)X?eLBrP*+yh(nf`yF7NMWwSRb&0fMha`1~!QG$jA|B#&XlFr`TWM|6P z5msQmD_i0n8iPqDCQZ&2zYl#j*-tLbS(s8<-U||YZ@S;ivqX4VMh71R?;xU-9aU}e zzN^~g&3UP$QdiNxn{zk(;2GtExa`Kx{n2!t-89>PPlygf9I7F-LbIf-f_ zx@vzqh*l$6WH-6u)A(z65O_=Ts-rGar~B&pBJ~t=T%5UjA<-Q8BnpW0?@{qGim52R zpG~t1cEJeDV^1|YGLkJJHOLql;iLnqicrlWaZhBh@h-wa$u|4|6^E#x7$~Qp7^grA zC+9mSkFW67adNisr>GdBf~;R*5{ZpbYIC8Ui1V}3SuY)a%_qfi-}n~)0h&k!I4a78 z231wRJfx_P{!4kF*4U^fYaNYhSFIzerfPdz)pTutt2#)4m+@CG{nBp`lHEM!nk__bLZ^yvjh@tDL(iD}RsdtVO8v!lC-ebN)zF*Rz^Lbxn62UsZkeUG-J<-{$4zD7gOO%J$KYYZ-=V%yrCLBf2daP(St8|hSs>0eTrW2 zf}$6Oy%*df$50(VEyB}c$J4d^v;kzKh*CDLe8xS_?>k&SnHz921utjf0 ze1pCb;U;}E!Y%q%gxmD(FDMc9->XB74DSxWn`^L<3hwOZ2On2!!!|RS6Hh&oXtm%-px%^#Q#d zUARAr`^Ru^*N61SaNlj0Bx3s0dN-bT=%3IJ;J#=uhT@&%niK%gp>>UdoL7FThtWS-E8@)+)`^0q8*Byz6jnG&!Z(wS2 zGHS$Qd&i=ocrw@gi6WBTgA*w720?>TyBjIH3@bHPS5yOk&VU(M#hbN8jNGKl0 zkARuGKOE8tu;B>uL?(`mjK`8e&fhT}>ocOGkugf2wG;v;gx0F{b#-fz34lBr8VPIhs1`pO*2W_7_*fXpwXTj1ts^=XHM9ev z2|zg>o``D$)3JDXoJ;D6PEH$R!+ zCy$PZCoLmUk^g8sJ{fCkZ9RGNWQ+41XJLr7qtWrOHi^31G;NvWt)gwzG#m8g@`)7a zI17jdJ5wZv<~p0S@xcdoP?I*I1B`ft!bqr5bYm}C9+?P@jZJGtcq|->g>`LeLJu2S z_rAXF7ERk{ghnFKsTdOI(FqKtPCYEToLh*}MvhXqJ=mm;qLcMVEN(;&PZ7q+qG&u~ z@z8`GGIY*578wao#KHoELA>S0w@glJ<57KT48M)&iHIJKVVG-20M5x|{58IR%_MsIQ~{H%5qS;r`)e5pr( zvGKIRw9%=F5uQLzS}3NS43CY`9mp9qnn#X?N4O@Gqm7G7V^gRgel!%<(6L+;_3eoe z@JayY#|TA@={8X-Vcf=+4J{kA$;cS}z|}hv z$B1s+to32`6A0Zjkv7S4D8+^r4%j(g zbSgeM6*t@2s5Jw1Bq}gTh8IB$e7+om^f&JCSpiBt~Eqy z-kyxa#K>^N&4FnpUNo`%IGl`5jq#X9j!b|O>5Unul^8jjxYB5I7XYO|@t6|f-eNLN zyXP>KTQ&hTCXa@=kdK8Xv~4^uH`$4th(U4DS#e{!HT>)d(I(JqFi5lmG}wrOC1~;K z$#6rX#sn`0a=C1WO-8Bx5#V@7@8M%0QL&bm7L#3{j84?YwXtwqn~qKa|ImS4?y{wU zi=eN^(O|$}gwW;06$X)s1p}=i7N44oVB$tbxyVrL__AeAn*UL!i* zI~kq;5)iS9p%+Y+a7Xlu5Ys?6j7FXX&=4l}bYtLXz9NE|sD}l|497!}u~-@!fWA70 za5Q4XF!84jgK?UCx=Gs;9%<1wr48+46Va3CuV}L#g&2W6CnNEr+Q<~-C=eehn*n=A z&Ec@*CPDa^4};4zI+(*mbOM}uCfi~XBT@uqL6p=`C~E4>zd+=yG7B~Ic!Q!CMR6+? zln}S6@~BE&Dq)H;K&d^qrS_(!hH@(|PMyW6iydYAbhqv|)gY9fWvAD(<9_qk7Zp8c zRzaBiCGROUo@+jzRWC?5pH~|LJ;~fXodX^HU44UHy*)D(&I#7ycyl9w{7K*Ao&5up zt|Tp;e46w!>6s}?dztYWC{S$1FGZjFnUZ=)CB)CQP+W*oVXZ!?);DGuL8><}>;NU{ zA2ut@8s^gRWSE%j@NhD}-7J9T3Iufzy-B*qV@F~%4x0ACQ>`)ML@Ri5B-E-;j!nfN ziIQO5tcOpuflB0KL)>&ay7R7urbn;%+ph&n=kgMPk}o`Y=3@)1HeK9uaorp0 zLQdQ1j%zs;^Tn5QRxWr}-b97U2nFUPhg`i`jVEW7urj3T3hX5+Y$dKCkM17w>Ykyj zX>VgzGE4A8gSyM0alb*a8^C#`r_pDu#66iaJS;{JeI6Jd{v;#-IRZI-o&6o1eS-(v zyOX8;o!#w&U5|GTcl37m_IDlV9PIDvNahT*4<78ti{74OY5VSh-tL2g=}BIPeu!#} z8Vc5$!3&7QDiFM&Bnpd8e=Jdr##WlqMNg&3MCmg(p7LgH{ImzUVD=uCFG0fWwj1k^ zrw52g%{DO46{8UW^uM0IgM-Pe-h+d5_cE(BTIjtE`3Cw)!DsLnD?|Xu19_)A6M6Zk z_agS`PLZ0@q=D?l16=COKSY=rWa#Y}F@)YBAHu95KSJM7HbVbUj-EY~i&)N30AcP> z9>Ty-KEk}AAj15i0))Y#LWBiFMFmFs0g6?*wlrCu?# zLa&4cYsFBtUIp#FdT3R6HS9(!U+`RDXkp*drdKs;AOt+YH}j3zm>wOOBHqesIruA> zVCXnBno%$s?a-kyXm*=gjvhMH!aaZEQIvN>0n*-pVE{n^1$cNv(GU=YyrCexp@7`o zAd+_j&y^de5%7Qsv_&o?!NUk59KbQgJx@!h`W_(2T8{IR%Zn5aSk%@3~d}@L;GSHdmm=*<_(qN%D zj2jr$5hJ2cM!~0Iw)E0A88SlS+C-byHaXokG8T%(+72PfA!4!+(vF1DiyO3uAJHZ# z*tB))p+i=UH~s}M8oLoRx{R&3B|Sa8J)N(sNp&IyP!)|QS~6!}f7hPA-mad(ftdmx zyB7P&Un5z_4IbMckJ&>=JfRTf+HR18tP2u^&IT(9_(-L8Q9y~ ze*i$XA2>LOL>-U8!r~BelV!WR+dCd(_&a(J^mX=t%n*qw?&*DEf7f7VZx7%0c0GBp zFPXo;Yv2C<&Vj!E&W`r(j$~eU?-P!nB?kvOhj;Am8XN%YdAzHmv%9P3v1Gx%gPj8d z;z37u`@ldl@3GF#zTtt+k00#p=>XgSu>+(G1T9%k;c#E?z~C@4ceeL;4GDP4#EbsU zCC_tdQ1&ss97yJL^!7b9+}_={zdc#f)4Qj0Z~H;?Lgzs5LDYbs$-H5EaE3Rg|J;=R zb4&Wq9m)K(yxY=$Z{C#td)t;|FfIM29mxPm%aM_BX!B9s_!tInDeWUX<3ax&L}KqE zctQD&=aK8Vfzx{u`6Z|KB|NJWh2@~)xR;za#`Tga0I(z|U5VQ4pltQ&-s|4NAGor-tvB6DR?&MD6ZD%W zRqlayu(u}#V+e>Jf;})zO6JH%J>5?k_0&6q6g-R|S=7@DL`*{yp0CD}l;lxL;_vAl z_m_(W7Ovf;+z}CLzH5Gf{#=1AO-yt zv>{05p@xCZ{>M8xqtQVxhAG%X0gZYZog`|=bg~E$AsO40kf>mfv6nIuB@*beA2BBd z@;^Kl8b7Rub{YoW{4>4HLvUJ||M-_hj(g1a$Fj_r zeV0l>?W}q%+kR@sOn!L^>jkr}W4Y#Y`>wl8FnJhv*>|+9-2P?8%(j{En|H3=*{3uBd>tdUvgEQLE6NO+ z-99Q;&pPFauQrRA^_X=&udY$zB*OBARfi{_Fp)~Z7ka=_)3z$7+?i`~^mC>@aNl1a z=pOoKwoX-^0`zN?jhF=|UGz)EKYAusHLTSQ-^}YdrUox%0hnM&H*eEAq47d;2*H9u z7A>gDSc8a>K>|NQ(8b5t1leR2Kn02CP??XzO3XG37Dqyn36V>duED+?O3OGFJ=qM? zZWsnyX~`7XZCNGhJsFt*6Y+*(BaukbWgPBFdJL?A%v5wuoCu9Ygk^;-0n)(GSdh$# zz%oZR^ATukXbFPpSke!hX`BpD$*k}M*$b+e><)uvsKM!?AEY z=^25kDOo6i940~Y@N_&JGoHoRCj;hl&f$ahNlF{IuC*YO%(g5pPz^k>@Yrb5Cvzo> z%jO-d(%s00vTM7Y0s{$oZcIL>d zu`9W2t_6!;ntgG0{^UEsb&0i2U;VYO{MzNUTNesyQ!Z~|Rib3w)sp7LlIHVAu9R#` zz}yrYnRI&emC&QwY>6q-)kjbUHz5SSMoN>q-T!28(4L{sA;a_T2a+}$LCuX0^0kx z%9V=sKTzC-Ro5z4&L24!zf#$BQB71-e>wY=?APk9*6vuW-SI}@UzYu+vTsyeuHAj5 zqT@$yWkvJ%N>=>HEAAhpe8~PmtPzd=v%-!#<*mBXPLKPo2RHB8=KXe)AMtN*^L8rP z-+suA_+Kd=ggqmm&elaV4Zqc!#6ZDp)LDgClelJG_+`-=9TarfqV)XBDrs7IT_u6_ zMPy9+&AGz(ffd3y+ZF6zk%`f0quZE6V$NZ_gjkFU!-(^E8=uCHnUdRv8Yl_>0wt#5 zHEaRptL8kP4J0Zw-0~9DxLxsA^8H=EP-D|LE7ib_eH0NVYs##F9J5#xlFQ2^iQvQP z%$Kbx-Oti_`g#IX3Xlg(IxHl_rXukWEz97y7KVzV>qHF=~7eT$+w><%1kiGN-1D#_v)Vmng)`b=+obFg{BO39*bXP_V?x zKzx*?88Z7wE5l7!g}3I`77v1e-@EB{nMq=ZdXwsR$V@N@g+0gE2?sA6m+r!IiTDq-vTP}l!Cax|=w8TZxp&+3jEHnPDLs?)qd!ZSOsb!s_}GvWMpJmqI3N-uyk<6JtI!(kh-0x z`R@W<;o+p7%AR%4dPZG)lxG?gK5gr(PP z&IOc6mu)!y?0Szfn{|3ioER2gndDf=cqA7uxgfJLN@H=ZH@Xne5%tIzvJCL(zRg|o^;bb<)4^T8$;Hr3@BYyCUeECA6ZeuPJ-=vqbCbPs_<7)&z*(#G+ zF#16DOnQ+aI?AjwItmd;JfyWpIKRlH%&^Y&#gZNZCq~`Ol9LDoKPB2Xv*I>7UUHmBdrQlHl%tfdczI;L?(>l!7G@U~rMyaMOR7Q%6wW(>(`1z zK^2}Q3aatwW??qv`)p6DOljJ-;NJ=%AUI$5YD=Pd$AW(c$pRJgTVCCDeO29@=Uso5 zpx%}MgSOHXXF^ej2x;2K#|j(0Yz{o6*Bqc?U6FCQC?aH4FB3bP ziCU;7sUUSV5qk(Q!D2Q5)_&%>1^-F`pp)*dRkJ1b$}H&mAROny#HwS4nQ2bwM0+VG+*3 z92#>Bf+Xpl2%i*F$`gysgpJ?FL*visjTaOkGHzU?2P6X^&fqI>rQ&V)bk zQvQqiSN+wC{_6SuFF*OplV2Ps$*R{`i zU&?tg=gcFE{+dLvWG-+!Mq3C|AP`1923VF}=zQlakgt!!{$=EWS-NZ%Gi#Yoo(I{_ zghZLlGC&cF)Z2Ai19``{X(*C`!5y>A4jD_%AVcXcMiG@QXES+3BDL{I3{v^XQG*tr zVZ?d^H-RKMkB7#lgdS|8igAhFTZm%3Nx7u{LU^7A48z zB;vtal(@)|7^;FT=2M==yd}#Y#sMmcp<7R}W(ufoUJemr|2OF;Ol}oXJQdpkKqZpQb)}?|JD^SW;rV1%mgr%UH zRN75LRlTcjWqG}&xAL>RMFL2IFHMsrat?e`Z^GII#t_F(ab=p>Frw1jR;O9O9dnJl zPpL5AIRrJ#SW8qhOM;Lqsf3}$Eux-@Y{xCL>a1c4$hJxFlxw2)-t#}J#?T~~RM9TF z%sW_=>oi(mn-Oi=gqfW+^XVKCcN)UaPQoFL*GR`2wY_0Xa=6e)Er#q8tbx;S)49d; zD1_Sr{QjhBVyoSU4iWYp!U~~q0+j+BxdxKs@2F@a3jgny&cjuN9SD zE!wbHwBb*SFFyV!Rd0kY7d`r-@B7ZDfBf_tpS--W{c_RnIbXt;fBI7>=UVQH`R$i; zvD&nT@pc5&S(hA8>^s4ubX6Hjsyms}M^4&oft>kR13MHoYMty z_l{V)57PMY$I}qoM@T;NoDP6Z;^EQ@c6AyizGmI_nuj&T@^sg%d&Kpu>-Y))0#_!w z$AS}>sJiErFK*R3>ocds^QxoFtPEuqqRcF-OovkwmtDqXd!4RMUve#1Q?}x$OO0E^ z!h}DTo5?i_4pVlkU3bZ4i5d_ijnro*QguoA%&-M93x~|31)Mihi}lS zoab^JJ1l&m&!PJSwUSug4s9Yr?uip@$Fo#V;pP#CKbLkS0yipQ9&CcU_~ay+56K$O z1syuXdZgsWAXdm@+D)v7lC*URI>s4Da~7(nX*`T+vB~gAWHbU}B>9&RjT4IvrcpNr zk4mnz4IZCuhwNE<2v#9XM3|4*+fs*333U-@eIx=A360_BpfN>pn2jXp0szvIwVFrJ z#1<0K4jn=@+Fh&QB2Wu@jtPJk9RXd3lkOC+;gEE=m zMO&zELbUS$yA*^|F*@z=beh%5>U}s*8uU^O`MuZ9Eo6#kx{hkxsym@eWZd)!N=J)& z;eO6O*cfNI>&0xC1uFIgIFkrpZ=$L;YFLin44yDcu+utl2iw z5*oMs$R#eCRm(ngS|5>JR7d?uJ0c`Z+}&{bF?~{jQ}HN60mQ>j6Ea@X+yK1r5w=EK z!^RRG7`qMTJ8gUl4zI{f26`^Z2A!*>DhZie!Y%AAENbUR4O}&a?=J6;j2t(#hh>!l9qw%p&X{TBK(>n<84|yFdfTxP6wx@#@IvV z8bU(^O%j?(3)JKWxLY@Jog_+;QH@q3TBtaF)uch3k}2fssT052v;kf@MJveDI-P20 zw75rIM6IL63eIU&X7&pCcEdZKQ<9H2arZbGrXvIjo1R1FpvqQo84?`PZGGmF?)|{y z=y7WOhXjx{PrBH0*QU|^2$q=}HZ*T;G%;M_D{SF%3j}(H41MI6ZgtV^-2(4F(@1GA z8x!z6Zdh7r5w*71zNGZlydKduXbsXM${u!lyEK1B|5NP|ZKDNTrd+mrs#zo5;Z=9X zTp1l%k!!QvL~?{DG-6VUIq&p|B!tn0U%UpQzqCh*$LiWi5EKgtltf$9glL(DM?{q{ zp(G|_MMKbffs^JO6_}}ssZ@)ZTx)v>)Y3eymD2_kqz4-u+DMVG!J>9BZfmuYPa?g* zMXKI{^1#7?L32M(46fJ$6ihTOfNaq`Iilm(z6dTPcB#d~W7EuqtzzVRL6GcfEY3}( zaq+TbrnZuErq5Ubbc1Bq0)H%`zzn}l+Z~P49z0VJ5S(AuE%y(~#$$$~Dj{}6CYsr1 zV)rAB*&$00i^(-3>`#*t#$N1aBA(nJ_vSQ`>;QshHQV9sxhydR2x2V?-DfRtSrbe$ zU2KUXB$f?jGkn^dCJO4D)!2GtZRQ}Gy~u5?=}Mmy(lCkMGSK%zxtoCFpvt_4?AQlJ zqX)7(g~HMVFHx)5phKdNEwi=ps~+K~T@QiwgH0B03gTgNM~I)2c$ph1H}GuQ{6Rf; z#NAWAt{P+)!V(M{+(-cyx-BVQ$?V|+?N9Pn1Ywb4qYPVX$ZnJL^$O+C_)W_8R|v3( z@(p?uaB`t!UK$ff2A8zQ_&OIRCmX}V<~w2Sdy8JGCo-;~Bnu={7>r5|WBfgme}NRn zJOo%dfuEkgXu(&RC@nwx#LG|2<$OQ4^i1?MxS>37vHgwJSGF8@yB$FyfA^gGT0S-! zd?pIJKP3vkI&dYo=6uchsVnQ-znP67QLz1+*%yC(A-}_!HsvYy!lk8hzUgbhE5RMt zs@9)>_;S^bxo&#a{I%6rf)8G+e&GCp%hhdj2dM4AMUQc*0+H7R>%alnAR&|xcOtd2>ml%m)wuf2Om zs$;6dx@GOunN?XGQ=d~E>X<9^e*p$h1Jmfxi>YNPW2PWL>W`GR1~JWe3Q06D#VIMi zPQt646anmRp&5e>s%(rPwm~8dmbFLV#zo>I*J_a%!JA@J*eBWm@{4p9A5LGP+su1yz0zULsjDoJ$p|E=bIMHjsh3DPxTMDW69i>u?hB%=P7#nqPbu_K|2I4Q z>?9$!NNKxf`;rJ_ksKD8@D9|k(JKf}0+?r07dH1`=acC?WA>-SFP=z`-P1#lRpSm1uUGTTQe=Sgax7kBBvgdR1l+TrHa(^Yz?EVAq zCie&#ea*|VJe@;DPFJQ`PX;erEbGjAEK87AXDgGmF1b%-ITn1fE}%TRU|o_itgm@9 zlv#)}y;hmo_7rqjmpt~S1f!ipH9xJhJo z)9zr4%2-4o&9=kBT_)QO7(Ewe>dzAM;0~i51c@O7!StZ18<5t;Pq;X{CVDLFN?aBT zbU%9=(elO{K_#VlBV|wv`g^kual@D>MkYv{1}y~1<6e_LO&ixe+i}Doq7>VfgKoUL zp^EdR+i{qx3#u>4m`RPTW(qqF$#qN7fXkEm^lfNh+dz~7S|cqS6D zg^?4WLYYEXp1_&NZL+~sx&&WhbA`~cG`h7zS4!8hgp$Z}%T%iEzJ!Dihs;pKfH4Bc zQ%IDeZDU8nA^2WS2y~I|#VwLCS<+qu)CwG%0QC(l3P&Gk&{8JY&zqJf*doO?A)E*i zkKl|DE={)9vPlW;iUrnIA*f0R8<`75H+Ay4zl&o+C~k;!Fbc@ zC+HN3CzRiT*+NIP@z{~qL^QEKpg|l3B8Ex;6`Bx7e-J8S*P>3AesL%PdXSFTIZ2Sk zqfKnZ>>@KK&O)H2M`~d1D4yR=KuLMdEvWz`sk}5F- zgdLb~Mij@l;6Mx$1`8%}0*gE*E6sY8nX++4yJv`4{+yv$!dBAEARn1F3GXcRO`2hU zAxxV;vCWDVtwBq;)GrNVVi@DtMrbRUWIo~x^mX& zH@-u!k_gCGmgYm!C#kRTcl3%qkTi<1!bS=c4GLYt>F0HNM?nA}(=lxq*_h5IS-5Hl^+Ou{yC~r2D zbmY0;d^phIcfaNLB0fUBU|zI{?Y456?`*TbXS1PtdQW9P zm+eqJvqJwC8Z5JqpRVdDgcGa)l7NN9TX`}X%Wl|6Nk?X})Mg4N3{vzkjxd^lPz5nj z2vlI1(NW3up{k^LWkHjpL@aVZe&A!xSdQRKCXZd#g@J1%I})9-LT(KAs6gqA3hAX?D8XU6ZuY`{J)5I64|7OyCZNC#nntpT1Rq*KLm1D6c1e~)JV;*5v zS7WR(KrO+4b_k>u@Y+~(G~UdWK)b7@wW>_|vn+-D8Kg&nr9<25@m=(1$@gr4NQ+6= zpS63{oe#!PzlqLb-m)fbF?_kr8BGm8i$e>cozR>#7Y#{;WH>D0C*5}4U@9J%;?Pde zJ(!SG0m?fP#@;{s48)U1p{oeR8M9B!c1aJ2z`*D#9g&Viag-$7PC^7Wt?e>IqkLK- zpPm@jTcu+qsc)p;LkFV6^hlGHo41AXe+L?bl1VS46EibZD*cVgWMjGaD<_e$qZ|%``(H=pZsuVH0%Jkjj%j9d3?I9Y!zG z${d^u*gpe=4RG6ae|amN7JFEur&Z0KGKwYW+!5BFl!R)#^fiH*m6&ppV`S(k31lB&EF2rCnhb6WSASVyO;VGL-6<|OdV(1c49+b$@B7_Voupe@AaGb+d?|G&*4 ziF4jo!$&p)+1FOj{3Mo(pR&z>1;gf@Jd!xy)1-bdb(-AEb|NA)vUrqK&_D8%q9X~& z^9*$EUi_rEr%64cXnQ`jrsP{76B1KNgQ z(Ha~(VQ%zaZchRvYPsVVDm=YXLGgH7KiA65x_yy3bItY+ip*7+ ztKc>mY1NU2fUON&W!k<5UdN+P36Np{aTl|Wq^TIoZ_s{pmiXz7RWfvudk1}~jRgy3 zbi%*0Jc3O~@3feSO)ASfEG_Mu^tE@9oy2*Z^3@ET18NLuJvQiCgSEZJk`tEdveXmH zyv*RF#XUjzCpYqlZxvX5m9~0IDx z2RB=(Qip_hD~*>}>lMDJbZ~h*Z9^_lS1~?qX8hr$rfP!eN?2NlR_j0Myynr=#X?FC!;W7^gZ;L2M}hd)h@>w zW`rtiUW1K{&|}&2nuwF(V-ZA+*parAHt$Mbba-Q0PTxztF}>oTfZvC#U|gf%Eed#j zkNk(JNn&wNp1)w>mGQsv`U(kobh;gUG9Ooc-ZkIJg)sH6@qRA*!puT$?Xtel6{zF+ z(q`qA!e-?Ug6(sw7H*_piKYDJIY|?r`)=CRs}p+%fU12hCJpw<$lg> z%VTTqEY;bqN|)+N?1K8f4kp2xg0LY#JQkjg2(F*tP8GTAUe0 zj$%(fHAJ@VfQXMfYt~zGzyaRgew{hk53A+LzMxXC_ZZdGb-xkOnHI>*A7s=nTf`KLiwlVU6$G2; zQHS`53i^!&oOEm?o**z%c$k^nh|_qcg=}s3u9ieGdConFCIllyWpXm2bOmbpetY z!9>lyXAM-|aT1Cwz=;vE*Qk`*X_PRTtb!z{v?hxVL1OudBd!timLJo^UCIZS_4?jnq>L;L~V<=kF9e=Q zxs~hyTurc_NNi8Kj-x>izT;bwa(S{FuT`v^k6f;3nCnXA@V18HtHGMZV9mMp=OdSc zbne>ww{n%j6|c4}1lRolZYzz6k{xeUzLEQ_hZc%@twW5?eR3ht@Z*#h?|*zNpyb_! zp*8{JS95nN=S$n`mA?qK*SRm{6}7K+Us~;@cztlU&wXiIV7JTtrpt@?h{axzk+w~s z-RjLTJYBl8=ytCZ9A$yj;<9%houbp>h+QwaGM$Naiq6W)l-B8eBg?_LHfn73tSh#1 znLK2+T5`!Va#Va918-nxaTx`(s!{AbHsgZq0URW<2ZJvdxa&(eD2-XUXVwLV?)s94 zS$~Et4w(+U81=A8#vQkgE1z|n^{@!wO&0+gvqAxMr7((^+$E%p%oH+kJX@J~`NGBad+=?qMc zsSC=Kt9sNNhCUuTLK?)~4K*1#v!gV8JfyR~r@dPgyM*iD%Vp$<%s_yM15nyfkGe_V zAy{M|VX>Od+lJe^Tyf)<;)nz&B<4CNmt$r*3GFUwf7??KAKGX;Kx@WiFhC(7&{P|* z1i`RCE<8f9a%^`c>7RTMNXBQmf%GAHI0lyrKWl**_R5`DwCn5|+~3*1{J=J8z4R6* z0F$^O`i9#;+}0X#JeM6~ArZZ|4|ZxdOOP!vWfv0O7%zE5mvlXP$I_%az(l#%WpDfX_3l3`C2lLPPG2ZTUgG>AY zBH$A1VYvQ2SV8@3yRHN`Un^UC?#Sh`mbra6*{rbQZ1Cma)q=H)1#9QLIE(x2r(XWl z)$+}Y<(uaM-zzA6r5c|Cq3xqrOSUhTY=5WZkvBGdt7Ngbb0N_AonX~hykA>$K73*Q zMdSBd6J=F6Tz&VMhZh2?u|4%n`Mi6+dw%EnqJ?17g1_ng?*~@Ay6?58{uDb-A6i!H zssqH&x7Xv_$(PobA$(KyQJ7u1d$aq^+Q9A>_nR$V#4|I8y}zK$Vb(?G7QY0&@d&=N z@eEAd_`-r4XBTJ9x?gsEHru0|@<2n&c&MWN1qXag3B5Cb5>))1a-Srt`yKbV*$hCE zeQ&%JMesFi9nUuFh34lv<$ca;YkrOH(A&_oc}m`$>O1L#Db41g=~7f_T!0?>y6?g-O4R#00S>*_DWO26Ej+4Au>*b(F~U zD@aJ>I!~-KW+2y~&(W8oSIZt;EPHS+H&Il1w)N%Kt3?ki7CnFy{F=7EQNH*<`{m*T z2+#T6eB!tFEj-XZ=U*s3kO)@3^r;s=HUI48V8i*g#o$&Pwfuj6;8sd{RCYmW?o|#PlHOJ@v;Q#b(i=y3k!`vP{pJ{bi}9>89Pkk zXJmm8eU1px5K@8=t;@ehTWH76!q&iR za37X+L0w{9aD{%)vz#&3bXXL7K7Mu!aQ7_D-(?wYiJc+6IX|J!U>}f0D{5xZ?8IlT zrX3FB-0&z?V#eVns*59VtsPES7~&(Gg-siFS*hB?OnV@TeDbF-vqo_omFexvb8%@g z@Qk1X%*BCPC|Ac~+Bk}VR|!=>YkKkNN%l{%J$=P2MjtxdRCt$ah<9$X@2UwV?_o53 z`e?yW__$hrH<4Huw`aigP!R`6Vbf$}6dprzXR|mIEMmmsKVO1Ku+k~pIAq&-8n1IC zm-evah7RXTbHF~@GZq)ixP)ouaspO$m-b+WJ!53JMyET@*Is^U^mhAHvcRfBe);e| zxJm)I${yj6Eil)hPon(`F_b>gb(pAjdNbR~6TvdFcV7**E}G|c-rX=2W5d*j&B~ut zwy$(w3Iy6K+?Oi6h>xI3>#}@N7Vzjp=Pg(qTzb&~m!_L1z5s>5aPjNAi3ortCp zHpU{RCj>bh6U9A5-yy-b1{|&;VyTOZa6C0V4N;o4bA@4Nzjk>#Un{5pd;laZpk*-v zLewk4CeH{n0p1Fi-0#OwFZCiHshMjv-_B)W8xS%St7l7 z%3yAkumB&y*%9!;SdMehp@np80rM*?TZYA#?ya81P#g}UO7M_0?-tPv44m!Q&OHmj z#0Bn#)B8F!YXWmc5Bk=RN-7AJigpZWu&$bYjNNNGk9?mUM zgx4)e0~g&7ua@x0&xggx4{b1}-RDkMCmZI*5p^U~mYr(L2p@5r50T@D5wj+pJ!tat zGUWFo5YL>%#FiYj2lQ%$oT6H~ zC{_A*H+l~aQciqW<4zexs`Q+F{k^?=`QsXQ%E_r3rPr0Umt>>ad_g~PREh*K-6gq6 zYc^BD1suczMCicRQfRk2`&pSNBw+eEXd1Q8h@ZV!mu> z6kq4wP3QNvjAFY6T-dDF4YgzVNC_zTcx+QGovAx*y=u}Z!|<>yXn44hPYlFqfArZ` zql$v(5hM$(BFwb>eZ{0t=1h8H@Lh=;o1eh9 zb^SRBfA=k)$D4&mfs!u_UM+oKvGjqj4SfCS*Pp)HymPU6=jG-{zg4){-0|(F7jpX+ zJbnDVL*OWV_CS0xwVPrjk%@1ddW`>$_)L*hph%rc`?BfZ;4MDL`VGqPHU-~7kSrax z{aQP43@-$69J* zcPv}o3rw(kh_``JrD88wHT8$xOjV#xmhm1^%&hFj1_>N4^>jV<9n?2z_3-HyqJXoAnFNQS=3=S!w?BQ1p8CaFIj6P1l}o$24Dx;9QfKl_7@9XWX&axx z=fkPk87)4A)1se-KP%=!+>ltoaSono>`dki506gKEE*m*h%_Yq_%s6c7eoz#_nt6z z7Z^ZgxO&s;Y!=CY0WpJAj${_B17LIlAIa1t8cWXQ2AxVM?0NLrMV>OK4_gDl2C&hJ zr(V)GEK4Y$H1xq&o`?cBUZJ1AK>>9@5}*2=ghhil^(9^5XOrIHsd!|}D5eyDNx=$E zOF=CKjKADZgiJ|y)EE}We^%35LeFF&bI?B8;IbckL@)=$v7n?!C9^xt?S$<3YOJSh z`zZK(3cg3d>l8Fo&`$v!`jA|ezMp&PmhI#ke&0tLfVGowX(HZPD0W!Z-XXZYj9k%6F^zXMDF5+-{ZZP+RBr z-BNIS?}V!46`$F0_TiTwK3948I+Cj7-IH$|=& z)u+4^K_`_orhFXrD`nNGY>vXGx+;~+(SVX)l*;31KEApm3PQhSRopD(r;oZz)isII zN74Q2n(N+@n_k>gZ8jVdg1kNz=}@toBG-!>QeKJxg1my1kE4Dizc7`}QGBnuI+e>& z`UX&nb7SbT%5MhwDTu1o(lw1&*X&wcvkQ&ATD*3#cx|c>-;@=VQG_d_2r5IpK92gS z-fWKMP`$Yv4N$##9L-m%YEty!+cjt|K;SZgB>mnu0=7>fiz{Ei^zW4lUGBpmJ1N`QbuJQ^1@XJ1tO-@SmBttCf$+E$#0I zEARK_|IIhweDlpW^S+t&m#eE?0zRKVxw-e7%LUDu_bKDszX&KLADl5d}%;GZHt4f-4@fR2!#0X0_ZE`myMn-vXOq0{0g|gN`4LW68RM9uai%Meun%8=x>tGg1$fxbz;4f;3aZ$bZ# z+yMQ1@(-Z@NdC#_>7U8J02j$ypf|}a(6`BVK)*}=74+Z8zk_~{{0HcNlK%qzZ}QH0 z6IPIbuZfk+C|OvEt}GiXRiR{OB?n4QR&td~Zj?NXSB+8)wFFNuzP0$);aiVy1HQBH zZNzsrzH{)Mi|;&q=i|HJ1<%J#hny%al&S7T4`V$Km{<8sf^dT_?Ix4%7E`HoR?NoJ zDQy?9Goj|XB~j{=Z$OGl*tRCcURk23^l_qK5d_n%K9rspvgNwGaM36e)A2_IL9Hg{ zAyXEz{F678>Yp*?g=4l7f9hG=Clw5VMQNnsR31w!hoE27Wn%3u!&8lg=xbAAVbw+Qx zE9`Ebrm>1x=ikeZR^qv59bQ+Jb@$=BnhF~_e;hVU(^*Zt)9jnsN3~P-4O#P6b!UY> z>#;ed2%LJ7s#3IX0yG6&*nYmF<)iut}{vT9ri9#_u=Px zck%Ol_}M#TXMVQNIPM?T&-d`xjQ!nXe*Ta9dBJUdRw|<5KG*(?E$;B>j4kf)<%}&{ zrTwP#RIrzmh1n(L)mYwxb zoA!w*-|o%pec<7-&X>()5^{@gtK!S{$t5v~C4Ih_%#~$CRg+0GB;uM+$)zNk4f<3u zuE`pD=*$ds%BQ5xo_%5>CvQ~MwA$kXL(WjS78g^}(&B?b8Wkg%D0=j%_Mzn}%{Fh)l)Q0gunEuRdz6nfEgx)|CcL6j`VIj3 z8}FcpUVQO6xYj7Vv1V{hpOz^1d8B2{5wg0nXM&~XTVHH{mRr|^Kz-I`#n381O#ukEJ1wL%j%_>+)F)Q`ymUt?w z+j`Y>E@LRr1~io>_qt6K3ZX3DV8Ao07bpi?Uc- zjWyOB(7@I$$oCGnYHELLQYLY+m1Gh*tu-@{?MtT~B65FgDy@?KOe(921FijXs=qZ6 zj~VstErGUHEuNJh%81f&oXND-$G7fiWyiA(bQfsJ45;(b6C(>y&_qP_8R6~Og2O!= ze0H#~;dT3*$(jd;E!S)2jy9Z2k2@Akdg`9res=r0oo6<_>8gLO`D}9`H%ca4%g$`L zW_Mk8Hx{H9f?stnnQWLnyzTm|`J?UUw+}n7d+Q6)bEn7ZUiU5?cPt(EE}fje?1PR% z<5};dckZ}j?%P#@!}b1C?>$xUjx~POzLGWwj@FGtM#Yhb$Lc4%%U_l*thi))W!0sw zSDIfnPdxDM&+WO~c=^O@bFZv>ZQ&Jl;yt^^y}QR9yWg}sEA+hS@fK_aal|ni81an8 zCOk{7|4^Kw(^l&$3O1+f?V7t#o@y z)R%$h!z1C*!1>N|Prqy#Tlb00FK)iD?xk%nc|X%|sq3@*KehkWu1_EO^x|>v+HuF) zHytjnWc}rh6OL_62^{&MhCulFB?WMXFo)3&vk6EtPE*q1s);3LeR?}IyU+!IP-gzbW|IFs`x*b>K z3C9yZXw-ah*=6xdy|49N5x;Qk3$5ecu5m}#q-Vv;^avu zZk=}vJB=V2cOA4W(3=~)flaqQgoNc@_d`RLA#=seQ29QFnCZ=n>dKpmg=YLi7L=^S zGGD+w53bKx?G92!>zvqSk7>R9;>in@e=QMX=F#M@v*$EkD=ihT75>ib@hM0ulW8prLS(JQw*@a2H&J$U3lkV=*`gPNe z__-Z|5a0A+kXGC!#F1MFDh>D>@8F}G)-~CA0@6UWEvBTI5_<2T(oI2kBbMkmVxlHD zdDNwpXQd2vIW5|l;jEEvQgu_WZi?xqKHa40rheU79-&6fEhSX+sbb3zbO*Gv^i1sp zJcF->BRS20d_w))QQP@NW0v7Y>|J)(aQm~T3V~;aCTklC>qe@EZId;1g{6hSaPP3? z4ZC|d_skGpN^jIRp0y8~h6BUmwfcplU1JR&**_*;SoUJ?g%g+BUpYBZA1>9imvTWH z37^ZquxG4pY|o2xK6>Pn?Og8S!{grYxFdYsS@U)0{HxCSqa71Y-`IxNohv7&x+qo& zv*(O9jvPeuy)VwY+PL~c*QHsn9JtyTe6{Lo<0F^buFl#x?3{Fa3+A(tg7$$mlMM?; zA`ByzD)5e z5k=8GVk#Ryk&{pMA-kk(QI3(YZWT}DL_oh^!AEydm=tl)q%vW!NC#$YFsB--sE{ot z$9owLDnTOYRk64R%~Yu(cSvXuOCWn?TK)LwHNYwS+(5)cGMyq^FeVY*YS>7nXzvvE z$J5vaAQKVWVsaalsW>A5i@`RrP1K#SoSGOonNCwZh_Xl|tUD!<$XP>KP>IT-Uw27; zqMB9ZoK_kNEOAPGX+)36TtM1F(E!c}Qd$)gP^KthB?xPQQ^@Rb+AuVRI-)_D(369j z(&7m^GWa2aq1z=jp48IRJR$`;+9lm84Tve-K}7X<#o!__&Z3o&_4^|+u&Sw4Z#qHb zl*)#K!G!#VC|w8;6{GZzx5kNiKzFi6^z6(Og*xc4DDQZmcsveXjKspBnC_-Lx{;=` zbb=!>+NoYcx#>i_UuMT|R0M;eSQ~uLDpWDWXI67=N4EJZelc|?IfNwx(!9? zpTU8`R5=B82IB-Ul2Z&5r*f?OEZtqKH%RUT6V;#CP zp2E2{#X~?MK`Dqmfbx2&@f|eKux#V~X_W>rlu$LcQg|wUITVp}M?%Ee7cT{f$RRnT zhvWZ+^3wVA-K%-(Vs|(q`x>*%9^2hy|lV!{PW}3ivDY=wf9m%kGPX zq=4>byz+8^;eITaYR;WnFKzxge4iis^M(9j*QO3;YcJJon8S848g1{ zCybbn`K1mb8)i%m5+0NhEQxrMFDn|D)c$07r@-nb?U>mF-VSv0p#cv6+Ko*{ufmHX z&1Qo}7+TlT3y@rL+B+o_k`Si4i&vGGA(k=GJ)D_VjSVLz27~aY!OrAV+;gJeXnWXC zu$6J?iY=yHinWIWy4R?v*kr=7P(+sXI-@2-Z&FJ$iS>sqw$!R}Z|R7T05&{BAKzV! zs1FB%ksvIKlT<~-1)_my7+y=_zDZJLF-g4?q_IhPT6RE9vrUV>C*^?dNTwx8#03_M zb-5!J)ZHnuUp$sBFM5T@BHokW(zQgriWP0g7JxS_^@T!|Am+fvwsc^+;_19GOjI!j zUMLok+uHRiY)_@#T?{fI#^57Tln%;+kl}nH!pkAOnkMDtH34n1EJrYbPR2L(lqfd$ zXoSmFI#5&~EpvXQ`|yVHV>5PT#Edu~Vz3!H6h&4DR(nRqe@)2b6ov7K7>nxGjI8DW zB@zj?D}bdvUGhsYz(kIEnh?=X2(+e8VqYmoyG(<$svJGkKk#8SHgFlR3#GY2nOKssYNbE{9$Y% znwTPGeM*Pe5%TMfiU@9#Be7tZv9vzy&CCUuVHvvOawEakd^P)Fg!swF@uNg!m8m$miLNX597LhsUSx}bw?=D7VAKP z;1Q8fpiYhWDJK$BNCX8%3AJ~GQRwi?enP7dIc+kF+8`3Qb|!|y-O(oBCu@#XmsD~GX`ar`yN(WB~Yq}WYXey*`VP_N>@ zYz+F@4e@RAcUQv{9&M^(TGX#VqZ*)umBvvTY($UK+qSf{9Bp#zuI_Fnhq21t-75VF zM5VXD$VljKI_Y#mQ>_&9vlu_A(Ss7RTK9H$SNva~?(SCvc3?10RuAKlmP^Qws9!?^ zdPkx?f=lh9#bh#l_W{AQ>|28K8^Ypm3k^8LnBBL`qRBM>mIcKkD;BrV@-6dnlh@#) zRNQ4cU~V@T9fGa4Ft6xjz$Mrk3R{bA20VhzJ-oG8%|MM{t1C1Wy$sX}HqY?EVjTnZ z95gU6OR!ZB$BT^&%;q(77?>;A8Vm8_JO<`-)e9I{$W3_QSVRx+@PDR`@ifz`az2N`GQGtj|7 zkb#h3n^ibi3^NenHBkmSIe0e%4|8+g!@wgPtYKiSNwDGSzPOINemx-d$p#J|1*AUS z$l)dfZsu?cAhmcahue7V&FviS0Hiawlfzwr)YQi~eB6Lt9PT#Y9uA){;9d^*0a7#e zb9exdy6qr`hXCmi4s&<}kXm(=!zT^c&0!B9RV8v51EjGgaYz8EDw#vYfV~{{0aDFz z4v!gak8_v+gyx$`4pV?MR?{424B-Bl4z~c(Dcj27HbAO* zJBK>}+5B?2i`U+KjKjwPsh_(z+-0Yms8hldP!n8PCm zJj&sdfYdqN9QFWGn?(*|fYeBdLjp*{Tjo$PU@wP#28?rf43KI*&S3(OPH2+D6d?6R zn!^kr9DDNwhqy0elcI5$1*Dr$j>CSyIit?vNe)i|QeO>lI0#5>eu~4q0f#s|4M>OZ zG>2;~f^BwTpt#P$=NEA9=)B?v4j(mYH*&bifSWnQ9?Ux0%HcLZHoqM1FyKxOcLCDa zc#Olx0jYDkINS{g=iJ=G;S+!~Ciil<50FOPehv=+(vA*tcnFX>=P-x3jc2t-IegNn z?dGrtkj*cLF+*75kQlWxhl&AvIqUy{c<=6NQeIvhj{}Iad;Y#I`(M}*IJGBYvuC`NQbb2 z!$$$>q-^AHlL0p~_|_KM_H4YkmBVcY+|J<+z?!oI#ho1P0<0aGSA2}a#|_xU;cf%& z;qVDS_gSo84)+1pk3`?v&*1^9P`}`sd)75i<2CQxYc+GO)y=20dN%!sDwG=*-byp+ SGmfjS*6#=h%qBC-Fa8HD%vD7I literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageDraw.cpython-312.pyc b/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageDraw.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..84351116ddfdb4bf55969492b073cb65b5ea06b2 GIT binary patch literal 44201 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageFile.cpython-312.pyc b/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageFile.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d36c041daa10f92e310542c4eac6c9f0dbca05b7 GIT binary patch literal 31237 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%0D9l1k-zEj30r4ax1QNvmB1uHV{!k>^ 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

C1nUaWWy6ZqE|lFVG71d}?4*pe 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 w=n!w^JNXYe@;@qgfaj|}nz1tYmjiU0rr literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageFilter.cpython-312.pyc b/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageFilter.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6f8ecf9b28bea966946b938803c585149d6b7a4b GIT binary patch literal 23170 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 z zULF&j=7)VZf0-4A^I%8zJF6+C;lR#JDTG$okke#Wx&XE}YZVH_Nj!)#2kxayu-FLu zgyg+DX01nJ07^rZ;f$gOQTa5hiG9+Hi~D0V6fY|Rhc3n)*=0K9CiEL0Axla_|bW>jFS&0o3# z&C@WY11HgMsxEXeX$dTaQKGeH{`ifJDVzZN45k~M`0}2|lmF-~r4aNGk}3c2jjy`2 zOe8j$ub^efN0RwHBgAi8n9O5p+H)IEjk?tBxnIBT1QxZq+t@O7m!m(Xv^I^DOe^4g zdHcgll<{4YvKUrM3C_^X1DNV#ve+ z=}%Yy;rVNxIm1>GO3$=;W}!d)`CHUY=1+V6mfh6G8tK@;@h{%KMQQ1cZ63)wGC!u4 z#-bERQ{vll=2+njx_G~5K9!=5h>_(~gYG&*kc3SXtOIFEx2nw&aC z*{SqAX!=E^-Cywy-)LF2XSP4QG?`C$UgE1@@-`2-&DMT9m-)4&$#CVPX_<4U^WP|H zzP2ej~kYhT*<@;7nDmu~plF{Py>zj2e#qMTiL zSGRAx?U@VUBqJqz(TTu>Q1Mt$nRuls?% zwBT8B#C~T03qT2LpyG`b04Ko9kXr=TpW8eFPACK2%9^IpafdF$C;AESm|z#7CN51e zAfOEZxTFpP17h(@y722a@F+%=;W-wJ#L|Zx!~d9Qy1d8zw2&U=jY3YB1UNn!%vU^u z^O)%mUrH#tn72i!y(eHX3YrEhsBrGUACf+wHBjyswm0c$nnHh3O_{xDEk{cW%e}1s zJC+<-|6A-XuYLL_bOMW*U9mUru_a*EZ(^m9^$%$Gr}V==rX8*4^5LU3ds!sDUY37( z{o(R2>$mZX@&t>%{A*l+S3SLZ_3B&y@n`>;`){v&@Yma4{#p5N-+1TQ1zrBtV_MPW zw*y_0bpFE91v+a!;?ukFnfK^OdXD zfBLJ}KKSL657_%9@ovUHr|KBP<5S+>Xxy|wAX*VFeZvX?osmn;67 zE@H34T+z3`pdGvM-_W;DXm|h8$8*8+yR%gAhcBg9u!sB=op{1JYW>;eveS<*%eK&K zxZeAV`&V*(nERCb_~V=1cDEjX{P7w~)m)|h&tAL5Ud8ouocr|2c(I$W(YIHhzBFB? zOZ9wbdt8k-Z1g^T8Q-zY%9_@@S<~y^*59Qay|HRdZ-`sdE8Nx*?bvcY^ftIpU-|fa z7p+M1>32TfZKv^?-p!W2)sohs`SjJxYvQ6qqdiS?i@~^Mt z|9SO~KD+whw^twj-Qzbud-4xId-A8BJ$dhom!CX(=jYWguJG~2_g{MSy`KkPT;T(+ z6Z_FmetGqSr!QZ<^8T-`u-4GyNAG|3WBT$x zxHq1DhrZw;ufOs1754Sjt2f?y`d#*wyL$Wm^p>ZuU%mX+=ij5VpVyzf{pg*~|6D;O z|5y9T?(w6a{hz1Gdsnai5N|Jg^!_KWz5DZj{_EG?{jaaR`=9Jzz4qQ;%Kwi#=l%b? i`7t`{Z(e#?dh_ZRZ+=J0J^say-jY6g{ELt1`~L?hy>43o literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageGrab.cpython-312.pyc b/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageGrab.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1c51916570d29ba70154ff42c57a16272f220747 GIT binary patch literal 7008 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageMath.cpython-312.pyc b/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageMath.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8fc54a4ad9a08d8365134f783f5db5340a8bb02e GIT binary patch literal 16315 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageMorph.cpython-312.pyc b/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageMorph.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0bc648b6097d1f27c8e81ad0271a44bec465088e GIT binary patch literal 11326 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 IK}d=HKWSScLI3~& literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageOps.cpython-312.pyc b/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageOps.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..28fdd8176529e995ff4f974160126d348b45d7c9 GIT binary patch literal 29356 zcmeHwdvp|6nqO7F)!kC-Eg>N&J-})qB%THYnBgI?cpI?CgH1$BRT3>)-J-e$NN&aQ z#AinulhE=wODjXxBI{(tcyf$4lLTirJ4|La$LDPRP$O*Gz3d5l#wQb!Y*sU{o2>tt z{Jwjus=GxC!OouSKT{l4-LAU#yWjop>w8}QBtPFN;QFHr`+6Vx1mWlOL%*y%AwK+- zNf53GvLK5ApRQp5}nH-*(c*@>l})e#c2if8NPF{I<%r zfV1Cq($()i>F&=znU8mMvi)t#$pX1vcHrre8{|AZ3-bj2PhO#?vY+xw+4Z*dWRd<> zeojy2e#(uq8~KYBci&3AdFf|gV>+#;dc?6*T&g%eG;>OvtXcr>^E#!{&&S}l z$Yp@LRBn~m$mK}Y5ccv~y$$>+uahhAZP^0#J5UGecXV?4X3Of{k~o$ zt!NlX&hgwQ)jcC(S5Te3|T3%T^3o@y$ zsBlqy9XUtD5fgiwM=Zf*IZK#WiNdJxI_jtVBb3)c5Jp7&nec}9HI~ zvkpHXG#(JfXrt2~_6Nfe9|)1MMg|80O3EBif?jLN))i7^MNL@(N>3zZj)VqMR@L8o zCPH5#kx+k_8X?j3)i+wh>iO1wMfUqz<$=IpxOHGCawZg9Ei30+gMf2>AQ(}7L#^kP z;Q7{ozf1eRzGdyY*04XKtRC=np9P7-tw%c!wlXpw83?xw45jRy91pbuwbkM;+>6_& zaL-;8TX}WG9lLbTRWNq`ovrcO+pg+lW6O-YWxQi-Ppp12KW?2oe=olGToVlT&ENxD3-l9&>IWyV!MW2t|Ls)TN%1M$P? z=vVM#(T=W^MOtI~%_AmJh?@HH2wwIT6{4a(Fh(#OSQn{wWWpeIGD_?Y1wyLVsutj7 z${dcUDM78Gw4+yvVASHHIb~&ul%+p}PNT13n*8V-wVblrI@xzs!jESBg=q=pR9tbj zXC7JlV>=Iig}z97bLIK0>t+HRoL* zx;F2Q3$iVDZQm9CIpJ<}S|;vZ`{9&$bhwJhEghA@g98I0H6nF~`u)LPDI5v~v95>* zQ|4p)cBu`h{DFY_hAXfJ>6sN->Itb5gMi*$j!dbN!=Xq=KW1US5{xKvyQ+p%wUEA8 z2SWZ}BxOHxoV}zT_p?RG92ms(><{;5cete!?^WvR4fqS6$8A(d+TGt8erq^({I}B zd%KMl4~RJM$Hq?qrW3}GMXf~-X#Ih2#w8oQ)Mtz!wP$44Hf~yB6)g+5nFoX z$fk%fE}~W)l5EyD%{@X)JoSC7tM;fhYLD7wGmWY$VZ;$Ny;YYvDk6;iBE0m8tlDH# z6#2H{UCO_5cOHh`u9C2Q9TZD*H=Ihl{~u# zyHi2>_b}D#Vl8sBc6uo1MbkxAPt-Mx1-ska&1eAZT~Xvci-jpHUTP7Ap!gVm)~CSF zCfj9ux`$2?j`<9y{CPOC-x)aO8#v}a6OP8X#mLY`C}@r~0kqL5gBF1`W-UtRo{uS& z$VUl=SGvTT`ER<3D(Z@;tQ8%@H7$ab$AnJAr z(Sl*%HsZ+z1?^dnZ+RKxC6DKidT2E1&@sv|g3n^?sAlwNUeJ!;Ha0FyvJGEteI+`! z>1Q-gFE0w0Hd+Y7e~rE`({o@0wCUp=n_r&q3ru4tHZJLq@1nooKdeZNU?KW_0VKT= zTlBEb5H@fQlOGXB8PWH?wSj>>CJk6lmRMfWjfX@I~0$EI3k^f~^FIbOpc|NsViO z8&yUv&}(N9^n4f2fQynE*KOSBZE>gGIfTah(C3Bqb<^TcmbB@~V2Lu}2MnSW!Ecc|dL-b$1|FdF`oR>luNY;1RqrNzq1qn@M?^5jmWBgEDXS#|suEVz z^Gas~&2E#9YCnxJ09pX2qh}!ZgwKQqRtNlN6)7AU3Mi5fBj1=`d@K=(9=}>zr1Odz z#?0}_vLd&&Nt;{NwXD&GpQ=O#)nJ>nGsr9D=&ALX_bPGJ>I&Q*$dsae_`$E)?bpBl zbuSWva6j}luPbE-BB&#h$}^e_Da04-RTx*KvBY4ER9ZVzHsxXj;|($kx-ez)4GiEH zV}iVes+Z;9<2+^K!v_2^x+ImKMJ{z6a;i;~-5T%>K?V}fq)h&cDKVHbqkPH~2&GJC z{3&Y~>y47KVSy)jYCH1n#b5Xc=rAh$aiF*8?TeX`rDbt3UN>o-=$H^u ztfKajO(-dk`Qj_5iYC1i{ZrvYdDCq1s{$yKr4 zM)mhg%VJ&MX^$VDIQX6RWK}gjp-Am_Hh)pNWUh$nD1A~LQ^ixqJ}++sa=&RsUaF`v zZvNe-v0X_|VXXL_!7mES=Bz?V4K)*A;>V_nKQC^W|9QonO>h^)iod=2zT0zo|M>p* zB3Ij|>c6{xw&J|7>uEL(LZL4S_ep9z8~2Lwmd{8sHV zK`}oLB}mM99)t@g{#^KTrx_`tjgBwatQQy)=hMp3esT(gd-w!M$0Ow9TWWC+n*7-MKp!4yly?Hk1M5oNr1_98TIocLkd9-<~(`LcBsZk&!U+z|EZAs^2 zE054;h_dNb538xR-i-(mLwJNp=!61+Mx~pr8pJQ+V&dUi{__K{0mVG^-8z@QI; z?deOWU?f=wKtw`bcY-)adWgX_wXiPa(N8yfNlErkd2sh65LXdArbX z>P99mGyMTqdhlVHRg~eiKv6!H7c7eAEl?0&Nb1y7Ejems2s3K5VT4dWYJ&P}Ynmmf zFitVlY2I=5N7fY38l9%-Vla3+a>3AhXfX(SgR)^fLBKuCCEQl5SxouQBwUr$yG-i! zI+?a#C1zJ8-d80ZJ+sZI(8LMqCc2S0sjj6PY4N>9T!6JQlBBGxRnYtU<&-l`&y+Jw zmy|yRuwsA?ZuiCOj)|1F-eJjlp!&@6Kzg8jpW*l^tv!D z=(G}NU0mXI=p$AAIx_t${DrSTuQw{p?SjBk#Hi{ezX$CDY1m-G(~_8$Xpt z_d&9A<&W-8x(i0zlSu6W^n#Mu+F0M``L&R+9j?pHac68x{H2L)cN|jEk$>4e?v8yU zes1FRJC3@f!+qH`?uvE9eG>;ibJWh+g@U>{x8U%MzIhK~VQu{6bW@^c!))osvAmxb zRgLXTatSh7h>sKQ__?W$Y2USjH@4h->EmsQh8>CJU;EkaPxF3yII;X#qVU)wvnjs- zIOZ2$J~)2xSql|iJ}`dZDGU7-)$}WmP+a|}N`O9KZT!r1Rbtut*|H5|&USbuPb|cm zGKZ!teOQW{foSXkdTn@W=k$^rYp*Z8X}=|Y;!JpVB^q}BEc|KPPv1;5yppJR<&OL7 zNsL@Z?uxhwQT(MTFB;Z-qvB@K$5n~Ct%;g#KQrIj|5Hz*=18LOh|w^HW86L^PCBPv zn)cqyGbFl&}0e z|GB^2kZZ({!w@+%eki_T)-8>;--Cf0%7XaI6K_nNNK|-dT}?BVCayKW{4_4eaoj}L z1^#Ry6E93|8fRvdLxLF{%rH2KOs>!kPh^U)L?I8K#pa(-oEFaYe zXqnm=tv;CbOg}K|QaAWoi|;Sc0LDigV~SI-Ij}~AvDeGGmR0AZm>wV8hXTU^V==+M z!csEWFI~XSdxo)vXB4tgFnAgIXO(V?oJmO692$&}1%^J63YxPA&6*nAr`v6^wv z&8nzhfx8L#kz-2O2lF|#gufyRffs6#_9#8R!2m2jVMdfJ_@w_IYV$=RYTN052nUpw z4ziTAq=B{U>e&4<{!a5s=M_G#C{mlM^t7D@li#fjL{|6s1H`Fn+3_u>DxBsH;|#9D z9SPJU%$4gF?CsQzDI0Gt^xb68NZB}juiH5vU?BpgY`m2zhrhp*byLbIql5KyP`S{l zLCK>u101IDs5OCa)}&>p0icrV9Ugtc!yhAoy;>3q%b1n_<@aBod_Cduj=q>IDvS9h zD&iZknr%uH)s61IZ}-I7Zrf{;u98^aZI^U!$+Gz1`_akhwDQr}>t_?ox7^%=#cp3> z`R>^zd&c%Bp_V=|RXh3h+n$DG<6>48}?bStG`{lj78}0ckNQYL95tn zbUTgPPxohdC*>j?Je<3f7R?=vh6R5ib_N0XIg-i3M$XCOea_7P6=F0~%-b7=EF z)bhc3$o^JQZr6^eUFRX7akKW3xHs?0;wuhh=*M*4DrYIu{H5J1WHACq9DYSDoF|h_ zI_IH3vp6UR@Fmu5-UYtOA;TF-F9WQJvT3cI#&w}BRr8AC=M%AF+|nXgk$Xu_tYk5o zHy)jtp8$%vfV1z5vbEj<#!#w0On;TU zXj5h|q1@5cKES=`Q%?9W8)*mzT3UUb3jG6C2+|EHx`Ob5h0B+sp2AzG(8!;I!|tNg zGRm80bbZRs`DJLgAaSTc`YOVOV<=3^xIt#kJ=%=ERfq850Jf;G9k)^8(PqI@4!4RE zQ_s&9G>z^{+6%rFeJdJ^+_qOI3(CgKb5(-dGrIp#g#cez|F}PHecuTQf6w%a*@87= z=A^6m@{VusNS4>!EpJSeH_nzfjqOW%%4a-vWXms@D2QLUQ}`TZ+djTsV{BdZ_X^8m zk@(Ju3sV)}tGQN_sA&0N{SDtAmfZZtt#hBe{^{D;Er({;9Zr-Vo-I7WH5eV^9kJdi zacXV+{2lkoIS0qeD!@%d2ejKin;Rq}k0sC`qw_FqCf1%H!15H0QtpT%2 zFOY*fm@*4jkL5%36v?`y>mHa3qjKR!5%k)obEukmF0K<;+MT=~eV(*x@d1Xf5^EmR&h8^hu7LP$Le+e(mGfA~5=4&CsrV|c(tDy%4E zIDvN*F=`~QWeJ%bOw^>k;Pj$?dynlHynTF?)O_TyHfqhm-o;y^t&NLGpFA!Z`mw=SkLF*F;dy*&#rK-7HBG;CZS{>6iMmZU%YIz-N!6{LpVWL>p4f6^ru^uv z>!lgXOHYvI?w}fIsK67k004x;m~IkMxFll!&g%jOYt+WRBzPX0|X%`bur6ms#5 znH3piVCt}&g^pQpz&X%IA>5ILQ}Es=S1l37kSrgcj_ zzU~ODZrr7ilq=){N=7q21a=x3R0Te=D%q}r(prhLI~mTY%`nkLF2EchtzoRnT5P=J zaN7;zqRtBO`LyVm#VSnrX6?@$O+IW{-Q+{4;RZifYGzL$RQS&9XtRCom-k5xYyZ{SV z{ov&r&);nS@xf0HCf2_=ySih>vwzG&aH8W;Y;=vYo>eoBReVmPGUL+5zW7kWt1E&c zoD^jN5vt-zBZ5-4$R@=6S%%DrQS%(EMq?V|M#v2x;-^o8 z=YS3T42^k(CeZX0FbdYGQ}+#t9Y zKe@fDz5u)k&~~=(5pEiDh#Ad-_86yV{9w!+8Xp>9(AZBtD6`_dsDI3~<ND%okCNH)~{u~otG*7^VF$R7(`Xa3JF#~U z1}N?B>;zQ<+829gryT0;>{NdTIIC~djWig1^1MYUx?Q7I5gYop@Jo};>X<9ESY637 zY0ix2oW617F6La)(YUwwPx}``P$6 z^K#$wwoJgn|9vX{LpN2 z+vWt5)y9|Q%wa|h4V(X6c)O4>P-DLqh{J<&2WZhnL9TsdUYvKOBQi%!aH2J*qw{2Q zh9j^6N4DrnK)AQfGUK8N43q`YZGc=Q>=7=*ZMhebt1R{oib6zPL5(+IqS(6;+lVy- zs!hiZQKV2_sSQzct_cz`RDBuP86t=dLw_RP=}_7kHkX1gLQFNg`iQBXcctT^qPDaX ztZXM|T2d^A|E{o{f_tWeL3QM67wB7y8uLICLzS3D6)|lLqjanB#uUwiJ1jDh#*UsN zj!X3x;nHUoAz~=;;O3WM0_{eKbhl~5dVylV-qshKc3OqWR7mrUZ_P#|$o$|h_;3aM z@SgJ_ye5cj`N5!{CbJW(izH*;QT<(mEWQjo zYTDaSTOYK=K(lKy92Z{}VTfhz%32tC_)+H4!~=#XVus0seJ7=p`eOB0f zzqAq>qK=qIw$||PRmFBDODnGIpV$w#p*@pBcS^m<$|dogaUaaA%H)fa?unhhv2_$m%)7X5hn55QC*zJqj3nV)Ik}$&<+SnTBSXeEp-c`djxIT4p~`8`QM=MU(z$Fo zC}k|~X~cEC0lYOZZ0JHDb~?f#FJjnj^!n8`88#6k_!V(8jTn0cIlu9v3reHTJ|ira z*G2bq04+jpDbUuLw&?T`8#?dGO&x@=J9@Az>zgJ5vYl!*Voa*%6~|BDkwb@}x1afk z*W@UL zdC7c(_(uxP<)$3&DctDOYzgeA7ka%thJy%{9*xXdQV$MYU~Ob8BC+jWk?EHo5Ie8Z z7&`3rFkKpF?Ie1=oNlCrR!RS?hUiv6HyTUa*OO?<^yF$kr3UC0#?9+y44_JCxRiw& zluH?xp#UHmgx5vKKCr26>6wr+D9({hkZKi&tO1{V)p+~;;&K#mdM@E@`oUtK+SXF(oF)cgJ44W2sGRwts;(vn$K^Y%F)n*m4)Ouyc5@u))-r z4u!L7=NVXnA`Zbak67_F9sD-`E0x7*2wF&;RW_dm>@Y8jQ+n8vsUwr|lr4;d0!9nw zFwRYYV$qJtpHW&*awy>P7&O^N>PRxkE|8l+L~iy>=LUQSOu!5Vp1fWc;|xXZt(fuF z2_Dc%iyqE2(n?{`(aMdugA)4=I}c8k!08oQNnnOQSfQEbTK)3yhm4K?=6*tTAF3UbAiP zY~aF~1s5eyzCgyXD0F)!61Y%Puc z7Pz7M7s749CXoSBL!4DWr*UY%)3$g*C;Ori$lEucUfdy+sk||MIdlY`5nPaB0n%~p zG4V-_YoFBW3@!5lkT^M-B^+JWVi0BF9!)oYA$UY}4f*+9o4e_x>|dyz&>X-5qo3h| zKAb;BI6izJ=|o|eE#wYy4SPs0-$&-SqZ%5rxV<_cjxjH!;oXQK}Xpv4@yi*<{sksKbxw=Ak6sD2Iy@LUe z(z@3$`@v2Cbg(2S!VJ7mIPAjQC1lZO(eUWE8;{P%4ix83x8 zygjk%YcnM~M-L(-2IrVjWX{_0{J4ASrAg0pZK85j!m&!zfj<6W&T1~Qjdq}d3TaB5 z2uyur`rNhG6Xk11j{qD*ZE<1~_gGGpG_Wch74hcV_LcX`mQlFRm@`=pRlr1G+?C9$ zj32z6*Lc6ImdEcT%GP9j2DtL&Sw*I(o-r3b6xAS<$TPJCrtobyniBQfZn+Y52NHz` zM&b8d9p5?rrWS2dov5R4wFeTO1EVkA$I%}brcsNB00CRKLt8 zI^HwgKwiy`{9wx6%&#m9EDY#Me&zDn$SI9$P{@8Te2&eK zy#arw6BM26LeZ2^Xf@JeiA}|rP<%!$e1cIAKxx}gZsE*p(KPJXcNFe?#FgvxJLTDX zu;Xawi6cilcO5x#;>e-vA~#|Y&YE~+p(@mWix;QR_J<^!L1$DzM1?;6>c;nXOzyZ_ z-Il0sn{{oSv21+;VH;3(A;P9lxC5a~!+zFqIIR(J*gnL$2hhgQJ1)-4ffJHjHTxBcGJQJ-dTJ|#zj*$z(F z#-P#*Ybhd0zz#g6#@7E7G;KxQDrrVj;#yeXN$JTIp-lRJj(#%brilymO?Z)IIJNOg z)F0u)IU+h~J|UAA2rkd1L7W~_7w?+&)XqBV5Sh5V;r-#s;pyYIm#-PyczNsiR_zR! zy+4$1ZoE}L`~2P+%ihPkhltL)=l{=q=i~Pbd@YA5$b`*y#(-f+Gydf%qMrNxbPnbd zhcj%)AERMheewrLX>kE17-{{!x&;6{s|kp$C$#Ljo7rSSC=0iIpAF-g?tZq^mjL$dV)$|@nr%_Av^}a z9%M1{1aiJd8LI{z#@txb)$xkJ5w706h^maV%MVDW$c+apkOIHMYy@mVXx=Iosz`04 ze5BB4I{$gTDycjJZS_AP&+pJQ*@pyHXT(gxJtY>I*gW1DKbOdtW?Z$Sd+ycLO|8Fr za@N^6c``1JtsRTJvpIfpboY$2QHzG;M<@NwugrqW8>R*5pSd^S_#-6r%NPXj;msBB zb6Fj3D8XSVTMexOb+kzO9km#T{%Wh74vL;>S2NfMt8(YTFk^#DA56&E3hNnR!Y-_E zna*P7;U8zNaKxrEHc+=>LkqyfRXSP%=N<%L7-#u4sg_Ms-tESY6AlG@j|~r_JgoP6 z9gtKRbewaC^X!b%I0DLfC|$YjiS{GI7@vE~=EfyjLSgY{LxYUie8J?NA=uJ&?Ag%Z zRv+pxl6|;Z)1hOn{xRNvhepSXNU+gC0p0gt$65bRPSP1^?y;e7Z`W)yv2*|UkamU_ zqGMm0xbT^K`COh*Q2EH2Wi4Ur12}evKiD~dvlY_EfYbb^5zf}uMs(9cTfS~lfF3=k zl1cwQV#2^Mx*L$SD}6>*E-ig7%LbSXZ7^fSp{dBOK2kr=yK)+-pIoAN9tiwgq>j>O zE>Zr>C34tB7Qw3Ond?~kcnR5b)t;-*(i0xOpO%>TmWsY7reNNMJwRuM5XG$4A(lp( zmjyqgLZ@MMLXNteImlYTF2I4sEC|&##X{v;j*Jm!fA+BzwV%gXSSpT4e)h84u~!14 z1|8G%6GwnAi`x5$W14sAxaKY=Tecy8aEpxdwibZ9>dA2X$k%4xwMd;-s#CUM@gK$F z4;A@Bb;ALrShgcyAM#N=Q;wEL9i;Gwjc=8XMAR9fJ(6AeJXR|rv{16Ej~LE*7Y^oi zM4dW=9c)-EcOR{{^De#BGSv7wq=j%M3S0`n!Q-2BtaaEFwH_CSunC6A8=D*e=3P2$ z%H?(X99W+C?$wia!92r!Fs1faJN8OPR6k;R_{pmgUoZS1NNWdX$Or#rsItgyiX^)< zL(jnZx}j~Nvw#9aT#v&Y;#n?mqy|XY7x68=9~!k}@k{zf&?fDIXM^Gkwm|hhgt!2C zHFMU`{YQBr+Ne6{_@5K%pmO>&P=^FEFAxcvDEtuFkx+2fSk1N>j{fP>bc!uMHi~be z`krdQ-HTuY%F(E4ed*v}31K%Z`d|@%WIByV2g~S3P$?{mVW~Ht9q%M@XB(LvW<`Ag zIVw!Y+GgdVy2)EvQ&<`>Ig7y}qo8BftK<}79HQ6GPs{l|j2mWAeLx%G1G4%*AQ@1- zh1=njMZy2jF?D9eD;L4~kEvTsfk#abX9XYY{M0@Aj&1=+uLof199NT&L_)#49Z+u&~X-&$> zUcb_Q4Da)_GF#R#*#}3|_NS~|-)Hd$dqOFDB-Ay8gQ`>JGs;D7Z6<4f%B13d`3Mho z;k?{nH~oJRBY5j|aiR1-Gjv!Fb+Tr-GG>a}MPCc`PFCbjmNDg|oII`m31u;#Rq%gz z4B$)!MMdBiGd+Y|_(DTUyEwyEz=|3W)&GV}A7DKQ|21|(ux*us)%mUcZ|#5kV6v$E zO3g&gcb1RtPZlq|(lXKVK_!Jq-K}j))VAH+Ia~a~=z%YB5&#r5cU?^hSJOTH$BKk& zh4CZnOGCodV0_8Smi2?O{nFzou>GGx!R~ykdu-LLtsIBc!m+m)e)0+Xl4P|+I-%+3 zXRFuEI4Zwzl_V>kyIawesAw8%zw~0Vs_Aaknncwa{5bH%vXv7r&oplvbKdtXx$CJ- zK&JQ9k6G@yN+=fWu8XRhw%m3#C+X;-E2kz--7RZLl(ozhwkADg@v8TiPcBb*8k0>e zA2nZZ{;(zHyyAiK&~_W~WJQhB`#(Bz{Yau{YjW$3A8-3)+mBwjyY*0F>!I1LM|j2= zX;Y$b^Pg6%kD2N4+@|+iCtGiqcpsX~4drn=T(WCdea~~vbHkjFHpHzs`ABM-Uh%_{ zJIgmdG7B}!-`_jAcWTr0t{c`nOP~L;w*GtN*UG2u9~E3Lm~GsAv;OAbY;8LZJX%u! zz6a`8^X|=$FrPLw@{8Mj*b2w5HZ-uPfI(K zeZMO1U_oK*u7B8yk~o|TTMS2*qmgmY*n>BbLp$c0A*t@ei?7N!0Wt{1$VW1f`oHMb zLAmOlKqei7{gitH-3}P3gGP$_gVV;r*AYe$AKrfD$*7#skrojSDP2nQaWP7%|C=(U zb26Wnzo2&!f?2|0W>Yr}4J4Kg$D1i^ZXZYLjy zs{SLq%c`0wG#*gSG&mEt0x>i*K{GUeL3!V&+kek4wHTE?pzL#WBPywXnO&Mo(R^^E zG0}qj80CLL1?Dwed@zc)Sq=JGj%=A=Xb(~U2i;gT)O7E26kpLZh+q!HSE!JZ1@%3; z{Vv_^;g<41e?{J`bb4fqudACKjhC`vM+XO|5(B_b%wt=wgMQ}G%}FS+`%`x97#|*%+(#LQ==KKPcGHdeH09XUaj@fX`_5y`ou2uPGA}7+)M6$9 zrWI#eTBbc@iYTUUV7u460Fjhq8xJdaLH)k~FXAu!m+1F7vnYyxwNeo4e=ZdMso?oj zA@9$GhW{$m{z6!l5LP{OJH&>EHFDwI zqt`{Zcubs=gw5OUZrYdFwD0bwBZ*B%=FH_{GXqLbX$Akib_08|mf-!Pb@`$zcIFWd zS8~m*gdLN+wB0RTohV&BXD2#mZ!( zcg|j|wFb}o=prkgDCSzpzG%hh9ZJk2M@cy&$E%{ahE+@nMi5G96k$n_q-ZXWB{@x4 xl8+%uK0I%-i`yQS+QnrLOC91q@nJdp?G%?jswx1sb;7ot;$I8Ti-l}c|9{VC79Icq literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/PIL/__pycache__/ImagePalette.cpython-312.pyc b/venv/lib/python3.12/site-packages/PIL/__pycache__/ImagePalette.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..43320dcb87c7763e3adcac5c16e4e56aef11435d GIT binary patch literal 12166 zcmb_iYit|Wm7d|uh);=>sJA7VvTR38_3*QeWyP^AYb`mpoYYCssC5-eGg4?%q&!1e z7DJ_q5p3ktSxZe?(Qt~$NEVTi{BW`T;h@1bP1|3)KPby-n1PCV(Js2d0t+T`(Zq|z z?sx8RNJ^m-blWTO&Yk->_ug~PJ+C|eQe5odkp6k%@W}m59QS*AF_UN%_|+RI%yTj) z^C51O@8@|cTSAt83!Xwq7!~_PRwss}(W3sMQER^y?~+^;vW?pN?W2x<$EdU4IqK?n z@tk5+i_m68TXBCe&sn&`oNRlZlkIO=j2Zh&_(}a)p<~=kZa^p^sk(>_-j8VpnhI=2EyS;G!P9&!df5RZ6}m7 z<4Sl)@mq9D?{U5Ou_qtt9_Z@n?s~Yl@9@VwjS_Xw;o#`lVKpEJm2mX$f+0nBQ_UlR zkP?k5tisVd8W>T!BB6+?JM$Vahs2tOjBOdYU_AKM|3G1$Q@DO!=734QU$Ap_PA;L` z_>dGW0boc!%67X1*S7TFb1;=@1Ykn_a+Xn2} zfloW04&a=q;Z&UcF08Q1Tp!BSppVpFj8aWrZ7rxJfr=YID^L+ssMB2x6&dsd{t@VP z_>dUdd}9VWeZvtoTOJLJjVZD(NXXS3taHa$Kn;xgMkBJ);d|_9g_V5Kh;Lj|*w`rQ zGO*fwClsZF4WoHFRAsp1si6qyJr->x2-;I^zC+4zU_2Dn2*##w9zM7!f0_)S4&Q;W zFEU1a6A0y?_YV6;f@hU*i!T`UjgD(k-=N|P_y#AVNQJSSS`gQYB@5EK!e_QPqu67+4fOI4hGugvCz2IJ~kPB zIudS`m9y>Ph$^2Q3r9hxcF^!_dnh=VY2VqleMh?%j4G{TfuYmHd+m?(9&OL(-nOwx z-8L`~3=1nS5Y$~UbLs0?!&{Cs%p4d)%u42^{=tF#w|1A zOO91^<%Y7@!wZ!eu4_>MuDMfqu1_a8)q^?`X9F43T;tVBRB1Hcr&b|nh>4Z2S!bs6 zF6!w*HqG63doN90m`d8})EZO_WrQ(`9AtE6Ej|=T739;MaY1(FlbID+bn5`)OikT@ zL4FHcl|dr{=ljaFJ%C;s?G9_}*vD{Hy%D%7HrAJ&5k0K|iln@sRQ~oTc@)uj#2%xiYpSaKoXcza3_h>%>vh=A$4S$i^fQK%GlrTF?x}*le zBMPIJE=9-3LW*BxB-CwmC(#%h=$PeK zs_PT-YoW`b#qEn{u0L=so^0q`u6}SZ(9;!HRiY7@VQ^kE)GS;CS#@RxMytg z7zSxQ$fmiKlG^WwXN23{s`)*0duD`-wp3;9d}uC&qBCVOR#U3B;kA~_EmzMZ+Gn~h zKAbAAo00!%1jVe%`u*Ec=a&An)5KJ8i z{4vRg)Jc6Pt;+SK5;9=A^Cpi^L?9v(t1Ng?kdSSmvkl#X4^a z-}8LVcqx1`qS;em`Yx)gaL*H5PW+!@J{Ojhmt;%faVFd;D2G$Uc>^*$L8O9nyi}p=q%)rWUO4;t2 zu9dR7#EF;Nldi@UXT_{cGU1KxTh9A4Y?O3uTq*HhI(^}EqA3x5Eq*z^T+%Wlq}*kf zp1JVM_jC47R@h+HZOl^KYQl|M&RgOF4wJp_V`6}7obDKeA26au z#>2Aig2xcn;DsV?FsYL4{+R4^W3(^=owS`eu#5{5!H~?oJWssWs&B+xA=T9V>NP7UVZWS3}EnJ7LWoTk&{j56vH) zJG$&?TzGWJvvo#Fb#>2_eB|`p_EgL}<{a}Sb0vxRvZp1L_x|j%r!6fB4J9*uX&VO% zZ{Jdx9~}~*+MJEQexQ*PZ?xF1{YwZbMYnvHgC=G0$8=y0d9BE*CR zC&&^PP25dMYXmM?C+kv_!UZguV>HVV?mQ2{agX(rGZmL)F@}&v9xk|3@1EU*IEYC@~!qJ$ilayTJZu<%H89M*z9vbB~o`VM3jMz|r)o#PA5T5u)^?jcKV zwCsQy%32$7X~^;%H7K zr;F6)=hdSGh$MNeW;}d49GM7b1~BnC98}Z}pWkhmw3@x6&k#DYw6tK{?PwuhBT zX7{K))Id=Wl}UJFG<7Fsq~UZ?RmM~}+{88N7RtIPBblroqO2R4M$&+Z=8SB%K`k&3 zdR@TDtbU0GorV;EJyd2|&R?{Llvf|W?qs^NG-SZQcp^j?W1t6NibjSHI=wkLY$x>KbU^EGodiQ${2oAbw(*Cd{pJ3iZ; zws?x`Q&k)0pP74RVfRv%Kk4zOH*pnhZ_C$rzjb=?WU_2;zLoabohGil?o+O$xc+u^ z-G|k!OVzE5%JoN=tG_WTtyDE40ML51^`|wrs`e&5dy`drQ(NwbSMQv2Cc2kAo5=0o zKDXypZDH4&omV@TH*UM>-3CCf6<;o1IK3!c=dan5)jL*dH!et5T0Rl@n)`0UDQvym zYP4NHaIJXJoveM}6UkDu2O6cK=7-19EY~|i>wRi6k-v9c+2fB9&zi#94^6Om^@-=ZZ66Q={eCw+e zh9ys7SWIE^l?ua^XEE}!#T0A^8t|u_n0sByS${m-`+_}4)D{rtSD;vaoK<9q@@8#2 zxyW2CY_k`bJy;NOT)2{ra^;VY3pwks@Z2VR62q|QtR(vWk})P$u)fV$p9qCjaD}q% z9>SL?R#I5zN_g(#R#=yXp-6eXF0fu%yE8`))6V6&Ne9$jRy9H0mEV&#_8jCVxr-xN zf$WSuaUyUwdlN#J8&SFq7{>M0-$4HI6ER1V?-Aq5#u2kM`Hry*8J%~iq#~I#)p=jc z;@j2-dzUmHGgX=B)CDc7>SAOJ@k41sMWEe~qm9(dM;UEicl46|X}FQnP$;4)e#tO& zEyH7mtOW5moj;|44Gc+X7_p*;y{`)%QPmA})Bc3)%N@qSSDS7*8&*myW(N~ZFW1i; zOxYZlY!_^^^|x#r&GG|?H1=NZP3&D5OqTj@+3sH{t(?_zalhNbqyzp3b%<)pLgs1QXT^PexPQ`%R3$pDhINtN0PrMW+->~I;fNVA#Yh)OY>fI{l+5w9 za&Rd6ZDvZ)0$LE1YCDO$Hmn5$N#CkZ6&lEbjTs=ZR%1LEt_8P&#%=FCw{tQxifL-Z z#R(^*nD3S`AE=Gx*gx%(>FJoK`yAaS;$qOOrmgD&7HQnd6fyN4bFbTmq3;9P30t@rr1Q8<~07Y|)Ig#)9?z<}-;7(fhuJVa&Jz`&XDKq%8<9T<=!Ljwb9 zHLb)prsAC8p3FE?MH<~%s|NPyf=X?rjAAUhEgHdu2>BVt%OlhP&z)2EP)5e75s+cA zT*~OWK>IIb&vTzx?2;{A%T?5-I`^loHfihalG3ztHqTtsEt*cB(7qib_7U z@KXJ%fKr-D=vP$y!grth?xz-u_tNc3JB1tA=E76r!^tV zM9ilTrz-2G4?lk#(Q@`EufXG2%2_tuXT(plYr-H}0O0bg(HwhixnbzPhq#R2;Yz7I7{)YVR4=xvhb|W z1m~BGt13gskl7yFG#(C|4Fp3h>OJu^T#&&Kf;AMUCMO`Ks1aa_X_i6s*S&p_XzwVl zvM7G7$V|K78xM(%f;M`Zv=ONlBS0de1e9iQ>K+Z8#4jQjn8(0EimgXZ7ir*$Kn z=2BMIEPp<>(!T5ZiMM0R?v87*#l}~J+3v)Fx!wiuQu*c&JX;oHOYV-Ot>d<%ZMtj4 zQJ)xEc5F(Dn?C>4%6ax`G~>(Fd&M;u!C5Lijn;hLlCxeva1Tr|+~cUOjb_W17)-x7 z7lZMMvOxzx%A>;uMhD#3WUvk2&M)>cM30~+$K8(XHwxVChae`i7{#YE0&WBt&eq)E zlrUtC1V%>#3|CPA`6GVX*O7r2A3XTp&UgElojvdL-{3EH%{I;|bN&TkskCWfe96xLmKz@W$;9=>#F;m`7RA?luRMEwVyWSwW#|5+xc~E; z4G%F(>t_`QsvL#+^Y1YmJ`RB6LEni@@%bNr$U^QCJ)T8;J`wVe34WcjSb$)_%0_g6 z!eSBOWk{B6lmjwVD1=Z`R^Yn`d_@wLNh34Ul*9%;Fe#$S$f)`ZUUS$sYzNUmGBxS^ zfFWGzTxKPK8mCc|eS)8M0NFJ6Te0B}&8>?=Kkd39{!{O@$gSpm%OwvjHSb&4eqmzv zOrq(f?nEPK*$Y<_Cmkv3s z=1BwS4oHJ6`$Nz0Ccc1A5AbP0dzR(pJly7-L%@R@%cKjjxqvvEfXEXf6l52$GFY6- zSvLP7RUlI`(nZLV<;0*t+9QkQfdA<{>qQ7^AdEn!Z%76Bm|2auPRqvi;rG!y!OPhZ`Y0R(#B)U&c3AB zNAxQ`%73nJJf?wdxrFyXo%jo`;y~ltLz0zK33SRQ<^NAkRBufXx@*< zx?`c9L)}_=BjIZ^d?E5Y8vchG_anQfu=z_w%v%))tZT7H!7z3Z9^=l`{FhcW)gzer6$aHHhyp(p>_HcL*~pKBQk)1EaC+&vv)2~K5Rkk0QX*q z4D_3kfhKM{r|}b*=}C^q-}f*&6T}t!bc;G@Tx5AO!PHPBAp0`WTfbd>0+Xn;XO+TO zDsek~eW#q(9XPL(=8Z3`?s>w^0a!TovZ*==MdRGV^poyk)OnD7)j~it9dfeQnA0wG|f% ztxK-f6<5`VuBIhdQ`#yPJJQ9Ry?V8h+t`NdB}-9pMaok)Z=JIy_*WbsRc>DR=5l58 zhm|{*Dt9hd?w%Ds@>YISUV{)}c@@4T+SrCTtGAg#nKg(Mv?N^(X(xQ3KR0oXhV(Yh z<(@wB*_~pp!uLjP(%S;Jytv{cPdVK2;)=U}-jeHdSEI1@OS=!&3%?Nj2W{dnT1ruV z-{wA8Ykj}ULggBs%C!QO>!pMDS>c>Amw-9!r!ij5`O)MspglshgOo9`DGdW<@F`Jo z*G`v;%oE0G*Qm=ZWz?q5Awyi8Br_U`4^=h^Yh}=RFP_nqLX9foRTI} zNgC)GE@b>j!j-jgq^INg%&qZMi@BM_MeD#zhA+MJBrd1Em h_wsja0)K$N;}ZG%?vz;g8S%3A<4B4R`PE>E64yUatcdug^CVjQ~E}u!HwU(B{^X7hu3p3K@zJ0_HKC zdKr!|0*+_x-O0Ysw!Zt>vFM=k!(i=bh?+wxgf!G7Qs}kKcDrDh(Fwl~TTLg99}80` z9>)q>u>lph=8vV~jh|C9ZTyj~E7;gQ{6s{nl4P7El(0N4G|4M7m7>phNrY6a%!N_3 zA|)3kNt1_v{c>=AL3CnxKd0j-o36=dct^I6IR8OjHSMcRvLfZz>c~d9U-gMCUl<|u YeG2I86OP|o-Q~QVFBkQq_Ep!)zb715-2eap literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageQt.cpython-312.pyc b/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageQt.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9cd99a594ba59ebf99fd5f386d54bdc6ca59a2a6 GIT binary patch literal 8449 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 H4CMa@nV4aH literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageSequence.cpython-312.pyc b/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageSequence.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d4456362d630b976369a0efbb568f0e3db1f506d GIT binary patch literal 3380 zcmb7GT}&L;6~1?Vc4vQJ@j`(nI7|X=vNC3!rim5Qzm0JmOEzf>FTrw`VP}BB^RvEp z7FaYJAy8NXHhk@i@ke7c9XR z$3@^pU9u!w9+xo^&}F2{caR=?EQGtqV+o`u5-9r9le%(89*u6li@wlkRb>WUQF6oLc z!mq3+bP0ZAaIy@)@oFrW3Y06JK{U@L+BrBRslqolV^XzbX_Ts_UA7F{a6GDNj%wCL zRd;gMD0!+kqj_ox7A6g~LJeK@T-9>jGS}kH8H8_QCacuARWY2BF_`3wpSTsi5q5zV zL!Fqoeq&-nb<3eGOp#V98DN1Coj+MsO-DBt21ENIQLb*@v@DfqCTIg|hRW3;W1%!O zafQiWBE%&VsyU@r;ZToMo0My+<2uHINj|-Al8ydZMLk7*(@fXdo zUxu~Ebv>}JAyGv+c_fgiVccBoHf`0eP*0uF=2!%bo2qSiGp-&ai?-<$`CSP+GA9S| z8I5Y5M}pP@P;;{48QgP$VA?@^+5l9-qEdFL$>5n2*&)^xX@%{9XwzxRtO4{K{4!6; zT;4WxQ_JgRt3vbTDxB(^(~Y^j;}U(Y?07`0=I0D&E^nEW_4RiK-~N6cv>WHjTInW$ zhUR~Ew?pIEpU*mR+N$4|$E)^&`?=gUqdoP0<%49lmf|&{0kJRG7!}XhHl0 z&EuRfa*#0`U3I4#8J3fHOb9DyfpY2N55q7f50e2TPO(M7TnMm1vcOYj1O!hd?QA7g zEJDN~6gGIdqshyS*|Tg@0mu^C6XZm0H{G^!`R?VFt9P%iXLr&)yX{?T7am+#9{Kmv zOxFt}fJC;BMWJVX^t1fNt*!K1|Jjpa`ha$TmfPRUp+|{=EdIW=fW%EC16yjO5C|}y zham>c8n|;5J;Ec8plI^DP_|w-p5X%u)p30Asdqq(vea5ayP5Xo6!{MDM-F0+;0OH` znEx~0CuV9CKZbz?d}1!+#TJIT!|Xp9V;n8){`});!MvU%qB*}&PkhYLfl`Nx<_(yDr=fZt&%|)*JrJa0Ko~$` ziGgN-bo}=8!_zzIH`&~^UtL@O`IGc(_pkjAWCrSx>D>^wv;AMZzLh@9F*9&LnXR`A zazR0xN}|v&Zk}o_^opCkGVmky3^+*f(lN+s5F>_HAxQE};eCaSz?tLsFACpdBfRkV+KMCqt4caR9 zOh%HRIn6agHSmQ|ki`6)`G`aFP$0C^;GQHaZiRB$G7V^D)M*nQA9bqYl-Og&I|Aq+ z_=5;dk8{|!xX{C>7BmQ~#PSw^hL8UkbS-sxjTmZ(E@*)?rasz04c0<gN(>e9^CA!vQz)Ml&UMqxt(=7WW-m*Q5|Z3}H33az8i$23f9zDq6^Bu#2M)YG6v z3nXTKAbEymaf}91$t_p;gOZDd55B~Vfb_8`?6jlTIf$1kgg`45D5f2@7nId2=KJVr zNkU6oUm~nV{1pD_3XmoAvKys4S0{hdzmw|SZEaf~TNa)r(@Pis-r2pJ+|Bl^7S-oIz1}o+gS-vGi)W+u{rZu`0kv5awzG=FE6?I7 z=J_MSIfYf6sS4CCs5k`D9R)G3S~i_&BC!D?%)?zOwykK z*%L9w|9k`CzOT@$U!nGY#m?Y?=LpE&7)I~^Xix6M@9rvZ?uqdGEcq@U@5NB8>t!5f HcuD#%c%LMY literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageShow.cpython-312.pyc b/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageShow.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cf7a8f0992ded27cd203435274dc128accd35c16 GIT binary patch literal 13670 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageTransform.cpython-312.pyc b/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageTransform.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..28a80867b95cc958ace5fcfa2898590404aac3ca GIT binary patch literal 5352 zcmdT{&2JmW6`$odB~g?uJ8|m79e<@_O_Tm8f>ub}y0)AMs0Aldl0vCLEq90H+RI&L zb}5O9;-r8J*oVe0da!$H4mmW)rGG)s1=@p+9+DC$5TNiOHx*(oK@a`CS#r6Ol{hhy zLzm#p+c&ds-n{v}kNI0JH^T7zW#z?sDbLuy>1FUF147&UJBT~XWTs}brnabQM91t{ zGrkyCblgrflZ#2v2{UP@n(4)~#$xP6W~Qz)GcD3rCI&)>{YUYDUd*bQ8O+RzY{(r^ z+!1g`BivEN9RoKP;f^WpIJo%;H>bE0;O>fW$2+?Vlb_Mj1+6=(JC5t?zU4X|UNiIJ z&9-n10Xlxx>3pUI(~`4Iy)KME-=OU)uWg>k`yD3OqGqzi*sCzoV%&_0gc*MxBWA`- zTu&?}&8(S3pUSeWKXU{oN-U;3>B49?yC8MPtGTkdHv4nk6Wp+M&*NZl*KY{P{lU1$ zO;NKPVRFmi)2+^Q(>14;u3eh_MMnlWn3i5PTXx$kw>ntEIc|#O zvg1l~x#d9lPI*~4%VpcD_Qy|`PM#`zmM@OCbmJ;)?3J;H^42|+TAgmDQn4J%uT<7{ zhZ`vkcu$iiSv2pmPxkD)k@#(P6EDo5(;GbD22X)=hpn?KgONxNZqz9Kky>n?$uYbX zVv@W??YyALanK&E!6jUWb<=g>lZDoH4OQ&3zE4y4qJf6_$y;yTeCzJ{KhFMP_Fn$z zz06U$3nNA!Q6L#3*Bhndcm;&gHo6y@f#;*3W50sVZztYP#@KpnC;f4liS=YHZn5?F z2ikkuJdnTk(@R1U(l~%M#8ru((`_5Ds!6vQ01H@|UJ6iE!Vw1eTq?m9lUTo-4S9u> zvIx*&t%+{ZBA4l=-Ij8$q2as~KI7_9W|L%=waKB$LV<@c;2lTvF58%3`<}kD{=4vynu< zkzy13H_}99*q$dhvP6xrk-fc9P=Rm~xh3ZHF{o`)WE;jjig+S%MI{mpM4l_;HQOG< zx>zCJ&7ZAN01J;@p9P9X2o~p6WaGNSbv1=6Bt6R|_X5V_#{Ong9 zQ2%Hwr#?I#J~$a=5`xF0PDo9hgSS#vkk3$afEo(HGEEKPx|=$C;lk|POc0k25}Sf> z;82H&qNaquN8Ws${U?@BW;PD7@yT12o0X4qhwtYO|N27k5luDl51((-QT8BEdo2N& zFGsxPzgR-;bl@$#HJtWMJjUTa{xX*-@_Las3fnQSmfeDT{y3Nq#B2qAftUGIUE#i= zaDTE;J&r=kwN8) zevrDTwbg(3+HM_#TLVr4m_t2e60{fg$u0_{miX}2&=;p9Zp3~i7xGSqsujz&!!$$nAouhp3XFbHRTch<5JSNB6)0jO$SQtA_mNaiAgi3%Dduw} zT_8fYTb!nzD5`m(c3WMMLiyC{Nk}_cpy^8MNOA~n0(@I)Fr?dpK0b;iqXD8JE$3>H zBl9&aDbZ1alvN8yAUkU1p?&*l%4kc8^Xw-KJ`2j@o^90|zTE-guF!R+0YSlHRisS4 z3gwkJ9f?>+GDEM!ln~{$T*o9EgM{U|i*To|ZI6+Rs#SNDQqhkFfiEz3kq-ft;9{*P~860Vh5ZI&m~r(NqKf@cA}VRqo}sZVp{|`Jo(zN*6cQ zz`q7piLH)GGo(fJh(x)8?9lh^h}YKKwj@w|soQQtq+3(vM8s_a2lyuS%W4OJiNxlu zhyij=!Nu@jJ&peK4z;Gzi4fCn0lC~3HC!J8FNo5pvlZ0%(A)?m)s`eh1 zJWUKf1Sby9Rs)Dm!DSWZb3Ds~_rid<_o+bU%Aj1g5LT8g6IU>0$YGZ89wV|)w5P~o zV>McAib73M2`+GTF@aPUndgH$?-}_V1}N-!I+~5RrfHuaVA|ma?8v{^6A##AFSSQIb36I* z#IgGm$9fDez0z*&$Ze~~(Di<}ODo*{NspoHO-%-TbiLxZcIftOkD==w8X@{~hEA#Q EKX&C`=l}o! literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageWin.cpython-312.pyc b/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageWin.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..396ba46641a0d70b884c5aa732425a558d271d44 GIT binary patch literal 11862 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/PIL/__pycache__/ImtImagePlugin.cpython-312.pyc b/venv/lib/python3.12/site-packages/PIL/__pycache__/ImtImagePlugin.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..82f3c27caaf0bb763f3855f7245ec3c9e3e903ac GIT binary patch literal 2561 zcmbVO-A@}w5Z}EIe}MV24cLTGAPK?wa`U0K>8GLwC@CR{npTSQVL9yCoO3>#y8~kD zETJk7NmZ$5Xl0{R!u^m+MIZVXRO)kIps32_ln10%s`5rf`qHP)o;j07q*A*NJF_#h zznR^cox7i!ni>#{A7)2VQ^5U77tY{o4Bq-4m@*=WUSWp(^94I{!>{AebT5-hJxhDAwGDdOPO#L>d_Ly_LW zt2cVDDc5A+Cn$_F90yz7ASojO#V|o|4LHUUCdLt-uy?o^pXVYj%Qu?Q>hKmjdj4|3 zGkU)FayBce6Wh08<9c9*Gvlp!n9E2}+QgGXGucOUF#oM>oqyMig6d=kX)^WPsLENFFo{6GM=XF=Qb4TZJgmbcGBk_bu zhaKGx)m@HN5kGbIdOiqGv!FKbs>8R=LWXMD;wZSb$3Z4u2iMLbW8jZFH2MbYk$%D9 zcBo$WS#;}ey9V6pz8$^8L47qi@AeuzucD{u)jg!q_S3HIbL{kb1VvV7buP(3cIv%B zJ`8(&|FVbMWltOIX|nhDbT4VPIX7tm+<@a1&Ur7=I{uh|V2i%lhC(wmliq~f3r{%- zeM6xwL7^pM>wOlhBxWN_O-yyR_|Rj@s`Ty6ibR`KUBFEWVro*eg*oxIAgRAUT%kH6wkRhfxq1R^G)BqvR)(Oh1e%*scJ zFcXy_oSB@gDT#b^Mv!Nsl6Z4lfAZMz6H!&vgrm8{#4YI4YV_jhSk&pK7p3WxC?Ct^ zA?9pOkPCiCLmT-qTecq}QGbMt&7n;XY7KredvA8NrGM4a5A#M_d%3gJS?(@%S0>im z`tQ2T#@32!t+B`S_uqZ{k$*3U{r#)H{*6$0)f2wU8~jGI|6xnJ8SJW@sGKp*8Q2WJ zP{mcI(p7S81ViPK(nxu%G*)d}xM1LifuPyizR}WZjC`a&aiR8}@`cg`Gql$X^;Co3 zgue){g$|ja?j`r4d&#%xyWjj>VEKcUJ!_#;W_a&Xcrjc(Q=M83MYg1 zr82c}ZLPJB2HvyOwb)f1S`QyGT#o`B#?-<~l}q!leZ8-m_-bJJ(!~{p)U(&-+trlr|15-icw2o3o?nu z;gjuB1Z`S@Dj(0v0(@UR@wlAG2=Tbp5T`{uEm7VVk55e}q-~8WnN^_FEq{&1iJ(p> zVvha`C@%u;w@5h-M2XUgevj;_7Z{cHmOIF7^3M&M;eD%I#}n>V{y@!~T1FbF-{dsJ z1b!9z3APwTu#iGudF`RPC$gCwZ4$IW+R#>$BBVrB6BN5lm6xgFG@a^kSf1Bwr+HI( z3ly~Ls25?{WHH8n_9DFRSLFR2^=vjEZ{RNTNyEK{)xhC(&yhL)N%NcdfN}akU;xVF i34+DuI}F0XIsO3(tf7E0_8@q0EqHLb`xo?*?eTA<^f;0L literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/PIL/__pycache__/IptcImagePlugin.cpython-312.pyc b/venv/lib/python3.12/site-packages/PIL/__pycache__/IptcImagePlugin.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ee95b0b95b6fdf9c0fcd0ca0664a01b4b206a55a GIT binary patch literal 8873 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 NRsPUZ9-b8M{s*25M;QPB literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/PIL/__pycache__/Jpeg2KImagePlugin.cpython-312.pyc b/venv/lib/python3.12/site-packages/PIL/__pycache__/Jpeg2KImagePlugin.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..929b6a77e4979d27ba76ad1d69f0059288de05a9 GIT binary patch literal 18161 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/PIL/__pycache__/JpegPresets.cpython-312.pyc b/venv/lib/python3.12/site-packages/PIL/__pycache__/JpegPresets.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..910ccf060ded82247a910ead8f9e6587a4ce5be6 GIT binary patch literal 8128 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/PIL/__pycache__/MicImagePlugin.cpython-312.pyc b/venv/lib/python3.12/site-packages/PIL/__pycache__/MicImagePlugin.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5b89af1b29c40d537dc94076fd79d1d1e0ea4662 GIT binary patch literal 3798 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/PIL/__pycache__/MpoImagePlugin.cpython-312.pyc b/venv/lib/python3.12/site-packages/PIL/__pycache__/MpoImagePlugin.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..83500ae14ce196e669c0a4e735934b0f90023d6c GIT binary patch literal 8125 zcmb_BTW}lKb$5XUuy~Om01}``nk!kP36mlyTM`>fN-B$_NIfXok{^Pi?m*ZD2?#Im zE~$_K$8_px$&NZCC!HZxr(=5R8B@_m^r=i|n)oZ8_J?ay0ld*nHBEo?rYwzS z3oJmwP}+2QN!;hT_nv#sz2~+6>UKK_q<_A3X5xI1kl$j%NS0EC+4(DmkX0fQkx7v> z6JZ#vn^LBTiI(PwnU-vXh0>g|q^%Ka+7_{;xd;catY}Hu(~gKE?Tk3nu81q`j=0ke zkp?WER3 z{K-C}UM;1jd!|y0A#`Scbj#zQ9A31hlNP@>Zk9w3p{P4S%0#R1JsG%YE(A^_m3cD33D(N+9)l#&IHe;_@=oUGe+cD4E>QP8^oOte7UFtav%;q??+1NSHsVzo538Jhv z892$Ec`n&jJ4(pCa@QP}=bnS7lj6zAO?g&ysU5}|dCtHG&o~QIonzHbV>Ahrt4(>^ z-WQR#B=^_C0JWIpi{I`w@HF;h$n8zQ7q4zj$}^(dI5k85FMH%IVnZveIt#a|y5BN$ z+s?u*y4}SR^(AA|WRFp+mIkhKcCj&U7d=S7U39Y;Yr{lD$Nz9MoAV8Mcit)bMBlwKS17j}mDMbH zXP%u6z#dMhx#_6$_DPoH9e`sC_epfr;VS4WJR7*G#a>OljVz6yK2 z`zY>#G2rRyb@ms1YDJ|aj~M$@%j!LtA)(fB-5t&4q>LyeP(LWTGoc943^Y_p9C^|X z^Ar^1fB5%V(|1Royo+rRapc0K5u&^a6%fn+&q=pPKL8=Fv(gU|@h7;M&YrzAeCEj? zAkobS4i5|@$bCYdFp$ak@MT0YfkJrJdgA=~^P{6rOfW{l$HrbJPdFG4wdqdKby-o8 z6Pb8cH%~~aZi6hUsxlS(x*e2+tY)(*MYqHzqlt`+VpQkGpgXE&W!ERKS=1!D zBcUWRiW&t4D&r11I}AwcHZ^-=Mg?k`L4lRDo3%t{omHh&N@r2k$u6AHOjQtS#MDl+?N@tLWV2;o)<_@c2-uQARN=qXd?Hn8B?j zx+9&73)y&F!84Xh1@KK*6h4-?P!8`3Ju81&aO`*7tuJ+c@}-iBAq`{_yhI z|L}AcJYAZnYkl&*>Hg@p=VZ|nSZ!EoSd%}#b?4ScGY>tX$DZJ-d&LdrMEABQR5QLY zc>k5V$FrY`P$ds`L(ZW(YC-W94R_o%go;#D>ip5jy!JeSQsgCO@H_H>a~?? z>%om<_m4bi`(^Ztrmg048h38NZa}*NYp-dpu7z_&&bO>;T-&1aX%q2xKlKt{dwE0F z`qyVZIJ0nen++79KKjAv!u6lLwSM@ccQtp{hWTgCyUzQk?loxcW83T?LLl_1+w#&6 z7k~JWZKIDj2A8Cg@WDf3c5XnvN+c3tL<0T=1HOd`{0ei#B05DD`~s`!0uRCZp(SDy z8>q*?iH+1_00jg70vmBiPCF4@c4GXAO`_vNi=m7nt{F?ntGf(4kebEj3zsg=HbKVs zoF2P$iXS?CXkcJ4G!m;=wtyE}a`0nz)+myHioI8r-)i}&gw(SPk`+r1wkW6kF5L@z zI*tBnX&eo0>yT-jip7w%BpXl}l!TGHV(Zf*TZAk;d)*^M;~-&#Bsc=J=PrY?Cly!l z=sbPj@+eeiy}K#aPhmyqS5U3NL+4yewnf{LYtgm*#_h&OT%f>pX(#j4jiGJs zFn|=e4vp)0$aT^yFdjnzZX{I6l)R(R3+6QQfho^q8sW&hnNWr{j+`e#WfUNHuUCeg zcZu~5TRoJi&ogHju9_fsqssGMq2vSP4T2kK)jT9Hx)?hqdU$_SOqPg|%;X%cNP zhDwsA8K5ddDSL~AxbfK@s%&}G#Zg(|)hvHQ;-h>znu=#-@GE(I_vm)YJj|E(L#8{1 zKoMRnDN-(-E2&cYuw0)@ zg0Y|?WAH&ncZI%I-7Lg&GCo<|Uo(X&ZQWYd?VKz{#cU=u6Jq6a2o5+-LYE}#=Cm@Q zTc}E>h7c<3(kmVVz}b%7nDo~^{se$1Hh59+pbxyfdEnT}1-gXw9 zjZ4QDk8e6(D0)vUoPOkOU%UL{@TO~jG1&gG^Nw?UL<{x;p!@Og*srdAer@xOcfK5c zcgJjMcYHPc?t|fl;pINf)wzD~v(P7@jkDT;!7bO|=J30}Lx=@-n+t+^?&KHP0vFV{ z;93)?AL#M;m*y7dJ~gio6%HQJ4j$R!kAB&Bbdx)}*?6?*@+^%ljx8q<3((pp@0{E? zthM#g)r!8r>fp*CV8o$(;ug6j_o91QEVOiME#2$yX)U2`?&V@22oSDfO90RKIM}+t z{;m7JzU}~=6nqSy2iu1_**&rfB?FaJuR-NcasBg5^+wMS87(RZg}em?WjoX%)-6YbzCczr@WTFXOv?|X4s@{5Ni`OKvqGuGhXr42xXrIXf+J3Jd0&+_R1 z@bTHoHKe|!gr7SrCm?tmO$l^j z1R!ceKW+^6Z8`Lb_Fq5Bk{==DzLL0a^c5OAwZ_hM%XVXT(d8|ATUL8kdO#%FiY@!f z5_3vxIaCso?H}9k*gtmPaj(a>f`=B|MQ79UmDQ^&S2a)$9{;L+#lF_P>Dm8ymtA;; z`W}Z@gl(>?*yvljwRmeOznEV;b^HCIw|9>|shzdW?XPQ6fdvh z7rt~J29;27b!e`RZCB?rD{;3hU0l4lHnKjlaph-M?_Sjo9(%z4!ufOOFR%RS>gQL# zc<=M?Z@zg&8-8oc_4ZS=4iyVkJT>6;%{LkkPo1(JF)QA8zV^83dKD zBB(2!%L+!9@javzaj}5;ms4weGTQeKFjK+rUi0MH3*^P{f*Zmrj{j@Qpq}DDK6hMi;0+e4cOYp!)K=Je4eKu zS=dO za_gKR;HM%%&>dh@XT_-$)?I?|-c&SI9uxzJ=|@1skY)l@ z6wE#(MYnf;q}bZG$+i@G4sEhsJFMBlKXdpk`*!*mOWTgM#nQ1ez*yQr{8+t^^@g8X znk?%kBC?9)YqHP#)w0v!Yo*gp){>}t7DyZm=vurH3*?BX>Vw7gD(h_g-zbOLK>*DikTL;A+2;A#MUWe`0??#ApGW+BLQD+CCU zTrBpWH%l+KPH2FXsxlf=EonTIaJo&n0V+$Lp~214H@Mev9#w}(J>4x!6A1-_6Etu- zjeSjf`Y__Cdn;X3Iw;84>eO@sVx4G7l<0%J(YX_)yYgN6FQJJNQ~4=mPt6R&{Jw`U zFaDNzenafPA?|-8yhix{WUY+p_XM*B!T_5Xrf-J}Gwsh(%q50tU;bXfH=y|jo)K(4 zRZWEP&sz$_rxD-s`GWr?&HvIy^EL?=NdWr;8VRhq3c+6RmNu?#lflO%i2Xs01lQUN Zt$kW+-$s0!9DPiD-&&{bAvsFV^50yoiuC{h literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/PIL/__pycache__/MspImagePlugin.cpython-312.pyc b/venv/lib/python3.12/site-packages/PIL/__pycache__/MspImagePlugin.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..386ad4db9dc3a0c6d23e0cd7816a43b5bc9500e3 GIT binary patch literal 5957 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 Qy`|>f<;kzmYxLIt2f^b%7 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/PIL/__pycache__/PSDraw.cpython-312.pyc b/venv/lib/python3.12/site-packages/PIL/__pycache__/PSDraw.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2ba53cc9a01dbdec7ecd73a7c943fbc07bb1a4f9 GIT binary patch literal 7944 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/PIL/__pycache__/PaletteFile.cpython-312.pyc b/venv/lib/python3.12/site-packages/PIL/__pycache__/PaletteFile.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5d75ffe666f11385fb3937e02740c9c5c7d55cfb GIT binary patch literal 1909 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 IlrZ4`2K$s_oB#j- literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/PIL/__pycache__/PcxImagePlugin.cpython-312.pyc b/venv/lib/python3.12/site-packages/PIL/__pycache__/PcxImagePlugin.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cc0f47d38f936cc1da6bc210ff8f2ae9e8f7f4f4 GIT binary patch literal 7381 zcma($ZEPD?a&O5cxyujnThymbec7fhTb92Sr*-6SJE|?&j(yf8)lu4&LYgAwCH2LS z2gL{w(n?R%C9Ua8+R&E(rE3&Xa0gWFk0ST)dIbv7a$w$8DFj@ALjR;%1&Z{5bY@pe zN-AyVfqFY{-psst^WK}8_w=tOlb%5N=kaqxzA8fgfDNT+WPp11PZS~d2uC<7K!&Ma zib7ZwQ1z;$uew(aUv+>U*7RzikLEN1?Xa#_H_Y@h!)z}r;j{t$u%Xu|!8(9Vy(S4} z0IujYQ$$60wco7_Ui$LZM=(B?UK{7&*!SpOyNaA6oc=w+8Fuak3fR^YFMv2^}@8#!c{clh_0!}4}TqNJzJf1n&yS>DP=Dw%ej^Ux3F z*W<*8goMh_(#yun~7;*I!1!SE$$t1et#M$>xKqUOS|cZe5R>2uZ> z;6`pyv2H+lv!G5U*h*RC#MaTpt z=qSXgB^*6Qt`d*tl7LLhxCaH?ZXQ}jNLXCMWyC&2<+URMKj@nX`r5+6Slckq z`Mho1NMJPFHZmD`I~3f@@ndblkid zEtqn+t@}b(Tlc_(Jl(+PkT1AzWKz`ic?Smgk%-_xwcszj4XPh4oN67}6)Uog@yjE3LdWN8MZNtXU2mQg2}_s7Y7{J|je>|x9J36Xr7ve3qGIY_Qh%@g8G#*3agxk9 z4UjZSTmz5^$BAn<>06=b8`ni7uZlALrjld@;>P5- zRj{fRinP*~v%Lz9n1<8hi4zPl?K-68>=RU+iL)sxc&OOF2l^djMA*qW;|y0B(?+#0 zCpKbLB>HU%RQhr*n0*yjT|*RYVx+G)TaZu3Xs$*Y|36?PjRgI^sL2zqR@US>`_fe! zNrAY!2t+2i_+h=b7DW&AF6GWa*}Yz`>|NOF^@_yOUgzp1y}dA3X`gWxseLoDU7_W+ zDH2YTx4_zQeT<6fIeipXRNl+QmKt|<4T&@;yfMAPE7RXP3cHy4pqX>ZwxLLnqDhS5 zoYJVlH{D$Hxnv1KbhgH-|8fiEe?3nFwHfZA9aLSsB zGuz-3Vhrd}+(BDUZWQ*+)^m$E+}nNjqCDc?p}?iDye2V?Wa|dBE~klttBo6Cx|jj2 zDKIfZ%)l|YqoZ&F;|8t~ECK7ZwIFv~9eJ@wXabK=mRs=>kv)oBf2#tOzFc!m{hW1Z zD^V%Xqjez0f`>5R90yg8Xc>um^c7FTB=NLdTAqTgXaxjzx7Q6p!#xPmdl~7MVe(`d zV}%r31@uG$x(zAD3TA+!wtg=sarrR*yTiUHAGMx58Jc*--4ZVTmOFuV`6M#z#UaLc zAq+_b^tZbEeGw#Vb&mwRL0$&K5y8jtfL%uax{PCrYHq|QQtcj%sPctG=IWU^r4EPrVmvDUZ@4s7ckc_(V`=KAOJPM9wW*Q42l#eJsbuV`ujr@ zqHf*Z&;(;cCL~!}G>-_OF|ae&C)-=3rGa#ys{~L!Q7iX^aT(kjihw5!6bOy*!KiIx z;;~P{9ft0(73@Ammdy5<@#J{U+?Zn;pq!_342HTVu}HxTYl*d#XLcFfsp_CEM?Iq$@M+ zzo;$LyK_c&;`GmtE}5*Up1U{GM>5y*wR;No%EakHWqn4QuiTM1w^+OLY3&}sXV1*F z&s~{U%^h2)eKm3VXI)DsN1D3(W}3@*f8ooXo%8

x#_O(T#?7d?I}M&i!|u821z` zj(fUU-96*1F@1Hx(vav}G}}_`(_?A--FU{DX@B6z+J0H{ZS}Tv_-|@bods7_+M4dU z@61^5S7&;%)(3B7dmh}(x!QhxV9xui!}IN5b}YDFEqGdURjp|{J^uTu`V}3iXID6PzTm7*H_YBhM>3uF$Men|SvuSEP&d~+cl*no`CT13X9rTP z=!xBRZ};r(bkFSGOmp70BWumuc4u$rt@{&N(A8L*9(-(QhP6x$rf<*s^RO^ym(0#I z{V98&&6^t%^!mD|-pVm;nQMQ0^TEvprVVzfsdDCW@^bo2=1|u0h3lc~i@Jw(kG9S4 z{OZVW&;I5_uH)*0@!E=7<4y zz7J3QXaHejU*GLfZ(zMg3;tx-8xd{tw~yn)1A=b^FJwYD$Q3a4l17jYsDM#gs@eev zP6fQb$XLA20PPlR%T_D~ z2mu2d(4rs#`2-{rFendzdngukFwmx+{RjrXM_3Xmc0uG@zXlai0AT+7CPb;YI!?zm zaV=1xr`=NI+hUBCB0aq!(z6g9S;(`L_|Cp0P zVDJX$$1}gBC|Me3#*8>D-L)gdtlD49(MoJFkhFoKrqrWAoQ1QNx4vW{HROYEZ`_&@ zmR_cSx6Dc7Y*Nnt=1cdkU754;mCgbtYFmoGcnd0Zz{{LNxqrlsF?@A%Zn*In6`8p2 za0XIVZY-};tVm6fNxapSn^mPWtMlb0Y&d0QW>vbca4tnJxW&P&;-;6$iceS54*i#OortI7;hl5x5sD@J))#{-SXpBAF{sU zo*4IWk+&g5=Hwh+hU9z^VUKE=LqRvOlCBOgTM{m_u>ma?sq_2ilxNbh4VQVuRM=ng z6>5P%*oW0#tXi;YzzU<055tcfp>`t<-L%Ih(pNjLpAovCAu_M?lX6C`zwQl;@)9h( zhQtT4!iQN=GcLg6pq#<0;fYf?iCydIIvP&sL^73cSkw>kk@Xvaa2%=d@x@aicoA+x zDh97&82W|th`WH*MXde|dnsNxi;c_J&_W`>^Fg5rF>rw;!X>D}xPTkdb^ztX;3r6d z)nCG2_#a_!O_3E9t!Y{G?9KLnG4ycgVSS$2k9pX;DWw>)ud&&tyPrm zGV7qrf?WgfJUa-ZTN$=;&9)I^XW2^7-QZkx>RIPXB{8^GT?W>*Qbi1w)oLSXSc4i~ zpWeM%Yhs;ib;ymf>MKCjHf*83+s&Y%Tk1>oBz@ESRvRpA^;+XbOp}$ZUTMa$T5KRm z?Etg25@W^8(d5zTjzk3-hojCbX^}X%0+cVCrcFy(>t}k8r zUB~7d=7+wD{C4m+@!X%hv0%NPv)ouyt3Vh-82$U>?~bRM?)-EKmWfF+AK6kTKdgMh zR26KFdo8mqPi>8PTVv*Mwq?P#AMQkqIdwEW@cF5%?z67^w*7f~d!A`Wyu_Vyea%!C zSi_7f=}MityKSq`MQdd${8u%J&H~KheDeH9SJKpnZ$LVJ^K0YwRW-5I!L>nO^*?Lx zP{io?FQU@46fAY=E1%xDe7LI+CM z;j4fzI3#K#lOymI(7TI7fYej=4Du6!uCL!0^a_&#K7|Vhu!2wrudrD4K_#-_FuJ4{ z2H`3qC9i}3UXb(rA0zY=s6>;%5Bb92hNQc=aD6ily^v@tlJFA|K8UX|8`y?@;B%}f z4>K3}vd_FKUrPQ|5CDhHIQ(x=t*9xA`tKuzYWf3V|D9BPL!AFfTJxm!8`AI%aY4Pr z)+Ag{*_u3ClRmb&2o*R^r?=g_8ocqjx~a<6?lcyR~1+n{tWf21}&qS zqMzALQ#1XB-mx=VH#h!-oG1|c|Lbu+A#F>f3h`BWQkAZI YTHTtjZp{upA%~aB(AR%Wj!N_WKg4JHC;$Ke literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/PIL/__pycache__/PdfImagePlugin.cpython-312.pyc b/venv/lib/python3.12/site-packages/PIL/__pycache__/PdfImagePlugin.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b9191830d220958005291728b0163f01e14e7ae1 GIT binary patch literal 9770 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 FNjELP>V)#F+`24F#=UY?hhvW}=-<7801mp?BBw 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 pFHBP_QA6x&H`OLCOhmJ-`>qBvzK?MkLhk;*P* zTMU&rY41WgzB3i)YPxnWbecmHxIksxA92y5^ci z(|d20Uy>;&J>Uk`o7tH+Z-=up@BQAJ@xL04IttRSFB};=)Jjo*z=upS$OU@sSp`L1 zr#OnEz0?FfMAKMScojnm$dz8@1T(}y9mBC+c0x6znotj^$+OCtnNpV1OgPJd)AlW#7H%6?0i&=gC|)(bD-bPcTFU;`fv_)U*9hh@W>7MQKQ$FSFyyZJ^Rr2OdT%Gw+D@k`Kj02{{66tGJS+MK9@5yPkl6kS_ZTl}N!I7_^3cqB z+Pa3ZpzuG5kN%E!FE6T~gF~y+8;la&CecSFPsb9l+ z9Bh-bb~)>ivrakNBWGPi=3py|kZVRoTvdb9gL2C>3QQM~X#@wINyrI*^cpU?>r@E# z3a7Bc?l|`ZMO~x?*bh*rsDM_EIZvISoa}J{hbFK<)=<=-s0G^E*51*%r)zZjGn^~c zq`;4QE{fRh_{P;D3g=rUc+TT);U>LPV$0-o;H=-*%<<=2e13sDKj{ky?&+5EyzhLA z*E5`M@7Uee-XeMeeDkDxft)WG}N z;7_ata*0amOCq(AgW-MAhJ?OmQNKUdHD7zXd%+N|-ydi8uK^P^f+UkNi+2ro%XNyU zhG>ogbwLj)ImHmesW~NVC>C-CauuiHSjg4WDyLR5WX6RHKvE749t#==hbQp&Iy|^O zHcUJNFCY^iBX0^(hrPv&1zb+|@yzwJj_+YBoa$P;AzHXQ^L|?pS z3LpH+Y>Cph&LnKkRIzo%WCtME*0+kEuTjbQi!x~IHcI{ftV02(pUESUJfZZ26w1%;Qu0> zW6#sVHtiO_>hU8Zed#OPt^{G3DCA|5Tbz&ldiu&G7_*U6%_sw?CP)fpm*Km43wuM~ z9{6oFoH|60>odJ_`JHs}CiN4=R&sG6J2mNLi&!D2ug7-hn;` zEL|_}zy;~?jXBOj&I`e9C;jJmpCjP+JG_3V_V^s5$R;;G<#4KmMvx^by}VD@j&FgF zLP@%p-QFp_R}lPyq~iDyKL`6kaAFf1K#2nC7fCrGjuqY#gsI?`AT9mSTa(!L0RDNr+sOFC~u(4K3JHv;UORJ(MuC>Gs zwadohi1q!UXx(L3%F?mW`}xtkNB{YFyyI}Zv?rf0g*)}pEs45^Y{^?dAHOAGQ{V>P zlrqa^hSpL6)I=nOXf$r1MM00cvN|&aW)L)@hEqaqR!92Ep&ra2)UzAv^-!;ZdNnNB zJpO<*b;CCLcNo zWm}Coq~XfXp;|J)Jle=Ss<{f7|J<5Uz_=JrcWy6mS%BY8xHMUQC09A4_Nj>^)=|X_8$bX<(s*5_l*^${HOyB-t|n6oLIGMbk9qkxs;5mUv;IQt zo%DVfqv01>GHlaSJ(V*+4U|v>GemEtaxYL9m9J74XlKpwU=cuNhuZ-lh$u{_LMR2H z0*jLcl%j<(r2+feH5{Fqx6544G_?FpU91l(}$x0xrV>q9#2Tfk{#d z?h8(({8Azm`$*c!$qCn_*X{8MdU*au*|x7=z&$z!eZGl?ViPK$M@m_U!5CdiWO@fq>4dME8Rv7$4ieudVBlq=aFArjTJbnl7i6SRJ7m zdD&wFJ-sI+%?tdrY;g1^rhNhTMfrhsO@Q%{Oe64n{1dJT&jcTso&}Zf}q2ThlC!oJu7!!qk*r0~bMFy≺WH22oy<@(IV^e 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/PIL/__pycache__/PsdImagePlugin.cpython-312.pyc b/venv/lib/python3.12/site-packages/PIL/__pycache__/PsdImagePlugin.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c2c9f33ce8174dba7911ea704582f1a31c156225 GIT binary patch literal 10835 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 JEjdHg{67`|C29Zw literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/PIL/__pycache__/SgiImagePlugin.cpython-312.pyc b/venv/lib/python3.12/site-packages/PIL/__pycache__/SgiImagePlugin.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..357328b0790e9d6ab9c2921af0b926f617fb9afa GIT binary patch literal 8421 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/PIL/__pycache__/SpiderImagePlugin.cpython-312.pyc b/venv/lib/python3.12/site-packages/PIL/__pycache__/SpiderImagePlugin.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f3690692625d997c41491c848fe61735a3f0e0b0 GIT binary patch literal 12236 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

gKk;D#~{4HdX7f(b4&xuiKv*r}h( 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 CK99m6~Erdr~{B2~9X++L&X|;UMgcImcXs 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 PE%^V#zN@MKC-Z**ccTyG literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/PIL/__pycache__/WalImageFile.cpython-312.pyc b/venv/lib/python3.12/site-packages/PIL/__pycache__/WalImageFile.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aa7a72ba1039c3db16a91fc2bcb28fa3c48cced9 GIT binary patch literal 4090 zcma(UTWs6bl~$DRYkBhs&781k3G+0VXqE@fG9kpiRP zd(S=h-1EBUoO|>)mZb^!{=EL$((3_&_$OWrK1Uxwhra+|hfs(GLP3hHiCVS=8^W-? zX>XAWB*3KNXgXTX1!s#|pscmC>1w$bXbYyAOv|(2L4=KXjZj>l5Q$J-BvSD=fa2azHGFbwA@z2Wf?@ODu`2c0|c)(jAc<4>*~6w%dIY!1?P0J z-dP3eRlU((5|=uirKVb-=|VwlcMP>$rbYNHL+X|Qu_m`+2RMuJs?hjlxGTBTu(P&f9f?csKkcv~WL##LyN+Dr(_8gMS^gOM$X$K>(p0cjEB)+YFXsm*F zv08%<2Rj5GI{YJGA=uFdQ620N8^p?y3dbk_R*n+nX`Euad&Ko)WKe^h4M>%{M;uOI z$pN-*19{|t-e3mMie~@~XVB(ZsdFS35ho-#1`<973D30R^pNua+BmiX5uiJv*u%t% zf3Q28!SU39zv2qP2FT!t`vXXE&*43!&Rtu@=#TQjBIr^Ro9`!R2Ms~#cFL?tz9umOa-H=UNIedx7jdEveB-0BoZT= zbPY&;($prt{%Q@Mhqa@3ZRfYqvA^lE3Thj!a|X zhc5PkE4$~)-X{O#zT>{{Dm{VYBiG-#`IFD$o6ZB5XPerhwmn;(>+jrmMS=Hd>eks? z7jFLOK{US?&EHn|6urobYb(A?TcF%uV4AQC;8Y;ct#Gv2;xLW`A&yxa3z^Ec0ZG4uJ%7jvJ_^&|gY z;*RH@@m253-d|3Cxv@9?@_yu%`<@?S>PuUfe*NS7o{5JXzx~nHM-RC89v8nw?sMr~ zS6a)0^m%w1otg?yQrjfwJ8f06X(g=jX#d&9?kQYue5f{Gs@0(Oh#R6sMVYRuRlTZJ zldj_OwF+HJ)$~-W;Fcz?Yp`On}_B?E_~*HL^j=5S>CXE5c7#Dk>kCteVM9m256Fn|zhgJ6PiKynE- zXk7o^fV+U6%6gQoc1@JUqo*48CdWIt|DdfC7kZ+i*5%cvksH$L1~h51rie%3fICFl zFk~pvz`ox=9q}5rKx?X|H5AqAu8z)qUmw)Jjs7@{L1?JNmI~DxS|Cfea#z;mmeo<= zD<~iLS0Y~KMCj7ww$*##o(*h*zOt=g)37hf{Xo#m;!AC@f!j6_cUW?}c0>T-jXe$> zlM5flJf8}6lfDCP)#4wD{=Mw}W5{blO zv1Brt$z&u+%H?v!VzE>zO;1nH%*>R_<+-`Jv6w#@^@$N*JnS6}c_RWB4sb!975r?# z$MRmr&oN$><`|k~D2Ap|sZ27NPKv2SJSoP+_-Jf25{-nz;ZP_DA_D=Q=ly=a*X!jt zj%C^WxG0T9v&nEeE}SpKrlfE#Eo4M~ZjztL`Ol8~@?+ldIF}4F5uWyQ)KoYyDfkNk zZ;odtd`y<3(;SsxQH()R289_Eq)~uIej0fx#8OB~#j=TLMvSE6;nZj-5e}h{vVT z(QGuD35Umm!K5H00)d#{AMyEuUT=V9eGJ3WG)+-JUzn8gh3uJJW@2J&TuNoLiA*Lw zHa40}M&t2tG#U(r0)l`&3hrbWdNLNtM?<-=FcIR%1%D>s9rJSu9~<{FQH~C=bbz6J zG{sQ}YlG0ZbUu@PE}c0yHa3+^7R5w97M}p^B9U|`ln{g%&qw?|!OQtsh69y~B`H6d zIa3&ua*6CjEIl4gWx|PcFqY&aac?Nf3SrtWP+mV`IYcuERgiy zn1uDNX}EQOBa4l;to1b9GH8)L>WJ8lQC79Z`KnFgVHOYgRj_KY>6+`8^&e<20}fYG z{RJ2v+rh?fV{SzLhbK_#U&P42iP$$p;u|9M#2G=E>$4C1nLU5z2?2}4IT|G&$BK^E M(YFo)owC^f57@k8j{pDw literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/PIL/__pycache__/WebPImagePlugin.cpython-312.pyc b/venv/lib/python3.12/site-packages/PIL/__pycache__/WebPImagePlugin.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2048f64a5789a191195459a652f6f375337ac0a6 GIT binary patch literal 13218 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/PIL/__pycache__/WmfImagePlugin.cpython-312.pyc b/venv/lib/python3.12/site-packages/PIL/__pycache__/WmfImagePlugin.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fd1c444b2a065286f3eaffa5d38b5afd3db632a1 GIT binary patch literal 6172 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 UV=p&iFV~O$>E6_LC~Y6_7d)^w3IG5A literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/PIL/__pycache__/XbmImagePlugin.cpython-312.pyc b/venv/lib/python3.12/site-packages/PIL/__pycache__/XbmImagePlugin.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8f19eeff5b985b66141eda4c41dca92068c58561 GIT binary patch literal 4097 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 Nn#R`8(Wsj2{{l}glDGf> literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/PIL/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/PIL/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e4758990a1e86870152406af2d69239171672a26 GIT binary patch literal 2028 zcmZuy&u`l{6sBw^ahya>7ofWhM0cr&RYE#+L)>COe%W&ur&{eSnRifVk+Qky*C@)V zZ$0#X=+3(h`yciX?6lJgUxyufOPBSs(;j6THG}Fv@jbrxzK@UMr{6a=DhQt6E}Mf_ zD+v9ijQO)Pofy|=FnNh6>LF^-LSTf2Uco@LNJ~L6EcHqTVx=GQI`h=&ySMaxX@Ka` z&qi;#fSQOdzd&?_t^8V?t(V8;+A1LiLJkjt_!8f3#NqC)(z#D6oKY+okJ+l>vet54|d97MrGbU>!iegD5nf8q`W;@Y%ne9|Nsj5Q)ovGu|MNreZaY_!=dba8CXGHI+6KOj!o#X~Wsv~?8 z>&Ms`X!fm6!YR`sI$5NV><-AHUF~vTV_7|AeP=PkJPow~^Q^CvJkv>kaQ1C?n1zcU zv^UkK>8LIVJjV4Vj4u&GJp-h$K#g8;T&NW%w@)J2L?pS-*>v}ZLd1f60*SfEJS98@ z!Qc_DC*yj^etpqycMkHjeJE^#C7}G3J^L5w#F(bijWyN)A?78kQ=vtl1f8W`u7}+7C zoY*u8vUD!sl#Og)K}QLQJ{j917LDwH_h;*$S=;yRluLFmA>IYFJ+q&^ro=9RKD6oORM7HeEGPxDt5q7to=;Fo?KU`U)%%<^$(q_Eyy%% z5?F$=rjwN?o%~Cg0@YQyyyhd7Q+_mUz?WhVO!W<>pTlrfGz{ZSVZ$iB{RkN!|BY^6 nRZ#WAKg~OTn0KD9y(+E$vuv*yo|pfn#;URU)9G6Tue|R6t=FU4 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/PIL/__pycache__/__main__.cpython-312.pyc b/venv/lib/python3.12/site-packages/PIL/__pycache__/__main__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bb3231fdff476411c72ebe5986497cd697b3abb0 GIT binary patch literal 393 zcmXw!ze@u#6vvaht1ZtkQEVYNtvke1j~3ey|= z5hvDF%2ScZ+eRE~rlht`Trs)w$S6*v&WJVbg{p~hlG|J}jCJUitI(9DY9x$!(de4j zBBBSy5KJ6{-!o)%figx@f~exTL8`QuQpA)MNJvc!C9EbTDwrq`PtRxlozB)aGO1;; zA{Wh($ literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/PIL/__pycache__/_binary.cpython-312.pyc b/venv/lib/python3.12/site-packages/PIL/__pycache__/_binary.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..43a3b4ca2c66cbe35967a46b45f1d19a2f86bb22 GIT binary patch literal 3436 zcmd5;&u<$=6y8~{9mjTlHEGgRp=<+5yD0GzCqz{gasUaaKv63sgnYo-csK5<_N+C# zHnNpN4n2Ulm{U0RfP_Mh-1!H%1oeVeaN>Y^D{{mk7x><+6I`Mss$vK$&3oU@@Au7n zGw+9ifs}&p`%m93{n4)|ztYdq7mEOEe+{ss*h*fpnXQ&tMa`>>aI74wXnCy?&&TmU zYHN?Qe8L{HP~OOymkNz@ONmM8_3kthu`AW;TrP@(~#A|YJP=mHtUJ7Jmfej``(kz>XZmj7 z%+ofklH;5A?tWkvHl$_QY9mzLJA#hwDvF?@poa78(AdaAWEoucf<$)neLB5Y%4#fhg&yW z#V>EQu0Kgn?Q2tlHdQ1_j=ng6+{83M_ax^xF%|`i2|$hVBQ#uC)qQ?Wv z6CJTeXF56LP+fg5asVdC&|Os|p+e^Q#DT6y%*EY> z<+39tP;~>PeGOt;IT%zj6RqH@`;Xa^^z`F}AJa4Y+DtDP{N{xi)Gv*`rn>q-(kI5i zh>%|0&0E5ch`Wx~+th=I>jgpIU4)=HIAKY5IKrF%hrZTS*Ul$v!x2;9DA!A}PQ>HV zQ9Lf@{(td!_bi8syNfvl;>)0CwU-o~2)HvTy3~Mk&*BFGCkeU$4MF_gQ zfIFWo1l%hi>Ru1YT0d0RqF3dVYmuH4tUHS}^C<0c2zrah|Bc6lc5`k_VK=W~6Q7`n zTO?!}aGY3UI|qq-@+F-|brGdK2tlR~wX~M? z#hd%uwF@mxud|pVadKf97_XzPMD1A;7qN1NCOBm&dAxLoKkUg;#u-a3=5TgP=-@rK z)ViU`OhypFVL~`TP4F;=3=0jz)ODG}8ziWU!Q{1KB>o;H$Su3N(EwvC>?;&(uUIIA zsX}41hH0HbK~NGHCXm(Dia~VnlugN0SEigYbrR${@_CaNxS&f)2A_-s>41V9L(m}! z`2><-qK^a}Rg{b+S1X=fD?4jq1$E@3{znkcVvMohZzyc;7iIc4<<)kAvEg=-v6l`~ beQfq%>{P+fihi^06l0S#A`(+Ey;3iCut_ihpjl4VuxHr+mI${2{dk6a6@g3*l5P~+WR49 zS27Z7a7&?advPETL2Ag+CH(_(C?&^0FG_u=x}@Ne_TWQ7A*F|$`bH~7vRit~2<^^$ z^Lz8&`@J_K{TPYJ9E=}U-(TF6IPMt}+QaWn_!rYKxyxY=^BSk~vpmn{KFv4l!vgke zg6^O7^IV9-LF~f;EPmq)f%NYW4q@pFX*N*yrQ|)fd5U*?6vHrW#a2zjn%?7E%3Q8Q zs0F%Q?!A=H6_q>#xMD#oQbo%P%ov6bzCrkc%)fBJ_%7%8sSoo8k9}(ahhK;I)Mt;sa zJPxgl0bal|cpt(&4i6S#o5k83AVszUVBgc$?6ddLK1ZMt-1|QW3HLcZ*r$I>SQCs9 zzz^c6BP>VSJ9gfkoB$ta;(a)_CfI##%yNHw)_Hg38h6BdoFm-hwnRJDM&N<(5)WEj z@?2R+4Jv66Wd!3gDNvI4s*09~Rv|AhX09S#SvDzZHA>5l65T8jj8tQv9VG=#$rGIzcE?|rav#`hwk*18 zST<2G3oY4&O`buEYKb5P<%^bW>L{;h8guX2HN#~bko002C1(nYRKbL;8)VhXF}cs3 z*V9>~G6uRcZxNze$b+1L9SCL|B^64NkYgu4)q+i%u4k+w#8dVNC1}BK7nz{OM`7YV-Ymh#Sv`n1(!~GzCSgK zz>|SAq5ySf(QfA2Wq~ZH4KecMbp_iB-_E}y3ChI4sTNggbewPY4G+*PXdUKp^I!PeoJoI+z$XQ$3j zOrD*XJfErz&loF)xoUWoRkXH~EUJXkXr_P_n;@6JP&v(NX&S79jOMW%?W)pfvq?t1 z97Zc5SOU5ddR6XJvx*pTX>$es9|xt|lKo+M7)w{{Za+ZUfC z(mT=2PoYdbdT29Ty;#jxXKKmIwcabYgr~hD)pI+&M{B{OV7eLmYNQ@Jy&>)Pr?yXQ z4{n#gA9^T1I#%nw%%DTn_}6AFc;q)JcDq#X%^uLzXG|uEqZoC{3X;^k0&-4 z?&`Po` zp~HSKG;ILz@h1S=h$0(NOcfuu6kEZ4too|0o}QYmDTt+*MztN#>6@J%L6Fm#N>jre zFSB&>@}Pd+H?N$J2G}-&9NfOJ0=hY-HOKyE?cg(ZAyzAhWhW6&!K|untf05!U9_&Q zpe~+Dzqo5YbOUPE!dB$^jGC>GwtZ&$Zs55=!<3;}t@);9Rz1kAa)-N27{B`BQ#i>w zK@dtux?v!elMIo-k&Gv!Q5?mj4#I@3vszm^t3I2$l<0)eutrE?5K?c;HfMxz6|@pn z#3Ip$e7(UyRq{lUUZSr#;xsU%2P2SLz3xIUkoSR}WUGq{%hmZOWNG0+QkVmlyV{m) zp7W4{EQpL$y{C)|7%~9~(i!0Q=(xYd$#YBaj@4q+bu1eBZDB>RTnmF4$~smMa@vUk z$(`8hu%KhX0B7|(v$t+r!j)_$a%!H_V8VL5uw)J2;B zTu;RqA1N4Xf6@q74w3O46@I328_zbI`>E?Mm7bQtvJcF!+B?xzN1; literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/PIL/__pycache__/_typing.cpython-312.pyc b/venv/lib/python3.12/site-packages/PIL/__pycache__/_typing.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d84cf3794d3f61dcd0f5740e3851963355723d35 GIT binary patch literal 2105 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 S9d^H9`va1Py*Jpg@qfRk#aY|{ literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/PIL/_binary.py b/venv/lib/python3.12/site-packages/PIL/_binary.py new file mode 100644 index 0000000..4594ccc --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/_binary.py @@ -0,0 +1,112 @@ +# +# The Python Imaging Library. +# $Id$ +# +# Binary input/output support routines. +# +# Copyright (c) 1997-2003 by Secret Labs AB +# Copyright (c) 1995-2003 by Fredrik Lundh +# Copyright (c) 2012 by Brian Crowell +# +# See the README file for information on usage and redistribution. +# + + +"""Binary input/output support routines.""" +from __future__ import annotations + +from struct import pack, unpack_from + + +def i8(c: bytes) -> int: + return c[0] + + +def o8(i: int) -> bytes: + return bytes((i & 255,)) + + +# Input, le = little endian, be = big endian +def i16le(c: bytes, o: int = 0) -> int: + """ + Converts a 2-bytes (16 bits) string to an unsigned integer. + + :param c: string containing bytes to convert + :param o: offset of bytes to convert in string + """ + return unpack_from(" int: + """ + Converts a 2-bytes (16 bits) string to a signed integer. + + :param c: string containing bytes to convert + :param o: offset of bytes to convert in string + """ + return unpack_from(" int: + """ + Converts a 2-bytes (16 bits) string to a signed integer, big endian. + + :param c: string containing bytes to convert + :param o: offset of bytes to convert in string + """ + return unpack_from(">h", c, o)[0] + + +def i32le(c: bytes, o: int = 0) -> int: + """ + Converts a 4-bytes (32 bits) string to an unsigned integer. + + :param c: string containing bytes to convert + :param o: offset of bytes to convert in string + """ + return unpack_from(" int: + """ + Converts a 4-bytes (32 bits) string to a signed integer. + + :param c: string containing bytes to convert + :param o: offset of bytes to convert in string + """ + return unpack_from(" int: + """ + Converts a 4-bytes (32 bits) string to a signed integer, big endian. + + :param c: string containing bytes to convert + :param o: offset of bytes to convert in string + """ + return unpack_from(">i", c, o)[0] + + +def i16be(c: bytes, o: int = 0) -> int: + return unpack_from(">H", c, o)[0] + + +def i32be(c: bytes, o: int = 0) -> int: + return unpack_from(">I", c, o)[0] + + +# Output, le = little endian, be = big endian +def o16le(i: int) -> bytes: + return pack(" bytes: + return pack(" bytes: + return pack(">H", i) + + +def o32be(i: int) -> bytes: + return pack(">I", i) diff --git a/venv/lib/python3.12/site-packages/PIL/_deprecate.py b/venv/lib/python3.12/site-packages/PIL/_deprecate.py new file mode 100644 index 0000000..83952b3 --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/_deprecate.py @@ -0,0 +1,69 @@ +from __future__ import annotations + +import warnings + +from . import __version__ + + +def deprecate( + deprecated: str, + when: int | None, + replacement: str | None = None, + *, + action: str | None = None, + plural: bool = False, +) -> None: + """ + Deprecations helper. + + :param deprecated: Name of thing to be deprecated. + :param when: Pillow major version to be removed in. + :param replacement: Name of replacement. + :param action: Instead of "replacement", give a custom call to action + e.g. "Upgrade to new thing". + :param plural: if the deprecated thing is plural, needing "are" instead of "is". + + Usually of the form: + + "[deprecated] is deprecated and will be removed in Pillow [when] (yyyy-mm-dd). + Use [replacement] instead." + + You can leave out the replacement sentence: + + "[deprecated] is deprecated and will be removed in Pillow [when] (yyyy-mm-dd)" + + Or with another call to action: + + "[deprecated] is deprecated and will be removed in Pillow [when] (yyyy-mm-dd). + [action]." + """ + + is_ = "are" if plural else "is" + + if when is None: + removed = "a future version" + elif when <= int(__version__.split(".")[0]): + msg = f"{deprecated} {is_} deprecated and should be removed." + raise RuntimeError(msg) + elif when == 12: + removed = "Pillow 12 (2025-10-15)" + else: + msg = f"Unknown removal version: {when}. Update {__name__}?" + raise ValueError(msg) + + if replacement and action: + msg = "Use only one of 'replacement' and 'action'" + raise ValueError(msg) + + if replacement: + action = f". Use {replacement} instead." + elif action: + action = f". {action.rstrip('.')}." + else: + action = "" + + warnings.warn( + f"{deprecated} {is_} deprecated and will be removed in {removed}{action}", + DeprecationWarning, + stacklevel=3, + ) diff --git a/venv/lib/python3.12/site-packages/PIL/_imaging.cpython-312-x86_64-linux-gnu.so b/venv/lib/python3.12/site-packages/PIL/_imaging.cpython-312-x86_64-linux-gnu.so new file mode 100755 index 0000000000000000000000000000000000000000..c7fbd5864970be8c38d87f977eac5b8f7d9afbf8 GIT binary patch literal 3115489 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

|FsBS30>wgcV*=%zd%ce*U_ zE(d%Y(5gHjce*Tal>N#t3o=ljfa)l)N{f=cs)w z5cHo0xQhe!2h>M^dOz-fKTT)C+ldVYmoR8Q(E=y(HQpD2=FdHI~-t6mQGXHtNY88={TopC$tO+G^K+q$5`Oi4mb_a@d2Q0eAd6fWlkAi~kOYdzpVs7GG}) z=q-;jYp-Y)z}rjS zV5~gq6+*`HF6$KKpl-vjzK4@hNvQ^xZgu&ym<0FbG5f6q-uy##o#pS{-s zcLTI*9+1jd;5!c30_co9AeFH|ue+`FEr4#y15z0a?Bal{0KJh1q%yqPB4ym&0mBth z-a~Sgd9bxI0=&=9p6Y=80QJcOQW*=p*#Qp+G(HbVWi0R&2fPT-j65KfvA|y)@CiVV zmf;dXfQy*-9I!nfyQ+pv6FMN52o`vp1C9i=OCFGo zs0Ci_fX4xvoCjnhYJtx=;6gyxdw40`vsbJr77_EU>Es9t`NfJRp^^z&#vr7NE-l;NY+uGj-gJ_8;=Ir#av=fS%3+ za&N~1Z*jo&fWFHEva7bhR~@iC8}&*dQ)`zsyJ`#E;DAE_4bB6ytG2+p-qt+F13E4M zzG5rGB?2Ep!ogj3X9v6)(2aROE)gtnssp|S=*>JJm9fBU9I&u`)GL5YWn9)&#sZf) z-~d2d<^idU1%B&*69G*KfV&pBF_Vc?nMeF=+dj6|R{^>*4@hM!aC-+_0cd$1kjhx# zL40wlTA2r=G8TA{1BPo^3n5b(S4JvhffqPnKR|r~;2se- zW->`Cv)Iora=^m@jn4yej%$JMI^bMDbMk;(yjftVpRM&{fF8{Qa`9$?-5hW&pfB@) zT)bJ}o(@=17xl^^Q|s?+Wqe-opfZo~90@);ln3Op*#h@)z}o@cng_)47I>Ni zz5?i_JRp|0z*`*fPe8xt0kOOVzUqM8>N%5#jO7#2pfbf&<_SN$!2u5dv|k>O%2;4s ze`}sg0bQI2q%sz`vjaW=Xi*-J%2?o32mB1sCwV|BV}aK=U|EN#R|1*J%x|p>kMjCY z`q^a;I26#1c|bO47Wl0Lo&acS9*~`h1-2bvYkd`@+Ef=63Xt*+_ zyrmYXOY8;!zX*tTK9<<`I!+l4^Ii^9e~Ud@keK=Cmsd;9@VvVBbL3vnoA%@K;Y`2o zZFBXuTbXD@v_PKY-D2O)602{A4D1;78lhhD>du+^a!73__5{!t`aaH?`fkX82CiVC zEp8toN%hr`c8y$wLA`l3a7pMU8=If;l~>p_n9wK*(~_WM5a%@%~aXL@DDTL^oedWRMI*SW=&Ci0HTfI?ma`G`A z%pn18fW>)Ui@{ZH<)$drGdIX@sl;DV-Augdxda^-1$ssXdc5Z}zljd_Fqj7eoYO}i z72Flovm9;>n2+*sbWwv_>~QfdXiLb{^SPjWvjjJOZ=z4_eRnmIGM^8Qd!YZlT~7 zZ!4}q756omuLM`W`U|5=M%?~H%X8*^TVDi|2jO?u*THyb{&OCO_v&L-tE9LzH-$V} zzneZfPl_Uaj$Ko9?~{`v(63L+J9K3$+7$grTP*gbt10@D4xhWCXZl9HV#xHB*`GU8 zj1k=9wME<7KCmU2zIiyFJ2bd{4tE%sL-TNj-b#bp6P#Jzb?hXAa(VBP-xIYb{Chl$ zkBML4^0}NmW(WB=J*+(j_vEH}y4rjSyoD0~WbNlp&$H-Q8t8F2pO@zpS3plS<<-9L z;-g+hy1d&qSBS5&rtzo@qd zWIFzwXX^!R z$pQD<`uMMQ|JUDjZN45w{)biGcD7s30el%``o@ZP9IoyqaPMU6z~!`M@oE=8&cqKF zJu;uZh>jJ3o~af`TL^A-c8bIO24+Kms|@t5G5Y2^T+;xCJ7mh`^wGCpR((qyZXYmv z<>8`Uv%#%(xbwlB8{l5G`EnCoaPMYg+iy}&7thl*Ccf$4<0IZm6F+>@c+c7!YrTU0 z_p(!nS3BKB8SV(m;c%Q=8r*z`dk@U&JRIwQ!7X*Tf57||;6~bfd5}hM?`PL+S}qsQ zqxmM@qfh0uuZ!nNVH01sY5W<1{<>Gu|3P**@mjB*135;3OnW&T2NMQ2#o-PFvwt3r za|wf+?{H^>X%SpMnZ6$n@?9#p56z=(_Y;4gV7!KwWw^~8>c+>XIu<@6Y8AxzV0HOS zW&3Q!LsSqlZWVp5vX$`5AsI7Yw2qlOJ~VxuXTwqMe_z#a2RmkV*gEQM51Dy)sm1XE z`SXf9z~Lr>IZSZscu<^9}dzqi|#M8i@@cy*Uv$G zi-}(?dSpDlhmO^Oo@wu!yjk}J_us5H*y7^bu#bRDyA^%l>g+8C_f@tITuy#5tA|JR zCH~9oaHnS=I{F8CTz=d$5Zr&WQylIHFo);ixNtML`3^S^%-jHXYf%1`f?Jzi>Tpkh zc`Og-d)|K(x7Oj-fmxe}V|#3HnH{Y?(%W*o58BioVQ-w^zRLCjmtzlSuR?E@i686q zY=@3*13lXXc3mpCb=ek&8xQ7?JRGgCLUFe{+#E2o@^F;j;8r@^qhKBmaNh>`juYHB z+4bOZ%0DxRpC$2MXDf$TJA8?b&jURUNB=RnW``>u#EBbZ?B#Im8x3xv!)*;_V1RSw z3VU@gXt`#9%PE(O=UGk@FIOiy@g0J(*&^}ZW>>m=jwFvGf_xl~avR)6hno*(ULKBe z8(iH`YlkIZo(OOgf_&>_9sMpl+~K|fvn~(EA(O#Pak%R3xJwV2eYVrbTxW1PcAJUc zPB32MdZs((D%Sj;b*?%Y@iCB@(|%D|bo;3HhmkR-{i?DnkX;CYV{foQWgVM&#uk!! zZe#1KK_AOE5@Z(gdcDSP#II_<6P1^H-?xFj1v2-(f3-mN&=$Cp1HKCAMFE<7-ya!` z-21knV5UR+sV-4$2hKMkljxKnkqhM}TI3Q9Cc$=+NcWa2fqDSV(Q_wLz(6h+mxEHb#J-=t`hFRPlU~UU=KUy5?n&AG(4tKcKVBQXJ6+ylW z1@~Kaio-<*^K1%a%J1^!Nn?}me241~re7Y8bgygq7K6*Frz;n2DDi(}*El_gqhoxa z$KlvV7+h?)t>;`Ya{^q$8e=yeDH7bD*L zj!`cO8GD>(^Q9f$Am6{Tw>#XnV7AV~(GCW;(&3H*b7UTlxzpe_I@|& z?(b~f&ekq3fq5Yhhjrdm+;E5c9n8i&9P_imO>wx|AyKbAWa``g6JuxY6AJF1?0knC z17>s{j{UU3Ee4m<{!S0a(k6b5({m;|P8U7;D8qR+zc3#~BR{?q?eF3gZ33VpSwM$> z2NZhaEMNox9a8s_&D}v(-v(8iB|zWL9=)k12VictfGeD)57F{|o+dhv1wQ3~p`p}F zNDDtOn91tiBFm7U{dm(X9U$zDu>fzxCe?R&))Oz04`!I;MD-2$B|A0PXb$j=`tM7 zjJ4;7a@bgRl6)7KKViH9v-cyn$?6hx(OV{BqDCWLuyG`(jPuz<_>(ikkRE_V_J#)P zN#Er5@_wwpXD<#8CpSv`J;dDxnIp%^{aYe@S_u9(Xe&KBnmkx={@C7pB6W%$Htw-g z)EfcySu%%+DBxiTZNFf z5R^ZyR2%anqCbH68!)gEd4K(8lKa%zK?#XLyg&{cxA;#xLFmViYKQZvKeWZSQjY%h zlHUsW$3?bAWj#f9)Xq%1P@jD}gBzgVGx`?(B}k4{2Wk!0jo?BRl4I3@MUrmV9$e1t z&Qz!0JlaY>c_glz>s#zs*p@ML9~q^GPWri`>#Y0%ex&-(je48%N`fty^Z95PStx7w(byj0Ke&X&&}8D`0n{k zqV#Ka?z`vu;o6+kcvT8@&d1h|8&So#)&k?uxefdxcEj zxI>hW)*98;9io0!*SSMX$mIp@5XDfLM6NqTlh5Yv5anC^@n<_qIc|-~H}X@Ll8=|j zM7hWLRO!<&t?m%tA-=eRF{SPh&t(EkSa*o>F&;0G>kctt-62Xr>Jmdl^A$D1G$pJ% z#OGu3{k{vTh`CzJJ23GfT5yN>88OWX>khGkVKO{%KPhpCScb*MB+hGuxxRP|F=G?f z9b!9T#wEIy6LWKA9n8dpb%)ppGbLf&As$GY>4|mJ4tI!hVbYS=hTL$6DB5NutUJU6 z%&f$f^~Bs$vLnp=gms759c>E}?V5WF!)owO1zAcYs;m<}PAZC#*Zf#V~6U)*WIWGF_Xf64fu241`&qu!;^6lI}e%**HJ_xzy)x62>UJ}cXva?bM8o4P~Hh&x2lSY+KHF2_J#k#&bC5wRlc4$%x4`R*g`5QV8s_axr9b&?|LzL;PDPi3qHleLo!n#8gW?;g)LlmYtu{+}icZkbLBkmAo7#B(jA~DG= zG=YY}9ij{>=MHfvjUCBvn`TlSPM}0mlxRpqB<_hIv_mHncgmbZI1)RZ-%=UHtzfTA z+#%kFtlYXolswDdq-)>~QRH6RE=Z&Usn1<;hbXf_M%*FF;MReTJ47kAm$2>-)n*i( zhQ}S^^S~?u&R zn}bOwYlT^r&K=@OialMh&FHwqVZF-Hu;LE!Dn(o`2r2x%tqA81@d-sdBM2$TTMkho zc(2mAL;O@>YXv4*`IOcaOJKHG&K;sS28+bX_*HC=04o_->@!^{Anp*iR&2Aw?zssT zXI!KZcZi25><9;w*~VnQoWgjO&K;uoKa9jKb1)gN2Bvxq_MUoFHv5@}6#F>8r82Tg zOzb#%t++#cLt|G+Up1P{o+cj|Azr0(hbT>6If~gy+#!np!$_2QMy*8bB8!dwM-E$qp-Y8t~RZ6hbaCJBe6Mx5PQoc zYw}U+H){c%J499O+#xEnocUGUAxbx_bnXzfIL;lSG9PAv;SN#!A4X#TxXfhoERjLg znxj|g+#xm)8BrGiS}>Ww4A%5C=MHhC!gl9ZVN(RAMc0sQNlk?#v5sU^6)BJ^i95vk zAls=s#AhBHSTL%*2FshbYXHgms4~%=CnHhbY=w64o8!a_TlC zVcj80%&dfUhbU?0CwAzH>b+F;!o+Ceafc`|w;?G00f0>Ec8)BLsJd z60wvnIgS} zb%!VkVhQUGQKrUBVlC0QLlmYmVcj7vM^=~EQ@YEPa+x3bA~WL?cZd?hj*i}sJ4Bi0 z1}451*a=#n=7e>JDB4=xAL67<(e)F{VAF_mN<#>;|@_~+E#an z-AUuzA&SGpNKCvGwvnzc-=1q7b|u0REh8r*?hseQC#*X}u_7y+WPP?VX~Mcgl$cDy zx1Jojb%+iHgL|;m;4#iHUtiI;#zm0$qk<@hGkP2=AT;&~?6Gw~hn>C4<(<2Qrd{1nGu z&{)PtujLWNns(A&Gxz4jZ>W>HRIKTBEKPFUKAfdN9o4a7&3010(y@HC2I{1a6>CPz z>c0?v2GpQ#5^IYD_t3uF=7So$aE|2H#ibBm?-%v{3pL=ApJ6WM<7dqWLJdwvH^`5oMQf-2k_R0mD@%t29a3Dm%eW=BPhIGCG$ zQ0GZV6eCWeI;KVEO^5JUG1R~rV8^y1nK3@<9RM{>+XtN;t3-Cl;XF10HLYpudyQM2 zL&WfmR4~JJ#N9-6SxFZ^y_8#qzesua%}V4SNAlCD_*fg9DHTIR7?w1wa z|G;mM%|w?vbUcHO27LtSD%El6QKW!G$2F>B*wNfWgp7`BR7d$SeE0zJx=g9?y^jMO z&#R8liCL+!&BV5$$xSKOYwUB!@)`)#^~4I+Xa1y5bTh6kysj6vHNxIT==TE9-JKY= z@w!Xz6mJ&vycc$o!^1(l%IdC8E*ltM>X6EMq8f6z>i6EgI&etkJXsV(jy(1R-euFR zWr1~1wHI*f*W&-ip~V@3ud%6!OB{}>UL+hisuER! zqbgwnM^(ZEj;e$S990PuII0rOfupMTU;;-~YhVILRezEua8xC=4;)o}2`q3_C8`5Q zRl)?0sx|<_QPoRyTRcn+hKs~-Rpz``;9-h>V(WOBt)nb)c$gABfrlyaFc^54Dh^Y} zz{8Z*%X*l43YhaSCB+RqOsTTK!<6Kik>;10w~;O=OPpM%8Q)=%m?$cd!k6xW6tTFS z%Y+C^=4FyZm$;P#oQJ3tgv)yzNa5S~=^nsv7SC^6$$M`CrL8|AQV&k0k_ezo^W}## zmZBwo`bbSX*`>Wy(h5$?qCTgL7KVEe^26g-vy(zU`qIBh{ma(50qzN+YN=!Ml_$JktEOgPo zG`~iPKTdVY22a_x@OklOHTlMxNDUlcc+(Nc5lKw5du{#wzRX zYF3c0>Y6>#w9LOvBvMCH(aPfXi2u-HRa*C3Qs-*%9Fn+DGmz)HjBYJ+_E2i#Pblz3 z%ldQ7jCd|-bl4=AAi!+ ze-XryV?11VT3m%*hcPxUJYeQ0*3V0I-BVtbuV6UD!U)sFrs27ZH@?f0;n ztwGK8hhZAUB7cU}N{wQPzie16@VAo_{>O%?v1e-Bpf&YPr5dz`A;Wam`+CuWcG9Do z*aXCkyouF6R-jGaH2p|!s>Pk$FvZgAI;+Q(gw-UQM?X=Jk(j3Gs7e+T$*^cT8C}VO zjE1LA_WU9z*RaaF45I2yy2|fc5SO{d>uT8j3*z6yu>g-1{dXBtg>R2JQ{A0ws(W%w zb+0oCrn)c3REwM(Q{CTcst3Z_IgF_uG;(9AhYVv(^;kGC)#FAkrg}V_W2z^dTuk*u zILA~^T1{%IC&R6#TH=zRYe_hzCOm|4KV{{IP}ZlMoQJBO3b!#B9;SLKTyDbsBwS^} zTS~aSguBegRK}Lygf}tmcVTDRH}=Q0H-+UL1TXvn_(uB9P2n;bEseC~P2n1eYNT{G zg&QR3bxSgL`@?L{EuoK_o;y6ZIfjR`GWxaW4i7gP9aL+0xTl7t=ME3|H*yVcr(tp* z9^P4UH!Uzcyobn53yf@Sfl7L>+@MocDy&mgLya_2aX2Z{x#`(y3)4v;V;E!C z@>aXHHFD|MZLM8(Y*vJmFG{6kbXPjN0;&ufyZS9;R};>P7izEDY^mk*AzwJZD~na5 zTvt6G(pATl=J`;y7{u!~Uk3N0koG{oHU(BQTokI7qHDrMp(fLrq!kv0`pSILc(P%( z*U9Bj26Ra0N14eU2t`D!#!l_Zy6cj%cifiN)6bE4x2VoT3u-B#Ke@gYp|CH*R|0Pw||JQZ$ zx<4U}KG!t*xE^LPeU;H5fBu3@38x?03+9H}NiTSmMfX0aM!M15P-p249i~OSwor{O zQgcIn#H5cQxJ`uGJLZPA6XA;|M!m&Q58CJo(>1<2iD&7c9yFB|?Rzq>96>##t6163 zr|{??)I)}xmEC+Q-?@Z(OsDm%Z0pl_#s_MePAghj59vaLr3AMScQMpMx{{T>d^(rQ zP>&N$8o_1Hj}z$u7PkU^naHGzSy`-wuVSdolwZ=Gh3q7#hjck`(&ajx#gl5t zde&uq?<+3Ddr0@2X9{)tIegU!>LK0G$};Ct0I0_l3T0&nz>ifKg|f26@DD*=&-FFF zw_|!!&6)Gi0_AF+3V*c9S~dR+|BcF8HGgzIPp?8=&oz|!+RZdSc>zrciD|nLu!Ww9P zY%|So5%W5ftGUBGG()+XkA1y zYt{NL{96#mMAyiQc#)a#*4LW}?>6&~3GdKyH{o3rs*(w>>wIz*k_qpkP@_zE&%xg( zGM(@)3iXyzf8SMnTMjZ4-bJB7B3ycP)Vmkzag^s@98%Z1&t1dG79?}vC1wt6ToCm_ zkj#Nr^vJag8%XCsD_eFQ-N%y# z_rBm5P+Rpfi$<%rukE{1Y*xgGvSmC<*s#>^d2F9zl2@-_S?kk_*p2Vu8trum6G8NE=h=0D+o zRavX%!|vh$7s}PV{oNP~@_Iei$&`PxDZZD)Y`Nu6-@_B}P;M?`;CE43Yc7l77paWC zZ|ijVy}b4Td0UL5{JB~Wxi9J+4CQK_0e`N_TD86a|GdgtwYFQtq7TV_x*xyY?~!rU zV#d|N&Zat#1mo&Po@Ox{i54@ijv(#9kdCVsGp^o+e@rGe3WWHItEab?3gt_Vw?@3$Bnq~prUUV>kuGR$aY6CdLh3rNS6l`V%~CNddUR`wJ8 zS1L2*mOLgs&g<2Xjw^8ABl`$`In;9&?K-H!_Ly@_p}u^AZw5fxwpMn~lYHO<(s5;F zcf#MQGTPS43YRb+LF_52eecT6G#^0Beo(IFi{Z~x8P#=KoJT$g1=nkJ;$N> zhs`v1c$yO(C|C2Y@FP^#s`(oDD^=E7<_+*aL0ALLBj|40(`~+^mZAm9)qD#4i7IQ= zyd3^nm9=W_@C=;~^0rut=3K4Qk)8h40Nt@+-lJI#%bT=!y;Xlk7kPZ_oyJrPEdPs+fmBn7*4HslOOsq_Y zi4E&8AuKsB1^Wo3!^Fx4y~rc-kS;$~_8$BjD#KbV{9Tk`k_ zewD~%>kUq}-iN%*>%CCVI=pZn*3Nc}6HK9oz7qAefwT#&Y&HBUmC=M&*6CHcCZwI& z%39!0gS?&#>wNF2%`~qjW|gL3Wwt5$zsAcykPbjAdkFqsl~G+Q+hrx+LxsGa9-1rZ z0ov_s>}q0GLAhn__&O(~P_E|5@JFevRr5>m|AAP{&^&cB%^lxB3zVz*SoldQYqiGX z@Q4lYt_06ex=GrC%T6ENtZCk6J0~i!ZdL_(XI7(qPrOYay;RJa?KfpxkPhe zxrQXHO61zng=O9j!bXo`qyr+C4(N3sA|t%U6g{(}8R2n`p5@P9a0^HOW^Jr7M=evS z@FYk_c#S!7c_03Dk?9DpF-I>4zeU%E%m}Xu=@HD7x4ABYWQ5n63Ql{63kFC=xD~C0 zeM&@9VJo|8b=128YLbg=E7K87SSs~BaqmDnf~{=ByL{6h(vfLp!{6f-7O2NzCO=7g zH~h^a6T^TL!*qC`-4^6^-zWwuGX`2S$QWooH?ZW-U+^wZ3>yQLnNx@nA8>;LQUjHl zQ;3(~mxxRaRAx>gPX3TL{~%+aGII(s?jydt3(4l8+-%BYAM@HNBsObnY_=EdFcDD) zEBY07y`r$0mF>8O_x>TZnU$%{2ur=sA?{R2ZDwWb;J*}^bRH{f{DcVxQkz-XH2BFP z6PqEE&Gd5kry#HU(=r|s#%3+e#%41Dn?>t*|4C1762@l!UTUp`u~x57`K~2otd%g< z`Ut_RBGfaRgt6B1pYbw1B-Tort=8nvu_`3iDl*o319q8+u$C1a{{^olL)ycvY$^Pc zkXp;i)LMkaTHcqeCz3{nn3WxYY&@java*}tuT`1JPtyJf|BcARTHs`hH1xkr?~vF1 zW9eZbW39SjoA@%ZgG?x|qGBmztQ89NlKf6v%Q*^UtQ87vE5h+# z;hF&w(}ay_%GdEV1xQR|MUTKP5|Io(EAzj`O%5_Ojg_fs2#e$&ejdqq5gRPyI9xGgZvo4z$o zZ@CtJ(^u2@d-m1=_olB#@ek>(o##zo&EX#^hFIn6fpEKTxnzLE5N{dLzOeg1UiUqu z5Gza}nr$KWFlC?+-MJxXdh?1+3bA6-Laf-d5G!&E@q)>*h1^cFg?Q13o`zkbg*ZwI zvBVT&O`Yi^t%bNhD8v$9cVhltYKbMj?!lZTmiW5+a+X-)>%Pla;wh8km*n=TEyUAC z)bJe-GeKVWyQQbzY%O66aYbN>-#YRoq3sQ%Qtr<9d-b{8u#L*n9+JG*Hqv^#$yAJ$!7BLp=XBKP9PlA?M*x54quWyRUa^Cc_`2GFF2-jO+^d%T>ns zywk{@fPYM7Eai6@*(dNHtBj@mZX=6+&s*+Lk3+aIc8`(ugzu`d{_??S&G$(7!&Npw zzPqflo8cFVO#9mXM))Cu_eH2Z?g1kVt;dE!-A|RqoN2qYeb}efjyp6sJI?fLbL}|O z@6l?*N z^Wo>I3_H#>vZe4(sth|`VPt>6Z%`R_oM&YHe&DrIsK+7L@k%4xAATQ|VaNGKHWz-5 z$kdKk8{y*!7K>2rc#RQ$jNn7a>;9_ruIa{(y{sLN3Hsw9jn0nK{dT!_obETZ+Htzy zr?o#$_qWRJkJJ6Zt#&-!*s^Bd+di~)W-Sxe@U=nTj_hB3g`9qV;J^R*ACuRaPe(AWFh z@{X@epIez3;-6n=5lE)bt$e-LJ#Pd4&7dA~GjJrKE}fAU-fR9j<&9R>Lrf_EWuA)BpDX|Dc@Z}C86 zLq1#kdWZdY1V2Ny>m~WtCiDIO=BtoUZF?ikiq4n+q0d1**EIUx>dsu?$kH_4Pl>%s zcr-l&ZIS8Bm4t3$Y|Pe3`$HU=tvtqgcL~_10>ABVh+fR${<4k5fo7rR8SBQQ5;%91w}zo zKXGWaX%$CQob7hP8D~_qX-8UZ+u8qp*WPtfbo<@=-~V~;^WEpUgl8T0yZ72_PiyaU zYM-d~`$*K-11BO_1Zf4%(F!~w;HY|#R^VK%!1nqk>TjObm{A#y>ItI$=4t&s zGU%uwpiWDmmw8%$+h#f{0uo)#(<+pc<*45f*SQYbqS~8*uGZSJ6^Yk?w4#{Erx5W3 z2rnp*rF$w%t=5gtkn(pwi-`<7jtYTP=k3TsHx;5z9knJjAf-D5CrE)M|K)o^gyJhjZF4s|i0QKhJ z@0PXek~~M93F^&tYPT$1t6&wj0Mwgn&u&?{&h;EM9n_mE&u&?_dPN*n1?nS<+3q%6 zV#=eADhBnDwQP4a;}!tV1wk6by(Bez7x*Q{$x8N;EM#l*9d$OSk1S*_Nlmh0clb5q zWF31+ma#KpjyfLHd29l&NINRko6FcwvWhJ&bkymfE-R7NTUIfha2+DIfUt;NIY;+) z69E7ArbPTAYuGp7`idfU`yzBgw<44Yf{3kiwTR&&0H2s(xI}UBy%>K2tp(fJpe_np zt+m&ryn)zPL`eNKGwM{|K@dPS(Q3#g>;jW2>bu1NQQzAQp!%L^^64cEYG1#@q*8q^ zGpSVTcT7Ch_o4LC{#|`5HyooI$HE$xAFDxX34TWM{)Mk(<22q$`8>}+rDW%*Xx?3N|z=5<^+Za< zDo*yDR)l;h(zO}F1Z&F1)e=?ypXO}LHDh26fbh0e1u{uZPfwaa> zmM6lif!Bky#!iuHOzMiq0+80&DWb9Y-Jl+b(;7QPihZ!VqizIgjh!MIo85p4*F$6b zPSTw-!05_>u0~^5>m{`ZmQ+xe1F&h(8mkkwA@X_<)NR*fEdqy}%3pVAzpTn@L}R}P z*S8c==WDD^=-ty%4IqeEeY6%a-H5^{@MqOs>q(bYIeV`=9Z2H04JO=B4eimpfr^YTvYZrjD#x{0hTw`xX zbpUCN?JpXOCqb&`VWKIyeH@hmlDqt2qOpqr=Y#4$GexrBo--}c&r$5R0@JI~Z?y(U zzadt*QgQ{{~&p5>?>zZIf;qS8IP zC+P0^5RK*^CUlQf_e7<8zC)8f1nKUHO84yT>!`nibob=@-Gk?m0_mQQ`Z?-(5Id|u zdgrr7N4*V_nOY$8`M&;++6L-87BeB-VDz(-%#w|V;hq4}6GX>70{jpNuSbz#Kq^BQ znG^ev@S&eU$GJ&IWr0-ZUC3}sDnmD!0iBW15u{7daT9>YF+=?ire8RQ>yVLS(ef-D zKSKAKjA0i8^cWhzF?`14Yk3xKGN~NHy(X2V7u*-!JXob-(^a!^r`zG@Ou7 zImGCk3~)bwB)e<4uA{>0tw%N&HlmIFkhBs_JPp)19N;Gez9BdgVEO<@O#wB|0@#AU zCQ$#A0Q#T7%NkzR@v@nhn|ZmLmtDL($IBjG_VIFnm!ElY@FnPBtWng+7%4K4;qlvdoBXgKwX$Q$y)6NdJB|f?Ya$iRC`d8wcL!r zMgrFM8wCDNz*;XE;;4n7By0aM0v~{+6-loMBqAtxd8TPNBv5$ z2;d}u`5^xFWd<+vc{v@I!&rgvxRf66LRumoqf3jr^BVdg$Mc`rr*8DjHo*`fha*xD01R(tNqfycJg}O0$SX20C zZC=xe-fWMg%fPk<)Yuc?u%mEO1T_u@Xg|?Wtw4=q0X{?EZGx!)w@tzi3sB=cfCZB= zWkG`$1K8`;pjGm}Gw5RZKRoDa`McVc-hCx0bB;Nu9YXJI(|2H zvuOJ;k#(h%sws{t2Q^akSqLm7V0mRnJE{=W$V!}uz&rw0?->LhAYjEWnChrAK+>e) z({O75Nn`s@$Grk1-Oy$RHg`bMK~Ev@FsKWwGlY!@tiO3hk_~BS#t$`6k_{@IiE#oY z*|0Ydcm*_s4GgT`zG4U)$*oe|P+D@N8fvS$8Z@*#kVy1HL(8zh#AabagBrsCOA$C3 zq~b@It_fop2ZI+k5jXJdnR+`-)xT|$d1pFCC+puI8S9_Hv5NH{nRMQpmYH-suMFLG zith1@^}El?ywfD;TN)n*$6*()!Wti3zaJh!Dqvi=eix;EVRG?4_183M=kll${AH}) zb5`bOCP8kj`gF%(&l!eN3@ciYvHrkWnf$SnR+jwyF$E3%EL~tfok`!RwZMj748x;% zKJxFYVr^YtVw%jG{OPIk&>5+1&l63$zNymWZr5U6{dS(T0#k*LU5)if`U!*Z21jK8 zz%|D}{XmU8HfF`KxK)4}rvPNn#j`uXu>ghh9Q7k28czY3b)2Jyf(D`gWU8Dm|2u;= z%Kzd1H{k#N+j)7Am#27ng_pg&e8J0)ykz2z-#^MrIWB`)@48b{(`F^L35J3f3`M;u zdE@bpS_f)maT)XR6h*)~TzG<`W`Lx2$DD}Tfu!EgoaCsRLDHfDCp)SwNZOje$WcF? z0>EDQ^J1(XAnBhCr=b@>U08!5Yzq}W$@YAEx})}il5E$HOC0q%D9QFceukqS1SQ$d zhBL8s2}-iPHz05=0o(mP0&fzq{r#3%@bj&a$54%5;iwUy#$Et_Mc^KSjsQ2VbkxuzW_UepyZ7JXJ6>3C7|S;039yE zzBg#VBLG`*(A&#N+{~Wi&Qyb5QaffTIzZ0IJ`#LU$Br(=Et{sbbY( z6_C|IHN2OW%=HJWLMCT=<-vSv08Qc!pzM+8=HzDp4_xf1J3+~R0hC>Wn+qrzz)Cm- zfx|%c$yF_7Cy=j2CQ48Z$E78s?5xui&x=hfnOxY=GegaF@OY7u+D}=A)cq!v=G&`G z8TG3Ey0diATpX{~nKIU|T!DoyXQfWzLbv0fl$c4OCHae~6j^GE&enNuL(1QD3f44L z*~!GyvK$llW~j(BX5!i^-X4nCDZ}kO5Q@1QNgL27mw_6eOa~7DJc!u)L0Uw&({yP# z5mSq(Se6p87fkP^M3k;`R0*h&B9aL72dO63;txiI<%jV6Cx2Gw4ENcTxH-r$n-W-~ ztq5F0KygnY@B~PUd(sz|3gM?}N?diTL8gJ9A;aG(f#M?T9oUcI2dTlMFq5-R z*A2AQRyMFpMtJ2Ah`1X`Gr=^OxgG`h3j&W4+yZderC3ZrjavXRF2mC%!Fqtn0OLT7 zYXF`^;30yg0H@L;U>boMX8;szbd&??!Ws;D0WmU@`CZsHL~jHo@mY_$ z;|g>ND9N|dPi%73eV`;>EUH;oVFwJ9%t5p4t8tScC`vvz>+PFIt7#*4)7uZPZQwTO*LMF*FK=+On{vT+(WPcAabpvazM$Y0P_%N1`SvP z5bt2Adj~@gu!N}R5c>qE;pKy;Sk76>iB~!Cc8ioh&72h`4!;(zMBarEMCTMqG!z^C z_=N^)IK!Cwo11dhBDMa?73p(z9p;v*&ov{Pgx6 zM^jIpw$QhanNYY3|D z_eRG0wQR_M_Q(_Nh+PgWo5?N!uOjnv6tM41-3TKfgom-qGybDjbMWw$ibl&HSgJE| z(P{tkK6`=cwVS!))-tT7?oa)HxGyCWb!D=8S3jFq@U;XoD-j z#J}VV|5GPnp9xjP@ij-H67~%h2-g%O5$5qVvl!Qm^o)}HOBlWp={UaT4uk_vR(TcQ zNWTCObapZs`%XN!W;Mghkqzh8Tu;`Fj9-eGBV!0YxptPd!zHuc=?iZ6&i44#-@{FU zO}X#Gydblu0G?u#4~A@V1)VRDEC;n^^{SpEG1GB%I^y?bbJkd=i;dg^hoRQvvmZxT zxsTTZ93i3{cT)o3NCCO-&m#bi5)gKI7DLuV0R=7(7|5C=pxAZJ1UR~YlH=}asCU-% zyjK8f+)+`08F_C4)VcR!Q#Wf??%z;mFPE+>vu5Y8FOu$&9RZFhc^_;|F3*n5I#xuF zbw6GOFjv44?!egq$LAgZgE^=Tr`Yrb!r{2M=IDdkaEi@kK)Q_=n>JpFdk0RjNuoGM z*Z0z#@4%It%Y)joF3-)viV)7ok$ysV!@`l|!X+3isfZK-LJ2a#hjQalpf^KprF%r_Pyq z0Gy{HLXIiZXO)$Vhg#r-8YY#Pqgfbk#fj-Qh8Vt`Sr~{WdFh0UYQ>{l-1DU>&oCYO zpf9R)GUhG3H&{GYUoK_*q%y;bvDvNf&X?5INn~ivo2ds+7YEP>v3^ zna`|wri9A~LI&JN;As$_KoGOSbjIZdlIG-qZf3N2z$JI1|gyseN@{EfvsPqb5{OAFTGbl8Te;y-ja#MkX`m`EB09OIy~2d z64G>#NuI9DqLCAQx0y2vB+x_BlYcJd*Tw1U7-%*8$Wv z;&KTd43~pyn*e6tf@daB?F4`>w<17l23U*05`y^vQ~!wHQlQ!;0G)5c>s3(g8h}R; zxEIvn7J%a}(S6nNPJm=5OHD&p)$*p&`*ufl1$BBDU?oy&c_X?JG1r11^9$1WjR@hjHLWg>lZCti+#x^1C? zZIGG$>)m*i19dx9;v&?p*gcL4g1Vi7CBWL47etv)0zbsKi*a|dHs&*~{k`Z&Q1^uw z=^C^4{9BC&4S3>I){Vtnpe_N=c_7uj=|atj*U<8JTZ-}C;tvqe!WYEyJScCkRJ^A3}j z3s4;*FitJ+Jyd;zX_X9-J`J<&eeCfCGE8I7*KIi+E#x1LUc@g*8Kwp09HuK#$VH&U z9Cq!3T6RT8{3wZo5_d{mPsZ&6z8l1$TPQH9gw)zlNF-#Nv3{f*|-g%X3$7%nNb((RL|vUiA-2#5>(sXHIPv# zElfQa?M9<@3n@!lSXj&!7CnUDMxex=%b6+8W#Vk$(-@ZrUaPQE5;?tx@yY?j7M4ie z9|Ss?F=%0lwD7G*u}1>ZEo>!Rc~9Ui`{P(On$f~;(z?mgy3dgCF{tyc=juV=5c1S( zzb$T{^F(0&^?Z753sV}yh31Ptu=GkjC!)@(fX|6n9EEwNpA#QLm-EoWxS6thv@~`2 zp8tq8z> zumSK9Zr9pLNAV$#DaM=2yJdJdKIAdwkjIpExKSPQm~zNt${~*_hdicuBgMgsK2H9S z#}wI0ulk?#m{OKZh9mBkc-fOpPc7jh*&R~Zz42Zr+(tk~_GG--3u`ALPWF=*08~p# zZuYHs0t{EnCV4o!8wIq_;r2#B_Q(zZ9fYko`z*Xa3U?GxmR&^AT?E9lzr|+);W`0T z*|!%0bQe&QJLkk>0K!Q~>zKW%CsOnaw7Ts2&Hz30Pee+6_7tY{kvzS!=};!zH=oVv z=PiVdOt^pUEd*hYXAFc7(@AyS@<~8R$<;5Z3Mq=Nz>I)b7=j5tl4v#j~Hs zm&+jSwq~HnUkW?{RNa2P-o5)Cj5YF(ncH0K#oE+sV}!dFaS!kf^uO5y{A#-115_Jz zb`L)<_;(N9DcZ)l316^b`>bsh@@nrV0VjA^H6w$4_@AA1XN;vCM@Hl0WR`@*NlHMw zIzb9uo!I!|S_KkC9Cdp-9^C`&T3t+B@W6tNiOJHuVnq z6M&%e3|aXOIprdm`~9g+zB`y`+#cFpeL{Ds-m-6FfjEpj3RE;rpRvirMkkzb>-ED z8n?(f#x3$hO3N{Bk!J&hbJE=+yT&atH#y@fwaHfpY0g{t0ZzBbD}2$$Ewa4*PPs*P zjay`PRM<^-i>%A}celtFQgq5K@@)XQC!!p9i-z{WE%H`?7PrXvAwAD`i%i>C7he{s zyvu@rl}zbwkzL~!nH7n<#w{{IjceQ@<7FIPsT;S*OzGvmi=yEc8Qbo7rEc6Je-F^) z8n?**%)>|eu5pXp6}#_~T;mq`C!{pH#x1gij-BTkx5!xl3ti(Dxj*tOadD21f?MP^ z_;01#mreL%h|<=$^h+F3xx5#whd8KRIBIiNcR<~6R@))Pu!AC7W%xy#UBdAlObkoJsg+#<8tyItcJnIAgtagAH#O#pjc;})4t_x8Ib z6#ZWt zWQ9I}Jwo0qp-(TX4*n4WZWWCN0wNjgWMvAj9X-; zt+hhNEpi+S+Bz$Auv=u0ZjmW5$GAmiSt`f4MP`DNW85OM55lf-i%d}Lrn^OU)7>Jw z#x3$Q5LV+Fx5zF!zs@yokqLUa#w{{I(lu_8Sp&L7<}}V^4T26!vyEG1PO6k!dnWn-Q6E zi#$nqr;|4c84FUps%SJI-6EeM94pDe%3spL@inW}V8u2I$Mxi3Mea#)M98m-w$y;F zrxn7vov1yI%hW~TR5nvBvYBe7+#=%)B=F*B7|k0(%l@MYkG6+gxJ52SV$i9;RhrOn z5U(my=tsIm9w=;0DK@S)TBIm=QOYgyal&>|ijDJCvx!{IdwT^$Cao~O_e9B8;~M46 zis;m4ylKnL9r*ZYvRP! zx5z;(B^ZBPrKMbCTk;tBDYwY%!J?E~WU5wC$}RHYB4r$D zx^a=!<;YY@N(EDHkwtXMEwX@=TV$$XQOYf{REOVAeUtggT-Ay1_vw0|gbgxJ6zH z&JuBp+)CUcmuR=hMJcz)6OmpTxAOYB$6?`j9dsYuB6FrHcU%p?00EBsC^Q6ak(m;9 z-@v5E8zi9EHExla5_gNxA#jV#iCp6vx5%#}rOqv_M#?acpqJY%0nj8M=^D4loYhUP zaf?j0v9588Owp6vk!_J@q!ilh?f^5~A~R*4Yuq9eEOd=qWP&BGaf?i8E8Pkhwd9SH zTg_V6xJ72lI@h>GW}YkE0qwzdq=???8n?(yx!E;tkqNfDadyZgY3Y4#5;FvDk(si~ zHExj!o^g#^WP;u9LvgT86}CODaf{59y{>VKOt9ZIZjlKNxW+9q!S^BK7MTF|cv}9z zEi&8SSfPhFcE^hFuoWs{E9MGG4XO0(#TjcwJUE>y+y@)#;i#}U-sawNdSS=vz8n?(Jkfp^fGW{=m zbc_6VN-}PdOGVP(sjlZ2k7R!;yEA?V=3NkY5^O<-#p34~+8lH^5J88{#+_2GXQH>@ z-WX-$-h!~5#Frx3`Lb{Zot}8slcnNt1a#A6kxseMjW7p4;f7n}u3$;IMLr4PpmQp7 zC(%%PNlxn+5s`9>e3h_n#Z`Z83%AH8W9rD4sBnuM#5XGXYul7tWck`QVAEgQrraXS*S0CQ$nv!<+#+`aTZ>!dGw)N;1`3DHgF>aArUH!G~e{Axx%-Ad>v*q&8#jkBS zv_Xd-mf;GHC@UY~kRhTP;TV4=v+y!Lr-{$Vw-6{wxka9eBz((_Yir*v@<{B~lpo|4 zx%?ov$mIvQMQ)Sk7P(EDTjcVC+#;7BEUYTV9H zxA3$YvUPO(a`$e!u+_OIvd|d<>fPHYU`CW|z1*qH(=4^_=Vr6enZlNI_YDJ>mCJ?> z)(`e)AgC3ljk2Gm$YTQRp?FpXKjpGYGH(J$$rkKEsgnC~wMu577PimODf2Bd)FM)q z9E+<}atawrzQ#^jpyW4PGfJwFG3aOMnVE%^uVk2H$(Ae&!C;qMf@`2;7p@sfJXJ^Z zSK8HJm&Z;Stw<*nr7Hi0R$A{`NrcyJ!f4}fML_<;=a3cH?2=8ycU#F6dC^hdzmVEQ ze79~4X2CqfHG|rUC+c_mQzhO8ej21V5#Jq_guGq5@rfizZ|S|4OTHuUT-yX{_YCT4 zy)SY5f%h=3ge}@Dao4S=Fb3?*}DteA-7caL2#u zsHvdp0_OZ!#*gMzHAf0AAZRd)1XR+i@ikRlT<|r3b`!8%6ziUp`vYPQI zY<=q9kDEvP4D2&b0mmdzhcLkVhRfbct|7tptr58bsmnnfE3ejlT#Lv~){%kbPvAd% z&)JC{|I|u!ROcg%fNHep6BGe9*wKIi-+p$o#=Tr;g({Yk6cQ<8oa23G5ko zNWdR+Ewfs31=jCG=E+u9&SNTVm)F_&kuv_Nol)~aGsgcPXm#5~i{aW(`gc28a6PDM zKQoPva^}x?-BE{ws&W}OM#g3$eyMZ;RY|Xp&7+u~_BiTqpepI@aT52@n>gGFRP_nB zgU8DVJo^^D<_6V`h}1gSv5ulZMAi1$szl zBmWh7e?(hl$h*9QZ_Pm+Pcz)9Az$?GLoRBQs+S$7+N_U=j3bbLJY@t;EB;#<98cD> z`yFi7K+9r1>p64-TXSlt?$7*$RCyGp;P$b zY^wH{n6GN#s7cV zG>`w<1sgLZvIF<;+br0Dw@OCyb@#dN;e;npTfR53TFEZm@$cinUQpYa$|{vUFW-y9Erhf9Wf3mbK2Yv>8HHMH&;y)|^L{!hL98McPZ$CLV~nhf)GC3ek~`MUDI`K)pw zIm~C3$4U5iKC8r0k>E-coeG8w^I7HfWY(WmX53JLa7_WXw|VRiwTzK#~tWV~0tpGj?S6Jaxtn0nga^3IAt{0B1j=p1~^soUxNc zK7G)Of5r}9=BLis`5IyWj2(*d&)6aG&)6aG&)6aG&)6aG&)As`Y5o~IHn#HpGj<#R z|BRgvk;gw{hYiw712#xldYR5hXtMMQjFua&OyfWa}p2}RvFLYwJMJ4IbOsp#I@z9p2vJS7aKWz zd5EKWv>Z8F=+c}HkmDcK(~m;^qk70!Y>w*r1j15B^|00cQ9U9|WtgLSSf)qKVF!k( zxO{oYFJOYsJ3v8)f+FmLXgy*PQGjsJ8I7>Vv1b+XnNeOLK7>F9-^*ux>g_t2T}%R_AS2h75NWQq1gNEMoMe#l$I^MKsec8GwUT7^aP74JC>aoz2_ zGRBiZl^oR;D@{L(N?m8xf!~nIKWj5TQftL!tY2$(RrLoryaQBvJvZF@)iQ3{hd2xm zRQiy_^`z9l!r1XPP}y~8kJZ?U-Gg)VTjKzV{xbB{ALEc2P-`4O(O-I^`4f8mKny=P z_c)@v_v7$lP-~nVbXXzlH~#PV5FS)6C#WQIIP;r6#Q~+DaydaI8DZQ>!1FZJMyxVnp5j+Qx{2K+>ny087S4`dc5iiVv_+BJEkRj#lK8Ek6N5-;-Oe=9n*z7z+chM0A{`@EwgPJ%lQ9F zi+>?4erH$RRDcg__t-RC<@W!_8+m;LqAjeo^Um zqSB|MV;6v^W!0i(-vWIOs@P-leu0w5>r$+)m3ZUVq$&=Wv`3M4s;L2vL&S;2r{Oxz z>Y*weGbqe{v9KJ0*MyMU)+BIpZu9f1wjE47XE@%gVl}bKtkf;KLaNUOv_ehGYB?XK zeBr3EpsJfpZ78vNdm2E;1irDTfOC5AHrJsU>xh0m^wMnodZ^CyBjCHRr02nA>lKY1?0D}wJ@MiZF7hq_?4*>Jr zp{Q+Ulhk^ldwey(Z~=?m``ZDG$axP8_+YRKU{sWfw9?&+`&Z^@4-1Jp+s%ZS%rVYy z_;0m41DcyT&hzl!TKA^G0F(3B&FkDZO8|~8YK4?5-Hq&!sU>`T*y_H`T2GVe-0Ysw z7GS#j9rA2<^I7W|*}NCr=MKPdW;RRRcDbmU%ADo!x#0lE$`&#TxWOfMU z>?r1H@Fi*$bm-Y7cNVg+UU^g(#_}N`=XF#o=)@48a~Y%roj8KR+c(9Vk5~>cz9EGi zvC47u$&Q)Bz$3>yI{Fx%%t?&6uL6VKs(>4(na44r0eb3`7QBoIvD7DE|rhg<#T@TvS4TMDVKIT-sPqxwA=AENJX^Wj<=zlwbFJw-llLi z9*ni!j(3%?X}cZo>PQVzwB3%kIWiSM+wFK;Vw2Hh+HS|YHnagL+HS|Yp>PILwB3&P zU&V6(wB3$(W6^v7ZMWmy61pCFwB3$(Yh*QQt?hQaKZ-PMx8vOw9RoIPx8vO&T??S? zcD(HcCqtUH+ws!vcDx>b3-H!LTG+W#4 zcuz$RAVu5lcuz-v0nm0k-e04qqfl+P<2@T)4xsIJyyv2;0ltsYZpV8;MhjkxXt(3N z=*_}FI#!f+JKpYSHa-;%TT$BWcrQhZfQqds?RLDE^%z-E+UT2b2V zcpnv@ zjAfZ?C1-`$?Sv}=v;+~mop4+4LP=eZYe5pz>sAEl*Fwc4#3*E5ga~^;6$ZB|yc6M| z^BAs$oW(87s>li59sCw?#kAWA?Z{`D#kAWA-CMwTmCNOq(_I#Q+U;;P$S)2(;c{}z zL=Qa~Vzss1PUtD!XWDKj^mHH_Y$deY3DsGJ!vKQLC|nCz<*5irbyNxMc0#b*IZilE zN^x*5>I#!zmC$Y{1iPJe!nQHR#;Mf8W<>H8WT?C4?G)a}$eV7YZK3aNN21ax`i$Cr&YV1wOGwXo5qLW&xC5SytM?RG-F zt?PrNgBHVbi7wvXJ!;NU#?Sw`cK)apL;Z}@lSVFs<&`47q+UNFRYB*96x$B6N!2CP3H8?v z4m$JDyjI$7Cp0e*dKa9fVz*N!b~~loZl{EHJE0Q-0eZJ;9fvn&_jwd0b~|1&%$cg~ zcDw-swB3$3P=L1E@dgRdc01l+0orcI8zMJVZMWkM_4+`Xw%hTB3D9;sUXuWAx8n`h zw+^w}@kU6Bw%hRz7tz{o#~Ud?+wFLx1ZcY*Z?phyx8scwpzU_Nu_A4y*zI`ZWbxH@ zJKlIn(RMrD5t2vS?RZBD&~`iCQ3ABxjyF+&w%hS0NlUfejyG9SwB3$3MS!;3@s1Xt z?RLDW0<_(ZH%)-H+wo=y&~`gsvjAS`6UlvZ-RDwsAl|Lb%n~`{;*aonO-ArRvC|U2|N2cd3g=oElADNN20zmKJM`q;?K(q7?eq^>ha_JrX z$T1~rz@~TbBk8B)N9Ia7dIvvpeC|fD8M~cGW6cLBHR${e*NC>;iCpCL28V9r#ioti zdXJ=^k{`J=XEV5RqqN(JT%LP7KsX~xyPe1e-L4GiL*#IG8d5yIe~OHh>guic$U&#% zM@9!&ru=$l%jKbqTkjlNXanYR(4nA0RzAidL&Sy5!m(!I<@|9jo9=w^RYJR+NH@E~ zE+hq=r*LgEwIhBkMQ*X3?N~bEwA+c?s$V*)INz;BQm-K6wA+c?rqi5?B`R{e4(C=Z zWjL3k8;;X%Cvt~QDTvcMRv%L*fEgcW*_qL!ksR+P@^ zLQ!8JY?a=Kt6lm&u7T2@aLrI9Cm~;SoE2D&93`i-T{EokYXCv#ZCndK!zG5nG7os7 zfj=WotCOeNjzTT^#iQ-*uv3W9JBMA+4FEhU{vZYR)+i(1kzLi_&ZbPKDlr8pX;8Q- za4g_JJ+g4t5+od~VQ#!ClY)k6LE(56s}UWpVL`lVE8*c97RRervYb&Gmc^@nMGd24 z>=1`I9Bv#btyog0qJP#PT(K13E)5FeFN{VpJ2Wb;n6+>r zUYFT;$Hz&$b2!rO*J<&1DI5HtMpf~-#{)g2QB9m@K}8?Y)vJr&O_`6{;REQ*UTE;o z_`jr-{r;F8xCD)EQ;ZI&i#~0K_p?2$-CwjQCAE82gN%wLT~+jX4V;Rl0558g8=uQA zeMzHm-02SViXG#GD~Jzf+G}#uxn)`-WakS%Ai6{1 z;W7x0`y=|w8W}njb0yb(y9r>l^hntKkp+(__z1#^Rc0x~45a0802Nb%Ro7#c3JGapAn=?|DRs&q4DmR2Hcmkva}fND2^!#OsiEtk6L!AObR zZ(ICj^$%pz4^RAY8j~Me)g#bZkw-LxgWpH`CslQyW<)<^TS*A1O+`zV7^76pM&v8F zDMU$!F`cEUTE01s;mz@QMtvty_IOCT-nLF+)W6-9YG<&nw`G)`%|u=>Bxhry)b>KV zqVqCJuVw;=M%C7lwK{YjUgpE7Pc^s`_>+e3xJwu9cspvgk6Z zcQGwLQ_>>%i7w(|ocuA)79Eo6)X;XSpfSX@bR{PP(giX809Dl|o)4U`g<+J>pwp%` zqnMv{71sO3NLvNUg)3X^-!77H1#+N?tX0rqD{A;jK!NtRb05XY%}hGJI>633MHlrZ z)1(yXDndwLCssegZXKlAej=N2FvOD3nbnOm!4cLRm1QZ8XV^7tx~jf~CB=hnnX@+; zIQLcUTkO)F!P1e85`ne%G$ZQ0jM8HmCG{x~R)yd?n+n-{yVnhKwr8f1YV_`(byf_77KLa=a9kX8GAk*<u@c=MPZbE>qIEXkJ(SuD7do1YY?b zp;WgDbgXrzp6OP*Hn1aP4bHS%Ne!gAXWDfvxj~w_%$8<0oKuH<%k6x2d;{HjS!dZ% zDp^B6Xo$7Kj#5J!uA2+6(k`NMHONA_O5d&;hG4_jI@^}@u;Ifbz-n7Q@@V*qRa$Mg z<}B)gZ!6BRWjSs5k@4r)5w5Kb4Qm9H3y^hojeeSGIGb$eYS8loEP&P(0jpQTUsRh5bV-EU%CaB{qR;tAA$UDsSh`5H4aaO6s9>hD& z`-pfOBnnVsAIa`7J>aM!P+#5xOLZ?C2|R&uycL$(?b-e_fR`{1)hyF&HvnGCD0~Ni z&wR-BKH%G+hFTWe#&%iRh9(RQK!Jd1tYsTJPS697TUOi-HAonr;Kc11!woN!sltv9 z0qFD^JF?P_vI&WQpt_*GXn$K>=8u5883kEw^~l}x4Sc_Y`a)z|yMQ%ojg9yisNXvL z{%hbvmDSrWr2M|8oP;*@vBT{8bHTC<)Txq%_SKQUAmRs5<1Xa=IgTnF&mkXZ7xTx< z@_(Yep#C@1!9UX9^l(|Kd9(WZt|mO~myz=85@#TyXtb zxLE|F+-cYoa@P*1TsDD~O=0%MkuA7SPBSX>rez&?M;FkHy=?wjo6Fi7b$QE@xfA&j zpH6|ay1ZqHx{OA|2u6y!yk&{HT!@JCK%y>hS)wja13wNDb$Q2ay1ob;BW}hV!{+(YP^(u&Jv(FN> z8T1<QT2Wtmr zeaB`D*+$D+Y4qfADg*wk&21897_ZR7_#$?`p9Se*yh0CSF3#(6KzbOj(8D+!5ko*S zj92JkTm!rcB*VB#cgQ2a4>69zxJeJ=KHv`-hhe-*v*l&F$^~&4uhvn+0f&I}FmAD2 zRyHBSxWy_U2&}(*g&x8!R-6$s^RKZ&T_lYDzQ&3%tcUPgD|#4!p7~q#5MGD^RsM&a_!nXy1&LNA5wy>x`T_6Ol0;`5PjBVq}|R5Lu`Pymu>T z6o{jXlT&%qTn)H_Q5fA~J>ZW5J_zc!s|mvZl`g%3Sp? zMC#R|lOFniBJu-JzXOyZj{{w-0zMApm80`oL&kAzLKmx?k^AGW+6wA4gQnY@obd)tQCGxmogo{2>EAi{;dPfAL7&GbMka>DKcCH8X^yq&&k8V zhrsVKPW0#A(f zQ0Uf+!n6$NM8-h1c1uj>_Rv$%Fwv}+Wp86M@CA$$#d<~JW^{1XM9?tNt5+rNN#F-T zL!kn%i?mNVx@s(FC^X=8xzDTauKKzgR`uP7S;|2N3=<{zsGK_R1QIuchRS2%zG6NV z{;|PTOF{j@NlOirG5n;I?+U)_i6I0vaR{>>GV@mL9)Lmlq*BIYO&?dy1j(3m>gTE) z5dIpIgDthjFZ`=E9EtJ$UDY0>3qK%*_fEPh3)F8VGU&p;mcq{&2u6?;e(l4l!jo_& zX??8=&mZEduLhgK9~|ncO(6XBi^GYtZuL)Xg4j;_s>xM<0qKH&mVzH0fu#Y|Zy}kb z)xS!?Ka4~lgQVcM9!VA4+=zmI)djB|gNfLDb4EBCX(PSA98!l|YPWH&i8 z?d}O4h|opcCAzm_wyS1?bP;z;5nmkRs+U0h!o8pZ;yv}AGQPt1L3dV?%pZg+ag0VFd?WPTiVnrM@bEDwk1&q;+ey=*%g=Qy3>J-Z2ula3Q)1q;+eK#Qh!keGqkPu1H&R zva2S8s9SSIx8^T$)hJNo%I=ohiyb08@TZDyJ-^shH-U8jpC)sE>uIh!10?+)zRBV|S;;vZYJlt$SBR800xQjj+1?VldBfG-RqpRwCjY;JuygGaz%kFG(uX2}3 zsAbjgXKl{LX4;VBx|2g*xow5?t3bNOofFLUHSp(*lNxvK$r=w_3-t!++I5lItpGj~ zG?X8ET3uy-?E&EXK*`rl(YsNnmfGrl!9iiXwzS$>V+{}9Gs~Z~nY)OC7c82K)FSSz zegskPf`;6R!LZs^vMLSd&^xggbiz3BqO7#LM?BlLht zxY^$c%q6%N;3fpFBX|NJ<8nOT0E~SJVBA}{j2&yK z#r62%_%@T*?|pd1nEeuZ6*c}RLN6f86QFT6_9oYX`+g|L=q!Ly8(cLUq{eaEaxap; zWl|x)1&BTe)VbHUdU|!mE`M^o0qjc*xrHGc`S918fv+!mpdQ%!vX?OxR%6iK;QEyh zufWgY@xk@$Brqws{z?f<4zAydfEu~nNacH$Bhn;HqTSi}EhaU%{u#-3gf9`N9-{oj z0bM?~_Ak}B1Ic6+tJhVHOqx`_5V+UKX1#C*VruHBkz))KUn#tEFjH#wtC3R;6W>St zmd*sF<1DRHBTqIge2Y=kpt}N17mj~ zMJNUbII59P8`k&HTzxm~>&VMuUYY{*4D+BoEu1fSp>w~J zZ{Efjrj+ui&ihR2-AGjvQs)rj_szp#g~9F|yjRtRX5Y=zhGuc|LdL_EA^%=!2q;@y znFr1eW66KLD2ZtMARj)q_Thv7=)=cO`S3XvjG42^Z7j}Dl(1Nw+uD&2Qurxzpu$3Z z5=Cc#Au!!RxLvE8$gC~S17|X-x@;niQ!tESI`ht`EnLMgjm|PU$OqQ}8k%Kn z)L|N$Wn57@8a!D}pbc&r8IK4GI;>BC_Ete{XcnNMSx_6A1)5Q2W=a0l$WVXtG zfMFV%WtQf@j4*nkyowK1{ANcRnq{RKnq_s*VlB0ySysBCSysBCSysBCSysBCSysBC zSysBCSysBCSysBC8Ga3Apf=jjEGym6EGym6EGym6EGym6EUQUstqskxh6~V!W?AWm zW?7@e3~8kpnq`gl)}o=>&@3z6&@3z6&@3z6&@3z6&@3z6&@3z6&@3z6&@5|4HWm(J zXqMG1b<>7sSt&!a01eHYG()qj-!nAh$cv#_5&@3j|AnC$dBxByiNL{zW&t^{pg8{$ zq==zeU^%qLEh)GI5dqqmxvdJGV)%}BIJiKYlm&RIW%l}lg?JLTowNfGa_XIX5hu1} zIXzshJMUw*=JXW60}w6&Lx@}f`hCg`mA!zlwk6B!;e<1goj#!QdTLvBu_epv6*&P@ zSKE^1^^Q=mwk6B!D{RFoKwGk0uZ$+=+LkPogf4W)@K zStyiyD}c5o3wgq(ZOK9@Te1M{$8y7Er&F}pl7(uWr+m@vwP^7H73v`E)V5@yj$!tY zwj~R7k`!%A7V0c{;wo?~dNMa!{4zz0Et$Q|`34}o1H+(g$?S*o{|4Zwz*YD!x1fx6 z^DVYyw`GCvQl!9^EW!uelr0$>Tr57IU`xh|__kyOzAf1oSiO8(GN$;pWH}fg-hkZlWK3J= z+mca7T5QQyp?NEP!+xw;h=LPu7#Y%EzGbbv+oYlM~~Q&**o&3g|sEJ?=4`w z%H{qU6(}zWL|Zbh2KmMI6D}vWOmzFn5UZ_i$?T`}B7>@<&i2y*d`_Zm$!yq?wMU+y zQ-^B-t9%#&QXOqeX2X_jq;O#OO>=NA>I#!z+mhL^C0itH+yW3mRI(N}Bl0#Z+cs>; zt`*)J$;;lkJH@MQ$!yq?Jt`belY>3*dJ6|_$!yq?eIy)zCkHF?ONt{#er-!;!E<1=<+mhL^ zB|Bf(E=jR*wb8|Yhe~Q&G8?vJ+lB3(6dUKOW)r!Z_jcTB?W7fcM|eNPwU9H*eBj!Q z@wQ=0_M@aKEE|PfolUK2OJ>8CtQb*2ryN)5G_Iby96nEJTQVEAWE^s_C9`2mHd6A8 zXC4j~7ul9PMm}xHY}k^q2gR1mhAkOYOKiz(*pgi;Qm&+wWnkvwYVy*S%xmtWaZvA`1Fi*B z{hbK3OuHB%k~wq4mJC9CTQc^dZ%Za!nzAJ$@NLP~Lj<1pFTjofY{?!25?iu5N;0-& zw9fKv$u0xH!!vzA!Imr+Y(a;`1|3egpu>R(I&3!XloJ0Kmaw4wc)+~{D{mlKfE#kY zESy2-Ebz#(aw!73X|jZ;+mZ$711jXimVhO&4ILA5y?aFVPUhy?@S2}nmJuW3IHUx4 zCLAov{w5i|z}2@Xdl)Gxi?Z?fsqb5qQKCK*4i;quzC{^CuW#q$QZeme36e+)JQ6|E0#t-g{uqb1hxhEnY zTb`FhfEHyO;FLuf1r@ULv9}S6=*7&!x5O;GoLT##*#k zlo4h47G+XHV^PL%%A$Py=X)P9IL@gF& z?34e-qKtZ+W>K~cGU37$*TP3}iOF=i64_&vr~=nFG&7z9pzr+Au2$$dM3tS4EGtSAgP8rbACy-gnN^sv?UySI0{R+sTB49$P%s!IebgF(*T0bGF%HU!X-8vV)f%` z8wcjOjt5$#)13HLaxStYEjRubaxSvs zg?06N_&V1LIe7M?Pfs1;FFd=5F6S|L`f zCVnNB*XWsAW?jW%noljas%aix4+JZzp_%^-^!Y;&{77+ zFVv`zb!m#vXFXR~Wke(6LDp=A)s|>%d>uJg>3m1TyRv4hEXg-1K8N{M>3mb;iuqRQ ze9frY1Sr1FcMQ-Fq8Me)L(L?u710SmlGcW3p;)`EwyFpgi?!QotA=1n++}HNw8Ulc zdsve-RuR)y#uHFKpmL&f;x}_l)>!R`*2e$D7Ob&45nU8tK37mZ(K?m;JpQ{5-7L!| zl=^REKGzCRS*rd45FZ}B&ix zXyS1evR%Wm1&Jxld#7gJ8%tR1ySp{q7fbXZyhp?RvBW@3+30;5ejZDl$~rxu;elA< zLyFp|;kU8G(Jc324Zn{iCa_k!H2gW1_?*>v%yN%LtyE!R5c58v;W>qgj$Bj!Vr9=q zs#BB@JJe?ltWLa1=I6C2r)T1{AmEESHMeKtY1a8Aotir=@hRae8it1@{=(6JO~Zm= zi9LjGXjnWf5nv_X)Ua$=LM&Y0)-XOSQB39!wRThuOY|Z0KAl=KEU}aA{ls#Yq0SwL zCE^_D{TiMyERo5)pK5s9u*4QN;d2c?AC}lpQD2(8O^Ma4^8qdSgr>xa%=@*53!4&O zFz>e-E^bP^&z}5F!zE3L4P^dai(1x{=tcOWhC7=Qy_wgxW4w9%+?2SGb`2gY!Pn=5_*3ccESV88fhS|dt9;;Dc%hbsoo>;)tB0HDQ zkKy5o1XIg(LB+!pmoT-$4u6b!RyG{VHxx_da+Xp{Wu~@K@=l-nA$T^PYQRK|5FFPJ zM(l0W44 z^U)^w7gQ(cyb0vn1ZRV>O$F4yD!SJWcg4pD(&Hc6`td;SOZzmC9{)s#rN{T{urzJS?FX*Il_H@0l-vwVw&XkW!+}TQZ-c@ zTF;WVD9!GrSWWWh$bE92x9|i=nsU=qu3-$1hJo_J#}B+S>+XZsSQc2ez{c`Rb4W?11faN|PNc)X(}b=p=xO+uz= zyg}4VWf@tzmQVX^$MN@r^j6J}WcW2hnz8@)7#e4S0rte~1Gf_Sq?ghpRI!udnQa*# zCj+Ofs(l!5BMLhdti>?@FZSL8OsXo|7eBkItNT=Sol{j^)pT{BLU#jAZi3JtLV@ID zlLQqdizq09ASy^BIA#foqu45DR19OpF<}_ToH1bla~vJV?5O|WZ|!qVS3BOh_ucQk z|NGwe-TqjIz1CiPt+n$$r`F!P52?DE$A{sUv(=Ym?T>3AzhQxViBEo5p6ii2*fg$h zVde28F>glQG3XK{GYe{%$qPxA5|{Rn~?r(7n zM~%s!YJL(5dUDspJYQRW==m5r-Ua9qndj@p6502U*oXq?DLbg=`3CdT#yKFI2I$;% zttc2h0wUiA;Wa?7haF8TVS8`AgSxl7gLX<5Hhis73B}$aN2G%vmcIvn) zWy@{oN-Gkof(A6aj&_L6IGXKU#+0grq>*jYZJZd{P~ApVNKALE#8sIS(^n&9jOhml zTWr{opx&q>{6C}Zf-YkF!MU{DNqW;}&?{8wS*WglOW?4fD)p+nfoHC$whr4=^m~=k zNPpR-eV|Y6+X(CXiLdHvB|k1wa+4EWe5|4H0{%I82K3`mrfRdQl!3w6cMh{Xk~#fJ zmHq<=Sojq{Rr}-{6%ZT|QsXNT+yBJ!sdbPo8c8w+iMT_ihaO9SAW=`BICwQ|CtoiI zS;fCZhJuep`zyVvZZ!~5MDWln2 z)dqhd65`~~fc%G{VqG0P@u~N6i+a0Xh}I9-U%JKRN%o3Gz~__3Lb<#>Gy4G0yGdf< zUfzqO*hO%V2kZ|g`pa{q%m;QTDR82{d@Lz@fxQVBx)|5fTp5<{kXwRA1z_l6_!3_w zq^%cYECCE%j0Xu)0k-Sv^BK}nKSsk5{S>J{w^T?G! z<6eL+ne|zU>3CJpr~ydHtnW^hCjebW5=&|A0e~g5ehMka z06PjGC9^>?_!!V_LPE)G6w-)mgGNVyl*}d}-L@@gYzD9x&XZy&z8;wduo%vhVmKAp zYQV6JR}7n_7~TZ&c>s#xS~le-wdY4&3{N{FwrXC}$ti{=Sqz?XL(o_O(8bV{VKMv& z{A<$KK$^NSKV!GU-5emr(6lc}TY+9k5{jW|Bq_lggT}9^AabF~{GfBaQ-O#-)jX%Olk0_2`QL;6ZvdU^g;M#8Zw(qp0wmW9rScyEdM`<= z{Do5a9dAPu0WjAKrSew;TSf|Uy-+IuJ79kY=v*(798SgWcKZXE!=ojKz3#wN4PXwB zmK>e|Y&Bq5lb6HAlEdJgLE~pcAcxO$P?)Le9go_Nyc`bd;^c5hh zy~gfBmj*}#NUNzCEQ{vJzC3(9H z_$tznx7m`n%0CB<7=U@3EqS{L*m}UQjF-2$lDCfcUkL__KtD#3F3%*v3ndaN;XT3lkFXU27WtWxXjPv%Q!uU?+Y4*fT6PG;{e(6 zF&+3c!06WM-L;UjT?&~|5Wp>7{9e~ z{l&P8A^bdmHm<)I=es{>{0N#hZeKBO0cf)T!+AKM8X#|V&j5dnwEH%Jwx3K0;h%xnflTe`N1fg#D?BvG75ZVhLvR43&M*&&z7`AHy8dm`M z0f7&RoC@UC$AiWbfW}QgPJIF+AE5CvAZ1SmjX0ojJCHLFSWDzCAa5h^B9VuHEPe{R z5dn?Q0(k|2rvVdR2h#W<9+RF%!vZvZ4dg)t?joYvV=4L!UKIe7Y#@`l#%#ho`d|+v zoC{<*qLu&}j|Flo0^5n43}ouF*kA-`JPXJp2;2*pav_lSB85`mXUh|UE&{RJbJ$c3 zXuJl<>j=C= z_Wm+(k5>584UX7#?onYguWKQ*J z2N~GI0}d$b%9ZS%nAWU}ohTNCp8yW*iOfV1^%N|74A89ukir+S0Tj@UK1?GK7y=l^ zG>yGLxeVAJ0gZ!z^m_>l9l+#KKn%Q)?gx>L?rY8D&Sl2vJq{DUfxOe2$(@aj(Vsg^{D2a` zCo4VNu^3h&%xQCUFsw7f4>TP$i`PhzDGU?F=w1#Fzv~RuJb{gDrbds|P87cc_1Ix) zS^UT}`b7u16v$dfHz#Xk^{nC2RKTQcor2%3ZgQBUID>w78sLPu8mw`LmEXW#Yt8CT zHZE&BhxHn;7VMK(NkRW_S^GGw{5aPwpH*iN60yOKIUPO0;pFGPDXlrlK;4+5NAGpm zI)m*r%~r(@dwzlL$*GNxI9*xxfmIlz&vpiYCo|}Vo?v72W`}+&=zrF9*Or@|D3dvy>-oZCE5ZmOU*I*PKGNJ_?>wV?_nxx{8J-DI zxaaJAhOb7tKt=pogw3YHK+slrgWG~Zt+1$+VJvf*vlN2G3`C#`i^@XN{~a*zI`*MB^p>UK zez6>E(OZ^^TU~z@id0z;5a#x!x^S^Mozl2vDePQ-Wpm3?*b1+wG@I97h3)XgK%zFU zzY6DHe+8Q!fS!!L{wfr$I)b8Q%Tl{eJjp+ z0bdaleU^ZWWd8M6_GU3eZ&|W8r)ZVlvSeQreG4s1Z&|Xp2%FxrWM9m)JF=AbQJ^eRbI&AbQJ^eVx4= zY4nyQ`}){aSgp4#**AzZy=BSXUQz=#y=BS1v1B?By=BS1B{2-r^p+(%|N1LC|N1NY z?vnG71-)g-zSmj{J$lQMy)$+pr0Fe7_QR5Gy=BRMG=_z=vt`NtYYCQj&Xy(niIOo; zs<$lJPnJvoqPHyBPnAps@_mfgU)j${Z5b-YElc*Zkv^nk?ES~<-pkloK%6{42 z$$C<;pHZv!E0W8RD)tc?iT$c*Z&Wc}e`UWW*fbTp0DaYdU9g!d#?jQ?Ep7b>72A$q zPV6@%Zn28-`YZcQX(KCCj9cmLJtZ8lnpCU-MEmZ1x)q|x&A7W^|MpS z^;eOa$P9^{hi6F+nz-JMGeulNBq8w#5PXBNV2#v9Hy|7^FTgXwUfjZrql~TF1CN2$ zW+0SVcf_f)4Yw>=cO^(SLgPVUcbAcyTb4K)m`UrAAUn5obn7oR&DL9%tVea3>Fcko zzxv-o;<5{Is;Y%8OO;3yFtd1;(Bygq#2llH*I!xKvb3LY?C)~0FKUCyZS=h4l zl5o6E4jS?|mqSVnzb@8+4O^Ce5;g@RMO6g?+ANB7%;J_M3tN^tAQIpHUEbjyFBLev z+_Ge0%hDv_J;>!<)QZ2hJa)@5UV)odbH z^K#3Ql~d8Dh4)1~6C9c2I(8;Tdkb5ZK9yLU;A$i|Iy+W#%aVmHOF;}7I9eJ{DKw6r zS`T}OQO4`9ENod~m6wfUL1W9(ev)Q?rpbYcgKSG0M?SYKS=h3~5-j8OR~EJ`v1yh4 zfYHLjmZh~Kmpx zf-OseaLbZ~ElX^MWxW2%!j>g5XB&Egg)K{haLbZ~ElVX(8Zh}wy(r`0DWh_WMx%_^ zUs>3)G*Ebly1X2~G%uTwQN}Gx7Pc(S6SkvVHf~na(j?RstUAL1a{#iJ)K_L$*s}B| zaF)yUR~2&oRk^|rvg>Mcw5@Q4j*ddreMLJ+-W$sQ?)-m+wm(o=_QS+Yks!lo-8b$(}4} z^p+)iiXeK+l6{~cddreMRS>;p$(|-T)mxVAgCs_8S+WlnL~mKL4-rIfS+b`KqPHyB zhYF&%EZH*z(OZ`6nS$soOZF^5zK_vk%$_X>=6G&dvgb-3OcmpnCHruRi>g?8Ct&jh zODe<1Elao#?SA}cHrhu9`=JBMmL>Zri$kQ|vScrm1bWMoy{Lpkqu#P)A1#R9vSc44 zg{ZH;vKN|-THUw>sUiE^0JTbAtOM6}+rWG@qG&h=OJa{rBJd}h*K5nN8Y zhGk&v365RdvSgp=*u^bN_DOM$w9fTc_DcUSq><~d?30t{A{;Q!$Fqb@|3(B_x?P+o zqS@)qjNKIcJ8-%F%3dR-sJATHr|2S;Elc)VLG+d-d!2m>k~r62*{Aw%17=3;(}G!a zRN1m*pPrZm@p{XWeMWK}bs0WxS+dXc{|tWk{mGLZE?}}E0w%MKnG!+*=546QfV?~e zio(+O~LDtuZ2$(`w@O7RCV?}DsUs|&Ky zc^71*^Df9rwYnfH)#`$*RI3ZJQmrn?O0~KmD>bt-G~oDvOR z=kDkw_4+GH*RBYUi)4l!9zRRMMzBA!5kDtrV;qacMA~^GEuoCicQBI?A}*@&l#Bmr z_Z;XtMFk1TljtW_hb1;ouQu zyIhcHaQ^{7t`Q^=>__BUL6X5i6mY8@fj-(vsAb37Y>t#W5!BbdTuLv?U z*p@Z=svskSvljt*E5agZ3_i*$hf|IE7`ylJW49;M}AEJC$4hQQ80{KypXpr77@t=yB zJ_(_0#>t`rGR6y(-MbXa#rq-2D8Cc+qsoWFLSOj+JpJXJQFsOA8&Ob!@-hAK=2|`g zYKqE_Lf9;?L8@T653!;0zk^;}UV&%0{9910@;i|$yL=9wk@5)WQKRhqnb4V1{`+Z) zV?wpE=g@=(6q!-J1LdpAD^cV=qij1;#oH_YV8pxZ*qOJ9?0<%3M)?z{c2(XHc7r{_ zTH8nY7bCvyX=pcf@!`t!wSf!!yd_KErmg(DfEejT^A-uVwG6pPeS(3SaX$fzruefi zF;-AA^)Oo>Fm|F$>IIfJupHuQjkeQK2;1Tzze%a74`^)IA9@?#C5+T^wiDYQ;`x1M z>MRP4>bPi1Azi%0A1Y2$#Yb!^r8+K?dW&%terY*%DVtK#{=j*V(k1mA^H-zeR;G$* zT4%rP3291=rIfz@GS1(pr>-N`pgA|Bg2V>sxC>MNV0QP@aa&UlvT+a8*i~p8EUmVC zP^w47Px6~Apwx?0w8~$6C(Jccv-bgZvc}BRe(YSQ`lGKSE}B}{2iR%;*e{Z?%~X4a zzfG46%kDn3iTJtxHU|T%OFhqwou@NhpGq^``Tpoy#5JUPqc-Dz^vAXX%cTm)xkVS` z$kbL!xmc%bOm*N0aD^^{X{qwwz^>NVOk`y@vr+_NCO*_}vUXF`IZ6!E$&FNic^{z@ zn5hn|zmXb?rm9(Eqjb3>Q(KtL(Hg6Q=xZRXY#CX`t6DqBu6h|7UD=nE->B-cLh68L zCJE9CU%bd?_P|TCZiuEYzaaw4Yly(|8X~X<46h*q%WH_ha)_%Koe9NyipZMTRT1l|<5s37(w1%- zYf6ov%|k%>Lp_HblmN!?c_XM$L&bn z#?EkzFPK1|-N{CurpkU!p{Hu0bt*fXZT2)@ zlFhDOWpAM2=jg&{P}z&wO3u~j0F}Lom9fDWJQU11m3^C9H)^y|WxKK`Z_?;YmEA_Y z=j*nySY=0(`64aqIF*gE^e**g&$5?YqR|sowwOj<>XX&UN|h}o zdYMK~R@pO%Zq<^TRJIF^yj-VUr?Q6;y;8@XuCl*S@^wC$8aJry8X9@4E{zLSwt~#J zX|!2oU!df>HM&)0d$H*5)irRH%7$45kNUz~v~5$_AluOkn)w#!W!e{g$weru9V)w! z=*v3ot13I0<@}09-%#0)sP{FUc8|(FN6D}IidG@*d#ZZUQY;K~WY||dX&$j+cIv3F zdhij%BE%BF77~jSOZu`)spNB=u*#P`9B*#%uY9RAnoP!*9mSIPhp(E4;MV!F_ptW9 z_Eql#wBDDU%GUOcuQ~^`!IwRZ7Jci>jscqUWo1e6oiBAD(2>4uqzz)f_hn`QZS-Zo zVP1dmRV@TM&6hokX@B%p@KgLuU$&eB;!nQnQ-B`f%YIM2|MX?f0lL_SA#zLt3k9x% z*nDN-=r=-B5hge|4nT^7i%S}ouTUdKh>e(K=B8pfoa5qf7c0jc)exWVH#r8TRW{@_#(Iw}@GyS}b&RQaD+_0)KU6I<)-uj*v;0y^!Vx75W-t^5%zYVr zQmDfjOrUcI%n1yR7YWlD?1ievGM~Ytg?9;q2O={8a}|TDU^K4IMzFRqUgh`Sj!?S= zM!c;*C_yx_lt09yhqb*7iM>VoCG#a0Kfp+E?Gop`oRCO*g3A{nNXrBDeNwq_(bT8G z3hGaw2F$NeX$h8VJfTIDAzZ>4i^b~_>kv+`goPmc@Q`*tmzAZhV{%&dBoN9XD6#nQ z{`MyV37AcI)|`f(Rkns5VTHf_CZS(Q`WL9uk_V8M>y;MU0sRB|e~5B{%k_arxM5Fc)f!g?%`H9rIrb0a1wRF9KyL^M-*V9 zBbKRrf%d(H{*vgL`Uld4ZpFi&b(#;}8yBn6NU#nBd-1Z_MrpK?t4AX^7ZXBh%%YlY zhOZCCo6-_L)0w%_vfwn2KUu|2WCW+q0!O)MZ!mm0@>lqKgROF8L1|U+DTIQHU}0${ z#IO-;s0LCiNH91QxhmBc%_f46tp?IbL?wgYqJ@-ptC3|`>>>2#()tLky%1Loql1<9 zjM5gfK=*?;5SD&{Pj~gqL2v(DklKeA8HVaw^fVRwo1O~cf9&WQ1aXP|tx{MLmq(7| zfXO1N8^MtyR}f<@^(2S%hq`J=igzzau$4`6$#K@RRG3ls7Snap>5g<6^lr2^XN0NY zR8prSAP=MN2&Skmuo!o_n?kpaPLDC}Nx#i&Fk5<*?gw>uGxE>=EMHxAkwM;!I(<#@ zvwr&{H;vJ8J4lKCqWu?AnOmc7GZ|NDQ!8o^W)}4z(fM99E!9pb8fB#L9R`1u@&vtk z8MyV0mhDuR>!OBnDSYL&0Q5DQ9aWSZyFqvb&@JW&pphtF)>8N7Xbftd$j_8(`MdCY z75`N8`|UB!aa+r}N`4%xdpKJhIcL0Bk zc?S3sfS&xqq)rvXg0JGH13<51j>0XI($dBP%>jB}-2o?5dMgS(wMupd06Lo0kn!*GXbE)>3)&*Wczx@k0Qa-!MF zzRZtS^+rQYrPj=rYqk@s=q%oFpF?Lu@9fd3csbPb@`Hx@oppOi z9({ZseYvIwSO6KL;Rz>--Q!{>$x3E3==Xfa8a~Kl+S!_EgX^N!;A^XmqNMj*GxeIv zdSF$Q=P`xa>rA`qR=G_3WLnYE`K$687Vus+Ow_ zj>{W{0QpnRhk><+ur5!K^;)#-D*-(v#qm+bzXyB|p#L@}`7h|($SYb56my^+*oR~9 z9QB;TaDXTOGNd0Q^5;}@-W@}_?oQMj;YmZjoj^&G*YQ*#Ay{H%VfOY|9C9^ zR4*B(b~>U8Jy8dNz2|V|ueS^$S-3s5rR&pBDsi0%F$l?@YF-KIuu?qK6k|9Cnnp+D zejdv(jx1`5j5aeM>L7rOEjJ=?17#cAAfUk5a5TEGK6n3USa1f0#Edh{Hkex6d6WLn zcr6y52>Ebo?238x_gojRX7qpGb@5RocU>1RV%TwA+>WrgF2+%!uInPhSk>S~(cn4i zGWoZ-F8&i_&vo%jAOUj-xWe+w41CNrKhI--0gqGM2^JqK))8T)`qp>3dSguDS zrj6DfjdBP(JQ{DHG&zJF9*uVa(TA}A)}!$eMcG_IrQ*U<~=;L-S^C;H!cG_s&t zdo)JGbMm(yjc-%5>(OYS&qg0&Z*x5wzXpPp9S>oLM`IZA&LQmZXuLZBJ|4nupBG3K zG12dNG|~{yqmhW`(fA{hdLE68@jM!n=yaY(<5(b`N8>1znCH=WDq=j3#sd)Jc{EM| z;(0V40>txZ+=MiqN8?gh?Rhj(n&;6t2#Dv=xB`gh(Krjz{tF(Bw;*$#N8@GC<9Re< zk7A2QBeU&!H10u+K7<_}jh_S2hp@w=aXyrK9*v8Dcpi;Qf#^fn;nB$2GV~$r@MxUK zy3>cS!=v#>$iwD%$D^?b1Br78J3Jbtj`Shy@MugRu1+7q4v)rh!0PoO?C@yJ0&@;w zhezWZ$Yf3*!VZr{=5nMygdHA@)ZVB{9FIm~&LQmZXe2gMAHoigMz-}MREgu!$hgJ& z5O#PpvW+;0uzMbjatJ#-8X0%GK7<_}jmN>V4f+uF-*_}qq8!2wk4EY;B92ERBlIEc z@MvTicpi;J{tF(B9Kt-0#zP^^^JpaEc{CF7JQ`^MJsR1K3uys-8lcVfXk@2yJsMAv z*fn^{E5a585=@bhP!58Scn%1zN8@&c@iK*HDSL4Xv(bhgjqib0=6EzxXPM*CNV*X^ z5)?Kd8PMs`$k9MN8rivBk4Bp9c{ECyc^-{FB5~67XzYtL_&$MWoF6LiM3TFC zBxz7ad36gx*m<#mkG3TGZXxF1r5Z9xT%`oYDG>SQ{N24IFM`JgPLIJZko>CATJQM6xEgFra z>(O|y@XmC3Ie=+i-O^l-#x=rrn#*=I*~D}Sb%psl!&tjRQF)6;wMSC8NL_Cj1BA!Ph5znKMi09ErX`V+T+qCD=$QaL~k!d`S zMk1a^BN5M|k%;Hf$eel}jg0X;8i{xwjYK?;Mk1a^BN5M|k%;HfNW}AKB%%*thesn3 z%<+y#BlBP?IfNY^jf{)xL)hWbNG#8z@pV+Ucr;G2P{C(cqqdK-I7E6LjZENqG;(P4 zJQ|639*rzS&!ds!qvz4c7|)}T!<^^QNYS20Bc?Q%RCInuUxG|oaA*Q4=zgmJz(o^dw)#}R1hb_t@0X3r6iMhgok*Q1f8=y^0s zk-8p@L_CkiOCh4gqw!f_;?c;C>UuOD1M!|m<5ueOJQ~Zvh7nYr>~H~-6@de{007T2TkVUhhf zQ|G`=XNSCk5fQFO3KAA%JDoJ{|L7Kf=A;vu(fzJ{zJ0(1D-7hw2uLY>(Qw5_(rw#siQxU{bZ~(Kt&e`%|Xl(MYew(6?Y&i-6R7i$~*n;imth>(O|* zP{=ACjr1LKJsKJIJR17~X);1-{I?t6%5^*%uLY?}JQ^$FNaJ`kGVFOY($Owf;&?Pt z8a*20_@5CX4jzrf`@49HN8^Vei$~+E1O)z{_h{@4eV#`nk>B@dWQ^z0NW}AKWd8mS zc{H*JJdZ}UReChCN?eb|;V3_|HvVDouPiL_qxh&O2S&&J^W!2$6h!C;@rgtvBJ_gz zq?k;}$YA(Dd@l5=2t6P^7kWnjko^jhN@d|o<*wnF629~=1*wp9II_Wv@)j@0xusY_ zikD-BcsW*xmt%!^IaY|5V}*D*R*08lg?Kquh?ir9csW*xmt%!^IaY|5V}*D*R*08l zg?KquXfMa)`7>b*yd3`qLtGQ!<#--V5HH6H@p7!tUXDrE%kfymr#!bsKYp0YxNeIt z^LN#Z>$b=Ppv|=Fw)jtA(e(B8&)bLNVjrZOt*4dOt*4dO#jwx@mdH=x^9aR{A?01x1!M{XYY^3bAW1J zEu=a;v*u`&lP^9+nV;gPTip;3RQ|k%2rRE50?TWN!15X*u)Kx{EQf5=rY~3otp}-0 z4y)(7w74zKR5r)1`n0$$&eB-#bO-kC*-8e2hV;x)z~-nJyYztcH-mxAQ=!dRD&*4Q z1GiFhj!cWYr~OrNzw- zw;d4Mn%16jD!2sL&a`%v)7W!q?I)+PJ?X=Tz_RnT_Ak?~GY^|p`6)>Eef0|F;bMg| z2T&BMTDQtZ#j3qQGgqnVA5rx2o3*Hnsuo|pTU3y9U9GAXU%fwRw4JIJUp-uFz}WVxT732H zQZnz>!HjMYwL_zwRP~|}K=0O)yQu01iSBf&Q&o%i;o~~Cx2hKByeG6(4XRq4^Pbe` z09DfNJ~r=uW8s%mk+dsj0bp{m9G?mdkzRMp~s_km8k zSXGPr-G{2^LZm%T)o|MRR7W-g!^HEck{M>Js^Qf0sfw_vUIh%3&!;L*Y@4bUf4lEg z)r}Byi>elXyYE%?4xl?!^$2vG_z$Z3VW2xzwYcB?sH&d<`k1N~2fLqC>NTLxsp@i$ z+y7LV_kg~tsv~R{KdY)QfbLP%ZP^fhQB^+z{Rpub8sfjIOaSA+m#X?DG8?{lF;J-g zmZ;KBfrigWHK7XX;*EZj9W4DJMNRM*e}qZNNDn0MM8_vCeLow?WPfN21Vz&u$vMSu z-3%<59yJWufjTaO0fWN<{LvsK#Oa@%!kL6a3lSzbc);ZHN!C$p^g@jw?Ym6NZpT`1 z(@M#@c+jYw4&wvnHc)Dhg>~2>$Kd5KCScyr;3dNFID?~v;Uxx#!uEjqHiOj?{Di?i zsF8sA4TB>jnSrbYOfD4KiO*b5;O(`~oCLMc+z?RpQiCC})bW{{=;8+$r5uzKK8%@= zNO~!Ud?6&5DNyH-%2`uWU(nPONM(s9N_FD(2*)`fu;5+dR)hnl4QkT$fqP6y&)`{0 zAGoCJ1Gh)$ACOKTxHv~(PIoP~B+#)a?o;r@r$8p>zr1LUy$L?R6GBvcGs2t|{{x2acZ+e%}X|dF@OJdT(j&rbijBb?=(?pxNzAn1CL#+Z%}njQw>Zni$Pp#tytgF6 zVqWYk8Bep1D`lbW@t0gdP0J;fSx{0z87o9OzF71n=LsSnUn~M9oezBLF!q(6~AxS!Qhan{W;Frd@!6hfytc7HB9(F2vaA%tWZgC|g1}MZ!U+r`=42;JL>=(Sm zIj|<~U<+q%j80Wl@txoP#N&{T(dksuzw+C@YOvB8-C;V_lU`n6(~nPE+37(l`Mck) zYaxA3(mQ^8m`jqu%n@-ABR}!m3tLADD&{#|a}Djgn9Ohc?K3@QF5HYxhtZBV{q`j; z-RL}{BML)1I_@Bq^&k(U(`%ISxZkF$n9hwT>Ix2{gX_%5)#+zskY#G8LTY%%Z~yA1 zF*@ftGnUqXk=1H+c?R`?lf@PF)weICOw_;rQ_UxVvFp^iU^xZn=qU6;ex~qw*Cj?)Oo}qIY3W-yHaC&`~}~*qPv4e7|=t!7RL@^lCi)?0(y$q;@FWn2s;hUW7XkYAtJbpEd^SK7%Vs&AJTn*Nfg=FBt7-5m z>{jL!AQ?R-)gzzBX!tg*rJ>8o-&c^xgW)qO#Xj%}G=2o=)-9v?wxaS-^w0v=^PNsv zvlT?ziI$>`+g2CWTv%xI?chjev#QgP{*_-A7=6b%5p0L!bcB-ub09?fL#EH@d#J;t zpl@M5lYix&BBSrQjydeuXF0-`egwvp=;nAT5=d?^N|M;hxe}dGW z;?|gxl}rq$cUgd5l45X_@neCH1`HVCB;TV=!5PR?jBe8$A}2E#;9t5;>7sycPM`ao ziGdVOi8CEOjJWcrng^f}4;0p!@%4@nzb9m= zC!}kw7Gmrx4w9Xe>tU!oW_DApu~VtToa1~rKZEaPhVevzzKS!J;6sG=RosGshQ5k3 zoiU@-(R<<{{|#To1u(-sTyeI9|IOiwP;9t|D_%_IfAvr-GM!(SW|}a&JieYu=zUmF z5x;^-%%T*At$_Iu5d65uXf7`U$@p4E7Zm)ALid{m!zz$raRn^wZIVM=0SogFH!N&9 z-0&x)4T&6cFGW6vkL^Vb9deXx4#!hpK3vpjmiZuR$OuGF4BddR{%xyBFaPvu9Ys@Q z8KqC_C^}FOeOgD6UJL5eI*O)Aj6SWS=#T^@>)*DD4zun7qJP^enqfT%ME|x`G&{T- zI`wZ`MRSUofBoB5(cJRCf=&OnRdl$B)~9t8%@;(U)=_k1_*Jk?Gki}LArJf2)c^~a z^i?d@r*#yaZJq>7=kZ)8kNi2RXrsu{r*#xtKMPtQWeOgCRtKYVY#`~!=G8@@p&ZGRHiob1jlM2`c48LnW z(+EfQB1q+N@3*ZxLGi6;?mmg!gmB_Ptn$n?N^bHUFv=Bup*oSm2PA$2 zL8X7d=e?rO)ew)~W>FTDI~3KRoacx7Qcdyqn!g=LTK;=Ol zz|{s0O*m_LFV-@Esuj40Mr!P7U=Naly8+6=w0qV&I7S=L_Hq=BN>(u6e$05Omz^=; z1~Bn&O#$AU7GRCgA;GHn0%<-3R2{Pn7t+)T?eKSl##}&p!(?StEjLu>vd@w7ERfCs zpiS>YL|0fVg8E6K9f-LJpau08TH|{#9FWS@>DlI6TEIW1U0!dffg<^@;Q0%nYB_F| z86>37fPNyRo`%W^DfWKQhyaXi#t~PKs!2jrH5O4=($pN#QLAB-aA-#MPfh`__Qz`G zpufGlks4E}lsD4lXJy1{-n2iGo)VnC0}@_1ctLeWw>`)RN4LdJk`-X)-{M&q-OQqzS}yql3ywYxSYQw) zLHyUB|LGIJ3(P~o?9+#T2M(05tWSLfMRiDvn64qLG5nW^!n3Pk<^{KyH7M+D$pZY7}7f`-lpB9*R0x2-BA}iOG1(jzU zvl!(sYq!FQA+DJ8`m}Jeh|=rR!YP92^=aXOg6Q>W;Z#BN`m}JGAbNdTcu0bh_4>5% zFzaR@dVN|r!@2{AUY{1u4nGT>dVN|rr(j!y*QbR? zhMxl4G^3E~)587gxGF9X-#2G{T6ng33}`x!=Q??0M=abZa`gJNa8vOM;L_{U!t=xL z0&&)-g`0K03b5Cwa7^$##K`)zaIBcC*QbT!v@oNPzE_3g{nQy@%`@jwjxU9PVby0boN#J``U|x?vf5-gbH-a}&Q2%&(dndLI&4ouFaMsx zV)=hM>Hl=n|7SZXmmP)JAjl5N&ZIlGEGwM8oB5r-+a|B?mfgu0vxM~B-*ykxEK7<+ z8AY!^|2q;;{;S0VY4*$7&v3U6p!_Qi0EsT7Jpue)K!q$RNLh}JVY2}hvZNqo^525S zSb+OhNcr~yzZFom7&H6lu)5*|EI9hhh|u>7+%N~ISmBX&0eu=^RNVspw&?M~KS1~= zeu+D}0K%_HUjzLJV6-jkqSpZ|w0)2+rN@xA-5ff{mPrnMIbvmfkiMs@PQ~(sF8ttK zU|fEJH^N+hj9v!pblBz$Asc={ocsUBOOE@Q>LgD29jc~4asGWExC7+(K2UK|F!R4n z6+Xd)s~{v$p5R)c^~b89`?0Dmsw;FWz7@D1t3q51V7`oJm=3K) zaA+MY5hL)lrsH9=_H8cW>>SvPNJd3`=4HU6@@XOJi^-RYC{F`XF^!o~`g^JppR7Kk zQMrsZ?knYbBWc7a_hvu|zqw2|;l4f-?OxPrd~KSG+FWqJMqVkBTcj2N49 zp^?b@Y@*OAY}z3Yqx3}^5}SQ`IW9i*IFpr$@TZ!u19uy-zS&1FV&mq&2aT%%Z6p)T zz8)lY`wG(`pv@Ar9ta!6WY>alC7=vV9p`7|!1q4Tw*kp}97QztT=165CuyVNi9C8a zn)AsLvkFNACIwVhmqUT+Q;mysEB+h;_@|oLp7l2l(mQhF0rD-x^krBv%YZKc zw0Q>~X(6XBhqQ^Wakn&ph6c5v(}0c!7?o92h}G-NqkgM!qo>f&3cp2yuK=RZ&k@NOiy10V{& zSCYe@fPVqd3cpvPaLac=;{pH`{-C5P-U9j@z^IH;;g?D^&DRP)^@?<`^r6biyU}E=_Y)!$Zl=OrNFlUv?05- zA-h3%1&|u^pBd6CS)NbXyHy84Ab(bnz@Zt8}h6+8FTSIq|JCp$&%r8NInH1W;~=i zvN65}{6&B^;~~`}hxB#7Vju)$&?Fz$O%hF@W<50B1x<6crk^}bpLm+?QZY98W080k zKs4Q@YN)A$5rX?y$kB9{>P$^nfY1zJI)hFL?W?byXrtIz5?w7fX?rB)jfx_P5zK^ zB7j!hsI7Pb=u;$#6*p-sdKQF?6u_w5c{Vg&fzf7`wxT;mfBvcFZ#^rnP;F>MZ6IWr z0I}i2P)(MqunMIxdr0PP{{ZZ5is`%3TZ;s&D4c9 z3q<~@<~E4e<~Au=GhdBVmjk5Gnp7cmjhh_Fe+bX zTR9G+r=xI))(3?rAzBa7$LaD>Q$!Vp4UB)<_*BNOa#x~-}SRI*GfvBM!F1TfM& znX7qF!p*bz`wE?bf2z3(qqWY}Je6cqn1lqw0HSK1>O@uF1OE)5b2U%(%pvU`tdMas zfC>-S3O@(>KA`$btgo}TkB5Q<$|7^49WurObbTDDiCaMU0{{m0r-4&3Voufu7Grwi zpK3nGGjOUl@Xrx+M}QbORT~(Kg^cf_u7Ojvft_&iN_zkeoTd#t9Oz7dk={auqcB%A zYK69^@E1?vD6Q}rB)AnI3P)*$Z4x2l`?#xclvX&kG-ONyP~m8;@I0XB0F3mRRJbn` zj@1gk!J0l$Y=);g`GO)Go_ z=!*a&eG(OBl*%{?d+7{9;b^@6=^SSCC|_C`G9my`n9-yB;lO7Cw8D%YPw#tWd5@>5L}x8rg^?NpL{o{*+Jd$rV+=rRD$!Zno(jSFRA()& zHGKs19e|O3jtYHB?aXO~M|fGwU`?;H=F?frVMl&%fUKr`I%{gO?xa4QDcwo^TFDdO zeU!WSYj>OjCEuwgM@J7&M-z0kleOA+QFc)^r9B6)@2c51%}fXj;E>TlhJo)o<&aEG zs6%;uA7pqA;${Gh+P_o&r)ukdIuEEJWSZ!hvcm8IaFVBZ1|EuYGI@SoX`u?Nsm zw0zo;lIv^00-&zXMAtT8R{*eqgLBUw_2s@=*EKMdf2w(6#MQM&X5o_BknuH=v}2C; z$iSv1Yb|?Z_C2~?$T%E8Eqg`F=fIu@7`66#h}@-e{k4|sJuN#tExV+|4(@>70}w5{ zq}*IByQIYKtP2@80jT9=(Xvm+kWmUSY9HPJEf1<_Z>^=9{ttO6iMn}tP|9t4r;xD@ zAm#R;l-ns?LdJmroudb(+@^O68503U?NgL|yV_H)MYi*r@j_4X?IJnYJ!I@f5|Mnn zNPe?EWZVYOl5ZEu*Yrfi0gT#%*d0xqITdc0@8$|M$ULj)yKuYEYk?fYt z4I*$V$5&Jhw z`ELU0T!6NJv(&<~z@G$A*9D?0+6N00KpnmZUl7hg!5P5TkTM&T2q|9x`w(E%esnJE zS*@D>#U7qMtL<4Wxjv|G$QTC@dsa)X_X2$rpzT>Lc~3Qjuq#j7(X7*i?PZ(a_$O*J*Te^fCS9P7|kEm3boT$ zVE|z{D6X&~aT6nNY7b>=%b#JG2gMa_Oz@YQ)*sxocbM7RT#P9B_08-fEk*zOX0~{T zjRZr8Tyjuc(5^ZSVN(u@3-vJ{XL24C7s|i-Hq;PnXM-zv02)jv|LWUNtE+E=k*Zyk zCI`h87n`-1Yvk(NV(04HVqSe)Y=x&%S~0J_Ew;mRfJBRVfLn3?)wjjb;y)wL8GTS( zFj`d)Y3A!_7InoP&DEah{Db0(^RK=w?h<7|>4V~movUxPo>m9N1xu1=QM4Qs7rw^a z4kUauo1YvM7rsBf6^N-1iVG&Hb|Bu;SKnHj%z606pwEvwFYtsU;z4m%{?)hEW-&w` z6lZNt(JFmVoOMz38Z;AqP@J_z*z`eh*2S?$5Tg%@vzlYy1JMV?S(lW4V{xOzsqLZX zGP?)5kv=HSy0Xnrh|vedSyv?$3RWK!XI))Z1VkScXI*CxL>hfioOOLHjkf}QP@Hvx zNYe+!S=&o^)1y8p&bqOr7HRZBan>yfp7fy)inH>szP0kNzP0WynGON^pg8MZYYg=0 zgW{~6v6+yjufDY&mTc>T;;ctwXCp=*6leXlx7M?fUr;}$vU&Bb^<2p{kQY_<{vClmUve8TloGGLwO-J5 zr0l&|CR;DsI}ul>Y+ik9y%gbRwR&aq>RW4<^)#>sWhap#>t!3q%&TwhGARRnP@J6x>?3xH2%5Y^Wp3xjM4M!lx z6fp^rgy;yUzQMKl=3X1+%Wl9t49^nw;udBjZia6U@Mhcu4~h%l5ob?K@SwQxT?x{S z(l(&5ySM2Fj0eSWG>9a_j|ADdrK5-cV$*DWP+a&?U1o;waI}W-U;WpBO|HHTf0{D*3)HUS88E%MDn1x zFs{CxCcKA{HwPJuTwZPqa!npdDB`8>Ro0eRC8^+bQV?@dXO5w{P2UjO8 zUopeD`gW0UEF}jkl!L6+LoAjP11Dh=4dd!t5gqFY1Xte*!h_<%xcZjOP_DiWeT%P(C;)tA(uQ#W)4aN+@#v^9 zuDPrc0SNmU;dXAO_M3~BnHIBSF; z`k**#q#*jBIBS%iI^>`@YqZ4ZgW{|)B3d65XN?s^9~5Ve6GR^rXN?y`9~5UDAc#IF z&T15CO~EYQkF5zZ`09h=tcen%4~nxUOB#JpoHa#|t-kvWoL2=e}LG(d!)}eyvgW{|ig6MRW5JAeiHMP@FYa@?a|aJ~VynaEXg5ySx*y`GUCz#o;RCKcKoJjn8c zeNdcroQT#3#aYWl8a5L1pg3!}e;FEIBx$V(4y0YfG9aGd*u{h5tP>r(j)(o$NpX&} zQM^}l0JhR^A&ndqXPulp5MkUKi)WNge;EQT-7ZEH(d;>qjMWsp8@L=4XRVP^#0*E( zr|2S;gW{~Ug6MLqb0VFmb3^`8VR617eXeoRSRp;@OVrO@ zES`Dwt#zjVFJQx^oAP9b!{xRTX0|a?%JU@DV?bUW0`fxQ<3VwuxD1>DvoCbW7&Zn0 zoi!Px114Xc0%iZ(aaPY34DB;;*c$7M>h>i)|yf z`(z34Tx=VG*UUkX88BzyS#lg6G3h81kX+C6nIq7m;2uu#zx~XjnzQu5Ojs=Io`diy z2v99MjuSNppg11|{%1f|b{r>qQ1-z&{A38ImL125!JN520sao42H$tv6tlJ_4h|W^ z0X1wC*t^4&ZvlUqG<-=)N{7h}2^swXhQYHi3yiXp`TF)Fmrjwzj^os^oSd+16cW9o940pDPJPQFO43yl*M^`+IL=u%6tn>-P2V@X(yjMMv zt+KBIOQ8=`2K43zi7%aqsxSIZoQD&>6Ck3k7SWB&WYKcO$rzi{s5L$VYgcCv+Z3`* zcV!xF4xfa!-vzEQ>vbdQfhhi|=0Ae7j0J`0PMkzGp&6bDNOp2~n?Zy(3MItwiyn|$ z&ec*5Mwoy2alr3NiK)(%@)IQd9Z-QLp3uMjRMw#-WAmIecsBB?XB;^!xB^IM3zwJN zpjxbB9n~xvBlW~Yq}!qzmuamBmWxtoy&3a)T5R7UrmxsPWGn_`(9^c`&4KMbU@wz0 zAC!TlY#JIengAJmq1`f!lv9RQlJI_@cak)pBuUs~EIvmAva?B&gv~%NAPLu=s>>wdH$XopX+BAk@X&D~V+tTU znF=Pw`WapDqnnUb)K-ZHro1}7*b^(2oq$Q}q-IDN-Ng-nbAUmHVNmwx% zMgX$2Ns@$XfSyFs61d{NAqn3G`X)*9Ns@#GQ}CN3AUm5RN!Sl)2LL|2FfS}X899E{ zIEzs4hf#Vc*_%g59gl9Rj#3$?IRleF)y#|9b#p$d9s5w}fgz(9knHcUvL|-fKM!Gt z;bwQ-pw$SWlhHwOmez5)JO_J%uk{2^t|P~J5PBM*W)SORYJ#*h-UurJRqr~<*(onV zLh1-*3XG01N3nFux^C>0y+mQ-60LA0dn^7_^WY*>BZ^snj6VosrvTWH`bc;B71#}= zpds~%NTpVOqcoIVXn4*+PX{8B`x{|8u-8?3qi4Egirn83Qg8=`kzIB*NAW31q2b1anK~m0D#ZKNhTcjkG4%TgX zfC^6HaUwYnbR6a&QX|IuSQr!-k2GNt&?|?fs9pZ3)aZ<+|2U4?(M7NPzqE2_?Q;FU zbV|Tp*o|`qZoz-89I`(G;XhbnbVvF9+a*R37>daiFexTreog7lxd9V}J`K;HoQaKd z13IG2^=e~c=stvv(8K7w?zsV>i`oHkUWP*d91X;I847)cnbGaiU@Za`>C7a()XUjy67(4}~~ z=LUq{UjxK>843-V1LVl?CtzqfH((!NxO^4QmKD`Gz}yv;&g1W`sJ>(xcSWTzbN}m# zisuIW32bsEwtH@XUY@mj8N#^%)ES+PyfNo7y#m9Lc~SwpKn|D`R6^r%jlB@wMmWk! zqw<8eNV^l1{Br~Hx0m(;XZ$8G$TTH;xs1|j7%R-PWlX{~UwIcwI`Pixj>(pK>336z zUZ#D3k+0}yIUC>%H@#7sw-CF^rRr-c+xXfe!58XIlKDX9itt|>=fr|%JbIap?p*Yf zh;DTR!E$6>4fLrT5;r}sN8X3gKKQ4a=i=i+xojRAq^c^vqQ!pK*ih@Segv-^~-^?-<*)q6;Ltv1R)L~@l6mO5aJ5% z-}j9nvHLtsAcVOm2yrrrzKuqe98fUWSHXPpgo3v04r+*g?aLe=qzKnJPLz zWPC*;8?@SAbIv~^WE=oUEv0!wHF4R3kZ~*^wUp)!_1R4RXArgn(i3gNxaOgSoKi~?kC0P-#ZuK}``0m+<)$KeY@ z#&kgTG*V8)<6~fN12T(%%wB{AB_J~s$ZiCl2UJsi&0C;cadgNS4XF7T$OB74#&v+2 zuYqh|8Zxc|)cgu$@Nt;^0kz=>@^q*&a9#czitSt6LqMfj^ZU6$cqwr{g@N+19 zG>}hLhK!E@HB*5^R)q`;&|xl+onWh(hd=`;Jpq`TV&5Sh{@5*UMKDiqx2euV*seB@ zDUZRMDUm+C9CCl;@89@SM)WXLBJPCGU}DUCgQ!!XZVe#w5s-%wc!0=mAnN3h@iUQU zf$R&UFChCckj!0poB(VYDL0UEDIRwLyA6=p2;>_CJ}0sc$RVrY2m`35`WheR)JuSE z1k_kSIyPbD52#53nTNm(K&N&<{2OmsUCXaHjYzl?>w%iSK<+~H&Ey{nq}v+QB*5rA z5!m&A*EyXk`Ni!`Ofv})_kiU#K+Q}b4X1>RdI04)fpejI{-2-133zTc|>@X$s-8-nF#Or*!MJaD?s*7Kr&b3u>shbq+CSG z*?4>m>}^11HIP}Shm1o2nI%AWAaFgPn(Ax51m%b`;6wzd`3cB=XNHW%{+$ zz4s2Us@UGgXHMhfob-f{o|8ffNe(%LKmrI6QBmnqrFRQb6+}9sfCVX{sHoV*iWS9% zh>8U-f|aXRR8(wN>|MX_yJmK>x!&*Z^ZWDjd>`^W>twxa+L|?G&&=L??Mv_+89@rb z`IjOZsDwB87b9^Z^e!$2(5ph~hszMH24EAw6(Ci{qvgXaq#KwMFAu5CpyFNt2f*wH z(I&%zKRV#_iN-Oo$y`rdPh1uw`w`T3HS_^Rb^}ZUa|Xe7fSq8TB6tWOZ4G7vP~jZ_ zk&XB{9cUaSt0}nvKTiW~1x029l&-~`4T_uruolb;P!WqS{uGiE)?tPN74yby(v>0g z*Lr|I0KNiv5>y<-6uIhZJbel(X$i0ziHo3jaW=r1>k$GfE(4ghDWr}Asj@nt11zKi zm5KtA)Jj9UsM}%B&`xU3V8%+p$ zolLV$vsuN%u1L=x8L4SbtZ;fL%Q$dE8BRMf z7gG!Vxa6p6?K5CMK7ZZ6nuC-5Ct%g=&5!{H%sW%#Hp5Hc;0g+Z1DvLMJdpa!Y)EsMnY z=A^m?o4I^*h#Y%{$`*L!(UEo>4>j`KZ;2Pt0+bRQprQv)YFo9-7;C%uKaEHvv(p_7@gNwZAlg z)jn)lBtC3hwzArXjgxLu?QgWHHoLs3+K<{*?Vk*As_k)C+uKy_4_NKnP;Fj>O|@@# zSNjfkwKuz}eWy`Ss(qK`S?#+W9-7LQA*{~5Wuf|4mj3uHO!w__yPT`W{c!=suD3~y|-&;sci zi!2ZuEjEBQT4q@!US@0*i=P2CF4SSF92-M*FVf*10PVQqFrDKvcV$;uyI7lDt<$*; zGvnnN8>Xt~6(OggsCWjh)28CX+!Y_DWv|he!(f>7lHFYSubEWu6;U}Tcb_4h13*~*)REY8w$7I5mH+~X20aq9U772eVapSF39Yc ze7YNjpWcOM_(6z?t&vanq%h|mT-NS(_Deq9pF-@H%=Rc?syyai>=i&}dlb;JJ(_qQ zu4f>#J!)ZMzPkmllYz|kC}@Na-5*kyg3R^^&kC@NArIn(5RloJ#p$MvS;6=mr7n{P z!ccX!9p}HgtBzZehQqwK5fpg^KZlU=Lr`QpK(~jmss=?K2Dll_bp&?;{0`<@f*Sy4 zJd9&CP~-}LSHNs1SOIX_BY4Ie6qyfj5188trUU#5=0{Kw)hIp)$%d^VH40SxZ-5!w zus#D7{|r#}I9`YXDDmZD^EgDSj!?Nc4xr*m82JfAYY9;JG@?BP5CO<~2FH5axhSXx z>W4(dQ7}L3z~l9x;!Xe?p2bu9pyJ~JTI~#}I8a%CfW?eI0L)HEwt@IpFdBlVH#m!_ z1Bjy=bX-^095Wm4xl0yUwiQRuY_}JQj`^^WD5Q_-UBC{Aea?jcN4_8daTKL~$srDU_eQdKa>@2Z0w5f;i@fu!&0kK{9VS?W{58w~y0Qi;~yb{E{jCP4UkDvz;?S4>X8^GIO z-UJoi3lO;(KYs!J!Qc%5ZT7+_pvYwai@+=(SPF0lm|F;D1AGeRBZ4yl3in~Gf{Ivj z@m@$q0}TPS9&77wwr~A?YgS{K35_`|`LA&_-a?H})^Xuh$m{@uBCq3TCo*^n6xqc& z?DddJ14W($I33J5f(HPe0kf6hc7QH#;B5_1WFx?}U@jq84bb~d^fgdq8NeN2HWHl2 zG;d+E2`Zu*#a}|QA8042_(yS^-wCN>Kqc`2>NKsM$v{h`0G#ko+~Ecl z=K*{S<{g4^fMxGu#sy({4m1XdiaUU*eh()&pyKWTd%-+U&>LXfzpxbol??;f!uY3w z`4W;(K>RD148h$uIQFX<4*MOa<4(zh{oX}TWDkChdmrarpvX>uC14g1JO=PMn5_i& z0{jK$2ZEacW*@+ttf0sSfJeb>A-EJE^8?&o0!0=B3@Sx8dA@Iin9QI{|v9;fQm~1KKlam z21u2~fVQxZc3>8KiSZ07?h26bRY-Y3#U}x*0J9KOHVEJ_;|~U-{~c1lK+3-g=PJMr z#YCte8;S!9u?2F*5knRo5wgJcWo|XDJ|e`K6Pf10BSLob4io;kZQAdIU<~}n#_3~M zG>twd>NwGww@%K8VL3TYG|}4W3k<1qhg6l>X+^d{Y=h3R;J<8x>iTgNwNHE5 z&pOC1=yll*bdXiU8-|xX(3`?{BXZXLe#0T%{jRz{VCv3cV5;>~W z?$0&V{UO$UmiF>WZ|Z)ItM2Ez>OQ-jm7IipZSX1|ThL^g}H@wt+ zf$*&R62l?g5?9@qn!0l_W9oiUbG4Scsw3k;? zQ}+(8x_5Ndy}r5b4Wg{ny^~>C_s*6@9l8i>>VAyjrS4q~FLm!GJnMd(;gIe)se3!F z3>wx_vl9|z5L`_DMB#1UKB>8my43(X6KH8n0WywteZ@KWOv;p-8*TsYNs2 z?ZK?Bd)eG^gvP_Z2E z=E@s|y?`4jleY}>M7AGzF9^5x{(+kofAc!^E^~9dPF3QBC3OFC6llFp#apjaqnKN~ z^*VJXKytj>>s06$+@bxO*Qt)kEza>ebx~8+*6WnK_~3Y*3f<8I8B`_HP|2YIIPG%0 zPMLE4)9ch)X6<;LdJrH%UMvbFqc6hi6kk?q_B!=6!V{akPEGNnj%$NRvd%AeXF_hT zQ=#^45VBqriG+GE=k@v2syy@^?)$*&)ICUA6Iu>i!s`@6>O=3LPr&Qc%Lr)<(SrxP zPW=VYGju<~;dSbFJU7-aWW7$+Bf`+o2s9JCPI+Lr^7Z z^iY`2i8d!5k2L3n=#d#-r%Lf}ai}w^a91L8TM^2^U0ryc`WCX)p{oi3?n$jg$cE7I z%z8_DI&#|-$}R`6UZ+B*;1-ADbt+U60eCERJTiDRv>^=eM8W`+vpvM`*um@6WaPFh zbUU?vR;s-xbhrrM`IL1Cc{?lA z@N<&&I>pvfI*AXZ!t0cuZKsp0*QtAuU$Ra*t^#4NrEUYt)Jb@@f?lU+{D@AnUZ-9_ zSh-HJUZ)hI)WD$+dJ?=&y^gSYos>!Yy_tA9D%q%${$Sg@CAI9SldRV%mflY%S+7$> zLv_-XrHHv-G#jIn4zfOu*Qq4yb&4^k>m=)SihblfopglPsU+)lieW2slJz=O20d5n zq$9mfCDZE^bBuR;or_@hBSr-;O$M9*C`I;05!nJLSaA0>l6o-<8>-3 zq4fQk(ujub4JMT-QiY=ki8CPZ9E0)y-x9=iyKw8WjrxQ)o;94D^I>;p)zQ%fYqa>k(YS2oAs!_D+Mb+g3S%otSUNhd}s zPLzDyA!u1YWBA(JcHSiUZ;u>=nt0TSMu$0 zL|phhflBl`b&^Eu>qO&hW3t=^WmM)+Ose!cHC>|3cA{~-nrM=*iR*Zs+9+{v!fzT! zR;mddgI-IoQ`;nTJ3~1;+ZsAvr{0#(f8ke*#@W-9vrE)*yiT#nGkep}@H!QbsRZqh zU#Tf4+2%Ahf5+<-EtvT$o+72!DR!+)J|so2Qv)QIq0FTY4aCXSrY*pPK(ABhNR0Ct zgAK|_)|5k(+9(P-UZ*5$$Lo{;$LkckVdj;XZ0U7M)N#B{33!j{!0Qyg3X4j8>J-Mw zGnIp?xkQ!O4RboZP9-1^-`~csD8>oQ#5Fz5@jBIBqIGhj4P`V@UASuKZz>EAUMMKb z?_-tdb!stUW;dWGsGQ-Lh!$lJh5PznvUTd3c`HwI>nKyLjB7D zjuj9LJyQtKT|jc^EndZr6Ob9YqYXe00g({DEC;Vs9LVLNjd%teZZ)BtGJq2W z)Q8%&2IwiEF?0(`hSw>M>Yky8xD+^9Li&XsDgrn~vK|`hg;^C|r>NVQ(8GufuTuo4 zhZeJ(J_4qPhG6o6*C~da7pkiO=qI@?4!ONfg??qU0TQx0^efsFUZ3}4up!C!Ds=8La#IHF#-;Uex?n^3ivt6dYxi9xW-$rQ?xIx@lUetCP~C( zos`8|OcvzwI&~SEJDFamf*63IOPTdq37jHTXe3*1iX;ez_(nCnPF;zRd%3=SH07>O=g_47^TJ>&DOx1m{X_&0eSG zqYEU{>(ueo>v)=JuGQ;2E}zb~dd-3U@H)krw%O}cI?^~^r$&PJ2gl<#gnC4-Z zN{C>Noa6|+PVu#w(3=IwbBXi>T;W*sQUSqGIjwMkfaFjewrub^)gMWky-qC!N~YJT z!_3Kgohm~1DrCJ*oeI$Gb?OyF^9Nb1Kga>+53(WrK~@`AO8H$11Nnp8Jotm$ka(=u zDRZstimobC1>buxRg*~?uInTn8oSBsR6U|NUZ-Y*_Xp=QbtBYU-;`RW5y`^wI(4H& zy&b>iMQeDSIuEmkyo3y|Q}Nh8n-{GeuT%1(wc~Y4UbJ?+PRWbb&bg7iXzh5Nk{7Mv zb&5Hg7p>uSDi>Ls7p>uSstCZmXbrDZ0aVMpXzh5Nk{7Mvb*dcE%!}5J*C~0?+VMIi zFIvOvR0EbT0*QI2}7*D0g#+Hg1I6QA@NMi;zJ z^#e%uCA~t_DKRlM8ll)PyDw{s(wnK2IbWX)yKMXytATF2`YGfJcKscbTc zqu?{x)+{`a>ooC(vmZ?6#(F3MuT$d@`%_0Tgv=d~` zjS9w80>SGPl`1dbchQ=>P8C#NASj9H+7~q9eQ0`}qD|@xUY`Nvc%6z&nxN=)iaofe z${dNy6}?W4L7x8LB>bk$!%wOVl%YtT${bZ;74k@Ko5(JIEyKyA{>2{{03Qnf7#6c$ zss8gcMsF;pSE{sZwng`E@#HS3gl5!fHG^U9H-TRQ6^mD@w5}}s%eB%|8(la?NosRlCkE6Q{=hP|Ao;t~c1aavPk^r)|MI`lQ3qFXtqPDg#6AN6&PUBgjd=R9@#nfvBAd+J1R)Ymyq zo#O1N6F<-JXq-KDqIHh?I>%u_oIQ0q>g)Wduk)i%D{&8h^l2rW3H`6|b>6~vF4{w< z2G-*cChNLU09k`^?xM3E1Mg9VEqefD>P7_o=Q)htSj1zeOnIDX=#TJC3@Vmmr%ZXA z=^NmWKt*!wlqruhUG-B)tppXzu~X)W%y`Jp@RS8Akwc~|c_?Y`FK}!OYQ1+D6fh4t z{rW4s2!L9TpoZolr_sOR4S7)Ovnb1z2cMn;ev&ddhsqOK3Bk=_<?;}B9f5fimF0G3@Xdwb%hT~J7(T@33o_5Z z7=(MX(xANx+=_5-cG_m}P$?gU_<}D2_{6~}Qfy@``cU^}rY$7D0I7Xh>DMuZ&-Vvz zQyCZS{`SERh$c@r`8&k1L?ur*`8x{mAhgbD$p>AEpr+3$A!|RPnFIa6B+0s;9Owro z3m7N|`hhd!zd*F1D)2HoMBte64nV$O7yMe!sewy_tAI=$SJ^u9KtHfX@(CJ!*M`4g z8u6SOxFX(zlTYh8HL%{)%cl~P1E<72fN0`5HPB1cHID5Ay-j8+Pzmb>`gmDpGJ64Q zp3)sm0D2uO4e&0IFUX8iseIarkV0?(d@`Ghg{LzK4)lG&C&2``OALIT^f36uAihjc zi727(&_i@q%7+jl^kojIY;QV3TF#Aw;4ys?c$0eu-Ju5l(9B>or9+seC4HU-zSc7+ z;SY)n;$KVpJPmxMS2oF8UONzyoq7``)YoSF4shT>P04l!G21kDN%>J3^tak#WjrPS zYzmjM#dB)l7ttv5+X!^uE!i|Cp{n?s>XUzP1T++?8=pVB3s}%fObs(YS-Tc7RTWR` z@BR~>96(t-d(^u-QC6+ODhZS=Zcg`Pvu5;inj>BTUQ3X?bXY9_<>I-{z0!njJz*6F z<>C$By`uOl-mrQIl(%J^R!>1K`G)g{nQX?-d|~w|$b5SFBatQg!zv!6@(v)u*G__e zXR{);2#A49g0Dq36nHQbINX)dIjl@iMyW}S~%Zu+#GZmpm=;kfZkut9@L1(!@y4~Rf6Wkke{^9H75SVUv zK?b|ZB>@;8l-2!2rYdJI9?&AJx`47|C|=NsL-EpJSe*kh-R>gkcAhnjrq?Z(UbiML ztX6`uc^gZw$lz%9tm&B(fcf;w_}@_S*9iU!RN|Wn*$euvM5AA%!7^;9HjvRcvr+FU zR?acovq_FthR0EOJF%g())*VQ01gG0TRGhOT<{->3UzV#j zH@<_(&$v^b){4!O849aZkZH1MrIbwu9!r_nd0JOy{|N9F5J&uU8S$ZTSb0Dk@zZ6* zPXjswlq1bL6OTM8^#t%XP(eQoY8jK~By$G%0J8T%WNQsCwE+pP0F{aVlCe@RJtkh^PLSF^3 zM&qPLX$hFaK&;U?snKkpnIKc633BDS5BMHXLBy%iB+>qL$o7IvjV4Pie*yjp1kJZm z^FFW?+X|C{{8IB%v1Bru_sOR9BZG9RAo{v9&tzl!>I(Fg1b za(R>fX$Us@cM<&;AkAEm(Z7r6zZLjF%0&MzqW?F*UxBFqF`|D>N?5f4QU7B^|HVM_ zK}P>>qW@#STR{ce9sQ3LT@OO`F39NLU1VcZ!)h1^`hQ3LEA<$wKSsCw>5coE^sf~C z_apwBAftb!=%0>CCWDOrm7;$i;FCerze@DK3}`te(7#Ibe-G##kkLOX`e&qvRXV6( zwWEKH=z1(<4Ira`Ok__1KLWxk@CNFS=S!{rTqE&MZ#1^glgYMY%dn~inO>jQntjLV z^?Apz*UUiZ*&u42FIqnUbSEXyI$yMInGsegAft6ewC)4k3sf-1(Yi=9oCVnokkPtW zWE+651mW+)ModZSv`d?IA{SvB$DPO)dtFJaWHek1F|qwG`!4wZ&(Ar$3hjdj2IHZL z*50J=0sO&V@f+8OA8sf@O+N@phal_^K7laz9d!52^FSHm9C@caets#+Xwg166+sCP zw87%AgXFIg-fsoaQGgHm(~V;yVGaMAcCV4asg@*_$`RwxcHXPrapn+f(VWe(?E?0 z{1!xTLRJx?^-Q1}nV|hJUc$#q047U00~5NB2RJjH&iU*kO2K2w7b3bpxD3B3<`Jdf zrNK9WOdVI*I&w!7TqF4ejlOHc4ag@xm5(R|uZTYxAlaA7N0fr=O}%_7Ejf5f+^@(i zod*HIUZSo_kj#3U%#?>anqVI<%S;-F>agb07<@#DE#nV<05N(CVzi|4q01qKpd5S> zn~R0ZxAd^1@dtMxP`(8b{5**d-K6>ATKU%^O8QI{m)UA6L@IqU*le;oeH_?4vYzy@ zU?XI`OqK1wovCKyGhVI8p)`hV1uF`ARV!ayM%??rnd4PlR*MnjkVkF{7MF>Hd5P>_ z%5w+SCUN;*CJivYrys_5C?!W@`5rh7K~`S~JlCEBX=)N<1Of>1jF|&LS}HRM@MRcJ z11989%k=i(@udv>#xbl9n2`LWfZF$#`(fHtKh}Kk|%~U-zd8@>Il5yWUGOj?0>ko?37c%#(bBc`MR;PDUxZ)=NJAbC{%`u1lVetw#D3r8{JhV^7u{vdIP$ruIbij>$^_k`wMe zfgqcpJmCf|ZtJD6#)P+F4{e-s^+-6CA)Ta({3>}XL{D0aACh!!D#J&-Jzqcp-Py|+ zIm!ADPu$Dka$n>b-k+W%0<1uxss76&*#(i1Ju>J=FVV{Dy~U&q1mX&DSrF4tW2C{PMeV6tvbSBgc^ZNN=@W zj>D;7&}p#VG4k}?bjD&>sF6SN^j-d|>}!R3sgnafXfPN(rL#BTmZs>8DbYipf>Q;b zL4{C-ZUn!Rk(vga>AwY!qpO6bS0Z>YJu7JiE9%|FSL@Dl@>iz=9dwho)q*i`H| zLh_Rd4rXLu_6MnW!EkowY{|KyDVkI_zbljqXXsNLu_{=?$ayW8)mTdVBOg_;o+hi+ zY@0chQhAks49!rdS5YE{gK%n)jY&mu}hY(`9b6r9FMB_^3=P-@ic$Rdg{VDL}WlgZ1Jadshk z*~6OG0=}3L!WGrFa3eUC&%>wS*LniO_yb$^^Fr;($TOjZ)a`nP$q&tfro+!Il(Aoj z?j$F9`GXwI{vf0JgAB~)5mxXky@PQi_Xs}`>BlD`-=IiTEaLYY{rG+((Ki$~^(god z#tUD;pQOSCJjRM&8PBq49#a+8M-}j3E%=8-i#kE7cpek~BGM8%bk$1&Vug%wY(g@E%@&_c^w zV}A##c$Bd&F-d=d;3H7E9QIur$YxiqJb*)B4uINT z1mIn>dQo&8n10c)Isp{D0bnJj&IVP@e&7%tf?KB)t?}EeWn5W9b;Pq^cD~77Qx~&P} z)e~h%I&{j|ZMGkBn)`=I5ni)tf%CZ`Xn;>j#r|PqQOn={2Q6DyH0zL+B&FfJ5ITC| z{!+1)w!UomZmv)s_enia9~J9jV^Ldvr3xA&4;4Gb%Bd|sWg#^|&8?c#T*2#XvRQ~E zby(pF+;T)6VI`#O-ZD-T1@Ta2%Tp_l#( zRP`g`t!^Jy=Ygs|1Gu{m_Yy!=?*a_&fTcc7lRP`{xdthDz zRkNJ7$;cmH-(48Z1v8@|tj+>O%K)ASvyGrVz_3op4ixPM@HCjMpth#~c-P#$Fgg@W zS!bNlfT9xtE(5ciU?#vpF#AC@3jiwXO+9Na0!Vbg(+&4OSvms}Zyxb=(E2x&Ywuu3>dQsA>*CW4Ews52|LG_SZoY-He}o z5WNhFJ_K-FBToN7(Pseu0`ncH?JEFWL)5$jW_kxxcI6K>*x>MmT={F91V!%kq_#|l zA^{lu!ehf~38g(B<{&{SKpm0&_8_eLsNcaQy5AdWFHK0~8;R(@s$IT!5>=ECID$ z48TiR+slN(h5s5b51tTKSA(Lr0|a~GCI~3{5WsLSgFuys0KRFe-vQRIk0-RhCF<8b zicjJp&TXKoI)H;<4iJXQRrvv42lEQSuPCVTl(4D? zRkNIEUj*L?bPFgt0zmb`rJ7(ez-oYHpy*71Hob8W4T>%RNa=%nAE4+8fN@|>BUlHp z6U*kV&(4>z1A^IP{ALsKDBR3c8+9zEh zi0#7^jopEY^|J$odqBQ@jj%XxP18UgX@jZ2ELTDASvfy7yw1vb-5uy#bBNc}c-u1E zu0D8VI17%QXvYZC?>jPF))vEE;a@a`tJt|#&Yi3mBbpWG1@Q%2J?@>ejaq9vjHDTdfI{25(xs)qQDWu%pDjcY&cz zd8yd%F8OpT=PJXwd@=C~E1wN{PN!y_Zg+~sC-96`bx+%1Df0yvc*RxbKV0&It}@?p z$$xj1Io!4|?ZB@$NZ)QQ^Clb2GO-pv6?3F>CC0}P?PVCN5Bbx7`u(@E7mPu)`axmU z0Ti7AFcQpgP%OhHp-1%#OmV#G)D>Gf%c*rP{C4>(m!--iH0=eQje#&xv(v5ihfc$0 zylOszE<)~$K~>WL-U73aU>rcp!Pr58ss;fJ0@IhEC%_$GZX)Om@C%q92%-SBL(r>0 zRfPaEz?==LW}(rQklX`w7bv0~Md>o4ONSiLB=!kU9Cii6qG zcK_Gyi0)!c$1WX!(WIR*l{7EoTe)JCJ29juV8bE{eUDv2?L;2*nd9W4YA>@PO&b<7 zJ4%1~!-i?)a1~B}`OxowgAK_3as#S%9qY>evJ=b>P|R=pAN$LLrby{88Loa=TWW#3 zzr;dzhUJNt!rGbBmn@;;yqj7XTX4b6ao52{ZQT}UKoWJJ=e$KKw%$%4<(1g}m@H&^ z#(0#h`g29AV$LvVk7dCyS2Pv-zz#Zw%sL|Eunpm`TkC}U>9m?PYV_i2#&b0?8-Cx}9)jU2byfjHf!V;|?UU z^iDWxZez;s+;9Qpm4Q^=s_HZY0oA5}&Kh&Hj#}_AL0eN=mls)^c>&$!H8OL-yhCOV zm=DOD8_?zq+!r(emQ$L?Uv$qwOgv+wi|ACru*ftCfl&3U)r$q-XYK-!=K3F*`TdV5zYvRhDgKZn&Q~(c}Ddv&(My4`L$`xKfp*E{sKnY@CPuTG0rz&z9I7! zm|w_z=I1jb8`!TuWVy?I#y(e-IQCiLbJ=I5&)DZ&_Unsnh$wuC3F*pScd5^q=X`dF z%Y4QnV`t-T!R5Xr=GwW;n}BkwHLUFQ?)b{@)>y~5+d39t%VWmw1a}=L+B!_P@{0lNcE6f3I*Fpcd0j2~yH_l(>RYgXJZiN|D|57a%&pxvTdee@$8Crx^n?u& zy`Qvt%M|vMDWE~R#?xLi@M>v_?Ixtt*d9vnFns6t*rRuNThfx9&fu5qp0%}rC3jjD zxBYf{Q)v0ln0u6d&d59OWa8(%nGzy1)pOor0oO6w^EUbE?eP4uQL%G`itI80s{U3^ zQ1h(~c)!QA&;qv&7MjQnVuM9)8!WaVQtc(~YA zvcgsa23cuY7-Xf}AQv0CG04SkgIw%3$R##84RWb9hz#1xyfOi(`nJ4k^sxrv;@TLb zuiGH~OfJSC{oMu`U_-_RBKY$iwJi{L>q|w!tl6sYaDi@Ks!;c7RHyTjMSS zJM6eo*am}IW5iW?JMq5p&w!tUN^fCDtMZ<}?s(m3oYjDMOFL?mDH(%@y+ORC9W{0O z0q|prCd@&+w%$xCv12SAI|aptW*Z&3T<4=e+>!7$%0NsnvAs5s&zdA46$5$i3frMA zi@5pKjdEh%Xcq%2mY!p>) zqPwjVjd8ldD2c`>4PuN$V+>A_$;}O#Y%1UBEK1X5@DAgsOffyC^C;Re)#R_b4d#gV zn)02>;MyU7dLwtRjbj<1kWYH*L5;Z8?e*3O7+7{JzK?CJdcrsyse#J6EA2O;vjEQk zscs$FGd}RhwB0Y$nCZu+GNRbz;@&wTN&t?DVm`4N1k+Md>HT$MKhE>=#eLwhEBjKJ}5TLs=_mZ zw@^{GF{bd?wN}o`{~&U^ZI{j9y{^zSl)#-3&j(a}{1}c6E!vw8svTRw zrg+MuHSd;mMYW&uWXi$_)p*)eqZ1#bc-oWBDyjNaY_8QF%}DwqCORFS&X5Bto6iEY!+kdJmz`_6JOy8^P!{8i`Wm=8+n%} z*eM_NaFs+Q>fgf}RDWl_%C2|dT)rWHkVuk6^_eK@d!06w#m+>Y-)nhdqSIuN=ZJi= z$P0uYC-P#$i@Z$uN%(N7j${6vGgz-5wb5CgiThC}u>$PuKUw+JG|kUCc`s8;U z3zBH%Uv=VKn5A>49ss{-sdDG;{RFh6;!1L4YP(dD=jnKZL$G!hP*+iz{eR;Dfxh5w^fw&G<9)q zH<%F#`9_{(HKG6#CXRL@2M-ycyGku?y2hq^e@A-aFQ|V2N+H7gZLcG$wm~I zh}T^}s@vmi7q8aTw4c4d_zs$de|n<_x9UpeX-KcmW0Yf%r~*V+bzWW8h*-J^9dsP_gP-*0b};iST-89wV@mr}X0%B_6DXOEE^;V^ zeeg2Cl_J94M*7Sypyw%p6+f3j^c~O_lwczKLgv9?Q*gTl6x(5sH8~F+fZnL1_d7jE z)xKc^coT{h4>saaoLAVMdo@^ed>px+2;=U}<8bQ9d0?MR13ftn?2}obCuf0uG70qL zB(P8BfS#NK_Q@2`a~!2I1E`aJV*h`FvXUnF3w{dZPY2r2guJ&D3DEJgBIj zVLUmCSe?z)!pU+Hu{z56kZIOPno}gFwXzrJ36rdo0jIj(#L|}QM%%z>Df!bIOWNVy zBGg)u!RFJ0dJp8VSrK6odSLJN)L=yo$FuI=dnTu$6wP*pl{an0h`SN zIeO58Og0PT%)!ZKL3f)?pC76CbZI>2p@F$gl|HT3^x5gT)aY?^jjf;_53_pHE2-D- zz~58$gvh#4Huh}Xq5-jo&Jb(g3v@Rnm^)^QrS}27MhPa6nX>Kp8R$n)?bpr%3YK*` zp6YWBjd;2|`070A(7s8}m#m(r=TXmsskprjGGpuXD(W-}cqoWEogq5i1+*Ddd%CN$ zH<$M%?J~sJCC#)^r>61>Q8YWlkW$l9#v()NSkjxw^Hq?s$dHpLYn+Cg)*#jAOjcun zRKt1NtF$Rwo@_JQ0cAE@nH&amU>3I_`6g!3_t|1(XqS+iZST<=FKobx(i;f+1(Ci1 zRecCBb~@e&166$u@IIJl2!02so{6UoK~-@jxSY?zgEFA1mH?Z;Yyh<_0`RWcv?$sZ zjPD$j4T^RF7y+gW!HEEY*$4qe2LcQN)0bc@z#U+2BA5!`nS-7J&~F|<%`*I4TV%Aa zxeQ>91(ml0oSkbzd}=!0SJqGY5)Rd&dM$8ba1*k*9#r)!;vE3OfU}l11eXVVHKe0Wmf^qeKy`Pwr-$F(J?E5MCk zf@jx2(RBdzOT(%N6ulmx=LKQa6%^eJupP`(1djlG3g#maHXIvVTg1sIOlq))Hj(>w zAGm@q`g?G`?Yi7x-fV)+4NE?*(9spR{fI!^^J`_>jmHvS+CbR>`*1UbErKl#pNL$D zjyTa;nA_V^SGqtNrXo>z6C2MN<&0MCgdj8A9do5Q-h^-s72D~Ok3J&BE3S|^%_-{s z<&vwuyhnQ2N_Kf+PW;rXR4lRmJ*V0Yg zW6m1&8BbidV{C4}BL2_JfVmZ4h^#@9+f*=9K$2T}Q*I9Tgy;p$klWRrZEouje+@HW zZcl)Dgn+uWxG1drAjvJSDL02Z&XwC&xKK$=s}R2pNOBtlrY`|=+XUu%P+c3F6Kh;o z?*^w@z;>%0;{s?}w!hKj3>%=8!{H8x{OO&ZxH(R}o!^Re0?kF5qZV_pD1;yT=6>gIjH}+P`doRu0GYH2>$xK>wMi<)#KOz1P%z!nItiUA-B)Odh<_u8X_ckYK15b(R zb^>xNkTxiH0jK7oNz4Xl<#6sc_|4H|HOgAW!l}t)U>+o3y?iV2SRbgatGn=CZZO_e zceTZUfNfmUFlH z*N!INqpWXPIO~;nNm#W4i6*CmnFOlqYSW7*z1(2D1)|Ax7jQJGyTm1|-QWUFn~Scu z*#NB^&OPqdJ1u${w7G=pQP)SnY$2f4^rg7j2_U)M*OZ&XxyRjSPK%ZzO$kVH>kH;2 z0_JuNm<^!1Cu~kq^OxM4baNr+-)$+sn^pe>q!>QdL07uApte1 zy$nkwP+h>j@Fkk0yFsM|qDj3AIGWU*>JrwDaRH|d>gKtGwJThJF*xq(ZgvR=KI#I9 zAsc@+h;L$^0!qXiP05%t)ao^O9@u;lVB~qm%fWX0q(B@l8T>opuV#O1OOeR)W~)Ys z9dB#KjhZj$(Z;Qs^~Gk~s#*7Ge&eUj`$!>HqZJt^N^;|+%{XR*&$dowk|*7zSs!TL zM-knZosK=63i$l3{0G6bn5q1kt@?peEhdA_CaYVF1Di+I(_$>x2w5*vW&3|&)Y*8? zu@yN~mtk?3jp7=?cvZ;f&xnfwhsP^_R*QQf3?q-+7Ay`A`uOt_Zvv;hd~e*J?`2Xi zUl|XieO8P4qxUlFvg)2*1fw5LgVRIc|z1@bXRcK&#}o615J$ zseO-(_5w?wmdeXF(F2*u!zJ!m#+`R$T!9idDJV+wP4qxk@@0}@9aHerS}rA+LV5Wn zdLTRbA&It)(cWo_CY)qUyQIi9CP~^Lp%Erb*4fE)l9nj%hv&2+uUg1~Ol}fW1QR_z zSUN9>DdS;}_mQ>tSXw{dOFk)Bg)~XQZ2YF}?TgfxYn&sip1>(&R2s)r@R&r_>~u=W zq|l_|2uP*#UDP5aW@f*!imNx;{!bvvzD?}$x+LT!R96qbz= z+Ua5@xDcw%17%A~w9_4=x2+1RUm?tqL%4SO1UBm+2u}g!%0XYPmVxsM1TTTIa8%x2 zC$WKk1^kgB90JzqIBL=Ua-4>M@;X>`JWwJZbLDLO%0q4ilWd41m0LY3!uPOswbomX zH%%}ND)SGPf`Ij?)~(qD=OFttLD}PRhof3|VE6qF_%l%9%p^RCZ*x#JXJE@2)&8O@ zAf37zX9S?4l>kqJ*-EeopmGfof{GcxWD_K}0Br)5+zoIL%)11S08C$t^I}lRc7Pwj zd<$y*GC*lB^CD!39!!q}Iv00SZ0fO;;!kgU)OLYfox?8h2r73khRq|s1=`%`0#MIf!y|kTUngq4y@zRG zj6C_nxWqXPyJw=#r*5wx_nn|@6q=}`oZ)M)LV=)cKA5IEa^koKa4m>6NHR6}4e%F= za91|jXj`-)tnxtxEv!zoBS+Ez*_lPUbHY$C*x!^oWR=3jjY^G0Cc{8f3eGHeJ=q1g zogyfOS%*rsy&C%h5S7wKsnvk1D1uTRqtsTw2SEiZY^jb?{XMhd9o4Gn2?DnXry$!+ z#~G7t5QDKf`FX`^nC!PaD)%EY`!}dsCZ^xo@Defn8oVF{s+N=c-x_$OxEJ^~Q1k)J zvA5bx)#1~j{_pWcA48aOE#8|16@3HH8_Y=r?*Lo^=0Z^0-2g?;;%7h5>!4z0Q1S;P zWgCG&B`q+9#)271kP2`un5zhK0p0-f8bK*Q!gY8V3Y7Pd)#qDWI%tsj_?27Ld0*I& zcvRX6;VY)9++z*MYgDlb)s3p6)QUGFf0KZQtD;8=y;m%{r@OJ}D@_)qNodi1$+T!U zXw(s8EV?g`7QF@ddQifh67+$efWM|JZZ2iVQ8wy&T*W{!bb>czG4%}4lOlne zf;ZARvVH^ni6Y!Fd{eFkbvFQ!(8J!6OTjdtvq0_SD)P2mL~aMZ6_odttwAC5W*uiW znX9!mS7%pcqZ-_jJS zDmPd;=LS`~jrO`%?5;V-w}+YUm7(5VI_$lbG;e$9sP}eaN3Gi^NsgO>;W;Es=b-HU1SuXs#IXPv~!(2IIujA zO=1dNUe;Xb@>=rkd6`^(60edb+m(_nb-B1%my3-q(BKl$K-I5dsk5}RFQL~<{^^ap z#Imc+5*xgS)_jevd@|#oBYDr*6jl>K?OvhmT#@|({2i$DZ6sISO#jsfCS&l z#X%F`;^1LKxu4OvIQRz47ocKhCX0hEx51?bNEQcE!Av6H;^0*Y6<8gtX6{d+*Mt{`du8^Ejs6*GpkfAt+epz<$WZ9EQ{x!b?cPA%*k_-lBbop89; zER;iMxEZ?~7Q@?eSky_^9p2?8#P0YtV~;Qc1EXPN(_k58#weE;qhxi_QF`}iiJ)o+ zFx~O8bl3D*P**yUf|ks*{e&~HOE^9<1$?K+aL}PoNM@WkZ{uRK)8HgkL}RkLF#cqdHGzhi^G|K`Wh>l|%(&C!O}9Bp{b(T3M}hIfuOjMI69(a*fs z9A|iq_xC_>6$)u_qC=k>%I2vAMgGrE|6+j96LGWhzJrTc&+>H9L z86}XT4B6Hu9e*KCJ1Rvwl36fVQYT1wA`R_>KPAffIF^V_STeV~K5Tg}brPx+I>OS| z>pYk|!UsR_hkdjB>5Y`8vM$#bvMxK&CANXm&{1v(GqCJVY>YtZwKi=ja{e6D5)Whb zRO$V#n3@I=A7XDv>6TdL*Q<=#Hk4{2gqshTfJRTrr#07W8cNw%S>*AjH;zJ1+!(LV zp$>XbD~z4>t=T4eph}@1Fg&`!q=$Q&8qw(d(;MfaBc~$i0!ey4RG$t?l}q!2658x% z;4eXGc%E}%9CKNI7w%GkG9&1?t5337?&1Dzaojj$nAI5puOr4DP*w~e>256gK-r9y zb0Q=s0UZxY-)b|UNg_y$iU$|jY0=mv{cRiNcBJcNqF~pAK&i(fwO|z)VIAG&C zHbe{KHOgUDN~X5ZRC;bxe@xDMS ze>sekFcZgztwunEZD{`307)Gb=Nz~a3 z7pQ@ZxO0J1#^ao^#kUZqAdlP@EG`8J^Ah(%rhGiu4di>7)X(^-_nptf+@j>&0BLe$ zTVkR@N!>c}6C?^kNnI*zGL+P1!e&BAT`p`y`L-Y%UE$+-te;s0gBLOP8|UHCA6=Qu zD}LJi`Rq@rG`vb1jSyXxMc_+IlaL5OFzpv+RaHh1pLRB*RZE)Ww9nZ)tFsxBo|eF9 z)kOrEX;TEWA;?WT#57S!6G?lbj39?0C25zioM;I_dD=Hj6O|LisxvRUhdAHkzM*1RV zxWEx_vSK+K<>lx!WR-Krifu8H$Qhv4CkWL$BCg@ab&fql&q#Y zQqwgh)0WOPjQL&clw}Icq-#RGSnJNre4v?(rQlpjd0S# zaK!@3<@XU`s<8ma=PfXc>&U3!>*iIWyQ3)@tc!-$U>vg{LyZwYrGCZ^TwS zaR$oUNPX7owiM=MQIB;x>t|TydxZWQl)nRuR-J*HQA12y70k?5>I2(;*vU=D)pU!F zyBL#g%(4dPtRlng0; z5t8jdk1*w%u9QC2Zw68>%87i(l%L|~gl%XIP!U6l|A6FdptC^5Epl)y2WA673cw3s zo+HQs_#Vu+ppsGmr)D9whXtG;UpN-h!pCta1}Yo^&<9K}g5Ci0z|18$4&V+jw-Iy% zcmvEnko{}j6&kIci98?EEuW#a`a)1dN%3%S_(+2K714_)1M~$r1%ylJ?O95FGRWB8 zrw%ZKojUt$2nruX&`QKw4k}_u@lHs#0No8L4GcD^I8ynxMVYKA%5bs9PN1~RhOW!S zWBN99HsbV;!;?)V3sg~Ui7M}EBXQnfaz@~_9?_6V8C_vH7gFlVDh{zpJSuq>blt6U zAEB&UaKMRMZg>w<@btKyhs&uFE{yoh^Ezy5L)Sp0A%65NFm*vh_ zATU;Sv~WT^@P-b(@zrFvqecEx7`PzO!inkodm5|7afo^>s4B&+MV1Sg#&NW$ zwjo+MT$2_B9{(I{Or>(CBg;vS7EVm>-_uwvE<@Bys6_`?!R1|DfLh310%;K^#G@Rp zNsEZbPk#!c#RJH4i=%}T)A#o@R*Sa~^$luqqO0KYzAiv57SZ%=ICfUs5Z%OKTPS~e zzs`LCdo>wH>S+u=WGh3cH^51t(rq>|htMcQMb>aovJl?+%^>=>4d)+Zv{zqKY{rURKyq+%z=O9^;QA45*vR$EsTdc z?aVOBW~`ONHTA#-tO|`}Z`q9}Y&;fuO3%HhY;Frn$h8qrnOB zD2Hp(A{mXFV6~WsEay5}I5B;HPh+*%gs9h3i}PFsmoIjK=Fz|z&k6A~aZOsJc>HS| zEuKS`&pKK-X?%ZAW3~7kQ4djzm9B!z*SG++;1Xpjm=T~ zqKWNWvtbeET8!oLyN_%~V{&YhxW5brWycWQj}8_La-|;(a_1D4m&&K(j%P2JtF3G= zX6RG_vaOhDb`Wi40Y6K(qwE;@0TS;1rk`pizU4^4KYYgu zHqV;Hv?rSlz({oKA)u_kSokSsWq%(8n<-q%n7vF){TvQ^D2$`9w~2WwguOvI;xN3g ziFq>wH-JhXwB^(AJy0^biGP-wt%}&cxm4V1Bk(GBx`|-sSX}H)pHt!Jn7yYL;0d6D z&(iT`p;aoNlF!CfsE3a01f>d-Fz~1E!WITp=mU5f%wq&UAyM9oc!U&G#55JT2(INe z$H^PSTKCJrzk8+}~7iUnBb&C!=IF29MofKNI18Cc=G8g!`8W_bswtnTNdQ zfb3r_ugP1iHP95?s2!){jK+WXLJ*sy@a-U)kgGz=v>txoGr}Jv{F&rIv zV$k-+psHN~&5K8Lw)8QrRM<2uIj?6+j=8#s!%`2*lGCeP-F`O)(09<{D^S+m^CXMz z%>AU-!>Su7XCj4prj+dvJVjwoBg|&Fa>IK(gd~ z&+4evfiq#navhhGfo{wt=dw5PAQedZ<}NThK}C!vebe(6j%OgTL-ek`rm`LtISUz8 z=rkFkoe--YBwc3$m~o&YMv<u)b<*C3hfGirV@TJj z2kHQlt}_YD1Oj%QE5NKJVAt6JW;;l_j#E%bZDB#S>l{Y#zd_P<^6@}SE=amgFEA$) zuoM>%$VU1T=`Urm{uzP=%{;JeTRRF9M3w?r}xXfh=@ z5PqvAucL1Ry-Eqrh2P4gWcYh{kqlHn77{sk{TI;dpoYs>o44gaZ1BHu%mr%rjD7p< zH1^B-_pwR@HQdJm^G+)3*ZKg4HmISTY2PWMEbc=*K=T1)KevT!zr_3aBOK{~8ss|q zPdOR<^&r;1paPyA)%P~$(<+($(yI$z$V9*7l)Lp~e6#^1?Q{^#hXkC0(?7x88j!S8 z4=~*c*iPqwnF%^FbH7^5%tN}M1bRy5S0mC@OvQQqc`!Q(nE8)jz9(QODE$;&2_%^h z1~U+(O24#?&UIfOWXW}+SyRe^kX-9!jaK!9t=|;HQu4GdIeUAcQ+HbVdA-_ZSAjVE z!>t@d>O5;E+!8!rz!9$pb)GN__r;%=>pAZIb=l3N_sMcdzlPYyNRPX(n)6pznQOMl znW^ef#O1-Aa*FI6J^4*JD2Ugr&gc?%%32J?pu^mG4A*5Sq}w-h@&6jFdAf9rOn%q2 zWmuyqb4^#S=(@_?iEG2$J>q5Fc}THJ9#Gai_cUs)Y9nfOpw5@eA?vZ2x>gGZCoWWQ z86Nd*iodLa@f$IhE$hNrxT}V9gEh&!0P?}>nSmZpz!A^5+e#xxo*(N`36HR_oWxzKg zm#O6(bdAVmYQ1pCWol31kjvDed%tn^5uz*Mqa6u3RL_h>ogcVRsC<;grVNn!RRKN_VU`{A1deLh@Fkr@vm@r<< z7y;4i_r6u#y^9y`&p*CD?(==_^VDotojP^uoKq+C>FTcS7{h?xD7@Kh@|EBt%2 ziaCbAXCr9B9};Gp+Sz{~shfFD z*2j}2g-squrd3zqaovA;9mIW9={{%-?Cas8xf|zgLGx^5QD3-4O+H%ZEY}a!9K)jB zhn`)bADk}AQGU>U<;3;Na2+z#gCi6^k&Iey>NvTUmsebm57)yZP>R8pQYl}%2#i7X zQ>vOlALDv{1a2(Fb#-c zs1acR&D8zvI2 zq<23kJS@VX^d_n3*<0kVNGB(LhEDk{w~d%(PL0O@Qsf{pTX4<&uM<}yPgaI?t#;3FXbrA;4Oq)>f z64?4juETHI@gjOiUK;RkV%!+2zAJFUBMox6NEuAj7;V@OI?&7V6H<0I`MtG!1yd3^pEhSND*sH*Pk$+wUXg1GVr;Y$$uM{Y4=-HbUCT$Zj)8#{g`~dOOW=P zsCTcIZgS3|(z}J)>|}I?)iXv3e;lvYiV+w}g$#q%vjrI@Va_`YP$Z9=d$waiPk(_Z z0f3?tiYcfoX@y_Goe@xcWDC#^6yXPb4R~q)(FHq~qOWQ1H=}x+wEq`z_pR z03}%TdI`_lJFq7N6n}FRB=r)m)!)Hk15o@5<{7J(jOxN4P$HoDhoqfjT{}jnp5$bl z=U#$kyky)oI4w=F+0jFP#4|8JX&3ZN%VU%ix1>BAo?;&f?y_T$avfNf0m=>svIQ5f z6FCG(@+Z_6P|hqB6G0gVYy_aTsSNVF4={HKa;FK z(=wOgLTfzDrcrNzz{dck&!Iz~KGv)8O0Zhf?1A7e`xYs`f@K$=>{B57@4`|DD0>IU z99+x-lru}kZcx?(TMMX2LGgojW61faLswlU6`QDUdn1m<6b84J0ug zlG@7sj zj~Dg>=I-Q5S)Eg|9swm#56cJ@WL?VZn@e%sEb9hbyZ*hQ@Mn^36O+qP$yD9WrQ&nc zrfHP)z};0S?A(Hv$e4qZ>9i%;W#HL+-xrpBUwFST&L@q{eP4KgS+>qxX**_`(OXtkdDACwIVs{qll2I84mwgz{i6dPz>X4AI zUnbiD!j^9W?_#LfPSG2b#_Q_z^l$}f_b$LjGnygN(kC7_)uhLwBPlI?3XynpJdi~C zgww{GbVu0o?cLePlSqFU_68r06rzlfqYl!G~XOZYAz(Nj?l3WX6yAIn+^By0l9 z(4%&C(K@8Z7{7X@6ter$qGQW5o>h`#_LlH|M1RnQW(*0J%Nh6M1IXU!Zoe zJ2IN%UxR%Bt8k}CTZnM!K<>)?612tkRi!{yXI3E3)plQsUXvYzw3T+VY9ROXqd(?0 zdtf1u2c+6-?206ihcdaot+TI&am5~q@jh|A%}+_j)@Rg1+9vx}YQ0gaz1iMT2IT3C zMM&9VA4BAsOm0ZF*=JFm=Q6WU=ytn+qMy$!0J6jWnYz7@*&N8Ocpr3N>?P?fys22i zdcW-a8|8(q_{WsDIg^tc-cCHIC9qdA?+1of+JK2D_Nw-g75@+q%VV#_*CVakis$75 zd)?U$tk#N;f+fY?h`k7`ixtmj`@I=oh)UL3@!!}tZ%HltTk-Ae>Mc_G5G(!!EAX~p z_`v6t?6|Fh)m!mTSf6*q)=#kFcNGD9SJEb1@uz4??}?4fu;O>H^R`JW@&?(J@!!Bk)7w**4oDomfo~&|=WCd!n%D16eFH z`!$$G^dH%zo19!wINWn-)D|RjHgNKzPud*ZGSH(>#i_QjcfwMlPivb&by!36nUq_= zmUlHyM5DD&A?ldCS74pd_K1XlT!_?;U*X_bRE5cJ^3I2CMLSrz zZG^3Z$Ht-5$mWW?3v)=cqvh}!b12Lmj5HYC=vBJoXl}H#72haq&yuYU^pEypa|`{Pt<=?ue=EE{dAxDdOhrm( zYIUE$Y#BYkate`%pcVKPxt;dnHF*Z@80~I3y@ib%H(}#!qatZuCT|oQq=)64C~T*B zY#gu3CUTW`bt!o3tOU2uq40A2W^!iE(A0WZZM2t_;I26oeu$}@o!uG+VEWPCR?aJu z`WAkr(Kvf*Ih#bCr5H%jgAfS=O^|me8@i9>gfNw$|M4qT;3V6a$CbYbD@C-g<*)_w ze!&55^k6H8rj@rFvqiL@l`~MJ45gH|=pat6Zr+btS-Tk zYV4uaKza!hwx587#Ci*ou-`%(#tsrB-@dICkUoMW?L0I{tgkGp)%FT(FJcEfZ$etF zUDyIhKS8?K9V&tJ7o^UR%&@VMf~>KVY>-h>({*+oMo8>PNm*|*I$i82K{nabxnnq5 zkj?g^Ng$&I*<$CC?HEC}+2s^4R*>!X>l9rt$PRlK+u&G1cE!Kr3Or5_tnpLW4HKje zVSHYcWxoF}b_6^=!p zqfKg8vlY%2Bw=^T1TsH909ml#zYyamc3#R^z??*Ef&DopafcRLm|ch_GWO>**9-Co z0m0_EEj#YQl&8Rk8B~5b;6h<`L@3N^W2Kbev(P{xxp@f54N0I5+n`96Oq`)`XOtmR z#XwwW)nt+mg?Z}~3TNOq&=c*G9?oeGmcT8jUb^j^hU-vx8gth{y-WPuGL47`IRtmQ zv{)vrEAbnaLvUwE_;d^%n}^`eut*5^r$+8KoZ+$+3fnvcca9JwYV#1>86il*<{`K< zQjlz$hv3dALGo=Lf;&fNQ*zSgA-FRpmIKi+B($_MHdY9v*5)C&GcNi&%IsqE5ZoCr zTdq2rhv3eHf>N;cw|NNexQF0255XPx5ZvY=xN}mJFXg(2;7*U~vr%d&d@d&hJp^|a zh2QY&c!^s_o~}CXA-L+hG`$PtMB_XJcP@_}0wfWP^AOy*LhBWTJvamH-4K?}LvUx1 zsB3Hyw$~xJGdP81=8Qw#SaaEQ@erI{8w&3R8NcAjr1BZ;G7wteI){DD!i&0sCWqi# zagn#83l!-PXgwN9xF^SN@o2Qt5a;$lcn~JZ5@LN^ z&1V>AwO&V?&*XKq4kaW?zUT<9yEP@dM7sAL#qvv}fA0y1ffbdE=?>0&0(s1rEcuT8 zcu%01SVc*FYhY^vIaI2;WZnM2?o}zZB{k;?=8$v0lDe_L?h8cOCS6KiKONZp0hwg# znjb&GIBNs4h3{|jj=^%}ToFhd37MhrSo~&A#ZQI|l%dF;L5cXjQzFH_8VUB~_NY*r zwuL?NSRheBaMWU$6i;FP|44R-6c1E#<*{PBZq;CpbCW0w`nCS~<0c zp$pFZH$I07D3z1%oSxKYC-5%;Wvr}~GnlLWg5U94C!jnnI1Oc4xsh53FW7n{t_u=4 z7z&sQJfAdHp2JfA1=f!Nm9#ReKpLnVALJ?qRGl&&GXVbhl=4jcM~E*}#Y{xLpqamt z_k_Q2Kh_oUc;1wlp!^Bw!M~Tv{yuN|`@HGz^Cqkhf1fw~ectrrqpT{)kQDtsK*Bo!(_({rJTwp-)o?4D4NtOnTpBg3#tXc)aHL{Y87l$Rya9O7 zymo_s)b#WmJ!(oGr$+0X8h6uTW;SVWt6B;qKON&858HQgyj87dB=2xlZFg|ry ze1PhtcUTbV`9$$(Zl%E zv9T9{=wW>7xad15QxD@)U5|7*j8C0V@EX|kFh2Eo5j{i><5MRJGF%ShQ%{P10=7{m z^?6uAYLDu6z=C1MN=Vnk_|!$=1;Dh9m$-H0`FZLRkrS4~_|&E8Uw|tbN{{r^!6_`$p%t*^37m%GL3=RV zO*-HWV8Jj2Wl;IdI#5AiFa_sBT(WR+1;=50P(0F8`S2|D3+Ha6W(TTp{jGSUXVO0t zJQn_CpO44Dsb5>2ajo>6Nu{7XfOnbkogGq#fH{)}BR?jWF5{`{GM+OQPdC#ph%$AK z&&v!ZZypM_?hJ{X#cXH%HG_`)vsR48{xts?m?v2BSXA?rsL283&u99bp;F4c0ffs* zJS`!_8WINvqoxO-U>pNb-x=ykS;0`$dEP`4F3!KIWKBkb*M&<|0zFf-Oc4ZtkRg<{*?1fa1M4k!$tV~{XRKO@v$yXUOBwZ z_RZ7$WS8goYzUp>A~zS{@dz6JKN|vHpm%we!>OwIQWyCp*O=tZF7jz|pE)sjXo;l@ z_%Ngo9)-~l2Y(k}?&hDhVj65CUrevBn%)KYD*R~xHTu4xBHH79;i$O@pr+h6R7F!B zXGhHdfR2Q|p$;r+MkH$L0Xh=;hI*2?G(Bo&1IjQC4hhLza%(hd&H|L-O^QQ8GBEFo zN6m$RG6bsu&0)?X5>e9$P&QNevPk<5pQ?WpP`>$c%dA3$3TLx=gG2cSs(zdsH6H*f z>aM^?OLsD5NT`7M%JWbGK-rWj2*4XEBKIx8R{|>5ll!*Iz&$*aK_d&IW+*@k zLgFaDpi{J<+mLtzK*UW_+D_o#0V)#Lc;ZeE6;ba|&7c+lYVSaup75p3)||H@?M6UF z@=D~C_L-w{=T2On07pMV9L6>SllYmbIRMe4M3Rq8~f`C(Ak0`M1((1EchC<9|B2w#(PJ|*o5%D|Y`JZeq^=)l+$lz|aUM$IoE za$x)(l!0*>NYeov7{3Q)U}Tp;Wq=Hf--9wRlI2ko1jxYnJtzZXSVh$I251WztTeFj zUqScBlKUy!K(HJ_HvE;|K+BmFwAS3CIcDJgoqyH}E_-S@lY%9j zJ?9|LsQ{f)Ck1OrJh)}lv<0Z;ObT}9lscqU)C>ZsCadKvY!@|00mO19tL1#%K58xih~-RH%W1!V)a>bmHk-W2 zG6%r7rf?HB5Z2V7#EyEe8}4oZYFE>O*q}qX^HtxIk!vDA^RNq^X zvI-#jE>eAe1-=7NQG1D}??Be2y+(=0){9IGwFx$A6Fh}n z8v)t`Pik$y0%1Fe(gaT_u~lCv4k+IYIWs6nW~@!x1dEVzJ~_|?&uVSo1NsI@(ge>b z@u`EO=5c^F!E@RK+5Ms>4ge8N@SHZmco2?JBAVbiZG!tixC>A*1V*7v@PanMZ=mi0 zpa~|?8xep1(F7HEHNdU@`&#{q{un3#t^NmE(|Qn&B2lWpO^K^PxE;U>eyF6cfqqPq zRPZAuMh8Sq7@!sWC|Js#>kmS2C8B~K1>2H%6$nd|hzfobJb=W{K-dN-uZ60kG2?0_ zKU1r3KQLM$xsLDq19&fqVm zv?OsE2#WzagTI*4ku!L+LFght3t9U&r^uQfY9Uki<`kI*L!7f;(Ucd!dK-Xq_A4o} z+D}0Ylp_J!TCb)=S>2xxgV_MIwO&ohAo0EHVUqw5(OR#j$n7DVZ*^K_m&h{0UiO{g8*Gh-%iQq)RO*I z)Yt%BO1CPp7KFAW&g3TG9VH$C!r>(LB=KD(&H`ZuiG4_XPl?xqa4n!R$yW;SM>lK! z$qM#?HsB^OYyfcnzsNF&qPIlZuTJtT z`EN%}Hb9l#p~Ry=7)+ul`<)WEf$%P%Jb@~;x3h?bJ@%zQmmC%Y1xlrL(D&G1@9!)+()RnkA&320BY_d)Z8Bh;Q@e} z`v^7nR#Ri91fb@Aq#AWl&HYI2tsu?)C{1}DtoH+G?nkM)e~c$T&jZxlk5((pnjSMB zo+(5u07t92zp^N1?gXg0AFbxza9zv{1E{$lt>*st{V{VbKrMT;$_$qeK?54pRg9%x zjpg1AF|!(=#&WE7?3W;XPNEpgI3*@F#!MWb#xh=soj~YFqFD9>B_0LBC_rWMYHjLe z+S1y4$7{2k3x=}+*zh)7h>qoGo2)v02=ZG1)#-EllT1L74gH7@{L~ZiN zKr_y^hyMhd1gK5^7?3IW3J@*=s7?MDkSRFh=a@+Ys7>w+$P}ESHn}q(Q*a7xa+juD z57q?$+T^Z)Ou-NBjG5~JYLmMIG6hF=qgi(e5jMFykij8+cO-5u0jN#x4#*UI47}TW z0MsUT2V@E!Qy4eB0lI?zqB8d@kDE3CHPk&y43-Z;>s_Aj8tU%>nS!qb+fslUg>kzY zgqKJZL$#Fn69_+$C`J)bVzY|4$p=&>mS`Iv-_$09YLf?np$7mH>*5P6vj}}4b{SK< zya`Fm0IEV<1vkeFzl8)*!BOIoARIxWsE|=$h_#>-Ht84iN0e=h(tRB48*fSwL86+2K9k={+2LnGoQ1wiHl zlzAf1jsPr_SG$(zO`l!8>9drkdPl$-vPhNB^-l_T9H^#xhnni~SH#U2fST$ZYN{`S z@DxBz^$s=F{jNm+1JqREMb2A0*Hl-lsaiBuc#$*ZPOx4EpsC)irux8DadRg?P4ynN zpix(&l>s2aRPRw!edqePc^sgodXJiF=}mDH0;s9pqoz9XwzwGxP*Yu_GOxKSZk7Pl zRPR-yRbG$Q&A~yt*vSKGs=LAV6F}|c!GP=*x~z_y{Q;GCyA604D#SnOn{`^*W5IAV z0R6mep=G}H1V65VHy~*pKn1T?!9(wkn?nIr_wg|T{uanDK7PpDG^>pPSyV3o(*giH z{>gwWs?P#_0AQ+~xo8R69Nw)9D zYR`Ax0<1RKuzpe*Tl9VSUEsVY@Es*`w@r$HL>xY zi8a6yt}J#?Bd9q7#)^@^Rc00dy)lNr?x6&W`n$S~Z?us}0x+#WZN0+?Z;W@z;} zDht4@2kk}rmCAhLH*qr_K<2BI`6Zwm05Hk(U5ongKCS;^P|fhk)Tp z&m*wp1Z1wI>IOZCF+STipZ1q-UIc5Ps?do+)wtDk&9WxD}cJ+qJw92<3 zK383tYgcbuva8#j=a`=W+S^+#T`Kb(vp=BnDYvcKH*My3wO+@9;b;I%s2+mFgg#cG zkAwUGK!tvyLI)Q(W&oh-`E#`cMz})nq)MEJ{$D4@aeKaf42xMz zi&Z0)Se~BDI+3LD&dTi@8+o!d(t8 z)s~eRXtAdBYXw#SEoQM=%(bl@a~VJ_W{LK0GlUL^1Jq)csKrdEam+A)TFer)m_R$n zeBV}xIG9V@3niVwQRqW6)q{Rk#*&rFQP@_KukW(9XR|JNH2l){-bQ(bY

XwNI;h)&vQ*@l}ew8q+6aWpTwHi$6fsRQB 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�Ia z^AM7HE`@m`hD5&%>d<@flx{1PCpumyux5nN74)C!1N11N8_q>Cd zbw6?#%<2Igqk9p&&k#aEmki%3-M>1R9OE1h4PsKEz8?<7q$n)NhYI$~t0)#TTQLtu z3X{HkEn(7vT9tJ7)nL+r{}Gt9cnkRnnD^_E)L>KVkWJ(WL^K1-{PO#AvnUgREl52 zuF(TJmxsAbgig9Q$o$b|IR8$14fCqLW+iJASQP_nQ0SMuI&u#suS(j^@_rATL0%0r zr%(0gxV~>2>beme@Yp>h>7^z2ttgASz!pRY3Zf~fYh4y~9iSQ9ex?S_((!(7HQQ=#rM8@j)8&xA!;L>(^d55efPjMx*tYDRS({C+OB2P_~1Q# zCqPU89A(kc{e=SU4@MPeN2!>Hmij?BgS8N7e`o^jgF&GE&sQYS9vLRk4q@Y9x2`tH z^w^Ip%Dx=KHVVIGuVLO=d~tjn^l%*l9DFaihX;t0>i+Z{h8C*1CcDjZ9qbc1#X`4I zon$;F&2a_sGmthG#}y>Ah|i1L`l&OPI-VdJqI9Y5DFj*aseMzF@P4IX7 z$blih3)P;F-51X>zq%Bnd|jFdatfALX8N#{HV+Jw?3PU!J|f1Ae;ErUqDDewi_gFK z-9NK96DY!k6#RqMVILoUNiNjrzBl<=g$*HUlXX&wqtw~=rW>DDHXM(4myaK^W+(Q0 znkjLmShwp~Kq(Oj`-(HJq{a{udM052^Y6ZBcjPCxRvqrH3Xh{OCHl@h^0-LP=f)jZ zy%O9}jrq$}1*}LDyT;;x!~B+zyr>IrZQANj zMMQN&Js6Bi%Lu7^gLndh>F>93l#t?tJ13@D{VFCk(<**v_V`uM=9yjXe#t>fTZmLk zq*&7&)RGoCMBt*vTs(C5`6luTE!yjw4*NwL{LDxEq8)zb<9;HgQrNWks!wz`bW&$Ph3*sogicLWHz%Tjn&-!}8dBvaR z#DeH>8-0rcpap!UAU-P90?)$88mmO&0V-S|x^Kn)(pin#e?MB==Y8o0sY2A3@kH_? z`e8BWWo6u!7?8LULgcx39RSU#ka>FNfn&tS!2TQaREV3i%`NP};CdOG_ z?*0AjmTJq}^!N9qo0AvZ!x7w_`yP5esb9Q%XOznN7jdY?A(!jFw)w5D zw({SnlFA$^eD=WUWRi$}5++j{C`oJze-IV&Bwh&5 zh|G}}T!f$@NpKOah6ER}Fd|8C5x$iK7op99;37O35?q9m!r&ql++L5N^TpiskKm(#D#>zhnq_dvMZFiQD|A)gNzS>Z-eetitevaOR4zN9VdLn zuiB}fBekK9=42cjJOUoJb2#L&iWo^T;QE5bI9+@yG%rT4RY+f`1y*p_cYlHp8a60? zSe7jflIP?L@PsoNG_A@Pi{dTv}z3( z`ONuAOX_)E&C*b#auebG=zeBRwwl0b<6w)~xqOki+(xK-ctrqn8%*VdRfJ0wO9Y8# z^xNWJ_RALgZTCQp>(jGHgsnMVRFMN$^d_2P9fWC)qsz0?vC1o#k08+?GI|FYMXi9S zQ^|wuy-itp-h{2FI_>KfZIu+Ma36$Mi|$V;BPs9NVs-ll>NEKC^Z7Fu9uj%n9@?~p z{i8E@_K#*i)PaB&*69xIypDAQ^BUvOE|s34E7{nvc4$v%WhOF;mwP+;7cTfGpp-yA zw0by;fJ=sx>5uHs1yBww>Efipzb;v>YTX0}YK& ze@)B3ZE*P$Y(*&56scJ%q7S69>wjbLU1H+R>nM7U7BB$-E73xZa&G_u1FFZigBAl2 zECJTB>ldR1HfSo*hc+u>4jh4@9hP zn66OwNK*I68?kP87~3oAZ>Za_%~uC-8+mwu-KbNLovsRlH@T8UvKqsBBtYP@K?rok zIB8b6JCy?C@bDIoCX)&*Y5@d`dpj*bW2yK>kdOlj)ji_fN?*6YyY5uo`vkD;&jZVVmns9m;@>+OcxJ&j zkl0J};B+l;TBE!jr+~Z~R7KIR1ULol&~CJdpwoGPs+DMnuQN;*&6P^tJPl1~;~hD8wgKl7zlX?A{aFQ`rMKdNSD zj%ju>sCLS{pY9jW_5PD2_Z`&kNOnr?R8-wm`xH|K?JynkV#DuBL@RlEF*%Dl?7DzW z6+*a{UBTr^dxjv4zckV1wlfhlc65qH*3scFiruY>SAc%!B0gWXIjbt78a9@lxU%vK zEs?IM%w=?Ra5I)j`)I6FdZFAu1%Rg;GPoGj5xw}`KVi2b75DqH5Bkg=?V+-6*Mq*& zkzIQ7b+{q?uAg+LBGy-H`X_An%dX&+W!6urIhna|z{cS_Ej3z392gkXLK+IVpc>^v zB^QU2f@ep00s8TieSx%#qEnK}(W(Wh`F&ZLmc)%;PAp|R>4+%v{aFRtY&$+iVjk0{ z@hUycxMe=`AjWPS3^Fan@q+=0NNFH&05qo)$5)CB*MPCkB%6WfWa&b~pUBq9nxuFF zuj{p`9g^NF4*6-oWc=N1H3I9cBOK`w%KphvI|{Jz3iP|rMj?fjw2?mkZ1xQ)@@1%} zLDZAp7xd;X$GUDKhv3sX)a&ii66`k#1f`%VO{KcKN;r)ZJ1vDW33^w-Xt)`NdT5`Y zx(_8zyiT)F4x2(|?OAonls=ct=zAG6uaG8MA!@7->GRW#_FqWe=i}cGIv1>h&@eW{ zWOnL1gC{d%YJxbB% z{RTcr&MkDe*=<&h$g)HSjzI9Z^l`l9+|J{u4aXnXl`PK2p8$urol28E9v05+R1UB4 z$OLYew4Nl_QW+{Y$LS)4Qh_=GGzQgMXLaU|T9X|#VC-J^VcJqAlci!Zhy+r5Txr)i z*qj<;hpZC;7J3{=sPtI_xrqoBHOpBRes!7{jKN%{OIE64v;jR75qz-V&t;yMt54L@My(E z$WXrVCyACpwXbp`O&nDT_w4>!M-6nb{FGnV=bKMK__tU=3D$negA#IM55FwCe-MRS z(&Z+d%H5(oA{PUObF#R`Tn_{C1|?m2%349`Y_PKuZ6;YVFr#in0O9c?{`?BAo0WP@ zPlUWaoq+taV7kAv!;R{3A;iQA*%2^>f{mw?9}Ly{FZpU^gg?YxMya~c+%Y8+nYPK! ztmLlOMnjORM-@8J-KDd!u^a`g^(!7=vPgWQwm_XL*z;v4lzp9;=uFy-0n46I%tXKq z%m>CQ?xDx&$wXIY@+#xcl3R^UUwfaQze<)q$kU4CV(FDEae+YwEpaHvYX6FIT}^f` z-AiU~wcij9nWRY8$%Jej0kZV!eYQa_UpNmkLYAM5l-fwIh zul(~pIc49oRD00cD{+tTqAjFxaz|~yQv1K|CD{Y3M5deDX_(n0F9jD&l%Tg5#35l> z=nDdGz*Z8hhh@1La&t(HLDN@hFPFx5n%+5^$wtwuX4y17OGDLu&Ov7EDPKBX=99F1 zi~|v+e_)556R}*RuV*FT+RlN(xMxs66D6BmG178RjX!`7Y~0t@)^&mrx?Ez6-?*5xn3t~3JCdGZ2_K&dDBy6)5y=&>IXZ#1Gh z8@S3iIePny_R9?SYYHh;O8}GKk|jrtHV(RU_hkfOs5+MTd?Ve_1q8A|K1*ex|2!ta z_TS~Un+*L*VXjEzl|HrE*IlYc*ud3O_%IEe+ZT655plThM-}Uey3k&}G4m$88ZG!) z2kt(D+I)o2+pjY4_SIMK-L;eC6IUxn_Mr0orx$ITzT9-nZ9%_ZpeVoTmfd@HT;HSo z5=7pdx1h7ZJ#oSle~L8UM)k1i9h>_Wu*$1CLNPE<=J$ z9ry@`Wj6cta-j5bkSjS(h~_l)K5k{^BIs|wTo>fZqCkg{A&rxsr=XI=St1=UB8&Kb zoo;(ibT4oMp`cTc%W3X+ILc$!*4yXXVLWvU7OC+Se`$NoNObuVYklLV{KR{F)ei${ z_VH$Di~77ZcEow&rLAl)*yXJoeDM{2>utW`c^c?uN7GSGCdFPVxurrWKmqzJ7aH6@ z6o*m|5*FVKUn15mHo{TXagrTa8I($Hyn|KRXHkU#twsq_z-UTI27Id5Ig zuToJQBhuqx2(7Ng6+-2Sx5>le&-zK^y}H~t{E@XIl32`(!3^m6?(Y~vtGfgWf0s@x z?@YS=Y_9u;_}tr1@I5yLgj!>7jE74s-EOF;l;lwyM8bV4m-p{s8qh9V)A@Eja! zzytIUa1CrF^R@-G7D+^P;48$nh#t?kx8X4D9(!i>v=n(pbf=WbuHqLBP$}!I zB92+dlSb+#UjCdvPk_?x7e40CBdivm-R2i|`^qLigCLzN;Q_-NL`cW7E}V^2@~RjO z7H=vY<0|!%@=@R|M3Hj3F`G9?fOidAMUs-M=l7>DR0us$+U}s&|2&Uhx_97tTXGRs zR!c!gD%`)oT%@=*+V%`VtcF3o_~iC@z%8`N`>!GbaR9AK9X2{K&kMYBzjZ`!WRSlEhq|uhZLN_K@nzgK$MPO@+Jg)atTK7inNZbz zxuQc>3mcUeikKu{TO)gwyO`BWI$&DZPnPfM1L?S{7pk;^8g@+&;!1P&haacL0_8v)r8yK1mTwci2(8F$EUF#@vX zHa~7C0r_wsAXG+F>oC(DBOpozBLY(FZbxb`Z2o0GX{*vWHGBbd5mNOO$1isOJLsUs zPri)8&l+YBB9{q}C&5E#=F2$jR+C{u=acD82&146Y@^aAkdwIvrM)v1G8l4MEXOVt ze$o(uA@)ZsUdL+i$DMxZZGPcSzjQD7p~b{CjyK1VI})L7x+Y|0{2(}))H9F!6+3+E zUO#Jf{N)wq|C9n}4{heXt&0wFU6Map6A_F*@31X8ixNX0>aUYn7M z`F_S7zEZggg<28*x~-?<-A9OvSQEbhkFS0owWe_{qvM%$ReD-Nsg9VmN#Qu;F%72y zRmO7Kk@*~y5O3*a-2JIS@HBBOdjkC@dW0G#ut^W+`KJ4Q%?jVN+M^+=Sx55hRkT79 zcus9+>(FJ@h4%SnI>}ZPMn@h@&E<5VdugETH@PRlDWWAME{PcmV5wq7z8F)q2X`-2u4s5yRsE=W-3 z`Wg}B^jp>allRK_Od=nttTOaRyiQI0m$|YU>mx27B$G7Ro0tB(DBbp@$BmmIyMfLW zD&6gfn{I1R*J;`;uerMf*{(5thaW#4YuovNx=j35cll}h$Uc&%>ARqtAs73l<~d{4 zr?ch_w&f2_el%8uk=%2K3Ey97lrure9 z%#y1NWv%yoUJNZ-mjbm>j+NV z&GEz5WHcE+XQiIb>GrEP`13mb@@;n1(e2kWW(DY{GGELad&t+yBz(zGhAyO70vQo4 z#qtHR8<>O{=2Knj%1QXkWtSF)X{a6O)0#PKZM9u8SJ|%kzi?}=hy#{TEuruzPlkAMDurt^kA^X)F?Fn~hc5_^4@oXcEv_8om5jM(C4C#R_6oJy+ zKaOP+&nJHG| z8$gUH_hi(@C{LtT=>?&9Lc=0u9I;q@Gn{1f7WiJzX@7?Os_c--(amI!peRC*tfYuh zn_s++W_hEQjCp)`1DMqItJ{OgztZef(h0GAZ0bq8J`MZ51o9rDE9hIL#=PA4xY_P% zIdQUC>h6QXbJsR&fO>gcS3fua<2tk@ZuYUKg`zQn2R2DH1f-suQg-7`7#8))VKT3X zLINo+IFkB!x1=Yx+`ur7$?R8Fx~}BcLCY1==~^wUKZ=`+q)-cgFA9s z)uPQic3#`NYyXY_iCHO!EmSDl3>IW{YLbaU);g$Afr_h$!jZ{)V&ypD1!YhN~P*XId#=Dmf(Wy zbtRB41$bDNoyo5x4V5d|Loru&UiQ?9bXzJFr@MNad*hzeX|9j;HTU-Q#J#DwH|9Jy z6~DJn6MN~vDIT5-_0k<&_foN~C+j#fS0|25%|T|UjO#j z0d)@*rx&pJpKnUG)nA~U#O(-t1{l00-up0<7>)>KvLsDuvAiZ=31rIH!cmR88!UIR zuhczWNRtF9yjzY0RO0R?#Mt@1e3h1hbnAf&T9~{aP}H2nVuw8xao`PDjD;r&CsL^e zeQ2ice`EJ(PYa{N4UoCXnk?zI*_S32o50>l(!x}hqsQNfeGg2a_V(|kYMG^RW8UiEg0e4`e|=?nOxVop(% zo}vs8(zuI@uHl>-%MY?UkbDh#SU{2E*Vd;Agt^fn6$xY!_y$B|2b$43j{5q5Emnb)i|l}N@w(s;?+ zBQjV5kTI8N7NN?*k#EqqpC1a6qr4G5pf_F|`od(1SiyQ4&+num5IR+ z=CINmr#y$EsvF6sUXD2tWm1~sq*SIK!iCzMJ=$qnx~L*NN?n0*C0ZQToB&H-EcsRvRmhnS4ODiErm>1Kzbm zra5nN0SXDc2FcgJ@%&3N4e4*v`=NL^+Qrsa`F#Pb9}jm#C{-b09_(QlzKaiq778~& zw7_6K*#Y)xRRgT`6U$`8MT@I^=05uTRh`a)GNMQEYR=HE*rg1}vI0FleZb;3j)m07`=aZdK z+8(HRZbaxFz$V&vqfnvnTEYbU)L$#$ta8IlcKzs`d{wWB@U=5R!*R>74;G)@hf-Kh zRJ%K&1TZ%c3X*TXQbMumtOy1EGG`F$Pd`(z?j zD>SX2JZ1;Eb(Ih>JJrB3`a?AuqUdEg|3bzlG5<0SaX1zp%I6FYCXZGR1^l5i5V~Te zKez9XBy{ABJMVIE3Puw~@+#+D=H3&>(l#;{7Pl@so8DIqybb1+$eUe64ZdEhlVihUC%!Iba=Lj~bHfXchf!Ipp3FgZ+w1SWwGBnNE66uk4C3VrB zXJt^EO!mLEF+_#d5p-vqq3P-1hlX^@ZgE&Htkh^N=IoTL=a+gb-R$QT*0qHxkieIi z_nv4HN~?+=!1c*a;SMm6(m$1A?_a#$mm*-vjFX;KCwPf~0#XxpSDOh#N3*Yfgy6R+ z8FViXP4bKJFk0Z{i8?sPO%kC13{A5!03-=R8g-WSN|?^{oMeiUC_d5o9I$H;HZJPw zI;TzyvsoRrSDjRhw&+qS=Nc?VeOHP$AXkvby_KGR1C*DCD4eFw!uvF2na=u-&9zE0S{^=;$aquJcCGaoL__Lj*888W7^( zy-jm~$bvnE{mX=Y++%G|$&|FZx0lm9(ffTS22Zuf$7cTm$ba1IU(}c)vDq)yr}j$_ zWc><(Vh$rUUkzwkF$*5H?Psdi#+&h{ z#I9X#0_@%eKyLM_V+>P9xw!*}DOk3KlgY~|w=qStIi5>KX`_u+C#;JsZ)~{s)aFYX z8;Fh43Qvi5*qDO?jZlXSdkU}Et`=$vDl&G{PxS%EX3U#9Cj6N6iOx1tW^-YJ%!2s4 z1v9rD$-BhP91__Y9&K>yvS52wQzxV5k*DsbJVT={&num}KYMfPz$pbF|Km;_=0XN_ ziDvXos2hF5x=WDqkU~Jhp4es!Vhm$1-kli6V%3^`h9#3dyC(Y#4@jQrs5AH8ZP{lx z>sgH5^aeF|U$*#<6;}jLB7)IuAZ*)&Px=kF`4axl6?T0Ogp|{nV@9>`4q5=dOg(9= zYXshr-MJ1?E#_!PD8@&~N-a~#7;uez;F~dm#;lak08o}b%&vpa=>)|Y-!Ht1f#wx` z&F0|p*XH*1#W$9H^zPewTh2NT_*uM=^WrX&@%5_=7n1lkWL+7U&)e=w;$;&&Bynpv zXGpwko(zeXO-W(AYzlG_t@E#e%-im|ZeLFi9zPbJWQf0n1K<|imcVb~yOx37H}h+< zt>T_j{CnOl!}(-<5BEEzmQb!Du^~`d1+&+sB1DAWC(L1GCRE3O?Mgo@fkaDOOLjxu zk~2y_1B<_wq~}$Ycg}2_^aj;RE^Q`-BDwrqmm8sL1%HgGy3O z`0dhG-vs~HB!{ummGLj|UdGq17&9yiJmwIdm#?Zj)tfVY@P7R48ZQnqKv z4Lx+E?HXzL0KMCO%y^{~-_|GPeq?bV^6rTkN7h4fcvhXz-%@D1T#Z?>tYUB6i@-J9>K)mm&62h-5E^pu29{ zu{Q+0DRduVhYjCzgZr#tJLCf1u!DFh1RCJF2yZX^A8t>!37%KJ200&xK+HUfXA<@a zpXK5U6e~tbEik5ekts0YX7h*e@r&keL`H@9H0r+jteoP(NPbcLMKOuI=$T%M{V;TxWCF`5(&_4t{0mhxe}>p*KHnVg9#m z%3sUIv&;DMZ4T`QBYZmX>~9~OvDc@AL;G?TQ|lXkTR{~n;}O7M=rWG5i1|gK7Y#&v zX6Lvu^gHib*f(Y0Bp>`OK)JJ<)m@n(hj*led1WC4=L5CK6_@hV?DX~3_K-E6t` zgn#2~8?Sf03Nu&Uyvwh5w>EQG(Y*F(P6QROF|^f+xzNbmDw(_f@=r$yVC(B;n^@cJA5LY4heXTYCJ-l*B9 z!c~=@9j&bL=i<3aHU5HTlN$nq%vK7;>@8t5dh90rO{(|N+zDQz5cf>kp+;{7eUFVJ zr6nkfK7oHlKgaq{&$+cJ zn3HACd)|Dk8&06$VHYU*)Wi;N!EtwnCyY$$#TJW4GO?fjtLny) zssh(g>ugo=vkQRP3SY_gf-2IV=B{ivI-t68tV*C-ZSKVX8mCw3F5!I@0dC%jen0=0 zxLv^QJewC1eBa)qfTRM4zUD5MN%ax&vpPOV`>4vWs=(%TMIYZ;sKMG-5}tOa9OU(l zioU};{Orek#VJrgdnkJQJ-O@2H~Nazx?Pa<6slNFR2g5fnJrz8hS1%@iTE6CaE!<1 zxLbO4g)+$9BEEeUpCM|ELfFGQu#+-Ma6B1qL>W$|;TSz$7?0-)sdEIKpPbzZ-pucK zBCQY$*Eg)^5@()yI^~&0dEOgGlQ#|xe}lu%vwQ=S_n-J1XWy$=`Uc2T;>H+|&-R_jd0KpwI756t20$?Fg3J&?{t-kVEKYfF*JnG*PU0g;V z(#rJbK1l4mO83nokP7aRm77%`1zV>foqNw7}$1 z*K6^JuZ-5#tx-4z+I*K%fLoPpZYDXp!_$(#SbU!*kLk67?+hHs|n&$x{8R*S3zUn3LA78 z)HUPFE!_f_)jKF_=Rzz}NKUCUN+L)uqK#6Pg#a`rp)i^I{B`|W$F=gLw5Z5gjDa2Mgzd7fXe9PY0bV2$S2rKj}x8R;h# zAvD@qZbWuQr=Qd5=Ms~=&CezJIJ_77V;v9&QZ)l6At?xYW$AAaA+giL(Mf^^Kp8#d zs(h`yN{NJD8=V(^6&i(@_N21{VJPerH3^SbtBBhz*>VeDdAymeXXQkZ4fR7goLFJ; zi)!TfPq4Tj-tZ^&Nk8KmvT+RUyn-kJAqs=e*!tT>eQpt-1_*0^kXDHFu6fMPSFRDO z)YS*ekpG-`DUHgL3AKrjnt`2r3bpju*!|}{D5#3v15xT2jC0C;M`83`X^Ipf!Ffng zJ9hh$^N0f6>PxoxVh*`?h=T&?q(8^)d`6F70ngc?zcX-$Z1pSJ{c0qo4ux|fUe83R zhC~eB(w6{TcehfO&r~SD>o{dB7hXMtAm!e3Z=d?}kHq?Ti5mZ9-6_MMSul-QBPLQ| z|HiS)YG2^iVnPWKQ$QGfMNRy6fb7kF?pmLbT6`ZQS4n>!H|`4+S}7c2&~rX&ykACP zYM%{pdn%a+;bp}R61^u@Voe>&p}irZlu|vo{iL0@xx|w*cK^Xtsx?F0CxjV}1wFpP zU_2ByDmDu2(|ru-Aq5uB-={AUayD$#<}28%?-ON7FY&AYjh`F+ns@oSjlF&i7UOA* zSk9-T(atg(;p{_x?gk+kwk-P;xoQRhWIMJ|C4^zlpyGtcgxzeeRT}4^WdB|ZHC)B; z`fLjyf@`mhE+pJ8xGQYJ+Bp3zQ(hO%R;h*li{5F~w&Yi<3_F|GmDjfbB837Btb57b zS9_8>I%XT(0Cw;(XyJ8!8sewT*z4;$hkV@fI;OOP)TLxREU)b#@zzg)toHB z<<|fX`~8||UIiGcq8!+`5?ua*z~TN>4wnladJTmurADX0J6jS!Pzr`&An-P!a0|B> z{e_|M`&i!5a5(HDDZ2w4Ab1*n$>DKB%mav)`Dn*i{9Na7QQpH z(a+l|3Lp-qr&C61vdE}zN-o5Mw;Oj7PKs-i1FK3hxXzHG9D%-Zt%AQnSO)wG_qRm@ zB;efaThl)xFU)%+gx?*_6;o4xF`Sq}JT8XNoV&p<+2|Lo_lwbvZSV`)^>=ZLU(~9w zhoIvncmZuNtQ-tr5}v9ux+~;VA?@b4XMFupKki{)-|fe}VAuc8*OMFkt5)))T|dSQ z9Z85(^c-KVhyK+?zsM#gUuRu(0l%FakQ*MO+b>3sqj{=}-mZt~7k6+;1dw`=i_oy8 z@QgklRYgmyALh|A)ryu?Ka8uqRj}_wN34k(^^i&n_$4Hr-j6Opk;&Si_~HEA7(~Tt zB_5;oZ^mbQ{YGDdGL%Cv4$H89X2R_{u)e-GcR`JAs`3mzEym7de16eVBr6W-?Qx3KkiaoD#`_*S>6&#y>7 z3j{pC@2_d9K*Adf78(YizQ@-wWS9k8?hQkhyD}mX znAXVGeA<>*>2Yf|Xa#=!btd^${yLvX(3_&<6B&DOp+EU*78<{(krw)-?e~;#-RA3w zk^O&I>KD<*MNJi2?KLusw4F{Y5N-2Tzhr?wmo0DGob6A%Q|-1yc&=mwpd8Et-z@7Ux!2xzM3MAXld_4?Un?n8)h| zEb^57l`yAHJ@3aI)g@(z3m6n8(!SDed~+a zPVp%H?6%H>=_8Nr)C-~hG{NE``U*zU#*36sFmL&ZIE$uE-J9_)UvmLV?lW)CB9miB zw?TJ>NbDrOW5_KVLM)p-JCVI9XdNy%k&qJD;$&3cs`)-28s7Sm{EyKf!SAxIPr&TC zZj0^z;)1ac?hLryty>7a5VXg@|*PIOCA@ts6D zfqS;;$XX7APe!7s+UF5cP!Qsx)OgwM;u!Zio55QJdyFVt4ne=K9 zU5Ly>enxbI@ZJm(Ga>ncyRdV*`=m)gCbwlpx$oG4{G1Ly-wrm6=QUkLot=!s#{ipO z2IN!G2aVa~vu$za)YC?R>TvA54~1Z81Tz| z=nPe$Wu`89WmO7i))-~2bCBY3+H$`oxlDS5=M#W^FblBNFu`NL1-L)mjTR!~Ni?*| z;GO&oUkhN!AyKEmF4Gfa?Lg5@&`tsp5Av292YE~MkH)JXAsH-sgzwS?_77*kbfkpL z4BAYjUd(C^9vRdelt6sS4*HcS3_iwlVg_PyQ5S!*pYVdwC8+kJ#kK5{>#ciBQ1F>t z$OX~^5!~4KrWGhq>9I}r+R2_UF`Fc41lHt>`nB=%KoHw#3N_Ll(J#Y5)J7MpN>;EB z+JMu(R$;}n;$a~e_DC6^#|63q(I>{! zi?pKSU@x+W33Np0+#6cs_Hbgw`8K>ID4`sYp=6uqETN(kdqU*qRy@E!e{$fPW-%rk zoBT8m0nn2|HmRfN*4spU=@gLtP|(-zlfHH;nk4scN|FulZ2&b?aR5m~b8w-upc2lX zxRR1|Rt3V$>4MZyS(1F4;hJj#uKD;mLL?7J9>KsNYOV2g>wLp^eBJN*T8uRw^|k4F zv`n^e#)aBB`b(t8J1Zh+wE2!3tYy!)efj!Q9sa9?7%MnkhE+)I}U<}fokplrgHbUSk zR~msi=Swk>PclMkg@Bd^Nyg(tNQQjvP?e`7K(NRqm^~~fX>^*i*}sO}mwr2aoy8)A znMMoJfcj>wpK!=GeAX|5ZDuP-DZWIVAdV)=AlaJklUULaKZ1tyF}_d{onPh~u0#)x zdWb3KZ+!$cs9^;Wf;hIW=M0ExZuJe!DKMpVd7GByt*X_X)T#-&yqk9ThR%~GB#P9q z2BC$TBYLU-ly8!Vp#-wow!@R2w%6`aw?5V5o77!~0@BO-T6oCU3d`$&g<977A|4UB3SGV52}r-GFWEy{T4X_&*H&E`@M!=I8`aAo6Ny z=kwgjXz4~RWIGQh5xR|&^$NGYm+LWYmM8fRO?JvJVhcUu7p?S}7P4$)iFt-C&5YV= z>a@c)*kp3hqY7O3i)f;c;CN8&FYNG}d$6Ax@a>!!u*-?GjN$c4KZ(3WH5`NEB*6B? zo~Q}_T6PJHK+7ntv8D(ZBX#HTTidoKeX zM|MG1d>UQTv3{R<&d(qeAv(GlFDN1*Hx=pMq|ZlfN6gmogmoV-LOc|@h8b~_rX1#E znh-`W-Km63C*^#r5$K1FtBXG<+yj)VpEEdlmyk^`r*L~PG(wKSpunaE-WAj^?9bi9 z+>u?HeRZT@Uy=A7ak}ArVo^0k7hqRL(xfl`xPP%plTEj>FKK5!vNF3VFCBSPHf-{l z%Xr18{^Xtb6gJ2huL2RXA^m&Id~`inif#8f)HU_d&D;QlQIqx``NV9O)+olb>R|ac z84>=FR-0T_;h}9n#l5meJlXj_^~rog?b!(cOWD*M@9RRi2j{<%2Zlw4y%C@>K_EK2 zoFT^nVUb^nQ5}OtDikoihBJLF)AXbt`@%xR9bhV;@=plYU#R>pC6VZWZ|U>%(;bjx z>inpnj;R#LmLA>;8ilvI6ZbYpWq1h`U zxjK27lsFuFFLS+83LTODDB~|P^?dEEer!+OI6EWi8hQ0D~gX2gcH@@cl@jb!rW_%%zvv-%HL10NO5ye&T>SJ(=ay4CD zq$aC#SI9An6iHmkF=~1niBp=J&6eyd<`MXf|DnjBrO-L)`a6HFFhkBAN~pmLOZ=Tr zutdn^C9J^4N}uO1yUowN0uKZky8V9EyAEw@JJ${x14NfzZ z{}^wzVtB~l&nNDz**D?TO2)+#5W0-7d{`MWOLzFDPTxpkrj_xBVZ}1T-TF4<-1V)Ag^LP~&2jN_Cwn_ShH(aj5@do5xb zebKSJIOv%uzC>y}&7@q%*QIql4CilPLL%+B;$w_Pib=BH1RfXl8sbhJoMTATdBo2( z+|eGaJyEX(G&Dy)D*_5x9SU2s2*uuP^;QM>S_Z!0v4A|~e_{ph4(07~NDWBQ*Gn3c zedxLUT_^~l@1G?Bx!750$MF^W1IT@a`y2)%DXzP)UUe5LM;S+|@DUM2ej{#g|D%cg zov$(-^KhrbpRS|tX14F2za`neQ0c7y5NAW1%_0J4Cj5E1Ca6!jD?!q)LRl?Gla01H z1!nk%7n3kptf(gqvC>$|>=gjRX9M@69$!J$+?^C&Zrh~T?Pl9J?5kUT&u5lVzC~8> z{{i^5ka!&fY)_6}O1@3WEO)2w-ERPv#ns4XK=O~s6RXf3=tZcHgu*o{hZ*np=Y7#q z`hJDuw;5oO$`yVFg7!Lme&=&rzm8Wn^6I$%qjyb>RF60Nen0{YkO6w~r-xW@L5WxO?m?eX1)!Nw!cPKIJmB&`ofprzal^Xsg4b#N=l%1d~>5?6b6 zE}xvr-I7*6wNrn`GfUI-(N7-e4_`eNlKDDLf#nL#%#ybl1R`vy?1a+uG_I0@ZQeQx zx@|s5HYlcxbhMk4w=m`BuJV(}9K%qx;V0rLt@j(__b1ie*gij#`ItklL%M*C#bsT7 zuA7IgC8vGdz75Rgnh3(irBYlnALtPH0KPyYePAQa@mZR3x3uwUm0GffZ=u-X??y{J z2`$l(DLAOJJsH^tlb(eEH8L%oe(@Gu4enA)-GJj_`a72dMs5=Xz|AJk4QdCvIvF1> zzC9z}Wj&j-%FpA~brg`C(HR&EySGS%V3Jww15 zN^D9|oN5xsQ&*FyRnA**CF5x%<+i?*aua&`L|fcH-YeG!5dpc)NZaA+72^ee(^hWw zsU?e?P+Tm0`ZR>}HAtN}gzeZ(68P6J)nAV6Bj**7PP#ZM8k^t^JRvN=8RH{kqP9M6 zl561ss?YNiH$lWn>cf=l^r;bwFUp<`o^L5_2So!CiiloOQQjz|RJ2>P6}m&gp`Whs z40TJwyPJT(D|V}dnd_2VivIs+?@i#lx~_X){@UKhe_;d?l0ae<2HT7h7&B_X#seUM zW5+f~VB--1F&+`Nabk#t?WXB%B0Emo+neB|Nv8xSY0{fCxNXuQt?drCy=_Q3-?q5J z?YsBWkk{V6+t=6o{jIgn(f=<5#z~s?zW1D<|2g~Yv(FyZyw+a3m(#TJp7pMcllJGG zo1Nv|dQIKJTumyz%6^$}Z_Mff1X&HH<@hE8N}P^9PCN`&^u^?i|h$R##8+&He#bWKu}7D z+Ni@tyB>x<_Nm&%jIp))WF zTHmOh+*eOYbn+JvXEYB!4I8cL!$hd)qI|P4sG5`9aN6;5{m89SK1>&}u`>_qY;l09 zjXD~)SyFRF=@>(p7H8iOOHZ_Ma{UdKG_n+WIr52?!Z#WC^AhpbmX34o?`C^%;>c@m zHsqjg*eyYXmvNxA30Ry(yqH;KmgO{*iXgekbQWy*YLVtFQ!9@a=pI>4KU@4R9fF&3 zyb?=muN=&^6rGYRB5yhhk`9olDC97IP~%`*qxKK(KciV!chE}obL=(s0G9u_VkxEL zG-KzNH({kkAV>>y-@-GJ!e$`@nzblPRLk;RQrio=)d%!2>q>)7J~k-3-Jr6BU%z^Tk?#f1726^dl@*UtJtY&O9~M_9HYr{QhP zKOLK08eVXEw2Tksy`kq81j?_4=B1IawxHvnWGXvH`n~fd4DI~4Vl^rv}_S`khhuv?!``|uO*%Y^X?ta*B zD6%J>QrS5oL_G`u6UZM^^ zraNtm0>pn<>{*=^9M73`GaZPr_K6KIxN@f3dV{ z2v%n)-tHf=Mu)JCg(pX{;WOfi><<^C&8z3XrQJil?dCqZ6@XyEL~l!B@d*2!?>ikQ zZ;hQ)tDAbR9~gmwN1I`XP6TaI!T@b8> zwv`oINdv_=Nh_ca=!(_NW(>B+o-F)na0KpQMHl@=>{%ZdJ)_BS0)QN&)7lVV>fZ^p zkVqpPv3@@#w0q@=xJu7C=Tbi;$kLBxGO-Kb_(@u03xXne#iDEY75bA$tyV#l$6{?~ zKj&Ld=3)z{z(4PXUbOLuUD)B`kb%mioeFwhDG1bhFjGNd`R~U$+JQA`50m+ZS#PHI z#QOKe`Er!(HDO3NU?Ie=+rgmeKmh4X{=Uy|x5gfomcQYpWJu6$kI8eWvv!yC6=I_F zjPM2hbjNG;lcWy9XLLs>kt9)xN`603+`ATeYcBk^{Ri{AwJGnA5_O(F9WM#ylRG0i zJ1RO(`peUUT?Bzl&j!dAA$xCK{;>fgtooSssLKU~JmmnzBFzCyw|+kCU&cgVo9!Zg z^A*LLXt%m|^y@`OO+4!I+RME3P-?l*;3Y}c+~QEhckDI+86LQ{Ob86i>2g9_8UVAf zEwj;9=!4A@>ndPAPn20tr{b2T0B!T|r0Ll)8>9 zM_VIW5*XHMNuIctCa>|ux<>k^pq_{b3<(z+KTp3t9BXwN zxb1n~1sY7s-V2-)z*27@y|6b<7nAVanbVcY$S*lHoP`#vR*75>bFt|%QfpV7Xc96b z_9}gUDz};;c>AQ9%S6>bZF{9J(V-+Zlj7x#2ne;`A14}iTSH+Q+KH4yVt_3x6$D3= zzp;NsTy9p4<$VagyMeUBEZ|)2{*wt!>}>RRe!9b;2$xO_Q~I;x z0~9fpABRec{MKf_V86ia9ZEY72!5D_UY`A|t>of*PQFC9VIvr-0Xg4CM0p75xeS@Y zoy{_xo>k1w>dIomo30=R+#qsJc;zXgzP}jfz@j8-ykul;z7Q5|UK-sCnwKTo76uU` zp&!JH4ZzbolZ{?Lk$S6Na=14USOrXQ}EuVL^6_s4X9R zUoS;E=k7Iw_5}zu8iQHr+Tb@+UZT-!r6~!A!ynYJl%(1HHR}A#cY0Qj3w_Cq(KWif z+&)!$wLc5rw7^!DTaY&pTetf<$Y#NMmqcCu$>`XlmLA9cONv5$2Zc#M+tQIF5a$LX{MdvVNRDDt7 zd~2gZUpTuDN>=sV9aTPR2KDlr_Gr9OQ&zE-Z+#xV_NHHDUaRK%&EVz#U)=&r-fVUA z=Pa89Dlknyf=l~Nu>fG5ZiRW!5Xi$^bmq1g_mIg!#>FpRo^<&yTx>|_%-Z<%1_^j3 z`P50&`LwYq^sCy>awq1A?drAT?Ec#k7afZPrOKd8M6LdYw{B_2ZGD^Fcvmv9Q#yl$ z(He#3>em?bcFYvvPbLg!uf7fopCZX;CdS}ei2Mk4-d}^M=$iDCT%!e&-Hh}q63|R2 zQf5m{BzshC)NY@xeFqazUS?WmY~;}n?&TE|FZ>lrYjy2$-bwz-TKs9)))x`+m@;M2 z!vQUNTU>VJmvghlVhVG!-FG|^wNAJ{+Mfe zv_J;>(K`u(oQx;SL2XZ*doLe;Ihh|0nM%%Xd}2dhGS_~+tnF?^Sb!unq~Qpz?t0eN zmjTa9g6@mc#i^yqGY%mC5 zDbV&$H}86jqM!Dcjf#G!vi_|9lqoi)@NpaSXKn1Y;mLAu7V6Ikc1V(>42-`6Y%!F5 zr&ab9?a~Xc9060=v$yOt&0=TLF1-&>0L)3fC%kuhR^~S=e;84nBzgwuU({cONxNzA z^S6?>G@Wq9W&=GW1GxX#U9bBz!CnX}~0@U;*JVp)BOtMROR6?Hq?CxY5hB+DlVQ4iBf10Qi9&cghYg2oe+o_ON8={H#b zrtNW4`N{}8I*Kxe+V(V^InHy;JZ#mxNhtBE4anMhv^N((Ki4qo~!emPE$yDYv#6C#1+Ncceq)8+B3?g)63!kpA)>mhI(fj-<98iI=c`ec3@)awa*N(Py(`ci1XV3bmq2Qn!GoJ(>>ADPU`HD^n=) zi&FCBAoat~M;-U}imL@Ci-<>JdaDJ_FltG?fMZTN$eqgxEkDKU!*birMKoD)O6so} z+^CuVw&tpB-Tf9&rnjM{bd)Vsk)s_HNk)o~1bIEkqA*-jj9!*)#Vi~r;fc@MC2R5V zccFHTszQ-)5si(dgZPTS^K4Q!8RN?~X{d9CBVnPFZi%gLi*qm*+D6Ao>*G2U=i#_g z%H2L*?+CvRn7N+v%i6!|En#l7i)pq9WYF&2x|OWF@N!H>ggH&SS=~<$na622aj#uh zAf;xN%)B(+PrD>%&hc&?<#v zwy#)Lrp9UE%2K0Z_Y?&x07AFc&L~~n$V}m=5t8=Vs?8(bAD1Y~IjfEHN4?wBulTl& zbf>QI13a4^o7VtwebeLydK|{3BN+vW;@cEG))hAblFGRR!h~HzuZkzKX>9g(TK%vu zlsY3}WvV13QgJA`;P=NV?F7p;ih_oNLnhBQqYlaw+K}BS|IDlhpse9xzBjDUWv8ipL6dWUmqMeqGwZcl9f%?D6n2Y7%Vkt?uio^?%y17~3jl#cHE!?L?OYiQ z!`)ae0ro6>0AD-E@V=wRGhpouYheum_Ywz*h@|-({u{IM{aQ+kvIsLt2N?FKajYEH z2}@te{phck6QaR$S^Y81&|7ao^}Z|b#X#(rkE7dQM+gY*Ziv$!i}jls9=@?-=TArSn? zB42kxfY*fx*BGuNnOk{Sxg|-wa>|q+te@PF^<0#f;Wh@6n#>8rj%yt|D4ZkFe!wng z4a7Od``FF6-E3#IVG2pnsU`Wf;cbIp68X3q#(2OA@rS*G-mtZP?XY6{J1OQf} z4x=0dmcGjf3pbpyQT&cmd)cSMbcit$htD%(j8&KPd_E7F#W8zwE{Q;Q3E5me`r1c~ z3NVV}NBdu5)-71_8;4EHkS<$>WJcqOK)0?URPLnYwzR(kLFCFRqg=;^QWsWqQE2zAFC<7 z)a*Lf8*!por)y%DOI1CIH8&5rVlS~a`IG&$LTk&F`J}Z80iRQ2;pDr9!mkia!WVwx zUCd&bSnVzth!fvWWw|di0YFW=tiPJhm*QLagM`VUfIeXT0s1J?b**prXc_@mKxGsF z1SAt4UwEn{YC<1>E_!J4|0pXOr|I8JG)_ej%)JVNIe!37#Yt*!5=`^J-9!8Cz5Bp{ z;+UvM_dmFo*cp%4DPniV#?j1^?X4%--o)D_7MaH& z@SK9&+izThI6?yS(u?ezg2Akm6tS&W5OrL2APu|)2Wou|sKu)x`l$WA$Oi&}W09QM z(-CtzM(k&5c0aVtMDQgJfl?rHYFSd&2-pJj@R}c|e~L(O4;ZI-^1$||Q7Ri=f#3}{(2AYio>kapj((!rF!}>6VXfr>+g8)NCi#~$+ zi%k0r5%-#KU!FV{vrvUwY@E2GTGs=$a2P5mJ`nAPE0FJ|lKDc#7k)sbr->k$7!HhN zVFgH8L`fvt0ExFR^!dv-D2M=rnS!;E5?(fp<^1!xli9nw^qG){gDcT0_$4U47Uu z66wo(_G@3_wd3sT=6sPX?1mWA_ocXjYT3tv2>k-n;sm>axZmu!)_B^jTmg_G?e&jK z?Vj>(N|4SZgjcM8X*VZ4)MjfGuCI)!1WSBGxr@g}^tnkFsz^_N` z6Cv_gyG0i&W<+W_hxhqk8ZOpbz6T95m(P)h|K8|z%vMrQkmqNSY1fc8rE)CgsLbdT zQTGPj12`k&VS^;fL|rA<+g8=KUc#K1;3o;GM8@X?4B}Nt8UiBpFc~cW=P-!)@Objt z1aze4@P(tYUZz1RO(ZJHZ~72vis5N!Sr@1`?vTV{G&J#_Q|HH=E3DK))-QRz$Vy_|z# zXV{N^V!eN2{RMvF&(Hsf-_R%K(P+TueB+wT{k$o6DaPBL^C+mpkP%*E>m{Ciqw{WC=fglRqOq98jF#FK4k#J4^!c|+ zONl5RLrh7=KZcl&B3CP8#7fhOVNKaA2O7)s#ONWSx0Q5GxDY2RU!}2pxx~h9=;)V^ z3_?h;P`@c51$vkD%LOg{8?-}VHqyEU5^7*>;oKZpOTZU$i#A2@!{I07!hpd5PZEb9 zB6EaazhO9`sOp+*k(v8Eyvs31o@hrZy+b^J@T-JE*ratW?N&G=nxoFHwaCUr>_p^q zdYJ`Y<^ia7$M!IPrT|ot5U~gS0uQ!({h;k$|CI~bm8Ap|kM8T(d+)u=h8}w8z`;F3 z%T`?3@#sSj4O#Rs;)9-bJh685ovW`}_UNAb_T4?S?7;p94?WRAz5Nf~d*IN0d#WOh z^Jrg%_nsx_cpz{^|sV!G)ds%k|S~UYHZ_ANQ3{JEZSH**|Z=kEj4_0SG-t{EG%OZQavV>T3gC6 z@s!2yiW^wmpbnH0+SY`Ly%tj@j*(CkMsF{bVrDgndoYyML3Y?J6$X-#BWj-bft)&I zN2Xan=5;x{2JF07JZSZJFRqOBYxQ@kj?LR(kWl|?anjK^eMOwKj=rum<`>x>DM}#F z8EET2i42U1YkDB)Y*7}bWATQ)DpYkwxhGD{1IVWt`2TuTT?axEF zFjwJ{B7oUa;&{EUUqA&y`ATUq%q|&?tUfNoz<0` zN8fJ50OF^3J<1Ky%mF5zjF@q_RC5sa{;D#P{1BI?y(;JbShqW+{fj;9P@haxop`;KCb$Kkw`6_|8;TzV^}q8p1P zh}mC>fMOh#BG{qp=W(#S&t}{KM$&~AeglR!JoUQVZE(^k>*%!bco)XZja(e=<^5~Z z#nh$L<8%~TJp087u}Tk>iVKXG77hveiC93B#<_34g-PgJrJt9O zI#E^ipCvVhHcc+Kc5yN_zP!oTrr#^{+a4#svl2RAG~D2PXrNvhBI<}3ykZlV9VUBR zp>r`I3G{mz{V2;+bIkB}st&|#2^gp^^9a3&-p8;=NMW^}cPzgOZQ>pR`2vXuCDbj0 zWwnT9Y1g|6uSI)ztG%|-_FBw70#n1xi25g@-5l$`Kh9mTin+fTz8fB|xm?V=>7B5_ z$61c$dh$;AH$J+?KccxO2$9zj6{^%oX zC;a7+b_+=f;iJT;Saxy#z>TyI*i9ZYF?IU73ds=$lf?kQxoOhQ!O{R@rEMG`{NLVvQP8&Jz zWm6bnK*~n}y`|RxN)DX`XwRW5!zfm;*>ZnxAhn_ZNQMOAO#zNCs#e%TEKI;Mdqo1q zrYc~xmcnk;nV;98ovoa4j?q$hqb_oG-~WB&)i^)w?3Kwfe6mz(Hf9DJ-fD-w<84%~ zpECju-@()LSiIyzbjbLCq`$q=ddhDof{tfvmQcxQH_8lxG@~kI|Ic;v~e~B zax*e#U|S-!A8xmMGE9YcA3an4bNka|bGClJvt}C2#m>TRW^lSz{%*a)k zy3y9c&mDoW6D>P?$LOfR5-8h)*o>jsamIB63j49~GxEVW8zMJ4@~Po<O<-qw` z^O4!Q`}&5lUI>9QK9ZA;uW3D12!z?qbo|9D?M61$TZ)i zN6Y;Y4(Q9nYs~xX@C5@i#tr1KO@J?U4U=h+v&`b<^5nk=RQwseeXG4@z?|JN+Rm@@ z_1`~I?kfLj`7a2+W+p$Q+^CZDG5vADxda9LYcVs3ZFShd zF2a$B$C@N|--|a;0xl^)PpWwipLHw~+9!s2uyjUCUWcV;>a(%@NSrFuQGi8bA8MC* zEs1mZ(%2rgIQ+s>Shku0gC77KCJs{au$|5}|EBKl^}t2kK<*)ch1^dGKE8yT%6F}V zUwMjnEx|zeqP%vx%EDKlqF=fM1nik2!Yc1Y9qfL*Kj|G&4Lwe5O_xSN(uZ+9J2!!P zSkXIeb5p>}==bsg8^e;|pnXpvV14kC{jSG^>k{)2XsE_@{%T@s!W3&d;K+1-BNVl! zM3i*l`=NrW`U6gCwdl_we`-U3L0AV^Ih!kFA3e>w_18-LPpV~gSrg-9cw?AtdyduF zUJGAWh`ug)hOk5`yIPt?d3eRd5X{ei@RZv%r-x70$bI?Mr}|&rOsx-KxKs|6M@1EJ zBYdXjBo?Lcx2z&CvS%dxSWRhqGpO)4+A#v$y5>MokXw?!nF>Bo-dcV@$a{?Xe@CO? zm!B$e>`WGZmfn_tDSKV4C>!B)h5dY+?dqf7jvoXeW`r+jY~dH_Z7mrCDxPDN{&J0^ z-|&^E292nPS87Ox-iA%BwJ+9^N^67t4PSZ+BLtP%WI_Jas!zvwNB$Mq0H5hXpq(84 zfse+396C8XD0Da!8c>Q#;n&`!PDjo+scm{5GX@|39PS^e*q8@1!XK&$9EcOzUuwiM z5`JY&4W9jsz510g5Ad^5Znh05`2Tt21j)R^VQ56g;TDMTu+WN`pQ30iWDZS!`K37J zSGh~N*#7Ly*UR6lCHVI>uyz;esXmQKAhds=5r>*D-j}MO1BJ4@An9@CkES{wMEj8L z4-9$xz|h|l+9-vwvAukPeN~D?kkg`Zj}`z_nyXl$-t4%MlrUm+|LaEY(G=WV>fq9t zy(k?ed=AoRs=;qs-Oo60a7_|^LfZ;j)tgh5c2?q4#f{GADxUaFBlI2aAYKTGw;V#R z(X_cDCx_!)qD4AN-^}_}#M~e8L|5&e;z>8Q{t+ z3>Jh*(m6_Da{nNqh5tajSnUi2#Q6!M&!zx-n`(Gk&o!q3z#_ThR99 zS8mjwFyZZYKY0HQ`wtB5dGu`iS+&wmf}~~qdk}A*8PM)iL51fq?apV!RlD<1@m<|# z+kT-+(gz@UEoHcZ*7h*>1?{PQ~&EZJ#8>Pvn|>9}yeABiR)~MSJ2;o+!yDDzxZlzy2Z@+LhtSKGOP>oJ!{atzjO_~PrBs`l; zEr2!Qj2MS#4}(H$cuaon@OFh7inOj(*z0DM5sRnU;vuPN?UGma4VL7Z8KfUHJxuCw zQ1w?QSdx^+K>~1_muaRRepLj`wv)+0D{_g-QaX*~G&QaW*K2g0r!pLE>}sQb@2*+l zQz0>oGy!7P7iTAZLXKln@yYA#vP%ew{woibdzlBOVK5_@6Ip-voxFy z<6e_Gq4&!}>iHo5dU@BXSxCydQt7mKbJ#@JYQs7q^;40v+0PI6ALuNOZA3 z_0j0ct!6a;Pye=$OjKc&0+EotoZ;ow` z)7bP_USkeiqBv!tp8}4_j>l#Q_vgM)i9sYTc!=5qU}RIQeRm}F=32){(tq?AMy>}V z_2xW86M1a6#qifb#|uZ$22aAMJ1cj|_1rkxE=3->rP4AJA`soXhaVz2LY!}dY(&e7}4&9rGd```4iquX?nj9_2 zrAbPXGzmJ7ktRn2&L)tBtG1?XkFR>GNsNkuKNHE7hqieO!Huz5*>NVv*1wOp;8$q9 zJ>Ig|{@xl}UzB2Msi@l{TkjWa7jZUmZ@QBj{F=n3PG$#CTl8 z%_VHOzajRljcrfFo*T4e^7Af$!p+;zIc1gxKa-y+oI)|ZsVWUm+Qh}%@9%hR5vRyYyH_NUZ9r`X_dRll~F&B6p=`(bgcq$np3Y3ipnq7(o_QtC?8R2&NaY-~T;uOy%M zW%~8~N;UnKX01k(X2pT!(5HDWX&>8#6?b`2hkoE3$tj)^qtK-J$bDeEX?Oj$^^nXb zcBixn%2?ipS#(Jo@}{8(1=A5Un?nOsM9g?CBh%?E$0F9!9txJ^Df3>5tND1K$lM^k zKHZ&OO1^eIY`1hhOt(2k03{WkJ*B(Sl)fT2MV!yn_mi`wMUhwyn*hj6dkE+aeWZVb z9P{(nq-Y`YFWW>yAHj~{7KTHi?yu{LJ)5}OfRiQs@X_AzClmUu9*Y%L4TX=AC3<66 zJg9J?aH}9s%=c@I5g!fFJ5NhJp6>}u@K!E8&aj`03&SGy=$7HwbER%bCKhhtqy?f| zbOjg!xKceh1qbsMleLO?MGW%SZi%b0>2=3N9F@fdr!#lQja%dFO>yJ1arPH@>5YhP zqoHXt;MKZBdEt`yig|=dV4R+Z!P+L9Q=HPIU++^X7{fJXd))eTJrM25j%ZK15}@lz zpBK>|-F16Q9llG>^QVPuxxY;x>^oh4>pLccV2<|9y12!!t*I^fw^GB_fiVsDjO}=8 z-x^B|+aSK}hJ_M1aZ#~!ac#u}4EQvi?+f$v&N3elbS$fQP3UI60=+FB-Pbg}!3Q_s>Lxyg<8(?5| z!HK-~(oK0aBVG0fVzsr6FU1WGz+-ZspQwg9%*{s!M!r)N7@adz& zX^_;lBu-SaQMY>(55&idNiL%{BLME>Morp!`fIo9H4H$rTop*j=h=MId22q zZ>0ePykz?aXvY7vbu)dsJz7V4^C4IR?P=_5Jy$2o>!Qz6<3y}p8jn~(`fa&6fb)U~6Imh+MU8gAkRU+~pl<~YsvDmM-IUXy zM0^r4DyU5VSgK=iUsF6!wC6pET#-iF8@jYBmFzA`j8*}7i4^T7|;Qt;Y$n-rvJ zHc4lLixn3t9aV`KqtpNKH2t>2wHL8rOQn2aD4V1QlQ{~hfjGDdRr3cLp{J^du(`}BU+wwaBbj>!elca`Cj+WcJCSt0pY)UA2Z!QPSHu8{T=DoRS zG21XRNgQ^<&|5*wqoC!)G8u?KOZKw;YoVnr_j<>wo(sUL^#xYlUWHZNaUpWy*(`RE zG&nKWZtZ^m=LxuWP~w%4whli^>m6~^BL12~)O2@@JI{=xyAvTTrKfqA%?QL=%wmhu z0tG15hx^;(`jv6k2XP7$YOo&L5k0YF#p8Cs#g>6$ns(=}1rK4_{m_5c}QwIOB}57!cGLIBU4rZ^8ZS^?n% zpW=_WtSQdj9G8#+m%q#7Iz?zB+FKSDHcktwW|HP&2^MQzqvB3ygt{a`PX=gWVl`Km z1d?c!@L$-?*FcXDdQT{gM=rOULZ2)0dhQBDjnchX9i@D^%pYi0z|wRl2%|N+JX2S6 z$_kPqFFT2L)M==0Cut!?Rl_>djT=lijxva`{B5D9H}-_xTKc^VB6N~|H{D{>37z(o z;na(C_k>wUcqqbq)HFH;IcuNh-jhtA2sdlnplt@3IRasSF}7g)`F#jGfjuo@FT5qR z+7+^8Xw^Z>Vc)Ap=$8<8v5EVRTpcz6@LFU*BJer&<*0~00Ke=;(p$`47nj`>S6v^M zZR>{iN%Inw3E5-O0DvxNLSU+1jBIF+T~#9V$!-%=jaJg+%0gif*q<9C?2fdRdblGs zIGWk$N)@}Y#giBjIj5rSsb+^Q8Lg_Y&)eLg>(t`1qD7Y#tX^*OkndH1fQ!Gmd{;7i zyj0LNIVg{5=h%=8OS2{Va!vvRAeFw|b?C0UvpX(WMz`oZ&$0d`K`E2l@oZJF5W|eN zkFN?okkf1SPn=5?gr%tcQB_cPL~kXTizdb+?VRusZUnhhS#HxDu&rRM)`xjV_0ZPB zs#Cer!KNJyF>sU~oGyaD@-%>ri~=pPk}Z^ljH_W$D3WS2TT4jG4PUcNFJ_4;bPsg( z?j&pw4!LaCp)Eao;_S6)$qs$zfNiiE*ccR+lPWkWAWqNrdi6cJPH>ct@zVmU)Zs0M zqq2i8hP>vinY+>8=LcXq(i*^0O>SgVXT2?EzNkX0N&pyX;eLo7}qTP~Seq#cc zx%5)VE^!la7=In>c4=7@Yr^Sj+UG%9S`crLy|#Bv}>ZH^rT+4({)%-}ZloiezCze&z$ zIWEf*kv@3Kh1t_&VD~FwJHB))L(sS%(U_0-RHM2%DIg&4kJt9+93;oU^70~$X!1yy zkElovrvU>EYxF|`7XR6xpG1X0K-~eq_C8;?r(maw)0^&g`EEC0V#QkT$kjfCu^lmb zlardY1*!S3iPRXw;2qHt;}1qzuz3`B-JNj(EVQ^!b)D?=Fa_rnKB@`N7(4XCi3`xK z+EA#qH93Zp=$S#h!m4UGO)Ci=`RilM&dIzZv-2&v{6WSAYb9RGAtZ%>;ml>wOqw_; zTfzYWUXuXNuLO7p1bCDIcn`=w1K^=FSMZooz*`M1G@FP6%j?xZmlhxaT{#p*-SPf7`xR)$VCS91hs;~{AB-;XyT`Rq1#-%oYjyU-5;-d1Mnq&?W`el5< zk~fHc;ST3}U3oP)Pk+i`2$Kl11=)z}k1H7sK@4@on@iQLBi>;Zk`zM3G7~H0n@{3J z6H)qNy&*Hp4?Aq_rol6e!r*nAgo*X84=#6;51wZ|>q)PpY@|1hK`0ggopF_ZVE_6_ z;-7s7VNI+S<@s;=vUHFJvJU*E!6wE5rYag$N5-aQAZl>PlDunlO%(}Xp^1BAY3*J zdqpuvf{73g`qBprr07;rpZ=^*O=AVqt?3+R6}l8E4(pZjdz+w^G%=EOu2LH=$OaDH z)!p{0!mVETdGG%1{_IG8XD@uR>ILg$@*%J%h^Q8UBdcLz0dr=zW{;3kJD6-bh08MC zCmmMn#Oq|Xah@Z)(NZHX_ncy?b5YbjI^I05uAXI#Y&Of+r8!21v` zM#mObO=okO&bq2;Nb|O%s?fSQCWk@Pn5%@4dk=U_2Ho|6y*?m5XOTBucB|Uz(zUsZLUif)09P|%* z1Os2NVPKEY_ulU{Q^&jVJ6o=_yW9mBr-`R>j5!yz@m5`y4I}yj2XcnJIqgZr#cXU>UHXKf4eO=xkZiSgT%c=puk&wd%lWvI?Seqa?EEgLZVdihQ@zz&vuK+% zMcqE%%lw@*-?;hI!Op7r?(@PgcpK>>oR6-WX+_g48vQ$w&m!j4@e$Y7CZ9zhWrRuk zfi%otI@biP^a;A&>s{lWaWST9lchh9_dqS>(3iuCK}Q<%S&UQ}Liuy#?%3o9W$HOw^1+lqH@UH#CPSomc zMC|0#t36&xB+rW>f>v$4J@qO+1-jmxkdT-PL}U zU~y+Pm5jvd-sR27mSiGFj*FE563s#ucWDx=Lh>)BwTd`RCM7hEpE z38aTg_F;8p4RwHdJVAN~*gu+8 zK!b{#^JRxmoqO4Lj=vH%_lf8B`0K@;^M_>hZ2qkWt03Dite9)}(x{LI-Mc4?5gM&L__6s8mETdylHx zJ*deLzTo4WQfPZ@(X?$c6lv~pz*qHl%X!%W(fqC|f-UQHuyHY&BaWQ`$%8{agY&2cyeMk{b%j1LvHviDPE$v3$k=Zl5t2>FA8*h%{<1 zFo;a*M*?qRZS+02{{gkGCHQ~_6obwZSKMnQXDJj+Ib8LQex zK>{cOBP#{?vuqS^sON@7jR~ccW5A-)gnmYD66H*`nzK^wsD&1v7c7Z6r&VboH{7JV zL{_&s@#>FOxXB@oI4M=x<%LOP^KeT@r%4#MszU0~)sD(*U2;f}oVdW%-u^w__uKvD zL{zu=-6nrMy|Bv%{)o44@SeJp`dHnaUEW3_zDXF`T-9QdJU`*1Ni))wkIlZ&UPUm{ zuv|*d4Rhxr)Coe0W=#w%o4hQ02|E~!Qs>54vzM%dHj`iw;*3Fu_|n2;a;VZ|Vx+^2 z><$1>lM4WVV(l@mSPRJ*H7XZko7dzfOJ2WEAeyHN(^T)sXUB+hTKP1OJG`ECB{4|? zntZtoh|)s#c^k=bomh3c8}MfZ93+UeuN81$J^p?lM1tM1h8Pn^)3i8!_dtAcN5W>;%xe=r1Yi}9P)vbPNZHTrDG^Yz8sa(O+Kx*dmyE|5$J1)ZA^2Xa6>iQ zNKi;?%N;ha_Mch)W1MD}KilMNBxg7)-1vj+ZR;_RJII#mO?C$8C(ZJ*{LWfUR-?2H zD{-D=4NtA?@LfFQW>qW8tK|Rj3`=$6y5Pp=Lu@O53a!8uf+Y;RjUbuhQW8e3Ohm0G z#Q;;$0-bS>d3C`7mf^R}^hTsIfpen@LcSE{xFb8XMa?vArUqI5wRvB`G6naVmYbg{ zS(ZT;XkzG+_&{KVtvnnkN*r+>G|FUpw7Qls!f4jU{LTnN@zh^P6hX6ko7c1Q4USAE zUdzV|hjUa;56DkzZEr~Lc=bdi6BW$0608FD<&EBijM~;c`IhZLF3cIxvCr6_LcApn zn-wT2n{gNtv#C#}>J7x(be%AKwcp7AWhA)M?+2VE6?aaa^5d zpFl%`v{l?ij#q7l3L|0K*jm^QlaWx$;;&9HE8)!?prRg}$4E&2dY48>ui+3*iLWFj zhG3z=@%xd)^%RHU57^mZXq1r7ury(3s#1uA28Fpog@ELQAa7uUugp4cH_3pGp*iZ> zU7{nh@)Xp;b=6e~tGc znWhuWoew3us!*~L_7h4Ty+DvR{4GG<=}{$0rji8qcjW{r**&}cK0$bj4i`zZ!6{j- z;qBQE3J<7NOxTkO6M5_PMv?%T=46$}J%k}bA{?|P8S(7T4dy9crwEWp@Z^c;0=6*) zam&tnz?ZgWfy;4P8qQ15&sbq@vcv4z4&WT*5=SWbakE;H=RSzpwz|eqP_5laac)z3^03)dvcXDIV@nMKKq`HGLJh}on_OCiWBnF@fQ-`__7akH zm-!&;$=bSryt#_WA|s5_T~+uYa~a4aQ#~~y^?Z^kF-__S;?W%azRhp1PX>*AtHm^* z=o`ies0m_b=}iNp0k5zlmr_#&w~kzy;Go{k&57%#Wi^R)v)9<^Fu63pGY4mJXEm4k zvqHADRt8)eE}mJ<>d#m&tBb7l>LQc4lMgi|u|JPTRZQN@D`TS13JzxvPY~M8N+a}w zf=st1jDbRNNm8Fh&*0!9B8?2Cw!(L6ebK%aJisDy%Ds-|#gM{cD?06v+^qRp+oiAd z`9$BwLiC-bfHlZVVInkZbt|Rntmajg5(25=dyp zw$Vf|!VU@hfz$d0?hfay4<-3IG^B4Na<$v)BhXm2J9W3Es#9xHOP3_(?XSZx{Q{@3 zcL58bHPM~!4;Rm^*ruQe$jeg1f^QwV)?Z1%7vjZfu=b{HE)SO&fmhBhM<-*wE$VKI z*ETk6&qQzKUeq++xzD$WCP#3$lf>c$`}$sgFQ>`Q+6TR6;)#XuXroVxeBy~Z=GNIX49U1a zE_N{;_JOc3m-_RPTxeDW$ddoFU2gGh?*MP=P3z_v0LZ%Ml%!TVv_f; zn1VFP)l--3N+ze}dIM)Mde5iiYs!HJE)uZH)+bJ%NF~b8q+W)7!#=IMd^MN(-Clp% z;de=zS(4YZDJ<@+ou&S4r?-;sQsh?Arj53^v-jHlz0~94&c0CG*?Yx;r)S=M_RgmT zw)-SYO7*n+j(>Tz7(FOy^mlJSAnRP@dpAdd%s<;SXGS`qI(U@P$)}fR&$D%i}Qx zCG9stmLu@~TyG-k(FXxYTgQ@(KQ!m$`2O^uFq&9HS+UpaUtZ&@c8A~P&aC^rvXSt_Hgay0 z&^zx`3dy@8Z`~SA`iHh=8?+_|T9WNE6B{|nNh8OMTlx->@I=Op^q+%_ZPq6XDrkgi zyW@VLYgu8c(v#z>HEq!iYGAhmy!c{j(12j~SyN+O`L|57eOypzr`aT{we`}8x(?S3 zIfX_9@)FErHZ1MtFhY?wvD@)AnjMJ*R%2%s^}E#zlgd)iZJWU2&fxsJLB)M6&~3+t zM+-wy@xW(<2Z@CHgF2IXd^;Ji%kCf3aga@oASHd*(AN{31?W#zm4tWcsVLZ>1sJ_E z7g1YsOXb%zo8!_WC_oiGg3%b>=};o?=h>E=gNddXI*;*g9JEm-dXrNw%l{TO`uLN) zlZc3memMy-4Klaefbx}eW@C;a*1rLRkHUOoQ*0t*qXVFAq_Fw^wkbLc%JH2qbqfEE2SkCPa8!^xM;}nCnVu!~$?4gOJ zCkC19144+yW*+$C32f@G@>+e?yjCO1ROg{)yUlr}=!Qd8&Z}8xEW!*?!hBbrkEPmo z6`KlULB-{`b^~RiaDBdfD0#JJxK~Ra07JywJ9RFYKLPZ`ziEFc9m;Hxif5imHD94jSf4#aF4fikKf(y%HrDm&MX4O zo%Ls(KTDR{;?8OocUH6btXUt5JF8jTS_{hn1}Z>t2yUprYac4ExdCmRKH`86(z`5R^rQprt&NyswXN0 z;xB_hHW6b@Ux`awkCIWRziMHU+|ljbDlA#nYGL}SHjK+d%SpkEytnVj zC7I@=CloIkaYztRykvy~(ZD~&cP0LqEC!qNp<44heb&-egmDGH)U;ALxe*e@+-5{2 zHX5nwHslV6nPifaHNrLU!Wv;~HkeB+q*C!Qj+!O%71@)ow{Im|QgX&69jvHn3tnx*>CeYxLrIfSZ5=D@Q?`uBhEvqEuaC9% z7`TnKHQlD^Imd{s^SgWnZgbo+htOE#kTpEkIAplA%jYkD+1GGqLIu3jRw-1foW3{@ zp76yjv^B%CVtAD}@+~Yw<&+i6P>CZ&o0T;${Od(c!-xx7hBqBi(dM{IJ8nOn;7rWp zH3o9U{tD|BGPjv$NYOpMAQVoKgZef9?*bMPK$Y#QO-$XO;!=n z@XzFCAi(m+j}l1HEbuE=1S%P}!k-uE!u+Z>jPV5)XVJMN;;-gfE%dcggvbQ~ro)OQ zVl31fiPhQ+%5!dog#eM5c5=)pWXQz@oH|y~_;LV}y-_}z#ED$8;ZfeAzUH6F#hF}q z8Wnf^?R*P{w~jh##ksj4Nf2zT^p+>P+<|St>L)>l7%`g=OdsAio?8iFt4W%$*AXPG zxbW5FA_P`^N5;4At9dI7YqNTpm|(%$DrsWDdu;B;GOUC+)>HCEs zdg5S4j#9X7vT7H;6RVk&k0cuuOwRBj#W`!Urt_>JQfsO|S3AeL)v4dr-pSjlMF+yd zoE9Rm7J`CL|Kq3gVO365q6g>To|SC6nAAk!DyQn(mKQ4NR1)IhVKKJX=?Cwj-U_d%Ba2m@v?WJ@mMi|T~<_ykz zw)PPkk}z!FTjF;~P|fY5BqwtKAQzd9Iu|FjY0jEK2=Ub(Ot5lCY9EVPYTu?r0Z{4Q z>M!!UBy1OV_H3~~OTu<>XYCYsRx|ZF3ES0USn91LVY|4qxhn2#E|z)C6f9KS*%u1u zlg(0bXU{r(Mb5z$eSVs9m(qcP?fHX7XI(`=%01(=E~{0|x+(*Zb`E2d&B_ZC_xYyQ zB$;0q={gTUIv>+f(!PbZn9zKuyLLx$Vg-o~rzjL9Bz1BQ9Zo!=&=CDW&anzzmUE5N zX5J!PqMAJ@ZSxq;U|oWwTXFKnDC2j*0<1#f4XzZo_&7%SfWd6Q^<{h^jQVa9T<>;d ztJcyw9n_OXm3HTbCkGu${`XZL4gCfjT?@U(z`C%j8j2-AP2;cN1x9rPyuh$#gVXZF zKsHo~$7X-I(@8|y98jf68nKjN#y&V!Z!`qC%T2ecWPKc$B>(Tj5NygWNL{pLN~&Q} z<5uKTeQrWO;2xWBKiNs0z%(b)kwjzMK2<*IwBf&+v{VMXJppOikp&KCJ&8%XiR-%9 zRBnkoWH)Krt>3ov%UNq5<7B#*?QFdI@Si4dCS?|`_4B|c4dJ~$gP=@^)IS|L?e@ZS zj@n)syAii{#(CS#2zaU8cE?KJ!8KmdU0`9#jIaTG-;(Od_G| zrN*6pyqaY}UH*JrJP_x<5|_U(UdmZrWVifkyt*sS-+Mv{?w%|Yfy{Bk+PFXp-MEHB za(&XW^2?qwl_#@Au&6oT376fTOglNg=n3g$5Up9==$Wd^d`Pd=ES?(YlPw7g{ML+$ zY%{O9lpL)*n~#mRm(pc%4J$kFFH*L(Q{&A)!^hA1Oo^U|sMf$7uF$V6i6nc_UpCOl zOkb0|$Gis8f#&Ic*tU^d!R;p08D90iQb1iC2P79FBr|kO8yCZ)#LBf zvV4rRWTk9dWY?mOUep#4P5_q!glz5V0BKbZa>wB!dbl&Sr_LxFtsj^ z9Jk)Qp0bX{xRUKYq)(auskrKkaX#BbH^=!T+OL^EInI9$==o3qMV!``LlKd{ZvsYU z1OPfTc?1{(Mr!~gj)>1lMdM(^QSJ$hu2Dr+viwE`#9X5@`^G@gcdqQ39Ez;TF;L`X ztc9qzphzU93W~r_d$hZNBDs-RYXheI3_y6kt^H`?-W-_Lsdj!8po1O;?gT310}uwx zXNTjOfa7j9zk~QJW*y`B*({J9c@mwi53_VT;@~B6l)$UQ&vf)`22&n$Qk28iK)iHE zY~s#O6Kz9Pow7v`cBm4hF)2zXK?`4ajPat-#c6+#MqO zgtDuy#L3>JUv?QkPb$v!@ye5AOpeQYbd1BQ4ROO40I$aqc=ZVYX0sE^XgeQw06OSS zCURUdVW^(7^^;c`P2y`$htBa-uUKGZr>;^{#-LM1_tB)l);xXokLMY7^%{dY7ch86 zBo2S59ib)}bR~;%OFXU-fSYU##lesdxNV>&)Nv|=YTo2P!hHIhfn!tCi`Ej3Mpg4a z{tAa6t4J!;@kmPRYO+(5Ijz2S9FUKX;h)+ibm(;l((n=9%Y<8i82cDF|?{aQQOBg8gg@X;0gZ^wAXb%Xs|bixb4C0eUvx{4-)Ki!Bxq z-w>W8W9G&vLtRIZDKPnaOI7oP@!_{8XI%J@Lvlv1KrB7z7EPD2OV;StU_5KRjz-uKw>lQB7-LRP=13>K|X5BuiTZ z*OJGR(t^z=3Q?*fYnm$mF(>xXbBb-mH zw%~b*I6vZh`Y377NiLPfrMTX6d(;&-ly}7|bzV_yLFn2LW|xXv&fN^RL2_HkjR0YI znE;#ci(oS+igK7X2K5JV+PL$17RfX3yY>aI5 zB)92%;>;|}gNAcN1Kr1R!C6ys%U>$#mctpah6H@(ZDF#m9%U0xv-FP3b)<3g&xFGx z?+k}e{wScxZHB>4djc8=V3^B{awIh82fU+ZxsY4;oX!B}UI$^AwLPvQLBE|%a?H;3 zycGQAy&I@_DNLKo4v+rfkSF#{JGVXNwifCbRCc*>qSH&$DYr?1J{fOjazjdEd)#Yg zTWmoPGFx5anay{U`F;g@*BL+77zRnE924YCX3reFv{H5j0+O_VMbMB`3K8fvK&|ma zL9R@4s=C7XN`K7VY?2t)fRS+f^8e=Wpb6vYgQ+H$O6fa z92T_bB#vIN7V(W;3|9qUuT6#vO0JSXvfwW6AL2kzWv|<~P2keX=|nv`YwD`dbW%}Q zc8m*0Kg8x`+`!t2(BQ*x+n#5Eq$VZc-w)`>8r7rJl_~>fP9=yTw+#@p${_~Aw{caR zb;FR(4{T-1l!d<)8!#!R5Ggit*Cx=>38In?>k`x)sD_$kW=_D9TtF!tuFIk3q#K6P z+-6S~Q1fD%zn2VZIF)t6M!=l?Zrm)nY$z#Up=!8YqBN*$(hMLIWXBoqOg_WP#hG0vt)&_n!%Z2< zKLNSZC#t~EKLHq;6q!B&F*V>6e}GM@*NEy`2@Q)dq(FG;tQ8s+WJZXf6Nt1g3?8=; zehopV00cIOJyZ>`$)r}yzX5J>bgwb!WMHqD_#ALwF~Dsj109rX>8oapAxmv+Ai-Z) z6XVB#*5xLX4rxBZtx(ANu=Iqq+UE^m7SUr+^jPfKq6@!GB&$7p53+IdwAlXnn$=T9 z((05TkAX`-<#3m^AC9vgiSurZ*CB9ZH60Cxq&i=zGY$4NKP`s2Fb=oHZ>tlHK!)t0 z2!wqX9TfA z`I(hhqJh;}$?qZ-+D^(_X@^`h9ZUogbtx|95GCkv^B=~=(j0VolP-yQWZ&p)yv)s6 zO?N$$gV?Y(`=%&56SAbKn2>z+M<>LB48~4~#qt$&nT~2g#QrrQHrR7bh=C}Iu2j$JoBrD^wr>R2uw2x{OvYH!Euh^1;9N67NJCAq=#4Ht=8fe0OVvix(~l8eI9RAhmU3E%G~`4wHCzzM)UdGW97K{9YrJ7Uvcel? zX6gv&ZOKRtDXleO+F)#C6*#dP^9ELc>}5kUV}_EcIGn){t@%K_>P+NR&#SaLaNDbN z_bM^_4t0}gwkF&SNtI>=}$|#u%47`fZta~ZW(pkDSi<^pN8AZZ;SrQVaWpV6# zf8uWp=-k+smgOw|g(b@8Hu0~7eekcxi3icFpND@Tq&i9l_V$iLnYPE3%ooSP8PQI} zNr#8|;_b>8FLeUO z&d8MzS$tgit2tT^(XAykl?FpQb+6$-m6~O2^w+5?*JP7pZTY!amich6&IjvZ0Ab@P zi|i?V5+&nBJLWBB??9MujCEV$4c)PBM_arctIyLzRCqR3xczk|jCM8k;j)wE<;+2B zeuhRHhuhlQF-mJF;Tr2;;~9gGrc6l%WXAY0`^DSAd^X0W_tXCu5P~!g|83^Xg}Tqu zX2Y#vkc^D7e6(=Rn(8!X`wkl ztO*msgk_}(T>sSip^iuQb?m+O-ep4% zJ#^sUo}pzcuIza9p@)V#4jp_{RrRdniM6ZmTz%EDNB7*f@9v>x2lhXB=!p*M?SJsz z1BdS0Gr{Vnn~r<-4;`#7Ie56bV8VpA?>Tt)0}mhA(|)gdb#Umu`}PdB@0(CFVZzYi zhxZ)hGFb8c2ZxsN@4>2qL!%`_`ybfDvx_E7NF(Bg1|PV4Xy3heA2?7n^eBVnQM5)G zlwWtwHt&)6cM{U(g+j_Bj1%$LX&7O~~AG6;p-rLG+_ps=tIOAlTgZpe)rZP@w zsm;D%Yd`m-?v^7U_e!w*t8mi3Tn3u~dRLm`m!&jw-r-GMNW})Zs7_gEz|JGVn=s*p z$71vUJcSW7JaG!!B8Lw2#JTT|&0BHM4I@P~Zt0FQ$kvLyID==m- zmP#gb)Apbd&_ERv9}Y5I7`8=JIrPJ9B>lNWVG1!4g;f+oz(hnn&ey?<44C*A^7hpuH0X?_)nZT@ zF$ZzYW%-)ve0T!6=FpaajP&rrgLQSYW zqaWbt3+)1q*<|Odf)ujgBv8qJbBMt$A&40)AO^qLmjI^lM9m^;8R+4U#paE1nmQwi zO-0Q=$~_zNjQ`C87@D%0%dlB@$W!8w@~QJd%C+=196tx7G_#{q#-EkhLvdb-adu?? zJ+l10LprlFOn#O1$CQ{%9pq^@4ok00Y|6f`5{8&0G7g>)cr*?H8Az841JY)5c%a<@ zMI$}Upg4+b+CdxOEU5Q1nMF}N7+Z7pL7aPk!a8T4;-)#yC#l?uIR7YKfY|b(G+Y2m zW1<%}wrZ$I_+d}bQ+@Db@Pknsa2Nn2;K*(<1zYQ`u>l^o{5B=GX0HmtZTZpVEmYRE zjzK}d-yI>Dx`9BWZt=#~-pSG*9*VVpq+jfLQ3k@GoC38!7~@?WSOzS{?8n%$Z8`~- zst%SJCo(Wz+NqgRk@lEbl02CSU@r5*Eq+95qD6ha4tY!Vtw5+RaS>Zn8Eh`ieEjeb_+2T&aXmSQy+2N5m z?Ew>?aYzrbnW($y3?YgwI#|luem z2M)4w$J1h6VrC7~{9(%UjHNs!nc%s1G50QDoGldmoCyW>$0AyL%vPvAnd&bN6Y;ae zjJOr~Qx=|#ji;2`vve#@-(tdvwtJSo*JKU^i0Io@8<{i7FXj2v!ETAAq_!CwF4@w& z1Js`(Oji!#FG^CmnAZ8sJoCago?>~+ljA(u*%76QCQJRk825b%ktI%ROf}=&J7c3D zVD8P-ZN`*w&}?A;I04JQC{JUvC=X12;c7sWFV1|>e;a-=PL=hMjr~Nfuqnfyw*Ikl zk>ZGti1AZNtKA@dEoRDAT8dM5#X6ncyq`yqJg{7~^nvu})( z_Qp#jP|U*D5a**p5At|#V-o=(oT-LK1Mk)3>*E!7#7Uozldq1GZs7Ti$p5GvlXq}E zh|t&=CvV{r)p)wX9m1m{PRhcR8l)^ymH-q@x8DYT)aSP!b^`_eSUn^z!seo?7(QpF=|&A<;lIP}s0+7ue$U|86WMjNK0QUgUqwl%U0yhPN-Bv?%?Evj=w zAT8;Olb&V}E6iz*8Q_ZSVQN#MbSK5%=aQ_7AN69OaT3y_0jI&{;S#}fza{X4@qut$ zku4P}nE*HbP_`4iH+A*jCF)^DG0*ygE;2xf~)aUy*lH=e>pQVcMDf2*h|3IBYg z7YBB7GCqS*LrYu}{_zMitSdj=0UuC`273l)x@#Zjl;GhR!A8Vy&WutoN@?FgA7^5q)krd6bnSB0!$`TBHE!DQ)73ljO5u z(Mc#Q632*|bub!mv<30KBd*DAMqo!`Sx7cfVuz63RwBtsd|MeFVpRKGIxov37ARbFuG&9(mdt}!jU)F?J<)ot2dKhodZ^=dDEf-HPl za1g#E81P7@5*~goOAWq|Twht1-l!aULG(Z@e!+desTvsZ8+X`}=B3Lc{u>*HK}NUY$`*ou9mdKuEnt-r99vk6@1 zEo?a7Y_F@B>%V2Ld%@o<{D95$UsujF3|x@R!yl}i-GiE4V11s>rftQtH#)N=2X|kJPgX7kDTbPri+G;Yp4KoKKv#TI>lPI~iVKaf z0t0h$NL4Pz)5T)^D2o9jSuDvYmvPXpV)ovgX|UfT=P3Q#b%`|cTa}EY0kLsmAZ(%` zU^C(h^LyCV-lgE1S5Tv5epHwmD(O^(*7h04(=P!SbF%M=%{2=+BUUaT)X}+QK;9dh zKV;MYx+#hhwksLRdOhQ9{op6^A6u{S_{xtQ=^y1Qf2s-Qg_>~uY`)^LDt`#;P-8XW z<45wy<3FX$*hgX~sPe{oM%}u0i;R71FPe`ShYYcVkQnEXjI;#_z_hu`0x(SgBJ&uh@)RyR9HxPYR#o&78bvspM4tV z`75z?d%S)F6mM<3{uwkLPNv@(uiwUrSxcT0uK+VzrHzH`>z>D-77ct8*OrFPB%AW$ ziaM4tX`6(6+RW$BPo$MKQ#$`sZ_XMp;}T)=DoW{h7@*zK31(hGUPT{-ZwMj6`^HinW{8Jpcvvu1h;Z|D%(K+Zn-iJATWZD_14HHx^f;ohPgv+F zESR#f1bl5q;TMKxn=baIRZrKRabX&Tsx^@QVPU8ptXWQYI@%v$tJQ#g<96bXI|1-` z*;=vE1ktY-^Y|tZ{U-CMi68LEybzdOQZd8FMAXsCn8jg(*nb*@*h<*+i9SY^Vxoyu z$6qN5u1&4i6(pT>QKo-ZPd0L^$t#}|z5WkmZ-kCFiIkgJ9o2ia;ug>Z2G8J^MJXTx z&h&yV$(yUOtTM_nf~+icWxC_{g>(&ik*10Wkrcdno=It$uhUis!c~;ts{Jc(s|h)*V*R5HONMZ1gtR5 zEh?2GfVJ z6r#kPq;A-Zi7>2{lYwVm^A*rnZ=f!EgFErU{V(?31is4ayz{^JzMR)rAc2I$YJ&v^ zuOL8R%p!IJMq)GAM#6S(gmfijYm0Qn;x;%IcABQ0250LUoOGMEA!*W1J1usbq$^Ik z%=FVbX`8Mg?ew2%rzJ@{opz@G@9#P1y^C0k6UTAg@Uiv2_q^|WmghYC^PF=&cKW&J zC>8l+qAeFq(oFI+nz*)?`NF3R;V2YbCJ|UMwunR-!7%bBP{5bDq9Pz+<|ear3i8#7Du}1)v{RX+c0_AJK=~F`1l}L<04x zmz42P=W51ykt570swx#RSZZDvXYX~3q$ETHlG0?v&y&w5{RC%Aao5yNK=90Dg$Tc- zkl^blM5th7j^JK?WU#Y;S=aE%!qK6@r7N3OG&kLo#2T0RQWg5>?Uic`{kBAkRf6`Ld;Ign?N-9twn z%Xfu$yYr)6Bjp8GypL0<;gd(kdV2CBzM_f%C_|#uhgN;K^9BVt+X-;~`QPf6+5chW zQczb3Bcra)yW6$Pw4V1Rp|hblu8{csc&cuY8?r4fK<#q0I4o!7LELyu{(EKYN-1;k z7BkOg2fyGyFv7W_c|wW|0T)63w6&o*GA;Dg69 z!ljO|B+vXbx#fr2-oqERw+R zVYPD^cT35nsA9QJI{JApxL3r{i@;=l3t3E4qW^k|3p>YOphz)U?4b2H5!f;h$zu7> zYos0RgFTyDY|5CsZ7E&f;HnN&=f`}V&2jX*RB*Ge^W&#T^rOz-Db?w#@_%Ql!Z*3a zR7eK>0#c)@o--zX8@Kc6veqzd;3+X4QaW#6=2noXhVR`U*K|8i=E_dkWRp`9e?mbT z&Iz20TKCuvdoY*Dti>II#~tUI)?r3$5ZOfO+)=T(zdwagnSt12!~81mmw`1^k)+_& zZmo$C2gS|C^~PxKOGtq?kvASK)Jnjp@0{oTRq=+i7)mH zJwUxiJk_-UI%(t$@jCv_JnCkAmz%kTpV6BObO+^7xg3%(#9yw`Bg}&-(GLRM`WVz| zIQ{Ht`Z?336|?%MQwWK#p-$TR&?_I*=_?Hij$ELNmcQ1c#H)t*VS!_(6yJ{l8rDtj zQi##RVJ+8(1%RU-0NP73dJm&(m_h2BL>bEoHy~sbKR3&&$K8PvvZciY!_5~UK%IQR zB;#6>a-c-78rJkGc^kC8-abG;)bTf@@-G&qtQV&Ix-f->BSl;hLR8UTAqx1M;7C<; z5-oOe=Jxc<0Z|;K2DFe7M^>GIcM0o*rPQ>XF&{uEE1o&o2CI>5C@K{k3{q`xj z{J<$K*``CkEB>fn_nP?W&` zYz6qgo?mf~^^;||!pvFv;pdiFsVFh9J_J5SX38}8bszH#stm^?t0j! zKJe8!QA1(e*!TZ}#FZsH-4uPD{FK^y!PmKzZgP%axu z0ad71X>_AKar9T;uF&laGx7HPysLk6yW67xZvC5E{Eg*c&DE<`s#qB+7xg%jWV~M3 z7OoqEs&|YA6p}TZYbfBBpgy7875)pL@~OR9$6WnLu}MiQF*uUBtMTOt zRjcDau`AzH$G;tlvRi!_60wTZA8kNTf1lN&uQdRXkE8!O*Ytah0M)lD-2A5{HXG7S zC;(bSRBL-{Op_8ip`r%gFV$4huPCIKhEZIlaeX2seOfdGfEoNN`l>p9!H+D%M6qA9#Cx{D|)up9cWp&Acp#k$=6N!^oo)X}2n57j-kH6!JxBE(^Ww&Jm zmE*w1Tou35rn6C^`OS?e{EdZ1>}!5BsUyAZbc875t^}_&nJsa|@-=W2c7B$u1nBQ= z|LW<_P*=Ep;~~&|UpXDRhp+i7&FJ0DmH^$2W43tV1Gs_wsw{1QDfp;$HU7gIMmJ6K znOFqRYE=Aw#C%hZIIZSVzABZcJK7t0s8yNj%}wI|-iBy6=-OD5$s#FQZlmR?pK)z# zU3L?1>@Id)RDDa6o2F#gW1*#o!&SK&YMFJZbZU_X-Dd0Ts%0^CzzyV`#b{uM2hCJ{ zljUmn5@KN0f4e0ckW!AVL>#l4Kqp_xCLyW5iq+qeX>cB8Z$yKtslKTZw=c>Pu2kN# zr4-SzbJ-y?R~vS_b?aP>V5~1qi{-j2j%Hr4ntHjfb5j?{EWP%&Sgj z#QY7ec|D8dT(kP{oPi;|McEl-x0;HC{ADXsqM93d;X|?faN=s|-AZ%)kO4FB@>-k7 zPFM9=KHmc4#2L1p*K2EyYA_ya&$<;P!s9Ya#|@3l(~=%H{jHR3R@tFPsf~X#w6_p$ zg6ixXb`m1koW0+|4S-2WDro6T->V#(7S_(D-R5>F0ulx47Hn09z7TxHGj2LzWEY>E z#qoS_f)-|gBSB=Z>v=s~6SJik2Y7unyJ@|vUd{+34B~ruI8U^enfM$ zl~OCuK<={nsLA$X(obW_!Bu7gw;*4$o&k|DgN&2~(c?{cZTGU!Hje%vg|aT0ypVxR z+3VN>;l|BgY=0jS79?xEJd^tkp0mg~ngVQV5kmMEBwxia7uU)mJSEPoYT)-TQWYYR zMIdc%ie;*ZhWtD3QR63JbggGI_bK0p1=aQqfGfRPMKX>mswhjLM>!ROf0J($vUnBaF4zq$Pqi(L zv(M;W@25E?2A@`rzReVglAFpj)nP9`tXDJ-0 z!Ob+6eGe}_4Z5X?x{}r;?>PikLzzKIdoPVOT2LkPLkzcu$hYRCps8Yg_BMjYCwtm` zM>kLM{g*3K@F&1+~bt}1XF*@3c56G>%0zS9Pt-$ZK-Ywqk>ej&! zX7F^bT$3cyfr_jet%*M$81j4hb|$~I#6!aM6$f}5ftovm%&i|8kw zM9|4pf!)tOi~rmV3f?zErg5*Ezr(Qs0j@#sjAFkcb`n@{$jw?xq2J0#*SZ<7H1e(S z)V0PRG{DJ&GAl;bR!2MJBVZv0!9|huyNF;!slWdgN#|3k2YNf-$Rs_{=(iA190USs zv_9O~PPmi!$TpLn1c6ZQz86B;ZEDk85||(0*QbJU{)`Dwhbj~}!i~JkDWeZ59w3G6 zEfxl1jR--TDHkd5nm!~rTZ`w+OI3qfB3%SlAq~|0eO{2yTjogHWGg=-aUuZow!3_-w-6Q{Shg$15Sy3z`HKqzi&#TFU&VLl}auTd9S z&hAh}gdXPEL>bGO%jWaaN6NX)XFa!}4R&F|F7O|nD1#6x6^SyKDK+GJ>G93+|FB`Q zS{p@nBby4p>m@YAxhUI=gfxcUunjBku22bKD}T9L7r)|+oo5uJj^aZ;H%xnD$S4BMrg!5|-p(NiTehB^AAfo+WJ`d;SKh&F=m+E-U@nvyg-p{cK=G$Lm2@%!l=^o?Mow>Kr!XaT%eXgE!3%M&D`bV=0Ou z^V{u1xCa~uj3yrG%eA$^+;~p6tGkEtJ?eoTOpRW6@+DWz5~xvE-A3xqS5p=W+tFB>cX&SXHjB0o6bd5G7(?r=h)ofV=5nRBd-h`TjXXhbts`hxB0z7Qq^4;#n`^5I1 z;3x6qIGQ#dx1Z6{OZJ>vO#E`*M!U@U2rYeosU>>Dc*~o)Df%L<%+^LoY#TxZR{RVS z-9+tEUCmyZXfrIW#XCygZZA~9VVAIFUe$UIr(FWWtYViT>Sja4O|FF{bg=SW@xxN1 z8r-xcZYELwCDgRsK!}O{3_G&Qzso2a#-+IcJ%obR3|q*IYhbF21?UxG>LYHmbU#3| z#4X73k!}*{D5l{M0l7*V4o@be z;ZRbUhC@Ly4X6Abqp2(nhbI-0m;$4wU$8daSs%GCgGFVIj%`m++Nxk|u#e&Raiv)M zT9w&c6S(BZ3DcTW&TzMdrD`Cn3hXx+`ZuR8IhM-_v)9M}%p)$W_8?7gS%d#og9~X3 zu0b&`j>5yBffzV~#v(R*+_bgWM(!@0cCO)h>h8yg|ahG-CjW~thuV_&ovrnfnV#c^WZ?kk7W^ClhSua=Q10kf1$xf$9alOGfj^5ld&hO#EEJA?0O6Zaj_l$U%~ zOu9|(e)zfI{vqajF5mW%S-@u|O(OK87+gjkZrN8xOflXj)VveuEWbv8xzbGG&iO?f(dAT#M? zlU5<#;Of&A>CrwUW5#yzzVGK2rC8!nsY|@gD)I)cR7poO+6BO>_)f3pOGa(v4dm{9 zE`8X71?)#jm?1my=e8kitFf?V#=e4K|S~bLG^mD@RN~bm)8`SvxxAc3@Nq>oU zy=0E_+O4QH#2K2HdN%zG}zKK3lQXLv$LGiC`OvT$Hl`!%Qe( zDx&*7H+nGcz~a!+M6jm_s$Q;S%5~Arlq@$qlqdG%WSk?Ziic(j?YuIHkmZn7JIy{!{DrIu-M#f zr)3V`YFjAi6~&Kib;MzJM>;+?-eMl~DE=L9$;}QsMiLK_4Hp(Sut%PLMJzB=N?4>l zQO)pUuWJ3~Z~opL>RgILPV@$Zi_$=I80 zU)c(gu`qWJJfN81QKS40^3BpXyV@_FMQQF}`)qyecW+^yv`R%eYXoI)Re&q{g(q8m zeh6Lo?>@RwoO4|MQ*0lDCRR<`eiiK`w)q=flZD)(BikukGwRdgo3WLlT1f*Jf01jQ z%MvXmF>;Aqd+Rvik5inUb@#E4mDk*xc-08n&;5+OZu$d^7RlF;U>A`VUTTiBi%S&w zVnB=c7108U6miwD#SB}INtdb{*aot-imhE>zLZ zR2i%lxzy^fu#JxG$Y`r{&(p73M<$@ng}89^OHa0hWSv9IENUi%NvO0o{YJSkE!v zpS*#HH<<{>G3$*F5U0YN+1U*+3cWr#{!)n}c^+-$RV>X|%h>NnT)pWmdw{_`qVIeX zy}<*67N=&2`Kb<_L{a2wzC%Fxk5jD>ke1bueEj4&T8*kN((Z=rW*metv-~<71NxZ`EpE(^)M;BVu)vE*uFGWA)ZIWW9S@9-s7iBYYU-4E)0) z6n1#Cg(ULQw8U(y$XgLis@bk+jJkfn)>*(O%um$j3t9i7XUqI<0?F#L-S*u%{{cZP zTXLn9FOl}b(^f2L9rwuCNPMe_CT9x(L3>MPv>OlO6K&3LZP9vR(p;qlkWp0oeVTOB zpx7$mn%a!lT1r}t2v9nv*KRfjK5)z?=00+XnHUJMz}6S@*qJu!5++8Z%W2}${Uj`~ zRH&06CChIREWFb36y2m3QdUcO2#EI*=_A|8^TQLBfh=L zFLJKms;e-LIiCp)PK~CMab6z{6FJW=(F&vbjjs72m2<02thRT%`lIUOl=HJfCeCndCDzC?|;ZGI4-B^w*^)>9Sh=N?K;uGJB>Pq<2c{Wa1Cs<1d#C~Duq#A zk3mv0mD;c7r$+OoJt4pOp*>|tFt1|h(*e@t_)j(CdhMpKXaUUz_Oxc_+_;^?NbMj} z#Bc*IHs)zfSVQC5HsCa9Dn;1PKa=DogxG3B0v)PsY=on4QAgZAp%HZ*uFZ|h`$ zK+#QzDO_per(ii%nZ}!g0sQwV?KG|IB4QZLP!F_Hm0cMBgDIPal5AwEz1^`+`dCq4 zM;uVG?j#S^w));?fSpLdN5f?mVrG^@@uGFIDR9E2XPHk!~cEgTIUONOkXjxfSk_pMrXY?in1XmO+v>F#j`nT~GM-Ww!q zeEma`Dm|h9Dr&17(yQ_oY&;C<@Rf(O$`5JPE1e~lIT?lp_^Y!MX6Y*Z|GM8Q4XJ#V zK3zFU?Ck`Jt;B&-|LEECTBs=BiP+tIkkD_f^Dry#f6~=1;}LAmKl?X*R;6>b#HLB` znjiZj#F3S>Q1S(B;lnzkSF_;5u66@elX*$|N!9E@5Ra<2jjpQ5B7G&e?2Mvo2wB$TE|nL7td6ec9BhAWUZMN@?n|cT)14m+oel zf0XYadk*rz6;darv;*y;Sg4dA@{gvI#@WD)sC^^Uz7Qkaa;0?SW|8VUkR^5Tr_I&k z$$8;=&OQ($fFcwXxvo-3CAz_X1>UTv_Eoe9`D1-lOCU;;J@m1)d!C=WKK^zQio0kfJ5D4leX9SW?6J}uNM z`>z4)LTAYtTp52Aa0XFTm3_WaLJ@!Y)iTryyZ~$yXMfty11>fOK1Bonf#Sd^T*Y$W zQq^_YUqNRoSwa$zqrhBs=HU5 z->Y|9+F)pvb@TL_^tHP9fnvWYygQm!(eF=`_Zu9RcdS$e9lt^st~G$KqF#xBra?fP z{1v4X-t=X^czWt_SG`N8P*%mClLu`+ZdvdKYmVI<{>;33m@I5?Zng`cvuoxMU)x=s zFUhPA1)!G7b!Mc!ko;ag;rBwNqeii9-{Eg*+lpvkS8puo>@Rj%s`3sku9=@_?VMJ9 zS3RqJu&S&foRyiS6m!i!i#=T$M^*MC;dLZ#S-HFlVz-!vzP31f^qci~{!_|YsEYrp ztOHfPUvdbQ6^mn^5q($r6!E*mv>M1?6x0}v0nxS)E$G%UK_!^E8`P}a4y zK9b7k#~%*Tu2}GkUthue^W|PGD^;{_nvsW;nGHLdNvgqeGY{?&0=$ozonYLxUe&lmK+d!H5<<%~tSa^)t{k4% zK=D6amj>F=Q0i6fX0L{-S3lx=Ri=BMD#~OErF#Nu?NndUjViL;ymB`?Uio060hgJw z!E`9oQEn>M8*~&=0DDN#0b(+wv9gmbi6FJ;)2!25K{3f~D=@G*g^|7L*svU563fJv z^1RplH6)68KP@Yc7IHc(C$>Q?Ir!5bmg-)0#NDu&7CutZz?ZFoIhG4Z+8*mkW_GxH z54qbpEs-sP*&S-!-P`2W_BwX)Sx&`#lpN-1gSCh(S0!2zX4frVR`2rdm_Hv0WsmMD>I}AtpbrN|M1J)& zD-@1|!2}8vCj^(Y2rJr{L_jh-z?ElEcBqCWMrr@QdEbw0M%VRL#wTB|O^wRPF$f010G zUmQ%O%UymMw50j-vmIKU6D6D z8R#annS>o79TsC?meWH4>rM3FdHta}U2HS&)4DUF!7rrym~gZg5N4!?ca=F2y{q`{ zFBb29vv~K^74Ax3?7Gs^&|(lKwq0bD`Q_M{R)T27hshXQ0#7sDqD%o z!lwqd%-u?cI3%CayA;IaNBg0+54U}|<6SDt>;X7vE^5@EdzIq5U|;@ZR(sN1&{_=1@R#PLQP%GGz?X8O5)ykkAe9Xj@4N?2Par&i1J9ki3|3dWZsT(gZn}%= zvZXKLGx!L{QPRo&GDfErRH* zB+_Bx>?@U_I;ygRI~X*-go&B$^@wb`6+$k`8np*;_S0p>SBO-UMFjX5J}6ZI(GtG? zraevq8QEiH{ST20dYCN>Fv%g$evPnk%ap9=)-B|Cncojniw}DSQTD3L{S)Ri z`(klgUaymStyw#-X9Lr6=G|^87{8NEJF4QZl&X-w zhrG*wN#<+Wg!#G>eX{Vbd$bjNe3*trD2wZOl`3P(Qzpn& z4oe&IZfZ`cAf;tOOLULTpr}W6@V%`-obSIew|2d4Z%dAPm?#3CO=sNtWJEJThF^XVh)`iE^+#4d?9q_r&4``a=%mtvz&@O(VY?YVGKWd#nY3q_ zT4Cf(kvjhbp{g%_$p2#ND*d{z;@8_M-u#}5U*XNe`s%6Bc<|q-!`7M1kKYjdHl?Bo z-WQES@A64zlSBsn&ag6P2637flq*>KX$k+@ce@$1?@KuPo1URRDC3Kh4M?#Omu7s} zy7&(C6{GtFSIek))4xv*l=GJoR?u+IoA?gpRzX+=kIi>^kBtX!71>lC{Ms(iPeXDo z<`KyU8K$GcT~qn`8|}0CI5j2n<@Br^>6HLuE}F{MlFzR2dVJ3OGpvN25|qSyf|6+0 zhZ9sE6XMJcSj`mZ=NbJeYl(MNR2y!;LfYK?sGl3LAYe^H*wv@7ZD0`it9$ zzTC%?x#e~Gcz(!b&3>@d{onzzgi>Yw`-$(mncKg6#dDkeN)ZTGa38!urnZHIq3mFye4B{vJKLH)Ck?9T)`MW>AF4(e zT)~Z7IA3N=l0Ho zZoLyX(>B35ROaU^Gp$O~>n$(phOo;l<|1XkM$e1n`R=k#1hdfS^Mj>wPoSttRfRB( z#iZ%10nj2+r3@q>R_Qb~#z;KvO`w9dcQNJhDwrULzAyo0;+0~;Z%xF6i46R%37D|u zTbRI}2nnOUZcLDez+*xsvo4pzZYuecT22zga0#2__Jyo|^{R6C9TVkn=8iCL2}u*G zGs&C?;>|BRkA{Jg#!52xqWJ$7Nt)Go=EF%u@kEj?m&Ik{D3a{y@I40#U6G_;C(nx$ zT}Ik0kg(2skz5*FB9o&k@7}MR=nAQ<7~Iuoy6GBjz|1#zrnUA%O4rvg)7kPk#T$L1 zC82}Q&sP4dRs`*o5h^oQ-S8y^D%Z8|xB^O_UTL zuj@J132BYnvhscq5f3c1qI>xJ8g!(C)Pe67q8{puV0Jym3b+qX zC95fUaeiWKvO+F65VsU>4TC`5=G`YNW8y;wwF zkC~(sCb${K?N#c48^yE(kH2iilG%V=Bm7WfP&U?$ch+RF9DJiyS*>|Xy5esYdxyyU z3uUNNe6Q@2H`;qrX2zLB_Dlj%%6JJ1pJiri9)(}Ur6dOJB;$3g_>vVva(Xu&E5pd* zG%?>S{9!>!RG+S&X`7v`VH0=-6J}%7(2!DeO5e|Nx7!c)k@+W zMs(vuf!=9{3l7y~t6&;s%h7jASKtVy36Ol&ulivdWb1kGpzTsiVQI<)(#07^OQaas|jxWU7iv>;>yN zRVR?UzPFo;Gnkz&+~}#mjYpCxG~9R-Q9^-5pTH6cp=}_}^z5L8IyWwZcqaTxa?LPbV ziZ6GBny)*UQ9M1 zNHh!?7rrSPH5G!Lj?}*2li*b>YQ8gBuN096PxDT1S2Q&&t&0M z@*QF>&5F7B!$+`eI9$|rQGvd+DGqu6mVY2i#@->is#HvtN^S#?(Kfh0YFlS<*PC?A|CDyZyDpaM0U>`L4e*MQ2|VC7v4 zD!!dp3jnoO0_rPjk&6sMXv)(=`M#GI9cO~D-pwqO?3Threv%k`W<%mcg3`o? zE|&RFLc1krW)KImlcgb;%dZ$F_~t#F&+07k%3`0qmK2nvq@!uhH>y9V^&2bM{Wq}k z>~sNK0}9D(0(er7WL**9+5ho1!&@6XT?f3AX5WDD{*`aRdjdAT60&*a_&ovMBKols zVJC=If!~?0gQ0v2!OH-yy#vKi0>E`!;^1Wr@9uUgL)eh8LSH z=itS{at^Ldd%YVVJ6&55DzEAz9>q2C5{jR@1`B6XST7b|R%A*#ybKF3Z}y5XP5ShD zc$fgZ*r#%U7YoY)t}ueRUA_hHYYU|xW<|~Ew@;G|x z6lY#ESn$fVjN?k5P2t%mlV^7PoIjc-`R>0Z&-(RU+`@*+9A@%y4Oc(I)ulQ9WU8C@G1oTis`-1T zkl}r{NT~Xp#mdrcb_z@S!xkdTuoQb9j7{s!>U1TP4t?9n?0;tT=ndgZLYmf%;&D_M<=-h%;`95ha=VdGj^DRW|g+OwYn61={o<5 zLtRuz%BL=m_+LBxvnKy0hK-)>@z4HKQi~O8f3fr>{lQbMORO+YT2Z8le^}FFrM7h$ zAhPf4?bjrqGR$@+GAJj7u<#_mF(nt7my>*0c#?%RC&|9ldvaw>vLj=xgj%(HnFsP& z+q3uTulh6bkJ4=>X(hy@_`FNc%G|)|CsUctDD{J{8hVW$?Hn22(>WTBEBRUxtl}8Y zl#9T&GyfQ{ZLUbPzM%o!nW+v!U1nCx@-Jt3*e_W=;$7L5*_hp`lwI7k7a#(!E~FZb8bP4&RJ(mRc`pJ z6WrC(%>}mw_hK8&Cfb3YrT5&~RbdYjSvS zs{P2o*MCqjQeyr1GxO2Q-90O0OrXA=J6oR zWBES^<}o{M2>)C|0|#%_xM?TdgZH@X7MU+b_AWk&RC04?xSBtebcXtxZOf-B$apTo zNL%CS(2;aBvx%c;qsJO`+ai$;w|NK|#R_tslh(p!&i?K(w}_I}3VCxN)*3GO@mK4j zqM9>yYTWE5+p|>%Pf$2p$6VRfFDstiL(4jzghZWIj#sZ^KjN9|C_Bb2%wMsJPcj1f z{T2;|V{4;!$sCQvc-SwSCd=VGZf=bgcz0(_JTTJ+sBTToZnJ((m8c-zDWRIVWJPc$ z{hH)EKB>iqQFp&fw-niGB_E1b5Z#K!yc192<@VW)vt`XtDDX=W)Yj^Wn9As1%AEl2byE&&t zTIEvKN^f(sbOLq6p}0x0&{%qmrPdr&zl;M>Ia%&7hd%Ps z!f33A6MCoU6Atj@C?l2CaBO{^66%(oLe(7D%ZBnd>U3XN#N%g;_GWH$b4T1VB(9=) z8+8n$1hc}A{xmW>ym=FJ9&OQXftz4G95vc4wE&Qy`_K^%=uk&yuohR^&g^zBV|G^J zoS5As=@LDdrykbD2j~w8dGzO2%o6oyRFGkdWDUjOx=@A*5S<4gIZDicx&Y{Uh~5U^ z133Ha@Z1IgP5=F6-^;T3Q$y>L1M)mab@CHZn9+F#CpA^=#RRHLG*0S1ldM zcOUI6EbZ?b96Pa$_xc9A`p3HSmA258ts`scHIcHu<3nAY{a5T?Ds{MT_zfk6pXeGI z?7^1(!$a-QT2{#?R@T8d!aGW}~VBBqHkH3P>7QBQ7T zNg#zRdfcrXZlLXNPaDeL)ZuO<|I~hQ0Jo(MEH-VtD*mMp)x)vscDrfsb_*ZirK1gY ztOVHwiGJ{%p@r=1pm`j3Rd^m~i8D#f;E)-kvrZjL18(EAK`8!=yFL0*4y@P^{qrdf zYlyxB|G~8A^W5L1qf@Km3v8gptDL*kWnJ6CFB(l+_m%|%oo2^%kGtD+I0ZJjz4i{z zZe;RApG;k-M{lXq*^9HEhcUp}5bhC4?{jtKgN3?!Bb!WNnbpbu^I^~R4Ze`0ZEWjx zdUC(DbO$z$tBxKNkBxAx)WKtxqR?+}x5KYFk@S!bIp?(IrL1;X>K1I|sB_Ng7BjBy zcQZJD+*NO--|GUjUx3xka<{&fBDQ61q*e{OjT5}1&z<6oi0CH(nF?;?0fnDEHO>Ys z=xgWF7py~=S}>_N`hio@*=D+VoNyNZvONM6zn{9GhFZnEr?bVz5^90_&A~g!w9I>! z17Oq6d{pnU0=AJ?2?N8>yptoYTX1c$uQ^$kZaJCNY%yuRBDR$f2<0={tt(il%Torm z%m#mI_d5Shi+^RKFZ4jqw7dKD0S9;JvNRm?%^@B72?!!u)6AB``->Pq9QkqD)#*(1 zkMN7lGB$v3A7t{gtrsw8`C2sG%*J8A+)kXW;`-Bw*S#Y=Q^-tS&+XO~B02r@~W(djMp zFS@0i&`#Y*@H?WPImOIxF4!@ie}JlaI}hec!}##2f~$-E5I@k|9iUn-T;M0c3MGU~ zpj8zb?J-J9^b@C=&?yZ6KSvcaV@f!SJ^EZ4wWCKebZk6naW<)mb@WJX=Q;qX1rG8B z==TgI5|Nn?j?B?6uJRtf;A&=_2Anqw?$67i8vPWNgN}cyv%BY=PS9vo%=rTxFGqsX zJebR!)VH#W7F#{HI z)W*E*23(%E(hU9s2(THvUGJJZI^6A#xF*fSJbVewJfFv~ZihUY*Ko@=En-gdP*Rq2 zC1-zmlUrhEAkK^5W9`!0J3&rr?R1T-&uu!%F*?hlw-j_hUQ;x!waG2B^B5PV*}4?! z>aG})s^@HMfkvZPN9Q-NJPQ5*?}@)m(~uVrwzTLONKkrQ7yVA^5|u-jV{X}~yASn5 z2jT5;H=`QGXRJgSOzu8kx;{B~+c+M0q*nuhZ1k_}^o1S% zbGDSxE9-sXq0kVDnY9s?y!i${Q>2ikdKf)X@CEz*%SKWtQud*=Y1_=-lGbBO4YnQ8 z!~Q1j&ghp+A1R#!gxFHfFL-g(g^p1LDCYL27dWIr|Mz%~5v(-y(3_XIKiT-+LWJa4^soGP4- z>wC<${KqNZQYo*kQof;V&sS5Wloh)?uEGETg*YDzm2xkVA)9^Y6;#Tq`2B|RRq^kF zi9t6k6m`RAjg#JjZYWLhd3Ouw+{l@%{+C$VVm1}MtkegsZY953;%DkncxPk2o^0LiZaM8%zuhf*&@JS^GEUz`v0iN_ zBcKme#k-AMtEI^GvhYpmY@Y~_^6C%)gf>0$-Q?uw?gxFv{8vm?c9$WFpS25aLFO;h z)6a)lV_px`+vDa9?v{V!?Ov+WOJAsX=@vivdMRI={{?4T-PT%gfQ#XP6eSIN;%jv2 z_4(Ra-!T-#%Lj0%G|oclg{o**A@G;a1;yj(psO7Ax{5aI+%KAc-Y-&G9^DE&Z8OPr zz-EQ8g@v}Wj8vLIm~}>V&CyuFtrO93hxr=+2*z)XyQ|&Zy3*YwHnl>|1^afkecKex zHAUwur!KMTRw~eUgor_OY&@tnz6-ZTtHm_3)9W!b-iOAtYHoayf~ZqYv379$u;IXx z4^tTWt}mm1eQWw9HcXipM?VeIToliRIPg%;VFxp*R_gs-YzDB3Gf66_f>L-aL=mXA z195dw8ONfEMvQ#Vx?4b5PfT1mZ!6vs_qbJCc;WZZuIt@?5*J4sXi`$R; zf0ui(&8nre=GB^T6HRxH4fe+Sy8TdSdX&vW)@P;NTY>G%p;hxas8r=#= zQGUa-Y`Sn8BOD} zM)Me6tKir~V${bE0Xrg2?QY5UyG0mYt51@Xx5ur13(rD(&*Ml z<7nVQ#f-kgKB2yMrnP}BHP^Xm3lR65aYJ2LX{?Frpmiw;&zQOo0sOUI#qcm^^3PgS zY3lVllV7om_jT!gUe+~yvT$^0u)?#QN-4V3mFwyD5vF3m)Mxl~=jDVYj8qn4N^S`s zRYsdi;in{&OGz=5TgnIGLwZ6c5w(Y8q6wi~-mMJfQc&z!W%!mS{X>Jj#i#r}a^kNnl73<}!^9LPD-EsB2j+qsz`#3a@g zeVVOZuv?`R3z6H=u+q_AJdqx6Y~?eQ-w(R8lvT&kA3rh9n@U-m)!xXCXK}aH`~BBl zZ*}zNPo#aNA981?baV8DCv4YL^!3d$q2KN{uW{2JaZ@|ow11<84QzIv#vQ}>tgZia z-EEbohg*M`_$zvUj^i}{J(wmzS(!Umtsu?<^SZ%@n>+*x-6T8Kx*nDx9}(2)V*rU zFO_of(*~li>Z_NXW?o81&wN{ZyPAvsb<#O@fZ&HUc>3E61nuUqm;vQPseidjril-H zy}@|Z#MoY0f+7hZox}frxz_N>{K&}ANML}a6ci#}MSexhYG9~)bZmHdXe4l~6j>GU zsF}g{a2Hqt8ZL^b;rrTzp9>snh`!{AYWaAU)(0<+en3I2mqkR+Z~ozlbfZW7GsYOw zarF0|Rd9T8qu#k&X}8N~g)V#IjU)OcSoZI-Hp3!X2o<-(6sYz zvY6Xhet7j4flc}3@mZ#x&u@2=$-_dJE7^*bwT{@nu|s+HF!~j$F;@CMFYZNk@3%Th zAvkRg02Rz4zLP!ZX6h4}_tOptF9(0K|Teg~S?UBAe)Hg0)8&Ma%N@uaoK zat~ z^=Gw1LDI$!tBYuau4>~}-6U(k<1Tcxdn;nCl|f#H6ylU>g7*1~Q! z-xS!*+cAI?iPO$!lb?2LN8IGyaF^Ssi*M8}bJ?X(-`*FDbpIkDT>?3E6d$Xg;3gBi z-}UX#G%V{eRuifIvsPF%MTe=YgE84I6} z`+u&Zx0h5cz3ubWUQcho<2ri#MO90nvQ5=;QwQ(ffOJBg+u+>IBqB(Jym`K#Q#9>* zdOR;WYjZ2EO0fTn#DlVTy7X^D?>CvLo8F7D_es@=&DZEAZ#d&6!Cv&IL&Ay%UgaYW zXC#eSQ6@*2RW4x^Z_gIRzIRiQj&343>i1l_*$l$PGo@L58jIjc*+s8hvy$3UINCST zJ={4`IQfddFPUnuT`p6(W;H?UN)2}wj$W>5d2_O>bGR?pH8j9G-c;=AAL=X=IgmFB zJqJR4O^ip3xa8Ipo^E9ThqWX;n~=3=CSOSh3R#PM`1RP4W}F@w>*>jlc*awykyQ=@ z%qWZv_vb6d)!)}uD&UR&zR}Xa`CXorRKemZjnDz0OJ-NUR6#~Mk^fCJZ%dpL>M2(h zCmOT!A+bLXBo_S}&T|My9ugKJaT@XB^F}ZmF_f}<+%yC;nL!Sxx2Km!?aBsw;;u`0 zu+i&nq{=@k0X)nKofZh%0!Q(QxWJZN_5)@@+*WNtfURfb_<8>+*b|#dK%e|VU7UQY zd{j+ta(}^7u+%#A)%!%9)^HUBtIQ_Fru-Fet9O}uA@ ziZ1Dn1q;VeoAmO3=1B6kT~r#eGC}+x{bg58CgvAOX^aNicZu`;h{E5#bNo{0eg)s# z3Dnkiy6PX|+jskcXI4so{iK^hSSH)ElY0^&aIj|OV6}BSmr&!f3%&A_`CYiVMc!%k zMrl3R*7m!@mJCJYbf}c!$#*G5%-+J|YCp5c0)7hX=byz9yIS!)jcap)y?OPoC(de>dtPa)}T zL+Gvl-Qjx)4q5N__^lgzlCju;!;o72tE8n{4IM@3*noSIFT=KwR-J8dh8(dErUro6 zj|*h8OkuX|2Whl+WzuyeZ$TGyW?hocQ7H9O*7QG<72Bz-*qfVrq-jTwU9yT@rYY^l#$xTM$M9JMG$(>ppw6U}5fKhgnC!SSG0D`jLp({l6qu$heJLEajWgnnR zdyIG;?1FTsYC;FIe)tkN$3~@iZa-_G*14QN{u^|)*M89>-OgoX%AFJ)YcA7g^yjQC zgGy_gntiGmq_2)%IwcQMee_d!)not*nk+pxg7^XTxMT|R@`-x5Ux!y_IEF z=6j1inlXQz6;ik0UUQZjN%#AUv^19b=s9AziR`wHF}-%?5VUNUg3NY{t>rg$W7koscA z+N~9-E0uyX*zkpzvqo!v?{rnOh$7dxs(q5LyqTVfU*J9dm06hBCrMAfTh~^1Q?pwc z!7;MYh~(R0k_(})8N^~%IkGphiUUFApLi>Nxoxzwa5ntt*sj7{t0IO?J`CLzhP;zWsE;l{2Rxn^b=no7*vgz_qd%Z-x^|rLN0ZZZPTr*Z z*%A%r3xoDXLoLwO5NqOJiVN`gmg5|*yqVh*^dV#ijK6h%Qr9ZZHIwvHprVM zKSUR?t?1|cigiG#saV78ewiiQar9|0I30Zq+$=+p3FyHKf2pLl>gen#@#w!yw>SA8 zXJ|E2&ME}L3pH^UkN*WJ!Xns3$8xr zrzg(24U%D=HMbsz`W?Mq;`lMEB5+6ypP#t*ECF5vyaeRR4oLc z&}fHdOT z{|&QH-MGddwO(bTe?%yePja2#h;~0Sh7H8luGBG zg$;dP(^q8jB(DbFU@JAym3Pv(Ai!Mx%<=S0!_1!-=VD{&=wJQRm!l{vewBo|=)7Cd zKJLGJ5y>!#JY%l7$m((!i*RYh%+QE>46wrVyFXV1VbqTdFOK&_ta z8QUd+)!R4X5~TCem`$Str);f2{4TF`qW43K@_R1ce}HQM8&}&T$NkPD;8&5Y&5KjPuheO<_9vCy%HUGZWLIw_%OUihouZ+9nLWTNuiV zi=vOFFP3oR&%hBd9tW4;Si<)P5Wd#1<^50iRs5F#+@x3uz^J5BpUP0@^REW#{E(pz z-hbIB?E3HXc}+S3%xJRoo%-m5FG~ZL)a^LZ$b|hrI|2KDE1f>8{IDt5p+e{>*^ByX zx8qhWo(-m55{~{dGX~;|y+mIEpTt8b9=gO9sx-37^NSfGu&coDZI{7sQdY*vB#bdc zC-ZYZdxJ*H{N(%>CUwDi2^?zwT|YT8&8}Mg+e7u|Ri#Z&eT-6|{Xme6TKQ2w&5#`p zSx^nefx+@)FAGZrcSA=6%U_)U%NKy9rUi(6m96Lv^0Wx7@Qm7x@a2YB7<7ZNj~j$W zHy8kTtG4_l0l(rUWt>AaHcONJ1{m;q3MaG8hh6l>`Klb=!d zU*wTuEDi1M4k|~PQdk3uoDrYyz@CvN2};nvylSA8;xk0bkCJ;*&VLx(Sloc4~nQvxT^SRalcOiqp8s+FuUM0 zpI{Z4v^p=8AFkkj5L=MR)zL42qcX!JD&ca!WEhxeAl_a39X8n|rSpBkpuMuv`4d)Q z^wX!#+Z@e~{u>%jbu@^>KKhkYUZ?y7?+Ae!6o7kQhw)s$>Dykbdzx^rgImj&o^4L8 z|974RIgAl)YsvxaX-AC=TNYnn4!TpwN9nSaq{P>Z*`QxemCv(ax$@h#6cBOJ- zgJYxl?q>XxxsiO=*vM$#&>(jMoqdC3qNH*?ef{~tp%j1Y{ZQwFgT>uYsBh0u_gH^E zw=-Y3x38;^DjXfjj~*TB?@pZ<#aoz9b}iufwxNCk$$XOZjk2xg*re!__dU3E_x4m_IM+0^ zI*;!k!apmABY8xr!6UiO?(XCtZ|8yjd>IlB_npZ1TfN|!Dxj;> zcq~6s5OxlZ5{}5z-CWnvq2b)<*bz&G%HeSy>mQQ7Iq6)hssGv^&AZ2N*x~| zGpxKj$%q5kA(gsJc`*V{QZI@;Gc$auy^1d8rF?sti8#akexX9wrFdKYFyU2f#9*k-^S>Foo(!dn=5L zbrnjGInX)yI1|rHss3ZRLMPlKPt2mLkQ*HaQM)z6kbka!tdLt-q{#hnh(aO1YjBhi zGFhP$Oz{2^S{)@`kpr4WxWoC8E=^5%Q-Hj;Pr;F7vUB$aD3raiyRY}CdM0q3I0+cH z1EGBfw=1(HscBDsq*o9=7!W77qjOXYU^kPq?}$)5H8yx;Xl$^X!flbL=_qd%p);AgmtH_`|yJ&_p zb{0mdMx5Wj4PJnw6;y$kcwl5Kf6ykm92<%pDM0rDk!#P;$N-6txlxd=gmOk-fq{n6 zhmZCH*?dYg-pL3CiF@-(^E5$qTr~Wa+^B+ADW;7cGK1oOFxeyd5mA5m(xx%@ zkPzO_sNw2x3W3HrjgQkgp}ywE!@q}FEArG(&w>1CC*gf-PS`RwI1JxNi7f)OuE%qQ zp<%Ue0#EJlKlxDSNEn)7My|K7U+^s=@_~H!SP88UdOo>rXz2023LNO{A3oYCFhix# z&B#d38Y~xWfl`t&9~e?IYnN+83d*HSbU-CtsqVhQQQ1M%IPSBLL4!R(nb_gPkKM zjqy>vI5jX6t|mb1?Cu=tO~$l;tgux8P`{uCaGq|4xe=YWmxxt@o}!WNROmoAEJv;T zKq>v}8KQHh3M8V1rV~`#(>YvJJc9nRrMr9ApokgBm)MIJ=uo+d`O!U{Cj?hs%#YA8 ze|L;@4uDot5)MjGh8FI%Ap}WTK%FXAd-ivgBYOB^hY-?}G3*Hp*xIQM8PDCO2}T%F zkLDXvFy*Hk={!vN2x#d=B><{W<@);u`U)w-uH4X|^aw8?j6V$w+r*3wj`sBq=DQoI ze_HEbwBad+R52VlKrL^~iY1}qsnGTJrLH;lpoM+zh;QQz0u z50F4{Se`^E7*wk6KhZpX;b04xxVZOdS{O)r!& z*agrBz%U@oi>ANk4lv)sZU9gke9oAR=>eUiCIpOHMQ?nW+qHMwf$cj|$So+bTSO<- zFrY&qcggt#r9k=Z{r!EzG^2@=##N40+lNQXRIIX(JXUG$#OOhtvGUKhb`6$6J$&Y+ zN>M782}OfK1zsddM;T)Tca72$DS2;6Tj=rN)<|J@N7(m96nw02h)#vZ_n|cPcS=f! zg4}+XueP=+>nO8jGca`IG5&*zm=-A+R7Qo6c0TANMMVhhMYAB>(j>IsyWM7?B!t5Y zh#&HHhfQ1e^k&q8`fa*EZa=dn{%7{oD2Wjz^_Mw%U}$*jP@yn1VB*lA4)9@6u(vQO z5qw~SC>c_5G})y=@96I<8}AX|7C33yY-~H4M?j$jK7kUzAK+lUJQ2udAlHpL*kgR+ zNRMFP`6HB#qIg{DsZ2gvH8mqx6vq%#LnD$ZR+*=Nqa@go6~O}o7}RG7bZppb=XujT zy$JNGQ*O(sG${S=7fbNA)$us2E#Gf82lMbi$Nud>H4)D+A?4qv)AoJ>w!Xn`;REam zK8eBs?Lp2Xd9OB=>ngJROe%I7&aqgJnBr{+hFN%9S%&r0MZQ{#o}iZ#oP zQH^#U%Lm!jv2*+0+}`c&57@K@1x|w07=o0)k|rhmIT84&y;9O6y37>uZ2nN^$l&%9 zjOD?>J~4tI1I*qE$&v!S*WUvS#0K{yrlIHjMZFAp?B^&T)xmsW7xV8s2B+&C9FY1P z`mR~aquX~4jmXOAKbb?OqDyz@PBI7FgLWmj$goRbBnf;7yJ0sbQ|hEQ^}~!C+Y~y& z-j@Mz)1AGM!$-c!Fp^-)7CB8QR^?kpx`0Z;LUxuEZEuT;tCwlfCgVl}xFNIN!co2! z))^N!^aIU~c8(sUS7puY@5?7jjXVOYS4pb@;F^oB%eWe9Fk!XF`k=br{*%K;i%fIt z(21?G0*@AuP9-K1M08o7NBf5uV9wZuhT0E^;Gi;Za0ZNuLG{Uo9$pcy&HlQw+@e2# zC^E5Ss(PYe1+N9o2j(Dk#gebk)Jp1h1#L0I;mdgtwhM2ur|cIj#8J~$U@8|cSY*4!XD zU{4AD931XP3Ft{YR$z_U+JPYqN;5>bNk1-fef9=RhQKVLL!e6oZiyM#g_+23Dfu5v zO7BT*jod-aTY!}4Kk**e8$;!651TEY81==m94r%y_a*vIk?i2-QaKOG$}w&M;q3@I zM!>z2|0$WSa&VV*?B321F=vtrv10^k@#urhWMI&ew8m0}YKFvOjJZIwnyuyR*OjilPk1R z?k*BN1m}r=5+o+ZqWlA4pnDSnE^#PHLP$Gto5+wU`BaZ$(X+GPK+5B7x$W+eEoH8{ z#-cJV<-(hEz4<}>up^_=zR}Ow1TdFBX3i;7FM*d)!O0-e0lPU(L)|zQ@IT=W z)ribPRN@dKs^+#bO`|v^FsCEF($Uo5P%e;gYQG7=?FSC*JCN!^h+ghC)&w5!>xKiH zSI)Ck5e1T0V-N<&#o>kOK+Y`CL?YQ>l-Qfl1qr<#JI$?{3JPQ}BA6WWngo+^5LKW| ziAIGQ-kt9$9FY4b_4q&@Uxi>02vx4c1ev$?;ZGFLH;!gNGVCC2SdJb>Dj%eLXM7~i zk=r#Y666lq-zDIx=PT}2{Rypv%7fXz-OTQiq8ZF#GYrs@Dh&BciE5Q5+ERB$s;NC|!id;9S5mVq!dutlDYZKPcf;gHJXQc1K}Pn&Ya6zNi+83^2i z?yM|!$DB-F6kJJFIZ>{v&_&#uc)>#lwwlf@^=WxZe^=PwX8XHRn1v)La~*l?KCu0P z2M_E`st}OC56l5M@U0(!v@3Zm#)S7EFk-KrV6E8e!>HJaGA$2vnJs(&7=8wE<-WnU zjP;FJtRncKiy@EEdxys4)jW z{3T)N`%i9BP$RL&!>pi5iW5-P@qFjwmXPj&12>WDA1|GxXWzgs87B%X$<->+zXUD^L_~OHM2$jGrlypTmA$~r%0rjDtEVUuMLp&+p^t)nc*_8o^Y40Kh6i|# zfPJBP!i#Ve|60OxjH@7Tw|UP|pXpjDGe&TgOJJq&4d=|nh9{!_l>8Nm6FhPE$iNXZ z3vOI9ICk!RuyNapdm2|XH#Ik{Xl!2I+`M8%^NPmXaYZ)X*I5V;mfmwmfNJg*cF`T#|3?~unpw1!RuP=!CH!g0}WAu?G#Sn2&eIVegNs)VuX#{E(w|pYSkPpCDeNfEThN!|DTyjjvXX^1XcMvZ70J_LYXykc-b^B18d;kL8y%u z_0~j{VkX1|69<_0zn5C`s#zJQQndDXConmR6hb5)c?{)^X!#L*-G+lu2J<}FZNT!R z2OWsakTQ=;r(}i(EPi5;PsCXz2JwkFy_}grD=+nFe-}Q~qMnq4DBLdOaM$7OYDP2Z^9FoyLBUS1;hAoMJcBU?b)P6+KqF=nwRzV7nHB{ig`tt4KWR=v ztT{aJ`2SF_`0?%fNCE+6nceilHeb<@lP;CdE0U@d+%9o5+>tQa!4*M|2u*o*y2T=r zl6KUrI=#4|VIKnzFYnA3N_bN8>iJ-c#TRicN?cWvRT-+F{`4OJCp!C!s6pfogdl3w z=iLE0Obt0@OqpG=nm~xOTD&lx(uc#8!%mK%*evQZ>CwYpVWpJ{jYr^4RE z3pE0Y_m2$>V!B#D!&hpo(yNsET(fx4du+={wG^0!(JHY>ME{%q0`=Gj%H5 z#A44u_n{}18kLs`IGBlqqyG|%970)=y<2jx1TD-Mfc!4J7$$9-qGTls@Hr`EG{8t$ z?#STPb9&(wFw;A5is0WiT+nZ`s}v>h5FyefpM-a}23e0gmBB*$m`i;)cg%Q%|Mr5i z!>Fif_R{J^*AW$1 zeoV1*bZY~7)s^HENQm3x=F3Z zs^or6Ci{Fjhn>T=6kTy`>;vi9il3!y9del^3l;`(DcuA2k%9IB9rk2 zQ^;hhPYLk)b|SF6oHhUB@UWsHme}C~GKOyjJOkZ^#)*89JPlnmQ3VG?L?{Xj-X>g^ za4h%~Ufb`dC^&19Z>8|;e(-^n_l7jH;PNvxGg2H*LJ{T=HP=%3)`z(Fn!jAyVk&pc z2eyJsp@i!P#|A6?Fdl;Yx{T#?m$QJ0Ifh=|^>rDlmeF2u-X*?wbaGG$lR@rRGFs1U zhf02Wg6y5R1H3dXj^3F09?NUAz>OJ-G=rxel_P~qYk;#&$do#c6HnWy@t+Bv$MgAw zZ!peM>cv5fWjWXhqS0Sch#6iy0)`esp$rpEX-C5<^ZO70`6mjk^p zLGwiuw-L(-eJ!#zSulfOBP@WN84_zO=#B@AsWaS98PCWSj^K%lF1_8-`HC}}K2XcP)C;pdZ%pej;0yV0}`%(&$b5>(kjj<-Lp9;`b_d3hDAk$AmCDyNr0$TGnq`1fk|>R_ue6aNiLJjBpI>|GYLufso)N_ zSZrzC9kjM?Rq0QDT5DUexV3Jy)dJQ9txEm16|`D$|9#K$J+rOmyOL?|C2I!Inyu}xH)OITp4>C3E00pe(fPF0P_;A0 z^>Lg=vpZaabrd;^!sAZ$bwl+=e`C;+SUbF_zme&-@WJeoflWAvaR?`>;0!Tz=HQXp zOaM=Oa%M(6XNAXXlC04ZjhvEP&X1a9+-f5W6fY@QD1$f@gU${^FWI_C=Y-mh&`4pN z+KuK0a{|n2iiO!7g00pATzxw{jCDFape6^gcH+<(e9K`&|S9Z(dzA^>lnf8FKuF1e)uP3LY*X!$mY6!wx}@(? zEN$z+(9LYCkuq3>L{tqqgJkOl(}(er2Hvxb1`Pd2+t#?0B5us+!Ewy^)l783hfz{( z0TyE=t7TSTZQI3bXdI}_u$JUK#ZE7_>N`2}Fd?IL$qTek2V@Gbez2BD3a?Dr6$Nj~ z9+Ean*e20(gOd=g{*iU7@uUdW!LEWP+SG}?*Ghvoi8EGSY}q8IM%43gpPaO|PFjkh zid?;JMB83%l{NLK)>h`+!hCO+K~s!SwQ0{r`Y*Hc*VZ3+Y0$cboMiPL$Kl&OIOf*6 z)Z3r>FxuzU0~<|*rtj*z1W!ITti^elGx~f_Rvxecajl*-waTQ!ju|;wjB2fI*sN7A z)g_+-G6oBh)8n#|jlm~MALhTARao{Ju?T}{nlu+^pU})oceYbIB&i$pP|2ZW&1O1hROYA zV!i`PeKkA)mwI6X@s{k8+Tc1!a-@=O}AOV$ppW&5S=k5oR`aLC&coIcMk z*)-4?Y{-`L%po*7)_@~$chK-YMw{q_@`oLsK=+Qxh3z!CA;?*IoP5@d+t(*BqRh znBHYWDe=6kB!$p=QR<{)6Rc^t6L!e4dTES(uq7h3!O&9Vem^)pj!Kt#4qlbh8c$Z? zbga~r&CULe4ec@@$p=(OyfuNUF)7V!)DJdlE!>=u83)cN%b@@@*heui$g@nxfzVN| zPvJO{6bf$(qcPJZVI&}&!9txny9JS%QK~ECRIN&t)OU~X#{#_7 z6j_nO%@{usY)5+Y4G~7U?nkK@TL*RwSQ9U;ySMqeQ7>(QYJ<~anQTtDC%m4fK9L2O ze$oEZb+Mw9XfLVtX}i~g7Fc+*k=Oz4Gpz%c!I-aG@0ps;_q?@QTddI*+oIiE>anGo zqfgZVinmKXFj!m9#&b?_YrN6xOSQ@mm|H3Fk{as^`J&sLorEI?WwA;|WwYw5UD_;Y z*^lg&EqXQbfYy67U0dq|{TPrSJ9Lzz1wdvfDC)TqaIKa=7>K?aYth=}u)0~1nw258 z-*wuLjgCDs!j=Z$8Vp7;0@{U<1SS?XJWJ~UZq;g@h=5~cz+v+V?Z^fOhDI)0x=f{@ z=idz_Fl{($BU@`AG3LZ+m$rV#b*GaCL~)zLMRPW6RmsLsoH1#2l45S1pv;}%FUtYH zbp_9$gk-o|hXqs}(An4)eY&*gIziJ$-+URs(=$`>hc#B>OwLmma-=)$}?{We3iCUI)lgb$Hv5E!-~AJO-^ z#5gLS*{UvjBH!3ZE!o;lBO5TYbob2eHgD_*}D%5 z?|OPwM~3Db9E8>x92PjSN)Xc*Pi68bkW_k$WRuq)T_Co`6mr_CmP}R9Q%PgsrRdPX z7H)*0u5&d5qYGcx0MuTKPQeUJi=$M6L|Nfv1gfN54b-&nl zmqj9LsrKV&jc&!-^7zCQws^3Tp_5H49JlsP9uwi17f;Cuu_axmSM#)>V8gP2eu<4y=FdjT0C+H-wGjW#~pR zLBs7o8IIeUKT9_{Eg0Z!uykRrnoL<;^L!ez6p5E7<+)7@Xv>EFnx(6DiU_^Etcgd`=1^U6 z^n$02o#g<|-jzge*_xLv3zs@EIHVakD>Xv8g9F&RlEnzIFh%A3war#?#X`#t$C9b| zp>X zE!$cFcA)UcPLEznz*%0XdIX&nrkjT{oZFm0#*2^I3k`c7tKq`qr*eF5cL)bRQEt3Y zqUud!NP+qwEnWvnD6|E$?92(&u+~Ynl`>i=Ofs%Gf|8|m(K6H&YO7WdV@u0xZRn9} z4p1hsm?}J|$e#J_s>nn+RT)bI#d>N#)@wQY^U|1?t6OmU4@$xELBFjbNK#D4Zqn*_ zUk=@(k@MC&?nh;fA*>K>+@x1d4q+YCgh;pU758c#kIiN~ckJ8C4oiF7NjvoJ6A+v{ zwN?q!u49-iP2uR8mSZ`xr-H3VY2i+=B;zrh&ND_h&`$T%Wf}rQbtvGCw~cIM75Ez5 zNOxzb=FN?32GI9Pf*h zdNF$K6z=K_$?!_n)ZISZ!cdTd~6H2YGytXhhC;VYq?g z83Llc8az6+YZz5fBn*!X)MTWsGY_~KD}K`cSq7o`vw@bLqqIxfa$Ei9SSDN96X6w4&OlO&^}!g9$GR8jA|* zt}IAmIK11M0+$@;9<`{i!Fe+s8u{0_!=eWbQRpy-({hZ4M5>~=K$q^cb!m6zWmqX2 z)LZkm-!0F6=tf**IH!Fnd-^VI^{rr;k2$3I!-rf_kffqxbzJ94?ZPG79HS)!bpjjg zX#McWfLB$?PU-it(;z2a+Y7L{Sa(>okYITaXVs2QOi!gkWiwJQ9M(c$C3~eUD(17o zB#dY=?;kcwk+;%X3zH-EP(@@9TIpG%3_dMavU@FiTWNtoNM$lW3-V<|%j?K6%Ij5q zdt*v2m$X_K$H*CVELiy{tla_i$wOLyZEmb}W`$-7mlbe$M|NgpLEbrA<}@8W9}`cR z-Rn1vG^ksgqP1`SIE#!(|YRL3m`ZDoupwfr+MpnUtC;*NV%G4ZG=vGIVzwXZt5mG z2qIqAEfm`!mt&f6C?(<&F|Am&@9(Si+@&SZa$-Lh==B*0O|$b@{Z68GR-i5j39@JG9yG zRs?5wv4M)MWSr=cudb)rQP;AMwOzEeXrbLRwznyb-AHXp&FZ6xs6@A3OCLUeEBH~$zmP-x0YRmg@{~iI41ySC;Q}JLGBQJYh|_z z>kz+aE=m2!;17(63fSiGwe#) zVc&#C|AEEkW%{>I7K+FFF1!%a-8znyPwiiWbr%_z zH4O(GFje1|WcImCA;*}d=$Kfhf%+m9dknY=DAzDC(!u73Jhc+~VUd}tuAr(@hlaAr zX&DWrkIVTH0$oKoGDTL9RMwd22kWP38P3sQo=-ZV(J?+&7iMtY+I(;ks_pIry32+} zV0=o7(7A z#%Eb|JIYc&jG=&EtVSau=WpfEZhEOA_Z_XESC#cx9K`WQEYI*x_SF73B88)4aw(!u zHq7zrRW>=Xd$M2u>K^*!Calx7zw4!^Xp!XX)iYR`I=m0hJ+vDpXVRpm;-KlCLpFNH z(+zSHQO`^wL^q10G=?jF8scu9E;-{EF)GD!KhUUk4WC4cibJ0RQDDjuuP`LYq>o*; zriIT)K{Qt$V-yjlOhH>e1qX$9;&vu3i%I>4k{UwPbl<*l{F%nZ5wxl;w5vE+Y;PS* zrE|VKVTW<=l-%u=)~;{I?iqAGgf2o}_8r@~V<)be&0vZu?O`AO$f|Fj)GI|GF=4>G z5Pzri@4jrGeplYUec7JbYlKhMc;IE1(lS!jQkIsXvZb|i|FOM&V9BPGNyJJFVZR_O zxkw%ua0-uS-Er}Qt>=oeq?lGAazVk0M-RG61E%xL@U#sMr<8JJ060YVozqv2M} zR@u+%Q$5EaA9Cc30gS_+IP~dGh1k_H^1{g0wbzq9pwu*wmS~NsgC9hl);KNP&|qQQWWYE2mF6i_i`<^Zqci5Ck{Q#-Kv=}$^bxSv zPU2d0;nSL_9r%Jx6uFX)R;A^K+I^lPjVyXTtT-OE&j(~qAb-#*$mjzTxuYeS7|KIv zn>ant*?qKs)&y<6qIAK^n&{YXIC+ipxIiQl15gY#Dz}5b?=bkeLmKnv1p7p)+Q!JzZTL$ z`!Unng}W7EMgPV%lEd(@TN}T1_O3`0*UxUMGc2cZuy@Lhn zFy16G4(yg3&=WFpCqlMwGIU(XbzBHAfBS@LN>;F8v}T}}4fXSZ$s?8t>Tp&HCEGcP zMHlHS@Vp{w0Y=it&?KNtia}T5ye<|Zq?EOews3F&Wm-){o1}QmMug?)QVTF^$=5pF zL}Mw?)V!2f=F3IRVTcxAU}P_g-a6vgFPqEl1y9IOGBEmB8CMvx+3Bgh$YG?2L#HSS zyn;9@Zv&VuF@kfadaH~>iY=569F@?s#Cm-c4FhToO0XBel^$1Jkz?jn-(4!GCl+8w zOW!ysx=qDcK3bhNcd9#fVT6unez634a4$+BYJH(Wv-AEks>2S7y^M;}8?)KQ!OMoR ze3z{s+@fn$MYic#TL}Q;u7lH96Wt~6q2QUJ_CeTM^e!Mdc=(X65AD(gEZSDbKIh2z z5fg9`X5-;t>=ercrYvlqG?W9EfA^$?&IQkv!KabaMzZ|q z@(Q`&g=DO?U`&6Y)dyc=nxQK@sA@B~SA|!iF_1ySt`WK7vQHLmkQdkJbFxKM`J|fY zE63ktsRwsFRirK*W6I~Mud`e6skM-coLG{V`;E{Gb{vHjIMdaRM=i%z%(U!&V!K$I zH*IS$eKJP$|2q%kKbNz-Z*2)P1dP-@Y2Gxk<$XiY7f-z*eiUtQdy;T>iC#u}#*5wg z_7qoU$BrFSiwoXaH+c}7<1^Cr9!1e83mxvy#&@9um~=JVQ{keusw^EC=zitNj+xAM z<3&%j6j;HIYe?uTg$TZiU%-9 zkylz=m?Ddr!?&>@Ntyy(J(TrLod4ECm&2D|)@qDwZEb2cmSwq!uKD-vJGj~sQ8wWbUt2Kz@qgo%S3 z>wvX#CPelmGWk4=OC7ECgZ+5bW#do-=UJ~kBCnrIi(;@gjkaK_41?&>v1Ve+5^90c z`Gc8wxC|FMp^_YDE;}pQK}lK?boG+J?}in)}MHFssV4`e7H0m7+GrkEPZjiv1Nq3rsr?&rSB~O7v2-aY9u*}?Nx*n;`YLpqaVzv>I{ zS4|(m=^E_2$abmi#r9p=z%vv>8`o}<&7#AtS?SJN+NTLWN~#Xmu!n)203|rK6OTDz zdZOP@U$Ephi9;~Q*5Z9caL6yjqNPOH!0A%N96XlS!ZO6~{g^8Uai>8^q`kv|xo{1-hn;f$S)cz-mP-xGd0q}8 z%eyH#@7F02B@n06OwUpaCwpeR9E3I@SDI;zYNZ-`1x==59w9!_0;L&hRoX4q25@Ii z%eDPzO4g`6J>Ak?QRyeO(Tazplxr{A+$t3!oP^P(&{{L5rrJgo3I_5`T3Rp9#fm0} zq}6CK(C)u!4=jG51I#FIDXpSe3#0ifOO`(OfN*%jil?-b+6*FnQ5Da82)VR}hcJJ# z_E2&Qr5{<0rFo;uWuV@rlk$y0YpzYi^0OSPn85LQJoR@NGdkJ!$BkEOq@*jCymkku z3vFXUi?8O@PU-68i!@F=Kj{So%j?lT<56`iM(76~3>U{}bC%0j?P{g;S%FspXjG*$ z*@Kq+P;0~bY#JvtW&0R;j(UT=$4M(}SpJd@-kQ$+IFzGFN*^SfEZHHHePA;@pn6Q} zfwY*axwTlfV~%P(jdcgBb<8N~b?`wvap2%m50`0X%LpB92V@_@MROU$nzqxTt)_|m z@Uu`jXM~#&M{M?1^qFZtllPf8NNx(tDGo61NsQ(lT=&KgHsFGpYl|H4i^c671k}fQ zkEI|}N8%2mpZ}2rB;Wja0lf{Znk5Z`sJS!cBV<_GJVl0$Jjr}LB^D*6jRb8fZIvpM zRGY>U5%N%!U~=PnkaVZ3huj^^=a8tXBY^0DQ255Jq0$2+xbXcfTs+^|Jnp$kF)h3(jbh-z0;NUX+ zst~hXeJf>jW~b+KVYp?DWQ+tw?gXARP#;1~oL!S#)WaKLrD%#74zA5Wte1lDn#^8N z#NaDGsieYKnnaqPYSJ2mw#(jHP%2ADDs!&TYG&ZX1_+TmG}ta^NlMf59<4S2(!2?c z4sZmRIcPs;ua^N(Wz`#c$Hy2Bz*H@QT0688B*ykxW(JnKiIW@RN1 z*UE8S4`et3WJ|vJ-U%hsduJuck1{H%;2Q16WRxP(U^$+Hl+9v5y7nj4P!gLxba;o+ z;O$`Vt(0Xz+Y}Mw#Za-<4oWYV$8r#p!{f|^GU!8TacR+&!7PTStfcRQf;RQTjA>_v z5ohZvw2-LPyv3y?a(n~s#8RlOz*ZO?txjI1DCZVRPas>Nc78~Stkm1lC#RZ{JFYUV z(kCvY7gkDh$UvLn()uuq@rz4Xo5CDS?4d{6{Z!~hatf$P?h8{XIY?KCuTCcTAjGM? zpcE3q3+Kq`S)Lg#_{tsxLE$LkF}$$#Bz(iT!nPIw=(hp@S}b1!C7TZXY(hQqV6 z#FZ0J_Oh`sH-C9!6;_3C8;UB!1No&(vU&6K9IUIsFrI ze^(w|cbhe3Zv}$Nw~E|hvYcownh(HKJq*|J!kE4@FPo+`k&b}At!w0UKI}KE+?u&S zUOmIA41Lm)m#OrL!~xxskz7XRXwJ>bV!OUNJ>kr{vLcdo1G!{0j&DmM!}7v3vKNB) zj^LFSY)FcqLt5+LPUSCJJ%Ssms97Q(8IPegR1*(hij&ZC!L2HHLPOf0l#)I!R)KKt z4J!BpKP?%+YqOeAXvD zmU_6%L+rCFez}J$JiO4ui#)s-?@jC$^RojrtB9;?Nqt|a#~QsAY#rsJ>Q3Y;_ROTv z^9$YqpoeT4BH39ieZrtS6dTclXDEWWg^GcTTDBhFSlebXaKkV8Na>P%le^EZa~*ks z0;1W2F*ROlPD<+ujPW(~OS8RbRpjPTYxTjSnv`maVWr-Bl|5lBs8C%W(@2I(Vp>CW z+ZeS?nkL8)-7@@2kp8Zo)G9++iBO|rp%CvnJcIr5S^W5|6`nwh!gy`L zlo7vfh+QSEmZG3+Q>(%l1n!fUV-AeyGgn7YRBbzXYQOr%3KFh9RkeoLsg*}XrIPWtvMkheK8A@@qmwg{ zo?3>V!O*id<2KOG##hU+Z4`Pu5FtIH4`M6yP&Q%rMSAwcK5((;naojpusWL^SS$8h z{_fUPFkHq@3{PY;^e;|7NsmAs&1@XqMefRZpj@eNi_M+xGR(SV1Y;&+dXe`rikB8F z?XJxj_5F;S-R}JCfQ#%8Xmz&3JcAsgi?Gxvdv#Jqkd_?Xl1w-0Xh?I(80e%{z$E8A zRU0(g*IAq?RQVo7x|J%5Gb42z}y^<{#Qji;43#bfUl6lExn zodvTT#7@S zR*rj!#xigaPiD`|;=;_1>6nkUeZpxU`QcvNZWbe9bz2G>v5R-~s19L^A2zzsW5+5! z%ki6np!jJMOMW>d%UlL)cKB=Xa)npu@|FEUG)!v~(+92s!p^l9^j>i^X4UjvfkICI zpjVLRAa+Rgm3;&`B2>%_^*r*`^qI-_N~w?)okQ7(|8{RWeXpZV?CfBGmDIHNhlcPx zfh=oL#f6m6B^rW>ink$^0pG%|=%|HiNcydKxX4 zQ10EE4fk&xxO`I`52MLJF0A&g9zwH#U(+}sKZKLcZu;pRJ%5j>T|<6&MGobajiD;0 zVEgHrY<>TR4YI|fzfL@B@?}b1mmWAW&%BacXQB$9BONQhQwLPW-o563J&(82JEz&~ zm<;*#z(hF{Ej45#c-3IDU9u5p`Q_y`oP(VWS4-cm8&Gn-kGWIOEvGsTGb5i&Mx1PC zw&mywwa}Cb8%>H@A!}arpXlhN&NR2eg4gl%r!!>mFuQvSO3EQwT`|Sbu272ePrtzl z(iN^)tydLsl*iAVgt(|E8z*sx1Gz81z>alX`N3X0-kZzFet!gcwd`OqcfnZ0Yp@4* zW1~@?R*)BU_>By0v;H+0%wpr)aQ--qOm*x=ku(sfn;!FQ$fY5jx*RN?&|g9jYWb~k zc|`|xOBH~4=q@#v@0DBMW3=*)sHIeNn`{K_mK7yW)b%uDT~8cJJv>9@WSFAK@M#c} zOYg~Ms%_WUMzg^avJ_HGI`^hB(l30?Kl_BQXuE9aB7<@L5oC<-^kk6@yh?a6f*#ZsBe zWWz25;|nUSy?eWVw?F!a>j^ma0eex_cVd+x+l?|eZ4xMQ^`x91-HJ;p?Uo&}AFh+s z#Itx1Rlvd<81#iycro4mb!fks50~O4YNV$d{J3r{PiNTs3|mzzEos)^VE)?LecJ-oznEeE_X4wR561I&);Vc@24K zx0kRCZoV|A~@(30%H(BSa+j>bVaL5hgw30hWEMj7MCDPh^y#BX_P@zAHP43u}- zOb)UfuS6ls?Zd&nct}eZAk;7vea&`%ZXN!$8jqs{QB8(DbhqeGHWE! z9D;aUIY4pSI@2dFS=x1WrP4a=X_$OVPg{p+eVfNj($hMovOLj&>3}{ZwCtkBLAz{@ z7O1V*V~1H~ef zHAEBkp6F_*r*90QvPgZ_RzwS!<3}{G`t7OiNywTxq7813K$vgDpWqJz;DhWZ%1 zu(8FiDjGvcc>-rG3!nbi&m_4 zP&T3Ds-aV0S|=|QEFWt7j9Z7c@n~%icrYkzL+S3L$-vj)#63dE%P!g|*Y-@j+*vg0 z;T1z9fmR!-)^O5EG<4#a(wQDOjM(pA*5Vlh@`9m%xL*XcsR%SK;FeIPQD4#sN^Y#X zSlI+knn)u2B2;z_(dhB9R-3(LCeA#UFBYw7vf_&!&N_#X;*_!#Ij=l833~@QT3TatKsi zno=C@WA5Ungz*h6>x+T_N{SnjhbUZfuJpnEL6H+X((Y0*3`Nq|5y4ilIFyR!owJeH z71RtKW3D2H`CarOTKC#b7${r-ifdbuOWKJxG+`N25oDnr$zfVo5jkoQlFexl3V@r* zvJ%(&=omTF$@HWg)-4xsJ2+o!WgFg8!`XngPx=gd8wLfpSXl&>*OI!eUWbJOcaA3R zhM;U0L~bFS)Dtb!)Ou}l9zZ%ka)Xr`=#o6t%?p__NU4xWAiQj)CWPuu#C)%@T;W-0GquJF069#!wqjV`mtQOQSKHhm_|iD`jM`g|c&Qz7cVk+PE)UOf9LT_rL&*apgZQNc&nC^Mzgx5{1rMew-IemintWB~`=DYjFyT6Saaxc65H1 zJkDW9E6~qlDNvq#liy&}9{Q%u19#bWrz)6`u9qIW>FzRWVIiqxmK% zWE$R(Tpd5DiI_38qzuLyrPLEkNJf=m{eWEF#2}Nel^mJTujY7baT zVp#Fm4{3Ucp=H9d(!VFY%uwfg*p<}?-unvs)Roomckop=1d8A-fvORF?2SQ1@XSEf z2=)c4ezAjt2}N)yP)!q>{&or2lV$%s6J8$r)~WBQkw!g9&p}9Isk>)IaudPirct^n zr7>DgV>Bl@4<`MjS zpvF$}1kX(g6MSl*#@_GX#}leOu`KJt|FZ0zF8L!Vg(o`?#dT*(=Z-_(f@*2U!Py&H zyeDZmKe@IZ|qT?i`r=ZisA${_R8|MkSOltQobP@MSb zIOK_+Dx@6;XK(O*H%u?7oBTv)To5YP2(Am%*rjg8WO$%PaBrZ-=$~&TR7!|Gm-6%! zm%J*au*-QUPW*Hn^2ARS(vE|(H~4-tX;D-c@h-Zd;bh&}^E1K>d$Q^4=H_GG=*)}2 ze9MA!y5@+W1hnQ={QI5nnn?WWj4;EFiIaII62ICKCxQ~H6L)?7%ehZYO&!6D1GVj` zo_~Xp_ceknJYCr~mW&?;)wZJ5R+CP1$>*gM);bTxNeMX)c~U|uq#XxmZ}2@jX;D;H z39?0Vi4s2V}GjBp;Emimbf&KvRc_kpbkrngoB>Q46yF>}poEbKoTV#$ay{91m2JU|wRQLgI^@<&_?GXVXPLX`FN~ce+KO z)Ap4J3h2r}vC8OIIm>H2>|`|Qe&6ZB zXd)<}gVFan-~ArKXo6RvvdO>sj3)bcgS|oU$AM}R%uB2?`bP_v#jP!mnCL`uW;0S>X3bVur~-! z1gc3eFR@yko1N)3iJ9Oh9W|diWPfw8HweBhP)&k)iB;;{<}4rfuv3w^%fH{9k|6j* zX{3KeIVSs8gS|oUn}KQ)%uB3NI?H-J&4+s^Y7>5x<9f2ID+h|fe3BDJ@g{;2Iu!5h zVl#N5hbZ0zzw%7`G+zdi{ghyD5PVdingsI_t9@Z9+TU|sz;i-Sjo=@xG!iUa5PW-} zYJcJ2PXbjZ_=`Z*2!6)Rge-!01*%4ns)H)8Ul+X%ieP-6sN8>kw=4+mf`Blu9D#t1$ld4S-Bff^&YDNr?nGl3c-ctfCS1m6~@QD(yz163pV&w&~v_`^We z2>vusqs**Fr<@`9xIm2&yf9ETg3k`r7{O+sY6Pzc)EL3TfvOSwt3Ztr{A{2`%O$2_ zs3wE8G0&Wtlu7^O7Sky*vb@PfzbTR^$&>^j~**WjB5HRr$>Q+cQ4$j_;e5WTZs@1JI!LCI37+3RgIdzYt zE=XahkairLy}^fr|N5`O8&-C2bb?&#^k0r*%OZt=h2XPpLRVH=$`y4hq#XxmZ}8m| z>XyWt9rpLZ-?DJWb1X#HOz;zqvaXr2|CwK^7yknM2R7IeW2vNc;f|S8U*vqRkkT#J%l<09|%;P;P)KWSslvzNH8}D=9xRG^N-H< z#bB=yd@xX>1Szp{pHX{qe%2imDf?&SK(^v#%U7{d@5-K!Q z7OMl<#;C@G$ zxs1&wLV}0d2rJUfnDAx6+#r}|t}cStJJSup+$4C@uS}WDzZ1+2f_diZly7!h-ryn1 z0>O7Us&iQ&^IL+sK`_tUA!S$hmQcG%@O6%wCuOI2Z7??o=9#NgzSW!3w|fYi32yS` zrp_s68QI?(>ee~pewu`LxtgbW2=dPk zIyrGqO5fhkZ=O$u;QG~uxY0xSgWw&3suTREqvmrFCEgtD4T5h9RFhy{V%bHa+kKl& z!}~pih6HhBQ2))R4%xpO>jA(H=c|8Be1Bmc`nSeH3?d!WV$e!@}aLdO0p5fc1G8zEzNKA(w<5xh50O@ja8 zC`*K~2NEH{AGZ-Q_NW&`B5vBe0UhwDFrq>58G))3q$Q$TV~(+hhi-L(D{{Iu<`|nv zgaqjblgJpY#!?Z%{|w#+L7Hm36=qgsIEGZ7^x@Gg;EuJjWRG8H5Ds z3?pQ0QE0uHAZ-LM!LKALf;8L2F-FTVq$S9FH$ukfnu?7@@zdYA5AF;fY^Q07b9>37 zHWO6zQ=OB3!aR=>=n#G6AanPQ@|-DuVP-#WXT$_a)cmt6@$33>W#t z@NDhL4yJ_bf9$AtC8`fNm=Z1xOQR?4`jWeGyC>Y6eSee8qnP{Df_Ns)bcttTU-iU^ zXKp^+>ooDnbc5#A=(jp(r1%Pr6knl{;wv;#d2f%cAYE>RjM3{LB*?;Ige)g)C=DBiJJ54{ z4qy@DprfjtTgZ~?+hzV7-*iO7PLNg^p?xm>?d}fLQrDgtf*lLy0`&&!oK?m^y-@-Q zKF>dair|2wdT|DBIy-xg@fRo3zjpA>K-CDY>Cf~Z1P(b!dx5fV^ZniF7X5ML%jRdT zG6pIL^$BkDPnZJ`tU0PTyE>bJ`ivh*q(67CJ9MoPJSR|_37+dH3S|5#i8L$xi(?yI zEO|5wqt>s=T!Ohn+lYUOt40-xrw@C**b~p{a83bVP)Ke)$Uh7)Dm40Z2aOb8p^@S% zG*WzpMv6BD(qGpoA#%F0a-wDsWaUKlBS@cGWuZq|vUBy6PX3kklwSXp^_1CQghi7L zn=CV^D~I@nH?yq2s2WA9pg&DIXB8!k(K?z0DrOKXC1l;{473MSxx^LhUCe^OuwqcU z_+k9W5dBickh)CQogFH5wcM!u0cWLQDem9bi^3`wP;oGs)>hMi30cZQWF@*~3zBj!O@XnSYHx)<;x z!-|S1j(X!NbJsgPL=Q*sF9KCDwEScL$gpx~$&U=HozuOD-x*d9E%}w{?+mNW;#Y?AnU%%AgP!*#JOe}O|Lcqbsb3oTZJ`or?6!p|q|w(FHM8;$ zMJAK$Ws~bn zh!8;mC|#8T0(t#K2HxNy8b^X}2~?fn9|x*Q@J}2i9bI#du@41do#0;us!8y#+jv8# z96(*(l$e>s?Fp4*P_PSsZ}QLoJZybu zp2!HE>L~MQN-PgC;X5MX2Ei`|s!1>}v1(uN+s;CzDw^J|u77i)AB6l;Re<6pGC8h7 z7KW7v(XnM6%ny1Raa@H6O6Xj!b$fH^)67}V@(}q#aN*PK6Y4v`a~)+4XKZ~UB)GYa zkg>NV!h9AbnA-G*HVuN)foc+@I2$=8Dece=&UkAGsL`AgT%Qxrcq~3^$>Ot~JV(?y z@oAQyXznw@iduV07JIaRKGQ>KnFv!vWwr`Cna^b^9n}eZEgW%f&)g(x9^B1zecE*1S0X3R)sq2$#4v3nJPthFE z+#_K{Wpi+uf4TaPHYW`aa z%;>z!ykoTZ?6A0E_?cy&abfpHsx^XNchm{!&{r&Z^{U>pD{3~byL$p>cqk=7(KCCc(?jkK7`7#8H-8jNO_D z3BI$9kg=a7!YYSk8MV1Cv}q8$Jy1=86gPjie$E-c9Rg}J=L**+m#st{j!%)TH1`!@ zMdeszw|}1YP_mUUMRd$oGVgQd$W|gKVg78rz}$P9hp4Lre>+fhg70>eWh!HLB|?Jt zwh>n6VCFQB4fY1XzCbkz<|THnn3p)?_7G5`?!W7(Tn-ZT&iE8LNZUS`1XWq_2LJpv z4=^#QFq6u$X1$re-cz>#NYbo zfACPUl`utg%vLgg&Y2@yiJ*ke*(y3c$rL-mLu4w!W}xZ>M;&E(#n|pdNN`UZVU_JE z=~IKfLGau_H3{Y=cCMI~(kfq?T%VRG362Mj>SSr}GUG+D4^8v8wsMPSw| zf<#clycKQw#ir6R58+#a-w0Hl;De4bcQf|=L`d+bZG_3{JjA505B3JZn*!A&n3q_U zFCv+0emmG}1Rn@gogme(ST%>NuCA{4I?o-!yP4p}9HqI#$fpxs-cE%>SRyJ-f@J@I zY2NO#WST`dv6fFQmlDigVyII+M8*>Q!=qJylcOwS8GBbEB=~1-gp7SL5fc1z z8zEyqN`wS|(MDLdLosf|>0wNR;8O$DB$$`jsi=t5mpJRKA)-d`wV~%W+IV+D(VFiB zsz&g~fhw)N_T+8zBtPb%WHaFlLc}P+-wafZ;4Og~Wp=&aQ6h{g(ieiur!TNH-C6d& zc~p60B+{ZA@`)&a?$1JjxrIHC*uVF0UDQ8c1szYxjR zcDm&KkwUo@&%W#Q{Z4cmR?uu?X7TxFK0iDAobyXAMQUg`wmRdUNN_X3{f^RxgONjt zPV{a27s3)zX$7zc989z2vLwR^C)Rlzj_DU!%J1|LO$NaqILg`w#(JZ{YZAP`QAWtv zibP0ovW>9KrF2pQoghfI{*MMWThrL)5kK4K9h{ zf^5~g^7V}}T}6+&pd_sFicS|az1LIyHxIFtOOKrut|;3bd|yd?MZ4SMclfaLQ)&1~ z@auu96Z}@7ngqY?C@buY{Wu8g1b-f=Cc$5{@wO{wG3xS_#LOgqkWfWV@!)6u^M8-C zC;0B_EMAhE?zKb@dx!!?@S+p!lX=A8;$O1ABG?-Q-xjDQ!Mwx{ojFYYv@`x71k?zg zvd9$Z%C->v%3?$HWUqehbq{#tajv=|i#m6sRhJvsC%UkAJCjsr!j#&Zy?McB@Q;E| zalt}Mn2C|Lm>x{R|Ct)~Rtc^FQ^US56Qa(?0mW)D&P2!19|b%LLD)O;n95?>SS4T5hA zRFhy{Vuuo$-Q{feC3b?3A2jvR!w`Ieqvq3*67LU*4T3)iRFhy{VkaHX@>G|GLQR7E z0#zrt|2TA{#EXNyL2yl=ngsI_JL!1kT65O4hsbM!e;TMd!S^_7K0i|8kzj8Sd}*MX z1oIL*>3Ey7-I3S{{wz>+f>tLQD+G53sjxpen-uh*OYjA zur~-kJ5Wu6d5N8LoOZVB6Fb2#2dYl+D~_5^M@oD}ur~<4J5Wu6d5N8LywBMlOzZ@o zwm#Z$f=_qUd^%F%k3wRD;DV6YB$$`jNynwmwkoj`e14$n1Yh8&`E;bjb-~^s*a%dU zU|wP;9j|w`n-e?1&jhMY@UxDZPe)38O|UlzzAaEqf_aIZbiB*i?n~?hA3qd%P4Eeh znombcygwv12>u{YO@eueope0QQ(YPgH3{wuRGr}dx{(kvk*{2fp5zf!^kf8i)O+p~O$EUP`1D7qJ)uJcbtMRK30&?dJe_bDl2 zP}hQ=c&ZF5)_bamN+!zETb5A@6~-j0s3=fWFcrFzI4KXm9%oPRElD}4$`$@R=vz_U zUQRGPAow*$%~wgueqOLQ2<`|}lVDzAb(?_$p|0;#=-niEYoO``-{PqGbfm=TU~dq7 zL7eY27|pu@J)fL zGm-z3P}SnHY{*Hj4AL6GHwS8z0^b#=8o>_)YP32H`r&tiutxCKK#dV(N);=ICGn3i z%*h@i8widBs!p)(D9Z-MZc2m%U)4s)*lQ9Y!PmACGIr7xZ}3nKV-Ti@$~|HcL*|z{a~#GXf)eK0Bfihy!~VX9@HfGo&oW(MG{OCj zGJiAnjo%7F1B!o{$d4nD2EkJzktRWklSC?OtTdze?`h7uE=1G_UJmQ9-@vBO!jRrr%@WLh~DpVAxXPdnX_dUmj6E84IKy{)NXMz-w@{32&ObP zGmTFMRn`4SJ%9UWuHi?++|4(7atu-03EtwL7UKbu>Bru(;Ox1-bj)3$V^vbJ&j#5hY$ME8p<_ou=3!?J+lZiq3fn}1Q@#6pOmu@yf=e7_Jp#3D5ARxS@h^FZ zK8D~K1NI4h48bu+9goDXhr|ZKEF?Aw<|S5kDA@_lv@V!OH#*o%sCKIuqu$R9!WzLO zu3i>br-1hGN*8lgh-(sjYoO``zwW5{oJEOO2YZ9y4S{MB%uB3t)~lW6AA_~rTfrhK z_>my15&VZhb#MV4a+{Cl|00d*2|g64I>9q9H9m6%V}p)G0VBAsjgYa)L`d-dHbQFE z9#Y4ThC&U3p9@rzU|wQ{bEVIj=ifiOz~_dlqtyOrLLGDPrGaV?d_|x}3EmQ@2Eo?^ zYLwvH0@Wb+_CSpiygg72f*%ajD8Y{fszLCRff^g5L~OgW&yvsw|i0 zUY41~L0luqf`bCXa&T3mB6uWFb^1FcJa4hS`D#<)^&X-zBse&0pU?#mT<<6=)Qr76 z5fZ$yjgYagCBo`*MQz>^+B69MG*C@~6erqL6kjCqL{IRXNVrDuxq+%z=pxUpqWGUT zW8d!cuq$iP=%c~kqIrLkQ15c^6AATq4*o+z6%+32(Nuw^bcQmfr+CU19OYBE;F!Qy zBB2^VdJOAB#k3K3qn}nVdO>#L;stX>yA4}3-LTY<+8LHQQa{5UzaIEeg2ii2Q2LTK z`ENy?^52S@<-Zm6%YQq5E%E%``)>t#(O<+DwIjZ$8SzD}i0`0L#@u^(6xn()Nwg)! z)PO1`1XM*D*-KsSO&&^#BYa0nvx-$}l>E2O$;N`bMle;hZAAxS4os~-m`XN57Bx_n z4Jn(YZe!!EhWGKP1A=c3RE^+A4;!`Rfx*SUl=#A6ZxH;OKs5>GC6-+)^}zn!?5zE+ z0Sd-|gIg2o3J0%Fs96W!o>1>}kZE`58lLK8PY=%8Ee^gmp{QVcc$X909fVDSXI*2Y zXaEV`eAH0$xs?*X8WI}>SBAtU!Mw!z+?r*Nbmps%P_6o`gEuDBZ#(#wg!&@~H@Wig z;${b12{rB@73$z?OMBEsUJzu^%VGtnweV=?TIH!7~EYBuH_hO{JBn>Q8mH-wpOrs{OfyDl1s(1T*}* z-Z^gcP})_(l-jXfCG*RiIoeesD4}D!3Jvhjf1@lLv2i{|i%o*x4^*AtX(t+&d;Hwf+xRFfdZRp%J8OBeA?k-}g7@@5zL&mPLin(%ib zxf;R$aFjluRkU4rUw4wF^5-7nOgh2O1gc5!9!K?LN4w@2`S(Oe@S#N4J;%t&;mIb! z$2tn~dgd5;TB0MkGSMxVW2Bbo2wsusuA7_j2y;@E{;VUJ58{J@pEdep`q#^e6!c>S zfr9JwkNm%IIZ@V$=#B!onQ~v~@`IKLS};$&xX*dN<00wc49Cwt}3C7-< z2&>IvA`eC)4T2{IZ<8R!RTuRv8*!E^JnZC7(p~0s;T|F=U>^6}=DdIDA>2do)2D=c z2!7sC<{rjg@bDn4b`KM|GZJYK{92%z1SzhQdzi*=xH9L3o;8A>2-N5jS8jDEIeNK+ zy8~4t$h0daXIb`FE|ty##H>vr02FuJ`h`QD z$}l%1((kvsml!UVT<(2A_V~Gb{L9xod>p?#V)jwDEU;_Rk9pM7&+p0}^T@d>57XPn zQduE*UC!x*S+r0p=F6M2BX33to}bGb!YK9vZ@-SsiYrf1$)o|NjJMi zACF44{p$`go6(F3&l zF@_a6+OwD+8Ft#S;CF`I+4C!QEclfneiEZ{#{xq{``7&mFD(C-t2cyCj1FMg9N`NB z*EdIaec+bQ5oXw(t*FS$-Oj6>(8XSoM1xJxq&Xg+sctFMG-TiH8+L3xepIor$`7wt2hBu%bQd zSEH+2M-jfl?Uuf~smmQ(X9ftM`zHGFvCiro7{dESZ1c%rS)zM08u5 zi}}@^{U3K5eO=+>g~vm*D2P7PIU_9j`+TZ>f0}X=eC`G#!F-b7^BgtbG?)^<8xk7? z9~Bat1oIL*O@m$2Z5IBUhbT4#|8YAt9VPhhjxtRdV}mBkG~P0t=%EoZ_Oh!(q5;Lf z_qi6|4{aI*PYG?B1Sw7uskE{i@;O^$QWo#Jxn+n4JzSg}#W8}%_nkXO%zyfq6Ya|i z`Sx?iU3#T)OZQE9pX0i+5rWf>>d9uh=IDfeca89F*HxqoC)nJ1@l&C$2`j(CVBir|XN%(XCz z;By^iEe~VAmk0^Iv5hcgQ66H_FN~xc1V0d{Cc(VK%JwMx4NvpQp-$~(4*qsRa z`%|76!-~#b2r2d%E=xLD!t_MPPL|A1b>`?~iJ*jz>*TAvBN|E_62Th-RVVmLM_ERd zY*qv%)`Go3a7Un;1oINB{hwtwJKO6LJHfjGRVVoOj+#$LO1w4L8wB4Is3yU@#7;Vz zFQ%Vl;Y&P3o)hdj+diS#6a22DOjE{wln4p_w2hFl6VC~W1{D8Nn^%T54TA3tRFfdZ zi8h_A{I;`g4jpR*|07UiWd%#kNq5!_ZGY(E9_hT&y>4=tas^iuD7d1r5~n=!;_6wE zwc^)$yK-)MP=FFdq#c3!^+Op*iQ9Qd2W=>Cc!@oRGr{c zmKc{+0mh!=Sk#rWE`nhqPYa0+g0(<32~u3gl8s!v!P(v%>@|X?gf`nA?_gg-RVe6% z;;k;~eMuz2Byx-*X*;@Ag3BV68o`wCSVhAA9__n5!N2fO3NGQl4Q1*CKj)~PZ1%c2 zMtURddRfDYT$yztFAe#nI!}eE%4ZYlzdQKDgd*4zifpDL=Oq+nG8ET;&xIrts+>#? zhCRW@l;<7bkS)t@_3VDXhiLN&-W8}3g7-Me3Or-?CqjZx>9!=iW_avk4>4gOxTTGd zvE7M~;OpB68T+FktQZ(3EAtR7rcG#53DO{|YK(m^%xe(*VW64>^AEnUX04#Eb(!+~lNq$iA*vE-LV-u5C)U;K60vzg%CfvOXvLnNuqbBw(%bgC1i z7HDV*CWT7tB~wj8yzLeH0K!OLF;Q^TZNSRg))@p^92qoO*8!!WzLOu3i>b(NDA|z_Y$@IBIyfjo=yA5;aQj>5ekDF?MMpB-m^t zWb9Rmkl<_E2pM~OB5YTeF{=I6P`g3!o0I@Xj%t*RM@cclH5~S(#48yYQ zA=jk$7#&$7cwUICQ`B%m(O)l0sIq4|XRR*Qo#Tn#;GqmbzTxn{CWV;Pm?tGB-ogiICvO+6XOAihr5(t-;k?tnzI>cIeJgZo5L_7&>IA8U=+u~FY$6d7q!vcVSkkGoqF?WF{xsw@ z3GSTl>rpTK zsYf0jZWuY+!IcSBw0VIbe8Wx#-}KYPo+@tLFX)*o+HY98;3wCM5IJ8Yw2UqEEVq06 zj6FRH!gjigp|LYoOYGeX=NQ|Tut>_1O@9|AFbtuO6D=Nb|7zQM61ri&lZGXb@1e<(Jo+62eKC z_JNG1t@lh2GQ!LtkP&R=$OzLbAS>Fx$Sa26tDL|RnX1dOQn?h3Xbel5;HWu^kKhPX zrS5E5sX!HV+~XPWhbbcnri|EDcKWum)3+^g_fSt{D#7IQZPaqYsU_hpyXM(*!@P&bD63k1i9zNdTOrJ~41RvqMf%BLJ{s8_ zqmm}U*R>5_s=Y(@1Hs-Pcq~v&f_aJ6>fGu~Z%@nw?{(CC-XZ&YgS|oULxE}%%uB3R z=RWV$@AnX8hv50XWdClkHv)8aNbGVjFR@ykrA~QqVkUUhQS+%o_U8tBgW%>s zH3{Y=R;zQpGrcr16I|hCaXxj(ep9eF2;Lc}Cc(VKYIU-%uQ*#z)Px$r#|Nr@j)O}R zs=9CscIhMS+bcXoei7__lzqa8>tqL4KRQqZ*9EFZ@FR~6Dg&zjmXmHU=@TO9F@jV< zJl>dN?7~QWjNr2Z)gYJ@Ds_-~)yfKOrb3HCp;3ZVK@{3tq0lH5dTuDRnP5`Lo5Z9> zuEPd$(zE3k9_IH{slXPOpZ`YOo=AKA8V4VGj3t&Q58UbY4QG8%bnrlmT_ zc^SzB%E&S%zt7X|&3<^=(|@#Lj&bT#akjXt>%R)NcW19&UreN@h|u@}=bZCUMkXI} zm{J8t58m#%E4X_cW?>c_)qJCyAvnU%ba%=~=XQs`m&4Iz>)ek*_X>yqBXCRS2>&c_ z%jTZ$6^ZVabSn+cUg*}bykbOCE`Bu@KiXC?$mz;X^+cKYle1U<<#o3#=v#8~&wkmH zopIuQJ!ian{Vm-WFF7%L{uxht^{QLCm!G@ojI&FMK?OHukB2U4`I3_#`sE^#v`8hb zTyj$O(0r15Phy5L#QEQ~OG+u0>7YZ=UniD?Ri1-h(95(KqGc?~$`&1QzcZ{LvW+bg zqzq~@gV>Uyoh8T&s_tHTjwji!9+r596*K3a#r((+o?TP+Y?%&^`o`f7x@A#GS}&+N zovdE!t0C*tstCa?j;c1lw;MmshcqeRVy8YSJDi>P%j?cK@t40mV~)sY`NxOlK0as3 z9MMeiw6@Q~Lrcz{bQvP$6C=D%7A=4#SMF|w$NybD}cho1U#emb>oZ|Q1FXwX9>L~uu-MhWh7lu2dmXd)!|{5C>MqV2B~@vaR{ zwJikH2r@-9NlfNQq9VxTDjKeo+Re`}_;nt_M1uDQs!s4rjxrM&yFU>U{MRH|eH@-8B5C9E z%XXa}biRi|=_bJomKtew8SU!o_U~uUOP7*c>U7Wa5E)JI#eu35d`X*B#(p;u61=&M zFeR6VnDnY(Zx9>_RFhy{VmWWRvi;8Tf?%!4=ps?4j6PHl)+wV&cg*P{qlrk`RA#if zgQndYsy7LKH&Atg4>-z70AoK&gajXIBg}g~!A$z?!QLSFp+GeW<|S6;!M)D%onWoV zgCbF<-w%|VV&}TbTy}sJRl-zv$@T5kKF8h zZ}t%0C-@^rnX9XqaZbQ#{&%o92!0??O@eueRUZ5&XZf~=)hTynRdi)}xEfTD*U5>b z`-anp6N#Wg9j{!Jywhix=XnUX5_}*~b%K{IH)^w&v3-t}L4|`a3RIKeJKJ~}`$-Vi z2|n|}d?Ji(b}SSmc(9F-vEK>8ddb)#!Y$ksmNp2!$x&A98GCyoBuI;mkg*qrSq*|T z#0VMN7}_=n(f}hYs%-JoU6J>NLZju}7-b^cB9YN*afnL2y&StW+=NP9M;HD+a?24VYvV~uD^_PTV zoBzVWj|8grLkC$5VK>2^&~-Dxg`w-!_&uSs=NLaPkntqQU?Irt{r_D7UvxZ%$~;H^;n{xH1!glIiGSTE@v>h-aZ>86ciz zfdzqh7Qa!iMZ~iVzN~xOo#Yqd0Axpf~w0h$o2&&Cdtf%Q060>98eYA0;-}%DzsV9%c8=tf~fZ-eq`8b z&6D35Rz2c=Vo6%3N8GbT=evU#Rw&mEKk_p@1u}XlHO8fOzUTPFGm|(5sA^vq@*~6Q zrOT{DhpxL=-WHUI@GQ?e^2J6uy0Z1|oJkL>6a(oo|NQbGs}X!nph{X~-7of!3@cU- zyBF~z!)m+BbQsN*mTY@V(t1HvwPf3sF{j@j7L>9#TgZFzk>iceq0L zc2=x=0Y5UVDArv)EWr#rWbYTekN$eg?rL zhMlsvy+%CXp6m&0HvbxfkVm9p#Q*Fd#44jzPpX<56jIgyFNS+mCk^sq`1Tv&jv7G@ z(-z7K|2dDPm(uvF)}AjZ#&nX|F>!fDq*Lc8m;EuOM&+SvJxMjFE2|ho7m2d$HC{M4 z(C#!_B;6aGK4yzVP{2I1#hZO_^Lh`_To63rB5GYHc#@-JP}!VgY(*k08zUGd@|H-X zLGYu2Y7(Tl`Q}G>@WUCu90F;!bc}cM0D9gAabN2$WGOXw|&?W< zdbS9D-BDHy7<)q`-y)b#zG}5dHR+zAjMP^ZF*3C7v0LLowCN&M} z>Un|FGprc@_AKT{h8Un${<;{yGpu?HaZyQHr^gUc$};Bj--KCXtR^eNtdi?`g75ak zSF~N?r#kED9-_S`c$1^5J0=rG_A`UMLGXe=H3{Y=R=2LJooPcb*RF7IBB6?gbY*M( zlDT}KJ#b*=7rf9h&1aAxWE2tOwT&fCd-$VL2P zSX3j}3JGKMD9u9SMQ|>tY6NL1s6ORiKND1*PReP49_^oh!$bB$j9(D!9ebg>UGR64 zAq0~l+scM)ql#aMG%9*iQIa`L52M2&m{J%mr{Ke45t06p^HfhY{bJ=sj$sDQ^NW>q z3&VCls<(PjD%;yJ4X{L`NW`};9Jv~NJ!5*%@~$= zh^CC-nn&2D>h{^bk^QN`-XM4+P)&k)i4_e;*B7abr(CiA)YY}nKQ0NP&8AE4Z`Y?w zk}50kT@N>=FL(&+37+N>=Chvc{~YWMf{#4aBts&>yu=FYUHyxlaZL!Q5xg@{b%Gxc zRE^++fvPllsq4BTbZ!#7(^2!8O!nsldxPLupqd2p5<8iEz}a3J>@|Y_J5Y6k?+;Wh zm)`;2dWwPX_7LtTc%E~1wvNp23+4vFJagF)obvBl+bo!Cr18Cb9)};B1l!~xmtm!Qj|E$lU$JOB=~NA(ltGEZ0WDlJS^B7 z1fLM7Cc(VKYR~;Y^4xMa4uG%*LmS4@NJ%y@!UKuL_XWx#>$8*>$wXfrmQOQ z13%F>vb}SP#2oOCO6nGKh_ChHBf#+Mc%#6o#?*7pfU8y0e|wEh-~*mC4E(t#Wv88w z>kl4&N>ekU6dtdV-CBqE&0c&2_$yBu1y(h7YTaK|?CHU7;Gv#03_Q$}vaQ>uzg75v z|INZt;Cr>6ZmmQ7w_bb%C{JtHKk*l^sxfVynQ6~Zp>w=&6L^^?WuktH79yVw)yBRN zS2pTj95H28Nz0nrz%8qv=4Z+Ck>yd@Vr2}L?PA4xrotM{WBFHx#3AkHoV+$kgKW& zPt|r$3+)HqsHAQlMSOQJJ_6j&lSYA6jj2b?RQDDYdYcz+0zcqMiJ$6?#af7bJ{Fr1 zS2h+ekC?Km#C_c85L) zc(0~nGjOR&cD5PepLpRBU{yFZuhF-^Dksf2zDK&B8elW7U!9s-#mtu3y;soTlO>;B8t@XD3HS~r$yZM2Xp16-~t#z-zQI-F$)gx4ifWa8~dIu&OcV zi^Emq5-*zd#Z)^n7sW1`ip{`TO6qJg!n=9l5nxp~XP)y^_*Z9MStmw;Cu*ro_P~>r zwS$_J>-LlmK!9GdFu83FF@Nu$83#TI zJ0|LQvDVQi!dLd}St}u+Av5-h;tZ9#)LWR|gf2EdF;l}cy`r>TN?-(jy^S$cS4C94#EXvrpXEuT zz^ca77f$bKDt3k!ZvwCMq*WhLcvB!%&C20Bl=Y`xWE8ls-+>GR5AdW>;36eC$B{e4 zGY$g}_oPwaGuvdz9pf33%NEmu$JNpuJliOeM+H*cRx^S9<0(ltyj-obdQ;twTKtT_ zhC7x9QqHhlo|0svKyGGd^;EY(!OJz3(G9%IlU4!0rzF>@lsIYFZQHSAnHsdo#qxazQBtQ0#PF~ zH?XQP|FndBGfOp{>oqok7br>A|Jw^1eR1H6T5CT+3)}mZ%{AtunyVU=Hqks|l9L}S zbMl!6W#nZi84C+3w%jaY)V#$va6FPdUM@H$QD3c2FYe5e4II!l*F{&AImJ6DNqQML z*ONwpRgI~i&ES{c*jBLvY|iW<)@)Gt=|Fl&AsRD}=($IOQgv%lcb!+aHdUw3GpI2x zQT`Q5e3quN#{&kVS3Og?`2`@E@orGkZNB1BU}#732#TJccuTHTWOg&)ZNU`krIm(_ zifLwtGZ<^uA63<#f=Xa$-7wle;hQpy^3aqd;3g}#s+I(m#v&}gM7azNe5tRe3H+=l zt)qQZ-JyNO9eNG^BTXgPfiIlzjOrHbi2uxsj{s-x;lxEFu&OZ=>?X3Kzptv2$Goy8 z@I7v>(<_eX6_Xu@#XgyFOa!!#k(kpz@$uKV{qyfz0XtgR{BOH=t=+tlmSldo4d%H!Qv zE5s}z;atoT5|H1AGs;{|m4AJoUXiqV%`>!`Q1hA(E9q3saTTrf1NemiX%K_lCYT}wR1FVU|WF%F~6J&qtY12OFJrM%e2V2YCmoGkf!#)ihlfy4tYy7-0@#VdY1q3#)|Z;B$AA#SXxYs zYtC6+KXi_>gEYfb@1u~kQzTJNnvWz(Njpc!_G5TczodleOuaG?i-iD*vJ}w69K>mdI*-kWP=5XjG(s8KwO>rTt|_Y5ILs zS3#^)niSh9q*!6D;q@2JaVkkOO!YnrNjn82<)rywq?ELCFrKBxk>-rE=EFeO2_p`9 zgJ0>^vhQMb%cyJgp^7xaWU55{Q;Um?^pgmHSXxXRM_<>ADRZr}is_nW4w-urCUa;X z|4k4A%63#`{(K%nsHGXpn^pWkl{;S3p5mNaigJPuH+E8vIv#l$gUb_fOB|21xG=6d z*YWj3)mqXFlg!-_Q>Wn)^W}$2%++zYOr!;*8RHrSg?Ko_)H5DUMX}Sk`YPqic1p^Y zG0gO2Q=R+r5I46MB|C6hCvhXxxaT{_-UiYE%((KL<@L2{FKLFU-bW#6r^un4 zG#@#Xl6H)oK3YJUGp?WzA7_{vCnouy?k`(^7j4OWKPP=gjZ!k%&nvmla?8Ui5HL>)&R;TL3SxJwqS!x5 z#-pTm0+oMa9~sMW(#dMe#G+-a>7P|Xd9IdBvh+DE`JCqqltgob5LI?dU$2gPzos&T zfhd$9d8ZFNykUv4CoB;^)N}+`Vy|Wh9!n%MKTHBZhK=PTYX7^c@iUrX4zirxS{iOC zFmi7UZ3fb28Ln?tzcSQ>6t`DMw3fCA3ENNh%^C)t>Pe$(6f!+g)og2uQ^}7wK;&2Ij^@ib-YHn*B}(<)pnvUGJXB$!A}pak6sePCsi6f|oQi z;2RSuB<*A*<)rx+zbPf{_To1&@EMJT@l8<;zcRfq$OW%ER4W)t4=7Wfyb1iV-p`lYMysFZO3^4JN67uVlgjPl z<(t5hl_dVTW9)}ho%H0VyVMeQ-PvXK*VGcv)Xc^zF|In^z0cLULNnIVjB~X)azS>D z!g*?pkOmbV?LPpp_N5AsPy>Vun=YU33=z`X70&lpJ!=;$431kH+dWwbvF-5C-+$H4 zH4`a#gYU65!26YC*uXSj9C`Z~nYwqtnu8Rs3?v}#GU~vuQ#Pya4Vt;i%Qo>Rp0a#o z@R?Bv#($QP44yQMU|eV!anKW`X%MWTB_RmbU~~wAH3Y%SeO#>Jrtg+Ox=P^&A1Z4I zm7RR3tRbdxgFLcA>*x6BSua1EV2Q?P%O%Xy8}* zeokCw*kYd<8vet1vIhg=N5cljp~42lw}uV;LhtV;5WkDtfOLV81k)E%0aFa!V%Xw- zF*N#!4iZryeP!6<&N4JQZV%sqO<2l<4k_!}ZC#gGZ3 zHr4dhLpr~qT4m#AY+smLFCAC0Hg=XY)+ZAzG#y(EjnAqORJCF?tJiEFQ;SNLFJ|>> z?C~uZSuySy`yUlzjyH@nvpQ_RD}C^-2Ch+()ko&Szz6)#Dj$*isE^#keB|EkqjZQ# zh=?=hfj_3vXX_<%pAX5UJ|y`q)><(HWK@gnwlOl#_o2JABxISsOvP#F9+rfz>(oE% z#)M6Y%#FaX#~AjVC@mPmGRsbO(s+CRezJpraEC#!gOVw z<$J9OobO4i%O?h8-VOIm=&cjDI&O)+(=z)yi0J#y75-c-<35hWnMludFK!+^o9mb!NL? z(+pF+fa&(mOg-aaD(Y9Md8E1O`Y0roV~xzu>edrJ>8|A5r8nUk-$(qNql;pq1|l=R z7<{uv!mmO^0GY34rnyh2Y^H7z1TsSi*B8|vzY5(3{EH{8XL|jlPQ9WF_$5zT&tBmu zKT$S;T>j){KwA2w(@DCIo~o&t{K0$pJ@z2*FeTZ=gv`po_Zo$7(A1~{Ume(hpH`Ap zN9Lx$_kD%;YiiVie;?R@+iQ1Ob!4V1Q64H8P`F%EqYiw0U<2~g^Hv?1GXmdb3a_fD z1HUh@0Y9%KtBy-ouzP-rlzsr%L5zm8YNkE zWI~V+5~GiVSdD|tTy_%WT-@{&lZ#qOR1?CE8q1sfXH`Ab$tVG$QY^e<6q73-bQN2R2h`zd|fQ%EY|lX=uV<;&eq*)Gx6 z?S9G;>ZX&uyH;_*`dht<$ynSdkUKia#ci+maKcL}fp={Zcs-LSCY9D7mp-kV^2sf) zYjd}}CMFu?mY3zs4>@7YSd@dY zj8}WST)%Hgaxq>jIKw&BGbMLCiW-G4QKtOmLCTj|F^U>WNHdd1tvEw#;#f&;*TgRG znMCVJ#jIm;!-sOx+;ff-6Kxs0%&7+!k&0#PIY_g{_Dn*8)XjAWkveMH*i_y$11Zvc z(*52qj196VDF0DGF1EqsFETd|;4>2Fatfp77o;dd##Hjuun@cuxuZHxZ7 zUW>ox*_yvl`0GH5glzWVNsjtgO{HnTSEvIzI}71|df^dZRXFvF1bXdcRnNCsWhMZg z?p;3|+uW#ADe~qbF6JugPg50eW#*Y${iKK~t4egw(f0NGc8&snqomGG3gY{D@e$w& zo-_)qYRr4?dKJ3K3pasxc~auJT78ukBA;z;ePhIx_1woJrmQOQ+)BOtI7(9qFW_#f zqMPRsKf#NS0AJ}zqrj@hyyt$VLJxZ3Ca_P<$vs?Ef3@->pKWe^Ys8iH+`SP~R+V_} zO#RToMoqkGwp5qIice%4_xdS%}JYDPQ<~hXg^Wr1GNx^f#s>alFVvYRmreb_XR9Xi- z)oUCEuJNQ~pK6qCP_s_==8XcYpYhCpoDtzOyzmIHDx5Z?-upQfA_onrvu8@=!duqvE-N%q%q$wUKunv$GJJ@{{pBHqV9H=DZ}aNp zNt&8^z_hpH=QpKW?cW4VedQ3)ka?lAYRnv!=bM`nK)`pH%LMt8xB&94LKi^fZVrsV z&nd|`LSs56zMF%@*bSw;8s)i;4nB}uS7?7!Iffxrj+ zbd`_hd@b;W${eya%0KVds&SwVYBKnbpeFyBP}!W4%4n?B5LZ{!)~n1*yiG~WNlC(H z-sDAuwBzSDspExOhkv~n0va-7&sh92m3x)9arFBN9|)wlZN`IVJtavQJSxXmJtewh z_2y#r4a#6Gk9G}8dWSE#Tbi4f56L?h9iVio&nDz*ZD<4J3Q4=KqFFmkip z`L7JwwZPq#0^Yu#^iNL0}W)z6JCmM+_Rnd#RiYAb6SITTdYj*KQ z4rBLRPig|GTLjald`K$_-_>lUOi&i7^5wpgQQ)JVGz|Q!lAL47^|>b@%%ln2PDzfD z%Gy(^ewMFi1bB)kjRLD0^AjH*9)HLSH-T7MFRnPY-3XKWfC@b31(V|)`CV}>L}g}J z)jiYQUQ;smT=je}w&8=~|J$Fhb*nyeEwUZ&8v98**RujKjch zdeSKHTWzxBzV8_`Bc&)_uf^~7Y@IBj>2VbCu*emE1=IW2{#4bI(A77@$@9=Ensk7nbg8I}j zRVlxYtR1me=n&vCPZ|aup(N*Ja;rS!C~$2Xqpz(34poljUbqQd=}99M0Sk>^{#Vr+ zE!$N8AALQe!0@{l!@ya3#p>Ej?o_2_7e{NVujV0N%?NOYmtF-#v8iUHBp0g5tQM}C z(4N2fiUxs&uV@6gnA!V>YB%yU<%Z9?2dr7o3r(cTU;xbeGP> znvIe0Q*)!3I4^0eB_?&rHSe3$Q`>^arcxUoJ5W6*miV$*m$3w0q*Z=seC%3Y1jwmK zmAKAE{Ax8*E~4M1@N0n-Ycw76bv6FCn(izY_1phb{$?IKyE1V8pvC*?RM3GfuAyFI zp`#vY^iDW1=5~2Dgtuyy(iR{_%GGdeQ04;J_?+sGRb|!cp;4h+rp6X&lqYJO*HN(E zTRH@Mz9%(-ukoa$YwNXdYvFA5uh{wZi#tTM>9!9k-!|VLn{wSo@jpCUE5{Z$yI!N8 zsYmR&s@uyx|ALpzJ+#`4pxqA+1&qjS9PT8?2g2w9|GR#NloBiJt-MKrXzl&4cb-jz;);d ziVyN^ph$u5fp#fvyHPOey7z_k9cBM_YrZpRxzllbOaD9 zq$7YB)S)A&{*P)#wR&h&*rg+4HLfF2&=)KPPWGfGkUQcXrlx5wI*X>J9YzGjFZXQY z>fdYP1Ra^{w zhc~_n{GumiN5qZl*}e2Jrw$!K@v}YKI6Gp2>Zcy@#9rMy;#`$@y{6JUAXZ3605PaT zM^OE~s;pW)G%D=U5wRNA5hz#@ECn9vNloDCo|Nf`N$z^1cviT=`GH;;Cf6+W+UHdj zQqro=w;V0uZWM5%yIvfUaLFUKsRfsE{gv*)rYbj5VnOkmjuyZjEI2-6!CzEo!^c>5 zyPq2KuPTTFF=n9KhVZ|X|9(wn7Z0TF4qJ9=BCXa04eedR306`UPUJRwvxb1L_M|58 z8c)iEQ&GHHoye1o9mX}qcYB|Yb6o#JtEV3E#I4M*XU zp8l#<4~+`DbVRJibp#4_36=t9dQubkEKkaI#E$xY(y^L$=m?7c)w7MWBi^XhQ;&G! ztKB=|K9%@=FdT>#(h)!m>d+BXf0Zh$Ru7E|yL3dX#&rY=J`gMge#n!WK%VvOu;uua zdiG)O;q2az;vJ^AiDukaL%XY9>Jd-e(Y+)7O(kBXsTdB#3h4+S26gBNs-LgQs?|fI z!Y&;Vt8pEHf`fylz(YN$34DPkWke-9DhqE0)@w+|SI7h^nwR-9iPds`_hqX!j zSgY7uQ|SmGR!BzxF{ndFQ2p1{jB54JcJ>u@Jl2WTxQ;-MwL~ohem~6 zMntT}bp#5|2$llR_M|58YER0Jh||=wTfK*~BZA`3dA4zO!~Vl}QKP{6xuVkwZ<*kpeP+&8o*-bb2)n#Z+x zk$%vk!-$~xM9((Pj@YRBsYg7qrTZH3C6%}*7!Je==?EYOb?6AH-=xZ_)kCAgE*%l8 zaUFqzHwR0B|L#dm;EkS?9TBfr&)(uaoE;Gq|JbvQvm<&`fO^CeOS+GUQI$ANQ;9Pm zR!BzxF{ndFQ2q9*tXe%ZD(un`u^QJADA*%d3Y_OjP2lmKl~l2&#XlDyvoxjS9PTM6AYj1PVSDECqhT zlbXPLJt^A}AJh)m*1aPr{)cB9=ZNT60qPM?JhOX8oU0PA*HlIX5G$l3fEd)FBdC6% zDyvoxjS9PTM6AYj1PWFJOMypvQWJQ(CuKWgksi@3*R;ckpqTHxjeA6VN~@k)-7>-wfD2~1hn7s@u-n=u63xnf4%d)v%zQT~3dsf+~R<4ST*k~y~U zuhWe9gUY*Gv9Va(KXH!yf5BOWOPBPYyR3I!@4ONwD%iP=*|SmnnChHvo@5J3JzuZ| z^kKwnT?=oF8{n z)!G@FiX(ylp`^ScjRgqzd*MM~RXD9#o9PwsDxT?wfi&dzvLO!>_L+VN%o56ujbbdZ z{gC0Ke6A z^_ogw0(sT0b6+BSr57FqR)stFB??}r3cB_sOxV|PwV-Hh2Jd zvnP!Jsp`r0CAHwx4t=>nYdkH~4BVuod|$euh4_n=w?k*RwFD+ANIJu@QGB85OgqEz zX|Yet1hzqQ=on}lyMCxy1y|OWO`Fy~S)S;e1UKH?UYuHhh?B?}16}2UEbP-tS*SrznG9~3*Z?qu1j~5;SR)zEXv^FzrWPJz8VdXi08AZ^AI}u!{YoCAp(K<0$Z@ZH%d1ohbWw<3@nr@}yP3NfqrQ zCAsO|j8#CI;`~i+|G)^ODUOjGt&zb4tTrs&vxjC~rSLu8`X=xZPZ|Q!gj#Xx(Q4dk zZ{(>!>dpkGS(10ubs1&mYX`BmPG3N9zfACMwG6WiHyEuGiVMuorJJzNz@YgQaJS>pZR#WsIb4Kzyh?7Y7utBaely(T!Tn0>ZGXBM;Pm6Ttm{5w?m%x}9v|Dcw4 z(nI;jly81T&)M#3Wc!Qc1A4R1y=e1pYJgM^dyjVJ!SV`6!ahq)pPiHhMYNk#^+^^_ zygIbNT|602IAlFR`PSeG&$n4T0iBkLCwzHT59KsXJQ4U3Pq?D-dqVkBPk2RmfYeZWv61|Kefq$35C`4bXB-fQ(2UNjKQ8lLNKw)C^YOz+LnKBDcbl+gqvP2;e?#jO3OFM&NK8Be~N8W3cOq z5thG7TObP_@Fl)6!@%Dt$t{-T9tn)Vr%iHIJ4SMglqzpC0^ixjNbcsq2*h(vBe_|= z)x*HUEAAO7$sHXSfq2eoBp3XczA#s_f3{^WRe!bUd08;Qe9OxGXbt$=o^Npp{)eY6 zDXD&)+F36amtah)7fX^jv|~dSzc_u9_Q{o+ngt#FZr@)+z^^GumdDK{nR^1?sCLMy zni_TBfAyU;1bnTMtU5AuuB^5{(DM5$>cGGA>IOYjr`T_J)HFi~WFBGE3Bz{O!Pe+pb!KEs>Y1kwT#1pZgx z0@5hqqAf$dE!pd_$aKj*Plw#gyj`m>weD+Ng{eye3A;WWNZ7NxH)0iVZzVO%sTfoF zqQD1aO1FG8>e+!07}_}!_gUs6ukvX-wGtDvd*-_mrexz<6pYlM>A9&_k5x@LNfwcm z={X4##}O6Y!GtMe6O&P>E@KmK4}>wE*ibq8d^6y-Y0uR$DmYEc|TuEjz8!gEl6&QiMedHKJbvc9yw|WysfS4kiG2q_5vQzd` zh;_mR#5A|+lEXS-1Xd00cD-#3$I$z|p@YB&m1OE0EXiS@L@E#iWjz66os%Vpfx-x^ z+L|6R$#NvWOU{=dpQgSsb250EcU=>>o09Ce$>Yv33mi?s{YD=+bVU-+BI&M`RX--k ztO~@0iSik(#r@~X#R3$JnoP-_JtZ{il(NlMO3Grp^Z8r!#oI^x+qt8_jlM%q0dDf7 zQQ%mmk4H;#mw3igfUjv|B==^|I0}4=C!GSkvQ3uU)qxTC&Njw;lLM8;(-w(HAPsRt zg&b`WMj#DwjN~v}7=c*r7|CI{FaoP>c%s2)+CnSldv^>1X^jjQAWd=OiX5#GMj%ab zjO1vIFal|cV+ieH>}-ncG`*Z2#Od-Cc&cCH(iO+}z@<;t51x#Zj}Y$OXkpQJYo(*MnL?m3xyn z=S+*{mT>*L-JJ7%3sMnSd$en$G7}UZ)5-!b?%0$k|2~!d|MZppps!QhAYIw1_Zc^Rj4KMil%=9?I3szk2 z0%lW(@Pg~jYFL#!4KKLcmu;qjHe0l$|zky7qx=cY(Vq$?c2D zEewpn#chn_4iAjLBRy#p$jw7n3AtkeBks>SexlO(0FG z75P!xkQqq!%m1O0*Jx^Xir~+9twX@?Daq~>$^1U>0Ur;1n@ch~c<*L+il?c}n5M=Q za1bTVmB}W$d|#!s8#I;cejujGEu=F`GLHm4Af^i6ri|T#Dp5&rV6bqsQfi?#+hTnC z5oKCXoW*wSEWcel%kQSnV!H)v*KB7 z*WkLP-5ftFo|THgiua}E%!+4qlhYd7k~>ax*+(>$`49M4CAoR1O-eJV@JLQLKjKp1 z!JKeRE9RPza7`0k zSN3e2b!E@oB{St&)kXWus}hL~y@^~;vGJBdkF(-hy5*bOyV9R&Djf|xe5NasA3)tU zM&>*v3Lo$bp0pnLld340+4^*+hyuqvX+7{pPZ|a8Jhx&9nL#CrHsFLk9iRL@C~%4= zjRNmel5G~5p9enR3y-PPO6EKzN)^D{HDIhhC-T4fH|>y-OozO^m3GKT+99hl9rE^8 z+94xphpbIIWF+noIk`x?VjLfcK&|TXi;|HH{h|h%C_x7>OSiH8y zSiB@~ZW$vp?O0#?wJkCy1>$34WEiT}OJo?V)=Ol*8bA}keS0$1(YzQNy~ue&U3vK`Qpz?X1vf<#hl4kWeM;97f93~0KtVgNwl(0BO`XRGSMb^bjRU{oRT9I_Td_~gn zLKaEKOIjrDBIf_zzvq)bp4M4Ij_J>`l3~VktmK&J zEGrqNH^)kjSMp&CpF!bIeR*VLC1))d}J6?^70^%5oP(vFs6hL$bhnZWEfJy2V_85J~9j`;R7gQ)%Z`->>ZTg%5bGKT{k5vh{Bit@D%X01>74Iad%8@KnEh9|o@Xq!A#O0wtHL zo%)$286r>kfb5S&8<4HCoN58L>i*aESG;Ey(RiOM6|iOgH{By!(RjlwRm2N}^+~)g z2w%J^NUiabAY3d6Y;J`M$f{r~Aj7I4qCl1e5e2e37_Mk-5UzM(5UzMx5UzMl5H3~( zHk;NmGN=19$aO%@80G70KvoKIIFMyR>IAY#NS#17nZgBRV<~|OWG87YBg5h%qCmEi zQUP$s&W9f&7_T}a7_T|P6)!l#6)!i!70*hw;(a=8e9%uH$xDVZwbeJxb)pP6(FOdS zUNzg1msH>-VH5W!Ozthl&i~e5rPcqZrsh5@_+y?nP=dedX^Ttny`HwD1V8R+OG|K{ zwx?bkSc2z!+Ce3FiKiW0f(JcqSqWb6X@`{HS9#i@CHT#rc327isHZJ2!8dx^;U)M- zp7zWVjKk~2iV{p(FIFaZ$Qs@M#@Po;Gkvfu(+A5leXugq2S;W4;MhzbJSXV``Srdz zNhb)gKj{S_?v-?d5Emx>AjCyUM+k9g(i1{lmUM*>mnVMjY5((nCYDXCgNa-79xs>} zHSgzwiAVE(E|}P>7fZbdh%*!GU}CCX9OPRS;^yGQ{t3Ok#d!ZK3Pv*NWckUnD{Cue zntQg;7}?v0vLj~u@lL6eTsq%KLc>o^(w2!NR8ocG_rjTuKIDU&*(k~&FOCp7xmNm3_NQjwJJB)B@EF?)$5Wl|?pQYY!^ zghm`WN$P}3Dw6W>h^rGCGoeUQCUrt3b&{@5XvD0Oq)w=$A~}INp|LuNBxO=3ROVbM zJy#{AG+CD{;b`6WvJaL849GrM9*_cVP;R>=P8FgIHd&?Nk2w)$QzjXSJYzI|k*sL-c9JrgHxzx~vy)28jZ>#SLG=FFWtfBxQk@3-H;z<~!I za>(I_*J^cYATad3vVEJOQ$-)080 zu^CKSFP5c!V>@YqhQ_ZoG~|*4_-9WViThi)d>6NYBURnedpNQ@kO=r&$gWJwvEO0h?}BAU6T*c)a)>> zQ~VWATT+5Yk8u1(7R+&Gb;`mWh7bH3eelZgfgkm>B_)_cNMnnuE&S_TC?0cvNlL$c zX-=>ce4nQcl;B4^ZE*>v&y62HWtLs}yIoV$9`OC1Hc*29=4p#dFg`Z=Mps&O#c7%v zec+2dZJ-3d%hMK@VEV`C`@NReD*Xc9-O~n2@FAYIxCGOWMqkn4Z-)+a;`Zl$-WvRq z!d)~(W#hE3!V?4Oc?vHMq&PlhBlX@nu3oxC*0lGjhv^w1&0XoZ2x55~=4d6|s;Q8G zgt7<%y%&qY4eB6*TDX3pF-pt|3HS#s67@i$Sh)V7r37^LEuC5+6M_EMkktHjN?ob@ z_fB;)vxF=U+xMt5nI#Mjyu>?t@Gyl;9EJ`2lE8MR!Z&Ja*ucy$(nk!rTjw~#4BPFB z@6%M+wkc$k3F$EI2!~KXO@r5UjiSH;In+r-0*MRK9ng(1vU+Ig9tE&_U^KOk3U>48=c-g-RIMZ zz3ntw_7MME+2aHdT+&|=fRTA(Mw>tzD*=1tcy+_bgwsVgQT~eY>V}b-tBY=iMwq@v z3Gn$Vowudu3Da8xiC|l;p(F84$lM>gm{4Kr5nTiVy)GnIPyFw^Jso90)81mt9%qnW zsdSmWf!wu)HC9;@!uwS0S}#5Xyup*!rjp17rs450B}aX+Q0M&L)tsmIJDy(o_=q{r zA-}&qOfPTQ0FUvc5#XpNtp}drNh83PC#?s**ONwoJkTUH@)XmH_H)Jw3CJyN+2;c} zTM({|`#S+{SPLn=QN5nUZOn()`t)w|`t;WF`t&~X`t&yM`t-)^`t+9T`t<(l`nb2u z#5A5i9v+~hq}4z=O56pcql61cM+p~@juI{)9VJ}AC*5b)Ymff_vd`!zp6rmbdLWLJ zi|4Ilgg*gpiK*vSrP01BjrLV(w698|eN`ImtI}v+l}7ujG}>3C(Y`8;_GIqr9PRiG zC&>+y*hNB09WGZmqfM*?))1z&=*pV8~Kj#2v-A6PvH1NztwBn$0AH`>T+94(QgPyj$JbA#$kQ%S- zuJ6RH(A0PU%))DW@)yr^vOE`NXpACKqwmV29p5#Y%AN~&osvuy;5!2wkVn2`lV2-u z)*a$EG&Qndc9F&uhAOEsg|YfOef;0Zf*pOdWqdyj_FHcflY&C~&$b4Cea=Le&#@hFN%n2Wv zFv*VIx6oO%n=aZ`-{G1e5G}E4xneizxQxX=)q(YZ-*KL6TST6;w|He6{eP5yqR`!A z08swmOU~93C=A#s#U{CBF^_xskY~1^fd6&1$yU@GsTnduu>M`OzxG41IyOnT zI@{8@^z;b@C&IXo9hDR%_T3GCvGOPd@ z=8CESw72NoVFk!AkyHgb_gs4ktLImAD9Ifm;PTLqTgS*SJM3g$_r9`c`4tb1U0GYa z|6a9X`c5Tl6#LdJ6TMDvN>jFu5tWs0+&Y%&#;v(-+&Y%&#;s#?W2LLMj?q>0imjdQ zz>${N?x&C=l9^Y{vcZIUhfb)57EhjXh7nJlLJE32qw}VkD9)4TNRKaZ!d-s37b2NyI!W6nPUA*fBCQ@d($#ErlHt*PAs(CT zcD9!-jO+Z^F0*}&%`&vuDszDm8)azNMD<2C_Dh;ys$oWmnXgKpWFIJn!dfRII5saZ z$3_Y>G4%((EFpwL8Nj$2fpz|MiRQJkCp5LLam-plTTRE{W+ zA(}@$%3q}M|6;0?)NFDq&`TZ*R&~>^yeMHd&#+iz4*2Fls0LNuhMjq z{1)k0vEa-?o)lKn>olF|?vT6l`}54+P&O^f3l9yLTMXD8tL$m)ZS_QGW=R9TtCvJ` zo%%g%?YztSHx_fX7Fd6%B8xkTWa>mm5(q+wP1&uJUNNP_2;94{6LZdpr1#|`T^jfA z^6@{C+88tS$Yo3`QD#mv*e<@xs~ZKrK}nN}N&nnf$S*w1O*EKGCUa=gFgGB3Ykjr8 z#w7W-1`3vaRImB()Km^dIR^M^AWhO$XJ5bitpCkYr)0WbDvKaj&r1U7XoaT*($b@y zAgKtxTuG!t;>wv+NL)FS3h4_fNGhbg^xAlZznijtOd+XoeLzX1LgM0@R7iI!7pag~ zv;L?%Xd!X+%$2i{?$zxwdodx!dtf2OyIdiKj&bOzcVwfuu;x#6=t@hBJJS;5?zF_X zLoG4xQcI*WN#!7&&Lp*bbSJ4L(xIf5NSBgYV%oVQbSkOkqgzQWk&Y#`M7oyL65~#` z#JHO+G45zfjJw(rO|^{R;e5^3K!%HDTLTfrsasVG zw90kg4XrqW8nSh0)Ec!3lGb}0eT}{eljPqT$nu+5G+S7E9Yf3!QRZqejwC~i1If^c zBcjC6;^;86I5-S#X|!e-8uJRNp%FWzhDNlI8XCbuYH0D?VrXO0%3)}P5vidOIHZO~ z+>jbtJh2#B94LlHfRI*ctSRQio?sz0d|+b6@PSDUADEaje1sHXWBB5zu}hMfrp%xH zx3_QNq~1RFZ_NE<^4CRsk*8PYt1Ii1|0xHRKUEeMGYCLi>@xlPQPd8-JS-_ttsYg!A_bACd5Ey|Ed(sf_&q|t>36MQXO8=@{ zy;8%4#e$MNBiKB5#d?fG_gK-t=S3IQ3_An)fD_#y5>EjKl++^{_9)366c~X=deR{9 zcqL7#_VOMjSe&KyL0RSNXaZL&$=OG4ZD0hR<4J?SbCrYvSIaVnJVS++d*SD$b)2Y$FX+bf3N3s?XQo=gDS74YV_cnC9btQ& zcljwmdP6?EkxC*5lWh66Ca24$g7>N7k7~MWaeDtrLj-y1xGz!+~1XD#%0PRM?Rm(ANfdEs-pLMg`>a^ zE2(nm1L+g(MdxSEgX#q~@L91QwgtHitwfqGjfGcQnmuM0Lkr10@TI#x9`pU6zi<9Qh| z^M+Q5c|1KM)LU95=JCvoP`}*C%&XOwGT1alZ9%EH?uANvX=gLdMAq%EKE;*tr7!uW z4zTT`U)&38`?3_@jAGQ=sg#?v92$#8Zqf1*n2>mmmYWoYq&I=M?Ik4c#&g?CNIa(f z!egA_LdtweiJS9$D@nLApF`S3_mSKj6R!G+PAxabgv7Rm54H&@_Gou658(xk^iXrKS+# zW1$A%yLY705#V)7GL;%>^7kp-Rcd?y<>y-BD>a3GQ{q88QNx-cg{?pWe%q5)0}q(y z1RKSsdP!!j62))84W2Xzd~pzMlox4cTOjt7WOmpY>qdZ2_oPAKu1XS9CX@r3Ss#eK z`*&`AhWv7CA?XuZs7v{ z)RP8*bDrhh1iVH`;*(lQrgjv3qre_d8U)T(l65DUGXt?vj%nsHFTCc>3P0pYBfzhE z(i&h`;0NP%NE**7)bAJg5#X~tX*KYLo-}xk!q0iq8sMKjX%NU`Gcrh7%~l`LRCwbB!aDykU0lx2FoG#mSWUkWR=93FU;Qo3DD143b zFwLCg4-3}-S1T#Z{ZO9QR$`_@DD0ZT)Xm!dnoz-e6@Dy`fTR+)tp9uJR!iKyPT})B zX%P4lC7DTjz$`~*ZijeT;Ey*DnVH6UG5jmbxV_V2DCX{cO}-a5$zE!>3l1hlcE4gf z@RD7fnp&|Ic$t#Si+yIvB+nL4SmO7~DHPboVZf?^l}2SsL)G>QUMDJv?^j49AB% zEirbeCF0Uo?dv2gv1g&nT%@TbUaC{>Tm0191mb+lcZQDdF+a|mK-_QnZqv9A-fpf? z|KVb3-YH57-fosk!o|XMi;{x3n_tumk#N<~bd9R~>jSz%tH9nVE;Cb8S-gOIc~TQN z*+=?n1iJJLI)H5-KUKnP| z3CX%#@GTrNUuZ8 z1IggiJ#9$|e!r(JEx}ya7{7o?jV)Z`^yt-#@e6o+Pa7z~Gdyi^37+d|OG@zmp0>0E za~)-D0h1bAxVZX+mt9nX|L$o6C75d@;}`IM=_QisBQV!K=J{PPmp;Z8FsZTSm3lSw zLrslez=uzFk#713{2@ECq!Eg7pr6qW)ryW>= zul2NpO7O=$?cfr8y{9cJ!MAwYAtm^BPdl^(-{EP8mEa$E+VT>-&C?Dq!N2shXO`fH zJ#9q^W)-Zo=3WYcHyb+U;cE|l-pYiAS7;JJFGYhoGvGEZAtg1KBa@dG9`@xvAK z8DLvMGo3W*?nBB9n1x#veVb8~|#n{3g<y@_)bq7D8WDUw8bU(K~Gy!g8$@cOH1(I zJng^|OloWa_vi_O@fCP`Pm^^*@$R0sxCGDlv?V3@AWvIbf}iPW2bN&&1Q=T`*7Emw zzD4D=ia7}}_C2h$v-P~g(7=y++Ts$-IfjWLFsZ3GKH4z)xC~00; zFT4z2eC1_mT!nF@V0-{RTd%>4ec+a-Eh)iVEF0PQQqI&7U&|R-3V#>5>HQBvyw;lf$ocSH+<9$&HW-J&VfjJH|?F4_TA`52B7+Emqfkqa5 zj2`eA`@vyM4ft`!I5M&vc99xcFtKau1#=E&WWl6H7EFxWn9$hgz|6>kNsTNxjDZ0^ zE{J<08+v6th$|y@bn*rikVB1$#T9qR`>+H3Wqh&`N;ux&4r?f3E5gzy6|k}~lNwSq zX$pyBW9Bm<#nYLPF3}THW-cKyaWM%9i8&x#eXnA8hO6()FU4ej7G_oARd>44e#Q}U z2DzLJ5i2Vr!s%G5hZ`s96@?tI0J#9MUwt6+%AK8@@Zr@j=q5}^K=xQxl+0}1G4W4?cgRI{3d@i-UPl|Nwxwq zA6DXQ`TG0f{&R|X1O1H$)=jdWGtWZV=YaOCmGH6jb?2`qOQbZEm5)_UNI(`lYZ{|7 z1Z0zdWU(>YqP50~vdEAMv7W3fBFuupq%Wj+E*FvupSFJq%{F3(j0@kM-ifaKU=82H zG?gQBAQ3AEkXy#ctnwGmi~KFVi!`Lo1V>C0vsReQH#E>2#pYT`CPejmAiHWS9EZ9k z#=-808oq4kj6L9wXqjas_(O0@3(5RVIgRvqwrEykJPa%`9tf7mP+$jViDZalIRgbU zCtAKZSS>LQSGfcya!D;8do3c^65|+l)kINjTtV=XT1Mtywnvs2hp{EbfozE#LR82y z-`ao8+25{uR?Lzn9~=RGON-<|!i6)fNWp?9Bv!gd_jW}>Vu{;dPcnq`5`~)r3CKBz z7<InIjIB) zaH<;7D9+wok_ko*1^szM`_It!o8JLgJhLQ=5B4a|mAhn(4Sp83uVidCADCG%&@Tcw zRP={-4$l`x_so4C+x04^R^0qy;C3!#Psh`$EX~IrA_Tt>*Ru|_Ux4O8+ zbV<9ccxH0DxW!t|++{iA?Uf~Frk#shOgok7&_!^CP=0R-Cg&!mF=u|Y8GfJ4{!jFRg#3;9W62&Jl_!T;=p%Ti_8_CZv^~Advf1Qt!`O zH);9TJl_cLcR}BsEi%1&GfEad;6f#dzPnpw4)c7gfzJzkKWvdXC-4EU4tzguk@;ZY z1M-lc)O&x63^&1KbHY6^w#p6p!b8bpeb@NQ#33H*`*R@iP~U33?If+`VZ9Fo5|8Rl z@|TiB0}59M(nESn=YKSvDo?+$US1(@mbYeIqIY;M)ima~Xci@x1&+;C9T&}FBeg_# z53!ETvzF_vh}D`(WCLHVB=O{TTV$^Gd_%xH0^j#rWPa`WMuEHd>x(PyZIRj6UtJFY zpC9;s(jxPUzz5_3Lb2~>Ei&8+k;kKWP;kLAH%(0_&MpRKmSnjpvb%ibZ^;7Zx0ZgY zWt04iq~RoA? zGQn$!*Km7TrZD@Gzkef7~L&<)#qtYjKYHEftp|!>#h7mINNBq?~k4Fc06(^oRRA7bse` zwaD;Dpb+nGk*Qp+{S8yi1)V0 za1bNJpS0plmk@u}YTKS@rd|x{Vam%jom@1|T;r~HO7`#U8l~(~$~Z;n(GM0#*+rD) zYU)h8R%>QsEXHohU6yRgU6yRgU6yRgy#=zR6%Q|4QM^gEL>kQDp(QeQDkEY`?pkF_ z?pkF_E8Z?!oy0@sT4hVF_qOD&RkkEu+HoH%-jAPf+gYx8-8_Hj?8Y`OmCL<|1HG8p z+5FJvoc@V(7PPU&7bP9o;sdb`Y;n(YV$->hZt1{AX!3GY2e!CBJFs1%a~(5T2e$YE zsRLUa1s&MpxahzZkMj;}@dZ~0ws?rTOD3*cdBRs_r_A{k*RAZagey@eKSf=W|4>LO zmw&*+HRvYD)5G#Zj?_acoIoZEX+@|BuS zl4BzIaKS6((|3@lafbP2S37#b3(v|*l{0lWIy?IowY?LE zGjbOCw@HJA>tacFCeje{AJve@HJv1{%wJF}I9GxgQlX9CMV{nuzamgZ7_feJF<^gv zSw7yFk(gQ1v{~xHS@M1UcE!v3Us=pm?Qktr?m6PJB@6h>BNr!CiMX|9u*P*x&(~Q} z8_t{Axwa&v^#I66&37xEEb&VgH_6->TP38}023kk;4fxq$8hi{p@`X>40ef5q)8<@ zfd{B!jZU(mo>S6#PKmv4@+b_F>r%-iI*VeB_H}4Rx{Qc=bRDnk(~EPHK)OI?Ey_{X zsZ$Ma+zdLErtDksjr0rI(8AH!DmhE+}Xv%@iO`eKPrIY^UArvfjn z7%o!|*-+0ZX+7CaMPZO!mr7NyRtPsboV7 zM`Np`Q)2@(Q*bXBwiBW zxK~JDR4z_-g~TfY9O4Rztv0E-D&;9pQbYTXBb=S2hQ?E#q=xnhT- z-XWDC38cd&$a$FzDmsl+=5yde?H2uUa2R?Jk0Bh>s!S zgH(ipZ)+DO8zO0lNFo(s;5XZa$%dF4BIZbW{hd7T-kWzQ<=skg9u%U~d{%OCzq~yt zWpUW3zX_e?dT}O4TR;x3)Qf3E4W$t^lt$E098p!P+QYLWGW&4`|TC zp)1$XZ=r+M(Hp_->u@hl6kQB)QXw(INrl7!ClwOon^Z^)Z&D#Kx=Do;_m+_8DY`{S zX_u@^yJTJ3CF|lY5nXXlRP(nbQ_kQsHC}=>L*G>r$C$Enx?ayGIhqvG4ti+Faifri zlPPDgTD!sAf;7vU`OoCde+KWQce|#O78{d2%vrK8p?r4Wi+1D781!R8_6abl9RRQxWigMhoN+WMXFTCno7NT~k}+!^|1~C=|G97f zSNUpvyo|~-1hP-#T~r{ihTeSVe!q}-50zW{Lb_EqsHA2y z%Bw`AhIXg&ks8`hltyZ34=Ih*(0G-I)X;bUnGg_D8ansT{X$}z;eMHrm?gLeCZza& zmXP9GPD0{_6REMH>V1RTH@nqb6}L;#XQUD@z@xRJ%w1F2t&t7AJ4El2iZJlpc44wt zC|UM&Kte;SAv{QB_y9lQb=sXV*$_xW1QMwT10QS`CL2O-h>#-{Vc>j?Ml*E86=Xwj z4iTKB?2O6tfvB)EhC(>I@h9K@kP6cH@^^Q4*Ekao0tq?wU>bHqY1j>=VK)?qUDcxY zsCnu$!a4$kZkK%?{Tn)R9laL1XB~YJoW2g{;zH5IOh76mCIV6+F%OUmiD`gTNX!DH zLShmi6;j$){&RhFjBur$vM%kEb!n%pi#tVhF$a(eDej(X{u|~drV(aPB?Vif)dDI@Y~wFPRfa=ZaNtW2Wr6O!oqC7 zDJLMi>C`CnN!TO@^hDd`qBu+!k|X_sVtTM7yH3e641lbdW_}hh{{{;W7`g^8Bi75x=aR!K11|s_9dsJe4XWzO=#vs6skZxp>x8NPK67 z$4Z67tMa5~2g z+J(u6KpY|vN%{6EdA@;a<`uVhhC=ANk>*aL(^wiJme%@M8Uhkt>cKR`hSCrlN<(ZY z4za35NvuUz+PND`1X75Yb%Y0yXEfuf5sPbwsaJgJZv z@uWgxz>^Az@lGlvhC8W{(wIlZM5N|{2t|V+h`d@xy`B(fRU(i+vpAgW*cpb;%zkD{$0O~PET^pmX~rm zq|>&~@Dex2`z>!?C*>ywzQi>~ALaCXx4H??zj&Sbtuf_)4}3}8X1hx{A=YWDZ+ICA zKY4;}IpxG?H=PWnU7lcDPB}r|O=leHVKW}k6K~6n7AD4bRu)OwO_IIdFOnlbrcm9b zF^zt+T>;rJyZW_rvW^ekWRl%m$+95?G7l>!bMcCH1!UI+1wdwPRlv;s%60{0-yReI znd4Of^E?ZtE}`NuD2!#lU`bg#LS;3N2ctSO9(TeS53xqEadR@BR6HI!;>viGG>Y># zCqqJ87e~K{$APY#aZC$m9KOmKuNqaq#8F(6R|oxnlN#IA^grIl;zca;)s|1_n^(Mv zWoX;!dse)PWoUd2kaw{R?Iz{pWh_JEYk<6sWoUQmYel4n#*0CuhW6kx*Ah}g}}y~Hz4j;PI`dUejJ?4&gypas+H`n$@VK*PG^C1pjayJH~Ide-$ZMV zCw{qIE7|V_tw6e4w91=GN$-lM=x9>)6n#x9ua5yq#dvz3)V7@rskWU6Ahj(bL#n(< zG>mhU$o`D}q?d$5XW(KX#Y03$cp8@pDIOp~!cC+?!XKnUqUoeUVo;C@iAIwOi6KEM zq}Ue|iitvUYhERt)VJM)NfZ27s0O}F$9UxyAI^h79Hn;~aTcL!dPEeE-PMPlJ!2v} z$A{h^5O14+76rJMU{$?jzuK;s?014*ApK)PTJ+Kpq$YlaOlOeFwK1JRsutjVQYFW3 zmmM{qRWjdFve=|mx;#{E=_chXGjGsWT;+9wJ6dE&_SNZ|WXiwvpoHFk0Oo~Ehj+twmODtvsV^|ZkEK#L5i@bNL6A^qx; zZ7&(pT5-w^T7G}vyQ@WpRQUcyKYe+&rnbFgNQIBjVm==De$*mEDtyn=&t|?}Q`=rL zq{7GNGoSWM=O5vFphbpM_~Q7GD=!}(RcvA*_usYJ-yaJ7{+$*XQt|6{+K*F0e}1n; zhE(`ouH|P2zI$3^NQLiqE&p2JyRSutRQUGQ{@yS2`%hbBNQLh;TK>Ag_wyDRQsE;6 zMnk`Ur$vTTRvALz!NB*u78z3EBLrR%`u(038B*aR1pXHI?rV`D6+S}XO(8yh+9E?L ze1yP`AwGWIB10NQLhW zTK=ZM_rn$$QsMiBmj5#F{kTPjRQQh5{yskR`~594q{4T#mR}S2e$gUBDtmrH;N;Nn zcecoo3LharD&zC+Oni(G0;IzC!%TdP5CZ=Q@$usp8B(d25FizO_h;f`gbUqED?W@ z%DFxMAQe*V7b_Y&MmjC_i{(olGm!bf>Okg$sEacnL|vSG{M1&GhKqc3Mmv_TXpQ%i zTJD*5q)DZkhy7Q>=BR3ULH=R+@RVFSKnY$OPHjRLOrkUY`?2PHvM3(d)v5S{rjz7> zH+j|3ynqJjFIv>$ElR`6r@AgtoAYl`%8{I^hVLDLUk}m33!2O1*>m{ed$01#TbCLB z3-n7PK?m}#jp1JjY59w-&cAnQ4iaN~g)>vX;lxtD93^jPW;ipJCYRrRVj-Q`-yRFH zxrRbF%d%+ORQX3pGhFsIP0jBRxpUl(zw2Bp_qa?m2 zBcunFw9CP0TfbN#--r>evy{Z=V1&f`=X{*n*2&xEe3e4@_y7f;l@L<=vbm6G9I2UH z+<}exHz09{y*~<{OK}OQ97q6hi5^Jc6jGUuft$TQhk&@woXE-Kh5Jb5Y7iJaI)q0_ z%{8N{p5~oA1jO%p+YjH9iZF0}5C+miDoihtW`47aB0942>wx;(fYQ#mYt?sj?rtYI zugd@d(%^%&m`CO)UmW;! z1qg3$8$QYpR=!T}g&1CVm>u@%@D54(39Gr~>8k(b-k$W8VN(a?=LNp3-IQPG?an`> zXLQ0tpzhP*fj*-lzT0`d>c7d`linRPA84Tbw!oLzZTKkvy0_b$<)!c87+!doCijuY zL~^`_8r%JM)nC*3FL$%q)Is^Az?Zd~@~O(#>5i(=2@ga5$=H3Y>VHnKCwZUA)Is@3 z;LF-g`KjZu8y@DRCu290&J-Q)xmV)NHj#3sgFR$trq8RUL0|-QF7Qd89zVN7==5L1 z7*E!EF3W_?7?U{+_P+)+_*M`aXo-%(IpP!UC(k&%C$_tdA(d*5?z zr$K#w^Lw5N4}HE>Z=I?-RdvpL-sRrQbm}R#OgaeWi#}Roai`SfMhlRtE}!;6P`3V5 zBpX*w1XP@K2U1*RcL=ISyK~YY@zNbgj?3;4BvHH9PcZ3;P+Y8^ax`w~X=gM&?W~~! z$ZXbvrBOj|*G&1(|LyJKM$2h>7e+RC+-SKcvbd*mvEDNgDejca(A#Ii;!eq{Ba8bV zLwf%qvw!sW)a9{X`9IjVb{<(~7aUox$Y}xSu8M+Rr43~>EEicI)yBIaiY}n`|I4621OeCGny4nHDxNqSav#Ct9CDk*>$AO7EqF6dLfK!YwgL zbLQqn?7OG+Yys)nTl~JOHKkek#JP2E0AFXUwZN*z#tt<4-pf=4p3ju`@VigFqI>v? zURdu^k(tFh4#9e_9-8A1$q<%zmpx$*>!rv}et1;@4lL5h^%Yn2ibcr96?Wr_-ousr z2W=~kzw5Z%`&F7j_`B}ljXGk#ayExW(q}BiG9xA2`Y%sOQWdIL05SC(a*uj6YD%o^#@M&2VgK|XUJ~7 zJW$VGUvY}E$Z_ULYkx*4*-p*K2qn+t{7LSWYVZ+ST=L6a)LisotnR4)Y9V^=XFW&K zp2L#I;{j?1O(DN^eP?Daa zXCe_wGSS_0Ng|X4FGy_GD1T8~Ij;l%tSoYsA~U) zOkM3BRkgDod~lCPuNW+De{iQg+!ehT`K20L+-9UEjL`2?xTlcK00eCtlR)_QbB{Y| z#a{BUTe;F~|0j>6RNo7=ogofC)yK14(9h9&c75!hx@6$E#fhx;m3X{Z)o#~zjyO{Z z0ql3`;U3vq^+LSA%7maTB_Tefk~{gKuJD81!{3!m$6Fs%Q7qL`?bFyujR6l*R;X>L ze~yB{_q7Q^JMjx+Y^DR&#Sd2ZBQ$SDHzDtExU+&W_qUZX5{ttDO;ZL2LkMm?F#*_y)(Etdy7 z@C%K%(t%%Tyj2cNJ@`0(S&x6qA-I_-YN&CUcElnl7p?*Rypuvjknr?*BEc5 z13$-js~q?e6 z9=z0eQsau5W4UI~|IB!+ z9k{T0DYvE-Gq=liO?k|1A7{T*SO00*R9QR3oJ%Hk?UuK}fp0KY<2?$$99ch7_?O6H zEk8!*m*@hrq{|&aAgjAvgtoN9Mb@!t^IHccQr!w!;zd1hPm^i_nZzP>svc$i_djT@ zET*PNeN0)b?sC}(WWtHm=d^yQaTyS0M_Gw_D(88cX_2B}K5VQpAnUrQ2akfr~jI1859Tr4!0=TEGDVqnEE2c0-4EX4Z z*a?bb-8O+|R>b~UF*PmPfR|RpUa9yk+KL#({N>2{p29yyR*zQfLaW@QO#KC4xah0? z%@rjj`A=G2i{sTtm++&Gg<#I9pebyKecfV zbN=XPoK=A{f?Q#<0&qr<^^e)U(WdNLW;P4ENHL4qxeE)(Mn=>FDRYqmvWklokX2ly zD0nvB!papX3-T+i;#NEQ0BXT za2YGFHY-iwqVQp6xoTVkTwd|K>7b&ST5xlh#}ZaOytM~yXt-veq!-nKYQVYIOk zot3t{p#4v^ag-@+0q-%^I5rlWjn+|#jr3lJUK&}`-EB~TEMAy7eOBcBf`5p)-aIq)Lm9qz!i-Ng~cJJ93~cHk3?x6*;v z8E=&XpKZL=4t$C64sl>-yh9!Mlg2yDfxl$D!yTBsd7qbP!YDu==SnqHpnogJ|GQVC zB_}N4AC0vJ-RKjk(5?O#b#GM%W%~$xhp}3zy5uf=+fzNU()Nr`=r!sb)uXRtKvF<6 z%FjB>+ZQmXB7fkpedPcQO35EM(jS09J^2I2_yaH~Du3Wue*gvn^aqaj2VfA<8S<%^ z@&I*4J^A+`io@=woJdqps)D}SII1q_PIA1Frwg9`Hp%2B|e%>03J6fnq}KTtXg zgGA1d7hcN)^&-g8$177#8NgG*Hb$1u5#X81@(cf{gW{IA2m)_v6NKVPgb3z*fVaea zX#r!;{0iN6M=*5Pau)X+z^|C%Vc?iL+Fe|J9GG$WQ8sLp*Hk3I*D6oWPe8^RIz!>V zH=|C}o9wBe+ zh!M6OgvnUNk@_f#B28I(GV;ANWkqp?>R?O~OdunXC!s*R?

vOok$Iyjnssg$1OQ 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
ms|fLuvh;oH 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 z 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

  • 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

    ssKRr$rz%J_|S zk*I>LqclBB#AKAHLak#=jZx8@8`PEW*BAG$CM_8!`$1z*vZz0%kbhj8%@~Qq=j^JS znj^DsO4J0|d6lM7NU*_rpJupCq()9FRvQZSZ0_(`eHxv9(jUTH1yA&6E_VvzgMleN z-8>Ge?gTru_fn!#sb#Z()bQ@0V-i(Mf^MWnltS@| z@6)(m2~tHOuhH~pK?(6=Yj;S`u9GM;aF=+bZ|WkkHl{L>q0wDZdXvCaVk_U2EAax~ z6n9>EGwEFmmDbQPL5hPkq$d$27$EbQe^LZa@wcH;)K0eFUQ$kR{W{d^nE9_3G~c|6 z{wFp<*LM=^(cs^Ac=1{dKY$;@z|%^5cri)k{2RiRi=KVt`gh=Bt`oe*q3eH5O>5Z! zGmo_TR2b&3xCe=w16}_W|OY@&dJH_y4hs$YaMM!&Yd};nuTiA+QwX{47wuRl`{8sk(a`**w z`#YO_bKq03hLdk5@oP%SCqK9S6(Q}{Xl*N+0%yWq@JF~8M$WYU^U|)mq94-7+Q$#JbpLHM#9Fq%+@V$<0jI*b za1ne9z5~}nH~(_-u66Qv3-N#UI-B9l5te7ecF@iLzfsn*(P82Bc#gKrg3aL~xB~8g zzrreG+?K2!)}GpTqpFRymYT4R!}{p$$63D-a5;<=S$lIh6PCbNVbdET(f`hY|Ap2X z{CgYi-33eFF1QEog(=jb`czMiBAfFlSQlDr@bC51F%Hgf7{ghqq!gb5$O8sj|Ay)8#(FL<2>m4|Cwej$@*6&&v7stHVw&N{crjg;Xf5FgwI2_ ze*KbJ{Gg2W&|eVUkKUlHwVwb_f^I%NRzVN-*WZnpR?hXbdTx2k-cWy^;VyJH>NV_N z!@aQHA+9I+vFoFlJoF-X8=MShz~`ZxwIcU#bql&Jx^6{xK_3X+__};AsRJy4dUCq! zucxpd%QqAo!_#3a*bTbzCD=v%7GMqbjc_yk3YO*LeK+528191)!-cLRdVkKd8{iiB zRmk}__;30v?*!r|!5Ja>CuZ2f9)xS4{+_Yhjmdx0e>VQl!{zWz=;ojIH~njIKI(xH zdFYowH@}|3Aojs;Je&jgUP#pzDthEkSqV^#@$UAMnfK{5}Dm1e?N(pqsBI=k?KW5quYJgS(*{--h%3BDjU~ zZ8voNd*kP_FZR;><#%O>e;wLw3Tsrg8Bc<4{!8!^`=IxOuKz&n*Fyd6tQqLqmllP@ zyMC%mblX!N@yROILrm8H8RA@j%~Lt{$7V1mWWSt)eHYB;%X2+oANXH*JLCQ&Jhqyx z;8NJ6y471lx4tE`Bff#IA1k>2GiXPA5Pddu{r@0e-AsGrA?jXvgw@wVjrS6#A2aF4 zu}(j_h4e@5G^0JmX&l`8HsZI#p?)MYjCwTA$;OwVpQXjOA%B6|p}*?4+g?shYq|DF z%M!Q;HmPOp9pEzfA^a5n3d_{C{(ayS_!xW&E{E1T_*d;Oru|mrRr`Ubm6ZQs@+~eU z|4~QTxO(s&@-K#Neto{$5&uE>O@Zpi`yu@qOx#GQe)J>W9VfT_3R%|D5Ej+5x;_WB zTJUdU{5nJ5uYTYYD_w-&Xc)ooM3{A~^=<}ZW25rl^uL>SR>2bDm%)~_b9qR6I^K!n z-AnO5p^mM%32X}g1Isa*W2A^^$D7 z`}mJ{|7E^giN77{eWW{Hs=EU3w=!WJ*Z?+$Vex;_PC9hcY>zz#eU2sN7zOa5>&V7k1p?=dR>cO*aePQ_u zoqR*kla1HoX7!g;TZhCaTlZe#e}fG|?w=%^?|bs3kVk)y_i*$o|1$quW*Jn zzg`JxKg?hEpG$~)1nO@EKaIW^z66u4=NkNnz~LeBs{1F7{|+-lUN7ap%keKC;vbeb z+1GKmzhU`Kr~TGY`E_4D?0%cBL)_~g{Rm(r_u2HvU&W~*_usEJO0V$|C9QZzw*D#x1M|(;ii!OC)=+X)N>!ypUrjqn`}P) z^6nw>&4EwCXW>81e+BVZ!2u!p!ur*c`?EPP-=XdoyY+?TYv$zB=S|7RA4Ys-SQWbQ z$=3ZY@oV5#hui;U{S&>*SyKFY{eMd}mk?k}uhQRp5SnCamx9ICQuF$>uNPZ?gICcJeRym-((CehAb<&fNNv?bm61esT`Xga0(& z(Ztt-`dsb*R{lTfw;p*V0D7VRDb8^S@{?{?fHBRGCDycISM@z-BSx}W2dxPLkY&V=(r z?#JnV>Q4N2!K*_2*U-+V@H2Qaac+N(A3h#DgL)`d?}1DpFW)i^cRUfXFeKoo!%nkdi@3Lt@%83%kehh+7n28 zqUG{NmV=t2pJ|zSmgQ7f)W+)PoNYM+8`TyzoWY@6cG#X~HZjObG zpvEi0`pJY!~Ia_Pb1DBH@?zg)=~x5gcrjc;`)WeUxDA%a4>uh zDo*FG+y3YH?RQv}>%}bC9`=AY!8_oy@OAhN+zWMmto=irz93g1c`jB(7i*)7C!veY&_%5? zz5Z#P>Ge+Irq?@-o4d|5j#_6LM|Zrs^8K_Pun!yxuZLsd9QYV~8omKn!S`VWzBedl zqSuFw;K{HX><#}5^}PQv=tb~lhp(cqgPY(MSf1~pRf76{X9IM7kMb1swWr$=+W^0Y zyWoEK7ff$%{maAZ@F>_6HitRz95@tS3rE2*a1xvXr@>ipyTcTIhg}{X1}ni@unx?I zP2gyF1DpVFhxfqy;KT57_>03zE$sNzgh#_Vun{~3=D@SzBzPyB3GavV;G^&v_%d|Y z|48P!D1;NRPltEInXm-ThhIAU7X26aEBqa%@qNe&@LY!%pm&EoU?IE$UIXuj`hMl3 z=+DB%a0y%vSHQIDc7((V=+$9OcoeJ$PlR1y0sJo<42Qzua10y|tGBf6A05KuupbXE zgq`8VuqW&d`@w;5C@g|E!#m)ea5{VxzUc5>^wsb)_yznLeg}8Meef@s*2?xf6IOw> zVI5c>wt(k5yac@`90-TNk#Gzwf)n5rI1QG-N8m#E6kG~lg)8Cva0A>7x5Mw?Pw-b5 zX>G?L9hQZM!)owIcpN+to(7x4mM{UwbK#@#dH5211FnGY z!uR1v@JqN8?t!ViZ%&7Y!oy(=cqFU^>%s=`c$f`Og*mV-{13bgPUiY#Hav&xFI~sl z*$V!3_et%GPqW`W3m3y>@Ga=>liC-nvOiUaHDMiiJaqR-?TaHgJ_?S8H^WKL-6yp# zuI2cLa6Q}%w?TKG)V|o1{q1yk25bX6KzE^J<}b)|LWz7Ai+dg%rA zx*WEyw7wq3e=*cLyNLCobu|WEucNo3hpjWMH?6CRtOvdBRYwn7XIgJsR}bK?*Qt5v zT4#TvYhBf6edu-LB=oR#ruC+E^(_9{=a->tomF8yXSuU}x}!|t~}Uc(-L6Rw2Y;V!rrmZP59)NFu!+M<(fh-}4(~+Q{rmA9Z9d(bhO~pnKi^EcvxBhFy1SpVW1>_Q|m8Z0(a_*Uj2Db)BqzGweE9`)IP)x!Pyl z>soi;)pc&LGOV

    )fn!tX|}BJo+5CA0Ewp&)(d(ba@5#5pXP=0`Gz)a1LAoUxe?# z_hA0{woY*<`t`5~-UKJZY49F+FMJ3-0^9$`=Dz^;f_>otI0z1hqu>O18@vn7fHr&Z zZwFrQir_@3=hX(DR?_i1@p}X=fUf_y*t3qZM~;VMpzE*WO*!5UUIZ_Jy`dX_C-xP! z?2#{F)jC$MagyZ-sLxgUa-aD#=W|at|4i~Phu@O_$78JL=~M$}%KFQ_S2((wWKjfUgl1UR^^jT#Qu!gcUVxE+2EW83oNlc+<# zd!2~BDWpCfpU&||;EN&t%A?QKb=|O_v8`k|bmuMXb9SvGeLj}#=j>W{`kX29|>rU?o@;R))(x*{Mg~==)c4A4Q+d3CG;k+-zoO^{SIG1Uj|pf^|0Ql zHttl|-{Jbx?D20MeurL-_gS^!sjwZ?{`^;4o2Pa=%hMcQgDy@-7w4dhucC|kUP+^K zZT@EPEZ7$2!^`0qhj*dRbNB@MQirS1*FwF1oXCBHR#2}WfAD_plTNly_w{4^1=c=Q*rjLqhsj zOo!X0TA?2ddw%9i_%DMsQmk+Xyc^~?`DUUM=3^7m6~ui4H$&eM;Y+w1s{I}z{;Tm@ z2S0+%@xK!4`I)=Zt;4`FmfyoNWvxDg?@c`bN#~;qezjnII3NB1#~)@xmc!Og-gzPU zbF107i(zl5=Vl#W-5%HHaOa}m2n)Fn`~vg~M@TkLCh=9^8BX3h-2Zj+55gdhLVp@| zVLrx(%;#J9t%R#!n-G5;-+*5PzeAv&D|hqws4_#*lqsNaRmPE*8z{1d+vj+cXl zA^wZ7i!Y+RGVJByp|B{#U&m{3JO^GI;;-lYi26NBjSO4KoA4Lt z*4G&ODeyG7FvMTS^}M8h_zi%A;GB^72>X>-8NDk!n*HZe=+>*}leFfz80LQ!c?ZBj za6feO>v$2zOW-4LF5Cm-;;Cy8yb-QA*c; z3&+Ks=vfu4r=HjFGP)bz2>Z#fIn;9+T>s@97gwR{?+5F5`LhmnBdvZY_QPQfcyWk- z33gG>5!i`+eMOtM9IxYUt0^4MkRN;sy8fBu5syaK@4wp}ZX>RPZv0jF4}gQ_ zy|OqNzqjDxOxuE;D#p51_8cK10{*?sdGrjf9V~A7tvhVx9fd z{6n1lx1!$$XTmLTiqrlXoLBnO!b{O#g+Ic7T3Ofp{1CJ#Yck^~4|O8N9w94l6@F z$MHz?KJW^t=Q55*p9t@Ox-MCXz8Y?T+u=9xJYKgu!b@RacqP>9{R`;J;A?O-TnpDh z{hqZ6>-B0l3cB+(iSeEaOW-{CBzy+ydQj^@*M;KyjQ59d1Jv(vx1w){-@xyouJ`U{ zydHqF;avDAd>Xz0HO~5-a3jVg8xDrU;b=G>>iO|^pwEE!LtS?*K>r%ipT zjHCWeg~s_&?9VyltaUDKAn)fP`IX0=H|5nliSE2;9(3M>jdR$#cgIcRw2*qAhGFYk z*U@_3VR_cAu4DDQ!=pmhv-%}!9|&8Q`nw!0SUr~^O#<*(S-Syjy^He+&{T$c$c#9johaUB~MBTi5rKxXu^<>Gihqi7%4( z6}S`XzU*G~UttRG)62p`;ohHd|>red@ z-Fecy)S!-9Fblf#pmG0&<7(F(clZ6>o7CynHg)~m+?nC%qoAH+tNTfZQm>u^dm?%^)VkCA*|V{q3p>EhP=B|_?Z5gb{?mRgq`%KV ztz(_HuVe2(e{~*eT=ZPquyMJ8xLcvS&h_`q^nBZ@^gC=^E^x+0_vwj|G}Mb<4WsyC=Z0ngjL}2@D$h#wt%^? z8yo-!!|UKUI33P}55l?dCHM+_6Rw6|z-@3R{0WwS*Y>9(JOUmCv*Bs51w0#G1TTSo z;FWMJyb(@-Q{f!A06qzyhpXTkxE^kVyWo%TSNI34yvp{k8mtAg;2F?e56%B)<2u4z z*aZ%Rt=3t;q44DOR__3N!~SqQyc0eO7sL1AC-5g2`N-z23TwjJumL;^y8VfKVdK+a zSy%)1hVOi7{TgqzTnaye-@u3W#?bB0AnYSx5xfm9 zftP)6^Nxr2!bjkX@J;v$+y?iveF|I(SHPcP zN(~!#GHe0+!J+UW_&9tPJ`Xp+uiz0iZC@AO+22xvHuqigj3;CxRV=*8K>JkO<@ik0>{87;fru5`~@E0+~zqAUI7Qghv5@& z3;Y(=KEuX0gxz6Zcn_QnKZKvbN-b=BEqDRE7+wnd!pZP%xE#9cGt$!LEej8a*{~;^ z)XMtJf$QKFSh=-5UK?HryTeKF9=H;I2+MGzw-P)DUI2^W?Qkhv0e^!TXW2SVhiAiK za2$LJz6`&IzrxfUnhe2++ZFIr@`;wQ8(GVH^IB%9JmO+3Rl5Ra4Xyk z_rr=e+q_j^ZI}fc!bY$q%z@`Yw?8G==fSsO7B|o@fKR|z;oER6+z7vd-@$z_a*M6M z0z3j94eP>V;qmYkcm{OqAB}xB`~sfEjn`}8o44EcKZk$7a+9pR0Xzj>2)n}(@Fw^W zd>p%h zOW{yB7TyVG!6)HjxDu{`U&3$TkML(0DYosU!>TX~9tYk26k)#;J_+lW*nFMgGWY@f z6n+M`!kus*{2it|Wb>7WRbdTyG;9Eyz^1SzJO^F~JHu|UH|z(mhQr|)I0d@n@gDZy zV5`}-?oE$aR+(e@;5^G0;U>5PR-A8-*MO~IdpH0NgZIJ`_!@i@u7IoHcQC>SAIHJw zun@ZaE5SY=u7DrHJ#ZiV3#LD6`%@Mk0uO`Lpxa(#k&UYkkAihzZ+Od7)^9F+6|RC` z!=GTKr>%c2cm`|>`@sHiBAgDNf-l35;Z~UPjLm;2JRY6~^I#7+65b3Sf{(*D;R?74 zeh7C$cl@%RwRM~hTf#Q52+n)AiI0wE3KY)ASAMohs zZT{oo`LF<93vYn4;X?Qx{22ZQGnUxAN5eYscz6oz1l{o~!hS291K)C(^@44u6+8!C z0K34husggIUJc#$7hzupH^CY&+V;eo(M#YH@CCRGz6w{t58+nmwx9iyZKnt6*{hqYjR*cfKR7VvCX0Nr{@urGn@V1=c&U9kv#7JL#u4WEavz!mUa_$k~9 z|AcNmzr1SOt@@f}O?W)ahRtCs*cQ6^mcME9ybj-nRo}99*MG?hYkvj44!?)4f4`O1 ze;^zRi=pek2>TNFHhc$efQ{d=c_)5gIT^b7#w~1oxHb%+o&(9?acp{Yu~>xEi|cb@oyP7~uLqae9;+{gKftO#T6+_iv)AgEL${tkoqD#=-XPkU|AUQR0!z!+d7Jg`3j0Cz zSNU^F$=@ra-Yw*-u-&$EI6MMYhj+qJ;6*e`gs zhkc=&uLS$GDb{}!91kbMtW+rV?78^7jF`#Do*eqdSJ>+gvqxB}{Tz9Zel=o8@^@GZC+{ts@3UqO9eu!P^a zoKlGc4wP5?yZINDlK&>!y&c{O?}hin<p4SDrj*TAdWB<{}*4Xk|&eDFA{mmF`o;{?lG@>~ILhPT4|;BL61m5p=%b=!M^_A1a` z4H(w`-_5V*xJ1bNcjMn{NDuyD{Naskyq*K|6?)kCe9JuSf|-oZh>&?%!+8G>egr>r z=HZf%`9F^N&4#U^=KT-mF^A_PpACD%0dN!i24?WQtlF?I90EUqdtrpXXH^k)gWX|o zH~=n(t6|j~JI;0CAUFh0hx6e&_yr6bA3c{>YZr+eg=7!zW{v@90Swoeer-^_PdC!1T;b1ZMUz}jcRwigFA#7g%OujiT1 zM;9MQ??j#f1vdJ2_(nIYuZ6L>J$WB-f56lWtw#~;*V*c?cd>jMu7TP4)?Qk>r-k%y z7y0+W4Dv3A?Z`hB-US!IrLZmi&4a3E4*Jh9t*fo~c6bMz3Fp9H;qS2AMK-P~91O?8 z_3%sBobhe}3t@j)0vAGep2EiKd}n;}s89XLWSqm|i*s#1Ho!G`R@XdlA^&&K9u59| z^k2r$q`oEa4Vc;8wowBf3xk%ev>yN6aIX{Z`nM)eTZg&m-Cz-X46cEt<-5X(f1#B4 z$R##oCAb0ZgGcqS$J;=+{m&i$#-;f8#(w}@0@dzi#7_)qZ>i%yycGY<9N!K9gpGRI zo-~20pxeL7*pv0&fqzz^&D0Pshd)d2<+fyXH@=ztVLEZkL*ldg*gTD4Z+PgX*4`BU z1>Gw8I{xRC;@|%=n_&@r9)19G`r6~U&~0x9ezV}ia2{L;!}7cNe#XDt<@QJwH~~(* z!rEs+H~u{QE`Z%(A-o(apBul3RAJYEW*gL@Pun_iz%ICIUj&ZIAr$W`C zcAq7W8@~+yH{p7?5q<@g&yBzCDr;GOwdHR3?!S+cuM&AG zktYXkaq_wGitFaob9#U4xeqGumQw0bo+rqsJafpS{;4jv9>r;V6sJ1Wubb)L3^)ru z1Q$S!pXzqo8#vrrhQf~5((mgmYmBg*3txtjk=8yHMn+k^E<71pYw+(>@;?C&r=8w# z44evIhWlWU$x4bF=)^sNzT2sH1@*2`-A=;u@b3gW!`tCTxCwp%)sDs^uAPwa$iChd zkPAD*uCO;;1D$dsdnQ_o_!Ig*n0cE${sLSD%iV76gC<*UfmRFt?S%h*ur&XN@pIeT zhCRq^CDr*G^}2DtQ&+_)Zlu-2`k^>Csw4f*Q~%*!Say<)$b>m?5F8HQgd23+8ON~p zbMCVF=S;U;0(Z@@`cH7z-Bx%1ef}P6DLd2hG}sb``7a|*Og6s#ESs@AybKP4ZhQN% zXFq6<%!f}y*S`q+4EO+4oa=vnv9*X7puYuYme}KKpw)tZx8hfuUAdqArN|1QGsGx!DE4u66*{$c!#*|x2)_$SHxG<*rZ0zZOd97QwsW z<8Tpt1FnKcl(BjAyrX95ZhOrzJPTLAOyJzi@KM}hAO|j=VdDV{VFS~dFaTkZ=zYO~|aHvB!zk6Kz z=#cz6F5ZFP%n<*soELN80=N)<0C!Zkm1T2Y=sb#WUQ~u|{mNfNo^m|TvlVO$&x3`q zq_UgI>TbUF_;rF8Lw(-uW>Ncx(#|0KZ-K6VU;M-?(FZ_1r}T65uz1Bif}i*S`nr(# zQP{`AzhGLXZRuEtZu|G*{~%n5|I_eghi?25;>11Zzd_f(3i)cm(&}@MHzuwrbn~~x z-U)Vf==!_IyW@WuEY1H~{Kkd&&&2)^ENwj9xWIgM+SP8$HA^r`pp8!vC z*b@CL=+@`@OK+B>e;$4phxp50$Z$b*?}eq+?;d}QxMxE0 zzlQx?xXz*5U-$S%{I|l={P*FPQq}dedM5TN@Hp5AHg)J`(f4TUIDU$A{bd(B5Z4*H z{(Z3bg;zQpfj$Ph@vgu0AxZkr!*5ZD|C`uX!qpBxN8bkB`dokM>yz~V3%_#J+{{+5 zh5cCA)S(;Y9+!SrNPZm`uf%U?i2sGy_4mdeKo{M5WOq3?B){vo9KUx${6ECL8SZfC z*5e+RzB?qpj*EZcS3czR;0WxsVI7BVJ??SoCxqnJaq$fN&I$3)!!8!0_e;`WaTh1) zKLkI$?z;UQ&i$ub;BC;o57nOgQN7`Z@H?pcy4AQZTPNiH>_g-~q^7MT8?HOb>L0^R zQ0+ZTJM-Y1|FZoh)S>p99BJD>4?gI$KZ5q$@l$`4?{MNP!J04|y78ye|CX?g!%paV z(2aNfrMJWX64)!r_-pXHHpE|fJ8*mgoCIHT=+^rH$LBbHigW#C7hfUnZRq;1#l9YH zboc}MUg*ZV{?fll(m%pHmkXKii?Gj1a($hNUk*GM_JnTz1F;W=W1!k|{U75zeG)E) zFTmBUZNvv~Bish3x3$M-!UgbY_&ofK@3HTIKfr1oZ2Sq(tuHL!2J&9g&PH4b2f_v9 z|GW7{5_dhk70wIE*Y8~0g3JEcuY>w~*KR#waf67P1gAkaUVdulUi^w-MZWJYy7A-j z6W>Aq5W4>Ju#20}w}<#YgI(N>{#%HD8ugZS>Q?9|-MzvGhh&&IDslKyAo z*D=IDAA2F}=g_U+JuZE4NPZm`N8)#5lKzwMn~|iyeit)8#Q$mROX1rN-Tu1ArGF5T zU&qBy@cSxB|6Ta~nxuak=Y7SH^S?UwI#7RqUUd5_yUS)F`CY#p{LW9(KOeusB>ns0 zHzdS=9j^2_rQ{f6YlzsbVsC~a>$o?PJ-fr3*bewJX5jYP%3SWgI zvaO%{Z)y2!6IU0W1kVo1r+S9bZae%g3Gr8bEAd|qKY)1+ZN&x9t>2A{$Pb-EVBZZ(tKU7Idc3Xp z5a`zL`d7#Am?Zt1;MXF=|03+YU_Xa$J?`-V_+JN0^S=eZsY&`jh~L~K{nz8SImG{4 z>_5UIPp}n>Zv7b?uju%N`O7ZWBkn}#=9izS-xs$_(*Gj-dWHD+$36%Sb6A9aGj!{7 z{iTmi(*GX(ij(wTh~INb`oE3e`yu|HV&4jPI&}N%9+&=8NPZm`E1zgH9tlg!-x$B9 zN&0ufuOP&~KlVXzn8Wet6QNt5>o0wDlKv(5%}>(*Mf_e%(*HyJJ`M5z8vA$f2Zw*4 zr!;bVZgtmR`me;fQ93SGA#bfD^PhlUlO+Ay;@2_6|6=TY;FS*D`rYHw2Z!X>ad9$! zcPHt;0Kcb_^k0eJ2O<8Wu#ba3I?QNndwd9V`|tWo|2?EV9T)47w{epB+u-+~B>j8g zcV&qG2<&6v4Gt%xPlIm%U4Q8llk}g5-&0BYFURklB>gwzw<-IGFU9{9{8}dIpNn7jB>jitcYTPz#>M5_B>mUmw=qfoUHJW) zr2kN_>D=@|1SJyh4?SRF20Vw zI!S-UElJXU6Moy1^#29Fl#utIYG161pWgSn^R*+(T7HLr!PGj|UK8$aVD-azUs)Mi zYw)k~?aZ>aw~5;X15Ya{e;wL679J00z%6T129VQ=Kr9ag{WVq4-mh2)o?*c-nqlk^{r z-}n&!yRhF6mpgR(`vk|Icl;FR`pYh^ByKG%&3_AiUnlARGk$-C_#ax&wpbM&?a-~q zJudw?;!5*B7rzUW^uG+h{z>|e!*4=}e=+v?aIr(Te)qWaS3>gZxVRR-Pm=Wi8oxbB z`u~Mrx%zJ9Ro5Ig|f@0%q3|HQBCv2G<+SNmcW{A!2zpMd>T*vg^XihEpoyO8`kE?$OT z|0Mm3@SB*V|7`po3-P}Ydp=z4@N@KS(CxqLFMWNI{(JHJD@p(IT!$PHay_E<#d`QP z4)Je;UCc)>OwwO*9g_6F2EP$W`rnG*lqCJ{!LK;PU-m~hz6ib%;{PJopUdETu=6Q) zB^1DJa3Iv@P40RL%NHSTNh=$%6ut{TgKj>>r4#=Je)~fFRp0gar!=t{GoYJae&g^T zgWnBsu0uEeX5uEo=NxWF-wECL$=K(?(@wP>&EZ83-FUaX6R5Wdbp2nU9kD%rxgq{< z;xG2aZ$OCubnLTWY2)V}f0DT8L-M=+Z{oK)N&k)beG%fH#dz0u#@(HVOE~V1uj@A) zzcESrPsML$lKzk3_e_ZY8tfb3=MLTa-Q(Nv-wjLi&p6F`91ctKuaDnJN&26M--RLm zJ+SwNBSSbQB>r;j{X^p1{bwcgJ1`FLO8yeFSvtbN!`XouvO1{O(E8e*u0^ zCF%b_XQ1qaJfQV60QADGH1yo`I3ySeUsg?+$s3^yRQY-;1h^XJ5S@$BzHgl2Z{eR!} z{^z=qd)9B(UVH65d*;lUnKM&D|5xzKEusG|{66#X{~rAa{Mq6uEqAHiarq1gVfc;l@lQve2Cuic5c^JOx8L?x`{ok*ug34$68h)jx2=T!pX2w9kN;8h zKVX?I(n6)(Ue#?@q1>7LFT$^53H=A)cTEZX)A5_-<6j%S0eslv^Vl1p-5%Rt?I%j; zpNHRPCG`IpzduUoU$v`bTnF0uH%D&`+gj|6-5=WJZGW{pm(c$@{E|!PKNG)OO6Y$- zevkV2KaaivzGm?~>|M}qzwNK~e@f{81Af1i(7zJrrE2<|pVIo3E%9sbT%{&(T`KneYy!%xox+Ux5C_pMjFT$WUUm-iAo1V{E3`!=Y*i_-hr z`}MaYi(QL&0oVjy1Utf9co5dG>R*Yi@4x8(|2UtZm5;tJW=Riem*%JW>?J?D7fRZG zt#1_Z$G~_v1KRQP$@3R@(qfJ7Qlc)j%m0PH%~JR`g)K^0z7u{ueEiFzE90=Q_3_vD z4^?CNGWY;|%A(yqZND-Z|EbXSkDxEK;%Ys%zv{|oD7W4xzWOQO#!ugybf)KjGQzHBDU&j*q z2l4CYf1uf*Vd@I}mzkrszQ@OM#bznW% zsf_3&%L(=Qz52Y~D0)nJS>6bCfMK`*X2Y2k#D6}#7d{0?(XJbO+NaMuj*#CXm|eDH zdD?lMI7`a?37eBgTR0N><^3wlH$#b5@IQyVUV+nsu6@Cb{-?iT~PwgkW-YwLB z5SFL^0&tK|f3BeaUWEGE+)Ct88#aL*U?J>vPiV_G}{V7PuWYuVj0Q-5$Lg48jL|{8it>a^#(=M-S7}>86$Dpz)N5!coiH1C&PZVrCbQ= zb7iJsXT!D7Zp8z{c>=D17gw`A#n$JCUcvGK@GT#I)%7`^JMsG+{s}9cTYP=#==z@B zN3qYYF8;@B3jc%^YKa{K>%;S5JJ<<+4^Kdceu{y$VRN7U3y?>1coAF%?N()@KLcNc zwQJa(VxN!R3SJDC`1q@SAIq1+cVQm<2->ywq95YmFt|ti$13n?T@emhJb|sx!Rb^_ z{CdFNP@lgu5IYGb!&EpG&W3Yf1kQs?;NP%mL#a0wz64)~_ns%q^*Qch75wj5U*`3> zEIqJS!2(a2TZjHK+z4wousy|Ay%EbB!)xHRa4fW=TtYj#!tU@XX#0QNQj~Yv2=~IQ zwzj9(kF^r&?+KsB-T>c$+u#Q<3cqMAd&@ZyeAq7$^s=i+w?md7u~$Nzlvi=f7x=Hp+fv(y-Xv9Ke&3|;~4{BpX8 z@-o~6cR<^Jem7AbhO6PT(DrvYe{mM91kZuhVQpxa-w+ff7v{mw;Fs_l=vY&1PZ2u7 zI5-lHfgxxWcb@GniasYQ7yCFolm9mScEb1Jm+%1m3EJ^)>MP3q@L{+X+Wt596Xgl` zEL;z5|5{gy(hSDJ;cy;Y0ILlU|2oi)mxbRR_zld5wtp$&oNdJ&;}gI1Ac=4mtONT% zJHG87z^@bR27^B3S6w9$pM$w@E8Gb`fV<%*(9Y-aI8k!p+i)wi{f`Y6<*XsXs<0+( z1e?Rl;TuE6e;2&-8auMsc6=>=A91vNr(xoM0Q$vqhKt{wqlDQoc8u6@@cVIMpMV?2 zi*5g}LA<)K32X~Hz)tXwYb8QW>V0yw*y~{Gbz;x3crYaTk8lBbJrCc3`=OnGxkM?y z1?E9f3;sVCFZ1VxgiT;`*cN^WHJ>&KPO;M^=pVu;)coy2{pqKLFbnGYrIp9f?ef2% z{{>5r5D#TJ?6J@;za9M(i}repu>Q0ie(S-n-~GnZQpSf}Up)0C!bv{$+wHm1XT8^B zJf8=f!dN&4+VK`quWmozv%P#eRy@CeN8m3|$F&`=ALHKM4k{Bj2G)ZSsP9R(<2j{8 zIaWrf=e6dQ6?-wvgLe5xIDgc(yetXAE1>OPkMlgr2H1^ZEY$NVag`)O2&TcAa6Y^r z+Vwq1yzXZc2OffUe7pQ=%D)W1h0Xtm@q$!vaVePz!s}TNH^2zYQk(T-=l3zo4_YjT ze+5|Cr~Ee7>&Ng5*n;)i8g_4N8z{dAk2q){`=7ilHqEY3%9{ijMs{Apv9rs!{J1W>DU?YHj9g~?}Cq7d>Z>1 zxXI!c?CtP#i{E1(hQC|<3tP`0+w043oP5T3$zpvy%>L?8_$=H855u2eK0FS8gF0^3 z`-~qQry=UkwP;_b()^Uqk*{7ic@29LJOY1)qu7p=Q?d1Wz#8lq;7N-P?J5KHJ(S9N z=nY{Ti+cS_uP5|pxiSuWC>(EbGIkog+2SJXJK=*CpTvF|=2`p%`!i^dAHV&`3HB>B z*&aK=?yx891N%YU&tx(_X2V;cj+-q$<45zkminU>zsEiV1JtX$5W5BJ#C}gX0ednG z!#OaP&spUF?4fWmTn0b3xDWeF__M`dv44jZ=?CRG*wx_q7F%Gqf|ptBh1~~^u&D2= zN<gl>Mdx zxCZ@M_#(`;_%`-dsP9eu5c_kBUt@m{>(C#{M%YcD-5<+pi?R|ntta5x+V6X7g42hN3yU^ZL@pMuZBt#Bv&0Pcl9!DH|@_z$c}f7gW#VKdkb24QbF z2qwaba5Bt*RaNej*E5ZFT*47IMnf? zT*P=-40Ze{pF_`qI-Zof(f2?dU&<5cC!vlnWh2&CW2oax*%!SZ)bXX9f}Rd_d?}Zq z-v@PkDL10O0d;&SzefKS>iAMtWIb1cI=+;#==xkW9bd{3EWZ}&_)^}49)UW(l&jI7 zgpM`oe(F>mS)lu&U=y+PU~Y4(Af}ez$^Py`Sdn;F!(^BTk3+4mj8)&d3#0;l{!G(m zVqXjg!VxeN-V7gtPeOg($_Lm#z~5nw3nhLd*bQC*LvTDyhEw4pxCGtU@@ze;`1P)*j0u5V=*^lnhszj7SlrOZR$1$BHWPokfK zI=+-m8Ar{m@ulPJD)cy?@utT?cXM3hx1YJZ&FLXpWJb%km4hS)cXR5bAhP_CoIi zb$lo%qfdc4UX)AG?}a*klpE3CfI6O(-=H6WI=+;ZSbtTZjyL5c=pCSrH{}@g>!6M| zExwyR7 z=g5sAkIvM88BC!5BzU@FX0#r=KeXOT)MK*>dTpqA^(POT1JLc~-?bo5n-`&X zgxapbw8Q2w^y{Fu+ivd<9YndJqc9F;cd|Xj{ssTPVHy0jd>;03i!Cmd^2#f*uYzM> zBD9~A;+K!s-ArYsc;6=`wHzW&y?R=|WQZU0Bn_f?Z6<<1o*Lfd~B=ON9WBSdMa4U{lx}#=`cnI~)qNzWzS->3fd- z^0o7`{c;+JN2sAt`=wjJE-CgV^!H(f#-g7C#VYtej&V8>PJ;KsAmb+l3rfn|2aK~_ z@N;+v{(9fhDWCCn3jwoW4y;N2n5U7AuJFQ`v3){m^a2`Azn3*ug+l$~`FbCTHdVkTzTC!wBZQ&7k3f{(k!Y+Rq?d$;u!mJA7 z8Kqo+{mJy^qR-)Y*p4@o@?px)fqwDq@*00R-w$%2Uww~}&l}KT{XD?;*C@P=IQsh_ zeQxJfv?JZ8J$Ap0sVEu8L%shlbhhZPLj9ex6C-*o3_<;UuJ&sd{reRRvp==_=S=y` zC9nTm`TV!_=TU!O`e7*if0d7ptEG&ywNRfUVCTR74C_hP!!Fi?j=QQo?MPzpBVNZ! zVt0o7&k_44sN=wnf3k=8mGz0Q_5aBDjOF`gbIR%SKI}Mt`7R>Pa+puNjINT$VmLl1 z_Dnbz-Ub8I-wz&uhv1J;q7?iedk>&*`IZXA!xVf>RzG@ zgZlmSHtaj#%>%?QX0&kBIN>uBg_oxYAIucy!2|F(l%)m#ClSA-^%azqxko6UOn%d$ zU%qzv(#fJUhD~7zCc_J8pIyEd%kA#(A#7}{K^*ze=;8))k*4sXK82*_^W*i{bBTgLD zxOVityAl zVUWE1^3(4}kCzhvC*dnl)Pnz2m}NKb=wa-T0+%9lVJy;dBG}uCcoi5&nf+BI@)+Zj z&ph;nFbn?e5>X!uYgZOjjJ3<`FJ=E&W7rz)aP%#K|JNKisG@C z0W-I%mMBX7JZDnU7wqHK=Ij?1x%0gdZ@tr2(d8T|9(U01%rO2zI zPkyPK=Xx8?r2TWCo!@)--AX?5p}zN0^RwgF{ac0gUmI$F+x2w}h;ljX0jD+={RWF? zsy}ds`hKK6zrvGn7~@69?S&Ug{ks0OpG7VB{}z59z}+yx8uwrLjQ=2^l)bS(fH#+x znd1=oG`?bPBcBi3;eL3!T$$5Fip&J@>jkfXdfqM%ThEs(HGYv`#`qS0<@eay4u?Dz z`s8zaZI7_eL0s6&Hq#tZfKu>||;j3^XwA*jTQQI%xnaa*_Og8KXG@3D`-pP=qHYOsCRffqsD z?g#j6|Nno@zp0hKwxgu|e=hw~3;u7fkH#fzPg(NS{O$3h`+FTfPvP%3e!gP4-}tFd zUM0=%e|wzkb(Wue#`E!tGD7;DEgS&#ynF)oR~Gg88}|4rX*~U1@^s?r@00Jq-VFWX zmuLCe@J#t@JI3RGruttwL;a3b|GC&Lq2{CYD)sl-Q}CM!?e;H0zZ))tE8yes3HUV3 zfqwZn5X_J1G!6N?r2eyqRi?vFhX4)*!} zTn)WBY-4dOb^^5XSZji8&vDuScs11LeGJDw0QET)e)Z{c<@tQx zUI<&li=dq^r?d1i%T99~xP0&E{T(rkL%aM!ge-U;d;mTK^*sW;8At1MJhNO;(s=7B zumipacfoz|Td3P@1=Z%*8FM{NAIuE`t~a3$mJGgzvkgwW@Vy~gK-K7W0>&;DHFziY+U^W9&fe+~8f zt=`vk6#ZA&h3)(b*dGpq*TU=IM5x>C6|^TA>iPBgR(s!L`#Ifl%;@)XZO@tVolE`m z;Yzp~J_}!k+u%v|SK9wylb@ZB=ArA)?pM1X_58&@^yePhxfgx`zlPt!UtwwX1OMUp z^&Pk!z6ZaAI$rcSZzauN&wrdL|2pK;5VnI|U@v$z48d_$eoYwPc78vgABCr&zDJ<} z$9D_a9`t!VcVRDu_m^;cX-~Y)a0na)lVK`MhpnynUtrtq`JC-^Kl~0Jgx7H#bsM}L zPU86HUReKJiQE~cR~LH`Tn_E}HGTqdQ(-#10p1K>gPY*Ha5ww}>T^)O!48n;`EaC_ z|7vVIKYi{?C5{(s!Si4X*dBI*{b3v&4X=ZbLAyTfhe_nE{h-ek(tfbl$71}~(2nQe zn{W%<0e8VD{HB^@qR$DbYOT+{*ml0hDSrZ1Bu*80E^Gl~VOMxLoCWRpS5xm$m<-e4 zOc;R+;Q+?lRd5_U(|BA#`N!e&a1-1HcfmbSpNnJXZ*NzJ*{14HmJ_yl|lYW@w#KLA_9j<6rJ+o$ziO+2k{ zBK9PB8??)7xgjjS+lLRLYyNAnpMx*J4e%9c*Y`W)>LheH0A3H@gk@{mCB^nDA455P zFGySL4sae^0Plqlz?JYZ_!QLlgM5JVDm(Itwv$osWjCQqxu~4r&H{|~130&Wv z1@EdWkypbUXxFFln_KY*Vc!bp!#m&-csINkJ_z;sPaC*Cei&-LZOGfsryY6+*acn& zgRnR351Y~M)^MoRAGc%M_1%Sj57hf3AH-e>SHl<=%rqpZgIa=vif%^U%+kYPQE`a5^pQ0j+fydP5zJ+?+Ct%0xh@ZX(CJy^EX#4AP zk`7b<3HUd({RdF*V5rYAIx8TaF)*pI*iXR)O~hUSyPq$%{a=5Fw1fEioUVMI_TEgK zEEv~RB94I}c>4vS=fV0H+BJ*)3jW*Sd+-Lz*`@MTZzfC1!nx4)&q2?H`kbEXKKW?7 zDw9VC*c00E^XP~D@M~Dk$A1d-PKElMlNQY-ax9$NLhNkVx0PM9*dy^zfMIwo3 zskan<=Rke_itWFQdUN2mi^StyxC?f>So8>N*jDWJa7;Tpve?1a!n8KRX|NV?>{83o ze~6VON8xYK_Sd{`AkU}a259@gK%N`nFPDhN@9-~p@1>&eg~Pjuodz%HW=9q~(q1@( zawFh4sK2wHifu>9B7S~XS@H)g?^9nc?O0FVyWs(7$G?X-`n&hY<>GNCTn=~j53#IGmp2iMb&8{r4=YpDJF-`3ZT_+4NeycS*uBXBwV5`G8gk%wKs zw5H&HSH^+*Z67JiK7$3GGIuNfcf)1y0k{fIrJtw6o8VmdDts4~wEpeH{|J5u55phf zAJ8HGP-wTO4ddV$*1xvZSeOZ~hqK^~ za1XSj&Y<2=wC6e)fw#e>@Lu>3d>!hzu;V{S{HNe^@CEoX{14m#--A)uo_g%~VfyKA z_yBwku7_{Io$$ygiBxa2@Fw^;d;&fXUxIf1(}*_%&W3Z~TsR+Ueyg$f!hJ9bKOnzP z;nzO-{aeN+moDVhM*4UTA zUa&751w-&fXs?e(*NM^^o=6b;PgrrB*v%4!ZQvmISCZ)ECkW4n?V+dz|JxDoa@ZeM zBHp>MF4X$kVRwc>_}|ulJ@qYt_rUL9L8da-hkjWVFZM6ASL?O?r{bTA|8#iMe_4JB zaUO(w;aBiCcoGgLzMaoA==mY?hv%?(&A&ww{s@jt@;41NvIRNo2eDUZLt4{bQM-Tn($-@4wk9d&7sZpYg1cKK^5pA4tL zP0;pVezqtN!ED&1lIZ##lP=gLEx(^QXDY9L-{5}))}X$6@I0UTkN=nc!79>%E8$ge zBpeNIfOdOZ#E5dSMf<%2-C1sze;a)#d=LIoO+59z>!+~)fvwJ^UU&(d2xmaMzAcpB z0pEik!!O}i@G$%l+VSi-TJBq`oL_mZ_cQ#poL;xoa!R{?EvI>FIXiE^^7qkC&%zgB zT6L)@16~hj!#m(za4CEfz60%i-8(I@4p#Z zOEOcAz#a|bp`E{8kGiI|ED6E3b;NEDyThJvDtrj)bs;;x{vf+7eih(3ur_Q2n?t>h z)fu}RwBy@xHBJ+&oL_m(qdNXt?t&7Q*K*npEvN0!dX;wmhpFeHy0WAVTnnFrFTf4( zJ!r?f2mL-7BTGw! zPGzVE4l676au|hnecz$$@4uFp7msph37f#d+^1%jZ;Q|oc7>P29v1sze+&=8HMCFf zGaW}>iEt7OLw(;O#ZRL@`Re_7W3lJMMKBwlF38N(3NrHo+yJ96hJF|gQ{Xh8{;~bj z&fs5{AW6&MG4UvnpHyM1v8LtqH%?_9SLPw$Vtknt3RxSvKcb2m}$zb(In z@>y^-+yFPiVZ?7vyY&A52eF@m9nO%iU;K}#$Hw;vG1Ra3X*b1AhI8O;a1pfQ-ASHr zLA{@O2lhee_xo!te=mN@|7kpj?VvW}y8+bS8`}Bb&iK3o>U(ANK2qC%9^Yf`f%ieZ zPs;Y^9epAPxUF;8Q-^!`N~X z;RCqWVifxTwCmIN+csdmG`Fa~+w6dDmk+T12E&j=+h3ob_c(q}!5z@{&qr^@`j53} z`-fPr`^TBsk3ic$imvYsuFd!BtN8w{_eH;3SxV}C#(!Z~V0`I)i7l~vz=1Fkra>L2 zS=h_r3aIz@>3x0M(e3=}@_pw;mW2A#yd5MBX?zzjGCu7pp)ZE!a{4*!PbJ4^hE zurX`_`$6$4`2P@kF8m74}6?CpFXhY$-Vd!C)1-~00UUdfw?;a$47`_PgJ`25{<7@OkU^%Y;H-ODycQ^o! zgK2OEoDCPkd*IWsa9iB@z32zwAvpbN@th5p!ECq&z5+jlcKj3Q6*w@h2$#VJ;EOO9 z?tpvYQE11nGgy@7umyYxz6y84DAfB6PGDEl17@p&R_Og;f2j981Qfl!oQu*{}|53$1jV0qDsv1^xi@;VRN`V+;!8SD>- z!Rz5Ia5c<)jy!&0s$`49Xwy+zFhm&9ioDQ?#a<~yn)I$GnmH8Gh2xra{{Ylt$f!KZFM3@2Zh1qa3 zd>OtrSIoxtqV?PUXppCB(4#Gq5cX$GpFC{Z|;AW`j9S&mSei~mfSJL=xiPHgI4)r;J zgRx(Nd!S$a+8=S`k&1r?oB?l#rxR!9Kj_*{ec#6yKK^w}OTk9)eAph^@dpuS2-N2g z#AD}{krMSef1=Ns(DPQ=6=b=d$FSo+P?qKJ1^6o54Bv-&aIeMBuq#lX)^FE$+gYOQ zh5O()(Do0M7i9(1=dZ2Cw*7PHkGJ64a0_fsKedMTbMi)@rxJe?{D}O1ht+9kEm#jW zf!$zt*bC}&){?N3VJggo`n=$~vGqB>E3sdOufa`l3)JTWe1-iz{25lPX!o4h-_uX| z@OStJEW>(k3Y)`LunlYn?OOh^;(UPL*YI!HnDt1z= zRvA`>wO}7;mmh`x7u#@E~b9XSsn{J z`S|O8{1%pHL4E&}9bd2eRQd_z8Gl#Q`3_4)j{9{qjzJ*>)pyAEs(?fSI*Qp!CDpYVwnC}F%it@3A4t|@GB zhJ5Vu`rMl{l^;voO>ickGsmIb{w(w-;SXo<*SNXF&xaw(jfW{P9cmtS{d#|BC;XKE z(|931|CYeL=SYoFXxINDes%aaD zto$d@4mde`-4*RSOlQGN-00c!c>#Iege)HfU^!fd#W z^}H8WAWjh4<5I_gj>{_a+m$~3r}bB%zS(dIwDS$3Yrb}Vw*TpNP%e&kWWkltj$^k| z`_YcC@j}FT46cK={{!^HjaS^)1!wRp(zrFf@B92q3w+ni7ujnl}HVC4}@NoTPW4lvd^XKLnL2v7+jxzu~ z7rh$w4n~h2kocca?{M|!A%Qn@>^l}cctrdg@?CN~dMID?U&u36^*=;k!e@O3dVXmM zd?EX$S?GZn(e>GlH>1ba65mLmE|I ziyr2tv`dWbPV3E|+s`@Z?{F->2|aR!)O#)4@)q>yaM6FGy?LsS7hS*8eTJT$B>MBl zcBgO6pEnLCh#u>yj&lS(%hHdd=c3PHy_`aiy+z`*lhxxr^VE$WzD;x;5AJtKSC5-7 z`Ucv2HhRpRqVFT0s_6OX`pnuI=%JBs$$nJy z_c^9_zq@+*KP~!`pZZM|gNz$|mhR@|#);W1 z{_cLno!q>np!ZFzmc*FU&T{DF9^5bf)dWsW)j3(t?!;+=9{O4w zrx@Fv{$uj>;(sf;{wA!ISzgKDVYZ=|mCx%`6q5WGp?5^jxAZ>fkp%JAcT8PvbhqB%>qYAg;U70%{O>n; zyHke7pD6l&M0RdP&rKHnJ%Mu#0D8$_>2{5|L~H;RxzJAAbQ{?5n7{9)Ny{Z z2zu`NIR0UD{XSCKjX{rFB!Z4}_nlU5{@Lgw#od{P?%W~%ozZVa52AT4r+h%kK0Ky0cvL{Q~D~^Lgd=XY>IP-2J0FHA2r?DS8i)9rvB8 zo}H?dUO&Nj_7^e=mB((%omvyY=RyYrQ|C2OlrmuD{WOb6oEs;{(tkkDN7v*3 zljw2JN}R`uU&ZXQ-8jy3qW_HUzC+H{^U?dEpEMUYT|MZ2@iCL??)eN?&q99*{|nIL za>QScAKZ7+x&C?RL-4;0J^Z}*cM~|h(PLi};Sv0YY8><^{-e=z){78EPeBj7EW#Y( z%tFsb?}PuH==raRu$pszJh{39QTKA1S}vj<%NXr2hU_y^1Z zfEQ=C=(W)wB2F$hHH}Aq9zDEQ{LeC<$L{o|*2@=>J4ANecSyMLW4;vszXi_cMt6^w z0?*3vQZoJr(Ian)uJ;%nL(jrrkDt#r2efXST=Y2NG(ZnLCvoaf?>zH4=pCo66Fq9i zr8`}y{x6Fj!M_7~HZT1OdESoG%jm^@FBoWax4ofnC4hd84@J*Kf0j7O8h@+Qn@znp z;2%C9LS_6HqDRoT;_qIAbnA`#UW69-Kd%1h?)f`+(&MYxgW|8-#aiR<_D}W}$w&KB z`_0ijC5*G)_!rj?Z~Exl$S41V)T{mQ1@%UD6zvE1{G~TO{}6xe2kqw^bnR#DpO};4 z&*tI$L!9WJqPHObb4+#K_&gw=UGsOJ8RW*vMsG;`AJKEs zwcbC`qv#jmU$K(JiD_IkfA^j&H-0SodHB2U@^ke#OYevtM%O(18QncE;p{aDn5iGf zpVt_@xb^G4+pjo1%}1YYbT6OFB>#y5=MMDT?jo!v|K;f6py(lU-0V)zq387xozr>F zPV{W|#F3e1_VnOw=;f^J5VH=SiR za5uh#J`UY|7ok`02#H^hKuyp?P=lVKJ}`9PxNd{ztZT% zt*_xe`gJ~fvXB0I7g@hKYoz}Z$v^Dle}j*{$mnjrMP^7pm_g%B?mZ5ko>5d^s(QGn z?%q@A`RhXwh_h1lNk#o1Q(b>_jQYG$| zKXBcNd^Q`sxb>*V)uHM#(6&k`XNQmfhd%lzKKjSzRGPc}25U-u-JiSnV7ht;{aWgE z-|gh;x#-WcfgMASxF@pAG!Oqj&|@wXeIvS4MdIY4--liqJwo-F$C! zr<3TxnWDdh{|Mqo+!JDEdYJ8c9C~1-==;#;qC1a>K8XF{!{~9VMDL9MtLWM8i8V9n z`LXxVBhQMy0e|{tJ9MAv&>e@2fS7F~a9@|XJmEP8WE-#N?dU)_F-pzHOQ z81!897Wmgi&qsfXd^#H4y{_l*kd_eRs<+XLTkk`O6Zl>7VRzz;L61e}YnwAs{r?dE zTnc2OM^B3W9_u}Vp7XcpU(%mpL)Ca=vVmY zLwxknKKfD43+1+!cIk1*ALs%1gt?hicb^gItw&3*gdVl@ai(6^KX|dkS;~t1kNU@o zegPf#Dtb(N(Fy0QKo52iozt4mYV`cBqCY|W8R*%UiN1&J@n-Z$Q1rHpll|x+b}&8B zQ^-FDJpp~0*`K-X3M5FJ!RVFHBj^`XZ+-L}_X2^L8j$CD^t|z+|4E!_)EhHF^a=RS zMvqJs{RnylJ)9!?kLdH!Lz9c@i_znz6xHuR4{{*JVV&dNo9ebV4xQb+^RULZ{8yoe z(e-=ZsAjUC3}i}#Y${k|{EOQUyzHaD<)d%+(f9c1?z3%+tJi(DY;pRpMtA$csU#ox zdS6Xxj`Kt4(^!wy(WB_Mqc=ql^COuD&^w^VRFU|4e^D>>N1uuR8`X=?b1?on)g_MU zc5j-19z{1_KfP%-dVnA6@NwZRMvq08XpZB)gVWotE&ny>ap<2i4mWC?S`tCyxbN!p z;-EJrpMB_IbUj{m?*(`Lqv*5nAB`TWEs@)!|Ad~6z6$+M^f+Ed{2Tf?ra#^Iar{^* zpZqUC57w9XPt$<*==nUvaU1)wo<8fveb=cQKi9obWu}Grhm7tW2S(&LFz78c=Wl)D zO!Lv_5kM8#1H_-(UY+$m@!#>$clqdF`sjy!^y5DI-$r-y z%z01p)Z?*=d`?BtJJT-rS;($`fEy$iqBlp+`b6T~iGHd2^CRLN=zWduo+r<9PgI)8 z95#5GA0KmY#^7Yw44XUflj?wvT?B(cSh&f0uTd-IO;iM-TiXdIr#||3KKjo__tpzHChsGk-_f0bd{P`jcl7h!(kr4z8yEGjj-JPlruBHE z0eYB+F5XN03(#ZS3y5ZV82w`O9Q4)bosI5pr@6Ptc4`c7>Vbc#nZ$V>|AFX%3q?;r zzXm-EUH9|x==qj^ipFnVG)^XZ9(qf5+;h;K*5ZFD_1=yiMAzerEcBc<;;)|<51>cU z^?b|Y=#g0QUqL@ShaTWZfnQPY%jhweh`(MB%|*{b?}7hz^eB2F`fl{N_7Z0q`WNco zLG(fB2hn3YiXMl496f)C==0f8mNPdXx#Kf3QuJBqwb7mHMA!S|TcBqr7S+3=2i*(7 zX1bsCG5|d~Mf7U)+qD`$y{JABJrFLcXK4JXMfF?ILm5T&d(b1(is~!Tvol4X%JJCK z=z)mnA+HtY{(tm19wxwHw3CaTlKNk*X!q?=kSmQJzlyUJ!KIBm&i zC3>8tKaHM+uKB-+o@?ow(DTu|6Ms8;?CVmm>U+?`=wtbQ^d)*851p8Ueh@wGEs4{H z_{Y#Ami`xd4!Rx>xX;XY$4S1W*FcZ`Pto}2p@+~fqTUwhS?E`yyU+M{<44i^qX#wq zW{I!;IY8s1YyXTu&qmjJ$D!w;M~JWA2jkwB_*3aO{XUq-!#h&Y_4{COyZEcF-v@Jc z7S+?JH}Jmb8;LU=J(?%_dh{DL|J_CPThT)w7u6SO{7*&KX9h1t&-q+*eJ1lm=s_Mv zqPqKTZMXmPqDB3mLl1o;`aJS{89o1i=vnBw=n?k@6*H;69X;kqQC+_;Xa6X={e3wH zU5*~j@de)>b1i@UzMO|H(Hv(N^+wTK^Et9#^EoD-x*u@gh2Zu>(9(ZH52NdLRI0A{ zXIpv|^gMJOw{_5+<5I8cP0?d5Jr+HLuJv|B&qCL6eg%52rFSt0-tPI;+?%B*v$+m6 z)c6;7oZQz0bdS>l^Epmq{WdYDXgz&VQQdv_x~DHLs=M!E_w)rt^@(OZdb<9wkN8PG z`AqZCZ}!pe@X_x#x?68vmgLib{lLTMVM~7oJ;%~tMUS)et>{^n{*lp(>*uJCe#A#V zYIJWuTuburNd6Vf{aVGvKiBBqcy1v6DfnN2o`c>Ay*+w9`f&7~=y5zWVm|s{^eDRe z$D;?&lX}fzhBt+c?tUM1b~6q+e!CGpxJ&e0{O>e+aqU`0{3!ADd-_WBd~`idUV|QP zB>9*Oyy-RcEc9LITh%`x{(8OjWAvQ!MZbvrzd?^SE!y6Ebms!mXXF0|dW46RcR(*^ zwo7+?<+?Z8ndv(6ITt<9T=XB&14j4m)BCt+f4c8FapT0a5dY1@?}C5!N8)dGYu&i=extejUU(}{;KPJZV~ic;`sfJX|xx=vh!^}iG#a`;?{49mw!bk^AgEl{nNcT z=QvU8_eVE+dJ`wKqG1;N%(vCT3 z4$_enc+L2qYx+61ha6BJC?gAYphvin{ww}pc)HeBz+do>@=}wZbv&3Ilp8;Cn~ZRM z)>{qqEcb^JW_pkf-~!dV%IAw7&v!x(HIqDRlII}w{1>Fc#-ub({bOavtgXIY{i{g) z&+wnG`b*+}5Bj|t$Gzd%O!~Wz)#y3HCGn5Qf4$MoN7cWkTpxWGal+&|iO-RPKK_5; zAN!0P2-&ax7x3JZIn=Osx$>wYy3J;M3?$MGMB9(_gP z94G(T=mGARrhA;FMlY^^*5aSf=f1{&6WzH{;@?fZdFU~BNuF)d4|_UBA^h#5S2H*M zx#KhMCRx9$$-fDDT#nQ`i2-y8dN$`7x=}~a(+gF|>@cGT{w+IUqZii?bA0qWed1?( zy4l~>lEjxuGn|b+{=0qRf9KkAEK@eV`Y| z?5{RSL$}H5aT0yvPxgruAx^lA><4sjnWgdhT|j$MUWFdyVUvxhcRhN9hh<%i|2Fg} z5C58gzQ^d*OwR@0l^O%+QT%hb;GpCGPxP?+!$33XadMS_^nVuDm+xo2H$uGoFK*F9dNvJugOATmMz7|ccjfwsF}-PrnepQApoME?ci`+p&sirOGqbAr zA4SjS{9&@lPU*%HC*S?SotbV!ukPs>g%FE>>@Sjd4}sI)$A7f?({GiDmFD9=+pK7J zoMdxdK-Q+?+)kXlC#9c1WPh~+Jv34};27g!txx>7eDtr0lU-B#!M)GkosJv5xb?WT zyW4O7o~ksF{2h*mV{vJ0ba#E_K#x?Fap?Z; z)Sc4Nof8r#jJ^;(x27~`wzxYhjb2>4)_D5AkFTEh@qfcdf7j^6_0N7!H`~!VNl-r@ zkE#AlX)nW?^iSFIi;olI>E=Fp_7Cy2t08)BZ|R2&^o!9Who#;+EoDIvJ?Es1G(BHB z7(HgCWH^<4#-Rte(O?(xZ$b~o$v9;7I7`qS#(!h{A4kvqM*^=v-{|QWh47`1{)3PH z5Ah>?q+KZ-=u~f7e1CTG(MNf@`92brJg=7Sb0!(RxbZUw|J=L9@i+SIP9OhA@Q-Uai{F7bv0Wsex&-Qp9_AsIZ1&DD^lXmz9;K@Bs{bwHc^3Li^uP-eU-u`A zRsXoG=Q-G1Uv#IH=+Tza&*>7*dB)Slr||!`j9y&3b`d9=6ZUx&I_%?LrkV6-&Q($& zKO=GKp+`$g{~y={HI~GM+8zjI!O8w;%r`(0opP~9iw~O=8 zbKD0Mm?@b!EsS1Ve|Gl#aVmtN#L4D_cWc_4>f^r%|F{}b?+?Vf4?VI@+I1o8$+*O#NBCUR>)^f6bJ($^ zvmVFz#E;;g-%s)^h5s@i|201P2I53cNt_Er1bg)kKVFrPeI?vx+H!N4t%f_5W^QNsn{-5~7KTMohJ}<@-r?lAsi_5>d(cS(G zvOkegXU-*{XZMozyPP;}(Q{{t9wV#4>FE>yYWxF9;%~lYdQ&`l%wZXTH5iB2qet$P zOzvkpT7Vu*mmSPkY&>^+IzbCzwb6@f?|L77hfka@Jl%Ycs3Gg633dExboYBx$ohW$ zr%#+3=6hCg`2>t!+;Z zGd{aX{+w2D8lyX1ME{)l9X%bR5Jusj{hKuOGM1$oy}0#q8~$+|=a|*%O?Ugm&%r-u ziS+*{{CA>fy(j~D4f{E?Hodn68zEpR%c z=RPm_=yOd6`NSEEf0*Nhv+18OdWh=_^=a2FK5{`c9NLROfS? z@XovFp-tj{3k&w6=W}1~bdF<>db*CX0#-8@0^IE`)JZyC&wn=c^a4MfyV&S4Y82vS z8i(_%=CH?`uJZ98>l1&DkN*-M{UM(?FL}CY7uRbVOE)?1`}lu_e}v=e5#)bNb_{8ate@<-~_~x>LH;qNl;{J2(=X6iU zsSxh=(VrtuXn}OhmyDmy=#dYlUe|V~JoMl|(Ro~^6GeCG$oLsdyM9HF-6HYzIKR{- z(m(lpKAw{BP95~%JK}!`{X(M`H{N>UAL%SR^40iHXZ*+UQmqTv&kw;rv_Sg*5P2q| z$CeUD{rtTFJ(oP?sL64b8ojuD9`*c5q7Yv4(LW-7bOPE<2q&ng&s!_{3ZU^qrahXBGN9+XQ!tZu2JSc#y@ma29)mqkD|x*l=vAG{m1CV zt*;uF7C&y=dAb?5`y`Hz|H0_lour|9J}~4H=O+AP#!H+S#{XSLFD{=I_-9p+j{gt& zKaU=IRO0lhDhvLj{+$15jQ^+Tv7A3)b9a6~kKw%TPW;a@H&nReE$(G$m!6+*;ORIO zLafn?%fCBua_*Jf{}<7-lBH)VF>c>R&tXHq9shlvj!_6Fee{N%iyv2)d%8JJ z<~-q2Vh#84Pc(XQ{ha2b-%R|_?Xn$x!*+cqdbo@tgpfJ!*l3)Y)9{s z=Psicm(Kyuzfi|8`-hKSuZxVgtOun3Z{|3m6?*7dN#q!DdZ342mpt|R>9y!NtammG zX9{|d@8jnX=LS#zcb<3QpU3y&t8sb6$NzQwqwWLS&6He83hYG>m6HCSML+-O6X$RI zW6R42)QvRY9CHBd?f=84m}DbId1BrEbN?scUq%-}3nW*q=CU zJ-txJFx%fJ&UHTeIN}F6VYZn#v(fVwN&Zi zq4=-I|9kWx&lA@DWU&S5QUE=BHJQ5e=A0lLLAO9ivhn|y; z(et+x&?99f|Kar8Y@-*K&mH&&IG^8wdb2(K-|cz>|5zTl(wzQz-^c%FqZe22-^2-U zyi4{?I@gV`;3(@6Bt+p^z_qEGaRlj`~7R0www zCp=U>8TE55+sFS6AAP%z{)N$tYwr=GyXTFA)_Lz^UL13LVm{|0*QR5|dON1+dl?vBF<<5047oCEkrPl-}SK8Bs&(6hK9qA{P#6?#xF-|w^^ z0_b@hhp65WJ$t+K!@5$EP#k(3_ZN*9*-1u^;dkg7=LYoLOi`L~Ky#1Li|e;Fol5dskKVAS^iLf3j~%7%i#)whBFy$x|5Z|XvQ!g3$~ zCw=_i_R;rvy4jypm+k1@(o)G+=-F&9bdU2ZdR|rWA4^VUdNY1LkbY=|ULQSss;sX% z0_P(2A1nfo4|ckHdZC6g8*g;&tHMiXYaH%B*+%|%pa;3$q{mSYqvsryJSP%tEqW~1 zF%P33;&?2?_g2z(UNQc~t*=eQ32=VKoR;*a_cT7=Yqab>Psgbce#JlUZ^`opUDl`g zde1SsyI;*(UDorgBE_5ly2Evc`o!t%=^C_vSK=RFJvL@hf{*`AM%T6!L@|#IGtRxU+IUC`E`;zZN}f}m7X>uDI>E@qBAZf zvt6q9KV#xJkBL)eP4;GHC5}tX@aB@I&2UoN8CNH@N4wMnCpDp6Y7e8hv+cZvMsQU( zhJh=YS+9i4RL?Tru8|`D+jbN+rESM?o-)DvKW<`1+YYDaI_g}z_THQ+?*%c{dF-`IxMW!~_H2+OTX3qRGDViDc&&%G-x{dG*&)4k;V|r~j3x(~%t|rYeqRg0P zdu3sp#Prnhj_dDrNTQ6Cq>O3Kxakwxv^C}3eln$9&=;n|+}hnbbw+yAl!$c_Gcu=T zPM7zPfbdjn3?RvPfW^8$jr=$pPn`?VM0=TIMX!zv^Xtgc2a?5mN~9N z{P?74nHkd)P3i>;$0ekVFH~|$`uHT%X&KX!;*(AL(RW= zLSkalv}y5aN!L4ZuFym5VY9+gY5cg<^u)>2;-@6c^y(2i{&Z6D38^U))25idaN;wP zrX^*@Pcv;XNsP}(xZVrfUm6|ng~aIXE<9aFqRBJSEjHbhb3=G_Qip37s$)WWT4v#} zeO+53g{NnR6U^GnOiD-%CnuO#mQq;o8iTu88*a5;ce&k87di1M)4WU^qot%x_KJ^B z$V`wpZg0^{Z=pLJ(!*vDobGFuhEtNJrKTjB{`C4JDK#}EJWZ{{X$dpTAPP?@+(v2Kgp|}& zcaV53kQuhMcH&&9QR&k&-QXlK-gK%N2}MVZit*lBIc=Hl(otY$&8BTOFGhSyX3~_R zG2Fg&#rUKN6HMFUr-d_;5=?^Q(r21+Fx`x9vsEM~WQ5HSoMzU+#DwY7rllmLvC#Bi zI6mEcuB0ZIuJCwJ8#}lF20>8pGcE{R5h5y!S0sw4fIAlvLHK^>)H(Im z`%dRR-}8L;`{R3_o;;Pe>ePO!>eM->s_U2;$url_RV#iIn#6M)Wf{_^A)b^xQ?LmH zv{#K+^W3^}wA2(erdR~|m!$weIXJz_lYxpQ!bNnSiNsV;nJf@3=Xx{*GKtZ|_CZ}7 z&v=6~N?hAHrqmBIt|Zn#ERh8<%;m~Ha#7|i?LVlC6JbvbQu!)T9u5;;k%n56$zuAY zW>6*CY3dFu?O>2wsX*LH%aehr)f5ocCE-eeMjmZ3Vg34m7iZ8~vmv1YXq0cpsVU(n z%vKk|TAX-dd%_rSJWi;!YY41f7)#;hPPi!%3AhC{CBQIYGMGlRIDV=yjG+p{P*cK< ziRzV!i--Ey-VNVtI}1eV(j z%YAHlSla1zSQe&)a@M3zWtVcka+b2J@Kf1F`6j&9Y{mAimFNZaw=ms`-2%Qg>k6mac6ZYoiov{VuO<%paov*w^Z{mHbw~0V)Bs7J)9mZH)dad9CCdB3~P5 zB^5_BB<;0l$LN2sGWbjq3B-8H*Koo_lUoc3(}hA!#HxZHHhz!SIyivr2Cy-psJxpy zs9uVcOw?>X2`RkA6Lx}Dej1DgD0mPE884KB2JG3X90nTfP#6u?mjZ5NCK#(uFqBJh zqrizUFYCf6dxv3UsOApdy9w(Z#j+s+@ONTen@^5DxvU+vuAl&#Rw87k#xWD6#k_MB zL3fHo;K9U%`x$n+j1#2o1`IHf4$!FSj-WV137uq&vvVtxZz!#yW=3}gH1%8rM)%#K@(PvkbN z54`SR+QxPhRNw%^vDIa1WhsuEaHjY9m3To_3 zIvo#dYCkBIKzmS%UtX6jvWHncf@I7_L_9Pmg|kspWHnDDg0>^m3)@|aT%RiCxhzU! zdczdO&teu(0t4p;8o#vO224~r2-b1>^(A6BD5u$xjGPx~6g9)55@P0u{s zXl=kdz$_j-gXlUw)YC@nHuzxLtm%a~TbyaeY{Z@bYKs3sL-9Wr1O9K~X!C!>2RtIrl)Ps28qBSEhH4TV1Q+B9T;P<@D15=DTOI8PQ;vQC#vq9K-_*eiU4A{C@zV_ZraDI zP&XipNrc8C5&H+ylo=svB&a4P8WvN<^j|Q6oze#}3U~q#9yH7)4CW{Ji!z2FeAuZt zlv-~m0{nLHhnT6R)Im8#3Ke*%6NY5QX)n_x<^dOg#iWpeq9n|&@YSRX_&Oz|ClBijI zpgN9sNKre=y#s%{CJtE>OS6WyI~gRCYYnnVJ%~&8Cd0-doFdNKw8Dh6;S_Qrh!|^E zD2l?`BUIodO)6rL%wj8vfRvUD+XJ5>mb_t8Oh|LIc43y9Hn#PxU9IIq6WdQ3T1}>5 zNlGyk9R`OY!32kxz?;rlulB1)r&UkOa9B#{bAV18S}hp#*0j2(Dd7NZT8J_V?$oL} zZB?DN>G0WfVRr!yv)igV!>Zubs>o}LAdbtli@?^uyxH*r%zK{M`WnqAVLnZ=A5v3z zOH@xnJx%IaN<%7Xj0b6q2Wgy%hiR#}!l*i4+v*UEj`u4Vn6;_lRWLf%Z+jCaA+Sxd zyctPGd10+>YXiM$gAg+W2JIRBOl_6H5xpW35a&ZY zvBTF}5Y+UfInoqUQ1OMKbhYFLsf;jE)sO?GaHET`<%nLTn5xh&N*~g~8xQG4SU*Wn z2;!`h&t^;{!eiLPOdym?xCGu=(-jk^^>Yj>+NroofjI#NqNqqcMmsz>Gl+!TTuucA zV>w;Q7NuB6f5g$Q`pEY?hmw6Aen)@1?~^7ipQYoAasgaIK10ft_O<=VKJ1LX-_<|r zcXUgJ?)D*oM*7+`Ygg|8$ewQ|g+G#P?d|ZDAQP9#1llO2NKNji%B?dM9H)%*bar-T z28uy`Wp7U_h5TkPBSOl-8JhW~0Fh`kI6`VmX!-&Ln28NK3MwLHw3#y@!xSs9gG35{ zV3@z2FG-Ecs6C*Q9M7*{dp?PH`oR+P*IF8s1ZyCTNKhFS8)kM5zrY)u=><#YlZ-n! z(=na)hiAY9Pnr6(x`+-2>4rtE=eJD;U@%zj7BL+ML}26wXWFw+Fb@Zn9uzhV?JBf_ z6tl7m*lY6>4T*+j+7{_}Lc=r+y-B-Gc7h8f5JU%Qk4}863l_LRR$nkxD9xA-49-Bb zsOADcnaT9zE2xP$+lm%MMVpZb3nz64GxwTE4oGT{F!&Iza z;ewUmF-4?y$C2UmtJlkwAeUs^7U2K^!U7sJFh-hgzYRw(eN4E#ayFkXloj`e(e9t_ zhj27jgtV0(&zYPZXF!{TzJl`&MkZOzmfm41w`WV08K=L=vcyHpO@u?zn;j!Aw+AAI zmn#(3RUrzoCXp0aqMHiw=d$0fc9;ehx;vtYQXyg5Y#<6T^Nogl8Cpmb5sEiP$LS=I zMMfVhvQ(l~)LAOflFS#h6j=haY^A1FqaQ?>tt@8)IT+B8;?NR;GO`?{QwG7!)6E_P ziw?iH;yVnAV@PqCFT-;e;%S z^CnzvFbBn?zXd&F3EBv_OfxmsYy-erg4MY;mw_`ZfmnrO3V`nC3KP{}7$gkO$dlH$9+9S+yQH*L6s6*}M zoR6p=v|D+sY7bZ}L8Zg0RkyQPv7n`z*$CUqrtNlM`8Z8swSDM>G{Tql>P#Amks(fM zW|=ZVxWfXVU^MH}opG29JX|{Oph2U{4}4G*q3=ZVz*W`4k6jJP=2o7hSiXdI?10_O ztCTvXE0J};(+>L*)G;*Q&18(sJ2acFTIlr(8cgieL(ukQrvkInrD;E5^}4~gNfO-) z6?uKBqM;FrB-3V=>XsQ!Cs!>`Mj9!32jn2yOc!*`%z7<|X2JlDZHXo6$8j8LVy1*v zG|^~8U^9lM30s;sj#EX=*vF@(Qc0+T(P$#9y~G4h@#c=QD%BF5kURPfs+(2-9c^nq zGr5|kn}9MVwVl{LDqx4p`676d%6Mc14bDzX<*I_z$aHb$nn~CmfNZ3pt1RSYfIU4k z7Y&n9M3tR+YbQ5PJ5vsE#AXns|7JLd1%l!)z0L%Q;DYm_dlu$82u%u7&lw&}vKmEB zbjRu7LvclkurnYVt);^HGRA=@DeW<{DCw;86fMI=H8WTRoS2!NS=u4%(=>#4Rq$_l zT*t|R;T@bAsX}SygM1Tv=tY(mvrc+(NJ`U_uBLXL;i;0#Oq9WN8A7KA)3%v({;x&Q z>@XJ>Fo%#QGV+qhij$0!6Kf*H%zUiBphzPRb{%}7-3whsnpSO3Dy7x5&~=$>8o?JY z10IN;{J7ohnH>!`)o@l?%IGp7Qj|6x*cKWHCQf{eamZe{#(@h8)0OB1btbyQ6!^*B z!EQ@d4I@AkQbhqBOqxwRn`@B|KCGczS`OnPZQ|uk>SNXUvMQPI1iiD_n#) zFhTn@upgn4GKj3n?S_7s_E=#h%+ZVpi)Qx7F@z3)Y!Ffgng?+KGd6|mio|3$F0T~W z15M62T9l4VAIr#glJFyCxN^g25gV?Ju`L`4=O^u3w5!WHq9v1nq)UW!2;`EfC}gz) z)D6sR2sf@W0KwV|RXQ=3?IdIR9KjG49%v0X!&GKQn`u=g!vAATZ7t*>l8aM;SbwFD zzGa1ko^jStSde6Ntc;UmJGj|A=#C}Q%H-o*M%XFlpfcGrvNXp2XixtL&>l{EyP(`@ zkNL-B0>{8~%aYE(=pM*vvzl&aEZ1U(j>)KOi#Son&JyXe^u+3e6k8-8v@p3Ktd3xN zi_CjNEhurxEIMXuON9cCYap?gQgpr1PMGvM*1iG_g+h+UnMXk4!&5T7$C4})bB%jT zIIM2*joe~RW`wUatd?Ij(=Wn}53G(gRB937&>;fK$7O;Xt_G5{7sILKwA0#M1(qEG zHzes?ZsTM#T~(mm4*w$=Ntn_jULrlb7bY{ORm&A@h1eKzoro5Uavjv)C`FBQSxR-+ z>0l|K6C`aZ?Q>x0U2(w@Zlx>`NmUC~LZgT=Q+18g?9pXwjdQ~8>R29N**Lobny*I;#gu>PH?TsZ*$hC8;n z2`VB(1$rDKF)$r58|xG^_YqR!`x8@Gn}%)m%_x#uj!zkDu&{(KQy8&;K$Ii;cglq_ zZ@d8g+VbYe!lR5dEizC(5cBA2R(PNB`?6(R;DbZ~-2n<7&1X4vvfK;aEZ-;`sxlqU z&I9f+N83)S)TI~w>}VMnE7op zfy@m73^%Sk8p=74hAO-iWRyt-gAe5nq)VvyB0aR4KGPoBE@Ura66zCbXeYzC)X?9G z3X*v&xg1IZfSXs2NQNSnlQNYkB5emD((n|Nj{8xai@RItOz45AOk{(VuwdDkAC~Nf z+zBsFY6&^lhUTj(8foN+%9fGN8BPG~F(^2$*mBR~x(u3hL%^rGaxFE}!m!#7>I5HB zN@PUzRuoVU_1k@52*MgPHIi=_m$nB7`#g{yXYCucpHDM(L{m~>t&o*9Y#4+_mg1x^ ze@Ktx8LJ^{fi2&!g1azu!dAt5{nYGjokkfu8mUPmIb#AyNQqU=HaSzITfT!c$AaT7zv*_rDv(%4lEZ8&>MkOwT(8pR75D&f}Qtrb~U#fi4O6(*Z z{E8G}$h2hg-8&<(RhQ@EqqbDBOouJZibH&YU}>l*&j4OvfR$2yfkkJ_1l4FiZ>m!9 zVAV_+Li_%P(U6uSRET4R z``Zo+ZwjauS<^0;!6IdZHCu_4YZi{7hZLY_9-k|sukaG9%_=aXJacDotJ4uHvT<=l z2N=iUmSLn(ALpz_PGaQ@ln%tA2<-_mnS)3imnmstlJsY`>I|>-T65FtoOR4-jJ8J?hYe7EOCs=LY}25K9i*5rf(}t8)(n8Np{+K;I5WnDqblRKR&YjRnn!uPeW|mQDStdqMBRNyaVp~3Xxzt8_L|jnR^9Mm2A-NmBm@*47?5L}%<9^DX#TRbrT8Ft>KzeG> zM=6ZtHE3;G3zbU2C@!ToQdD3{$sJ&{T4oMSRmp3pF4GS_Oy)fXyBc+|3A0GRJUGJejKo zl1M~*A>*+HfN7fv7l7ojxBJc1G!koB_M0ftvuEQG1-xZ`oq@-i2)P**Px&59L`ZRU zJ)|*{)+-ihEU~+J<SKUU?>;rl0kdpufN&Poz}oCM}gD zHe;rWBooXciLu`)xpat?x=|uju9Py>sB%6$wF9dyx6Xu23%Vk0mxh@uPa(?f3UN_x zevhFT=?b8`$fhmQRce4-L6ZRb=#gq|T9hMtVrh9l^e5&W_7PNGOpR{bnaMe?+h0;6^o|Q?L5o#3=(Db z@WL<1S+ld_dblc`*R_Mud( zc;Tme18l5jnK4PIz1xSqG0IP)_I1ubJ2AnXz07VoJion$^2`*LFTRzM`A(`2znlpg zCi2w={=v-AxQ@#ql25#b%uF6R%@+@2aEy{-H{c_#6y#ErL43tr#cN9t09xaJnG?b4)s$mssaUYb5c{;G};3t82#74wV9G3ntJ#(*%ZH- z5%#QsZX0LEAXp*VP&wSL$xnnqI!duoV`HV@3=NUAuYTZ7y%0#$D<$buJpVUeJlhNF zld(>frsE)-Zhe6zuT@iDdqVln_t_Xm;9|JnYVFIlTyF? z9U11Q_m{MO%|8to<&fuvJ!`*xr71_>hccy@wyK}LWjHtgBFSgJ2e_%jH=6XVrn6%C zSDtL@)o;^N`ofkeNAqc^=g0C_n#{w0`rS9L^sXZHe`yS^`5R(zN=twG{U`kH3YmP})Vtt8^IfC~ zIoIs0RSEj0+GvjNYV}HVufUeb;vKkACQFoMHYiO+NiU zo}b>CjKe7HDeqgzS^jbJj+&Lf@w6S1KaT&=9Sq_6_2rT5wk|DaQ1VApdESbvO#Y|; z9DVgp^J)6`Z72W2j~>NImOd2C5e=EX$Ce1^>mD*QXG_V{bTB?-Q%^@j=|52$ox3Kb z`G5ZXCjWtWKhOP(*H68xmH*JU9K+eNu?(@GNBaxSU)zUmX5M*=O#Z{Tl<>be{iIg@ z-PwN^Oa8@@e^QFmdbR&r;-m1;-e>!;NFIRyfT@3}H0)5xp!szlS}A$8{Ywuq`InBF z{9ly)SF&6DYq9eM@P0XO z-rVnc8@)Ljz1=r1*k!S|@vv^M{gN$jC; z-#d3`A>o4legpR$-0$I@hoiq2;9g{(`R|YT{0Z*QaQ_AO3LO2t3ile^>u~>qoAn2r z?*O+G+E5xA{zkHP&E?r}K!dkWv5!~Fv8 zX}D+Lw!!@xPXB%b|L>eI!JkL?1%bVY?;qg)1ovmSzrei&_cGioaIe9M83QZ$iy1?Y z%-YR^+X-$yoc^gj%3TGfcK&ulcy}k=0>{6X<9{3c3*q*L+Xrr6xc%VtZ-4j?fO|U} z*`7EA?ohbH;f{n`47UXCU2sRik-03=4UoN>e^s}9f8dDLZ{FAcGE>|Reio%FuF zdGo3H>L>Pjb>O70FF0}G+-?85WcAt;T6bQ3;B9}s{GRt_PwhYU(PP^E^S`mzIr|)a z*YTGZMgO9^nFOz zGk@szg>PH(`0E1)Pn>l@^@_)eNB{BF&wu3_?_0g!U3YN%)Ng*Z>Z(64yzjcd{C(47 zcfb3FZ@%xvkLA98;>ZqbcY0xR&A@q^etN?HI^gLej@|FxXD|KWX$LPm>zKX$`jk-Z{RJP z=v&zFuGM`kGTRvgxr~7F>Vq@Z{@0%i7Sqpvv2EjS7*x~-2L1~HyqpZ ziM?*Tb)@mRJzoCi;$3#TakrJ5{e?>&Kk%9L|2piQtL}d4%56I@T(a(g*I)g@oBQ0i z?(AU8O=GwG_PbllO$T-F__lZ4u>QcNXP$py$qmJ`=1*;F+Vk)qpSu55J6-d9;mw23 zKJ&n*@7nSB8!DeatoezfK0Ws7Yc}t={<`jKfAqt@zT@2|Ex&N{3&U6Jf7N9d-?n<) zA-^i0_nlYgq~Ct#hwpyp;O=kq?{@Wjum9`iuVr69d(B5SJ@#g0pPTOfz@zgT-rCi5 z`g6Cop8BQDUwLKV+QI6Q^L8(OX_`NtKX zyZF=VALw zOZ#h!Z@cxVpM2`LyYJZgp*w!|eE(CYuQ}+5Jv(wwy)pUfsSo5{9J}D$-`utEz!yLI z;yn+x%$d0R+82Lu_5~9kI`;gB=G@x#_YY5{ANj#u``z@-{ev&Pv?YJuE|2~0(e8&Y zKI_%L=caByd5?~lmu>JL*n0gf)1R9<`u$ydw7q!B^UvM0-~4+|nfu{y?7!qK|J*4E z&RFvJoj2dO{)I&MeP90a$?saY`^wGht}d+q{8``LHF)ak=?vV;+jk5u{J_gIr#$|> z8=w5_70q*}pE+X5SD$ZvY(v}a*B<}HzpZNe`+J`I>gq%GUi|D&1FVZJBRf1z--{1g z^On@!L&v@S%$`$6k>-b^FWtZ4@|}M8lf6H4+-tepZhh?jH~#YFCB2(>owM@UPu)29 zlT(&=KD=VhYai?xePpjcAN}sGr=Gv_%8x(NanZA1f9R|4Te{_p58QJ9>sS2eid_%w z>e}(H^ZW07{rpc~aor2=+xy?w-In`Iy6fpLp1$R4yT0KLeFppJn$2I?57W1xKLeFppJn$2I?57W1xrW1xKOR{83TJr<1dwWsqj-={yRDr?uv!SV&ShJVe)DInOOY8 zvG`v|Sf1y!?@a3Ra{6AQK9{KP80!0z`tFuKC#mlg9whD8_?O>!vp^ty2TWgo(|5V( ztuOl1cS7ZPFi+pUB4K@>^i>HTq8*cT|6`w+?YRHW#{KpmGLJro zOmD-(97qk5yynq(HGEy`iT3bWX?pfN3^|WXhd{h9tS?W~d+(w7Y_>KQHO*;3{IY*d zs}3lmrU9v%1|-D5f-xpewL7+*O#huHr%k`n2YM zx-f0cb{_F&eKd(<)PM>iTSffv^Y*Nu#~)x9>ycV2Fp0;EVZ1S7k0-PSVcQ(F2Zk{S z?Oa4nWuozUn5V=jMokRQGB-8b@`6E_H8^Jw8ro)do_aP0AMA72V#UDP6_uBu@%*%} z#)4v|YNTK2hcz|C_B{k{fnvBq8}Ar-l{d}Jgso*f&Sn)mBy5v2W&~TRqc`cT-9ZNy zv+_>KV0NHnt#lCpPmaT6ppK`$ZtoOg-j#O%vy9DACToV!NyugiB|OV?ion&ToCMWU zlmvm_R@iIP*2!!m(}101(^t)CvrXL4U`4p}$kI&2K3!zepcpj=7#dcVnyF8rMGVJg z5qq&H=_UH;!eqjdE3lPsDaBcB#wL)M&j_O|zD6wz zNnT@^>)6o1o;B1JN#L5`OXb(WmWE^7&l(MrEHP{10*#t>a7+zLeAI}1n`>E}Oq)n5 zSz-nUFr*7J0MQtjOD|>PD-yc`z0pq#%9#2y1_UH$4a*=-3{i>M_FG-MrIL7iR<+nb zu(lGzYRp?XHE3MK!frBGoJ^4|fCke?02}M#BioR)1#HK174^y*&>3Xo7?Lq! z<_l%S>^MbJ8RG?#3U>5h7d15aq-}D|tymmKftr*ivoRTG6NVs3gkHf`ni@Ga`=o{< zNetEI7qR%4A@(-LVNj2fmiWrC{m*s(c7X-8!D z2@RD*TdC%Qqfl#gA_8_8EP)%F9@;uJWvJokQZ$$|Ou;O(^5B&i^Dxg2bKxPiV5{c6 zqa#i2KAAy)A#r~kwoiOA>foo!%z6R6F}qT=4c~;xW?4rj(>=agIzo9&rUO4Trz-%A z6`L3mLr+7n=VX_^V+2UBL&iSD>Wrd&{X10g{xL7kt1{lj$$~7}u+gDrx*T1^SNG^F;r zV&wo{vophvb=X)I*Kk}cYL-R7umQ8Ie1=hL#-?ia9q^iMv!=6RwF6!=eP60*NwUo7 znC&iM>%}N_$d(FVf~;_<+Pbl&trm#LlC3a}Ge0d~eJK&A;B0h3}Qvx+tW z2m8n?8~*I*YVGJAFcc%o_#RiJ<^@Fh`ihQ-#9jdEA8n<=r{bV9R{p}uqhCd6U#&GAQV zQK~h+GMiMS5c~X6p-?IN;9g28a1ETloGt}H-e;>&nk`FavaDT34#B{gF$qXpx|rjm zptroRs$H=r8o+(2pa=8WU=p^z2lrIoFW%e{|v1B%oX0;fel0mQ(T2W?6 ztpY50QGlf%3UJrC!t6p;fL*Dx06H)to{MIH<#X(tY<^572#%AMN9b#f96;NYXS zu2s1ew|OjZw!}J!2@Pq*E9a%%(z?(ZVr!|e9#-YG32x@mBFtV{+0KoLca@c0+~for zuVuNWKBs~yEKcwAasf6z#a!h0R5ovH&}K@h^(|_9lLAeImXv2~(W^~2SouN;V&E+k zlag}L@}%v!oh#N}G^$+fHuhOkV*r+}B^KEN>G zSapISKFrew-gvQENzXPAXHB7_6&@F+Z5^jv5eRohhDkInQFIHi4`z`S(*km2cY&~~ z3C7>Z!f`Bdn`?Dbk{iSA(aJ;Nf~?tTA!@VL7!~!#3&kM6yxAL1v*~x}PV+&|&%!*t z6lTPQrs<|Az_Cp}%jlxywDpVW%ZO1wt5Bq_W3Pe9$XX@>mHUTik<0mPHPC|CG#-N- zQ-IhmXzDu<%wFscu3_C+WI1AWHWnG072IBg?jjtIy43z{2BsgOLvZciQWDcZq_XxL zHDka+teSWhXtl^mQ4sfuJ7O$^hT#eqzp`M8GZ(^saJQ@!erKx zq$!{5FP0}~CDpm&41BJp>0K^Z`b3#bsiv8vibD6w24?U#WmKG;O)Iej$54|l)=a{( zEGsFFjFn6G5FaW^ls-rA3O76KLLa2dSd7 z>spwj&$qClfH5ZnWWjuX6$g$Kifl>On9%j1DXqeqXt_ED8j%)5y1v@i6?3~hb!yq) z#jK6mOK%%(?eKd$PVDF%_8h;T>>cb*dYSAQS(>H(Xixu0Xbat_1N*1@6#=2mUunIj zur{|fh2?_{ATb?Fk(iF9XbkxTlcg!1#o;7OistF&Xu}-V!lY;`fGNQ#RIIiAep6zs zXt|?E+IUnsMN2v4=4;1816avIw_7{b$=$d-Qn4xB<~FgQFhq4QaWNr-@$s_5UAhK) zZLemvvE{$3q*i1P5 zQ$PuldMWQ4n6x-ayeXKiWT})2^{oPooLQg-s71kArgBsuorZ%u86WSj;xsc=WOL38 z7|rA8mV=J@ZH^fN2WQfev1}>?x(V_c>73J?RD$XtENoa!U~^<>IGTebWQIv?BZ}Gd zI=zcf=JFxKvWO}-9YBS6yUYa1GKhGR(?G-oV~}A#0SQ6D!0KqYHGsq!1$BTekK6v% z;;BTABoB+kl#&8Nh4nV9tuw^{N1RPsNT<0)j$xn8G@MT5NxrgxHphasEy;-38K;n- zLU&dmHg`jw$YG{Yi-zM+sGGbTv38IuC_!gt03wE_#oWUQF|aXeUh@a#fhFrj$UK>iK0Fo8hJn*=Qu;Yh2#z2CQ6c zk~*8M&D*$4sgngI<1pl_0jiY@u#;z%7m8%I8F3Jr-W+QzO-I10tZbz~q;Ckt(i5u? zLCo5=wpoCr2j)75rB8|>UjzE3Sq*MY;}gDy^y?(RxRIs^n^p?*VFS2K9UXhv7hZXQ zhKTPkCCkHQ;wZ?tdGx9h0Hn_CV=AV4JHNG>&1LwQ4Dq5BqEb7nd9E7Jo_r>l_VpIc za4wq;^e%=87@Q-e2_`eARm->~ltIEWp#9aUF>q3D%k1SFOgT}rNh+-d4fN66fF%bU zL#HQE7EnN>v7uaOSWW@rI607@5J~H&6%zzlLE#PLYa}0(nATscOo9i?P3^&Vx{3nkF}(hEzc}% jqzsMtx70gqV5q07r~jCShGU92moBVtK;dMD+x-1+1inQq literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/PIL/_imaging.pyi b/venv/lib/python3.12/site-packages/PIL/_imaging.pyi new file mode 100644 index 0000000..998bc52 --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/_imaging.pyi @@ -0,0 +1,31 @@ +from typing import Any + +class ImagingCore: + def __getitem__(self, index: int) -> float: ... + def __getattr__(self, name: str) -> Any: ... + +class ImagingFont: + def __getattr__(self, name: str) -> Any: ... + +class ImagingDraw: + def __getattr__(self, name: str) -> Any: ... + +class PixelAccess: + def __getitem__(self, xy: tuple[int, int]) -> float | tuple[int, ...]: ... + def __setitem__( + self, xy: tuple[int, int], color: float | tuple[int, ...] + ) -> None: ... + +class ImagingDecoder: + def __getattr__(self, name: str) -> Any: ... + +class ImagingEncoder: + def __getattr__(self, name: str) -> Any: ... + +class _Outline: + def close(self) -> None: ... + def __getattr__(self, name: str) -> Any: ... + +def font(image: ImagingCore, glyphdata: bytes) -> ImagingFont: ... +def outline() -> _Outline: ... +def __getattr__(name: str) -> Any: ... diff --git a/venv/lib/python3.12/site-packages/PIL/_imagingcms.cpython-312-x86_64-linux-gnu.so b/venv/lib/python3.12/site-packages/PIL/_imagingcms.cpython-312-x86_64-linux-gnu.so new file mode 100755 index 0000000000000000000000000000000000000000..914f5d1962cb07b5eb7bca5658d64ae6e728b411 GIT binary patch literal 145465 zcmeFa30#!b{y+Xav%tWEGs6HfxQ>b=C@SCvBFd%?ib-hhCI~1PBEh({ilOF26nd?! zYh7EfZC7vGwQkpNNo~jKmSv@>*-W;OZMOPPx)FWVx@@w)=F`^mk&q!3sf;1>^8p82vuJ%VdF*%DxyP*8#D2`WiwOt|Pq;|&_ z@%rHWO<^oGS8YLP(r?!_yxp#*_W1^(&=yrOkr#>nI&0?=Zcua8SJW@-+aUsv~ae8kMKB|=C+k)_|vpL?nndhqg9}@iS zLHO1=oGvX0zgy5}1>sxga{A&Rd_x(>R|MgArgQv;Ap8-*zc~osEa-Oz;olVWyMpjF zg8oPl{M+?_zi--B?y09 z&>s)NuNLxngYeCl2)o?Y-aa=9dTS6qc?PFT4#NLg(5D6A+op5+SwZ**1$}W4zGWJx zuMfgMDd;x@;R`2m`t3pZeS&^x5Pn+`r*93yw+i|rLHJ}559fmLp9^|v3+HFznRL8> z7aT!&Nz6Y9LHI&J?+U`(1btx;zGe#NUlWAyA?Q~H;cF&y`Yl2D6hXf&2)`|d)3*fS z#|rvGL3l?Rr}qZorwIDCAiP!3TW{y>RJ#=ybJ!k)w@%>rv><%3;GY$Qmjr!r5WZZ{ zR|Mf5f__5~ezl-)4#GE&;PM;~!p|4-dxP+;BRRdgk5Kh}RnRAh{e_C(mdWX}g7D7> zdRGwMA?S;P@VBV?2H~w^IRE+}e0B-PZwSI$vp9ZR5dMC_e|r!l?5GD_-amj)lFB9XUf@ZB`{LmK=b4Zc-_PtxFzXz+tI_~RP9Fb%8qYVbl;hHum0 z#ni*_=QMb+g=KhqGs~n+2H25wW{3;Dz+@fQ(^%}fIL%%_T zw`%as8hoS%zeR($Y4F=L_$Up2y9OVv!SB@IV>I|(8hlp`zD0wN)!+|l@OBNpRfF%Y z!5`7!duZ^-HTa$yyjO$orNOsp@Vzzoa~ixugO@gPfMTbQ25-{f`)cr34ZfcSZ`a`C zHF$>x-(Q1I(BPdKe6j{VK!Z=y;1e|XEDb(UgLi5012y`W(T^hVtN*TUIgBO?F41Y+2AE)8ps=;Sz@JBRwu{5&U;~Ko!axuJDgU{9Q zY182IH28BG{CEvs+Qb2h{|OqrNrRuL!CN(Wmj-Xw;Kii{t95AbVhhgj2^zfEdNO>n z1~0a-44rLpdi~&P_|)WTG`_Gvl3eRr+`99vu7>@leN5EzBTfK)zW*tFTY6`q zL~sSw`Hr8*r~kVI(-EDomBFtQOhz4b z#O8A__)3E5Xw7G3a4o@fq~?j z{rUP))7ocVm=3hf4CGd9fkR<3_eRR9fA2I27f|uZ-U!? zCjCzk>>&6!gWn~Xj=FrU41S$pI^y!RF!)7+>1fNhlfiolrXwxiHU>XKFdb$2ni>2U z!E}V>t7q^-1k=%#uZF?*5KKo_zG4R7K`9R+n3DX>jKET6>SB?QwEmapw6=6{0e=*oAT!E*>sA-I*nMFgi3+``~V z1k(|fZzqFu2&SVc-!=x1CYX-Uea#F`C76z=eDw?-NH85u`Dz&4mtZcjbJ*O@?|kNoM1YV@+C7^M=%{l`5X-XVLo6wg7R4ze3sy`1WOG5gy3-mxBbZc zPjD8&#~J)C!F0srYi0231k=%yuZ6)c5==)*zMTx-OE4WJ`L;3m8G`8u$=A%_#|WmQ zBVRp(A0n8JjC?hKT}_#uO3YJD#_K3cKj)6Y)OC6epSr@%AGh?b2d%VE4 zY8ufS<+;#L;AYuDTWH0X%e0G4&EKFiW+(7_I#H6&{7vWw_yECo1>j~dJ9AS2z7O@j ztC&f$B+#!T__6?e1;KLz@KS;&2jF6YGXRfIY4Ht1z9?Y6=4mM{WMR*D(BeuEVr{d! znx@B_TulY>5#BB^wr6ij%evRyy~uQp)8iu=-SH;xa43`lTW48rIp`fgzG>JGGdE|? z%$|{bN%r(hT%Mn&dA@S3`P789j(PC!;05OlE@&KaE8-x#F{GhIcI&e}A+9z1iK@WU zHg|sZyzKeemu4^6$K%S?c#YNbf%o6&A>Xr~`~`Urdi(!?9!t;Vd(L|wI!9FpsOtXl zo}W{WBG|^SJHNW?neB+H{Kgq}m&fp~t6`s9kbcI!nHKMq7hIlC#;3fnM1n~?9~5{# z_PW2P@cP302s)ZG8_bqJpWhg=uEnxp3M}So@XGm~5X(ARA`3jC=8f9cOQ#SqW7L46`|DI zi!5KXEV2xduGG0-ay8A1x4NLM=a@Geio2SwhO1zpHvxe7A;erB+*1zu&O8eJ)$!rY zC2AT!15p(S0KS*O_|kJ9nqXDmN|5-+9|Z&kpv!ZT`gspkV6&SRbnmh605HEpSuwuY z-U$4L34We~J`-c-ueURHO%z4161PUE;4R~qq87 zy>AI>1Nvpp*j-k>d<6?hW(%Q?m+0Y!-f)9yMte6{)hOJzsG0eLICzVg=KIJcFBLS6 z_yVI8(LWcMLZpM^9ca0?F7ge7HrydZRW_JEe$ z*bU?qfvKe2<)M1a`wkgnh!MlMo}`rCAO3 zxd#SFX*qKb=bLigdpB?6tK);0$EP=gB=PL?%?B3a2YmKSV|)e*K64l!-%MVgJzW?u z=DK1@x&-~LilmbHv8l0 z2I@|=0^-TLmy3Q8Eg!DNG4b9=zn1Pkhy&W^dwUWNagZS5085I9gGOUM?|lyBBB@@7 z{EM35(IXx9-`n3m7Bla7-ucCBvVoIIQ0r}DmS7{=0Ri@4qvzcULK0v=KmawKUbvXq z<=@z=Q~yP3|L=0;uw0j7xV9iZ8r7!rHKwMgt8j&Oe#A{+xkSoC zjUx|3JRXGvEU`(jQS$l1G&skBTFNn%->j#U-}gGdEL&klj^%h7QHy+xoEjt=GMf87C&-m6937YIvm`Wjt<)4%%Q zAscV8sC$Fgy)Wv*CB5X$6LtUKbq9Ezcd$TjEKsB6`<33ySQM1%t zTJwAubbzT%G`6(n#(oDovg_wjGulE$gJ<@P0?%Ht;7~L)<;C~FWJ;HyFd1A8fUYN{ zLaK7GZvF2o(EgCJj9H> zpt0EM{hr$LIpK5c(h5B1J^Q?;P@?t`o_Dawcn*yBv=w+h@pk!=XurUO=Y8x8iu|MQ z!59i%v3d4xBtD4WR527>>axf;XJS2XG~Rs?=`|wNL1LzPN4KFFqB5nWBl_%_*gDUg z3sPpUM=@Du&&c<*`t4N#>(JFEGZjX_rzRli@=Zccmtm+tf!QmIedn?7Rqei0T8avq zZj7%7xi_D5Y}lVgw%kYUVKW!mB8hA{i)>j~&{)H4nMJnjk=IxjKfJLjVB$1aV-_Y> z%--HVGmBxy&5O5sZ^D+A+jlKW+0)6mpIpLtdk##&l@oZ|y=l}0B?p;#^5^Hz&zeJq z#zLC;C|wXGP(2KtC=6YpF&xHwHtxg2zP?^0dYboLFn~H09ov@;d2H8qFRiU8^^OH+ ztdDd()DK)byB=b+wd6NQ@dnu(3;L=weAOgF$Q#i!$`uLtDt6#Ydwl~?I$x8ui}ng$ zGy0n|8*{e*`b@nZ$oKqo$uwLIYzUJik2}7H_aqB9xMZ}B)SCzEG;NO0(o52FhrlY| z^E_=gyFgj^?WRN!VGmx=3}_Gi$+o{DfGNU&B-$CkS(^X{Hl^;*1xV5WS} zLD#y^ENfYJ#C8a=_3U+dJ}y@^EF-s;c%3v?n#N%p-PtkfsJ~KfF88k*fRJO-ycM zF3H_acTa%IT@35=5foOg_YzbSM-wuK0^))`#9tz)`Cu`j$X zf=d7skU_w52#Rs-9RlD?J^3`AN}Con?}o=DpA)mG*hhZri{k*F5B=k>uB3dacQ=bE zHvaC-?|l3*+OwaE@z+@BC}`@Eh9k&^A7pn-!w))uYjI+UnR76(1(v)Q`I*I!kcFRF zl+)y(o>{PcTvN9nb{t;JV|;q{03V=SbViYdEvfOnZeS%9VV?N_C4~EN zWEZ2sLFCgsdv_Vomv;#Cp=C*Pp3)TK!^(E%Ry8h~V!kDKeE@Djmu!ivNXNlf>9Vv|Y{_RFMp<_G!1*~{81bZO9 zch^-`miqg97kos2&*2!dqyC8AYy18FhIZ0l^5V)`e}78?{Y~wpKce^ELk{|F{hlL{ z+Mi!Ad!}mp`vH7}e#gdltRK;PQ-8m|slVe6mNyhKubU-{4q7Jy*~;?d=tI*o{vc|c6Ilri=V4l zn2gwxxti+iURglc;?yO3zdFT4zKV7|b+qdljfoHC%V_E>b+G*nN^|LGcN$HblWCKr zKktsu`rTBQ<^7tZY1m&#NxMH{@#e0%Y$5b>F#T=-rOaXSb z%SmR_fIJW5KHhK0^BS>W%S(HCDwi&=^4n)gK%S|c$V2qrd&s>({tuR?`)|uL?$`2U z&rE3voN)7tn2)0LgIySI;b9_B=?@RCrZ4sZsm?>!LzaO-&#%Ebwf#A7~x z%|`)vPk~?KRrc{Ir!WPqJAds^u|DTF&cww{U0QzWer$6ZCr4*D?3Z1Q(R*Eu!w-0S zoxoLNMydVkBL(R{TGm>?i8e#G0gXJ{v){WFCe8Dl$n$)dvNvpx=fIi|=}*ENPK4&A zoDO@@vuDreUGh>s+~ZRkK9mV&K-aJ@8E9GeFYIhF_cTtm=XpNf^GRs72Yc}oQ~(Rl zTaD9zpB`V_a5^+Q{cN`9D_lC1WqZCIZ@K8*^uv~m4x?pswx_jmS~LS2J`M$Wf@klZ zPxPL{;MDM;1;z1A5#hM5E6nq}VA=5+N(Rqi)X1-*I6d3*O`c`P7vpJ?8v=2t)#q}` z3)%Qya{|*LU9Z$+H`Sg8>oKU!UUQ0mIu3PNtZrU*)8$l$tA0+O=P8S?0wT?`x4(um zFTNtbv;}w>4ew(RhtkA(4-9midzpG_$} zh2CzWg9(x~Ddk%a&Ld#V;n@FAN@EubbT*FhhifO?Xu+{@imTCu8g@w0BgH?yVG&p9 z+b-E#AfIr_M+)S3$FKX=-2?m#DKB_lZP+7Qo*I*ywP8$hUi#tM&&d?oK<3Hk$IITl zbexwhf7V4uAN+`%U8^-5FuBs*@ea$nYAjlGu$F{&$5(%W^o4?PoC@R($}XZ?R-VpdA{S(CExd zWYBESd)bLEryqkw%i`U>zv3E${Ni~(@s;#rmb|L?8s9?T=)9pA6@_{Dsz8gT;k^-$ zXm#3GM{N-GsF_Z5Rf(@QC873|W&G#9{;1py9nYUxBgXTu_7j6XWYah8C+Kew1KTsr zN{cw6{X`p^n~XkWe`G%q3C@3PKk?TOh?4Cmo_!z1-`Y<+Oa$0Z45J+TiDcSO%mBa^ zwNCaESup-ov)E723Z56A>|Jvl95h5xkr4ImNbK>b{HJ5BS_$ zPc$%<2|3mVGSpxcxuNiFpcAIFE@H_Q`!975fPo1Tx@#3do(i0x12%$|k)2_wdF65VlU7%K|{wqyC1*pXdxG-!w5iTKSO z!lT4O^i~h&s7Krm=E-pZ`G)_Fe6`-bLGsmlYnb`l$@l)dLGt;O-;}S*Z_4)^oCx5z<)7&48gV>nN|7oJA#Qi@s`t|)$=)btO#NC1ZPzSzZ`r~P$z`UvLh0eDS z-NeD03Qfd*lj)B@*6I%_#Qot!2<*Q2 zp+7f?&>!_3>kqL>e>{N0^hcwP^)KsCf2gDCkEhLkTYqryra}{~{^9NQhZL&*5ICSe zwE7+W|1I=am4^P@Btn1GcdS3eCjE^Cb)|I)hhj{FaGRQ>Vv-EZno9K5N}M5{jr zyw?AaLe(Dv2lR(lzoY+~LVs0h=+8|e^hbTi`a^8eAA5D?e>Cb)|FYWBx(?zW>Ztk; z`yKs>gEtkLX!XZ{*Xj=`RQ(}vK!0fUJNmyN^jDRJ{@f%&f7ExZKg1^e*%c(_KQ!t< z|LMEGA%dpN>kuxuK>a5kUBpe~!BJzexO(4LJKg6^MUl1`1CcixH-n50+(SG@4~l%> z{18nw*pOTgr5cTgvE39T2T;T#SCHlmc>^S6AffyxmOt-3Mchll>&(zouyOW3Q-RyUOq?&g%c-`}5U<{{$@duI zEo)b!Bet=h4>E5b3N()~CyO*V!ncLZLJrU2J>P4kNIaw!B19G9^TU22)?I~-ovSgX zF$L^!caNL^>wXG~GmU{A7_EHUA)L<*a){%9{=7kb;vC2epZ{wXSYCZu^|F=KQr?JU zDR1NmDKCAPG$9q>2x+`DAx)~Rs#?CZvbv<&y}*4%O}SLJyta1P^6D~8g>+Tj=!CMe zvc#l7UU!XDSvk70Zb41##QDk2QQh{2` zVZ|J2cJ9L5T72hb(-#Dr+NZAWYUsFdd1Y1E^xBf@x<$)sm#UpIti#HQ>P|M!$%BFPI4p<9X>)zE=zKh4NaC7moJkRmXuyrS-n_Vwy>_e zc13wDIigbQ1eD8=;EY98CAH;Ja7T&K)TyIOYHF&kkP6}GWh))|OG_3L%kisf%1hxc z$AJEI101;}HFeA3n@TBnXU0SyQQq)y0tCq^(QFrCi@*!$r zL2hu<7c7dC~1$6pL!-LWHWN7{vS z21RI}UydkryM?Ak`x!BV{2ukce)4QPI?*(T>1uR9aG1y1WXJ z>R`rpFk?GtGIB68I5c*r>1Rb{Svkh;(&cq-$HH>QqN-&jZbxOcqpX~~S?8EsUbUjK zT3S?sNwCb}UgqG_qNBF_^5x}qG!!{o9)Fr?v8>!(UW+NZ+&{_HRbE+6GSjESNsxrB zLl|P9(?lkwGBKA0*_pG!)Dbi}sgo6EtTGJWW>gs1S9t%FGT(m@>b*y>}%SPk3nw5K4v=dEaYzF#mH|&-i-V{}~@;2lJ$Q_9DGUSEGuSQ;vd^7T$$RDA4 z#QK}ao00#7T*AE&dS(ff+;dq=FmBKsK`!BTk^z@R&B&9HJ8=7L9`Y94_I?EU zaopBFh1`mVp5k%&xD$CH@T}H2n{_#6`%U^Bv!lt7V@|lym~Bp8 zAChNIYY5FZx9HG8TAn#M+nfLjP@+YS*)&nnU1C0@n`Ca)%|MHf2sp|FYuoN z&twz*Pp7sRk6#1-4V7W3n{*S+_9n9JjRsh7J=wM)WFpg*Oq#7RX|AHXIh+|+63nb2)L$=#rzXm;o) z$!2>l_bSE%Xjg&uJvSgFM09jI;%5n_LK-t_gt- z_XGv{BxQ~{E%#Sw^tl4=|TP zT%GW515GtFmzA3BRc6OjbArp9TnH~SET3D8(Pk~yogu^oL%ULp(^bH4?Ev2l{1YAE zw*&uj2ly7?PX*!Q(bW;)e*%6n^(*Ephkw3W&O(vsB&>6JSPy@XE&+5m{sFo|(7pLP zbi>i@D$w=7`WxpTE7>$wCLzW!o@s2u+Y=Ps2WlB@3XyiAodN6hTPUk~75nwlxy==M z=9)b7DjGC-7&LhpGoq)+13WL$(k6rU z>pw_4545vzyX5!yQcQ0EE!_jX9kI=08Z+Fl*0_skKA4E{r+-i1$sj{>vhNY_i@^Tl ze`4P;XlI2{zDB!#Vt%+0D<$S$Oz;f`;T#7reD0k@{t19&%R;n2g?-NLD0BZzG^@6R zI~Qwhc{ONfVK4MYXt#s*9o@bO+AQp?{*!AO@lC=W%=>?U?^^Jsz2ARY-uJ*a z4SUJ|G~eNvD3AXi;CmzZZopG~|4Dh1;I~uYn~aAXAN9xdbpL)r-$Ulp4Ym@wv>;sg zT(H0e3tX_k1q)oTzy%9ju)qZi{6B30_5EYP?;HCse;M2b@&12W;6EMItxX+s97zX9 z_)HM_43RGq`3jM*7x}Fse?a67{8o`aAo8a~en8}JiTt$4zZH2%s_0+jPLYokIi7`JpBW-wB=Qv^UoY}oMgD-u zpAz{2k-sJK(<1*?AnsJx!p`W__Ytb^ zAMA`yeGj4f-oei3)b|gn?;GrlPJQp7`kukg=+yTOs_z%+jg5xR`TL-~ZPcKlMF;?Ot-z0WqFfbdBRZq_-{I#M^LFa{0RN}!->ag%`hLLR_RolV^?iWB_3HZo)%X7e*Q@XUvu1HQ zgX`}X_EX>Q7hK;U`d8oQ7hKP|cK+QNz4{(Ndr(vLJ%B;z|9Vh;PvL*Ppg{t5<{$O_ zioyQb`8(q~i2Z*JsJ{PE6-a&WqYD4G<`Z*sM>`TGUUW&KBPDf6>W~yiYI167N=j;q zBcTWnExPcOBd-`dDiKQH7AJqlIvhJOJ6;}Ek|OOC*9>aj5e<8g0d2dA>&A{~>M!M1 z+92|dXw*I`#XQ>)%{8LEn*VQUR9Ut#!D#Eg>H|Lq)^jU)Km^hz^zH6o0UzyQPvwmw}2aJ`T)}15APcL$JT>D=Y#o- z&TfwqvCdcxJ#=^X0V*Myy3{>E<;1Q~L(&a}?8c<-B%aBn>j7bn&vl;-DAYuK>3RVZ zQWf7 zl)3!@L`RTi6O==^dmIsCsRocN>DGlpz=$4mAzL_=E6fW`ACRDL^}(~0rO^&Vfu!_; zpyo2xCP6ulzl=4Pa|X&?Fo$`OnGBVtq$6_7i>*Jycv;G1bZV}MNdg0xvIL$qS6b5} z@Z^QE3sRexCz&N`gvf? z1L1Wl<1nKdGkaWm5&C|J8h6hS$YxsCvH#H9eN z=CWm_lGVbf6!c7mrPa;9k|$zjHW7?HD#B$K4P57{GU+ZK@ulCCSNx}LQ}D6gQU?f%#=0n{jCF~DpOn!BUTDkTroiS41tpCEO;a+rXJ8Mh5e zcMN0OBep|m+N{*|0r03zMw>0l5IESjGx|Gl+os%rShqbMl@3#FSMEn}*`8!-?^LdY z18q;+DAso=D-qYe3j=U2a&JsG0LX1<}o0hi#CCiZp3`g6) zyF3IaO^&p|^|rUnG;Fiv$Z8#+x0#kMIWm^KdxZ5~C`TS81>RxMEID#NIqqEs70Z!5 z$-GC|_^6O0-^O}odym!C$dMLu_fBm=JBpZP&xx^>XC*B=reaw?U4Kq`H&Q zKSQ!+^iCE(9aRs?EwZGW05f;#8asyM?S`^$3q`*@dI}Ix3*2>*LyoF5rNC0kQ?N|b zis<7|R8rPLrKpt*Fe&sm*iozEPScE}w4j5ijiECD*p=Hs8}%nPCVMDk@2JfTa41*8 zdQrDBAYNI6(22T@0SQVJvEIsnB&CgN?qoo+@(whKy4(6GSf?p1FhJD3wix&~OPNYF z_c6ewL=OOPKR2*40rri0fZJD5VBV+)xp|e5@c{l7dluX(lz+ifQ9HSDm2w1p)MKpE zRSG@oAN2&QsaG6WUZS34VZA|#BjBG5XjV$8(|^Sc0kdn+>&|O!X;94S0<3jT!lX;jE-fa!m7Lg zcSYM7U{|&xgrd7K^)RPlMv3mufOw@9#)|HtoQ4bu$}p7z-AA7TjP5aL72VHbK;(y-!tvd;2tD;f zA(mRivJ#-LAybkC-K-ScL?UfhaU&>i45lXM&5EZsqU1IP?-!!o*L zxoZo6P}2c?cO{YkjRF%#GL&QJ>QdycCm4lSrJ&iF3rzHq;VVR{E>-Rth7lNQvf!IB zqRBNtCRh%~qM#clTShS245B6LOj2nj!zTcB!{x3s8O3~}APZClDCQupbR*=LD;ULU zq98&3q*BBZy<~U^&en~R&D$8+14Kq$J=cy*h_!*NlrEcJX0)%Xv}gRZ%$Z!>nFB$a zAzRKd+Fw*!8(0L?l?;z#Leq_rExmycHTB0g>z>vhPId&sNQP%I;&hp^Wdb8BP|0Wp z=VXj8r+v5&XtQK1jqgy?Dty~%t&Ziji!mH^*|N2n)so-sv|bAhNA^T*jvVthR{I3L znbBxH<^9kIkqj*~7w5_`$CaS?I>g7P6pW4JHWP z1UZI6%g~d0o+!s8pjoJC2)?^6f`e$e6>XzHrgO$6d07)H*| z7p(P(0453GVXB!d$50p=E+?Qsh;tTGg>H%fe!#S-yGV}t2kY!#YG<^Z#?qh)^e7od zViMO)m19maTAxZwOB$!;k=BbkE0SZvk%yYB_-67CL4k8)rNJ;AS2)!4A=K+RgT~Dy zeODT&y^IFZPgkKgm!etkTM!nK;|SJ`)xA?;O<6L~FX-y3^mv#W@3eQwwv4c8R*d$$ zU`tz;m4>aPoW*Kj%VvN{c@g1a%VB_3d4M)KxeTx?DFXrIF~Fg$gmrA=*`6ywS&M1h zHo@{ZxFsunh}%R4q$#&!1+lppkfl&i+w%F&LYYGwy-BR5P-($LWt+@c&r+_(6l*JB zK(TTbbB}Eb11gkU>gOT`)F?M%CbCUsz$&FDd}=FX-0GEIpsVd-HWP19M!+VvB39F^ zyh1h8S(`1&NosQm1GXtUFvHqrFkriKlz^EG*r_CwL1r;ccPW{$x@|VAX;DtW(6%`Y zIHXk3hH@?gT9t1d0Om2^h*C^s^BHhl8B7coFu<#PL9B}z(59G3?Ggr@iyVnzX0Xn8S?hsWZuiV(0nN= zPf+tJ*1)7}C19zI=1Hrvih`n=0e0oO5CF@V5gp3wR8tc}lVyTJe?DltoYf>Nn-PPK@2QDl7r6RMwN3t`Ks~1q<7iLas5S z##K=??c#!E8HLo<`tQ(KH;UR^YtKUaP}2l_ccsv$jYMD!#uA8XngL=Qw)(Jp0V{o| zaA)QU+ku zMHR+g3&1477Q~jQLQRwLt)qrf7wf4U{yjKZqo!GR0Z{f}ZjLHpn<#K}04VK26(+Q7 zMy{KJ7>z2|Q#st4h>0g^u{8oX-eW~KDoe`k)O}?H&0{9Bds&SXwS)my<#pO>US_p{ z%nqI}f=_qySYII6CIx*sNQf#u)rEfyPS&Vu6K&R&Z)iupjBVHG)CNEe-|tB=hNvrz zwD0db3oeOT&5oxGa&M{c0t}<5>jd0O>N}s{wF2%b^}Q47N39od52>#UN=0oDaCfP1 zG^x@k;BHdi6|~vDQNVFh-!mjrlYlWhg_^R#F_c}9gqmm%8)~9`ZK#Pf|yI~ zq;kKM7ZJ<6xoB-Sm z1@$JjF}ExA=tLjGuP(72#Kf-es=onkbhXgN62(^k@MAPZn3JqAm<|~;^I$#SQ%**W zdAOw;Dy&K-Rwr{hJ8H5k*I>akkL^N+a7gi#g_@|nj+mLp>EA#nq3k3p)RYE1TPF)p z-~)nfWI{~?VG7-J7~E=#Nu|~ih*@ixWeLimrW$Hj1Y>#p?WiNZ3yN74dso;Dcu)Bg zl#JcRFTE8SxUqNhlNMzr0rxP#stmN1wp)qK%D1(qN^nFUD_O?41; z0AzL&jp;&|H73bBY^4);2ZK$JPRCG?q?zIxXE#{=3@h)+flsRYFz^Bq(<~#`r=~wrh-JwbuetyoG0^+(A z$Em_VRcp3{u&JoL(QZX^k*@FWVus9-@~$$60ZHVBqNg)9eXs4y7v45LCTs@(X& z5a)7q3f(Vr4#VUHYb0XAyKVY8}Dm(-+QmJqS3^j}j--5U<6@|;7 zX(bir0Rwevo!@f>Yn``&5A>>aPJx8<>;BFYsG^^FbN0gwR!xPE(41bR;H-qqjmJ#h0bQKy;RFYSbdG=-91BYdoV#E%$BN|z&SFeUwF`4+JNqF7 z99OKG?KDC(N6y3|=K~lzv$KmPItO4ncg&dPa@N7~j%fuh=QW7d$+M^AItQZQpu)m| zu$e1&iZdE~QmHT&+7F|G9bO$yg-5`71Ql+EJw{TY+9^q+sIU!&NuvV&K0!Jaj>6B` zRJaZdbEpsjC*)GW4TgDC=!+;DPlW+cdIA-)^azvErPa$3L~68EN&=_bY9G>MmeX#KER|o$DuD2(w(aiN+@JIYal!dInLYx ztdQ#*f=+?Sa~dHJ3gewm!gMH1aQ+j{oD4flhI%;K{<*B*4lPvwd?}l6BmdB;MQt_0 zLV?t^?&_sZ9h9!cICf3~`DN9WRZb&K5OoVnoa;eTirs?^h z{W0k91PW|7VUY|!LInF(o#hA&YWNdGwcp8s0e1T<`mmotnlMYUzpC%H8!e@T*^>P= zUN$Ank?gI!Y?Tc6)AaeeKJ-cM#GbF3%X1IkgQCBo#GZo#6zbvWe2|FO4$K!mf|6C%Hj$@=2GZK zf#Mc1)`iNY2>!Um44AImj5Q%{NyL1R&60FZcp)w`VLN&aHT@0W)_X8O9EP|XO%f=$ zjyDM%=^`g?BjaP@@@`T}K@}0X0ux!><_I?ct0D4of^Ok@8E`=vH#saGHRc+3trS zm=4@|J<#V+h_TBTh1~@-+oH=;#cjfeVNZE#ZyN5n>b@5CkPG!!f~@}%40O3DhK`KG z^xL+A1wP>NkFZk?mCG){WiP@+-qmLh=kf}jLp`l;0a^cexK;kA;3EB*ctAwDC)~A< zU#mgaU>28O(MN{>7p7MqBJWQ3gfmq#SsJtr5iB3qcOT5i)Ms$I)6L#8m299i$UtP( z#_rQOw?FYt2Ms16_ZijJn>adYGtCWCLi&*j{)QH@)u>=!QqpYN%U#Ut=#(tBr;IN) zx|3>Xkj@V2_c?kyLv_S}U0lQx2(uGi(n5UMzYFO{wxJhaax$vwu*51@2ZP7K8QmJ# zMPW8IWZT{$UMvju>$yltConJu~b5@kHa`aHyE)x4bye` znrdmqkdpesiajD^cIjsA2Q>R)N1~yoDWDi!hIPH?2bRG^trAGdPh#ba>0-+z4BN_+ zd{WXcSaf@J*O`g=9IB&cQqluDh;}iTcpahHmtUn=3;fJo7iwz4a7n78=~M}cCyU%e z4Y-Oi2zYy!5T^Ole)Qm(ux9T|m^WS{EbdJ~+jI($v&Q(3Rl-;*!4@aLH0c9cgudh= z888q;4|mYIaE_z92hg?T*&jJNHGqE20kkP3p4R#N0QwG+9v39EJu42NCqOg1k)v1o z(SuX4KXCMA(r+RxGYj*;(05^F`&Y*Jhg9lVDnSL>1`M7FeqH;sh6jjXHmang*J0}( zSLm2mK5oZP44fM<1=ug)gX0&Kv6S?88Z)Q)U>MS07=$@RGZ+FxU;mGAJowiV+6`8GcnrNB(PqEG5Wki1Y*0`M z8i&)M_&W%Dco@H3M8Jctrx9)LH1?;#^ckVq7Zdd~+QtUHuB49W3k)AZHaH)m^zFe+ z7>0R{-*rkty=1?`*q>N92u%#7q3;{8;4akJh7pQ_UP{`Ah_c6Uy{8kJO*8>3B^?F} zdn_kd-T}ej4-s(v?Cg1&TU5S`IqzZcPIS}T$|QW4>baATLU{Y*A^oVQmkG_fWK$ij zxKhe-SiWBjYnBvB1L1@*o(ARDei`UWS4zsqQfWWNCk-o{$Q599$!EZ$+ag7B{QT#pYay8X+A&106NPDUwo~Hc4XYpl@WiV`$Y269A*OeSlcM-`I9enkbjytNc#W%yD_?h+!7ds)3SCmS|fmP1hx(-?N$I)D9|0q z^jogQgN*Y*gO98hFk7>aeAZ~xLxGX^g6bb2r|nzX4gepcaFT#$0Stna1CThkM3tLb z@N@gdXuMeEM!#Z5&*m_0+fbl;H;mgU6pkZFBNl-7QI#8Q;N_4I<443{DQX78^aGGa zU#TH8Yy+9Dmp*Ld24Js3^-84l7d0dyDoad9?4x^D7xo%)JqoJFLH>6nDPz^8yqadP zG4dt4s|n2fMVO!B=Vvq$HJPgE2p=f{F^UMOF zDv@5+o^Smv*gS&Ul>M$I@!R^-V4R_(_hKZO1e`!1yoHoYPfMa*KFxsDh?^xy!&j6_ z^2Nqpx*?MEFyOx;<&BO9VUaP0RscGuV&m%p(UYteuvK6md9E>RF8Ucy73pJG&7$X|ca^y{@nGBkVM3;GwprK{zE>y#^#t4!_%6wH+ z(f#zN+f_}-7)dN8X&>fxX7;>d22=AeeYzjGI82}H2a0epBLJH0=<+MnM4OtNp%6uO zawDsMY{Y)>PXd1H3JA=N>@;SRk#7ch0}?l~(>R5U+&u)7DbnzzF!BInUurcA@N^_@ zgo z#4Ufl%B2{dk;fV%env}X`FzlfC%Vj3K|_|eLs({c5>CpzR8*1WhqbH9&`l)iG?ss* zgd>>c_xk}D`&mCQD@?yj0AzDIof)^!0?8tbay6REcc7E3N`ftHDax550~^XcA_-~2 zc}MVw4kL?uB-A*RJVH-fuR-D-2{mSrNA?1-8)-tgVDLQ#E22gJm3#@Ll~dsP{xGks ze??-3MpnmA5A%8^T{pgGnsh=?zqG?DIVms~!Omc3ZettHvVQfv~ z`~&*DovpFzPyIv)K?u?Rw8k|yoN05i=MFaB2D}oHgvMj(1o`3gCKE#q(L8IFDrjyh@oRe z{l=DS*(iCMMF}d@0?f-ka+@LSM`#!rC0BsSN+dQ)?ndEGBq@C=Y(h>SD4JILgDMjHQB-_VkE-T^%VupaOSIM1?^uTuxFv;699$Idl2xCh0fQa6@|{%tQ8NPn8{p!3Y}gMlm`WP z{wj2O3d&!Fj#^<*3;xhKWr%o)l&8?4E4#;#0--ZdFr?7ANpvkj=LkY)fvD~%bjpP` zJamjSn;zn!qyCXN{k0N(`Bpy144C5$t=ul)m5)Yjhc<8(U z1T9QFbY2V!oueYQWwqcBomNBG<=B!0LMIkgF-R1+{%zlt2S!k`w$sk*;uh&V~QQ{-F*Jt~m`k#nzL zNRe~UFA)VTHv1WGi`tF?=WXFL9ymL&%*gx1awVd6y(+@iZaAaobIv}#Ty236HzD!B z*~gcwNE@DkM;cwa7=ODWnCNO~!?NEHG4eWK3s5}?Y2jK12iNWO~9t%KSi7(MIm4 zc2yaDb9py@qpkH%)R=7Vz#x!!b3>^=H}Dp3fD!i5Xw^`=4P$78T@OL7LE?tmZEzhS z+GunN+08l%TMHfF}X`2?Y<*D56h$515D;+_*zx zR=YvW6|!3JTP;Q(_7nUV7>X0nCI^XGtpSDANK*PIVEL5bqEid&RTbm(R{GVNkw1ZI zALyS$a)q%qaNFw4J(`JZCdg=0xpCWSipM%Q?`x_z^J?A3Le@B0 z${16?W$^nYVUZ9@%3Lp6lBZu{Epf3#50yw6e-l;YX%+wsjg~pz0wX^yTsejFx?Zr9 zw_ZL*b>-8B6mq2=`>pSxEqCS9hD>th)j+O7;;s}-boHU&{EToVJ!|wN5_9GIC>$k# zTxp5Lr3um~qGzt$0Elkeb5{y>@(rS(b>+bfttYgiNwp(E4H;#0w0o zv1l_IiTUCx6jmZ}U)(CV=+uJN7l*)w`Qo3T{|A!a7k7(h#U?{6jf<5K zbtw|}#U?{P8W(Lqe2O%j-hd}>Hdv_{{ULZFQvRwdW=rxd1`FM4#Rwm?x;J{f)zFou z6WvA^KcTtJz>dM_2{pbg+`_koh2U@z67$O>A)l-k{C?SP2wRCh17l=4+SDO2ztAHb zw;$QAI9!o>j4{xy-EsPxsqS3j9WwSc}F! zENbZ<9gbe;X_ax8(k^HNx3(OgjlBvxLfpVFv?j5m!wvibOB&ZkQ`Txhe6gQ+H9tJy z#H;zCfi&(2mV0@HAima5yn=71IPnU;jgoS%f-&S}ocMS?#KQ-}f_>zzpJD652Vf0% z`bm(#gT$R)!<{}4Zk&ZQdOFr-m5I)Z$xW`s0IUP{HdNEYmm?PeIEcb?NTY}(tsa;J z2X2)h@i8aFkbe*bzi;2ug-wG*0pCtVo5@Jbw>P4&0ZB^V43=r)VnyyR3N#w&BOljA z>>@4?fNE4RiSQUoFFJ6Lhva$=fNo<&Mz&~2H+k8}tAIP@;W#RwGi53BTOl0<&>P^# z0*D?>#26Dz{bP)w(J1E;M7~_X&8_}ISis!#@>FwIa&vzNfj&dx=C0)CuIYn|U?gU4 zm5GktUm{;7%>6K`A4Fp2K8nH{NTY~^nR`rMv_@j)zCq|As|BsO_hN$@Fn1~1EI?xB z-iE?fByR3QDwiikL2K>-(2JY})+s#xkp zmEYV9P39hlFS(SP8|OOg6EOEn<5hE)8raFA(huZF+}x!GcCxq@hr(sV&;AVg`G&; z+_O|J<3&Mh?puiqk8Toy%zYLu+mQU`E)nfIGj~@}Pv-tR_%USuJSIy={Wl+>K~+JrXnbAr$CO`?8C ze95!9xm(2&gZ&iy$Xo9L8$Nf>Hl&fc>1nS-ByR56hCDL&5+D{KjeTD*plkHWJ^`?R z%Q;JHL=o?&P1K-?=qDNS@qUW9TmOo>dy#lQMcl2YfH;nnkH3bOrx~K}g9UXPi!%-B zoDV&N(-oYcI9=wtrtWYwCW9fE~--g8eyBmdPk^KJkxHylF{X16W zOphf=IX&TI*~K*=>(M8m!4nu>+@3D(w~x@#he%ul7x!D=L`mv}#5BkhOeD47*C5{z z@c{TS4d#PY#GfCekD{BaF(xep#h zNB1Lf4RW~;P6KfQiD}S9)j%!yHOMnWRDd7TpwB=|8c0lo2`Jw`30$a4+Gat)TEqe>*M!C0=rLqI%$#58zcFp<=PUxRUm2s(6S z8qi}1Cy|&2;e&9Pg5=lWd%>d!AM+# zbiTG#1F-~&Y4E73fm-luFxn9D>13h7gCPGa64T&S6kbO1Yw*HvYoKzbNB^W8S{LPE zTm$vzYwhF+eB`YwaSg+LFpT@)8+7y~64ziD_d#kB{Dw4+$3?0nh_qQqFifTpP$cSASy{nvkPR1x~~ z6Ld4?@Ngt9LVtdOJ{gFKNMo-Ntm(PU$s5|KdLNGPJH4A))HADQZ8x4eUPd z2C!R;#QW)OVE1vK2VxJ>#Qp{_bMR|6nzeoba_pUgYa@03fB@Ll&bVsY@mhH2a{r6e z>l};rI>*AVa|+nKM=QVF%Pw_G_>CS5Jwhwxyc`NH;hf7(!T%es0YYVVp{hbSKPMOr z!TKR_6~g&B!2>|tgEad63T&kW6I~6s$O?8AKLL9Z)yI%VegRoql{oeS z^bC@#D}ZqQkzy{vUtE0|{8O2L(}n>45rp3$rDXt^l#Iy=Da{4o&nWx}iEU603qfSH zVC773ETRj`o~qrTe2+HYA+ZfgpA@WXNK)o2f&=Xx=Ai-GJJ6p!;jtr8MSF*p?W+ci z=Kav~!uPW(vB>JK0f&oq*W$ZKPNrL-$x`NUK}}B{@8i^_6;cHK!g)6-bB2c3SDo?F z(VdA|?9S<>g1#%bDTRE2zZ#lU3Oqe2-A{w3^IQ6S2z*8WpK+JK(-YFrI!u3gF{5K& zIrDI=BO7_lsK4?Zh?%A$HD-(k_SDW|7;`=nj~SzZJ+*Tji1(0K%&1IsJ0rk3M8r(b zRQzoM5{sEi6y_t1A`%uebPM}yq(2lhBZeXDkXX#DMd4ZkC}#dY+P(xns_Odxy?MMb zAq0T{A}$Rof+7%*B^m;RuqCpL%p?Q_hmZ_OG@F?T5G$f$wXP+ty9m@S>aQFAT3fYl zRa^a8tEjEoR$KdXsdjO%+S-5n|DJo#x$n))dlCKFe7M|m&pX>a_uTa@^D6+qKvFUD z_Nls>wgAJp+7vUrC;MaO_!&5bL{c$xDuC5UR^?w=0>#V@FzA@UTXa_C;cK-pikWX^ zUs}SKC}w`GE)5hj38to)`9M?qVrG+1)`V3$2K0R_U;O!E<{YM{n3>1)XQL(;GoE5* zwGV$a<0)pkJbcByj1P{Pa*V(DV2FP1@)Yd|FJ^v{keIRbr217j^BN=_GnSrI$Iir3 z7D>kp3yH)iW^9g`)wmo-QZe&20M{VRCK44h(`R8)L)x#H=>lOJl8Tvo0o*|aikSmv zm1yIBchZDuj@3Sv0 z;Y$=V#qgh5%mP4{m9WVvnDrY{#GwB^N}-|wqd`8GoM7#G4qjg!gF9rl;cfzBpov> zBtmZ~+y8X*+|-ZDmm{f|q21b(NVADV#Y{Vf`c|a(fb@T4cZZZ(;3z?$G~fP_4&S|9@!dIfr%1H$ISbVdSvSgATB}DF~dS4 zJ1Ay8;F$S2F4NsR6*C9Tfe@tGM51Emn<(9cv|lmv5(r;FQZX~V5|5@KshHUg;PXg2 zX4nw>Z3g@?GaNYYeCrS3`8^4tr@;&7;szxWVul$hW{v}_0|W2YBW5_9C}x&qUs}SK zC}w)qr2%7xsVQc@qN)8cLMNW{Lotafb21 zF*BCdz;AQRtj>*@b*D53f1OAv< zgpTCJ%pp}+Z6T?csRl3)2{FTr6f^6=pkjtT`GA;#w;}16`HQ2TJBTd6E)Pf@Gb|*sZ!jePm1AZeNGgz2 z%v=g!8`5kdQ86>N8Y?2C{fe2@AUqjK#mqMW?4bh1%m)D8MA9+ChS+a2;E$QUwf>l? zTZq*bl8TwF0Q!&+Gt5Xab0rv5%+Pl}5HlQ36f@t;zO;ldQOvxcE)5tnOieNKk*4;? zj8E1iv_;_B$R9IIPcc)?^k>sJ!+46BQ+@cW8BZ~j_V5+=GCnwFtl?3^|((kfc2-{=&5s1WC-m+ytf zJ5gA&9xCmdonlfw3P)WBBF&%^?OU7@dR1#9%BLYMnLHGPw`$~LKskIxD@2Nv$%t*Zz@H{IV!L6_VmeO6h|DeoO^YI-wS4tw>7gr2w`g zRsPtg^ic@$bWO7=eiUfLG&bT1F=7uHal2F8wjR={=5IstpOKUi)h9s>k}~4U04}2f z)%+y@zeTG2ozIAs5aJnuN4K5{G@=YfoOKRvH1kz^m;)moateP6^>?BJ)Y#Po2V=M%MRDFy18k zglv!ipjLmRZw9fDzTbiTd8O}>9DUnJAHDaslrPxbr0*W5_yuC7_uky)Kp?62-j)m5 z9*~*$-sa(Q1(I@skT?SPUGT7&v>D{RNLIxwIVO<{v`tCA64^&K-Rl&exq)rk17l(vS^t1>5A%&zifuS_`H(p)1l{ptq%I z8Y_5&dL;=x?I9T!O$yPlhR_ht@AE0<2 zX?Ynedut;k;7eDQ-JmC^891CPLsC&#&2_K^7$KEe=M+Dg@<(Aicuq%BQFtW)I!Uxn zI23(wuSgM~K%}g93Xg*Uv*v^9DbVjjnl%FjIwJfV6^=oHUdKKHseBm;YZ3ym9JAr=}pz5?=oQd3b>uCL2*j*C|1 z^Q@OXf$&@KP?Xb=Hb=R7b3+cy@$L{#%`0AJmYcvr()uVtbVt#sNTk{v`g_-6ra^@0$?F~mL+NI>k zD)kiL5Jx=)Xw6Hxxb)YEIw-RbYPGES>iSM3+pG5`}mG(T{UQ$*M zvgW-o4uY;{LG^87$n}x&o*~yqDwH9;owPV*v3Ri$uUM*&AyqX2zLDXM_Fl{06)C<3 z?Oa7)^|yCN)G%134A~PIN?&!c7R;o@^;)f1emV~$jQX>8jz3+7rL__DcFx^st{);* zPa=cYMyhEwI}|6m1xR`*Sr<|71g-_*6r@S(ALnHn3m#C?wETX2CF*x=e ziZtoYK_HqIk!MpU#ZV15rT5pt&AB)yX_`41*On>&y?rw>nQITV)a9kb6U?d$sqar6z{M-e^50Glw z$}D@d?x#-w-fcB))2KX>Xq^5#w#{h6*98uW6w?>ThSX!nhP0$@0u+tW$aO%}AWRl01B4@xPS^zpztApH>mJD3caUby^K`;ItqUP@GKSH zN8z+nEvp`>+}VO{E`a-~Fbsu?wdhVr<%glL5x{yX9E-w_0nnMu%9$wafL+s2kMdb4 z)ULxojZ|KR!gBzgqQVLkjyw%tL_(T*0SaHlLWusHedLG*_Sm~RQQfcN$}*5FMp|?g z3bW~Q`F8-_0Mu1T<#(d+7Jxq?v9KSpun2uq+^)9A9zb3tVT+QONRYHJx~zm<3Dgxx zO4#cFUP6K^PX)`c!N9KtFlRjgN-Ze#0!SmpGAN*{6t1KU%NvAL4Ybk9Vk-Nk2chfHa_DTBdW{c1)rWr12D2Q9O zO`Ut2ReYkQXNUlSg)sDim0G_5o5`_}D ztQcw5Dik&VSWksTC|nHS3sfja;XwfRQDG7a{|~_5sc<+7GqKq_9%(iyEx!;L`mOC# zkXC*Lh55i<12f96MB!V&-ikEWU0|s{6|N(=@G}Jd@gSwBM$1$l>cgMJ_-(+KGyd&y zIB3)OLH)0tgDvmLYGb=fO@9sQ*_JhK|3A;UauALcnTcb65Z<7VB7`nvw3$s>;28cp z;eCfItfuT=w z@3O~IJRjbSm(Y-Okl$q=OUQLVtVYs7{$mMY#Iy?Xy9FUJeUF5&#Pq#_keI$tA{HG* zh4B4?*vTRMfDYl?pq94gGrtB)Z<$D zkHT&MH&WpV6n+Na0V+Iz0y*=aRJa|56H%CjG@C@1JD8U?q126Z@-P%`nh!Mo=IG2? z3dQBaap9++xDRRW&GYpo6}11&1q#~NGG5T$?ZaCTLBUKx`!wU}_3+~vPy5QikiBdh zh3xN`#XnqE94&EkB+14iJC+l$FEQ630Y+K+&wkM!@)KxQ0XwV(3t%J_urmQ1k5us{ z^9BX%8GJ1_U}v-b{D7smbaMmt7WiUbDUHfsvF)E6ikw=#wgyJpSK9j6=ZsPmuHwQ| z#VB0O1vQ*rqa&?W4W-v|K@FqV=?JS;L+JHfP_cJ|t#(iPz~@FCcdM3NFbuMH+v*oI zVAd5!qnKv1Xwjz4%J|Ld^;@#ZZ^>rAC0qQ;`~1p3pQU`OQU0%SP+o8Ak5|z`Za%Fq z>+P|$zN}U2%6j`~RZyo^^>zihuL_&V)mjV zdmR)G;lhFuC>+X#iephYj0?@gbGR;4r7Zh%8eCP?hZ8Vc-G^EB-3g#sz=c0jp;{MK zVI62M*5Bn@Hi0B9u}fY>%rASGVrQv+a3>1*OZPU{1)|7iocTzdlWAf}A=v{ok*? zIb5$~{^VeiX|2AJI?-NxZ@HG~slUUh-#dX0Bp!z9`$+vgOiEv$So||CWT{_s|K}j| z5~Y6F94&Z|t#fArd^^(k zYbok4Q++eipBR516)#sOE|LC*Q@%w3^Q94_WkVYzAf2jCW%?D#Lnz;iR5_CkqoL`l zv&4D&3}V-MZEWuF1o>8F12fVmj_=Tn>VOa5lcSOOY`Cb6N$A#Y<#r$a>wbE*;?N)J z`wG+0D=juGm(|QJ#{U6vcCZisGse>jq+H=KsDG8M#+TWAY%w3(hd#D0VY>r!o%*X7 zQK3hHHPe)=iO@uI`5MK-^$_DEWR6)!Vukc)oI*T_Xb zf*8Mx9`n1X)vDabv|omG&nQ|%=W&hNk5tm@PIc$i zhf(zDfvZ7nrL1+8=n~GcwzCFQr{QO_oMY9GW7VDM68>2FTyq`$cD8eD1-Y@l?HIt5 zN{AfMOuyw6e_#mCK@M?7I&|+~K4hSvjsvauonvw7j>ve2zGkW}-Jwr&WjAEU!z*Kd@u^<>w=Z|7OaiDNw+R6=a1kciz9DVl4Vx%_scD- zbS@zL_38}c|F5v>nMGf?xE*bC8`7+Qq3{lXH;~GUunC^pfyFn{(lIE|R`CQ9buNoC z09GvOkKVPoPo%bh58o2hQojV?a-hUh{c(SzAUhZ>^m zd_=Eh6CGiQZu1cppOw_pkf4q&!~S1QAMeb$VYI1RLg4o zU_Q>^5|;YAPG^X$SGFTg3ajuTUc|_)NV7(xa9kIn3uz`X(Rr@=n~zRQUtV~Yc!;b8 zB={7l7SIpiawPRN5#fm_p3Cv{K7BChF=;?z=?*Mp<3b&(hIF?&uk!BOU`kKh8 zD6K|P_f}mt!4_Z`n`GmINt0oY*WIoHPd}3CZchPt97%soWGPFD2v8wX@HLT}s8aO( zt`TQqABSYVCK6{h`gFyGpd$BrU)kBtSIvo;?<+e~_!`}@yhm~3Ya;mRBYfFqK3}4n zmWVG#!=AY|Us2!uYCIWk-oY5J)o%C#jBUcDRb(jAtZo#34&Y&=nZ$HIGg;l#YWS+f z<-|i|(H^{GjidyW0XPmxwVLom6wl|m)y}|Wd@Vq?T0eje|WJsqo^jYu(FFfHa%vRf}DR(p5;R#TKy%wgCPXyXr!Ji#-jVCy-Q& z4cmk}Hb}a~zQ|G{0{B~OFjb0LEC%{zNT$WU!fe!HZ$MXei#^C!gIcVUuThJQhkWT! zEmp<3e97Np@B>aBW#Rej;4?R+&grk6~p7ajdEhTsg^K8v|dgmxFO*Uv) z=Aoxdv2v-gNHw%dgceX{kV=3?PBZLAD%OIq!aClNvl$e@^T%AXKv^>bR#Wh(`a}-; z(E^0_%){(yC9CW^78KPT)KIj>U9H+-mTOHbVT##Bb{z=IXLzU+3=_%s*iJNf5r$56 z@%c8o)HJljoJ-EfFH4WS6Zq|qi_wcubXE%8&aE0!uB!1@}$1=Rkvem!_hTUUrh zE%S@Q6J+F2s`iQ^xP^SXQUipGkqVre6NYL+xK%|qc47WnYPTd9#ZjPR$){MzLspi(k%;fgA&fYCkLC2<8idO8} z(3VMOW72)ui0rFGKQ+_Wonj*Vekm#~qTvs+q6WW`+SZBrG1;b}rjGO!JVb>zfj69< zYRXJ$wIaBG-j>doGQ6A4G&iR<;u=nKlm>tpE(Jti0|op%8L3lWV?=K*23HTj9i+bQ zt{zsFY3oPX@aq@XV5BH-@6bOt|lsxNf+;W@F5DI$aD?!Ht{Pgf7C-hehWjJVniF18yb z{48dAI@oZU!Tv=7%P(-Wb#%9Dfq1MGjt7kD<9W8GuI8+&Y;J08B-OYI*P*2}Oy>I) zZ|KXU(tgCo_O3>+t;iUE+mWelOJFY?+u#;7 zxP{S^2Sr>QD4m6?&TzZL9UdL-y3tK;LDX&lFwLD9wWkcSUE6upwV@*FbnI})M?oHa zmWYtA!^Q7xBk|G5Q6t~cpsd$;X!i=)o4cifR+DvrLv`For@ zo8*dMa`OiiWlhxi@mU3PploDGiCYsbb_b7lYmRXTpW)VYxr0}}>=x9*rWNi`Wm~~P zE`F8Bwg0EVT@iJDX-^?1kQ-1!od*}3R!e?>Wn*fUC%$q{fG0LWqVmKX<%!>s&!f&p zRIF5K@jOu&wa>@37FNGqxu_(%F4{21EwmzoB2lMs*C5Bm)I2ESJlY3A1eK`&+_8#6 zT{|C|4pv3yThO5h)P-m*T5U~9!EX0J;0vSMRRxQqy~_OO$^6moQO@_z1~7`Q&2bBy zM;)^G3niep$w7rtd^giw>D)c&5jcdX8XDY_C}8BbAILlAibGe*$~ly-S8c7`=tLdV zVerYW5c9fpEF0H?kWQBi#9~R!|wbaj<^+M z@weT{QRfR=5Tzx65dKA#)bd^jSWZ^&6RU4NKvift;`@k`YF&GcJEX>45_Pt`Od$bi znCqTWyAk|4U=Ul*I=Tj6xO*5_v}|~*CIfQFme24wy(F4tEURsZo~mW+c9%w-UKOl> z{CXF{ZA$h+pi8r4Q=me&eDB3+Q)b)FmvDzw#V$whYZ3U}xpwOmFgQ|pMEqZ@{a*#1 zk8%HnDm0uMw!Z8ZDgPIgn0^gJ0e%}RI+Zaii6jF=r6D0_xzW~wx$Xo&Md!N{=D0=Z zo@-nzec>^*-YK|XJCDI$1jemfABkq7ueig2Tpo4yMhY;flmHy=9%`CpYSel7Y}GC$ z?$qdk6kk)Fz8#d0J_l0!(SZj;0D7()y-){r!4%{tsTdlv5gqzjcQh!9qyM8+6-O_j zOVl@=A?OjfqzA6^sh>ccuE&r0%36$NM6nG2+s@zMq9IYI=Po7cz?V^2CLrmg5zUQW zq<9OXy9?IfqSH*uongC3?Jk)1Ya%-zN}D043#m~P*sbeYVav;@lG;M`+(|n5%(Rj|0;dy8C;6#X1&`jIuWJ0)ICbh zFQul~yrW>vb~2-bDmj+?=d`~=h_jw?3ui>PA0N%Q!<hlF$16nA>mX+_LI3&5f7;1%xl%jkdQ z08vul1)xoy{7c=#NF&?%?s&=|na23-?jp)w zf(1I7hwXL?SL^Wp0xY*(gRl`GXmO{AY6Scqx3HcFk2&8x8q&7AO9G@ETkB3hcZx30 z=F#ZFlQho?b#ch+1tVO$B;%H$58Bk+^oJ7K+ZjB?Eps*@9-YB+45V;#2!}9_L(6sq z-)Ofm0q_Furv(&=&VhF!{1IzWXV13CB)D?yNE^NMRM$NLy5~`c#WdtPg$3VsM?0IT zL7c)l(FXTmaJeI;Z$=^D7nVI5LHnW_6!UxUC}QB=drbuM2txZ?+b~491*bAQ%s2?q z-G!;Z89oIauV5ZmR`o(!93bk^{}BIx<`_ufFq?lJ8mOuVxrLW1klMqma%9E`l$;T! z&i&gWQ$gSi#uF+u47`L@lIz^K4SfwRpuq}m7=0@Gxl@EuceK+>qnlHd=YTC#gWqTe zd~ZJ-@CZ9#7nWdLe{ggCJE;C8Q)srk&DB$t?L5zeB9MC=tojB!FP=Rod&T&(pmh=% z>{~J3H%PA-Upjk-J5D)A7E1V8x2PRCaRj=Ua}{YQk2+6p{WdqiNGkT(ux9AVkf=Ll z;Z*?D(uKUd-7T@B-==15!vunn2WvQIBK(@5@Tx-(8ACoEujZV!YT$mv9qt^3j#s>i zNaC>7Ptrg_c4-py#UU8BTtZutbttE;v`KA$gScXJPs8g;)Wmb^ZXk;So|EAdm-!7O!dqLYduojK7;IrBL z#iGu&=jbsihIw@etrw%tC0o&z)hty4^RVT)qZ>x87^&AiSb>tS|BBUTO>{GPla}+$ z`i1>reJ7iBqSkuu{;+-k*5z6&EpVCjqqFzJ;C}{ceSd#g&%+7?8=C_WZY8MtyF8c! zbuq3Cc0M>8A+f|O@SZ`R1YAj*yWGId8P|W~sGXVfkF!hNL-GQ|>6n5xz{sw)hSD-a zu#C@Zl`oT^SoEvf&^OpnH1ie8(09ntm{<73hW?%n{oDW5&}&GL6aAVt^p9*PHous> z;L$&mp^jJh#D?PQCFEo0jsL5myRr;@(KB?XGW2C_s40A6L;uQ#{_+26=r>3ZR^hK$ zYV)I4;f43IK`Yc;xnn<04}On<5+f*f@is;R8idr8h*9a45<2^#b;Ja?R-eSso^J$2 zY~+Zs?g(cKEio6$qW?-9(nR0gPOGcmM(l$i@Lc7;66|5sDNAG~jcEUZCr^$#Yp_mM z{p&GyGH`p9llPI6PxcB~PX6tFtefsaoe&I9pDjlsW=p=7rX<@*P(4e&gLN^YhR*yL zIECsSNshoW;AqVFwsSKK!bw*~?L}j2(kA z=vQRWVz2Ot4Z2+$^xXa%^h+q7hc*6L`V3?w3fO)f@6N+H=P%rOIOoJ+gF5HDP;c}L zHoAkcI<>dEQz?5J;qygxgfaSEx8z$WRjLifkW<{zOHrDOcK99zA{>vk;T-pf9l$G7OzU@5c^8*ZPh-H;TpN9Cv)m#ZGa2^kElhY*98s#;xWgP|v@kc#C$Wiw)Rz zI{&F82>GdFa8x?VJ!+?0dVzb?iSE&B+;NlLqbuDb=bY=7Hn{UI0MSKsMB)}rb4Q-p z;uhTv%(*z^#A$YP7jo*WC()$7rUp6pNsC1`RxT9*_np$_%Zg*;f zI||zxwXI)<-2!dO@7}heC_l00xD%a4Q{2Ox&9&~aZSKUF28W$o?et|fx)Vpb z$2w=#y2Dlg--p~8dOn~YY!gnNiKEUAP~li)6PT}dCqDnq6j~Dh%xaiJ3vXu=4$^Js zhuS-ONjoI^0w37k?H&;wr8Y871uac(ABb!tiK|4z*luO?xmvgSB)780t**qpSkT(Gmn9`@fN14?p+{VSjm$GLGe?4#c-CBuKigMpr} z_Uwn@Pq5(#0Nc6#|2kpKX^0j~RWsJlwdp&QFEBOGc#9JV+j#?H3Fg`FZ!5s2xCG#E zckp&L+qrD3J}2IvSqV=dA{wwqr%rzr^m(5h}c&|2KH zX4faM2Hzs}tl6Rb$Y)KT$QoL|ofQ2!dFG@nTdw*9w*1>~%SE5s7OdSc4dF>_^m zQul=ZAFSzt|KWk*3`L6Mwo{fUbP!fBMA#yU>F^`mpcBzZwUleBy6A zxA^OaD^IBU-A47RHib`7Kicb|en0q6*YEqfeh>KShrqty)bDHl`r*niRsFtA^{X+3 zPfvxZ? z-yOdCVe9#*so!<}`r*p&RQ+zE`o&D)Q`C>P_Nd=C{?qlt`4aWN@B8Yvih3EH*wOmr zN`L)uxP)OyN`1kIo-Zzdiry`aP`c_g!E8#zviIqN;u)$GRxs#%!TegkyiF z;VyTqa~O_9oaRzMhtle;2##=Y$Dz=fNGnNN6~|yYM%+Jtrf8l1FIt@|xL}>-2 z&hLu0wsG=O}#zowysV<9gS_B^Z-??Zy6rVNiOc`>L7saTGEqBbuL%@FtN9z(=&N_ z_0p<^jhRLZpQcjUV|~lj15L>#smww=q{AX&J*iD?sm*1?ndwNTQ^9t^Rc(#Q4egCh zXC%A3@Pw0<>6V&@RSeI&iI%#io&_zWB7J7EErS=K;0xu{csINQw|6#XdV5lYUcRi( z>fDfQY;LxaNqU~EJejdJ;OVk6_$yf5Z#@^m#b0L#x(x*=|-%sS%fd7C05nMmMtPvxdHKG z$CF~5|4=C`8O~kBH{>&)J77xp)rj|`jWA}cm|DK-P+rE28YVD<5h^OsDcdXEUJvq zX-hY!Ng9V)bq`#Znr>Bhq+{Gu5_rDOLKQNocybfGfaeye>vT!?SejT>wIaTF<*MbR za$#4Zr?E4=v8$)U+7hQa!o22GV>?>jN^NOM;>ogJ6*H*7(o|z}sz)hB&w)*;1p1S~xs-H=)h&%Jf^B%9kdQA40C5z?M+ zZNm!}2vhaYXO@nxZhRH4v$rGO)3j&{qAP8+Z%Ss&pi-6STHqUFyn&}$8N-kE#TwgF znM|st6ORsdHl-{*VkJ@?-J}a`u$+44>Q=--jQS-7I~or`p#22>s-vaRGK=7|mGMRN zpdp@R?7#!6(xq^bhLx4-p-d9&SyR)wu`8=u2uC&EwKX**J5r5l^xKY9XNF?4xh+Hf z>h0V>v1}!`^qqBl5?YkQnp0b-0WmtZHg$D$H=?_DBsZcDS{Ux67svV%tq7cE1Ybru zS`UF}T5D5VS|V76UZPB<&FIlx)7jmd;b>#`keAiq7S#HgR8wmwhV7OG_BCxSG_#m)YaWr)w_j_nKsSqL7Oq8 zphu_M5r2FcWA-f7o6w0;9UD?T)FrjrSbBQ(s)Z_CRII7iM~K#A?8cx~Exu3VDNq&j z%olH>K@JoP@uVsbgb12dspi~i15KkFBcPXL8hg;{EOJ@n2Hy~{09}yBSdgF>h{3wg zliHrPZVC(1-i#Rufs9EcgI988te|Sf`sy2dIQ~@hBwO0rL5e7#&a7rW>d`NUW-3P6jcFeJDoz(C& zlEGtmpfLfYnlFXHD3xqS zgY-~e;f|t1bfy>EK`pWYfdWThjYN|z`c@6Oq#GZLNcAl4!CH*xw+vQ1YAA+sbck|^ zwY;IbsTGT%#!OpNTc(fNf+v&g6;yj$M;nG`8iVm@GFDb>3RW@~d(n!XFF zwV(s9N_Ao!LsU}D^+=6tnDM962Uj(jH?m-*xw2Oc=lTkKF;n>hRaFmJZ`_C)qsdnE z(onHnJ)2IWyoS7?BVh(PG9KI;5yE64tDH8&YdBop+?Z)Qm5Xl68q{pQoph zvAX7JRM(Rt5Q~>pEs0yyg)_ZrTC$!6W~N-y*r8qK8(ESID6-kRzK~JzoX#x6AkE_l z`vp~_35%Y=w-BD2+Pa{J+hA$+bmD9E7ACk*lO`Mu%a{e}jQ~ZS7q45Co0Dl;@lrD= zuVHC|e;8gdr8Uvmt=4LWS50t`OzTf{Z!!&>)coYZhJ}li3xUG*j>hh8BH(_Y;uw=J zZ9vkkO^uya9eyEfq3Hv7b9JAaE`1KgHCy_8rG;v_6vsdhO{&^hIN%L{ZkP;`9D^5&&SoJ1XfxfFJrPoUS^(bwdf}E!JI^EcxqD6?ICzVe1Y|{OF zp&HhWn=I@+n-$9H_Etl&HA@z)NUm7akifF74I`Oa)a11eEe+c?^kS&6n$sDzeNdxB zvzhsu)RuzYkWn>)wbkui>6Elwko9J$$F{Js8~&tKX0i>_F-1LXF^uu-(5dK8r=u0w zqqDpru9db}eafaFRhXVpC+()7>)6L}Pv>`8;6hO2Yj+4^wdc^g9JMxIQ@x?ON5VVa zxJfFR=)(FAV;C@jt);BRG>P2;rh#Oa-bd>lm8q#wsK#W{juDwgQ)G*~+EpB2g}B^X zqWe~fK~?LK`H5>tLrg2i4y+yYPJGr3fD-u>L|d?t2$IyQHe+a;&fblUO|-LDbm)tE zn}#hSz7!1sov9WyCcI!~0U7|Lz>T-0r_nzKP4g`@=ryzKSIb~d9p=|^Ju8v~?Y3lk z)sh7gW9jxT6&YMs!yg6%K7>dnRUf8md+$Thjy(+r>Bc^OIzE`y*x8wCmq5~o0&KAf z1q^~6Gyv0hC6f?U$6MY(Edo+vWF@wYY!o?SG0vAT2dQ%=IG*-z6kU1;XS$x6B%0b% zTl#3Q#}NcATUxw|4ZE2i&^y!(PBiTs{ zGXE?ZCzqkcWaEoHQA+m1Sj^FKJWi|X8amyaJa(czC9F=hSaloD1=1g7mS%|qe@*`dK4`fu!Lt( zSlyhUTu+lKBC;)KiN<70)0?D$jPRgwfE-GGYr=R&r&->9fyNw|h7Q23ThB)eWG~`F zpK?fZ5LtDc7>qipi%fh?az%}ydI6A5o!OhBGXjcQJ{&=H`>Q-c2W|M$x;k7M$d5Z0kv@DVkla#~N(x5$l`r0&Ft12{SoeTpC-oa&gVF zMFg*cda4LO8aSrS;*rBUPg83WocmPsUI5LbMOS%q9eGHdOF>LdC#Inu3*s)dUdPf9 zQ*ZwHE^D7PgSDgGHdDK)_cSpQb?ajwj3%;vj&p0v!k_k{O}(@=OZK$jm{HAPZJ35- zx!;W5sJ3tDo3wnR8XJEjzOXpK@(L`1&}R$nzRT-?Z3FXQSRt3vX?o)Lqi6 zO|`E!dZ(inDiUICooDv8Vf9QNG;1#AUe?xm1_uz$k+3gA6D@5*kf~W=0|q}8*c8O- z=trF<&@GN`+&;=!3sdcxMlF~iHH?=wclBZkXwmM5?lz$Tlf3K0$sP<5ydI)E)mZ?D z;#jJnJ!#fdtJ8Aes^|uW3>To^oN7Eny}qqa5-=!X1(?Appqj(5rfzJ3sk|u4j;FZZ zi^lrY$qlc$QBmruflYxej6R1{8)QBal=C%=khq~^j<{*==<39c6xhhSINuzJT`n%k z2&D!itUs#t5t5FurnaVT9urJVY{YU(z0J-IHr*SkmaM2Nt)4c!6rX9BK4n_z^s?#G zr%jtat#l&J;Yyb_X86M7*~gSl?#T3ZrYbSp;2@_7#m1hd)=GS4Ve+gQrITAqC$Bud zbn?c|uE`iu(ETQNArR1IHUk-}F~=K-X|?9z6J$DPUfhU}IKZoPLk5+=2w=LMnqadw ztvY&CA2M6DWHa6D^R+71ljC@!IRM5OsGR1z|0bl;F=^4SXkZD}wOG9H%`W!3y4IoZ zCN}FMYU5`n$y@v95vcIRC`N{>p%``6(`wG}LDuDQ<5p=?syow*y)c4SAFIj6tc6a2 zh)d5uIIo^Ay+l^D$*SgNj@lsU>a0?BffzblyLxf6if+*2bfsP0CL7|Ys*}AO;r@pkE?8U8N*hzK93p9>;`&PqxR0gIrLt#K zX{2tRxiHNka=ei-(B-sFOZCt(2Ug08yhq)n&d}mXF9cLzEJ<}?7{E9Q$93@96XVD- zeRSTWrWb4yx=$i4wB$N|y0=-Q8BPxAs?1)WIx}q63s4xXPIgR8;CmBvG-=W2Pm)b~ z_~PM;j-_P7idMnBCJb5h2@5^U>akTXe9T#&K8dFrw3{1ou8E~fGaV9U=*XXTfYLKy zDjf-{13}aT#d2>-;_=flEz(^n z<#T-qp>Wma0F5j&ciubnZ446`Y8OI3)CD5{hE?5~Yxdn<*6l~lsUL(;&o;nXbw_6b zErrxFh5f^4p7BMAWKCj`x>rqc>wEq~ce)xn7s9R>%QU^g0M*j=v}!tdgIZ2K1JKyJ z1$zrRO<2*q#ZtAQn;{$;G(FU$YdSDTW*V_ar8|^VA-?sDGh_V(1WuOQ5w8%e7NWGx zqk@VLs8mZu9rh^jQIWr0F;987xQ#=qRD7$Yi8|P#i4F28;wWJC03wU=8rezV5++ao zB&X@I`cS(@*rjebp&C8<4!XWhcci34q0VaPG9wx5BpS7H!r_na^j-^~Jz4@0i}@2S z$JD~N8})r4HX4hscojE^8V$_0s|^+E+Nkwr9V@DH7xmCV8{H4bX>kuWQ@FF>ZHi6Q z$>_=hrao+0xj~(`;>izMg`sh1zpC%U^yrly?b`Epx_bKcHl-(u@h}q>1xeh9!mVNq1iWtt zBL=L#_V%it3@uM-yusZEnaR8G2n}|&I50&8+B(&oM0+Z9h;EFrS)G7(W@&XVS=PO{ zfeSJ^Sq^p!`lmX*;yXC#mNcxXalu#9nhyHFk-x$887WN1erdMq`+E3k*UM$v?dsi@ zS@B_)uiBP2sp{^Qw`-$48#)i2o>Sh`2p2)SIkD7Rs70$*tz6}|!Russ?ajBe=^+HU zhK3~O?k+rVL5H*1!9#0&-lC&Y(|ikQ6~XF1G#Nclg(Xs32c|z*xLn_z!T_L{)nN(7 zA+_+(Jw!DRO|no|lh&KQxPB-O8+INb=@wZt8dr(uXM@xOP1$#s=w=x$r7=VZBPxVR z4MqX28UWoCPiF9Cp@MGRQZrOb=^Ns>-O||HCwKVT%r5Q(Z@yQXOcml*;uLlNi)upm zM7?`bM)pD_o4lIa`SNzGNm?nTu&t)^L_TK4(^`7_#R9zpejd}%+w@8r>ZxznEaaiH z8pkfGZxf+RKYDIOUqDyW_h!@xlCievAe8xprbD>3Nlo*JSo(OG1#eP>n2M+wm$tin zav{%M{BTvRsz3QafvHq~ekq13GX@*2St+X{M!&NQx zb9|=Zv(97WJ_$XF(3Zi1!+fI7-=EXy;aDF-8lL`w89Ju$R9u`6xN(|<<7B$swHd<+ zeS!`D(5h;Msv~KdYV9*pDX+WI1jCO$#A$h8nnyn!v9bpXZE7O&$bPq;XETQz8~Ts7~<&1U+C}8p1}fo;_CCo z@h5aOGye~9_@E^lak?=kCZH#9?XURiyB?K*o(I-uNjHVRu&Ko!uYi*cDj_C+-$NM* z4A}P7Eb3;?2V3SR!FK0T+Z|y0_)YpdY;uox54*P*28{gO0R!3tj{v zgmO)>?K_$IQO|JsJ+wTfWOyz;3>SJ4A$h3bB7=T2hyGx=$WVq0UIYahP9K!C&fq5T z#lw4ydY|)%RkmB;0RjU443f4VoKeHqWdbB5-l(pYRjU5S$MHG0tvUgh7*t%qrHmS6 zy=&L)meRL8LIHoCMJS~Nxe0#(qX3~x=|B8U))~kW0tzQ7PUM9G(VxalKQqj+e6@KY zhcEat{bJ4|RyRZ0nb0j@^Z}q#@gWEiU|T0=b5ecrV=s)nh;!&E%QcX2xxD`J-eJ0Q z2j^%k0iQLfxPZ?wN;j62P93ggpbZ4PmQk8eN=J?`gnkd z0sYLunsu|49j5d7oTKIf))-V=z$Qj%lce;7M<`&;;aY6C?V@<0VNM9>XU?}Bb;W0> zg$%P4fkp6{@7!U-%ggTvWkjzYs39L_@L zGMx!$L5P6Ra26Y{VhK7*rSx^if?YtVKzKNdNb$X|89e5&a9+h4w;0Va0l#cef#EFb zwi~jTfTA`uoQ2@OnHQCN?ws9Hy350eVNg72T#UnhgXs}<0-j+|aRDzforK&Y zr4Kwp0n?xJ$9<4`QM}PGCj|5}hlR7Si)9qLV$VcYPB?)@W^g$7uo0i`D828ZFEG4nkw(@p3Gztr|_!z+=pm2syhL5tvZ*h)IpMb?|jBN#m zt?2m3;}lTT28OL%Y%${VYUR1O3_mGDf90HGR26WwLB$1ZV3e+|ly3J31^i(ap;nRo zzbLLW%n1Sg%=uyHSi<@PW{p}yI(k~0c4sS4r#A{E^ir`;Q%BJi;Bm|9WJA7V>JrPf zh04qMay{o1>;j7~L-!5Byo#Ak4-kY%2baP9o$|Dr; znJhw|IuB%uLc^R8(9fLT+*lJb%RbJ7Mv{Cg1VwY>06_uESe`iGGxCL)89pS4*J8#O zF#&}+Fw87#9CI9NT+wX_T*kQ22omO_nb1U#AVfky1ko;JG4qM77|8^Dj4y?l%~61# z1){&9p&Z!Y|tPg3#aZGkB=QMf=ER7W&d(3n+=U(hF zLL`L69+Qc!`){^(_=_B%Z<|1^6Yw7f6&H|x;*S2b8>KXkvG9+8Em?$`Df@p>{JPPS z5YW#Y6nnzj$V!4^FP93jm+3xZ!vL`-9O3}Po`B*2R8c^w{m1%3%nXk`@miU2WK2L| z4v9URIR+b7bXx+8fuXS{%u!}Gu_p+T5E6SwGoRRs*c0$$%+{gM&HU$a4u1=Hi9y8$ z+`}mCMk(Fq5eoQ07GZYOWh?G8%n1Sg%t5gyHowiR!LgT1rD89$d4Sjx4spO|y0bAErF$ZLSs*uuV!Wwdx8)NA+h&E<`Y{Hdjfup**XO7 zr->VXPjU`_3-}v@iVOG_qqG~PG!pm6=nwu8u#!>X{uagmW3(g$^fTwjo@M=uSq?XP z16I?=@x>DdBKiYM`V;42yGx;amFY|?2|@$}w37A>{ol>!L+6=uqB;S08&q7tJ&fXh z&ZTEOLII!6BJ|XGkSOjm%n1Sg%=x~K*uwfGv!Vx2Z)xiZ>%oRzDn|X6S*2nK69I$k zD7pgs+jm*o?WQgPjgOzP=F8V}PAx02Xbta_%yc#9rnvU0m~SrV?s(BJwgFnvIz5(5`rlT4Rb<3KXXt_2x}v=A|}cPiV2~YihY_o zimt$zn9GJNGIa^`_&C0NEaz&0%CPt{G$w@kXl5`mAqbHW7!zW?BGf9f{};vA8Rmq5e&(Q<5Z1Su6)}-+YYRPcv4vhL z_G#)Ux&mY3aW>>vrY?aoaT{O0i*t$zfyI}hF(J%9WM&f+f)ELTF(KwlK446gvWjV( z!(RffG^n_MF-GZ_kkW-7p@0`<5oSk&E{Wn}40A$2KXXt_2)5V6lPQaT#Rb3#BrbCBl$$1KBGNl=s62lGYAgNWe0`&rf_#*8`v-(XaD9fbKY z!<-P%&m2^TUogvyhBZI%?brFD~1RwJuUz$+LPUI$@rH_QnE{memi=wOy}4QoIhF6N7pht#2r$;yqa zIss2(RCpbPd5&RD2#;m=gl}nS(W#GSfuETqoeHkJT*9#~J2?fPUs6&6AmBreSS_8$$l(Gf{&ft`o4) zpyC3a!zk@BDfN4V0?x!QuhU<+Yen%A!<-P%&zxVu2<{ULa}le-dZ;CEKh_kGRSdh-umbxrT-M#U9617|%I+j({REyyuAfpD|922`J3yCb`Ch_MBg{n3p_p0(#== z^TmbsoIkQ4*Q=a>p1`#taGpmcpfqe?&-o%t@8>+M=Lp^9OlNwIAVk2xJ!d@k9L_0j z7(CCQ;sWks6!#o1-R2PrSjR?%Mu@eZnOY2ULO?%rNY7!WNvsAvqzT`~++EIPks$a1 zdk)KzYJWx^5YxElZ62Y3b!C9G2eCd1%k!>z8xx^_(051NWRGx#w_Bal_zw z1{D`@7o)i6aOpOWP{2C2Av8j)^~}^_m=gl}nL~OGGfiSO)I&O{=Wtmh2!6nx!?L8> zpOFW|H10V$hK2gY9>|BxcYo? z;XQ{1xnAW2^aQRIf%7~n0i|Jsdk#zQ=RCCM@b$|%_j*o_fPs6?5!`b)r?_G8JcEi0 zxQkKTbGUSyM<`$&+YlNd)_P`YG0X`8{mdafhnXg^8uXABd=O!GIhRF(;0NqEEK92W z8F@fVs3xbPvBY+IM1UJP#QM4=dkpC&O>_+U%#Alujk|l7`W$*9iLILa8hR_JH)-zL!VNM9>XAbE(%ruGBpoe67x|?>Fb6F$^e!!l?vZUId zkq5*y?m0Pzh5E%F$CTqar=G*0h#a8ja9y4;PK^mD%+zyoj0x{KEaoLooPeIV`h0QW zJ%f+Gx$HhS0Po3hRmA&|p-Lp@P)Npc%6_C&ZKSrQQsy0C9v#jatlaq{ZrtO}>mMk&8nYQ~}hWmZEdl{C-3VOFn zDv+xO{>fDXRIV1Fa+L%+R%;O*wI;OcM8{$_6~kY?j=FpuflWYKM90AXD%($g<-ZT4 zYm(#|bedKv+a2R7Y&0!Uw)^W0O9g_Sv=5dDH|7ciDpy{pv&Fy;&($I><+(avT&Q0~ zpjYE*1J?Mv#tYMS3p|h)Fz{PF{97+ppA~LBalXJDpN!Knd@}L|jO$cy5j)6Okrab2 z@K7Mk`Xj^MW5Yffr(^g&Fs{h+7#SvFy%}Sj7$gf5+sa!<&`RsmaUNj!3QWE8#9P(` zzBq&Ph_yA#Gg1(`DNJ_&=+vj41R(;jWD=hId@nf~e~)sG5m3OV4XR$ie=tff0HrjG zmrMu%0rxN}eCevyiu%Wmu7rT16B`NvMIlK|?3U8;MtxjBzxv?C?@(qMYnWpK3UlDL zK(7y{Fjpn#G_VT1)JTjAxQtPbm9}@E%mq(PT>HZR|F}G&ybvbxW0*{Iqp1b-#GmFD zEU=J?HQ>y!uyZ&MjGNzZL%qUz#5zYrX5~WnBGVlJIu)IQ5CH*NY)h;Y2ksY9A=cXk zrAHN%9-X&T3zC@U7RRXdoRUXmTc6Ksnmi)M5P81LBhv0#&;DuS9Q{wg?;2EG!0$0? zpl&4+yA69n!1E2NPC&oJpq{dmS#B|`frH6<-heinjcA>KH%4_$2eg^lIt+V4zzYqk zPC&oJAe$|=^*7A=CnF*z;CluYpThPX&pBdk1A{FdY72u~Jyce_bKzl@`;3tv6ON0* zIbpB;d*%=eVTOP{WAk*{e`Y?9D6oNqaRjnZu=r7tiR zgaRIMn4eHe$1pZvWuVE$np=!D2>~B6s5${foF4wQgxvp+;7S~ADiag1&P3zDNaRxYOGkdE}t`RnZOZlxWyzyjeuej7L@{i zdh0yS{qdc$4qsc7Fj~XDqiIs$UgOWT0-nz($2xo4ZYg}xqtgxw`af3@+#q^9%j*S{ zIL6NRmTlK?Fz@7CA@AaXw1h(DDz+`LO#}y=eUdALOqwCMMZ(4VLL-+*mv^&|zGi$C z6YzQyR%->^V^AjtiTgSWdB~8(1boz>0y#-qlu3q}zHy3xKDX}(a{G>L0dC*1EyzZV zD`8!y8M6`so?}p_3FuRQWsv$SgVbLcs(vhM@Y?=V0eza@Iwv5$-a03sqHmoOUeTjj z*DA5^jGMHJG==zt@ zRVSc0*R~o26!o@sTCSIY%Jnf&xgL%fg{xU1I{FXt?9*&*OyX%>m#=kQzShvOo5YGx zsS=Hl0)NkRp*jIqdV|!9=d9v_XHZ?fL3Q~CZLYMvT&>{USZH3 zXt5y``?3+WHdmXY5aN8%jY&*&i6Wpxm&^}9<%-kGvRrY9uM4*23RK8kkqVhBR4*X| zgkBjW^vZ1kLi0y7y`PZ^i>FYfd}r5*4@7W4#Rn;)bH$-L=b8al9H5Z7A{8>X;@X=5 zLcK}DCv?ZQ0HOIa2}QhwvE&r-0!yIU)|y;3|~ z9&K;|r`5J)pP!?GPF0viSc48)0y*pRIrGkA;Rzq_m8KGF1eE$A&i;8$u0V~ZaW!bOsMUN@kP4|uqc#R?J9wzV)4KASDsV*>`DP|dg zYXlTsX!FaqIrCNua1MCexH=uCS}_5=D#Y`}>`w$Ojk zh|1S#Z{v#|QDE=!2SNcC(1Qfz9}0j!;sTEHs019%sDb*KWzE+sFl#C2P$S^U1{D{u z&YIC#l%pVKPA-hs5lK;tK zXhaZr1Y3qf4FP8vRQyB+PxDai3|_)H2@|;Aki`TPI|EKHV4K>Uy~t)AW4P<{_125t zb3H0id%cI^Sjfpl@?=986L7Xc)e9)f;gTFVs<@XqeqcE31U!l(cc5k#_InI_Lcm`b zRGol+iTTY8dz1(Nml@wN0%8LG)1cxJw(daAQ9l6>H>kYM3 zqh+jphOwefz^^lEAdd=rrD0D9SZh#q0{SI}d$fre(?&o{z^w)q-_GEd3@RqzE`tj6 zXe(b9p=b*Mee&}?nqfYVDA1#Ond}Z@MV)}-3$@g6j|%gT4Rb<3KXah-toxbi=Y}~J zWsL`M9?-9BONjg$@_!v7m@e27QCG@p=^0CbMN8<{a)kL%W;PFA3PL1=Ja}nYWz1P) zYF#Jbm(9{HF5s1n3Tu@+SjwdyYhG{|#JQi-;ANa+t`qPogNh6IEkX=xFZJb@Kktr^2Jz zr>toR{xI#QHii_6+5c>U4%t8wa=w}WJPhl0h;PA|)(%~8Ws);b2UrHrfYQzK- z3q!(lPN`zB7I9ADDX^Fn8lJ*j#mpu=1tAhb!gCAriLLu@wx#~=Xa2`HM|cYOD}#y) z_-97x@RU-?I7|J(KLV~{RQTvAiuV~U2?71g`C(^UqBrhSl21n_38k3jv(V2R6rRE= zbiv`7OQplJWw-K&?>`zzg!U5~Lvn=a2;=LRfMQ`tcs^fB{Fe1fsmd%0Pl3gx(C`%I zKQOZiPeF);knkMC=8CNdPXPxoyGdJWUBvl5&gDlTxo9$Zs7)S(n$J5zdFDwTLXro$ z3?l>c2Wdd^1zeVo3MIHK-*!2d%kteB`RI&%VJ268?%Bv5J}{88o?Lo4Bb8hZ7Ue82 z_k3`F`G3X7e7W@U%PW%4DApA6t0(KZEWfUj%U{aR)5`O>@&blDHW?eHIpkT;Fn)Qs z-sPuFi#gAI&OVo49u=2-F54rIj?1&@lAp+O<*|EtP+ju-`MTt}`s5L6$(vc9JW?$W zXiL79<;er(^0c<(d-=NLx%zS+r(Vzgl&6w&>2sft7XJ%hF8y>k2;#__jshG>TzwxtA_;L)8pZ1XaWu}v#9QiAkbALNSe#at5oFzZk zAbEy=jzE4!Vk?((e-A-^n;=)7{7{bMgT`nI`8l3qF6aKPjQp-mt~_}#ua%!KkY_9Y zi_3C%T%JnIKTLlZ{})-# zWt_|7WVdkn+noP^^E)~J73aU>{4bmr^NsW|oXbsqxu2hVD?iNM&)P1rLmr3_e}&nV z+kUzAx{&L46t`b4y&U$)A;DhW!K)^9`KKCoeKwmQNS#;j(-cK|YBf z-#^Hce9Y- z`Q$S~^39+;`AjF@aNEFT`G8x7%km+vJzSP=e8~sClwd;@nTO8{roD8U(NJi z6!{A@{z9EuZy+cCmsM-TiW%)!&gL&!fb z=HSm^e5_W>IhgCaN93HO@z1c{{}K9S8gUWh-xT>d_)$@|XL&X~y;eo`SSvLCI@E{$ zmN0(LDqR+PS{Z+TT;q?Fcwqcn35~x_XV!l)en(w4{^yJ@tIx*2!T5cQm;N{eCX$`| zR%?2}PY`@VHh!t#*JR^22>z68JUt1ayb1Q`m&(;VjSorR)KZyX+A=L z6O^2x)+0Id4m~ztTSr*?a`5_jfWg*_8?)ua6#Z~B56acG3Xijs9fHw$5AYESL0XoL z-vT_S^ZqUm!CxDK{|@jY@}yYSy&?F=fG-W8e=UT5P+_p02Lm6Z_qY)H>JWS~M9%3U z_)LhLD?;dZh2XyvBInK!`bR_Xe+9o@Ll9hW^TU7-cKuFQoxXkhR?SAiAIcQWRM)9< zPMtb+>d{@_?1mOSbWLMw_e&N%U$@Y|ZPD|Bh5oXIe%?aA^6h57y~{$s%|gG^Lf-)0 zB#;SZx|1d&QffHR+96+z_o zg1F~J8O*|Ok*98)Z6|3YeCdW^qNsy3*$zS}dNOzOJQacGiJd^6gsAY6*bnj`i3@q= z3^KHq!yu6j2ZJO<4;;ajsdRl2!%830VUmgv&X^GAhKgzzT5`9G_LJe8VKZt%V}UD9 z_JdrCK?2)EE~A0OKPfv*<%GnZ9nVDM=4r4ivc3!H2|+fRyBYY#>OOjpk>3v8US?z< z7YE&8j-a3+VRfv&aK22ly34tKXRo?F2aPqPGKPgTxM~a$yVA{NTSbA>j57TwI-|j) z^YWxSsvEwYCebuC8OX_y;ns`B&^h6wO{YCtMAiu+Ip1zM2zGz9xwe&4yWL?B`W+5f zGOH{o!wLqNnrxR9Mvr=ZSm@?~7vv)&1ESdrEwN{cblb2+(#;TV5zPzpykRHkAc@>~ zxb1orqvlv+zQmWI(R5$#1fGQXZe|WA*bz&QCa}l`t~WWHY|gHlr*?*1di@x4xo37@ zA&xObV0&dy8Dbk#%9De9h&8Ytgret0mLbS!5@Y<(g?~e;mr5C9c3};~s%aXsGA@Mc zy8|qJwkf9;mu~2KpHPd7QQg!MWaJ8mQ4qVa9*FUJ><$K@+01S@#G1B8KT<5Td({^T zc&RlSMH=>GP|n=8nk>4qy0I|7DmIpvx0X7hGrzF9 z1ckKSWBoiH2Ob z<{ER257Dr!tsX~z?hbs|)#|LlD}0E7A#{Z4&=yUcD>6S;>~WjCkF<)T0NPsG!OY&2 z8O}Gd)2DL)2`oxF;*8hmNt>z3X5UT8>I5T1{Wulfh=`vZ%sJ_0p^PVn0{V76 zahHop55)<&g$T40tFls6c4lLk4~DrO_zClx$*^o$4cJ<3yD7RSMYg%Jpm%&SR8h+Y zV8BNALglBh7=|3QPUk{G`U(4oen{u4j?pKe}qCg z&^)+X?hX%DCs~sbcovc*EOauDvTN1t&atsso_f)s=DxD!3{J!uP5EzQOL>ome%TE( ziQyW0Ip$d}qOB3@Q;u1xoU6UX%MM1a^hPV5@b(5yIog_H{^1mj2G`WWq70s!P^y_* zi%wLWzbA}`ar0?UwB0n5ogrQf1VwWP|G4Q$tYZpln_=WQw5VAMxQSNg$45+(?W9AN z)$0K*4XUq8F|8hcb8W41u%vP7xW%-q^^nGMIc^kquqT0H{Av`fDa~CRej9j~rjxg_xae7<@~YMF zWp~(vYB%oT%}W;pTEe-i+fC&Tm%<>H{0zVGBfT#O<>@ z-#^EwBl!hlLV8@ohB!Z`?{`R^x>lFp1&!>|Y~%ZoSrCyl8c7xKTVKnSWxD>U%Fk#y z&L61>X!n-ics^B=XFLSwFWy=$o=YGwubN-WN zO)c%_@?&_Q{qkRpUM%QIf&+?$kt4zgrF%kw?n^Ouo_NRfVx-&OfD4=eha2UOlxS^1mo z=KOc4smho4d=Dy-dw5{92A1RewVFKNuipP@CGdxu|7Wxw&d%e3baDR~hja9cilZK{ z+%C(%jt8=TmI*p%`9_USyp%ZqJDzcMTc-B+)#E_7Kf{cgqaJ@(qrS#ca6Y2Pp>9{5 z_k9-mb6S4=^QCFULtXv@7WsF)TXDXGE81$R%OA1Gzw%zi`NI3F($jri((?6wKDD6a zpS;a1uWB8qt>q`V9A_(19G}~ntYJB(-e-~j%^wx#&ua@VXMQ3?c+W)=p zfqf6`dtl!K|8E|keePQP(B6QL)J}HGGlz0{WAIekoY)fCm`HJ_VD$hj}O!TuB{*y4obpO9-p_A^JYJ>Xu%NG9c zz!4^U=>6N&?)}hX;{OL6Wuo5+x=GJlFc2pCS&N>5Mb9@adS)$pzGC4|;RlmFS6SM9 z$l`|;3;$m%`cGKKr^nc7UE-za8 zb+3i~TT8o#EOtI-Y4?|w{yuA=e-HgK_4kwDH_@-Q@WUKu20!%_S^RdFIN!AN_h}et>KA=RFwyDnCrtWZwX{29@z1N4`2Pa>WztWt(Enr^ z$M?W~Q-2?}*x9rA|DeS`2Q7Yh(Be0G{WbOXR!h4tTJ+yw@dLrtP5u3`rQK7Oc5es& z41VhA7nXi4gYl+1Gs=%z;{R?-zv%CWO#V4s#LqNN@Sgp&?}2>}?0aC}1N$DhtOpDm z)IRBd!UOuVy~F?Q9F8GHx<-Ew=JI)*6DV={pSp}clTc|^Wqggm_oBte161*SA>Z@z z_vP!gINt~AYvuC$^A#U`fT+E&fJL1V;WCM5A&km22CxPyYh{GenMOJ>6p3o4kT@V30aF%)&J^ryjO9~c zxe9O+D#o=M>BsmR!dz)I6PZ`Np1{9zHDTik2NX02o(-aa8fFK1?8>7kg#6p(* z3T=coOG*VPR)OW2@RtyoMj0tpHJlcR6*Q^BxoN0l1;j*7EU}-2NF|6CkdBPhQ-G}r zU}b4_9eE0X4uF6ZXJ%mBG;|Q-RspI(P_ay4A(cH9C}zo4L5P7i1zrTr44bP_mkBNi z=CWUf5mme?OsIk7N*l(YJIyqOyH#Dn;M72RQy9P!#m2Z)G@>!K6yFngNh6$4!;2^S zG66Q-3%fRrwydH{m3s*Prk*B|x>Zzf1$0_MKg}>d_`CF89Y0&GtAagMFpOciC|B`> zQ^3O#)Tl;b4$(aUfz=q%G32onfCUABQ1y2jpE>qr0Xb#Jw*lu}@rZ)qhCw%k+POxS zH0B(X26=(frt&P6J$gFqRI%YKbB8>9M9S?C9w~$yvyDTCom)0GTPv;ggN??)L4ZFe MJJ|rY`b+$O0iYm1#{d8T literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/PIL/_imagingcms.pyi b/venv/lib/python3.12/site-packages/PIL/_imagingcms.pyi new file mode 100644 index 0000000..ddcf93a --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/_imagingcms.pyi @@ -0,0 +1,143 @@ +import datetime +import sys +from typing import Literal, SupportsFloat, TypedDict + +from ._typing import CapsuleType + +littlecms_version: str | None + +_Tuple3f = tuple[float, float, float] +_Tuple2x3f = tuple[_Tuple3f, _Tuple3f] +_Tuple3x3f = tuple[_Tuple3f, _Tuple3f, _Tuple3f] + +class _IccMeasurementCondition(TypedDict): + observer: int + backing: _Tuple3f + geo: str + flare: float + illuminant_type: str + +class _IccViewingCondition(TypedDict): + illuminant: _Tuple3f + surround: _Tuple3f + illuminant_type: str + +class CmsProfile: + @property + def rendering_intent(self) -> int: ... + @property + def creation_date(self) -> datetime.datetime | None: ... + @property + def copyright(self) -> str | None: ... + @property + def target(self) -> str | None: ... + @property + def manufacturer(self) -> str | None: ... + @property + def model(self) -> str | None: ... + @property + def profile_description(self) -> str | None: ... + @property + def screening_description(self) -> str | None: ... + @property + def viewing_condition(self) -> str | None: ... + @property + def version(self) -> float: ... + @property + def icc_version(self) -> int: ... + @property + def attributes(self) -> int: ... + @property + def header_flags(self) -> int: ... + @property + def header_manufacturer(self) -> str: ... + @property + def header_model(self) -> str: ... + @property + def device_class(self) -> str: ... + @property + def connection_space(self) -> str: ... + @property + def xcolor_space(self) -> str: ... + @property + def profile_id(self) -> bytes: ... + @property + def is_matrix_shaper(self) -> bool: ... + @property + def technology(self) -> str | None: ... + @property + def colorimetric_intent(self) -> str | None: ... + @property + def perceptual_rendering_intent_gamut(self) -> str | None: ... + @property + def saturation_rendering_intent_gamut(self) -> str | None: ... + @property + def red_colorant(self) -> _Tuple2x3f | None: ... + @property + def green_colorant(self) -> _Tuple2x3f | None: ... + @property + def blue_colorant(self) -> _Tuple2x3f | None: ... + @property + def red_primary(self) -> _Tuple2x3f | None: ... + @property + def green_primary(self) -> _Tuple2x3f | None: ... + @property + def blue_primary(self) -> _Tuple2x3f | None: ... + @property + def media_white_point_temperature(self) -> float | None: ... + @property + def media_white_point(self) -> _Tuple2x3f | None: ... + @property + def media_black_point(self) -> _Tuple2x3f | None: ... + @property + def luminance(self) -> _Tuple2x3f | None: ... + @property + def chromatic_adaptation(self) -> tuple[_Tuple3x3f, _Tuple3x3f] | None: ... + @property + def chromaticity(self) -> _Tuple3x3f | None: ... + @property + def colorant_table(self) -> list[str] | None: ... + @property + def colorant_table_out(self) -> list[str] | None: ... + @property + def intent_supported(self) -> dict[int, tuple[bool, bool, bool]] | None: ... + @property + def clut(self) -> dict[int, tuple[bool, bool, bool]] | None: ... + @property + def icc_measurement_condition(self) -> _IccMeasurementCondition | None: ... + @property + def icc_viewing_condition(self) -> _IccViewingCondition | None: ... + def is_intent_supported(self, intent: int, direction: int, /) -> int: ... + +class CmsTransform: + def apply(self, id_in: CapsuleType, id_out: CapsuleType) -> int: ... + +def profile_open(profile: str, /) -> CmsProfile: ... +def profile_frombytes(profile: bytes, /) -> CmsProfile: ... +def profile_tobytes(profile: CmsProfile, /) -> bytes: ... +def buildTransform( + input_profile: CmsProfile, + output_profile: CmsProfile, + in_mode: str, + out_mode: str, + rendering_intent: int = 0, + cms_flags: int = 0, + /, +) -> CmsTransform: ... +def buildProofTransform( + input_profile: CmsProfile, + output_profile: CmsProfile, + proof_profile: CmsProfile, + in_mode: str, + out_mode: str, + rendering_intent: int = 0, + proof_intent: int = 0, + cms_flags: int = 0, + /, +) -> CmsTransform: ... +def createProfile( + color_space: Literal["LAB", "XYZ", "sRGB"], color_temp: SupportsFloat = 0.0, / +) -> CmsProfile: ... + +if sys.platform == "win32": + def get_display_profile_win32(handle: int = 0, is_dc: int = 0, /) -> str | None: ... diff --git a/venv/lib/python3.12/site-packages/PIL/_imagingft.cpython-312-x86_64-linux-gnu.so b/venv/lib/python3.12/site-packages/PIL/_imagingft.cpython-312-x86_64-linux-gnu.so new file mode 100755 index 0000000000000000000000000000000000000000..185e47e51852608bde322169d256abcee95b9074 GIT binary patch literal 298281 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�n^uZhyKJgK(!|!`JEb!M4R4mA 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/PIL/_imagingft.pyi b/venv/lib/python3.12/site-packages/PIL/_imagingft.pyi new file mode 100644 index 0000000..9cc9822 --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/_imagingft.pyi @@ -0,0 +1,69 @@ +from typing import Any, Callable + +from . import ImageFont, _imaging + +class Font: + @property + def family(self) -> str | None: ... + @property + def style(self) -> str | None: ... + @property + def ascent(self) -> int: ... + @property + def descent(self) -> int: ... + @property + def height(self) -> int: ... + @property + def x_ppem(self) -> int: ... + @property + def y_ppem(self) -> int: ... + @property + def glyphs(self) -> int: ... + def render( + self, + string: str | bytes, + fill: Callable[[int, int], _imaging.ImagingCore], + mode: str, + dir: str | None, + features: list[str] | None, + lang: str | None, + stroke_width: float, + anchor: str | None, + foreground_ink_long: int, + x_start: float, + y_start: float, + /, + ) -> tuple[_imaging.ImagingCore, tuple[int, int]]: ... + def getsize( + self, + string: str | bytes | bytearray, + mode: str, + dir: str | None, + features: list[str] | None, + lang: str | None, + anchor: str | None, + /, + ) -> tuple[tuple[int, int], tuple[int, int]]: ... + def getlength( + self, + string: str | bytes, + mode: str, + dir: str | None, + features: list[str] | None, + lang: str | None, + /, + ) -> float: ... + def getvarnames(self) -> list[bytes]: ... + def getvaraxes(self) -> list[ImageFont.Axis]: ... + def setvarname(self, instance_index: int, /) -> None: ... + def setvaraxes(self, axes: list[float], /) -> None: ... + +def getfont( + filename: str | bytes, + size: float, + index: int, + encoding: str, + font_bytes: bytes, + layout_engine: int, +) -> Font: ... +def __getattr__(name: str) -> Any: ... diff --git a/venv/lib/python3.12/site-packages/PIL/_imagingmath.cpython-312-x86_64-linux-gnu.so b/venv/lib/python3.12/site-packages/PIL/_imagingmath.cpython-312-x86_64-linux-gnu.so new file mode 100755 index 0000000000000000000000000000000000000000..f64ac145b1b6f62fceaf03884480804954cb4983 GIT binary patch literal 156856 zcmeEv3tUuH_x3q6jLrzo42X)?P*G7w1#dxK0tFou4ey#ayx^t0kfM>9k*GD(pGUDCH>Tzd}&ELnKgmR>&CKLX+2f;r`D=nf3zc< ze|C|>(*~&iF2l<(tB9!9vU?s|II5_+SHHoUt)b^YqxFMri$4n;apLf}10Co8R-IZl zh17%)PU6OqrR5}$o?vO=SgUCp^}D8~xDzZvk)K4S*fcx&)`rkh7g7&WAJPDF4I~mm zOJhhAE{Q&x$#OK-Eg&r+tsovq8wf3JAu(JMAMH%#jwpAM`n6ccLpnn!4Ij2VJa7D? z(e7b0&bvN780M;O{n7O}Y$KpATKM3+ue&$d`PtzYu5X_Drh5tWLx;z@7d`lSp*H4$ zd52Mc>d{>nEhs;DH1c21qP%GRAFi9bKRnO%#Ut}Z)_Y{$-O#5&AB%Foug<#ONP2MI znzRU48p>~?{L%B@x;}_bb?wLc%ils>>A><4^lHFy0C>KF4KM>PHsqh$)@FxJ*pOjn zgDjJ8WB~gx_y>y9>@xBDUdDgzW$bk?6KDEm{9)Dt;XHI1|CN`qkGhP#-DT`QU&g-i zGWMLy*uTDvo$@u%xO&1)IbU&UfH+}VuvXGd)VRPSEgoriCkwqQbXvZLkbjxn5ePRe zVxrX&N)Kb8%sQ83BsUoZjp9( zZ(;vH9xpI8aGc2I!ah-~w3X7HCUxSkn1Z(;mT^>>DJ0HLg3QeV^p{ zX6gT#w7V%Wu#A-PBP7m!U4&in`2bYLDaWPwsUiJ0Tqpe1xM=&3e}WvB;-OgDV=D0Z zjVFjEoD!bh7Q$#auzqF^(#EvDMKXFWv z@k`|7t@=HWdgfV9@~fr)YtpVs{3`xo637=ypOu*-? z+2imzZT3`rPM9)>$}`A5VamjbSWTHeCj;HXdpcROXUxRs)LE0KOeEt>RhTwqI@D=n zv+icq?;W%3dh#n=06qzAJ~D^EoM%x{nolNsd^n zIFWY=U9FY<2I(Iy>y=$g5&j7k?1QAgw}QP$&MSrUMY}3kMT;VTt}@xJCi@zby}rr5 z&SaNU6W4Aq+2x_1?VC(?d5B?qk;$&kpQ&P($xi3VYT0M9%R?Af9WmMEB^}#KOm=m? zPZgymdsX%nA7v(cU6cKy$*#`dxtb2BScp$K<+5%!*<;xvKHMgIgvlOZvUfJwBTaU? zR!~c{$zDwvv5qm>H0}6nI?N9WyCt$WS572uFWyo<*66jmzeC$OmPZL_L?U9DwAEFx^V3plU<&w zv3;G%Ue6R~gUK#Wb+~qu$=<=_Uu3ekFxhvR>|IRueI|Pill_Rv-q2((G1=>w?4>5V zJO$#~GLxOIyVY{hWUr-+SV!ath4vv`6!|kUM<`^MQ!X2#P4*z+!k;lFyUk>eGude$ zQ%gdQC{cW4PDI&jvSY$GmNb(+*syBaFq6Hy$)0YqJ5Bb9wv(Xxg0QzhkC znjR&cE-_E-V|_pAbZL32i1j_B)2*vh8(7~;I$dI(TEqHVq|>G4sY2FYC7muQPvx-w zJn3}Vbt;qfCrPJE%TwvBKTJAZQl3g<{XWv^*2}2`*6$&mE-g>Ru)cuw5Yi)ApG!Jj zVxDrdK9h91v^=Fj_ZD;=o(^6LYy)T&e=(~js2V*=P~|8uab1%GU#(cK;opKB3pzHY zRf|8od1c-$XRr5exoGw3JG>wLkrj>rgGY-1_VSX6u4|Hf?P+`DbUg_S+U!7&rM(Lc36bt@_*p8Q@Bi;Cu_rsj`{OU)k= zmmIr0e`q-TQ^s#e$?s6yH$Q0WqW$wdu|?89F+U_HZ_m$1UEYuK!WYBWn_HyEZ@u%I z#M~`(h~E$Ki&Xrgl>Csb=wl1wH#6erhcEv5 zXkPeTzQ|`1(L++_UJ>)&E1oFh4H%f3KOoMV_Y3fP8T#lr6?cmlxKr}GDC|)bTT9Fj z&#{KzO_=*D%%=tBl!$q|M-&$eo(10jK7M}q-HENjbN*!ff&T^mri`EByI!u)!MDZ$ zc3}XVCyd{h3gAQq_`5_08 z1fJO46AKgbJLE08kQJSnA9T+{KmU=K7qkRXyx6$$yY4)mm|KiZF(zVO(TGurBPp*E zcLpt?4efJ!+i-g1^e4qv9Z&dGz%zgRU~m2mB;$T;hZ{kQ%pUA#DdV?#^Ru>tlOQBe zNHLPLeQc30p(&5Bq3_E3=;u#dDgOJwSBbe>LC?^Ld2fywW!@h1|GWI(|2O162tO7KlpEs-~La>AN}8K-!}f+H{>qb#s`l3O>d>frhSJttuG(Md~p@}`}M!+Z|r|F zzF7b9g=2gnIq`d3H~44oNn?or7TKF4_G>ymT$TP(|9pSL{)_psr7^$9hu`g5vDNi2 z>_4Vi9^;}T6K45hOp;=I{q^`O|K|9s|K|9Q{mt{4&;4tq-c zx!Ld1fi-bd;^@RNIJ_dBe#EOEO^*LIs{?vO!{T$UP%SzB$N5pvy9XuZ1DCKS1SQA+ zI=?!Z?b2eWu&ME%XFX@&N-dZhl#*A}x5dSj+>3VC;?X!41VVMfCgE*W=-jFCJ7<4; zYBszCp1;Cxb3FO`EBt=n;ji*L^sn+eG$6lh_2XAq{wlviugLGS74mmdcq-@b9OUp^ z^{H53n-n^u!BZ&n`QRQ3CAWgrqKrcPb+!>(al zTs4ALC0;1fv!W7nOaACx5VVNGr082x^x_nK>$yai+lr527JP*2M&DTrQ_LesE$A(> ze3!`b4#?lsf)qa+UEbx+iz>CuX~{c44s}HNuj3=!;u>b&NZV(h{V93x zrQ~gi{q$5K?HA_j9X0>_uiSpLJS$^3QI+k$?a88~Oj;_M{^iG?_t;&9z&>s(7#6wN&$IPj0&g=26C=ANP;Z~Ttg$Go{a zaqRwOHqI{#cLvd|E=|=Hsk&!RANM^ydUJ7_kYo|+Nya!>S5Q&ZLUGv#nit=&uX5S`z1~N1w>_vUgSUZkL0r; z%>H0m9(l6v@*79R*}qMI*}twa`?nQ?7299U{~au@kvm+2{8RAwsitU^ocEI;X$*~tsFDx$nU%tJ@ z{LgH!F@JS?jrp_NYs^*NURCh~!FPRkh5d`>5t>Q=tNjamOw+~Dn1BA{es-g8KXbJS zYB#s_>{dw8DBjglahN!1BJd42-xKQx)EKf{k20o*VY{x<~s8}dxG}aahKU= z+xhm{`megS7NhZY-+t@4?0%c*YNOA!xuUmZ1>vw;RACSP=8ylp2iK{*2cMb+Tfp=0 z|B?J?FcGh){?+`jWKn+9ze@Sh^wXwBe(Xb0WR#v7)2 zqYLJZow{q#wn}-Capidf$NH^X(0GS$-e`N-c>|}dIOK2D;lIl@c&ls3mI|ry?G>hu zS^=gGdRpu|{{PS9L#M`nIUidho`Rb%ZC+EuSPz!bGf_3USWO+F|Gx|#kByRSA_7jK+vCD_;*> zz4-xm_I8Vl1Ad$2e|mnXg|C48+4BkC@q+W=YRwP#H}K1cg;1|%KK!To;fncih54aU zKK$R$50&ykzR&O*j)QdhfvZUIgvp!t8(x!&_U8A(b$wD4-k0jh1-Cc9I~OAGh6G(t z2cDYFif}DWfiqtCiZ-2g z(91I7eu;OyxZhTS7^dqngNmT2N=(@4wj6H7W#CboHMJnhcN^|gZ(eFtgt(r`4~j~T zJ(HT>C4%m45LH~Tr{;Hnhjy+9?!~onwb?`0Sv__J@ps5la<>QdjsK4BOBLgh#K@?K z*>6-pPJEto-MAZ9FgGT()=HOtQjVK{-|zp?bz>1?h6c42K~Bzo)Cl5QG#wP2ejPXP zGJ zV4VH(yKuqYJHLLk9B0tAK36GehWVaIB!8~2fV%cU81~s zXG@pJs(oD5pgvb2jlFrFmrj*+lns>1ZZZyKW7aIrZ8G!}hH)z51JHR-K&3Ztd+B1S zQ|pwxZKZRh9>Mzd(uvShanmU88*kp$@vmMWrLN;)z?rC{-wptE!5oG8Ia``4>(&bHN)W`LDTeE^CKxnbBMf*~OSYa4gK{UH zMoV4rvaPfqbS7m7lkzy8vzkeXq+J$6O`=Y1bx@>S z;-kLdcZmH?e_WV2Qr}i)_SGCcc1&?T8M3u1Tfuy?Mo@#fO;0MSbvUr8nQYs3^O-H@8&x=2=|}596D5 zh?c3Mm3HEuiaA=C5$$CWtu$MPDyv>O)F2V6BaN}3K@+ry-A@^M0&S3a9B~6dV0`0c z#AY($GDJ+l9t(6%LYI;k6y;jz7BQc|_h&`02Tj2S8o}zzV4oZmBaIChY!<$4h_Qwn z!Frp5eM}=_WQW43^nK}48SEh5Sgnk#lL+>O5$t!kt6|<|1iM!TyIuynHDIt`@cl?2 zTVMp+U^%`I)fnb+ zxT|5dF@ilIgGI?;-{DQ_%E*?9VAmSKR+@r+WNgh5GT7md#4zs-7_7etwiP!v#O~xZ z1>0x@t1g4xBZIXI7%W@_YhWPz4en}~LycfNLIr1CWw1kdfxPlC-xa}%3}i2vg4IO= zh@@R0gO%+Q!^{pC>{s&7@7lx&Hr5pEZEQ0UteXt>lnhocU@)6NwzsX~EZh_<-3WGp z_By1-5E<+pyf{)zWpz<(Z5yAEw!Ajt+h8bc6 z`m4vymIyYDgVDZuzbV+u*k)pw%Ve-ad&Mx%*a9KDmpIPvnqUO$X$tnE z5v-RCwnPRi3>a*H2=-fRwKac%yBg+7BbX+Gb(X=}2Ml(IXvyz7#0a+D6fDjN_NG&C zcJ>1?%#VWt4Re(U_K`;+8)FLgDH1?%Hd6+BLI%4nV6fXoFpm)|%oOZ%BbY}98zh6( z4;ZYQ2=;R;g={rV4hCLR;Jk>%W`x)+PnC*>V*U4bmKJt0jUpH-e2a1?z7FdtL^6Tn0Ogi;2p^{Dd}Ge%EiK)iB+rU|o!0<7BV_9BlUd z%7NC1Ko0PQQ{&kEr90t@b96pA{uJ9w46&gMlA|%`25Jw2JGH(pK<3 zebBgnP+AZAscc+di}y`RgGs-}r~kGa`c~ZEm-VMf&+zG=l5Y3u?~(q(?}q=sN$=;= zUm*R5OGf=8q_6Pl`J`X#({CsJ=x>Jq&7|Mq(?^gV>C^j=Ui_=!-F0dgeIV%%`1Bs6$NTj5q#yHb_a>yj=)+lq^faGtCB3{=09x-cR}(pPozlt-d^&MS5MIKA!X@KL3HF@9^b8 z57MXj^!B8O`1B^E_wnUz4bsp0;#)~y?$gh0hu*=be?|J!zV-)5_xki=(y#IDN3W5- z)mQ%%>A(5-yr1;Pe0nbFi9UT6=_h=AjwgMvZ~F`+{i4sm2k9UB>f4h()6j9(rc@)- zFEHUgAL(V=psxXBsh5!cnNQzGdR?TDtS=&cpikdG`VI_H)~_Mm>T6#}dWf$+hx8Pm zo=JK`Y*N`io%9htJ&p7U*o3k^f%GSQdJO5=KL1G4U-#*5(tq^n8tHAZNoBmUV(5F3 zqEas*Js6ZreIM!JzWO54`}_0_q(}Sw*N~p!(+f#|(x>N;{)JD^Bt7S>(O)|0Z~OE# z(tq{o38Y{9J^Op}z9@|${qZwK`$*Ei5<1npq5DrQ2{@E~QF?JJ{ObGKm6E;-sU*jJ zgmjxPPj->s-KTFNou*9bzmD{?zHzN0y_GNC64E=M9`l;<{chtM-89?%v;4z=VBiKU zTG|x+g6OT0eeoNmk>l`Vu`_RroH%>>cr7_QGh=*K#)Qb`O=mTal)p@>yi>#vn<|wX z&-S&w+;7dwUzV->le6X@krlt_`X_&V_OJcotooH%{PeB*;aU3WTmRpkB^+1!^;y4P zc%40cMy3V|@hKLZ=-yc&*K*7{)eE1T>+u*5LQ9ESZ^3^aK=l`idOd6Bskp|#<*%0g zPI>tfl;cpf0qa#*Z^OD2>myiux0ILvg!MYC-8h}MV?OX;P4h%L*3p=!R*;VMW~@uG z-iNgp^YwRFufy7o>j^uKUr|_RW1Wh1Db`t755u8*HP*YZ-iCEFPGw54UV`-{tV^+u zpvx|t>UF?+9oA`B+i~hU73;~k1lWxAE?mEa;96t}E^$ZFH3{y5tjF5^5#nII4(mu< zK`l8@UY?0{+@bRFBCJb4#<+0tVgCf8%gfhbJ^8Eh z@-nQmPn4G@;9`C9NsJ%sh_B1bPhdUl8{n)4due%jHrBM@zBDiT+yR=N?bhpsRJ9j^ z(vS)*^m0ZlwkA6xbAv2t)tnKDPIq^wJt=sM(_Xyeeg3})KfyHyIrL}S5Es$lU@6+% zO#J}+VvE-qk!!UKbGj1=%MO@n+-dMT2tV_oRq_P#1#zIZ(_KsH1bfigl@k4g2v5)ba12_j9`MwRCqz zEVFiZMivBhcSbL@B|2jkS4ninglbINk`K9Qg46Ah-f2+bVN{ZFbg=lOW8&Zp_X6oBCIX_e|w@ ziNTgqzj%WXFLUqJi?_TiYp|I6SC_+F`u&l_y*tSf-T-%p6Q2FIMM6)&j@#*1SY z|IdRf;Cs0;zV5-+ZhrVyAYKfPfmbWu3B)VIvGi)i>wshMh9g%m-a^F7JX&5}6>~M^ zyqtq@468H;^>U_LjydBnDOH$=a0Ggv=Abl$IEZ*LI9E7>vi6_1M-t-YR|^<0c%C_D zqH$jFK4Px_b1@eO3@I^E4$`wk&$06I>uJoGOA9RhoDoZ{iO$HyK^R)DEyfohhlvu0Z-d6ut058w+0@`?~ zE7$7(3)Gjosz3in`3y4Ac{MGVLU^HPU$kHs<7F3)FSN+hOFj=ET@9Vi4QP>Wn8;bx zWLWVFYcQ$vQlv63co&J6BY2EVi?VN!16MesB`^t#&pXK#}X)>Rye@z3)AE(7ZS*i{@sr$}MxDc3{fdZJvm73av0Q&G z*B9ivN+XSzT5>Hk->2H2eU`u__5V9mE%KO`$h(x~udUVp`B4AYqaq&le?8Ry@u*mT zrCxjW=y6?SH2#BLi^y2|4=u5g?PA)si;Zm;8yP(ScV4_>vt&iQMH5}G z#3;S}*jO#H5g9PW$#ozfEs|ZdT5=u8N6m?)a&8Rdqx$&dKlJsPY_HaV;;1^c4&pY3`_s*77~FOn{KKEYG|nm59`OZ z=^uVr?Nz@(M?pb0{BIy=wzn|DV)Z($ELG=J#j(IXg&g%Nw_?_>GLFmk=_p%+s?xO= zYBHf&>LY4U)7sPFU}=T!gPPTSgq$t5{uqR11D*OuhbK_A6^5V|wPvGS)oux+hVRzv z13Y*TA&rgCe9s#2%My;Ob`F{;$9@g&LseiWVC>|aB%*>_QOLo}-zQ6rbi zHgr+7Zum=7UXEt=+&X)yJQ*MM<>B-X=d3|NAE1TR9yAY!4SN#|!tUr`zZq4I@$}Kj zkpOSa@gQm(*Rm3XzIvdp8hKeBK)Y%o^%tOQr}E_Bad!Gwg^qP-7Cb(Du#1`>!3csU zxJIHJ?dXD7!5OT?I9>wF!4sVXCeAUF+DvkP?!+mNBLu_;Pp&x@0lbb9pbVbku8UQg z<6CmODcFJW4RbU?XTdjz^h8a%W+_IvYSkNs!f2z}32RF1CR!rm1~MCg_xw1Zw~sNRZ4YIo2(oz*>V zqSx(c3E%3ixh6vN(}vq1v zWU3Zke-4Ff3X<38&im|55W#U9pgHfiE#XEj(5Z8U9LZpqoGTefq~k~UI#)I%RMC!& z=)n1qdjd9Kj3Weioe#5HoP%z~I3EdJfSLryTU4_;^j}cCj(X_Y`Do1|Y>YI=36SJ` z-1$9fhB2{7+`FYE-AGRHGi^M2U3P%b*B6N0_GwKU!N4UzDnYcq^? z-Fb|*!@jTyFuHYTAtCxG>=tMdy7LqA+%L9~?!1#Q9dOQvF&{6uhLSLvJ9Bg={RFV{IM*%Folg*O<8IPiwYV#L@YIaynyWT*;C7sc zuPcI;2*=w%>#FNWK&(i|ofwv@9xG7}dYjBuKX?~vq8-ObX%M;-O=BE4z~pMkN}Qt) zNON7o3ep*)bwx4)FD6vljjIqeo1OLw3%!TuYGkFI%JMU{YvMY|wWsmvCJgl6Whk`> zYmFdVJ+bqHXI)oT^A$8P08`=S6${#tE%XV=nBuk|gvl_@vcm3(e8qy?9T zmiD@<7Ai4*d@^CJl&@C1fGF;u*NS70Zsb7>^!0h1Cg2_Qnm4jXI(ZO~EaeeO{#xy~ zkn)ymb?05|b~m{tz`n-MO~U$vHch8!gxVc##5?>RqT zt@c4o0hTVhO9Kp>y$U|Ldzx(oD|Cd@YH!8PVCky6nzLJL3-2E`~FNwq*~! zCT;TCb7%-jx~rJm?4~ve@S;i9*G9&_9~G8l-9-%6E`*1rr(Tm%t9A_X(9%n<>A*;B zb{9U~bo8OgRkocWn7OP}-?{J%RuVd4pba8~g52zBGXeUy*4E z)Y$;N=4p2OLAkjwED?=MtpQ&Q*k<2~z!8s7^xoE5w4>Is1=08{ldaAqG^-m+DO_(e z@Z4GV2h{6Y?IE-Ur&_IzQC~k&cXoDk02dA$#^X$I({8Id@Xx(9XCf~vmRHe{;IP@?_N9r_{m2?Nqj?TWUOm@&M8fQONG97e2=DdNGY{w_a z9cLOx%W;fAHaYwAOuWRghiV3JO`&5bwHd^1Ryn$o+hA7KI0g~6A*`%(&|9|7p{#6h z3R02D|S3k%CX;I=Ak$5%-f=i@^U69Yg>p zTl)izE6sV6<9*uNchPumu1@o%=9o&Tr*Z?kV-NK+EsW+#w((qQ2=YAZ5j4hKQIzLLG(vluy*WPJl==xM z`1Zk2Qc+DafGg6O<5&pYkxT^N#Vl&{9ZSu*Kv3#%(janKaXW4x78W{dq6tp^>r$F7 zvi5}Lay##KY@|q!($JQKe}eD`OCEU<)c_x7(qB^5J=Q|F+3eJ<%}zU<%}yJ_W~X7> z>=eYtS1~relCbgBNrUGxXm?fwp|*U1kB}NXquS}rBRbgQ?v2X{K28U>wulB-1dDud zu!Mk$(Ax6YV8b{q^v*zad(BA{sUAA7?r^=pkzSz~3Fvf>5rZO%qm1Pu2o8&DPT%LS z*^lAV{tztbVQKakamU2*I6{XFsFp}KO8IIhY>W1Y7d2n7~?WI#@58ga*kscc<&3&f>(&MQ!r{)ge-#M4synlwvzqu z)`rU+*2mEiHNlx#Gqtc(hO0R^SYHuLvwTmC^|Ml+HOFB%G;%)Ws{&jFya9fJ*=DCe zVFW&uHW>`#sR?am>iilyODwm-d=!P6bjAG$%pA$0MIObxp`QxRhsj}8H}V=q!y4Ks zoRa5#)QD8#%i~6GU?lE;ac-CTRW;TcEdb=u7JTh(4fAjIE{Lj8kE^cnt7@z@xe2*w z8D|M=rz*6lJutb$!Wz*i!ms0IH>z5`eiMh%Mh{^Nht_8_bE%#Xi+b7xv_`1bf@^bq zp=z%+Y5{AFMQnY6to)GxBUqY)9vda2SaYe~5#{&EfeQSgHR?@O>+~+Ld_z@K;18|o zS18tMTKyc%HhTj6n$iEuMjY}9ui@w1d>5eU9dw;`E;j|m!ViD2)>ntX51b` z7V^@f8Q9ma)guU{!@4F%m|K#2CmBTNb6h=9cbrPmv{nsa-T}8w5D!hmty{p7f%YRH zEoVUKZM1Y_@6oNg?E)Tww7L)GWAHf$X|)*21mw<0NUM2J=vD{aVDnI$){nt53H#J2 zNShy~YTEW;0-BENcEmhqTSOttQF9b7A4A%POvC?QK|5M>Z6Dk$4Xut=bz!cF&5vL9 z)?!AQe5{5yTJvJrY;nw>xKrTP7yf-9TI^(bpOO--oj%wyi=5lvAiJVGdKrySEh@H{F!Ept#g$YC9xPO+$Qe+t_{4U&?_=18XLPsikLH7fB&%mq5vZc&H6iTLz78DloOL8`P#z%yYI9d?}i# zr4!bf5T>>Wk!V3az|Elc71X~7VQQ6+Rr8fZE24G}#U*M_!T%eG78?_g+J|LVL~S*U zkEu;)EF$?)yGeQywH<}0qIOKW@)y*qVKTLE`%~KyVGhbr7HwZOjMApt*4GB!VKCFY zPxmNWr9xSa0-eyd>JB9eI{;mFdZSv3WTXuK2}YYC^u;#YMWAAqIMDdb0J!6LIrB)k#GC&0Ff4=HUo{A z+CmexvnUrSYpY36L~Wt)RMcjqa}3T}gzcb)$<)4Bnc8R>%A&2o`1C5et!f?MC2BVS z>pBQi8wV0&AWUr$3Y#DvYQxkNB)Q;&Rpz2ye zh>6-$s6Po|YL$;wQzbLCITV+ur8`sCK(yF0K6F6?H8ddzYU5>BL~RioF|}oZs2wUj ziQ3b`Q&D?!1!~nWnc7DyQ#)IRvS{=)Sg)$v#?=L0qBa$VBnVS`5QX{{38%ZNtSE<*iX5T;i7ST$8L zQ~N2!C2HS>|GyzxtQIh97n`W9hw(AB`=SI)nh=bvU2CGYr|?wN-co^DHB6>8CR$Lzvo&D3n1w)P|`|$H8_GgsGivP+LebFWFKl zBvJb{T#iGS+FuN6OW+h^D9uRhRM_x zRHk;M3}xX2)vM{YS@;1nrZy7i9uahULx-_-D6AocCWIIqnWG^dN@}Kd6||)grgpGF zZ46Qy)LJMcQQHv5+`15^_I}wl&e7mzP&*v;gCR_<^08{FWTy5z$^xQxIsEU1Xt9MO zMXLDEwbNu*M6Cy4nA(Iu6GFc9Bx;8WPetv*3e>7$GPQS9ruI1*%A#!`8iIA(-fMuD zvUW4DZiFzkNjO?|p#w5e`#uWWARcPN)OLsf*$}2S*`OBpGl<$z6q2ZY3oieHFtsJJ zYh6o&n?db))c*isYL$;wQzbLCy(lhG+qw=45G{61Kx*HTT@kf+qY+bE*j#J{zq$5^ z^dxFu6`qRPdn!q7h&cwZniljWAQzmY{Hi z6ry%A=J#}nhuSc;`=D)uFtr_riEeN$AgJ9GiH1b&5X@c!AWUuRzRE2U(~d#ya?}?< zm|Epy)l|t$?UNLjsND_!oe(WHGa$89WmiP)aWrCTwP?}5AGJ-TCsA7+Ou$o7TbQo= z`_qX>2Q^Hl_V*iQrH|SkGL%J2!}#>-x@{rONtoK7fb}~FQ#-Fd9(q8S+92$RG!c2I z4O2T6mUIYH+ti?T4aK}8Gee&g7bwX4(F9VS7o8YWZwnLo8OA$%r7S@;02 zyLH=j=#jJ51H4g`7c?PkL}5KCG$C}s=Ij9R&`AMj?OJH7AWW^zpf&+VZDj54C^RH$ zTLNq|2vZy0Pe9eRLbw^!W}tp7gsD|NR!x=6)V@Y>iP}fu{|H2jEec5OSrfJA(1@um zG*N4u*M>+?L~TPjn5cca0<~(GOl|8Cl6SO|b8Sl*%Ayq!4WYViWi#NVxpo(@7D1TW zGyw9_NQl}aD9{PFhuSc;lmQ(eOzruhq8nTb;G6=~Mo~zjb_ZOxLYUgI2DRyMGpN<)jCwQ875ZG+0x-fB==NHm1$Hu}E+Ozi|j9tmM;zeC{!DMW1+T&6-i)P|`& z25ldNsXb{>TOz2v6E#fjI2<`fLzvo^3~K3Q&Y<>D)IS7aYL$;wQzbLCQz$M`dkFpq zAX;omKx&tmsC^ENnA$W9hZa9-pD|H;PllpLxdYTYgItN`MnHcV|cw5brL_K-pC28wyfc9fz}*8TyPUm;BG zZw9p*PVo$C<6GgL6NIT%K2}YY%+zk9xJ2zO@Sg$EVvmdx# z&O~in;i;&7C0&G8S*wQ0)OM{*ZRicc-=f7}e0sQUdj>;iYF7j63J6mh<-z?I2vfTr zg|!e5wP9+*TZ3!}Q@h=uHiu$fvUQ}8MD4?Hc>u!HdS%x*M>A7<2=yO9m|Epy)l|t$ z?KKpasIA@xx8@;QY`PqxKedfzS2Q7vK_jL%5=lvmU)Cl_Pnv7*5uS?Lx6;|&$XYc_ zk+qc%W1|gfwc4Pe7H%sNft0mzz#0Q#YKu_VL<(iCw=EtvK|Iuksoel=Erh9k-Jmv& zVqUTp(gq@GJH=om5T-!Lzd)GU6DS;mc&H6io7xU!Lzvp9hYAe378$|Ro~Eru)b5ANUI+`xY@)U%#>dp|3qsbdxLV5vNjV~CqtOpizt+lLRp*B0WVlWJk*A% zEroUr!ql!bs4WxJ_N0(R?evbCb`ylDZJVaHKmsoF3~HZ4{nHSpR{2;pRWeh{`xH_8 zCH%jDXtCJ=sddP%C~GqThN+FgR7#6q);5=(l(mltPettq>FjP~tr{j%+n_SF$ubn~ z*J6Bn9o-fdBdHDPgqvLurgjAiOGzPW>tBm!5D*WwVQLpb%Z4zui-rmexE7$8muye8 zmDE;?!@GtMrgom}8s}(rP1Gi%J`uvyDj%z+N@i;FDK1fa2mEh`Xt7HIQaeO;Mby5B zMoevCAZoLuCsBJrcq(f5SD;o6lc_y3T=I@~^1Svw8Oow1V0?OA-8PMOd&=5%z`6#) z)W*c){tJYu-Gsshh=YzR|3+n~0PVqUUcia|rl+GpVMB!sEmExXpW61W*z z`z7i>gD|zq$EvB4ncA-@E>T;jGu}6YXtApTQu~zbil}Xd@iDb!fvDXgJ&D@>!c$Ru zIGtFd#$v8j!(?hd8!jt-)P5mD;eKsB&`?je?P>?SL~RnVc7ZUp@1wAd6w2B`UGNM7 z;-NN7?Ph2jAWUtBL2WwfLG4fqNz``ls%hOIOl__H0uAoh!p)%e4%FWUVQQ6+RZ}H1 zwTTp$sC^y&uR*lfb)!U3|1*R#6Sa4t5mTGiQnF!w%HWish}!kSQ&D>?UHJ=Y)i9ab z>Nm z2iXv&cCbNhOnt;WXM2?_s+Aq^NvXQlFm`v^O{#i@Z z-eyp{foN!`+vekNz|_u5z;zddsSQfR{TEW`_RLZ!3n3nA!_@u+trWu4CL7dh4Vc>M z6q2Z&+g;P}G%+`u3(@n+m zCTiano{HKt>B?VB2x^#2?H!e=tua9O<9;p1r$_3x4s_%qYBvJwdI(e7r6=ycK$zNX zC~Ss!s0~x==>@VOOl?zx+BFpOlCAh!G$d+Yh09A2rna~28ux3>)Sf~8DF{=me5{%( znW=q|;u5t@y_(hpqQzQ29%`u=x1uvfYl3OYLB3>j}*$<^b|aUfOx14Q@ab=W(ZST z)1Wq!VqUT}q>w~yKQyLSp_tkSW!E@IgPSoS(EB`#AWW_Dv1+Phrq)hziP|mje;0zc zX97}ti|mT1^`a3|n}$i37C&n5m7YZHEa9oL_Lp>aH>g#^WNJrMruIb{3ioS?hQ_+> z+v|XrvX)*sIRRm6v-;rv3xuh?gu+h{54B-xC!~UG2vch_s7;7uYHy>EMD4e5`5MC1 zo{(MRel6S#YUvS5BM4Kge5{%(nW-I5af#Yd@E-xe+cN>FeMfdh)INnqOl?_=qRKQO z9Fv|z?Ox%jsMW?Qf04Cnm`v@9H_A%1ljpU+%22pp8wnbk=(gl8z)RFF0oEJ{Q|s=B z`!5itb`=VR5D&FsYPB0cHY`l-`5_b@(KL4>ruJZGG$d*l!)*bCsf`_|+|uD@P`d^7 zZ$p?`eY7&Qy<{khR!B5N>9#dpftRR_!pUHL2vfTrg|(#6gwO$VJ)O0As0~xQ z8d@QQsXb{>OD_XrLTF1NiQ2~4kPRVB?R6^+`T`wZV8I0y-s*4Y9lI8tA@$c_8l&R zp`Dy-+sIHBOaP#vxo&$U5qOE(i@;h2VQO=R;rGdx=SvUZe-+LgjnQQL5=@)r|=8YWZQ6{Dhs6iMyv2DS7YQE#E! zLV5r%QM&?ImqM7@`hXk`VQSZ+uo~i_HcV{@O>q#W_GyFK$fiu~Bi+%EsJ#y^%OFhc zs|K~1a5Jd=0QI{eOs(>YVR{+%IsdnO>Y&16?JA>58e zOzpldXn@5pYm=lW&9%=6PepAT02lsZLQunGYENRax~&1GAf|RQ zu%<(p+A*#5D&FsYD=IUgfO+U4QlC)HBh_0CmK@LPMn}=;~-4!Lk6`a za5E-^Cs6+=gsD|NR!xX%+VF|^mIK5? zZJ645&@v%RZH7T@I>o$Xt4bk>TFWGyvcrw3J#J9D0d5AhUEvcCVQQ5Ro{dRwGqpcp z>`d)!_|JmiO~ruJ7RknxwXp!h)RrX#p!Rd=Nm)Bmcq(dXucSrYLr}wHYO7bC5H8A4 zxL=F$>1}k|0o)2;Y99mERS>4uJ{hBjFtu4IOoe!;4O4pz+CB(VJJ_I>9zTKFaTJoM z9XCbOMnjm|R)!nB;9yYuDC!@AFty6Zs`*M{fb{lEY6{{~)*gcY0SK(H+Vg%{8`~MFNy}V>p~Sy~ zl-L+)rSIA?gf%&2X9(76^iMB4X5&NGbUgu9oo-Eb!q?pJ%#ywbckKjJh;O`Uaqn5+ z@UyPdo#A*?{9Kn@uA6BmbCX?Ye%4%%kM?YF2%@eeHVWxuc#NIV&NZ Ck7ye}r^m#Mfbi~?T5_P7Y?I<6|& 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/PIL/_imagingmath.pyi b/venv/lib/python3.12/site-packages/PIL/_imagingmath.pyi new file mode 100644 index 0000000..e27843e --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/_imagingmath.pyi @@ -0,0 +1,3 @@ +from typing import Any + +def __getattr__(name: str) -> Any: ... diff --git a/venv/lib/python3.12/site-packages/PIL/_imagingmorph.cpython-312-x86_64-linux-gnu.so b/venv/lib/python3.12/site-packages/PIL/_imagingmorph.cpython-312-x86_64-linux-gnu.so new file mode 100755 index 0000000000000000000000000000000000000000..9992d4ab5737e81da46b17a073b5f873a2a6e308 GIT binary patch literal 36112 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 E0qHrs@c;k- literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/PIL/_imagingmorph.pyi b/venv/lib/python3.12/site-packages/PIL/_imagingmorph.pyi new file mode 100644 index 0000000..e27843e --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/_imagingmorph.pyi @@ -0,0 +1,3 @@ +from typing import Any + +def __getattr__(name: str) -> Any: ... diff --git a/venv/lib/python3.12/site-packages/PIL/_imagingtk.cpython-312-x86_64-linux-gnu.so b/venv/lib/python3.12/site-packages/PIL/_imagingtk.cpython-312-x86_64-linux-gnu.so new file mode 100755 index 0000000000000000000000000000000000000000..2f17f6e4b6618e9178225f4a59b7b3151405a104 GIT binary patch literal 46352 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 Skx0ca(y`%aPOFdx8vhgKtiW;r literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/PIL/_imagingtk.pyi b/venv/lib/python3.12/site-packages/PIL/_imagingtk.pyi new file mode 100644 index 0000000..e27843e --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/_imagingtk.pyi @@ -0,0 +1,3 @@ +from typing import Any + +def __getattr__(name: str) -> Any: ... diff --git a/venv/lib/python3.12/site-packages/PIL/_tkinter_finder.py b/venv/lib/python3.12/site-packages/PIL/_tkinter_finder.py new file mode 100644 index 0000000..beddfb0 --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/_tkinter_finder.py @@ -0,0 +1,21 @@ +""" Find compiled module linking to Tcl / Tk libraries +""" + +from __future__ import annotations + +import sys +import tkinter + +tk = getattr(tkinter, "_tkinter") + +try: + if hasattr(sys, "pypy_find_executable"): + TKINTER_LIB = tk.tklib_cffi.__file__ + else: + TKINTER_LIB = tk.__file__ +except AttributeError: + # _tkinter may be compiled directly into Python, in which case __file__ is + # not available. load_tkinter_funcs will check the binary first in any case. + TKINTER_LIB = None + +tk_version = str(tkinter.TkVersion) diff --git a/venv/lib/python3.12/site-packages/PIL/_typing.py b/venv/lib/python3.12/site-packages/PIL/_typing.py new file mode 100644 index 0000000..0a7d87c --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/_typing.py @@ -0,0 +1,53 @@ +from __future__ import annotations + +import os +import sys +from collections.abc import Sequence +from typing import TYPE_CHECKING, Any, Protocol, TypeVar, Union + +if TYPE_CHECKING: + from numbers import _IntegralLike as IntegralLike + + try: + import numpy.typing as npt + + NumpyArray = npt.NDArray[Any] # requires numpy>=1.21 + except (ImportError, AttributeError): + pass + +if sys.version_info >= (3, 13): + from types import CapsuleType +else: + CapsuleType = object + +if sys.version_info >= (3, 12): + from collections.abc import Buffer +else: + Buffer = Any + +if sys.version_info >= (3, 10): + from typing import TypeGuard +else: + try: + from typing_extensions import TypeGuard + except ImportError: + + class TypeGuard: # type: ignore[no-redef] + def __class_getitem__(cls, item: Any) -> type[bool]: + return bool + + +Coords = Union[Sequence[float], Sequence[Sequence[float]]] + + +_T_co = TypeVar("_T_co", covariant=True) + + +class SupportsRead(Protocol[_T_co]): + def read(self, __length: int = ...) -> _T_co: ... + + +StrOrBytesPath = Union[str, bytes, "os.PathLike[str]", "os.PathLike[bytes]"] + + +__all__ = ["Buffer", "IntegralLike", "StrOrBytesPath", "SupportsRead", "TypeGuard"] diff --git a/venv/lib/python3.12/site-packages/PIL/_util.py b/venv/lib/python3.12/site-packages/PIL/_util.py new file mode 100644 index 0000000..8ef0d36 --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/_util.py @@ -0,0 +1,26 @@ +from __future__ import annotations + +import os +from typing import Any, NoReturn + +from ._typing import StrOrBytesPath, TypeGuard + + +def is_path(f: Any) -> TypeGuard[StrOrBytesPath]: + return isinstance(f, (bytes, str, os.PathLike)) + + +class DeferredError: + def __init__(self, ex: BaseException): + self.ex = ex + + def __getattr__(self, elt: str) -> NoReturn: + raise self.ex + + @staticmethod + def new(ex: BaseException) -> Any: + """ + Creates an object that raises the wrapped exception ``ex`` when used, + and casts it to :py:obj:`~typing.Any` type. + """ + return DeferredError(ex) diff --git a/venv/lib/python3.12/site-packages/PIL/_version.py b/venv/lib/python3.12/site-packages/PIL/_version.py new file mode 100644 index 0000000..963d8c9 --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/_version.py @@ -0,0 +1,4 @@ +# Master version for Pillow +from __future__ import annotations + +__version__ = "11.0.0" diff --git a/venv/lib/python3.12/site-packages/PIL/_webp.cpython-312-x86_64-linux-gnu.so b/venv/lib/python3.12/site-packages/PIL/_webp.cpython-312-x86_64-linux-gnu.so new file mode 100755 index 0000000000000000000000000000000000000000..11cb511ec1a0c8c4693512d734e04019ac1d0164 GIT binary patch literal 84193 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Η%9P zALFY3k+9c|dKBeJAl}0z51fo*kl|%^V*KX6Onb--bjb%!ny?u05kh%B$7Qp+E2^2n z2Tppi2_HDQ2kduq4J&QXVk4i=8No5G(FEfp`@@Gmcd;>t_zW5z!c{`be2#NI2RWZ3 zoG&Beh~{%7^Er&to3yCzx%~TbtrYS^Slg1D>qpTAQ`j}Yf35L+^z#+L&xAR-GuT;U zl-XJ&)4+$PTaE3j@$wOgYl802D#E&7BosNHTfm1di*aEVnu+EBe{!7V&+;dlNznm> zq$k^miz@>P5tU|G{tM$q$Bl}c#F?TgK7?uln27UUfDgzJI3uO-ndYQq6L3slz=a68 zSTf?Sgv(QWvT6C_;*>ygIrxr5xBL>Y;Ro(TiLC*)?YxSf1fC`ERGh0oU? z4eoZLM&w0$$CH6W$jIRmQBYux&2;TUT}#D=h23aKI*l$WFwW*ixSq+Y1Pp;}V`w)8 zTIV1*sQIvNq!!KKF3g{x zCu@$9ICB;lM-4lTy6`_5As=<)*ym|crR~?5m~F+-Zp;nWnT980XC?G6bJ0|LEC56C zlo!Au%0o0wP}Hfww=DPWg-$x#s!FTs$UY2Xa-xn?%E;C*Y zPCGGD)|@l>m0d51)E28|fpVpm8H7XTMv5|w%Oa&H8J9@8F$3B5ZJt# zq3|mHjlx3w;l4ur>A}{9mCHd}*u1uN$%^IqLksYe*dx1H6_!ZVVC9m+#S0hax2{;R z6u(-UUp%C6<%$)ps*k1xq!q3y88L6fu>6$`icj8eF?X@UE9EY+WEEWm9hPDfX*DOh4)x2OJa zp{fHpPx@D&`kRGry}O0_6NW&;4=t^W7Bw`Y9)&w!YK|&WzgzVR2P~hDYq_GSzjiop z!lat-YL=7_GD)fbp*&QhO3!nIloRNCr?;|c* zu_zL=sG()y%1A_a9s7vpwJojqD~^yR0G_33Y*?veQ>PWEV&}hLZEHizna$*nWoj+7 znZb*#_#*s)(Qa0#xN3P5{~%^03R>$wRodMXoTa*gk?^-TRoyivoOPxK5Zkazwx?ok)QaYgw(*@h6p+=0yJ>s)=nWk+gcfV5Xp**RY8L9^PnlG!6WjJICGM>LLiGPD_BeY;y5Up0u1*ZL6Z1RyFABC@2MY@6O5 zB(3vR+cBGMd$Vs2Sn$&mc8u3bx{LMYuh}tHQh~S4T6rDd7wwp#-ZqT3A9RE6Io?3f zw#%v^)AUZZ?LPJhul4T@uYrhKq8&5Y9?@dQw3XT;MicPW*#kJTYP%nc;~3aBJ52^S z*-nL_VprQqCBW8*CCP7luebYxBkMuCFKsr)jy3Ic6S$pr&&jqwWcRmXOB<>3Ri-@% zoPkmRlkE}?@-C^;gnhilkCXnO>U z$@XLxv+ZfB!B7^}_COY+?LI6nw9{CWA)rvqk06XCPB-1tv>w*}j^{u-w&>eb|tCR{bt*F_m zMyWL#?P?@S=PSkLC{?QM>Fjm1vPY>>L|dm!nWa?OqfT*FtC5V+Bk4HzNZ>5$jo%!x z$FTBOI7!7GBkz8RLKE}Cdfjsu!z=}Lza2l-cfdBSm^you_a2G9QQm+Zn_~wG?NQd6 z0>s7?@{aOaYcW~J0l5}ab-L|?5bspZ8#{Kgjo%H3#Uy%Gg%WUxF+`?$H4umFI3VnI zZS24iX_p|VlXutyyjGvX(%}GfXxFG{XYgAOZ}g$xQeK)IW!wF%Ovq1_H1sJ{!K`R7?IgHA-glXuv;zDU%qW~!W89QN zMZMNT>rFIBv0n1X`~fn@`U!`W0;*YEprpMGZQVpMABtPS0&rShYtMQZG84Zl6EQsE zlTEva=y$i>6J>x&Z8EBf_+c_?|Dc`VHCrJZiRkwpGsCAV8^z3AY(Vr` zZyMBMD{KMNOtxdMv{S8h7z|9*1HMl|{CO8^KTOu~vPJb?XD3;6=oBjts{r+R0Kiml z9rC;%Aim3J`#Bv7FOhgLw_!!7YlY`?Rn}cpr#@kC{}2#+hI?& zoS;3Wz%H~}S`}b>L-rJJ3NZ!t6w9f$@!xkLl(^MS_nHUjr@4A$+q{Pv$lg}(gGdTi zyonI9njhfgh_BPwR6=WZXehIl2EM#irbi3{$?+y1fW&PgF~-{lzIQ1r1+q%K)@xjK zy8{@AHM9xSD(bL&tmTy2B~(7miecuQjGW3q!-l7y4q=&R|BRStVzpRni=J6uuWy7I zy?`N)Aw|z@LmI-mhD-)gb+S%EXpDC!l_3oqmssmp8|Z)}>o=HbG2Z8-O^g>Y$i}Gj z16Q8)i|z!$$%64e4~KJ=hfPJfk0O-2`^+TZ-JzQ7hH|RO4Z7SVrK2;djh{?rhz!JxLrlccL}TJ;q7w8Y$Owpz8G{&RKpmNXz4m$B zbFd}OH($PRzN)+TS!eIH*Is+=wbx#IpMCny=87nlI09y%)&!jIiw)(c)KXb$Fn!Gg1qDHBrzvvAJ2vqK)D-wiGkiB5gK3yMU9 zXMGpLW#78}cz$rb>a)95on3WMdwur!8^PySUfFljRon?ad_C!=ld_K-wX^T|1AQl5 z2?MW7@^!H9m|rH&X>T}4;S~U`g^JV;(shxO*Pp_j<+kg?yf`NN-J_(d-FE%wFBN$N zO_C&(UqE9*;Y$764lD7wTck!Hrj_y769o3tp9hwjk_1N)flP5U1gRo^Bt`4^c1 z!t;^+=j~Vnhdypb`s#K9(e$EVaJuA76JTDt==2GkrvsblUr`V=l2_26a!p8kwF# zaC-J(Z_PQVAozYdS%7Euy|Rt!qQgON_r1RFm$&xyU2^~0qwhlx#$dZPdpb>k*1wXX zH2!5@K7d}=y`N**g`HXGY%;$x*)p)MM-^E`9&@m7(|^GOwgnL0O)RHYzx(I~3{dOQ ztvL0`7~uX541k|Kz>(}{vbWJ-m@PdBo(E`1J>c1!U_fB(TbunKH|!*H6rc}eSS@E) zF2$4A;XzMH7`?Kwp>!Tu*Ja<6$qWd(r*F8QAZxR?WC+bM*{5$9*tup698|egztbv~ zD)U_&_u_XO-FBtC8Pj&ZRVj5_?P{}uSiM+nV7l-5^HqF;q3P8t?RIgY;^Bt#5Ra!;9XIf%MCWF^^poW6fbR9w@3Es&Z?;y47}T6Yt>#OO4wY4Gx1~IzdbGh*PgYhu^3VC= z?C^+B#04U+u~Y-ofMlss>`(=Wy!I-12qHjatGdsxcWa&MQf<|%`{M3thqIQNjS{k2 znaU}@0LKyGtG4|GG)Q|9?j?G43TT&_D`4QY^=iW_*1>_wz974jJhepZX-mc1-V*3* zHA`qMq8m-?gQIg^sfqS27du4{Z}fJ$tqRelRjD=G?HV%p^QagewLSb-%iUtlXXg$j z4UvwP9n*vp>c8~Z=Y&M%inr{ytJg_=(4ZV=0l0EzcFX3CD1Kk1#!$#the#Fq7@wFd z__>MU!p!ujM{T>}*O9dBEfrgxDpk?1RqNG`msIH^A0r-jpk~PSIZ~)+(J&h5U{_oSe+gl@{c&<@qc- zrD9_lt-V;OE-ZGu+1w@m=;W|JIz2r#?dJxk3loKjsmYE0)a>Z=*!HO_z-=&QU&mht z1~_U-%$wY6m=il@cKTCqjiH&G*}k1{4el5%j80Q+OvEeuNdaZIiRQ7Xl``m>N4^e zsujo|`eD0P1>Z#%njnzEtTyJG=r*W0DQr+dy&uI_>T{JAbro*aB_RM^(L*sL6%pk; zF+4Tt;jMP<_Fx<{hg*4Wp*83=D#aFhgs2M-bhM4N`b4QLHMooOp~Ho8_t1T!5BqkE1M-5G>HtJl5uDL?~eh>14A}$#+^^ zNQn_Dss?o~)xZfTC*;IP5$np^2lEBxL%G^nmBs?Pk~SobK+>2Z?9QmH7!b4Pk zCZ8Lf92p%Ets@q}AS@mzfo>b4X06$3FTu#7O0so{O8P@2!1Gcok}UN7IV^yZrL$aZ zA|EsbHs7=jm8}~;B3mCovTZbkMZ49xE4%^wNbfvY7o??0rRiTw?e+8NbtJAPP zMQgGIw2R9X(W~^>I%bIsOux~s3jr(%Hr>fxxovdPpB&v;Kx0)KWR~!#%90Wcpo{`F z#JtH-B333XNc)AUDSv2U8;q?bX|?mgWHw`*T{$#3B6Y3oD`Mb+0Xo-2_lZdl_yyfl zW#f=W9kdwEvVojq%C!jfCex{lwjgR!K+M|*J*NtbZ3loFl?6=CmMh*~9=Ucvcwlk1 zxj=1BmbK{YjkrIr+@~oDDLn2%q<3uAh`0#r80M*D7kKSjlW1e{18GoNZL-d|9v5u( zR;3$JU1j(HCj*0?%Ypu1@>jddVXZVXnV-q!U^kDB_+z86r7;1iQ+EaPc<3Zsl!i|k zo1shDAjx6sBK5>DC-xl=jL^P3wUBO(`QIX@GS;ymVf7je@Zv(7v)ay}AKTk#!#f^rAVgPGbpX%yuSL`^piE3Q@n z1BJI>3A!0`hU!&6R+AhY}phrxQ z;VjQob?)QpR(&#rISQoU2S%u2n%{<)NhWCEGg-t00o!rFvL@zDGAZS`e800lpl;O2 zT&Og_rB<6Yu(yJ}IzFreJcjg>Vdh`6R9TSXi8$7X#D?K!W4^k;T?%6@Cc0ogMnLIy z7*oW)8pPxe6vJ3xy~8R5oC;_S{5z)bM9q-;xMF&uFeo-RpmXQXHfo_MLLii91~58UiD zCxE%WsXy3`8fS#1)kJ?L z4J2cr_LJ*;Y{4hZ?UjnK@Wgm)uqO7^zQD&@c>=Fa3sQe{FQy9d4YbB4k~9iBbG1#9 zj?Rt_PBUWiBKh9DOuxF$MxowZFShogQdOVqQ0_6v2`2;QY20AQIjEJGB|nDLK}2(U z6#913O-l#K?ldd?hae0U|(PckyD6j2R^{}L3OV- zuI*MaN#_oYGBF@7G+;&e^UZFnvq;mGMg!Ui3Y*NUb^{YOo5WGIiLBBxTnIJM!gEju zA-SKK^>+;79kE)ovCv;`cIU`&(wP9J$LQ)9Z`G^>r7$F&`p!c&Vu*$>QO34QkaUnd zjb>`VwFN64$_N=(D#g7uvf`zF@Ze&isdFXdBj2o_hbIWiT%-#?p0J#u+JI zNflm^J?HkJF5hgx%ZcKNHP+*}Z(#%(mT4h1O-^Jg;uU};$iv9C$(jD)O&9lL%j4#O zP5qlUZr;3U)8k8kvwhH!8>N{4owvDh3V139e&K? zLHWhj=@iAsKz&~oJO%+C%~h{6Ygq-7U&_Y}zkDHystoh2U*M<3XzI}>TEE2J1<{$X zCNK%6`5a9nYy^P4F|%WIvVfZF%!tPdn4Qw*st957iDN9Lng(I?+MHDuAIPP@Qp9}Q z4JV6bIIzgt(sdAyyHU^If(zIiWv(0HcebaH%aacHV{_x&jA6qH?GNLS%}&#?mS(Ws z#zW{QSUfNx$V)}W3>2mK|9zkLYE~O0MA)j#YY{Yc3>!l|hSSD72K+{nk*HwTe5VI;YrjD?`Fz63tS&vQ4 zOpcJsFiy5)@xWwWyCiXlG!o1;_|3#K$4+Go3lOS#_7|}48s3W*%0auR87|IPv6IE4 z)snH42h@m3?PJixa9r!w8{R5+nFuOpN}xHbpr)d>#0o9+vA$#zz?S!D z*{r`1i6MdIDa5o$AGaZlCGqOcEwEG4gN-jb-c2{r_|#*UnpplJ|3|bDZOFia%GkuV zndw1VAPk8w^>;KLMq6d z@l`8Z-lX+}YR6|!8@!)tcK{{XDd<#rFdkDsU89u-S0lhPg)BpXC>idun6;3PT*fEq zq9KJwLL>^6v^`q3B;GI6Jn%N5MP=?zEk#U)y64f`^OrkCjFkxz72g9u*`NZP358P8 z->W5-*^neUHrhas%9{$AXtUCSo&=|PU4rU_wOer1>s*I5@&;5&dj%6@EcTF(o3))y zG+g%x)!vQvdn*;|Oi`Jj-p1oxWUYrh3Kf1=Bl`266XpJW8fLtlMW1${*&k{2Rd`>D zu8cQp(bF9$XVDD~G;7g~4wSR#hy%@zX>=w4S@cQ=nvtS|UwTuEUe@{fs&J}9IBWEt z6MzEjp%}{eBW1v+98Yo<4cN5H*c6nptGA3@A`;~HkX8H>I~a~|dWFf((gH!DFb`zKxYf<;fo z8`E?Fqea6Q3n>_Jl7MEcI|Mn4{@8(bUG+#mf7q>2At ztcczmlwr|tJ5ZiZV5RGj<3Nw-g&#j1B(rK-dt|(xoOs91RrMcSnY)cq3$6;gsf_T2 zuIY0A#O0i|oQGV_9-*avXzUHxw##xF)hW%2*Zj4Hzv^n5d%Ko)iz_wv2O9me02C&l z;#B#+QqqkO(j{?92o}#v)qk;h1(!83oz+4YB+Q~l3>qv>OF|n`=Et>`-wA4KQR64X z_4C(J+VGWeIW5^y9=>*vP+cqGh0|qRw{EyT+#__<$3CNv|3X6)`{j2Wvb%>|<{s%G z>i3Wc;ab!Xy2qlc3QE>y)Z#BXGZ*Q7nOYv#!y2M&i~iJs@)o7fr_hy5jyyArkGbpx zi$3K*GZqbFOjE93*K9`EKaR$ewGOXv+|CK%@!wHRK;N373leS7yaUZz)GC5hl05o* zSnKfVfCUz%FIUl(%v5UQ7oC|f$1`WW?rDeOWv`{t^32nEIttO{c?Yz*^u0&A&;S-a z>_B;oendg(_4&nOq)Hx$QFxTseZV_pME;JWs0}DrA@)O`m!r#a{5<(H-upE73zw5U z!gNH(J&N(;8iL~%U5hv9=}Km=JhSY7;<6Vk`c(&-v1k}$Zyz)h;>VhCBMu0l>sT*) z)>e*rhYYqwpJlwuEsE1J_=36j4vl^x0Lio97w_+rc;T`t&{;cl(Wqr{oE5?s`kF-- z9Vl|1#iBteJ?fr%GtQ(`R(hHjqs61| zIAnLfpi{pQo!Tc4Ib1?Vi}k6-RT8ok0j9=&q%fAOEQLfQ=zWCM14nz`N<0rbp(kr z-Vcrh(-9;R8rR|c3c60y5W2&nn;j@;(U0mJ=!MjYVf+=BytaGN*vSZ)d9%LGd@yIi$4`4 zqwgux)#uopd$~r>(~xpn{MUkHHH`+X(PQ_CvX9pR1ECT3h$CdyN_~YZp=az+Gto1I z);9127{YHkgjZW-Cmh17dj+Ux0I-3nw~XCZ#^bJx-B!k1T^YN3%Sh0i-;DKDVzIPC z@SE}CsS*aYjQ5nH$~vlgyeHWsNtE$^bR?LLAQ4INZpBs75CioNt~QRmKLADG^%e~Pt?MTa6^lc85kK;_SnR*3p#su%{P8NHVvk-Dv`FNM{)0?sA zy$+PO=zmsFvdJo=?k^H!n0accL!r!A)IPG1Oinm64zJbQj90Meqyx=ZG>oygr}O9m zy&GVDOrvB}S^QatHfPaS1*|+Z_*8Weq~Se%!uca+xRK`A*aQHL>S(MKKVN<%lH25iQC`@o3hr3;+!8$(A@W%wR(_;&W<+vyO6 zB2$_p$XV#knYfg7bx+Qj-kd!P1uXo1Y%sUs8J^g?e41%W5J?fT6;$eqmsVMOIOJu z$QkQz4nW4_j|QNJHTt~(B$%SV^Z|Fe&U9n_j785;kTkd?i~p|EG^YjGE&3V<%3JjG zBfv-{Y*ZtBSVKswMc?B#f7>O@S@icEC~qZvDF6xH=DKoJEZwjDMf#8Q3&Ako|w* zHjQsa`p;MCtjl+Yt8&jkm&sV=zn`AyY}KQ0(9i}l8+x8nxT*Ch-=&PnxiyAoneiOwBdk#PKyzepmBrm7+TCebD7!Evh0$5b|8kA4?4=DVA z!cR~*zC^~?VTGTi@WTq0j>A=V#+rQu=YEUxSYY{N$o&>Pg0Pg10Be z=eIHZwccGZco}fo39)N9if4t>pXl1%o*ra4dg~s8Nccg(*LWBe`=jtffS-i+%54&O z{U`~^6Q+GWlHqflJ_6#Khf?5wp906(hhBd#8t-(#lghmSaH8|@2FYZf?IXh^Dg7=@ zf6suVw=cT48Qxp)!4y32NrB&)f``6Lo7Q@HKD@qa2M z{oeqd#Q!H0kA2j_e31V;CH+z82TAo^p8|h<3j8vLgP-RK;eW35(`LRTI_FdH+>ny~ zX2AOuXE-23JBj|gQ{bOXfqy9l{!PG>=zl6D{aUD=Bzn#OJPFSmQ{dw%c=o2i4>BA} z4cag8^)$Y2OG*EGn*Me zOH<%irNCPZf0-Bme)PLj(til>BsxEqlKwL(>1p96sb2pxCH)#SVN$s#1KzJ~6b?23 zPUA(tw)^Y!;cyBbT8(;b7=gx@8Bgy6S~Da3ORD#7(j<4Lr2mg8@J}nA2VO4-j<%vo zExde(vyE`x72bcXEa0_IyusO_V_ooOCLOF=Zu$$g<{VDkD&rg=9Dj?K;^=52I!~}X zurWCW&bet+aehdvxQa7fIyiAd&haaE>-AM+3ElBoZIPsQ02jSW7kYm2Pb~=^5KRB>SKhs1>Y!4(gB5xve;BY{bXWp;TXDMZ1Xu z73h2;&mXyRa&QL@qVRnjdf|_bYliWWX@CklaF(oO-L`#dXmC5ucpRg{k_&@FIQ7eu z6YQv7vG=|cPxqi#yGq3 z=5o(TYq8^-(vKO8@{NuG;PVEkPI3?hpZ&ux-rL!*@&c$ksDhG4kNS~gaU$nt3P>>O zDKoLxNC^#}+8{~!1%F8yZE!i@B6{){Q`>XaSFCDaBc%&*7Vp5j7q6p*(0i8r@;l{- z9DWx9Ftst1`U-C3)!A4Qym)FHkoSXeN=L=s!Nmz!cp;eDyoLQl$-rbk@7Ck*hN_!F7wRyDb*bCv5nz~QWw00yQ$iq9~dIYeZ-spsaR9*1i zG>WsM7h?Euuu|F)A9m`fJJX&OVxl^Xwv>@>3NU_^LxN{FE9U4M=Am4=!O(W@wHM$(p;0?4_>v&-uVF$;OP`GHZMiZYGTxfI$=yaFz z1{@g1cYIRMKzX%+oF0deEq-FJ-G^^{Ji}=lMM|i#C7fF|fH4ribPBpRzysnytI20= z3{)0%$j4zfp1YGAGWJUji&HKt0tlF#V!c`dJvi5peg?QS!90iK zPLHY1(R=bhfb&HbfV$YAV=DEQm9RaUo5R7f_JocJ6)x%#6aKEfWksI2hS z#!WbXf4@An@Bz%b!bG}D;`INP<~RO( zTQ#YMyJGYk|1_2NuMr{oEx-BiEWE=KY8Ws7FyP_*&kjpM3%AEI#LNFZBqv|8k!gP2 z+z!DLPjB}Y{vnc)@89y9A9?2y=KrtAOY~cQ^LOsi{Ns2QzWT#Ah(Cn?aQ?e|NpRPc zgz*hIMz@838_VzQk$m><lKpV98G6|$-UkG01+yGqX9Iu{OZPnwRG3wZ%TAY%kQ^@nj$7n-a0&w zCE=8}D&ymH#nb*uO8y5l|Jkv1@Ob_=q~w3{KM28RJH;gT@%(R0$$!GVlK#G!^C6yp zRP)E{`RUI}{>xq~q5WEZ3v-&^o?G}+5-eQbHHU=U_V8NP1N31ic=9+Y;c!g;tXxY< z_ojOcM&Y}4J7VrwfxZR-{hQpMCScxiWU{Lu4jy{7l=QW*aN$Y3d>XEj^50DhFSx3) z46$2}#uqBW)nSQp;o2xE&yqX$8<$_|AO9;f{+^@x&(Zuf&3T4~R)0fy2_m$%Y~|ms z`ES?!_h|jkL>i*V@*DrY1Q>~^F4||G6(d@xBlLtMS^Oo zep1uDb9+Br_Afv7#>{!^7yH-ovvI(;(O`Ib4T-$10OtV)7m}feq_^s z`qbC9HirM(^aT(8;I{|%zwxmT{N#i}W9{E>tTZ3F<(6k|x&OGw-qAVt;0eF;x`|tW zBK3L_{npwzoTv`%~cG zg}5fsPwz7%;aN?AuTO!$6Z9wHCpD9V|G5-C{4wZH!t;6XFA2T~{7LY~QqsRQCH<)> z<^B+OlIZ_~6#02919rO@-&DfJys zX~#keemaUIsob+t`2U3z_?J@T>KNcp;@e6}xgSlTe>SDu52dsVt=lD)OUtqS_>W)r z0)JBaF(iC#JTdNRqhb=@ewb3P^(pBObG>@k@Bbz96YF#5Na41=PW}bn4{?^jZ9RKP z@x<3Vt6c8Oy!g82UQHigC(CI1_`VQ2zJ$t+@2j9Urjpjfu3|Yyxv}*vI(~@h-yrnc zevX5hKED6p14>VPAHaa(iLbA3Q9SW=*$a)IzbfUvLIQ8+OV>*rc!>iqao{Bmyu^Wj z8XVA(>z{X^`_sMq)E|Q3ov&T7dpqL5p1&{l{0*^tJ9ywYV{gAij@NrzN3i{5=3lpU z5%b5qQq!CN{MCAI&!73}^GyPoe+p&}U*_*ovOM!YsoTyo{}1`7=rX?(%pSS+NC5MW zFI(@iebnl{^349Rbs>Y>I+M|9>rKZfJ}ZybxCmtHTC`?H_r~X^^xoFZp40n&O7#EY zifvYSpFtuFXSa>*L$USq7zvT>CSkhe3z32}yxS+bDo=~&ys}FhG5w;#}x=oX~d&JSDu@BPfG%bK`9B1%fI?IW}cLU%1hHV1^c7TG1Fq$~TP*h!R( z&iFP3qB3cphA`Up=1{5~vd2dD<-|9I#3d(G4PfVeI{IBH{ou3gPeCcM%_q@RvY|m! zfghnSeo7Thn&|72!A=l6K|g?ii16N!l)Z5Ydv2&A+RbRYoUkSQWysL>6yj1SJ<3el zX0~7_?OXCd>Udub3D}5!EIqc_&c0p>D#9Ohim@WR(=J4g+i}E=*|Vojp>FS#-p6x= zHlqkzqF&=a yUREx7!~Eupwrrj&aY360HV$mM&^v2tdSctew=Py<9ZON4Z6h!+c`1-$z>{g-x literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/PIL/_webp.pyi b/venv/lib/python3.12/site-packages/PIL/_webp.pyi new file mode 100644 index 0000000..e27843e --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/_webp.pyi @@ -0,0 +1,3 @@ +from typing import Any + +def __getattr__(name: str) -> Any: ... diff --git a/venv/lib/python3.12/site-packages/PIL/features.py b/venv/lib/python3.12/site-packages/PIL/features.py new file mode 100644 index 0000000..75d59e0 --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/features.py @@ -0,0 +1,352 @@ +from __future__ import annotations + +import collections +import os +import sys +import warnings +from typing import IO + +import PIL + +from . import Image +from ._deprecate import deprecate + +modules = { + "pil": ("PIL._imaging", "PILLOW_VERSION"), + "tkinter": ("PIL._tkinter_finder", "tk_version"), + "freetype2": ("PIL._imagingft", "freetype2_version"), + "littlecms2": ("PIL._imagingcms", "littlecms_version"), + "webp": ("PIL._webp", "webpdecoder_version"), +} + + +def check_module(feature: str) -> bool: + """ + Checks if a module is available. + + :param feature: The module to check for. + :returns: ``True`` if available, ``False`` otherwise. + :raises ValueError: If the module is not defined in this version of Pillow. + """ + if feature not in modules: + msg = f"Unknown module {feature}" + raise ValueError(msg) + + module, ver = modules[feature] + + try: + __import__(module) + return True + except ModuleNotFoundError: + return False + except ImportError as ex: + warnings.warn(str(ex)) + return False + + +def version_module(feature: str) -> str | None: + """ + :param feature: The module to check for. + :returns: + The loaded version number as a string, or ``None`` if unknown or not available. + :raises ValueError: If the module is not defined in this version of Pillow. + """ + if not check_module(feature): + return None + + module, ver = modules[feature] + + return getattr(__import__(module, fromlist=[ver]), ver) + + +def get_supported_modules() -> list[str]: + """ + :returns: A list of all supported modules. + """ + return [f for f in modules if check_module(f)] + + +codecs = { + "jpg": ("jpeg", "jpeglib"), + "jpg_2000": ("jpeg2k", "jp2klib"), + "zlib": ("zip", "zlib"), + "libtiff": ("libtiff", "libtiff"), +} + + +def check_codec(feature: str) -> bool: + """ + Checks if a codec is available. + + :param feature: The codec to check for. + :returns: ``True`` if available, ``False`` otherwise. + :raises ValueError: If the codec is not defined in this version of Pillow. + """ + if feature not in codecs: + msg = f"Unknown codec {feature}" + raise ValueError(msg) + + codec, lib = codecs[feature] + + return f"{codec}_encoder" in dir(Image.core) + + +def version_codec(feature: str) -> str | None: + """ + :param feature: The codec to check for. + :returns: + The version number as a string, or ``None`` if not available. + Checked at compile time for ``jpg``, run-time otherwise. + :raises ValueError: If the codec is not defined in this version of Pillow. + """ + if not check_codec(feature): + return None + + codec, lib = codecs[feature] + + version = getattr(Image.core, f"{lib}_version") + + if feature == "libtiff": + return version.split("\n")[0].split("Version ")[1] + + return version + + +def get_supported_codecs() -> list[str]: + """ + :returns: A list of all supported codecs. + """ + return [f for f in codecs if check_codec(f)] + + +features: dict[str, tuple[str, str | bool, str | None]] = { + "webp_anim": ("PIL._webp", True, None), + "webp_mux": ("PIL._webp", True, None), + "transp_webp": ("PIL._webp", True, None), + "raqm": ("PIL._imagingft", "HAVE_RAQM", "raqm_version"), + "fribidi": ("PIL._imagingft", "HAVE_FRIBIDI", "fribidi_version"), + "harfbuzz": ("PIL._imagingft", "HAVE_HARFBUZZ", "harfbuzz_version"), + "libjpeg_turbo": ("PIL._imaging", "HAVE_LIBJPEGTURBO", "libjpeg_turbo_version"), + "libimagequant": ("PIL._imaging", "HAVE_LIBIMAGEQUANT", "imagequant_version"), + "xcb": ("PIL._imaging", "HAVE_XCB", None), +} + + +def check_feature(feature: str) -> bool | None: + """ + Checks if a feature is available. + + :param feature: The feature to check for. + :returns: ``True`` if available, ``False`` if unavailable, ``None`` if unknown. + :raises ValueError: If the feature is not defined in this version of Pillow. + """ + if feature not in features: + msg = f"Unknown feature {feature}" + raise ValueError(msg) + + module, flag, ver = features[feature] + + if isinstance(flag, bool): + deprecate(f'check_feature("{feature}")', 12) + try: + imported_module = __import__(module, fromlist=["PIL"]) + if isinstance(flag, bool): + return flag + return getattr(imported_module, flag) + except ModuleNotFoundError: + return None + except ImportError as ex: + warnings.warn(str(ex)) + return None + + +def version_feature(feature: str) -> str | None: + """ + :param feature: The feature to check for. + :returns: The version number as a string, or ``None`` if not available. + :raises ValueError: If the feature is not defined in this version of Pillow. + """ + if not check_feature(feature): + return None + + module, flag, ver = features[feature] + + if ver is None: + return None + + return getattr(__import__(module, fromlist=[ver]), ver) + + +def get_supported_features() -> list[str]: + """ + :returns: A list of all supported features. + """ + supported_features = [] + for f, (module, flag, _) in features.items(): + if flag is True: + for feature, (feature_module, _) in modules.items(): + if feature_module == module: + if check_module(feature): + supported_features.append(f) + break + elif check_feature(f): + supported_features.append(f) + return supported_features + + +def check(feature: str) -> bool | None: + """ + :param feature: A module, codec, or feature name. + :returns: + ``True`` if the module, codec, or feature is available, + ``False`` or ``None`` otherwise. + """ + + if feature in modules: + return check_module(feature) + if feature in codecs: + return check_codec(feature) + if feature in features: + return check_feature(feature) + warnings.warn(f"Unknown feature '{feature}'.", stacklevel=2) + return False + + +def version(feature: str) -> str | None: + """ + :param feature: + The module, codec, or feature to check for. + :returns: + The version number as a string, or ``None`` if unknown or not available. + """ + if feature in modules: + return version_module(feature) + if feature in codecs: + return version_codec(feature) + if feature in features: + return version_feature(feature) + return None + + +def get_supported() -> list[str]: + """ + :returns: A list of all supported modules, features, and codecs. + """ + + ret = get_supported_modules() + ret.extend(get_supported_features()) + ret.extend(get_supported_codecs()) + return ret + + +def pilinfo(out: IO[str] | None = None, supported_formats: bool = True) -> None: + """ + Prints information about this installation of Pillow. + This function can be called with ``python3 -m PIL``. + It can also be called with ``python3 -m PIL.report`` or ``python3 -m PIL --report`` + to have "supported_formats" set to ``False``, omitting the list of all supported + image file formats. + + :param out: + The output stream to print to. Defaults to ``sys.stdout`` if ``None``. + :param supported_formats: + If ``True``, a list of all supported image file formats will be printed. + """ + + if out is None: + out = sys.stdout + + Image.init() + + print("-" * 68, file=out) + print(f"Pillow {PIL.__version__}", file=out) + py_version_lines = sys.version.splitlines() + print(f"Python {py_version_lines[0].strip()}", file=out) + for py_version in py_version_lines[1:]: + print(f" {py_version.strip()}", file=out) + print("-" * 68, file=out) + print(f"Python executable is {sys.executable or 'unknown'}", file=out) + if sys.prefix != sys.base_prefix: + print(f"Environment Python files loaded from {sys.prefix}", file=out) + print(f"System Python files loaded from {sys.base_prefix}", file=out) + print("-" * 68, file=out) + print( + f"Python Pillow modules loaded from {os.path.dirname(Image.__file__)}", + file=out, + ) + print( + f"Binary Pillow modules loaded from {os.path.dirname(Image.core.__file__)}", + file=out, + ) + print("-" * 68, file=out) + + for name, feature in [ + ("pil", "PIL CORE"), + ("tkinter", "TKINTER"), + ("freetype2", "FREETYPE2"), + ("littlecms2", "LITTLECMS2"), + ("webp", "WEBP"), + ("jpg", "JPEG"), + ("jpg_2000", "OPENJPEG (JPEG2000)"), + ("zlib", "ZLIB (PNG/ZIP)"), + ("libtiff", "LIBTIFF"), + ("raqm", "RAQM (Bidirectional Text)"), + ("libimagequant", "LIBIMAGEQUANT (Quantization method)"), + ("xcb", "XCB (X protocol)"), + ]: + if check(name): + v: str | None = None + if name == "jpg": + libjpeg_turbo_version = version_feature("libjpeg_turbo") + if libjpeg_turbo_version is not None: + v = "libjpeg-turbo " + libjpeg_turbo_version + if v is None: + v = version(name) + if v is not None: + version_static = name in ("pil", "jpg") + if name == "littlecms2": + # this check is also in src/_imagingcms.c:setup_module() + version_static = tuple(int(x) for x in v.split(".")) < (2, 7) + t = "compiled for" if version_static else "loaded" + if name == "raqm": + for f in ("fribidi", "harfbuzz"): + v2 = version_feature(f) + if v2 is not None: + v += f", {f} {v2}" + print("---", feature, "support ok,", t, v, file=out) + else: + print("---", feature, "support ok", file=out) + else: + print("***", feature, "support not installed", file=out) + print("-" * 68, file=out) + + if supported_formats: + extensions = collections.defaultdict(list) + for ext, i in Image.EXTENSION.items(): + extensions[i].append(ext) + + for i in sorted(Image.ID): + line = f"{i}" + if i in Image.MIME: + line = f"{line} {Image.MIME[i]}" + print(line, file=out) + + if i in extensions: + print( + "Extensions: {}".format(", ".join(sorted(extensions[i]))), file=out + ) + + features = [] + if i in Image.OPEN: + features.append("open") + if i in Image.SAVE: + features.append("save") + if i in Image.SAVE_ALL: + features.append("save_all") + if i in Image.DECODERS: + features.append("decode") + if i in Image.ENCODERS: + features.append("encode") + + print("Features: {}".format(", ".join(features)), file=out) + print("-" * 68, file=out) diff --git a/venv/lib/python3.12/site-packages/PIL/py.typed b/venv/lib/python3.12/site-packages/PIL/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/venv/lib/python3.12/site-packages/PIL/report.py b/venv/lib/python3.12/site-packages/PIL/report.py new file mode 100644 index 0000000..d2815e8 --- /dev/null +++ b/venv/lib/python3.12/site-packages/PIL/report.py @@ -0,0 +1,5 @@ +from __future__ import annotations + +from .features import pilinfo + +pilinfo(supported_formats=False) diff --git a/venv/lib/python3.12/site-packages/Xlib/X.py b/venv/lib/python3.12/site-packages/Xlib/X.py new file mode 100644 index 0000000..826854f --- /dev/null +++ b/venv/lib/python3.12/site-packages/Xlib/X.py @@ -0,0 +1,424 @@ +# Xlib.X -- basic X constants +# +# Copyright (C) 2000 Peter Liljenberg +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public License +# as published by the Free Software Foundation; either version 2.1 +# of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the +# Free Software Foundation, Inc., +# 59 Temple Place, +# Suite 330, +# Boston, MA 02111-1307 USA + +# Avoid overwriting None if doing "from Xlib.X import *" +NONE = 0 + +ParentRelative = 1 # background pixmap in CreateWindow + # and ChangeWindowAttributes + +CopyFromParent = 0 # border pixmap in CreateWindow + # and ChangeWindowAttributes + # special VisualID and special window + # class passed to CreateWindow + +PointerWindow = 0 # destination window in SendEvent +InputFocus = 1 # destination window in SendEvent +PointerRoot = 1 # focus window in SetInputFocus +AnyPropertyType = 0 # special Atom, passed to GetProperty +AnyKey = 0 # special Key Code, passed to GrabKey +AnyButton = 0 # special Button Code, passed to GrabButton +AllTemporary = 0 # special Resource ID passed to KillClient +CurrentTime = 0 # special Time +NoSymbol = 0 # special KeySym + + +#----------------------------------------------------------------------- +# Event masks: +# +NoEventMask = 0 +KeyPressMask = (1<<0) +KeyReleaseMask = (1<<1) +ButtonPressMask = (1<<2) +ButtonReleaseMask = (1<<3) +EnterWindowMask = (1<<4) +LeaveWindowMask = (1<<5) +PointerMotionMask = (1<<6) +PointerMotionHintMask = (1<<7) +Button1MotionMask = (1<<8) +Button2MotionMask = (1<<9) +Button3MotionMask = (1<<10) +Button4MotionMask = (1<<11) +Button5MotionMask = (1<<12) +ButtonMotionMask = (1<<13) +KeymapStateMask = (1<<14) +ExposureMask = (1<<15) +VisibilityChangeMask = (1<<16) +StructureNotifyMask = (1<<17) +ResizeRedirectMask = (1<<18) +SubstructureNotifyMask = (1<<19) +SubstructureRedirectMask = (1<<20) +FocusChangeMask = (1<<21) +PropertyChangeMask = (1<<22) +ColormapChangeMask = (1<<23) +OwnerGrabButtonMask = (1<<24) + +#----------------------------------------------------------------------- +# Event names: +# +# Used in "type" field in XEvent structures. Not to be confused with event +# masks above. They start from 2 because 0 and 1 are reserved in the +# protocol for errors and replies. +# +KeyPress = 2 +KeyRelease = 3 +ButtonPress = 4 +ButtonRelease = 5 +MotionNotify = 6 +EnterNotify = 7 +LeaveNotify = 8 +FocusIn = 9 +FocusOut = 10 +KeymapNotify = 11 +Expose = 12 +GraphicsExpose = 13 +NoExpose = 14 +VisibilityNotify = 15 +CreateNotify = 16 +DestroyNotify = 17 +UnmapNotify = 18 +MapNotify = 19 +MapRequest = 20 +ReparentNotify = 21 +ConfigureNotify = 22 +ConfigureRequest = 23 +GravityNotify = 24 +ResizeRequest = 25 +CirculateNotify = 26 +CirculateRequest = 27 +PropertyNotify = 28 +SelectionClear = 29 +SelectionRequest = 30 +SelectionNotify = 31 +ColormapNotify = 32 +ClientMessage = 33 +MappingNotify = 34 +LASTEvent = 35 # must be bigger than any event + + +#----------------------------------------------------------------------- +# Key masks: +# +# Used as modifiers to GrabButton and GrabKey, results of QueryPointer, +# state in various key-, mouse-, and button-related events. +# +ShiftMask = (1<<0) +LockMask = (1<<1) +ControlMask = (1<<2) +Mod1Mask = (1<<3) +Mod2Mask = (1<<4) +Mod3Mask = (1<<5) +Mod4Mask = (1<<6) +Mod5Mask = (1<<7) + + +#----------------------------------------------------------------------- +# Modifier names: +# +# Used to build a SetModifierMapping request or to read a +# GetModifierMapping request. These correspond to the masks defined above. +# +ShiftMapIndex = 0 +LockMapIndex = 1 +ControlMapIndex = 2 +Mod1MapIndex = 3 +Mod2MapIndex = 4 +Mod3MapIndex = 5 +Mod4MapIndex = 6 +Mod5MapIndex = 7 + +#----------------------------------------------------------------------- +# Button masks: +# +# Used in same manner as Key masks above. Not to be confused with button +# names below. Note that 0 is already defined above as "AnyButton". +# +Button1Mask = (1<<8) +Button2Mask = (1<<9) +Button3Mask = (1<<10) +Button4Mask = (1<<11) +Button5Mask = (1<<12) + +AnyModifier = (1<<15) # used in GrabButton, GrabKey + +#----------------------------------------------------------------------- +# Button names: +# +# Used as arguments to GrabButton and as detail in ButtonPress and +# ButtonRelease events. Not to be confused with button masks above. +# Note that 0 is already defined above as "AnyButton". +# +Button1 = 1 +Button2 = 2 +Button3 = 3 +Button4 = 4 +Button5 = 5 + + +#----------------------------------------------------------------------- +# XXX These still need documentation -- for now, read +# +NotifyNormal = 0 +NotifyGrab = 1 +NotifyUngrab = 2 +NotifyWhileGrabbed = 3 +NotifyHint = 1 +NotifyAncestor = 0 +NotifyVirtual = 1 +NotifyInferior = 2 +NotifyNonlinear = 3 +NotifyNonlinearVirtual = 4 +NotifyPointer = 5 +NotifyPointerRoot = 6 +NotifyDetailNone = 7 +VisibilityUnobscured = 0 +VisibilityPartiallyObscured = 1 +VisibilityFullyObscured = 2 +PlaceOnTop = 0 +PlaceOnBottom = 1 +FamilyInternet = 0 +FamilyDECnet = 1 +FamilyChaos = 2 +FamilyServerInterpreted = 5 +FamilyInternetV6 = 6 +PropertyNewValue = 0 +PropertyDelete = 1 +ColormapUninstalled = 0 +ColormapInstalled = 1 +GrabModeSync = 0 +GrabModeAsync = 1 +GrabSuccess = 0 +AlreadyGrabbed = 1 +GrabInvalidTime = 2 +GrabNotViewable = 3 +GrabFrozen = 4 +AsyncPointer = 0 +SyncPointer = 1 +ReplayPointer = 2 +AsyncKeyboard = 3 +SyncKeyboard = 4 +ReplayKeyboard = 5 +AsyncBoth = 6 +SyncBoth = 7 +RevertToNone = 0 +RevertToPointerRoot = PointerRoot +RevertToParent = 2 +Success = 0 +BadRequest = 1 +BadValue = 2 +BadWindow = 3 +BadPixmap = 4 +BadAtom = 5 +BadCursor = 6 +BadFont = 7 +BadMatch = 8 +BadDrawable = 9 +BadAccess = 10 +BadAlloc = 11 +BadColor = 12 +BadGC = 13 +BadIDChoice = 14 +BadName = 15 +BadLength = 16 +BadImplementation = 17 +FirstExtensionError = 128 +LastExtensionError = 255 +InputOutput = 1 +InputOnly = 2 +CWBackPixmap = (1<<0) +CWBackPixel = (1<<1) +CWBorderPixmap = (1<<2) +CWBorderPixel = (1<<3) +CWBitGravity = (1<<4) +CWWinGravity = (1<<5) +CWBackingStore = (1<<6) +CWBackingPlanes = (1<<7) +CWBackingPixel = (1<<8) +CWOverrideRedirect = (1<<9) +CWSaveUnder = (1<<10) +CWEventMask = (1<<11) +CWDontPropagate = (1<<12) +CWColormap = (1<<13) +CWCursor = (1<<14) +CWX = (1<<0) +CWY = (1<<1) +CWWidth = (1<<2) +CWHeight = (1<<3) +CWBorderWidth = (1<<4) +CWSibling = (1<<5) +CWStackMode = (1<<6) +ForgetGravity = 0 +NorthWestGravity = 1 +NorthGravity = 2 +NorthEastGravity = 3 +WestGravity = 4 +CenterGravity = 5 +EastGravity = 6 +SouthWestGravity = 7 +SouthGravity = 8 +SouthEastGravity = 9 +StaticGravity = 10 +UnmapGravity = 0 +NotUseful = 0 +WhenMapped = 1 +Always = 2 +IsUnmapped = 0 +IsUnviewable = 1 +IsViewable = 2 +SetModeInsert = 0 +SetModeDelete = 1 +DestroyAll = 0 +RetainPermanent = 1 +RetainTemporary = 2 +Above = 0 +Below = 1 +TopIf = 2 +BottomIf = 3 +Opposite = 4 +RaiseLowest = 0 +LowerHighest = 1 +PropModeReplace = 0 +PropModePrepend = 1 +PropModeAppend = 2 +GXclear = 0x0 +GXand = 0x1 +GXandReverse = 0x2 +GXcopy = 0x3 +GXandInverted = 0x4 +GXnoop = 0x5 +GXxor = 0x6 +GXor = 0x7 +GXnor = 0x8 +GXequiv = 0x9 +GXinvert = 0xa +GXorReverse = 0xb +GXcopyInverted = 0xc +GXorInverted = 0xd +GXnand = 0xe +GXset = 0xf +LineSolid = 0 +LineOnOffDash = 1 +LineDoubleDash = 2 +CapNotLast = 0 +CapButt = 1 +CapRound = 2 +CapProjecting = 3 +JoinMiter = 0 +JoinRound = 1 +JoinBevel = 2 +FillSolid = 0 +FillTiled = 1 +FillStippled = 2 +FillOpaqueStippled = 3 +EvenOddRule = 0 +WindingRule = 1 +ClipByChildren = 0 +IncludeInferiors = 1 +Unsorted = 0 +YSorted = 1 +YXSorted = 2 +YXBanded = 3 +CoordModeOrigin = 0 +CoordModePrevious = 1 +Complex = 0 +Nonconvex = 1 +Convex = 2 +ArcChord = 0 +ArcPieSlice = 1 +GCFunction = (1<<0) +GCPlaneMask = (1<<1) +GCForeground = (1<<2) +GCBackground = (1<<3) +GCLineWidth = (1<<4) +GCLineStyle = (1<<5) +GCCapStyle = (1<<6) +GCJoinStyle = (1<<7) +GCFillStyle = (1<<8) +GCFillRule = (1<<9) +GCTile = (1<<10) +GCStipple = (1<<11) +GCTileStipXOrigin = (1<<12) +GCTileStipYOrigin = (1<<13) +GCFont = (1<<14) +GCSubwindowMode = (1<<15) +GCGraphicsExposures = (1<<16) +GCClipXOrigin = (1<<17) +GCClipYOrigin = (1<<18) +GCClipMask = (1<<19) +GCDashOffset = (1<<20) +GCDashList = (1<<21) +GCArcMode = (1<<22) +GCLastBit = 22 +FontLeftToRight = 0 +FontRightToLeft = 1 +FontChange = 255 +XYBitmap = 0 +XYPixmap = 1 +ZPixmap = 2 +AllocNone = 0 +AllocAll = 1 +DoRed = (1<<0) +DoGreen = (1<<1) +DoBlue = (1<<2) +CursorShape = 0 +TileShape = 1 +StippleShape = 2 +AutoRepeatModeOff = 0 +AutoRepeatModeOn = 1 +AutoRepeatModeDefault = 2 +LedModeOff = 0 +LedModeOn = 1 +KBKeyClickPercent = (1<<0) +KBBellPercent = (1<<1) +KBBellPitch = (1<<2) +KBBellDuration = (1<<3) +KBLed = (1<<4) +KBLedMode = (1<<5) +KBKey = (1<<6) +KBAutoRepeatMode = (1<<7) +MappingSuccess = 0 +MappingBusy = 1 +MappingFailed = 2 +MappingModifier = 0 +MappingKeyboard = 1 +MappingPointer = 2 +DontPreferBlanking = 0 +PreferBlanking = 1 +DefaultBlanking = 2 +DisableScreenSaver = 0 +DisableScreenInterval = 0 +DontAllowExposures = 0 +AllowExposures = 1 +DefaultExposures = 2 +ScreenSaverReset = 0 +ScreenSaverActive = 1 +HostInsert = 0 +HostDelete = 1 +EnableAccess = 1 +DisableAccess = 0 +StaticGray = 0 +GrayScale = 1 +StaticColor = 2 +PseudoColor = 3 +TrueColor = 4 +DirectColor = 5 +LSBFirst = 0 +MSBFirst = 1 diff --git a/venv/lib/python3.12/site-packages/Xlib/XK.py b/venv/lib/python3.12/site-packages/Xlib/XK.py new file mode 100644 index 0000000..4b8bf8c --- /dev/null +++ b/venv/lib/python3.12/site-packages/Xlib/XK.py @@ -0,0 +1,89 @@ +# Xlib.XK -- X keysym defs +# +# Copyright (C) 2000 Peter Liljenberg +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public License +# as published by the Free Software Foundation; either version 2.1 +# of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the +# Free Software Foundation, Inc., +# 59 Temple Place, +# Suite 330, +# Boston, MA 02111-1307 USA +# +# This module defines some functions for working with X keysyms as well +# as a modular keysym definition and loading mechanism. See the keysym +# definition modules in the Xlib/keysymdef directory. + +from Xlib.X import NoSymbol + +def string_to_keysym(keysym): + '''Return the (16 bit) numeric code of keysym. + + Given the name of a keysym as a string, return its numeric code. + Don't include the 'XK_' prefix, just use the base, i.e. 'Delete' + instead of 'XK_Delete'.''' + return globals().get('XK_' + keysym, NoSymbol) + +def load_keysym_group(group): + '''Load all the keysyms in group. + + Given a group name such as 'latin1' or 'katakana' load the keysyms + defined in module 'Xlib.keysymdef.group-name' into this XK module.''' + if '.' in group: + raise ValueError('invalid keysym group name: %s' % group) + + G = globals() #Get a reference to XK.__dict__ a.k.a. globals + + #Import just the keysyms module. + mod = __import__('Xlib.keysymdef.%s' % group, G, locals(), [group]) + + #Extract names of just the keysyms. + keysyms = [n for n in dir(mod) if n.startswith('XK_')] + + #Copy the named keysyms into XK.__dict__ + for keysym in keysyms: + ## k = mod.__dict__[keysym]; assert k == int(k) #probably too much. + G[keysym] = mod.__dict__[keysym] + + #And get rid of the keysym module. + del mod + +def _load_keysyms_into_XK(mod): + '''keysym definition modules need no longer call Xlib.XK._load_keysyms_into_XK(). + You should remove any calls to that function from your keysym modules.''' + pass + +# Always import miscellany and latin1 keysyms +load_keysym_group('miscellany') +load_keysym_group('latin1') + + +def keysym_to_string(keysym): + '''Translate a keysym (16 bit number) into a python string. + + This will pass 0 to 0xff as well as XK_BackSpace, XK_Tab, XK_Clear, + XK_Return, XK_Pause, XK_Scroll_Lock, XK_Escape, XK_Delete. For other + values it returns None.''' + + # ISO latin 1, LSB is the code + if keysym & 0xff00 == 0: + return chr(keysym & 0xff) + + if keysym in [XK_BackSpace, XK_Tab, XK_Clear, XK_Return, + XK_Pause, XK_Scroll_Lock, XK_Escape, XK_Delete]: + return chr(keysym & 0xff) + + # We should be able to do these things quite automatically + # for latin2, latin3, etc, in Python 2.0 using the Unicode, + # but that will have to wait. + + return None diff --git a/venv/lib/python3.12/site-packages/Xlib/Xatom.py b/venv/lib/python3.12/site-packages/Xlib/Xatom.py new file mode 100644 index 0000000..6fedaaf --- /dev/null +++ b/venv/lib/python3.12/site-packages/Xlib/Xatom.py @@ -0,0 +1,90 @@ +# Xlib.Xatom -- Standard X atoms +# +# Copyright (C) 2000 Peter Liljenberg +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public License +# as published by the Free Software Foundation; either version 2.1 +# of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the +# Free Software Foundation, Inc., +# 59 Temple Place, +# Suite 330, +# Boston, MA 02111-1307 USA + +PRIMARY = 1 +SECONDARY = 2 +ARC = 3 +ATOM = 4 +BITMAP = 5 +CARDINAL = 6 +COLORMAP = 7 +CURSOR = 8 +CUT_BUFFER0 = 9 +CUT_BUFFER1 = 10 +CUT_BUFFER2 = 11 +CUT_BUFFER3 = 12 +CUT_BUFFER4 = 13 +CUT_BUFFER5 = 14 +CUT_BUFFER6 = 15 +CUT_BUFFER7 = 16 +DRAWABLE = 17 +FONT = 18 +INTEGER = 19 +PIXMAP = 20 +POINT = 21 +RECTANGLE = 22 +RESOURCE_MANAGER = 23 +RGB_COLOR_MAP = 24 +RGB_BEST_MAP = 25 +RGB_BLUE_MAP = 26 +RGB_DEFAULT_MAP = 27 +RGB_GRAY_MAP = 28 +RGB_GREEN_MAP = 29 +RGB_RED_MAP = 30 +STRING = 31 +VISUALID = 32 +WINDOW = 33 +WM_COMMAND = 34 +WM_HINTS = 35 +WM_CLIENT_MACHINE = 36 +WM_ICON_NAME = 37 +WM_ICON_SIZE = 38 +WM_NAME = 39 +WM_NORMAL_HINTS = 40 +WM_SIZE_HINTS = 41 +WM_ZOOM_HINTS = 42 +MIN_SPACE = 43 +NORM_SPACE = 44 +MAX_SPACE = 45 +END_SPACE = 46 +SUPERSCRIPT_X = 47 +SUPERSCRIPT_Y = 48 +SUBSCRIPT_X = 49 +SUBSCRIPT_Y = 50 +UNDERLINE_POSITION = 51 +UNDERLINE_THICKNESS = 52 +STRIKEOUT_ASCENT = 53 +STRIKEOUT_DESCENT = 54 +ITALIC_ANGLE = 55 +X_HEIGHT = 56 +QUAD_WIDTH = 57 +WEIGHT = 58 +POINT_SIZE = 59 +RESOLUTION = 60 +COPYRIGHT = 61 +NOTICE = 62 +FONT_NAME = 63 +FAMILY_NAME = 64 +FULL_NAME = 65 +CAP_HEIGHT = 66 +WM_CLASS = 67 +WM_TRANSIENT_FOR = 68 +LAST_PREDEFINED = 68 diff --git a/venv/lib/python3.12/site-packages/Xlib/Xcursorfont.py b/venv/lib/python3.12/site-packages/Xlib/Xcursorfont.py new file mode 100644 index 0000000..e7d0815 --- /dev/null +++ b/venv/lib/python3.12/site-packages/Xlib/Xcursorfont.py @@ -0,0 +1,99 @@ +# Xlib.Xcursorfont -- standard cursors +# +# Copyright (C) 2000 Peter Liljenberg +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public License +# as published by the Free Software Foundation; either version 2.1 +# of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the +# Free Software Foundation, Inc., +# 59 Temple Place, +# Suite 330, +# Boston, MA 02111-1307 USA + +num_glyphs = 154 +X_cursor = 0 +arrow = 2 +based_arrow_down = 4 +based_arrow_up = 6 +boat = 8 +bogosity = 10 +bottom_left_corner = 12 +bottom_right_corner = 14 +bottom_side = 16 +bottom_tee = 18 +box_spiral = 20 +center_ptr = 22 +circle = 24 +clock = 26 +coffee_mug = 28 +cross = 30 +cross_reverse = 32 +crosshair = 34 +diamond_cross = 36 +dot = 38 +dotbox = 40 +double_arrow = 42 +draft_large = 44 +draft_small = 46 +draped_box = 48 +exchange = 50 +fleur = 52 +gobbler = 54 +gumby = 56 +hand1 = 58 +hand2 = 60 +heart = 62 +icon = 64 +iron_cross = 66 +left_ptr = 68 +left_side = 70 +left_tee = 72 +leftbutton = 74 +ll_angle = 76 +lr_angle = 78 +man = 80 +middlebutton = 82 +mouse = 84 +pencil = 86 +pirate = 88 +plus = 90 +question_arrow = 92 +right_ptr = 94 +right_side = 96 +right_tee = 98 +rightbutton = 100 +rtl_logo = 102 +sailboat = 104 +sb_down_arrow = 106 +sb_h_double_arrow = 108 +sb_left_arrow = 110 +sb_right_arrow = 112 +sb_up_arrow = 114 +sb_v_double_arrow = 116 +shuttle = 118 +sizing = 120 +spider = 122 +spraycan = 124 +star = 126 +target = 128 +tcross = 130 +top_left_arrow = 132 +top_left_corner = 134 +top_right_corner = 136 +top_side = 138 +top_tee = 140 +trek = 142 +ul_angle = 144 +umbrella = 146 +ur_angle = 148 +watch = 150 +xterm = 152 diff --git a/venv/lib/python3.12/site-packages/Xlib/Xutil.py b/venv/lib/python3.12/site-packages/Xlib/Xutil.py new file mode 100644 index 0000000..b691561 --- /dev/null +++ b/venv/lib/python3.12/site-packages/Xlib/Xutil.py @@ -0,0 +1,81 @@ +# Xlib.Xutil -- ICCCM definitions and similar stuff +# +# Copyright (C) 2000 Peter Liljenberg +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public License +# as published by the Free Software Foundation; either version 2.1 +# of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the +# Free Software Foundation, Inc., +# 59 Temple Place, +# Suite 330, +# Boston, MA 02111-1307 USA + + +NoValue = 0x0000 +XValue = 0x0001 +YValue = 0x0002 +WidthValue = 0x0004 +HeightValue = 0x0008 +AllValues = 0x000F +XNegative = 0x0010 +YNegative = 0x0020 +USPosition = (1 << 0) +USSize = (1 << 1) +PPosition = (1 << 2) +PSize = (1 << 3) +PMinSize = (1 << 4) +PMaxSize = (1 << 5) +PResizeInc = (1 << 6) +PAspect = (1 << 7) +PBaseSize = (1 << 8) +PWinGravity = (1 << 9) +PAllHints = (PPosition|PSize|PMinSize|PMaxSize|PResizeInc|PAspect) +InputHint = (1 << 0) +StateHint = (1 << 1) +IconPixmapHint = (1 << 2) +IconWindowHint = (1 << 3) +IconPositionHint = (1 << 4) +IconMaskHint = (1 << 5) +WindowGroupHint = (1 << 6) +MessageHint = (1 << 7) +UrgencyHint = (1 << 8) +AllHints = (InputHint|StateHint|IconPixmapHint|IconWindowHint| + IconPositionHint|IconMaskHint|WindowGroupHint|MessageHint| + UrgencyHint) +WithdrawnState = 0 +NormalState = 1 +IconicState = 3 +DontCareState = 0 +ZoomState = 2 +InactiveState = 4 +RectangleOut = 0 +RectangleIn = 1 +RectanglePart = 2 +VisualNoMask = 0x0 +VisualIDMask = 0x1 +VisualScreenMask = 0x2 +VisualDepthMask = 0x4 +VisualClassMask = 0x8 +VisualRedMaskMask = 0x10 +VisualGreenMaskMask = 0x20 +VisualBlueMaskMask = 0x40 +VisualColormapSizeMask = 0x80 +VisualBitsPerRGBMask = 0x100 +VisualAllMask = 0x1FF +ReleaseByFreeingColormap = 1 +BitmapSuccess = 0 +BitmapOpenFailed = 1 +BitmapFileInvalid = 2 +BitmapNoMemory = 3 +XCSUCCESS = 0 +XCNOMEM = 1 +XCNOENT = 2 diff --git a/venv/lib/python3.12/site-packages/Xlib/__init__.py b/venv/lib/python3.12/site-packages/Xlib/__init__.py new file mode 100644 index 0000000..f164c43 --- /dev/null +++ b/venv/lib/python3.12/site-packages/Xlib/__init__.py @@ -0,0 +1,39 @@ +# Xlib.__init__ -- glue for Xlib package +# +# Copyright (C) 2000-2002 Peter Liljenberg +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public License +# as published by the Free Software Foundation; either version 2.1 +# of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the +# Free Software Foundation, Inc., +# 59 Temple Place, +# Suite 330, +# Boston, MA 02111-1307 USA + +__version__ = (0, 33) + +__version_extra__ = '' + +__version_string__ = '.'.join(map(str, __version__)) + __version_extra__ + +__all__ = [ + 'X', + 'XK', + 'Xatom', + 'Xcursorfont', + 'Xutil', + 'display', + 'error', + 'rdb', + # Explicitly exclude threaded, so that it isn't imported by + # from Xlib import * + ] diff --git a/venv/lib/python3.12/site-packages/Xlib/__pycache__/X.cpython-312.pyc b/venv/lib/python3.12/site-packages/Xlib/__pycache__/X.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fd2383356d15d4ee97931b8f22f70f7a8c24b7eb GIT binary patch literal 8618 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 ZQ~6Y3Rj%7nrL~V)8u~eZ`is2qe*oxhK9~Ri literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/Xlib/__pycache__/Xcursorfont.cpython-312.pyc b/venv/lib/python3.12/site-packages/Xlib/__pycache__/Xcursorfont.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..409c48ae28b1f27f52c52e4c679ebe56c0b869bd GIT binary patch literal 2136 zcmY+FOK%)S5XaZ?K4zcZhwV7;_rrVNlW|1K7D3HtrDcEA11 zNF@GYXY)5QG~O(d^-BU1kiZcb!5y#zM`09`ki-2m5e8 z?8gIe01v`JJOqdEFdW7sa0HLSQ9K66@HiaD6L11g!bzNlX*>m|@HCvp8JNLYn8i7m z!#dRQ44lDvn8yWJz_V}`&%rr759jd$T)>NP5ih|dybPD|3S7afa1|F}5wF2DT!JOM z4%hJp+`yY~6K}ySybZVU4&1@Ja2M~vJ-iS1@c}%*hwu;|!6SSOkMRjS!Kd)FzdZfU z#&4wM2J5-8gOOyU86>}Kp`>}MQg9A+G49A}(loMOx{ z<``!f3ygD&3ye#QD~v_P65|Hr7UK@%9^(Py5#tGCnemMAF5^AM`-~L^Fg{>>#Q2!e zWFTXe(P4bTuo(`+V@O88=rPtAFBqROK4%OVUoyU8e9icV@h#&!#!JTcj2{?3F@9$J zN?4v=Ryil^HrjUI>-fr8X|zJ=yHcf0Dcvuf78BMqC z`c}|a)utN+Znt5J)u7RGr6Z)O4P(-3cisl`!=P`WP`RNK2yL%7e9w}mt#U2l1VT2v zK&o`hk}X@PRLgc-&uPkCT@|9y4ciowuJ5a&9vV{gg!F~VYPVxrQWeoMyRL(cc;P6z zfl3pa?z$?V8#ZkbA5!H}n$)>%%C^{a{H|$JFErzk7@T8>^;XApXh~|-7NJy`w%epl zNVs;`ZT3})W^q0q7HANr3{=u;xsJ+N(shQ77+NMiT~=FKj5w&J;9xT(K^AnA_XZ#KcK*vt|)(gvN)9BHYk<^1H&3=m%Ncw?E?}N}5bgw~t$)&*cwih0I>kpr0 znFDbv!-&BVEkTAY79bf&@mv|hvjzS7m9f}$F|@^!{DZ3TKa>9>@%8A)$jIxNM5!{!Mft+Oh>YwY71hRH zCCX8yIw(aMV~~vUMVgt|`6^M3CZ}E{YEh{?$VbI7O4>p;KS)PLj?#5ZTjlDY7!^u` zY^1HUF&K^Xy0OZj5bv_Jm9C=Ga)m)A-b%Y$$YiM-y}e$nch=TcOuM>}uAy^vNe#V0 zrA7zSxjIc-q(DB(m*|`tD78=RY67!dL(R literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/Xlib/__pycache__/Xutil.cpython-312.pyc b/venv/lib/python3.12/site-packages/Xlib/__pycache__/Xutil.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3788945ad174aa592716319e8c3bef65c2731643 GIT binary patch literal 1721 zcmYjQOLN;)6u!>G4?QgT8RtdIqm%?<(-sQp07K%u%uF0lOd3}kM)=;b?^KpNlI+x3 zFk;EBJ6LvE{sAlg0GoKH(TW*X-lfxBH*oH~j*A!HJ>PfE{m#*m{Fkaq2!4NF9CqF$ z5&DObo8R0tc>OSj(60z11L2qv!*j+Qo;T+4g0X-XjYS+c;y7U>AeV$(3UU(UWY87R zRh%@^IAv&9GIT5(86pw+GJz0LII0}e95seU7Myb6ln18*I2FNZ37kscvhHt(0O~&j-_L6ktpk|_0L7D{K$hT~D6I(8I4Yc}a6q#HA7vB8yONVpwD_{|1Adt>|AiJ^ZayDt|&}7Hod2uX`=Sfbq2yfJ|>=Lc7(fp=5~nP z9`VxTY?Sml^}E;w%Jw%RZd|I zrroi~$-s}~8LQcmIwK9!^&{mm^#-O@ci1!Bu-YDHy2v%#E+PCGBTXoKr0;im$yBIX zrsr`XBPvb_W|T`gAsybha4{>yUHFb>g+-xN9g8iX&)y%e%};Bo?=^^fdbrC~Rj9B= zPD`i6BJkFCM+eY|+MOGlNZqAAvm3PA@G>G@(33u~4@_zi9A$)Z0HkIQO^f0vEhJbA z={YWZIjw5*tXkb~HlswVT0c47KNi7${rlh1YxsMhH|G`49aee-Q?r8m*1)UuM}F6_ zw=fx2Y{$jJzU{l_s4^t>uwv04r}+ovd-p5w@sq8-*?tNii&tr}Y-`|CtK1(&$*+12 z9$4fX_dDpr{=!}Wcs(DB#jeXp&IE}tr3G;TYA%q%bUu(nB^#vv2cSuzq(dE)q*(DH z%O(ZzEVtrWtpEmU@%iAFAAW0%)jKb`W3~M9a;$Fuad)ilztxlujXUwdbqy9&dqRho1KrsNBitNi2bcB zy;_`8OF{BFjEgnS_TRI8iRIm+x;UcaU1?S_Ia5k|qum5K?Dv0j=JdY#D7NX~^| zT-)6+*0xHdUYYPPr94FuJDvL5&CM;OSV9|d*uD%qR3SfiF=m`47&qfgm-f4Y^dfp7Yv!u_o7App z6B|M}*#L{xJ8!g79e|}#rPlW!{Kxjw`qS-jb$eLZ8SJ$_E3E-o{&qaCa9@;Fv-t;Q CJ%-W% literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/Xlib/__pycache__/display.cpython-312.pyc b/venv/lib/python3.12/site-packages/Xlib/__pycache__/display.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1575e226e89f76cec2e67563c24cf9075ca56e56 GIT binary patch literal 41861 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/Xlib/__pycache__/error.cpython-312.pyc b/venv/lib/python3.12/site-packages/Xlib/__pycache__/error.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9b7bbb4c9292804ae1750ae55253d3e49674755d GIT binary patch literal 8992 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/Xlib/__pycache__/rdb.cpython-312.pyc b/venv/lib/python3.12/site-packages/Xlib/__pycache__/rdb.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b1db5b9e3eb810468941e7d9d4b734112f19a363 GIT binary patch literal 22226 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�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 O@59kkyhKN)4~{>K@mHw; literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/Xlib/__pycache__/xauth.cpython-312.pyc b/venv/lib/python3.12/site-packages/Xlib/__pycache__/xauth.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c93b8583d94bfe6dd8ae2e4e9e7205b43c5bab07 GIT binary patch literal 4780 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 IV0%;k3!e#HO#lD@ literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/Xlib/display.py b/venv/lib/python3.12/site-packages/Xlib/display.py new file mode 100644 index 0000000..bbda44b --- /dev/null +++ b/venv/lib/python3.12/site-packages/Xlib/display.py @@ -0,0 +1,951 @@ +# Xlib.display -- high level display object +# +# Copyright (C) 2000 Peter Liljenberg +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public License +# as published by the Free Software Foundation; either version 2.1 +# of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the +# Free Software Foundation, Inc., +# 59 Temple Place, +# Suite 330, +# Boston, MA 02111-1307 USA + +# Python modules +import types + +# Python 2/3 compatibility. +from six import create_unbound_method + +# Xlib modules +from . import error +from . import ext +from . import X + +# Xlib.protocol modules +from .protocol import display as protocol_display +from .protocol import request, event, rq + +# Xlib.xobjects modules +from .xobject import resource +from .xobject import drawable +from .xobject import fontable +from .xobject import colormap +from .xobject import cursor + +_resource_baseclasses = { + 'resource': resource.Resource, + 'drawable': drawable.Drawable, + 'window': drawable.Window, + 'pixmap': drawable.Pixmap, + 'fontable': fontable.Fontable, + 'font': fontable.Font, + 'gc': fontable.GC, + 'colormap': colormap.Colormap, + 'cursor': cursor.Cursor, + } + +_resource_hierarchy = { + 'resource': ('drawable', 'window', 'pixmap', + 'fontable', 'font', 'gc', + 'colormap', 'cursor'), + 'drawable': ('window', 'pixmap'), + 'fontable': ('font', 'gc') + } + +class _BaseDisplay(protocol_display.Display): + + # Implement a cache of atom names, used by Window objects when + # dealing with some ICCCM properties not defined in Xlib.Xatom + + def __init__(self, *args, **keys): + self.resource_classes = _resource_baseclasses.copy() + protocol_display.Display.__init__(self, *args, **keys) + self._atom_cache = {} + + def get_atom(self, atomname, only_if_exists=False): + if atomname in self._atom_cache: + return self._atom_cache[atomname] + + r = request.InternAtom(display = self, name = atomname, only_if_exists = only_if_exists) + + # don't cache NONE responses in case someone creates this later + if r.atom != X.NONE: + self._atom_cache[atomname] = r.atom + + return r.atom + + +class Display(object): + def __init__(self, display = None): + self.display = _BaseDisplay(display) + + # Create the keymap cache + self._keymap_codes = [()] * 256 + self._keymap_syms = {} + self._update_keymap(self.display.info.min_keycode, + (self.display.info.max_keycode + - self.display.info.min_keycode + 1)) + + # Translations for keysyms to strings. + self.keysym_translations = {} + + # Find all supported extensions + self.extensions = [] + self.class_extension_dicts = {} + self.display_extension_methods = {} + + # a dict that maps the event name to the code + # or, when it's an event with a subcode, to a tuple of (event,subcode) + # note this wraps the dict so you address it as + # extension_event.EXTENSION_EVENT_NAME rather than + # extension_event["EXTENSION_EVENT_NAME"] + self.extension_event = rq.DictWrapper({}) + + exts = self.list_extensions() + + # Go through all extension modules + for extname, modname in ext.__extensions__: + if extname in exts: + + # Import the module and fetch it + __import__('Xlib.ext.' + modname) + mod = getattr(ext, modname) + + info = self.query_extension(extname) + self.display.set_extension_major(extname, info.major_opcode) + + # Call initialiasation function + mod.init(self, info) + + self.extensions.append(extname) + + + # Finalize extensions by creating new classes + for class_name, dictionary in self.class_extension_dicts.items(): + origcls = self.display.resource_classes[class_name] + self.display.resource_classes[class_name] = type(origcls.__name__, + (origcls,), + dictionary) + + # Problem: we have already created some objects without the + # extensions: the screen roots and default colormaps. + # Fix that by reinstantiating them. + for screen in self.display.info.roots: + screen.root = self.display.resource_classes['window'](self.display, screen.root.id) + screen.default_colormap = self.display.resource_classes['colormap'](self.display, screen.default_colormap.id) + + + def get_display_name(self): + """Returns the name used to connect to the server, either + provided when creating the Display object, or fetched from the + environmental variable $DISPLAY.""" + return self.display.get_display_name() + + def fileno(self): + """Returns the file descriptor number of the underlying socket. + This method is provided to allow Display objects to be passed + select.select().""" + return self.display.fileno() + + def close(self): + """Close the display, freeing the resources that it holds.""" + self.display.close() + + def set_error_handler(self, handler): + """Set the default error handler which will be called for all + unhandled errors. handler should take two arguments as a normal + request error handler, but the second argument (the request) will + be None. See section Error Handling.""" + self.display.set_error_handler(handler) + + def flush(self): + """Flush the request queue, building and sending the queued + requests. This can be necessary in applications that never wait + for events, and in threaded applications.""" + self.display.flush() + + def sync(self): + """Flush the queue and wait until the server has processed all + the queued requests. Use this e.g. when it is important that + errors caused by a certain request is trapped.""" + # Do a light-weight replyrequest to sync. There must + # be a better way to do it... + self.get_pointer_control() + + def next_event(self): + """Return the next event. If there are no events queued, it will + block until the next event is fetched from the server.""" + return self.display.next_event() + + def pending_events(self): + """Return the number of events queued, i.e. the number of times + that Display.next_event() can be called without blocking.""" + return self.display.pending_events() + + def has_extension(self, extension): + """Check if both the server and the client library support the X + extension named extension.""" + return extension in self.extensions + + def create_resource_object(self, type, id): + """Create a resource object of type for the integer id. type + should be one of the following strings: + + resource + drawable + window + pixmap + fontable + font + gc + colormap + cursor + + This function can be used when a resource ID has been fetched + e.g. from an resource or a command line argument. Resource + objects should never be created by instantiating the appropriate + class directly, since any X extensions dynamically added by the + library will not be available. + """ + return self.display.resource_classes[type](self.display, id) + + # We need this to handle display extension methods + def __getattr__(self, attr): + try: + function = self.display_extension_methods[attr] + return types.MethodType(function, self) + except KeyError: + raise AttributeError(attr) + + ### + ### display information retrieval + ### + + def screen(self, sno = None): + if sno is None: + return self.display.info.roots[self.display.default_screen] + else: + return self.display.info.roots[sno] + + def screen_count(self): + """Return the total number of screens on the display.""" + return len(self.display.info.roots) + + def get_default_screen(self): + """Return the number of the default screen, extracted from the + display name.""" + return self.display.get_default_screen() + + ### + ### Extension module interface + ### + + def extension_add_method(self, object, name, function): + """extension_add_method(object, name, function) + + Add an X extension module method. OBJECT is the type of + object to add the function to, a string from this list: + + display + resource + drawable + window + pixmap + fontable + font + gc + colormap + cursor + + NAME is the name of the method, a string. FUNCTION is a + normal function whose first argument is a 'self'. + """ + + if object == 'display': + if hasattr(self, name): + raise AssertionError('attempting to replace display method: %s' % name) + + self.display_extension_methods[name] = function + + else: + class_list = (object, ) + _resource_hierarchy.get(object, ()) + for class_name in class_list: + cls = _resource_baseclasses[class_name] + if hasattr(cls, name): + raise AssertionError('attempting to replace %s method: %s' % (class_name, name)) + + method = create_unbound_method(function, cls) + + # Maybe should check extension overrides too + try: + self.class_extension_dicts[class_name][name] = method + except KeyError: + self.class_extension_dicts[class_name] = { name: method } + + def extension_add_event(self, code, evt, name = None): + """extension_add_event(code, evt, [name]) + + Add an extension event. CODE is the numeric code, and EVT is + the event class. EVT will be cloned, and the attribute _code + of the new event class will be set to CODE. + + If NAME is omitted, it will be set to the name of EVT. This + name is used to insert an entry in the DictWrapper + extension_event. + """ + + newevt = type(evt.__name__, evt.__bases__, + evt.__dict__.copy()) + newevt._code = code + + self.display.add_extension_event(code, newevt) + + if name is None: + name = evt.__name__ + + setattr(self.extension_event, name, code) + + def extension_add_subevent(self, code, subcode, evt, name = None): + """extension_add_subevent(code, evt, [name]) + + Add an extension subevent. CODE is the numeric code, subcode + is the sub-ID of this event that shares the code ID with other + sub-events and EVT is the event class. EVT will be cloned, and + the attribute _code of the new event class will be set to CODE. + + If NAME is omitted, it will be set to the name of EVT. This + name is used to insert an entry in the DictWrapper + extension_event. + """ + + newevt = type(evt.__name__, evt.__bases__, + evt.__dict__.copy()) + newevt._code = code + + self.display.add_extension_event(code, newevt, subcode) + + if name is None: + name = evt.__name__ + + # store subcodes as a tuple of (event code, subcode) in the + # extension dict maintained in the display object + setattr(self.extension_event, name, (code,subcode)) + + def extension_add_error(self, code, err): + """extension_add_error(code, err) + + Add an extension error. CODE is the numeric code, and ERR is + the error class. + """ + + self.display.add_extension_error(code, err) + + ### + ### keymap cache implementation + ### + + # The keycode->keysym map is stored in a list with 256 elements. + # Each element represents a keycode, and the tuple elements are + # the keysyms bound to the key. + + # The keysym->keycode map is stored in a mapping, where the keys + # are keysyms. The values are a sorted list of tuples with two + # elements each: (index, keycode) + # keycode is the code for a key to which this keysym is bound, and + # index is the keysyms index in the map for that keycode. + + def keycode_to_keysym(self, keycode, index): + """Convert a keycode to a keysym, looking in entry index. + Normally index 0 is unshifted, 1 is shifted, 2 is alt grid, and 3 + is shift+alt grid. If that key entry is not bound, X.NoSymbol is + returned.""" + try: + return self._keymap_codes[keycode][index] + except IndexError: + return X.NoSymbol + + def keysym_to_keycode(self, keysym): + """Look up the primary keycode that is bound to keysym. If + several keycodes are found, the one with the lowest index and + lowest code is returned. If keysym is not bound to any key, 0 is + returned.""" + try: + return self._keymap_syms[keysym][0][1] + except (KeyError, IndexError): + return 0 + + def keysym_to_keycodes(self, keysym): + """Look up all the keycodes that is bound to keysym. A list of + tuples (keycode, index) is returned, sorted primarily on the + lowest index and secondarily on the lowest keycode.""" + try: + # Copy the map list, reversing the arguments + return map(lambda x: (x[1], x[0]), self._keymap_syms[keysym]) + except KeyError: + return [] + + def refresh_keyboard_mapping(self, evt): + """This method should be called once when a MappingNotify event + is received, to update the keymap cache. evt should be the event + object.""" + if isinstance(evt, event.MappingNotify): + if evt.request == X.MappingKeyboard: + self._update_keymap(evt.first_keycode, evt.count) + else: + raise TypeError('expected a MappingNotify event') + + def _update_keymap(self, first_keycode, count): + """Internal function, called to refresh the keymap cache. + """ + + # Delete all sym->code maps for the changed codes + + lastcode = first_keycode + count + for keysym, codes in self._keymap_syms.items(): + i = 0 + while i < len(codes): + code = codes[i][1] + if code >= first_keycode and code < lastcode: + del codes[i] + else: + i = i + 1 + + # Get the new keyboard mapping + keysyms = self.get_keyboard_mapping(first_keycode, count) + + # Replace code->sym map with the new map + self._keymap_codes[first_keycode:lastcode] = keysyms + + # Update sym->code map + code = first_keycode + for syms in keysyms: + index = 0 + for sym in syms: + if sym != X.NoSymbol: + if sym in self._keymap_syms: + symcodes = self._keymap_syms[sym] + symcodes.append((index, code)) + symcodes.sort() + else: + self._keymap_syms[sym] = [(index, code)] + + index = index + 1 + code = code + 1 + + ### + ### client-internal keysym to string translations + ### + + def lookup_string(self, keysym): + """Return a string corresponding to KEYSYM, or None if no + reasonable translation is found. + """ + s = self.keysym_translations.get(keysym) + if s is not None: + return s + + import Xlib.XK + return Xlib.XK.keysym_to_string(keysym) + + def rebind_string(self, keysym, newstring): + """Change the translation of KEYSYM to NEWSTRING. + If NEWSTRING is None, remove old translation if any. + """ + if newstring is None: + try: + del self.keysym_translations[keysym] + except KeyError: + pass + else: + self.keysym_translations[keysym] = newstring + + + ### + ### X requests + ### + + def intern_atom(self, name, only_if_exists = False): + """Intern the string name, returning its atom number. If + only_if_exists is true and the atom does not already exist, it + will not be created and X.NONE is returned.""" + r = request.InternAtom(display = self.display, + name = name, + only_if_exists = only_if_exists) + return r.atom + + def get_atom(self, atom, only_if_exists = False): + """Alias for intern_atom, using internal cache""" + return self.display.get_atom(atom, only_if_exists) + + + def get_atom_name(self, atom): + """Look up the name of atom, returning it as a string. Will raise + BadAtom if atom does not exist.""" + r = request.GetAtomName(display = self.display, + atom = atom) + return r.name + + def get_selection_owner(self, selection): + """Return the window that owns selection (an atom), or X.NONE if + there is no owner for the selection. Can raise BadAtom.""" + r = request.GetSelectionOwner(display = self.display, + selection = selection) + return r.owner + + def send_event(self, destination, event, event_mask = 0, propagate = False, + onerror = None): + """Send a synthetic event to the window destination which can be + a window object, or X.PointerWindow or X.InputFocus. event is the + event object to send, instantiated from one of the classes in + protocol.events. See XSendEvent(3X11) for details. + + There is also a Window.send_event() method.""" + request.SendEvent(display = self.display, + onerror = onerror, + propagate = propagate, + destination = destination, + event_mask = event_mask, + event = event) + + def ungrab_pointer(self, time, onerror = None): + """Release a grabbed pointer and any queued events. See + XUngrabPointer(3X11).""" + request.UngrabPointer(display = self.display, + onerror = onerror, + time = time) + + def change_active_pointer_grab(self, event_mask, cursor, time, onerror = None): + """Change the dynamic parameters of a pointer grab. See + XChangeActivePointerGrab(3X11).""" + request.ChangeActivePointerGrab(display = self.display, + onerror = onerror, + cursor = cursor, + time = time, + event_mask = event_mask) + + def ungrab_keyboard(self, time, onerror = None): + """Ungrab a grabbed keyboard and any queued events. See + XUngrabKeyboard(3X11).""" + request.UngrabKeyboard(display = self.display, + onerror = onerror, + time = time) + + def allow_events(self, mode, time, onerror = None): + """Release some queued events. mode should be one of + X.AsyncPointer, X.SyncPointer, X.AsyncKeyboard, X.SyncKeyboard, + X.ReplayPointer, X.ReplayKeyboard, X.AsyncBoth, or X.SyncBoth. + time should be a timestamp or X.CurrentTime.""" + request.AllowEvents(display = self.display, + onerror = onerror, + mode = mode, + time = time) + + def grab_server(self, onerror = None): + """Disable processing of requests on all other client connections + until the server is ungrabbed. Server grabbing should be avoided + as much as possible.""" + request.GrabServer(display = self.display, + onerror = onerror) + + def ungrab_server(self, onerror = None): + """Release the server if it was previously grabbed by this client.""" + request.UngrabServer(display = self.display, + onerror = onerror) + + def warp_pointer(self, x, y, src_window = X.NONE, src_x = 0, src_y = 0, + src_width = 0, src_height = 0, onerror = None): + """Move the pointer relative its current position by the offsets + (x, y). However, if src_window is a window the pointer is only + moved if the specified rectangle in src_window contains it. If + src_width is 0 it will be replaced with the width of src_window - + src_x. src_height is treated in a similar way. + + To move the pointer to absolute coordinates, use Window.warp_pointer().""" + request.WarpPointer(display = self.display, + onerror = onerror, + src_window = src_window, + dst_window = X.NONE, + src_x = src_x, + src_y = src_y, + src_width = src_width, + src_height = src_height, + dst_x = x, + dst_y = y) + + def set_input_focus(self, focus, revert_to, time, onerror = None): + """Set input focus to focus, which should be a window, + X.PointerRoot or X.NONE. revert_to specifies where the focus + reverts to if the focused window becomes not visible, and should + be X.RevertToParent, RevertToPointerRoot, or RevertToNone. See + XSetInputFocus(3X11) for details. + + There is also a Window.set_input_focus().""" + request.SetInputFocus(display = self.display, + onerror = onerror, + revert_to = revert_to, + focus = focus, + time = time) + + def get_input_focus(self): + """Return an object with the following attributes: + + focus + The window which currently holds the input + focus, X.NONE or X.PointerRoot. + revert_to + Where the focus will revert, one of X.RevertToParent, + RevertToPointerRoot, or RevertToNone. """ + return request.GetInputFocus(display = self.display) + + def query_keymap(self): + """Return a bit vector for the logical state of the keyboard, + where each bit set to 1 indicates that the corresponding key is + currently pressed down. The vector is represented as a list of 32 + integers. List item N contains the bits for keys 8N to 8N + 7 + with the least significant bit in the byte representing key 8N.""" + r = request.QueryKeymap(display = self.display) + return r.map + + def open_font(self, name): + """Open the font identifed by the pattern name and return its + font object. If name does not match any font, None is returned.""" + fid = self.display.allocate_resource_id() + ec = error.CatchError(error.BadName) + + request.OpenFont(display = self.display, + onerror = ec, + fid = fid, + name = name) + self.sync() + + if ec.get_error(): + self.display.free_resource_id(fid) + return None + else: + cls = self.display.get_resource_class('font', fontable.Font) + return cls(self.display, fid, owner = 1) + + def list_fonts(self, pattern, max_names): + """Return a list of font names matching pattern. No more than + max_names will be returned.""" + r = request.ListFonts(display = self.display, + max_names = max_names, + pattern = pattern) + return r.fonts + + def list_fonts_with_info(self, pattern, max_names): + """Return a list of fonts matching pattern. No more than + max_names will be returned. Each list item represents one font + and has the following properties: + + name + The name of the font. + min_bounds + max_bounds + min_char_or_byte2 + max_char_or_byte2 + default_char + draw_direction + min_byte1 + max_byte1 + all_chars_exist + font_ascent + font_descent + replies_hint + See the description of XFontStruct in XGetFontProperty(3X11) + for details on these values. + properties + A list of properties. Each entry has two attributes: + + name + The atom identifying this property. + value + A 32-bit unsigned value. + """ + return request.ListFontsWithInfo(display = self.display, + max_names = max_names, + pattern = pattern) + + def set_font_path(self, path, onerror = None): + """Set the font path to path, which should be a list of strings. + If path is empty, the default font path of the server will be + restored.""" + request.SetFontPath(display = self.display, + onerror = onerror, + path = path) + + def get_font_path(self): + """Return the current font path as a list of strings.""" + r = request.GetFontPath(display = self.display) + return r.paths + + def query_extension(self, name): + """Ask the server if it supports the extension name. If it is + supported an object with the following attributes is returned: + + major_opcode + The major opcode that the requests of this extension uses. + first_event + The base event code if the extension have additional events, or 0. + first_error + The base error code if the extension have additional errors, or 0. + + If the extension is not supported, None is returned.""" + r = request.QueryExtension(display = self.display, + name = name) + if r.present: + return r + else: + return None + + def list_extensions(self): + """Return a list of all the extensions provided by the server.""" + r = request.ListExtensions(display = self.display) + return r.names + + def change_keyboard_mapping(self, first_keycode, keysyms, onerror = None): + """Modify the keyboard mapping, starting with first_keycode. + keysyms is a list of tuples of keysyms. keysyms[n][i] will be + assigned to keycode first_keycode+n at index i.""" + request.ChangeKeyboardMapping(display = self.display, + onerror = onerror, + first_keycode = first_keycode, + keysyms = keysyms) + + def get_keyboard_mapping(self, first_keycode, count): + """Return the current keyboard mapping as a list of tuples, + starting at first_keycount and no more than count.""" + r = request.GetKeyboardMapping(display = self.display, + first_keycode = first_keycode, + count = count) + return r.keysyms + + def change_keyboard_control(self, onerror = None, **keys): + """Change the parameters provided as keyword arguments: + + key_click_percent + The volume of key clicks between 0 (off) and 100 (load). + -1 will restore default setting. + bell_percent + The base volume of the bell, coded as above. + bell_pitch + The pitch of the bell in Hz, -1 restores the default. + bell_duration + The duration of the bell in milliseconds, -1 restores + the default. + led + + led_mode + led_mode should be X.LedModeOff or X.LedModeOn. If led is + provided, it should be a 32-bit mask listing the LEDs that + should change. If led is not provided, all LEDs are changed. + key + + auto_repeat_mode + auto_repeat_mode should be one of X.AutoRepeatModeOff, + X.AutoRepeatModeOn, or X.AutoRepeatModeDefault. If key is + provided, that key will be modified, otherwise the global + state for the entire keyboard will be modified.""" + request.ChangeKeyboardControl(display = self.display, + onerror = onerror, + attrs = keys) + + def get_keyboard_control(self): + """Return an object with the following attributes: + + global_auto_repeat + X.AutoRepeatModeOn or X.AutoRepeatModeOff. + + auto_repeats + A list of 32 integers. List item N contains the bits for keys + 8N to 8N + 7 with the least significant bit in the byte + representing key 8N. If a bit is on, autorepeat is enabled + for the corresponding key. + + led_mask + A 32-bit mask indicating which LEDs are on. + + key_click_percent + The volume of key click, from 0 to 100. + + bell_percent + + bell_pitch + + bell_duration + The volume, pitch and duration of the bell. """ + return request.GetKeyboardControl(display = self.display) + + def bell(self, percent = 0, onerror = None): + """Ring the bell at the volume percent which is relative the base + volume. See XBell(3X11).""" + request.Bell(display = self.display, + onerror = onerror, + percent = percent) + + def change_pointer_control(self, accel = None, threshold = None, onerror = None): + """To change the pointer acceleration, set accel to a tuple (num, + denum). The pointer will then move num/denum times the normal + speed if it moves beyond the threshold number of pixels at once. + To change the threshold, set it to the number of pixels. -1 + restores the default.""" + if accel is None: + do_accel = 0 + accel_num = 0 + accel_denum = 0 + else: + do_accel = 1 + accel_num, accel_denum = accel + + if threshold is None: + do_threshold = 0 + else: + do_threshold = 1 + + request.ChangePointerControl(display = self.display, + onerror = onerror, + do_accel = do_accel, + do_thresh = do_threshold, + accel_num = accel_num, + accel_denum = accel_denum, + threshold = threshold) + + def get_pointer_control(self): + """Return an object with the following attributes: + + accel_num + + accel_denom + The acceleration as numerator/denumerator. + + threshold + The number of pixels the pointer must move before the + acceleration kicks in.""" + return request.GetPointerControl(display = self.display) + + def set_screen_saver(self, timeout, interval, prefer_blank, allow_exposures, onerror = None): + """See XSetScreenSaver(3X11).""" + request.SetScreenSaver(display = self.display, + onerror = onerror, + timeout = timeout, + interval = interval, + prefer_blank = prefer_blank, + allow_exposures = allow_exposures) + + def get_screen_saver(self): + """Return an object with the attributes timeout, interval, + prefer_blanking, allow_exposures. See XGetScreenSaver(3X11) for + details.""" + return request.GetScreenSaver(display = self.display) + + def change_hosts(self, mode, host_family, host, onerror = None): + """mode is either X.HostInsert or X.HostDelete. host_family is + one of X.FamilyInternet, X.FamilyDECnet, X.FamilyChaos, + X.FamilyServerInterpreted or X.FamilyInternetV6. + + host is a list of bytes. For the Internet family, it should be the + four bytes of an IPv4 address.""" + request.ChangeHosts(display = self.display, + onerror = onerror, + mode = mode, + host_family = host_family, + host = host) + + def list_hosts(self): + """Return an object with the following attributes: + +mode + X.EnableAccess if the access control list is used, X.DisableAccess otherwise. +hosts + The hosts on the access list. Each entry has the following attributes: + + family + X.FamilyInternet, X.FamilyDECnet, X.FamilyChaos, X.FamilyServerInterpreted or X.FamilyInternetV6. + name + A list of byte values, the coding depends on family. For the Internet family, it is the 4 bytes of an IPv4 address. + +""" + return request.ListHosts(display = self.display) + + def set_access_control(self, mode, onerror = None): + """Enable use of access control lists at connection setup if mode + is X.EnableAccess, disable if it is X.DisableAccess.""" + request.SetAccessControl(display = self.display, + onerror = onerror, + mode = mode) + + def set_close_down_mode(self, mode, onerror = None): + """Control what will happen with the client's resources at + connection close. The default is X.DestroyAll, the other values + are X.RetainPermanent and X.RetainTemporary.""" + request.SetCloseDownMode(display = self.display, + onerror = onerror, + mode = mode) + + def force_screen_saver(self, mode, onerror = None): + """If mode is X.ScreenSaverActive the screen saver is activated. + If it is X.ScreenSaverReset, the screen saver is deactivated as + if device input had been received.""" + request.ForceScreenSaver(display = self.display, + onerror = onerror, + mode = mode) + + def set_pointer_mapping(self, map): + """Set the mapping of the pointer buttons. map is a list of + logical button numbers. map must be of the same length as the + list returned by Display.get_pointer_mapping(). + + map[n] sets the + logical number for the physical button n+1. Logical number 0 + disables the button. Two physical buttons cannot be mapped to the + same logical number. + + If one of the buttons to be altered are + logically in the down state, X.MappingBusy is returned and the + mapping is not changed. Otherwise the mapping is changed and + X.MappingSuccess is returned.""" + r = request.SetPointerMapping(display = self.display, + map = map) + return r.status + + def get_pointer_mapping(self): + """Return a list of the pointer button mappings. Entry N in the + list sets the logical button number for the physical button N+1.""" + r = request.GetPointerMapping(display = self.display) + return r.map + + def set_modifier_mapping(self, keycodes): + """Set the keycodes for the eight modifiers X.Shift, X.Lock, + X.Control, X.Mod1, X.Mod2, X.Mod3, X.Mod4 and X.Mod5. keycodes + should be a eight-element list where each entry is a list of the + keycodes that should be bound to that modifier. + + If any changed + key is logically in the down state, X.MappingBusy is returned and + the mapping is not changed. If the mapping violates some server + restriction, X.MappingFailed is returned. Otherwise the mapping + is changed and X.MappingSuccess is returned.""" + r = request.SetModifierMapping(display = self.display, + keycodes = keycodes) + return r.status + + def get_modifier_mapping(self): + """Return a list of eight lists, one for each modifier. The list + can be indexed using X.ShiftMapIndex, X.Mod1MapIndex, and so on. + The sublists list the keycodes bound to that modifier.""" + r = request.GetModifierMapping(display = self.display) + return r.keycodes + + def no_operation(self, onerror = None): + """Do nothing but send a request to the server.""" + request.NoOperation(display = self.display, + onerror = onerror) diff --git a/venv/lib/python3.12/site-packages/Xlib/error.py b/venv/lib/python3.12/site-packages/Xlib/error.py new file mode 100644 index 0000000..2d27722 --- /dev/null +++ b/venv/lib/python3.12/site-packages/Xlib/error.py @@ -0,0 +1,160 @@ +# Xlib.error -- basic error classes +# +# Copyright (C) 2000 Peter Liljenberg +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public License +# as published by the Free Software Foundation; either version 2.1 +# of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the +# Free Software Foundation, Inc., +# 59 Temple Place, +# Suite 330, +# Boston, MA 02111-1307 USA + +# Xlib modules +from . import X + +# Xlib.protocol modules +from .protocol import rq + + +class DisplayError(Exception): + def __init__(self, display): + self.display = display + + def __str__(self): + return 'Display error "%s"' % self.display + +class DisplayNameError(DisplayError): + def __str__(self): + return 'Bad display name "%s"' % self.display + +class DisplayConnectionError(DisplayError): + def __init__(self, display, msg): + self.display = display + self.msg = msg + + def __str__(self): + return 'Can\'t connect to display "%s": %s' % (self.display, self.msg) + +class ConnectionClosedError(Exception): + def __init__(self, whom): + self.whom = whom + + def __str__(self): + return 'Display connection closed by %s' % self.whom + + +class XauthError(Exception): pass +class XNoAuthError(Exception): pass + +class ResourceIDError(Exception): pass + + +class XError(rq.GetAttrData, Exception): + _fields = rq.Struct( rq.Card8('type'), # Always 0 + rq.Card8('code'), + rq.Card16('sequence_number'), + rq.Card32('resource_id'), + rq.Card16('minor_opcode'), + rq.Card8('major_opcode'), + rq.Pad(21) + ) + + def __init__(self, display, data): + self._data, _ = self._fields.parse_binary(data, display, rawdict = True) + + def __str__(self): + s = [] + for f in ('code', 'resource_id', 'sequence_number', + 'major_opcode', 'minor_opcode'): + s.append('{0} = {1}'.format(f, self._data[f])) + + return '{0}: {1}'.format(self.__class__, ', '.join(s)) + +class XResourceError(XError): + _fields = rq.Struct( rq.Card8('type'), # Always 0 + rq.Card8('code'), + rq.Card16('sequence_number'), + rq.Resource('resource_id'), + rq.Card16('minor_opcode'), + rq.Card8('major_opcode'), + rq.Pad(21) + ) + +class BadRequest(XError): pass +class BadValue(XError): pass +class BadWindow(XResourceError): pass +class BadPixmap(XResourceError): pass +class BadAtom(XError): pass +class BadCursor(XResourceError): pass +class BadFont(XResourceError): pass +class BadMatch(XError): pass +class BadDrawable(XResourceError): pass +class BadAccess(XError): pass +class BadAlloc(XError): pass +class BadColor(XResourceError): pass +class BadGC(XResourceError): pass +class BadIDChoice(XResourceError): pass +class BadName(XError): pass +class BadLength(XError): pass +class BadImplementation(XError): pass + +xerror_class = { + X.BadRequest: BadRequest, + X.BadValue: BadValue, + X.BadWindow: BadWindow, + X.BadPixmap: BadPixmap, + X.BadAtom: BadAtom, + X.BadCursor: BadCursor, + X.BadFont: BadFont, + X.BadMatch: BadMatch, + X.BadDrawable: BadDrawable, + X.BadAccess: BadAccess, + X.BadAlloc: BadAlloc, + X.BadColor: BadColor, + X.BadGC: BadGC, + X.BadIDChoice: BadIDChoice, + X.BadName: BadName, + X.BadLength: BadLength, + X.BadImplementation: BadImplementation, + } + + +class CatchError(object): + def __init__(self, *errors): + self.error_types = errors + self.error = None + self.request = None + + def __call__(self, error, request): + if self.error_types: + for etype in self.error_types: + if isinstance(error, etype): + self.error = error + self.request = request + return 1 + + return 0 + else: + self.error = error + self.request = request + return 1 + + def get_error(self): + return self.error + + def get_request(self): + return self.request + + def reset(self): + self.error = None + self.request = None diff --git a/venv/lib/python3.12/site-packages/Xlib/ext/__init__.py b/venv/lib/python3.12/site-packages/Xlib/ext/__init__.py new file mode 100644 index 0000000..394c92c --- /dev/null +++ b/venv/lib/python3.12/site-packages/Xlib/ext/__init__.py @@ -0,0 +1,46 @@ +# Xlib.ext.__init__ -- X extension modules +# +# Copyright (C) 2000 Peter Liljenberg +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public License +# as published by the Free Software Foundation; either version 2.1 +# of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the +# Free Software Foundation, Inc., +# 59 Temple Place, +# Suite 330, +# Boston, MA 02111-1307 USA + +# __extensions__ is a list of tuples: (extname, extmod) +# extname is the name of the extension according to the X +# protocol. extmod is the name of the module in this package. + +__extensions__ = [ + # We load this first so other extensions can register generic event data + # structures. + ('Generic Event Extension', 'ge'), + ('XTEST', 'xtest'), + ('SHAPE', 'shape'), + ('XINERAMA', 'xinerama'), + ('RECORD', 'record'), + ('Composite', 'composite'), + ('RANDR', 'randr'), + ('XFIXES', 'xfixes'), + ('SECURITY', 'security'), + ('XInputExtension', 'xinput'), + ('NV-CONTROL', 'nvcontrol'), + ('DAMAGE', 'damage'), + ('DPMS', 'dpms'), + ('X-Resource', 'res'), + ('MIT-SCREEN-SAVER', 'screensaver'), + ] + +__all__ = map(lambda x: x[1], __extensions__) diff --git a/venv/lib/python3.12/site-packages/Xlib/ext/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/Xlib/ext/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4eb537a94c2b43f900b2bd3a7d80e4e3798b9e50 GIT binary patch literal 692 zcmYLGzi-n(6h7OD>!h?rT@VZ?Wk7gvtO6sd6eT7^B2Hz8%5=bTeMf3xpRGH`BoRZA zSeO_aF|r~42mS#@wp*FlfNV^>Yg2L3z5Cwxe!u&+wbev$zP|2HKIjPjkjmAmt--1V z;2cd5MxT^pq#~kVwEQ5FHKdro)c^@PqyoHGneqnl?% z&XbaeMtlWjKCk2UJW*#6#Y{#9j|YL{3w`!7nGp_*;XB=D-eCM(7@WjYmXvc~cY*;e zrse;3btn%6Ow@FbtnSDid!whKL8~~YCCgKpy9a&t9ie0B@?yGL?{Mgg8ZI)Zv}gvF zM|eJEF%cS*#TVCygR$jzJ;!k^zjNexVw1;=z>1=Zuvl3yTt0HO8r;=25a;L(!pcoR zJ~CDJr*!;`OhqU&E^+Jc3!Agb&InE-8yD%6+r_**&8dY+Wm8yMRY2d-+=g$d>@+!9 z+aI*|@7r>ZRuRRoU<_^t(n@Bf9fk=_$}nsfb74G6qwEAn2W$`Owc&CD#2H#D%e{}a z6=39=n%E9Q2)+Ds9)?28qC#whVU(s}$ZmrdyCX#l1SHLJJWa^~y9=rugx>=3OH&l( a&%@na{cQX9J+!&~o-XP4ruBB?BK993E6d{m literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/Xlib/ext/__pycache__/composite.cpython-312.pyc b/venv/lib/python3.12/site-packages/Xlib/ext/__pycache__/composite.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b38dcd0ca1c185a060f750d0e678af4d57a637eb GIT binary patch literal 10416 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/Xlib/ext/__pycache__/damage.cpython-312.pyc b/venv/lib/python3.12/site-packages/Xlib/ext/__pycache__/damage.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f565ccfc02476c012f5f1a708084072a3990bedb GIT binary patch literal 7525 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 RweboA)pBo$onomP{TF#%LqPxl literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/Xlib/ext/__pycache__/dpms.cpython-312.pyc b/venv/lib/python3.12/site-packages/Xlib/ext/__pycache__/dpms.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f5c8963f28e73e18fa2ea6e13584db286525cdcd GIT binary patch literal 9175 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 CEfX*R literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/Xlib/ext/__pycache__/ge.cpython-312.pyc b/venv/lib/python3.12/site-packages/Xlib/ext/__pycache__/ge.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..af82e3e3ef2430caa17fa216584b84731f414eb5 GIT binary patch literal 3787 zcmb_fO>7(25q`VeT`re@vh{0Ok|nE-OQaHO*;QRsu~FEL+SE~8B`6Z5&4S{tWHJ;< zzg?-JK>7Au#^@v+2cOM+x~CK6pcPmB!CO*(4g7BO0giIc|xc z<2j-Q<^q~9C-7vNXyOB+Njjfp-aH4+?@qw^os+cS12Pw6cp2~^z<0D_@yW-BGzIXA z76utEMH12bL&~B)JT^S7=XIJ%58qnR^XBla4@^C8WD0rZ5SJ%7o2U2g_kIcJa1=0U z1bQRvDvf_~cubwlad1?gCwd?&d!UnFW^Z#$joX3sI2a=0=*?2&TM)74IY-}dP0T}^ zPoo7|JhVdy9%9E0-(2W_o}}w5cG2_Vye4|@V4nNhAfy&V|BHzK=SkTv+U+yw?P4eB z>|icdk`p02Hht?y%Q`LnSf`jbwp1vl3z|-OK-tlyRJK6X6?ZPWl*ykw9%6{?xS`)$ z*7Ipy%`Y#_>+}!7$S(@HXznRn+e zk6)Td8W~d`E2h%#rxtZ1`8Lk#ADGESeY{wr61ZmqYs&a5hzG=q_f_b6samq+jtajn zSLIq?UGBH!Q}7h3hH4`ZBbMA(;Sc1#J-Kx%S(neB0P(32mO7NR?;piTthX||{!aBB zOYQ!8{he{(Z$CM9W zr32o%(r!h=Ga-0d3|=D-Vw0HuT$yAsbG|UzTeBXiHla=Q%!Ze*NV6XYb_B=zCP@f0 z6e)*gXhN`qTE-~mQYDIcO_8K%2t-0~LUImtyK_-DRfv_tjVjA(I|v5MLm)}P&~pn0 z9%7gd;({oo9xZu^Pcf#G@MnyJSR&sZH@n~{x(74KXxSIY2%dwFu4UQMQkEOzX3t&$NmrLyO~}SxLY$5w`=eE@ca5si@l_KOhv_jxFWfO4nC# zekP3x<_$~>L^WQ5C~cB5N5f?fQiJr9RRJ{U#-MR|UgKAVlXPsCj9E98JlFVJCJS7d zEAv|5H+(tpTke+}N6I{%Fm`FG@fqs}3eRvDpHmI2*I{?C(xaEaa=*JdU&g(Cya7|j??9}P zC*f|Zb8u^ZD_y%@xoMpl-M+CsyLGPm+SAVN%FWMZ1=;pMKC>sEu_7Hu0WlPN+B;%( zoqZMr^++c1&gUV}p2bL{^Rt1`?deDAW34`Lqw@Nb_<+@a@u2_Zz5bUUz4iO|K6>x* zTYq`?Pw(!2;|G7cQt!W03qI-Ww}vhp3{C6}P5j}?lq4vK+n1I;Hguy)IWRx!Vxsb)?(P!H<@UOzfpmk0fx;I#{{J$=0{ zpYz0e@j$nD-g!U1I^A4RsN*Rb6%b$D8i2yw{5MWzpbpzrtm-153IpvC zZEG6pd4YFpfuCWymk8LwyD0;6ndPQq6r7Cp^O}Aewr=1-Ff*Nw5KC!VQ^C+{FuRDb zZ-Ky;aJqJ7b82I1``mu`l6B!C58 z!owk@K<{NG-2v>;(jx6sU}^nC3CZsADW1(O>2TN5ST|+g&+crUXM9Az1N&ha4YVa- zbGL;|exYFCnZ0O$C1cW8!LkH@1}<46mLMMpgL}f@R%SQx-A{hHFZ{5@H1$b-UwECF z2KI!3{lT%1%l{CjSR9~6p~O_JkOsPo;@xh%NDF2mUC1#`q$BVOwlzD#?w9WE)VXAg z;^a3`uu8<-V4M3wo!au0a}mBqUjqmR*SHPhD8O;tvvHmi{w))3@ToGo7Ce$jSI;i# xIF>p%r8c{%Zm7ou)aNfroN|2n0(ZVPv3Ygl>M;TJ`5i96U28-F+$-!f{{`&y^SJ;3 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/Xlib/ext/__pycache__/nvcontrol.cpython-312.pyc b/venv/lib/python3.12/site-packages/Xlib/ext/__pycache__/nvcontrol.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3664da3c0455dae79bfccde299acb2498ea08a7c GIT binary patch literal 81826 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

    TuR;&TI7T>9EBLb%x-~T0E98IIPDisQD{F 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/Xlib/ext/__pycache__/record.cpython-312.pyc b/venv/lib/python3.12/site-packages/Xlib/ext/__pycache__/record.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a016289c797a438d3327e9d79c687ed3176c3b00 GIT binary patch literal 13585 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/Xlib/ext/__pycache__/screensaver.cpython-312.pyc b/venv/lib/python3.12/site-packages/Xlib/ext/__pycache__/screensaver.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..09668c035f5da2fe5d562a750033f6bceb6164b0 GIT binary patch literal 8695 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 OJO|mF*TElRJNr++!e<@; literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/Xlib/ext/__pycache__/security.cpython-312.pyc b/venv/lib/python3.12/site-packages/Xlib/ext/__pycache__/security.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..25820021f3a14c9869673d23567ae25939044ecf GIT binary patch literal 5258 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/Xlib/ext/__pycache__/shape.cpython-312.pyc b/venv/lib/python3.12/site-packages/Xlib/ext/__pycache__/shape.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1f97b11301ef84c2ff9bb9eebfc95f962cc18265 GIT binary patch literal 14430 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 IG|$BGpTFrilK=n! literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/Xlib/ext/__pycache__/xinerama.cpython-312.pyc b/venv/lib/python3.12/site-packages/Xlib/ext/__pycache__/xinerama.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f21b15c653fb0148c9757b25960073e9924e9b4c GIT binary patch literal 10385 zcmeHNUrZdw8Q;BI?)Hwo0|SOL5PN8xz%}@&9m{qVyEb-Wn~2~9^2b4HPs{BBOYU~@ z>>lJIMhvoJItSNX1n0y%I8@G`UD-y^zGWiI|N4JrelqQgmF!^SX-?fc=RA~YECMMqs@@?D5H!HhA zeixH(2le4VsZHh$q6~*QZqqmGHGlT9r);>p@b{CMV&)Zb93!u8>UD%F5|< z4(g|j%&bi1iL^=%gg5tK5_wM6(pa7#uTN_x$(kx?1nL;NN+zr(m&VU`Qa()>j5Uuu9Z-Q|c`0isRPILC||n?I-ioT57tihx7eSOSV*~ zU0H#!xZLT%&U@i&pbqKE@MM@Y)l94*OvHV*k6yBa@L6FnrY&9^8hL4S@Rh-o10qh? zSWc7xd;pnLZk$)Rai5P<{WD^%pc7~L9>}Ed%Ybb7FbTD5QT?Sr-4zPSY@SSJzNEK%2oR}1xX z;U%&CT!^j~%fa$oL~@~c*p^<)sxZ%GojKooX3%P)E1LTUCyY@a z;sKBZfls*-biw`S7Xv1p8-OjU$pgx4I%^Kh=B#N$KcJ{{128aUZdSLboEw-^^|=Aq zX65qd69*3sn3|;?n3YrS$Wy90a1l%4*cf=Xe8?nba}=kQ1?9#z2Lq%yfB!==s_u6|4 zQeRQ(gycwmq#$)yik6Im^z6oz+s2_QFPECcX!OIg^eK0csWJjUn&WVH;ddjEnn6C<0Jiu!C@_&8FoXMJS^o z3=lTrg7awz#O+pq@MPt{PqGDW2O$Gjjq~bV*Vb2uZK7;81)sz zu2QIh!HQIc6|oIaN6JfAqD8R@qQQJ{DOeC=6%@PI@^nGmUliM+Fq)6n7A;|$MbX7A zdL<0F6%D&cf+O%ok_9OFc98^7$b<8I#=Cac8271fB<`mKG;zLpAH?Df&a|`K9xVD1 z1h!98=+h9Xg^mznjk7Wapy*93PC$UL(R$;>Tf;Ypi(UI}9lv>ewd;kIt{3i{D|Eex zIY)0EU2pJ9?T8!gKi~#T89r>sx|r!?u~4b!K3>RD;eo6T4`g{v-0(mi58Q|{+=wD> zq`;KZ&lq6$I4h|UG^eFj%OtjEG+w>bO6Lwwd4kzvpkaG;CPZ^nJ>K-w|X8s;?x?6ttOs!dH>YxrSC z;*SStj!F0Yp&DRgJc!XEFEVrlI-wX?@S0yi@Xg6k1*jN}DK!QdHHvyuBbVcVZC0u0 zGNW3CRViHRtuqB3rsOSI&!W)!YYkUf6plJoYiCvLv0p;T|AR$c=7C35Z8YC|&y6yd zTiMkGiwXT~=s=qScbHC`l|&r(0T^rq^saI)dJK{Pr|c86qIx)u`{;ghe>TQGZbMKllKp7Qt&&qKYx$LlnswkF$G!6?Hh_ASp{e&;Q=^x zeRz?ndcx+V#bz_jpzEJDJ;DZ1sMXnyrA6*#Py!&1Ecj@yVc0bJLcf0!;!g#rHf@;$Y z0d+P!?n0|L!FT1vc&O|IA7cdEbdUqNWfeK>fO9r6@PKO;M{*?IvSTalktkvd!+0Zy zXoYU=lqKs^Y1I>3hEOjI(BEVJ5rQWGTk81cfdK=#1e?t7;76{I%RKg`Sa6PLHbYdn&`(uBC(}67=T3Te8Bk{ zIyVDI2rA?A1kne!tsZG@xa{tG;0N}Chbnz=ZAiz<8w87I2=8E#G0`&+*nv6CgzKs* z7BI)nW4L%J;|W{tf9AgNViBXL0tSD9*Zd6xUuUOR%?;e7+qidKcHm{hcyS8WWMhp( z7uEGPMRX|nb~iOMI?z0Y=Y3xeh(Nvjb`0`ipR;Kt5U=iY@bd1*43wbEnU2j6*MJbw zfM7TCZ$S1J@Rm3HmtxZm0VzYVEp~nQ+VE=I;gz<-pTAXTJ5g-wTyOA&x<4FrHhh`j zKwXZ*C5Ii9&N9XTj%fJ5@xh-AS(REYpXa$Pr2UFu;qk$q9Y{CST&=A7TtcnG( zZQHyOv|Njb+kv!bxeRJ2(jg1!`-V}%w+@dmE@-#ASF&)&TzhfX2UYBrN+B}|@ixca zQ=eDkgR^5^MQB0RG*n@gn|dxE685gTR&W`?ZBkqH4pLT>WJZOXXocM_QY57m-G9tZ zWn`5dG!z#f{LVwbYff9hhUy3|&*R^-ncKkS(kVE?uGlp>(wl1?8KeiePO6BYh(K$b^Ols--L5) z3yj2f+reZ~F;egwfCyfpC*W5_mXU(XE?j|({W!NN61&DPU;aC{x6hyiyYOQ3!#t~O zl9*HA6qcUG0J*($l;h#-Y<8SDHZdD6&}{Lz^P_~HQ58gR6Pka3;DMj#`F|xOeu)3~ zUXFkEAK|uz;Ci5ik1id$e)8JMbq=Br`vg9|9*y#0xZ(dG|G_#3(T7Cf+gaw)==J2a zWF@nEJ=(&Dmrh^5aP0zC4?pY+@LlWek!p2_KHMwtt?SLuklRtY%}$oNIC0g;8|60r Oe0M1vmBm}ep8^lXIY%sR55pQ8E9>N$papXq#3R*~N`F0B|S*+#9 zY^2}}O=c71#5*RN%mxqM4Nhfiyj!VV@2s;^Tbr7aEIhRDuu~*)W{0ipu7Z@EsnpcW ze*Zc5*<2wo$&6=ePNCE1@t@a!{?~b3{(CeU65#&hsh!9ATLs~#6wzI^7MS{Zg&>?4 zBq1e8F3H{HO1aptJLP7-o|Ff_o-S{;|M3DV5&?CrOKsnssibiNUuVAHPYuGy$0#EQY2L;MN@N;UyuBG$e)k= z1;|fIvDAG?Ux>d&_*;zp`;q?u@|PfgDatn>Z5h&*<97vqS0a6t6i+ouiPUPTEVV`| zPpy?IQtOcaAo3qV+4X?gfcV3RZ$!P1Ap9u)9z%Q+@*hY36R3ML@|uvo1?gLnz76$m zmnu^`kiHY?yYSbHyxquq5@q(F%u^Uo3&yh-u=}K{)PAWtbwHYvYL#kI2c_E7(^6gP zkTf^-4ElFis!tt}0&??!M-Wmegm$yg=MZ|5g+7na9u|5Qp{H2r3kbEaP#Z#fS?D>0 z_OVbJq5Uj$6rlqw)Q(Uq3rPqaWFZ-$r&*{2p+hWm454RO=r}@$Stx_h5fSK^e zK;8$)pYv3!Z$O@6kP8912#}Lj7#=nt`=!ON38?`Fe?QE4g8>60K~6ug+O|* zwB(YD=P;>ZyU|*J&qxY}ercaLZ zB(2a}WhEVEQd&7H#40NU`su&5qZq4(k4s*jn|h6nt`VbKE&rA=j(^Tl*C2K6EHnGX zzyGmzI?d}k+q`~JdQcxZ>#qYvNe{8vP27q#ojxvU7)_0QM#sF~HfBe@k=D;TN}om< zU-}G;(uor`SZ5M+?l5E0!xorR(neeC5nJq0ON_YNskXC1AH{3UsdJR)zE&&b>4*X8ZT!bDZi8@=s5?reixbRFI}9jep*94|kF?9$)(q4WD1ljQsXz-#JEf2=o7uRW zr1}oIpu=1W@`9<~VHj@)#&^$RjrJ3)n07|sZYGZs|I*2yD!Ad-h5{G6j@uu_)O8iS!;xI}anWb01E2RMc7K8sB z;6FcW3m2qkQR17d#1~MaZI%}PmGm6oza^#Nf18y$ic;;fw)1=s^ivKXtaZ8=%u(lPm>!C|_E z^!9DWIMb+(TU)}cIE^ZE2QZy?0CPfzG3?;qzg>?VC484&2P^5MCAw#Y=$REFt3wz) z1+u|i&MTf0T`&U{?}UDO^>(Q>)N|ND{yu*PFv=akB-B-WTh?N-z(>k;8vc8?>el;d8zGsp&PXN zzu_j2_Hb^{Ccq8q*A43W4Z?4iwz(s?g&Smr-yq_?ktA<3c|+t0f=jqT*3=E!*1SRM znHv%EqU6QMi<4IdPxbBCv$yGBJA#JOHX($m8YG<;WC2^90&Q~wF&@bc-`nqL@T&eD z`_`;qv%Z~rtUKy6^>J!Gyz@d{uS*!jcIf~Hqfbh!(BN)4#*0mE20}c*)7x&fbh5W6ucZ4M zPs%+f8@n<`wfuFf)~s#JW%BaM-gNtk^f5Wtc$jiAO^q*PXvS9c_N(Fc<8u3nHrC=m zIUmz1OWN(tUU+D9!?`CW;)}+_MN`!Mc6~}HVhn#ZBKG0y12<73x%9LF z%n?I~f=y=OZI|ln=*p(^4IX77;>sd;YCy{5db`s7IchJNOe%{hHQbw4a&k%MEom14 zl&gYAov$oBeP-}Y`NGa`^o++>jEO6h2awa!;8Vr6ww`pi+}5Us+SmF4i>7Fapf0fpw7dEY`HM`ZSzaMSDZEuQkbd@DI1!L;Mga5_~?C6Q#M zFru%NSMq?ye3BQwzu(v3CrVqlcHLUl-L*#{vbT{ORYo|OA}%=(LTd#ETa-q`l>6Xm zRK&YWgP=*K>a3IeT>>Ny8xo4~%Has>xbxKR0u(j#c~IwR&uOnYp@SZMLQne!eU@~u zp3Zq-0E|cwHXhidEJei)esju|Wk^s(CO?#Pm+I|M((S58k@GnkDrf+X4~wS77?x%F zzlZeP3V0Y+?fjA0uvl1pEml$3btXIPxh{rZ?<*WU^WtcBJicmNTs7<|#>b(HH~~X^E5E`V27$ zl945j20)JGJDC*5+|LMMP=TRrf(&-1kyP>)t-h@ngw7Ht`E28G>ZjiZK_b4y+1hZb z;VwqX#^=;eV*}xmZZ<^w#fG37JKVg#4=VSNtdJg6{n=ikw;ROGYP37unN`}Ll38A~ zI|JdbM-{3_jpyX&`{bT>xvi(K`>3qkASAXl#7byc@e;7Vl@YY++nQFShgJVx)|MJQ zKy~Eud*q&D`Qxgea@VYfj8u5K8ayEPcJ*&1KJe^IOKO24JVD-Op30_!$=8Zwa=y(l+}aq4 zsR1OA+I!o@#Bq+srfJ+LXhZ2YsBS-UeuTdqiAX5faBVSBc|LM3QjAxe9UK|F8gCqr zH-0}b5r4Q?JqQ1$gT6>;QtoVCe29fh-5Uf!qDxf3=eXdt`;-2lSjbLWI^C&Ugy zqghHBXx8fyaHRc?TSv1?=ocD1EgZ+N-Fnj!P|cXiyC;*&lR=T`$>d=~F!ouu_H8%A zr0ONK+Ens0Xks8rBU+^w`V%DO?t=$}ilMWCkpSm_(aO>Mw-0>h$TyE%ZWAWq+rZ`*JyzoDL{_QG8|2tYB}<&-szr)UYG3l?HE9Ksb>$7YtuFwT<9S2- zbUJF86VUOBf7sK3s{*fyr`mh1{Q^6}ATW zD;QFh_2>7V+k2tuLhhr=<%|GT&(X{=wl@3Qm;Ux8kD!p+Y>247w1Q;`=Zh+CF}3Bh zZ7j8o^jc00Wpe0ZJ`I(n5Gqwqu0N*+kM`$fENo;&^{0D#S0XC5v<> zvm`YFZHJn8rK+b(?g1w*L`}+bvx|0=Cc#k>&6o6J}$5NI8jm9I=XDU za`BbK{l)6q(F5l)1<#aEsHmP4g=p2;y(4=^w_b@PKZ%!}eQD&S(HAD-OW#>^@%W{c z?^TY)H;sv#82+(@DOKt?Z&iwjO+dLW{{$bdR=bb0^{5n?1I4LY!L^D_}^4N5X}jqx&bs1*XBo zjIKB`p~?z@(b@@Y9>m3j|K(kr;HWn?Ek^p6#K9DiuvLdSn@Y~9PI~@U1Bx{NJ1$+b z)0#Bx2UUk?b&1UwOk11G=4~nafrW&rY6!7>OUffGA(?E|3~<^STdK3riX@e4NcN^P zN^V8+)NxsnlX_+{lS`(Pu-9cJ1Bt7pYt=PxTanBv$)>KZZHygrS_~7LmlZ8-MKawZ zu_mZ4IfE@Z1xd+1Y{nhyktMAzZ6}Uu(3c6+%XMp$M>F}H0iEQlT2{zrK$3l=^ua?a zqaRXBN(*^=DOEFZ!WOJpEgdy#L#Og0%HXP?kXwzwkT6{?MCxWX9^)0oSS=Zkeli~Y zT<>^kQxU3@uT;cbwof66Ws_BCfjOo`O<85#&a-Z~NIq=41p0|@LtFat`D_pIkZmi3 zWCbJ6Bm%S*GAOjMCdh+fA++gj!c0^iL?ZOBpQ}|h(8haf-P}@61ID(or7)|o!t8)y z8IQ5W7hN1Ai;V3HvGr_& zOL+x_bjtFako#>E6>e+8@&!Ab-RNPpt%pYX{nSgo1xUSoapc9(^o4bA93PJ_855WA z?h>YSXLOfu|5~=O3{%m-nd-%2S8+lbtesns#?qFWNV^uVC~P}3FecXC+6ynb!;nT3 zf_t})hM%+8Ln@Unaag=)Iu7Xdv{9aTru=T7)*1tE2c+S2a+sp>R*|9a|8s%S@4_iSm{VOV4n*V@8{HdIxQ*39 z(v!QpS(ECMMs__HB_3{1hYryZ!H$gFB{5;496{w)=HMcv($YOchO8spR0E!`FQX&T ztK$4|asFuj!oiQkWtJ9pJbX?M=Xq)gX1kh=5Fdzj6AQevs1_OiQ z04%uEf!AYRlFdFzKtEi75J|X5K3Y=d+`ENWTzT}DJC=(Wwy-rW8FY2H!70HOB?J(K z&W;oUH#b)X0-Ii3{fKmWixQ)B>Ny=HC{TYmlaN$DU-78^z8+d^D8EfmLj)CM3l!BW zrSoaNK|=}v>#%O@9FV0zGFJ_<5W%P+7G&(IdTDKxqppyJ!W>`Hl=F@6qnVyGZO{;T z49vGq|E>A!i4cAlRSgN(D=J6VUub&ck&E|@*Db&J{CMr^%lpS`){j?g7#53_HKVno zOAC94gT<=q;n20p`Zo`~_3RtZUfg(f`J>~@AAN7v#PaR$_fO2*|0k6PhPM?X)uU_1 zBlW|(DYSSzGJjG&$hVQz%V40OeOQI&$(TqVmAi7vTU7i4JXM6&;fqy2-&9q73`X@}0~TKT z1uiv1ik!=K_0bX)OD5VK4d>dGY*!aM`lK_h^f4@LahR&G6I3;f>aZT}!(m&_S^f}@ zI>{eM9*-K^+Lg}bntM93EYM=JQ49n6GONPmKquit%2yI3cb&0~U>xokT~N^)T;WLtV;wcxt4%WyjvO zt$UhUTer8W9w>P=(A3jUNKhkI`i2HsNTo)}BRf?MwG+D7Trhh}jqn7GOSNpqZmzbR zh$0$yCHac!dq^3WYsdL2Ym-AnXU_o&Qgz-U#vKn`UVK@3&vkj}#Joqx#k%28VaK&O zi>}UDGCpU?#nAV6PRx01I8v-xe6?oHc+Hy2i{A@O)NCG!0-qB}&H58|z7VNppxw zx1L9ZZrf{O#u8^cD{^YXP+hEMhtnp>ejY`ZdWo~OK?X^QlL8otrnF`ptMxLVr;`q( zOB^2VB=lO0?TfPhU_(faYG+b>vB`HYR-?F*C65?|={}_iAso~5W$F#WR!c*9smvyM z;<%R~ZrgsSdF%G(ZF~=77r`}?x0Adl$vZ{fA$V$t_l4MA*+Z!%R^SgPjl8cC#s47! zpJsRCV=+;vn-J@5`xtc0CDF={mxvm$F~CsIQjLuP?d*fmi`7C^Bm69h zlZ^61RB(~zYdHdRlvFeGZa`V>bihmJNM5INBts_s`9H}d;L`3&wlY84GRf1KwD+E3 zGsvmL;buB}+oxoE>7W2wi;g{SJPglKRQb~RYkai^?H<$f-cA4Op%lU2WjBNm)w1dyVN8q4)7gB0~=J34Z5 zo~_onbs1)RA8qLllwgZ)zB$8f&5ApV@jgqXbb@K1+bGP;I!RUZY@A9HXR7$1p`22d1ziy4}Okl0StpgW=_GCHSD!uw4d zxH!G>40;EBgMOI0n!I4g5!g>yhW1TUR~e@$(W&wwd9;J4jKPDhVbs9DTPSrer3UzZ z1Y0xBRFvJo)pi~Do*uiMW!Fdj%2m|&3DMaj2+V3I7t3mk(XwK^ivOD~3(^r<@V3gS z7q$OmQ%+Dm)>ZPS6S#KeLvp9YNj@oPYsW#km=?GpDx>|OhOi0?cI)wU&oNn-H(Xk> zjU7ff-$83!?h%JrNRXK1E^ZER33!F-U=on6tUsbClZA~GqSHFQ^Yt->$eSdh`vwBP z9^qDPyKt$C30-VB$v1t~ted1IQpCJaK)r3JrLpd4znn>tJOY1LQUo$YlVn_m1ZI{Y z#>_%|FnpJY5A9xjiTE%|-OdQ9#Fp(>t^w|EXc{*lK(gbumaHZ_AU$6&8e5r-SP2a9NaNv}8T#utvh>wkXHtM2B17c${f9B?TQJ z7jm>){gRd0Vrw1`<6SO9Bsta^X~GgGg|XhjOp*gkrDUwcF40LbT&jwdooUUvf$-d5W>P1{{!;puy{fUM$HG*}Xl0M3J=DFdr z4mGRcV@Pe&E;@SinQol1w)ZKyEUxiVevswUc`086;ut%l$db;E>>xFgJ=KFJr0il@ zPU%H4e(umj72upbo$t%tn1e`5L){&VT3Syq^9OhId4K52gX(SB+p?V*NUEn5=Zg^< z)l=wRYkyC>8r5S>If{C>WV2m-DamXocDvSTJ?XS){3&&SytyQ0=q&!z2y%1P$CqKc z{bXOFEgjwe)}c2JjqaWhm)v@;@#1LHg~-M3G2CqyHyMW!WAQ~7_Ft^Oe0pr@_6c!^ zc`kvMGNqS0b<1qWXw!r^|6?&SeCSMMYHo}zI+ORd=yYBT(<7W{z~FT{&Wus zKC8HV5Gdvo&ny*E9d~0ovX$KXRL5@em=r289siOt$lFR&`e{u^Q{s?}xmB9LkhGbO z)ZpKn>4VctCU{>;3>kaZZY2GF&x%Z zIK;HyXKqJ%!|9s~Q~v=%?4K;g+dMtCUZIFe_FZ!)n^G*RINbOva;C;;#n~m-tNSlfI`Dk$gJSr5VRCe={8! zTqxxRFKK_xVy34L{NjyWxwDfJ?NmE?$Hp*I9?T;C-_$3=lu+KM=qd94FFZ9yL!hSl z#Zon{$DibvB)Nf10Ne517sbrqk!|n8Wkt1IFL019K5mhZWqOoJs{R+`-6W5xFJ?&} zq9{{jC0Bu*%;~=-VDg?O5&W%tHmB_dwB5M2n$xB_q=Oby9qK0WlNZYH-pM>4;U=PL*HWSBRoAfM&^D@H}`4xU3bQ^Y%Nmk zQ%iS*2R-JKbbb;?NY@Wa^p`hog*vUc;c2(&`6eLYMh$2ewoB1%qK5iopoU{6!Z4zj z458v-LdkMKYAC_$h{G52m!G+|U{!I!(y?Wa6&EbOn0l{vD&UE1!}Ar7ZySHUVl(6P zP3Nhvpvr$#W?aZT$6^XwH&}r&-AR6!V?ZN02IH_LC_yF5Q8`B2d~#Wd8MT;~wfZF{ z%mdau9+vztOmw_kvh|+m#FVP+595`3m7$(*U6O4;afRt-#&B#IK+MIpG2>~{_3ULx zOGDKit6QdN%>|pGUlo^5){2KhUh?RXBv*>2K5V2`Y3z)8l?Z{5S0JMOcSy$-?|b;X zN{P0+tzOdwy{5;C$(0vhDkj%X`rOF}rv!KKA-wqr(v?=@^DFxOR*N>MjhaUdG>&$% zKy*j!%Ctcq0lUa>dd}edEbb0p1LH9#zXUMr;hjkqj1HI__wt#r%W=HUUx_vOJBg$oHU5bDmtt5#p za@eDPvdNUc)Fm!|wa+au-oStHp=lp#hz7>T71PF}%hxi%y+Z@40~l>9B`;K7c;WJ# zYxk|b+%V;FMK<9%ppSpufEmcDH$!hcf=AQ%+#8JIoEqs$=kanz;;}HkR&hd)#N>_+ zyxWGs%`-!+)G;O7*Q-YLVmunr%JEp-EXWcRnk_u?%x3edkL{VMzV_ppE4rYbMXHqPW=BY1mx2fB2ZiC)I z-2wBnEwe&7}_O;@`<~E4(AO8Giy&=QY2q_7j;MThAK7d&e!TS z3<@}<(P%_@H%}bIT)y52%{M|xBeYNtb@=dVauHrg;-z}${d%hTJLu|kP^ypzBqo?M zd-eMLcw>1Nwd6@MGUrs=UDdS0sL9wDG5d8_H5q#Vc``|vGi&OnPd&w3n2E1e^3P`C zvyj$rV3AfbvTWZtP%CT&_@262t|eM*aHF_Q?iyddO+7ur&gMu6r;Ru86PZ_l>NXI`|bmK z?4i)%0^2lI$lg{+DX`0J%8w}H8hJm4rv{Fvb9j}e=#Q=U;iY9xjq)vs1Gt0%rJ#z~ zf#4Y-g!EMZQ(1bDsXU0f)d>H99{;AE8s|GP+o{`hu~Uum1bzieQWLwd?~+#9kN4{- zG>nqK;LsZ!3mpiK=!mVGlB8ZMJpwgc*~NHac%0G`cz#jD%0x0&Qz*QOr~ zUh(cRp-}LN59VL-?lY56aQl^=sVm;k+0u4h+5OxVZ~9Ktt_5Pl`LW6+R{~3~&0G4; z${*Bx@W_u&PShV7-cyVuu0|G)M;2aq@am!m#}_?#x$A?yA4Lx0Ljm)i!G1_Yf2n?T z!Rqk^tG~bUg9TT_{l(JsD{Hr0*>>oP_{=Ri-(Pv9>A*)~>tt9E8<+*%;M&pfJ$#p= zP0F_8YX--N>?HEOMzrV2WnSQ4ri#+Xb652$*?hJghrXmiRWGISbviAc)wn+W{A!S7 zCTxYC&*N2iLWjVSGVSc)3sx;4(T@HWx@+8}hIniz*5`W8)9jEzE$2DU!2VzxiAPbk zjHg+)7u5<|l2$gx6PxgvtsD#yHOk|MGD;p_xK*`myr;uAXpkM}*)7?gu1t@dR@CZ} z1iheE&%P{uTShUu!=netY)bHw+t{WiDwJnj;;3P~r{gv6}>1QqV|JMJh*`YPhv4eNt{cm4PX#MmQwrb~TLe zzF{;yOeSDO{zfWma;bc{`y-^om(5 z#>U396N|?!RkMULn+9V^AznEP2ic%_kPVCl!`k3jB%%+H#VQT`q-iXcYF9}tDb9z@ z2FYP~f;LK)RBnvj1gkXCtdLQpn%y>c^UcdLY{L0V-uFpN`uSsD_B}H-$Rkg;ZdWVz z9oV~X`+Gbg_zNhjoW%{#6JF#L^hA8I}5z74YZ7%6}%1ACUJ$^8ScCX88Oug|3pvZUQqq z=+7wnWAc7V9Xh3kg`*UKx0;zj0FRE`OW>+!@;q!^72g^Dax zRXrw@7b~mAgfe_ic1)Y;Ek z5*-S%rmn~0h?bB>dy6e6#&cTpz&BGx|pa&XIa$r%4>#V*I8LM09G}5 zyyL7smci;X$HCHAl)UQ%S7c>bn$f}Q(aNFVb=FlrMwZQ>S)y4a7#i{y#o&;Sd!g`9 zpcsy#)(RjqQB0K6AQBi33zby>t2`$XLkm^aqbtX&mJr$#Wrf4%q8Mm-MPcAvBf(XU zhQ})wVd5-cv3Ozq$O#}N8Y|pCl47XU0`Wv)=g1&6rB_u`J2r3Sc+JW&q0(B1W5v~T zMjs!qZXi0a7Aq?+WX{b8s!A~zJ-cyaBgPpFpRFCK1rj2$v%5xiVNlicKtR)8ziTBv z8GU%<@U(#7bRy!aK>XQ}XQu@Or|T20P~pJ&wsURM0)jUm@Vi3OiFvNahu5CnFtTA< zKydPLAzD4WY_J3wB?IWzWijtKkAzB)_v?1hpS)RGZpYg-9y3Y zSkUE1t*Ni1rUe9VR>xfa$)pgj9A0>~VWgqxjiPk(%gw_b6W%H_c6`D+$BcDOcx#K^ z5FmHFvSWD7tIbnEU)Vhqn2wdXHoFSd(*pfYKTzh{SXg*|<++uVuyOJM^Q`YKn$dj<*nQ6ME;H z_3s{azZLv?aKcMp`=(*yGYpAZ?IYrMF%TWI7F@p4JbVmuMsxSjt4~>eHoS@z7b^ge zt_knlqBnx!?s|FG@SzEBr5*WmA_@0UWU~HKq1T~TnEmbvZ@sM%vp0H&9|cKFl?55X zs|_+ViDY&HvX4lQJ&Vx-(L}A7NMCgL7)ZKMSM-(@9@9dxLU0ma#K54Z6G2z9aENF* z`3v-7?nI=X1XDHt82iWG$Z(1gi#|-5VNZ{7%<2;##G66yyix|z2;r5T!_ADnEM#Bw z#xNs5 zeoFLD$7+$NK_WP{K7_=Y2!kB>$^c0Q|IKObZC! zd@zEB>IqU~c@uKJD>S5PsiF2iMGKHYRj9FSDpBS-$j{jSKMMUJtN;K2 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/Xlib/ext/__pycache__/xtest.cpython-312.pyc b/venv/lib/python3.12/site-packages/Xlib/ext/__pycache__/xtest.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..db84ea04076280e03387b1ccf5e069e046b7eea6 GIT binary patch literal 5881 zcmd5=U2GHC6~1GSf8!)hLU4v8>%cBQ14&#$8=y;;@lkDXv>2;^z8p(D!Vk?@_#<@8$Y! zpzj0yoprk=SF`U^h$>9)GUfF*NC)aQlT%tL zH5z5!Xf&Nw@+stf(ddnQEM>G%{D3(x>NFqMnPW0Wm1E3#o{xgHUqI`c{*juws$XOF zk7EjRqRQcMuuY9d<^(R6Dm)|=Fh&0R%aBHALTOb=#zIOimDfVKf_^QV8Bx@k5R6@! z$z^mJD}-j$%uFbiyi#pHGJ1F{q$PEABo~Wck6l%@&}D2@XZ6sm4x<>&6(~jlCxgIf ze+F`klso%Ar*{gs3yXb=-S_*J`j!urq(fzC57eY3Y5DNIfwCkoc0ZTor;^N@c2^Zc zC26cI1);WcY3H(VPpW@)vLqd;v^o9#bLTevq$BY8g*%_#{`Bt5UAizcKeHJ7qEHS5 zp)xx^yWCj{{Gc2df?8p|@MQN`DR8757;Mz6wk-!sfy4EtD_{Huy6BKTJ45@;iN&i> z2z5em%duX`09hb|I^H@t&X(65=X60 zy54 zO4W>BZRx{r5JYJJiG&1m1|v$bU%JmEKLSR32;{YZ$i%2)C26>hJ;xrzzDhhyJW4+q z`DsZyUGX?L40UV+L(WoQ|CTU>SmP4wSc4OYH)04bH^-VUf%%@XhFGODMWK#AzqJ)@ z(-uxx#U+Z~XL!ke24IFDidfk0(Ha<_lp`{M#n&D z5+3b15C9?f)*uA1baUxuIk*>q$g_X$)P|e*+V70t9-o_f8Ia7tuY_Uc7swlv;F;rs z*_uVME28R|#_(w=Ahk%bL5gA1Qb1~zYZuq?0!9AnE7jCKvZK%j>7M6I z?7I3vCYRTFXsly&Gp`DHmLAm$In~G@or4`-HD!_GCFx)t*T)~6`s&QXGY@`T zlEz!oPBSBY``%z#YN|BYtpxr4{?E=C#}H0F?gC;K3>XgJv%q}M01nAw(Owjbj-nGl z8{G$rKngr6oY7klWe00JOJi3ivv5VrrVJS25$;W< z0YGMw*}N8(+rBeIh!a^bvlAA~GK$Y(1Ck^>+RuT!Rum6GAO@BK%L658v?;E5=41v8 z_G6v#{6B725GJ^gP|Pr~H-rhI7(@eKkCte#8PULT4iVk-ci&amsA#;pQ&Z4#10HQJ z5Xe}>&c%1`4=+JdIe33yY2dkZ{Hb(&ZGTCcC=c%c)?stVhJ&L;v*6`{1IQXM3wXz@ z-8W4YI6no&rq{lz&uI&7$Rc#n{CZn$L2)$POl#}4g>6A`>h70q0|>dod~I15|KlLq zc)!Gak?k<#%~>Dw8`3(CuHvZH?4jVVert-{|M3dM|pCyo@+hvJ6FHYVZ) znu*CwBC9p-9!Qcp{REU|;L*ZB=15s|KNkm|ii3;EC-RB4>(9gw>!NE<4!rku$20MK zT?AV1u0@`S=bA)6Su6fk{D^OFSngpW{)=K9)9uKP=4e*W#vv?mUwD#C@xsk~7w~VK z>R&#_{hrSW(-=N6<}w=*wOL#B(sT*(2!3806X!mRv*)vGxi>NQ3FCjL_vo)c1^r9= z9gq#XAPD~%CPL3Y$iO$=t~u8?{;s+9O|esu?shK(=YyLB*cW?5VPvzz2f~Sk^YiC7 z39v5)976YIN0-ol*S6rD_ihqkH};W3!;elqo?4wM?+h#?<`c`iA9PjhUZHoh&k3q~ Y77orI+$6xh@Y@Bs;uVD{fiK$s0MfK1IsgCw literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/Xlib/ext/composite.py b/venv/lib/python3.12/site-packages/Xlib/ext/composite.py new file mode 100644 index 0000000..f956c62 --- /dev/null +++ b/venv/lib/python3.12/site-packages/Xlib/ext/composite.py @@ -0,0 +1,271 @@ +# $Id: xtest.py,v 1.1 2000/08/21 10:03:45 petli Exp $ +# +# Xlib.ext.composite -- Composite extension module +# +# Copyright (C) 2007 Peter Liljenberg +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public License +# as published by the Free Software Foundation; either version 2.1 +# of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the +# Free Software Foundation, Inc., +# 59 Temple Place, +# Suite 330, +# Boston, MA 02111-1307 USA + +"""Composite extension, allowing windows to be rendered to off-screen +storage. + +For detailed description, see the protocol specification at +http://freedesktop.org/wiki/Software/CompositeExt + +By itself this extension is not very useful, it is intended to be used +together with the DAMAGE and XFIXES extensions. Typically you would +also need RENDER or glX or some similar method of creating fancy +graphics. +""" + +from Xlib.protocol import rq +from Xlib.xobject import drawable + +extname = 'Composite' + +RedirectAutomatic = 0 +RedirectManual = 1 + +class QueryVersion(rq.ReplyRequest): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(0), + rq.RequestLength(), + rq.Card32('major_version'), + rq.Card32('minor_version') + ) + + _reply = rq.Struct( + rq.ReplyCode(), + rq.Pad(1), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Card32('major_version'), + rq.Card32('minor_version'), + rq.Pad(16), + ) + +def query_version(self): + return QueryVersion( + display = self.display, + opcode = self.display.get_extension_major(extname), + major_version=0, + minor_version=4 + ) + + +class RedirectWindow(rq.Request): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(1), + rq.RequestLength(), + rq.Window('window'), + rq.Set('update', 1, (RedirectAutomatic, RedirectManual)), + rq.Pad(3), + ) + +def redirect_window(self, update, onerror = None): + """Redirect the hierarchy starting at this window to off-screen + storage. + """ + RedirectWindow(display = self.display, + onerror = onerror, + opcode = self.display.get_extension_major(extname), + window = self, + update = update, + ) + + +class RedirectSubwindows(rq.Request): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(2), + rq.RequestLength(), + rq.Window('window'), + rq.Set('update', 1, (RedirectAutomatic, RedirectManual)), + rq.Pad(3), + ) + +def redirect_subwindows(self, update, onerror = None): + """Redirect the hierarchies starting at all current and future + children to this window to off-screen storage. + """ + RedirectSubwindows(display = self.display, + onerror = onerror, + opcode = self.display.get_extension_major(extname), + window = self, + update = update, + ) + + +class UnredirectWindow(rq.Request): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(3), + rq.RequestLength(), + rq.Window('window'), + rq.Set('update', 1, (RedirectAutomatic, RedirectManual)), + rq.Pad(3), + ) + +def unredirect_window(self, update, onerror = None): + """Stop redirecting this window hierarchy. + """ + UnredirectWindow(display = self.display, + onerror = onerror, + opcode = self.display.get_extension_major(extname), + window = self, + update = update, + ) + + +class UnredirectSubindows(rq.Request): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(4), + rq.RequestLength(), + rq.Window('window'), + rq.Set('update', 1, (RedirectAutomatic, RedirectManual)), + rq.Pad(3), + ) + +def unredirect_subwindows(self, update, onerror = None): + """Stop redirecting the hierarchies of children to this window. + """ + RedirectWindow(display = self.display, + onerror = onerror, + opcode = self.display.get_extension_major(extname), + window = self, + update = update, + ) + + +class CreateRegionFromBorderClip(rq.Request): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(5), + rq.RequestLength(), + rq.Card32('region'), # FIXME: this should be a Region from XFIXES extension + rq.Window('window'), + ) + +def create_region_from_border_clip(self, onerror = None): + """Create a region of the border clip of the window, i.e. the area + that is not clipped by the parent and any sibling windows. + """ + + rid = self.display.allocate_resource_id() + CreateRegionFromBorderClip( + display = self.display, + onerror = onerror, + opcode = self.display.get_extension_major(extname), + region = rid, + window = self, + ) + + # FIXME: create Region object and return it + return rid + + +class NameWindowPixmap(rq.Request): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(6), + rq.RequestLength(), + rq.Window('window'), + rq.Pixmap('pixmap'), + ) + +def name_window_pixmap(self, onerror = None): + """Create a new pixmap that refers to the off-screen storage of + the window, including its border. + + This pixmap will remain allocated until freed whatever happens + with the window. However, the window will get a new off-screen + pixmap every time it is mapped or resized, so to keep track of the + contents you must listen for these events and get a new pixmap + after them. + """ + + pid = self.display.allocate_resource_id() + NameWindowPixmap(display = self.display, + onerror = onerror, + opcode = self.display.get_extension_major(extname), + window = self, + pixmap = pid, + ) + + cls = self.display.get_resource_class('pixmap', drawable.Pixmap) + return cls(self.display, pid, owner = 1) + +class GetOverlayWindow(rq.ReplyRequest): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(7), + rq.RequestLength(), + rq.Window('window') + ) + _reply = rq.Struct( + rq.ReplyCode(), + rq.Pad(1), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Window('overlay_window'), + rq.Pad(20), + ) + +def get_overlay_window(self): + """Return the overlay window of the root window. + """ + + return GetOverlayWindow(display = self.display, + opcode = self.display.get_extension_major(extname), + window = self) + +def init(disp, info): + disp.extension_add_method('display', + 'composite_query_version', + query_version) + + disp.extension_add_method('window', + 'composite_redirect_window', + redirect_window) + + disp.extension_add_method('window', + 'composite_redirect_subwindows', + redirect_subwindows) + + disp.extension_add_method('window', + 'composite_unredirect_window', + unredirect_window) + + disp.extension_add_method('window', + 'composite_unredirect_subwindows', + unredirect_subwindows) + + disp.extension_add_method('window', + 'composite_create_region_from_border_clip', + create_region_from_border_clip) + + disp.extension_add_method('window', + 'composite_name_window_pixmap', + name_window_pixmap) + + disp.extension_add_method('window', + 'composite_get_overlay_window', + get_overlay_window) diff --git a/venv/lib/python3.12/site-packages/Xlib/ext/damage.py b/venv/lib/python3.12/site-packages/Xlib/ext/damage.py new file mode 100644 index 0000000..614c808 --- /dev/null +++ b/venv/lib/python3.12/site-packages/Xlib/ext/damage.py @@ -0,0 +1,181 @@ +# Xlib.ext.damage -- DAMAGE extension module +# +# Copyright (C) 2018 Joseph Kogut +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public License +# as published by the Free Software Foundation; either version 2.1 +# of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the +# Free Software Foundation, Inc., +# 59 Temple Place, +# Suite 330, +# Boston, MA 02111-1307 USA + + +from Xlib import X +from Xlib.protocol import rq, structs +from Xlib.error import XError + +extname = 'DAMAGE' + +# Event codes # +DamageNotifyCode = 0 + +# Error codes # +BadDamageCode = 0 + +class BadDamageError(XError): + pass + +# DamageReportLevel options +DamageReportRawRectangles = 0 +DamageReportDeltaRectangles = 1 +DamageReportBoundingBox = 2 +DamageReportNonEmpty = 3 + +DamageReportLevel = ( + DamageReportRawRectangles, + DamageReportDeltaRectangles, + DamageReportBoundingBox, + DamageReportNonEmpty, +) + +DAMAGE = rq.Card32 + +# Methods + +class QueryVersion(rq.ReplyRequest): + _request = rq.Struct(rq.Card8('opcode'), + rq.Opcode(0), + rq.RequestLength(), + rq.Card32('major_version'), + rq.Card32('minor_version'), + ) + + _reply = rq.Struct(rq.ReplyCode(), + rq.Pad(1), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Card32('major_version'), + rq.Card32('minor_version'), + rq.Pad(16), + ) + +def query_version(self): + return QueryVersion(display=self.display, + opcode=self.display.get_extension_major(extname), + major_version=1, + minor_version=1) + +class DamageCreate(rq.Request): + _request = rq.Struct(rq.Card8('opcode'), + rq.Opcode(1), + rq.RequestLength(), + DAMAGE('damage'), + rq.Drawable('drawable'), + rq.Set('level', 1, DamageReportLevel), + rq.Pad(3), + ) + +def damage_create(self, level): + did = self.display.allocate_resource_id() + DamageCreate(display=self.display, + opcode=self.display.get_extension_major(extname), + damage=did, + drawable=self.id, + level=level, + ) + return did + +class DamageDestroy(rq.Request): + _request = rq.Struct(rq.Card8('opcode'), + rq.Opcode(2), + rq.RequestLength(), + DAMAGE('damage') + ) + +def damage_destroy(self, damage): + DamageDestroy(display=self.display, + opcode=self.display.get_extension_major(extname), + damage=damage, + ) + + self.display.free_resource_id(damage) + +class DamageSubtract(rq.Request): + _request = rq.Struct(rq.Card8('opcode'), + rq.Opcode(3), + rq.RequestLength(), + DAMAGE('damage'), + rq.Card32('repair'), + rq.Card32('parts') + ) + +def damage_subtract(self, damage, repair=X.NONE, parts=X.NONE): + DamageSubtract(display=self.display, + opcode=self.display.get_extension_major(extname), + damage=damage, + repair=repair, + parts=parts) + +class DamageAdd(rq.Request): + _request = rq.Struct(rq.Card8('opcode'), + rq.Opcode(4), + rq.RequestLength(), + rq.Card32('repair'), + rq.Card32('parts'), + ) + +def damage_add(self, repair, parts): + DamageAdd(display=self.display, + opcode=self.display.get_extension_major(extname), + repair=repair, + parts=parts) + +# Events # + +class DamageNotify(rq.Event): + _code = None + _fields = rq.Struct( + rq.Card8('type'), + rq.Card8('level'), + rq.Card16('sequence_number'), + rq.Drawable('drawable'), + DAMAGE('damage'), + rq.Card32('timestamp'), + rq.Object('area', structs.Rectangle), + rq.Object('drawable_geometry', structs.Rectangle) + ) + +def init(disp, info): + disp.extension_add_method('display', + 'damage_query_version', + query_version) + + disp.extension_add_method('drawable', + 'damage_create', + damage_create) + + disp.extension_add_method('display', + 'damage_destroy', + damage_destroy) + + disp.extension_add_method('display', + 'damage_subtract', + damage_subtract) + + disp.extension_add_method('drawable', + 'damage_add', + damage_add) + + disp.extension_add_event(info.first_event + DamageNotifyCode, DamageNotify) + + disp.extension_add_error(code=BadDamageCode, err=BadDamageError) diff --git a/venv/lib/python3.12/site-packages/Xlib/ext/dpms.py b/venv/lib/python3.12/site-packages/Xlib/ext/dpms.py new file mode 100644 index 0000000..5804169 --- /dev/null +++ b/venv/lib/python3.12/site-packages/Xlib/ext/dpms.py @@ -0,0 +1,232 @@ +# Xlib.ext.dpms -- X Display Power Management Signaling +# +# Copyright (C) 2020 Thiago Kenji Okada +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public License +# as published by the Free Software Foundation; either version 2.1 +# of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the +# Free Software Foundation, Inc., +# 59 Temple Place, +# Suite 330, +# Boston, MA 02111-1307 USA + +''' +This extension provides X Protocol control over the VESA Display +Power Management Signaling (DPMS) characteristics of video boards +under control of the X Window System. + +Documentation: https://www.x.org/releases/X11R7.7/doc/xextproto/dpms.html +''' + +from Xlib.protocol import rq + +extname = 'DPMS' + + +# DPMS Extension Power Levels +# 0 DPMSModeOn In use +# 1 DPMSModeStandby Blanked, low power +# 2 DPMSModeSuspend Blanked, lower power +# 3 DPMSModeOff Shut off, awaiting activity +DPMSModeOn = 0 +DPMSModeStandby = 1 +DPMSModeSuspend = 2 +DPMSModeOff = 3 + +DPMSPowerLevel = ( + DPMSModeOn, + DPMSModeStandby, + DPMSModeSuspend, + DPMSModeOff, +) + + +class DPMSGetVersion(rq.ReplyRequest): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(0), + rq.RequestLength(), + rq.Card16('major_version'), + rq.Card16('minor_version'), + ) + + _reply = rq.Struct( + rq.ReplyCode(), + rq.Pad(1), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Card16('major_version'), + rq.Card16('minor_version'), + rq.Pad(20), + ) + + +def get_version(self): + return DPMSGetVersion(display=self.display, + opcode=self.display.get_extension_major(extname), + major_version=1, + minor_version=1) + + +class DPMSCapable(rq.ReplyRequest): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(1), + rq.RequestLength(), + ) + + _reply = rq.Struct( + rq.ReplyCode(), + rq.Pad(1), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Bool('capable'), + rq.Pad(23), + ) + + +def capable(self): + return DPMSCapable(display=self.display, + opcode=self.display.get_extension_major(extname), + major_version=1, + minor_version=1) + + +class DPMSGetTimeouts(rq.ReplyRequest): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(2), + rq.RequestLength(), + ) + + _reply = rq.Struct( + rq.ReplyCode(), + rq.Pad(1), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Card16('standby_timeout'), + rq.Card16('suspend_timeout'), + rq.Card16('off_timeout'), + rq.Pad(18), + ) + + +def get_timeouts(self): + return DPMSGetTimeouts(display=self.display, + opcode=self.display.get_extension_major(extname), + major_version=1, + minor_version=1) + + +class DPMSSetTimeouts(rq.Request): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(3), + rq.RequestLength(), + rq.Card16('standby_timeout'), + rq.Card16('suspend_timeout'), + rq.Card16('off_timeout'), + rq.Pad(2) + ) + + +def set_timeouts(self, standby_timeout, suspend_timeout, off_timeout): + return DPMSSetTimeouts(display=self.display, + opcode=self.display.get_extension_major(extname), + major_version=1, + minor_version=1, + standby_timeout=standby_timeout, + suspend_timeout=suspend_timeout, + off_timeout=off_timeout) + + +class DPMSEnable(rq.Request): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(4), + rq.RequestLength(), + ) + + +def enable(self): + return DPMSEnable(display=self.display, + opcode=self.display.get_extension_major(extname), + major_version=1, + minor_version=1) + + +class DPMSDisable(rq.Request): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(5), + rq.RequestLength(), + ) + + +def disable(self): + return DPMSDisable(display=self.display, + opcode=self.display.get_extension_major(extname), + major_version=1, + minor_version=1) + + +class DPMSForceLevel(rq.Request): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(6), + rq.RequestLength(), + rq.Resource('power_level', DPMSPowerLevel), + ) + + +def force_level(self, power_level): + return DPMSForceLevel(display=self.display, + opcode=self.display.get_extension_major(extname), + major_version=1, + minor_version=1, + power_level=power_level) + + +class DPMSInfo(rq.ReplyRequest): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(7), + rq.RequestLength(), + ) + + _reply = rq.Struct( + rq.ReplyCode(), + rq.Pad(1), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Card16('power_level'), + rq.Bool('state'), + rq.Pad(21), + ) + + +def info(self): + return DPMSInfo(display=self.display, + opcode=self.display.get_extension_major(extname), + major_version=1, + minor_version=1) + + +def init(disp, _info): + disp.extension_add_method('display', 'dpms_get_version', get_version) + disp.extension_add_method('display', 'dpms_capable', capable) + disp.extension_add_method('display', 'dpms_get_timeouts', get_timeouts) + disp.extension_add_method('display', 'dpms_set_timeouts', set_timeouts) + disp.extension_add_method('display', 'dpms_enable', enable) + disp.extension_add_method('display', 'dpms_disable', disable) + disp.extension_add_method('display', 'dpms_force_level', force_level) + disp.extension_add_method('display', 'dpms_info', info) diff --git a/venv/lib/python3.12/site-packages/Xlib/ext/ge.py b/venv/lib/python3.12/site-packages/Xlib/ext/ge.py new file mode 100644 index 0000000..85d2d01 --- /dev/null +++ b/venv/lib/python3.12/site-packages/Xlib/ext/ge.py @@ -0,0 +1,112 @@ +# Xlib.ext.ge -- Generic Event extension module +# +# Copyright (C) 2012 Outpost Embedded, LLC +# Forest Bond +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public License +# as published by the Free Software Foundation; either version 2.1 +# of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the +# Free Software Foundation, Inc., +# 59 Temple Place, +# Suite 330, +# Boston, MA 02111-1307 USA + +''' +ge - Generic Event Extension +''' + +from Xlib.protocol import rq + +extname = 'Generic Event Extension' + + +GenericEventCode = 35 + + +class GEQueryVersion(rq.ReplyRequest): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(0), + rq.RequestLength(), + rq.Card32('major_version'), + rq.Card32('minor_version'), + ) + _reply = rq.Struct( + rq.ReplyCode(), + rq.Pad(1), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Card32('major_version'), + rq.Card32('minor_version'), + rq.Pad(16), + ) + + +def query_version(self): + return GEQueryVersion( + display=self.display, + opcode=self.display.get_extension_major(extname), + major_version=1, + minor_version=0, + ) + + +class GenericEvent(rq.Event): + _code = GenericEventCode + _fields = rq.Struct( + rq.Card8('type'), + rq.Card8('extension'), + rq.Card16('sequence_number'), + rq.Card32('length'), + rq.Card16('evtype'), + # Some generic events make use of this space, but with + # others the data is simply discarded. In any case we + # don't need to explicitly pad this out as we are + # always given at least 32 bytes and we save + # everything after the first ten as the "data" field. + #rq.Pad(22), + ) + + def __init__(self, binarydata = None, display = None, **keys): + if binarydata: + data = binarydata[10:] + binarydata = binarydata[:10] + else: + data = '' + + rq.Event.__init__( + self, + binarydata=binarydata, + display=display, + **keys + ) + + if display: + ge_event_data = getattr(display, 'ge_event_data', None) + if ge_event_data: + estruct = ge_event_data.get((self.extension, self.evtype), None) + if estruct: + data, _ = estruct.parse_binary(data, display) + + self._data['data'] = data + + +def add_event_data(self, extension, evtype, estruct): + if not hasattr(self.display, 'ge_event_data'): + self.display.ge_event_data = {} + self.display.ge_event_data[(extension, evtype)] = estruct + + +def init(disp, info): + disp.extension_add_method('display', 'ge_query_version', query_version) + disp.extension_add_method('display', 'ge_add_event_data', add_event_data) + disp.extension_add_event(GenericEventCode, GenericEvent) diff --git a/venv/lib/python3.12/site-packages/Xlib/ext/nvcontrol.py b/venv/lib/python3.12/site-packages/Xlib/ext/nvcontrol.py new file mode 100644 index 0000000..3b0bfb6 --- /dev/null +++ b/venv/lib/python3.12/site-packages/Xlib/ext/nvcontrol.py @@ -0,0 +1,5393 @@ +# Xlib.ext.nvcontrol -- NV-CONTROL extension module +# +# Copyright (C) 2019 Roberto Leinardi +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public License +# as published by the Free Software Foundation; either version 2.1 +# of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the +# Free Software Foundation, Inc., +# 59 Temple Place, +# Suite 330, +# Boston, MA 02111-1307 USA + + +"""NV-CONTROL - provide access to the NV-CONTROL extension information.""" + +from Xlib.protocol import rq + +extname = 'NV-CONTROL' + + +def query_target_count(self, target): + """Return the target count""" + reply = NVCtrlQueryTargetCountReplyRequest(display=self.display, + opcode=self.display.get_extension_major(extname), + target_type=target.type()) + return int(reply._data.get('count')) + + +def query_int_attribute(self, target, display_mask, attr): + """Return the value of an integer attribute""" + reply = NVCtrlQueryAttributeReplyRequest(display=self.display, + opcode=self.display.get_extension_major(extname), + target_id=target.id(), + target_type=target.type(), + display_mask=display_mask, + attr=attr) + if not reply._data.get('flags'): + return None + return int(reply._data.get('value')) + + +def set_int_attribute(self, target, display_mask, attr, value): + """Set the value of an integer attribute""" + reply = NVCtrlSetAttributeAndGetStatusReplyRequest(display=self.display, + opcode=self.display.get_extension_major(extname), + target_id=target.id(), + target_type=target.type(), + display_mask=display_mask, + attr=attr, + value=value) + return reply._data.get('flags') != 0 + + +def query_string_attribute(self, target, display_mask, attr): + """Return the value of a string attribute""" + reply = NVCtrlQueryStringAttributeReplyRequest(display=self.display, + opcode=self.display.get_extension_major(extname), + target_id=target.id(), + target_type=target.type(), + display_mask=display_mask, + attr=attr) + if not reply._data.get('flags'): + return None + return str(reply._data.get('string')).strip('\0') + + +def query_valid_attr_values(self, target, display_mask, attr): + """Return the value of an integer attribute""" + reply = NVCtrlQueryValidAttributeValuesReplyRequest(display=self.display, + opcode=self.display.get_extension_major(extname), + target_id=target.id(), + target_type=target.type(), + display_mask=display_mask, + attr=attr) + if not reply._data.get('flags'): + return None + return int(reply._data.get('min')), int(reply._data.get('max')) + + +def query_binary_data(self, target, display_mask, attr): + """Return binary data""" + reply = NVCtrlQueryBinaryDataReplyRequest(display=self.display, + opcode=self.display.get_extension_major(extname), + target_id=target.id(), + target_type=target.type(), + display_mask=display_mask, + attr=attr) + if not reply._data.get('flags'): + return None + return reply._data.get('data') + + +def get_coolers_used_by_gpu(self, target): + reply = NVCtrlQueryListCard32ReplyRequest(display=self.display, + opcode=self.display.get_extension_major(extname), + target_id=target.id(), + target_type=target.type(), + display_mask=0, + attr=NV_CTRL_BINARY_DATA_COOLERS_USED_BY_GPU) + if not reply._data.get('flags'): + return None + fans = reply._data.get('list') + if len(fans) > 1: + return fans[1:] + else: + return None + + +def get_gpu_count(self): + """Return the number of GPU's present in the system.""" + return int(query_target_count(self, Gpu())) + + +def get_name(self, target): + """Return the GPU product name on which the specified X screen is running""" + return query_string_attribute(self, target, 0, NV_CTRL_STRING_PRODUCT_NAME) + + +def get_driver_version(self, target): + """Return the NVIDIA (kernel level) driver version for the specified screen or GPU""" + return query_string_attribute(self, target, 0, NV_CTRL_STRING_NVIDIA_DRIVER_VERSION) + + +def get_vbios_version(self, target): + """Return the version of the VBIOS for the specified screen or GPU""" + return query_string_attribute(self, target, 0, NV_CTRL_STRING_VBIOS_VERSION) + + +def get_gpu_uuid(self, target): + return query_string_attribute(self, target, 0, NV_CTRL_STRING_GPU_UUID) + + +def get_utilization_rates(self, target): + string = query_string_attribute(self, target, 0, NV_CTRL_STRING_GPU_UTILIZATION) + result = {} + if string is not None and string != '': + for line in string.split(','): + [key, value] = line.split('=')[:2] + result[key.strip()] = int(value) if value.isdigit() else value + return result + + +def get_performance_modes(self, target): + string = query_string_attribute(self, target, 0, NV_CTRL_STRING_PERFORMANCE_MODES) + result = [] + if string is not None and string != '': + for perf in string.split(';'): + perf_dict = {} + for line in perf.split(','): + [key, value] = line.split('=')[:2] + perf_dict[key.strip()] = int(value) if value.isdigit() else value + result.append(perf_dict) + return result + + +def get_clock_info(self, target): + string = query_string_attribute(self, target, 0, NV_CTRL_STRING_GPU_CURRENT_CLOCK_FREQS) + result = {} + if string is not None and string != '': + for line in string.split(','): + [key, value] = line.split('=')[:2] + result[key.strip()] = int(value) if value.isdigit() else value + return result + + +def get_vram(self, target): + return query_int_attribute(self, target, 0, NV_CTRL_VIDEO_RAM) + + +def get_irq(self, target): + """Return the interrupt request line used by the GPU driving the screen""" + return query_int_attribute(self, target, 0, NV_CTRL_IRQ) + + +def supports_framelock(self, target): + """Return whether the underlying GPU supports Frame Lock. + + All of the other frame lock attributes are only applicable if this returns True. + """ + return query_int_attribute(self, target, 0, NV_CTRL_FRAMELOCK) == 1 + + +def gvo_supported(self, screen): + """Return whether this X screen supports GVO + + If this screen does not support GVO output, then all other GVO attributes are unavailable. + """ + return query_int_attribute(self, screen, [], NV_CTRL_GVO_SUPPORTED) + + +def get_core_temp(self, target): + """Return the current core temperature of the GPU driving the X screen.""" + return query_int_attribute(self, target, 0, NV_CTRL_GPU_CORE_TEMPERATURE) + + +def get_core_threshold(self, target): + """Return the current GPU core slowdown threshold temperature. + + It reflects the temperature at which the GPU is throttled to prevent overheating. + """ + return query_int_attribute(self, target, 0, NV_CTRL_GPU_CORE_THRESHOLD) + + +def get_default_core_threshold(self, target): + """Return the default core threshold temperature.""" + return query_int_attribute(self, target, 0, NV_CTRL_GPU_DEFAULT_CORE_THRESHOLD) + + +def get_max_core_threshold(self, target): + """Return the maximum core threshold temperature.""" + return query_int_attribute(self, target, 0, NV_CTRL_GPU_MAX_CORE_THRESHOLD) + + +def get_ambient_temp(self, target): + """Return the current temperature in the immediate neighbourhood of the GPU driving the X screen.""" + return query_int_attribute(self, target, 0, NV_CTRL_AMBIENT_TEMPERATURE) + + +def get_cuda_cores(self, target): + return query_int_attribute(self, target, 0, NV_CTRL_GPU_CORES) + + +def get_memory_bus_width(self, target): + return query_int_attribute(self, target, 0, NV_CTRL_GPU_MEMORY_BUS_WIDTH) + + +def get_total_dedicated_gpu_memory(self, target): + return query_int_attribute(self, target, 0, NV_CTRL_TOTAL_DEDICATED_GPU_MEMORY) + + +def get_used_dedicated_gpu_memory(self, target): + return query_int_attribute(self, target, 0, NV_CTRL_USED_DEDICATED_GPU_MEMORY) + + +def get_curr_pcie_link_width(self, target): + return query_int_attribute(self, target, 0, NV_CTRL_GPU_PCIE_CURRENT_LINK_WIDTH) + + +def get_max_pcie_link_width(self, target): + return query_int_attribute(self, target, 0, NV_CTRL_GPU_PCIE_MAX_LINK_WIDTH) + + +def get_curr_pcie_link_generation(self, target): + return query_int_attribute(self, target, 0, NV_CTRL_GPU_PCIE_GENERATION) + + +def get_encoder_utilization(self, target): + return query_int_attribute(self, target, 0, NV_CTRL_VIDEO_ENCODER_UTILIZATION) + + +def get_decoder_utilization(self, target): + return query_int_attribute(self, target, 0, NV_CTRL_VIDEO_DECODER_UTILIZATION) + + +def get_current_performance_level(self, target): + return query_int_attribute(self, target, 0, NV_CTRL_GPU_CURRENT_PERFORMANCE_LEVEL) + + +def get_gpu_nvclock_offset(self, target, perf_level): + return query_int_attribute(self, target, perf_level, NV_CTRL_GPU_NVCLOCK_OFFSET) + + +def set_gpu_nvclock_offset(self, target, perf_level, offset): + return set_int_attribute(self, target, perf_level, NV_CTRL_GPU_NVCLOCK_OFFSET, offset) + + +def set_gpu_nvclock_offset_all_levels(self, target, offset): + return set_int_attribute(self, target, 0, NV_CTRL_GPU_NVCLOCK_OFFSET_ALL_PERFORMANCE_LEVELS, offset) + + +def get_gpu_nvclock_offset_range(self, target, perf_level): + return query_valid_attr_values(self, target, perf_level, NV_CTRL_GPU_NVCLOCK_OFFSET) + + +def get_mem_transfer_rate_offset(self, target, perf_level): + return query_int_attribute(self, target, perf_level, NV_CTRL_GPU_MEM_TRANSFER_RATE_OFFSET) + + +def set_mem_transfer_rate_offset(self, target, perf_level, offset): + return set_int_attribute(self, target, perf_level, NV_CTRL_GPU_MEM_TRANSFER_RATE_OFFSET, offset) + + +def set_mem_transfer_rate_offset_all_levels(self, target, offset): + return set_int_attribute(self, target, 0, NV_CTRL_GPU_MEM_TRANSFER_RATE_OFFSET_ALL_PERFORMANCE_LEVELS, offset) + + +def get_mem_transfer_rate_offset_range(self, target, perf_level): + return query_valid_attr_values(self, target, perf_level, NV_CTRL_GPU_MEM_TRANSFER_RATE_OFFSET) + + +def get_cooler_manual_control_enabled(self, target): + return query_int_attribute(self, target, 0, NV_CTRL_GPU_COOLER_MANUAL_CONTROL) + + +def set_cooler_manual_control_enabled(self, target, enabled): + return set_int_attribute(self, target, 0, NV_CTRL_GPU_COOLER_MANUAL_CONTROL, 1 if enabled else 0) == 1 + + +def get_fan_duty(self, target): + return query_int_attribute(self, target, 0, NV_CTRL_THERMAL_COOLER_CURRENT_LEVEL) + + +def set_fan_duty(self, cooler, speed): + return set_int_attribute(self, cooler, 0, NV_CTRL_THERMAL_COOLER_LEVEL, speed) + + +def get_fan_rpm(self, target): + return query_int_attribute(self, target, 0, NV_CTRL_THERMAL_COOLER_SPEED) + + +def get_max_displays(self, target): + """Return the maximum number of display devices that can be driven simultaneously on a GPU. + + Note that this does not indicate the maximum number of bits that can be set in + NV_CTRL_CONNECTED_DISPLAYS, because more display devices can be connected than are actively + in use. + """ + return query_int_attribute(self, target, 0, NV_CTRL_MAX_DISPLAYS) + + +def _displaystr2num(st): + """Return a display number from a string""" + num = None + for s, n in [('DFP-', 16), ('TV-', 8), ('CRT-', 0)]: + if st.startswith(s): + try: + curnum = int(st[len(s):]) + if 0 <= curnum <= 7: + num = n + curnum + break + except Exception: + pass + if num is not None: + return num + else: + raise ValueError('Unrecognised display name: ' + st) + + +def _displays2mask(displays): + """Return a display mask from an array of display numbers.""" + mask = 0 + for d in displays: + mask += (1 << _displaystr2num(d)) + return mask + + +def init(disp, info): + disp.extension_add_method('display', 'nvcontrol_query_target_count', query_target_count) + disp.extension_add_method('display', 'nvcontrol_query_int_attribute', query_int_attribute) + disp.extension_add_method('display', 'nvcontrol_query_string_attribute', query_string_attribute) + disp.extension_add_method('display', 'nvcontrol_query_valid_attr_values', query_valid_attr_values) + disp.extension_add_method('display', 'nvcontrol_query_binary_data', query_binary_data) + disp.extension_add_method('display', 'nvcontrol_get_gpu_count', get_gpu_count) + disp.extension_add_method('display', 'nvcontrol_get_vram', get_vram) + disp.extension_add_method('display', 'nvcontrol_get_irq', get_irq) + disp.extension_add_method('display', 'nvcontrol_supports_framelock', supports_framelock) + disp.extension_add_method('display', 'nvcontrol_get_core_temp', get_core_temp) + disp.extension_add_method('display', 'nvcontrol_get_core_threshold', get_core_threshold) + disp.extension_add_method('display', 'nvcontrol_get_default_core_threshold', get_default_core_threshold) + disp.extension_add_method('display', 'nvcontrol_get_max_core_threshold', get_max_core_threshold) + disp.extension_add_method('display', 'nvcontrol_get_ambient_temp', get_ambient_temp) + disp.extension_add_method('display', 'nvcontrol_get_cuda_cores', get_cuda_cores) + disp.extension_add_method('display', 'nvcontrol_get_memory_bus_width', get_memory_bus_width) + disp.extension_add_method('display', 'nvcontrol_get_total_dedicated_gpu_memory', get_total_dedicated_gpu_memory) + disp.extension_add_method('display', 'nvcontrol_get_used_dedicated_gpu_memory', get_used_dedicated_gpu_memory) + disp.extension_add_method('display', 'nvcontrol_get_curr_pcie_link_width', get_curr_pcie_link_width) + disp.extension_add_method('display', 'nvcontrol_get_max_pcie_link_width', get_max_pcie_link_width) + disp.extension_add_method('display', 'nvcontrol_get_curr_pcie_link_generation', get_curr_pcie_link_generation) + disp.extension_add_method('display', 'nvcontrol_get_encoder_utilization', get_encoder_utilization) + disp.extension_add_method('display', 'nvcontrol_get_decoder_utilization', get_decoder_utilization) + disp.extension_add_method('display', 'nvcontrol_get_current_performance_level', get_current_performance_level) + disp.extension_add_method('display', 'nvcontrol_get_gpu_nvclock_offset', get_gpu_nvclock_offset) + disp.extension_add_method('display', 'nvcontrol_set_gpu_nvclock_offset', set_gpu_nvclock_offset) + disp.extension_add_method('display', 'nvcontrol_set_gpu_nvclock_offset_all_levels', set_gpu_nvclock_offset_all_levels) + disp.extension_add_method('display', 'nvcontrol_get_mem_transfer_rate_offset', get_mem_transfer_rate_offset) + disp.extension_add_method('display', 'nvcontrol_set_mem_transfer_rate_offset', set_mem_transfer_rate_offset) + disp.extension_add_method('display', 'nvcontrol_set_mem_transfer_rate_offset_all_levels', set_mem_transfer_rate_offset_all_levels) + disp.extension_add_method('display', 'nvcontrol_get_cooler_manual_control_enabled', + get_cooler_manual_control_enabled) + disp.extension_add_method('display', 'nvcontrol_get_fan_duty', get_fan_duty) + disp.extension_add_method('display', 'nvcontrol_set_fan_duty', set_fan_duty) + disp.extension_add_method('display', 'nvcontrol_get_fan_rpm', get_fan_rpm) + disp.extension_add_method('display', 'nvcontrol_get_coolers_used_by_gpu', get_coolers_used_by_gpu) + disp.extension_add_method('display', 'nvcontrol_get_max_displays', get_max_displays) + disp.extension_add_method('display', 'nvcontrol_get_name', get_name) + disp.extension_add_method('display', 'nvcontrol_get_driver_version', get_driver_version) + disp.extension_add_method('display', 'nvcontrol_get_vbios_version', get_vbios_version) + disp.extension_add_method('display', 'nvcontrol_get_gpu_uuid', get_gpu_uuid) + disp.extension_add_method('display', 'nvcontrol_get_utilization_rates', get_utilization_rates) + disp.extension_add_method('display', 'nvcontrol_get_performance_modes', get_performance_modes) + disp.extension_add_method('display', 'nvcontrol_get_clock_info', get_clock_info) + disp.extension_add_method('display', 'nvcontrol_set_cooler_manual_control_enabled', + set_cooler_manual_control_enabled) + disp.extension_add_method('display', 'nvcontrol_get_gpu_nvclock_offset_range', + get_gpu_nvclock_offset_range) + disp.extension_add_method('display', 'nvcontrol_get_mem_transfer_rate_offset_range', + get_mem_transfer_rate_offset_range) + + +############################################################################ +# +# Attributes +# +# Some attributes may only be read; some may require a display_mask +# argument and others may be valid only for specific target types. +# This information is encoded in the "permission" comment after each +# attribute #define, and can be queried at run time with +# XNVCTRLQueryValidAttributeValues() and/or +# XNVCTRLQueryValidTargetAttributeValues() +# +# Key to Integer Attribute "Permissions": +# +# R: The attribute is readable (in general, all attributes will be +# readable) +# +# W: The attribute is writable (attributes may not be writable for +# various reasons: they represent static system information, they +# can only be changed by changing an XF86Config option, etc). +# +# D: The attribute requires the display mask argument. The +# attributes NV_CTRL_CONNECTED_DISPLAYS and NV_CTRL_ENABLED_DISPLAYS +# will be a bitmask of what display devices are connected and what +# display devices are enabled for use in X, respectively. Each bit +# in the bitmask represents a display device; it is these bits which +# should be used as the display_mask when dealing with attributes +# designated with "D" below. For attributes that do not require the +# display mask, the argument is ignored. +# +# Alternatively, NV-CONTROL versions 1.27 and greater allow these +# attributes to be accessed via display target types, in which case +# the display_mask is ignored. +# +# G: The attribute may be queried using an NV_CTRL_TARGET_TYPE_GPU +# target type via XNVCTRLQueryTargetAttribute(). +# +# F: The attribute may be queried using an NV_CTRL_TARGET_TYPE_FRAMELOCK +# target type via XNVCTRLQueryTargetAttribute(). +# +# X: When Xinerama is enabled, this attribute is kept consistent across +# all Physical X Screens; assignment of this attribute will be +# broadcast by the NVIDIA X Driver to all X Screens. +# +# V: The attribute may be queried using an NV_CTRL_TARGET_TYPE_VCSC +# target type via XNVCTRLQueryTargetAttribute(). +# +# I: The attribute may be queried using an NV_CTRL_TARGET_TYPE_GVI target type +# via XNVCTRLQueryTargetAttribute(). +# +# Q: The attribute is a 64-bit integer attribute; use the 64-bit versions +# of the appropriate query interfaces. +# +# C: The attribute may be queried using an NV_CTRL_TARGET_TYPE_COOLER target +# type via XNVCTRLQueryTargetAttribute(). +# +# S: The attribute may be queried using an NV_CTRL_TARGET_TYPE_THERMAL_SENSOR +# target type via XNVCTRLQueryTargetAttribute(). +# +# T: The attribute may be queried using an +# NV_CTRL_TARGET_TYPE_3D_VISION_PRO_TRANSCEIVER target type +# via XNVCTRLQueryTargetAttribute(). +# +# NOTE: Unless mentioned otherwise, all attributes may be queried using +# an NV_CTRL_TARGET_TYPE_X_SCREEN target type via +# XNVCTRLQueryTargetAttribute(). +# + + +############################################################################ + +# +# Integer attributes: +# +# Integer attributes can be queried through the XNVCTRLQueryAttribute() and +# XNVCTRLQueryTargetAttribute() function calls. +# +# Integer attributes can be set through the XNVCTRLSetAttribute() and +# XNVCTRLSetTargetAttribute() function calls. +# +# Unless otherwise noted, all integer attributes can be queried/set +# using an NV_CTRL_TARGET_TYPE_X_SCREEN target. Attributes that cannot +# take an NV_CTRL_TARGET_TYPE_X_SCREEN also cannot be queried/set through +# XNVCTRLQueryAttribute()/XNVCTRLSetAttribute() (Since these assume +# an X Screen target). +# + + +# +# NV_CTRL_FLATPANEL_SCALING - not supported +# + +NV_CTRL_FLATPANEL_SCALING = 2 # not supported +NV_CTRL_FLATPANEL_SCALING_DEFAULT = 0 # not supported +NV_CTRL_FLATPANEL_SCALING_NATIVE = 1 # not supported +NV_CTRL_FLATPANEL_SCALING_SCALED = 2 # not supported +NV_CTRL_FLATPANEL_SCALING_CENTERED = 3 # not supported +NV_CTRL_FLATPANEL_SCALING_ASPECT_SCALED = 4 # not supported + +# +# NV_CTRL_FLATPANEL_DITHERING - not supported +# +# NV_CTRL_DITHERING should be used instead. +# + +NV_CTRL_FLATPANEL_DITHERING = 3 # not supported +NV_CTRL_FLATPANEL_DITHERING_DEFAULT = 0 # not supported +NV_CTRL_FLATPANEL_DITHERING_ENABLED = 1 # not supported +NV_CTRL_FLATPANEL_DITHERING_DISABLED = 2 # not supported + +# +# NV_CTRL_DITHERING - the requested dithering configuration; +# possible values are: +# +# 0: auto (the driver will decide when to dither) +# 1: enabled (the driver will always dither when possible) +# 2: disabled (the driver will never dither) +# + +NV_CTRL_DITHERING = 3 # RWDG +NV_CTRL_DITHERING_AUTO = 0 +NV_CTRL_DITHERING_ENABLED = 1 +NV_CTRL_DITHERING_DISABLED = 2 + +# +# NV_CTRL_DIGITAL_VIBRANCE - sets the digital vibrance level for the +# specified display device. +# + +NV_CTRL_DIGITAL_VIBRANCE = 4 # RWDG + +# +# NV_CTRL_BUS_TYPE - returns the bus type through which the specified device +# is connected to the computer. +# When this attribute is queried on an X screen target, the bus type of the +# GPU driving the X screen is returned. +# + +NV_CTRL_BUS_TYPE = 5 # R--GI +NV_CTRL_BUS_TYPE_AGP = 0 +NV_CTRL_BUS_TYPE_PCI = 1 +NV_CTRL_BUS_TYPE_PCI_EXPRESS = 2 +NV_CTRL_BUS_TYPE_INTEGRATED = 3 + +# +# NV_CTRL_TOTAL_GPU_MEMORY - returns the total amount of memory available +# to the specified GPU (or the GPU driving the specified X +# screen). Note: if the GPU supports TurboCache(TM), the value +# reported may exceed the amount of video memory installed on the +# GPU. The value reported for integrated GPUs may likewise exceed +# the amount of dedicated system memory set aside by the system +# BIOS for use by the integrated GPU. +# + +NV_CTRL_TOTAL_GPU_MEMORY = 6 # R--G +NV_CTRL_VIDEO_RAM = NV_CTRL_TOTAL_GPU_MEMORY + +# +# NV_CTRL_IRQ - returns the interrupt request line used by the specified +# device. +# When this attribute is queried on an X screen target, the IRQ of the GPU +# driving the X screen is returned. +# + +NV_CTRL_IRQ = 7 # R--GI + +# +# NV_CTRL_OPERATING_SYSTEM - returns the operating system on which +# the X server is running. +# + +NV_CTRL_OPERATING_SYSTEM = 8 # R--G +NV_CTRL_OPERATING_SYSTEM_LINUX = 0 +NV_CTRL_OPERATING_SYSTEM_FREEBSD = 1 +NV_CTRL_OPERATING_SYSTEM_SUNOS = 2 + +# +# NV_CTRL_SYNC_TO_VBLANK - enables sync to vblank for OpenGL clients. +# This setting is only applied to OpenGL clients that are started +# after this setting is applied. +# + +NV_CTRL_SYNC_TO_VBLANK = 9 # RW-X +NV_CTRL_SYNC_TO_VBLANK_OFF = 0 +NV_CTRL_SYNC_TO_VBLANK_ON = 1 + +# +# NV_CTRL_LOG_ANISO - enables anisotropic filtering for OpenGL +# clients; on some NVIDIA hardware, this can only be enabled or +# disabled; on other hardware different levels of anisotropic +# filtering can be specified. This setting is only applied to OpenGL +# clients that are started after this setting is applied. +# + +NV_CTRL_LOG_ANISO = 10 # RW-X + +# +# NV_CTRL_FSAA_MODE - the FSAA setting for OpenGL clients; possible +# FSAA modes: +# +# NV_CTRL_FSAA_MODE_2x "2x Bilinear Multisampling" +# NV_CTRL_FSAA_MODE_2x_5t "2x Quincunx Multisampling" +# NV_CTRL_FSAA_MODE_15x15 "1.5 x 1.5 Supersampling" +# NV_CTRL_FSAA_MODE_2x2 "2 x 2 Supersampling" +# NV_CTRL_FSAA_MODE_4x "4x Bilinear Multisampling" +# NV_CTRL_FSAA_MODE_4x_9t "4x Gaussian Multisampling" +# NV_CTRL_FSAA_MODE_8x "2x Bilinear Multisampling by 4x Supersampling" +# NV_CTRL_FSAA_MODE_16x "4x Bilinear Multisampling by 4x Supersampling" +# NV_CTRL_FSAA_MODE_8xS "4x Multisampling by 2x Supersampling" +# +# This setting is only applied to OpenGL clients that are started +# after this setting is applied. +# + +NV_CTRL_FSAA_MODE = 11 # RW-X +NV_CTRL_FSAA_MODE_NONE = 0 +NV_CTRL_FSAA_MODE_2x = 1 +NV_CTRL_FSAA_MODE_2x_5t = 2 +NV_CTRL_FSAA_MODE_15x15 = 3 +NV_CTRL_FSAA_MODE_2x2 = 4 +NV_CTRL_FSAA_MODE_4x = 5 +NV_CTRL_FSAA_MODE_4x_9t = 6 +NV_CTRL_FSAA_MODE_8x = 7 +NV_CTRL_FSAA_MODE_16x = 8 +NV_CTRL_FSAA_MODE_8xS = 9 +NV_CTRL_FSAA_MODE_8xQ = 10 +NV_CTRL_FSAA_MODE_16xS = 11 +NV_CTRL_FSAA_MODE_16xQ = 12 +NV_CTRL_FSAA_MODE_32xS = 13 +NV_CTRL_FSAA_MODE_32x = 14 +NV_CTRL_FSAA_MODE_64xS = 15 +NV_CTRL_FSAA_MODE_MAX = NV_CTRL_FSAA_MODE_64xS + +# +# NV_CTRL_UBB - returns whether UBB is enabled for the specified X +# screen. +# + +NV_CTRL_UBB = 13 # R-- +NV_CTRL_UBB_OFF = 0 +NV_CTRL_UBB_ON = 1 + +# +# NV_CTRL_OVERLAY - returns whether the RGB overlay is enabled for +# the specified X screen. +# + +NV_CTRL_OVERLAY = 14 # R-- +NV_CTRL_OVERLAY_OFF = 0 +NV_CTRL_OVERLAY_ON = 1 + +# +# NV_CTRL_STEREO - returns whether stereo (and what type) is enabled +# for the specified X screen. +# + +NV_CTRL_STEREO = 16 # R-- +NV_CTRL_STEREO_OFF = 0 +NV_CTRL_STEREO_DDC = 1 +NV_CTRL_STEREO_BLUELINE = 2 +NV_CTRL_STEREO_DIN = 3 +NV_CTRL_STEREO_PASSIVE_EYE_PER_DPY = 4 +NV_CTRL_STEREO_VERTICAL_INTERLACED = 5 +NV_CTRL_STEREO_COLOR_INTERLACED = 6 +NV_CTRL_STEREO_HORIZONTAL_INTERLACED = 7 +NV_CTRL_STEREO_CHECKERBOARD_PATTERN = 8 +NV_CTRL_STEREO_INVERSE_CHECKERBOARD_PATTERN = 9 +NV_CTRL_STEREO_3D_VISION = 10 +NV_CTRL_STEREO_3D_VISION_PRO = 11 +NV_CTRL_STEREO_HDMI_3D = 12 +NV_CTRL_STEREO_TRIDELITY_SL = 13 +NV_CTRL_STEREO_INBAND_STEREO_SIGNALING = 14 +NV_CTRL_STEREO_MAX = NV_CTRL_STEREO_INBAND_STEREO_SIGNALING + +# +# NV_CTRL_EMULATE - not supported +# + +NV_CTRL_EMULATE = 17 # not supported +NV_CTRL_EMULATE_NONE = 0 # not supported + +# +# NV_CTRL_TWINVIEW - returns whether TwinView is enabled for the +# specified X screen. +# + +NV_CTRL_TWINVIEW = 18 # R-- +NV_CTRL_TWINVIEW_NOT_ENABLED = 0 +NV_CTRL_TWINVIEW_ENABLED = 1 + +# +# NV_CTRL_CONNECTED_DISPLAYS - deprecated +# +# NV_CTRL_BINARY_DATA_DISPLAYS_CONNECTED_TO_GPU and +# NV_CTRL_BINARY_DATA_DISPLAYS_ASSIGNED_TO_XSCREEN should be used instead. +# + +NV_CTRL_CONNECTED_DISPLAYS = 19 # deprecated + +# +# NV_CTRL_ENABLED_DISPLAYS - Event that notifies when one or more display +# devices are enabled or disabled on a GPU and/or X screen. +# +# This attribute may be queried through XNVCTRLQueryTargetAttribute() +# using a NV_CTRL_TARGET_TYPE_GPU or NV_CTRL_TARGET_TYPE_X_SCREEN target. +# +# Note: Querying this value has been deprecated. +# NV_CTRL_BINARY_DATA_DISPLAYS_CONNECTED_TO_GPU, +# NV_CTRL_DISPLAY_ENABLED, and +# NV_CTRL_BINARY_DATA_DISPLAYS_ENABLED_ON_XSCREEN should be used +# instead to obtain the list of enabled displays. +# + +NV_CTRL_ENABLED_DISPLAYS = 20 # ---G + +############################################################################ +# +# Integer attributes specific to configuring Frame Lock on boards that +# support it. +# + + +# +# NV_CTRL_FRAMELOCK - returns whether the underlying GPU supports +# Frame Lock. All of the other frame lock attributes are only +# applicable if NV_CTRL_FRAMELOCK is _SUPPORTED. +# +# This attribute may be queried through XNVCTRLQueryTargetAttribute() +# using a NV_CTRL_TARGET_TYPE_GPU or NV_CTRL_TARGET_TYPE_X_SCREEN target. +# + +NV_CTRL_FRAMELOCK = 21 # R--G +NV_CTRL_FRAMELOCK_NOT_SUPPORTED = 0 +NV_CTRL_FRAMELOCK_SUPPORTED = 1 + +# +# NV_CTRL_FRAMELOCK_MASTER - deprecated +# +# NV_CTRL_FRAMELOCK_DISPLAY_CONFIG should be used instead. +# + +NV_CTRL_FRAMELOCK_MASTER = 22 # deprecated +NV_CTRL_FRAMELOCK_MASTER_FALSE = 0 # deprecated +NV_CTRL_FRAMELOCK_MASTER_TRUE = 1 # deprecated + +# +# NV_CTRL_FRAMELOCK_POLARITY - sync either to the rising edge of the +# frame lock pulse, the falling edge of the frame lock pulse or both. +# +# On Quadro Sync II, this attribute is ignored when +# NV_CTRL_USE_HOUSE_SYNC is OUTPUT. +# +# This attribute may be queried through XNVCTRLQueryTargetAttribute() +# using a NV_CTRL_TARGET_TYPE_FRAMELOCK or NV_CTRL_TARGET_TYPE_X_SCREEN +# target. +# + +NV_CTRL_FRAMELOCK_POLARITY = 23 # RW-F +NV_CTRL_FRAMELOCK_POLARITY_RISING_EDGE = 0x1 +NV_CTRL_FRAMELOCK_POLARITY_FALLING_EDGE = 0x2 +NV_CTRL_FRAMELOCK_POLARITY_BOTH_EDGES = 0x3 + +# +# NV_CTRL_FRAMELOCK_SYNC_DELAY - delay between the frame lock pulse +# and the GPU sync. This value must be multiplied by +# NV_CTRL_FRAMELOCK_SYNC_DELAY_RESOLUTION to determine the sync delay in +# nanoseconds. +# +# This attribute may be queried through XNVCTRLQueryTargetAttribute() +# using a NV_CTRL_TARGET_TYPE_FRAMELOCK or NV_CTRL_TARGET_TYPE_X_SCREEN +# target. +# +# USAGE NOTE: NV_CTRL_FRAMELOCK_SYNC_DELAY_MAX and +# NV_CTRL_FRAMELOCK_SYNC_DELAY_FACTOR are deprecated. +# The Sync Delay _MAX and _FACTOR are different for different +# Quadro Sync products and so, to be correct, the valid values for +# NV_CTRL_FRAMELOCK_SYNC_DELAY must be queried to get the range +# of acceptable sync delay values, and +# NV_CTRL_FRAMELOCK_SYNC_DELAY_RESOLUTION must be queried to +# obtain the correct factor. +# + +NV_CTRL_FRAMELOCK_SYNC_DELAY = 24 # RW-F +NV_CTRL_FRAMELOCK_SYNC_DELAY_MAX = 2047 # deprecated +NV_CTRL_FRAMELOCK_SYNC_DELAY_FACTOR = 7.81 # deprecated + +# +# NV_CTRL_FRAMELOCK_SYNC_INTERVAL - how many house sync pulses +# between the frame lock sync generation (0 == sync every house sync); +# this only applies to the master when receiving house sync. +# +# This attribute may be queried through XNVCTRLQueryTargetAttribute() +# using a NV_CTRL_TARGET_TYPE_FRAMELOCK or NV_CTRL_TARGET_TYPE_X_SCREEN +# target. +# + +NV_CTRL_FRAMELOCK_SYNC_INTERVAL = 25 # RW-F + +# +# NV_CTRL_FRAMELOCK_PORT0_STATUS - status of the rj45 port0. +# +# This attribute may be queried through XNVCTRLQueryTargetAttribute() +# using a NV_CTRL_TARGET_TYPE_FRAMELOCK or NV_CTRL_TARGET_TYPE_X_SCREEN +# target. +# + +NV_CTRL_FRAMELOCK_PORT0_STATUS = 26 # R--F +NV_CTRL_FRAMELOCK_PORT0_STATUS_INPUT = 0 +NV_CTRL_FRAMELOCK_PORT0_STATUS_OUTPUT = 1 + +# +# NV_CTRL_FRAMELOCK_PORT1_STATUS - status of the rj45 port1. +# +# This attribute may be queried through XNVCTRLQueryTargetAttribute() +# using a NV_CTRL_TARGET_TYPE_FRAMELOCK or NV_CTRL_TARGET_TYPE_X_SCREEN +# target. +# + +NV_CTRL_FRAMELOCK_PORT1_STATUS = 27 # R--F +NV_CTRL_FRAMELOCK_PORT1_STATUS_INPUT = 0 +NV_CTRL_FRAMELOCK_PORT1_STATUS_OUTPUT = 1 + +# +# NV_CTRL_FRAMELOCK_HOUSE_STATUS - returns whether or not the house +# sync input signal was detected on the BNC connector of the frame lock +# board. +# +# This attribute may be queried through XNVCTRLQueryTargetAttribute() +# using a NV_CTRL_TARGET_TYPE_FRAMELOCK or NV_CTRL_TARGET_TYPE_X_SCREEN +# target. +# + +NV_CTRL_FRAMELOCK_HOUSE_STATUS = 28 # R--F +NV_CTRL_FRAMELOCK_HOUSE_STATUS_NOT_DETECTED = 0 +NV_CTRL_FRAMELOCK_HOUSE_STATUS_DETECTED = 1 + +# +# NV_CTRL_FRAMELOCK_SYNC - enable/disable the syncing of display +# devices to the frame lock pulse as specified by previous calls to +# NV_CTRL_FRAMELOCK_DISPLAY_CONFIG. +# +# This attribute can only be queried through XNVCTRLQueryTargetAttribute() +# using a NV_CTRL_TARGET_TYPE_GPU target. This attribute cannot be +# queried using a NV_CTRL_TARGET_TYPE_X_SCREEN. +# + +NV_CTRL_FRAMELOCK_SYNC = 29 # RW-G +NV_CTRL_FRAMELOCK_SYNC_DISABLE = 0 +NV_CTRL_FRAMELOCK_SYNC_ENABLE = 1 + +# +# NV_CTRL_FRAMELOCK_SYNC_READY - reports whether a frame lock +# board is receiving sync (regardless of whether or not any display +# devices are using the sync). +# +# This attribute may be queried through XNVCTRLQueryTargetAttribute() +# using a NV_CTRL_TARGET_TYPE_FRAMELOCK or NV_CTRL_TARGET_TYPE_X_SCREEN +# target. +# + +NV_CTRL_FRAMELOCK_SYNC_READY = 30 # R--F +NV_CTRL_FRAMELOCK_SYNC_READY_FALSE = 0 +NV_CTRL_FRAMELOCK_SYNC_READY_TRUE = 1 + +# +# NV_CTRL_FRAMELOCK_STEREO_SYNC - this indicates that the GPU stereo +# signal is in sync with the frame lock stereo signal. +# +# This attribute may be queried through XNVCTRLQueryTargetAttribute() +# using a NV_CTRL_TARGET_TYPE_GPU or NV_CTRL_TARGET_TYPE_X_SCREEN +# target. +# + +NV_CTRL_FRAMELOCK_STEREO_SYNC = 31 # R--G +NV_CTRL_FRAMELOCK_STEREO_SYNC_FALSE = 0 +NV_CTRL_FRAMELOCK_STEREO_SYNC_TRUE = 1 + +# +# NV_CTRL_FRAMELOCK_TEST_SIGNAL - to test the connections in the sync +# group, tell the master to enable a test signal, then query port[01] +# status and sync_ready on all slaves. When done, tell the master to +# disable the test signal. Test signal should only be manipulated +# while NV_CTRL_FRAMELOCK_SYNC is enabled. +# +# The TEST_SIGNAL is also used to reset the Universal Frame Count (as +# returned by the glXQueryFrameCountNV() function in the +# GLX_NV_swap_group extension). Note: for best accuracy of the +# Universal Frame Count, it is recommended to toggle the TEST_SIGNAL +# on and off after enabling frame lock. +# +# This attribute may be queried through XNVCTRLQueryTargetAttribute() +# using a NV_CTRL_TARGET_TYPE_GPU or NV_CTRL_TARGET_TYPE_X_SCREEN target. +# + +NV_CTRL_FRAMELOCK_TEST_SIGNAL = 32 # RW-G +NV_CTRL_FRAMELOCK_TEST_SIGNAL_DISABLE = 0 +NV_CTRL_FRAMELOCK_TEST_SIGNAL_ENABLE = 1 + +# +# NV_CTRL_FRAMELOCK_ETHERNET_DETECTED - The frame lock boards are +# cabled together using regular cat5 cable, connecting to rj45 ports +# on the backplane of the card. There is some concern that users may +# think these are ethernet ports and connect them to a +# router/hub/etc. The hardware can detect this and will shut off to +# prevent damage (either to itself or to the router). +# NV_CTRL_FRAMELOCK_ETHERNET_DETECTED may be called to find out if +# ethernet is connected to one of the rj45 ports. An appropriate +# error message should then be displayed. The _PORT0 and _PORT1 +# values may be or'ed together. +# +# This attribute may be queried through XNVCTRLQueryTargetAttribute() +# using a NV_CTRL_TARGET_TYPE_FRAMELOCK or NV_CTRL_TARGET_TYPE_X_SCREEN +# target. +# + +NV_CTRL_FRAMELOCK_ETHERNET_DETECTED = 33 # R--F +NV_CTRL_FRAMELOCK_ETHERNET_DETECTED_NONE = 0 +NV_CTRL_FRAMELOCK_ETHERNET_DETECTED_PORT0 = 0x1 +NV_CTRL_FRAMELOCK_ETHERNET_DETECTED_PORT1 = 0x2 + +# +# NV_CTRL_FRAMELOCK_VIDEO_MODE - get/set what video mode is used +# to interperate the house sync signal. This should only be set +# on the master. +# +# This attribute may be queried through XNVCTRLQueryTargetAttribute() +# using a NV_CTRL_TARGET_TYPE_FRAMELOCK or NV_CTRL_TARGET_TYPE_X_SCREEN +# target. +# + +NV_CTRL_FRAMELOCK_VIDEO_MODE = 34 # RW-F +NV_CTRL_FRAMELOCK_VIDEO_MODE_NONE = 0 +NV_CTRL_FRAMELOCK_VIDEO_MODE_TTL = 1 +NV_CTRL_FRAMELOCK_VIDEO_MODE_NTSCPALSECAM = 2 +NV_CTRL_FRAMELOCK_VIDEO_MODE_HDTV = 3 + +# +# During FRAMELOCK bring-up, the above values were redefined to +# these: +# + +NV_CTRL_FRAMELOCK_VIDEO_MODE_COMPOSITE_AUTO = 0 +NV_CTRL_FRAMELOCK_VIDEO_MODE_COMPOSITE_BI_LEVEL = 2 +NV_CTRL_FRAMELOCK_VIDEO_MODE_COMPOSITE_TRI_LEVEL = 3 + +# +# NV_CTRL_FRAMELOCK_SYNC_RATE - this is the refresh rate that the +# frame lock board is sending to the GPU, in milliHz. +# +# This attribute may be queried through XNVCTRLQueryTargetAttribute() +# using a NV_CTRL_TARGET_TYPE_FRAMELOCK or NV_CTRL_TARGET_TYPE_X_SCREEN +# target. +# + +NV_CTRL_FRAMELOCK_SYNC_RATE = 35 # R--F + +############################################################################ + +# +# NV_CTRL_FORCE_GENERIC_CPU - not supported +# + +NV_CTRL_FORCE_GENERIC_CPU = 37 # not supported +NV_CTRL_FORCE_GENERIC_CPU_DISABLE = 0 # not supported +NV_CTRL_FORCE_GENERIC_CPU_ENABLE = 1 # not supported + +# +# NV_CTRL_OPENGL_AA_LINE_GAMMA - for OpenGL clients, allow +# Gamma-corrected antialiased lines to consider variances in the +# color display capabilities of output devices when rendering smooth +# lines. Only available on recent Quadro GPUs. This setting is only +# applied to OpenGL clients that are started after this setting is +# applied. +# + +NV_CTRL_OPENGL_AA_LINE_GAMMA = 38 # RW-X +NV_CTRL_OPENGL_AA_LINE_GAMMA_DISABLE = 0 +NV_CTRL_OPENGL_AA_LINE_GAMMA_ENABLE = 1 + +# +# NV_CTRL_FRAMELOCK_TIMING - this is TRUE when the gpu is both receiving +# and locked to an input timing signal. Timing information may come from +# the following places: Another frame lock device that is set to master, +# the house sync signal, or the GPU's internal timing from a display +# device. +# +# This attribute may be queried through XNVCTRLQueryTargetAttribute() +# using a NV_CTRL_TARGET_TYPE_GPU or NV_CTRL_TARGET_TYPE_X_SCREEN target. +# + +NV_CTRL_FRAMELOCK_TIMING = 39 # R--G +NV_CTRL_FRAMELOCK_TIMING_FALSE = 0 +NV_CTRL_FRAMELOCK_TIMING_TRUE = 1 + +# +# NV_CTRL_FLIPPING_ALLOWED - when TRUE, OpenGL will swap by flipping +# when possible; when FALSE, OpenGL will always swap by blitting. +# + +NV_CTRL_FLIPPING_ALLOWED = 40 # RW-X +NV_CTRL_FLIPPING_ALLOWED_FALSE = 0 +NV_CTRL_FLIPPING_ALLOWED_TRUE = 1 + +# +# NV_CTRL_ARCHITECTURE - returns the architecture on which the X server is +# running. +# + +NV_CTRL_ARCHITECTURE = 41 # R-- +NV_CTRL_ARCHITECTURE_X86 = 0 +NV_CTRL_ARCHITECTURE_X86_64 = 1 +NV_CTRL_ARCHITECTURE_IA64 = 2 +NV_CTRL_ARCHITECTURE_ARM = 3 +NV_CTRL_ARCHITECTURE_AARCH64 = 4 +NV_CTRL_ARCHITECTURE_PPC64LE = 5 + +# +# NV_CTRL_TEXTURE_CLAMPING - texture clamping mode in OpenGL. By +# default, _SPEC is used, which forces OpenGL texture clamping to +# conform with the OpenGL specification. _EDGE forces NVIDIA's +# OpenGL implementation to remap GL_CLAMP to GL_CLAMP_TO_EDGE, +# which is not strictly conformant, but some applications rely on +# the non-conformant behavior. +# + +NV_CTRL_TEXTURE_CLAMPING = 42 # RW-X +NV_CTRL_TEXTURE_CLAMPING_EDGE = 0 +NV_CTRL_TEXTURE_CLAMPING_SPEC = 1 + +# +# The NV_CTRL_CURSOR_SHADOW - not supported +# +# use an ARGB cursor instead. +# + +NV_CTRL_CURSOR_SHADOW = 43 # not supported +NV_CTRL_CURSOR_SHADOW_DISABLE = 0 # not supported +NV_CTRL_CURSOR_SHADOW_ENABLE = 1 # not supported + +NV_CTRL_CURSOR_SHADOW_ALPHA = 44 # not supported +NV_CTRL_CURSOR_SHADOW_RED = 45 # not supported +NV_CTRL_CURSOR_SHADOW_GREEN = 46 # not supported +NV_CTRL_CURSOR_SHADOW_BLUE = 47 # not supported + +NV_CTRL_CURSOR_SHADOW_X_OFFSET = 48 # not supported +NV_CTRL_CURSOR_SHADOW_Y_OFFSET = 49 # not supported + +# +# When Application Control for FSAA is enabled, then what the +# application requests is used, and NV_CTRL_FSAA_MODE is ignored. If +# this is disabled, then any application setting is overridden with +# NV_CTRL_FSAA_MODE +# + +NV_CTRL_FSAA_APPLICATION_CONTROLLED = 50 # RW-X +NV_CTRL_FSAA_APPLICATION_CONTROLLED_ENABLED = 1 +NV_CTRL_FSAA_APPLICATION_CONTROLLED_DISABLED = 0 + +# +# When Application Control for LogAniso is enabled, then what the +# application requests is used, and NV_CTRL_LOG_ANISO is ignored. If +# this is disabled, then any application setting is overridden with +# NV_CTRL_LOG_ANISO +# + +NV_CTRL_LOG_ANISO_APPLICATION_CONTROLLED = 51 # RW-X +NV_CTRL_LOG_ANISO_APPLICATION_CONTROLLED_ENABLED = 1 +NV_CTRL_LOG_ANISO_APPLICATION_CONTROLLED_DISABLED = 0 + +# +# IMAGE_SHARPENING adjusts the sharpness of the display's image +# quality by amplifying high frequency content. Valid values will +# normally be in the range [0,32). Only available on GeForceFX or +# newer. +# + +NV_CTRL_IMAGE_SHARPENING = 52 # RWDG + +# +# NV_CTRL_TV_OVERSCAN - not supported +# + +NV_CTRL_TV_OVERSCAN = 53 # not supported + +# +# NV_CTRL_TV_FLICKER_FILTER - not supported +# + +NV_CTRL_TV_FLICKER_FILTER = 54 # not supported + +# +# NV_CTRL_TV_BRIGHTNESS - not supported +# + +NV_CTRL_TV_BRIGHTNESS = 55 # not supported + +# +# NV_CTRL_TV_HUE - not supported +# + +NV_CTRL_TV_HUE = 56 # not supported + +# +# NV_CTRL_TV_CONTRAST - not suppoerted +# + +NV_CTRL_TV_CONTRAST = 57 # not supported + +# +# NV_CTRL_TV_SATURATION - not supported +# + +NV_CTRL_TV_SATURATION = 58 # not supported + +# +# NV_CTRL_TV_RESET_SETTINGS - not supported +# + +NV_CTRL_TV_RESET_SETTINGS = 59 # not supported + +# +# NV_CTRL_GPU_CORE_TEMPERATURE reports the current core temperature +# of the GPU driving the X screen. +# + +NV_CTRL_GPU_CORE_TEMPERATURE = 60 # R--G + +# +# NV_CTRL_GPU_CORE_THRESHOLD reports the current GPU core slowdown +# threshold temperature, NV_CTRL_GPU_DEFAULT_CORE_THRESHOLD and +# NV_CTRL_GPU_MAX_CORE_THRESHOLD report the default and MAX core +# slowdown threshold temperatures. +# +# NV_CTRL_GPU_CORE_THRESHOLD reflects the temperature at which the +# GPU is throttled to prevent overheating. +# + +NV_CTRL_GPU_CORE_THRESHOLD = 61 # R--G +NV_CTRL_GPU_DEFAULT_CORE_THRESHOLD = 62 # R--G +NV_CTRL_GPU_MAX_CORE_THRESHOLD = 63 # R--G + +# +# NV_CTRL_AMBIENT_TEMPERATURE reports the current temperature in the +# immediate neighbourhood of the GPU driving the X screen. +# + +NV_CTRL_AMBIENT_TEMPERATURE = 64 # R--G + +# +# NV_CTRL_PBUFFER_SCANOUT_SUPPORTED - returns whether this X screen +# supports scanout of FP pbuffers; +# +# if this screen does not support PBUFFER_SCANOUT, then all other +# PBUFFER_SCANOUT attributes are unavailable. +# +# PBUFFER_SCANOUT is supported if and only if: +# - Twinview is configured with clone mode. The secondary screen is used to +# scanout the pbuffer. +# - The desktop is running in with 16 bits per pixel. +# +NV_CTRL_PBUFFER_SCANOUT_SUPPORTED = 65 # not supported +NV_CTRL_PBUFFER_SCANOUT_FALSE = 0 +NV_CTRL_PBUFFER_SCANOUT_TRUE = 1 + +# +# NV_CTRL_PBUFFER_SCANOUT_XID indicates the XID of the pbuffer used for +# scanout. +# +NV_CTRL_PBUFFER_SCANOUT_XID = 66 # not supported + +############################################################################ +# +# The NV_CTRL_GVO_* integer attributes are used to configure GVO +# (Graphics to Video Out). This functionality is available, for +# example, on the Quadro SDI Output card. +# +# The following is a typical usage pattern for the GVO attributes: +# +# - query NV_CTRL_GVO_SUPPORTED to determine if the X screen supports GV0. +# +# - specify NV_CTRL_GVO_SYNC_MODE (one of FREE_RUNNING, GENLOCK, or +# FRAMELOCK); if you specify GENLOCK or FRAMELOCK, you should also +# specify NV_CTRL_GVO_SYNC_SOURCE. +# +# - Use NV_CTRL_GVO_COMPOSITE_SYNC_INPUT_DETECTED and +# NV_CTRL_GVO_SDI_SYNC_INPUT_DETECTED to detect what input syncs are +# present. +# +# (If no analog sync is detected but it is known that a valid +# bi-level or tri-level sync is connected set +# NV_CTRL_GVO_COMPOSITE_SYNC_INPUT_DETECT_MODE appropriately and +# retest with NV_CTRL_GVO_COMPOSITE_SYNC_INPUT_DETECTED). +# +# - if syncing to input sync, query the +# NV_CTRL_GVIO_DETECTED_VIDEO_FORMAT attribute; note that Input video +# format can only be queried after SYNC_SOURCE is specified. +# +# - specify the NV_CTRL_GVIO_REQUESTED_VIDEO_FORMAT +# +# - specify the NV_CTRL_GVO_DATA_FORMAT +# +# - specify any custom Color Space Conversion (CSC) matrix, offset, +# and scale with XNVCTRLSetGvoColorConversion(). +# +# - if using the GLX_NV_video_out extension to display one or more +# pbuffers, call glXGetVideoDeviceNV() to lock the GVO output for use +# by the GLX client; then bind the pbuffer(s) to the GVO output with +# glXBindVideoImageNV() and send pbuffers to the GVO output with +# glXSendPbufferToVideoNV(); see the GLX_NV_video_out spec for more +# details. +# +# - if using the GLX_NV_present_video extension, call +# glXBindVideoDeviceNV() to bind the GVO video device to current +# OpenGL context. +# +# Note that setting most GVO attributes only causes the value to be +# cached in the X server. The values will be flushed to the hardware +# either when the next MetaMode is set that uses the GVO display +# device, or when a GLX pbuffer is bound to the GVO output (with +# glXBindVideoImageNV()). +# +# Note that GLX_NV_video_out/GLX_NV_present_video and X screen use +# are mutually exclusive. If a MetaMode is currently using the GVO +# device, then glXGetVideoDeviceNV and glXBindVideoImageNV() will +# fail. Similarly, if a GLX client has locked the GVO output (via +# glXGetVideoDeviceNV or glXBindVideoImageNV), then setting a +# MetaMode that uses the GVO device will fail. The +# NV_CTRL_GVO_GLX_LOCKED event will be sent when a GLX client locks +# the GVO output. +# +# + + +# +# NV_CTRL_GVO_SUPPORTED - returns whether this X screen supports GVO; +# if this screen does not support GVO output, then all other GVO +# attributes are unavailable. +# + +NV_CTRL_GVO_SUPPORTED = 67 # R-- +NV_CTRL_GVO_SUPPORTED_FALSE = 0 +NV_CTRL_GVO_SUPPORTED_TRUE = 1 + +# +# NV_CTRL_GVO_SYNC_MODE - selects the GVO sync mode; possible values +# are: +# +# FREE_RUNNING - GVO does not sync to any external signal +# +# GENLOCK - the GVO output is genlocked to an incoming sync signal; +# genlocking locks at hsync. This requires that the output video +# format exactly match the incoming sync video format. +# +# FRAMELOCK - the GVO output is frame locked to an incoming sync +# signal; frame locking locks at vsync. This requires that the output +# video format have the same refresh rate as the incoming sync video +# format. +# + +NV_CTRL_GVO_SYNC_MODE = 68 # RW- +NV_CTRL_GVO_SYNC_MODE_FREE_RUNNING = 0 +NV_CTRL_GVO_SYNC_MODE_GENLOCK = 1 +NV_CTRL_GVO_SYNC_MODE_FRAMELOCK = 2 + +# +# NV_CTRL_GVO_SYNC_SOURCE - if NV_CTRL_GVO_SYNC_MODE is set to either +# GENLOCK or FRAMELOCK, this controls which sync source is used as +# the incoming sync signal (either Composite or SDI). If +# NV_CTRL_GVO_SYNC_MODE is FREE_RUNNING, this attribute has no +# effect. +# + +NV_CTRL_GVO_SYNC_SOURCE = 69 # RW- +NV_CTRL_GVO_SYNC_SOURCE_COMPOSITE = 0 +NV_CTRL_GVO_SYNC_SOURCE_SDI = 1 + +# +# NV_CTRL_GVIO_REQUESTED_VIDEO_FORMAT - specifies the desired output video +# format for GVO devices or the desired input video format for GVI devices. +# +# Note that for GVO, the valid video formats may vary depending on +# the NV_CTRL_GVO_SYNC_MODE and the incoming sync video format. See +# the definition of NV_CTRL_GVO_SYNC_MODE. +# +# Note that when querying the ValidValues for this data type, the +# values are reported as bits within a bitmask +# (ATTRIBUTE_TYPE_INT_BITS); unfortunately, there are more valid +# value bits than will fit in a single 32-bit value. To solve this, +# query the ValidValues for NV_CTRL_GVIO_REQUESTED_VIDEO_FORMAT to +# check which of the first 31 VIDEO_FORMATS are valid, query the +# ValidValues for NV_CTRL_GVIO_REQUESTED_VIDEO_FORMAT2 to check which +# of the 32-63 VIDEO_FORMATS are valid, and query the ValidValues of +# NV_CTRL_GVIO_REQUESTED_VIDEO_FORMAT3 to check which of the 64-95 +# VIDEO_FORMATS are valid. +# +# Note: Setting this attribute on a GVI device may also result in the +# following NV-CONTROL attributes being reset on that device (to +# ensure the configuration remains valid): +# NV_CTRL_GVI_REQUESTED_STREAM_BITS_PER_COMPONENT +# NV_CTRL_GVI_REQUESTED_STREAM_COMPONENT_SAMPLING +# + +NV_CTRL_GVIO_REQUESTED_VIDEO_FORMAT = 70 # RW--I + +NV_CTRL_GVIO_VIDEO_FORMAT_NONE = 0 +NV_CTRL_GVIO_VIDEO_FORMAT_487I_59_94_SMPTE259_NTSC = 1 +NV_CTRL_GVIO_VIDEO_FORMAT_576I_50_00_SMPTE259_PAL = 2 +NV_CTRL_GVIO_VIDEO_FORMAT_720P_59_94_SMPTE296 = 3 +NV_CTRL_GVIO_VIDEO_FORMAT_720P_60_00_SMPTE296 = 4 +NV_CTRL_GVIO_VIDEO_FORMAT_1035I_59_94_SMPTE260 = 5 +NV_CTRL_GVIO_VIDEO_FORMAT_1035I_60_00_SMPTE260 = 6 +NV_CTRL_GVIO_VIDEO_FORMAT_1080I_50_00_SMPTE295 = 7 +NV_CTRL_GVIO_VIDEO_FORMAT_1080I_50_00_SMPTE274 = 8 +NV_CTRL_GVIO_VIDEO_FORMAT_1080I_59_94_SMPTE274 = 9 +NV_CTRL_GVIO_VIDEO_FORMAT_1080I_60_00_SMPTE274 = 10 +NV_CTRL_GVIO_VIDEO_FORMAT_1080P_23_976_SMPTE274 = 11 +NV_CTRL_GVIO_VIDEO_FORMAT_1080P_24_00_SMPTE274 = 12 +NV_CTRL_GVIO_VIDEO_FORMAT_1080P_25_00_SMPTE274 = 13 +NV_CTRL_GVIO_VIDEO_FORMAT_1080P_29_97_SMPTE274 = 14 +NV_CTRL_GVIO_VIDEO_FORMAT_1080P_30_00_SMPTE274 = 15 +NV_CTRL_GVIO_VIDEO_FORMAT_720P_50_00_SMPTE296 = 16 +NV_CTRL_GVIO_VIDEO_FORMAT_1080I_48_00_SMPTE274 = 17 +NV_CTRL_GVIO_VIDEO_FORMAT_1080I_47_96_SMPTE274 = 18 +NV_CTRL_GVIO_VIDEO_FORMAT_720P_30_00_SMPTE296 = 19 +NV_CTRL_GVIO_VIDEO_FORMAT_720P_29_97_SMPTE296 = 20 +NV_CTRL_GVIO_VIDEO_FORMAT_720P_25_00_SMPTE296 = 21 +NV_CTRL_GVIO_VIDEO_FORMAT_720P_24_00_SMPTE296 = 22 +NV_CTRL_GVIO_VIDEO_FORMAT_720P_23_98_SMPTE296 = 23 +NV_CTRL_GVIO_VIDEO_FORMAT_1080PSF_25_00_SMPTE274 = 24 +NV_CTRL_GVIO_VIDEO_FORMAT_1080PSF_29_97_SMPTE274 = 25 +NV_CTRL_GVIO_VIDEO_FORMAT_1080PSF_30_00_SMPTE274 = 26 +NV_CTRL_GVIO_VIDEO_FORMAT_1080PSF_24_00_SMPTE274 = 27 +NV_CTRL_GVIO_VIDEO_FORMAT_1080PSF_23_98_SMPTE274 = 28 +NV_CTRL_GVIO_VIDEO_FORMAT_2048P_30_00_SMPTE372 = 29 +NV_CTRL_GVIO_VIDEO_FORMAT_2048P_29_97_SMPTE372 = 30 +NV_CTRL_GVIO_VIDEO_FORMAT_2048I_60_00_SMPTE372 = 31 +NV_CTRL_GVIO_VIDEO_FORMAT_2048I_59_94_SMPTE372 = 32 +NV_CTRL_GVIO_VIDEO_FORMAT_2048P_25_00_SMPTE372 = 33 +NV_CTRL_GVIO_VIDEO_FORMAT_2048I_50_00_SMPTE372 = 34 +NV_CTRL_GVIO_VIDEO_FORMAT_2048P_24_00_SMPTE372 = 35 +NV_CTRL_GVIO_VIDEO_FORMAT_2048P_23_98_SMPTE372 = 36 +NV_CTRL_GVIO_VIDEO_FORMAT_2048I_48_00_SMPTE372 = 37 +NV_CTRL_GVIO_VIDEO_FORMAT_2048I_47_96_SMPTE372 = 38 +NV_CTRL_GVIO_VIDEO_FORMAT_1080P_50_00_3G_LEVEL_A_SMPTE274 = 39 +NV_CTRL_GVIO_VIDEO_FORMAT_1080P_59_94_3G_LEVEL_A_SMPTE274 = 40 +NV_CTRL_GVIO_VIDEO_FORMAT_1080P_60_00_3G_LEVEL_A_SMPTE274 = 41 +NV_CTRL_GVIO_VIDEO_FORMAT_1080P_60_00_3G_LEVEL_B_SMPTE274 = 42 +NV_CTRL_GVIO_VIDEO_FORMAT_1080I_60_00_3G_LEVEL_B_SMPTE274 = 43 +NV_CTRL_GVIO_VIDEO_FORMAT_2048I_60_00_3G_LEVEL_B_SMPTE372 = 44 +NV_CTRL_GVIO_VIDEO_FORMAT_1080P_50_00_3G_LEVEL_B_SMPTE274 = 45 +NV_CTRL_GVIO_VIDEO_FORMAT_1080I_50_00_3G_LEVEL_B_SMPTE274 = 46 +NV_CTRL_GVIO_VIDEO_FORMAT_2048I_50_00_3G_LEVEL_B_SMPTE372 = 47 +NV_CTRL_GVIO_VIDEO_FORMAT_1080P_30_00_3G_LEVEL_B_SMPTE274 = 48 +NV_CTRL_GVIO_VIDEO_FORMAT_2048P_30_00_3G_LEVEL_B_SMPTE372 = 49 +NV_CTRL_GVIO_VIDEO_FORMAT_1080P_25_00_3G_LEVEL_B_SMPTE274 = 50 +NV_CTRL_GVIO_VIDEO_FORMAT_2048P_25_00_3G_LEVEL_B_SMPTE372 = 51 +NV_CTRL_GVIO_VIDEO_FORMAT_1080P_24_00_3G_LEVEL_B_SMPTE274 = 52 +NV_CTRL_GVIO_VIDEO_FORMAT_2048P_24_00_3G_LEVEL_B_SMPTE372 = 53 +NV_CTRL_GVIO_VIDEO_FORMAT_1080I_48_00_3G_LEVEL_B_SMPTE274 = 54 +NV_CTRL_GVIO_VIDEO_FORMAT_2048I_48_00_3G_LEVEL_B_SMPTE372 = 55 +NV_CTRL_GVIO_VIDEO_FORMAT_1080P_59_94_3G_LEVEL_B_SMPTE274 = 56 +NV_CTRL_GVIO_VIDEO_FORMAT_1080I_59_94_3G_LEVEL_B_SMPTE274 = 57 +NV_CTRL_GVIO_VIDEO_FORMAT_2048I_59_94_3G_LEVEL_B_SMPTE372 = 58 +NV_CTRL_GVIO_VIDEO_FORMAT_1080P_29_97_3G_LEVEL_B_SMPTE274 = 59 +NV_CTRL_GVIO_VIDEO_FORMAT_2048P_29_97_3G_LEVEL_B_SMPTE372 = 60 +NV_CTRL_GVIO_VIDEO_FORMAT_1080P_23_98_3G_LEVEL_B_SMPTE274 = 61 +NV_CTRL_GVIO_VIDEO_FORMAT_2048P_23_98_3G_LEVEL_B_SMPTE372 = 62 +NV_CTRL_GVIO_VIDEO_FORMAT_1080I_47_96_3G_LEVEL_B_SMPTE274 = 63 +NV_CTRL_GVIO_VIDEO_FORMAT_2048I_47_96_3G_LEVEL_B_SMPTE372 = 64 + +# +# The following have been renamed; NV_CTRL_GVIO_REQUESTED_VIDEO_FORMAT and the +# corresponding NV_CTRL_GVIO_* formats should be used instead. +# +NV_CTRL_GVO_OUTPUT_VIDEO_FORMAT = 70 # renamed + +NV_CTRL_GVO_VIDEO_FORMAT_NONE = 0 # renamed +NV_CTRL_GVO_VIDEO_FORMAT_487I_59_94_SMPTE259_NTSC = 1 # renamed +NV_CTRL_GVO_VIDEO_FORMAT_576I_50_00_SMPTE259_PAL = 2 # renamed +NV_CTRL_GVO_VIDEO_FORMAT_720P_59_94_SMPTE296 = 3 # renamed +NV_CTRL_GVO_VIDEO_FORMAT_720P_60_00_SMPTE296 = 4 # renamed +NV_CTRL_GVO_VIDEO_FORMAT_1035I_59_94_SMPTE260 = 5 # renamed +NV_CTRL_GVO_VIDEO_FORMAT_1035I_60_00_SMPTE260 = 6 # renamed +NV_CTRL_GVO_VIDEO_FORMAT_1080I_50_00_SMPTE295 = 7 # renamed +NV_CTRL_GVO_VIDEO_FORMAT_1080I_50_00_SMPTE274 = 8 # renamed +NV_CTRL_GVO_VIDEO_FORMAT_1080I_59_94_SMPTE274 = 9 # renamed +NV_CTRL_GVO_VIDEO_FORMAT_1080I_60_00_SMPTE274 = 10 # renamed +NV_CTRL_GVO_VIDEO_FORMAT_1080P_23_976_SMPTE274 = 11 # renamed +NV_CTRL_GVO_VIDEO_FORMAT_1080P_24_00_SMPTE274 = 12 # renamed +NV_CTRL_GVO_VIDEO_FORMAT_1080P_25_00_SMPTE274 = 13 # renamed +NV_CTRL_GVO_VIDEO_FORMAT_1080P_29_97_SMPTE274 = 14 # renamed +NV_CTRL_GVO_VIDEO_FORMAT_1080P_30_00_SMPTE274 = 15 # renamed +NV_CTRL_GVO_VIDEO_FORMAT_720P_50_00_SMPTE296 = 16 # renamed +NV_CTRL_GVO_VIDEO_FORMAT_1080I_48_00_SMPTE274 = 17 # renamed +NV_CTRL_GVO_VIDEO_FORMAT_1080I_47_96_SMPTE274 = 18 # renamed +NV_CTRL_GVO_VIDEO_FORMAT_720P_30_00_SMPTE296 = 19 # renamed +NV_CTRL_GVO_VIDEO_FORMAT_720P_29_97_SMPTE296 = 20 # renamed +NV_CTRL_GVO_VIDEO_FORMAT_720P_25_00_SMPTE296 = 21 # renamed +NV_CTRL_GVO_VIDEO_FORMAT_720P_24_00_SMPTE296 = 22 # renamed +NV_CTRL_GVO_VIDEO_FORMAT_720P_23_98_SMPTE296 = 23 # renamed +NV_CTRL_GVO_VIDEO_FORMAT_1080PSF_25_00_SMPTE274 = 24 # renamed +NV_CTRL_GVO_VIDEO_FORMAT_1080PSF_29_97_SMPTE274 = 25 # renamed +NV_CTRL_GVO_VIDEO_FORMAT_1080PSF_30_00_SMPTE274 = 26 # renamed +NV_CTRL_GVO_VIDEO_FORMAT_1080PSF_24_00_SMPTE274 = 27 # renamed +NV_CTRL_GVO_VIDEO_FORMAT_1080PSF_23_98_SMPTE274 = 28 # renamed +NV_CTRL_GVO_VIDEO_FORMAT_2048P_30_00_SMPTE372 = 29 # renamed +NV_CTRL_GVO_VIDEO_FORMAT_2048P_29_97_SMPTE372 = 30 # renamed +NV_CTRL_GVO_VIDEO_FORMAT_2048I_60_00_SMPTE372 = 31 # renamed +NV_CTRL_GVO_VIDEO_FORMAT_2048I_59_94_SMPTE372 = 32 # renamed +NV_CTRL_GVO_VIDEO_FORMAT_2048P_25_00_SMPTE372 = 33 # renamed +NV_CTRL_GVO_VIDEO_FORMAT_2048I_50_00_SMPTE372 = 34 # renamed +NV_CTRL_GVO_VIDEO_FORMAT_2048P_24_00_SMPTE372 = 35 # renamed +NV_CTRL_GVO_VIDEO_FORMAT_2048P_23_98_SMPTE372 = 36 # renamed +NV_CTRL_GVO_VIDEO_FORMAT_2048I_48_00_SMPTE372 = 37 # renamed +NV_CTRL_GVO_VIDEO_FORMAT_2048I_47_96_SMPTE372 = 38 # renamed + +# +# NV_CTRL_GVIO_DETECTED_VIDEO_FORMAT - indicates the input video format +# detected for GVO or GVI devices; the possible values are the +# NV_CTRL_GVIO_VIDEO_FORMAT constants. +# +# For GVI devices, the jack number should be specified in the lower +# 16 bits of the "display_mask" parameter, while the channel number should be +# specified in the upper 16 bits. +# + +NV_CTRL_GVIO_DETECTED_VIDEO_FORMAT = 71 # R--I + +# +# NV_CTRL_GVO_INPUT_VIDEO_FORMAT - renamed +# +# NV_CTRL_GVIO_DETECTED_VIDEO_FORMAT should be used instead. +# + +NV_CTRL_GVO_INPUT_VIDEO_FORMAT = 71 # renamed + +# +# NV_CTRL_GVO_DATA_FORMAT - This controls how the data in the source +# (either the X screen or the GLX pbuffer) is interpretted and +# displayed. +# +# Note: some of the below DATA_FORMATS have been renamed. For +# example, R8G8B8_TO_RGB444 has been renamed to X8X8X8_444_PASSTHRU. +# This is to more accurately reflect DATA_FORMATS where the +# per-channel data could be either RGB or YCrCb -- the point is that +# the driver and GVO hardware do not perform any implicit color space +# conversion on the data; it is passed through to the SDI out. +# + +NV_CTRL_GVO_DATA_FORMAT = 72 # RW- +NV_CTRL_GVO_DATA_FORMAT_R8G8B8_TO_YCRCB444 = 0 +NV_CTRL_GVO_DATA_FORMAT_R8G8B8A8_TO_YCRCBA4444 = 1 +NV_CTRL_GVO_DATA_FORMAT_R8G8B8Z10_TO_YCRCBZ4444 = 2 +NV_CTRL_GVO_DATA_FORMAT_R8G8B8_TO_YCRCB422 = 3 +NV_CTRL_GVO_DATA_FORMAT_R8G8B8A8_TO_YCRCBA4224 = 4 +NV_CTRL_GVO_DATA_FORMAT_R8G8B8Z10_TO_YCRCBZ4224 = 5 +NV_CTRL_GVO_DATA_FORMAT_R8G8B8_TO_RGB444 = 6 # renamed +NV_CTRL_GVO_DATA_FORMAT_X8X8X8_444_PASSTHRU = 6 +NV_CTRL_GVO_DATA_FORMAT_R8G8B8A8_TO_RGBA4444 = 7 # renamed +NV_CTRL_GVO_DATA_FORMAT_X8X8X8A8_4444_PASSTHRU = 7 +NV_CTRL_GVO_DATA_FORMAT_R8G8B8Z10_TO_RGBZ4444 = 8 # renamed +NV_CTRL_GVO_DATA_FORMAT_X8X8X8Z8_4444_PASSTHRU = 8 +NV_CTRL_GVO_DATA_FORMAT_Y10CR10CB10_TO_YCRCB444 = 9 # renamed +NV_CTRL_GVO_DATA_FORMAT_X10X10X10_444_PASSTHRU = 9 +NV_CTRL_GVO_DATA_FORMAT_Y10CR8CB8_TO_YCRCB444 = 10 # renamed +NV_CTRL_GVO_DATA_FORMAT_X10X8X8_444_PASSTHRU = 10 +NV_CTRL_GVO_DATA_FORMAT_Y10CR8CB8A10_TO_YCRCBA4444 = 11 # renamed +NV_CTRL_GVO_DATA_FORMAT_X10X8X8A10_4444_PASSTHRU = 11 +NV_CTRL_GVO_DATA_FORMAT_Y10CR8CB8Z10_TO_YCRCBZ4444 = 12 # renamed +NV_CTRL_GVO_DATA_FORMAT_X10X8X8Z10_4444_PASSTHRU = 12 +NV_CTRL_GVO_DATA_FORMAT_DUAL_R8G8B8_TO_DUAL_YCRCB422 = 13 +NV_CTRL_GVO_DATA_FORMAT_DUAL_Y8CR8CB8_TO_DUAL_YCRCB422 = 14 # renamed +NV_CTRL_GVO_DATA_FORMAT_DUAL_X8X8X8_TO_DUAL_422_PASSTHRU = 14 +NV_CTRL_GVO_DATA_FORMAT_R10G10B10_TO_YCRCB422 = 15 +NV_CTRL_GVO_DATA_FORMAT_R10G10B10_TO_YCRCB444 = 16 +NV_CTRL_GVO_DATA_FORMAT_Y12CR12CB12_TO_YCRCB444 = 17 # renamed +NV_CTRL_GVO_DATA_FORMAT_X12X12X12_444_PASSTHRU = 17 +NV_CTRL_GVO_DATA_FORMAT_R12G12B12_TO_YCRCB444 = 18 +NV_CTRL_GVO_DATA_FORMAT_X8X8X8_422_PASSTHRU = 19 +NV_CTRL_GVO_DATA_FORMAT_X8X8X8A8_4224_PASSTHRU = 20 +NV_CTRL_GVO_DATA_FORMAT_X8X8X8Z8_4224_PASSTHRU = 21 +NV_CTRL_GVO_DATA_FORMAT_X10X10X10_422_PASSTHRU = 22 +NV_CTRL_GVO_DATA_FORMAT_X10X8X8_422_PASSTHRU = 23 +NV_CTRL_GVO_DATA_FORMAT_X10X8X8A10_4224_PASSTHRU = 24 +NV_CTRL_GVO_DATA_FORMAT_X10X8X8Z10_4224_PASSTHRU = 25 +NV_CTRL_GVO_DATA_FORMAT_X12X12X12_422_PASSTHRU = 26 +NV_CTRL_GVO_DATA_FORMAT_R12G12B12_TO_YCRCB422 = 27 + +# +# NV_CTRL_GVO_DISPLAY_X_SCREEN - not supported +# + +NV_CTRL_GVO_DISPLAY_X_SCREEN = 73 # not supported +NV_CTRL_GVO_DISPLAY_X_SCREEN_ENABLE = 1 # not supported +NV_CTRL_GVO_DISPLAY_X_SCREEN_DISABLE = 0 # not supported + +# +# NV_CTRL_GVO_COMPOSITE_SYNC_INPUT_DETECTED - indicates whether +# Composite Sync input is detected. +# + +NV_CTRL_GVO_COMPOSITE_SYNC_INPUT_DETECTED = 74 # R-- +NV_CTRL_GVO_COMPOSITE_SYNC_INPUT_DETECTED_FALSE = 0 +NV_CTRL_GVO_COMPOSITE_SYNC_INPUT_DETECTED_TRUE = 1 + +# +# NV_CTRL_GVO_COMPOSITE_SYNC_INPUT_DETECT_MODE - get/set the +# Composite Sync input detect mode. +# + +NV_CTRL_GVO_COMPOSITE_SYNC_INPUT_DETECT_MODE = 75 # RW- +NV_CTRL_GVO_COMPOSITE_SYNC_INPUT_DETECT_MODE_AUTO = 0 +NV_CTRL_GVO_COMPOSITE_SYNC_INPUT_DETECT_MODE_BI_LEVEL = 1 +NV_CTRL_GVO_COMPOSITE_SYNC_INPUT_DETECT_MODE_TRI_LEVEL = 2 + +# +# NV_CTRL_GVO_SYNC_INPUT_DETECTED - indicates whether SDI Sync input +# is detected, and what type. +# + +NV_CTRL_GVO_SDI_SYNC_INPUT_DETECTED = 76 # R-- +NV_CTRL_GVO_SDI_SYNC_INPUT_DETECTED_NONE = 0 +NV_CTRL_GVO_SDI_SYNC_INPUT_DETECTED_HD = 1 +NV_CTRL_GVO_SDI_SYNC_INPUT_DETECTED_SD = 2 + +# +# NV_CTRL_GVO_VIDEO_OUTPUTS - indicates which GVO video output +# connectors are currently outputing data. +# + +NV_CTRL_GVO_VIDEO_OUTPUTS = 77 # R-- +NV_CTRL_GVO_VIDEO_OUTPUTS_NONE = 0 +NV_CTRL_GVO_VIDEO_OUTPUTS_VIDEO1 = 1 +NV_CTRL_GVO_VIDEO_OUTPUTS_VIDEO2 = 2 +NV_CTRL_GVO_VIDEO_OUTPUTS_VIDEO_BOTH = 3 + +# +# NV_CTRL_GVO_FIRMWARE_VERSION - deprecated +# +# NV_CTRL_STRING_GVIO_FIRMWARE_VERSION should be used instead. +# + +NV_CTRL_GVO_FIRMWARE_VERSION = 78 # deprecated + +# +# NV_CTRL_GVO_SYNC_DELAY_PIXELS - controls the delay between the +# input sync and the output sync in numbers of pixels from hsync; +# this is a 12 bit value. +# +# If the NV_CTRL_GVO_CAPABILITIES_ADVANCE_SYNC_SKEW bit is set, +# then setting this value will set an advance instead of a delay. +# + +NV_CTRL_GVO_SYNC_DELAY_PIXELS = 79 # RW- + +# +# NV_CTRL_GVO_SYNC_DELAY_LINES - controls the delay between the input +# sync and the output sync in numbers of lines from vsync; this is a +# 12 bit value. +# +# If the NV_CTRL_GVO_CAPABILITIES_ADVANCE_SYNC_SKEW bit is set, +# then setting this value will set an advance instead of a delay. +# + +NV_CTRL_GVO_SYNC_DELAY_LINES = 80 # RW- + +# +# NV_CTRL_GVO_INPUT_VIDEO_FORMAT_REACQUIRE - must be set for a period +# of about 2 seconds for the new InputVideoFormat to be properly +# locked to. In nvidia-settings, we do a reacquire whenever genlock +# or frame lock mode is entered into, when the user clicks the +# "detect" button. This value can be written, but always reads back +# _FALSE. +# + +NV_CTRL_GVO_INPUT_VIDEO_FORMAT_REACQUIRE = 81 # -W- +NV_CTRL_GVO_INPUT_VIDEO_FORMAT_REACQUIRE_FALSE = 0 +NV_CTRL_GVO_INPUT_VIDEO_FORMAT_REACQUIRE_TRUE = 1 + +# +# NV_CTRL_GVO_GLX_LOCKED - deprecated +# +# NV_CTRL_GVO_LOCK_OWNER should be used instead. +# + +NV_CTRL_GVO_GLX_LOCKED = 82 # deprecated +NV_CTRL_GVO_GLX_LOCKED_FALSE = 0 # deprecated +NV_CTRL_GVO_GLX_LOCKED_TRUE = 1 # deprecated + +# +# NV_CTRL_GVIO_VIDEO_FORMAT_{WIDTH,HEIGHT,REFRESH_RATE} - query the +# width, height, and refresh rate for the specified +# NV_CTRL_GVIO_VIDEO_FORMAT_*. So that this can be queried with +# existing interfaces, XNVCTRLQueryAttribute() should be used, and +# the video format specified in the display_mask field; eg: +# +# XNVCTRLQueryAttribute (dpy, +# screen, +# NV_CTRL_GVIO_VIDEO_FORMAT_487I_59_94_SMPTE259_NTSC, +# NV_CTRL_GVIO_VIDEO_FORMAT_WIDTH, +# &value); +# +# Note that Refresh Rate is in milliHertz values +# + +NV_CTRL_GVIO_VIDEO_FORMAT_WIDTH = 83 # R--I +NV_CTRL_GVIO_VIDEO_FORMAT_HEIGHT = 84 # R--I +NV_CTRL_GVIO_VIDEO_FORMAT_REFRESH_RATE = 85 # R--I + +# The following have been renamed; use the NV_CTRL_GVIO_* versions, instead +NV_CTRL_GVO_VIDEO_FORMAT_WIDTH = 83 # renamed +NV_CTRL_GVO_VIDEO_FORMAT_HEIGHT = 84 # renamed +NV_CTRL_GVO_VIDEO_FORMAT_REFRESH_RATE = 85 # renamed + +# +# NV_CTRL_GVO_X_SCREEN_PAN_[XY] - not supported +# + +NV_CTRL_GVO_X_SCREEN_PAN_X = 86 # not supported +NV_CTRL_GVO_X_SCREEN_PAN_Y = 87 # not supported + +# +# NV_CTRL_GPU_OVERCLOCKING_STATE - not supported +# + +NV_CTRL_GPU_OVERCLOCKING_STATE = 88 # not supported +NV_CTRL_GPU_OVERCLOCKING_STATE_NONE = 0 # not supported +NV_CTRL_GPU_OVERCLOCKING_STATE_MANUAL = 1 # not supported + +# +# NV_CTRL_GPU_{2,3}D_CLOCK_FREQS - not supported +# + +NV_CTRL_GPU_2D_CLOCK_FREQS = 89 # not supported +NV_CTRL_GPU_3D_CLOCK_FREQS = 90 # not supported + +# +# NV_CTRL_GPU_DEFAULT_{2,3}D_CLOCK_FREQS - not supported +# + +NV_CTRL_GPU_DEFAULT_2D_CLOCK_FREQS = 91 # not supported +NV_CTRL_GPU_DEFAULT_3D_CLOCK_FREQS = 92 # not supported + +# +# NV_CTRL_GPU_CURRENT_CLOCK_FREQS - query the current GPU and memory +# clocks of the graphics device driving the X screen. +# +# NV_CTRL_GPU_CURRENT_CLOCK_FREQS is a "packed" integer attribute; +# the GPU clock is stored in the upper 16 bits of the integer, and +# the memory clock is stored in the lower 16 bits of the integer. +# All clock values are in MHz. All clock values are in MHz. +# + +NV_CTRL_GPU_CURRENT_CLOCK_FREQS = 93 # R--G + +# +# NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS - not supported +# + +NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS = 94 # not supported +NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_INVALID = 0 # not supported + +# +# NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION - not supported +# + +NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION = 95 # not supported +NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION_START = 0 # not supported +NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION_CANCEL = 1 # not supported + +# +# NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION_STATE - not supported +# + +NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION_STATE = 96 # not supported +NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION_STATE_IDLE = 0 # not supported +NV_CTRL_GPU_OPTIMAL_CLOCK_FREQS_DETECTION_STATE_BUSY = 1 # not supported + +# +# NV_CTRL_FLATPANEL_CHIP_LOCATION - for the specified display device, +# report whether the flat panel is driven by the on-chip controller, +# or a separate controller chip elsewhere on the graphics board. +# This attribute is only available for flat panels. +# + +NV_CTRL_FLATPANEL_CHIP_LOCATION = 215 # R-DG +NV_CTRL_FLATPANEL_CHIP_LOCATION_INTERNAL = 0 +NV_CTRL_FLATPANEL_CHIP_LOCATION_EXTERNAL = 1 + +# +# NV_CTRL_FLATPANEL_LINK - report the number of links for a DVI connection, or +# the main link's active lane count for DisplayPort. +# This attribute is only available for flat panels. +# + +NV_CTRL_FLATPANEL_LINK = 216 # R-DG +NV_CTRL_FLATPANEL_LINK_SINGLE = 0 +NV_CTRL_FLATPANEL_LINK_DUAL = 1 +NV_CTRL_FLATPANEL_LINK_QUAD = 3 + +# +# NV_CTRL_FLATPANEL_SIGNAL - for the specified display device, report +# whether the flat panel is driven by an LVDS, TMDS, or DisplayPort signal. +# This attribute is only available for flat panels. +# + +NV_CTRL_FLATPANEL_SIGNAL = 217 # R-DG +NV_CTRL_FLATPANEL_SIGNAL_LVDS = 0 +NV_CTRL_FLATPANEL_SIGNAL_TMDS = 1 +NV_CTRL_FLATPANEL_SIGNAL_DISPLAYPORT = 2 + +# +# NV_CTRL_USE_HOUSE_SYNC - when INPUT, the server (master) frame lock +# device will propagate the incoming house sync signal as the outgoing +# frame lock sync signal. If the frame lock device cannot detect a +# frame lock sync signal, it will default to using the internal timings +# from the GPU connected to the primary connector. +# +# When set to OUTPUT, the server (master) frame lock device will +# generate a house sync signal from its internal timing and output +# this signal over the BNC connector on the frame lock device. This +# is only allowed on a Quadro Sync II device. If an incoming house +# sync signal is present on the BNC connector, this setting will +# have no effect. +# +# This attribute may be queried through XNVCTRLQueryTargetAttribute() +# using a NV_CTRL_TARGET_TYPE_FRAMELOCK or NV_CTRL_TARGET_TYPE_X_SCREEN +# target. +# + +NV_CTRL_USE_HOUSE_SYNC = 218 # RW-F +NV_CTRL_USE_HOUSE_SYNC_DISABLED = 0 # aliases with FALSE +NV_CTRL_USE_HOUSE_SYNC_INPUT = 1 # aliases with TRUE +NV_CTRL_USE_HOUSE_SYNC_OUTPUT = 2 +NV_CTRL_USE_HOUSE_SYNC_FALSE = 0 +NV_CTRL_USE_HOUSE_SYNC_TRUE = 1 + +# +# NV_CTRL_EDID_AVAILABLE - report if an EDID is available for the +# specified display device. +# +# This attribute may also be queried through XNVCTRLQueryTargetAttribute() +# using a NV_CTRL_TARGET_TYPE_GPU or NV_CTRL_TARGET_TYPE_X_SCREEN +# target. +# + +NV_CTRL_EDID_AVAILABLE = 219 # R-DG +NV_CTRL_EDID_AVAILABLE_FALSE = 0 +NV_CTRL_EDID_AVAILABLE_TRUE = 1 + +# +# NV_CTRL_FORCE_STEREO - when TRUE, OpenGL will force stereo flipping +# even when no stereo drawables are visible (if the device is configured +# to support it, see the "Stereo" X config option). +# When false, fall back to the default behavior of only flipping when a +# stereo drawable is visible. +# + +NV_CTRL_FORCE_STEREO = 220 # RW- +NV_CTRL_FORCE_STEREO_FALSE = 0 +NV_CTRL_FORCE_STEREO_TRUE = 1 + +# +# NV_CTRL_IMAGE_SETTINGS - the image quality setting for OpenGL clients. +# +# This setting is only applied to OpenGL clients that are started +# after this setting is applied. +# + +NV_CTRL_IMAGE_SETTINGS = 221 # RW-X +NV_CTRL_IMAGE_SETTINGS_HIGH_QUALITY = 0 +NV_CTRL_IMAGE_SETTINGS_QUALITY = 1 +NV_CTRL_IMAGE_SETTINGS_PERFORMANCE = 2 +NV_CTRL_IMAGE_SETTINGS_HIGH_PERFORMANCE = 3 + +# +# NV_CTRL_XINERAMA - return whether xinerama is enabled +# + +NV_CTRL_XINERAMA = 222 # R--G +NV_CTRL_XINERAMA_OFF = 0 +NV_CTRL_XINERAMA_ON = 1 + +# +# NV_CTRL_XINERAMA_STEREO - when TRUE, OpenGL will allow stereo flipping +# on multiple X screens configured with Xinerama. +# When FALSE, flipping is allowed only on one X screen at a time. +# + +NV_CTRL_XINERAMA_STEREO = 223 # RW- +NV_CTRL_XINERAMA_STEREO_FALSE = 0 +NV_CTRL_XINERAMA_STEREO_TRUE = 1 + +# +# NV_CTRL_BUS_RATE - if the bus type of the specified device is AGP, then +# NV_CTRL_BUS_RATE returns the configured AGP transfer rate. If the bus type +# is PCI Express, then this attribute returns the maximum link width. +# When this attribute is queried on an X screen target, the bus rate of the +# GPU driving the X screen is returned. +# + +NV_CTRL_BUS_RATE = 224 # R--GI + +# +# NV_CTRL_GPU_PCIE_MAX_LINK_WIDTH - returns the maximum +# PCIe link width, in number of lanes. +# +NV_CTRL_GPU_PCIE_MAX_LINK_WIDTH = NV_CTRL_BUS_RATE +# +# NV_CTRL_SHOW_SLI_VISUAL_INDICATOR - when TRUE, OpenGL will draw information +# about the current SLI mode. +# + +NV_CTRL_SHOW_SLI_VISUAL_INDICATOR = 225 # RW-X +NV_CTRL_SHOW_SLI_VISUAL_INDICATOR_FALSE = 0 +NV_CTRL_SHOW_SLI_VISUAL_INDICATOR_TRUE = 1 + +# +# NV_CTRL_SHOW_SLI_HUD - when TRUE, OpenGL will draw information about the +# current SLI mode. +# Renamed this attribute to NV_CTRL_SHOW_SLI_VISUAL_INDICATOR +# + +NV_CTRL_SHOW_SLI_HUD = NV_CTRL_SHOW_SLI_VISUAL_INDICATOR +NV_CTRL_SHOW_SLI_HUD_FALSE = NV_CTRL_SHOW_SLI_VISUAL_INDICATOR_FALSE +NV_CTRL_SHOW_SLI_HUD_TRUE = NV_CTRL_SHOW_SLI_VISUAL_INDICATOR_TRUE + +# +# NV_CTRL_XV_SYNC_TO_DISPLAY - deprecated +# +# NV_CTRL_XV_SYNC_TO_DISPLAY_ID should be used instead. +# + +NV_CTRL_XV_SYNC_TO_DISPLAY = 226 # deprecated + +# +# NV_CTRL_GVIO_REQUESTED_VIDEO_FORMAT2 - this attribute is only +# intended to be used to query the ValidValues for +# NV_CTRL_GVIO_REQUESTED_VIDEO_FORMAT for VIDEO_FORMAT values between +# 31 and 63. See NV_CTRL_GVIO_REQUESTED_VIDEO_FORMAT for details. +# + +NV_CTRL_GVIO_REQUESTED_VIDEO_FORMAT2 = 227 # ---GI + +# +# NV_CTRL_GVO_OUTPUT_VIDEO_FORMAT2 - renamed +# +# NV_CTRL_GVIO_REQUESTED_VIDEO_FORMAT2 should be used instead. +# +NV_CTRL_GVO_OUTPUT_VIDEO_FORMAT2 = 227 # renamed + +# +# NV_CTRL_GVO_OVERRIDE_HW_CSC - Override the SDI hardware's Color Space +# Conversion with the values controlled through +# XNVCTRLSetGvoColorConversion() and XNVCTRLGetGvoColorConversion(). If +# this attribute is FALSE, then the values specified through +# XNVCTRLSetGvoColorConversion() are ignored. +# + +NV_CTRL_GVO_OVERRIDE_HW_CSC = 228 # RW- +NV_CTRL_GVO_OVERRIDE_HW_CSC_FALSE = 0 +NV_CTRL_GVO_OVERRIDE_HW_CSC_TRUE = 1 + +# +# NV_CTRL_GVO_CAPABILITIES - this read-only attribute describes GVO +# capabilities that differ between NVIDIA SDI products. This value +# is a bitmask where each bit indicates whether that capability is +# available. +# +# APPLY_CSC_IMMEDIATELY - whether the CSC matrix, offset, and scale +# specified through XNVCTRLSetGvoColorConversion() will take affect +# immediately, or only after SDI output is disabled and enabled +# again. +# +# APPLY_CSC_TO_X_SCREEN - whether the CSC matrix, offset, and scale +# specified through XNVCTRLSetGvoColorConversion() will also apply +# to GVO output of an X screen, or only to OpenGL GVO output, as +# enabled through the GLX_NV_video_out extension. +# +# COMPOSITE_TERMINATION - whether the 75 ohm termination of the +# SDI composite input signal can be programmed through the +# NV_CTRL_GVO_COMPOSITE_TERMINATION attribute. +# +# SHARED_SYNC_BNC - whether the SDI device has a single BNC +# connector used for both (SDI & Composite) incoming signals. +# +# MULTIRATE_SYNC - whether the SDI device supports synchronization +# of input and output video modes that match in being odd or even +# modes (ie, AA.00 Hz modes can be synched to other BB.00 Hz modes and +# AA.XX Hz can match to BB.YY Hz where .XX and .YY are not .00) +# + +NV_CTRL_GVO_CAPABILITIES = 229 # R-- +NV_CTRL_GVO_CAPABILITIES_APPLY_CSC_IMMEDIATELY = 0x00000001 +NV_CTRL_GVO_CAPABILITIES_APPLY_CSC_TO_X_SCREEN = 0x00000002 +NV_CTRL_GVO_CAPABILITIES_COMPOSITE_TERMINATION = 0x00000004 +NV_CTRL_GVO_CAPABILITIES_SHARED_SYNC_BNC = 0x00000008 +NV_CTRL_GVO_CAPABILITIES_MULTIRATE_SYNC = 0x00000010 +NV_CTRL_GVO_CAPABILITIES_ADVANCE_SYNC_SKEW = 0x00000020 + +# +# NV_CTRL_GVO_COMPOSITE_TERMINATION - enable or disable 75 ohm +# termination of the SDI composite input signal. +# + +NV_CTRL_GVO_COMPOSITE_TERMINATION = 230 # RW- +NV_CTRL_GVO_COMPOSITE_TERMINATION_ENABLE = 1 +NV_CTRL_GVO_COMPOSITE_TERMINATION_DISABLE = 0 + +# +# NV_CTRL_ASSOCIATED_DISPLAY_DEVICES - deprecated +# +# NV_CTRL_BINARY_DATA_DISPLAYS_ASSIGNED_TO_XSCREEN should be used instead. +# + +NV_CTRL_ASSOCIATED_DISPLAY_DEVICES = 231 # deprecated + +# +# NV_CTRL_FRAMELOCK_SLAVES - deprecated +# +# NV_CTRL_FRAMELOCK_DISPLAY_CONFIG should be used instead. +# + +NV_CTRL_FRAMELOCK_SLAVES = 232 # deprecated + +# +# NV_CTRL_FRAMELOCK_MASTERABLE - deprecated +# +# NV_CTRL_FRAMELOCK_DISPLAY_CONFIG should be used instead. +# + +NV_CTRL_FRAMELOCK_MASTERABLE = 233 # deprecated + +# +# NV_CTRL_PROBE_DISPLAYS - re-probes the hardware to detect what +# display devices are connected to the GPU or GPU driving the +# specified X screen. The return value is deprecated and should not be used. +# +# This attribute may be queried through XNVCTRLQueryTargetAttribute() +# using a NV_CTRL_TARGET_TYPE_GPU or NV_CTRL_TARGET_TYPE_X_SCREEN target. +# + +NV_CTRL_PROBE_DISPLAYS = 234 # R--G + +# +# NV_CTRL_REFRESH_RATE - Returns the refresh rate of the specified +# display device in 100# Hz (ie. to get the refresh rate in Hz, divide +# the returned value by 100.) +# +# This attribute may be queried through XNVCTRLQueryTargetAttribute() +# using a NV_CTRL_TARGET_TYPE_GPU or NV_CTRL_TARGET_TYPE_X_SCREEN target. +# + +NV_CTRL_REFRESH_RATE = 235 # R-DG + +# +# NV_CTRL_GVO_FLIP_QUEUE_SIZE - The Graphics to Video Out interface +# exposed through NV-CONTROL and the GLX_NV_video_out extension uses +# an internal flip queue when pbuffers are sent to the video device +# (via glXSendPbufferToVideoNV()). The NV_CTRL_GVO_FLIP_QUEUE_SIZE +# can be used to query and assign the flip queue size. This +# attribute is applied to GLX when glXGetVideoDeviceNV() is called by +# the application. +# + +NV_CTRL_GVO_FLIP_QUEUE_SIZE = 236 # RW- + +# +# NV_CTRL_CURRENT_SCANLINE - query the current scanline for the +# specified display device. +# + +NV_CTRL_CURRENT_SCANLINE = 237 # R-DG + +# +# NV_CTRL_INITIAL_PIXMAP_PLACEMENT - Controls where X pixmaps are initially +# created. +# +# NV_CTRL_INITIAL_PIXMAP_PLACEMENT_FORCE_SYSMEM causes pixmaps to stay in +# system memory. These pixmaps can't be accelerated by the NVIDIA driver; this +# will cause blank windows if used with an OpenGL compositing manager. +# NV_CTRL_INITIAL_PIXMAP_PLACEMENT_SYSMEM creates pixmaps in system memory +# initially, but allows them to migrate to video memory. +# NV_CTRL_INITIAL_PIXMAP_PLACEMENT_VIDMEM creates pixmaps in video memory +# when enough resources are available. +# NV_CTRL_INITIAL_PIXMAP_PLACEMENT_RESERVED is currently reserved for future +# use. Behavior is undefined. +# NV_CTRL_INITIAL_PIXMAP_PLACEMENT_GPU_SYSMEM creates pixmaps in GPU accessible +# system memory when enough resources are available. +# + +NV_CTRL_INITIAL_PIXMAP_PLACEMENT = 238 # RW- +NV_CTRL_INITIAL_PIXMAP_PLACEMENT_FORCE_SYSMEM = 0 +NV_CTRL_INITIAL_PIXMAP_PLACEMENT_SYSMEM = 1 +NV_CTRL_INITIAL_PIXMAP_PLACEMENT_VIDMEM = 2 +NV_CTRL_INITIAL_PIXMAP_PLACEMENT_RESERVED = 3 +NV_CTRL_INITIAL_PIXMAP_PLACEMENT_GPU_SYSMEM = 4 + +# +# NV_CTRL_PCI_BUS - Returns the PCI bus number the specified device is using. +# + +NV_CTRL_PCI_BUS = 239 # R--GI + +# +# NV_CTRL_PCI_DEVICE - Returns the PCI device number the specified device is +# using. +# + +NV_CTRL_PCI_DEVICE = 240 # R--GI + +# +# NV_CTRL_PCI_FUNCTION - Returns the PCI function number the specified device +# is using. +# + +NV_CTRL_PCI_FUNCTION = 241 # R--GI + +# +# NV_CTRL_FRAMELOCK_FPGA_REVISION - Queries the FPGA revision of the +# Frame Lock device. +# +# This attribute must be queried through XNVCTRLQueryTargetAttribute() +# using a NV_CTRL_TARGET_TYPE_FRAMELOCK target. +# + +NV_CTRL_FRAMELOCK_FPGA_REVISION = 242 # R--F + +# +# NV_CTRL_MAX_SCREEN_{WIDTH,HEIGHT} - the maximum allowable size, in +# pixels, of either the specified X screen (if the target_type of the +# query is an X screen), or any X screen on the specified GPU (if the +# target_type of the query is a GPU). +# + +NV_CTRL_MAX_SCREEN_WIDTH = 243 # R--G +NV_CTRL_MAX_SCREEN_HEIGHT = 244 # R--G + +# +# NV_CTRL_MAX_DISPLAYS - The maximum number of display devices that +# can be driven simultaneously on a GPU (e.g., that can be used in a +# MetaMode at once). Note that this does not indicate the maximum +# number of displays that are listed in NV_CTRL_BINARY_DATA_DISPLAYS_ON_GPU +# and NV_CTRL_BINARY_DATA_DISPLAYS_CONNECTED_TO_GPU because more display +# devices can be connected than are actively in use. +# + +NV_CTRL_MAX_DISPLAYS = 245 # R--G + +# +# NV_CTRL_DYNAMIC_TWINVIEW - Returns whether or not the screen +# supports dynamic twinview. +# + +NV_CTRL_DYNAMIC_TWINVIEW = 246 # R-- + +# +# NV_CTRL_MULTIGPU_DISPLAY_OWNER - Returns the (NV-CONTROL) GPU ID of +# the GPU that has the display device(s) used for showing the X Screen. +# + +NV_CTRL_MULTIGPU_DISPLAY_OWNER = 247 # R-- + +# +# NV_CTRL_GPU_SCALING - not supported +# + +NV_CTRL_GPU_SCALING = 248 # not supported + +NV_CTRL_GPU_SCALING_TARGET_INVALID = 0 # not supported +NV_CTRL_GPU_SCALING_TARGET_FLATPANEL_BEST_FIT = 1 # not supported +NV_CTRL_GPU_SCALING_TARGET_FLATPANEL_NATIVE = 2 # not supported + +NV_CTRL_GPU_SCALING_METHOD_INVALID = 0 # not supported +NV_CTRL_GPU_SCALING_METHOD_STRETCHED = 1 # not supported +NV_CTRL_GPU_SCALING_METHOD_CENTERED = 2 # not supported +NV_CTRL_GPU_SCALING_METHOD_ASPECT_SCALED = 3 # not supported + +# +# NV_CTRL_FRONTEND_RESOLUTION - not supported +# + +NV_CTRL_FRONTEND_RESOLUTION = 249 # not supported + +# +# NV_CTRL_BACKEND_RESOLUTION - not supported +# + +NV_CTRL_BACKEND_RESOLUTION = 250 # not supported + +# +# NV_CTRL_FLATPANEL_NATIVE_RESOLUTION - not supported +# + +NV_CTRL_FLATPANEL_NATIVE_RESOLUTION = 251 # not supported + +# +# NV_CTRL_FLATPANEL_BEST_FIT_RESOLUTION - not supported +# + +NV_CTRL_FLATPANEL_BEST_FIT_RESOLUTION = 252 # not supported + +# +# NV_CTRL_GPU_SCALING_ACTIVE - not supported +# + +NV_CTRL_GPU_SCALING_ACTIVE = 253 # not supported + +# +# NV_CTRL_DFP_SCALING_ACTIVE - not supported +# + +NV_CTRL_DFP_SCALING_ACTIVE = 254 # not supported + +# +# NV_CTRL_FSAA_APPLICATION_ENHANCED - Controls how the NV_CTRL_FSAA_MODE +# is applied when NV_CTRL_FSAA_APPLICATION_CONTROLLED is set to +# NV_CTRL_APPLICATION_CONTROLLED_DISABLED. When +# NV_CTRL_FSAA_APPLICATION_ENHANCED is _DISABLED, OpenGL applications will +# be forced to use the FSAA mode specified by NV_CTRL_FSAA_MODE. when set +# to _ENABLED, only those applications that have selected a multisample +# FBConfig will be made to use the NV_CTRL_FSAA_MODE specified. +# +# This attribute is ignored when NV_CTRL_FSAA_APPLICATION_CONTROLLED is +# set to NV_CTRL_FSAA_APPLICATION_CONTROLLED_ENABLED. +# + +NV_CTRL_FSAA_APPLICATION_ENHANCED = 255 # RW-X +NV_CTRL_FSAA_APPLICATION_ENHANCED_ENABLED = 1 +NV_CTRL_FSAA_APPLICATION_ENHANCED_DISABLED = 0 + +# +# NV_CTRL_FRAMELOCK_SYNC_RATE_4 - This is the refresh rate that the +# frame lock board is sending to the GPU with 4 digits of precision. +# +# This attribute may be queried through XNVCTRLQueryTargetAttribute() +# using a NV_CTRL_TARGET_TYPE_FRAMELOCK. +# + +NV_CTRL_FRAMELOCK_SYNC_RATE_4 = 256 # R--F + +# +# NV_CTRL_GVO_LOCK_OWNER - indicates that the GVO device is available +# or in use (by GLX or an X screen). +# +# The GVO device is locked by GLX when either glXGetVideoDeviceNV +# (part of GLX_NV_video_out) or glXBindVideoDeviceNV (part of +# GLX_NV_present_video) is called. All GVO output resources are +# locked until released by the GLX_NV_video_out/GLX_NV_present_video +# client. +# +# The GVO device is locked/unlocked by an X screen, when the GVO device is +# used in a MetaMode on an X screen. +# +# When the GVO device is locked, setting of the following GVO NV-CONTROL +# attributes will not happen immediately and will instead be cached. The +# GVO resource will need to be disabled/released and re-enabled/claimed for +# the values to be flushed. These attributes are: +# +# NV_CTRL_GVIO_REQUESTED_VIDEO_FORMAT +# NV_CTRL_GVO_DATA_FORMAT +# NV_CTRL_GVO_FLIP_QUEUE_SIZE +# + +NV_CTRL_GVO_LOCK_OWNER = 257 # R-- +NV_CTRL_GVO_LOCK_OWNER_NONE = 0 +NV_CTRL_GVO_LOCK_OWNER_GLX = 1 +NV_CTRL_GVO_LOCK_OWNER_CLONE = 2 # not supported +NV_CTRL_GVO_LOCK_OWNER_X_SCREEN = 3 + +# +# NV_CTRL_HWOVERLAY - when a workstation overlay is in use, reports +# whether the hardware overlay is used, or if the overlay is emulated. +# + +NV_CTRL_HWOVERLAY = 258 # R-- +NV_CTRL_HWOVERLAY_FALSE = 0 +NV_CTRL_HWOVERLAY_TRUE = 1 + +# +# NV_CTRL_NUM_GPU_ERRORS_RECOVERED - Returns the number of GPU errors +# occured. This attribute may be queried through XNVCTRLQueryTargetAttribute() +# using a NV_CTRL_TARGET_TYPE_X_SCREEN target. +# + +NV_CTRL_NUM_GPU_ERRORS_RECOVERED = 259 # R--- + +# +# NV_CTRL_REFRESH_RATE_3 - Returns the refresh rate of the specified +# display device in 1000# Hz (ie. to get the refresh rate in Hz, divide +# the returned value by 1000.) +# +# This attribute may be queried through XNVCTRLQueryTargetAttribute() +# using a NV_CTRL_TARGET_TYPE_GPU or NV_CTRL_TARGET_TYPE_X_SCREEN target. +# + +NV_CTRL_REFRESH_RATE_3 = 260 # R-DG + +# +# NV_CTRL_ONDEMAND_VBLANK_INTERRUPTS - not supported +# + +NV_CTRL_ONDEMAND_VBLANK_INTERRUPTS = 261 # not supported +NV_CTRL_ONDEMAND_VBLANK_INTERRUPTS_OFF = 0 # not supported +NV_CTRL_ONDEMAND_VBLANK_INTERRUPTS_ON = 1 # not supported + +# +# NV_CTRL_GPU_POWER_SOURCE reports the type of power source +# of the GPU driving the X screen. +# + +NV_CTRL_GPU_POWER_SOURCE = 262 # R--G +NV_CTRL_GPU_POWER_SOURCE_AC = 0 +NV_CTRL_GPU_POWER_SOURCE_BATTERY = 1 + +# +# NV_CTRL_GPU_CURRENT_PERFORMANCE_MODE - not supported +# + +NV_CTRL_GPU_CURRENT_PERFORMANCE_MODE = 263 # not supported +NV_CTRL_GPU_CURRENT_PERFORMANCE_MODE_DESKTOP = 0 # not supported +NV_CTRL_GPU_CURRENT_PERFORMANCE_MODE_MAXPERF = 1 # not supported + +# NV_CTRL_GLYPH_CACHE - Enables RENDER Glyph Caching to VRAM + +NV_CTRL_GLYPH_CACHE = 264 # RW- +NV_CTRL_GLYPH_CACHE_DISABLED = 0 +NV_CTRL_GLYPH_CACHE_ENABLED = 1 + +# +# NV_CTRL_GPU_CURRENT_PERFORMANCE_LEVEL reports the current +# Performance level of the GPU driving the X screen. Each +# Performance level has associated NVClock and Mem Clock values. +# + +NV_CTRL_GPU_CURRENT_PERFORMANCE_LEVEL = 265 # R--G + +# +# NV_CTRL_GPU_ADAPTIVE_CLOCK_STATE reports if Adaptive Clocking +# is Enabled on the GPU driving the X screen. +# + +NV_CTRL_GPU_ADAPTIVE_CLOCK_STATE = 266 # R--G +NV_CTRL_GPU_ADAPTIVE_CLOCK_STATE_DISABLED = 0 +NV_CTRL_GPU_ADAPTIVE_CLOCK_STATE_ENABLED = 1 + +# +# NV_CTRL_GVO_OUTPUT_VIDEO_LOCKED - Returns whether or not the GVO output +# video is locked to the GPU. +# + +NV_CTRL_GVO_OUTPUT_VIDEO_LOCKED = 267 # R--- +NV_CTRL_GVO_OUTPUT_VIDEO_LOCKED_FALSE = 0 +NV_CTRL_GVO_OUTPUT_VIDEO_LOCKED_TRUE = 1 + +# +# NV_CTRL_GVO_SYNC_LOCK_STATUS - Returns whether or not the GVO device +# is locked to the input ref signal. If the sync mode is set to +# NV_CTRL_GVO_SYNC_MODE_GENLOCK, then this returns the genlock +# sync status, and if the sync mode is set to NV_CTRL_GVO_SYNC_MODE_FRAMELOCK, +# then this reports the frame lock status. +# + +NV_CTRL_GVO_SYNC_LOCK_STATUS = 268 # R--- +NV_CTRL_GVO_SYNC_LOCK_STATUS_UNLOCKED = 0 +NV_CTRL_GVO_SYNC_LOCK_STATUS_LOCKED = 1 + +# +# NV_CTRL_GVO_ANC_TIME_CODE_GENERATION - Allows SDI device to generate +# time codes in the ANC region of the SDI video output stream. +# + +NV_CTRL_GVO_ANC_TIME_CODE_GENERATION = 269 # RW-- +NV_CTRL_GVO_ANC_TIME_CODE_GENERATION_DISABLE = 0 +NV_CTRL_GVO_ANC_TIME_CODE_GENERATION_ENABLE = 1 + +# +# NV_CTRL_GVO_COMPOSITE - Enables/Disables SDI compositing. This attribute +# is only available when an SDI input source is detected and is in genlock +# mode. +# + +NV_CTRL_GVO_COMPOSITE = 270 # RW-- +NV_CTRL_GVO_COMPOSITE_DISABLE = 0 +NV_CTRL_GVO_COMPOSITE_ENABLE = 1 + +# +# NV_CTRL_GVO_COMPOSITE_ALPHA_KEY - When compositing is enabled, this +# enables/disables alpha blending. +# + +NV_CTRL_GVO_COMPOSITE_ALPHA_KEY = 271 # RW-- +NV_CTRL_GVO_COMPOSITE_ALPHA_KEY_DISABLE = 0 +NV_CTRL_GVO_COMPOSITE_ALPHA_KEY_ENABLE = 1 + +# +# NV_CTRL_GVO_COMPOSITE_LUMA_KEY_RANGE - Set the values of a luma +# channel range. This is a packed int that has the following format +# (in order of high-bits to low bits): +# +# Range # (11 bits), (Enabled 1 bit), min value (10 bits), max value (10 bits) +# +# To query the current values, pass the range # throught the display_mask +# variable. +# + +NV_CTRL_GVO_COMPOSITE_LUMA_KEY_RANGE = 272 # RW-- + +# +# NV_CTRL_GVO_COMPOSITE_CR_KEY_RANGE - Set the values of a CR +# channel range. This is a packed int that has the following format +# (in order of high-bits to low bits): +# +# Range # (11 bits), (Enabled 1 bit), min value (10 bits), max value (10 bits) +# +# To query the current values, pass the range # throught he display_mask +# variable. +# + +NV_CTRL_GVO_COMPOSITE_CR_KEY_RANGE = 273 # RW-- + +# +# NV_CTRL_GVO_COMPOSITE_CB_KEY_RANGE - Set the values of a CB +# channel range. This is a packed int that has the following format +# (in order of high-bits to low bits): +# +# Range # (11 bits), (Enabled 1 bit), min value (10 bits), max value (10 bits) +# +# To query the current values, pass the range # throught he display_mask +# variable. +# + +NV_CTRL_GVO_COMPOSITE_CB_KEY_RANGE = 274 # RW-- + +# +# NV_CTRL_GVO_COMPOSITE_NUM_KEY_RANGES - Returns the number of ranges +# available for each channel (Y/Luma, Cr, and Cb.) +# + +NV_CTRL_GVO_COMPOSITE_NUM_KEY_RANGES = 275 # R--- + +# +# NV_CTRL_SWITCH_TO_DISPLAYS - not supported +# + +NV_CTRL_SWITCH_TO_DISPLAYS = 276 # not supported + +# +# NV_CTRL_NOTEBOOK_DISPLAY_CHANGE_LID_EVENT - not supported +# + +NV_CTRL_NOTEBOOK_DISPLAY_CHANGE_LID_EVENT = 277 # not supported + +# +# NV_CTRL_NOTEBOOK_INTERNAL_LCD - deprecated +# + +NV_CTRL_NOTEBOOK_INTERNAL_LCD = 278 # deprecated + +# +# NV_CTRL_DEPTH_30_ALLOWED - returns whether the NVIDIA X driver supports +# depth 30 on the specified X screen or GPU. +# + +NV_CTRL_DEPTH_30_ALLOWED = 279 # R--G + +# +# NV_CTRL_MODE_SET_EVENT This attribute is sent as an event +# when hotkey, ctrl-alt-+/- or randr event occurs. Note that +# This attribute cannot be set or queried and is meant to +# be received by clients that wish to be notified of when +# mode set events occur. +# + +NV_CTRL_MODE_SET_EVENT = 280 # --- + +# +# NV_CTRL_OPENGL_AA_LINE_GAMMA_VALUE - the gamma value used by +# OpenGL when NV_CTRL_OPENGL_AA_LINE_GAMMA is enabled +# + +NV_CTRL_OPENGL_AA_LINE_GAMMA_VALUE = 281 # RW-X + +# +# NV_CTRL_VCSC_HIGH_PERF_MODE - deprecated +# +# Is used to both query High Performance Mode status on the Visual Computing +# System, and also to enable or disable High Performance Mode. +# + +NV_CTRL_VCSC_HIGH_PERF_MODE = 282 # RW-V +NV_CTRL_VCSC_HIGH_PERF_MODE_DISABLE = 0 +NV_CTRL_VCSC_HIGH_PERF_MODE_ENABLE = 1 + +# +# NV_CTRL_DISPLAYPORT_LINK_RATE - returns the negotiated lane bandwidth of the +# DisplayPort main link. The numerical value of this attribute is the link +# rate in bps divided by 27000000. +# This attribute is only available for DisplayPort flat panels. +# + +NV_CTRL_DISPLAYPORT_LINK_RATE = 291 # R-DG +NV_CTRL_DISPLAYPORT_LINK_RATE_DISABLED = 0x0 +NV_CTRL_DISPLAYPORT_LINK_RATE_1_62GBPS = 0x6 # deprecated +NV_CTRL_DISPLAYPORT_LINK_RATE_2_70GBPS = 0xA # deprecated + +# +# NV_CTRL_STEREO_EYES_EXCHANGE - Controls whether or not the left and right +# eyes of a stereo image are flipped. +# + +NV_CTRL_STEREO_EYES_EXCHANGE = 292 # RW-X +NV_CTRL_STEREO_EYES_EXCHANGE_OFF = 0 +NV_CTRL_STEREO_EYES_EXCHANGE_ON = 1 + +# +# NV_CTRL_NO_SCANOUT - returns whether the special "NoScanout" mode is +# enabled on the specified X screen or GPU; for details on this mode, +# see the description of the "none" value for the "UseDisplayDevice" +# X configuration option in the NVIDIA driver README. +# + +NV_CTRL_NO_SCANOUT = 293 # R--G +NV_CTRL_NO_SCANOUT_DISABLED = 0 +NV_CTRL_NO_SCANOUT_ENABLED = 1 + +# +# NV_CTRL_GVO_CSC_CHANGED_EVENT This attribute is sent as an event +# when the color space conversion matrix has been altered by another +# client. +# + +NV_CTRL_GVO_CSC_CHANGED_EVENT = 294 # --- + +# +# NV_CTRL_FRAMELOCK_SLAVEABLE - deprecated +# +# NV_CTRL_FRAMELOCK_DISPLAY_CONFIG should be used instead. +# + +NV_CTRL_FRAMELOCK_SLAVEABLE = 295 # deprecated + +# +# NV_CTRL_GVO_SYNC_TO_DISPLAY This attribute controls whether or not +# the non-SDI display device will be sync'ed to the SDI display device +# (when configured in TwinView, Clone Mode or when using the SDI device +# with OpenGL). +# + +NV_CTRL_GVO_SYNC_TO_DISPLAY = 296 # --- +NV_CTRL_GVO_SYNC_TO_DISPLAY_DISABLE = 0 +NV_CTRL_GVO_SYNC_TO_DISPLAY_ENABLE = 1 + +# +# NV_CTRL_X_SERVER_UNIQUE_ID - returns a pseudo-unique identifier for this +# X server. Intended for use in cases where an NV-CONTROL client communicates +# with multiple X servers, and wants some level of confidence that two +# X Display connections correspond to the same or different X servers. +# + +NV_CTRL_X_SERVER_UNIQUE_ID = 297 # R--- + +# +# NV_CTRL_PIXMAP_CACHE - This attribute controls whether the driver attempts to +# store video memory pixmaps in a cache. The cache speeds up allocation and +# deallocation of pixmaps, but could use more memory than when the cache is +# disabled. +# + +NV_CTRL_PIXMAP_CACHE = 298 # RW-X +NV_CTRL_PIXMAP_CACHE_DISABLE = 0 +NV_CTRL_PIXMAP_CACHE_ENABLE = 1 + +# +# NV_CTRL_PIXMAP_CACHE_ROUNDING_SIZE_KB - When the pixmap cache is enabled and +# there is not enough free space in the cache to fit a new pixmap, the driver +# will round up to the next multiple of this number of kilobytes when +# allocating more memory for the cache. +# + +NV_CTRL_PIXMAP_CACHE_ROUNDING_SIZE_KB = 299 # RW-X + +# +# NV_CTRL_IS_GVO_DISPLAY - returns whether or not a given display is an +# SDI device. +# + +NV_CTRL_IS_GVO_DISPLAY = 300 # R-D +NV_CTRL_IS_GVO_DISPLAY_FALSE = 0 +NV_CTRL_IS_GVO_DISPLAY_TRUE = 1 + +# +# NV_CTRL_PCI_ID - Returns the PCI vendor and device ID of the specified +# device. +# +# NV_CTRL_PCI_ID is a "packed" integer attribute; the PCI vendor ID is stored +# in the upper 16 bits of the integer, and the PCI device ID is stored in the +# lower 16 bits of the integer. +# + +NV_CTRL_PCI_ID = 301 # R--GI + +# +# NV_CTRL_GVO_FULL_RANGE_COLOR - Allow full range color data [4-1019] +# without clamping to [64-940]. +# + +NV_CTRL_GVO_FULL_RANGE_COLOR = 302 # RW- +NV_CTRL_GVO_FULL_RANGE_COLOR_DISABLED = 0 +NV_CTRL_GVO_FULL_RANGE_COLOR_ENABLED = 1 + +# +# NV_CTRL_SLI_MOSAIC_MODE_AVAILABLE - Returns whether or not +# SLI Mosaic Mode supported. +# + +NV_CTRL_SLI_MOSAIC_MODE_AVAILABLE = 303 # R-- +NV_CTRL_SLI_MOSAIC_MODE_AVAILABLE_FALSE = 0 +NV_CTRL_SLI_MOSAIC_MODE_AVAILABLE_TRUE = 1 + +# +# NV_CTRL_GVO_ENABLE_RGB_DATA - Allows clients to specify when +# the GVO board should process colors as RGB when the output data +# format is one of the NV_CTRL_GVO_DATA_FORMAT_???_PASSTRHU modes. +# + +NV_CTRL_GVO_ENABLE_RGB_DATA = 304 # RW- +NV_CTRL_GVO_ENABLE_RGB_DATA_DISABLE = 0 +NV_CTRL_GVO_ENABLE_RGB_DATA_ENABLE = 1 + +# +# NV_CTRL_IMAGE_SHARPENING_DEFAULT - Returns default value of +# Image Sharpening. +# + +NV_CTRL_IMAGE_SHARPENING_DEFAULT = 305 # R-- + +# +# NV_CTRL_PCI_DOMAIN - Returns the PCI domain number the specified device is +# using. +# + +NV_CTRL_PCI_DOMAIN = 306 # R--GI + +# +# NV_CTRL_GVI_NUM_JACKS - Returns the number of input BNC jacks available +# on a GVI device. +# + +NV_CTRL_GVI_NUM_JACKS = 307 # R--I + +# +# NV_CTRL_GVI_MAX_LINKS_PER_STREAM - Returns the maximum supported number of +# links that can be tied to one stream. +# + +NV_CTRL_GVI_MAX_LINKS_PER_STREAM = 308 # R--I + +# +# NV_CTRL_GVI_DETECTED_CHANNEL_BITS_PER_COMPONENT - Returns the detected +# number of bits per component (BPC) of data on the given input jack+ +# channel. +# +# The jack number should be specified in the lower 16 bits of the +# "display_mask" parameter, while the channel number should be specified in +# the upper 16 bits. +# + +NV_CTRL_GVI_DETECTED_CHANNEL_BITS_PER_COMPONENT = 309 # R--I +NV_CTRL_GVI_BITS_PER_COMPONENT_UNKNOWN = 0 +NV_CTRL_GVI_BITS_PER_COMPONENT_8 = 1 +NV_CTRL_GVI_BITS_PER_COMPONENT_10 = 2 +NV_CTRL_GVI_BITS_PER_COMPONENT_12 = 3 + +# +# NV_CTRL_GVI_REQUESTED_STREAM_BITS_PER_COMPONENT - Specify the number of +# bits per component (BPC) of data for the captured stream. +# The stream number should be specified in the "display_mask" parameter. +# +# Note: Setting this attribute may also result in the following +# NV-CONTROL attributes being reset on the GVI device (to ensure +# the configuration remains valid): +# NV_CTRL_GVI_REQUESTED_STREAM_COMPONENT_SAMPLING +# + +NV_CTRL_GVI_REQUESTED_STREAM_BITS_PER_COMPONENT = 310 # RW-I + +# +# NV_CTRL_GVI_DETECTED_CHANNEL_COMPONENT_SAMPLING - Returns the detected +# sampling format for the input jack+channel. +# +# The jack number should be specified in the lower 16 bits of the +# "display_mask" parameter, while the channel number should be specified in +# the upper 16 bits. +# + +NV_CTRL_GVI_DETECTED_CHANNEL_COMPONENT_SAMPLING = 311 # R--I +NV_CTRL_GVI_COMPONENT_SAMPLING_UNKNOWN = 0 +NV_CTRL_GVI_COMPONENT_SAMPLING_4444 = 1 +NV_CTRL_GVI_COMPONENT_SAMPLING_4224 = 2 +NV_CTRL_GVI_COMPONENT_SAMPLING_444 = 3 +NV_CTRL_GVI_COMPONENT_SAMPLING_422 = 4 +NV_CTRL_GVI_COMPONENT_SAMPLING_420 = 5 + +# +# NV_CTRL_GVI_REQUESTED_COMPONENT_SAMPLING - Specify the sampling format for +# the captured stream. +# The possible values are the NV_CTRL_GVI_DETECTED_COMPONENT_SAMPLING +# constants. +# The stream number should be specified in the "display_mask" parameter. +# + +NV_CTRL_GVI_REQUESTED_STREAM_COMPONENT_SAMPLING = 312 # RW-I + +# +# NV_CTRL_GVI_CHROMA_EXPAND - Enable or disable 4:2:2 -> 4:4:4 chroma +# expansion for the captured stream. This value is ignored when a +# COMPONENT_SAMPLING format is selected that does not use chroma subsampling, +# or if a BITS_PER_COMPONENT value is selected that is not supported. +# The stream number should be specified in the "display_mask" parameter. +# + +NV_CTRL_GVI_REQUESTED_STREAM_CHROMA_EXPAND = 313 # RW-I +NV_CTRL_GVI_CHROMA_EXPAND_FALSE = 0 +NV_CTRL_GVI_CHROMA_EXPAND_TRUE = 1 + +# +# NV_CTRL_GVI_DETECTED_CHANNEL_COLOR_SPACE - Returns the detected color space +# of the input jack+channel. +# +# The jack number should be specified in the lower 16 bits of the +# "display_mask" parameter, while the channel number should be specified in +# the upper 16 bits. +# + +NV_CTRL_GVI_DETECTED_CHANNEL_COLOR_SPACE = 314 # R--I +NV_CTRL_GVI_COLOR_SPACE_UNKNOWN = 0 +NV_CTRL_GVI_COLOR_SPACE_GBR = 1 +NV_CTRL_GVI_COLOR_SPACE_GBRA = 2 +NV_CTRL_GVI_COLOR_SPACE_GBRD = 3 +NV_CTRL_GVI_COLOR_SPACE_YCBCR = 4 +NV_CTRL_GVI_COLOR_SPACE_YCBCRA = 5 +NV_CTRL_GVI_COLOR_SPACE_YCBCRD = 6 + +# +# NV_CTRL_GVI_DETECTED_CHANNEL_LINK_ID - Returns the detected link identifier +# for the given input jack+channel. +# +# The jack number should be specified in the lower 16 bits of the +# "display_mask" parameter, while the channel number should be specified in +# the upper 16 bits. +# + +NV_CTRL_GVI_DETECTED_CHANNEL_LINK_ID = 315 # R--I +NV_CTRL_GVI_LINK_ID_UNKNOWN = 0xFFFF + +# +# NV_CTRL_GVI_DETECTED_CHANNEL_SMPTE352_IDENTIFIER - Returns the 4-byte +# SMPTE 352 identifier from the given input jack+channel. +# +# The jack number should be specified in the lower 16 bits of the +# "display_mask" parameter, while the channel number should be specified in +# the upper 16 bits. +# + +NV_CTRL_GVI_DETECTED_CHANNEL_SMPTE352_IDENTIFIER = 316 # R--I + +# +# NV_CTRL_GVI_GLOBAL_IDENTIFIER - Returns a global identifier for the +# GVI device. This identifier can be used to relate GVI devices named +# in NV-CONTROL with those enumerated in OpenGL. +# + +NV_CTRL_GVI_GLOBAL_IDENTIFIER = 317 # R--I + +# +# NV_CTRL_FRAMELOCK_SYNC_DELAY_RESOLUTION - Returns the number of nanoseconds +# that one unit of NV_CTRL_FRAMELOCK_SYNC_DELAY corresponds to. +# +NV_CTRL_FRAMELOCK_SYNC_DELAY_RESOLUTION = 318 # R-- + +# +# NV_CTRL_GPU_COOLER_MANUAL_CONTROL - Query the current or set a new +# cooler control state; the value of this attribute controls the +# availability of additional cooler control attributes (see below). +# +# Note: this attribute is unavailable unless cooler control support +# has been enabled in the X server (by the user). +# + +NV_CTRL_GPU_COOLER_MANUAL_CONTROL = 319 # RW-G +NV_CTRL_GPU_COOLER_MANUAL_CONTROL_FALSE = 0 +NV_CTRL_GPU_COOLER_MANUAL_CONTROL_TRUE = 1 + +# +# NV_CTRL_THERMAL_COOLER_LEVEL - The cooler's target level. +# Normally, the driver dynamically adjusts the cooler based on +# the needs of the GPU. But when NV_CTRL_GPU_COOLER_MANUAL_CONTROL=TRUE, +# the driver will attempt to make the cooler achieve the setting in +# NV_CTRL_THERMAL_COOLER_LEVEL. The actual current level of the cooler +# is reported in NV_CTRL_THERMAL_COOLER_CURRENT_LEVEL. +# + +NV_CTRL_THERMAL_COOLER_LEVEL = 320 # RW-C + +# NV_CTRL_THERMAL_COOLER_LEVEL_SET_DEFAULT - Sets default values of +# cooler. +# + +NV_CTRL_THERMAL_COOLER_LEVEL_SET_DEFAULT = 321 # -W-C + +# +# NV_CTRL_THERMAL_COOLER_CONTROL_TYPE - +# Returns a cooler's control signal characteristics. +# The possible types are restricted, Variable and Toggle. +# + +NV_CTRL_THERMAL_COOLER_CONTROL_TYPE = 322 # R--C +NV_CTRL_THERMAL_COOLER_CONTROL_TYPE_NONE = 0 +NV_CTRL_THERMAL_COOLER_CONTROL_TYPE_TOGGLE = 1 +NV_CTRL_THERMAL_COOLER_CONTROL_TYPE_VARIABLE = 2 + +# +# NV_CTRL_THERMAL_COOLER_TARGET - Returns objects that cooler cools. +# Targets may be GPU, Memory, Power Supply or All of these. +# GPU_RELATED = GPU | MEMORY | POWER_SUPPLY +# +# + +NV_CTRL_THERMAL_COOLER_TARGET = 323 # R--C +NV_CTRL_THERMAL_COOLER_TARGET_NONE = 0 +NV_CTRL_THERMAL_COOLER_TARGET_GPU = 1 +NV_CTRL_THERMAL_COOLER_TARGET_MEMORY = 2 +NV_CTRL_THERMAL_COOLER_TARGET_POWER_SUPPLY = 4 +NV_CTRL_THERMAL_COOLER_TARGET_GPU_RELATED = NV_CTRL_THERMAL_COOLER_TARGET_GPU | NV_CTRL_THERMAL_COOLER_TARGET_MEMORY | NV_CTRL_THERMAL_COOLER_TARGET_POWER_SUPPLY + +# +# NV_CTRL_GPU_ECC_SUPPORTED - Reports whether ECC is supported by the +# targeted GPU. +# +NV_CTRL_GPU_ECC_SUPPORTED = 324 # R--G +NV_CTRL_GPU_ECC_SUPPORTED_FALSE = 0 +NV_CTRL_GPU_ECC_SUPPORTED_TRUE = 1 + +# +# NV_CTRL_GPU_ECC_STATUS - Returns the current hardware ECC setting +# for the targeted GPU. +# +NV_CTRL_GPU_ECC_STATUS = 325 # R--G +NV_CTRL_GPU_ECC_STATUS_DISABLED = 0 +NV_CTRL_GPU_ECC_STATUS_ENABLED = 1 + +# +# NV_CTRL_GPU_ECC_CONFIGURATION - Reports whether ECC can be configured +# dynamically for the GPU in question. +# +NV_CTRL_GPU_ECC_CONFIGURATION_SUPPORTED = 326 # R--G +NV_CTRL_GPU_ECC_CONFIGURATION_SUPPORTED_FALSE = 0 +NV_CTRL_GPU_ECC_CONFIGURATION_SUPPORTED_TRUE = 1 + +# +# NV_CTRL_GPU_ECC_CONFIGURATION_SETTING - Returns the current ECC +# configuration setting or specifies new settings. New settings do not +# take effect until the next POST. +# +NV_CTRL_GPU_ECC_CONFIGURATION = 327 # RW-G +NV_CTRL_GPU_ECC_CONFIGURATION_DISABLED = 0 +NV_CTRL_GPU_ECC_CONFIGURATION_ENABLED = 1 + +# +# NV_CTRL_GPU_ECC_DEFAULT_CONFIGURATION_SETTING - Returns the default +# ECC configuration setting. +# +NV_CTRL_GPU_ECC_DEFAULT_CONFIGURATION = 328 # R--G +NV_CTRL_GPU_ECC_DEFAULT_CONFIGURATION_DISABLED = 0 +NV_CTRL_GPU_ECC_DEFAULT_CONFIGURATION_ENABLED = 1 + +# +# NV_CTRL_GPU_ECC_SINGLE_BIT_ERRORS - Returns the number of single-bit +# ECC errors detected by the targeted GPU since the last POST. +# Note: this attribute is a 64-bit integer attribute. +# +NV_CTRL_GPU_ECC_SINGLE_BIT_ERRORS = 329 # R--GQ + +# +# NV_CTRL_GPU_ECC_DOUBLE_BIT_ERRORS - Returns the number of double-bit +# ECC errors detected by the targeted GPU since the last POST. +# Note: this attribute is a 64-bit integer attribute. +# +NV_CTRL_GPU_ECC_DOUBLE_BIT_ERRORS = 330 # R--GQ + +# +# NV_CTRL_GPU_ECC_AGGREGATE_SINGLE_BIT_ERRORS - Returns the number of +# single-bit ECC errors detected by the targeted GPU since the +# last counter reset. +# Note: this attribute is a 64-bit integer attribute. +# +NV_CTRL_GPU_ECC_AGGREGATE_SINGLE_BIT_ERRORS = 331 # R--GQ + +# +# NV_CTRL_GPU_ECC_AGGREGATE_DOUBLE_BIT_ERRORS - Returns the number of +# double-bit ECC errors detected by the targeted GPU since the +# last counter reset. +# Note: this attribute is a 64-bit integer attribute. +# +NV_CTRL_GPU_ECC_AGGREGATE_DOUBLE_BIT_ERRORS = 332 # R--GQ + +# +# NV_CTRL_GPU_ECC_RESET_ERROR_STATUS - Resets the volatile/aggregate +# single-bit and double-bit error counters. This attribute is a +# bitmask attribute. +# +NV_CTRL_GPU_ECC_RESET_ERROR_STATUS = 333 # -W-G +NV_CTRL_GPU_ECC_RESET_ERROR_STATUS_VOLATILE = 0x00000001 +NV_CTRL_GPU_ECC_RESET_ERROR_STATUS_AGGREGATE = 0x00000002 + +# +# NV_CTRL_GPU_POWER_MIZER_MODE - Provides a hint to the driver +# as to how to manage the performance of the GPU. +# +# ADAPTIVE - adjust GPU clocks based on GPU +# utilization +# PREFER_MAXIMUM_PERFORMANCE - raise GPU clocks to favor +# maximum performance, to the extent +# that thermal and other constraints +# allow +# AUTO - let the driver choose the performance +# policy +# PREFER_CONSISTENT_PERFORMANCE - lock to GPU base clocks +# +NV_CTRL_GPU_POWER_MIZER_MODE = 334 # RW-G +NV_CTRL_GPU_POWER_MIZER_MODE_ADAPTIVE = 0 +NV_CTRL_GPU_POWER_MIZER_MODE_PREFER_MAXIMUM_PERFORMANCE = 1 +NV_CTRL_GPU_POWER_MIZER_MODE_AUTO = 2 +NV_CTRL_GPU_POWER_MIZER_MODE_PREFER_CONSISTENT_PERFORMANCE = 3 + +# +# NV_CTRL_GVI_SYNC_OUTPUT_FORMAT - Returns the output sync signal +# from the GVI device. +# + +NV_CTRL_GVI_SYNC_OUTPUT_FORMAT = 335 # R--I + +# +# NV_CTRL_GVI_MAX_CHANNELS_PER_JACK - Returns the maximum +# supported number of (logical) channels within a single physical jack of +# a GVI device. For most SDI video formats, there is only one channel +# (channel 0). But for 3G video formats (as specified in SMPTE 425), +# as an example, there are two channels (channel 0 and channel 1) per +# physical jack. +# + +NV_CTRL_GVI_MAX_CHANNELS_PER_JACK = 336 # R--I + +# +# NV_CTRL_GVI_MAX_STREAMS - Returns the maximum number of streams +# that can be configured on the GVI device. +# + +NV_CTRL_GVI_MAX_STREAMS = 337 # R--I + +# +# NV_CTRL_GVI_NUM_CAPTURE_SURFACES - The GVI interface exposed through +# NV-CONTROL and the GLX_NV_video_input extension uses internal capture +# surfaces when frames are read from the GVI device. The +# NV_CTRL_GVI_NUM_CAPTURE_SURFACES can be used to query and assign the +# number of capture surfaces. This attribute is applied when +# glXBindVideoCaptureDeviceNV() is called by the application. +# +# A lower number of capture surfaces will mean less video memory is used, +# but can result in frames being dropped if the application cannot keep up +# with the capture device. A higher number will prevent frames from being +# dropped, making capture more reliable but will consume move video memory. +# +NV_CTRL_GVI_NUM_CAPTURE_SURFACES = 338 # RW-I + +# +# NV_CTRL_OVERSCAN_COMPENSATION - not supported +# +NV_CTRL_OVERSCAN_COMPENSATION = 339 # not supported + +# +# NV_CTRL_GPU_PCIE_GENERATION - Reports the current PCIe generation. +# +NV_CTRL_GPU_PCIE_GENERATION = 341 # R--GI +NV_CTRL_GPU_PCIE_GENERATION1 = 0x00000001 +NV_CTRL_GPU_PCIE_GENERATION2 = 0x00000002 +NV_CTRL_GPU_PCIE_GENERATION3 = 0x00000003 + +# +# NV_CTRL_GVI_BOUND_GPU - Returns the NV_CTRL_TARGET_TYPE_GPU target_id of +# the GPU currently bound to the GVI device. Returns -1 if no GPU is +# currently bound to the GVI device. +# +NV_CTRL_GVI_BOUND_GPU = 342 # R--I + +# +# NV_CTRL_GVIO_REQUESTED_VIDEO_FORMAT3 - this attribute is only +# intended to be used to query the ValidValues for +# NV_CTRL_GVIO_REQUESTED_VIDEO_FORMAT for VIDEO_FORMAT values between +# 64 and 95. See NV_CTRL_GVIO_REQUESTED_VIDEO_FORMAT for details. +# + +NV_CTRL_GVIO_REQUESTED_VIDEO_FORMAT3 = 343 # ---GI + +# +# NV_CTRL_ACCELERATE_TRAPEZOIDS - Toggles RENDER Trapezoid acceleration +# + +NV_CTRL_ACCELERATE_TRAPEZOIDS = 344 # RW- +NV_CTRL_ACCELERATE_TRAPEZOIDS_DISABLE = 0 +NV_CTRL_ACCELERATE_TRAPEZOIDS_ENABLE = 1 + +# +# NV_CTRL_GPU_CORES - Returns number of GPU cores supported by the graphics +# pipeline. +# + +NV_CTRL_GPU_CORES = 345 # R--G + +# +# NV_CTRL_GPU_MEMORY_BUS_WIDTH - Returns memory bus bandwidth on the associated +# subdevice. +# + +NV_CTRL_GPU_MEMORY_BUS_WIDTH = 346 # R--G + +# +# NV_CTRL_GVI_TEST_MODE - This attribute controls the GVI test mode. When +# enabled, the GVI device will generate fake data as quickly as possible. All +# GVI settings are still valid when this is enabled (e.g., the requested video +# format is honored and sets the video size). +# This may be used to test the pipeline. +# + +NV_CTRL_GVI_TEST_MODE = 347 # R--I +NV_CTRL_GVI_TEST_MODE_DISABLE = 0 +NV_CTRL_GVI_TEST_MODE_ENABLE = 1 + +# +# NV_CTRL_COLOR_SPACE - This option controls the preferred color space of the +# video signal. This may not match the current color space depending on the +# current mode on this display. +# +# NV_CTRL_CURRENT_COLOR_SPACE will reflect the actual color space in use. +# +NV_CTRL_COLOR_SPACE = 348 # RWDG +NV_CTRL_COLOR_SPACE_RGB = 0 +NV_CTRL_COLOR_SPACE_YCbCr422 = 1 +NV_CTRL_COLOR_SPACE_YCbCr444 = 2 + +# +# NV_CTRL_COLOR_RANGE - This option controls the preferred color range of the +# video signal. +# +# If the current color space requires it, the actual color range will be +# limited. +# +# NV_CTRL_CURRENT_COLOR_RANGE will reflect the actual color range in use. +# +NV_CTRL_COLOR_RANGE = 349 # RWDG +NV_CTRL_COLOR_RANGE_FULL = 0 +NV_CTRL_COLOR_RANGE_LIMITED = 1 + +# +# NV_CTRL_GPU_SCALING_DEFAULT_TARGET - not supported +# + +NV_CTRL_GPU_SCALING_DEFAULT_TARGET = 350 # not supported + +# +# NV_CTRL_GPU_SCALING_DEFAULT_METHOD - not supported +# + +NV_CTRL_GPU_SCALING_DEFAULT_METHOD = 351 # not supported + +# +# NV_CTRL_DITHERING_MODE - Controls the dithering mode, when +# NV_CTRL_CURRENT_DITHERING is Enabled. +# +# AUTO: allow the driver to choose the dithering mode automatically. +# +# DYNAMIC_2X2: use a 2x2 matrix to dither from the GPU's pixel +# pipeline to the bit depth of the flat panel. The matrix values +# are changed from frame to frame. +# +# STATIC_2X2: use a 2x2 matrix to dither from the GPU's pixel +# pipeline to the bit depth of the flat panel. The matrix values +# do not change from frame to frame. +# +# TEMPORAL: use a pseudorandom value from a uniform distribution calculated at +# every pixel to achieve stochastic dithering. This method produces a better +# visual result than 2x2 matrix approaches. +# +NV_CTRL_DITHERING_MODE = 352 # RWDG +NV_CTRL_DITHERING_MODE_AUTO = 0 +NV_CTRL_DITHERING_MODE_DYNAMIC_2X2 = 1 +NV_CTRL_DITHERING_MODE_STATIC_2X2 = 2 +NV_CTRL_DITHERING_MODE_TEMPORAL = 3 + +# +# NV_CTRL_CURRENT_DITHERING - Returns the current dithering state. +# +NV_CTRL_CURRENT_DITHERING = 353 # R-DG +NV_CTRL_CURRENT_DITHERING_DISABLED = 0 +NV_CTRL_CURRENT_DITHERING_ENABLED = 1 + +# +# NV_CTRL_CURRENT_DITHERING_MODE - Returns the current dithering +# mode. +# +NV_CTRL_CURRENT_DITHERING_MODE = 354 # R-DG +NV_CTRL_CURRENT_DITHERING_MODE_NONE = 0 +NV_CTRL_CURRENT_DITHERING_MODE_DYNAMIC_2X2 = 1 +NV_CTRL_CURRENT_DITHERING_MODE_STATIC_2X2 = 2 +NV_CTRL_CURRENT_DITHERING_MODE_TEMPORAL = 3 + +# +# NV_CTRL_THERMAL_SENSOR_READING - Returns the thermal sensor's current +# reading. +# +NV_CTRL_THERMAL_SENSOR_READING = 355 # R--S + +# +# NV_CTRL_THERMAL_SENSOR_PROVIDER - Returns the hardware device that +# provides the thermal sensor. +# +NV_CTRL_THERMAL_SENSOR_PROVIDER = 356 # R--S +NV_CTRL_THERMAL_SENSOR_PROVIDER_NONE = 0 +NV_CTRL_THERMAL_SENSOR_PROVIDER_GPU_INTERNAL = 1 +NV_CTRL_THERMAL_SENSOR_PROVIDER_ADM1032 = 2 +NV_CTRL_THERMAL_SENSOR_PROVIDER_ADT7461 = 3 +NV_CTRL_THERMAL_SENSOR_PROVIDER_MAX6649 = 4 +NV_CTRL_THERMAL_SENSOR_PROVIDER_MAX1617 = 5 +NV_CTRL_THERMAL_SENSOR_PROVIDER_LM99 = 6 +NV_CTRL_THERMAL_SENSOR_PROVIDER_LM89 = 7 +NV_CTRL_THERMAL_SENSOR_PROVIDER_LM64 = 8 +NV_CTRL_THERMAL_SENSOR_PROVIDER_G781 = 9 +NV_CTRL_THERMAL_SENSOR_PROVIDER_ADT7473 = 10 +NV_CTRL_THERMAL_SENSOR_PROVIDER_SBMAX6649 = 11 +NV_CTRL_THERMAL_SENSOR_PROVIDER_VBIOSEVT = 12 +NV_CTRL_THERMAL_SENSOR_PROVIDER_OS = 13 +NV_CTRL_THERMAL_SENSOR_PROVIDER_UNKNOWN = 0xFFFFFFFF + +# +# NV_CTRL_THERMAL_SENSOR_TARGET - Returns what hardware component +# the thermal sensor is measuring. +# +NV_CTRL_THERMAL_SENSOR_TARGET = 357 # R--S +NV_CTRL_THERMAL_SENSOR_TARGET_NONE = 0 +NV_CTRL_THERMAL_SENSOR_TARGET_GPU = 1 +NV_CTRL_THERMAL_SENSOR_TARGET_MEMORY = 2 +NV_CTRL_THERMAL_SENSOR_TARGET_POWER_SUPPLY = 4 +NV_CTRL_THERMAL_SENSOR_TARGET_BOARD = 8 +NV_CTRL_THERMAL_SENSOR_TARGET_UNKNOWN = 0xFFFFFFFF + +# +# NV_CTRL_SHOW_MULTIGPU_VISUAL_INDICATOR - when TRUE, OpenGL will +# draw information about the current MULTIGPU mode. +# +NV_CTRL_SHOW_MULTIGPU_VISUAL_INDICATOR = 358 # RW-X +NV_CTRL_SHOW_MULTIGPU_VISUAL_INDICATOR_FALSE = 0 +NV_CTRL_SHOW_MULTIGPU_VISUAL_INDICATOR_TRUE = 1 + +# +# NV_CTRL_GPU_CURRENT_PROCESSOR_CLOCK_FREQS - Returns GPU's processor +# clock freqs. +# +NV_CTRL_GPU_CURRENT_PROCESSOR_CLOCK_FREQS = 359 # RW-G + +# +# NV_CTRL_GVIO_VIDEO_FORMAT_FLAGS - query the flags (various information +# for the specified NV_CTRL_GVIO_VIDEO_FORMAT_*. So that this can be +# queried with existing interfaces, the video format should be specified +# in the display_mask field; eg: +# +# XNVCTRLQueryTargetAttribute(dpy, +# NV_CTRL_TARGET_TYPE_GVI, +# gvi, +# NV_CTRL_GVIO_VIDEO_FORMAT_720P_60_00_SMPTE296, +# NV_CTRL_GVIO_VIDEO_FORMAT_FLAGS, +# &flags); +# +# Note: The NV_CTRL_GVIO_VIDEO_FORMAT_FLAGS_3G_1080P_NO_12BPC flag is set +# for those 1080P 3G modes (level A and B) that do not support +# 12 bits per component (when configuring a GVI stream.) +# + +NV_CTRL_GVIO_VIDEO_FORMAT_FLAGS = 360 # R--I +NV_CTRL_GVIO_VIDEO_FORMAT_FLAGS_NONE = 0x00000000 +NV_CTRL_GVIO_VIDEO_FORMAT_FLAGS_INTERLACED = 0x00000001 +NV_CTRL_GVIO_VIDEO_FORMAT_FLAGS_PROGRESSIVE = 0x00000002 +NV_CTRL_GVIO_VIDEO_FORMAT_FLAGS_PSF = 0x00000004 +NV_CTRL_GVIO_VIDEO_FORMAT_FLAGS_3G_LEVEL_A = 0x00000008 +NV_CTRL_GVIO_VIDEO_FORMAT_FLAGS_3G_LEVEL_B = 0x00000010 +NV_CTRL_GVIO_VIDEO_FORMAT_FLAGS_3G = NV_CTRL_GVIO_VIDEO_FORMAT_FLAGS_3G_LEVEL_A | NV_CTRL_GVIO_VIDEO_FORMAT_FLAGS_3G_LEVEL_B +NV_CTRL_GVIO_VIDEO_FORMAT_FLAGS_3G_1080P_NO_12BPC = 0x00000020 + +# +# NV_CTRL_GPU_PCIE_MAX_LINK_SPEED - returns maximum PCIe link speed, +# in gigatransfers per second (GT/s). +# + +NV_CTRL_GPU_PCIE_MAX_LINK_SPEED = 361 # R--GI + +# +# NV_CTRL_3D_VISION_PRO_RESET_TRANSCEIVER_TO_FACTORY_SETTINGS - Resets the +# 3D Vision Pro transceiver to its factory settings. +# +NV_CTRL_3D_VISION_PRO_RESET_TRANSCEIVER_TO_FACTORY_SETTINGS = 363 # -W-T + +# +# NV_CTRL_3D_VISION_PRO_TRANSCEIVER_CHANNEL - Controls the channel that is +# currently used by the 3D Vision Pro transceiver. +# +NV_CTRL_3D_VISION_PRO_TRANSCEIVER_CHANNEL = 364 # RW-T + +# +# NV_CTRL_3D_VISION_PRO_TRANSCEIVER_MODE - Controls the mode in which the +# 3D Vision Pro transceiver operates. +# NV_CTRL_3D_VISION_PRO_TM_LOW_RANGE is bidirectional +# NV_CTRL_3D_VISION_PRO_TM_MEDIUM_RANGE is bidirectional +# NV_CTRL_3D_VISION_PRO_TM_HIGH_RANGE may be bidirectional just up to a +# given range, and unidirectional beyond it +# NV_CTRL_3D_VISION_PRO_TM_COUNT is the total number of +# 3D Vision Pro transceiver modes +# +NV_CTRL_3D_VISION_PRO_TRANSCEIVER_MODE = 365 # RW-T +NV_CTRL_3D_VISION_PRO_TRANSCEIVER_MODE_INVALID = 0 +NV_CTRL_3D_VISION_PRO_TRANSCEIVER_MODE_LOW_RANGE = 1 +NV_CTRL_3D_VISION_PRO_TRANSCEIVER_MODE_MEDIUM_RANGE = 2 +NV_CTRL_3D_VISION_PRO_TRANSCEIVER_MODE_HIGH_RANGE = 3 +NV_CTRL_3D_VISION_PRO_TRANSCEIVER_MODE_COUNT = 4 + +# +# NV_CTRL_SYNCHRONOUS_PALETTE_UPDATES - controls whether updates to the color +# lookup table (LUT) are synchronous with respect to X rendering. For example, +# if an X client sends XStoreColors followed by XFillRectangle, the driver will +# guarantee that the FillRectangle request is not processed until after the +# updated LUT colors are actually visible on the screen if +# NV_CTRL_SYNCHRONOUS_PALETTE_UPDATES is enabled. Otherwise, the rendering may +# occur first. +# +# This makes a difference for applications that use the LUT to animate, such as +# XPilot. If you experience flickering in applications that use LUT +# animations, try enabling this attribute. +# +# When synchronous updates are enabled, XStoreColors requests will be processed +# at your screen's refresh rate. +# + +NV_CTRL_SYNCHRONOUS_PALETTE_UPDATES = 367 # RWDG +NV_CTRL_SYNCHRONOUS_PALETTE_UPDATES_DISABLE = 0 +NV_CTRL_SYNCHRONOUS_PALETTE_UPDATES_ENABLE = 1 + +# +# NV_CTRL_DITHERING_DEPTH - Controls the dithering depth when +# NV_CTRL_CURRENT_DITHERING is ENABLED. Some displays connected +# to the GPU via the DVI or LVDS interfaces cannot display the +# full color range of ten bits per channel, so the GPU will +# dither to either 6 or 8 bits per channel. +# +NV_CTRL_DITHERING_DEPTH = 368 # RWDG +NV_CTRL_DITHERING_DEPTH_AUTO = 0 +NV_CTRL_DITHERING_DEPTH_6_BITS = 1 +NV_CTRL_DITHERING_DEPTH_8_BITS = 2 + +# +# NV_CTRL_CURRENT_DITHERING_DEPTH - Returns the current dithering +# depth value. +# +NV_CTRL_CURRENT_DITHERING_DEPTH = 369 # R-DG +NV_CTRL_CURRENT_DITHERING_DEPTH_NONE = 0 +NV_CTRL_CURRENT_DITHERING_DEPTH_6_BITS = 1 +NV_CTRL_CURRENT_DITHERING_DEPTH_8_BITS = 2 + +# +# NV_CTRL_3D_VISION_PRO_TRANSCEIVER_CHANNEL_FREQUENCY - Returns the +# frequency of the channel(in kHz) of the 3D Vision Pro transceiver. +# Use the display_mask parameter to specify the channel number. +# +NV_CTRL_3D_VISION_PRO_TRANSCEIVER_CHANNEL_FREQUENCY = 370 # R--T + +# +# NV_CTRL_3D_VISION_PRO_TRANSCEIVER_CHANNEL_QUALITY - Returns the +# quality of the channel(in percentage) of the 3D Vision Pro transceiver. +# Use the display_mask parameter to specify the channel number. +# +NV_CTRL_3D_VISION_PRO_TRANSCEIVER_CHANNEL_QUALITY = 371 # R--T + +# +# NV_CTRL_3D_VISION_PRO_TRANSCEIVER_CHANNEL_COUNT - Returns the number of +# channels on the 3D Vision Pro transceiver. +# +NV_CTRL_3D_VISION_PRO_TRANSCEIVER_CHANNEL_COUNT = 372 # R--T + +# +# NV_CTRL_3D_VISION_PRO_PAIR_GLASSES - Puts the 3D Vision Pro +# transceiver into pairing mode to gather additional glasses. +# NV_CTRL_3D_VISION_PRO_PAIR_GLASSES_STOP - stops any pairing +# NV_CTRL_3D_VISION_PRO_PAIR_GLASSES_BEACON - starts continuous +# pairing via beacon mode +# Any other value, N - Puts the 3D Vision Pro transceiver into +# authenticated pairing mode for N seconds. +# +NV_CTRL_3D_VISION_PRO_PAIR_GLASSES = 373 # -W-T +NV_CTRL_3D_VISION_PRO_PAIR_GLASSES_STOP = 0 +NV_CTRL_3D_VISION_PRO_PAIR_GLASSES_BEACON = 0xFFFFFFFF + +# +# NV_CTRL_3D_VISION_PRO_UNPAIR_GLASSES - Tells a specific pair +# of glasses to unpair. The glasses will "forget" the address +# of the 3D Vision Pro transceiver to which they have been paired. +# To unpair all the currently paired glasses, specify +# the glasses id as 0. +# +NV_CTRL_3D_VISION_PRO_UNPAIR_GLASSES = 374 # -W-T + +# +# NV_CTRL_3D_VISION_PRO_DISCOVER_GLASSES - Tells the 3D Vision Pro +# transceiver about the glasses that have been paired using +# NV_CTRL_3D_VISION_PRO_PAIR_GLASSES_BEACON. Unless this is done, +# the 3D Vision Pro transceiver will not know about glasses paired in +# beacon mode. +# +NV_CTRL_3D_VISION_PRO_DISCOVER_GLASSES = 375 # -W-T + +# +# NV_CTRL_3D_VISION_PRO_IDENTIFY_GLASSES - Causes glasses LEDs to +# flash for a short period of time. +# +NV_CTRL_3D_VISION_PRO_IDENTIFY_GLASSES = 376 # -W-T + +# +# NV_CTRL_3D_VISION_PRO_GLASSES_SYNC_CYCLE - Controls the +# sync cycle duration(in milliseconds) of the glasses. +# Use the display_mask parameter to specify the glasses id. +# +NV_CTRL_3D_VISION_PRO_GLASSES_SYNC_CYCLE = 378 # RW-T + +# +# NV_CTRL_3D_VISION_PRO_GLASSES_MISSED_SYNC_CYCLES - Returns the +# number of state sync cycles recently missed by the glasses. +# Use the display_mask parameter to specify the glasses id. +# +NV_CTRL_3D_VISION_PRO_GLASSES_MISSED_SYNC_CYCLES = 379 # R--T + +# +# NV_CTRL_3D_VISION_PRO_GLASSES_BATTERY_LEVEL - Returns the +# battery level(in percentage) of the glasses. +# Use the display_mask parameter to specify the glasses id. +# +NV_CTRL_3D_VISION_PRO_GLASSES_BATTERY_LEVEL = 380 # R--T + +# +# NV_CTRL_GVO_ANC_PARITY_COMPUTATION - Controls the SDI device's computation +# of the parity bit (bit 8) for ANC data words. +# + +NV_CTRL_GVO_ANC_PARITY_COMPUTATION = 381 # RW--- +NV_CTRL_GVO_ANC_PARITY_COMPUTATION_AUTO = 0 +NV_CTRL_GVO_ANC_PARITY_COMPUTATION_ON = 1 +NV_CTRL_GVO_ANC_PARITY_COMPUTATION_OFF = 2 + +# +# NV_CTRL_3D_VISION_PRO_GLASSES_PAIR_EVENT - This attribute is sent +# as an event when glasses get paired in response to pair command +# from any of the clients. +# +NV_CTRL_3D_VISION_PRO_GLASSES_PAIR_EVENT = 382 # ---T + +# +# NV_CTRL_3D_VISION_PRO_GLASSES_UNPAIR_EVENT - This attribute is sent +# as an event when glasses get unpaired in response to unpair command +# from any of the clients. +# +NV_CTRL_3D_VISION_PRO_GLASSES_UNPAIR_EVENT = 383 # ---T + +# +# NV_CTRL_GPU_PCIE_CURRENT_LINK_WIDTH - returns the current +# PCIe link width, in number of lanes. +# +NV_CTRL_GPU_PCIE_CURRENT_LINK_WIDTH = 384 # R--GI + +# +# NV_CTRL_GPU_PCIE_CURRENT_LINK_SPEED - returns the current +# PCIe link speed, in megatransfers per second (GT/s). +# +NV_CTRL_GPU_PCIE_CURRENT_LINK_SPEED = 385 # R--GI + +# +# NV_CTRL_GVO_AUDIO_BLANKING - specifies whether the GVO device should delete +# audio ancillary data packets when frames are repeated. +# +# When a new frame is not ready in time, the current frame, including all +# ancillary data packets, is repeated. When this data includes audio packets, +# this can result in stutters or clicks. When this option is enabled, the GVO +# device will detect when frames are repeated, identify audio ancillary data +# packets, and mark them for deletion. +# +# This option is applied when the GVO device is bound. +# +NV_CTRL_GVO_AUDIO_BLANKING = 386 # RW- +NV_CTRL_GVO_AUDIO_BLANKING_DISABLE = 0 +NV_CTRL_GVO_AUDIO_BLANKING_ENABLE = 1 + +# +# NV_CTRL_CURRENT_METAMODE_ID - switch modes to the MetaMode with +# the specified ID. +# +NV_CTRL_CURRENT_METAMODE_ID = 387 # RW- + +# +# NV_CTRL_DISPLAY_ENABLED - Returns whether or not the display device +# is currently enabled. +# +NV_CTRL_DISPLAY_ENABLED = 388 # R-D +NV_CTRL_DISPLAY_ENABLED_TRUE = 1 +NV_CTRL_DISPLAY_ENABLED_FALSE = 0 + +# +# NV_CTRL_FRAMELOCK_INCOMING_HOUSE_SYNC_RATE: this is the rate +# of an incomming house sync signal to the frame lock board, in milliHz. +# +# This attribute may be queried through XNVCTRLQueryTargetAttribute() +# using a NV_CTRL_TARGET_TYPE_FRAMELOCK or NV_CTRL_TARGET_TYPE_X_SCREEN +# target. +# +NV_CTRL_FRAMELOCK_INCOMING_HOUSE_SYNC_RATE = 389 # R--F + +# +# NV_CTRL_FXAA - enables FXAA. A pixel shader based anti- +# aliasing method. +# +NV_CTRL_FXAA = 390 # RW-X +NV_CTRL_FXAA_DISABLE = 0 +NV_CTRL_FXAA_ENABLE = 1 + +# +# NV_CTRL_DISPLAY_RANDR_OUTPUT_ID - the RandR Output ID (type RROutput) +# that corresponds to the specified Display Device target. If a new +# enough version of RandR is not available in the X server, +# DISPLAY_RANDR_OUTPUT_ID will be 0. +# +NV_CTRL_DISPLAY_RANDR_OUTPUT_ID = 391 # R-D- + +# +# NV_CTRL_FRAMELOCK_DISPLAY_CONFIG - Configures whether the display device +# should listen, ignore or drive the framelock sync signal. +# +# Note that whether or not a display device may be set as a client/server +# depends on the current configuration. For example, only one server may be +# set per Quadro Sync device, and displays can only be configured as a client +# if their refresh rate sufficiently matches the refresh rate of the server +# device. +# +# Note that when querying the ValidValues for this data type, the values are +# reported as bits within a bitmask (ATTRIBUTE_TYPE_INT_BITS); +# +NV_CTRL_FRAMELOCK_DISPLAY_CONFIG = 392 # RWD +NV_CTRL_FRAMELOCK_DISPLAY_CONFIG_DISABLED = 0 +NV_CTRL_FRAMELOCK_DISPLAY_CONFIG_CLIENT = 1 +NV_CTRL_FRAMELOCK_DISPLAY_CONFIG_SERVER = 2 + +# +# NV_CTRL_TOTAL_DEDICATED_GPU_MEMORY - Returns the total amount of dedicated +# GPU video memory, in MB, on the specified GPU. This excludes any TurboCache +# padding included in the value returned by NV_CTRL_TOTAL_GPU_MEMORY. +# +NV_CTRL_TOTAL_DEDICATED_GPU_MEMORY = 393 # R--G + +# +# NV_CTRL_USED_DEDICATED_GPU_MEMORY- Returns the amount of video memory +# currently used on the graphics card in MB. +# +NV_CTRL_USED_DEDICATED_GPU_MEMORY = 394 # R--G + +# +# NV_CTRL_GPU_DOUBLE_PRECISION_BOOST_IMMEDIATE +# Some GPUs can make a tradeoff between double-precision floating-point +# performance and clock speed. Enabling double-precision floating point +# performance may benefit CUDA or OpenGL applications that require high +# bandwidth double-precision performance. Disabling this feature may benefit +# graphics applications that require higher clock speeds. +# +# This attribute is only available when toggling double precision boost +# can be done immediately (without need for a rebooot). +# +NV_CTRL_GPU_DOUBLE_PRECISION_BOOST_IMMEDIATE = 395 # RW-G +NV_CTRL_GPU_DOUBLE_PRECISION_BOOST_IMMEDIATE_DISABLED = 0 +NV_CTRL_GPU_DOUBLE_PRECISION_BOOST_IMMEDIATE_ENABLED = 1 + +# +# NV_CTRL_GPU_DOUBLE_PRECISION_BOOST_REBOOT +# Some GPUs can make a tradeoff between double-precision floating-point +# performance and clock speed. Enabling double-precision floating point +# performance may benefit CUDA or OpenGL applications that require high +# bandwidth double-precision performance. Disabling this feature may benefit +# graphics applications that require higher clock speeds. +# +# This attribute is only available when toggling double precision boost +# requires a reboot. +# + +NV_CTRL_GPU_DOUBLE_PRECISION_BOOST_REBOOT = 396 # RW-G +NV_CTRL_GPU_DOUBLE_PRECISION_BOOST_REBOOT_DISABLED = 0 +NV_CTRL_GPU_DOUBLE_PRECISION_BOOST_REBOOT_ENALED = 1 + +# +# NV_CTRL_DPY_HDMI_3D - Returns whether the specified display device is +# currently using HDMI 3D Frame Packed Stereo mode. Clients may use this +# to help interpret the refresh rate returned by NV_CTRL_REFRESH_RATE or +# NV_CTRL_REFRESH_RATE_3, which will be doubled when using HDMI 3D mode. +# +# This attribute may be queried through XNVCTRLQueryTargetAttribute() +# using a NV_CTRL_TARGET_TYPE_GPU target. +# + +NV_CTRL_DPY_HDMI_3D = 397 # R-DG +NV_CTRL_DPY_HDMI_3D_DISABLED = 0 +NV_CTRL_DPY_HDMI_3D_ENABLED = 1 + +# +# NV_CTRL_BASE_MOSAIC - Returns whether Base Mosaic is currently enabled on the +# given GPU. Querying the valid values of this attribute returns capabilities. +# + +NV_CTRL_BASE_MOSAIC = 398 # R--G +NV_CTRL_BASE_MOSAIC_DISABLED = 0 +NV_CTRL_BASE_MOSAIC_FULL = 1 +NV_CTRL_BASE_MOSAIC_LIMITED = 2 + +# +# NV_CTRL_MULTIGPU_MASTER_POSSIBLE - Returns whether the GPU can be configured +# as the master GPU in a Multi GPU configuration (SLI, SLI Mosaic, +# Base Mosaic). +# + +NV_CTRL_MULTIGPU_MASTER_POSSIBLE = 399 # R--G +NV_CTRL_MULTIGPU_MASTER_POSSIBLE_FALSE = 0 +NV_CTRL_MULTIGPU_MASTER_POSSIBLE_TRUE = 1 + +# +# NV_CTRL_GPU_POWER_MIZER_DEFAULT_MODE - Returns the default PowerMizer mode +# for the given GPU. +# +NV_CTRL_GPU_POWER_MIZER_DEFAULT_MODE = 400 # R--G + +# +# NV_CTRL_XV_SYNC_TO_DISPLAY_ID - When XVideo Sync To VBlank is enabled, this +# controls which display device will be synched to if the display is enabled. +# Returns NV_CTRL_XV_SYNC_TO_DISPLAY_ID_AUTO if no display has been +# selected. +# +NV_CTRL_XV_SYNC_TO_DISPLAY_ID = 401 # RW- +NV_CTRL_XV_SYNC_TO_DISPLAY_ID_AUTO = 0xFFFFFFFF + +# +# NV_CTRL_BACKLIGHT_BRIGHTNESS - The backlight brightness of an internal panel. +# +NV_CTRL_BACKLIGHT_BRIGHTNESS = 402 # RWD- + +# +# NV_CTRL_GPU_LOGO_BRIGHTNESS - Controls brightness +# of the logo on the GPU, if any. The value is variable from 0% - 100%. +# +NV_CTRL_GPU_LOGO_BRIGHTNESS = 403 # RW-G + +# +# NV_CTRL_GPU_SLI_LOGO_BRIGHTNESS - Controls brightness of the logo +# on the SLI bridge, if any. The value is variable from 0% - 100%. +# +NV_CTRL_GPU_SLI_LOGO_BRIGHTNESS = 404 # RW-G + +# +# NV_CTRL_THERMAL_COOLER_SPEED - Returns cooler's current operating speed in +# rotations per minute (RPM). +# + +NV_CTRL_THERMAL_COOLER_SPEED = 405 # R--C + +# +# NV_CTRL_PALETTE_UPDATE_EVENT - The Color Palette has been changed and the +# color correction info needs to be updated. +# + +NV_CTRL_PALETTE_UPDATE_EVENT = 406 # --- + +# +# NV_CTRL_VIDEO_ENCODER_UTILIZATION - Returns the video encoder engine +# utilization as a percentage. +# +NV_CTRL_VIDEO_ENCODER_UTILIZATION = 407 # R--G + +# +# NV_CTRL_GSYNC_ALLOWED - when TRUE, OpenGL will enable G-SYNC when possible; +# when FALSE, OpenGL will always use a fixed monitor refresh rate. +# + +NV_CTRL_GSYNC_ALLOWED = 408 # RW-X +NV_CTRL_GSYNC_ALLOWED_FALSE = 0 +NV_CTRL_GSYNC_ALLOWED_TRUE = 1 + +# +# NV_CTRL_GPU_NVCLOCK_OFFSET - This attribute controls the GPU clock offsets +# (in MHz) used for overclocking per performance level. +# Use the display_mask parameter to specify the performance level. +# +# Note: To enable overclocking support, set the X configuration +# option "Coolbits" to value "8". +# +# This offset can have any integer value between +# NVCTRLAttributeValidValues.u.range.min and +# NVCTRLAttributeValidValues.u.range.max (inclusive). +# +# This attribute is available on GeForce GTX 400 series and later +# Geforce GPUs. +# +NV_CTRL_GPU_NVCLOCK_OFFSET = 409 # RW-G + +# +# NV_CTRL_GPU_MEM_TRANSFER_RATE_OFFSET - This attribute controls +# the memory transfer rate offsets (in MHz) used for overclocking +# per performance level. +# Use the display_mask parameter to specify the performance level. +# +# Note: To enable overclocking support, set the X configuration +# option "Coolbits" to value "8". +# +# This offset can have any integer value between +# NVCTRLAttributeValidValues.u.range.min and +# NVCTRLAttributeValidValues.u.range.max (inclusive). +# +# This attribute is available on GeForce GTX 400 series and later +# Geforce GPUs. +# +NV_CTRL_GPU_MEM_TRANSFER_RATE_OFFSET = 410 # RW-G + +# +# NV_CTRL_VIDEO_DECODER_UTILIZATION - Returns the video decoder engine +# utilization as a percentage. +# +NV_CTRL_VIDEO_DECODER_UTILIZATION = 411 # R--G + +# +# NV_CTRL_GPU_OVER_VOLTAGE_OFFSET - This attribute controls +# the overvoltage offset in microvolts (uV). +# +# Note: To enable overvoltage support, set the X configuration +# option "Coolbits" to value "16". +# +# This offset can have any integer value between +# NVCTRLAttributeValidValues.u.range.min and +# NVCTRLAttributeValidValues.u.range.max (inclusive). +# +# This attribute is available on GeForce GTX 400 series and later +# Geforce GPUs. +# + +NV_CTRL_GPU_OVER_VOLTAGE_OFFSET = 412 # RW-G + +# +# NV_CTRL_GPU_CURRENT_CORE_VOLTAGE - This attribute returns the +# GPU's current operating voltage in microvolts (uV). +# +# This attribute is available on GPUs that support +# NV_CTRL_GPU_OVER_VOLTAGE_OFFSET. +# +NV_CTRL_GPU_CURRENT_CORE_VOLTAGE = 413 # R--G + +# +# NV_CTRL_CURRENT_COLOR_SPACE - Returns the current color space of the video +# signal. +# +# This will match NV_CTRL_COLOR_SPACE unless the current mode on this display +# device is an HDMI 2.0 4K@60Hz mode and the display device or GPU does not +# support driving this mode in RGB, in which case YCbCr420 will be returned. +# +NV_CTRL_CURRENT_COLOR_SPACE = 414 # R-DG +NV_CTRL_CURRENT_COLOR_SPACE_RGB = 0 +NV_CTRL_CURRENT_COLOR_SPACE_YCbCr422 = 1 +NV_CTRL_CURRENT_COLOR_SPACE_YCbCr444 = 2 +NV_CTRL_CURRENT_COLOR_SPACE_YCbCr420 = 3 + +# +# NV_CTRL_CURRENT_COLOR_RANGE - Returns the current color range of the video +# signal. +# +NV_CTRL_CURRENT_COLOR_RANGE = 415 # R-DG +NV_CTRL_CURRENT_COLOR_RANGE_FULL = 0 +NV_CTRL_CURRENT_COLOR_RANGE_LIMITED = 1 + +# +# NV_CTRL_SHOW_GSYNC_VISUAL_INDICATOR - when TRUE, OpenGL will indicate when +# G-SYNC is in use for full-screen applications. +# + +NV_CTRL_SHOW_GSYNC_VISUAL_INDICATOR = 416 # RW-X +NV_CTRL_SHOW_GSYNC_VISUAL_INDICATOR_FALSE = 0 +NV_CTRL_SHOW_GSYNC_VISUAL_INDICATOR_TRUE = 1 + +# +# NV_CTRL_THERMAL_COOLER_CURRENT_LEVEL - Returns cooler's current +# operating level. This may fluctuate dynamically. When +# NV_CTRL_GPU_COOLER_MANUAL_CONTROL=TRUE, the driver attempts +# to make this match NV_CTRL_THERMAL_COOLER_LEVEL. When +# NV_CTRL_GPU_COOLER_MANUAL_CONTROL=FALSE, the driver adjusts the +# current level based on the needs of the GPU. +# + +NV_CTRL_THERMAL_COOLER_CURRENT_LEVEL = 417 # R--C + +# +# NV_CTRL_STEREO_SWAP_MODE - This attribute controls the swap mode when +# Quad-Buffered stereo is used. +# NV_CTRL_STEREO_SWAP_MODE_APPLICATION_CONTROL : Stereo swap mode is derived +# from the value of swap interval. +# If it's odd, the per eye swap mode is used. +# If it's even, the per eye pair swap mode is used. +# NV_CTRL_STEREO_SWAP_MODE_PER_EYE : The driver swaps each eye as it is ready. +# NV_CTRL_STEREO_SWAP_MODE_PER_EYE_PAIR : The driver waits for both eyes to +# complete rendering before swapping. +# + +NV_CTRL_STEREO_SWAP_MODE = 418 # RW-X +NV_CTRL_STEREO_SWAP_MODE_APPLICATION_CONTROL = 0 +NV_CTRL_STEREO_SWAP_MODE_PER_EYE = 1 +NV_CTRL_STEREO_SWAP_MODE_PER_EYE_PAIR = 2 + +# +# NV_CTRL_CURRENT_XV_SYNC_TO_DISPLAY_ID - When XVideo Sync To VBlank is +# enabled, this returns the display id of the device currently synched to. +# Returns NV_CTRL_XV_SYNC_TO_DISPLAY_ID_AUTO if no display is currently +# set. +# + +NV_CTRL_CURRENT_XV_SYNC_TO_DISPLAY_ID = 419 # R-- + +# +# NV_CTRL_GPU_FRAMELOCK_FIRMWARE_UNSUPPORTED - Returns true if the +# Quadro Sync card connected to this GPU has a firmware version incompatible +# with this GPU. +# + +NV_CTRL_GPU_FRAMELOCK_FIRMWARE_UNSUPPORTED = 420 # R--G +NV_CTRL_GPU_FRAMELOCK_FIRMWARE_UNSUPPORTED_FALSE = 0 +NV_CTRL_GPU_FRAMELOCK_FIRMWARE_UNSUPPORTED_TRUE = 1 + +# +# NV_CTRL_DISPLAYPORT_CONNECTOR_TYPE - Returns the connector type used by +# a DisplayPort display. +# + +NV_CTRL_DISPLAYPORT_CONNECTOR_TYPE = 421 # R-DG +NV_CTRL_DISPLAYPORT_CONNECTOR_TYPE_UNKNOWN = 0 +NV_CTRL_DISPLAYPORT_CONNECTOR_TYPE_DISPLAYPORT = 1 +NV_CTRL_DISPLAYPORT_CONNECTOR_TYPE_HDMI = 2 +NV_CTRL_DISPLAYPORT_CONNECTOR_TYPE_DVI = 3 +NV_CTRL_DISPLAYPORT_CONNECTOR_TYPE_VGA = 4 + +# +# NV_CTRL_DISPLAYPORT_IS_MULTISTREAM - Returns multi-stream support for +# DisplayPort displays. +# +NV_CTRL_DISPLAYPORT_IS_MULTISTREAM = 422 # R-DG + +# +# NV_CTRL_DISPLAYPORT_SINK_IS_AUDIO_CAPABLE - Returns whether a DisplayPort +# device supports audio. +# +NV_CTRL_DISPLAYPORT_SINK_IS_AUDIO_CAPABLE = 423 # R-DG + +# +# NV_CTRL_GPU_NVCLOCK_OFFSET_ALL_PERFORMANCE_LEVELS - This attribute +# controls the GPU clock offsets (in MHz) used for overclocking. +# The offset is applied to all performance levels. +# +# Note: To enable overclocking support, set the X configuration +# option "Coolbits" to value "8". +# +# This offset can have any integer value between +# NVCTRLAttributeValidValues.u.range.min and +# NVCTRLAttributeValidValues.u.range.max (inclusive). +# +# This attribute is available on GeForce GTX 1000 series and later +# Geforce GPUs. +# +NV_CTRL_GPU_NVCLOCK_OFFSET_ALL_PERFORMANCE_LEVELS = 424 # RW-G + +# +# NV_CTRL_GPU_MEM_TRANSFER_RATE_OFFSET_ALL_PERFORMANCE_LEVELS - This +# attribute controls the memory transfer rate offsets (in MHz) used +# for overclocking. The offset is applied to all performance levels. +# +# Note: To enable overclocking support, set the X configuration +# option "Coolbits" to value "8". +# +# This offset can have any integer value between +# NVCTRLAttributeValidValues.u.range.min and +# NVCTRLAttributeValidValues.u.range.max (inclusive). +# +# This attribute is available on GeForce GTX 1000 series and later +# Geforce GPUs. +# +NV_CTRL_GPU_MEM_TRANSFER_RATE_OFFSET_ALL_PERFORMANCE_LEVELS = 425 # RW-G + +# +# NV_CTRL_FRAMELOCK_FIRMWARE_VERSION - Queries the firmware major version of +# the Frame Lock device. +# +# This attribute must be queried through XNVCTRLQueryTargetAttribute() +# using a NV_CTRL_TARGET_TYPE_FRAMELOCK target. +# + +NV_CTRL_FRAMELOCK_FIRMWARE_VERSION = 426 # R--F + +# +# NV_CTRL_FRAMELOCK_FIRMWARE_MINOR_VERSION - Queries the firmware minor +# version of the Frame Lock device. +# +# This attribute must be queried through XNVCTRLQueryTargetAttribute() +# using a NV_CTRL_TARGET_TYPE_FRAMELOCK target. +# + +NV_CTRL_FRAMELOCK_FIRMWARE_MINOR_VERSION = 427 # R--F + +# +# NV_CTRL_SHOW_GRAPHICS_VISUAL_INDICATOR - when TRUE, graphics APIs will +# indicate various runtime information such as flip/blit, vsync status, API +# in use. +# + +NV_CTRL_SHOW_GRAPHICS_VISUAL_INDICATOR = 428 # RW-X +NV_CTRL_SHOW_GRAPHICS_VISUAL_INDICATOR_FALSE = 0 +NV_CTRL_SHOW_GRAPHICS_VISUAL_INDICATOR_TRUE = 1 + +NV_CTRL_LAST_ATTRIBUTE = NV_CTRL_SHOW_GRAPHICS_VISUAL_INDICATOR + +############################################################################ + +# +# String Attributes: +# +# String attributes can be queryied through the XNVCTRLQueryStringAttribute() +# and XNVCTRLQueryTargetStringAttribute() function calls. +# +# String attributes can be set through the XNVCTRLSetStringAttribute() +# function call. (There are currently no string attributes that can be +# set on non-X Screen targets.) +# +# Unless otherwise noted, all string attributes can be queried/set using an +# NV_CTRL_TARGET_TYPE_X_SCREEN target. Attributes that cannot take an +# NV_CTRL_TARGET_TYPE_X_SCREEN target also cannot be queried/set through +# XNVCTRLQueryStringAttribute()/XNVCTRLSetStringAttribute() (Since +# these assume an X Screen target). +# + + +# +# NV_CTRL_STRING_PRODUCT_NAME - the product name on which the +# specified X screen is running, or the product name of the specified +# Frame Lock device. +# +# This attribute may be queried through XNVCTRLQueryTargetStringAttribute() +# using a NV_CTRL_TARGET_TYPE_GPU or NV_CTRL_TARGET_TYPE_X_SCREEN target to +# return the product name of the GPU, or a NV_CTRL_TARGET_TYPE_FRAMELOCK to +# return the product name of the Frame Lock device. +# + +NV_CTRL_STRING_PRODUCT_NAME = 0 # R--GF + +# +# NV_CTRL_STRING_VBIOS_VERSION - the video bios version on the GPU on +# which the specified X screen is running. +# + +NV_CTRL_STRING_VBIOS_VERSION = 1 # R--G + +# +# NV_CTRL_STRING_NVIDIA_DRIVER_VERSION - string representation of the +# NVIDIA driver version number for the NVIDIA X driver in use. +# + +NV_CTRL_STRING_NVIDIA_DRIVER_VERSION = 3 # R--G + +# +# NV_CTRL_STRING_DISPLAY_DEVICE_NAME - name of the display device +# specified in the display_mask argument. +# +# This attribute may be queried through XNVCTRLQueryTargetStringAttribute() +# using a NV_CTRL_TARGET_TYPE_GPU or NV_CTRL_TARGET_TYPE_X_SCREEN target. +# + +NV_CTRL_STRING_DISPLAY_DEVICE_NAME = 4 # R-DG + +# +# NV_CTRL_STRING_TV_ENCODER_NAME - not supported +# + +NV_CTRL_STRING_TV_ENCODER_NAME = 5 # not supported + +# +# NV_CTRL_STRING_GVIO_FIRMWARE_VERSION - indicates the version of the +# Firmware on the GVIO device. +# + +NV_CTRL_STRING_GVIO_FIRMWARE_VERSION = 8 # R--I + +# +# NV_CTRL_STRING_GVO_FIRMWARE_VERSION - renamed +# +# NV_CTRL_STRING_GVIO_FIRMWARE_VERSION should be used instead. +# +NV_CTRL_STRING_GVO_FIRMWARE_VERSION = 8 # renamed + +# +# NV_CTRL_STRING_CURRENT_MODELINE - Return the ModeLine currently +# being used by the specified display device. +# +# This attribute may be queried through XNVCTRLQueryTargetStringAttribute() +# using an NV_CTRL_TARGET_TYPE_GPU or NV_CTRL_TARGET_TYPE_X_SCREEN target. +# +# The ModeLine string may be prepended with a comma-separated list of +# "token=value" pairs, separated from the ModeLine string by "::". +# This "token=value" syntax is the same as that used in +# NV_CTRL_BINARY_DATA_MODELINES +# + +NV_CTRL_STRING_CURRENT_MODELINE = 9 # R-DG + +# +# NV_CTRL_STRING_ADD_MODELINE - Adds a ModeLine to the specified +# display device. The ModeLine is not added if validation fails. +# +# The ModeLine string should have the same syntax as a ModeLine in +# the X configuration file; e.g., +# +# "1600x1200" 229.5 1600 1664 1856 2160 1200 1201 1204 1250 +HSync +VSync +# + +NV_CTRL_STRING_ADD_MODELINE = 10 # -WDG + +# +# NV_CTRL_STRING_DELETE_MODELINE - Deletes an existing ModeLine +# from the specified display device. The currently selected +# ModeLine cannot be deleted. (This also means you cannot delete +# the last ModeLine.) +# +# The ModeLine string should have the same syntax as a ModeLine in +# the X configuration file; e.g., +# +# "1600x1200" 229.5 1600 1664 1856 2160 1200 1201 1204 1250 +HSync +VSync +# + +NV_CTRL_STRING_DELETE_MODELINE = 11 # -WDG + +# +# NV_CTRL_STRING_CURRENT_METAMODE - Returns the metamode currently +# being used by the specified X screen. The MetaMode string has the +# same syntax as the MetaMode X configuration option, as documented +# in the NVIDIA driver README. +# +# The returned string may be prepended with a comma-separated list of +# "token=value" pairs, separated from the MetaMode string by "::". +# This "token=value" syntax is the same as that used in +# NV_CTRL_BINARY_DATA_METAMODES. +# + +NV_CTRL_STRING_CURRENT_METAMODE = 12 # RW-- +NV_CTRL_STRING_CURRENT_METAMODE_VERSION_1 = NV_CTRL_STRING_CURRENT_METAMODE + +# +# NV_CTRL_STRING_ADD_METAMODE - Adds a MetaMode to the specified +# X Screen. +# +# It is recommended to not use this attribute, but instead use +# NV_CTRL_STRING_OPERATION_ADD_METAMODE. +# + +NV_CTRL_STRING_ADD_METAMODE = 13 # -W-- + +# +# NV_CTRL_STRING_DELETE_METAMODE - Deletes an existing MetaMode from +# the specified X Screen. The currently selected MetaMode cannot be +# deleted. (This also means you cannot delete the last MetaMode). +# The MetaMode string should have the same syntax as the MetaMode X +# configuration option, as documented in the NVIDIA driver README. +# + +NV_CTRL_STRING_DELETE_METAMODE = 14 # -WD-- + +# +# NV_CTRL_STRING_VCSC_PRODUCT_NAME - deprecated +# +# Queries the product name of the VCSC device. +# +# This attribute must be queried through XNVCTRLQueryTargetStringAttribute() +# using a NV_CTRL_TARGET_TYPE_VCSC target. +# + +NV_CTRL_STRING_VCSC_PRODUCT_NAME = 15 # R---V + +# +# NV_CTRL_STRING_VCSC_PRODUCT_ID - deprecated +# +# Queries the product ID of the VCSC device. +# +# This attribute must be queried through XNVCTRLQueryTargetStringAttribute() +# using a NV_CTRL_TARGET_TYPE_VCSC target. +# + +NV_CTRL_STRING_VCSC_PRODUCT_ID = 16 # R---V + +# +# NV_CTRL_STRING_VCSC_SERIAL_NUMBER - deprecated +# +# Queries the unique serial number of the VCS device. +# +# This attribute must be queried through XNVCTRLQueryTargetStringAttribute() +# using a NV_CTRL_TARGET_TYPE_VCSC target. +# + +NV_CTRL_STRING_VCSC_SERIAL_NUMBER = 17 # R---V + +# +# NV_CTRL_STRING_VCSC_BUILD_DATE - deprecated +# +# Queries the date of the VCS device. the returned string is in the following +# format: "Week.Year" +# +# This attribute must be queried through XNVCTRLQueryTargetStringAttribute() +# using a NV_CTRL_TARGET_TYPE_VCSC target. +# + +NV_CTRL_STRING_VCSC_BUILD_DATE = 18 # R---V + +# +# NV_CTRL_STRING_VCSC_FIRMWARE_VERSION - deprecated +# +# Queries the firmware version of the VCS device. +# +# This attribute must be queried through XNVCTRLQueryTargetStringAttribute() +# using a NV_CTRL_TARGET_TYPE_VCSC target. +# + +NV_CTRL_STRING_VCSC_FIRMWARE_VERSION = 19 # R---V + +# +# NV_CTRL_STRING_VCSC_FIRMWARE_REVISION - deprecated +# +# Queries the firmware revision of the VCS device. +# +# This attribute must be queried through XNVCTRLQueryTargetStringAttribute() +# using a NV_CTRL_TARGET_TYPE_VCS target. +# + +NV_CTRL_STRING_VCSC_FIRMWARE_REVISION = 20 # R---V + +# +# NV_CTRL_STRING_VCSC_HARDWARE_VERSION - deprecated +# +# Queries the hardware version of the VCS device. +# +# This attribute must be queried through XNVCTRLQueryTargetStringAttribute() +# using a NV_CTRL_TARGET_TYPE_VCSC target. +# + +NV_CTRL_STRING_VCSC_HARDWARE_VERSION = 21 # R---V + +# +# NV_CTRL_STRING_VCSC_HARDWARE_REVISION - deprecated +# +# Queries the hardware revision of the VCS device. +# +# This attribute must be queried through XNVCTRLQueryTargetStringAttribute() +# using a NV_CTRL_TARGET_TYPE_VCSC target. +# + +NV_CTRL_STRING_VCSC_HARDWARE_REVISION = 22 # R---V + +# +# NV_CTRL_STRING_MOVE_METAMODE - Moves a MetaMode to the specified +# index location. The MetaMode must already exist in the X Screen's +# list of MetaModes (as returned by the NV_CTRL_BINARY_DATA_METAMODES +# attribute). If the index is larger than the number of MetaModes in +# the list, the MetaMode is moved to the end of the list. The +# MetaMode string should have the same syntax as the MetaMode X +# configuration option, as documented in the NVIDIA driver README. + +# The MetaMode string must be prepended with a comma-separated list +# of "token=value" pairs, separated from the MetaMode string by "::". +# Currently, the only valid token is "index", which indicates where +# in the MetaMode list the MetaMode should be moved to. +# +# Other tokens may be added in the future. +# +# E.g., +# "index=5 :: CRT-0: 1024x768 @1024x768 +0+0" +# + +NV_CTRL_STRING_MOVE_METAMODE = 23 # -W-- + +# +# NV_CTRL_STRING_VALID_HORIZ_SYNC_RANGES - returns the valid +# horizontal sync ranges used to perform mode validation for the +# specified display device. The ranges are in the same format as the +# "HorizSync" X config option: +# +# "horizsync-range may be a comma separated list of either discrete +# values or ranges of values. A range of values is two values +# separated by a dash." +# +# The values are in kHz. +# +# Additionally, the string may be prepended with a comma-separated +# list of "token=value" pairs, separated from the HorizSync string by +# "::". Valid tokens: +# +# Token Value +# "source" "edid" - HorizSync is from the display device's EDID +# "xconfig" - HorizSync is from the "HorizSync" entry in +# the Monitor section of the X config file +# "option" - HorizSync is from the "HorizSync" NVIDIA X +# config option +# "builtin" - HorizSync is from NVIDIA X driver builtin +# default values +# +# Additional tokens and/or values may be added in the future. +# +# Example: "source=edid :: 30.000-62.000" +# + +NV_CTRL_STRING_VALID_HORIZ_SYNC_RANGES = 24 # R-DG + +# +# NV_CTRL_STRING_VALID_VERT_REFRESH_RANGES - returns the valid +# vertical refresh ranges used to perform mode validation for the +# specified display device. The ranges are in the same format as the +# "VertRefresh" X config option: +# +# "vertrefresh-range may be a comma separated list of either discrete +# values or ranges of values. A range of values is two values +# separated by a dash." +# +# The values are in Hz. +# +# Additionally, the string may be prepended with a comma-separated +# list of "token=value" pairs, separated from the VertRefresh string by +# "::". Valid tokens: +# +# Token Value +# "source" "edid" - VertRefresh is from the display device's EDID +# "xconfig" - VertRefresh is from the "VertRefresh" entry in +# the Monitor section of the X config file +# "option" - VertRefresh is from the "VertRefresh" NVIDIA X +# config option +# "builtin" - VertRefresh is from NVIDIA X driver builtin +# default values +# +# Additional tokens and/or values may be added in the future. +# +# Example: "source=edid :: 50.000-75.000" +# + +NV_CTRL_STRING_VALID_VERT_REFRESH_RANGES = 25 # R-DG + +# +# NV_CTRL_STRING_SCREEN_RECTANGLE - returns the physical X Screen's +# initial position and size (in absolute coordinates) within the +# desktop as the "token=value" string: "x=#, y=#, width=#, height=#" +# +# Querying this attribute returns success only when Xinerama is enabled +# or the X server ABI is greater than equal to 12. +# + +NV_CTRL_STRING_SCREEN_RECTANGLE = 26 # R--- + +# +# NV_CTRL_STRING_XINERAMA_SCREEN_INFO - renamed +# +# NV_CTRL_STRING_SCREEN_RECTANGLE should be used instead. +# + +NV_CTRL_STRING_XINERAMA_SCREEN_INFO = 26 # renamed + +# +# NV_CTRL_STRING_TWINVIEW_XINERAMA_INFO_ORDER - used to specify the +# order that display devices will be returned via Xinerama when +# nvidiaXineramaInfo is enabled. Follows the same syntax as the +# nvidiaXineramaInfoOrder X config option. +# + +NV_CTRL_STRING_NVIDIA_XINERAMA_INFO_ORDER = 27 # RW-- + +NV_CTRL_STRING_TWINVIEW_XINERAMA_INFO_ORDER = NV_CTRL_STRING_NVIDIA_XINERAMA_INFO_ORDER # for backwards compatibility: + +# +# NV_CTRL_STRING_SLI_MODE - returns a string describing the current +# SLI mode, if any, or FALSE if SLI is not currently enabled. +# +# This string should be used for informational purposes only, and +# should not be used to distinguish between SLI modes, other than to +# recognize when SLI is disabled (FALSE is returned) or +# enabled (the returned string is non-NULL and describes the current +# SLI configuration). +# + +NV_CTRL_STRING_SLI_MODE = 28 # R---*/ + +# +# NV_CTRL_STRING_PERFORMANCE_MODES - returns a string with all the +# performance modes defined for this GPU along with their associated +# NV Clock and Memory Clock values. +# Not all tokens will be reported on all GPUs, and additional tokens +# may be added in the future. +# For backwards compatibility we still provide nvclock, memclock, and +# processorclock those are the same as nvclockmin, memclockmin and +# processorclockmin. +# +# Note: These clock values take into account the offset +# set by clients through NV_CTRL_GPU_NVCLOCK_OFFSET and +# NV_CTRL_GPU_MEM_TRANSFER_RATE_OFFSET. +# +# Each performance modes are returned as a comma-separated list of +# "token=value" pairs. Each set of performance mode tokens are separated +# by a ";". Valid tokens: +# +# Token Value +# "perf" integer - the Performance level +# "nvclock" integer - the GPU clocks (in MHz) for the perf level +# "nvclockmin" integer - the GPU clocks min (in MHz) for the perf level +# "nvclockmax" integer - the GPU clocks max (in MHz) for the perf level +# "nvclockeditable" integer - if the GPU clock domain is editable +# for the perf level +# "memclock" integer - the memory clocks (in MHz) for the perf level +# "memclockmin" integer - the memory clocks min (in MHz) for the perf level +# "memclockmax" integer - the memory clocks max (in MHz) for the perf level +# "memclockeditable" integer - if the memory clock domain is editable +# for the perf level +# "memtransferrate" integer - the memory transfer rate (in MHz) +# for the perf level +# "memtransferratemin" integer - the memory transfer rate min (in MHz) +# for the perf level +# "memtransferratemax" integer - the memory transfer rate max (in MHz) +# for the perf level +# "memtransferrateeditable" integer - if the memory transfer rate is editable +# for the perf level +# "processorclock" integer - the processor clocks (in MHz) +# for the perf level +# "processorclockmin" integer - the processor clocks min (in MHz) +# for the perf level +# "processorclockmax" integer - the processor clocks max (in MHz) +# for the perf level +# "processorclockeditable" integer - if the processor clock domain is editable +# for the perf level +# +# Example: +# +# perf=0, nvclock=324, nvclockmin=324, nvclockmax=324, nvclockeditable=0, +# memclock=324, memclockmin=324, memclockmax=324, memclockeditable=0, +# memtransferrate=648, memtransferratemin=648, memtransferratemax=648, +# memtransferrateeditable=0 ; +# perf=1, nvclock=324, nvclockmin=324, nvclockmax=640, nvclockeditable=0, +# memclock=810, memclockmin=810, memclockmax=810, memclockeditable=0, +# memtransferrate=1620, memtransferrate=1620, memtransferrate=1620, +# memtransferrateeditable=0 ; +# +# This attribute may be queried through XNVCTRLQueryTargetStringAttribute() +# using a NV_CTRL_TARGET_TYPE_GPU or NV_CTRL_TARGET_TYPE_X_SCREEN target. +# + +NV_CTRL_STRING_PERFORMANCE_MODES = 29 # R--G + +# +# NV_CTRL_STRING_VCSC_FAN_STATUS - deprecated +# +# Returns a string with status of all the fans in the Visual Computing System, +# if such a query is supported. Fan information is reported along with its +# tachometer reading (in RPM) and a flag indicating whether the fan has failed +# or not. +# +# Valid tokens: +# +# Token Value +# "fan" integer - the Fan index +# "speed" integer - the tachometer reading of the fan in rpm +# "fail" integer - flag to indicate whether the fan has failed +# +# Example: +# +# fan=0, speed=694, fail=0 ; fan=1, speed=693, fail=0 +# +# This attribute must be queried through XNVCTRLQueryTargetStringAttribute() +# using a NV_CTRL_TARGET_TYPE_VCSC target. +# +# + +NV_CTRL_STRING_VCSC_FAN_STATUS = 30 # R---V + +# +# NV_CTRL_STRING_VCSC_TEMPERATURES - Deprecated +# +# Returns a string with all Temperature readings in the Visual Computing +# System, if such a query is supported. Intake, Exhaust and Board Temperature +# values are reported in Celcius. +# +# Valid tokens: +# +# Token Value +# "intake" integer - the intake temperature for the VCS +# "exhaust" integer - the exhaust temperature for the VCS +# "board" integer - the board temperature of the VCS +# +# Example: +# +# intake=29, exhaust=46, board=41 +# +# This attribute must be queried through XNVCTRLQueryTargetStringAttribute() +# using a NV_CTRL_TARGET_TYPE_VCSC target. +# +# + +NV_CTRL_STRING_VCSC_TEMPERATURES = 31 # R---V + +# +# NV_CTRL_STRING_VCSC_PSU_INFO - Deprecated +# +# Returns a string with all Power Supply Unit related readings in the Visual +# Computing System, if such a query is supported. Current in amperes, Power +# in watts, Voltage in volts and PSU state may be reported. Not all PSU types +# support all of these values, and therefore some readings may be unknown. +# +# Valid tokens: +# +# Token Value +# "current" integer - the current drawn in amperes by the VCS +# "power" integer - the power drawn in watts by the VCS +# "voltage" integer - the voltage reading of the VCS +# "state" integer - flag to indicate whether PSU is operating normally +# +# Example: +# +# current=10, power=15, voltage=unknown, state=normal +# +# This attribute must be queried through XNVCTRLQueryTargetStringAttribute() +# using a NV_CTRL_TARGET_TYPE_VCSC target. +# +# + + +NV_CTRL_STRING_VCSC_PSU_INFO = 32 # R---V + +# +# NV_CTRL_STRING_GVIO_VIDEO_FORMAT_NAME - query the name for the specified +# NV_CTRL_GVIO_VIDEO_FORMAT_*. So that this can be queried with existing +# interfaces, XNVCTRLQueryStringAttribute() should be used, and the video +# format specified in the display_mask field; eg: +# +# XNVCTRLQueryStringAttribute(dpy, +# screen, +# NV_CTRL_GVIO_VIDEO_FORMAT_720P_60_00_SMPTE296, +# NV_CTRL_GVIO_VIDEO_FORMAT_NAME, +# &name); +# + +NV_CTRL_STRING_GVIO_VIDEO_FORMAT_NAME = 33 # R--GI + +# +# NV_CTRL_STRING_GVO_VIDEO_FORMAT_NAME - renamed +# +# NV_CTRL_STRING_GVIO_VIDEO_FORMAT_NAME should be used instead. +# +NV_CTRL_STRING_GVO_VIDEO_FORMAT_NAME = 33 # renamed + +# +# NV_CTRL_STRING_GPU_CURRENT_CLOCK_FREQS - returns a string with the +# associated NV Clock, Memory Clock and Processor Clock values. +# +# Current valid tokens are "nvclock", "nvclockmin", "nvclockmax", +# "memclock", "memclockmin", "memclockmax", "processorclock", +# "processorclockmin" and "processorclockmax". +# Not all tokens will be reported on all GPUs, and additional tokens +# may be added in the future. +# +# Note: These clock values take into account the offset +# set by clients through NV_CTRL_GPU_NVCLOCK_OFFSET and +# NV_CTRL_GPU_MEM_TRANSFER_RATE_OFFSET. +# +# Clock values are returned as a comma-separated list of +# "token=value" pairs. +# Valid tokens: +# +# Token Value +# "nvclock" integer - the GPU clocks (in MHz) for the perf level +# "nvclockmin" integer - the GPU clocks min (in MHz) for the perf level +# "nvclockmax" integer - the GPU clocks max (in MHz) for the perf level +# "nvclockeditable" integer - if the GPU clock domain is editable +# for the perf level +# "memclock" integer - the memory clocks (in MHz) for the perf level +# "memclockmin" integer - the memory clocks min (in MHz) for the perf level +# "memclockmax" integer - the memory clocks (max in MHz) for the perf level +# "memclockeditable" integer - if the memory clock domain is editable +# for the perf level +# "memtransferrate" integer - the memory transfer rate (in MHz) +# for the perf level +# "memtransferratemin" integer - the memory transfer rate min (in MHz) +# for the perf level +# "memtransferratemax" integer - the memory transfer rate max (in MHz) +# for the perf level +# "memtransferrateeditable" integer - if the memory transfer rate is editable +# for the perf level +# "processorclock" integer - the processor clocks (in MHz) +# for the perf level +# "processorclockmin" integer - the processor clocks min (in MHz) +# for the perf level +# "processorclockmax" integer - the processor clocks max (in MHz) +# for the perf level +# "processorclockeditable" integer - if the processor clock domain is editable +# for the perf level +# +# Example: +# +# nvclock=324, nvclockmin=324, nvclockmax=324, nvclockeditable=0 +# memclock=324, memclockmin=324, memclockmax=324, memclockeditable=0 +# memtrasferrate=628 +# +# This attribute may be queried through XNVCTRLQueryTargetStringAttribute() +# using an NV_CTRL_TARGET_TYPE_GPU or NV_CTRL_TARGET_TYPE_X_SCREEN target. +# + +NV_CTRL_STRING_GPU_CURRENT_CLOCK_FREQS = 34 # RW-G + +# +# NV_CTRL_STRING_3D_VISION_PRO_TRANSCEIVER_HARDWARE_REVISION - Returns the +# hardware revision of the 3D Vision Pro transceiver. +# +NV_CTRL_STRING_3D_VISION_PRO_TRANSCEIVER_HARDWARE_REVISION = 35 # R--T + +# +# NV_CTRL_STRING_3D_VISION_PRO_TRANSCEIVER_FIRMWARE_VERSION_A - Returns the +# firmware version of chip A of the 3D Vision Pro transceiver. +# +NV_CTRL_STRING_3D_VISION_PRO_TRANSCEIVER_FIRMWARE_VERSION_A = 36 # R--T + +# +# NV_CTRL_STRING_3D_VISION_PRO_TRANSCEIVER_FIRMWARE_DATE_A - Returns the +# date of the firmware of chip A of the 3D Vision Pro transceiver. +# +NV_CTRL_STRING_3D_VISION_PRO_TRANSCEIVER_FIRMWARE_DATE_A = 37 # R--T + +# +# NV_CTRL_STRING_3D_VISION_PRO_TRANSCEIVER_FIRMWARE_VERSION_B - Returns the +# firmware version of chip B of the 3D Vision Pro transceiver. +# +NV_CTRL_STRING_3D_VISION_PRO_TRANSCEIVER_FIRMWARE_VERSION_B = 38 # R--T + +# +# NV_CTRL_STRING_3D_VISION_PRO_TRANSCEIVER_FIRMWARE_DATE_B - Returns the +# date of the firmware of chip B of the 3D Vision Pro transceiver. +# +NV_CTRL_STRING_3D_VISION_PRO_TRANSCEIVER_FIRMWARE_DATE_B = 39 # R--T + +# +# NV_CTRL_STRING_3D_VISION_PRO_TRANSCEIVER_ADDRESS - Returns the RF address +# of the 3D Vision Pro transceiver. +# +NV_CTRL_STRING_3D_VISION_PRO_TRANSCEIVER_ADDRESS = 40 # R--T + +# +# NV_CTRL_STRING_3D_VISION_PRO_GLASSES_FIRMWARE_VERSION_A - Returns the +# firmware version of chip A of the glasses. +# Use the display_mask parameter to specify the glasses id. +# +NV_CTRL_STRING_3D_VISION_PRO_GLASSES_FIRMWARE_VERSION_A = 41 # R--T + +# +# NV_CTRL_STRING_3D_VISION_PRO_GLASSES_FIRMWARE_DATE_A - Returns the +# date of the firmware of chip A of the glasses. +# Use the display_mask parameter to specify the glasses id. +# +NV_CTRL_STRING_3D_VISION_PRO_GLASSES_FIRMWARE_DATE_A = 42 # R--T + +# +# NV_CTRL_STRING_3D_VISION_PRO_GLASSES_ADDRESS - Returns the RF address +# of the glasses. +# Use the display_mask parameter to specify the glasses id. +# +NV_CTRL_STRING_3D_VISION_PRO_GLASSES_ADDRESS = 43 # R--T + +# +# NV_CTRL_STRING_3D_VISION_PRO_GLASSES_NAME - Controls the name the +# glasses should use. +# Use the display_mask parameter to specify the glasses id. +# Glasses' name should start and end with an alpha-numeric character. +# +NV_CTRL_STRING_3D_VISION_PRO_GLASSES_NAME = 44 # RW-T + +# +# NV_CTRL_STRING_CURRENT_METAMODE_VERSION_2 - Returns the metamode currently +# being used by the specified X screen. The MetaMode string has the same +# syntax as the MetaMode X configuration option, as documented in the NVIDIA +# driver README. Also, see NV_CTRL_BINARY_DATA_METAMODES_VERSION_2 for more +# details on the base syntax. +# +# The returned string may also be prepended with a comma-separated list of +# "token=value" pairs, separated from the MetaMode string by "::". +# +NV_CTRL_STRING_CURRENT_METAMODE_VERSION_2 = 45 # RW-- + +# +# NV_CTRL_STRING_DISPLAY_NAME_TYPE_BASENAME - Returns a type name for the +# display device ("CRT", "DFP", or "TV"). However, note that the determination +# of the name is based on the protocol through which the X driver communicates +# to the display device. E.g., if the driver communicates using VGA ,then the +# basename is "CRT"; if the driver communicates using TMDS, LVDS, or DP, then +# the name is "DFP". +# +NV_CTRL_STRING_DISPLAY_NAME_TYPE_BASENAME = 46 # R-D- + +# +# NV_CTRL_STRING_DISPLAY_NAME_TYPE_ID - Returns the type-based name + ID for +# the display device, e.g. "CRT-0", "DFP-1", "TV-2". If this device is a +# DisplayPort multistream device, then this name will also be prepended with the +# device's port address like so: "DFP-1.0.1.2.3". See +# NV_CTRL_STRING_DISPLAY_NAME_TYPE_BASENAME for more information about the +# construction of type-based names. +# +NV_CTRL_STRING_DISPLAY_NAME_TYPE_ID = 47 # R-D- + +# +# NV_CTRL_STRING_DISPLAY_NAME_DP_GUID - Returns the GUID of the DisplayPort +# display device. e.g. "DP-GUID-f16a5bde-79f3-11e1-b2ae-8b5a8969ba9c" +# +# The display device must be a DisplayPort 1.2 device. +# +NV_CTRL_STRING_DISPLAY_NAME_DP_GUID = 48 # R-D- + +# +# NV_CTRL_STRING_DISPLAY_NAME_EDID_HASH - Returns the SHA-1 hash of the +# display device's EDID in 8-4-4-4-12 UID format. e.g. +# "DPY-EDID-f16a5bde-79f3-11e1-b2ae-8b5a8969ba9c" +# +# The display device must have a valid EDID. +# +NV_CTRL_STRING_DISPLAY_NAME_EDID_HASH = 49 # R-D- + +# +# NV_CTRL_STRING_DISPLAY_NAME_TARGET_INDEX - Returns the current NV-CONTROL +# target ID (name) of the display device. e.g. "DPY-1", "DPY-4" +# +# This name for the display device is not guarenteed to be the same between +# different runs of the X server. +# +NV_CTRL_STRING_DISPLAY_NAME_TARGET_INDEX = 50 # R-D- + +# +# NV_CTRL_STRING_DISPLAY_NAME_RANDR - Returns the RandR output name for the +# display device. e.g. "VGA-1", "DVI-I-0", "DVI-D-3", "LVDS-1", "DP-2", +# "HDMI-3", "eDP-6". This name should match If this device is a DisplayPort +# 1.2 device, then this name will also be prepended with the device's port +# address like so: "DVI-I-3.0.1.2.3" +# +NV_CTRL_STRING_DISPLAY_NAME_RANDR = 51 # R-D- + +# +# NV_CTRL_STRING_GPU_UUID - Returns the UUID of the given GPU. +# +NV_CTRL_STRING_GPU_UUID = 52 # R--G + +# +# NV_CTRL_STRING_GPU_UTILIZATION - Returns the current percentage usage +# of the various components of the GPU. +# +# Current valid tokens are "graphics", "memory", "video" and "PCIe". +# Not all tokens will be reported on all GPUs, and additional tokens +# may be added in the future. +# +# Utilization values are returned as a comma-separated list of +# "token=value" pairs. +# Valid tokens: +# +# Token Value +# "graphics" integer - the percentage usage of graphics engine. +# "memory" integer - the percentage usage of FB. +# "video" integer - the percentage usage of video engine. +# "PCIe" integer - the percentage usage of PCIe bandwidth. +# +# +# Example: +# +# graphics=45, memory=6, video=0, PCIe=0 +# +# This attribute may be queried through XNVCTRLQueryTargetStringAttribute() +# using an NV_CTRL_TARGET_TYPE_GPU. +# +NV_CTRL_STRING_GPU_UTILIZATION = 53 # R--G + +# +# NV_CTRL_STRING_MULTIGPU_MODE - returns a string describing the current +# MULTIGPU mode, if any, or FALSE if MULTIGPU is not currently enabled. +# +NV_CTRL_STRING_MULTIGPU_MODE = 54 # R--- + +# +# NV_CTRL_STRING_PRIME_OUTPUTS_DATA - returns a semicolon delimited list of +# strings that describe all PRIME configured displays. +# +# ex. "xpos=1920, ypos=0, width=1280, height=1024, screen=0;xpos=3200, +# ypos=0, width=800, height=600, screen=0;" +# +NV_CTRL_STRING_PRIME_OUTPUTS_DATA = 55 # R--- + +NV_CTRL_STRING_LAST_ATTRIBUTE = NV_CTRL_STRING_PRIME_OUTPUTS_DATA + +############################################################################ + +# +# Binary Data Attributes: +# +# Binary data attributes can be queryied through the XNVCTRLQueryBinaryData() +# and XNVCTRLQueryTargetBinaryData() function calls. +# +# There are currently no binary data attributes that can be set. +# +# Unless otherwise noted, all Binary data attributes can be queried +# using an NV_CTRL_TARGET_TYPE_X_SCREEN target. Attributes that cannot take +# an NV_CTRL_TARGET_TYPE_X_SCREEN target also cannot be queried through +# XNVCTRLQueryBinaryData() (Since an X Screen target is assumed). +# + + +# +# NV_CTRL_BINARY_DATA_EDID - Returns a display device's EDID information +# data. +# +# This attribute may be queried through XNVCTRLQueryTargetBinaryData() +# using a NV_CTRL_TARGET_TYPE_GPU or NV_CTRL_TARGET_TYPE_X_SCREEN target. +# + +NV_CTRL_BINARY_DATA_EDID = 0 # R-DG + +# +# NV_CTRL_BINARY_DATA_MODELINES - Returns a display device's supported +# ModeLines. ModeLines are returned in a buffer, separated by a single +# '\0' and terminated by two consecutive '\0' s like so: +# +# "ModeLine 1\0ModeLine 2\0ModeLine 3\0Last ModeLine\0\0" +# +# This attribute may be queried through XNVCTRLQueryTargetBinaryData() +# using a NV_CTRL_TARGET_TYPE_GPU or NV_CTRL_TARGET_TYPE_X_SCREEN target. +# +# Each ModeLine string may be prepended with a comma-separated list +# of "token=value" pairs, separated from the ModeLine string with a +# "::". Valid tokens: +# +# Token Value +# "source" "xserver" - the ModeLine is from the core X server +# "xconfig" - the ModeLine was specified in the X config file +# "builtin" - the NVIDIA driver provided this builtin ModeLine +# "vesa" - this is a VESA standard ModeLine +# "edid" - the ModeLine was in the display device's EDID +# "nv-control" - the ModeLine was specified via NV-CONTROL +# +# "xconfig-name" - for ModeLines that were specified in the X config +# file, this is the name the X config file +# gave for the ModeLine. +# +# Note that a ModeLine can have several sources; the "source" token +# can appear multiple times in the "token=value" pairs list. +# Additional source values may be specified in the future. +# +# Additional tokens may be added in the future, so it is recommended +# that any token parser processing the returned string from +# NV_CTRL_BINARY_DATA_MODELINES be implemented to gracefully ignore +# unrecognized tokens. +# +# E.g., +# +# "source=xserver, source=vesa, source=edid :: "1024x768_70" 75.0 1024 1048 1184 1328 768 771 777 806 -HSync -VSync" +# "source=xconfig, xconfig-name=1600x1200_60.00 :: "1600x1200_60_0" 161.0 1600 1704 1880 2160 1200 1201 1204 1242 -HSync +VSync" +# + +NV_CTRL_BINARY_DATA_MODELINES = 1 # R-DG + +# +# NV_CTRL_BINARY_DATA_METAMODES - Returns an X Screen's supported +# MetaModes. MetaModes are returned in a buffer separated by a +# single '\0' and terminated by two consecutive '\0' s like so: +# +# "MetaMode 1\0MetaMode 2\0MetaMode 3\0Last MetaMode\0\0" +# +# The MetaMode string should have the same syntax as the MetaMode X +# configuration option, as documented in the NVIDIA driver README. + +# Each MetaMode string may be prepended with a comma-separated list +# of "token=value" pairs, separated from the MetaMode string with +# "::". Currently, valid tokens are: +# +# Token Value +# "id" - the id of this MetaMode; this is stored in +# the Vertical Refresh field, as viewed +# by the XRandR and XF86VidMode X# +# extensions. +# +# "switchable" "yes"/"no" - whether this MetaMode may be switched to via +# ctrl-alt-+/-; Implicit MetaModes (see +# the "IncludeImplicitMetaModes" X +# config option), for example, are not +# normally made available through +# ctrl-alt-+/-. +# +# "source" "xconfig" - the MetaMode was specified in the X +# config file. +# "implicit" - the MetaMode was implicitly added; see the +# "IncludeImplicitMetaModes" X config option +# for details. +# "nv-control" - the MetaMode was added via the NV-CONTROL X +# extension to the currently running X server. +# "RandR" - the MetaMode was modified in response to an +# RandR RRSetCrtcConfig request. +# +# Additional tokens may be added in the future, so it is recommended +# that any token parser processing the returned string from +# NV_CTRL_BINARY_DATA_METAMODES be implemented to gracefully ignore +# unrecognized tokens. +# +# E.g., +# +# "id=50, switchable=yes, source=xconfig :: CRT-0: 1024x768 @1024x768 +0+0" +# + +NV_CTRL_BINARY_DATA_METAMODES = 2 # R-D- +NV_CTRL_BINARY_DATA_METAMODES_VERSION_1 = NV_CTRL_BINARY_DATA_METAMODES + +# +# NV_CTRL_BINARY_DATA_XSCREENS_USING_GPU - Returns the list of X +# screens currently driven by the given GPU. +# +# The format of the returned data is: +# +# 4 CARD32 number of screens +# 4# n CARD32 screen indices +# +# This attribute can only be queried through XNVCTRLQueryTargetBinaryData() +# using a NV_CTRL_TARGET_TYPE_GPU target. This attribute cannot be +# queried using a NV_CTRL_TARGET_TYPE_X_SCREEN. +# + +NV_CTRL_BINARY_DATA_XSCREENS_USING_GPU = 3 # R-DG + +# +# NV_CTRL_BINARY_DATA_GPUS_USED_BY_XSCREEN - Returns the list of GPUs +# currently in use by the given X screen. +# +# The format of the returned data is: +# +# 4 CARD32 number of GPUs +# 4# n CARD32 GPU indices +# + +NV_CTRL_BINARY_DATA_GPUS_USED_BY_XSCREEN = 4 # R--- + +# +# NV_CTRL_BINARY_DATA_GPUS_USING_FRAMELOCK - Returns the list of +# GPUs currently connected to the given frame lock board. +# +# The format of the returned data is: +# +# 4 CARD32 number of GPUs +# 4# n CARD32 GPU indices +# +# This attribute can only be queried through XNVCTRLQueryTargetBinaryData() +# using a NV_CTRL_TARGET_TYPE_FRAMELOCK target. This attribute cannot be +# queried using a NV_CTRL_TARGET_TYPE_X_SCREEN. +# + +NV_CTRL_BINARY_DATA_GPUS_USING_FRAMELOCK = 5 # R-DF + +# +# NV_CTRL_BINARY_DATA_DISPLAY_VIEWPORT - Returns the Display Device's +# viewport box into the given X Screen (in X Screen coordinates.) +# +# The format of the returned data is: +# +# 4 CARD32 Offset X +# 4 CARD32 Offset Y +# 4 CARD32 Width +# 4 CARD32 Height +# + +NV_CTRL_BINARY_DATA_DISPLAY_VIEWPORT = 6 # R-DG + +# +# NV_CTRL_BINARY_DATA_FRAMELOCKS_USED_BY_GPU - Returns the list of +# Framelock devices currently connected to the given GPU. +# +# The format of the returned data is: +# +# 4 CARD32 number of Framelocks +# 4# n CARD32 Framelock indices +# +# This attribute can only be queried through XNVCTRLQueryTargetBinaryData() +# using a NV_CTRL_TARGET_TYPE_GPU target. This attribute cannot be +# queried using a NV_CTRL_TARGET_TYPE_X_SCREEN. +# + +NV_CTRL_BINARY_DATA_FRAMELOCKS_USED_BY_GPU = 7 # R-DG + +# +# NV_CTRL_BINARY_DATA_GPUS_USING_VCSC - Deprecated +# +# Returns the list of GPU devices connected to the given VCS. +# +# The format of the returned data is: +# +# 4 CARD32 number of GPUs +# 4# n CARD32 GPU indices +# +# This attribute can only be queried through XNVCTRLQueryTargetBinaryData() +# using a NV_CTRL_TARGET_TYPE_VCSC target. This attribute cannot be +# queried using a NV_CTRL_TARGET_TYPE_X_SCREEN and cannot be queried using +# a NV_CTRL_TARGET_TYPE_X_GPU +# + +NV_CTRL_BINARY_DATA_GPUS_USING_VCSC = 8 # R-DV + +# +# NV_CTRL_BINARY_DATA_VCSCS_USED_BY_GPU - Deprecated +# +# Returns the VCSC device that is controlling the given GPU. +# +# The format of the returned data is: +# +# 4 CARD32 number of VCS (always 1) +# 4# n CARD32 VCS indices +# +# This attribute can only be queried through XNVCTRLQueryTargetBinaryData() +# using a NV_CTRL_TARGET_TYPE_GPU target. This attribute cannot be +# queried using a NV_CTRL_TARGET_TYPE_X_SCREEN +# + +NV_CTRL_BINARY_DATA_VCSCS_USED_BY_GPU = 9 # R-DG + +# +# NV_CTRL_BINARY_DATA_COOLERS_USED_BY_GPU - Returns the coolers that +# are cooling the given GPU. +# +# The format of the returned data is: +# +# 4 CARD32 number of COOLER +# 4# n CARD32 COOLER indices +# +# This attribute can only be queried through XNVCTRLQueryTargetBinaryData() +# using a NV_CTRL_TARGET_TYPE_GPU target. This attribute cannot be +# queried using a NV_CTRL_TARGET_TYPE_X_SCREEN +# + +NV_CTRL_BINARY_DATA_COOLERS_USED_BY_GPU = 10 # R-DG + +# +# NV_CTRL_BINARY_DATA_GPUS_USED_BY_LOGICAL_XSCREEN - Returns the list of +# GPUs currently driving the given X screen. If Xinerama is enabled, this +# will return all GPUs that are driving any X screen. +# +# The format of the returned data is: +# +# 4 CARD32 number of GPUs +# 4# n CARD32 GPU indices +# + +NV_CTRL_BINARY_DATA_GPUS_USED_BY_LOGICAL_XSCREEN = 11 # R--- + +# +# NV_CTRL_BINARY_DATA_THERMAL_SENSORS_USED_BY_GPU - Returns the sensors that +# are attached to the given GPU. +# +# The format of the returned data is: +# +# 4 CARD32 number of SENSOR +# 4# n CARD32 SENSOR indices +# +# This attribute can only be queried through XNVCTRLQueryTargetBinaryData() +# using a NV_CTRL_TARGET_TYPE_GPU target. This attribute cannot be +# queried using a NV_CTRL_TARGET_TYPE_X_SCREEN +# + +NV_CTRL_BINARY_DATA_THERMAL_SENSORS_USED_BY_GPU = 12 # R--G + +# +# NV_CTRL_BINARY_DATA_GLASSES_PAIRED_TO_3D_VISION_PRO_TRANSCEIVER - Returns +# the id of the glasses that are currently paired to the given +# 3D Vision Pro transceiver. +# +# The format of the returned data is: +# +# 4 CARD32 number of glasses +# 4# n CARD32 id of glasses +# +# This attribute can only be queried through XNVCTRLQueryTargetBinaryData() +# using a NV_CTRL_TARGET_TYPE_3D_VISION_PRO_TRANSCEIVER target. +# +NV_CTRL_BINARY_DATA_GLASSES_PAIRED_TO_3D_VISION_PRO_TRANSCEIVER = 13 # R--T + +# +# NV_CTRL_BINARY_DATA_DISPLAY_TARGETS - Returns all the display devices +# currently connected to any GPU on the X server. +# +# The format of the returned data is: +# +# 4 CARD32 number of display devices +# 4# n CARD32 display device indices +# +# This attribute can only be queried through XNVCTRLQueryTargetBinaryData(). +# + +NV_CTRL_BINARY_DATA_DISPLAY_TARGETS = 14 # R--- + +# +# NV_CTRL_BINARY_DATA_DISPLAYS_CONNECTED_TO_GPU - Returns the list of +# display devices that are connected to the GPU target. +# +# The format of the returned data is: +# +# 4 CARD32 number of display devices +# 4# n CARD32 display device indices +# +# This attribute can only be queried through XNVCTRLQueryTargetBinaryData() +# using a NV_CTRL_TARGET_TYPE_GPU target. +# + +NV_CTRL_BINARY_DATA_DISPLAYS_CONNECTED_TO_GPU = 15 # R--G + +# +# NV_CTRL_BINARY_DATA_METAMODES_VERSION_2 - Returns values similar to +# NV_CTRL_BINARY_DATA_METAMODES(_VERSION_1) but also returns extended syntax +# information to indicate a specific display device, as well as other per- +# display deviceflags as "token=value" pairs. For example: +# +# "DPY-1: 1280x1024 {Stereo=PassiveLeft}, +# DPY-2: 1280x1024 {Stereo=PassiveRight}," +# +# The display device names have the form "DPY-%d", where the integer +# part of the name is the NV-CONTROL target ID for that display device +# for this instance of the X server. Note that display device NV-CONTROL +# target IDs are not guaranteed to be the same from one run of the X +# server to the next. +# + +NV_CTRL_BINARY_DATA_METAMODES_VERSION_2 = 16 # R-D- + +# +# NV_CTRL_BINARY_DATA_DISPLAYS_ENABLED_ON_XSCREEN - Returns the list of +# display devices that are currently scanning out the X screen target. +# +# The format of the returned data is: +# +# 4 CARD32 number of display devices +# 4# n CARD32 display device indices +# +# This attribute can only be queried through XNVCTRLQueryTargetBinaryData() +# using a NV_CTRL_TARGET_TYPE_X_SCREEN target. +# + +NV_CTRL_BINARY_DATA_DISPLAYS_ENABLED_ON_XSCREEN = 17 # R--- + +# +# NV_CTRL_BINARY_DATA_DISPLAYS_ASSIGNED_TO_XSCREEN - Returns the list of +# display devices that are currently assigned the X screen target. +# +# The format of the returned data is: +# +# 4 CARD32 number of display devices +# 4# n CARD32 display device indices +# +# This attribute can only be queried through XNVCTRLQueryTargetBinaryData() +# using a NV_CTRL_TARGET_TYPE_X_SCREEN target. +# + +NV_CTRL_BINARY_DATA_DISPLAYS_ASSIGNED_TO_XSCREEN = 18 # R--- + +# +# NV_CTRL_BINARY_DATA_GPU_FLAGS - Returns a list of flags for the +# given GPU. A flag can, for instance, be a capability which enables +# or disables some features according to the GPU state. +# +# The format of the returned data is: +# +# 4 CARD32 number of GPU flags +# 4# n CARD32 GPU flag +# +# This attribute can only be queried through XNVCTRLQueryTargetBinaryData() +# using a NV_CTRL_TARGET_TYPE_GPU target. +# +NV_CTRL_BINARY_DATA_GPU_FLAGS = 19 # R--- + +# Stereo and display composition transformations are mutually exclusive. +NV_CTRL_BINARY_DATA_GPU_FLAGS_STEREO_DISPLAY_TRANSFORM_EXCLUSIVE = 0 +# Overlay and display composition transformations are mutually exclusive. +NV_CTRL_BINARY_DATA_GPU_FLAGS_OVERLAY_DISPLAY_TRANSFORM_EXCLUSIVE = 1 +# Depth 8 and display composition transformations are mutually exclusive. +NV_CTRL_BINARY_DATA_GPU_FLAGS_DEPTH_8_DISPLAY_TRANSFORM_EXCLUSIVE = 2 + +# +# NV_CTRL_BINARY_DATA_DISPLAYS_ON_GPU - Returns the list of valid +# display devices that can be connected to the GPU target. +# +# The format of the returned data is: +# +# 4 CARD32 number of display devices +# 4# n CARD32 display device indices +# +# This attribute can only be queried through XNVCTRLQueryTargetBinaryData() +# using a NV_CTRL_TARGET_TYPE_GPU target. +# + +NV_CTRL_BINARY_DATA_DISPLAYS_ON_GPU = 20 # R--G + +NV_CTRL_BINARY_DATA_LAST_ATTRIBUTE = NV_CTRL_BINARY_DATA_DISPLAYS_ON_GPU + +############################################################################ + +# +# String Operation Attributes: +# +# These attributes are used with the XNVCTRLStringOperation() +# function; a string is specified as input, and a string is returned +# as output. +# +# Unless otherwise noted, all attributes can be operated upon using +# an NV_CTRL_TARGET_TYPE_X_SCREEN target. +# + + +# +# NV_CTRL_STRING_OPERATION_ADD_METAMODE - provide a MetaMode string +# as input, and returns a string containing comma-separated list of +# "token=value" pairs as output. Currently, the only output token is +# "id", which indicates the id that was assigned to the MetaMode. +# +# All ModeLines referenced in the MetaMode must already exist for +# each display device (as returned by the +# NV_CTRL_BINARY_DATA_MODELINES attribute). +# +# The MetaMode string should have the same syntax as the MetaMode X +# configuration option, as documented in the NVIDIA driver README. +# +# The input string can optionally be prepended with a string of +# comma-separated "token=value" pairs, separated from the MetaMode +# string by "::". Currently, the only valid token is "index" which +# indicates the insertion index for the MetaMode. +# +# E.g., +# +# Input: "index=5 :: 1600x1200+0+0, 1600x1200+1600+0" +# Output: "id=58" +# +# which causes the MetaMode to be inserted at position 5 in the +# MetaMode list (all entries after 5 will be shifted down one slot in +# the list), and the X server's containing mode stores 58 as the +# VRefresh, so that the MetaMode can be uniquely identifed through +# XRandR and XF86VidMode. +# + +NV_CTRL_STRING_OPERATION_ADD_METAMODE = 0 # ---- + +# +# NV_CTRL_STRING_OPERATION_GTF_MODELINE - provide as input a string +# of comma-separated "token=value" pairs, and returns a ModeLine +# string, computed using the GTF formula using the parameters from +# the input string. Valid tokens for the input string are "width", +# "height", and "refreshrate". +# +# E.g., +# +# Input: "width=1600, height=1200, refreshrate=60" +# Output: "160.96 1600 1704 1880 2160 1200 1201 1204 1242 -HSync +VSync" +# +# This operation does not have any impact on any display device's +# modePool, and the ModeLine is not validated; it is simply intended +# for generating ModeLines. +# + +NV_CTRL_STRING_OPERATION_GTF_MODELINE = 1 # --- + +# +# NV_CTRL_STRING_OPERATION_CVT_MODELINE - provide as input a string +# of comma-separated "token=value" pairs, and returns a ModeLine +# string, computed using the CVT formula using the parameters from +# the input string. Valid tokens for the input string are "width", +# "height", "refreshrate", and "reduced-blanking". The +# "reduced-blanking" argument can be "0" or "1", to enable or disable +# use of reduced blanking for the CVT formula. +# +# E.g., +# +# Input: "width=1600, height=1200, refreshrate=60, reduced-blanking=1" +# Output: "130.25 1600 1648 1680 1760 1200 1203 1207 1235 +HSync -VSync" +# +# This operation does not have any impact on any display device's +# modePool, and the ModeLine is not validated; it is simply intended +# for generating ModeLines. +# + +NV_CTRL_STRING_OPERATION_CVT_MODELINE = 2 # --- + +# +# NV_CTRL_STRING_OPERATION_BUILD_MODEPOOL - build a ModePool for the +# specified display device on the specified target (either an X +# screen or a GPU). This is typically used to generate a ModePool +# for a display device on a GPU on which no X screens are present. +# +# Currently, a display device's ModePool is static for the life of +# the X server, so XNVCTRLStringOperation will return FALSE if +# requested to build a ModePool on a display device that already has +# a ModePool. +# +# The string input to BUILD_MODEPOOL may be NULL. If it is not NULL, +# then it is interpreted as a double-colon ("::") separated list +# of "option=value" pairs, where the options and the syntax of their +# values are the X configuration options that impact the behavior of +# modePool construction; namely: +# +# "ModeValidation" +# "HorizSync" +# "VertRefresh" +# "FlatPanelProperties" +# "ExactModeTimingsDVI" +# "UseEdidFreqs" +# +# An example input string might look like: +# +# "ModeValidation=NoVesaModes :: HorizSync=50-110 :: VertRefresh=50-150" +# +# This request currently does not return a string. +# + +NV_CTRL_STRING_OPERATION_BUILD_MODEPOOL = 3 # DG + +# +# NV_CTRL_STRING_OPERATION_GVI_CONFIGURE_STREAMS - Configure the streams- +# to-jack+channel topology for a GVI (Graphics capture board). +# +# The string input to GVI_CONFIGURE_STREAMS may be NULL. If this is the +# case, then the current topology is returned. +# +# If the input string to GVI_CONFIGURE_STREAMS is not NULL, the string +# is interpreted as a semicolon (";") separated list of comma-separated +# lists of "option=value" pairs that define a stream's composition. The +# available options and their values are: +# +# "stream": Defines which stream this comma-separated list describes. +# Valid values are the integers between 0 and +# NV_CTRL_GVI_NUM_STREAMS-1 (inclusive). +# +# "linkN": Defines a jack+channel pair to use for the given link N. +# Valid options are the string "linkN", where N is an integer +# between 0 and NV_CTRL_GVI_MAX_LINKS_PER_STREAM-1 (inclusive). +# Valid values for these options are strings of the form +# "jackX" and/or "jackX.Y", where X is an integer between 0 and +# NV_CTRL_GVI_NUM_JACKS-1 (inclusive), and Y (optional) is an +# integer between 0 and NV_CTRL_GVI_MAX_CHANNELS_PER_JACK-1 +# (inclusive). +# +# An example input string might look like: +# +# "stream=0, link0=jack0, link1=jack1; stream=1, link0=jack2.1" +# +# This example specifies two streams, stream 0 and stream 1. Stream 0 +# is defined to capture link0 data from the first channel (channel 0) of +# BNC jack 0 and link1 data from the first channel of BNC jack 1. The +# second stream (Stream 1) is defined to capture link0 data from channel 1 +# (second channel) of BNC jack 2. +# +# This example shows a possible configuration for capturing 3G input: +# +# "stream=0, link0=jack0.0, link1=jack0.1" +# +# Applications should query the following attributes to determine +# possible combinations: +# +# NV_CTRL_GVI_MAX_STREAMS +# NV_CTRL_GVI_MAX_LINKS_PER_STREAM +# NV_CTRL_GVI_NUM_JACKS +# NV_CTRL_GVI_MAX_CHANNELS_PER_JACK +# +# Note: A jack+channel pair can only be tied to one link/stream. +# +# Upon successful configuration or querying of this attribute, a string +# representing the current topology for all known streams on the device +# will be returned. On failure, NULL is returned. +# +# Note: Setting this attribute may also result in the following +# NV-CONTROL attributes being reset on the GVI device (to ensure +# the configuration remains valid): +# NV_CTRL_GVIO_REQUESTED_VIDEO_FORMAT +# NV_CTRL_GVI_REQUESTED_STREAM_BITS_PER_COMPONENT +# NV_CTRL_GVI_REQUESTED_STREAM_COMPONENT_SAMPLING +# + +NV_CTRL_STRING_OPERATION_GVI_CONFIGURE_STREAMS = 4 # RW-I + +# +# NV_CTRL_STRING_OPERATION_PARSE_METAMODE - Parses the given MetaMode string +# and returns the validated MetaMode string - possibly re-calculating various +# values such as ViewPortIn. If the MetaMode matches an existing MetaMode, +# the details of the existing MetaMode are returned. If the MetaMode fails to +# be parsed, NULL is returned. +# +NV_CTRL_STRING_OPERATION_PARSE_METAMODE = 5 # R--- + +NV_CTRL_STRING_OPERATION_LAST_ATTRIBUTE = NV_CTRL_STRING_OPERATION_PARSE_METAMODE + +############################################################################### +# NV-CONTROL major op numbers. these constants identify the request type +# +X_nvCtrlQueryExtension = 0 +X_nvCtrlQueryAttribute = 2 +X_nvCtrlQueryStringAttribute = 4 +X_nvCtrlQueryValidAttributeValues = 5 +X_nvCtrlSetStringAttribute = 9 +X_nvCtrlSetAttributeAndGetStatus = 19 +X_nvCtrlQueryBinaryData = 20 +X_nvCtrlQueryTargetCount = 24 +X_nvCtrlStringOperation = 25 + +############################################################################### +# various lists that go with attrs, but are handled more compactly +# this way. these lists are indexed by the possible values of their attrs +# and are explained in NVCtrl.h +# + +ATTRIBUTE_TYPE_UNKNOWN = 0 +ATTRIBUTE_TYPE_INTEGER = 1 +ATTRIBUTE_TYPE_BITMASK = 2 +ATTRIBUTE_TYPE_BOOL = 3 +ATTRIBUTE_TYPE_RANGE = 4 +ATTRIBUTE_TYPE_INT_BITS = 5 + +ATTRIBUTE_TYPE_READ = 0x01 +ATTRIBUTE_TYPE_WRITE = 0x02 +ATTRIBUTE_TYPE_DISPLAY = 0x04 +ATTRIBUTE_TYPE_GPU = 0x08 +ATTRIBUTE_TYPE_FRAMELOCK = 0x10 +ATTRIBUTE_TYPE_X_SCREEN = 0x20 +ATTRIBUTE_TYPE_XINERAMA = 0x40 +ATTRIBUTE_TYPE_VCSC = 0x80 + +############################################################################ + +# +# Attribute Targets +# +# Targets define attribute groups. For example, some attributes are only +# valid to set on a GPU, others are only valid when talking about an +# X Screen. Target types are then what is used to identify the target +# group of the attribute you wish to set/query. +# +# Here are the supported target types: +# + +NV_CTRL_TARGET_TYPE_X_SCREEN = 0 +NV_CTRL_TARGET_TYPE_GPU = 1 +NV_CTRL_TARGET_TYPE_FRAMELOCK = 2 +# Visual Computing System - deprecated. To be removed along with all +# VCS-specific attributes in a later release. +NV_CTRL_TARGET_TYPE_VCSC = 3 +NV_CTRL_TARGET_TYPE_GVI = 4 +NV_CTRL_TARGET_TYPE_COOLER = 5 # e.g., fan +NV_CTRL_TARGET_TYPE_THERMAL_SENSOR = 6 +NV_CTRL_TARGET_TYPE_3D_VISION_PRO_TRANSCEIVER = 7 +NV_CTRL_TARGET_TYPE_DISPLAY = 8 + + +############################################################################### +# Targets, to indicate where a command should be executed. +# +class Target(object): + def __init__(self): + self._id = -1 + self._type = -1 + self._name = '' + + def id(self): + return self._id + + def type(self): + return self._type + + def __str__(self): + return ''.format(self._name, self.id()) + + +class Gpu(Target): + def __init__(self, ngpu=0): + """Target a GPU""" + super(self.__class__, self).__init__() + self._id = ngpu + self._type = NV_CTRL_TARGET_TYPE_GPU + self._name = 'GPU' + + +class Screen(Target): + def __init__(self, nscr=0): + """Target an X screen""" + super(self.__class__, self).__init__() + self._id = nscr + self._type = NV_CTRL_TARGET_TYPE_X_SCREEN + self._name = 'X screen' + + +class Cooler(Target): + def __init__(self, nfan=0): + """Target a fann""" + super(self.__class__, self).__init__() + self._id = nfan + self._type = NV_CTRL_TARGET_TYPE_COOLER + self._name = 'Cooler' + + +class NVCtrlQueryTargetCountReplyRequest(rq.ReplyRequest): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(X_nvCtrlQueryTargetCount), + rq.RequestLength(), + rq.Card32('target_type'), + ) + _reply = rq.Struct( + rq.ReplyCode(), + rq.Card8('padb1'), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Card32('count'), + rq.Card32('pad4'), + rq.Card32('pad5'), + rq.Card32('pad6'), + rq.Card32('pad7'), + rq.Card32('pad8'), + ) + + +class NVCtrlQueryAttributeReplyRequest(rq.ReplyRequest): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(X_nvCtrlQueryAttribute), + rq.RequestLength(), + rq.Card16('target_id'), + rq.Card16('target_type'), + rq.Card32('display_mask'), + rq.Card32('attr'), + ) + _reply = rq.Struct( + rq.ReplyCode(), + rq.Card8('pad0'), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Card32('flags'), + rq.Int32('value'), + rq.Card32('pad4'), + rq.Card32('pad5'), + rq.Card32('pad6'), + rq.Card32('pad7'), + ) + + +class NVCtrlSetAttributeAndGetStatusReplyRequest(rq.ReplyRequest): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(X_nvCtrlSetAttributeAndGetStatus), + rq.RequestLength(), + rq.Card16('target_id'), + rq.Card16('target_type'), + rq.Card32('display_mask'), + rq.Card32('attr'), + rq.Int32('value') + ) + _reply = rq.Struct( + rq.ReplyCode(), + rq.Card8('pad0'), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Card32('flags'), + rq.Card32('pad3'), + rq.Card32('pad4'), + rq.Card32('pad5'), + rq.Card32('pad6'), + rq.Card32('pad7'), + ) + + +class NVCtrlQueryStringAttributeReplyRequest(rq.ReplyRequest): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(X_nvCtrlQueryStringAttribute), + rq.RequestLength(), + rq.Card16('target_id'), + rq.Card16('target_type'), + rq.Card32('display_mask'), + rq.Card32('attr'), + ) + _reply = rq.Struct( + rq.ReplyCode(), + rq.Card8('pad0'), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Card32('flags'), + rq.Card32('string', 4), + rq.Card32('pad4'), + rq.Card32('pad5'), + rq.Card32('pad6'), + rq.Card32('pad7'), + rq.String8('string'), + ) + + +class NVCtrlQueryValidAttributeValuesReplyRequest(rq.ReplyRequest): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(X_nvCtrlQueryValidAttributeValues), + rq.RequestLength(), + rq.Card16('target_id'), + rq.Card16('target_type'), + rq.Card32('display_mask'), + rq.Card32('attr'), + ) + _reply = rq.Struct( + rq.ReplyCode(), + rq.Card8('pad0'), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Card32('flags'), + rq.Int32('attr_type'), + rq.Int32('min'), + rq.Int32('max'), + rq.Card32('bits'), + rq.Card32('perms'), + ) + + +class NVCtrlQueryBinaryDataReplyRequest(rq.ReplyRequest): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(X_nvCtrlQueryBinaryData), + rq.RequestLength(), + rq.Card16('target_id'), + rq.Card16('target_type'), + rq.Card32('display_mask'), + rq.Card32('attr'), + ) + _reply = rq.Struct( + rq.ReplyCode(), + rq.Card8('pad0'), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Card32('flags'), + rq.Card32('data', 4), + rq.Card32('pad4'), + rq.Card32('pad5'), + rq.Card32('pad6'), + rq.Card32('pad7'), + rq.Binary('data'), + ) + + +class NVCtrlQueryListCard32ReplyRequest(rq.ReplyRequest): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(X_nvCtrlQueryBinaryData), + rq.RequestLength(), + rq.Card16('target_id'), + rq.Card16('target_type'), + rq.Card32('display_mask'), + rq.Card32('attr'), + ) + _reply = rq.Struct( + rq.ReplyCode(), + rq.Card8('pad0'), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Card32('flags'), + rq.Card32('list', 4), + rq.Card32('pad4'), + rq.Card32('pad5'), + rq.Card32('pad6'), + rq.Card32('pad7'), + rq.List('list', rq.Card32), + ) diff --git a/venv/lib/python3.12/site-packages/Xlib/ext/randr.py b/venv/lib/python3.12/site-packages/Xlib/ext/randr.py new file mode 100644 index 0000000..8149c48 --- /dev/null +++ b/venv/lib/python3.12/site-packages/Xlib/ext/randr.py @@ -0,0 +1,1292 @@ +# Xlib.ext.randr -- RandR extension module +# +# Copyright (C) 2006 Mike Meyer +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public License +# as published by the Free Software Foundation; either version 2.1 +# of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the +# Free Software Foundation, Inc., +# 59 Temple Place, +# Suite 330, +# Boston, MA 02111-1307 USA + + +"""RandR - provide access to the RandR extension information. + +This implementation is based off version 1.5 of the XRandR protocol, and may +not be compatible with other versions. + +Version 1.5 of the protocol is documented at: +http://cgit.freedesktop.org/xorg/proto/randrproto/tree/randrproto.txt + +Version 1.3.1 here: +http://www.x.org/releases/X11R7.5/doc/randrproto/randrproto.txt + +""" + + +from Xlib import X +from Xlib.protocol import rq + +extname = 'RANDR' + + +# Event codes # +RRScreenChangeNotify = 0 + +# V1.2 additions +RRNotify = 1 + +# RRNotify Subcodes +RRNotify_CrtcChange = 0 +RRNotify_OutputChange = 1 +RRNotify_OutputProperty = 2 + + +# Event selection bits # +RRScreenChangeNotifyMask = (1 << 0) + +# V1.2 additions +RRCrtcChangeNotifyMask = (1 << 1) +RROutputChangeNotifyMask = (1 << 2) +RROutputPropertyNotifyMask = (1 << 3) + + +# Constants # +SetConfigSuccess = 0 +SetConfigInvalidConfigTime = 1 +SetConfigInvalidTime = 2 +SetConfigFailed = 3 + +# used in the rotation field; rotation and reflection in 0.1 proto. +Rotate_0 = 1 +Rotate_90 = 2 +Rotate_180 = 4 +Rotate_270 = 8 + +# new in 1.0 protocol, to allow reflection of screen +Reflect_X = 16 +Reflect_Y = 32 + +# new in 1.2 protocol +HSyncPositive = 0x00000001 +HSyncNegative = 0x00000002 +VSyncPositive = 0x00000004 +VSyncNegative = 0x00000008 +Interlace = 0x00000010 +DoubleScan = 0x00000020 +CSync = 0x00000040 +CSyncPositive = 0x00000080 +CSyncNegative = 0x00000100 +HSkewPresent = 0x00000200 +BCast = 0x00000400 +PixelMultiplex = 0x00000800 +DoubleClock = 0x00001000 +ClockDivideBy2 = 0x00002000 + +# event types? +Connected = 0 +Disconnected = 1 +UnknownConnection = 2 + +# Conventional RandR output properties +PROPERTY_RANDR_EDID = "EDID" +PROPERTY_SIGNAL_FORMAT = "SignalFormat" +PROPERTY_SIGNAL_PROPERTIES = "SignalProperties" +PROPERTY_CONNECTOR_TYPE = "ConnectorType" +PROPERTY_CONNECTOR_NUMBER = "ConnectorNumber" +PROPERTY_COMPATIBILITY_LIST = "CompatibilityList" +PROPERTY_CLONE_LIST = "CloneList" + +# subpixel order - TODO: These constants are part of the RENDER extension and +# should be moved there if/when that extension is added to python-xlib. +SubPixelUnknown = 0 +SubPixelHorizontalRGB = 1 +SubPixelHorizontalBGR = 2 +SubPixelVerticalRGB = 3 +SubPixelVerticalBGR = 4 +SubPixelNone = 5 + + +# Error Codes # +BadRROutput = 0 +BadRRCrtc = 1 +BadRRMode = 2 + +# Error classes # +class BadRROutputError(Exception): pass + +class BadRRCrtcError(Exception): pass + +class BadRRModeError(Exception): pass + +# Data Structures # + +RandR_ScreenSizes = rq.Struct( + rq.Card16('width_in_pixels'), + rq.Card16('height_in_pixels'), + rq.Card16('width_in_millimeters'), + rq.Card16('height_in_millimeters'), + ) + + +RandR_ModeInfo = rq.Struct( + rq.Card32('id'), + rq.Card16('width'), + rq.Card16('height'), + rq.Card32('dot_clock'), + rq.Card16('h_sync_start'), + rq.Card16('h_sync_end'), + rq.Card16('h_total'), + rq.Card16('h_skew'), + rq.Card16('v_sync_start'), + rq.Card16('v_sync_end'), + rq.Card16('v_total'), + rq.Card16('name_length'), + rq.Card32('flags'), + ) + +RandR_Rates = rq.Struct( + rq.LengthOf('rates', 2), + rq.List('rates', rq.Card16Obj) + ) + +# TODO: This struct is part of the RENDER extension and should be moved there +# if/when that extension is added to python-xlib. +Render_Transform = rq.Struct( + rq.Card32('matrix11'), #FIXME: All of these are listed as FIXED in the protocol header. + rq.Card32('matrix12'), + rq.Card32('matrix13'), + rq.Card32('matrix21'), + rq.Card32('matrix22'), + rq.Card32('matrix23'), + rq.Card32('matrix31'), + rq.Card32('matrix32'), + rq.Card32('matrix33'), + ) + +MonitorInfo = rq.Struct( + rq.Card32('name'), + rq.Bool('primary'), + rq.Bool('automatic'), + rq.LengthOf('crtcs', 2), + rq.Int16('x'), + rq.Int16('y'), + rq.Card16('width_in_pixels'), + rq.Card16('height_in_pixels'), + rq.Card32('width_in_millimeters'), + rq.Card32('height_in_millimeters'), + rq.List('crtcs', rq.Card32Obj) +) + +# Requests # + +class QueryVersion(rq.ReplyRequest): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(0), + rq.RequestLength(), + rq.Card32('major_version'), + rq.Card32('minor_version'), + ) + _reply = rq.Struct( + rq.ReplyCode(), + rq.Pad(1), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Card32('major_version'), + rq.Card32('minor_version'), + rq.Pad(16), + ) + +def query_version(self): + """Get the current version of the RandR extension. + + """ + return QueryVersion( + display=self.display, + opcode=self.display.get_extension_major(extname), + major_version=1, + minor_version=5, + ) + + +class _1_0SetScreenConfig(rq.ReplyRequest): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(2), + rq.RequestLength(), + rq.Drawable('drawable'), + rq.Card32('timestamp'), + rq.Card32('config_timestamp'), + rq.Card16('size_id'), + rq.Card16('rotation'), + ) + _reply = rq.Struct( + rq.ReplyCode(), + rq.Card8('status'), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Card32('new_timestamp'), + rq.Card32('new_config_timestamp'), + rq.Window('root'), + rq.Card16('subpixel_order'), + rq.Pad(10), + ) + +def _1_0set_screen_config(self, size_id, rotation, config_timestamp, timestamp=X.CurrentTime): + """Sets the screen to the specified size and rotation. + + """ + return _1_0SetScreenConfig( + display=self.display, + opcode=self.display.get_extension_major(extname), + drawable=self, + timestamp=timestamp, + config_timestamp=config_timestamp, + size_id=size_id, + rotation=rotation, + ) + + +class SetScreenConfig(rq.ReplyRequest): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(2), + rq.RequestLength(), + rq.Drawable('drawable'), + rq.Card32('timestamp'), + rq.Card32('config_timestamp'), + rq.Card16('size_id'), + rq.Card16('rotation'), + rq.Card16('rate'), # added in version 1.1 + rq.Pad(2), + ) + _reply = rq.Struct( + rq.ReplyCode(), + rq.Card8('status'), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Card32('new_timestamp'), + rq.Card32('new_config_timestamp'), + rq.Window('root'), + rq.Card16('subpixel_order'), + rq.Pad(10), + ) + +def set_screen_config(self, size_id, rotation, config_timestamp, rate=0, timestamp=X.CurrentTime): + """Sets the screen to the specified size, rate, rotation and reflection. + + rate can be 0 to have the server select an appropriate rate. + + """ + return SetScreenConfig( + display=self.display, + opcode=self.display.get_extension_major(extname), + drawable=self, + timestamp=timestamp, + config_timestamp=config_timestamp, + size_id=size_id, + rotation=rotation, + rate=rate, + ) + + +class SelectInput(rq.Request): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(4), + rq.RequestLength(), + rq.Window('window'), + rq.Card16('mask'), + rq.Pad(2), + ) + +def select_input(self, mask): + return SelectInput( + display=self.display, + opcode=self.display.get_extension_major(extname), + window=self, + mask=mask, + ) + + +class GetScreenInfo(rq.ReplyRequest): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(5), + rq.RequestLength(), + rq.Window('window'), + ) + _reply = rq.Struct( + rq.ReplyCode(), + rq.Card8('set_of_rotations'), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Window('root'), + rq.Card32('timestamp'), + rq.Card32('config_timestamp'), + rq.LengthOf('sizes', 2), + rq.Card16('size_id'), + rq.Card16('rotation'), + rq.Card16('rate'), # added in version 1.1 + rq.Card16('n_rate_ents'), # XCB's protocol description disagrees with the X headers on this; ignoring. + rq.Pad(2), + rq.List('sizes', RandR_ScreenSizes), + #rq.List('rates', RandR_Rates) #FIXME: Why does uncommenting this cause an error? + ) + +def get_screen_info(self): + """Retrieve information about the current and available configurations for + the screen associated with this window. + + """ + return GetScreenInfo( + display=self.display, + opcode=self.display.get_extension_major(extname), + window=self, + ) + + +# version 1.2 + +class GetScreenSizeRange(rq.ReplyRequest): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(6), + rq.RequestLength(), + rq.Window('window'), + ) + _reply = rq.Struct( + rq.ReplyCode(), + rq.Pad(1), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Card16('min_width'), + rq.Card16('min_height'), + rq.Card16('max_width'), + rq.Card16('max_height'), + rq.Pad(16), + ) + +def get_screen_size_range(self): + """Retrieve the range of possible screen sizes. The screen may be set to + any size within this range. + + """ + return GetScreenSizeRange( + display=self.display, + opcode=self.display.get_extension_major(extname), + window=self, + ) + + +class SetScreenSize(rq.Request): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(7), + rq.RequestLength(), + rq.Window('window'), + rq.Card16('width'), + rq.Card16('height'), + rq.Card32('width_in_millimeters'), + rq.Card32('height_in_millimeters'), + ) + +def set_screen_size(self, width, height, width_in_millimeters=None, height_in_millimeters=None): + return SetScreenSize( + display=self.display, + opcode=self.display.get_extension_major(extname), + window=self, + width=width, + height=height, + width_in_millimeters=width_in_millimeters, + height_in_millimeters=height_in_millimeters, + ) + + +class GetScreenResources(rq.ReplyRequest): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(8), + rq.RequestLength(), + rq.Window('window'), + ) + _reply = rq.Struct( + rq.ReplyCode(), + rq.Pad(1), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Card32('timestamp'), + rq.Card32('config_timestamp'), + rq.LengthOf('crtcs', 2), + rq.LengthOf('outputs', 2), + rq.LengthOf('modes', 2), + rq.LengthOf('mode_names', 2), + rq.Pad(8), + rq.List('crtcs', rq.Card32Obj), + rq.List('outputs', rq.Card32Obj), + rq.List('modes', RandR_ModeInfo), + rq.String8('mode_names'), + ) + +def get_screen_resources(self): + return GetScreenResources( + display=self.display, + opcode=self.display.get_extension_major(extname), + window=self, + ) + + +class GetOutputInfo(rq.ReplyRequest): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(9), + rq.RequestLength(), + rq.Card32('output'), + rq.Card32('config_timestamp'), + ) + _reply = rq.Struct( + rq.ReplyCode(), + rq.Card8('status'), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Card32('timestamp'), + rq.Card32('crtc'), + rq.Card32('mm_width'), + rq.Card32('mm_height'), + rq.Card8('connection'), + rq.Card8('subpixel_order'), + rq.LengthOf('crtcs', 2), + rq.LengthOf('modes', 2), + rq.Card16('num_preferred'), + rq.LengthOf('clones', 2), + rq.LengthOf('name', 2), + rq.List('crtcs', rq.Card32Obj), + rq.List('modes', rq.Card32Obj), + rq.List('clones', rq.Card32Obj), + rq.String8('name'), + ) + +def get_output_info(self, output, config_timestamp): + return GetOutputInfo( + display=self.display, + opcode=self.display.get_extension_major(extname), + output=output, + config_timestamp=config_timestamp, + ) + + +class ListOutputProperties(rq.ReplyRequest): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(10), + rq.RequestLength(), + rq.Card32('output'), + ) + _reply = rq.Struct( + rq.ReplyCode(), + rq.Pad(1), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.LengthOf('atoms', 2), + rq.Pad(22), + rq.List('atoms', rq.Card32Obj), + ) + +def list_output_properties(self, output): + return ListOutputProperties ( + display=self.display, + opcode=self.display.get_extension_major(extname), + output=output, + ) + + +class QueryOutputProperty(rq.ReplyRequest): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(11), + rq.RequestLength(), + rq.Card32('output'), + rq.Card32('property'), + ) + _reply = rq.Struct( + rq.ReplyCode(), + rq.Pad(1), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Bool('pending'), + rq.Bool('range'), + rq.Bool('immutable'), + rq.Pad(21), + rq.List('valid_values', rq.Card32Obj), + ) + +def query_output_property(self, output, property): + return QueryOutputProperty ( + display=self.display, + opcode=self.display.get_extension_major(extname), + output=output, + property=property, + ) + + +class ConfigureOutputProperty (rq.Request): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(12), + rq.RequestLength(), + rq.Card32('output'), + rq.Card32('property'), + rq.Bool('pending'), + rq.Bool('range'), + rq.Pad(2), + rq.List('valid_values', rq.Card32Obj), + ) + +def configure_output_property (self, output, property): + return ConfigureOutputProperty ( + display=self.display, + opcode=self.display.get_extension_major(extname), + output=output, + property=property, + ) + + +class ChangeOutputProperty(rq.Request): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(13), + rq.RequestLength(), + rq.Card32('output'), + rq.Card32('property'), + rq.Card32('type'), + rq.Format('value', 1), + rq.Card8('mode'), + rq.Pad(2), + rq.LengthOf('value', 4), + rq.PropertyData('value'), + ) + +def change_output_property(self, output, property, type, mode, value): + return ChangeOutputProperty( + display=self.display, + opcode=self.display.get_extension_major(extname), + output=output, + property=property, + type=type, + mode=mode, + value=value, + ) + + +class DeleteOutputProperty(rq.Request): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(14), + rq.RequestLength(), + rq.Card32('output'), + rq.Card32('property'), + ) + +def delete_output_property(self, output, property): + return DeleteOutputProperty( + display=self.display, + opcode=self.display.get_extension_major(extname), + output=output, + property=property, + ) + + +class GetOutputProperty(rq.ReplyRequest): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(15), + rq.RequestLength(), + rq.Card32('output'), + rq.Card32('property'), + rq.Card32('type'), + rq.Card32('long_offset'), + rq.Card32('long_length'), + rq.Bool('delete'), + rq.Bool('pending'), + rq.Pad(2), + ) + _reply = rq.Struct( + rq.ReplyCode(), + rq.Format('value', 1), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Card32('property_type'), + rq.Card32('bytes_after'), + rq.LengthOf('value', 4), + rq.Pad(12), + rq.List('value', rq.Card8Obj), + ) + +def get_output_property(self, output, property, type, long_offset, long_length, delete=False, pending=False): + return GetOutputProperty( + display=self.display, + opcode=self.display.get_extension_major(extname), + output=output, + property=property, + type=type, + long_offset=long_offset, + long_length=long_length, + delete=delete, + pending=pending, + ) + + +class CreateMode(rq.ReplyRequest): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(16), + rq.RequestLength(), + rq.Window('window'), + rq.Object('mode', RandR_ModeInfo), + rq.String8('name'), + ) + _reply = rq.Struct( + rq.ReplyCode(), + rq.Pad(1), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Card32('mode'), + rq.Pad(20), + ) + +def create_mode(self, mode, name): + return CreateMode ( + display=self.display, + opcode=self.display.get_extension_major(extname), + window=self, + mode=mode, + name=name, + ) + + +class DestroyMode(rq.Request): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(17), + rq.RequestLength(), + rq.Card32('mode'), + ) + +def destroy_mode(self, mode): + return DestroyMode( + display=self.display, + opcode=self.display.get_extension_major(extname), + mode=mode, + ) + + +class AddOutputMode(rq.Request): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(18), + rq.RequestLength(), + rq.Card32('output'), + rq.Card32('mode'), + ) + +def add_output_mode(self, output, mode): + return AddOutputMode( + display=self.display, + opcode=self.display.get_extension_major(extname), + output=output, + mode=mode, + ) + + +class DeleteOutputMode(rq.Request): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(19), + rq.RequestLength(), + rq.Card32('output'), + rq.Card32('mode'), + ) + +def delete_output_mode(self, output, mode): + return DeleteOutputMode( + display=self.display, + opcode=self.display.get_extension_major(extname), + output=output, + mode=mode, + ) + + +class GetCrtcInfo(rq.ReplyRequest): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(20), + rq.RequestLength(), + rq.Card32('crtc'), + rq.Card32('config_timestamp'), + ) + _reply = rq.Struct( + rq.ReplyCode(), + rq.Card8('status'), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Card32('timestamp'), + rq.Int16('x'), + rq.Int16('y'), + rq.Card16('width'), + rq.Card16('height'), + rq.Card32('mode'), + rq.Card16('rotation'), + rq.Card16('possible_rotations'), + rq.LengthOf('outputs', 2), + rq.LengthOf('possible_outputs', 2), + rq.List('outputs', rq.Card32Obj), + rq.List('possible_outputs', rq.Card32Obj), + ) + +def get_crtc_info(self, crtc, config_timestamp): + return GetCrtcInfo ( + display=self.display, + opcode=self.display.get_extension_major(extname), + crtc=crtc, + config_timestamp=config_timestamp, + ) + + +class SetCrtcConfig(rq.ReplyRequest): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(21), + rq.RequestLength(), + rq.Card32('crtc'), + rq.Card32('timestamp'), + rq.Card32('config_timestamp'), + rq.Int16('x'), + rq.Int16('y'), + rq.Card32('mode'), + rq.Card16('rotation'), + rq.Pad(2), + rq.List('outputs', rq.Card32Obj), + ) + _reply = rq.Struct( + rq.ReplyCode(), + rq.Card8('status'), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Card32('new_timestamp'), + rq.Pad(20), + ) + +def set_crtc_config(self, crtc, config_timestamp, x, y, mode, rotation, outputs, timestamp=X.CurrentTime): + return SetCrtcConfig ( + display=self.display, + opcode=self.display.get_extension_major(extname), + crtc=crtc, + config_timestamp=config_timestamp, + x=x, + y=y, + mode=mode, + rotation=rotation, + outputs=outputs, + timestamp=timestamp, + ) + + +class GetCrtcGammaSize(rq.ReplyRequest): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(22), + rq.RequestLength(), + rq.Card32('crtc'), + ) + _reply = rq.Struct( + rq.ReplyCode(), + rq.Card8('status'), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Card16('size'), + rq.Pad(22), + ) + +def get_crtc_gamma_size(self, crtc): + return GetCrtcGammaSize ( + display=self.display, + opcode=self.display.get_extension_major(extname), + crtc=crtc, + ) + + +class GetCrtcGamma(rq.ReplyRequest): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(23), + rq.RequestLength(), + rq.Card32('crtc'), + ) + _reply = rq.Struct( + rq.ReplyCode(), + rq.Card8('status'), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.LengthOf(('red', 'green', 'blue'), 2), + rq.Pad(22), + rq.List('red', rq.Card16Obj), + rq.List('green', rq.Card16Obj), + rq.List('blue', rq.Card16Obj), + ) + +def get_crtc_gamma(self, crtc): + return GetCrtcGamma ( + display=self.display, + opcode=self.display.get_extension_major(extname), + crtc=crtc, + ) + + +class SetCrtcGamma(rq.Request): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(24), + rq.RequestLength(), + rq.Card32('crtc'), + rq.Card16('size'), + rq.Pad(2), + rq.List('red', rq.Card16Obj), + rq.List('green', rq.Card16Obj), + rq.List('blue', rq.Card16Obj), + ) + +def set_crtc_gamma(self, crtc, size, red, green, blue): + return SetCrtcGamma( + display=self.display, + opcode=self.display.get_extension_major(extname), + crtc=crtc, + size=size, + red=red, + green=green, + blue=blue, + ) + + +# version 1.3 + +class GetScreenResourcesCurrent(rq.ReplyRequest): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(25), + rq.RequestLength(), + rq.Window('window'), + ) + _reply = rq.Struct( + rq.ReplyCode(), + rq.Pad(1), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Card32('timestamp'), + rq.Card32('config_timestamp'), + rq.LengthOf('crtcs', 2), + rq.LengthOf('outputs', 2), + rq.LengthOf('modes', 2), + rq.LengthOf('names', 2), + rq.Pad(8), + rq.List('crtcs', rq.Card32Obj), + rq.List('outputs', rq.Card32Obj), + rq.List('modes', RandR_ModeInfo), + rq.String8('names'), + ) + +def get_screen_resources_current(self): + return GetScreenResourcesCurrent( + display=self.display, + opcode=self.display.get_extension_major(extname), + window=self, + ) + + +class SetCrtcTransform(rq.Request): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(26), + rq.RequestLength(), + rq.Card32('crtc'), + rq.Object('transform', Render_Transform), + rq.LengthOf('filter_name', 2), + rq.Pad(2), + rq.String8('filter_name'), + rq.List('filter_params', rq.Card32Obj), #FIXME: The protocol says FIXED? http://cgit.freedesktop.org/xorg/proto/randrproto/tree/randrproto.txt#n2161 + ) + +def set_crtc_transform(self, crtc, n_bytes_filter): + return SetCrtcTransform( + display=self.display, + opcode=self.display.get_extension_major(extname), + crtc=crtc, + n_bytes_filter=n_bytes_filter, + ) + + +class GetCrtcTransform(rq.ReplyRequest): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(27), + rq.RequestLength(), + rq.Card32('crtc'), + ) + _reply = rq.Struct( + rq.ReplyCode(), + rq.Card8('status'), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Object('pending_transform', Render_Transform), + rq.Bool('has_transforms'), + rq.Pad(3), + rq.Object('current_transform', Render_Transform), + rq.Pad(4), + rq.LengthOf('pending_filter_name', 2), + rq.LengthOf('pending_filter_params', 2), + rq.LengthOf('current_filter_name', 2), + rq.LengthOf('current_filter_params', 2), + rq.String8('pending_filter_name'), + rq.List('pending_filter_params', rq.Card32Obj), #FIXME: The protocol says FIXED? http://cgit.freedesktop.org/xorg/proto/randrproto/tree/randrproto.txt#n2161 + rq.String8('current_filter_name'), + rq.List('current_filter_params', rq.Card32Obj), #FIXME: The protocol says FIXED? http://cgit.freedesktop.org/xorg/proto/randrproto/tree/randrproto.txt#n2161 + ) + +def get_crtc_transform(self, crtc): + return GetCrtcTransform( + display=self.display, + opcode=self.display.get_extension_major(extname), + crtc=crtc, + ) + + +class GetPanning(rq.ReplyRequest): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(28), + rq.RequestLength(), + rq.Card32('crtc'), + ) + _reply = rq.Struct( + rq.ReplyCode(), + rq.Card8('status'), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Card32('timestamp'), + rq.Card16('left'), + rq.Card16('top'), + rq.Card16('width'), + rq.Card16('height'), + rq.Card16('track_left'), + rq.Card16('track_top'), + rq.Card16('track_width'), + rq.Card16('track_height'), + rq.Int16('border_left'), + rq.Int16('border_top'), + rq.Int16('border_right'), + rq.Int16('border_bottom'), + ) + +def get_panning(self, crtc): + return GetPanning ( + display=self.display, + opcode=self.display.get_extension_major(extname), + crtc=crtc, + ) + + +class SetPanning(rq.ReplyRequest): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(29), + rq.RequestLength(), + rq.Card32('crtc'), + rq.Card32('timestamp'), + rq.Card16('left'), + rq.Card16('top'), + rq.Card16('width'), + rq.Card16('height'), + rq.Card16('track_left'), + rq.Card16('track_top'), + rq.Card16('track_width'), + rq.Card16('track_height'), + rq.Int16('border_left'), + rq.Int16('border_top'), + rq.Int16('border_right'), + rq.Int16('border_bottom'), + ) + _reply = rq.Struct( + rq.ReplyCode(), + rq.Card8('status'), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Card32('new_timestamp'), + rq.Pad(20), + ) + +def set_panning(self, crtc, left, top, width, height, track_left, track_top, track_width, track_height, border_left, border_top, border_width, border_height, timestamp=X.CurrentTime): + return SetPanning ( + display=self.display, + opcode=self.display.get_extension_major(extname), + crtc=crtc, + left=left, + top=top, + width=width, + height=height, + track_left=track_left, + track_top=track_top, + track_width=track_width, + track_height=track_height, + border_left=border_left, + border_top=border_top, + border_width=border_width, + border_height=border_height, + timestamp=timestamp, + ) + + +class SetOutputPrimary(rq.Request): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(30), + rq.RequestLength(), + rq.Window('window'), + rq.Card32('output'), + ) + +def set_output_primary(self, output): + return SetOutputPrimary( + display=self.display, + opcode=self.display.get_extension_major(extname), + window=self, + output=output, + ) + + +class GetOutputPrimary(rq.ReplyRequest): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(31), + rq.RequestLength(), + rq.Window('window'), + ) + _reply = rq.Struct( + rq.ReplyCode(), + rq.Pad(1), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Card32('output'), + rq.Pad(20), + ) + +def get_output_primary(self): + return GetOutputPrimary( + display=self.display, + opcode=self.display.get_extension_major(extname), + window=self, + ) + + +# Version 1.5 methods + +class GetMonitors(rq.ReplyRequest): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(42), + rq.RequestLength(), + rq.Window('window'), + rq.Bool('is_active'), + rq.Pad(3) + ) + + _reply = rq.Struct( + rq.ReplyCode(), + rq.Pad(1), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Card32('timestamp'), + rq.LengthOf('monitors', 4), + rq.Card32('outputs'), + rq.Pad(12), + rq.List('monitors', MonitorInfo) + ) + + +def get_monitors(self, is_active=True): + return GetMonitors( + display=self.display, + opcode=self.display.get_extension_major(extname), + window=self, + is_active=is_active + ) + +class SetMonitor(rq.Request): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(43), + rq.RequestLength(), + rq.Window('window'), + rq.Object('monitor_info', MonitorInfo) + ) + + +def set_monitor(self, monitor_info): + return SetMonitor( + display=self.display, + opcode=self.display.get_extension_major(extname), + window=self, + monitor_info=monitor_info + ) + + +class DeleteMonitor(rq.Request): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(44), + rq.RequestLength(), + rq.Window('window'), + rq.Card32('name') + ) + + +def delete_monitor(self, name): + return DeleteMonitor( + display=self.display, + opcode=self.display.get_extension_major(extname), + window=self, + name=name + ) + +# Events # + +class ScreenChangeNotify(rq.Event): + _code = None + _fields = rq.Struct( + rq.Card8('type'), + rq.Card8('rotation'), + rq.Card16('sequence_number'), + rq.Card32('timestamp'), + rq.Card32('config_timestamp'), + rq.Window('root'), + rq.Window('window'), + rq.Card16('size_id'), + rq.Card16('subpixel_order'), + rq.Card16('width_in_pixels'), + rq.Card16('height_in_pixels'), + rq.Card16('width_in_millimeters'), + rq.Card16('height_in_millimeters'), + ) + + +class CrtcChangeNotify(rq.Event): + _code = None + _fields = rq.Struct( + rq.Card8('type'), + rq.Card8('sub_code'), + rq.Card16('sequence_number'), + rq.Card32('timestamp'), + rq.Window('window'), + rq.Card32('crtc'), + rq.Card32('mode'), + rq.Card16('rotation'), + rq.Pad(2), + rq.Int16('x'), + rq.Int16('y'), + rq.Card16('width'), + rq.Card16('height'), + ) + + +class OutputChangeNotify(rq.Event): + _code = None + _fields = rq.Struct( + rq.Card8('type'), + rq.Card8('sub_code'), + rq.Card16('sequence_number'), + rq.Card32('timestamp'), + rq.Card32('config_timestamp'), + rq.Window('window'), + rq.Card32('output'), + rq.Card32('crtc'), + rq.Card32('mode'), + rq.Card16('rotation'), + rq.Card8('connection'), + rq.Card8('subpixel_order'), + ) + + +class OutputPropertyNotify(rq.Event): + _code = None + _fields = rq.Struct( + rq.Card8('type'), + rq.Card8('sub_code'), + rq.Card16('sequence_number'), + rq.Window('window'), + rq.Card32('output'), + rq.Card32('atom'), + rq.Card32('timestamp'), + rq.Card8('state'), + rq.Pad(11), + ) +# Initialization # + +def init(disp, info): + disp.extension_add_method('display', 'xrandr_query_version', query_version) + disp.extension_add_method('window', 'xrandr_select_input', select_input) + disp.extension_add_method('window', 'xrandr_get_screen_info', get_screen_info) + disp.extension_add_method('drawable', 'xrandr_1_0set_screen_config', _1_0set_screen_config) + disp.extension_add_method('drawable', 'xrandr_set_screen_config', set_screen_config) + disp.extension_add_method('window', 'xrandr_get_screen_size_range', get_screen_size_range) + disp.extension_add_method('window', 'xrandr_set_screen_size', set_screen_size) + disp.extension_add_method('window', 'xrandr_get_screen_resources', get_screen_resources) + disp.extension_add_method('display', 'xrandr_get_output_info', get_output_info) + disp.extension_add_method('display', 'xrandr_list_output_properties', list_output_properties) + disp.extension_add_method('display', 'xrandr_query_output_property', query_output_property) + disp.extension_add_method('display', 'xrandr_configure_output_property ', configure_output_property ) + disp.extension_add_method('display', 'xrandr_change_output_property', change_output_property) + disp.extension_add_method('display', 'xrandr_delete_output_property', delete_output_property) + disp.extension_add_method('display', 'xrandr_get_output_property', get_output_property) + disp.extension_add_method('window', 'xrandr_create_mode', create_mode) + disp.extension_add_method('display', 'xrandr_destroy_mode', destroy_mode) + disp.extension_add_method('display', 'xrandr_add_output_mode', add_output_mode) + disp.extension_add_method('display', 'xrandr_delete_output_mode', delete_output_mode) + disp.extension_add_method('display', 'xrandr_get_crtc_info', get_crtc_info) + disp.extension_add_method('display', 'xrandr_set_crtc_config', set_crtc_config) + disp.extension_add_method('display', 'xrandr_get_crtc_gamma_size', get_crtc_gamma_size) + disp.extension_add_method('display', 'xrandr_get_crtc_gamma', get_crtc_gamma) + disp.extension_add_method('display', 'xrandr_set_crtc_gamma', set_crtc_gamma) + disp.extension_add_method('window', 'xrandr_get_screen_resources_current', get_screen_resources_current) + disp.extension_add_method('display', 'xrandr_set_crtc_transform', set_crtc_transform) + disp.extension_add_method('display', 'xrandr_get_crtc_transform', get_crtc_transform) + disp.extension_add_method('window', 'xrandr_set_output_primary', set_output_primary) + disp.extension_add_method('window', 'xrandr_get_output_primary', get_output_primary) + disp.extension_add_method('display', 'xrandr_get_panning', get_panning) + disp.extension_add_method('display', 'xrandr_set_panning', set_panning) + + # If the server is running RANDR 1.5+, enable 1.5 compatible methods and events + version = query_version(disp) + if version.major_version == 1 and version.minor_version >= 5: + # version 1.5 compatible + disp.extension_add_method('window', 'xrandr_get_monitors', get_monitors) + disp.extension_add_method('window', 'xrandr_set_monitor', set_monitor) + disp.extension_add_method('window', 'xrandr_delete_monitor', delete_monitor) + + disp.extension_add_event(info.first_event + RRScreenChangeNotify, ScreenChangeNotify) + # add RRNotify events (1 event code with 3 subcodes) + disp.extension_add_subevent(info.first_event + RRNotify, RRNotify_CrtcChange, CrtcChangeNotify) + disp.extension_add_subevent(info.first_event + RRNotify, RRNotify_OutputChange, OutputChangeNotify) + disp.extension_add_subevent(info.first_event + RRNotify, RRNotify_OutputProperty, OutputPropertyNotify) + + disp.extension_add_error(BadRROutput, BadRROutputError) + disp.extension_add_error(BadRRCrtc, BadRRCrtcError) + disp.extension_add_error(BadRRMode, BadRRModeError) diff --git a/venv/lib/python3.12/site-packages/Xlib/ext/record.py b/venv/lib/python3.12/site-packages/Xlib/ext/record.py new file mode 100644 index 0000000..5b1e2a8 --- /dev/null +++ b/venv/lib/python3.12/site-packages/Xlib/ext/record.py @@ -0,0 +1,282 @@ +# Xlib.ext.record -- RECORD extension module +# +# Copyright (C) 2006 Alex Badea +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public License +# as published by the Free Software Foundation; either version 2.1 +# of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the +# Free Software Foundation, Inc., +# 59 Temple Place, +# Suite 330, +# Boston, MA 02111-1307 USA + +from Xlib.protocol import rq + +extname = 'RECORD' + +FromServerTime = 0x01 +FromClientTime = 0x02 +FromClientSequence = 0x04 + +CurrentClients = 1 +FutureClients = 2 +AllClients = 3 + +FromServer = 0 +FromClient = 1 +ClientStarted = 2 +ClientDied = 3 +StartOfData = 4 +EndOfData = 5 + +Record_Range8 = rq.Struct( + rq.Card8('first'), + rq.Card8('last')) +Record_Range16 = rq.Struct( + rq.Card16('first'), + rq.Card16('last')) +Record_ExtRange = rq.Struct( + rq.Card8('major_range_first'), + rq.Card8('major_range_last'), + rq.Card16('minor_range_first'), + rq.Card16('minor_range_last')) +Record_Range = rq.Struct( + rq.Object('core_requests', Record_Range8), + rq.Object('core_replies', Record_Range8), + rq.Object('ext_requests', Record_ExtRange), + rq.Object('ext_replies', Record_ExtRange), + rq.Object('delivered_events', Record_Range8), + rq.Object('device_events', Record_Range8), + rq.Object('errors', Record_Range8), + rq.Bool('client_started'), + rq.Bool('client_died')) + +Record_ClientInfo = rq.Struct( + rq.Card32('client_resource'), + rq.LengthOf('ranges', 4), + rq.List('ranges', Record_Range)) + + +class RawField(rq.ValueField): + """A field with raw data, stored as a string""" + + structcode = None + + def pack_value(self, val): + return val, len(val), None + + def parse_binary_value(self, data, display, length, format): + return data, '' + + +class GetVersion(rq.ReplyRequest): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(0), + rq.RequestLength(), + rq.Card16('major_version'), + rq.Card16('minor_version')) + _reply = rq.Struct( + rq.Pad(2), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Card16('major_version'), + rq.Card16('minor_version'), + rq.Pad(20)) + +def get_version(self, major, minor): + return GetVersion( + display = self.display, + opcode = self.display.get_extension_major(extname), + major_version = major, + minor_version = minor) + + +class CreateContext(rq.Request): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(1), + rq.RequestLength(), + rq.Card32('context'), # Record_RC + rq.Card8('element_header'), # Record_Element_Header + rq.Pad(3), + rq.LengthOf('clients', 4), + rq.LengthOf('ranges', 4), + rq.List('clients', rq.Card32Obj), + rq.List('ranges', Record_Range)) + +def create_context(self, datum_flags, clients, ranges): + context = self.display.allocate_resource_id() + CreateContext( + display = self.display, + opcode = self.display.get_extension_major(extname), + context = context, + element_header = datum_flags, + clients = clients, + ranges = ranges) + return context + + +class RegisterClients(rq.Request): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(2), + rq.RequestLength(), + rq.Card32('context'), # Record_RC + rq.Card8('element_header'), # Record_Element_Header + rq.Pad(3), + rq.LengthOf('clients', 4), + rq.LengthOf('ranges', 4), + rq.List('clients', rq.Card32Obj), + rq.List('ranges', Record_Range)) + +def register_clients(self, context, element_header, clients, ranges): + RegisterClients( + display = self.display, + opcode = self.display.get_extension_major(extname), + context = context, + element_header = element_header, + clients = clients, + ranges = ranges) + + +class UnregisterClients(rq.Request): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(3), + rq.RequestLength(), + rq.Card32('context'), # Record_RC + rq.LengthOf('clients', 4), + rq.List('clients', rq.Card32Obj)) + +def unregister_clients(self, context, clients): + UnregisterClients( + display = self.display, + opcode = self.display.get_extension_major(extname), + context = context, + clients = clients) + + +class GetContext(rq.ReplyRequest): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(4), + rq.RequestLength(), + rq.Card32('context')) # Record_RC + _reply = rq.Struct( + rq.Pad(2), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Card8('element_header'), # Record_Element_Header + rq.Pad(3), + rq.LengthOf('client_info', 4), + rq.Pad(16), + rq.List('client_info', Record_ClientInfo)) + +def get_context(self, context): + return GetContext( + display = self.display, + opcode = self.display.get_extension_major(extname), + context = context) + + +class EnableContext(rq.ReplyRequest): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(5), + rq.RequestLength(), + rq.Card32('context')) # Record_RC + _reply = rq.Struct( + rq.Pad(1), + rq.Card8('category'), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Card8('element_header'), # Record_Element_Header + rq.Bool('client_swapped'), + rq.Pad(2), + rq.Card32('id_base'), # Record_XIDBase + rq.Card32('server_time'), + rq.Card32('recorded_sequence_number'), + rq.Pad(8), + RawField('data')) + + # This request receives multiple responses, so we need to keep + # ourselves in the 'sent_requests' list in order to receive them all. + + # See the discussion on ListFonstsWithInfo in request.py + + def __init__(self, callback, *args, **keys): + self._callback = callback + rq.ReplyRequest.__init__(self, *args, **keys) + + def _parse_response(self, data): + r, d = self._reply.parse_binary(data, self._display) + self._callback(r) + + if r.category == StartOfData: + # Hack ourselves a sequence number, used by the code in + # Xlib.protocol.display.Display.parse_request_response() + self.sequence_number = r.sequence_number + + if r.category == EndOfData: + self._response_lock.acquire() + self._data = r + self._response_lock.release() + else: + self._display.sent_requests.insert(0, self) + +def enable_context(self, context, callback): + EnableContext( + callback = callback, + display = self.display, + opcode = self.display.get_extension_major(extname), + context = context) + + +class DisableContext(rq.Request): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(6), + rq.RequestLength(), + rq.Card32('context')) # Record_RC + +def disable_context(self, context): + DisableContext( + display = self.display, + opcode = self.display.get_extension_major(extname), + context = context) + + +class FreeContext(rq.Request): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(7), + rq.RequestLength(), + rq.Card32('context')) # Record_RC + +def free_context(self, context): + FreeContext( + display = self.display, + opcode = self.display.get_extension_major(extname), + context = context) + self.display.free_resource_id(context) + + +def init(disp, info): + disp.extension_add_method('display', 'record_get_version', get_version) + disp.extension_add_method('display', 'record_create_context', create_context) + disp.extension_add_method('display', 'record_register_clients', register_clients) + disp.extension_add_method('display', 'record_unregister_clients', unregister_clients) + disp.extension_add_method('display', 'record_get_context', get_context) + disp.extension_add_method('display', 'record_enable_context', enable_context) + disp.extension_add_method('display', 'record_disable_context', disable_context) + disp.extension_add_method('display', 'record_free_context', free_context) diff --git a/venv/lib/python3.12/site-packages/Xlib/ext/res.py b/venv/lib/python3.12/site-packages/Xlib/ext/res.py new file mode 100644 index 0000000..810a3b9 --- /dev/null +++ b/venv/lib/python3.12/site-packages/Xlib/ext/res.py @@ -0,0 +1,288 @@ +# Xlib.ext.res -- X-Resource extension module +# +# Copyright (C) 2021 Aleksei Bavshin +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public License +# as published by the Free Software Foundation; either version 2.1 +# of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the +# Free Software Foundation, Inc., +# 51 Franklin Street, +# Fifth Floor, +# Boston, MA 02110-1301 USA + +"""X-Resource extension allows a client to query the X server about its usage +of various resources. + +For detailed description see any of the following documents. +Protocol specification: + https://www.x.org/releases/current/doc/resourceproto/resproto.txt +XCB Protocol specification: + https://cgit.freedesktop.org/xcb/proto/tree/src/res.xml +""" +from Xlib.protocol import rq + +RES_MAJOR_VERSION = 1 +RES_MINOR_VERSION = 2 + +extname = "X-Resource" + +# v1.0 +ResQueryVersion = 0 +ResQueryClients = 1 +ResQueryClientResources = 2 +ResQueryClientPixmapBytes = 3 +# v1.2 +ResQueryClientIds = 4 +ResQueryResourceBytes = 5 + + +class QueryVersion(rq.ReplyRequest): + _request = rq.Struct( + rq.Card8("opcode"), + rq.Opcode(ResQueryVersion), + rq.RequestLength(), + rq.Card8("client_major"), + rq.Card8("client_minor"), + rq.Pad(2)) + _reply = rq.Struct( + rq.ReplyCode(), + rq.Pad(1), + rq.Card16("sequence_number"), + rq.ReplyLength(), + rq.Card16("server_major"), + rq.Card16("server_minor"), + rq.Pad(20)) + + +def query_version(self, client_major=RES_MAJOR_VERSION, + client_minor=RES_MINOR_VERSION): + """ Query the protocol version supported by the X server. + + The client sends the highest supported version to the server and the + server sends the highest version it supports, but no higher than the + requested version.""" + return QueryVersion( + display=self.display, + opcode=self.display.get_extension_major(extname), + client_major=client_major, + client_minor=client_minor) + + +Client = rq.Struct( + rq.Card32("resource_base"), + rq.Card32("resource_mask")) + + +class QueryClients(rq.ReplyRequest): + _request = rq.Struct( + rq.Card8("opcode"), + rq.Opcode(ResQueryClients), + rq.RequestLength()) + _reply = rq.Struct( + rq.ReplyCode(), + rq.Pad(1), + rq.Card16("sequence_number"), + rq.ReplyLength(), + rq.LengthOf("clients", 4), + rq.Pad(20), + rq.List("clients", Client)) + + +def query_clients(self): + """Request the list of all currently connected clients.""" + return QueryClients( + display=self.display, + opcode=self.display.get_extension_major(extname)) + + +Type = rq.Struct( + rq.Card32("resource_type"), + rq.Card32("count")) + + +class QueryClientResources(rq.ReplyRequest): + _request = rq.Struct( + rq.Card8("opcode"), + rq.Opcode(ResQueryClientResources), + rq.RequestLength(), + rq.Card32("client")) + _reply = rq.Struct( + rq.ReplyCode(), + rq.Pad(1), + rq.Card16("sequence_number"), + rq.ReplyLength(), + rq.LengthOf("types", 4), + rq.Pad(20), + rq.List("types", Type)) + + +def query_client_resources(self, client): + """Request the number of resources owned by a client. + + The server will return the counts of each type of resource. + """ + return QueryClientResources( + display=self.display, + opcode=self.display.get_extension_major(extname), + client=client) + + +class QueryClientPixmapBytes(rq.ReplyRequest): + _request = rq.Struct( + rq.Card8("opcode"), + rq.Opcode(ResQueryClientPixmapBytes), + rq.RequestLength(), + rq.Card32("client")) + _reply = rq.Struct( + rq.ReplyCode(), + rq.Pad(1), + rq.Card16("sequence_number"), + rq.ReplyLength(), + rq.Card32("bytes"), + rq.Card32("bytes_overflow"), + rq.Pad(16)) + + +def query_client_pixmap_bytes(self, client): + """Query the pixmap usage of some client. + + The returned number is a sum of memory usage of each pixmap that can be + attributed to the given client. + """ + return QueryClientPixmapBytes( + display=self.display, + opcode=self.display.get_extension_major(extname), + client=client) + + +class SizeOf(rq.LengthOf): + """A SizeOf stores the size in bytes of some other Field whose size + may vary, e.g. List + """ + def __init__(self, name, size, item_size): + rq.LengthOf.__init__(self, name, size) + self.item_size = item_size + + def parse_value(self, length, display): + return length // self.item_size + + +ClientXIDMask = 1 << 0 +LocalClientPIDMask = 1 << 1 + + +ClientIdSpec = rq.Struct( + rq.Card32("client"), + rq.Card32("mask")) + + +ClientIdValue = rq.Struct( + rq.Object("spec", ClientIdSpec), + SizeOf("value", 4, 4), + rq.List("value", rq.Card32Obj)) + + +class QueryClientIds(rq.ReplyRequest): + _request = rq.Struct( + rq.Card8("opcode"), + rq.Opcode(ResQueryClientIds), + rq.RequestLength(), + rq.LengthOf("specs", 4), + rq.List("specs", ClientIdSpec)) + _reply = rq.Struct( + rq.ReplyCode(), + rq.Pad(1), + rq.Card16("sequence_number"), + rq.ReplyLength(), + rq.LengthOf("ids", 4), + rq.Pad(20), + rq.List("ids", ClientIdValue)) + + +def query_client_ids(self, specs): + """Request to identify a given set of clients with some identification method. + + The request sends a list of specifiers that select clients and + identification methods to server. The server then tries to identify the + chosen clients using the identification methods specified for each client. + The server returns IDs for those clients that were successfully identified. + """ + return QueryClientIds( + display=self.display, + opcode=self.display.get_extension_major(extname), + specs=specs) + + +ResourceIdSpec = rq.Struct( + rq.Card32("resource"), + rq.Card32("type")) + + +ResourceSizeSpec = rq.Struct( + # inline struct ResourceIdSpec to work around + # a parser bug with nested objects + rq.Card32("resource"), + rq.Card32("type"), + rq.Card32("bytes"), + rq.Card32("ref_count"), + rq.Card32("use_count")) + + +ResourceSizeValue = rq.Struct( + rq.Object("size", ResourceSizeSpec), + rq.LengthOf("cross_references", 4), + rq.List("cross_references", ResourceSizeSpec)) + + +class QueryResourceBytes(rq.ReplyRequest): + _request = rq.Struct( + rq.Card8("opcode"), + rq.Opcode(ResQueryResourceBytes), + rq.RequestLength(), + rq.Card32("client"), + rq.LengthOf("specs", 4), + rq.List("specs", ResourceIdSpec)) + _reply = rq.Struct( + rq.ReplyCode(), + rq.Pad(1), + rq.Card16("sequence_number"), + rq.ReplyLength(), + rq.LengthOf("sizes", 4), + rq.Pad(20), + rq.List("sizes", ResourceSizeValue)) + + +def query_resource_bytes(self, client, specs): + """Query the sizes of resources from X server. + + The request sends a list of specifiers that selects resources for size + calculation. The server tries to calculate the sizes of chosen resources + and returns an estimate for a resource only if the size could be determined + """ + return QueryResourceBytes( + display=self.display, + opcode=self.display.get_extension_major(extname), + client=client, + specs=specs) + + +def init(disp, info): + disp.extension_add_method("display", "res_query_version", query_version) + disp.extension_add_method("display", "res_query_clients", query_clients) + disp.extension_add_method("display", "res_query_client_resources", + query_client_resources) + disp.extension_add_method("display", "res_query_client_pixmap_bytes", + query_client_pixmap_bytes) + disp.extension_add_method("display", "res_query_client_ids", + query_client_ids) + disp.extension_add_method("display", "res_query_resource_bytes", + query_resource_bytes) diff --git a/venv/lib/python3.12/site-packages/Xlib/ext/screensaver.py b/venv/lib/python3.12/site-packages/Xlib/ext/screensaver.py new file mode 100644 index 0000000..d6bad53 --- /dev/null +++ b/venv/lib/python3.12/site-packages/Xlib/ext/screensaver.py @@ -0,0 +1,198 @@ +# Xlib.ext.screensaver -- X ScreenSaver extension module +# +# Copyright (C) 2022 Vladimir Panteleev +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public License +# as published by the Free Software Foundation; either version 2.1 +# of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the +# Free Software Foundation, Inc., +# 51 Franklin Street, +# Fifth Floor, +# Boston, MA 02110-1301 USA + +"""This extension allows registering the client as an X screensaver, +or query information about the current screensaver. + +For detailed description see any of the following documents. +Protocol specification: + https://www.x.org/releases/X11R7.7/doc/scrnsaverproto/saver.html +XCB Protocol specification: + https://cgit.freedesktop.org/xcb/proto/tree/src/screensaver.xml + +""" + +from Xlib import X +from Xlib.protocol import rq, structs + +extname = 'MIT-SCREEN-SAVER' + +# Event members +NotifyMask = 1 +CycleMask = 2 + +# Notify state +StateOff = 0 +StateOn = 1 +StateCycle = 2 + +# Notify kind +KindBlanked = 0 +KindInternal = 1 +KindExternal = 2 + +class QueryVersion(rq.ReplyRequest): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(0), + rq.RequestLength(), + rq.Card8('major_version'), + rq.Card8('minor_version'), + rq.Pad(2), + ) + + _reply = rq.Struct( + rq.ReplyCode(), + rq.Pad(1), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Card16('major_version'), + rq.Card16('minor_version'), + rq.Pad(20), + ) + +def query_version(self): + return QueryVersion(display=self.display, + opcode=self.display.get_extension_major(extname), + major_version=1, + minor_version=0) + + +class QueryInfo(rq.ReplyRequest): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(1), + rq.RequestLength(), + rq.Drawable('drawable'), + ) + + _reply = rq.Struct( + rq.ReplyCode(), + rq.Card8('state'), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Window('saver_window'), + rq.Card32('til_or_since'), + rq.Card32('idle'), + rq.Card32('event_mask'), # rq.Set('event_mask', 4, (NotifyMask, CycleMask)), + rq.Card8('kind'), + rq.Pad(7), + ) + +def query_info(self): + return QueryInfo(display=self.display, + opcode=self.display.get_extension_major(extname), + drawable=self, + ) + + +class SelectInput(rq.Request): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(2), + rq.RequestLength(), + rq.Drawable('drawable'), + rq.Card32('event_mask'), # rq.Set('event_mask', 4, (NotifyMask, CycleMask)), + ) + +def select_input(self, mask): + return SelectInput(display=self.display, + opcode=self.display.get_extension_major(extname), + drawable=self, + event_mask=mask, + ) + + +class SetAttributes(rq.Request): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(3), + rq.RequestLength(), + rq.Drawable('drawable'), + rq.Int16('x'), + rq.Int16('y'), + rq.Card16('width'), + rq.Card16('height'), + rq.Card16('border_width'), + rq.Set('window_class', 1, (X.CopyFromParent, X.InputOutput, X.InputOnly)), + rq.Card8('depth'), + rq.Card32('visual'), + structs.WindowValues('attrs'), + ) + +def set_attributes(self, x, y, width, height, border_width, + window_class = X.CopyFromParent, + depth = X.CopyFromParent, + visual = X.CopyFromParent, + onerror = None, + **keys): + return SetAttributes(display=self.display, + onerror = onerror, + opcode=self.display.get_extension_major(extname), + drawable=self, + x = x, + y = y, + width = width, + height = height, + border_width = border_width, + window_class = window_class, + depth = depth, + visual = visual, + attrs = keys) + + +class UnsetAttributes(rq.Request): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(4), + rq.RequestLength(), + rq.Drawable('drawable'), + ) + +def unset_attributes(self, onerror = None): + return UnsetAttributes(display=self.display, + onerror = onerror, + opcode=self.display.get_extension_major(extname), + drawable=self) + + +class Notify(rq.Event): + _code = None + _fields = rq.Struct( + rq.Card8('type'), + rq.Set('state', 1, (StateOff, StateOn, StateCycle)), + rq.Card16('sequence_number'), + rq.Card32('timestamp'), + rq.Window('root'), + rq.Window('window'), + rq.Set('kind', 1, (KindBlanked, KindInternal, KindExternal)), + rq.Bool('forced'), + rq.Pad(14), + ) + +def init(disp, info): + disp.extension_add_method('display', 'screensaver_query_version', query_version) + disp.extension_add_method('drawable', 'screensaver_query_info', query_info) + disp.extension_add_method('drawable', 'screensaver_select_input', select_input) + disp.extension_add_method('drawable', 'screensaver_set_attributes', set_attributes) + disp.extension_add_method('drawable', 'screensaver_unset_attributes', unset_attributes) + + disp.extension_add_event(info.first_event + 0, Notify) diff --git a/venv/lib/python3.12/site-packages/Xlib/ext/security.py b/venv/lib/python3.12/site-packages/Xlib/ext/security.py new file mode 100644 index 0000000..ea5070c --- /dev/null +++ b/venv/lib/python3.12/site-packages/Xlib/ext/security.py @@ -0,0 +1,139 @@ +# Xlib.ext.security -- SECURITY extension module +# +# Copyright (C) 2010-2013 Outpost Embedded, LLC +# Forest Bond +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public License +# as published by the Free Software Foundation; either version 2.1 +# of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the +# Free Software Foundation, Inc., +# 59 Temple Place, +# Suite 330, +# Boston, MA 02111-1307 USA + +''' +A partial implementation of the SECURITY extension. Support for the +SecurityAuthorizationRevoked event is not implemented. +''' + +from Xlib.protocol import rq + + +extname = 'SECURITY' + + +SecurityClientTrusted = 0 +SecurityClientUntrusted = 1 + +SecurityAuthorizationRevokedMask = 1 + + +AUTHID = rq.Card32 + + +class QueryVersion(rq.ReplyRequest): + _request = rq.Struct(rq.Card8('opcode'), + rq.Opcode(0), + rq.RequestLength(), + rq.Card16('major_version'), + rq.Card16('minor_version') + ) + _reply = rq.Struct(rq.ReplyCode(), + rq.Pad(1), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Card16('major_version'), + rq.Card16('minor_version'), + rq.Pad(20) + ) + + +def query_version(self): + return QueryVersion(display=self.display, + opcode=self.display.get_extension_major(extname), + major_version=1, + minor_version=0) + + +class SecurityGenerateAuthorization(rq.ReplyRequest): + # The order of fields here does not match the specifications I've seen + # online, but it *does* match with the X.org implementation. I guess the + # spec is out-of-date. + _request = rq.Struct(rq.Card8('opcode'), + rq.Opcode(1), + rq.RequestLength(), + rq.LengthOf('auth_proto', 2), + rq.LengthOf('auth_data', 2), + rq.Card32('value_mask'), + rq.String8('auth_proto'), + rq.Binary('auth_data'), + rq.List('values', rq.Card32Obj) + ) + _reply = rq.Struct(rq.ReplyCode(), + rq.Pad(1), + rq.Card16('sequence_number'), + rq.ReplyLength(), + AUTHID('authid'), + rq.LengthOf('auth_data_return', 2), + rq.Pad(18), + rq.Binary('auth_data_return') + ) + + +def generate_authorization(self, auth_proto, auth_data=b'', timeout=None, + trust_level=None, group=None, event_mask=None): + value_mask = 0 + values = [] + if timeout is not None: + value_mask |= 1 + values.append(timeout) + if trust_level is not None: + value_mask |= 2 + values.append(trust_level) + if group is not None: + value_mask |= 4 + values.append(group) + if event_mask is not None: + value_mask |= 8 + values.append(event_mask) + return SecurityGenerateAuthorization(display=self.display, + opcode=self.display.get_extension_major(extname), + value_mask=value_mask, + auth_proto=auth_proto, + auth_data=auth_data, + values=values) + + +class SecurityRevokeAuthorization(rq.Request): + _request = rq.Struct(rq.Card8('opcode'), + rq.Opcode(2), + rq.RequestLength(), + AUTHID('authid') + ) + + +def revoke_authorization(self, authid): + return SecurityRevokeAuthorization(display=self.display, + opcode=self.display.get_extension_major(extname), + authid=authid) + + +def init(disp, info): + disp.extension_add_method('display', + 'security_query_version', + query_version) + disp.extension_add_method('display', + 'security_generate_authorization', + generate_authorization) + disp.extension_add_method('display', + 'security_revoke_authorization', + revoke_authorization) diff --git a/venv/lib/python3.12/site-packages/Xlib/ext/shape.py b/venv/lib/python3.12/site-packages/Xlib/ext/shape.py new file mode 100644 index 0000000..1fd440a --- /dev/null +++ b/venv/lib/python3.12/site-packages/Xlib/ext/shape.py @@ -0,0 +1,297 @@ +# Automatically generated file; DO NOT EDIT. +# Generated from: /usr/share/xcb/shape.xml + +from Xlib.protocol import rq, structs + + +extname = 'SHAPE' + +OP = rq.Card8 + +class SO: + Set = 0 + Union = 1 + Intersect = 2 + Subtract = 3 + Invert = 4 + +class SK: + Bounding = 0 + Clip = 1 + Input = 2 + +class KIND(rq.Set): + + def __init__(self, name): + super(KIND, self).__init__(name, 1, + values=(SK.Bounding, + SK.Clip, + SK.Input)) + +class NotifyEventData(rq.Event): + _code = None + _fields = rq.Struct( + rq.Card8('type'), + KIND('shape_kind'), + rq.Card16('sequence_number'), + rq.Window('affected_window'), + rq.Int16('extents_x'), + rq.Int16('extents_y'), + rq.Card16('extents_width'), + rq.Card16('extents_height'), + rq.Card32('server_time'), + rq.Card8('shaped'), + rq.Pad(11), + ) + +class QueryVersion(rq.ReplyRequest): + + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(0), + rq.RequestLength(), + ) + + _reply = rq.Struct( + rq.ReplyCode(), + rq.Pad(1), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Card16('major_version'), + rq.Card16('minor_version'), + ) + +class Rectangles(rq.Request): + + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(1), + rq.RequestLength(), + OP('operation'), + KIND('destination_kind'), + rq.Card8('ordering'), + rq.Pad(1), + rq.Window('destination_window'), + rq.Int16('x_offset'), + rq.Int16('y_offset'), + rq.List('rectangles', structs.Rectangle, pad=0), + ) + +class Mask(rq.Request): + + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(2), + rq.RequestLength(), + OP('operation'), + KIND('destination_kind'), + rq.Pad(2), + rq.Window('destination_window'), + rq.Int16('x_offset'), + rq.Int16('y_offset'), + rq.Pixmap('source_bitmap'), + ) + +class Combine(rq.Request): + + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(3), + rq.RequestLength(), + OP('operation'), + KIND('destination_kind'), + KIND('source_kind'), + rq.Pad(1), + rq.Window('destination_window'), + rq.Int16('x_offset'), + rq.Int16('y_offset'), + rq.Window('source_window'), + ) + +class Offset(rq.Request): + + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(4), + rq.RequestLength(), + KIND('destination_kind'), + rq.Pad(3), + rq.Window('destination_window'), + rq.Int16('x_offset'), + rq.Int16('y_offset'), + ) + +class QueryExtents(rq.ReplyRequest): + + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(5), + rq.RequestLength(), + rq.Window('destination_window'), + ) + + _reply = rq.Struct( + rq.ReplyCode(), + rq.Pad(1), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Card8('bounding_shaped'), + rq.Card8('clip_shaped'), + rq.Pad(2), + rq.Int16('bounding_shape_extents_x'), + rq.Int16('bounding_shape_extents_y'), + rq.Card16('bounding_shape_extents_width'), + rq.Card16('bounding_shape_extents_height'), + rq.Int16('clip_shape_extents_x'), + rq.Int16('clip_shape_extents_y'), + rq.Card16('clip_shape_extents_width'), + rq.Card16('clip_shape_extents_height'), + ) + +class SelectInput(rq.Request): + + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(6), + rq.RequestLength(), + rq.Window('destination_window'), + rq.Card8('enable'), + rq.Pad(3), + ) + +class InputSelected(rq.ReplyRequest): + + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(7), + rq.RequestLength(), + rq.Window('destination_window'), + ) + + _reply = rq.Struct( + rq.ReplyCode(), + rq.Card8('enabled'), + rq.Card16('sequence_number'), + rq.ReplyLength(), + ) + +class GetRectangles(rq.ReplyRequest): + + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(8), + rq.RequestLength(), + rq.Window('window'), + KIND('source_kind'), + rq.Pad(3), + ) + + _reply = rq.Struct( + rq.ReplyCode(), + rq.Card8('ordering'), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.LengthOf('rectangles', 4), + rq.Pad(20), + rq.List('rectangles', structs.Rectangle, pad=0), + ) + +class Event: + # Sub events. + Notify = 0 + +def combine(self, operation, destination_kind, source_kind, x_offset, y_offset): + Combine( + display=self.display, + opcode=self.display.get_extension_major(extname), + source_window=self, + operation=operation, + destination_kind=destination_kind, + source_kind=source_kind, + x_offset=x_offset, + y_offset=y_offset, + ) + +def get_rectangles(self, source_kind): + return GetRectangles( + display=self.display, + opcode=self.display.get_extension_major(extname), + window=self, + source_kind=source_kind, + ) + +def input_selected(self, ): + return InputSelected( + display=self.display, + opcode=self.display.get_extension_major(extname), + destination_window=self, + ) + +def mask(self, operation, destination_kind, x_offset, y_offset, source_bitmap): + Mask( + display=self.display, + opcode=self.display.get_extension_major(extname), + destination_window=self, + operation=operation, + destination_kind=destination_kind, + x_offset=x_offset, + y_offset=y_offset, + source_bitmap=source_bitmap, + ) + +def offset(self, destination_kind, x_offset, y_offset): + Offset( + display=self.display, + opcode=self.display.get_extension_major(extname), + destination_window=self, + destination_kind=destination_kind, + x_offset=x_offset, + y_offset=y_offset, + ) + +def query_extents(self, ): + return QueryExtents( + display=self.display, + opcode=self.display.get_extension_major(extname), + destination_window=self, + ) + +def query_version(self, ): + return QueryVersion( + display=self.display, + opcode=self.display.get_extension_major(extname), + ) + +def rectangles(self, operation, destination_kind, ordering, x_offset, y_offset, rectangles): + Rectangles( + display=self.display, + opcode=self.display.get_extension_major(extname), + destination_window=self, + operation=operation, + destination_kind=destination_kind, + ordering=ordering, + x_offset=x_offset, + y_offset=y_offset, + rectangles=rectangles, + ) + +def select_input(self, enable): + SelectInput( + display=self.display, + opcode=self.display.get_extension_major(extname), + destination_window=self, + enable=enable, + ) + +def init(disp, info): + disp.extension_add_method('window', 'shape_combine', combine) + disp.extension_add_method('window', 'shape_get_rectangles', get_rectangles) + disp.extension_add_method('window', 'shape_input_selected', input_selected) + disp.extension_add_method('window', 'shape_mask', mask) + disp.extension_add_method('window', 'shape_offset', offset) + disp.extension_add_method('window', 'shape_query_extents', query_extents) + disp.extension_add_method('display', 'shape_query_version', query_version) + disp.extension_add_method('window', 'shape_rectangles', rectangles) + disp.extension_add_method('window', 'shape_select_input', select_input) + disp.extension_add_event(info.first_event + Event.Notify, NotifyEventData, 'ShapeNotify') + diff --git a/venv/lib/python3.12/site-packages/Xlib/ext/xfixes.py b/venv/lib/python3.12/site-packages/Xlib/ext/xfixes.py new file mode 100644 index 0000000..a7cf35f --- /dev/null +++ b/venv/lib/python3.12/site-packages/Xlib/ext/xfixes.py @@ -0,0 +1,200 @@ +# Xlib.ext.xfixes -- XFIXES extension module +# +# Copyright (C) 2010-2011 Outpost Embedded, LLC +# Forest Bond +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public License +# as published by the Free Software Foundation; either version 2.1 +# of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the +# Free Software Foundation, Inc., +# 59 Temple Place, +# Suite 330, +# Boston, MA 02111-1307 USA + +''' +A partial implementation of the XFIXES extension. Only the HideCursor and +ShowCursor requests and SelectionNotify events are provided. +''' + +from Xlib.protocol import rq + +extname = 'XFIXES' + +XFixesSelectionNotify = 0 +XFixesCursorNotify = 1 + +XFixesSetSelectionOwnerNotifyMask = (1 << 0) +XFixesSelectionWindowDestroyNotifyMask = (1 << 1) +XFixesSelectionClientCloseNotifyMask = (1 << 2) +XFixesDisplayCursorNotifyMask = (1 << 0) + +XFixesSetSelectionOwnerNotify = 0 +XFixesSelectionWindowDestroyNotify = 1 +XFixesSelectionClientCloseNotify = 2 +XFixesDisplayCursorNotify = 0 + +class QueryVersion(rq.ReplyRequest): + _request = rq.Struct(rq.Card8('opcode'), + rq.Opcode(0), + rq.RequestLength(), + rq.Card32('major_version'), + rq.Card32('minor_version') + ) + _reply = rq.Struct(rq.ReplyCode(), + rq.Pad(1), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Card32('major_version'), + rq.Card32('minor_version'), + rq.Pad(16) + ) + + +def query_version(self): + return QueryVersion(display=self.display, + opcode=self.display.get_extension_major(extname), + major_version=4, + minor_version=0) + + +class HideCursor(rq.Request): + _request = rq.Struct(rq.Card8('opcode'), + rq.Opcode(29), + rq.RequestLength(), + rq.Window('window') + ) + +def hide_cursor(self): + HideCursor(display=self.display, + opcode=self.display.get_extension_major(extname), + window=self) + + +class ShowCursor(rq.Request): + _request = rq.Struct(rq.Card8('opcode'), + rq.Opcode(30), + rq.RequestLength(), + rq.Window('window') + ) + + +def show_cursor(self): + ShowCursor(display=self.display, + opcode=self.display.get_extension_major(extname), + window=self) + +class SelectSelectionInput(rq.Request): + _request = rq.Struct(rq.Card8('opcode'), + rq.Opcode(2), + rq.RequestLength(), + rq.Window('window'), + rq.Card32('selection'), + rq.Card32('mask') + ) + +def select_selection_input(self, window, selection, mask): + return SelectSelectionInput(opcode=self.display.get_extension_major(extname), + display=self.display, + window=window, + selection=selection, + mask=mask) + + +class SelectionNotify(rq.Event): + _code = None + _fields = rq.Struct(rq.Card8('type'), + rq.Card8('sub_code'), + rq.Card16('sequence_number'), + rq.Window('window'), + rq.Window('owner'), + rq.Card32('selection'), + rq.Card32('timestamp'), + rq.Card32('selection_timestamp'), + rq.Pad(8)) + + +class SetSelectionOwnerNotify(SelectionNotify): + pass + + +class SelectionWindowDestroyNotify(SelectionNotify): + pass + + +class SelectionClientCloseNotify(SelectionNotify): + pass + + +class SelectCursorInput(rq.Request): + _request = rq.Struct(rq.Card8('opcode'), + rq.Opcode(3), + rq.RequestLength(), + rq.Window('window'), + rq.Card32('mask') + ) + +def select_cursor_input(self, window, mask): + return SelectCursorInput(opcode=self.display.get_extension_major(extname), + display=self.display, + window=window, + cursor_serial=0, + mask=mask) + + +class GetCursorImage(rq.ReplyRequest): + _request = rq.Struct(rq.Card8('opcode'), + rq.Opcode(4), + rq.RequestLength() + ) + _reply = rq.Struct(rq.ReplyCode(), + rq.Pad(1), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Int16('x'), + rq.Int16('y'), + rq.Card16('width'), + rq.Card16('height'), + rq.Card16('xhot'), + rq.Card16('yhot'), + rq.Card32('cursor_serial'), + rq.Pad(8), + rq.List('cursor_image', rq.Card32) + ) + +def get_cursor_image(self, window): + return GetCursorImage(opcode=self.display.get_extension_major(extname), + display=self.display, + ) + + +class DisplayCursorNotify(rq.Event): + _code = None + _fields = rq.Struct(rq.Card8('type'), + rq.Card8('sub_code'), + rq.Card16('sequence_number'), + rq.Window('window'), + rq.Card32('cursor_serial'), + rq.Card32('timestamp')) + + +def init(disp, info): + disp.extension_add_method('display', 'xfixes_select_selection_input', select_selection_input) + disp.extension_add_method('display', 'xfixes_query_version', query_version) + disp.extension_add_method('window', 'xfixes_hide_cursor', hide_cursor) + disp.extension_add_method('window', 'xfixes_show_cursor', show_cursor) + disp.extension_add_method('display', 'xfixes_select_cursor_input', select_cursor_input) + disp.extension_add_method('display', 'xfixes_get_cursor_image', get_cursor_image) + + disp.extension_add_subevent(info.first_event + XFixesSelectionNotify, XFixesSetSelectionOwnerNotify, SetSelectionOwnerNotify) + disp.extension_add_subevent(info.first_event + XFixesSelectionNotify, XFixesSelectionWindowDestroyNotify, SelectionWindowDestroyNotify) + disp.extension_add_subevent(info.first_event + XFixesSelectionNotify, XFixesSelectionClientCloseNotify, SelectionClientCloseNotify) + disp.extension_add_subevent(info.first_event + XFixesCursorNotify, XFixesDisplayCursorNotify, DisplayCursorNotify) diff --git a/venv/lib/python3.12/site-packages/Xlib/ext/xinerama.py b/venv/lib/python3.12/site-packages/Xlib/ext/xinerama.py new file mode 100644 index 0000000..eff1acd --- /dev/null +++ b/venv/lib/python3.12/site-packages/Xlib/ext/xinerama.py @@ -0,0 +1,222 @@ +# Xlib.ext.xinerama -- Xinerama extension module +# +# Copyright (C) 2006 Mike Meyer +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public License +# as published by the Free Software Foundation; either version 2.1 +# of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the +# Free Software Foundation, Inc., +# 59 Temple Place, +# Suite 330, +# Boston, MA 02111-1307 USA + + +"""Xinerama - provide access to the Xinerama extension information. + +There are at least there different - and mutually incomparable - +Xinerama extensions available. This uses the one bundled with XFree86 +4.6 and/or Xorg 6.9 in the ati/radeon driver. It uses the include +files from that X distribution, so should work with it as well. I +provide code for the lone Sun 1.0 request that isn't part of 1.1, but +this is untested because I don't have a server that implements it. + +The functions loosely follow the libXineram functions. Mostly, they +return an rq.Struct in lieu of passing in pointers that get data from +the rq.Struct crammed into them. The exception is isActive, which +returns the state information - because that's what libXinerama does.""" + + +from Xlib.protocol import rq, structs + +extname = 'XINERAMA' + + +class QueryVersion(rq.ReplyRequest): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(0), + rq.RequestLength(), + rq.Card8('major_version'), + rq.Card8('minor_version'), + rq.Pad(2), + ) + + _reply = rq.Struct( + rq.ReplyCode(), + rq.Pad(1), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Card16('major_version'), + rq.Card16('minor_version'), + rq.Pad(20), + ) + +def query_version(self): + return QueryVersion(display=self.display, + opcode=self.display.get_extension_major(extname), + major_version=1, + minor_version=1) + + +class GetState(rq.ReplyRequest): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(1), + rq.RequestLength(), + rq.Window('window'), + ) + _reply = rq.Struct( + rq.ReplyCode(), + rq.Bool('state'), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Window('window'), + rq.Pad(20), + ) + +def get_state(self): + return GetState(display=self.display, + opcode=self.display.get_extension_major(extname), + window=self.id, + ) + + +class GetScreenCount(rq.ReplyRequest): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(2), + rq.RequestLength(), + rq.Window('window'), + ) + _reply = rq.Struct( + rq.ReplyCode(), + rq.Card8('screen_count'), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Window('window'), + rq.Pad(20), + ) + +def get_screen_count(self): + return GetScreenCount(display=self.display, + opcode=self.display.get_extension_major(extname), + window=self.id, + ) + + +class GetScreenSize(rq.ReplyRequest): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(3), + rq.RequestLength(), + rq.Window('window'), + rq.Card32('screen'), + ) + _reply = rq.Struct( + rq.ReplyCode(), + rq.Pad(1), + rq.Card16('sequence_number'), + rq.Card32('length'), + rq.Card32('width'), + rq.Card32('height'), + rq.Window('window'), + rq.Card32('screen'), + rq.Pad(8), + ) + +def get_screen_size(self, screen_no): + """Returns the size of the given screen number""" + return GetScreenSize(display=self.display, + opcode=self.display.get_extension_major(extname), + window=self.id, + screen=screen_no, + ) + + +# IsActive is only available from Xinerama 1.1 and later. +# It should be used in preference to GetState. +class IsActive(rq.ReplyRequest): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(4), + rq.RequestLength(), + ) + _reply = rq.Struct( + rq.ReplyCode(), + rq.Pad(1), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Card32('state'), + rq.Pad(20), + ) + +def is_active(self): + r = IsActive(display=self.display, + opcode=self.display.get_extension_major(extname), + ) + return r.state + + +# QueryScreens is only available from Xinerama 1.1 and later +class QueryScreens(rq.ReplyRequest): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(5), + rq.RequestLength(), + ) + _reply = rq.Struct( + rq.ReplyCode(), + rq.Pad(1), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Card32('number'), + rq.Pad(20), + rq.List('screens', structs.Rectangle), + ) + +def query_screens(self): + # Hmm. This one needs to read the screen data from the socket. Ooops... + return QueryScreens(display=self.display, + opcode=self.display.get_extension_major(extname), + ) + + +# GetInfo is only available from some Xinerama 1.0, and *NOT* later! Untested +class GetInfo(rq.ReplyRequest): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(4), + rq.RequestLength(), + rq.Card32('visual'), + ) + _reply = rq.Struct( + rq.ReplyCode(), + rq.Pad(1), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Window('window'), + # An array of subwindow slots goes here. Bah. + ) + +def get_info(self, visual): + r = GetInfo(display=self.display, + opcode=self.display.get_extension_major(extname), + visual=visual) + +def init(disp, info): + disp.extension_add_method('display', 'xinerama_query_version', query_version) + disp.extension_add_method('window', 'xinerama_get_state', get_state) + disp.extension_add_method('window', 'xinerama_get_screen_count', get_screen_count) + disp.extension_add_method('window', 'xinerama_get_screen_size', get_screen_size) + disp.extension_add_method('display', 'xinerama_is_active', is_active) + disp.extension_add_method('display', 'xinerama_query_screens', query_screens) + disp.extension_add_method('display', 'xinerama_get_info', get_info) diff --git a/venv/lib/python3.12/site-packages/Xlib/ext/xinput.py b/venv/lib/python3.12/site-packages/Xlib/ext/xinput.py new file mode 100644 index 0000000..95560dd --- /dev/null +++ b/venv/lib/python3.12/site-packages/Xlib/ext/xinput.py @@ -0,0 +1,777 @@ +# Xlib.ext.xinput -- XInput extension module +# +# Copyright (C) 2012 Outpost Embedded, LLC +# Forest Bond +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public License +# as published by the Free Software Foundation; either version 2.1 +# of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the +# Free Software Foundation, Inc., +# 59 Temple Place, +# Suite 330, +# Boston, MA 02111-1307 USA + +''' +A very incomplete implementation of the XInput extension. +''' + +import sys +import array +import struct + +# Python 2/3 compatibility. +from six import integer_types + +from Xlib.protocol import rq +from Xlib import X + + +extname = 'XInputExtension' + +PropertyDeleted = 0 +PropertyCreated = 1 +PropertyModified = 2 + +NotifyNormal = 0 +NotifyGrab = 1 +NotifyUngrab = 2 +NotifyWhileGrabbed = 3 +NotifyPassiveGrab = 4 +NotifyPassiveUngrab = 5 + +NotifyAncestor = 0 +NotifyVirtual = 1 +NotifyInferior = 2 +NotifyNonlinear = 3 +NotifyNonlinearVirtual = 4 +NotifyPointer = 5 +NotifyPointerRoot = 6 +NotifyDetailNone = 7 + +GrabtypeButton = 0 +GrabtypeKeycode = 1 +GrabtypeEnter = 2 +GrabtypeFocusIn = 3 +GrabtypeTouchBegin = 4 + +AnyModifier = (1 << 31) +AnyButton = 0 +AnyKeycode = 0 + +AsyncDevice = 0 +SyncDevice = 1 +ReplayDevice = 2 +AsyncPairedDevice = 3 +AsyncPair = 4 +SyncPair = 5 + +SlaveSwitch = 1 +DeviceChange = 2 + +MasterAdded = (1 << 0) +MasterRemoved = (1 << 1) +SlaveAdded = (1 << 2) +SlaveRemoved = (1 << 3) +SlaveAttached = (1 << 4) +SlaveDetached = (1 << 5) +DeviceEnabled = (1 << 6) +DeviceDisabled = (1 << 7) + +AddMaster = 1 +RemoveMaster = 2 +AttachSlave = 3 +DetachSlave = 4 + +AttachToMaster = 1 +Floating = 2 + +ModeRelative = 0 +ModeAbsolute = 1 + +MasterPointer = 1 +MasterKeyboard = 2 +SlavePointer = 3 +SlaveKeyboard = 4 +FloatingSlave = 5 + +KeyClass = 0 +ButtonClass = 1 +ValuatorClass = 2 +ScrollClass = 3 +TouchClass = 8 + +KeyRepeat = (1 << 16) + +AllDevices = 0 +AllMasterDevices = 1 + +DeviceChanged = 1 +KeyPress = 2 +KeyRelease = 3 +ButtonPress = 4 +ButtonRelease = 5 +Motion = 6 +Enter = 7 +Leave = 8 +FocusIn = 9 +FocusOut = 10 +HierarchyChanged = 11 +PropertyEvent = 12 +RawKeyPress = 13 +RawKeyRelease = 14 +RawButtonPress = 15 +RawButtonRelease = 16 +RawMotion = 17 + +DeviceChangedMask = (1 << DeviceChanged) +KeyPressMask = (1 << KeyPress) +KeyReleaseMask = (1 << KeyRelease) +ButtonPressMask = (1 << ButtonPress) +ButtonReleaseMask = (1 << ButtonRelease) +MotionMask = (1 << Motion) +EnterMask = (1 << Enter) +LeaveMask = (1 << Leave) +FocusInMask = (1 << FocusIn) +FocusOutMask = (1 << FocusOut) +HierarchyChangedMask = (1 << HierarchyChanged) +PropertyEventMask = (1 << PropertyEvent) +RawKeyPressMask = (1 << RawKeyPress) +RawKeyReleaseMask = (1 << RawKeyRelease) +RawButtonPressMask = (1 << RawButtonPress) +RawButtonReleaseMask = (1 << RawButtonRelease) +RawMotionMask = (1 << RawMotion) + +GrabModeSync = 0 +GrabModeAsync = 1 +GrabModeTouch = 2 + +DEVICEID = rq.Card16 +DEVICE = rq.Card16 +DEVICEUSE = rq.Card8 + +PROPERTY_TYPE_FLOAT = 'FLOAT' + +class FP1616(rq.Int32): + + def check_value(self, value): + return int(value * 65536.0) + + def parse_value(self, value, display): + return float(value) / float(1 << 16) + +class FP3232(rq.ValueField): + structcode = 'lL' + structvalues = 2 + + def check_value(self, value): + return value + + def parse_value(self, value, display): + integral, frac = value + ret = float(integral) + # optimised math.ldexp(float(frac), -32) + ret += float(frac) * (1.0 / (1 << 32)) + return ret + +class XIQueryVersion(rq.ReplyRequest): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(47), + rq.RequestLength(), + rq.Card16('major_version'), + rq.Card16('minor_version'), + ) + _reply = rq.Struct( + rq.ReplyCode(), + rq.Pad(1), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Card16('major_version'), + rq.Card16('minor_version'), + rq.Pad(20), + ) + + +def query_version(self): + return XIQueryVersion( + display=self.display, + opcode=self.display.get_extension_major(extname), + major_version=2, + minor_version=0, + ) + +class Mask(rq.List): + + def __init__(self, name): + rq.List.__init__(self, name, rq.Card32, pad=0) + + def pack_value(self, val): + + mask_seq = array.array(rq.struct_to_array_codes['L']) + + if isinstance(val, integer_types): + # We need to build a "binary mask" that (as far as I can tell) is + # encoded in native byte order from end to end. The simple case is + # with a single unsigned 32-bit value, for which we construct an + # array with just one item. For values too big to fit inside 4 + # bytes we build a longer array, being careful to maintain native + # byte order across the entire set of values. + if sys.byteorder == 'little': + def fun(val): + mask_seq.insert(0, val) + elif sys.byteorder == 'big': + fun = mask_seq.append + else: + raise AssertionError(sys.byteorder) + while val: + fun(val & 0xFFFFFFFF) + val = val >> 32 + else: + mask_seq.extend(val) + + return rq.encode_array(mask_seq), len(mask_seq), None + +EventMask = rq.Struct( + DEVICE('deviceid'), + rq.LengthOf('mask', 2), + Mask('mask'), +) + + +class XISelectEvents(rq.Request): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(46), + rq.RequestLength(), + rq.Window('window'), + rq.LengthOf('masks', 2), + rq.Pad(2), + rq.List('masks', EventMask), + ) + +def select_events(self, event_masks): + ''' + select_events(event_masks) + + event_masks: + Sequence of (deviceid, mask) pairs, where deviceid is a numerical device + ID, or AllDevices or AllMasterDevices, and mask is either an unsigned + integer or sequence of 32 bits unsigned values + ''' + return XISelectEvents( + display=self.display, + opcode=self.display.get_extension_major(extname), + window=self, + masks=event_masks, + ) + +AnyInfo = rq.Struct( + rq.Card16('type'), + rq.Card16('length'), + rq.Card16('sourceid'), + rq.Pad(2), +) + +class ButtonMask(object): + + def __init__(self, value, length): + self._value = value + self._length = length + + def __len__(self): + return self._length + + def __getitem__(self, key): + return self._value & (1 << key) + + def __str__(self): + return repr(self) + + def __repr__(self): + return '0b{value:0{width}b}'.format(value=self._value, + width=self._length) + +class ButtonState(rq.ValueField): + + structcode = None + + def __init__(self, name): + rq.ValueField.__init__(self, name) + + def parse_binary_value(self, data, display, length, fmt): + # Mask: bitfield of button states. + mask_len = 4 * ((((length + 7) >> 3) + 3) >> 2) + mask_data = data[:mask_len] + mask_value = 0 + for byte in reversed(struct.unpack('={0:d}B'.format(mask_len), mask_data)): + mask_value <<= 8 + mask_value |= byte + data = data[mask_len:] + assert (mask_value & 1) == 0 + return ButtonMask(mask_value >> 1, length), data + +ButtonInfo = rq.Struct( + rq.Card16('type'), + rq.Card16('length'), + rq.Card16('sourceid'), + rq.LengthOf(('state', 'labels'), 2), + ButtonState('state'), + rq.List('labels', rq.Card32), +) + +KeyInfo = rq.Struct( + rq.Card16('type'), + rq.Card16('length'), + rq.Card16('sourceid'), + rq.LengthOf('keycodes', 2), + rq.List('keycodes', rq.Card32), +) + +ValuatorInfo = rq.Struct( + rq.Card16('type'), + rq.Card16('length'), + rq.Card16('sourceid'), + rq.Card16('number'), + rq.Card32('label'), + FP3232('min'), + FP3232('max'), + FP3232('value'), + rq.Card32('resolution'), + rq.Card8('mode'), + rq.Pad(3), +) + +ScrollInfo = rq.Struct( + rq.Card16('type'), + rq.Card16('length'), + rq.Card16('sourceid'), + rq.Card16('number'), + rq.Card16('scroll_type'), + rq.Pad(2), + rq.Card32('flags'), + FP3232('increment'), +) + +TouchInfo = rq.Struct( + rq.Card16('type'), + rq.Card16('length'), + rq.Card16('sourceid'), + rq.Card8('mode'), + rq.Card8('num_touches'), +) + +INFO_CLASSES = { + KeyClass: KeyInfo, + ButtonClass: ButtonInfo, + ValuatorClass: ValuatorInfo, + ScrollClass: ScrollInfo, + TouchClass: TouchInfo, +} + +class ClassInfoClass(object): + + structcode = None + + def parse_binary(self, data, display): + class_type, length = struct.unpack('=HH', data[:4]) + class_struct = INFO_CLASSES.get(class_type, AnyInfo) + class_data, _ = class_struct.parse_binary(data, display) + data = data[length * 4:] + return class_data, data + +ClassInfo = ClassInfoClass() + +DeviceInfo = rq.Struct( + DEVICEID('deviceid'), + rq.Card16('use'), + rq.Card16('attachment'), + rq.LengthOf('classes', 2), + rq.LengthOf('name', 2), + rq.Bool('enabled'), + rq.Pad(1), + rq.String8('name', 4), + rq.List('classes', ClassInfo), +) + +class XIQueryDevice(rq.ReplyRequest): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(48), + rq.RequestLength(), + DEVICEID('deviceid'), + rq.Pad(2), + ) + + _reply = rq.Struct( + rq.ReplyCode(), + rq.Pad(1), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.LengthOf('devices', 2), + rq.Pad(22), + rq.List('devices', DeviceInfo), + ) + +def query_device(self, deviceid): + return XIQueryDevice( + display=self.display, + opcode=self.display.get_extension_major(extname), + deviceid=deviceid, + ) + +class XIListProperties(rq.ReplyRequest): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(56), + rq.RequestLength(), + DEVICEID('deviceid'), + rq.Pad(2), + ) + + _reply = rq.Struct( + rq.ReplyCode(), + rq.Pad(1), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.LengthOf('atoms', 2), + rq.Pad(22), + rq.List('atoms', rq.Card32Obj), + ) + +def list_device_properties(self, deviceid): + return XIListProperties( + display=self.display, + opcode=self.display.get_extension_major(extname), + deviceid=deviceid, + ) + +class XIGetProperty(rq.ReplyRequest): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(59), + rq.RequestLength(), + DEVICEID('deviceid'), + rq.Card8('delete'), + rq.Pad(1), + rq.Card32('property'), + rq.Card32('type'), + rq.Card32('offset'), + rq.Card32('length'), + ) + + _reply = rq.Struct( + rq.ReplyCode(), + rq.Pad(1), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Card32('type'), + rq.Card32('bytes_after'), + rq.LengthOf('value', 4), + rq.Format('value', 1), + rq.Pad(11), + rq.PropertyData('value') + ) + +def get_device_property(self, deviceid, property, type, offset, length, delete=False): + return XIGetProperty( + display=self.display, + opcode=self.display.get_extension_major(extname), + deviceid=deviceid, + property=property, + type=type, + offset=offset, + length=length, + delete=delete, + ) + +class XIChangeProperty(rq.Request): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(57), + rq.RequestLength(), + DEVICEID('deviceid'), + rq.Card8('mode'), + rq.Format('value', 1), + rq.Card32('property'), + rq.Card32('type'), + rq.LengthOf('value', 4), + rq.PropertyData('value'), + ) + +def change_device_property(self, deviceid, property, type, mode, value): + return XIChangeProperty( + display=self.display, + opcode=self.display.get_extension_major(extname), + deviceid=deviceid, + property=property, + type=type, + mode=mode, + value=value, + ) + +class XIDeleteProperty(rq.Request): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(58), + rq.RequestLength(), + DEVICEID('deviceid'), + rq.Pad(2), + rq.Card32('property'), + ) + +def delete_device_property(self, deviceid, property): + return XIDeleteProperty( + display=self.display, + opcode=self.display.get_extension_major(extname), + deviceid=deviceid, + property=property, + ) + +class XIGrabDevice(rq.ReplyRequest): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(51), + rq.RequestLength(), + rq.Window('grab_window'), + rq.Card32('time'), + rq.Cursor('cursor', (X.NONE, )), + DEVICEID('deviceid'), + rq.Set('grab_mode', 1, (GrabModeSync, GrabModeAsync)), + rq.Set('paired_device_mode', 1, (GrabModeSync, GrabModeAsync)), + rq.Bool('owner_events'), + rq.Pad(1), + rq.LengthOf('mask', 2), + Mask('mask'), + ) + + _reply = rq.Struct( + rq.ReplyCode(), + rq.Pad(1), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Card8('status'), + rq.Pad(23), + ) + +def grab_device(self, deviceid, time, grab_mode, paired_device_mode, owner_events, event_mask): + return XIGrabDevice( + display=self.display, + opcode=self.display.get_extension_major(extname), + deviceid=deviceid, + grab_window=self, + time=time, + cursor=X.NONE, + grab_mode=grab_mode, + paired_device_mode=paired_device_mode, + owner_events=owner_events, + mask=event_mask, + ) + +class XIUngrabDevice(rq.Request): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(52), + rq.RequestLength(), + rq.Card32('time'), + DEVICEID('deviceid'), + rq.Pad(2), + ) + +def ungrab_device(self, deviceid, time): + return XIUngrabDevice( + display=self.display, + opcode=self.display.get_extension_major(extname), + time=time, + deviceid=deviceid, + ) + +class XIPassiveGrabDevice(rq.ReplyRequest): + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(54), + rq.RequestLength(), + rq.Card32('time'), + rq.Window('grab_window'), + rq.Cursor('cursor', (X.NONE, )), + rq.Card32('detail'), + DEVICEID('deviceid'), + rq.LengthOf('modifiers', 2), + rq.LengthOf('mask', 2), + rq.Set('grab_type', 1, (GrabtypeButton, GrabtypeKeycode, GrabtypeEnter, + GrabtypeFocusIn, GrabtypeTouchBegin)), + rq.Set('grab_mode', 1, (GrabModeSync, GrabModeAsync)), + rq.Set('paired_device_mode', 1, (GrabModeSync, GrabModeAsync)), + rq.Bool('owner_events'), + rq.Pad(2), + Mask('mask'), + rq.List('modifiers', rq.Card32), + ) + + _reply = rq.Struct( + rq.ReplyCode(), + rq.Pad(1), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.LengthOf('modifiers', 2), + rq.Pad(22), + rq.List('modifiers', rq.Card32), + ) + +def passive_grab_device(self, deviceid, time, detail, + grab_type, grab_mode, paired_device_mode, + owner_events, event_mask, modifiers): + return XIPassiveGrabDevice( + display=self.display, + opcode=self.display.get_extension_major(extname), + deviceid=deviceid, + grab_window=self, + time=time, + cursor=X.NONE, + detail=detail, + grab_type=grab_type, + grab_mode=grab_mode, + paired_device_mode=paired_device_mode, + owner_events=owner_events, + mask=event_mask, + modifiers=modifiers, + ) + +def grab_keycode(self, deviceid, time, keycode, + grab_mode, paired_device_mode, + owner_events, event_mask, modifiers): + return passive_grab_device(self, deviceid, time, keycode, + GrabtypeKeycode, + grab_mode, paired_device_mode, + owner_events, event_mask, modifiers) + +class XIPassiveUngrabDevice(rq.Request): + + _request = rq.Struct( + rq.Card8('opcode'), + rq.Opcode(55), + rq.RequestLength(), + rq.Window('grab_window'), + rq.Card32('detail'), + DEVICEID('deviceid'), + rq.LengthOf('modifiers', 2), + rq.Set('grab_type', 1, (GrabtypeButton, GrabtypeKeycode, + GrabtypeEnter, GrabtypeFocusIn, + GrabtypeTouchBegin)), + rq.Pad(3), + rq.List('modifiers', rq.Card32), + ) + +def passive_ungrab_device(self, deviceid, detail, grab_type, modifiers): + return XIPassiveUngrabDevice( + display=self.display, + opcode=self.display.get_extension_major(extname), + deviceid=deviceid, + grab_window=self, + detail=detail, + grab_type=grab_type, + modifiers=modifiers, + ) + +def ungrab_keycode(self, deviceid, keycode, modifiers): + return passive_ungrab_device(self, deviceid, keycode, + GrabtypeKeycode, modifiers) + +HierarchyInfo = rq.Struct( + DEVICEID('deviceid'), + DEVICEID('attachment'), + DEVICEUSE('type'), + rq.Bool('enabled'), + rq.Pad(2), + rq.Card32('flags'), +) + + +HierarchyEventData = rq.Struct( + DEVICEID('deviceid'), + rq.Card32('time'), + rq.Card32('flags'), + rq.LengthOf('info', 2), + rq.Pad(10), + rq.List('info', HierarchyInfo), +) + +ModifierInfo = rq.Struct( + rq.Card32('base_mods'), + rq.Card32('latched_mods'), + rq.Card32('locked_mods'), + rq.Card32('effective_mods'), +) + +GroupInfo = rq.Struct( + rq.Card8('base_group'), + rq.Card8('latched_group'), + rq.Card8('locked_group'), + rq.Card8('effective_group'), +) + +DeviceEventData = rq.Struct( + DEVICEID('deviceid'), + rq.Card32('time'), + rq.Card32('detail'), + rq.Window('root'), + rq.Window('event'), + rq.Window('child'), + FP1616('root_x'), + FP1616('root_y'), + FP1616('event_x'), + FP1616('event_y'), + rq.LengthOf('buttons', 2), + rq.Card16('valulators_len'), + DEVICEID('sourceid'), + rq.Pad(2), + rq.Card32('flags'), + rq.Object('mods', ModifierInfo), + rq.Object('groups', GroupInfo), + ButtonState('buttons'), +) + +DeviceChangedEventData = rq.Struct( + DEVICEID('deviceid'), + rq.Card32('time'), + rq.LengthOf('classes', 2), + DEVICEID('sourceid'), + rq.Card8('reason'), + rq.Pad(11), + rq.List('classes', ClassInfo), +) + +PropertyEventData = rq.Struct( + DEVICEID('deviceid'), + rq.Card32('time'), + rq.Card32('property'), + rq.Card8('what'), + rq.Pad(11), +) + +def init(disp, info): + disp.extension_add_method('display', 'xinput_query_version', query_version) + disp.extension_add_method('window', 'xinput_select_events', select_events) + disp.extension_add_method('display', 'xinput_query_device', query_device) + disp.extension_add_method('window', 'xinput_grab_device', grab_device) + disp.extension_add_method('display', 'xinput_ungrab_device', ungrab_device) + disp.extension_add_method('window', 'xinput_grab_keycode', grab_keycode) + disp.extension_add_method('window', 'xinput_ungrab_keycode', ungrab_keycode) + disp.extension_add_method('display', 'xinput_get_device_property', get_device_property) + disp.extension_add_method('display', 'xinput_list_device_properties', list_device_properties) + disp.extension_add_method('display', 'xinput_change_device_property', change_device_property) + disp.extension_add_method('display', 'xinput_delete_device_property', delete_device_property) + if hasattr(disp,"ge_add_event_data"): + for device_event in (ButtonPress, ButtonRelease, KeyPress, KeyRelease, Motion): + disp.ge_add_event_data(info.major_opcode, device_event, DeviceEventData) + disp.ge_add_event_data(info.major_opcode, DeviceChanged, DeviceEventData) + disp.ge_add_event_data(info.major_opcode, HierarchyChanged, HierarchyEventData) + disp.ge_add_event_data(info.major_opcode, PropertyEvent, PropertyEventData) diff --git a/venv/lib/python3.12/site-packages/Xlib/ext/xtest.py b/venv/lib/python3.12/site-packages/Xlib/ext/xtest.py new file mode 100644 index 0000000..0b5d7da --- /dev/null +++ b/venv/lib/python3.12/site-packages/Xlib/ext/xtest.py @@ -0,0 +1,122 @@ +# Xlib.ext.xtest -- XTEST extension module +# +# Copyright (C) 2000 Peter Liljenberg +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public License +# as published by the Free Software Foundation; either version 2.1 +# of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the +# Free Software Foundation, Inc., +# 59 Temple Place, +# Suite 330, +# Boston, MA 02111-1307 USA + +from Xlib import X +from Xlib.protocol import rq + +extname = 'XTEST' + +CurrentCursor = 1 + +class GetVersion(rq.ReplyRequest): + _request = rq.Struct(rq.Card8('opcode'), + rq.Opcode(0), + rq.RequestLength(), + rq.Card8('major_version'), + rq.Pad(1), + rq.Card16('minor_version') + ) + + _reply = rq.Struct(rq.Pad(1), + rq.Card8('major_version'), + rq.Card16('sequence_number'), + rq.Pad(4), + rq.Card16('minor_version'), + rq.Pad(22) + ) + +def get_version(self, major, minor): + return GetVersion(display = self.display, + opcode = self.display.get_extension_major(extname), + major_version = major, + minor_version = minor) + + +class CompareCursor(rq.ReplyRequest): + _request = rq.Struct(rq.Card8('opcode'), + rq.Opcode(1), + rq.RequestLength(), + rq.Window('window'), + rq.Cursor('cursor', (X.NONE, CurrentCursor)), + ) + + _reply = rq.Struct(rq.Pad(1), + rq.Card8('same'), + rq.Card16('sequence_number'), + rq.Pad(28), + ) + +def compare_cursor(self, cursor): + r = CompareCursor(display = self.display, + opcode = self.display.get_extension_major(extname), + window = self.id, + cursor = cursor) + return r.same + +class FakeInput(rq.Request): + _request = rq.Struct(rq.Card8('opcode'), + rq.Opcode(2), + rq.RequestLength(), + rq.Set('event_type', 1, (X.KeyPress, + X.KeyRelease, + X.ButtonPress, + X.ButtonRelease, + X.MotionNotify)), + rq.Card8('detail'), + rq.Pad(2), + rq.Card32('time'), + rq.Window('root', (X.NONE, )), + rq.Pad(8), + rq.Int16('x'), + rq.Int16('y'), + rq.Pad(8) + ) + +def fake_input(self, event_type, detail = 0, time = X.CurrentTime, + root = X.NONE, x = 0, y = 0): + + FakeInput(display = self.display, + opcode = self.display.get_extension_major(extname), + event_type = event_type, + detail = detail, + time = time, + root = root, + x = x, + y = y) + +class GrabControl(rq.Request): + _request = rq.Struct(rq.Card8('opcode'), + rq.Opcode(3), + rq.RequestLength(), + rq.Bool('impervious'), + rq.Pad(3) + ) + +def grab_control(self, impervious): + GrabControl(display = self.display, + opcode = self.display.get_extension_major(extname), + impervious = impervious) + +def init(disp, info): + disp.extension_add_method('display', 'xtest_get_version', get_version) + disp.extension_add_method('window', 'xtest_compare_cursor', compare_cursor) + disp.extension_add_method('display', 'xtest_fake_input', fake_input) + disp.extension_add_method('display', 'xtest_grab_control', grab_control) diff --git a/venv/lib/python3.12/site-packages/Xlib/keysymdef/__init__.py b/venv/lib/python3.12/site-packages/Xlib/keysymdef/__init__.py new file mode 100644 index 0000000..6c7ebb2 --- /dev/null +++ b/venv/lib/python3.12/site-packages/Xlib/keysymdef/__init__.py @@ -0,0 +1,42 @@ +# Xlib.keysymdef -- X keysym defs +# +# Copyright (C) 2001 Peter Liljenberg +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public License +# as published by the Free Software Foundation; either version 2.1 +# of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the +# Free Software Foundation, Inc., +# 59 Temple Place, +# Suite 330, +# Boston, MA 02111-1307 USA + +__all__ = [ + 'apl', + 'arabic', + 'cyrillic', + 'greek', + 'hebrew', + 'katakana', + 'korean', + 'latin1', + 'latin2', + 'latin3', + 'latin4', + 'miscellany', + 'publishing', + 'special', + 'technical', + 'thai', + 'xf86', + 'xk3270', + 'xkb', + ] diff --git a/venv/lib/python3.12/site-packages/Xlib/keysymdef/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/Xlib/keysymdef/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..55660769e18f78050178b8acb45147468a47b3c3 GIT binary patch literal 377 zcmXw#u};G<5QZIE(o*OI653sxxA(0*hkfXy2_{-#p$#@V;GhdG4q$*DcsPV1j$nji z7?+dXY4Fx&EOX5WW(=6MhhW60Qi>gqqM0ei8mEJl~x(&e5~u zP@HBnUy7`8m6E}Hv65tBd>*x?rBt4*&v7B-i7y*_Rh9X(v&Pg#=^_?7n!3|02!*c7 zBWzo`s_I3YH9fVz%za$7{Y#hya;AFPiR*ryb|0jY$qNw`JPb}&{^R|Jk9ZnnVlPo?{#>N| zh}<(#rsWdFDfg3bKPj93!7|1?6i?&>HIM$06cuhdhGEp+v~udZec z1|+@#5(sv=!(#Tr8b9rFzh57acmW?L$m4>g{50o3|2b!TX5yR413ETi1Z~z8y5C(AwhHxWn#7(dXhhZ2u!)6?T5!?b>a1=%{ z2}w*r3e%9r3}i41S^k#F%!DaDi};W6O};VI!6;W^<2;U(b};Wgn6;Vt1E z;XUC4;nWw#j?FFk>EpjH|6=iqR$Z=|y3YN4B-ldNs%FD9{8A*IYzf=ZOk-K+R$X4M za($Ki#mK31L~a_qA!@Q5`ucJqa`)v9@A&0)YRf=jg=xO`cZKSwB7f*gMsX#WmKHfe z4YplrIoy{_fhy;4)OdVC2wk?TJZ7&`EM-I9h-VAp(P&2&muFYGX2`KEgdsQ8R!NYu z+Z^Q(R==5{Z3)Hxya)%qThCH~{>$Ezztx%J?5w4Zn z6E2j6aFw5l%GoO2aM@zF>MbK?>1a+>J;OfIr}J|~v8}eE3)HxR%|^>snq5aVjd>Jp z#V{>wHx0+)U8OCIw$jil{rN)+i%W{FIby!at98C2Y~?u3)L_Xo5C6go&8|Ou zL^rY35IWJIE#+m3Ysr2b4nr}TSvN`-)<(U^5>^eD{RrV~VccceUX^v8C{36(n(gg3jEfU4 a%Xu=xq!IFEmt}e{n;*Z+GS=asFJA%lno80D literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/Xlib/keysymdef/__pycache__/cyrillic.cpython-312.pyc b/venv/lib/python3.12/site-packages/Xlib/keysymdef/__pycache__/cyrillic.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8952ca50ca07e0337bc1951bf312019c09f63ebd GIT binary patch literal 3433 zcmc(h_jeOV5XaB-=86lZcQ9a!-UHZ{Yza58B(R6#$oihG!?L8Olbk1h;=jnx=^@EW zNUx9dN{UH!lpfM638|#++?`I^^Y4k@o6pL zvKE)lh}G2!6jD$`MVLSnFp(w-nS@C+8Ix&>kg1qL(}YaNRGJ}VCZ^FWA;p+ZB|=Iu zgUT?I$}x*7P)xIhRHB5cP)gM(qZ*Xc98^%Pkhz#m^H53ig)Bf7Eflf{)wEd164cOA zA)s5J?%mR?S_l4zfqm48M(RQn9Y8Z3gqynIAwOCufL02^ONZd2 z!`M$fXro@V6QP5Spp%ZGi;m#{9mhfHLpNOsKZOvWegr9uLj)Wq6+JY7UK#{Z1V>22 zQ96-1R(D*xW{RR{*D|hST+g_HaU!Adl>gJ z?ql4~c!2RB;~~bwj7Jz}8ILj^V?54yg7GBdDaO-`XBf{io?|@Ec!6<_@gn0T#>?@hRgo#^;PL z7+*5JVtmc`hVd=qJI42ni;N!_KQb;ceq#L0_=WK+<2T0djLVEa7=JSUV*JhcN1(HA zC|lCg*5_A~{aPs2hZAbHOz0hB(-Q%3-@X9Y^l(LL&=aP9AbT% z>A)L?J}w3HyoVK%Ew)ma85|iinsKC^(bDY_#0eaqD_W>rk!_AzCFks{OAaxI1MBRN z3rOh^XB&ouOSN!m%BazJGOg=;b3GDIrqV{k?89+V#7ZqaX;vFc539+zt_{W{vwOeC z(eYNXBX!)@<>-&kbg=s~E`{5l_b@x|lRNHnWbF0H9k+D*R^o)hjtf<4XuDN%u7Rve z4xJ7M)(blx@OzzYXcI2uI_~#&bq9iS$K51i3p?&6M*}lyqk8)`A-TW(=BIC)Q`WrN z8&Kr{YvOIYIw0S6&>8{TArg`c(6SYU18dBYIrDbNkfTU7D%YS6JM@@*L|ir}99PIV z(EHk3||B-Pt-dTV9w! zkA#JX6cQHQm(GralCa;MeRgk9ZdjvSNRwlN1J;wWAPirk6+dU=C^`fUQoVq?p@mU zLmv5q@prWZ{Jz#s`91e~x`XmL;yp{Bu;1A_k31B9Z?o`_LYhVQrJ?XPcDwoP)5<0O zO?nwFJvrhUR-uJlNJP`RE0IY>;<0+DBd%CHiIGGsl?-KEBWi5K71jDJ`=*8s8(q4V zQtK0;@K9(_)m=So9a1xTW*F*#D{TGeY)E9X({>NXk&dc+k_mAr{~FfUPf(PL6N`$9 z#>%Ttm5j}vGpdxC%Zi#)rQx0_qZVox%&;l0R0$Z>S>ToM;#ci++x5IXB9LHLt!$KM<`J8)asxp4MENEXGV z3xSzb{dJS>ikCLurHXe%xLmSO_jQncHMtYkONabW{by1L+(S>wACEPN)m{+89E_=)9 zVqqiK99_y8PM1-MoJIq_8uzB|%<*#>DIpt0P5*LDGv>AEexr=vC{y!<5jU?bml2a2 zgR~e=RkomPHSEdYT%c@*LxE_NwWotKTD;Xr*Vly+01{|66KdqD(Xuer&IaOf z)}9GOrvqi1A*R`rnxn~ZMCTb}mNgb4OqcrZF}d*w)8n~tjA`P0B&3aOPB0gkXQcGC zWa9BKt2I?)X}irRR~DDCD{IKy#-g@qOgJfIGOUeaT8o=^ukR}(uu1}E=e2T$6xrt8 z)3!3zmV|tswbMcd1?KKGdr@05X>Uo1C_XL7il7ANGGR+0XXQ0~%rv(93%lsug(=Pb4RRnA>< zb*P-Za;o6nyZmbId;#Qt<>UJYhqA+uHrPGtDLHl%F%>baFh1` TTE9B-e{^B@-f5Gg+F$1%?gCO? literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/Xlib/keysymdef/__pycache__/hebrew.cpython-312.pyc b/venv/lib/python3.12/site-packages/Xlib/keysymdef/__pycache__/hebrew.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4d388dfd0e5efb8bac0526e06a28fa052a72bf0b GIT binary patch literal 1385 zcmZvcNpI6Y6o4m9_hw(4bYq7KwH9ziTtPzOT)j)>>mk$XV-7yJP({0aU5 zmv9Tdu#~bdg|hYn^PE;0TUdIZ=Dm6AjP1wC&fyZA7jglY z;i9*)zN$Y=9lO_6e^EZwPM*?+EV+9|#`_p9r4`UkC?;uY_-eL&A5$ z55iBvFT!uaAHosg-e1P_Vz^c8*9} z*P@nYsFh&&Y^1Wq<+s3YCy0+>m zU2b+2L$4k0U)#KLRdIBeZ&+%*sqSz`*`nPh_Z+W@ tWh+((EH{dlmZKUY2B`{_0m}}9N}~)?p1@&TFro%k^OYwoV_z22{R60%)!G06 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/Xlib/keysymdef/__pycache__/katakana.cpython-312.pyc b/venv/lib/python3.12/site-packages/Xlib/keysymdef/__pycache__/katakana.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..07a321459fd577c6567fd821c50dee07eff7e7db GIT binary patch literal 2062 zcmciDS#J|p6bJAzNg#1z<0Wxc!oCDZh9vBSfT5v@A{)szf}9sL_&SR28XDwRC?v_s;#FxnoV@+kt>zaX+`N z+`D+QO;LX1N%P}dDeerp)%^+-Qs5&WR?#Z7PzzeA6>Ze!j@4LAYp{me(M}!cAV2)n ziB9T57X=WYAcC|OYboT8FhUeTn4*YKH=@*oZi=CYdJ&^O^in_iXaM~*hyfbHAg#j? z4Pzax$1rWcdfJE$v;;1VjgB5VIE~3V;*O&F;6g0GEXs2GtV&3 zGS4y3GcPbNGS`_K%uCG6%qz^R%xla|=5^)`<`(lN^A__q^A7Va^B(g)^8xcA^AYng z^9ggC`IPyL`JDNJsWM+OUol@Z-!R`Y-!b1aHRcDV&iu&y#Qe*3~N-T-nsET`^oE}cDH?`YPVR~lYf@=Dz+Ew4pI6Lm?{R^wqC z&*#|Uf>UZ7sZg|Xmbs|Iwn`?v)^V?#^U5<`IpdY5z1z*lMLj3#GoqdmwaBL9-ci%D zBAgcCvmerhbVdeVd*!YBM8;(9&aQ{TLMcr1<@zo{0VpsCeFRDwLqwx*L3YB{MRNg`< zr%xB>-J9|ckA2zo_ZFYeR|`g$J8RLtsuHU84_B4gilLt6KrJ>{Rid@-{;CqL1tQD- zT32|v<6mi9^=LG0O#cr5*PPd(QF(3ddf~2H{*n0Krj17p$CiV&o`I?osfBy*3l`_x G@BA;|qmr)x literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/Xlib/keysymdef/__pycache__/korean.cpython-312.pyc b/venv/lib/python3.12/site-packages/Xlib/keysymdef/__pycache__/korean.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4aac71a997db504a8f9bbc13458fef24355d698c GIT binary patch literal 3853 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 Xqz&!Tj)k%ii)0ZN%VMM?g%0UJ zTGGf!23g4>CpqLLkAf7?DV^w&E_6#bdZY)v(u*as1bxzne(A?jS&C({49jIXR>%sh zl$BT|tFT&DV~woAT3L&AvJL|>fc3H-8)O4E%0_IGP1r1(u|>9EPzJG8wql!X!*qeO#DgwMf^=XA)XS?h!@2F#6QHp#7p8;i1ERF z&GgA5rw+Q4u47F#Q(;~7teO>dkNSb0~oX#bh&Yk}=IOtvRS(O!P8z_uW{jOql#|Y@owB!6B_U6q{{adyFeZA@q2^ zHRLh1$GJ~J5Px@Pc@o{@q_vJT+DwI=M&HQ=k;IF@V%Nb9e&YF0~NdK8$G8;LD?A{uGE{U z{nIY0wspWe5MCMnMiTx&$R};dWO6pw-AK=7IvXifWxE<3vl{uHMkcn5HVVCsY)l*( z=o67uv}`%s)z`=?tH?l~XsKHKT9)1Yje>HCE{c{d7rnh-i)rMS@A)9(?GNA8YswWA AbpQYW literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/Xlib/keysymdef/__pycache__/latin3.cpython-312.pyc b/venv/lib/python3.12/site-packages/Xlib/keysymdef/__pycache__/latin3.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..27866c0daeeff188c898cdb5bd4ac3f4ea5b2259 GIT binary patch literal 811 zcmaKqO>5Lp6o!+Te#~T&Oy{E`;xFi;y=b@6O&8+_xDlZo1j*#wX5wU$kef-HUHU6r zyAg`rbR&r3PB*TF5YUaNTcHRdDBd$wlj*{{cybTVIq$iPyfq9>k>}OH(D|Y&%10{x z9$C-N*?swWq@V%{s-R*GYFLLlF2NEm!!oYG3a-K`HlTq`XrcxhwxESN=xBg}CYacU zHm<=McA$e@=wc6g*oQu@!+JW{xa2;rDT@1qa7=hgI3b)8o)MlCUJzaqUK8FB-Vt)b zd%_38C&FjKH^O(qPr@&WI~#*S+q?bXhKQqJ!V8n`wj0^A>AuGg3tiSXtx=G04C10G ztKlf($$8_gN+X4gD;- zQkHN(VV*nsXq*Wca>)1q;G8sN<1JJA)n zl72=ZB)-;FRn3iVrsbVMX6EgFrssMmYo3>-Fnd|6BIbSN#Qau{{l^}e(Pg>!H*nwq Ay8r+H literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/Xlib/keysymdef/__pycache__/latin4.cpython-312.pyc b/venv/lib/python3.12/site-packages/Xlib/keysymdef/__pycache__/latin4.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5547e100d77e99440bf5b8cb2228c8ab597d69aa GIT binary patch literal 1117 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 TD#>$4(xZ}m`RN(`pjpkoPtI0l literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/Xlib/keysymdef/__pycache__/thai.cpython-312.pyc b/venv/lib/python3.12/site-packages/Xlib/keysymdef/__pycache__/thai.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d65207b8a9e64874faaf35cd31dcf2c8d3da425c GIT binary patch literal 2807 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 AbN~PV literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/Xlib/keysymdef/__pycache__/xk3270.cpython-312.pyc b/venv/lib/python3.12/site-packages/Xlib/keysymdef/__pycache__/xk3270.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f2e2530578da7023f9903276bf8ffbd5b73d2dbf GIT binary patch literal 1122 zcmY+D%Wm306o$tk7Xlazm^-AZy2>JPLl)gsm2$1pYnnuAbT*O0nGg$OEPG62sSElP zeT1qn(HH23CGxf}P$|1gmFfdHre1uS^Ut}>8P88yPO#&X~NMRb%n1Kw+AY&G?n1dWDpkN;I zSbzc+p@=G|Sb`Fkp^O!%U=^xZgBsSMjtyvF6Pnn9mcOz2$dLXrW-JjBgk{1CVU@5( zND|fwDMFf%A;^R*AxBUMc|w6uB&dWEp-iX{s)QP$PG}ICgce~V#JkOnAbD8fUn?^?$JeH0PZsJ?r=>^%y>&)ohigqAJ_8Wc^nz_i_*E_un{W?%0;mFZle)Rr0 zDEz0KShgqPEN9&1BFIE8A3Q?@>Bu_W+gUW)i^gsobiv()6njEgK`}~k;5qKV**6WV z7oTp=6f-^U_BHnp!XfnHtgpPj9rt;H+*&Ad=9xTpJs8-2Y@M3A9|xXu;n@pQA5&2@%apQE8`Xq%p^*}k|PSX;=4niUou+Lmy1UmJ33sF}v~e1CU)r>(h$;9GWh z*?O0|+9mDwxbOOX2llF6~`g(w)TCqWy`y4OSDKStK-CyEXT1ni;^uLFEEI6C82@<76558A3A!7 z&h#1b5`BTrWSC4l!{Mj4X`6IU>#pgF|GfkW$_zjJ2Kb-lo_p@Or1YcK))QLz`QeK@ zTc0*-+820d+RFdv~Ke3XvzF*?S_={TRD z6WmPA+(IqfO0C>RZQM@n+(8}ONuAt9UEEFG+(SLwOTFAjecVs|JU|0HNP|2?Lp)5w ze3DM`DLTa?G{UFpG@qd}JW8W{md^4yI>+bfJYS#-e335lCA!3y=`xSe7+;|)e3h>9 zHM+**G|m$=!3j$6b-K=zG|5Rya*9$sMN>RY)BFa#!Ee%={1&~%Z`0fS4!y(g(z|?v zZt#2b9^a&!{64+UAJ7MUi*E4@&G0PE@*K_aZMx0#G|zYF4u41=@?E;iAJIpAkM8jT zE$|{O@)9laGA;88t?+%i&#Sb`X-e}Nt?@do^8%;JdcsfX zDL;HSXP zfS&_j0KWi!3H%E968H-EHSinYx4`d!-vfUD{s?>x{0aCo@Cx_~@K@k(z~6y?0RI90 z348I<5;JU>d?Ur8I& z>hmrbRo|$DnxtIYtDD~p^fe<>ZPB8e7y5$b2z@7Y%RAa#T#zftaoWqGYSW7KShCf`%&# z?X#)C{l*zL*setT5T3rA`HnDya!cd~vD_NIu`pQQ z@{GKwy&7gN5M@lgw3?P@=5{x2@v`O;ST>7tTja89n4as@%$abmMHyAe3`QoLDRzT0 z=3Xjn8Nw63<<}(Xb^a&ydW12ecJSdPs)c6Ya$A=lT7$POSRPhLTnb5YHT_!;jYLZHWjYS&b zq$4^L7nLi%Mk9457X+@O&u!X)ye0MeWCJbPKua~yrW$C|a!jK&<}&uI9UhQcy{^`Z zWl|3Ne*a`cHPuj^YN$@vtDdo?YKWiCT&PaUdtY5YRFbbLsn?XL*OY1b;}hjk!;h(~ zljYnAFT64Gry}yk(aZ!6u3sY^*Yy+a75>WqMo;)&KCv5qix>&c+BrXwEd<-HGtMHP za9oe`Stsy}LLx7me8RRe6?4c3EsDUhZTjvW4=o z8@n#&Y;n`G!u9a4g}-z_)4o2~)YMdJ>)C5A^_?tg-F568E^1w+ID3YQT4zad@N`k@ zt9w?SLuZOwf1Tbnu-9HmJTOw!dP^#Fc(kYulun*4YJ;Uy=Ze};MOO)wGIGAC4VM&^ zuA)>Pr6}v@rJ^=c>K-g=9i{$LMXjgQ-n-XQ>gd~RRZ!K*_s;&kHYFhsrA)v;#4_QR<#cmt4dJMipo>jCwcu@ c6(29)+n&{`-$qql{4fVkf2Q?$Tj5;&9|I3n=>Px# literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/Xlib/keysymdef/apl.py b/venv/lib/python3.12/site-packages/Xlib/keysymdef/apl.py new file mode 100644 index 0000000..f503d42 --- /dev/null +++ b/venv/lib/python3.12/site-packages/Xlib/keysymdef/apl.py @@ -0,0 +1,19 @@ +XK_leftcaret = 0xba3 +XK_rightcaret = 0xba6 +XK_downcaret = 0xba8 +XK_upcaret = 0xba9 +XK_overbar = 0xbc0 +XK_downtack = 0xbc2 +XK_upshoe = 0xbc3 +XK_downstile = 0xbc4 +XK_underbar = 0xbc6 +XK_jot = 0xbca +XK_quad = 0xbcc +XK_uptack = 0xbce +XK_circle = 0xbcf +XK_upstile = 0xbd3 +XK_downshoe = 0xbd6 +XK_rightshoe = 0xbd8 +XK_leftshoe = 0xbda +XK_lefttack = 0xbdc +XK_righttack = 0xbfc diff --git a/venv/lib/python3.12/site-packages/Xlib/keysymdef/arabic.py b/venv/lib/python3.12/site-packages/Xlib/keysymdef/arabic.py new file mode 100644 index 0000000..2eedb71 --- /dev/null +++ b/venv/lib/python3.12/site-packages/Xlib/keysymdef/arabic.py @@ -0,0 +1,50 @@ +XK_Arabic_comma = 0x5ac +XK_Arabic_semicolon = 0x5bb +XK_Arabic_question_mark = 0x5bf +XK_Arabic_hamza = 0x5c1 +XK_Arabic_maddaonalef = 0x5c2 +XK_Arabic_hamzaonalef = 0x5c3 +XK_Arabic_hamzaonwaw = 0x5c4 +XK_Arabic_hamzaunderalef = 0x5c5 +XK_Arabic_hamzaonyeh = 0x5c6 +XK_Arabic_alef = 0x5c7 +XK_Arabic_beh = 0x5c8 +XK_Arabic_tehmarbuta = 0x5c9 +XK_Arabic_teh = 0x5ca +XK_Arabic_theh = 0x5cb +XK_Arabic_jeem = 0x5cc +XK_Arabic_hah = 0x5cd +XK_Arabic_khah = 0x5ce +XK_Arabic_dal = 0x5cf +XK_Arabic_thal = 0x5d0 +XK_Arabic_ra = 0x5d1 +XK_Arabic_zain = 0x5d2 +XK_Arabic_seen = 0x5d3 +XK_Arabic_sheen = 0x5d4 +XK_Arabic_sad = 0x5d5 +XK_Arabic_dad = 0x5d6 +XK_Arabic_tah = 0x5d7 +XK_Arabic_zah = 0x5d8 +XK_Arabic_ain = 0x5d9 +XK_Arabic_ghain = 0x5da +XK_Arabic_tatweel = 0x5e0 +XK_Arabic_feh = 0x5e1 +XK_Arabic_qaf = 0x5e2 +XK_Arabic_kaf = 0x5e3 +XK_Arabic_lam = 0x5e4 +XK_Arabic_meem = 0x5e5 +XK_Arabic_noon = 0x5e6 +XK_Arabic_ha = 0x5e7 +XK_Arabic_heh = 0x5e7 +XK_Arabic_waw = 0x5e8 +XK_Arabic_alefmaksura = 0x5e9 +XK_Arabic_yeh = 0x5ea +XK_Arabic_fathatan = 0x5eb +XK_Arabic_dammatan = 0x5ec +XK_Arabic_kasratan = 0x5ed +XK_Arabic_fatha = 0x5ee +XK_Arabic_damma = 0x5ef +XK_Arabic_kasra = 0x5f0 +XK_Arabic_shadda = 0x5f1 +XK_Arabic_sukun = 0x5f2 +XK_Arabic_switch = 0xFF7E diff --git a/venv/lib/python3.12/site-packages/Xlib/keysymdef/cyrillic.py b/venv/lib/python3.12/site-packages/Xlib/keysymdef/cyrillic.py new file mode 100644 index 0000000..60f804d --- /dev/null +++ b/venv/lib/python3.12/site-packages/Xlib/keysymdef/cyrillic.py @@ -0,0 +1,107 @@ +XK_Serbian_dje = 0x6a1 +XK_Macedonia_gje = 0x6a2 +XK_Cyrillic_io = 0x6a3 +XK_Ukrainian_ie = 0x6a4 +XK_Ukranian_je = 0x6a4 +XK_Macedonia_dse = 0x6a5 +XK_Ukrainian_i = 0x6a6 +XK_Ukranian_i = 0x6a6 +XK_Ukrainian_yi = 0x6a7 +XK_Ukranian_yi = 0x6a7 +XK_Cyrillic_je = 0x6a8 +XK_Serbian_je = 0x6a8 +XK_Cyrillic_lje = 0x6a9 +XK_Serbian_lje = 0x6a9 +XK_Cyrillic_nje = 0x6aa +XK_Serbian_nje = 0x6aa +XK_Serbian_tshe = 0x6ab +XK_Macedonia_kje = 0x6ac +XK_Byelorussian_shortu = 0x6ae +XK_Cyrillic_dzhe = 0x6af +XK_Serbian_dze = 0x6af +XK_numerosign = 0x6b0 +XK_Serbian_DJE = 0x6b1 +XK_Macedonia_GJE = 0x6b2 +XK_Cyrillic_IO = 0x6b3 +XK_Ukrainian_IE = 0x6b4 +XK_Ukranian_JE = 0x6b4 +XK_Macedonia_DSE = 0x6b5 +XK_Ukrainian_I = 0x6b6 +XK_Ukranian_I = 0x6b6 +XK_Ukrainian_YI = 0x6b7 +XK_Ukranian_YI = 0x6b7 +XK_Cyrillic_JE = 0x6b8 +XK_Serbian_JE = 0x6b8 +XK_Cyrillic_LJE = 0x6b9 +XK_Serbian_LJE = 0x6b9 +XK_Cyrillic_NJE = 0x6ba +XK_Serbian_NJE = 0x6ba +XK_Serbian_TSHE = 0x6bb +XK_Macedonia_KJE = 0x6bc +XK_Byelorussian_SHORTU = 0x6be +XK_Cyrillic_DZHE = 0x6bf +XK_Serbian_DZE = 0x6bf +XK_Cyrillic_yu = 0x6c0 +XK_Cyrillic_a = 0x6c1 +XK_Cyrillic_be = 0x6c2 +XK_Cyrillic_tse = 0x6c3 +XK_Cyrillic_de = 0x6c4 +XK_Cyrillic_ie = 0x6c5 +XK_Cyrillic_ef = 0x6c6 +XK_Cyrillic_ghe = 0x6c7 +XK_Cyrillic_ha = 0x6c8 +XK_Cyrillic_i = 0x6c9 +XK_Cyrillic_shorti = 0x6ca +XK_Cyrillic_ka = 0x6cb +XK_Cyrillic_el = 0x6cc +XK_Cyrillic_em = 0x6cd +XK_Cyrillic_en = 0x6ce +XK_Cyrillic_o = 0x6cf +XK_Cyrillic_pe = 0x6d0 +XK_Cyrillic_ya = 0x6d1 +XK_Cyrillic_er = 0x6d2 +XK_Cyrillic_es = 0x6d3 +XK_Cyrillic_te = 0x6d4 +XK_Cyrillic_u = 0x6d5 +XK_Cyrillic_zhe = 0x6d6 +XK_Cyrillic_ve = 0x6d7 +XK_Cyrillic_softsign = 0x6d8 +XK_Cyrillic_yeru = 0x6d9 +XK_Cyrillic_ze = 0x6da +XK_Cyrillic_sha = 0x6db +XK_Cyrillic_e = 0x6dc +XK_Cyrillic_shcha = 0x6dd +XK_Cyrillic_che = 0x6de +XK_Cyrillic_hardsign = 0x6df +XK_Cyrillic_YU = 0x6e0 +XK_Cyrillic_A = 0x6e1 +XK_Cyrillic_BE = 0x6e2 +XK_Cyrillic_TSE = 0x6e3 +XK_Cyrillic_DE = 0x6e4 +XK_Cyrillic_IE = 0x6e5 +XK_Cyrillic_EF = 0x6e6 +XK_Cyrillic_GHE = 0x6e7 +XK_Cyrillic_HA = 0x6e8 +XK_Cyrillic_I = 0x6e9 +XK_Cyrillic_SHORTI = 0x6ea +XK_Cyrillic_KA = 0x6eb +XK_Cyrillic_EL = 0x6ec +XK_Cyrillic_EM = 0x6ed +XK_Cyrillic_EN = 0x6ee +XK_Cyrillic_O = 0x6ef +XK_Cyrillic_PE = 0x6f0 +XK_Cyrillic_YA = 0x6f1 +XK_Cyrillic_ER = 0x6f2 +XK_Cyrillic_ES = 0x6f3 +XK_Cyrillic_TE = 0x6f4 +XK_Cyrillic_U = 0x6f5 +XK_Cyrillic_ZHE = 0x6f6 +XK_Cyrillic_VE = 0x6f7 +XK_Cyrillic_SOFTSIGN = 0x6f8 +XK_Cyrillic_YERU = 0x6f9 +XK_Cyrillic_ZE = 0x6fa +XK_Cyrillic_SHA = 0x6fb +XK_Cyrillic_E = 0x6fc +XK_Cyrillic_SHCHA = 0x6fd +XK_Cyrillic_CHE = 0x6fe +XK_Cyrillic_HARDSIGN = 0x6ff diff --git a/venv/lib/python3.12/site-packages/Xlib/keysymdef/greek.py b/venv/lib/python3.12/site-packages/Xlib/keysymdef/greek.py new file mode 100644 index 0000000..8cb062a --- /dev/null +++ b/venv/lib/python3.12/site-packages/Xlib/keysymdef/greek.py @@ -0,0 +1,74 @@ +XK_Greek_ALPHAaccent = 0x7a1 +XK_Greek_EPSILONaccent = 0x7a2 +XK_Greek_ETAaccent = 0x7a3 +XK_Greek_IOTAaccent = 0x7a4 +XK_Greek_IOTAdiaeresis = 0x7a5 +XK_Greek_OMICRONaccent = 0x7a7 +XK_Greek_UPSILONaccent = 0x7a8 +XK_Greek_UPSILONdieresis = 0x7a9 +XK_Greek_OMEGAaccent = 0x7ab +XK_Greek_accentdieresis = 0x7ae +XK_Greek_horizbar = 0x7af +XK_Greek_alphaaccent = 0x7b1 +XK_Greek_epsilonaccent = 0x7b2 +XK_Greek_etaaccent = 0x7b3 +XK_Greek_iotaaccent = 0x7b4 +XK_Greek_iotadieresis = 0x7b5 +XK_Greek_iotaaccentdieresis = 0x7b6 +XK_Greek_omicronaccent = 0x7b7 +XK_Greek_upsilonaccent = 0x7b8 +XK_Greek_upsilondieresis = 0x7b9 +XK_Greek_upsilonaccentdieresis = 0x7ba +XK_Greek_omegaaccent = 0x7bb +XK_Greek_ALPHA = 0x7c1 +XK_Greek_BETA = 0x7c2 +XK_Greek_GAMMA = 0x7c3 +XK_Greek_DELTA = 0x7c4 +XK_Greek_EPSILON = 0x7c5 +XK_Greek_ZETA = 0x7c6 +XK_Greek_ETA = 0x7c7 +XK_Greek_THETA = 0x7c8 +XK_Greek_IOTA = 0x7c9 +XK_Greek_KAPPA = 0x7ca +XK_Greek_LAMDA = 0x7cb +XK_Greek_LAMBDA = 0x7cb +XK_Greek_MU = 0x7cc +XK_Greek_NU = 0x7cd +XK_Greek_XI = 0x7ce +XK_Greek_OMICRON = 0x7cf +XK_Greek_PI = 0x7d0 +XK_Greek_RHO = 0x7d1 +XK_Greek_SIGMA = 0x7d2 +XK_Greek_TAU = 0x7d4 +XK_Greek_UPSILON = 0x7d5 +XK_Greek_PHI = 0x7d6 +XK_Greek_CHI = 0x7d7 +XK_Greek_PSI = 0x7d8 +XK_Greek_OMEGA = 0x7d9 +XK_Greek_alpha = 0x7e1 +XK_Greek_beta = 0x7e2 +XK_Greek_gamma = 0x7e3 +XK_Greek_delta = 0x7e4 +XK_Greek_epsilon = 0x7e5 +XK_Greek_zeta = 0x7e6 +XK_Greek_eta = 0x7e7 +XK_Greek_theta = 0x7e8 +XK_Greek_iota = 0x7e9 +XK_Greek_kappa = 0x7ea +XK_Greek_lamda = 0x7eb +XK_Greek_lambda = 0x7eb +XK_Greek_mu = 0x7ec +XK_Greek_nu = 0x7ed +XK_Greek_xi = 0x7ee +XK_Greek_omicron = 0x7ef +XK_Greek_pi = 0x7f0 +XK_Greek_rho = 0x7f1 +XK_Greek_sigma = 0x7f2 +XK_Greek_finalsmallsigma = 0x7f3 +XK_Greek_tau = 0x7f4 +XK_Greek_upsilon = 0x7f5 +XK_Greek_phi = 0x7f6 +XK_Greek_chi = 0x7f7 +XK_Greek_psi = 0x7f8 +XK_Greek_omega = 0x7f9 +XK_Greek_switch = 0xFF7E diff --git a/venv/lib/python3.12/site-packages/Xlib/keysymdef/hebrew.py b/venv/lib/python3.12/site-packages/Xlib/keysymdef/hebrew.py new file mode 100644 index 0000000..94ce089 --- /dev/null +++ b/venv/lib/python3.12/site-packages/Xlib/keysymdef/hebrew.py @@ -0,0 +1,40 @@ +XK_hebrew_doublelowline = 0xcdf +XK_hebrew_aleph = 0xce0 +XK_hebrew_bet = 0xce1 +XK_hebrew_beth = 0xce1 +XK_hebrew_gimel = 0xce2 +XK_hebrew_gimmel = 0xce2 +XK_hebrew_dalet = 0xce3 +XK_hebrew_daleth = 0xce3 +XK_hebrew_he = 0xce4 +XK_hebrew_waw = 0xce5 +XK_hebrew_zain = 0xce6 +XK_hebrew_zayin = 0xce6 +XK_hebrew_chet = 0xce7 +XK_hebrew_het = 0xce7 +XK_hebrew_tet = 0xce8 +XK_hebrew_teth = 0xce8 +XK_hebrew_yod = 0xce9 +XK_hebrew_finalkaph = 0xcea +XK_hebrew_kaph = 0xceb +XK_hebrew_lamed = 0xcec +XK_hebrew_finalmem = 0xced +XK_hebrew_mem = 0xcee +XK_hebrew_finalnun = 0xcef +XK_hebrew_nun = 0xcf0 +XK_hebrew_samech = 0xcf1 +XK_hebrew_samekh = 0xcf1 +XK_hebrew_ayin = 0xcf2 +XK_hebrew_finalpe = 0xcf3 +XK_hebrew_pe = 0xcf4 +XK_hebrew_finalzade = 0xcf5 +XK_hebrew_finalzadi = 0xcf5 +XK_hebrew_zade = 0xcf6 +XK_hebrew_zadi = 0xcf6 +XK_hebrew_qoph = 0xcf7 +XK_hebrew_kuf = 0xcf7 +XK_hebrew_resh = 0xcf8 +XK_hebrew_shin = 0xcf9 +XK_hebrew_taw = 0xcfa +XK_hebrew_taf = 0xcfa +XK_Hebrew_switch = 0xFF7E diff --git a/venv/lib/python3.12/site-packages/Xlib/keysymdef/katakana.py b/venv/lib/python3.12/site-packages/Xlib/keysymdef/katakana.py new file mode 100644 index 0000000..ca0428d --- /dev/null +++ b/venv/lib/python3.12/site-packages/Xlib/keysymdef/katakana.py @@ -0,0 +1,70 @@ +XK_overline = 0x47e +XK_kana_fullstop = 0x4a1 +XK_kana_openingbracket = 0x4a2 +XK_kana_closingbracket = 0x4a3 +XK_kana_comma = 0x4a4 +XK_kana_conjunctive = 0x4a5 +XK_kana_middledot = 0x4a5 +XK_kana_WO = 0x4a6 +XK_kana_a = 0x4a7 +XK_kana_i = 0x4a8 +XK_kana_u = 0x4a9 +XK_kana_e = 0x4aa +XK_kana_o = 0x4ab +XK_kana_ya = 0x4ac +XK_kana_yu = 0x4ad +XK_kana_yo = 0x4ae +XK_kana_tsu = 0x4af +XK_kana_tu = 0x4af +XK_prolongedsound = 0x4b0 +XK_kana_A = 0x4b1 +XK_kana_I = 0x4b2 +XK_kana_U = 0x4b3 +XK_kana_E = 0x4b4 +XK_kana_O = 0x4b5 +XK_kana_KA = 0x4b6 +XK_kana_KI = 0x4b7 +XK_kana_KU = 0x4b8 +XK_kana_KE = 0x4b9 +XK_kana_KO = 0x4ba +XK_kana_SA = 0x4bb +XK_kana_SHI = 0x4bc +XK_kana_SU = 0x4bd +XK_kana_SE = 0x4be +XK_kana_SO = 0x4bf +XK_kana_TA = 0x4c0 +XK_kana_CHI = 0x4c1 +XK_kana_TI = 0x4c1 +XK_kana_TSU = 0x4c2 +XK_kana_TU = 0x4c2 +XK_kana_TE = 0x4c3 +XK_kana_TO = 0x4c4 +XK_kana_NA = 0x4c5 +XK_kana_NI = 0x4c6 +XK_kana_NU = 0x4c7 +XK_kana_NE = 0x4c8 +XK_kana_NO = 0x4c9 +XK_kana_HA = 0x4ca +XK_kana_HI = 0x4cb +XK_kana_FU = 0x4cc +XK_kana_HU = 0x4cc +XK_kana_HE = 0x4cd +XK_kana_HO = 0x4ce +XK_kana_MA = 0x4cf +XK_kana_MI = 0x4d0 +XK_kana_MU = 0x4d1 +XK_kana_ME = 0x4d2 +XK_kana_MO = 0x4d3 +XK_kana_YA = 0x4d4 +XK_kana_YU = 0x4d5 +XK_kana_YO = 0x4d6 +XK_kana_RA = 0x4d7 +XK_kana_RI = 0x4d8 +XK_kana_RU = 0x4d9 +XK_kana_RE = 0x4da +XK_kana_RO = 0x4db +XK_kana_WA = 0x4dc +XK_kana_N = 0x4dd +XK_voicedsound = 0x4de +XK_semivoicedsound = 0x4df +XK_kana_switch = 0xFF7E diff --git a/venv/lib/python3.12/site-packages/Xlib/keysymdef/korean.py b/venv/lib/python3.12/site-packages/Xlib/keysymdef/korean.py new file mode 100644 index 0000000..86480d0 --- /dev/null +++ b/venv/lib/python3.12/site-packages/Xlib/keysymdef/korean.py @@ -0,0 +1,107 @@ +XK_Hangul = 0xff31 +XK_Hangul_Start = 0xff32 +XK_Hangul_End = 0xff33 +XK_Hangul_Hanja = 0xff34 +XK_Hangul_Jamo = 0xff35 +XK_Hangul_Romaja = 0xff36 +XK_Hangul_Codeinput = 0xff37 +XK_Hangul_Jeonja = 0xff38 +XK_Hangul_Banja = 0xff39 +XK_Hangul_PreHanja = 0xff3a +XK_Hangul_PostHanja = 0xff3b +XK_Hangul_SingleCandidate = 0xff3c +XK_Hangul_MultipleCandidate = 0xff3d +XK_Hangul_PreviousCandidate = 0xff3e +XK_Hangul_Special = 0xff3f +XK_Hangul_switch = 0xFF7E +XK_Hangul_Kiyeog = 0xea1 +XK_Hangul_SsangKiyeog = 0xea2 +XK_Hangul_KiyeogSios = 0xea3 +XK_Hangul_Nieun = 0xea4 +XK_Hangul_NieunJieuj = 0xea5 +XK_Hangul_NieunHieuh = 0xea6 +XK_Hangul_Dikeud = 0xea7 +XK_Hangul_SsangDikeud = 0xea8 +XK_Hangul_Rieul = 0xea9 +XK_Hangul_RieulKiyeog = 0xeaa +XK_Hangul_RieulMieum = 0xeab +XK_Hangul_RieulPieub = 0xeac +XK_Hangul_RieulSios = 0xead +XK_Hangul_RieulTieut = 0xeae +XK_Hangul_RieulPhieuf = 0xeaf +XK_Hangul_RieulHieuh = 0xeb0 +XK_Hangul_Mieum = 0xeb1 +XK_Hangul_Pieub = 0xeb2 +XK_Hangul_SsangPieub = 0xeb3 +XK_Hangul_PieubSios = 0xeb4 +XK_Hangul_Sios = 0xeb5 +XK_Hangul_SsangSios = 0xeb6 +XK_Hangul_Ieung = 0xeb7 +XK_Hangul_Jieuj = 0xeb8 +XK_Hangul_SsangJieuj = 0xeb9 +XK_Hangul_Cieuc = 0xeba +XK_Hangul_Khieuq = 0xebb +XK_Hangul_Tieut = 0xebc +XK_Hangul_Phieuf = 0xebd +XK_Hangul_Hieuh = 0xebe +XK_Hangul_A = 0xebf +XK_Hangul_AE = 0xec0 +XK_Hangul_YA = 0xec1 +XK_Hangul_YAE = 0xec2 +XK_Hangul_EO = 0xec3 +XK_Hangul_E = 0xec4 +XK_Hangul_YEO = 0xec5 +XK_Hangul_YE = 0xec6 +XK_Hangul_O = 0xec7 +XK_Hangul_WA = 0xec8 +XK_Hangul_WAE = 0xec9 +XK_Hangul_OE = 0xeca +XK_Hangul_YO = 0xecb +XK_Hangul_U = 0xecc +XK_Hangul_WEO = 0xecd +XK_Hangul_WE = 0xece +XK_Hangul_WI = 0xecf +XK_Hangul_YU = 0xed0 +XK_Hangul_EU = 0xed1 +XK_Hangul_YI = 0xed2 +XK_Hangul_I = 0xed3 +XK_Hangul_J_Kiyeog = 0xed4 +XK_Hangul_J_SsangKiyeog = 0xed5 +XK_Hangul_J_KiyeogSios = 0xed6 +XK_Hangul_J_Nieun = 0xed7 +XK_Hangul_J_NieunJieuj = 0xed8 +XK_Hangul_J_NieunHieuh = 0xed9 +XK_Hangul_J_Dikeud = 0xeda +XK_Hangul_J_Rieul = 0xedb +XK_Hangul_J_RieulKiyeog = 0xedc +XK_Hangul_J_RieulMieum = 0xedd +XK_Hangul_J_RieulPieub = 0xede +XK_Hangul_J_RieulSios = 0xedf +XK_Hangul_J_RieulTieut = 0xee0 +XK_Hangul_J_RieulPhieuf = 0xee1 +XK_Hangul_J_RieulHieuh = 0xee2 +XK_Hangul_J_Mieum = 0xee3 +XK_Hangul_J_Pieub = 0xee4 +XK_Hangul_J_PieubSios = 0xee5 +XK_Hangul_J_Sios = 0xee6 +XK_Hangul_J_SsangSios = 0xee7 +XK_Hangul_J_Ieung = 0xee8 +XK_Hangul_J_Jieuj = 0xee9 +XK_Hangul_J_Cieuc = 0xeea +XK_Hangul_J_Khieuq = 0xeeb +XK_Hangul_J_Tieut = 0xeec +XK_Hangul_J_Phieuf = 0xeed +XK_Hangul_J_Hieuh = 0xeee +XK_Hangul_RieulYeorinHieuh = 0xeef +XK_Hangul_SunkyeongeumMieum = 0xef0 +XK_Hangul_SunkyeongeumPieub = 0xef1 +XK_Hangul_PanSios = 0xef2 +XK_Hangul_KkogjiDalrinIeung = 0xef3 +XK_Hangul_SunkyeongeumPhieuf = 0xef4 +XK_Hangul_YeorinHieuh = 0xef5 +XK_Hangul_AraeA = 0xef6 +XK_Hangul_AraeAE = 0xef7 +XK_Hangul_J_PanSios = 0xef8 +XK_Hangul_J_KkogjiDalrinIeung = 0xef9 +XK_Hangul_J_YeorinHieuh = 0xefa +XK_Korean_Won = 0xeff diff --git a/venv/lib/python3.12/site-packages/Xlib/keysymdef/latin1.py b/venv/lib/python3.12/site-packages/Xlib/keysymdef/latin1.py new file mode 100644 index 0000000..350ccff --- /dev/null +++ b/venv/lib/python3.12/site-packages/Xlib/keysymdef/latin1.py @@ -0,0 +1,195 @@ +XK_space = 0x020 +XK_exclam = 0x021 +XK_quotedbl = 0x022 +XK_numbersign = 0x023 +XK_dollar = 0x024 +XK_percent = 0x025 +XK_ampersand = 0x026 +XK_apostrophe = 0x027 +XK_quoteright = 0x027 +XK_parenleft = 0x028 +XK_parenright = 0x029 +XK_asterisk = 0x02a +XK_plus = 0x02b +XK_comma = 0x02c +XK_minus = 0x02d +XK_period = 0x02e +XK_slash = 0x02f +XK_0 = 0x030 +XK_1 = 0x031 +XK_2 = 0x032 +XK_3 = 0x033 +XK_4 = 0x034 +XK_5 = 0x035 +XK_6 = 0x036 +XK_7 = 0x037 +XK_8 = 0x038 +XK_9 = 0x039 +XK_colon = 0x03a +XK_semicolon = 0x03b +XK_less = 0x03c +XK_equal = 0x03d +XK_greater = 0x03e +XK_question = 0x03f +XK_at = 0x040 +XK_A = 0x041 +XK_B = 0x042 +XK_C = 0x043 +XK_D = 0x044 +XK_E = 0x045 +XK_F = 0x046 +XK_G = 0x047 +XK_H = 0x048 +XK_I = 0x049 +XK_J = 0x04a +XK_K = 0x04b +XK_L = 0x04c +XK_M = 0x04d +XK_N = 0x04e +XK_O = 0x04f +XK_P = 0x050 +XK_Q = 0x051 +XK_R = 0x052 +XK_S = 0x053 +XK_T = 0x054 +XK_U = 0x055 +XK_V = 0x056 +XK_W = 0x057 +XK_X = 0x058 +XK_Y = 0x059 +XK_Z = 0x05a +XK_bracketleft = 0x05b +XK_backslash = 0x05c +XK_bracketright = 0x05d +XK_asciicircum = 0x05e +XK_underscore = 0x05f +XK_grave = 0x060 +XK_quoteleft = 0x060 +XK_a = 0x061 +XK_b = 0x062 +XK_c = 0x063 +XK_d = 0x064 +XK_e = 0x065 +XK_f = 0x066 +XK_g = 0x067 +XK_h = 0x068 +XK_i = 0x069 +XK_j = 0x06a +XK_k = 0x06b +XK_l = 0x06c +XK_m = 0x06d +XK_n = 0x06e +XK_o = 0x06f +XK_p = 0x070 +XK_q = 0x071 +XK_r = 0x072 +XK_s = 0x073 +XK_t = 0x074 +XK_u = 0x075 +XK_v = 0x076 +XK_w = 0x077 +XK_x = 0x078 +XK_y = 0x079 +XK_z = 0x07a +XK_braceleft = 0x07b +XK_bar = 0x07c +XK_braceright = 0x07d +XK_asciitilde = 0x07e +XK_nobreakspace = 0x0a0 +XK_exclamdown = 0x0a1 +XK_cent = 0x0a2 +XK_sterling = 0x0a3 +XK_currency = 0x0a4 +XK_yen = 0x0a5 +XK_brokenbar = 0x0a6 +XK_section = 0x0a7 +XK_diaeresis = 0x0a8 +XK_copyright = 0x0a9 +XK_ordfeminine = 0x0aa +XK_guillemotleft = 0x0ab +XK_notsign = 0x0ac +XK_hyphen = 0x0ad +XK_registered = 0x0ae +XK_macron = 0x0af +XK_degree = 0x0b0 +XK_plusminus = 0x0b1 +XK_twosuperior = 0x0b2 +XK_threesuperior = 0x0b3 +XK_acute = 0x0b4 +XK_mu = 0x0b5 +XK_paragraph = 0x0b6 +XK_periodcentered = 0x0b7 +XK_cedilla = 0x0b8 +XK_onesuperior = 0x0b9 +XK_masculine = 0x0ba +XK_guillemotright = 0x0bb +XK_onequarter = 0x0bc +XK_onehalf = 0x0bd +XK_threequarters = 0x0be +XK_questiondown = 0x0bf +XK_Agrave = 0x0c0 +XK_Aacute = 0x0c1 +XK_Acircumflex = 0x0c2 +XK_Atilde = 0x0c3 +XK_Adiaeresis = 0x0c4 +XK_Aring = 0x0c5 +XK_AE = 0x0c6 +XK_Ccedilla = 0x0c7 +XK_Egrave = 0x0c8 +XK_Eacute = 0x0c9 +XK_Ecircumflex = 0x0ca +XK_Ediaeresis = 0x0cb +XK_Igrave = 0x0cc +XK_Iacute = 0x0cd +XK_Icircumflex = 0x0ce +XK_Idiaeresis = 0x0cf +XK_ETH = 0x0d0 +XK_Eth = 0x0d0 +XK_Ntilde = 0x0d1 +XK_Ograve = 0x0d2 +XK_Oacute = 0x0d3 +XK_Ocircumflex = 0x0d4 +XK_Otilde = 0x0d5 +XK_Odiaeresis = 0x0d6 +XK_multiply = 0x0d7 +XK_Ooblique = 0x0d8 +XK_Ugrave = 0x0d9 +XK_Uacute = 0x0da +XK_Ucircumflex = 0x0db +XK_Udiaeresis = 0x0dc +XK_Yacute = 0x0dd +XK_THORN = 0x0de +XK_Thorn = 0x0de +XK_ssharp = 0x0df +XK_agrave = 0x0e0 +XK_aacute = 0x0e1 +XK_acircumflex = 0x0e2 +XK_atilde = 0x0e3 +XK_adiaeresis = 0x0e4 +XK_aring = 0x0e5 +XK_ae = 0x0e6 +XK_ccedilla = 0x0e7 +XK_egrave = 0x0e8 +XK_eacute = 0x0e9 +XK_ecircumflex = 0x0ea +XK_ediaeresis = 0x0eb +XK_igrave = 0x0ec +XK_iacute = 0x0ed +XK_icircumflex = 0x0ee +XK_idiaeresis = 0x0ef +XK_eth = 0x0f0 +XK_ntilde = 0x0f1 +XK_ograve = 0x0f2 +XK_oacute = 0x0f3 +XK_ocircumflex = 0x0f4 +XK_otilde = 0x0f5 +XK_odiaeresis = 0x0f6 +XK_division = 0x0f7 +XK_oslash = 0x0f8 +XK_ugrave = 0x0f9 +XK_uacute = 0x0fa +XK_ucircumflex = 0x0fb +XK_udiaeresis = 0x0fc +XK_yacute = 0x0fd +XK_thorn = 0x0fe +XK_ydiaeresis = 0x0ff diff --git a/venv/lib/python3.12/site-packages/Xlib/keysymdef/latin2.py b/venv/lib/python3.12/site-packages/Xlib/keysymdef/latin2.py new file mode 100644 index 0000000..f0d9a15 --- /dev/null +++ b/venv/lib/python3.12/site-packages/Xlib/keysymdef/latin2.py @@ -0,0 +1,57 @@ +XK_Aogonek = 0x1a1 +XK_breve = 0x1a2 +XK_Lstroke = 0x1a3 +XK_Lcaron = 0x1a5 +XK_Sacute = 0x1a6 +XK_Scaron = 0x1a9 +XK_Scedilla = 0x1aa +XK_Tcaron = 0x1ab +XK_Zacute = 0x1ac +XK_Zcaron = 0x1ae +XK_Zabovedot = 0x1af +XK_aogonek = 0x1b1 +XK_ogonek = 0x1b2 +XK_lstroke = 0x1b3 +XK_lcaron = 0x1b5 +XK_sacute = 0x1b6 +XK_caron = 0x1b7 +XK_scaron = 0x1b9 +XK_scedilla = 0x1ba +XK_tcaron = 0x1bb +XK_zacute = 0x1bc +XK_doubleacute = 0x1bd +XK_zcaron = 0x1be +XK_zabovedot = 0x1bf +XK_Racute = 0x1c0 +XK_Abreve = 0x1c3 +XK_Lacute = 0x1c5 +XK_Cacute = 0x1c6 +XK_Ccaron = 0x1c8 +XK_Eogonek = 0x1ca +XK_Ecaron = 0x1cc +XK_Dcaron = 0x1cf +XK_Dstroke = 0x1d0 +XK_Nacute = 0x1d1 +XK_Ncaron = 0x1d2 +XK_Odoubleacute = 0x1d5 +XK_Rcaron = 0x1d8 +XK_Uring = 0x1d9 +XK_Udoubleacute = 0x1db +XK_Tcedilla = 0x1de +XK_racute = 0x1e0 +XK_abreve = 0x1e3 +XK_lacute = 0x1e5 +XK_cacute = 0x1e6 +XK_ccaron = 0x1e8 +XK_eogonek = 0x1ea +XK_ecaron = 0x1ec +XK_dcaron = 0x1ef +XK_dstroke = 0x1f0 +XK_nacute = 0x1f1 +XK_ncaron = 0x1f2 +XK_odoubleacute = 0x1f5 +XK_udoubleacute = 0x1fb +XK_rcaron = 0x1f8 +XK_uring = 0x1f9 +XK_tcedilla = 0x1fe +XK_abovedot = 0x1ff diff --git a/venv/lib/python3.12/site-packages/Xlib/keysymdef/latin3.py b/venv/lib/python3.12/site-packages/Xlib/keysymdef/latin3.py new file mode 100644 index 0000000..a14c562 --- /dev/null +++ b/venv/lib/python3.12/site-packages/Xlib/keysymdef/latin3.py @@ -0,0 +1,22 @@ +XK_Hstroke = 0x2a1 +XK_Hcircumflex = 0x2a6 +XK_Iabovedot = 0x2a9 +XK_Gbreve = 0x2ab +XK_Jcircumflex = 0x2ac +XK_hstroke = 0x2b1 +XK_hcircumflex = 0x2b6 +XK_idotless = 0x2b9 +XK_gbreve = 0x2bb +XK_jcircumflex = 0x2bc +XK_Cabovedot = 0x2c5 +XK_Ccircumflex = 0x2c6 +XK_Gabovedot = 0x2d5 +XK_Gcircumflex = 0x2d8 +XK_Ubreve = 0x2dd +XK_Scircumflex = 0x2de +XK_cabovedot = 0x2e5 +XK_ccircumflex = 0x2e6 +XK_gabovedot = 0x2f5 +XK_gcircumflex = 0x2f8 +XK_ubreve = 0x2fd +XK_scircumflex = 0x2fe diff --git a/venv/lib/python3.12/site-packages/Xlib/keysymdef/latin4.py b/venv/lib/python3.12/site-packages/Xlib/keysymdef/latin4.py new file mode 100644 index 0000000..4ee1d80 --- /dev/null +++ b/venv/lib/python3.12/site-packages/Xlib/keysymdef/latin4.py @@ -0,0 +1,36 @@ +XK_kra = 0x3a2 +XK_kappa = 0x3a2 +XK_Rcedilla = 0x3a3 +XK_Itilde = 0x3a5 +XK_Lcedilla = 0x3a6 +XK_Emacron = 0x3aa +XK_Gcedilla = 0x3ab +XK_Tslash = 0x3ac +XK_rcedilla = 0x3b3 +XK_itilde = 0x3b5 +XK_lcedilla = 0x3b6 +XK_emacron = 0x3ba +XK_gcedilla = 0x3bb +XK_tslash = 0x3bc +XK_ENG = 0x3bd +XK_eng = 0x3bf +XK_Amacron = 0x3c0 +XK_Iogonek = 0x3c7 +XK_Eabovedot = 0x3cc +XK_Imacron = 0x3cf +XK_Ncedilla = 0x3d1 +XK_Omacron = 0x3d2 +XK_Kcedilla = 0x3d3 +XK_Uogonek = 0x3d9 +XK_Utilde = 0x3dd +XK_Umacron = 0x3de +XK_amacron = 0x3e0 +XK_iogonek = 0x3e7 +XK_eabovedot = 0x3ec +XK_imacron = 0x3ef +XK_ncedilla = 0x3f1 +XK_omacron = 0x3f2 +XK_kcedilla = 0x3f3 +XK_uogonek = 0x3f9 +XK_utilde = 0x3fd +XK_umacron = 0x3fe diff --git a/venv/lib/python3.12/site-packages/Xlib/keysymdef/miscellany.py b/venv/lib/python3.12/site-packages/Xlib/keysymdef/miscellany.py new file mode 100644 index 0000000..9bcb578 --- /dev/null +++ b/venv/lib/python3.12/site-packages/Xlib/keysymdef/miscellany.py @@ -0,0 +1,169 @@ +XK_BackSpace = 0xFF08 +XK_Tab = 0xFF09 +XK_Linefeed = 0xFF0A +XK_Clear = 0xFF0B +XK_Return = 0xFF0D +XK_Pause = 0xFF13 +XK_Scroll_Lock = 0xFF14 +XK_Sys_Req = 0xFF15 +XK_Escape = 0xFF1B +XK_Delete = 0xFFFF +XK_Multi_key = 0xFF20 +XK_SingleCandidate = 0xFF3C +XK_MultipleCandidate = 0xFF3D +XK_PreviousCandidate = 0xFF3E +XK_Kanji = 0xFF21 +XK_Muhenkan = 0xFF22 +XK_Henkan_Mode = 0xFF23 +XK_Henkan = 0xFF23 +XK_Romaji = 0xFF24 +XK_Hiragana = 0xFF25 +XK_Katakana = 0xFF26 +XK_Hiragana_Katakana = 0xFF27 +XK_Zenkaku = 0xFF28 +XK_Hankaku = 0xFF29 +XK_Zenkaku_Hankaku = 0xFF2A +XK_Touroku = 0xFF2B +XK_Massyo = 0xFF2C +XK_Kana_Lock = 0xFF2D +XK_Kana_Shift = 0xFF2E +XK_Eisu_Shift = 0xFF2F +XK_Eisu_toggle = 0xFF30 +XK_Zen_Koho = 0xFF3D +XK_Mae_Koho = 0xFF3E +XK_Home = 0xFF50 +XK_Left = 0xFF51 +XK_Up = 0xFF52 +XK_Right = 0xFF53 +XK_Down = 0xFF54 +XK_Prior = 0xFF55 +XK_Page_Up = 0xFF55 +XK_Next = 0xFF56 +XK_Page_Down = 0xFF56 +XK_End = 0xFF57 +XK_Begin = 0xFF58 +XK_Select = 0xFF60 +XK_Print = 0xFF61 +XK_Execute = 0xFF62 +XK_Insert = 0xFF63 +XK_Undo = 0xFF65 +XK_Redo = 0xFF66 +XK_Menu = 0xFF67 +XK_Find = 0xFF68 +XK_Cancel = 0xFF69 +XK_Help = 0xFF6A +XK_Break = 0xFF6B +XK_Mode_switch = 0xFF7E +XK_script_switch = 0xFF7E +XK_Num_Lock = 0xFF7F +XK_KP_Space = 0xFF80 +XK_KP_Tab = 0xFF89 +XK_KP_Enter = 0xFF8D +XK_KP_F1 = 0xFF91 +XK_KP_F2 = 0xFF92 +XK_KP_F3 = 0xFF93 +XK_KP_F4 = 0xFF94 +XK_KP_Home = 0xFF95 +XK_KP_Left = 0xFF96 +XK_KP_Up = 0xFF97 +XK_KP_Right = 0xFF98 +XK_KP_Down = 0xFF99 +XK_KP_Prior = 0xFF9A +XK_KP_Page_Up = 0xFF9A +XK_KP_Next = 0xFF9B +XK_KP_Page_Down = 0xFF9B +XK_KP_End = 0xFF9C +XK_KP_Begin = 0xFF9D +XK_KP_Insert = 0xFF9E +XK_KP_Delete = 0xFF9F +XK_KP_Equal = 0xFFBD +XK_KP_Multiply = 0xFFAA +XK_KP_Add = 0xFFAB +XK_KP_Separator = 0xFFAC +XK_KP_Subtract = 0xFFAD +XK_KP_Decimal = 0xFFAE +XK_KP_Divide = 0xFFAF +XK_KP_0 = 0xFFB0 +XK_KP_1 = 0xFFB1 +XK_KP_2 = 0xFFB2 +XK_KP_3 = 0xFFB3 +XK_KP_4 = 0xFFB4 +XK_KP_5 = 0xFFB5 +XK_KP_6 = 0xFFB6 +XK_KP_7 = 0xFFB7 +XK_KP_8 = 0xFFB8 +XK_KP_9 = 0xFFB9 +XK_F1 = 0xFFBE +XK_F2 = 0xFFBF +XK_F3 = 0xFFC0 +XK_F4 = 0xFFC1 +XK_F5 = 0xFFC2 +XK_F6 = 0xFFC3 +XK_F7 = 0xFFC4 +XK_F8 = 0xFFC5 +XK_F9 = 0xFFC6 +XK_F10 = 0xFFC7 +XK_F11 = 0xFFC8 +XK_L1 = 0xFFC8 +XK_F12 = 0xFFC9 +XK_L2 = 0xFFC9 +XK_F13 = 0xFFCA +XK_L3 = 0xFFCA +XK_F14 = 0xFFCB +XK_L4 = 0xFFCB +XK_F15 = 0xFFCC +XK_L5 = 0xFFCC +XK_F16 = 0xFFCD +XK_L6 = 0xFFCD +XK_F17 = 0xFFCE +XK_L7 = 0xFFCE +XK_F18 = 0xFFCF +XK_L8 = 0xFFCF +XK_F19 = 0xFFD0 +XK_L9 = 0xFFD0 +XK_F20 = 0xFFD1 +XK_L10 = 0xFFD1 +XK_F21 = 0xFFD2 +XK_R1 = 0xFFD2 +XK_F22 = 0xFFD3 +XK_R2 = 0xFFD3 +XK_F23 = 0xFFD4 +XK_R3 = 0xFFD4 +XK_F24 = 0xFFD5 +XK_R4 = 0xFFD5 +XK_F25 = 0xFFD6 +XK_R5 = 0xFFD6 +XK_F26 = 0xFFD7 +XK_R6 = 0xFFD7 +XK_F27 = 0xFFD8 +XK_R7 = 0xFFD8 +XK_F28 = 0xFFD9 +XK_R8 = 0xFFD9 +XK_F29 = 0xFFDA +XK_R9 = 0xFFDA +XK_F30 = 0xFFDB +XK_R10 = 0xFFDB +XK_F31 = 0xFFDC +XK_R11 = 0xFFDC +XK_F32 = 0xFFDD +XK_R12 = 0xFFDD +XK_F33 = 0xFFDE +XK_R13 = 0xFFDE +XK_F34 = 0xFFDF +XK_R14 = 0xFFDF +XK_F35 = 0xFFE0 +XK_R15 = 0xFFE0 +XK_Shift_L = 0xFFE1 +XK_Shift_R = 0xFFE2 +XK_Control_L = 0xFFE3 +XK_Control_R = 0xFFE4 +XK_Caps_Lock = 0xFFE5 +XK_Shift_Lock = 0xFFE6 +XK_Meta_L = 0xFFE7 +XK_Meta_R = 0xFFE8 +XK_Alt_L = 0xFFE9 +XK_Alt_R = 0xFFEA +XK_Super_L = 0xFFEB +XK_Super_R = 0xFFEC +XK_Hyper_L = 0xFFED +XK_Hyper_R = 0xFFEE diff --git a/venv/lib/python3.12/site-packages/Xlib/keysymdef/publishing.py b/venv/lib/python3.12/site-packages/Xlib/keysymdef/publishing.py new file mode 100644 index 0000000..45b4138 --- /dev/null +++ b/venv/lib/python3.12/site-packages/Xlib/keysymdef/publishing.py @@ -0,0 +1,83 @@ +XK_emspace = 0xaa1 +XK_enspace = 0xaa2 +XK_em3space = 0xaa3 +XK_em4space = 0xaa4 +XK_digitspace = 0xaa5 +XK_punctspace = 0xaa6 +XK_thinspace = 0xaa7 +XK_hairspace = 0xaa8 +XK_emdash = 0xaa9 +XK_endash = 0xaaa +XK_signifblank = 0xaac +XK_ellipsis = 0xaae +XK_doubbaselinedot = 0xaaf +XK_onethird = 0xab0 +XK_twothirds = 0xab1 +XK_onefifth = 0xab2 +XK_twofifths = 0xab3 +XK_threefifths = 0xab4 +XK_fourfifths = 0xab5 +XK_onesixth = 0xab6 +XK_fivesixths = 0xab7 +XK_careof = 0xab8 +XK_figdash = 0xabb +XK_leftanglebracket = 0xabc +XK_decimalpoint = 0xabd +XK_rightanglebracket = 0xabe +XK_marker = 0xabf +XK_oneeighth = 0xac3 +XK_threeeighths = 0xac4 +XK_fiveeighths = 0xac5 +XK_seveneighths = 0xac6 +XK_trademark = 0xac9 +XK_signaturemark = 0xaca +XK_trademarkincircle = 0xacb +XK_leftopentriangle = 0xacc +XK_rightopentriangle = 0xacd +XK_emopencircle = 0xace +XK_emopenrectangle = 0xacf +XK_leftsinglequotemark = 0xad0 +XK_rightsinglequotemark = 0xad1 +XK_leftdoublequotemark = 0xad2 +XK_rightdoublequotemark = 0xad3 +XK_prescription = 0xad4 +XK_minutes = 0xad6 +XK_seconds = 0xad7 +XK_latincross = 0xad9 +XK_hexagram = 0xada +XK_filledrectbullet = 0xadb +XK_filledlefttribullet = 0xadc +XK_filledrighttribullet = 0xadd +XK_emfilledcircle = 0xade +XK_emfilledrect = 0xadf +XK_enopencircbullet = 0xae0 +XK_enopensquarebullet = 0xae1 +XK_openrectbullet = 0xae2 +XK_opentribulletup = 0xae3 +XK_opentribulletdown = 0xae4 +XK_openstar = 0xae5 +XK_enfilledcircbullet = 0xae6 +XK_enfilledsqbullet = 0xae7 +XK_filledtribulletup = 0xae8 +XK_filledtribulletdown = 0xae9 +XK_leftpointer = 0xaea +XK_rightpointer = 0xaeb +XK_club = 0xaec +XK_diamond = 0xaed +XK_heart = 0xaee +XK_maltesecross = 0xaf0 +XK_dagger = 0xaf1 +XK_doubledagger = 0xaf2 +XK_checkmark = 0xaf3 +XK_ballotcross = 0xaf4 +XK_musicalsharp = 0xaf5 +XK_musicalflat = 0xaf6 +XK_malesymbol = 0xaf7 +XK_femalesymbol = 0xaf8 +XK_telephone = 0xaf9 +XK_telephonerecorder = 0xafa +XK_phonographcopyright = 0xafb +XK_caret = 0xafc +XK_singlelowquotemark = 0xafd +XK_doublelowquotemark = 0xafe +XK_cursor = 0xaff diff --git a/venv/lib/python3.12/site-packages/Xlib/keysymdef/special.py b/venv/lib/python3.12/site-packages/Xlib/keysymdef/special.py new file mode 100644 index 0000000..8a27d4e --- /dev/null +++ b/venv/lib/python3.12/site-packages/Xlib/keysymdef/special.py @@ -0,0 +1,24 @@ +XK_blank = 0x9df +XK_soliddiamond = 0x9e0 +XK_checkerboard = 0x9e1 +XK_ht = 0x9e2 +XK_ff = 0x9e3 +XK_cr = 0x9e4 +XK_lf = 0x9e5 +XK_nl = 0x9e8 +XK_vt = 0x9e9 +XK_lowrightcorner = 0x9ea +XK_uprightcorner = 0x9eb +XK_upleftcorner = 0x9ec +XK_lowleftcorner = 0x9ed +XK_crossinglines = 0x9ee +XK_horizlinescan1 = 0x9ef +XK_horizlinescan3 = 0x9f0 +XK_horizlinescan5 = 0x9f1 +XK_horizlinescan7 = 0x9f2 +XK_horizlinescan9 = 0x9f3 +XK_leftt = 0x9f4 +XK_rightt = 0x9f5 +XK_bott = 0x9f6 +XK_topt = 0x9f7 +XK_vertbar = 0x9f8 diff --git a/venv/lib/python3.12/site-packages/Xlib/keysymdef/technical.py b/venv/lib/python3.12/site-packages/Xlib/keysymdef/technical.py new file mode 100644 index 0000000..4f75a97 --- /dev/null +++ b/venv/lib/python3.12/site-packages/Xlib/keysymdef/technical.py @@ -0,0 +1,49 @@ +XK_leftradical = 0x8a1 +XK_topleftradical = 0x8a2 +XK_horizconnector = 0x8a3 +XK_topintegral = 0x8a4 +XK_botintegral = 0x8a5 +XK_vertconnector = 0x8a6 +XK_topleftsqbracket = 0x8a7 +XK_botleftsqbracket = 0x8a8 +XK_toprightsqbracket = 0x8a9 +XK_botrightsqbracket = 0x8aa +XK_topleftparens = 0x8ab +XK_botleftparens = 0x8ac +XK_toprightparens = 0x8ad +XK_botrightparens = 0x8ae +XK_leftmiddlecurlybrace = 0x8af +XK_rightmiddlecurlybrace = 0x8b0 +XK_topleftsummation = 0x8b1 +XK_botleftsummation = 0x8b2 +XK_topvertsummationconnector = 0x8b3 +XK_botvertsummationconnector = 0x8b4 +XK_toprightsummation = 0x8b5 +XK_botrightsummation = 0x8b6 +XK_rightmiddlesummation = 0x8b7 +XK_lessthanequal = 0x8bc +XK_notequal = 0x8bd +XK_greaterthanequal = 0x8be +XK_integral = 0x8bf +XK_therefore = 0x8c0 +XK_variation = 0x8c1 +XK_infinity = 0x8c2 +XK_nabla = 0x8c5 +XK_approximate = 0x8c8 +XK_similarequal = 0x8c9 +XK_ifonlyif = 0x8cd +XK_implies = 0x8ce +XK_identical = 0x8cf +XK_radical = 0x8d6 +XK_includedin = 0x8da +XK_includes = 0x8db +XK_intersection = 0x8dc +XK_union = 0x8dd +XK_logicaland = 0x8de +XK_logicalor = 0x8df +XK_partialderivative = 0x8ef +XK_function = 0x8f6 +XK_leftarrow = 0x8fb +XK_uparrow = 0x8fc +XK_rightarrow = 0x8fd +XK_downarrow = 0x8fe diff --git a/venv/lib/python3.12/site-packages/Xlib/keysymdef/thai.py b/venv/lib/python3.12/site-packages/Xlib/keysymdef/thai.py new file mode 100644 index 0000000..9837ae5 --- /dev/null +++ b/venv/lib/python3.12/site-packages/Xlib/keysymdef/thai.py @@ -0,0 +1,84 @@ +XK_Thai_kokai = 0xda1 +XK_Thai_khokhai = 0xda2 +XK_Thai_khokhuat = 0xda3 +XK_Thai_khokhwai = 0xda4 +XK_Thai_khokhon = 0xda5 +XK_Thai_khorakhang = 0xda6 +XK_Thai_ngongu = 0xda7 +XK_Thai_chochan = 0xda8 +XK_Thai_choching = 0xda9 +XK_Thai_chochang = 0xdaa +XK_Thai_soso = 0xdab +XK_Thai_chochoe = 0xdac +XK_Thai_yoying = 0xdad +XK_Thai_dochada = 0xdae +XK_Thai_topatak = 0xdaf +XK_Thai_thothan = 0xdb0 +XK_Thai_thonangmontho = 0xdb1 +XK_Thai_thophuthao = 0xdb2 +XK_Thai_nonen = 0xdb3 +XK_Thai_dodek = 0xdb4 +XK_Thai_totao = 0xdb5 +XK_Thai_thothung = 0xdb6 +XK_Thai_thothahan = 0xdb7 +XK_Thai_thothong = 0xdb8 +XK_Thai_nonu = 0xdb9 +XK_Thai_bobaimai = 0xdba +XK_Thai_popla = 0xdbb +XK_Thai_phophung = 0xdbc +XK_Thai_fofa = 0xdbd +XK_Thai_phophan = 0xdbe +XK_Thai_fofan = 0xdbf +XK_Thai_phosamphao = 0xdc0 +XK_Thai_moma = 0xdc1 +XK_Thai_yoyak = 0xdc2 +XK_Thai_rorua = 0xdc3 +XK_Thai_ru = 0xdc4 +XK_Thai_loling = 0xdc5 +XK_Thai_lu = 0xdc6 +XK_Thai_wowaen = 0xdc7 +XK_Thai_sosala = 0xdc8 +XK_Thai_sorusi = 0xdc9 +XK_Thai_sosua = 0xdca +XK_Thai_hohip = 0xdcb +XK_Thai_lochula = 0xdcc +XK_Thai_oang = 0xdcd +XK_Thai_honokhuk = 0xdce +XK_Thai_paiyannoi = 0xdcf +XK_Thai_saraa = 0xdd0 +XK_Thai_maihanakat = 0xdd1 +XK_Thai_saraaa = 0xdd2 +XK_Thai_saraam = 0xdd3 +XK_Thai_sarai = 0xdd4 +XK_Thai_saraii = 0xdd5 +XK_Thai_saraue = 0xdd6 +XK_Thai_sarauee = 0xdd7 +XK_Thai_sarau = 0xdd8 +XK_Thai_sarauu = 0xdd9 +XK_Thai_phinthu = 0xdda +XK_Thai_maihanakat_maitho = 0xdde +XK_Thai_baht = 0xddf +XK_Thai_sarae = 0xde0 +XK_Thai_saraae = 0xde1 +XK_Thai_sarao = 0xde2 +XK_Thai_saraaimaimuan = 0xde3 +XK_Thai_saraaimaimalai = 0xde4 +XK_Thai_lakkhangyao = 0xde5 +XK_Thai_maiyamok = 0xde6 +XK_Thai_maitaikhu = 0xde7 +XK_Thai_maiek = 0xde8 +XK_Thai_maitho = 0xde9 +XK_Thai_maitri = 0xdea +XK_Thai_maichattawa = 0xdeb +XK_Thai_thanthakhat = 0xdec +XK_Thai_nikhahit = 0xded +XK_Thai_leksun = 0xdf0 +XK_Thai_leknung = 0xdf1 +XK_Thai_leksong = 0xdf2 +XK_Thai_leksam = 0xdf3 +XK_Thai_leksi = 0xdf4 +XK_Thai_lekha = 0xdf5 +XK_Thai_lekhok = 0xdf6 +XK_Thai_lekchet = 0xdf7 +XK_Thai_lekpaet = 0xdf8 +XK_Thai_lekkao = 0xdf9 diff --git a/venv/lib/python3.12/site-packages/Xlib/keysymdef/xf86.py b/venv/lib/python3.12/site-packages/Xlib/keysymdef/xf86.py new file mode 100644 index 0000000..8b98852 --- /dev/null +++ b/venv/lib/python3.12/site-packages/Xlib/keysymdef/xf86.py @@ -0,0 +1,202 @@ +XK_XF86_ModeLock = 0x1008FF01 + +XK_XF86_MonBrightnessUp = 0x1008FF02 +XK_XF86_MonBrightnessDown = 0x1008FF03 +XK_XF86_KbdLightOnOff = 0x1008FF04 +XK_XF86_KbdBrightnessUp = 0x1008FF05 +XK_XF86_KbdBrightnessDown = 0x1008FF06 +XK_XF86_MonBrightnessCycle = 0x1008FF07 + +XK_XF86_Standby = 0x1008FF10 +XK_XF86_AudioLowerVolume = 0x1008FF11 +XK_XF86_AudioMute = 0x1008FF12 +XK_XF86_AudioRaiseVolume = 0x1008FF13 +XK_XF86_AudioPlay = 0x1008FF14 +XK_XF86_AudioStop = 0x1008FF15 +XK_XF86_AudioPrev = 0x1008FF16 +XK_XF86_AudioNext = 0x1008FF17 +XK_XF86_HomePage = 0x1008FF18 +XK_XF86_Mail = 0x1008FF19 +XK_XF86_Start = 0x1008FF1A +XK_XF86_Search = 0x1008FF1B +XK_XF86_AudioRecord = 0x1008FF1C + +XK_XF86_Calculator = 0x1008FF1D +XK_XF86_Memo = 0x1008FF1E +XK_XF86_ToDoList = 0x1008FF1F +XK_XF86_Calendar = 0x1008FF20 +XK_XF86_PowerDown = 0x1008FF21 +XK_XF86_ContrastAdjust = 0x1008FF22 +XK_XF86_RockerUp = 0x1008FF23 +XK_XF86_RockerDown = 0x1008FF24 +XK_XF86_RockerEnter = 0x1008FF25 + +XK_XF86_Back = 0x1008FF26 +XK_XF86_Forward = 0x1008FF27 +XK_XF86_Stop = 0x1008FF28 +XK_XF86_Refresh = 0x1008FF29 +XK_XF86_PowerOff = 0x1008FF2A +XK_XF86_WakeUp = 0x1008FF2B +XK_XF86_Eject = 0x1008FF2C +XK_XF86_ScreenSaver = 0x1008FF2D +XK_XF86_WWW = 0x1008FF2E +XK_XF86_Sleep = 0x1008FF2F +XK_XF86_Favorites = 0x1008FF30 +XK_XF86_AudioPause = 0x1008FF31 +XK_XF86_AudioMedia = 0x1008FF32 +XK_XF86_MyComputer = 0x1008FF33 +XK_XF86_VendorHome = 0x1008FF34 +XK_XF86_LightBulb = 0x1008FF35 +XK_XF86_Shop = 0x1008FF36 +XK_XF86_History = 0x1008FF37 +XK_XF86_OpenURL = 0x1008FF38 +XK_XF86_AddFavorite = 0x1008FF39 +XK_XF86_HotLinks = 0x1008FF3A +XK_XF86_BrightnessAdjust = 0x1008FF3B +XK_XF86_Finance = 0x1008FF3C +XK_XF86_Community = 0x1008FF3D +XK_XF86_AudioRewind = 0x1008FF3E +XK_XF86_XF86BackForward = 0x1008FF3F +XK_XF86_Launch0 = 0x1008FF40 +XK_XF86_Launch1 = 0x1008FF41 +XK_XF86_Launch2 = 0x1008FF42 +XK_XF86_Launch3 = 0x1008FF43 +XK_XF86_Launch4 = 0x1008FF44 +XK_XF86_Launch5 = 0x1008FF45 +XK_XF86_Launch6 = 0x1008FF46 +XK_XF86_Launch7 = 0x1008FF47 +XK_XF86_Launch8 = 0x1008FF48 +XK_XF86_Launch9 = 0x1008FF49 +XK_XF86_LaunchA = 0x1008FF4A +XK_XF86_LaunchB = 0x1008FF4B +XK_XF86_LaunchC = 0x1008FF4C +XK_XF86_LaunchD = 0x1008FF4D +XK_XF86_LaunchE = 0x1008FF4E +XK_XF86_LaunchF = 0x1008FF4F + +XK_XF86_ApplicationLeft = 0x1008FF50 +XK_XF86_ApplicationRight = 0x1008FF51 +XK_XF86_Book = 0x1008FF52 +XK_XF86_CD = 0x1008FF53 +XK_XF86_Calculater = 0x1008FF54 +XK_XF86_Clear = 0x1008FF55 +XK_XF86_Close = 0x1008FF56 +XK_XF86_Copy = 0x1008FF57 +XK_XF86_Cut = 0x1008FF58 +XK_XF86_Display = 0x1008FF59 +XK_XF86_DOS = 0x1008FF5A +XK_XF86_Documents = 0x1008FF5B +XK_XF86_Excel = 0x1008FF5C +XK_XF86_Explorer = 0x1008FF5D +XK_XF86_Game = 0x1008FF5E +XK_XF86_Go = 0x1008FF5F +XK_XF86_iTouch = 0x1008FF60 +XK_XF86_LogOff = 0x1008FF61 +XK_XF86_Market = 0x1008FF62 +XK_XF86_Meeting = 0x1008FF63 +XK_XF86_MenuKB = 0x1008FF65 +XK_XF86_MenuPB = 0x1008FF66 +XK_XF86_MySites = 0x1008FF67 +XK_XF86_New = 0x1008FF68 +XK_XF86_News = 0x1008FF69 +XK_XF86_OfficeHome = 0x1008FF6A +XK_XF86_Open = 0x1008FF6B +XK_XF86_Option = 0x1008FF6C +XK_XF86_Paste = 0x1008FF6D +XK_XF86_Phone = 0x1008FF6E +XK_XF86_Q = 0x1008FF70 +XK_XF86_Reply = 0x1008FF72 +XK_XF86_Reload = 0x1008FF73 +XK_XF86_RotateWindows = 0x1008FF74 +XK_XF86_RotationPB = 0x1008FF75 +XK_XF86_RotationKB = 0x1008FF76 +XK_XF86_Save = 0x1008FF77 +XK_XF86_ScrollUp = 0x1008FF78 +XK_XF86_ScrollDown = 0x1008FF79 +XK_XF86_ScrollClick = 0x1008FF7A +XK_XF86_Send = 0x1008FF7B +XK_XF86_Spell = 0x1008FF7C +XK_XF86_SplitScreen = 0x1008FF7D +XK_XF86_Support = 0x1008FF7E +XK_XF86_TaskPane = 0x1008FF7F +XK_XF86_Terminal = 0x1008FF80 +XK_XF86_Tools = 0x1008FF81 +XK_XF86_Travel = 0x1008FF82 +XK_XF86_UserPB = 0x1008FF84 +XK_XF86_User1KB = 0x1008FF85 +XK_XF86_User2KB = 0x1008FF86 +XK_XF86_Video = 0x1008FF87 +XK_XF86_WheelButton = 0x1008FF88 +XK_XF86_Word = 0x1008FF89 +XK_XF86_Xfer = 0x1008FF8A +XK_XF86_ZoomIn = 0x1008FF8B +XK_XF86_ZoomOut = 0x1008FF8C + +XK_XF86_Away = 0x1008FF8D +XK_XF86_Messenger = 0x1008FF8E +XK_XF86_WebCam = 0x1008FF8F +XK_XF86_MailForward = 0x1008FF90 +XK_XF86_Pictures = 0x1008FF91 +XK_XF86_Music = 0x1008FF92 + +XK_XF86_Battery = 0x1008FF93 +XK_XF86_Bluetooth = 0x1008FF94 +XK_XF86_WLAN = 0x1008FF95 +XK_XF86_UWB = 0x1008FF96 + +XK_XF86_AudioForward = 0x1008FF97 +XK_XF86_AudioRepeat = 0x1008FF98 +XK_XF86_AudioRandomPlay = 0x1008FF99 +XK_XF86_Subtitle = 0x1008FF9A +XK_XF86_AudioCycleTrack = 0x1008FF9B +XK_XF86_CycleAngle = 0x1008FF9C +XK_XF86_FrameBack = 0x1008FF9D +XK_XF86_FrameForward = 0x1008FF9E +XK_XF86_Time = 0x1008FF9F +XK_XF86_Select = 0x1008FFA0 +XK_XF86_View = 0x1008FFA1 +XK_XF86_TopMenu = 0x1008FFA2 + +XK_XF86_Red = 0x1008FFA3 +XK_XF86_Green = 0x1008FFA4 +XK_XF86_Yellow = 0x1008FFA5 +XK_XF86_Blue = 0x1008FFA6 + +XK_XF86_Suspend = 0x1008FFA7 +XK_XF86_Hibernate = 0x1008FFA8 +XK_XF86_TouchpadToggle = 0x1008FFA9 +XK_XF86_TouchpadOn = 0x1008FFB0 +XK_XF86_TouchpadOff = 0x1008FFB1 + +XK_XF86_AudioMicMute = 0x1008FFB2 + +XK_XF86_Keyboard = 0x1008FFB3 + +XK_XF86_WWAN = 0x1008FFB4 +XK_XF86_RFKill = 0x1008FFB5 + +XK_XF86_AudioPreset = 0x1008FFB6 + +XK_XF86_RotationLockToggle = 0x1008FFB7 + +XK_XF86_FullScreen = 0x1008FFB8 + +XK_XF86_Switch_VT_1 = 0x1008FE01 +XK_XF86_Switch_VT_2 = 0x1008FE02 +XK_XF86_Switch_VT_3 = 0x1008FE03 +XK_XF86_Switch_VT_4 = 0x1008FE04 +XK_XF86_Switch_VT_5 = 0x1008FE05 +XK_XF86_Switch_VT_6 = 0x1008FE06 +XK_XF86_Switch_VT_7 = 0x1008FE07 +XK_XF86_Switch_VT_8 = 0x1008FE08 +XK_XF86_Switch_VT_9 = 0x1008FE09 +XK_XF86_Switch_VT_10 = 0x1008FE0A +XK_XF86_Switch_VT_11 = 0x1008FE0B +XK_XF86_Switch_VT_12 = 0x1008FE0C + +XK_XF86_Ungrab = 0x1008FE20 +XK_XF86_ClearGrab = 0x1008FE21 +XK_XF86_Next_VMode = 0x1008FE22 +XK_XF86_Prev_VMode = 0x1008FE23 +XK_XF86_LogWindowTree = 0x1008FE24 +XK_XF86_LogGrabInfo = 0x1008FE25 diff --git a/venv/lib/python3.12/site-packages/Xlib/keysymdef/xk3270.py b/venv/lib/python3.12/site-packages/Xlib/keysymdef/xk3270.py new file mode 100644 index 0000000..b9395eb --- /dev/null +++ b/venv/lib/python3.12/site-packages/Xlib/keysymdef/xk3270.py @@ -0,0 +1,30 @@ +XK_3270_Duplicate = 0xFD01 +XK_3270_FieldMark = 0xFD02 +XK_3270_Right2 = 0xFD03 +XK_3270_Left2 = 0xFD04 +XK_3270_BackTab = 0xFD05 +XK_3270_EraseEOF = 0xFD06 +XK_3270_EraseInput = 0xFD07 +XK_3270_Reset = 0xFD08 +XK_3270_Quit = 0xFD09 +XK_3270_PA1 = 0xFD0A +XK_3270_PA2 = 0xFD0B +XK_3270_PA3 = 0xFD0C +XK_3270_Test = 0xFD0D +XK_3270_Attn = 0xFD0E +XK_3270_CursorBlink = 0xFD0F +XK_3270_AltCursor = 0xFD10 +XK_3270_KeyClick = 0xFD11 +XK_3270_Jump = 0xFD12 +XK_3270_Ident = 0xFD13 +XK_3270_Rule = 0xFD14 +XK_3270_Copy = 0xFD15 +XK_3270_Play = 0xFD16 +XK_3270_Setup = 0xFD17 +XK_3270_Record = 0xFD18 +XK_3270_ChangeScreen = 0xFD19 +XK_3270_DeleteWord = 0xFD1A +XK_3270_ExSelect = 0xFD1B +XK_3270_CursorSelect = 0xFD1C +XK_3270_PrintScreen = 0xFD1D +XK_3270_Enter = 0xFD1E diff --git a/venv/lib/python3.12/site-packages/Xlib/keysymdef/xkb.py b/venv/lib/python3.12/site-packages/Xlib/keysymdef/xkb.py new file mode 100644 index 0000000..3be1f3d --- /dev/null +++ b/venv/lib/python3.12/site-packages/Xlib/keysymdef/xkb.py @@ -0,0 +1,100 @@ +XK_ISO_Lock = 0xFE01 +XK_ISO_Level2_Latch = 0xFE02 +XK_ISO_Level3_Shift = 0xFE03 +XK_ISO_Level3_Latch = 0xFE04 +XK_ISO_Level3_Lock = 0xFE05 +XK_ISO_Group_Shift = 0xFF7E +XK_ISO_Group_Latch = 0xFE06 +XK_ISO_Group_Lock = 0xFE07 +XK_ISO_Next_Group = 0xFE08 +XK_ISO_Next_Group_Lock = 0xFE09 +XK_ISO_Prev_Group = 0xFE0A +XK_ISO_Prev_Group_Lock = 0xFE0B +XK_ISO_First_Group = 0xFE0C +XK_ISO_First_Group_Lock = 0xFE0D +XK_ISO_Last_Group = 0xFE0E +XK_ISO_Last_Group_Lock = 0xFE0F +XK_ISO_Left_Tab = 0xFE20 +XK_ISO_Move_Line_Up = 0xFE21 +XK_ISO_Move_Line_Down = 0xFE22 +XK_ISO_Partial_Line_Up = 0xFE23 +XK_ISO_Partial_Line_Down = 0xFE24 +XK_ISO_Partial_Space_Left = 0xFE25 +XK_ISO_Partial_Space_Right = 0xFE26 +XK_ISO_Set_Margin_Left = 0xFE27 +XK_ISO_Set_Margin_Right = 0xFE28 +XK_ISO_Release_Margin_Left = 0xFE29 +XK_ISO_Release_Margin_Right = 0xFE2A +XK_ISO_Release_Both_Margins = 0xFE2B +XK_ISO_Fast_Cursor_Left = 0xFE2C +XK_ISO_Fast_Cursor_Right = 0xFE2D +XK_ISO_Fast_Cursor_Up = 0xFE2E +XK_ISO_Fast_Cursor_Down = 0xFE2F +XK_ISO_Continuous_Underline = 0xFE30 +XK_ISO_Discontinuous_Underline = 0xFE31 +XK_ISO_Emphasize = 0xFE32 +XK_ISO_Center_Object = 0xFE33 +XK_ISO_Enter = 0xFE34 +XK_dead_grave = 0xFE50 +XK_dead_acute = 0xFE51 +XK_dead_circumflex = 0xFE52 +XK_dead_tilde = 0xFE53 +XK_dead_macron = 0xFE54 +XK_dead_breve = 0xFE55 +XK_dead_abovedot = 0xFE56 +XK_dead_diaeresis = 0xFE57 +XK_dead_abovering = 0xFE58 +XK_dead_doubleacute = 0xFE59 +XK_dead_caron = 0xFE5A +XK_dead_cedilla = 0xFE5B +XK_dead_ogonek = 0xFE5C +XK_dead_iota = 0xFE5D +XK_dead_voiced_sound = 0xFE5E +XK_dead_semivoiced_sound = 0xFE5F +XK_dead_belowdot = 0xFE60 +XK_First_Virtual_Screen = 0xFED0 +XK_Prev_Virtual_Screen = 0xFED1 +XK_Next_Virtual_Screen = 0xFED2 +XK_Last_Virtual_Screen = 0xFED4 +XK_Terminate_Server = 0xFED5 +XK_AccessX_Enable = 0xFE70 +XK_AccessX_Feedback_Enable = 0xFE71 +XK_RepeatKeys_Enable = 0xFE72 +XK_SlowKeys_Enable = 0xFE73 +XK_BounceKeys_Enable = 0xFE74 +XK_StickyKeys_Enable = 0xFE75 +XK_MouseKeys_Enable = 0xFE76 +XK_MouseKeys_Accel_Enable = 0xFE77 +XK_Overlay1_Enable = 0xFE78 +XK_Overlay2_Enable = 0xFE79 +XK_AudibleBell_Enable = 0xFE7A +XK_Pointer_Left = 0xFEE0 +XK_Pointer_Right = 0xFEE1 +XK_Pointer_Up = 0xFEE2 +XK_Pointer_Down = 0xFEE3 +XK_Pointer_UpLeft = 0xFEE4 +XK_Pointer_UpRight = 0xFEE5 +XK_Pointer_DownLeft = 0xFEE6 +XK_Pointer_DownRight = 0xFEE7 +XK_Pointer_Button_Dflt = 0xFEE8 +XK_Pointer_Button1 = 0xFEE9 +XK_Pointer_Button2 = 0xFEEA +XK_Pointer_Button3 = 0xFEEB +XK_Pointer_Button4 = 0xFEEC +XK_Pointer_Button5 = 0xFEED +XK_Pointer_DblClick_Dflt = 0xFEEE +XK_Pointer_DblClick1 = 0xFEEF +XK_Pointer_DblClick2 = 0xFEF0 +XK_Pointer_DblClick3 = 0xFEF1 +XK_Pointer_DblClick4 = 0xFEF2 +XK_Pointer_DblClick5 = 0xFEF3 +XK_Pointer_Drag_Dflt = 0xFEF4 +XK_Pointer_Drag1 = 0xFEF5 +XK_Pointer_Drag2 = 0xFEF6 +XK_Pointer_Drag3 = 0xFEF7 +XK_Pointer_Drag4 = 0xFEF8 +XK_Pointer_Drag5 = 0xFEFD +XK_Pointer_EnableKeys = 0xFEF9 +XK_Pointer_Accelerate = 0xFEFA +XK_Pointer_DfltBtnNext = 0xFEFB +XK_Pointer_DfltBtnPrev = 0xFEFC diff --git a/venv/lib/python3.12/site-packages/Xlib/protocol/__init__.py b/venv/lib/python3.12/site-packages/Xlib/protocol/__init__.py new file mode 100644 index 0000000..5fa7fcb --- /dev/null +++ b/venv/lib/python3.12/site-packages/Xlib/protocol/__init__.py @@ -0,0 +1,28 @@ +# Xlib.protocol.__init__ -- glue for Xlib.protocol package +# +# Copyright (C) 2000 Peter Liljenberg +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public License +# as published by the Free Software Foundation; either version 2.1 +# of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the +# Free Software Foundation, Inc., +# 59 Temple Place, +# Suite 330, +# Boston, MA 02111-1307 USA + +__all__ = [ + 'display', + 'event', + 'request', + 'rq', + 'structs', + ] diff --git a/venv/lib/python3.12/site-packages/Xlib/protocol/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/Xlib/protocol/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a3e42a30e02577163a88e65ef8b18442bc675871 GIT binary patch literal 257 zcmXv}F-`+95VS8!90+;HNhB+vMYMF(h{iJK)nUc49ouK*l2_2v@d-XaN#~XiAktCc zLt&(mW_P3+&HHkBOe)?UultV)A)n*%kLDouCsjO?o=EaS??|R?(@qPMDmX22nPNf{ z3-h=eFvQaMU11^mp^M?BrG;@WwC4Pk?8m^L4uVgxMX3Zxr-uM8#|LXx5)&BfWpXBZ zk)g&W(CYr+U#!p0A*hHeC%TR3F~IGg>ut21)xfzjDssMdxy&!ORt_4k{GxW!$}q0@ Rnovr=PiKqS6Z1#)@e8@IO`ZS% literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/Xlib/protocol/__pycache__/display.cpython-312.pyc b/venv/lib/python3.12/site-packages/Xlib/protocol/__pycache__/display.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..741ad71f57f9e85285d5555132c2957991a342c4 GIT binary patch literal 33536 zcmd6QdvIIVdFQ=&kRSmPAOOC=7x*UlrbNALNwy@4k}R9HMa8idCoIGZNuWrOx&S4U z1s!dgw6v?O$s}D-Np?i1?wDG8Yo?psD3i8vvwzgno$cTf^a4SZU8Qxm>zVG3EUCNQ zWM_7N-?=XUx|HlbX7-9YIQN|Iyub6E@B7Yo&ixN1CB+<`Ke}|}Z2Q+a?l0*@eJT{s zJ+6S`u5tn=@RQsr`IkS%vv<=e6Z+&mX56dfk+ z2qzSOl@shC&pT$hj;Fj4i_j}LzRI8SviK6jmuAJ6o48QfM7P>B{g;LJ>hG#gaK6LK z{w*O~kAx`8f#_HB)_(=J3h|Cb4n0-<(3%eFX;q)#QS;ccrrt+Fl;=R~RP)wOgcwL4Y&&>nmA*cz2msFuR=eoXHN)hE;l=66i;8-p>* zMXM`=*sG@1e}$S*t(wa_Ryq7s!$aHiq@G&!3AH)3J*bB3zd~IOgwg2LKN6zhkr4hI z2qP?Nd?ZBEBO#g}3DNRMh}K6!wB1-%q%2+0+$IoX9$EPEa(0J@)qN@}qUbsP^7ekTQ zIOVNA%Bih31fidfkf!=Xzf;|djJSrx*i z_2J(CWckF+mrG*`P3O2cul8%)G>S`L zj+^6dm`3KkvytfR%*?bH3km+%+)U^(|F13tiZbTOPy~Y)4M(D}U}QX$v9f;56iAt9Vv2Q9QgoAy;%;apeZ)PrbZaUHfG|&vgMl&d6;CBxPo=AB zS6)~hUK@P#c%rI*ap<2PyNANKaSiS8LTJX&lDLtpToy`l6DsN>Mt#(Q9_4QEBLS1> zK?Lj98@yNpf0Xj}iw$ryg=1qFR5ZOTyXh>57M~~$=Vk7er(!8aP5H+DgriYxMBsRK z!G!y)f-~^sRFIEpa2kGB#WZ}2a}(ec^Pf0hjUc@l4}%)z#AW~oETR`b8EbShJRTCu z;b%=o^Qp-h^ZC$Rl&a!a8g3sOI~$4tL8j37^6bWI!A}4@+5-n2fN^gA&g`bM^;Tu= z%E{|5U3+OYdhJWe%I<`#JMF2wx@URM%ILDzJ2y-s6*dA|1MG?fr$S?6nc}grscB($ zlKhUbu?w@oNjXOJ16FJ$CjjRL$9k9z5SvfT=|fDEruSF5dzPZ2fx8uaQPaHwb5WBF zO(QiNpsT=tR3fYjdvCI^lo;`C0YeW?yM8XcyM-HKOz%161zmA-G zI8o{a5RbeLq~$953>FmGdu1VBxOV#d?YWMs>%gxx2I+L}BlkVY! zV>oShF79R6|BXE>FG!x|#i3iy@+Dzqcy%c03?ys;c`_hZ?NJf_UI*rxz8HnMQ|6Gx zh_Fv+eWc~Vy`y+f6^3jR)EjxvL(>!s^=#p@vxU#W7QPa}isi3VD1hq}3gNm08{9IX z2(FvNqf;Ki4%Z8zh&xq|JW8;5RtTkds}!7Ys}SZwShY}wH=p2!TO)Yj)(T#@bwYzs zj`(_^0&fjMC0xHy1-DVChTA0g;5G|2a9f00xUE7R+%_!A{!HPJOp-@(NDE;fBQ5tq zG_tYSi1O*n?8|^&FfEuDEDP3!0xWjim^v<8yZ~?7Owp<7gtipxolVOmmP@NDY-KN& zSt%WQ3e^XqWw3~A`6(puWz=e+aKRSS7V`<3$a#;74JcikjRGy)S_z*zy*6_{bqcL* zXQ@ODS3h<7QnfJxkMvqQS#DZeKXq;zgCo$GYBPhq5j9{Bd!zM$J)b&nS~b|i(yPi0 z?o+2H-i1BJV?RN>MBWqAMsQ+VUKC!lVhzLzm0m9t#dfJ_Cw8ko{Z}w&#T$qNS+NEJ zXS_%kTUFYgRWdD-?1>ktu^1P>63DSpCVqiEtY4e7Hwz$}bKY9CHyT}95!v&pN1#nj z5hh%1SKnB<9oiek(L&3f*ymK=#0#oV{}rrR@h|G(s!u4;MJcsc1QRV#D5FP(0zRBl z{razH7HkW}5tC4~P#pWB8Xo83#X>P^To|{#Ykx;!j~484`^1-282wk^&tvSx&R9?l zn>eld^k0-uELz@!9EH3fysE9h`fW!WwyO}auBTtg=31;kZ~v;C4~?= z6P%rljYY@B5Q#_x8ifQ4sir{rwNV(ABoYPBlmsUs;s#MkCh3;RP-9FAmV+GGL78$U z^nzy$&4$LrP*9M8DzbwwiC|~taC=sG#w~`BE*eu(vjR)iuxLmO2PZQn>N_hTQyL9L z1e7y=QOS?J2ghUKi=m92g)1*5a!Hqh;aE6wHsjP^<&;h}V-=z-J3xk^{-V}S&p8TreU`0`&@_F>!VrNH80r(lZw37M~8E9YfjSU?fv1YfcAhTVO>5NUrU-*jHoM7;>mr3gO>^`>2vx^s_#2|p( z)*hMf_9JxOrPN##r$-SQ{R)^KFyVubrv{HmgGW9nOb$LL*#;IZi|1A>E8(@O+qM2h z%ciY5UEfB(H6K;fr7Ak4ijFn!+ABA`H|LTS#}+MD>>o9>r5gIAhQ4*n5A5Hw-#nS_ z-+i;?{i1tj-hZ5zY_*F;OMC9SxTdyL<94ZWd$Mr{BQ`=wk>Cnj~ja!X~R4a&%Le%5t9(^ThfryGId5&pYxD)@t-ArO10G6lo|s zSWTn$w>je+KNlK5KL%BzyiSUT01wq-7$kiKRWDRi_Z zTA=32^T@o6%GX3bHJ7{r)kHcyUf|y~sm$F!YP3ua=v7a(F9$L=H4`}?%c z2wflEBm5}Tks~KXf?`~2z$Si${72zr3WMVpX2W7gJVrrJku$==#n2>{bD4P&#=t=^ z{!39{ibN-J6qv=4&?~Vq#%|5KRW#Sbenjy94NfkqgPazXq-;%+ttn;elx&@wwr&tk z3Tu{Z%_&=#Wb4|r_1r1uJfO8r8}24}OUhD?2FcNoaxEpej&4J+W;y31a_;8J%2O`CuE@sJq{^MHT48LRE_ps$tZ0qi%x*N4x9515s?)9G)3cFS4nCI75K9{YXG`02 z(Rr0=?adAUAIK#dfs==qG7i>Awi+1|H*KwK_XLKj@a^BzIlFXgeX7%+`w3dSeH zzzrY~)jv}@J~OwS!^pNn$&z!P>#EWMTpdxsoBEsdMcp0`S6%k#Dp08HN;DIPBRg{)s zRJ5*zI8NV#9c@88tJzKAax{F)#@xC6z&`=Q{vVuJ8Ixl;%|nuh1tFD&v8UY3n-jS4IVB2#s10=Sfk? z#!(w*KpM3|(=f9FnS=c&OiRG)L7Hzu(;;g?S={R=*ZlWNcZqw&{1SJG4_N2F6&C#a z{6ep$|H)DxbOefvRVn&_q95`H{gKcm|BHSV&W{Wtvs0%-qW{=Xub$vUFdPj<{U;Qa z#jzo#Bk+gM_+#fnV#puF|H!oe3^Y{Pc}07*B6T&}yk~kg=AS;312_^W7RS*m@(K|m zpFqwuoLp7OR4{s8)?7IAs*?+M8tjgky{z!zocZQ8>ZJKvb;=pV!eWq%eux@f<`h<^ zPO{adY^{>5l~xc_Nl|y&IN=?>W9KNLoZp7K<4!5p z(y=&{a@0wVx|N{h@TXf^7l$?-jmnmB%F`oxde(W#GjN+YpGL{im~sRpN8m$8*WXdf zoRD8ciGY3QK=&ax_miStxc}Z=d#Kl(vtdS)l980fe+WsTX=yOMjV9wf%2_aBGBT@} zEz%iGO{Tc6W#kK0&VMHC`61a-#~jbn8E{5%6XWzBOw2th$7U|35vvwXH1pg`+?6(U z>TWslA6ic}b-*;gB=pkU%T^b5h+!dX$`9vFP5%i@aKHaR3`Pnwv8X?$%-&%3wDey( z7al*S&Eaq~(jN1xGehv7p7YN}+1wAGg^(N)^yxkVwojkWG>gTn)z5F(dLF_B`{fpG z(H`Qh6`h;-HvFmr;s*RVtFwpjFR!_JZ4Dw1Q*DXALT#O%l(S26cC8(eoDf3>i=(P2E7AlQ9oMgLZM;y6D>bzu*3El~aX zuPn+6rg_9=8xH{5K!`Omoug$I29RheJ$#nQk8vI<iYoG0n&wEw0$_@<@PQ8v)z$v>kWv|_^*QVVSDR;BvZcaFwZxf<5 zNVbNQtzELUZ`uO4ef23{kL2rFEWF}O)86JbsbSmt^HRgko2^p)6SO&4!;;aYP1zbH zTjT1kMEAZ#)Ba7{6Sti1rNNY^Rr0hZotWEs1$?NQS!%*Q>ZYv^K8Byn91g+q!`_t9 zgu;QaLQBiuC^dW7TQ+`uN{rD*6BwY$4Qj3&H}Oymh-qqu3C&DRPpg|TqTY5je2a2u zQObMtx~T-Ggdveg21K$l_gBalBeCI!f-$`DX7t+re` zH$9a@u$GZr*Z<~e`3Se70JzNEu4CKBzO?#V!?w|@($&~;r+sMl16I7KLu|+NMf~aYUkNicP7hB?mmz$7JeO}Y?8f#R;jBBYb%GApXg@g@a zDIiIJ%X`l93-*ZVEC;Jf3uZJAOHA{E1K7kbIAX0T@I;I1(|@GR`m&16^b#FgKD_``xQQhxhp@&;~}kymn(f$n*~pcW!@9lb~6?{k-f;%Xa*GJ zCBmyt({tz17CAh0)`Dj8q6-$ohV$n9%UIm`$abtwC4d-uur7#g!Mb9Od*Exp3dcuk zx2VTMTe4)j@{_+$I?Pm1@N8-Ve3V0!QD^%#+6tz(Kx|~`^!3wl^?mq?gBlyGno7=E znSe4_b03+r5jH$xETM?jD9=Qj-d5EI<@6U8T(N-q9(Tn$Rlhp7Fw!og%L^9DBG$M| zF_tNdm&Ll(loP$GPyb~qdj2c4&KR}hp}6o8E`L~Xz3N&rU-^%+?-H-7!_h*G9&XXX z)&&8X%^n)dvl;U!CP+BXoU{YvyKHvEc78l*=N`V=c~ z|1+N(JxQA2r^)w< z@GGzwpPVCgG1SpaqYMS~Oi+YTG7JEse%2>SXLKVy6Hxsq8h-S^)NC}SRUCyu9ZD@5 zpT_y$=}D%|mdm6d0oLf#*`=SH_6OyC6iP(xrcDyHl&C)}>%*D#d$(K_fArk+?4*!g zCak$b*pc}>wO1)DJjD(t$3kct)Zf8KPS=N{T5=dTU@+z|6fly>?bfVbLOr#S3`P{p zK#kF0^g;;c_kxNqa`h;NRZAb$oIH?BRt8YJgMOTijRnzIwR<~4VTLMH7OCL0>SCCJ zTH1g<9(t+D0L0F*(PpF7t~XcKT_`)%xec7aNFr-sW-v16SImR_WMPio>FFsplt_Lt zBvP>$dcDlNmIC*Hk?3;&*;ybG3`yv~I#q}^H}cWJe=ZnBcZDKaBhSoE!Y~x*EaN&Q zIx`!=DTit5AwuA2w?8_~a$|TevOLg}ID#;vWdl>F@FYzzROSqhl1I;FPmrwREAz#2 zyB_nmMq%R5+8AgSp9RGgNwq7UAm@2Jed@{N)+Le8&~bDSJf35mY~2U?=j;Yd)N zlV$rqr0~<^c*r?K5GZF7n>cJkUOpsU`0OZ?<=L$Zu=ckeJ~ndl1RctUf@zr&GJO=; z$S@rNjur%85$S}I_&PasP7cRtf+DPURP3wQX0a&#k(ww|#MD#l@JW%3 z%5+}D&St%G-lC8yK%r)!XU0MaGB$Rq1-O*z3sQlsuE=_40@YXyG?=a+NkVGcXbmq>=6{`O>euhbD3j>`AIQ~ zyJktdD(?8Wk_y?*U=wzej&jXU={$Gb9PNBHY&aWW$gp^fEdGZ+bkyFam)jM-MLP^3 z77L+Rak@UiCTr!2kgD(9sPBdCCs}B=ORn~mt50(EZMp{1?1aK*DIv8 zUwZRP>*GH-|Go24>w%@AZ;oUtYjCeYs;X0}>P%G)NL2&t%^z0nyi>?E4I<0(>Xf%l z^0s~VLc$wh))+YjpvvB=tNXvcKi%Fz{m_DQ7RyI&>n}@340{9i|FzfVe(EY`{jyS% zsP0bJH>K*gN%h;lKYG*qW?nj?-aC@RDV*+d27=CmbdM1+E*5qkKS%* zTsn%x-l}Um*L?kp*S@$m^xp9s$Jh4V?0EkmPOQ{Dw_LnrS~|F5`lN$% zx$l@PxbLB=_PYI=Jyq2qRpF@0d-XT!lU2Ky4xq_RZEx4VS-;M&n-Y!Nmn`2bO}BTY z+8>wNAHNxt+MigmY`R*|sEW$P;h#FoFb3YbJEns2e$+1IAC&xq>?FhfAMQ`?dP?#? zwPK~S9KgCgQp=v3JCgnbD^?naFTDAMRO=3@b;o)r*}8Y77>%iIyG=vUB~^8;9o?)# z!_XytQhi^ds_&!L&b7h!_TSi_Y<=wJDXH}c4Ib2Ssk(ltu7ABUS+{3-7+dQ!VC|B( zJ>~6_ynUPA0c~VxcReQtI8;<7K9V)=PtB;osf= zf|>LBuI^pldl#ots&9GfR>t4jwdv_f*VJF%b8XM^(CwP~l?&H)E)BuL=Q}&DKYs1; z4G(60wK9>KVdb21bxE$SO;^v)TvflkQ;mFndB2UTs=pdvj^E`>KqIwN*Bt9nspGLt z@8fCGuXjnlu7tPimv^iH`sMu=uD0p=-fO6e33#H7@zXcAOWpf7tDeXnXi8Jw|BEOs z9)Hqt!1TO@`=F=w#18IH`2(KOeonG@PHZzvl?PlWddwR=R=jNN@Qn7DlQ#cohdJ3{ zC4ax?WQTdv>_6FT-fXtQpJRALCO%+vxqIs-S(l2lsbmdEe7q*bAzpb@`F9kTzAc!T z?g8oYAJ`IV`dZ{;0P&8JH`|KQq%}PsQH*JF%ENO&tU>zoC=DU()Uv$cDOx0b0M`*0&DyaA-9?Wg7)+ zPJ0Tp_RyN1_ZYP&5=MJiFGMRoL(BHXD%H$m+J=RZ)>9xIhQTNcHlfI;olO=BC=+eu zErK;}5p46o6h&u4c*vee*`xb(iNEqhpg7oyK{}?`BKskeoSTNRl*Z#dN8FCgq^gX# z%&p2?9HfF{XZ$A)KmWPIkf9W&lg=2B%r=MorknRi8wIFhTd z&RY6QU|!XdA@LE{ehC(z{xiWzxLFxzRXVpyJpu0IJ)bk!Dd zzF@Xyb>>!O@N^@dkN+>8VR`@Z%jo5g{czYpmwD5^r#}X##C=S}AW)jAkeNh1bL?p% zb9v{907b@R60@qpDw2uLSW;FQ*O5>J-7E14-h5JiKi88U~f zLXm8vX93&NLKYP zS!q!Or`EjTY?d!wdUg5Lq^E7on+oic0{b>R`_eUyOV8Z)RIMEN`eSUV-YwPbzKNy! zz((Ei_g`2VPJ3(9<-V1Z%P+rmBGtNEYTdn2zMHKnJ(9O)Ewt$!1jt9ejPyYw>r*RNq0V@8CwmL7eBTs`<{&>-(>FXWpd7ra6N8bev38KQJM*5nDMon59wWVN2qXzxmG zu^2?%eR)~p)o8y;UE`TH-e5mM(Xnc+L(YDKoSPpE%gNcOHV;pOEAWhZk5*HOxq7X`Bk{5~tp4g<~*uoSgF7LNEcVqB8g|fM9fWI8ZJU8ItMdza`&y z$sxqe6uc;J%+pDS3^U3j!5QQo^o}hp8E2F{xUg?bJ~)7z$UugbL$tJkC=zdyahwRv zOwOH<6UiEfuTkVEIZPG76cA?!)=lb=+_Ny5a`hSvrb!x8j>rTGvZyOF1}nr}6zp0A zJ|rfQS(Ik9ESJk9_OJ1-oB1nrK8J$;j0kNDBeWmU6@1rwul26s=x+C-1$2o{F1ASS zmXw>U`q#Yg&b}AF5l_1JE*AbAM0rSo_pCJ~d_74=?;?Mzx@mRr?fq}=U*DFj#^L@e zr4YtoqgdJ|mA0*3NVV^l+IJ^Q_bi$rGdi40+lg4NHg0-a?n4Im;chtb`j@YLdDGd) z#MvA+|28cE?HitUU95-D)G2v8Q{HWocN^&OZ90*Vm&msgl;t$Z)0c4cp+2-QG;TN> zZ@Jv^`Gr+MzN+A6h%(`KJl^Q)@U)^02-YmjaLj8vWOWg)9HvmM435uBcC8( zzD`xb7-CZ~svV{Ij{75Qb~^r*vQG4=8C}+DG0w@FfiU~TPkoTzL%GMyG+B`gsX+qoo)iaJW$rkqb zwh^$rN99|IZX;gif@==HG6P;3JibU2m2Jx?wAepi-0eS&!&OjJ`sZB`8x95O#Kt*h z-q#p#W~#_?TBqPhuO!tOR(Tot1C$4vP0Hsf<(gF|F1g83$};Yn7KW|K`F}^OVoNA% zYl$RdzDA~V4F|=)MEHEYIy=>Z*b1X@)}=H(|2F_(IY_prT~cXRvb1N>3?9>2{>Id6 zQ!7KOEpPX}*}Go0K9FeIku2T0enBF_nzolNHDB#o?twV_n^lT!DSiP{63Hex@0xK4yo^TE{i zBhvOG$?BubqD;Bc1j-mXMXu|1aM<{>D}<1UIAj>I)8!beXC-G(!pQDk<5yor=a7vV z%vCY-=nUn<2``h)X~&+(b>6dJg0%|t3y7us^ByCsCX}Y_UmNXrtFsx`8teR+X4?=W zBw`P%)d0#hm`lpOvL!1Ajn|A3qoL28#zCXO-zVoDoCnzGze3;xY&1Kq zqN+=Jh+IztEntibQQxxcShU`@yS{l)R_brq+tX0}mj|Tsz-z;|%dt6uGbTB_b@}(L zKPdfPY0~|~V&N^jbE)t*_kCw*!|qSxI;zNWWc7KeqJ8lQNV3bjbmTV|-ZGP7!&kR* z_S@Y{wBJ-&zj9WpXj?o2#(YIs_x_;%d-d-ZzF(0TIJ)ULw#etzMp4#(q_OKelhwGU z>q_Z;FR5Dw5*6*6_70}YZ;>1=tHD&;E~#zT%|@y1@tdVIw73!aJM+CDKCO%TO zYhUGY6BrB2fugm?aNT&sUIUrS>x+%y6$RQNK^*v2r!As5K!VAFVaP{mfS`-^=()f#}oAj6Sgw zgCzYzpGtSaxs-!%LCNk<**heA$J$`3YroXBf5X0?ZI{t;ly$4*+p%~&jq@cZQ{^2} zdB=vcBVAFwa(MatvKjNa250!$xfNrWC4zyx?@g68OJ&Wg2c)vLR9UZ7*1KWvrJ7*J z+_PxDRpzDq+okgMWLXDkcb#Bpovua8M`aaD7rxU>`|0djK;OWBD%(c)4k%<41k&A} za`#E@zIB|g*|B&CSwb6o5?a@ank6&U_0V#7$$Z;Wu{d-a?HH#RpK={ynN-mQplaXB z^ViCk3b6N`MpdHUs0IiNXJL1mIrsKE9qdRmUC*>~X|-VGQo_-W{1%I4d0F8NFd`g% zyh)aqZ^4tTVa0U8h{%ueq*o_f)^vH2rg+XYGayLvmH&dK{{%9VjqjF_Tj_Fv+`K$F z7>b+5u@5)OS-7kzuW_Vb!F?Pf4E-|&kYGsCB9>sjUr~W6(i^OOW+Ue#)0Z@>sRyJs zt5}HslWlI;?7`&$ocIf5rk;ZQ7W}fZi#kx70VFET`&F4LcLwN^-?wNQOac^24`Y0~ z<-`XXU}_>&2G$y-%I>vuA3AqEfF`uBOm-Km7uWc;12?Rz7Zcvzbfxd>#dnH;A-E{h z(~xL*KIuM@aGZD$El2}NwZHe>hpbUD&0e7U8F(W)C~g>s%c29eN>K__FjN+MfCL5t zj*4b+6Qia4999#f(&UXop-{dg**Gu3wnf?^qUA8FH_o|uFJdFd5Nn{`G29+DYzaz- zC=P)f(?=1<-Kf+MT{ z4OB#*r5^-`Q9t1Hr$(C4BgTE`$Zr9*be{~A%pcPBb2YO*cFO^#G}B)^uB_3BmzFOj zaIUj*`+88S+_hu@SMROFJvr(YCGNyY*Z4^bU4C`f@~)NLlBZ>j-|z&|9o_Gh-Y8A% zdhRCwnzVDQFKbPoue(Au~Bg;otj&68ck*c;XRnsNabfs!`OEtS?bFB}oA9xdc zM$&useSn)exY|8X1l2yvFApspSh{c<!!qflY5KE|XR08`+iJZfs>HSC(~a zqH!mgT-~m$ff_2i%4Hj#PE;9}@?L-O+KZ{WZBpH~^}!$P|K9%ho8BKtY(JddzU%!# z6kNX@1=k{g1+G|-me;gR7$yVylT+)YjoIcww)$C`1x zBJY#1^YR(o7%(#@vaKB^RVp`lvq+IioPJ9ADmj&5x_GAY6aR{Qe?tzfRwAL5*h@|$ zISu4&Q=JibqJIMCt6aL?pRm-x^hq9*l($Rrb|t+%m!Dx_bR~2NGMHWL!ZX2P$8 zCNqxccrY>An z!HwWCF^ua_Y`CQdmxn~p;~sgsPG0sGodz`XGP;u~lyi>4NCB69XI$!TiJD!;j*EeC z9lTsi`{_yCKd!vE$7e;6F0BYhW@ck@_RdRT0k`0XBQgx`Ha`~%pFKw~YKTJvnVO1b zO7wVob>s4Jz~a_&GN(qKGZYqlB|pqgwH=e|o+&wvO3_ATG={5*GWKZjVrXm@--d&M zZ!rT@`W%@~UqZI*H9C$?)*jWa=-!`#SJc0@gU{NTjTUAW4xuyu!I??y->3^PgL34< zKp@qw2w)JU1`rx|xg~_Ahhq?$URBR4`*R1eK-@JhJ6U0 z`1CfYKEa{p!BQGQlspom^pOzRpOQ5jSthcD-IvBnVDpNlny$o^ccF+}#~V$DYTAVT&hSdC{*_Gf&}M*D+; zC*)KmVAdnGD*oudf;;3=Vct<@9=^s!-^Oy!)duRs^MDl}BZs6?D5`gnpH8fbkCQ|4 zhq#X%5|G6GW*e3Q(#DmS&|+$H0Yl3pP{({o^9UZBb_$Q?58L;tsV{{ zmQ3^zUOYoSw$Cs^zORu(te?6CEW!_|LOcu3g1(uUw+ZY=^nAl1%~*7l%sCZ(iT06? zHY~-_5FoJ&T-gf=VPSb8RoN?5_O4qJmHTd5q)J@TfqQ$)tMOAz3VBz`Cf@3bsW^D7}`-wvdG z&3M5Thl!TKq;JOqudRsfy4ICw+j)~u`W{RB9tgBQBSmS0*eS~b00^kz|_^RcA=@w7jnzV1!>_ig>UKk0uW z?e79G&grZjT@NPxyR)EkqmQgVpY-q2z!TkjZvy_ww7&!CZExBVfya~ny;-jZlm0_l zufs|Ik*wFlN&m3+x>m=sR&r9_+K_L-n+2;Eey1qy@5D>-o5gFp@u`%wza4LdZx$vx zcHit~*(w2Rh3ge)!@XvAMbqVxdz~fLZdsUODANgy3ABoTN+|UrIUkU7h@7+J{4E@8 zErwqa&GZW7!e$DEDRQM5ck;0{;?rFN)k!?-N0vs7G zi*(zU_%u1A!NN~*9_R3#G-7k`s2Y+1jUtprZ=7Z<&ZG*kXpL6y<=ithJ z#s8~-<2xlT@VEFa{~71~Yp$8RWk2IQKQ|ZLw|J~gOT&N5;pbkj)!KRAb)b|VTs(81 zqu)CtwVbP3nSULa6CKw&R(B(T+axvy>k$chfM$v0UOS_l0UERIBd*w*d(~|a7<89~i&XvY*>`8m-@$&fc<12G8 zj`ZL|wKDbc2tH+j)t(-}EThrbK zyd7UYp1^m2yxVa!QHh*_{JzCoqCN*SQQw#J_G_>Sd?g7d$+V0jP!8yC(@ChN)wl;T z%E@;{u0ky;baeUX${5Q>efwh4+XZuXCGO>D*Xry^amTg%h$&xKU$1nM9@7i8_{eH@i#X62Ifp#RetmkU zqvlYywAq|)39#5zU2GP~s_N?MCjTXos0qOK4|mVq`RTDh;OB^lEo>ELe-;e{#sgYF z3+4g?!LDF1pjBv z&BFHi5u(-rHRhsL5j76fgo_#_Y7(fmE^0MV>wvn#MXe!fJy2Kr$Q2{bRlvEL#ca9a zL~Q`-8W%M|)JCADd|FKsXA^KXv!vZ>Em2#5y4FRlBWf#9+k9GGL7eM=bG;8|J#n@J z=LR3nmBhIbI5+ult|HFOz`4bTb2V{p1D5AtxQq5L@J4d#PYPLBPQDUp9W{1F?BWs|V zT@FQ**qTp+^zL>GigRR*bk<&nB1$YpHTwnb99a|99CRq6#G0w*u)v)oYoVIA9f~Ni zwN!Id;Lee?Qq2j6B1&u>)tnT#b7bqO=Cnf*CDu+gX9eyY*#@dP?@&aEZKRru0(XvV z6V+UHD5AtRQ_VGjJ4d#aYC0W?D6uV{27esv+BR}6eSNwDsOg{)yfqy(OBMX1UcrgS zY73eDJ1C3?SfDGY1-dGaK~A{r}ZvN@wxXCDo*d@t+H4-ND% zZiKWCgsq zLwd*HNU^Vw->I?Tj(mY@!-M%E&x~|{_`@B!Y>!pHZ`Yo^9eTFNb`EBGKg`@=ddDrQ z<%MFQw~*^#c)z;_M|c%nh5))J{W^e;1FzzBe|Y9qa?Smo2idXgMB_yL4;vphKHWT( zO2102x3H~KsqL>)?SQ2or(SH>Kb1Q0DzydB*2k^SBF`(PQu}7BLbc7K=lB|N4M~NB z-<^dnY`(~NCx-!9fTKg= z=ykw`vjfZs@j{_!MDAwuTH&q{?(NIwG$Vqh|GfhBy`d?f(Wu=njXBELb`<~ZUrLY-GT&luqg`68Hn z<+Y5)SK|rzo=x+>x5e>65Wt>V{|^9*F-FTapB|h_ZL=-41Uo#H+Tqk4dUpLMH$S`i z?BZ1FP^qQMb}z6roiAhJx`)U^h`OCqsok$qZQvjp9ydGuG z7|u8y46E$N*Ilx8g+Vtej40^FHO_RsGaV^?UHBIGb_Dd|N*+8_Ai%I;HU^!A>Rq` z_K4RTKj0-LRUp7n(j{f*Sf`K@Yb7Z~pYu(x3Qxw_v|qnoRn_m#?^P4jtJa*suJkg? z471YylsCguu!Lh$WiNRMD-fK6UH>_N<bG4>YdxutFr?^-hVH|Zv0^s>wQBV1|E|UxNX?FYQXfPM)+)@cSxUS^=pBHV>C34uQwfAuql%jr}6C72ucF2<48mB z0qlA|fTgfqGl~_FrfEYW(yVyWG#iUJktSYTQinG&p(=W47xG?R`boHm(tM}_0p7Z+ zOTRF7L3HU@yJ!KUB;eJdqL+jiQYa;)3Iqelu>%1aIFcl>l0d+1_6P6;9W(NZ&_Q)0 zs{Aa`v12INw4h7rBmE+-adAnBqe#CZTdTPfM-kPiT1p(L+Xzc?sIKBRK6M-JQNNla z>U$OU=wAIi?9u(C<>I>HBe8Vch@81MSkRd{P!7Qpq=7PZ=SJ|J5rkpy-Krg22?Wo@09(&5Uj%q;i@cH$Uy7#Evi~$<8FCoY5VdO6_rMwOrx|4RTG~F-W{8$sqAD z;x@bg*U2D-8#3>mpp=YOtGR8ElQ<0k8>o3SU2Q}=3rYnyM}XIWk>gCkG-{fc%D#_W zWmT5Hhb$^>rE?K{A9nqB0hk>Gq~jK+tGA|7yBs|;wN8YMa)J`|EK%j?8A>DRnbpMx zX6u)ao~g7*4u4c(m>vGuBa8S*6^tzEZf5mtPd1k=j+lc@RRBV11AYRYu9qU+f;t~X z@{Ba-Tm+9{*9!nFx7YeI-uh;$BpjVQ=D?AzuZ2Dz(!wM4V=FM+l1+@z|!e%s!*`jGQ zD=#Ph0n{x-Ayv@;or~aaVb?J&Vd^4G)+|mJRa)g9__@qCY&)HFI5!B1g#jc+cEUHZy2?Wx=|mMR)bBPrT9JtI63+#LT_GQOz+HM)T-1fhS7 z0wXOHGE=MHLX@UZdZ6T`LjB0~hAKqoBA9~R)hWVikj1HxoI^D+uTBxKFDXqD2)He$ zIRXDpQN>{oifPp1Kdw=6$m1H74}6n3fdtJ7ByTWt;NjEza#CeyTta^F2E1agp+^qt z7NXQ!kx$hPQv(S84R-y<0IV_lo2M!lGK`SN^Ye!yB26^kjk@OtP;SX0aB(1Rv+!}v za+xJl>AO7AS8+sOW>BH!(z@12f0OyR+)%T_N3taqhioaT@x5#*Dh_$xK*b@?8>sBj zo;M&#RiUuGHg*!%lfnk;T9fHoqxO`DZ+#5XNMw2-2ha_vwOlrTM>W&HX$1sY>NGC4 z>72iKwGzlYk6;1a&lcqKG*@Z`!GFT8e+j@c*R?O>YZuoQsm5o*l#f5Z{>9DDZ$5{m zs>hwt|9rC*{N>v6%OIo@P97NV^lLP5mD0JtpHS!dS8>P&uHujlT;+UesnlCbW9q^w9G$l&-EHc4tCFe5fq>iW&E+%Y zqcGU7AZuT5J~%hjY?GeE!4qsG-D6DSCyY_n=Ox`X%dB zJo`6l06_v?y8a0i%&gE?l6@4mGQS^l55a1qPJe`wNlLmL^OCCGW&!p5pBQC*G+9X`6WRq6&g_Jo#cNh~=t{HTzjhe$fau2CiEK1=@NcAQhW&J$j5{v^8F)1g?B@_~r7z0N0Mwa()$yUKhNS~d+A zJ4n|jdQ^d6H(XxFF`N|y;c!PR;l=tzi&|%kYWX3rrM%xk327WxA}duO*jFMe25drB ztnY>0-fWv*Mo~_qeRp=@wWA!>(97;XJjeT9QBLw2FAOqXZfT4W$`lI&=Jz)nKyLnR z0A6v?8T?uT-;A z{8d#Ivb#Gibq>H*RXf&6&|1Ibd+I+3Ye~hIO0A4D19~sK4 zAZefHYAtF20Y(!#`uinQL0Rck3MqQB(upyYM^ZWwnJlL{4u7RnamY%iQcGLu$Umw$ zZ2#!VVMj`yKGsg`*xx;va~yTHYI{WTsN6=la5oSC_NeCOR9*p!x-bbNQq1r>tY}0B zEqBd_;T$gu_!FpGlm$=&2(F+7{1p@|3n-sr5xQG03X?5Bj>(R=Q!`IxOtzJ`X#uV4 zdeYYsD7j=SR*pL`dk^ksnS3LpvIO_2Lj9f5(%Xt^Kx^B|WHr1B*dV7;la3j+wk4=% z7s$(h7x?-25PToO0|3)e0AAYu2)P#H@2LR<-$HH2CAzLydT~<+vbM__En|NAy`tJl zwxFz%e%rBfewphxr1llb?vm8LDngd^Ud18z5h|^=`v`lioTN-)@>C&L;GQeUFlsTP z@V6u4F)H)yF0D47#%p+`%Ksede3TmF7b7aJZGNn-im0h61bwL9e+Gpm3ujEFwZFi5 zzW$5NpKpHNG?hB)B*-^CX>*YBLu(XL((7Nnz*?nQ?rcy*nJ<$4wyF(Te^uIP>#rSH z$0)E)!1AC$n4wjAT%*bgH;lyXEZ2+OAF>hpRoEqX71JpIo$0vp!^?*QgEvlNiy@o*2cQmVG4_0|b7vD#8nxCnd~Mzoa*VJ}12>8`SD9ruEcs$s z71PRErHU71t!i?&ZjuEPOC<1^#mcKXx<6YiO?}8EPZeOMKn< zOFJt`J?|%0m3ZC{5uomu{F=jvoJG%Bq~BVZvxGQ)GgiqP$IH2e}znNXl+5qujp zZU_ns&^R$OcktOBTF7tV<);hH@3?kO)PI@U`7*Wh+3n{&FjXjh^^bB$x@N^kf!V)= zny)7^)hgkOc%_E@by)nOQ0PEcY$O7|DvZPbqe}WaeD%|92w=ybHdYR1G%x4z7r>%? z)z$P)FK2Za>d^lQulDpS-zv3$U<}{t2`HFvwd{u>o8VK?md7nmZ$ImK-u}h*&$s{6 z^?yyBo2{&HLMv>tGrirg{s0pO)Cix!zZ9CkC`23K+Y#(Sup7ZX1P2ftLU07ZF$BjE zoJ4RM!C3^I2;N6<3qcox4-jYw`VjOZ$RWrh;0W#^KzB)LaXyNr?;yZr6vyNMr$HNr zh8+7*j&9AgDZD2mX8vQYHcxunh@=o{ zdQsnwNE0G0FIH_tqy>@Y7b`a)(mWTz2J6QgA2r$yHa*;CpJkV$Q4r+h1NcsVE&#>3 zRl#7xeTIAu*x;J`Ls$kG;=p&~!L6}da{(yMwIrea8{@Yg0S?8vb=A%dL2<4D8WT4} z?IQo)@xzY}Tl`pma{T-waa}m+Vf*;jM_cCtbUxx0->$)UY3~);>D9$yh&UedE`dmVAzV+OoIFoFzjl2qlKe;%1aUwcX3D~~_ zc6s#jM9oYXu$f389QowR=#`1sOcml$#IKHCok+}7BVL1e=V<3dd?to?+~H3ko^ejEh_d=+X!S(x%yy*gAc_!UCz5tyGv;MG5Z~?Kdl292Ze$-)_DhW% zK+-`XSr6b4QVzQ*Zz1Jv>9iwAI!Yuvyq?`x>$rAA0AW|UBDk#4=g_O}4 H&2;@QaT^s} literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/Xlib/protocol/__pycache__/request.cpython-312.pyc b/venv/lib/python3.12/site-packages/Xlib/protocol/__pycache__/request.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..24ddb211f1abe9a1a8e961637d5f0ad20f3dfc7b GIT binary patch literal 101861 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/Xlib/protocol/__pycache__/structs.cpython-312.pyc b/venv/lib/python3.12/site-packages/Xlib/protocol/__pycache__/structs.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..92818caf1e6f4721922edd964f6fefd8dc441623 GIT binary patch literal 8249 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/Xlib/protocol/display.py b/venv/lib/python3.12/site-packages/Xlib/protocol/display.py new file mode 100644 index 0000000..8531ee3 --- /dev/null +++ b/venv/lib/python3.12/site-packages/Xlib/protocol/display.py @@ -0,0 +1,1075 @@ +# -*- coding: utf-8 -*- +# +# Xlib.protocol.display -- core display communication +# +# Copyright (C) 2000-2002 Peter Liljenberg +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public License +# as published by the Free Software Foundation; either version 2.1 +# of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the +# Free Software Foundation, Inc., +# 59 Temple Place, +# Suite 330, +# Boston, MA 02111-1307 USA + +# Standard modules +import errno +import math +import select +import socket +import struct +import sys + +# Python 2/3 compatibility. +from six import PY3, byte2int, indexbytes + +# Xlib modules +from .. import error +from ..ext import ge + +from ..support import lock, connect + +# Xlib.protocol modules +from . import rq +from . import event + +if PY3: + + class bytesview(object): + + def __init__(self, data, offset=0, size=None): + if size is None: + size = len(data)-offset + if isinstance(data, bytes): + view = memoryview(data) + elif isinstance(data, bytesview): + view = data.view + else: + raise TypeError('unsupported type: {}'.format(type(data))) + self.view = view[offset:offset+size] + + def __len__(self): + return len(self.view) + + def __getitem__(self, key): + if isinstance(key, slice): + return bytes(self.view[key]) + return self.view[key] + +else: + + def bytesview(data, offset=0, size=None): + if not isinstance(data, (bytes, buffer)): + raise TypeError('unsupported type: {}'.format(type(data))) + if size is None: + size = len(data)-offset + return buffer(data, offset, size) + + +class Display(object): + extension_major_opcodes = {} + error_classes = error.xerror_class.copy() + event_classes = event.event_class.copy() + + def __init__(self, display = None): + name, protocol, host, displayno, screenno = connect.get_display(display) + + self.display_name = name + self.default_screen = screenno + + self.socket = connect.get_socket(name, protocol, host, displayno) + + auth_name, auth_data = connect.get_auth(self.socket, name, + protocol, host, displayno) + + # Internal structures for communication, grouped + # by their function and locks + + # Socket error indicator, set when the socket is closed + # in one way or another + self.socket_error_lock = lock.allocate_lock() + self.socket_error = None + + # Event queue + self.event_queue_read_lock = lock.allocate_lock() + self.event_queue_write_lock = lock.allocate_lock() + self.event_queue = [] + + # Unsent request queue and sequence number counter + self.request_queue_lock = lock.allocate_lock() + self.request_serial = 1 + self.request_queue = [] + + # Send-and-receive loop, see function send_and_receive + # for a detailed explanation + self.send_recv_lock = lock.allocate_lock() + self.send_active = 0 + self.recv_active = 0 + + self.event_waiting = 0 + self.event_wait_lock = lock.allocate_lock() + self.request_waiting = 0 + self.request_wait_lock = lock.allocate_lock() + + # Calculate optimal default buffer size for recv. + buffer_size = self.socket.getsockopt(socket.SOL_SOCKET, + socket.SO_RCVBUF) + buffer_size = math.pow(2, math.floor(math.log(buffer_size, 2))) + self.recv_buffer_size = int(buffer_size) + + # Data used by the send-and-receive loop + self.sent_requests = [] + self.recv_packet_len = 0 + self.data_send = b'' + self.data_recv = b'' + self.data_sent_bytes = 0 + + # Resource ID structures + self.resource_id_lock = lock.allocate_lock() + self.resource_ids = {} + self.last_resource_id = 0 + + # Use an default error handler, one which just prints the error + self.error_handler = None + + + # Right, now we're all set up for the connection setup + # request with the server. + + # Figure out which endianness the hardware uses + self.big_endian = struct.unpack('BB', struct.pack('H', 0x0100))[0] + + if self.big_endian: + order = 0x42 + else: + order = 0x6c + + # Send connection setup + r = ConnectionSetupRequest(self, + byte_order = order, + protocol_major = 11, + protocol_minor = 0, + auth_prot_name = auth_name, + auth_prot_data = auth_data) + + # Did connection fail? + if r.status != 1: + raise error.DisplayConnectionError(self.display_name, r.reason) + + # Set up remaining info + self.info = r + self.default_screen = min(self.default_screen, len(self.info.roots) - 1) + + + # + # Public interface + # + + def get_display_name(self): + return self.display_name + + def get_default_screen(self): + return self.default_screen + + def fileno(self): + self.check_for_error() + return self.socket.fileno() + + def next_event(self): + self.check_for_error() + + # Main lock, so that only one thread at a time performs the + # event waiting code. This at least guarantees that the first + # thread calling next_event() will get the next event, although + # no order is guaranteed among other threads calling next_event() + # while the first is blocking. + + self.event_queue_read_lock.acquire() + + # Lock event queue, so we can check if it is empty + self.event_queue_write_lock.acquire() + + # We have too loop until we get an event, as + # we might be woken up when there is no event. + + while not self.event_queue: + + # Lock send_recv so no send_and_receive + # can start or stop while we're checking + # whether there are one active. + self.send_recv_lock.acquire() + + # Release event queue to allow an send_and_recv to + # insert any now. + self.event_queue_write_lock.release() + + # Call send_and_recv, which will return when + # something has occured + self.send_and_recv(event = True) + + # Before looping around, lock the event queue against + # modifications. + self.event_queue_write_lock.acquire() + + # Whiew, we have an event! Remove it from + # the event queue and relaese its write lock. + + event = self.event_queue[0] + del self.event_queue[0] + self.event_queue_write_lock.release() + + # Finally, allow any other threads which have called next_event() + # while we were waiting to proceed. + + self.event_queue_read_lock.release() + + # And return the event! + return event + + def pending_events(self): + self.check_for_error() + + # Make a send_and_recv pass, receiving any events + self.send_recv_lock.acquire() + self.send_and_recv(recv = True) + + # Lock the queue, get the event count, and unlock again. + self.event_queue_write_lock.acquire() + count = len(self.event_queue) + self.event_queue_write_lock.release() + + return count + + def flush(self): + self.check_for_error() + self.send_recv_lock.acquire() + self.send_and_recv(flush = True) + + def close(self): + self.flush() + self.close_internal('client') + + def set_error_handler(self, handler): + self.error_handler = handler + + + def allocate_resource_id(self): + """id = d.allocate_resource_id() + + Allocate a new X resource id number ID. + + Raises ResourceIDError if there are no free resource ids. + """ + + self.resource_id_lock.acquire() + try: + i = self.last_resource_id + while i in self.resource_ids: + i = i + 1 + if i > self.info.resource_id_mask: + i = 0 + if i == self.last_resource_id: + raise error.ResourceIDError('out of resource ids') + + self.resource_ids[i] = None + self.last_resource_id = i + return self.info.resource_id_base | i + finally: + self.resource_id_lock.release() + + def free_resource_id(self, rid): + """d.free_resource_id(rid) + + Free resource id RID. Attempts to free a resource id which + isn't allocated by us are ignored. + """ + + self.resource_id_lock.acquire() + try: + i = rid & self.info.resource_id_mask + + # Attempting to free a resource id outside our range + if rid - i != self.info.resource_id_base: + return None + + try: + del self.resource_ids[i] + except KeyError: + pass + finally: + self.resource_id_lock.release() + + + + def get_resource_class(self, class_name, default = None): + """class = d.get_resource_class(class_name, default = None) + + Return the class to be used for X resource objects of type + CLASS_NAME, or DEFAULT if no such class is set. + """ + + return self.resource_classes.get(class_name, default) + + def set_extension_major(self, extname, major): + self.extension_major_opcodes[extname] = major + + def get_extension_major(self, extname): + return self.extension_major_opcodes[extname] + + def add_extension_event(self, code, evt, subcode=None): + if subcode == None: + self.event_classes[code] = evt + else: + if not code in self.event_classes: + self.event_classes[code] = {subcode: evt} + else: + self.event_classes[code][subcode] = evt + + def add_extension_error(self, code, err): + self.error_classes[code] = err + + + # + # Private functions + # + + def check_for_error(self): + self.socket_error_lock.acquire() + err = self.socket_error + self.socket_error_lock.release() + + if err: + raise err + + def send_request(self, request, wait_for_response): + if self.socket_error: + raise self.socket_error + + self.request_queue_lock.acquire() + + request._serial = self.request_serial + self.request_serial = (self.request_serial + 1) % 65536 + + self.request_queue.append((request, wait_for_response)) + qlen = len(self.request_queue) + + self.request_queue_lock.release() + +# if qlen > 10: +# self.flush() + + def close_internal(self, whom): + # Clear out data structures + self.request_queue = None + self.sent_requests = None + self.event_queue = None + self.data_send = None + self.data_recv = None + + # Close the connection + self.socket.close() + + # Set a connection closed indicator + self.socket_error_lock.acquire() + self.socket_error = error.ConnectionClosedError(whom) + self.socket_error_lock.release() + + + def send_and_recv(self, flush = False, event = False, request = None, recv = False): + """send_and_recv(flush = None, event = None, request = None, recv = None) + + Perform I/O, or wait for some other thread to do it for us. + + send_recv_lock MUST be LOCKED when send_and_recv is called. + It will be UNLOCKED at return. + + Exactly or one of the parameters flush, event, request and recv must + be set to control the return condition. + + To attempt to send all requests in the queue, flush should + be true. Will return immediately if another thread is + already doing send_and_recv. + + To wait for an event to be received, event should be true. + + To wait for a response to a certain request (either an error + or a response), request should be set to that request's + serial number. + + To just read any pending data from the server, recv should be true. + + It is not guaranteed that the return condition has been + fulfilled when the function returns, so the caller has to loop + until it is finished. + """ + + # We go to sleep if there is already a thread doing what we + # want to do: + + # If flushing, we want to send + # If waiting for a response to a request, we want to send + # (to ensure that the request was sent - we alway recv + # when we get to the main loop, but sending is the important + # thing here) + # If waiting for an event, we want to recv + # If just trying to receive anything we can, we want to recv + + # FIXME: It would be good if we could also sleep when we're waiting on + # a response to a request that has already been sent. + + if (((flush or request is not None) and self.send_active) + or ((event or recv) and self.recv_active)): + + # Signal that we are waiting for something. These locks + # together with the *_waiting variables are used as + # semaphores. When an event or a request response arrives, + # it will zero the *_waiting and unlock the lock. The + # locks will also be unlocked when an active send_and_recv + # finishes to signal the other waiting threads that one of + # them has to take over the send_and_recv function. + + # All this makes these locks and variables a part of the + # send_and_recv control logic, and hence must be modified + # only when we have the send_recv_lock locked. + if event: + wait_lock = self.event_wait_lock + if not self.event_waiting: + self.event_waiting = 1 + wait_lock.acquire() + + elif request is not None: + wait_lock = self.request_wait_lock + if not self.request_waiting: + self.request_waiting = 1 + wait_lock.acquire() + + # Release send_recv, allowing a send_and_recive + # to terminate or other threads to queue up + self.send_recv_lock.release() + + # Return immediately if flushing, even if that + # might mean that not necessarily all requests + # have been sent. + if flush or recv: + return + + # Wait for something to happen, as the wait locks are + # unlocked either when what we wait for has arrived (not + # necessarily the exact object we're waiting for, though), + # or when an active send_and_recv exits. + + # Release it immediately afterwards as we're only using + # the lock for synchonization. Since we're not modifying + # event_waiting or request_waiting here we don't have + # to lock send_and_recv_lock. In fact, we can't do that + # or we trigger a dead-lock. + + wait_lock.acquire() + wait_lock.release() + + # Return to caller to let it check whether it has + # got the data it was waiting for + return + + + # There's no thread doing what we need to do. Find out exactly + # what to do + + # There must always be some thread receiving data, but it must not + # necessarily be us + + if not self.recv_active: + receiving = 1 + self.recv_active = 1 + else: + receiving = 0 + + flush_bytes = None + sending = 0 + + # Loop, receiving and sending data. + while 1: + + # We might want to start sending data + if sending or not self.send_active: + + # Turn all requests on request queue into binary form + # and append them to self.data_send + + self.request_queue_lock.acquire() + for req, wait in self.request_queue: + self.data_send = self.data_send + req._binary + if wait: + self.sent_requests.append(req) + + del self.request_queue[:] + self.request_queue_lock.release() + + # If there now is data to send, mark us as senders + + if self.data_send: + self.send_active = 1 + sending = 1 + else: + self.send_active = 0 + sending = 0 + + # We've done all setup, so release the lock and start waiting + # for the network to fire up + self.send_recv_lock.release() + + # There's no longer anything useful we can do here. + if not (sending or receiving): + break + + # If we're flushing, figure out how many bytes we + # have to send so that we're not caught in an interminable + # loop if other threads continuously append requests. + if flush and flush_bytes is None: + flush_bytes = self.data_sent_bytes + len(self.data_send) + + + try: + # We're only checking for the socket to be writable + # if we're the sending thread. We always check for it + # to become readable: either we are the receiving thread + # and should take care of the data, or the receiving thread + # might finish receiving after having read the data + + if sending: + writeset = [self.socket] + else: + writeset = [] + + # Timeout immediately if we're only checking for + # something to read or if we're flushing, otherwise block + + if recv or flush: + timeout = 0 + else: + timeout = None + + rs, ws, es = select.select([self.socket], writeset, [], timeout) + + # Ignore errors caused by a signal received while blocking. + # All other errors are re-raised. + except select.error as err: + if isinstance(err, OSError): + code = err.errno + else: + code = err[0] + if code != errno.EINTR: + raise + + # We must lock send_and_recv before we can loop to + # the start of the loop + + self.send_recv_lock.acquire() + continue + + + # Socket is ready for sending data, send as much as possible. + if ws: + try: + i = self.socket.send(self.data_send) + except socket.error as err: + self.close_internal('server: %s' % err) + raise self.socket_error + + self.data_send = self.data_send[i:] + self.data_sent_bytes = self.data_sent_bytes + i + + + # There is data to read + gotreq = 0 + if rs: + + # We're the receiving thread, parse the data + if receiving: + try: + count = self.recv_packet_len - len(self.data_recv) + count = max(self.recv_buffer_size, count) + bytes_recv = self.socket.recv(count) + except socket.error as err: + self.close_internal('server: %s' % err) + raise self.socket_error + + if not bytes_recv: + # Clear up, set a connection closed indicator and raise it + self.close_internal('server') + raise self.socket_error + + self.data_recv = bytes(self.data_recv) + bytes_recv + gotreq = self.parse_response(request) + + # Otherwise return, allowing the calling thread to figure + # out if it has got the data it needs + else: + # We must be a sending thread if we're here, so reset + # that indicator. + self.send_recv_lock.acquire() + self.send_active = 0 + self.send_recv_lock.release() + + # And return to the caller + return + + + # There are three different end of send-recv-loop conditions. + # However, we don't leave the loop immediately, instead we + # try to send and receive any data that might be left. We + # do this by giving a timeout of 0 to select to poll + # the socket. + + # When flushing: all requests have been sent + if flush and flush_bytes >= self.data_sent_bytes: + break + + # When waiting for an event: an event has been read + if event and self.event_queue: + break + + # When processing a certain request: got its reply + if request is not None and gotreq: + break + + # Always break if we just want to receive as much as possible + if recv: + break + + # Else there's may still data which must be sent, or + # we haven't got the data we waited for. Lock and loop + + self.send_recv_lock.acquire() + + + # We have accomplished the callers request. + # Record that there are now no active send_and_recv, + # and wake up all waiting thread + + self.send_recv_lock.acquire() + + if sending: + self.send_active = 0 + if receiving: + self.recv_active = 0 + + if self.event_waiting: + self.event_waiting = 0 + self.event_wait_lock.release() + + if self.request_waiting: + self.request_waiting = 0 + self.request_wait_lock.release() + + self.send_recv_lock.release() + + + def parse_response(self, request): + """Internal method. + + Parse data received from server. If REQUEST is not None + true is returned if the request with that serial number + was received, otherwise false is returned. + + If REQUEST is -1, we're parsing the server connection setup + response. + """ + + if request == -1: + return self.parse_connection_setup() + + # Parse ordinary server response + gotreq = False + while True: + if self.data_recv: + # Check the first byte to find out what kind of response it is + rtype = byte2int(self.data_recv) + + # Are we're waiting for additional data for the current packet? + if self.recv_packet_len: + if len(self.data_recv) < self.recv_packet_len: + return gotreq + + if rtype == 1: + gotreq = self.parse_request_response(request) or gotreq + continue + elif rtype & 0x7f == ge.GenericEventCode: + self.parse_event_response(rtype) + continue + else: + raise AssertionError(rtype) + + # Every response is at least 32 bytes long, so don't bother + # until we have received that much + if len(self.data_recv) < 32: + return gotreq + + # Error response + if rtype == 0: + gotreq = self.parse_error_response(request) or gotreq + + # Request response or generic event. + elif rtype == 1 or rtype & 0x7f == ge.GenericEventCode: + # Set reply length, and loop around to see if + # we have got the full response + rlen = int(struct.unpack('=L', self.data_recv[4:8])[0]) + self.recv_packet_len = 32 + rlen * 4 + + # Else non-generic event + else: + self.parse_event_response(rtype) + + + def parse_error_response(self, request): + # Code is second byte + code = indexbytes(self.data_recv, 1) + + # Fetch error class + estruct = self.error_classes.get(code, error.XError) + + e = estruct(self, self.data_recv[:32]) + self.data_recv = bytesview(self.data_recv, 32) + + # print 'recv Error:', e + + req = self.get_waiting_request(e.sequence_number) + + # Error for a request whose response we are waiting for, + # or which have an error handler. However, if the error + # handler indicates that it hasn't taken care of the + # error, pass it on to the default error handler + + if req and req._set_error(e): + + # If this was a ReplyRequest, unlock any threads waiting + # for a request to finish + + if isinstance(req, rq.ReplyRequest): + self.send_recv_lock.acquire() + + if self.request_waiting: + self.request_waiting = 0 + self.request_wait_lock.release() + + self.send_recv_lock.release() + + return request == e.sequence_number + + # Else call the error handler + else: + if self.error_handler: + rq.call_error_handler(self.error_handler, e, None) + else: + self.default_error_handler(e) + + return False + + + def default_error_handler(self, err): + sys.stderr.write('X protocol error:\n%s\n' % err) + + + def parse_request_response(self, request): + req = self.get_waiting_replyrequest() + + # Sequence number is always data[2:4] + # Do sanity check before trying to parse the data + sno = struct.unpack('=H', self.data_recv[2:4])[0] + if sno != req._serial: + raise RuntimeError("Expected reply for request %s, but got %s. Can't happen!" + % (req._serial, sno)) + + req._parse_response(self.data_recv[:self.recv_packet_len]) + # print 'recv Request:', req + + self.data_recv = bytesview(self.data_recv, self.recv_packet_len) + self.recv_packet_len = 0 + + + # Unlock any response waiting threads + + self.send_recv_lock.acquire() + + if self.request_waiting: + self.request_waiting = 0 + self.request_wait_lock.release() + + self.send_recv_lock.release() + + + return req.sequence_number == request + + + def parse_event_response(self, etype): + # Skip bit 8, that is set if this event came from an SendEvent + etype = etype & 0x7f + + if etype == ge.GenericEventCode: + length = self.recv_packet_len + else: + length = 32 + + estruct = self.event_classes.get(etype, event.AnyEvent) + if type(estruct) == dict: + subcode = self.data_recv[1] + + # Python2 compatibility + if type(subcode) == str: + subcode = ord(subcode) + + # this etype refers to a set of sub-events with individual subcodes + estruct = estruct[subcode] + + e = estruct(display = self, binarydata = self.data_recv[:length]) + + if etype == ge.GenericEventCode: + self.recv_packet_len = 0 + + self.data_recv = bytesview(self.data_recv, length) + + # Drop all requests having an error handler, + # but which obviously succeded. + + # Decrement it by one, so that we don't remove the request + # that generated these events, if there is such a one. + # Bug reported by Ilpo Nyyssönen + # Note: not all events have a sequence_number field! + # (e.g. KeymapNotify). + if hasattr(e, 'sequence_number'): + self.get_waiting_request((e.sequence_number - 1) % 65536) + + # print 'recv Event:', e + + # Insert the event into the queue + self.event_queue_write_lock.acquire() + self.event_queue.append(e) + self.event_queue_write_lock.release() + + # Unlock any event waiting threads + self.send_recv_lock.acquire() + + if self.event_waiting: + self.event_waiting = 0 + self.event_wait_lock.release() + + self.send_recv_lock.release() + + + def get_waiting_request(self, sno): + if not self.sent_requests: + return None + + # Normalize sequence numbers, even if they have wrapped. + # This ensures that + # sno <= last_serial + # and + # self.sent_requests[0]._serial <= last_serial + + if self.sent_requests[0]._serial > self.request_serial: + last_serial = self.request_serial + 65536 + if sno < self.request_serial: + sno = sno + 65536 + + else: + last_serial = self.request_serial + if sno > self.request_serial: + sno = sno - 65536 + + # No matching events at all + if sno < self.sent_requests[0]._serial: + return None + + # Find last req <= sno + req = None + reqpos = len(self.sent_requests) + adj = 0 + last = 0 + + for i in range(0, len(self.sent_requests)): + rno = self.sent_requests[i]._serial + adj + + # Did serial numbers just wrap around? + if rno < last: + adj = 65536 + rno = rno + adj + + last = rno + + if sno == rno: + req = self.sent_requests[i] + reqpos = i + 1 + break + elif sno < rno: + req = None + reqpos = i + break + + # Delete all request such as req <= sno + del self.sent_requests[:reqpos] + + return req + + def get_waiting_replyrequest(self): + for i in range(0, len(self.sent_requests)): + if hasattr(self.sent_requests[i], '_reply'): + req = self.sent_requests[i] + del self.sent_requests[:i + 1] + return req + + # Reply for an unknown request? No, that can't happen. + else: + raise RuntimeError("Request reply to unknown request. Can't happen!") + + def parse_connection_setup(self): + """Internal function used to parse connection setup response. + """ + + # Only the ConnectionSetupRequest has been sent so far + r = self.sent_requests[0] + + while True: + # print 'data_send:', repr(self.data_send) + # print 'data_recv:', repr(self.data_recv) + + if r._data: + alen = r._data['additional_length'] * 4 + + # The full response haven't arrived yet + if len(self.data_recv) < alen: + return False + + # Connection failed or further authentication is needed. + # Set reason to the reason string + if r._data['status'] != 1: + r._data['reason'] = self.data_recv[:r._data['reason_length']] + + # Else connection succeeded, parse the reply + else: + x, d = r._success_reply.parse_binary(self.data_recv[:alen], + self, rawdict = True) + r._data.update(x) + + del self.sent_requests[0] + + self.data_recv = self.data_recv[alen:] + + return True + + else: + # The base reply is 8 bytes long + if len(self.data_recv) < 8: + return False + + r._data, d = r._reply.parse_binary(self.data_recv[:8], + self, rawdict = True) + self.data_recv = self.data_recv[8:] + + # Loop around to see if we have got the additional data + # already + + +PixmapFormat = rq.Struct( rq.Card8('depth'), + rq.Card8('bits_per_pixel'), + rq.Card8('scanline_pad'), + rq.Pad(5) + ) + +VisualType = rq.Struct ( rq.Card32('visual_id'), + rq.Card8('visual_class'), + rq.Card8('bits_per_rgb_value'), + rq.Card16('colormap_entries'), + rq.Card32('red_mask'), + rq.Card32('green_mask'), + rq.Card32('blue_mask'), + rq.Pad(4) + ) + +Depth = rq.Struct( rq.Card8('depth'), + rq.Pad(1), + rq.LengthOf('visuals', 2), + rq.Pad(4), + rq.List('visuals', VisualType) + ) + +Screen = rq.Struct( rq.Window('root'), + rq.Colormap('default_colormap'), + rq.Card32('white_pixel'), + rq.Card32('black_pixel'), + rq.Card32('current_input_mask'), + rq.Card16('width_in_pixels'), + rq.Card16('height_in_pixels'), + rq.Card16('width_in_mms'), + rq.Card16('height_in_mms'), + rq.Card16('min_installed_maps'), + rq.Card16('max_installed_maps'), + rq.Card32('root_visual'), + rq.Card8('backing_store'), + rq.Card8('save_unders'), + rq.Card8('root_depth'), + rq.LengthOf('allowed_depths', 1), + rq.List('allowed_depths', Depth) + ) + + +class ConnectionSetupRequest(rq.GetAttrData): + _request = rq.Struct( rq.Set('byte_order', 1, (0x42, 0x6c)), + rq.Pad(1), + rq.Card16('protocol_major'), + rq.Card16('protocol_minor'), + rq.LengthOf('auth_prot_name', 2), + rq.LengthOf('auth_prot_data', 2), + rq.Pad(2), + rq.String8('auth_prot_name'), + rq.String8('auth_prot_data') ) + + _reply = rq.Struct ( rq.Card8('status'), + rq.Card8('reason_length'), + rq.Card16('protocol_major'), + rq.Card16('protocol_minor'), + rq.Card16('additional_length') ) + + _success_reply = rq.Struct( rq.Card32('release_number'), + rq.Card32('resource_id_base'), + rq.Card32('resource_id_mask'), + rq.Card32('motion_buffer_size'), + rq.LengthOf('vendor', 2), + rq.Card16('max_request_length'), + rq.LengthOf('roots', 1), + rq.LengthOf('pixmap_formats', 1), + rq.Card8('image_byte_order'), + rq.Card8('bitmap_format_bit_order'), + rq.Card8('bitmap_format_scanline_unit'), + rq.Card8('bitmap_format_scanline_pad'), + rq.Card8('min_keycode'), + rq.Card8('max_keycode'), + rq.Pad(4), + rq.String8('vendor'), + rq.List('pixmap_formats', PixmapFormat), + rq.List('roots', Screen), + ) + + + def __init__(self, display, *args, **keys): + self._binary = self._request.to_binary(*args, **keys) + self._data = None + + # Don't bother about locking, since no other threads have + # access to the display yet + + display.request_queue.append((self, True)) + + # However, we must lock send_and_recv, but we don't have + # to loop. + + display.send_recv_lock.acquire() + display.send_and_recv(request = -1) diff --git a/venv/lib/python3.12/site-packages/Xlib/protocol/event.py b/venv/lib/python3.12/site-packages/Xlib/protocol/event.py new file mode 100644 index 0000000..4524452 --- /dev/null +++ b/venv/lib/python3.12/site-packages/Xlib/protocol/event.py @@ -0,0 +1,434 @@ +# Xlib.protocol.event -- definitions of core events +# +# Copyright (C) 2000-2002 Peter Liljenberg +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public License +# as published by the Free Software Foundation; either version 2.1 +# of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the +# Free Software Foundation, Inc., +# 59 Temple Place, +# Suite 330, +# Boston, MA 02111-1307 USA + + +# Xlib modules +from .. import X + +# Xlib.protocol modules +from . import rq + + +class AnyEvent(rq.Event): + _code = None + _fields = rq.Struct( rq.Card8('type'), + rq.Card8('detail'), + rq.Card16('sequence_number'), + rq.FixedBinary('data', 28), + ) + +class KeyButtonPointer(rq.Event): + _code = None + _fields = rq.Struct( rq.Card8('type'), + rq.Card8('detail'), + rq.Card16('sequence_number'), + rq.Card32('time'), + rq.Window('root'), + rq.Window('window'), + rq.Window('child', (X.NONE, )), + rq.Int16('root_x'), + rq.Int16('root_y'), + rq.Int16('event_x'), + rq.Int16('event_y'), + rq.Card16('state'), + rq.Card8('same_screen'), + rq.Pad(1), + ) + +class KeyPress(KeyButtonPointer): + _code = X.KeyPress + +class KeyRelease(KeyButtonPointer): + _code = X.KeyRelease + +class ButtonPress(KeyButtonPointer): + _code = X.ButtonPress + +class ButtonRelease(KeyButtonPointer): + _code = X.ButtonRelease + +class MotionNotify(KeyButtonPointer): + _code = X.MotionNotify + +class EnterLeave(rq.Event): + _code = None + _fields = rq.Struct( rq.Card8('type'), + rq.Card8('detail'), + rq.Card16('sequence_number'), + rq.Card32('time'), + rq.Window('root'), + rq.Window('window'), + rq.Window('child', (X.NONE, )), + rq.Int16('root_x'), + rq.Int16('root_y'), + rq.Int16('event_x'), + rq.Int16('event_y'), + rq.Card16('state'), + rq.Card8('mode'), + rq.Card8('flags'), + ) + +class EnterNotify(EnterLeave): + _code = X.EnterNotify + +class LeaveNotify(EnterLeave): + _code = X.LeaveNotify + + +class Focus(rq.Event): + _code = None + _fields = rq.Struct( rq.Card8('type'), + rq.Card8('detail'), + rq.Card16('sequence_number'), + rq.Window('window'), + rq.Card8('mode'), + rq.Pad(23), + ) + +class FocusIn(Focus): + _code = X.FocusIn + +class FocusOut(Focus): + _code = X.FocusOut + +class Expose(rq.Event): + _code = X.Expose + _fields = rq.Struct( rq.Card8('type'), + rq.Pad(1), + rq.Card16('sequence_number'), + rq.Window('window'), + rq.Card16('x'), + rq.Card16('y'), + rq.Card16('width'), + rq.Card16('height'), + rq.Card16('count'), + rq.Pad(14), + ) + +class GraphicsExpose(rq.Event): + _code = X.GraphicsExpose + _fields = rq.Struct( rq.Card8('type'), + rq.Pad(1), + rq.Card16('sequence_number'), + rq.Drawable('drawable'), + rq.Card16('x'), + rq.Card16('y'), + rq.Card16('width'), + rq.Card16('height'), + rq.Card16('minor_event'), + rq.Card16('count'), + rq.Card8('major_event'), + rq.Pad(11), + ) + +class NoExpose(rq.Event): + _code = X.NoExpose + _fields = rq.Struct( rq.Card8('type'), + rq.Pad(1), + rq.Card16('sequence_number'), + rq.Drawable('window'), + rq.Card16('minor_event'), + rq.Card8('major_event'), + rq.Pad(21), + ) + +class VisibilityNotify(rq.Event): + _code = X.VisibilityNotify + _fields = rq.Struct( rq.Card8('type'), + rq.Pad(1), + rq.Card16('sequence_number'), + rq.Window('window'), + rq.Card8('state'), + rq.Pad(23), + ) + +class CreateNotify(rq.Event): + _code = X.CreateNotify + _fields = rq.Struct( rq.Card8('type'), + rq.Pad(1), + rq.Card16('sequence_number'), + rq.Window('parent'), + rq.Window('window'), + rq.Int16('x'), + rq.Int16('y'), + rq.Card16('width'), + rq.Card16('height'), + rq.Card16('border_width'), + rq.Card8('override'), + rq.Pad(9), + ) + +class DestroyNotify(rq.Event): + _code = X.DestroyNotify + _fields = rq.Struct( rq.Card8('type'), + rq.Pad(1), + rq.Card16('sequence_number'), + rq.Window('event'), + rq.Window('window'), + rq.Pad(20), + ) + +class UnmapNotify(rq.Event): + _code = X.UnmapNotify + _fields = rq.Struct( rq.Card8('type'), + rq.Pad(1), + rq.Card16('sequence_number'), + rq.Window('event'), + rq.Window('window'), + rq.Card8('from_configure'), + rq.Pad(19), + ) + +class MapNotify(rq.Event): + _code = X.MapNotify + _fields = rq.Struct( rq.Card8('type'), + rq.Pad(1), + rq.Card16('sequence_number'), + rq.Window('event'), + rq.Window('window'), + rq.Card8('override'), + rq.Pad(19), + ) + +class MapRequest(rq.Event): + _code = X.MapRequest + _fields = rq.Struct( rq.Card8('type'), + rq.Pad(1), + rq.Card16('sequence_number'), + rq.Window('parent'), + rq.Window('window'), + rq.Pad(20), + ) + +class ReparentNotify(rq.Event): + _code = X.ReparentNotify + _fields = rq.Struct( rq.Card8('type'), + rq.Pad(1), + rq.Card16('sequence_number'), + rq.Window('event'), + rq.Window('window'), + rq.Window('parent'), + rq.Int16('x'), + rq.Int16('y'), + rq.Card8('override'), + rq.Pad(11), + ) + +class ConfigureNotify(rq.Event): + _code = X.ConfigureNotify + _fields = rq.Struct( rq.Card8('type'), + rq.Pad(1), + rq.Card16('sequence_number'), + rq.Window('event'), + rq.Window('window'), + rq.Window('above_sibling', (X.NONE, )), + rq.Int16('x'), + rq.Int16('y'), + rq.Card16('width'), + rq.Card16('height'), + rq.Card16('border_width'), + rq.Card8('override'), + rq.Pad(5), + ) + +class ConfigureRequest(rq.Event): + _code = X.ConfigureRequest + _fields = rq.Struct( rq.Card8('type'), + rq.Card8('stack_mode'), + rq.Card16('sequence_number'), + rq.Window('parent'), + rq.Window('window'), + rq.Window('sibling', (X.NONE, )), + rq.Int16('x'), + rq.Int16('y'), + rq.Card16('width'), + rq.Card16('height'), + rq.Card16('border_width'), + rq.Card16('value_mask'), + rq.Pad(4), + ) + +class GravityNotify(rq.Event): + _code = X.GravityNotify + _fields = rq.Struct( rq.Card8('type'), + rq.Pad(1), + rq.Card16('sequence_number'), + rq.Window('event'), + rq.Window('window'), + rq.Int16('x'), + rq.Int16('y'), + rq.Pad(16), + ) + +class ResizeRequest(rq.Event): + _code = X.ResizeRequest + _fields = rq.Struct( rq.Card8('type'), + rq.Pad(1), + rq.Card16('sequence_number'), + rq.Window('window'), + rq.Card16('width'), + rq.Card16('height'), + rq.Pad(20), + ) + +class Circulate(rq.Event): + _code = None + _fields = rq.Struct( rq.Card8('type'), + rq.Pad(1), + rq.Card16('sequence_number'), + rq.Window('event'), + rq.Window('window'), + rq.Pad(4), + rq.Card8('place'), + rq.Pad(15), + ) + +class CirculateNotify(Circulate): + _code = X.CirculateNotify + +class CirculateRequest(Circulate): + _code = X.CirculateRequest + +class PropertyNotify(rq.Event): + _code = X.PropertyNotify + _fields = rq.Struct( rq.Card8('type'), + rq.Pad(1), + rq.Card16('sequence_number'), + rq.Window('window'), + rq.Card32('atom'), + rq.Card32('time'), + rq.Card8('state'), + rq.Pad(15), + ) + +class SelectionClear(rq.Event): + _code = X.SelectionClear + _fields = rq.Struct( rq.Card8('type'), + rq.Pad(1), + rq.Card16('sequence_number'), + rq.Card32('time'), + rq.Window('window'), + rq.Card32('atom'), + rq.Pad(16), + ) + +class SelectionRequest(rq.Event): + _code = X.SelectionRequest + _fields = rq.Struct( rq.Card8('type'), + rq.Pad(1), + rq.Card16('sequence_number'), + rq.Card32('time'), + rq.Window('owner'), + rq.Window('requestor'), + rq.Card32('selection'), + rq.Card32('target'), + rq.Card32('property'), + rq.Pad(4), + ) + +class SelectionNotify(rq.Event): + _code = X.SelectionNotify + _fields = rq.Struct( rq.Card8('type'), + rq.Pad(1), + rq.Card16('sequence_number'), + rq.Card32('time'), + rq.Window('requestor'), + rq.Card32('selection'), + rq.Card32('target'), + rq.Card32('property'), + rq.Pad(8), + ) + +class ColormapNotify(rq.Event): + _code = X.ColormapNotify + _fields = rq.Struct( rq.Card8('type'), + rq.Pad(1), + rq.Card16('sequence_number'), + rq.Window('window'), + rq.Colormap('colormap', (X.NONE, )), + rq.Card8('new'), + rq.Card8('state'), + rq.Pad(18), + ) + +class MappingNotify(rq.Event): + _code = X.MappingNotify + _fields = rq.Struct( rq.Card8('type'), + rq.Pad(1), + rq.Card16('sequence_number'), + rq.Card8('request'), + rq.Card8('first_keycode'), + rq.Card8('count'), + rq.Pad(25), + ) + +class ClientMessage(rq.Event): + _code = X.ClientMessage + _fields = rq.Struct( rq.Card8('type'), + rq.Format('data', 1), + rq.Card16('sequence_number'), + rq.Window('window'), + rq.Card32('client_type'), + rq.FixedPropertyData('data', 20), + ) + +class KeymapNotify(rq.Event): + _code = X.KeymapNotify + _fields = rq.Struct( rq.Card8('type'), + rq.FixedList('data', 31, rq.Card8Obj, pad = 0) + ) + + +event_class = { + X.KeyPress: KeyPress, + X.KeyRelease: KeyRelease, + X.ButtonPress: ButtonPress, + X.ButtonRelease: ButtonRelease, + X.MotionNotify: MotionNotify, + X.EnterNotify: EnterNotify, + X.LeaveNotify: LeaveNotify, + X.FocusIn: FocusIn, + X.FocusOut: FocusOut, + X.KeymapNotify: KeymapNotify, + X.Expose: Expose, + X.GraphicsExpose: GraphicsExpose, + X.NoExpose: NoExpose, + X.VisibilityNotify: VisibilityNotify, + X.CreateNotify: CreateNotify, + X.DestroyNotify: DestroyNotify, + X.UnmapNotify: UnmapNotify, + X.MapNotify: MapNotify, + X.MapRequest: MapRequest, + X.ReparentNotify: ReparentNotify, + X.ConfigureNotify: ConfigureNotify, + X.ConfigureRequest: ConfigureRequest, + X.GravityNotify: GravityNotify, + X.ResizeRequest: ResizeRequest, + X.CirculateNotify: CirculateNotify, + X.CirculateRequest: CirculateRequest, + X.PropertyNotify: PropertyNotify, + X.SelectionClear: SelectionClear, + X.SelectionRequest: SelectionRequest, + X.SelectionNotify: SelectionNotify, + X.ColormapNotify: ColormapNotify, + X.ClientMessage: ClientMessage, + X.MappingNotify: MappingNotify, + } diff --git a/venv/lib/python3.12/site-packages/Xlib/protocol/request.py b/venv/lib/python3.12/site-packages/Xlib/protocol/request.py new file mode 100644 index 0000000..608a768 --- /dev/null +++ b/venv/lib/python3.12/site-packages/Xlib/protocol/request.py @@ -0,0 +1,1900 @@ +# Xlib.protocol.request -- definitions of core requests +# +# Copyright (C) 2000-2002 Peter Liljenberg +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public License +# as published by the Free Software Foundation; either version 2.1 +# of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the +# Free Software Foundation, Inc., +# 59 Temple Place, +# Suite 330, +# Boston, MA 02111-1307 USA + + +# Xlib modules +from .. import X + +# Xlib.protocol modules +from . import rq +from . import structs + + +class CreateWindow(rq.Request): + _request = rq.Struct( + rq.Opcode(1), + rq.Card8('depth'), + rq.RequestLength(), + rq.Window('wid'), + rq.Window('parent'), + rq.Int16('x'), + rq.Int16('y'), + rq.Card16('width'), + rq.Card16('height'), + rq.Card16('border_width'), + rq.Set('window_class', 2, (X.CopyFromParent, X.InputOutput, X.InputOnly)), + rq.Card32('visual'), + structs.WindowValues('attrs'), + ) + +class ChangeWindowAttributes(rq.Request): + _request = rq.Struct( + rq.Opcode(2), + rq.Pad(1), + rq.RequestLength(), + rq.Window('window'), + structs.WindowValues('attrs'), + ) + +class GetWindowAttributes(rq.ReplyRequest): + _request = rq.Struct( + rq.Opcode(3), + rq.Pad(1), + rq.RequestLength(), + rq.Window('window') + ) + + _reply = rq.Struct( + rq.ReplyCode(), + rq.Card8('backing_store'), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Card32('visual'), + rq.Card16('win_class'), + rq.Card8('bit_gravity'), + rq.Card8('win_gravity'), + rq.Card32('backing_bit_planes'), + rq.Card32('backing_pixel'), + rq.Card8('save_under'), + rq.Card8('map_is_installed'), + rq.Card8('map_state'), + rq.Card8('override_redirect'), + rq.Colormap('colormap', (X.NONE, )), + rq.Card32('all_event_masks'), + rq.Card32('your_event_mask'), + rq.Card16('do_not_propagate_mask'), + rq.Pad(2), + ) + +class DestroyWindow(rq.Request): + _request = rq.Struct( + rq.Opcode(4), + rq.Pad(1), + rq.RequestLength(), + rq.Window('window') + ) + +class DestroySubWindows(rq.Request): + _request = rq.Struct( + rq.Opcode(5), + rq.Pad(1), + rq.RequestLength(), + rq.Window('window') + ) + +class ChangeSaveSet(rq.Request): + _request = rq.Struct( + rq.Opcode(6), + rq.Set('mode', 1, (X.SetModeInsert, X.SetModeDelete)), + rq.RequestLength(), + rq.Window('window'), + ) + +class ReparentWindow(rq.Request): + _request = rq.Struct( + rq.Opcode(7), + rq.Pad(1), + rq.RequestLength(), + rq.Window('window'), + rq.Window('parent'), + rq.Int16('x'), + rq.Int16('y'), + ) + +class MapWindow(rq.Request): + _request = rq.Struct( + rq.Opcode(8), + rq.Pad(1), + rq.RequestLength(), + rq.Window('window') + ) + +class MapSubwindows(rq.Request): + _request = rq.Struct( + rq.Opcode(9), + rq.Pad(1), + rq.RequestLength(), + rq.Window('window') + ) + +class UnmapWindow(rq.Request): + _request = rq.Struct( + rq.Opcode(10), + rq.Pad(1), + rq.RequestLength(), + rq.Window('window') + ) + +class UnmapSubwindows(rq.Request): + _request = rq.Struct( + rq.Opcode(11), + rq.Pad(1), + rq.RequestLength(), + rq.Window('window') + ) + +class ConfigureWindow(rq.Request): + _request = rq.Struct( + rq.Opcode(12), + rq.Pad(1), + rq.RequestLength(), + rq.Window('window'), + rq.ValueList( 'attrs', 2, 2, + rq.Int16('x'), + rq.Int16('y'), + rq.Card16('width'), + rq.Card16('height'), + rq.Int16('border_width'), + rq.Window('sibling'), + rq.Set('stack_mode', 1, + (X.Above, X.Below, X.TopIf, + X.BottomIf, X.Opposite)) + ) + ) + +class CirculateWindow(rq.Request): + _request = rq.Struct( + rq.Opcode(13), + rq.Set('direction', 1, (X.RaiseLowest, X.LowerHighest)), + rq.RequestLength(), + rq.Window('window'), + ) + +class GetGeometry(rq.ReplyRequest): + _request = rq.Struct( + rq.Opcode(14), + rq.Pad(1), + rq.RequestLength(), + rq.Drawable('drawable') + ) + + _reply = rq.Struct ( + rq.ReplyCode(), + rq.Card8('depth'), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Window('root'), + rq.Int16('x'), + rq.Int16('y'), + rq.Card16('width'), + rq.Card16('height'), + rq.Card16('border_width'), + rq.Pad(10) + ) + +class QueryTree(rq.ReplyRequest): + _request = rq.Struct( + rq.Opcode(15), + rq.Pad(1), + rq.RequestLength(), + rq.Window('window') + ) + + _reply = rq.Struct( + rq.ReplyCode(), + rq.Pad(1), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Window('root'), + rq.Window('parent', (X.NONE, )), + rq.LengthOf('children', 2), + rq.Pad(14), + rq.List('children', rq.WindowObj), + ) + +class InternAtom(rq.ReplyRequest): + _request = rq.Struct( + rq.Opcode(16), + rq.Bool('only_if_exists'), + rq.RequestLength(), + rq.LengthOf('name', 2), + rq.Pad(2), + rq.String8('name'), + ) + + _reply = rq.Struct( + rq.ReplyCode(), + rq.Pad(1), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Card32('atom'), + rq.Pad(20), + ) + + +class GetAtomName(rq.ReplyRequest): + _request = rq.Struct( + rq.Opcode(17), + rq.Pad(1), + rq.RequestLength(), + rq.Card32('atom') + ) + + _reply = rq.Struct( + rq.ReplyCode(), + rq.Pad(1), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.LengthOf('name', 2), + rq.Pad(22), + rq.String8('name'), + ) + +class ChangeProperty(rq.Request): + _request = rq.Struct( + rq.Opcode(18), + rq.Set('mode', 1, (X.PropModeReplace, X.PropModePrepend, X.PropModeAppend)), + rq.RequestLength(), + rq.Window('window'), + rq.Card32('property'), + rq.Card32('type'), + rq.Format('data', 1), + rq.Pad(3), + rq.LengthOf('data', 4), + rq.PropertyData('data'), + ) + +class DeleteProperty(rq.Request): + _request = rq.Struct( + rq.Opcode(19), + rq.Pad(1), + rq.RequestLength(), + rq.Window('window'), + rq.Card32('property'), + ) + +class GetProperty(rq.ReplyRequest): + _request = rq.Struct( + rq.Opcode(20), + rq.Bool('delete'), + rq.RequestLength(), + rq.Window('window'), + rq.Card32('property'), + rq.Card32('type'), + rq.Card32('long_offset'), + rq.Card32('long_length'), + ) + + _reply = rq.Struct( + rq.ReplyCode(), + rq.Format('value', 1), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Card32('property_type'), + rq.Card32('bytes_after'), + rq.LengthOf('value', 4), + rq.Pad(12), + rq.PropertyData('value'), + ) + +class ListProperties(rq.ReplyRequest): + _request = rq.Struct( + rq.Opcode(21), + rq.Pad(1), + rq.RequestLength(), + rq.Window('window') + ) + + _reply = rq.Struct( + rq.ReplyCode(), + rq.Pad(1), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.LengthOf('atoms', 2), + rq.Pad(22), + rq.List('atoms', rq.Card32Obj), + ) + +class SetSelectionOwner(rq.Request): + _request = rq.Struct( + rq.Opcode(22), + rq.Pad(1), + rq.RequestLength(), + rq.Window('window'), + rq.Card32('selection'), + rq.Card32('time'), + ) + +class GetSelectionOwner(rq.ReplyRequest): + _request = rq.Struct( + rq.Opcode(23), + rq.Pad(1), + rq.RequestLength(), + rq.Card32('selection') + ) + + _reply = rq.Struct( + rq.ReplyCode(), + rq.Pad(1), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Window('owner', (X.NONE, )), + rq.Pad(20), + ) + +class ConvertSelection(rq.Request): + _request = rq.Struct( + rq.Opcode(24), + rq.Pad(1), + rq.RequestLength(), + rq.Window('requestor'), + rq.Card32('selection'), + rq.Card32('target'), + rq.Card32('property'), + rq.Card32('time'), + ) + +class SendEvent(rq.Request): + _request = rq.Struct( + rq.Opcode(25), + rq.Bool('propagate'), + rq.RequestLength(), + rq.Window('destination'), + rq.Card32('event_mask'), + rq.EventField('event'), + ) + +class GrabPointer(rq.ReplyRequest): + _request = rq.Struct( + rq.Opcode(26), + rq.Bool('owner_events'), + rq.RequestLength(), + rq.Window('grab_window'), + rq.Card16('event_mask'), + rq.Set('pointer_mode', 1, (X.GrabModeSync, X.GrabModeAsync)), + rq.Set('keyboard_mode', 1, (X.GrabModeSync, X.GrabModeAsync)), + rq.Window('confine_to', (X.NONE, )), + rq.Cursor('cursor', (X.NONE, )), + rq.Card32('time'), + ) + + _reply = rq.Struct( + rq.ReplyCode(), + rq.Card8('status'), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Pad(24), + ) + +class UngrabPointer(rq.Request): + _request = rq.Struct( + rq.Opcode(27), + rq.Pad(1), + rq.RequestLength(), + rq.Card32('time') + ) + +class GrabButton(rq.Request): + _request = rq.Struct( + rq.Opcode(28), + rq.Bool('owner_events'), + rq.RequestLength(), + rq.Window('grab_window'), + rq.Card16('event_mask'), + rq.Set('pointer_mode', 1, (X.GrabModeSync, X.GrabModeAsync)), + rq.Set('keyboard_mode', 1, (X.GrabModeSync, X.GrabModeAsync)), + rq.Window('confine_to', (X.NONE, )), + rq.Cursor('cursor', (X.NONE, )), + rq.Card8('button'), + rq.Pad(1), + rq.Card16('modifiers'), + ) + +class UngrabButton(rq.Request): + _request = rq.Struct( + rq.Opcode(29), + rq.Card8('button'), + rq.RequestLength(), + rq.Window('grab_window'), + rq.Card16('modifiers'), + rq.Pad(2), + ) + +class ChangeActivePointerGrab(rq.Request): + _request = rq.Struct( + rq.Opcode(30), + rq.Pad(1), + rq.RequestLength(), + rq.Cursor('cursor'), + rq.Card32('time'), + rq.Card16('event_mask'), + rq.Pad(2), + ) + +class GrabKeyboard(rq.ReplyRequest): + _request = rq.Struct( + rq.Opcode(31), + rq.Bool('owner_events'), + rq.RequestLength(), + rq.Window('grab_window'), + rq.Card32('time'), + rq.Set('pointer_mode', 1, (X.GrabModeSync, X.GrabModeAsync)), + rq.Set('keyboard_mode', 1, (X.GrabModeSync, X.GrabModeAsync)), + rq.Pad(2), + ) + + _reply = rq.Struct( + rq.ReplyCode(), + rq.Card8('status'), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Pad(24), + ) + +class UngrabKeyboard(rq.Request): + _request = rq.Struct( + rq.Opcode(32), + rq.Pad(1), + rq.RequestLength(), + rq.Card32('time') + ) + +class GrabKey(rq.Request): + _request = rq.Struct( + rq.Opcode(33), + rq.Bool('owner_events'), + rq.RequestLength(), + rq.Window('grab_window'), + rq.Card16('modifiers'), + rq.Card8('key'), + rq.Set('pointer_mode', 1, (X.GrabModeSync, X.GrabModeAsync)), + rq.Set('keyboard_mode', 1, (X.GrabModeSync, X.GrabModeAsync)), + rq.Pad(3), + ) + +class UngrabKey(rq.Request): + _request = rq.Struct( + rq.Opcode(34), + rq.Card8('key'), + rq.RequestLength(), + rq.Window('grab_window'), + rq.Card16('modifiers'), + rq.Pad(2), + ) + +class AllowEvents(rq.Request): + _request = rq.Struct( + rq.Opcode(35), + rq.Set('mode', 1, (X.AsyncPointer, + X.SyncPointer, + X.ReplayPointer, + X.AsyncKeyboard, + X.SyncKeyboard, + X.ReplayKeyboard, + X.AsyncBoth, + X.SyncBoth)), + rq.RequestLength(), + rq.Card32('time'), + ) + +class GrabServer(rq.Request): + _request = rq.Struct( + rq.Opcode(36), + rq.Pad(1), + rq.RequestLength(), + ) + +class UngrabServer(rq.Request): + _request = rq.Struct( + rq.Opcode(37), + rq.Pad(1), + rq.RequestLength(), + ) + +class QueryPointer(rq.ReplyRequest): + _request = rq.Struct( + rq.Opcode(38), + rq.Pad(1), + rq.RequestLength(), + rq.Window('window') + ) + + _reply = rq.Struct( + rq.ReplyCode(), + rq.Card8('same_screen'), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Window('root'), + rq.Window('child', (X.NONE, )), + rq.Int16('root_x'), + rq.Int16('root_y'), + rq.Int16('win_x'), + rq.Int16('win_y'), + rq.Card16('mask'), + rq.Pad(6), + ) + +class GetMotionEvents(rq.ReplyRequest): + _request = rq.Struct( + rq.Opcode(39), + rq.Pad(1), + rq.RequestLength(), + rq.Window('window'), + rq.Card32('start'), + rq.Card32('stop'), + ) + + _reply = rq.Struct( + rq.ReplyCode(), + rq.Pad(1), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.LengthOf('events', 4), + rq.Pad(20), + rq.List('events', structs.TimeCoord), + ) + +class TranslateCoords(rq.ReplyRequest): + _request = rq.Struct( + rq.Opcode(40), + rq.Pad(1), + rq.RequestLength(), + rq.Window('src_wid'), + rq.Window('dst_wid'), + rq.Int16('src_x'), + rq.Int16('src_y'), + ) + + _reply = rq.Struct( + rq.ReplyCode(), + rq.Card8('same_screen'), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Window('child', (X.NONE, )), + rq.Int16('x'), + rq.Int16('y'), + rq.Pad(16), + ) + +class WarpPointer(rq.Request): + _request = rq.Struct( + rq.Opcode(41), + rq.Pad(1), + rq.RequestLength(), + rq.Window('src_window'), + rq.Window('dst_window'), + rq.Int16('src_x'), + rq.Int16('src_y'), + rq.Card16('src_width'), + rq.Card16('src_height'), + rq.Int16('dst_x'), + rq.Int16('dst_y'), + ) + +class SetInputFocus(rq.Request): + _request = rq.Struct( + rq.Opcode(42), + rq.Set('revert_to', 1, (X.RevertToNone, X.RevertToPointerRoot, + X.RevertToParent)), + rq.RequestLength(), + rq.Window('focus'), + rq.Card32('time'), + ) + +class GetInputFocus(rq.ReplyRequest): + _request = rq.Struct( + rq.Opcode(43), + rq.Pad(1), + rq.RequestLength(), + ) + + _reply = rq.Struct( + rq.ReplyCode(), + rq.Card8('revert_to'), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Window('focus', (X.NONE, X.PointerRoot)), + rq.Pad(20), + ) + +class QueryKeymap(rq.ReplyRequest): + _request = rq.Struct( + rq.Opcode(44), + rq.Pad(1), + rq.RequestLength(), + ) + + _reply = rq.Struct( + rq.ReplyCode(), + rq.Pad(1), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.FixedList('map', 32, rq.Card8Obj), + ) + + +class OpenFont(rq.Request): + _request = rq.Struct( + rq.Opcode(45), + rq.Pad(1), + rq.RequestLength(), + rq.Font('fid'), + rq.LengthOf('name', 2), + rq.Pad(2), + rq.String8('name'), + ) + +class CloseFont(rq.Request): + _request = rq.Struct( + rq.Opcode(46), + rq.Pad(1), + rq.RequestLength(), + rq.Font('font') + ) + +class QueryFont(rq.ReplyRequest): + _request = rq.Struct( + rq.Opcode(47), + rq.Pad(1), + rq.RequestLength(), + rq.Fontable('font') + ) + + _reply = rq.Struct( + rq.ReplyCode(), + rq.Pad(1), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Object('min_bounds', structs.CharInfo), + rq.Pad(4), + rq.Object('max_bounds', structs.CharInfo), + rq.Pad(4), + rq.Card16('min_char_or_byte2'), + rq.Card16('max_char_or_byte2'), + rq.Card16('default_char'), + rq.LengthOf('properties', 2), + rq.Card8('draw_direction'), + rq.Card8('min_byte1'), + rq.Card8('max_byte1'), + rq.Card8('all_chars_exist'), + rq.Int16('font_ascent'), + rq.Int16('font_descent'), + rq.LengthOf('char_infos', 4), + rq.List('properties', structs.FontProp), + rq.List('char_infos', structs.CharInfo), + ) + +class QueryTextExtents(rq.ReplyRequest): + _request = rq.Struct( + rq.Opcode(48), + rq.OddLength('string'), + rq.RequestLength(), + rq.Fontable('font'), + rq.String16('string'), + ) + + _reply = rq.Struct( + rq.ReplyCode(), + rq.Card8('draw_direction'), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Int16('font_ascent'), + rq.Int16('font_descent'), + rq.Int16('overall_ascent'), + rq.Int16('overall_descent'), + rq.Int32('overall_width'), + rq.Int32('overall_left'), + rq.Int32('overall_right'), + rq.Pad(4), + ) + +class ListFonts(rq.ReplyRequest): + _request = rq.Struct( + rq.Opcode(49), + rq.Pad(1), + rq.RequestLength(), + rq.Card16('max_names'), + rq.LengthOf('pattern', 2), + rq.String8('pattern'), + ) + + _reply = rq.Struct( + rq.ReplyCode(), + rq.Pad(1), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.LengthOf('fonts', 2), + rq.Pad(22), + rq.List('fonts', rq.Str), + ) + + +class ListFontsWithInfo(rq.ReplyRequest): + _request = rq.Struct( + rq.Opcode(50), + rq.Pad(1), + rq.RequestLength(), + rq.Card16('max_names'), + rq.LengthOf('pattern', 2), + rq.String8('pattern'), + ) + + _reply = rq.Struct( + rq.ReplyCode(), + rq.LengthOf('name', 1), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Object('min_bounds', structs.CharInfo), + rq.Pad(4), + rq.Object('max_bounds', structs.CharInfo), + rq.Pad(4), + rq.Card16('min_char_or_byte2'), + rq.Card16('max_char_or_byte2'), + rq.Card16('default_char'), + rq.LengthOf('properties', 2), + rq.Card8('draw_direction'), + rq.Card8('min_byte1'), + rq.Card8('max_byte1'), + rq.Card8('all_chars_exist'), + rq.Int16('font_ascent'), + rq.Int16('font_descent'), + rq.Card32('replies_hint'), + rq.List('properties', structs.FontProp), + rq.String8('name'), + ) + + + # Somebody must have smoked some really wicked weed when they + # defined the ListFontsWithInfo request: + # The server sends a reply for _each_ matching font... + # It then sends a special reply (name length == 0) to indicate + # that there are no more fonts in the reply. + + # This means that we have to do some special parsing to see if + # we have got the end-of-reply reply. If we haven't, we + # have to reinsert the request in the front of the + # display.sent_request queue to catch the next response. + + # Bastards. + + def __init__(self, *args, **keys): + self._fonts = [] + rq.ReplyRequest.__init__(self, *args, **keys) + + def _parse_response(self, data): + + if ord(data[1]) == 0: + self._response_lock.acquire() + self._data = self._fonts + del self._fonts + self._response_lock.release() + return + + r, d = self._reply.parse_binary(data) + self._fonts.append(r) + + self._display.sent_requests.insert(0, self) + + + # Override the default __getattr__, since it isn't usable for + # the list reply. Instead provide a __getitem__ and a __len__. + + def __getattr__(self, attr): + raise AttributeError(attr) + + def __getitem__(self, item): + return self._data[item] + + def __len__(self): + return len(self._data) + + +class SetFontPath(rq.Request): + _request = rq.Struct( + rq.Opcode(51), + rq.Pad(1), + rq.RequestLength(), + rq.LengthOf('path', 2), + rq.Pad(2), + rq.List('path', rq.Str), + ) + +class GetFontPath(rq.ReplyRequest): + _request = rq.Struct( + rq.Opcode(52), + rq.Pad(1), + rq.RequestLength(), + ) + + _reply = rq.Struct( + rq.ReplyCode(), + rq.Pad(1), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.LengthOf('paths', 2), + rq.Pad(22), + rq.List('paths', rq.Str), + ) + +class CreatePixmap(rq.Request): + _request = rq.Struct( + rq.Opcode(53), + rq.Card8('depth'), + rq.RequestLength(), + rq.Pixmap('pid'), + rq.Drawable('drawable'), + rq.Card16('width'), + rq.Card16('height'), + ) + +class FreePixmap(rq.Request): + _request = rq.Struct( + rq.Opcode(54), + rq.Pad(1), + rq.RequestLength(), + rq.Pixmap('pixmap') + ) + +class CreateGC(rq.Request): + _request = rq.Struct( + rq.Opcode(55), + rq.Pad(1), + rq.RequestLength(), + rq.GC('cid'), + rq.Drawable('drawable'), + structs.GCValues('attrs'), + ) + +class ChangeGC(rq.Request): + _request = rq.Struct( + rq.Opcode(56), + rq.Pad(1), + rq.RequestLength(), + rq.GC('gc'), + structs.GCValues('attrs'), + ) + +class CopyGC(rq.Request): + _request = rq.Struct( + rq.Opcode(57), + rq.Pad(1), + rq.RequestLength(), + rq.GC('src_gc'), + rq.GC('dst_gc'), + rq.Card32('mask'), + ) + +class SetDashes(rq.Request): + _request = rq.Struct( + rq.Opcode(58), + rq.Pad(1), + rq.RequestLength(), + rq.GC('gc'), + rq.Card16('dash_offset'), + rq.LengthOf('dashes', 2), + rq.List('dashes', rq.Card8Obj), + ) + +class SetClipRectangles(rq.Request): + _request = rq.Struct( + rq.Opcode(59), + rq.Set('ordering', 1, (X.Unsorted, X.YSorted, X.YXSorted, X.YXBanded)), + rq.RequestLength(), + rq.GC('gc'), + rq.Int16('x_origin'), + rq.Int16('y_origin'), + rq.List('rectangles', structs.Rectangle), + ) + +class FreeGC(rq.Request): + _request = rq.Struct( + rq.Opcode(60), + rq.Pad(1), + rq.RequestLength(), + rq.GC('gc') + ) + +class ClearArea(rq.Request): + _request = rq.Struct( + rq.Opcode(61), + rq.Bool('exposures'), + rq.RequestLength(), + rq.Window('window'), + rq.Int16('x'), + rq.Int16('y'), + rq.Card16('width'), + rq.Card16('height'), + ) + +class CopyArea(rq.Request): + _request = rq.Struct( + rq.Opcode(62), + rq.Pad(1), + rq.RequestLength(), + rq.Drawable('src_drawable'), + rq.Drawable('dst_drawable'), + rq.GC('gc'), + rq.Int16('src_x'), + rq.Int16('src_y'), + rq.Int16('dst_x'), + rq.Int16('dst_y'), + rq.Card16('width'), + rq.Card16('height'), + ) + +class CopyPlane(rq.Request): + _request = rq.Struct( + rq.Opcode(63), + rq.Pad(1), + rq.RequestLength(), + rq.Drawable('src_drawable'), + rq.Drawable('dst_drawable'), + rq.GC('gc'), + rq.Int16('src_x'), + rq.Int16('src_y'), + rq.Int16('dst_x'), + rq.Int16('dst_y'), + rq.Card16('width'), + rq.Card16('height'), + rq.Card32('bit_plane'), + ) + +class PolyPoint(rq.Request): + _request = rq.Struct( + rq.Opcode(64), + rq.Set('coord_mode', 1, (X.CoordModeOrigin, X.CoordModePrevious)), + rq.RequestLength(), + rq.Drawable('drawable'), + rq.GC('gc'), + rq.List('points', structs.Point), + ) + +class PolyLine(rq.Request): + _request = rq.Struct( + rq.Opcode(65), + rq.Set('coord_mode', 1, (X.CoordModeOrigin, X.CoordModePrevious)), + rq.RequestLength(), + rq.Drawable('drawable'), + rq.GC('gc'), + rq.List('points', structs.Point), + ) + + +class PolySegment(rq.Request): + _request = rq.Struct( + rq.Opcode(66), + rq.Pad(1), + rq.RequestLength(), + rq.Drawable('drawable'), + rq.GC('gc'), + rq.List('segments', structs.Segment), + ) + + +class PolyRectangle(rq.Request): + _request = rq.Struct( + rq.Opcode(67), + rq.Pad(1), + rq.RequestLength(), + rq.Drawable('drawable'), + rq.GC('gc'), + rq.List('rectangles', structs.Rectangle), + ) + +class PolyArc(rq.Request): + _request = rq.Struct( + rq.Opcode(68), + rq.Pad(1), + rq.RequestLength(), + rq.Drawable('drawable'), + rq.GC('gc'), + rq.List('arcs', structs.Arc), + ) + +class FillPoly(rq.Request): + _request = rq.Struct( + rq.Opcode(69), + rq.Pad(1), + rq.RequestLength(), + rq.Drawable('drawable'), + rq.GC('gc'), + rq.Set('shape', 1, (X.Complex, X.Nonconvex, X.Convex)), + rq.Set('coord_mode', 1, (X.CoordModeOrigin, X.CoordModePrevious)), + rq.Pad(2), + rq.List('points', structs.Point), + ) + +class PolyFillRectangle(rq.Request): + _request = rq.Struct( + rq.Opcode(70), + rq.Pad(1), + rq.RequestLength(), + rq.Drawable('drawable'), + rq.GC('gc'), + rq.List('rectangles', structs.Rectangle), + ) + +class PolyFillArc(rq.Request): + _request = rq.Struct( + rq.Opcode(71), + rq.Pad(1), + rq.RequestLength(), + rq.Drawable('drawable'), + rq.GC('gc'), + rq.List('arcs', structs.Arc), + ) + +class PutImage(rq.Request): + _request = rq.Struct( + rq.Opcode(72), + rq.Set('format', 1, (X.XYBitmap, X.XYPixmap, X.ZPixmap)), + rq.RequestLength(), + rq.Drawable('drawable'), + rq.GC('gc'), + rq.Card16('width'), + rq.Card16('height'), + rq.Int16('dst_x'), + rq.Int16('dst_y'), + rq.Card8('left_pad'), + rq.Card8('depth'), + rq.Pad(2), + rq.Binary('data'), + ) + +class GetImage(rq.ReplyRequest): + _request = rq.Struct( + rq.Opcode(73), + rq.Set('format', 1, (X.XYPixmap, X.ZPixmap)), + rq.RequestLength(), + rq.Drawable('drawable'), + rq.Int16('x'), + rq.Int16('y'), + rq.Card16('width'), + rq.Card16('height'), + rq.Card32('plane_mask'), + ) + + _reply = rq.Struct( + rq.ReplyCode(), + rq.Card8('depth'), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Card32('visual'), + rq.Pad(20), + rq.Binary('data'), + ) + +class PolyText8(rq.Request): + _request = rq.Struct( + rq.Opcode(74), + rq.Pad(1), + rq.RequestLength(), + rq.Drawable('drawable'), + rq.GC('gc'), + rq.Int16('x'), + rq.Int16('y'), + rq.TextElements8('items'), + ) + +class PolyText16(rq.Request): + _request = rq.Struct( + rq.Opcode(75), + rq.Pad(1), + rq.RequestLength(), + rq.Drawable('drawable'), + rq.GC('gc'), + rq.Int16('x'), + rq.Int16('y'), + rq.TextElements16('items'), + ) + +class ImageText8(rq.Request): + _request = rq.Struct( + rq.Opcode(76), + rq.LengthOf('string', 1), + rq.RequestLength(), + rq.Drawable('drawable'), + rq.GC('gc'), + rq.Int16('x'), + rq.Int16('y'), + rq.String8('string'), + ) + +class ImageText16(rq.Request): + _request = rq.Struct( + rq.Opcode(77), + rq.LengthOf('string', 1), + rq.RequestLength(), + rq.Drawable('drawable'), + rq.GC('gc'), + rq.Int16('x'), + rq.Int16('y'), + rq.String16('string'), + ) + +class CreateColormap(rq.Request): + _request = rq.Struct( + rq.Opcode(78), + rq.Set('alloc', 1, (X.AllocNone, X.AllocAll)), + rq.RequestLength(), + rq.Colormap('mid'), + rq.Window('window'), + rq.Card32('visual'), + ) + +class FreeColormap(rq.Request): + _request = rq.Struct( + rq.Opcode(79), + rq.Pad(1), + rq.RequestLength(), + rq.Colormap('cmap') + ) + +class CopyColormapAndFree(rq.Request): + _request = rq.Struct( + rq.Opcode(80), + rq.Pad(1), + rq.RequestLength(), + rq.Colormap('mid'), + rq.Colormap('src_cmap'), + ) + +class InstallColormap(rq.Request): + _request = rq.Struct( + rq.Opcode(81), + rq.Pad(1), + rq.RequestLength(), + rq.Colormap('cmap') + ) + +class UninstallColormap(rq.Request): + _request = rq.Struct( + rq.Opcode(82), + rq.Pad(1), + rq.RequestLength(), + rq.Colormap('cmap') + ) + +class ListInstalledColormaps(rq.ReplyRequest): + _request = rq.Struct( + rq.Opcode(83), + rq.Pad(1), + rq.RequestLength(), + rq.Window('window') + ) + + _reply = rq.Struct( + rq.ReplyCode(), + rq.Pad(1), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.LengthOf('cmaps', 2), + rq.Pad(22), + rq.List('cmaps', rq.ColormapObj), + ) + +class AllocColor(rq.ReplyRequest): + _request = rq.Struct( + rq.Opcode(84), + rq.Pad(1), + rq.RequestLength(), + rq.Colormap('cmap'), + rq.Card16('red'), + rq.Card16('green'), + rq.Card16('blue'), + rq.Pad(2), + ) + + _reply = rq.Struct( + rq.ReplyCode(), + rq.Pad(1), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Card16('red'), + rq.Card16('green'), + rq.Card16('blue'), + rq.Pad(2), + rq.Card32('pixel'), + rq.Pad(12), + ) + +class AllocNamedColor(rq.ReplyRequest): + _request = rq.Struct( + rq.Opcode(85), + rq.Pad(1), + rq.RequestLength(), + rq.Colormap('cmap'), + rq.LengthOf('name', 2), + rq.Pad(2), + rq.String8('name'), + ) + + _reply = rq.Struct( + rq.ReplyCode(), + rq.Pad(1), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Card32('pixel'), + rq.Card16('exact_red'), + rq.Card16('exact_green'), + rq.Card16('exact_blue'), + rq.Card16('screen_red'), + rq.Card16('screen_green'), + rq.Card16('screen_blue'), + rq.Pad(8), + ) + +class AllocColorCells(rq.ReplyRequest): + _request = rq.Struct( + rq.Opcode(86), + rq.Bool('contiguous'), + rq.RequestLength(), + rq.Colormap('cmap'), + rq.Card16('colors'), + rq.Card16('planes'), + ) + + _reply = rq.Struct( + rq.ReplyCode(), + rq.Pad(1), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.LengthOf('pixels', 2), + rq.LengthOf('masks', 2), + rq.Pad(20), + rq.List('pixels', rq.Card32Obj), + rq.List('masks', rq.Card32Obj), + ) + +class AllocColorPlanes(rq.ReplyRequest): + _request = rq.Struct( + rq.Opcode(87), + rq.Bool('contiguous'), + rq.RequestLength(), + rq.Colormap('cmap'), + rq.Card16('colors'), + rq.Card16('red'), + rq.Card16('green'), + rq.Card16('blue'), + ) + + _reply = rq.Struct( + rq.ReplyCode(), + rq.Pad(1), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.LengthOf('pixels', 2), + rq.Pad(2), + rq.Card32('red_mask'), + rq.Card32('green_mask'), + rq.Card32('blue_mask'), + rq.Pad(8), + rq.List('pixels', rq.Card32Obj), + ) + +class FreeColors(rq.Request): + _request = rq.Struct( + rq.Opcode(88), + rq.Pad(1), + rq.RequestLength(), + rq.Colormap('cmap'), + rq.Card32('plane_mask'), + rq.List('pixels', rq.Card32Obj), + ) + +class StoreColors(rq.Request): + _request = rq.Struct( + rq.Opcode(89), + rq.Pad(1), + rq.RequestLength(), + rq.Colormap('cmap'), + rq.List('items', structs.ColorItem), + ) + +class StoreNamedColor(rq.Request): + _request = rq.Struct( + rq.Opcode(90), + rq.Card8('flags'), + rq.RequestLength(), + rq.Colormap('cmap'), + rq.Card32('pixel'), + rq.LengthOf('name', 2), + rq.Pad(2), + rq.String8('name'), + ) + +class QueryColors(rq.ReplyRequest): + _request = rq.Struct( + rq.Opcode(91), + rq.Pad(1), + rq.RequestLength(), + rq.Colormap('cmap'), + rq.List('pixels', rq.Card32Obj), + ) + + _reply = rq.Struct( + rq.ReplyCode(), + rq.Pad(1), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.LengthOf('colors', 2), + rq.Pad(22), + rq.List('colors', structs.RGB), + ) + +class LookupColor(rq.ReplyRequest): + _request = rq.Struct( + rq.Opcode(92), + rq.Pad(1), + rq.RequestLength(), + rq.Colormap('cmap'), + rq.LengthOf('name', 2), + rq.Pad(2), + rq.String8('name'), + ) + + _reply = rq.Struct( + rq.ReplyCode(), + rq.Pad(1), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Card16('exact_red'), + rq.Card16('exact_green'), + rq.Card16('exact_blue'), + rq.Card16('screen_red'), + rq.Card16('screen_green'), + rq.Card16('screen_blue'), + rq.Pad(12), + ) + + +class CreateCursor(rq.Request): + _request = rq.Struct( + rq.Opcode(93), + rq.Pad(1), + rq.RequestLength(), + rq.Cursor('cid'), + rq.Pixmap('source'), + rq.Pixmap('mask'), + rq.Card16('fore_red'), + rq.Card16('fore_green'), + rq.Card16('fore_blue'), + rq.Card16('back_red'), + rq.Card16('back_green'), + rq.Card16('back_blue'), + rq.Card16('x'), + rq.Card16('y'), + ) + +class CreateGlyphCursor(rq.Request): + _request = rq.Struct( + rq.Opcode(94), + rq.Pad(1), + rq.RequestLength(), + rq.Cursor('cid'), + rq.Font('source'), + rq.Font('mask'), + rq.Card16('source_char'), + rq.Card16('mask_char'), + rq.Card16('fore_red'), + rq.Card16('fore_green'), + rq.Card16('fore_blue'), + rq.Card16('back_red'), + rq.Card16('back_green'), + rq.Card16('back_blue'), + ) + +class FreeCursor(rq.Request): + _request = rq.Struct( + rq.Opcode(95), + rq.Pad(1), + rq.RequestLength(), + rq.Cursor('cursor') + ) + +class RecolorCursor(rq.Request): + _request = rq.Struct( + rq.Opcode(96), + rq.Pad(1), + rq.RequestLength(), + rq.Cursor('cursor'), + rq.Card16('fore_red'), + rq.Card16('fore_green'), + rq.Card16('fore_blue'), + rq.Card16('back_red'), + rq.Card16('back_green'), + rq.Card16('back_blue'), + ) + +class QueryBestSize(rq.ReplyRequest): + _request = rq.Struct( + rq.Opcode(97), + rq.Set('item_class', 1, (X.CursorShape, X.TileShape, X.StippleShape)), + rq.RequestLength(), + rq.Drawable('drawable'), + rq.Card16('width'), + rq.Card16('height'), + ) + + _reply = rq.Struct( + rq.ReplyCode(), + rq.Pad(1), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Card16('width'), + rq.Card16('height'), + rq.Pad(20), + ) + +class QueryExtension(rq.ReplyRequest): + _request = rq.Struct( + rq.Opcode(98), + rq.Pad(1), + rq.RequestLength(), + rq.LengthOf('name', 2), + rq.Pad(2), + rq.String8('name'), + ) + + _reply = rq.Struct( + rq.ReplyCode(), + rq.Pad(1), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Card8('present'), + rq.Card8('major_opcode'), + rq.Card8('first_event'), + rq.Card8('first_error'), + rq.Pad(20), + ) + +class ListExtensions(rq.ReplyRequest): + _request = rq.Struct( + rq.Opcode(99), + rq.Pad(1), + rq.RequestLength(), + ) + + _reply = rq.Struct( + rq.ReplyCode(), + rq.LengthOf('names', 1), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Pad(24), + rq.List('names', rq.Str), + ) + +class ChangeKeyboardMapping(rq.Request): + _request = rq.Struct( + rq.Opcode(100), + rq.LengthOf('keysyms', 1), + rq.RequestLength(), + rq.Card8('first_keycode'), + rq.Format('keysyms', 1), + rq.Pad(2), + rq.KeyboardMapping('keysyms'), + ) + +class GetKeyboardMapping(rq.ReplyRequest): + _request = rq.Struct( + rq.Opcode(101), + rq.Pad(1), + rq.RequestLength(), + rq.Card8('first_keycode'), + rq.Card8('count'), + rq.Pad(2), + ) + + _reply = rq.Struct( + rq.ReplyCode(), + rq.Format('keysyms', 1), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Pad(24), + rq.KeyboardMapping('keysyms'), + ) + + +class ChangeKeyboardControl(rq.Request): + _request = rq.Struct( + rq.Opcode(102), + rq.Pad(1), + rq.RequestLength(), + rq.ValueList( 'attrs', 4, 0, + rq.Int8('key_click_percent'), + rq.Int8('bell_percent'), + rq.Int16('bell_pitch'), + rq.Int16('bell_duration'), + rq.Card8('led'), + rq.Set('led_mode', 1, (X.LedModeOff, X.LedModeOn)), + rq.Card8('key'), + rq.Set('auto_repeat_mode', 1, (X.AutoRepeatModeOff, + X.AutoRepeatModeOn, + X.AutoRepeatModeDefault)) + ) + ) + +class GetKeyboardControl(rq.ReplyRequest): + _request = rq.Struct( + rq.Opcode(103), + rq.Pad(1), + rq.RequestLength(), + ) + + _reply = rq.Struct( + rq.ReplyCode(), + rq.Card8('global_auto_repeat'), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Card32('led_mask'), + rq.Card8('key_click_percent'), + rq.Card8('bell_percent'), + rq.Card16('bell_pitch'), + rq.Card16('bell_duration'), + rq.Pad(2), + rq.FixedList('auto_repeats', 32, rq.Card8Obj), + ) + +class Bell(rq.Request): + _request = rq.Struct( + rq.Opcode(104), + rq.Int8('percent'), + rq.RequestLength(), + ) + +class ChangePointerControl(rq.Request): + _request = rq.Struct( + rq.Opcode(105), + rq.Pad(1), + rq.RequestLength(), + rq.Int16('accel_num'), + rq.Int16('accel_denum'), + rq.Int16('threshold'), + rq.Bool('do_accel'), + rq.Bool('do_thresh'), + ) + +class GetPointerControl(rq.ReplyRequest): + _request = rq.Struct( + rq.Opcode(106), + rq.Pad(1), + rq.RequestLength(), + ) + + _reply = rq.Struct( + rq.ReplyCode(), + rq.Pad(1), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Card16('accel_num'), + rq.Card16('accel_denom'), + rq.Card16('threshold'), + rq.Pad(18), + ) + +class SetScreenSaver(rq.Request): + _request = rq.Struct( + rq.Opcode(107), + rq.Pad(1), + rq.RequestLength(), + rq.Int16('timeout'), + rq.Int16('interval'), + rq.Set('prefer_blank', 1, (X.DontPreferBlanking, + X.PreferBlanking, + X.DefaultBlanking)), + rq.Set('allow_exposures', 1, (X.DontAllowExposures, + X.AllowExposures, + X.DefaultExposures)), + rq.Pad(2), + ) + +class GetScreenSaver(rq.ReplyRequest): + _request = rq.Struct( + rq.Opcode(108), + rq.Pad(1), + rq.RequestLength(), + ) + + _reply = rq.Struct( + rq.ReplyCode(), + rq.Pad(1), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Card16('timeout'), + rq.Card16('interval'), + rq.Card8('prefer_blanking'), + rq.Card8('allow_exposures'), + rq.Pad(18), + ) + +class ChangeHosts(rq.Request): + _request = rq.Struct( + rq.Opcode(109), + rq.Set('mode', 1, (X.HostInsert, X.HostDelete)), + rq.RequestLength(), + rq.Set('host_family', 1, (X.FamilyInternet, X.FamilyDECnet, X.FamilyChaos, + X.FamilyServerInterpreted, X.FamilyInternetV6)), + rq.Pad(1), + rq.LengthOf('host', 2), + rq.List('host', rq.Card8Obj) + ) + +class ListHosts(rq.ReplyRequest): + _request = rq.Struct( + rq.Opcode(110), + rq.Pad(1), + rq.RequestLength(), + ) + + _reply = rq.Struct( + rq.ReplyCode(), + rq.Card8('mode'), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.LengthOf('hosts', 2), + rq.Pad(22), + rq.List('hosts', structs.Host), + ) + +class SetAccessControl(rq.Request): + _request = rq.Struct( + rq.Opcode(111), + rq.Set('mode', 1, (X.DisableAccess, X.EnableAccess)), + rq.RequestLength(), + ) + +class SetCloseDownMode(rq.Request): + _request = rq.Struct( + rq.Opcode(112), + rq.Set('mode', 1, (X.DestroyAll, X.RetainPermanent, X.RetainTemporary)), + rq.RequestLength(), + ) + +class KillClient(rq.Request): + _request = rq.Struct( + rq.Opcode(113), + rq.Pad(1), + rq.RequestLength(), + rq.Resource('resource') + ) + +class RotateProperties(rq.Request): + _request = rq.Struct( + rq.Opcode(114), + rq.Pad(1), + rq.RequestLength(), + rq.Window('window'), + rq.LengthOf('properties', 2), + rq.Int16('delta'), + rq.List('properties', rq.Card32Obj), + ) + +class ForceScreenSaver(rq.Request): + _request = rq.Struct( + rq.Opcode(115), + rq.Set('mode', 1, (X.ScreenSaverReset, X.ScreenSaverActive)), + rq.RequestLength(), + ) + +class SetPointerMapping(rq.ReplyRequest): + _request = rq.Struct( + rq.Opcode(116), + rq.LengthOf('map', 1), + rq.RequestLength(), + rq.List('map', rq.Card8Obj), + ) + + _reply = rq.Struct( + rq.ReplyCode(), + rq.Card8('status'), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Pad(24), + ) + +class GetPointerMapping(rq.ReplyRequest): + _request = rq.Struct( + rq.Opcode(117), + rq.Pad(1), + rq.RequestLength(), + ) + + _reply = rq.Struct( + rq.ReplyCode(), + rq.LengthOf('map', 1), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Pad(24), + rq.List('map', rq.Card8Obj), + ) + +class SetModifierMapping(rq.ReplyRequest): + _request = rq.Struct( + rq.Opcode(118), + rq.Format('keycodes', 1), + rq.RequestLength(), + rq.ModifierMapping('keycodes') + ) + + _reply = rq.Struct( + rq.ReplyCode(), + rq.Card8('status'), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Pad(24), + ) + +class GetModifierMapping(rq.ReplyRequest): + _request = rq.Struct( + rq.Opcode(119), + rq.Pad(1), + rq.RequestLength(), + ) + + _reply = rq.Struct( + rq.ReplyCode(), + rq.Format('keycodes', 1), + rq.Card16('sequence_number'), + rq.ReplyLength(), + rq.Pad(24), + rq.ModifierMapping('keycodes') + ) + +class NoOperation(rq.Request): + _request = rq.Struct( + rq.Opcode(127), + rq.Pad(1), + rq.RequestLength(), + ) + + +major_codes = { + 1: CreateWindow, + 2: ChangeWindowAttributes, + 3: GetWindowAttributes, + 4: DestroyWindow, + 5: DestroySubWindows, + 6: ChangeSaveSet, + 7: ReparentWindow, + 8: MapWindow, + 9: MapSubwindows, + 10: UnmapWindow, + 11: UnmapSubwindows, + 12: ConfigureWindow, + 13: CirculateWindow, + 14: GetGeometry, + 15: QueryTree, + 16: InternAtom, + 17: GetAtomName, + 18: ChangeProperty, + 19: DeleteProperty, + 20: GetProperty, + 21: ListProperties, + 22: SetSelectionOwner, + 23: GetSelectionOwner, + 24: ConvertSelection, + 25: SendEvent, + 26: GrabPointer, + 27: UngrabPointer, + 28: GrabButton, + 29: UngrabButton, + 30: ChangeActivePointerGrab, + 31: GrabKeyboard, + 32: UngrabKeyboard, + 33: GrabKey, + 34: UngrabKey, + 35: AllowEvents, + 36: GrabServer, + 37: UngrabServer, + 38: QueryPointer, + 39: GetMotionEvents, + 40: TranslateCoords, + 41: WarpPointer, + 42: SetInputFocus, + 43: GetInputFocus, + 44: QueryKeymap, + 45: OpenFont, + 46: CloseFont, + 47: QueryFont, + 48: QueryTextExtents, + 49: ListFonts, + 50: ListFontsWithInfo, + 51: SetFontPath, + 52: GetFontPath, + 53: CreatePixmap, + 54: FreePixmap, + 55: CreateGC, + 56: ChangeGC, + 57: CopyGC, + 58: SetDashes, + 59: SetClipRectangles, + 60: FreeGC, + 61: ClearArea, + 62: CopyArea, + 63: CopyPlane, + 64: PolyPoint, + 65: PolyLine, + 66: PolySegment, + 67: PolyRectangle, + 68: PolyArc, + 69: FillPoly, + 70: PolyFillRectangle, + 71: PolyFillArc, + 72: PutImage, + 73: GetImage, + 74: PolyText8, + 75: PolyText16, + 76: ImageText8, + 77: ImageText16, + 78: CreateColormap, + 79: FreeColormap, + 80: CopyColormapAndFree, + 81: InstallColormap, + 82: UninstallColormap, + 83: ListInstalledColormaps, + 84: AllocColor, + 85: AllocNamedColor, + 86: AllocColorCells, + 87: AllocColorPlanes, + 88: FreeColors, + 89: StoreColors, + 90: StoreNamedColor, + 91: QueryColors, + 92: LookupColor, + 93: CreateCursor, + 94: CreateGlyphCursor, + 95: FreeCursor, + 96: RecolorCursor, + 97: QueryBestSize, + 98: QueryExtension, + 99: ListExtensions, + 100: ChangeKeyboardMapping, + 101: GetKeyboardMapping, + 102: ChangeKeyboardControl, + 103: GetKeyboardControl, + 104: Bell, + 105: ChangePointerControl, + 106: GetPointerControl, + 107: SetScreenSaver, + 108: GetScreenSaver, + 109: ChangeHosts, + 110: ListHosts, + 111: SetAccessControl, + 112: SetCloseDownMode, + 113: KillClient, + 114: RotateProperties, + 115: ForceScreenSaver, + 116: SetPointerMapping, + 117: GetPointerMapping, + 118: SetModifierMapping, + 119: GetModifierMapping, + 127: NoOperation, + } diff --git a/venv/lib/python3.12/site-packages/Xlib/protocol/rq.py b/venv/lib/python3.12/site-packages/Xlib/protocol/rq.py new file mode 100644 index 0000000..c54804e --- /dev/null +++ b/venv/lib/python3.12/site-packages/Xlib/protocol/rq.py @@ -0,0 +1,1463 @@ +# Xlib.protocol.rq -- structure primitives for request, events and errors +# +# Copyright (C) 2000-2002 Peter Liljenberg +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public License +# as published by the Free Software Foundation; either version 2.1 +# of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the +# Free Software Foundation, Inc., +# 59 Temple Place, +# Suite 330, +# Boston, MA 02111-1307 USA + +# Standard modules +import sys +import traceback +import struct +from array import array + +# Python 2/3 compatibility. +from six import PY3, binary_type, byte2int, indexbytes, iterbytes + +# Xlib modules +from .. import X +from ..support import lock + + +def decode_string(bs): + return bs.decode('latin1') + +if PY3: + def encode_array(a): + return a.tobytes() +else: + def encode_array(a): + return a.tostring() + + +class BadDataError(Exception): pass + +# These are struct codes, we know their byte sizes + +signed_codes = { 1: 'b', 2: 'h', 4: 'l' } +unsigned_codes = { 1: 'B', 2: 'H', 4: 'L' } + + +# Unfortunately, we don't know the array sizes of B, H and L, since +# these use the underlying architecture's size for a char, short and +# long. Therefore we probe for their sizes, and additionally create +# a mapping that translates from struct codes to array codes. +# +# Bleah. + +array_unsigned_codes = { } +struct_to_array_codes = { } + +for c in 'bhil': + size = array(c).itemsize + array_unsigned_codes[size] = c.upper() + try: + struct_to_array_codes[signed_codes[size]] = c + struct_to_array_codes[unsigned_codes[size]] = c.upper() + except KeyError: + pass + +# print array_unsigned_codes, struct_to_array_codes + + +class Field(object): + """Field objects represent the data fields of a Struct. + + Field objects must have the following attributes: + + name -- the field name, or None + structcode -- the struct codes representing this field + structvalues -- the number of values encodes by structcode + + Additionally, these attributes should either be None or real methods: + + check_value -- check a value before it is converted to binary + parse_value -- parse a value after it has been converted from binary + + If one of these attributes are None, no check or additional + parsings will be done one values when converting to or from binary + form. Otherwise, the methods should have the following behaviour: + + newval = check_value(val) + Check that VAL is legal when converting to binary form. The + value can also be converted to another Python value. In any + case, return the possibly new value. NEWVAL should be a + single Python value if structvalues is 1, a tuple of + structvalues elements otherwise. + + newval = parse_value(val, display) + VAL is an unpacked Python value, which now can be further + refined. DISPLAY is the current Display object. Return the + new value. VAL will be a single value if structvalues is 1, + a tuple of structvalues elements otherwise. + + If `structcode' is None the Field must have the method + f.parse_binary_value() instead. See its documentation string for + details. + """ + name = None + default = None + + structcode = None + structvalues = 0 + + check_value = None + parse_value = None + + keyword_args = False + + def __init__(self): + pass + + def parse_binary_value(self, data, display, length, format): + """value, remaindata = f.parse_binary_value(data, display, length, format) + + Decode a value for this field from the binary string DATA. + If there are a LengthField and/or a FormatField connected to this + field, their values will be LENGTH and FORMAT, respectively. If + there are no such fields the parameters will be None. + + DISPLAY is the display involved, which is really only used by + the Resource fields. + + The decoded value is returned as VALUE, and the remaining part + of DATA shold be returned as REMAINDATA. + """ + raise RuntimeError('Neither structcode or parse_binary_value ' \ + 'provided for {0}'.format(self)) + + +class Pad(Field): + def __init__(self, size): + self.size = size + self.value = b'\0' * size + self.structcode = '{0}x'.format(size) + self.structvalues = 0 + + +class ConstantField(Field): + def __init__(self, value): + self.value = value + + +class Opcode(ConstantField): + structcode = 'B' + structvalues = 1 + +class ReplyCode(ConstantField): + structcode = 'B' + structvalues = 1 + + def __init__(self): + self.value = 1 + +class LengthField(Field): + """A LengthField stores the length of some other Field whose size + may vary, e.g. List and String8. + + Its name should be the same as the name of the field whose size + it stores. The other_fields attribute can be used to specify the + names of other fields whose sizes are stored by this field, so + a single length field can set the length of multiple fields. + + The lf.get_binary_value() method of LengthFields is not used, instead + a lf.get_binary_length() should be provided. + + Unless LengthField.get_binary_length() is overridden in child classes, + there should also be a lf.calc_length(). + """ + structcode = 'L' + structvalues = 1 + other_fields = None + + def calc_length(self, length): + """newlen = lf.calc_length(length) + + Return a new length NEWLEN based on the provided LENGTH. + """ + + return length + + +class TotalLengthField(LengthField): + pass + +class RequestLength(TotalLengthField): + structcode = 'H' + structvalues = 1 + + def calc_length(self, length): + return length // 4 + +class ReplyLength(TotalLengthField): + structcode = 'L' + structvalues = 1 + + def calc_length(self, length): + return (length - 32) // 4 + + +class LengthOf(LengthField): + def __init__(self, name, size): + if isinstance(name, (list, tuple)): + self.name = name[0] + self.other_fields = name[1:] + else: + self.name = name + self.structcode = unsigned_codes[size] + + +class OddLength(LengthField): + structcode = 'B' + structvalues = 1 + + def __init__(self, name): + self.name = name + + def calc_length(self, length): + return length % 2 + + def parse_value(self, value, display): + if value == 0: + return 'even' + else: + return 'odd' + + +class FormatField(Field): + """A FormatField encodes the format of some other field, in a manner + similar to LengthFields. + + The ff.get_binary_value() method is not used, replaced by + ff.get_binary_format(). + """ + + structvalues = 1 + + def __init__(self, name, size): + self.name = name + self.structcode = unsigned_codes[size] + +Format = FormatField + + +class ValueField(Field): + def __init__(self, name, default = None): + self.name = name + self.default = default + + +class Int8(ValueField): + structcode = 'b' + structvalues = 1 + +class Int16(ValueField): + structcode = 'h' + structvalues = 1 + +class Int32(ValueField): + structcode = 'l' + structvalues = 1 + +class Card8(ValueField): + structcode = 'B' + structvalues = 1 + +class Card16(ValueField): + structcode = 'H' + structvalues = 1 + +class Card32(ValueField): + structcode = 'L' + structvalues = 1 + + +class Resource(Card32): + cast_function = '__resource__' + class_name = 'resource' + + def __init__(self, name, codes = (), default = None): + Card32.__init__(self, name, default) + self.codes = codes + + def check_value(self, value): + if hasattr(value, self.cast_function): + return getattr(value, self.cast_function)() + else: + return value + + def parse_value(self, value, display): + # if not display: + # return value + if value in self.codes: + return value + + c = display.get_resource_class(self.class_name) + if c: + return c(display, value) + else: + return value + +class Window(Resource): + cast_function = '__window__' + class_name = 'window' + +class Pixmap(Resource): + cast_function = '__pixmap__' + class_name = 'pixmap' + +class Drawable(Resource): + cast_function = '__drawable__' + class_name = 'drawable' + +class Fontable(Resource): + cast_function = '__fontable__' + class_name = 'fontable' + +class Font(Resource): + cast_function = '__font__' + class_name = 'font' + +class GC(Resource): + cast_function = '__gc__' + class_name = 'gc' + +class Colormap(Resource): + cast_function = '__colormap__' + class_name = 'colormap' + +class Cursor(Resource): + cast_function = '__cursor__' + class_name = 'cursor' + + +class Bool(ValueField): + structvalues = 1 + structcode = 'B' + + def check_value(self, value): + return not not value + +class Set(ValueField): + structvalues = 1 + + def __init__(self, name, size, values, default = None): + ValueField.__init__(self, name, default) + self.structcode = unsigned_codes[size] + self.values = values + + def check_value(self, val): + if val not in self.values: + raise ValueError('field %s: argument %s not in %s' + % (self.name, val, self.values)) + + return val + +class Gravity(Set): + def __init__(self, name): + Set.__init__(self, name, 1, (X.ForgetGravity, X.StaticGravity, + X.NorthWestGravity, X.NorthGravity, + X.NorthEastGravity, X.WestGravity, + X.CenterGravity, X.EastGravity, + X.SouthWestGravity, X.SouthGravity, + X.SouthEastGravity)) + + +class FixedBinary(ValueField): + structvalues = 1 + + def __init__(self, name, size): + ValueField.__init__(self, name) + self.structcode = '{0}s'.format(size) + + +class Binary(ValueField): + structcode = None + + def __init__(self, name, pad = 1): + ValueField.__init__(self, name) + self.pad = pad + + def pack_value(self, val): + val_bytes = val + slen = len(val_bytes) + + if self.pad: + return val_bytes + b'\0' * ((4 - slen % 4) % 4), slen, None + else: + return val_bytes, slen, None + + def parse_binary_value(self, data, display, length, format): + if length is None: + return data, b'' + + if self.pad: + slen = length + ((4 - length % 4) % 4) + else: + slen = length + + return data[:length], data[slen:] + + +class String8(ValueField): + structcode = None + + def __init__(self, name, pad = 1): + ValueField.__init__(self, name) + self.pad = pad + + def pack_value(self, val): + if isinstance(val, bytes): + val_bytes = val + else: + val_bytes = val.encode() + slen = len(val_bytes) + + if self.pad: + return val_bytes + b'\0' * ((4 - slen % 4) % 4), slen, None + else: + return val_bytes, slen, None + + def parse_binary_value(self, data, display, length, format): + if length is None: + return decode_string(data), b'' + + if self.pad: + slen = length + ((4 - length % 4) % 4) + else: + slen = length + + data_str = decode_string(data[:length]) + + return data_str, data[slen:] + + +class String16(ValueField): + structcode = None + + def __init__(self, name, pad = 1): + ValueField.__init__(self, name) + self.pad = pad + + def pack_value(self, val): + """Convert 8-byte string into 16-byte list""" + if isinstance(val, bytes): + val = list(iterbytes(val)) + + slen = len(val) + + if self.pad: + pad = b'\0\0' * (slen % 2) + else: + pad = b'' + + return struct.pack('>' + 'H' * slen, *val) + pad, slen, None + + def parse_binary_value(self, data, display, length, format): + if length == 'odd': + length = len(data) // 2 - 1 + elif length == 'even': + length = len(data) // 2 + + if self.pad: + slen = length + (length % 2) + else: + slen = length + + return struct.unpack('>' + 'H' * length, data[:length * 2]), data[slen * 2:] + + + +class List(ValueField): + """The List, FixedList and Object fields store compound data objects. + The type of data objects must be provided as an object with the + following attributes and methods: + + ... + + """ + + structcode = None + + def __init__(self, name, type, pad = 1): + ValueField.__init__(self, name) + self.type = type + self.pad = pad + + def parse_binary_value(self, data, display, length, format): + if length is None: + ret = [] + if self.type.structcode is None: + while data: + val, data = self.type.parse_binary(data, display) + ret.append(val) + else: + scode = '=' + self.type.structcode + slen = struct.calcsize(scode) + pos = 0 + while pos + slen <= len(data): + v = struct.unpack(scode, data[pos: pos + slen]) + + if self.type.structvalues == 1: + v = v[0] + + if self.type.parse_value is None: + ret.append(v) + else: + ret.append(self.type.parse_value(v, display)) + + pos = pos + slen + + data = data[pos:] + + else: + ret = [None] * int(length) + + if self.type.structcode is None: + for i in range(0, length): + ret[i], data = self.type.parse_binary(data, display) + else: + scode = '=' + self.type.structcode + slen = struct.calcsize(scode) + pos = 0 + for i in range(0, length): + v = struct.unpack(scode, data[pos: pos + slen]) + + if self.type.structvalues == 1: + v = v[0] + + if self.type.parse_value is None: + ret[i] = v + else: + ret[i] = self.type.parse_value(v, display) + + pos = pos + slen + + data = data[pos:] + + if self.pad: + data = data[len(data) % 4:] + + return ret, data + + def pack_value(self, val): + # Single-char values, we'll assume that means integer lists. + if self.type.structcode and len(self.type.structcode) == 1: + if self.type.check_value is not None: + val = [self.type.check_value(v) for v in val] + a = array(struct_to_array_codes[self.type.structcode], val) + data = encode_array(a) + else: + data = [] + for v in val: + data.append(self.type.pack_value(v)) + + data = b''.join(data) + + if self.pad: + dlen = len(data) + data = data + b'\0' * ((4 - dlen % 4) % 4) + + return data, len(val), None + + +class FixedList(List): + def __init__(self, name, size, type, pad = 1): + List.__init__(self, name, type, pad) + self.size = size + + def parse_binary_value(self, data, display, length, format): + return List.parse_binary_value(self, data, display, self.size, format) + + def pack_value(self, val): + if len(val) != self.size: + raise BadDataError('length mismatch for FixedList %s' % self.name) + return List.pack_value(self, val) + + +class Object(ValueField): + def __init__(self, name, type, default = None): + ValueField.__init__(self, name, default) + self.type = type + self.structcode = self.type.structcode + self.structvalues = self.type.structvalues + + def parse_binary_value(self, data, display, length, format): + return self.type.parse_binary(data, display) + + def parse_value(self, val, display): + return self.type.parse_value(val, display) + + def pack_value(self, val): + return self.type.pack_value(val) + + def check_value(self, val): + if isinstance(val, tuple): + vals = [] + i = 0 + for f in self.type.fields: + if f.name: + if f.check_value is None: + v = val[i] + else: + v = f.check_value(val[i]) + if f.structvalues == 1: + vals.append(v) + else: + vals.extend(v) + i = i + 1 + return vals + + if isinstance(val, dict): + data = val + elif isinstance(val, DictWrapper): + data = val._data + else: + raise TypeError('Object value must be tuple, dictionary or DictWrapper: %s' % val) + + vals = [] + for f in self.type.fields: + if f.name: + if f.check_value is None: + v = data[f.name] + else: + v = f.check_value(data[f.name]) + if f.structvalues == 1: + vals.append(v) + else: + vals.extend(v) + + return vals + + +class PropertyData(ValueField): + structcode = None + + def parse_binary_value(self, data, display, length, format): + if length is None: + length = len(data) // (format // 8) + else: + length = int(length) + + if format == 0: + ret = None + + elif format == 8: + ret = (8, data[:length]) + data = data[length + ((4 - length % 4) % 4):] + + elif format == 16: + ret = (16, array(array_unsigned_codes[2], data[:2 * length])) + data = data[2 * (length + length % 2):] + + elif format == 32: + ret = (32, array(array_unsigned_codes[4], data[:4 * length])) + data = data[4 * length:] + + return ret, data + + def pack_value(self, value): + fmt, val = value + + if fmt not in (8, 16, 32): + raise BadDataError('Invalid property data format {0}'.format(fmt)) + + if isinstance(val, binary_type): + size = fmt // 8 + vlen = len(val) + if vlen % size: + vlen = vlen - vlen % size + data = val[:vlen] + else: + data = val + + dlen = vlen // size + + else: + if isinstance(val, tuple): + val = list(val) + + size = fmt // 8 + a = array(array_unsigned_codes[size], val) + data = encode_array(a) + dlen = len(val) + + dl = len(data) + data = data + b'\0' * ((4 - dl % 4) % 4) + + return data, dlen, fmt + + +class FixedPropertyData(PropertyData): + def __init__(self, name, size): + PropertyData.__init__(self, name) + self.size = size + + def parse_binary_value(self, data, display, length, format): + return PropertyData.parse_binary_value(self, data, display, + self.size // (format // 8), format) + + def pack_value(self, value): + data, dlen, fmt = PropertyData.pack_value(self, value) + + if len(data) != self.size: + raise BadDataError('Wrong data length for FixedPropertyData: %s' + % (value, )) + + return data, dlen, fmt + + +class ValueList(Field): + structcode = None + keyword_args = True + default = 'usekeywords' + + def __init__(self, name, mask, pad, *fields): + self.name = name + self.maskcode = '={0}{1}x'.format(unsigned_codes[mask], pad).encode() + self.maskcodelen = struct.calcsize(self.maskcode) + self.fields = [] + + flag = 1 + for f in fields: + if f.name: + self.fields.append((f, flag)) + flag = flag << 1 + + def pack_value(self, arg, keys): + mask = 0 + data = b'' + + if arg == self.default: + arg = keys + + for field, flag in self.fields: + if field.name in arg: + mask = mask | flag + + val = arg[field.name] + if field.check_value is not None: + val = field.check_value(val) + + d = struct.pack('=' + field.structcode, val) + data = data + d + b'\0' * (4 - len(d)) + + return struct.pack(self.maskcode, mask) + data, None, None + + def parse_binary_value(self, data, display, length, format): + r = {} + + mask = int(struct.unpack(self.maskcode, data[:self.maskcodelen])[0]) + data = data[self.maskcodelen:] + + for field, flag in self.fields: + if mask & flag: + if field.structcode: + vals = struct.unpack('=' + field.structcode, + data[:struct.calcsize('=' + field.structcode)]) + if field.structvalues == 1: + vals = vals[0] + + if field.parse_value is not None: + vals = field.parse_value(vals, display) + + else: + vals, d = field.parse_binary_value(data[:4], display, None, None) + + r[field.name] = vals + data = data[4:] + + return DictWrapper(r), data + + +class KeyboardMapping(ValueField): + structcode = None + + def parse_binary_value(self, data, display, length, format): + if length is None: + dlen = len(data) + else: + dlen = 4 * length * format + + a = array(array_unsigned_codes[4], bytes(data[:dlen])) + + ret = [] + for i in range(0, len(a), format): + ret.append(a[i : i + format]) + + return ret, data[dlen:] + + def pack_value(self, value): + keycodes = 0 + for v in value: + keycodes = max(keycodes, len(v)) + + a = array(array_unsigned_codes[4]) + + for v in value: + for k in v: + a.append(k) + for i in range(len(v), keycodes): + a.append(X.NoSymbol) + + return encode_array(a), len(value), keycodes + + +class ModifierMapping(ValueField): + structcode = None + + def parse_binary_value(self, data, display, length, format): + a = array(array_unsigned_codes[1], data[:8 * format]) + + ret = [] + for i in range(0, 8): + ret.append(a[i * format : (i + 1) * format]) + + return ret, data[8 * format:] + + def pack_value(self, value): + if len(value) != 8: + raise BadDataError('ModifierMapping list should have eight elements') + + keycodes = 0 + for v in value: + keycodes = max(keycodes, len(v)) + + a = array(array_unsigned_codes[1]) + + for v in value: + for k in v: + a.append(k) + for i in range(len(v), keycodes): + a.append(0) + + return encode_array(a), len(value), keycodes + +class EventField(ValueField): + structcode = None + + def pack_value(self, value): + if not isinstance(value, Event): + raise BadDataError('%s is not an Event for field %s' % (value, self.name)) + + return value._binary, None, None + + def parse_binary_value(self, data, display, length, format): + from . import event + + estruct = display.event_classes.get(byte2int(data) & 0x7f, event.AnyEvent) + if type(estruct) == dict: + # this etype refers to a set of sub-events with individual subcodes + estruct = estruct[indexbytes(data, 1)] + + return estruct(display = display, binarydata = data[:32]), data[32:] + + +# +# Objects usable for List and FixedList fields. +# Struct is also usable. +# + +class ScalarObj(object): + def __init__(self, code): + self.structcode = code + self.structvalues = 1 + self.parse_value = None + self.check_value = None + +Card8Obj = ScalarObj('B') +Card16Obj = ScalarObj('H') +Card32Obj = ScalarObj('L') + +class ResourceObj(object): + structcode = 'L' + structvalues = 1 + + def __init__(self, class_name): + self.class_name = class_name + self.check_value = None + + def parse_value(self, value, display): + # if not display: + # return value + c = display.get_resource_class(self.class_name) + if c: + return c(display, value) + else: + return value + +WindowObj = ResourceObj('window') +ColormapObj = ResourceObj('colormap') + +class StrClass(object): + structcode = None + + def pack_value(self, val): + return (chr(len(val)) + val).encode() + + def parse_binary(self, data, display): + slen = byte2int(data) + 1 + return decode_string(data[1:slen]), data[slen:] + +Str = StrClass() + + +class Struct(object): + + """Struct objects represents a binary data structure. It can + contain both fields with static and dynamic sizes. However, all + static fields must appear before all dynamic fields. + + Fields are represented by various subclasses of the abstract base + class Field. The fields of a structure are given as arguments + when instantiating a Struct object. + + Struct objects have two public methods: + + to_binary() -- build a binary representation of the structure + with the values given as arguments + parse_binary() -- convert a binary (string) representation into + a Python dictionary or object. + + These functions will be generated dynamically for each Struct + object to make conversion as fast as possible. They are + generated the first time the methods are called. + """ + + def __init__(self, *fields): + self.fields = fields + + # Structures for to_binary, parse_value and parse_binary + self.static_codes = '=' + self.static_values = 0 + self.static_fields = [] + self.static_size = None + self.var_fields = [] + + for f in self.fields: + # Append structcode if there is one and we haven't + # got any varsize fields yet. + if f.structcode is not None: + assert not self.var_fields + + self.static_codes = self.static_codes + f.structcode + + # Only store fields with values + if f.structvalues > 0: + self.static_fields.append(f) + self.static_values = self.static_values + f.structvalues + + # If we have got one varsize field, all the rest must + # also be varsize fields. + else: + self.var_fields.append(f) + + self.static_size = struct.calcsize(self.static_codes) + if self.var_fields: + self.structcode = None + self.structvalues = 0 + else: + self.structcode = self.static_codes[1:] + self.structvalues = self.static_values + + + # These functions get called only once, as they will override + # themselves with dynamically created functions in the Struct + # object + + def to_binary(self, *varargs, **keys): + """data = s.to_binary(...) + + Convert Python values into the binary representation. The + arguments will be all value fields with names, in the order + given when the Struct object was instantiated. With one + exception: fields with default arguments will be last. + + Returns the binary representation as the string DATA. + """ + # Emulate Python function argument handling with our field names + names = [f.name for f in self.fields \ + if isinstance(f, ValueField) and f.name] + field_args = dict(zip(names, varargs)) + if set(field_args).intersection(keys): + dupes = ", ".join(set(field_args).intersection(keys)) + raise TypeError("{0} arguments were passed both positionally and by keyword".format(dupes)) + field_args.update(keys) + for f in self.fields: + if f.name and (f.name not in field_args): + if f.default is None: + raise TypeError("Missing required argument {0}".format(f.name)) + field_args[f.name] = f.default + # /argument handling + + # First pack all varfields so their lengths and formats are + # available when we pack their static LengthFields and + # FormatFields + + total_length = self.static_size + var_vals = {} + lengths = {} + formats = {} + + for f in self.var_fields: + if f.keyword_args: + v, l, fm = f.pack_value(field_args[f.name], keys) + else: + v, l, fm = f.pack_value(field_args[f.name]) + var_vals[f.name] = v + lengths[f.name] = l + formats[f.name] = fm + + total_length += len(v) + + + # Construct item list for struct.pack call, packing all static fields. + pack_items = [] + + for f in self.static_fields: + if isinstance(f, LengthField): + + # If this is a total length field, insert + # the calculated field value here + if isinstance(f, TotalLengthField): + pack_items.append(f.calc_length(total_length)) + else: + pack_items.append(f.calc_length(lengths[f.name])) + + # Format field, just insert the value we got previously + elif isinstance(f, FormatField): + pack_items.append(formats[f.name]) + + # A constant field, insert its value directly + elif isinstance(f, ConstantField): + pack_items.append(f.value) + + # Value fields + else: + if f.structvalues == 1: + # If there's a value check/convert function, call it + if f.check_value is not None: + pack_items.append(f.check_value(field_args[f.name])) + # Else just use the argument as provided + else: + pack_items.append(field_args[f.name]) + + # Multivalue field. Handled like single valuefield, + # but the value are tuple unpacked into separate arguments + # which are appended to pack_items + else: + if f.check_value is not None: + pack_items.extend(f.check_value(field_args[f.name])) + else: + pack_items.extend(field_args[f.name]) + + static_part = struct.pack(self.static_codes, *pack_items) + var_parts = [var_vals[f.name] for f in self.var_fields] + return static_part + b''.join(var_parts) + + + def pack_value(self, value): + + """ This function allows Struct objects to be used in List and + Object fields. Each item represents the arguments to pass to + to_binary, either a tuple, a dictionary or a DictWrapper. + + """ + + if type(value) is tuple: + return self.to_binary(*value) + elif isinstance(value, dict): + return self.to_binary(**value) + elif isinstance(value, DictWrapper): + return self.to_binary(**value._data) + else: + raise BadDataError('%s is not a tuple or a list' % (value)) + + + def parse_value(self, val, display, rawdict = False): + + """This function is used by List and Object fields to convert + Struct objects with no var_fields into Python values. + + """ + ret = {} + vno = 0 + for f in self.static_fields: + # Fields without names should be ignored, and there should + # not be any length or format fields if this function + # ever gets called. (If there were such fields, there should + # be a matching field in var_fields and then parse_binary + # would have been called instead. + + if not f.name: + pass + + elif isinstance(f, LengthField): + pass + + elif isinstance(f, FormatField): + pass + + # Value fields + else: + # If this field has a parse_value method, call it, otherwise + # use the unpacked value as is. + if f.structvalues == 1: + field_val = val[vno] + else: + field_val = val[vno:vno+f.structvalues] + + if f.parse_value is not None: + field_val = f.parse_value(field_val, display, rawdict=rawdict) + ret[f.name] = field_val + + vno = vno + f.structvalues + + if not rawdict: + return DictWrapper(ret) + return ret + + def parse_binary(self, data, display, rawdict = False): + + """values, remdata = s.parse_binary(data, display, rawdict = False) + + Convert a binary representation of the structure into Python values. + + DATA is a string or a buffer containing the binary data. + DISPLAY should be a Xlib.protocol.display.Display object if + there are any Resource fields or Lists with ResourceObjs. + + The Python values are returned as VALUES. If RAWDICT is true, + a Python dictionary is returned, where the keys are field + names and the values are the corresponding Python value. If + RAWDICT is false, a DictWrapper will be returned where all + fields are available as attributes. + + REMDATA are the remaining binary data, unused by the Struct object. + + """ + ret = {} + val = struct.unpack(self.static_codes, data[:self.static_size]) + lengths = {} + formats = {} + + vno = 0 + for f in self.static_fields: + + # Fields without name should be ignored. This is typically + # pad and constant fields + + if not f.name: + pass + + # Store index in val for Length and Format fields, to be used + # when treating varfields. + + elif isinstance(f, LengthField): + f_names = [f.name] + if f.other_fields: + f_names.extend(f.other_fields) + field_val = val[vno] + if f.parse_value is not None: + field_val = f.parse_value(field_val, display) + for f_name in f_names: + lengths[f_name] = field_val + + elif isinstance(f, FormatField): + formats[f.name] = val[vno] + + # Treat value fields the same was as in parse_value. + else: + if f.structvalues == 1: + field_val = val[vno] + else: + field_val = val[vno:vno+f.structvalues] + + if f.parse_value is not None: + field_val = f.parse_value(field_val, display) + ret[f.name] = field_val + + vno = vno + f.structvalues + + data = data[self.static_size:] + + # Call parse_binary_value for each var_field, passing the + # length and format values from the unpacked val. + + for f in self.var_fields: + ret[f.name], data = f.parse_binary_value(data, display, + lengths.get(f.name), + formats.get(f.name), + ) + + if not rawdict: + ret = DictWrapper(ret) + return ret, data + + +class TextElements8(ValueField): + string_textitem = Struct( LengthOf('string', 1), + Int8('delta'), + String8('string', pad = 0) ) + + def pack_value(self, value): + data = b'' + args = {} + + for v in value: + # Let values be simple strings, meaning a delta of 0 + if type(v) in (str, bytes): + v = (0, v) + + # A tuple, it should be (delta, string) + # Encode it as one or more textitems + + if isinstance(v, (tuple, dict, DictWrapper)): + + if isinstance(v, tuple): + delta, m_str = v + else: + delta = v['delta'] + m_str = v['string'] + + while delta or m_str: + args['delta'] = delta + args['string'] = m_str[:254] + + data = data + self.string_textitem.to_binary(*(), **args) + + delta = 0 + m_str = m_str[254:] + + # Else an integer, i.e. a font change + else: + # Use fontable cast function if instance + if isinstance(v, Fontable): + v = v.__fontable__() + + data = data + struct.pack('>BL', 255, v) + + # Pad out to four byte length + dlen = len(data) + return data + b'\0' * ((4 - dlen % 4) % 4), None, None + + def parse_binary_value(self, data, display, length, format): + values = [] + while 1: + if len(data) < 2: + break + + # font change + if byte2int(data) == 255: + values.append(struct.unpack('>L', bytes(data[1:5]))[0]) + data = data[5:] + + # skip null strings + elif byte2int(data) == 0 and indexbytes(data, 1) == 0: + data = data[2:] + + # string with delta + else: + v, data = self.string_textitem.parse_binary(data, display) + values.append(v) + + return values, '' + + + +class TextElements16(TextElements8): + string_textitem = Struct( LengthOf('string', 1), + Int8('delta'), + String16('string', pad = 0) ) + + + +class GetAttrData(object): + def __getattr__(self, attr): + try: + if self._data: + return self._data[attr] + else: + raise AttributeError(attr) + except KeyError: + raise AttributeError(attr) + +class DictWrapper(GetAttrData): + def __init__(self, dict): + self.__dict__['_data'] = dict + + def __getitem__(self, key): + return self._data[key] + + def __setitem__(self, key, value): + self._data[key] = value + + def __delitem__(self, key): + del self._data[key] + + def __setattr__(self, key, value): + self._data[key] = value + + def __delattr__(self, key): + del self._data[key] + + def __str__(self): + return str(self._data) + + def __repr__(self): + return '%s(%s)' % (self.__class__.__name__, repr(self._data)) + + def __lt__(self, other): + if isinstance(other, DictWrapper): + return self._data < other._data + else: + return self._data < other + + def __gt__(self, other): + if isinstance(other, DictWrapper): + return self._data > other._data + else: + return self._data > other + + def __eq__(self, other): + if isinstance(other, DictWrapper): + return self._data == other._data + else: + return self._data == other + + +class Request(object): + def __init__(self, display, onerror = None, *args, **keys): + self._errorhandler = onerror + self._binary = self._request.to_binary(*args, **keys) + self._serial = None + display.send_request(self, onerror is not None) + + def _set_error(self, error): + if self._errorhandler is not None: + return call_error_handler(self._errorhandler, error, self) + else: + return 0 + +class ReplyRequest(GetAttrData): + def __init__(self, display, defer = False, *args, **keys): + self._display = display + self._binary = self._request.to_binary(*args, **keys) + self._serial = None + self._data = None + self._error = None + + self._response_lock = lock.allocate_lock() + + self._display.send_request(self, True) + if not defer: + self.reply() + + def reply(self): + # Send request and wait for reply if we hasn't + # already got one. This means that reply() can safely + # be called more than one time. + + self._response_lock.acquire() + while self._data is None and self._error is None: + self._display.send_recv_lock.acquire() + self._response_lock.release() + + self._display.send_and_recv(request = self._serial) + self._response_lock.acquire() + + self._response_lock.release() + self._display = None + + # If error has been set, raise it + if self._error: + raise self._error + + def _parse_response(self, data): + self._response_lock.acquire() + self._data, d = self._reply.parse_binary(data, self._display, rawdict = True) + self._response_lock.release() + + def _set_error(self, error): + self._response_lock.acquire() + self._error = error + self._response_lock.release() + return 1 + + def __repr__(self): + return '<%s serial = %s, data = %s, error = %s>' % (self.__class__.__name__, self._serial, self._data, self._error) + + +class Event(GetAttrData): + def __init__(self, binarydata = None, display = None, + **keys): + if binarydata: + self._binary = binarydata + self._data, data = self._fields.parse_binary(binarydata, display, + rawdict = True) + # split event type into type and send_event bit + self._data['send_event'] = not not self._data['type'] & 0x80 + self._data['type'] = self._data['type'] & 0x7f + else: + if self._code: + keys['type'] = self._code + + keys['sequence_number'] = 0 + + self._binary = self._fields.to_binary(**keys) + + keys['send_event'] = 0 + self._data = keys + + def __repr__(self): + kwlist = [] + for kw, val in self._data.items(): + if kw == 'send_event': + continue + if kw == 'type' and self._data['send_event']: + val = val | 0x80 + kwlist.append('%s = %s' % (kw, repr(val))) + + kws = ', '.join(kwlist) + return '%s(%s)' % (self.__class__.__name__, kws) + + def __lt__(self, other): + if isinstance(other, Event): + return self._data < other._data + else: + return self._data < other + + def __gt__(self, other): + if isinstance(other, Event): + return self._data > other._data + else: + return self._data > other + + def __eq__(self, other): + if isinstance(other, Event): + return self._data == other._data + else: + return self._data == other + + +def call_error_handler(handler, error, request): + try: + return handler(error, request) + except: + sys.stderr.write('Exception raised by error handler.\n') + traceback.print_exc() + return 0 diff --git a/venv/lib/python3.12/site-packages/Xlib/protocol/structs.py b/venv/lib/python3.12/site-packages/Xlib/protocol/structs.py new file mode 100644 index 0000000..2cbe18b --- /dev/null +++ b/venv/lib/python3.12/site-packages/Xlib/protocol/structs.py @@ -0,0 +1,161 @@ +# Xlib.protocol.structs -- some common request structures +# +# Copyright (C) 2000 Peter Liljenberg +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public License +# as published by the Free Software Foundation; either version 2.1 +# of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the +# Free Software Foundation, Inc., +# 59 Temple Place, +# Suite 330, +# Boston, MA 02111-1307 USA + +# Xlib modules +from .. import X + +# Xlib.protocol modules +from . import rq + +def WindowValues(arg): + return rq.ValueList( arg, 4, 0, + rq.Pixmap('background_pixmap'), + rq.Card32('background_pixel'), + rq.Pixmap('border_pixmap'), + rq.Card32('border_pixel'), + rq.Gravity('bit_gravity'), + rq.Gravity('win_gravity'), + rq.Set('backing_store', 1, + (X.NotUseful, X.WhenMapped, X.Always)), + rq.Card32('backing_planes'), + rq.Card32('backing_pixel'), + rq.Bool('override_redirect'), + rq.Bool('save_under'), + rq.Card32('event_mask'), + rq.Card32('do_not_propagate_mask'), + rq.Colormap('colormap'), + rq.Cursor('cursor'), + ) + +def GCValues(arg): + return rq.ValueList( arg, 4, 0, + rq.Set('function', 1, + (X.GXclear, X.GXand, X.GXandReverse, + X.GXcopy, X.GXandInverted, X.GXnoop, + X.GXxor, X.GXor, X.GXnor, X.GXequiv, + X.GXinvert, X.GXorReverse, X.GXcopyInverted, + X.GXorInverted, X.GXnand, X.GXset)), + rq.Card32('plane_mask'), + rq.Card32('foreground'), + rq.Card32('background'), + rq.Card16('line_width'), + rq.Set('line_style', 1, + (X.LineSolid, X.LineOnOffDash, X.LineDoubleDash)), + rq.Set('cap_style', 1, + (X.CapNotLast, X.CapButt, + X.CapRound, X.CapProjecting)), + rq.Set('join_style', 1, + (X.JoinMiter, X.JoinRound, X.JoinBevel)), + rq.Set('fill_style', 1, + (X.FillSolid, X.FillTiled, + X.FillStippled, X.FillOpaqueStippled)), + rq.Set('fill_rule', 1, + (X.EvenOddRule, X.WindingRule)), + rq.Pixmap('tile'), + rq.Pixmap('stipple'), + rq.Int16('tile_stipple_x_origin'), + rq.Int16('tile_stipple_y_origin'), + rq.Font('font'), + rq.Set('subwindow_mode', 1, + (X.ClipByChildren, X.IncludeInferiors)), + rq.Bool('graphics_exposures'), + rq.Int16('clip_x_origin'), + rq.Int16('clip_y_origin'), + rq.Pixmap('clip_mask'), + rq.Card16('dash_offset'), + rq.Card8('dashes'), + rq.Set('arc_mode', 1, (X.ArcChord, X.ArcPieSlice)) + ) + + + +TimeCoord = rq.Struct( + rq.Card32('time'), + rq.Int16('x'), + rq.Int16('y'), + ) + +Host = rq.Struct( + rq.Set('family', 1, (X.FamilyInternet, X.FamilyDECnet, X.FamilyChaos)), + rq.Pad(1), + rq.LengthOf('name', 2), + rq.List('name', rq.Card8Obj) + ) + +CharInfo = rq.Struct( + rq.Int16('left_side_bearing'), + rq.Int16('right_side_bearing'), + rq.Int16('character_width'), + rq.Int16('ascent'), + rq.Int16('descent'), + rq.Card16('attributes'), + ) + +FontProp = rq.Struct( + rq.Card32('name'), + rq.Card32('value'), + ) + +ColorItem = rq.Struct( + rq.Card32('pixel'), + rq.Card16('red'), + rq.Card16('green'), + rq.Card16('blue'), + rq.Card8('flags'), + rq.Pad(1), + ) + + +RGB = rq.Struct( + rq.Card16('red'), + rq.Card16('green'), + rq.Card16('blue'), + rq.Pad(2), + ) + + +Point = rq.Struct( + rq.Int16('x'), + rq.Int16('y'), + ) + +Segment = rq.Struct( + rq.Int16('x1'), + rq.Int16('y1'), + rq.Int16('x2'), + rq.Int16('y2'), + ) + +Rectangle = rq.Struct( + rq.Int16('x'), + rq.Int16('y'), + rq.Card16('width'), + rq.Card16('height'), + ) + +Arc = rq.Struct( + rq.Int16('x'), + rq.Int16('y'), + rq.Card16('width'), + rq.Card16('height'), + rq.Int16('angle1'), + rq.Int16('angle2'), + ) diff --git a/venv/lib/python3.12/site-packages/Xlib/rdb.py b/venv/lib/python3.12/site-packages/Xlib/rdb.py new file mode 100644 index 0000000..8670b30 --- /dev/null +++ b/venv/lib/python3.12/site-packages/Xlib/rdb.py @@ -0,0 +1,712 @@ +# Xlib.rdb -- X resource database implementation +# +# Copyright (C) 2000 Peter Liljenberg +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public License +# as published by the Free Software Foundation; either version 2.1 +# of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the +# Free Software Foundation, Inc., +# 59 Temple Place, +# Suite 330, +# Boston, MA 02111-1307 USA + + +# See end of file for an explanation of the algorithm and +# data structures used. + + +# Standard modules +import re +import sys + +# Xlib modules +from .support import lock + +# Set up a few regexpes for parsing string representation of resources + +comment_re = re.compile(r'^\s*!') +resource_spec_re = re.compile(r'^\s*([-_a-zA-Z0-9?.*]+)\s*:\s*(.*)$') +value_escape_re = re.compile('\\\\([ \tn\\\\]|[0-7]{3,3})') +resource_parts_re = re.compile(r'([.*]+)') + +# Constants used for determining which match is best + +NAME_MATCH = 0 +CLASS_MATCH = 2 +WILD_MATCH = 4 +MATCH_SKIP = 6 + +# Option error class +class OptionError(Exception): + pass + + +class ResourceDB(object): + def __init__(self, file = None, string = None, resources = None): + self.db = {} + self.lock = lock.allocate_lock() + + if file is not None: + self.insert_file(file) + if string is not None: + self.insert_string(string) + if resources is not None: + self.insert_resources(resources) + + def insert_file(self, file): + """insert_file(file) + + Load resources entries from FILE, and insert them into the + database. FILE can be a filename (a string)or a file object. + + """ + + if type(file) is bytes: + file = open(file, 'r') + + self.insert_string(file.read()) + + + def insert_string(self, data): + """insert_string(data) + + Insert the resources entries in the string DATA into the + database. + + """ + + # First split string into lines + lines = data.split('\n') + + while lines: + line = lines[0] + del lines[0] + + # Skip empty line + if not line: + continue + + # Skip comments + if comment_re.match(line): + continue + + # Handle continued lines + while line[-1] == '\\': + if lines: + line = line[:-1] + lines[0] + del lines[0] + else: + line = line[:-1] + break + + # Split line into resource and value + m = resource_spec_re.match(line) + + # Bad line, just ignore it silently + if not m: + continue + + res, value = m.group(1, 2) + + # Convert all escape sequences in value + splits = value_escape_re.split(value) + + for i in range(1, len(splits), 2): + s = splits[i] + if len(s) == 3: + splits[i] = chr(int(s, 8)) + elif s == 'n': + splits[i] = '\n' + + # strip the last value part to get rid of any + # unescaped blanks + splits[-1] = splits[-1].rstrip() + + value = ''.join(splits) + + self.insert(res, value) + + + def insert_resources(self, resources): + """insert_resources(resources) + + Insert all resources entries in the list RESOURCES into the + database. Each element in RESOURCES should be a tuple: + + (resource, value) + + Where RESOURCE is a string and VALUE can be any Python value. + + """ + + for res, value in resources: + self.insert(res, value) + + def insert(self, resource, value): + """insert(resource, value) + + Insert a resource entry into the database. RESOURCE is a + string and VALUE can be any Python value. + + """ + + # Split res into components and bindings + parts = resource_parts_re.split(resource) + + # If the last part is empty, this is an invalid resource + # which we simply ignore + if parts[-1] == '': + return + + self.lock.acquire() + + db = self.db + for i in range(1, len(parts), 2): + + # Create a new mapping/value group + if parts[i - 1] not in db: + db[parts[i - 1]] = ({}, {}) + + # Use second mapping if a loose binding, first otherwise + if '*' in parts[i]: + db = db[parts[i - 1]][1] + else: + db = db[parts[i - 1]][0] + + # Insert value into the derived db + if parts[-1] in db: + db[parts[-1]] = db[parts[-1]][:2] + (value, ) + else: + db[parts[-1]] = ({}, {}, value) + + self.lock.release() + + def __getitem__(self, keys_tuple): + """db[name, class] + + Return the value matching the resource identified by NAME and + CLASS. If no match is found, KeyError is raised. + """ + + # Split name and class into their parts + name, cls = keys_tuple + + namep = name.split('.') + clsp = cls.split('.') + + # It is an error for name and class to have different number + # of parts + + if len(namep) != len(clsp): + raise ValueError('Different number of parts in resource name/class: %s/%s' % (name, cls)) + + complen = len(namep) + matches = [] + + # Lock database and wrap the lookup code in a try-finally + # block to make sure that it is unlocked. + + self.lock.acquire() + try: + + # Precedence order: name -> class -> ? + + if namep[0] in self.db: + bin_insert(matches, _Match((NAME_MATCH, ), self.db[namep[0]])) + + if clsp[0] in self.db: + bin_insert(matches, _Match((CLASS_MATCH, ), self.db[clsp[0]])) + + if '?' in self.db: + bin_insert(matches, _Match((WILD_MATCH, ), self.db['?'])) + + + # Special case for the unlikely event that the resource + # only has one component + if complen == 1 and matches: + x = matches[0] + if x.final(complen): + return x.value() + else: + raise KeyError((name, cls)) + + + # Special case for resources which begins with a loose + # binding, e.g. '*foo.bar' + if '' in self.db: + bin_insert(matches, _Match((), self.db[''][1])) + + + # Now iterate over all components until we find the best match. + + # For each component, we choose the best partial match among + # the mappings by applying these rules in order: + + # Rule 1: If the current group contains a match for the + # name, class or '?', we drop all previously found loose + # binding mappings. + + # Rule 2: A matching name has precedence over a matching + # class, which in turn has precedence over '?'. + + # Rule 3: Tight bindings have precedence over loose + # bindings. + + while matches: + + # Work on the first element == the best current match + + x = matches[0] + del matches[0] + + # print 'path: ', x.path + # if x.skip: + # print 'skip: ', x.db + # else: + # print 'group: ', x.group + # print + + i = x.match_length() + + for part, score in ((namep[i], NAME_MATCH), + (clsp[i], CLASS_MATCH), + ('?', WILD_MATCH)): + + # Attempt to find a match in x + match = x.match(part, score) + if match: + # Hey, we actually found a value! + if match.final(complen): + return match.value() + + # Else just insert the new match + else: + bin_insert(matches, match) + + # Generate a new loose match + match = x.skip_match(complen) + if match: + bin_insert(matches, match) + + # Oh well, nothing matched + raise KeyError((name, cls)) + + finally: + self.lock.release() + + def get(self, res, cls, default = None): + """get(name, class [, default]) + + Return the value matching the resource identified by NAME and + CLASS. If no match is found, DEFAULT is returned, or None if + DEFAULT isn't specified. + + """ + + try: + return self[(res, cls)] + except KeyError: + return default + + def update(self, db): + """update(db) + + Update this database with all resources entries in the resource + database DB. + + """ + + self.lock.acquire() + update_db(self.db, db.db) + self.lock.release() + + def output(self): + """output() + + Return the resource database in text representation. + """ + + self.lock.acquire() + text = output_db('', self.db) + self.lock.release() + return text + + def getopt(self, name, argv, opts): + """getopt(name, argv, opts) + + Parse X command line options, inserting the recognised options + into the resource database. + + NAME is the application name, and will be prepended to all + specifiers. ARGV is the list of command line arguments, + typically sys.argv[1:]. + + OPTS is a mapping of options to resource specifiers. The key is + the option flag (with leading -), and the value is an instance of + some Option subclass: + + NoArg(specifier, value): set resource to value. + IsArg(specifier): set resource to option itself + SepArg(specifier): value is next argument + ResArg: resource and value in next argument + SkipArg: ignore this option and next argument + SkipLine: ignore rest of arguments + SkipNArgs(count): ignore this option and count arguments + + The remaining, non-option, oparguments is returned. + + rdb.OptionError is raised if there is an error in the argument list. + """ + + while argv and argv[0] and argv[0][0] == '-': + try: + argv = opts[argv[0]].parse(name, self, argv) + except KeyError: + raise OptionError('unknown option: %s' % argv[0]) + except IndexError: + raise OptionError('missing argument to option: %s' % argv[0]) + + return argv + + +class _Match(object): + def __init__(self, path, dbs): + self.path = path + + if type(dbs) is tuple: + self.skip = 0 + self.group = dbs + + else: + self.skip = 1 + self.db = dbs + + def __lt__(self, other): + return self.path < other.path + + def __gt__(self, other): + return self.path > other.path + + def __eq__(self, other): + return self.path == other.path + + def match_length(self): + return len(self.path) + + def match(self, part, score): + if self.skip: + if part in self.db: + return _Match(self.path + (score, ), self.db[part]) + else: + return None + else: + if part in self.group[0]: + return _Match(self.path + (score, ), self.group[0][part]) + elif part in self.group[1]: + return _Match(self.path + (score + 1, ), self.group[1][part]) + else: + return None + + def skip_match(self, complen): + # Can't make another skip if we have run out of components + if len(self.path) + 1 >= complen: + return None + + # If this already is a skip match, clone a new one + if self.skip: + if self.db: + return _Match(self.path + (MATCH_SKIP, ), self.db) + else: + return None + + # Only generate a skip match if the loose binding mapping + # is non-empty + elif self.group[1]: + return _Match(self.path + (MATCH_SKIP, ), self.group[1]) + + # This is a dead end match + else: + return None + + def final(self, complen): + if not self.skip and len(self.path) == complen and len(self.group) > 2: + return 1 + else: + return 0 + + def value(self): + return self.group[2] + + +# +# Helper function for ResourceDB.__getitem__() +# + +def bin_insert(list, element): + """bin_insert(list, element) + + Insert ELEMENT into LIST. LIST must be sorted, and ELEMENT will + be inserted to that LIST remains sorted. If LIST already contains + ELEMENT, it will not be duplicated. + + """ + + if not list: + list.append(element) + return + + lower = 0 + upper = len(list) - 1 + + while lower <= upper: + center = (lower + upper) // 2 + if element < list[center]: + upper = center - 1 + elif element > list[center]: + lower = center + 1 + elif element == list[center]: + return + + if element < list[upper]: + list.insert(upper, element) + elif element > list[upper]: + list.insert(upper + 1, element) + + +# +# Helper functions for ResourceDB.update() +# + +def update_db(dest, src): + for comp, group in src.items(): + + # DEST already contains this component, update it + if comp in dest: + + # Update tight and loose binding databases + update_db(dest[comp][0], group[0]) + update_db(dest[comp][1], group[1]) + + # If a value has been set in SRC, update + # value in DEST + + if len(group) > 2: + dest[comp] = dest[comp][:2] + group[2:] + + # COMP not in src, make a deep copy + else: + dest[comp] = copy_group(group) + +def copy_group(group): + return (copy_db(group[0]), copy_db(group[1])) + group[2:] + +def copy_db(db): + newdb = {} + for comp, group in db.items(): + newdb[comp] = copy_group(group) + + return newdb + + +# +# Helper functions for output +# + +def output_db(prefix, db): + res = '' + for comp, group in db.items(): + + # There's a value for this component + if len(group) > 2: + res = res + '%s%s: %s\n' % (prefix, comp, output_escape(group[2])) + + # Output tight and loose bindings + res = res + output_db(prefix + comp + '.', group[0]) + res = res + output_db(prefix + comp + '*', group[1]) + + return res + +def output_escape(value): + value = str(value) + if not value: + return value + + for char, esc in (('\\', '\\\\'), + ('\000', '\\000'), + ('\n', '\\n')): + + value = value.replace(char, esc) + + # If first or last character is space or tab, escape them. + if value[0] in ' \t': + value = '\\' + value + if value[-1] in ' \t' and value[-2:-1] != '\\': + value = value[:-1] + '\\' + value[-1] + + return value + + +# +# Option type definitions +# + +class Option(object): + def __init__(self): + pass + + def parse(self, name, db, args): + pass + +class NoArg(Option): + """Value is provided to constructor.""" + def __init__(self, specifier, value): + self.specifier = specifier + self.value = value + + def parse(self, name, db, args): + db.insert(name + self.specifier, self.value) + return args[1:] + +class IsArg(Option): + """Value is the option string itself.""" + def __init__(self, specifier): + self.specifier = specifier + + def parse(self, name, db, args): + db.insert(name + self.specifier, args[0]) + return args[1:] + +class SepArg(Option): + """Value is the next argument.""" + def __init__(self, specifier): + self.specifier = specifier + + def parse(self, name, db, args): + db.insert(name + self.specifier, args[1]) + return args[2:] + +class ResArgClass(Option): + """Resource and value in the next argument.""" + def parse(self, name, db, args): + db.insert_string(args[1]) + return args[2:] + +ResArg = ResArgClass() + +class SkipArgClass(Option): + """Ignore this option and next argument.""" + def parse(self, name, db, args): + return args[2:] + +SkipArg = SkipArgClass() + +class SkipLineClass(Option): + """Ignore rest of the arguments.""" + def parse(self, name, db, args): + return [] + +SkipLine = SkipLineClass() + +class SkipNArgs(Option): + """Ignore this option and the next COUNT arguments.""" + def __init__(self, count): + self.count = count + + def parse(self, name, db, args): + return args[1 + self.count:] + + + +def get_display_opts(options, argv = sys.argv): + """display, name, db, args = get_display_opts(options, [argv]) + + Parse X OPTIONS from ARGV (or sys.argv if not provided). + + Connect to the display specified by a *.display resource if one is + set, or to the default X display otherwise. Extract the + RESOURCE_MANAGER property and insert all resources from ARGV. + + The four return values are: + DISPLAY -- the display object + NAME -- the application name (the filname of ARGV[0]) + DB -- the created resource database + ARGS -- any remaining arguments + """ + + from Xlib import display, Xatom + import os + + name = os.path.splitext(os.path.basename(argv[0]))[0] + + optdb = ResourceDB() + leftargv = optdb.getopt(name, argv[1:], options) + + dname = optdb.get(name + '.display', name + '.Display', None) + d = display.Display(dname) + + rdbstring = d.screen(0).root.get_full_property(Xatom.RESOURCE_MANAGER, + Xatom.STRING) + if rdbstring: + data = rdbstring.value + else: + data = None + + db = ResourceDB(string = data) + db.update(optdb) + + return d, name, db, leftargv + + +# Common X options +stdopts = {'-bg': SepArg('*background'), + '-background': SepArg('*background'), + '-fg': SepArg('*foreground'), + '-foreground': SepArg('*foreground'), + '-fn': SepArg('*font'), + '-font': SepArg('*font'), + '-name': SepArg('.name'), + '-title': SepArg('.title'), + '-synchronous': NoArg('*synchronous', 'on'), + '-xrm': ResArg, + '-display': SepArg('.display'), + '-d': SepArg('.display'), + } + + +# Notes on the implementation: + +# Resource names are split into their components, and each component +# is stored in a mapping. The value for a component is a tuple of two +# or three elements: + +# (tightmapping, loosemapping [, value]) + +# tightmapping contains the next components which are connected with a +# tight binding (.). loosemapping contains the ones connected with +# loose binding (*). If value is present, then this component is the +# last component for some resource which that value. + +# The top level components are stored in the mapping r.db, where r is +# the resource object. + +# Example: Inserting "foo.bar*gazonk: yep" into an otherwise empty +# resource database would give the following structure: + +# { 'foo': ( { 'bar': ( { }, +# { 'gazonk': ( { }, +# { }, +# 'yep') +# } +# ) +# }, +# {}) +# } diff --git a/venv/lib/python3.12/site-packages/Xlib/support/__init__.py b/venv/lib/python3.12/site-packages/Xlib/support/__init__.py new file mode 100644 index 0000000..d6c1746 --- /dev/null +++ b/venv/lib/python3.12/site-packages/Xlib/support/__init__.py @@ -0,0 +1,26 @@ +# Xlib.support.__init__ -- support code package +# +# Copyright (C) 2000 Peter Liljenberg +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public License +# as published by the Free Software Foundation; either version 2.1 +# of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the +# Free Software Foundation, Inc., +# 59 Temple Place, +# Suite 330, +# Boston, MA 02111-1307 USA + +__all__ = [ + 'lock', + 'connect' + # The platform specific modules should not be listed here + ] diff --git a/venv/lib/python3.12/site-packages/Xlib/support/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/Xlib/support/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..209d032dd6606671b4b79c436248dee7363e5a41 GIT binary patch literal 239 zcmXwyF>b;z7=`U55CqM}B^b!BmbL2It#id`30Qt zd~IlRpe=XsIa1ddqpb%*gc6>R+VpYudep3w{LRkNBu;kAbcP&bJk)5ixD?eeDHhXH IX{QPN0|~-JtpET3 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/Xlib/support/__pycache__/connect.cpython-312.pyc b/venv/lib/python3.12/site-packages/Xlib/support/__pycache__/connect.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a118168ddc739fa12cccd9d776de8039cd0dec11 GIT binary patch literal 2842 zcmbuB&2JM&6u@`=6=xkg2}xTZDGUUPT{&@Sff5vgq9g)Th!IJv)IC@m?>O0D@47Q% z2P3EQp_Q5wRWIbgfl3^xazRzk{RetUWTc=ix1M^7NKZZWz1dwSL1{0nkn2_uC_NxZo`>Hwl5n*V`Qf@kkNvx#fVI zKOhXXp*#SKKreZ1cu&nLsld#Gz{p4{=yaOpip@mHTyWy9nlIZ%wM3n0K5yw|n$M?H zrvq#_;J73CN6&Cp%ao~M>KUU_s`5;wE|zR-*r2tHWiz8zu>{lWnHsff8Cct!|77I+ z#~E%4I$Y5U_w+@|GxIphs}&3)<0WCFQg?dtjFxm^)@a@hi^XBDwBr zf9|V+MqoMS+xPAb#eV|Qt?Iu(=41-fq{3`r7wl4+EZJP7iDB7k!V8R2i(Dm(ROAhl zS4w(4>D^PBM&P=mGfv6W&DlG*CcY%5C2V2}P6{@hphYdgM+muD+~uay;P-~=!{-*cO+zLX5#iVZazFr(7#wMm3(J{M35vG z%(NC$atjFZZgws^nZ4yZ_%BN!S_p(BF(zUbiCz_U84kGMd)~;-&f!kJCno2>7LYlc zb913oC$wADGnCM*5W(R(jqRm%&MktAe^E>h+{Iy-rHdV0p)!%u~m`9nQY5hw1S z2G#|4f^a@g6i!DJZB};r^WHN1pOUCLv3(~Ah1TJP#*h^!h>IbA5DSA2rm%irTmglD z1fr?@eO&1t+)kX_N}PNeeevOVD{-xP{grln{nM5<)SP@7OFX=`b`3_cq0P_`OMp|M zUF|SHgk`^Ifbv%8hxVZ#^1)sWH^PUb-%uNYMsUN6MHWCD3V_>%dsKLkyMyF^7lnuY zq}v%0AW5)W8-!PA!7Q58APaRD({vlYG?6grmH{)_G+9|P3riAEU|X(Iuoc#+e zeejFSE)yN=gG{DI+|sz~mdtE+^0Vo=G?|MkIST7tBI|9P#Yg4s1??RaZs_wm;L#I8mfk^keZ5!&#gk;I(`;-Jec z$hS2dXT$`&*yIBWp75v( z%n`cHgf$c1I;IMFf43j8@5XGxd>z7+l)h@GISs=H}Ljs2nY>}X0j@%`#f zFwh%m#&@F1(GND2{+)<#?TIwI!1~_VO{H(onus(tu)Z_2sr2r2DO&vD;M(AJ=fGCy t!1`pXlQbhQW4%9|S{rRfUxu{T5mmkVI@+zCd3`3PUfLb(Qm@D`{{=2A!><4U literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/Xlib/support/__pycache__/lock.cpython-312.pyc b/venv/lib/python3.12/site-packages/Xlib/support/__pycache__/lock.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5f96ef0b7342005d3652bf3d7fd8832d8ac8ac01 GIT binary patch literal 911 zcmZ8fzi-n}5WeR)Khz`*2q~pVhztlRg2n=b5E24}kUA7~VL=&qa_vWOlDM=zx@!g`w)i#Ku3s(h*r~`~wAdV&X1#QZ-L{clYkQd-uJ&_oH540bJkTZuah% z0DjY9zKXe#cF>rD2Ag2R1Z*bYsE}b@rh#Bbd0B)F$Do# zW&=huik{`@l#{IRXVG8~KliP^HP4|`szy6~ied^Q*hRg(-mwwzMb_-3&0`SB83V*{ z$hNWAg|lLud%hneWz*V=94V5r6s|CpNJ=hJ5q6s;x)SbdMc23fy)u*>8UtZFreOze zq>LaA-}v5!Ery2YOM4i2p)_M-D7>NJIy*Ujw{!cBp`1``1g6zDdqNp62~|-L_%bx8 zSSN^+3g?dJgq-hRI^)=xJJ*ndx{6{9Cr!Bb;M>;Mt>en$_xi^gs)O*;=(GK$pVHIM zHIW=;+^LRYifxcI;6rF@lKw!Vo3f`AwXD^WRq~XwzU*H-$AVgQ9brZ3WB6HFm36eX z+eISonFGN&PLdCNJ95dcalRLsZidJj#!CEZAR8nobyiK%fM%kJh9dt2{%Y0Y6P8|K z#YPrMK^E@CqKS|*T}3g4Z~?r?-iM>Ba+`h?r}i!tP3oqLZZi}aO1-^_TUAhu;a9bJ ztT*%L=}F1o*%elpF(sCg;+L8%E995hb>)t?*CSpVRT LtEtY|+N{Wb$8pEa literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/Xlib/support/__pycache__/unix_connect.cpython-312.pyc b/venv/lib/python3.12/site-packages/Xlib/support/__pycache__/unix_connect.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..589790f3262c826fa09870bd61339947b3acfd0c GIT binary patch literal 6889 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/Xlib/support/__pycache__/vms_connect.cpython-312.pyc b/venv/lib/python3.12/site-packages/Xlib/support/__pycache__/vms_connect.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..df13cfab71f6beba67452e6d2a298f395680a12c GIT binary patch literal 1778 zcmZ`(O>7%Q6rR~1d;PNxand9TKLzRrZ;I`dA629#$RsI6C`L3@11`l{yj#cade_Wu z92~8|ia5jyk}dU+R6-(0P&pvM87XHjj)IhA=^+y3kXw}WfXaoLwbyYY`lNaD=Kal^ zneWZ-JnsdVep`Gm`vnKUUu5AB-4>2-U||hNK!OTLwPu)tcugr(flkp7P(TKG9DkZ5 z`aW#wQmn*$15z%D#oR5qFz3opa32tJQh*jKBc!1v;j{3~h!|N)L{ejsx1#A=qr!Oj zCKhj95W=5E9Z`5Elxb(S^Rt+fdXIxxy9P{9g=J{iCc^U0SvnekeVp1V(1iLKgXFL& z?{cJ*`NVq}nxI0NFz-3BI+8?na?&QPQxaXF4WDCuN(|$~ICF)0iYMFgU`-bJyE1oK zR7!GHSd)@~Nt=wx-ezZk;7$tc5;Hy)9ZOmsMaziFyrvt7!ll{lfLtabH*i372aID7 zT$WeL=|x2>r;%*21<}aNBXXVAGgB>nQY^^R|n=kq@Z^z8&fTY=EV+;$++ zC`F}oy z5I~^{Yjj#CZ+|~erZ<7XI~ubCY^SDW{P9%Suh>Pn2)?900gF(elDXm_z#zw{(lU2s z!*VCCq~A|YU$=a-A5MOdp1po;Ix%Cp+bC$kcc2a5$rdznn%V*}jr#(lmz8YDaz&&W zT1Hb)FRlp%F|(j<(Irvo!Y=A3dM`m%s{-^gR*d7JE0|$mQ5+k8!~wpqK2w|dZshyu zz35LPJEQTf(fGFi?G?DodFq~;r}4&m{|0?;xET!n!JWr&^z+rL|2%R7f3O~}#g71F z<2DXQw*sR-y!q?7pEJLNw*!}(+~t1{X>5F~58(}$6I{X%HvN6?()8xpvxy0MbArY4 z6M({gEkF?jtO5KRQ%Qlc@C)Jfk3e87h8zaHfR`ty*NHc2*w&dja%OSCm`AT*{Z%}4 z@{3f#zONSzU`g;;6p|6C%3?@gwr(H4MWL8eWJI7~x1oJyb{2G==tyvTk9a|o78H2` zUBEhmdVLHtd|n8TUj@+nC*c1E1N;2o%C&l`mTC@7ZS&Jr?-4T$g`;sF +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public License +# as published by the Free Software Foundation; either version 2.1 +# of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the +# Free Software Foundation, Inc., +# 59 Temple Place, +# Suite 330, +# Boston, MA 02111-1307 USA + +import sys +import importlib + +# List the modules which contain the corresponding functions + +_display_mods = { + 'OpenVMS': 'vms_connect', + } + +_default_display_mod = 'unix_connect' + +_socket_mods = { + 'OpenVMS': 'vms_connect' + } + +_default_socket_mod = 'unix_connect' + +_auth_mods = { + 'OpenVMS': 'vms_connect' + } + +_default_auth_mod = 'unix_connect' + + +# Figure out which OS we're using. +# sys.platform is either "OS-ARCH" or just "OS". + +_parts = sys.platform.split('-') +platform = _parts[0] +del _parts + + +def _relative_import(modname): + return importlib.import_module('..' + modname, __name__) + + +def get_display(display): + """dname, protocol, host, dno, screen = get_display(display) + + Parse DISPLAY into its components. If DISPLAY is None, use + the default display. The return values are: + + DNAME -- the full display name (string) + PROTOCOL -- the protocol to use (None if automatic) + HOST -- the host name (string, possibly empty) + DNO -- display number (integer) + SCREEN -- default screen number (integer) + """ + + modname = _display_mods.get(platform, _default_display_mod) + mod = _relative_import(modname) + return mod.get_display(display) + + +def get_socket(dname, protocol, host, dno): + """socket = get_socket(dname, protocol, host, dno) + + Connect to the display specified by DNAME, PROTOCOL, HOST and DNO, which + are the corresponding values from a previous call to get_display(). + + Return SOCKET, a new socket object connected to the X server. + """ + + modname = _socket_mods.get(platform, _default_socket_mod) + mod = _relative_import(modname) + return mod.get_socket(dname, protocol, host, dno) + + +def get_auth(sock, dname, protocol, host, dno): + """auth_name, auth_data = get_auth(sock, dname, protocol, host, dno) + + Return authentication data for the display on the other side of + SOCK, which was opened with DNAME, HOST and DNO, using PROTOCOL. + + Return AUTH_NAME and AUTH_DATA, two strings to be used in the + connection setup request. + """ + + modname = _auth_mods.get(platform, _default_auth_mod) + mod = _relative_import(modname) + return mod.get_auth(sock, dname, protocol, host, dno) diff --git a/venv/lib/python3.12/site-packages/Xlib/support/lock.py b/venv/lib/python3.12/site-packages/Xlib/support/lock.py new file mode 100644 index 0000000..29289b6 --- /dev/null +++ b/venv/lib/python3.12/site-packages/Xlib/support/lock.py @@ -0,0 +1,44 @@ +# Xlib.support.lock -- allocate a lock +# +# Copyright (C) 2000 Peter Liljenberg +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public License +# as published by the Free Software Foundation; either version 2.1 +# of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the +# Free Software Foundation, Inc., +# 59 Temple Place, +# Suite 330, +# Boston, MA 02111-1307 USA + +class _DummyLock(object): + def __init__(self): + + # This might be nerdy, but by assigning methods like this + # instead of defining them all, we create a single bound + # method object once instead of one each time one of the + # methods is called. + + # This gives some speed improvements which should reduce the + # impact of the threading infrastructure in the regular code, + # when not using threading. + + self.acquire = self.release = self.locked = self.__noop + + def __noop(self, *args): + return + + +# More optimisations: we use a single lock for all lock instances +_dummy_lock = _DummyLock() + +def allocate_lock(): + return _dummy_lock diff --git a/venv/lib/python3.12/site-packages/Xlib/support/unix_connect.py b/venv/lib/python3.12/site-packages/Xlib/support/unix_connect.py new file mode 100644 index 0000000..aee6dd9 --- /dev/null +++ b/venv/lib/python3.12/site-packages/Xlib/support/unix_connect.py @@ -0,0 +1,217 @@ +# Xlib.support.unix_connect -- Unix-type display connection functions +# +# Copyright (C) 2000,2002 Peter Liljenberg +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public License +# as published by the Free Software Foundation; either version 2.1 +# of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the +# Free Software Foundation, Inc., +# 59 Temple Place, +# Suite 330, +# Boston, MA 02111-1307 USA + +import re +import os +import platform +import socket +from Xlib import error, xauth + + +SUPPORTED_PROTOCOLS = (None, 'tcp', 'unix') + +# Darwin funky socket. +uname = platform.uname() +if (uname[0] == 'Darwin') and ([int(x) for x in uname[2].split('.')] >= [9, 0]): + SUPPORTED_PROTOCOLS += ('darwin',) + DARWIN_DISPLAY_RE = re.compile(r'^/private/tmp/[-:a-zA-Z0-9._]*:(?P[0-9]+)(\.(?P[0-9]+))?$') + +DISPLAY_RE = re.compile(r'^((?Ptcp|unix)/)?(?P[-:a-zA-Z0-9._]*):(?P[0-9]+)(\.(?P[0-9]+))?$') + + +def get_display(display): + # Use $DISPLAY if display isn't provided + if display is None: + display = os.environ.get('DISPLAY', '') + + re_list = [(DISPLAY_RE, {})] + + if 'darwin' in SUPPORTED_PROTOCOLS: + re_list.insert(0, (DARWIN_DISPLAY_RE, {'protocol': 'darwin'})) + + for re, defaults in re_list: + m = re.match(display) + if m is not None: + protocol, host, dno, screen = [ + m.groupdict().get(field, defaults.get(field)) + for field in ('proto', 'host', 'dno', 'screen') + ] + break + else: + raise error.DisplayNameError(display) + + if protocol == 'tcp' and not host: + # Host is mandatory when protocol is TCP. + raise error.DisplayNameError(display) + + dno = int(dno) + if screen: + screen = int(screen) + else: + screen = 0 + + return display, protocol, host, dno, screen + + +def _get_tcp_socket(host, dno): + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + s.connect((host, 6000 + dno)) + return s + + +def _get_unix_socket(address): + s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) + s.connect(address) + return s + + +def get_socket(dname, protocol, host, dno): + assert protocol in SUPPORTED_PROTOCOLS + try: + # Darwin funky socket. + if protocol == 'darwin': + s = _get_unix_socket(dname) + + # TCP socket, note the special case: `unix:0.0` is equivalent to `:0.0`. + elif (protocol is None or protocol != 'unix') and host and host != 'unix': + s = _get_tcp_socket(host, dno) + + # Unix socket. + else: + address = '/tmp/.X11-unix/X%d' % dno + if not os.path.exists(address): + # Use abstract address. + address = '\0' + address + try: + s = _get_unix_socket(address) + except socket.error: + if not protocol and not host: + # If no protocol/host was specified, fallback to TCP. + s = _get_tcp_socket(host, dno) + else: + raise + except socket.error as val: + raise error.DisplayConnectionError(dname, str(val)) + + # Make sure that the connection isn't inherited in child processes. + _ensure_not_inheritable(s) + + return s + + +def _ensure_not_inheritable(sock): + # According to PEP446, in Python 3.4 and above, + # it is not inherited in child processes by default. + # However, just in case, we explicitly make it non-inheritable. + # Also, we don't use the code like the following, + # because there would be no possibility of backporting to past versions. + # if sys.version_info.major == 3 and sys.version_info.minor >= 4: + # sock.set_inheritable(False) + # return + # We just check if the socket has `set_inheritable`. + if hasattr(sock, 'set_inheritable'): + sock.set_inheritable(False) + return + + # On Windows, + # Python doesn't support fcntl module because Windows doesn't have fcntl API. + # At least by not importing fcntl, we will be able to import python-xlib on Windows. + if platform.system() == 'Windows': + # so.. unfortunately, for Python 3.3 and below, on Windows, + # we can't make sure that the connection isn't inherited in child processes for now. + return + + import fcntl + fcntl.fcntl(sock.fileno(), fcntl.F_SETFD, fcntl.FD_CLOEXEC) + + +def new_get_auth(sock, dname, protocol, host, dno): + assert protocol in SUPPORTED_PROTOCOLS + # Translate socket address into the xauth domain + if protocol == 'darwin': + family = xauth.FamilyLocal + addr = socket.gethostname() + + elif protocol == 'tcp': + family = xauth.FamilyInternet + + # Convert the prettyprinted IP number into 4-octet string. + # Sometimes these modules are too damn smart... + octets = sock.getpeername()[0].split('.') + addr = bytearray(int(x) for x in octets) + else: + family = xauth.FamilyLocal + addr = socket.gethostname().encode() + + try: + au = xauth.Xauthority() + except error.XauthError: + return b'', b'' + + while 1: + try: + return au.get_best_auth(family, addr, dno) + except error.XNoAuthError: + pass + + # We need to do this to handle ssh's X forwarding. It sets + # $DISPLAY to localhost:10, but stores the xauth cookie as if + # DISPLAY was :10. Hence, if localhost and not found, try + # again as a Unix socket. + if family == xauth.FamilyInternet and addr == b'\x7f\x00\x00\x01': + family = xauth.FamilyLocal + addr = socket.gethostname().encode() + else: + return b'', b'' + + +def old_get_auth(sock, dname, host, dno): + # Find authorization cookie + auth_name = auth_data = b'' + + try: + # We could parse .Xauthority, but xauth is simpler + # although more inefficient + data = os.popen('xauth list %s 2>/dev/null' % dname).read() + + # If there's a cookie, it is of the format + # DISPLAY SCHEME COOKIE + # We're interested in the two last parts for the + # connection establishment + lines = data.split('\n') + if len(lines) >= 1: + parts = lines[0].split(None, 2) + if len(parts) == 3: + auth_name = parts[1] + hexauth = parts[2] + auth = b'' + + # Translate hexcode into binary + for i in range(0, len(hexauth), 2): + auth = auth + chr(int(hexauth[i:i+2], 16)) + + auth_data = auth + except os.error: + pass + + return auth_name, auth_data + +get_auth = new_get_auth diff --git a/venv/lib/python3.12/site-packages/Xlib/support/vms_connect.py b/venv/lib/python3.12/site-packages/Xlib/support/vms_connect.py new file mode 100644 index 0000000..2799bfa --- /dev/null +++ b/venv/lib/python3.12/site-packages/Xlib/support/vms_connect.py @@ -0,0 +1,74 @@ +# Xlib.support.vms_connect -- VMS-type display connection functions +# +# Copyright (C) 2000 Peter Liljenberg +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public License +# as published by the Free Software Foundation; either version 2.1 +# of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the +# Free Software Foundation, Inc., +# 59 Temple Place, +# Suite 330, +# Boston, MA 02111-1307 USA + +import re +import socket + +from Xlib import error + +display_re = re.compile(r'^([-a-zA-Z0-9._]*):([0-9]+)(\.([0-9]+))?$') + +def get_display(display): + + # Use dummy display if none is set. We really should + # check DECW$DISPLAY instead, but that has to wait + + if display is None: + return ':0.0', None, 'localhost', 0, 0 + + m = display_re.match(display) + if not m: + raise error.DisplayNameError(display) + + name = display + + # Always return a host, since we don't have AF_UNIX sockets + host = m.group(1) + if not host: + host = 'localhost' + + dno = int(m.group(2)) + screen = m.group(4) + if screen: + screen = int(screen) + else: + screen = 0 + + return name, None, host, dno, screen + + +def get_socket(dname, protocol, host, dno): + try: + # Always use TCP/IP sockets. Later it would be nice to + # be able to use DECNET och LOCAL connections. + + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + s.connect((host, 6000 + dno)) + + except socket.error as val: + raise error.DisplayConnectionError(dname, str(val)) + + return s + + +def get_auth(sock, dname, host, dno): + # VMS doesn't have xauth + return '', '' diff --git a/venv/lib/python3.12/site-packages/Xlib/threaded.py b/venv/lib/python3.12/site-packages/Xlib/threaded.py new file mode 100644 index 0000000..5fdf016 --- /dev/null +++ b/venv/lib/python3.12/site-packages/Xlib/threaded.py @@ -0,0 +1,28 @@ +# Xlib.threaded -- Import this module to enable threading +# +# Copyright (C) 2000 Peter Liljenberg +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public License +# as published by the Free Software Foundation; either version 2.1 +# of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the +# Free Software Foundation, Inc., +# 59 Temple Place, +# Suite 330, +# Boston, MA 02111-1307 USA + +from six.moves import _thread + +# We change the allocate_lock function in Xlib.support.lock to +# return a basic Python lock, instead of the default dummy lock + +from Xlib.support import lock +lock.allocate_lock = _thread.allocate_lock diff --git a/venv/lib/python3.12/site-packages/Xlib/xauth.py b/venv/lib/python3.12/site-packages/Xlib/xauth.py new file mode 100644 index 0000000..8651448 --- /dev/null +++ b/venv/lib/python3.12/site-packages/Xlib/xauth.py @@ -0,0 +1,134 @@ +# Xlib.xauth -- ~/.Xauthority access +# +# Copyright (C) 2000 Peter Liljenberg +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public License +# as published by the Free Software Foundation; either version 2.1 +# of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the +# Free Software Foundation, Inc., +# 59 Temple Place, +# Suite 330, +# Boston, MA 02111-1307 USA + +import os +import struct + +from Xlib import X, error + +FamilyInternet = X.FamilyInternet +FamilyDECnet = X.FamilyDECnet +FamilyChaos = X.FamilyChaos +FamilyServerInterpreted = X.FamilyServerInterpreted +FamilyInternetV6 = X.FamilyInternetV6 +FamilyLocal = 256 + +class Xauthority(object): + def __init__(self, filename = None): + if filename is None: + filename = os.environ.get('XAUTHORITY') + + if filename is None: + try: + filename = os.path.join(os.environ['HOME'], '.Xauthority') + except KeyError: + raise error.XauthError( + '$HOME not set, cannot find ~/.Xauthority') + + try: + with open(filename, 'rb') as fp: + raw = fp.read() + except IOError as err: + raise error.XauthError('could not read from {0}: {1}'.format(filename, err)) + + self.entries = [] + + # entry format (all shorts in big-endian) + # short family; + # short addrlen; + # char addr[addrlen]; + # short numlen; + # char num[numlen]; + # short namelen; + # char name[namelen]; + # short datalen; + # char data[datalen]; + + n = 0 + try: + while n < len(raw): + family, = struct.unpack('>H', raw[n:n+2]) + n = n + 2 + + length, = struct.unpack('>H', raw[n:n+2]) + n = n + length + 2 + addr = raw[n - length : n] + + length, = struct.unpack('>H', raw[n:n+2]) + n = n + length + 2 + num = raw[n - length : n] + + length, = struct.unpack('>H', raw[n:n+2]) + n = n + length + 2 + name = raw[n - length : n] + + length, = struct.unpack('>H', raw[n:n+2]) + n = n + length + 2 + data = raw[n - length : n] + + if len(data) != length: + break + + self.entries.append((family, addr, num, name, data)) + except struct.error: + print("Xlib.xauth: warning, failed to parse part of xauthority file {0}, aborting all further parsing".format(filename)) + + if len(self.entries) == 0: + print("Xlib.xauth: warning, no xauthority details available") + # raise an error? this should get partially caught by the XNoAuthError in get_best_auth.. + + def __len__(self): + return len(self.entries) + + def __getitem__(self, i): + return self.entries[i] + + def get_best_auth(self, family, address, dispno, + types = ( b"MIT-MAGIC-COOKIE-1", )): + + """Find an authentication entry matching FAMILY, ADDRESS and + DISPNO. + + The name of the auth scheme must match one of the names in + TYPES. If several entries match, the first scheme in TYPES + will be choosen. + + If an entry is found, the tuple (name, data) is returned, + otherwise XNoAuthError is raised. + """ + + num = str(dispno).encode() + + matches = {} + + for efam, eaddr, enum, ename, edata in self.entries: + if enum == b'' and ename not in matches: + enum = num + if efam == family and eaddr == address and num == enum: + matches[ename] = edata + + for t in types: + try: + return (t, matches[t]) + except KeyError: + pass + + raise error.XNoAuthError((family, address, dispno)) diff --git a/venv/lib/python3.12/site-packages/Xlib/xobject/__init__.py b/venv/lib/python3.12/site-packages/Xlib/xobject/__init__.py new file mode 100644 index 0000000..6fb3bc9 --- /dev/null +++ b/venv/lib/python3.12/site-packages/Xlib/xobject/__init__.py @@ -0,0 +1,29 @@ +# Xlib.xobject.__init__ -- glue for Xlib.xobject package +# +# Copyright (C) 2000 Peter Liljenberg +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public License +# as published by the Free Software Foundation; either version 2.1 +# of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the +# Free Software Foundation, Inc., +# 59 Temple Place, +# Suite 330, +# Boston, MA 02111-1307 USA + +__all__ = [ + 'colormap', + 'cursor', + 'drawable', + 'fontable', + 'icccm', + 'resource', + ] diff --git a/venv/lib/python3.12/site-packages/Xlib/xobject/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/Xlib/xobject/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5d918f6799456d9b55f849f41b4ea11644e37260 GIT binary patch literal 273 zcmXw#F-`+96h!Sr>{>t$vJ#0EXb~+PHKMV+wpkp!w)O3G*pgGw({Twdzzy6|(IL`N zWsSl}BfZfSqyIk^i(@qDeS6(~%@O)6;a{@@>`o_mK^>Cl72lx|H?yY7L^$K1=RQ|r zfZ!k#34F_2qcXX7HvZ9(7DDuyfC_E^p>7(SYsR=SjJ=^;ffJA#GHK)>>Ay7ZY z2WOX3C2AeW7&-6`uVgml7pXqHHO)3(J;liZXvB+lrmSO)5K$kh+Gt~(;VcZb*UuSfb5emMK9^Cm#}J~&B8?s1U5S;+3de|6Y>RioZ__`n=(hp0#S&V*uoK}-Nu{(%q2ZMRH_@tnecd!SpH<`lObgF}=kCGd5Gq!093q z#VwltSE#BwN2bj<#7`(@@B$2{92-ncC@Z`v>Z*2u`hi8qGk14?HJ;Gv#YA3JCejII zQk&8flQX6Fi-nk?UQ85R#BJO0i#o1yUyM4HalRz$$`*L7i-dBS2?~3Yf0n#{Wr`k;5{HqUCG%#%sqU| z?#%He)Dc!1-Ew1zWxiBZ{5m~wgt_V*-cMao_!3?TE4OT2oD+Cb7IylgBHR`ojTFk~hjc(tIH;Bp*5*mcnWaL_g&w((kM1}7}uDxkB^Im_bpQ)qB{HxS$E_E+Tn z%e|}7m8j7_XoQa}O)pMA2F(6%fM|QOV4uM`)03cRpK`csVC;1k#kUEQOW{$uDZMLI|m}~Sj zE;<4PG$*ioJ#e5BaGOn=`0Jms;hQn5J=3cd}7H-+eukectt2x18`Y%xMsoTWjnH9N|&5w1*J>DT@Hi-Qx4n-1QPM+79nOjzJgDkRFQM>cdIwUR zX>v(;hfH%3d4vTilN)$|hV}rz`~aij1JsxmE5K1^0b(JYS0jFSab(9a6q!;!UCO+V zMp2xaG=+&m$rLoTK%=nI_NdG@Mqr&%XCM^Co8HrD1!p5Z7RBgs9OS6Ut)TN*K;qvAl4bWh=Nb#kQk8b#~;Mdldxe4}n}Je{buWA2xz*3*L{tH^fg` z=7-Hd(Ac$m;jNF~y7Bra$?N?6j?NqWjnSLKw}s`?x4er#u6%Ex(lv1B;9AGfb?zVE z4QuD#_0DjmGrY_#4=$(IItTt79N2h{v_H48Px5u$5A9hG^;bguch27%yE|qaeg0nf zZWyXZ65nxhgYYdU|MSR0g1fHGU7dSKIA7Q2q0S8f>aTRvolp5AXX513c<5zO_@lr9 z&HS&O>kgUv&d$|r$`lKwiR@HyO1IR^lffibH$9Mi7gXJGvjL_`>~hbjnx=2}wLgL* z(pQk21ybj0ZB1daQyCO6TdyguxfBX;`Q5{nz~MU`_x9c0XB>agh#y_eu4IjY=iv|i zE5f>c>V&|26 zD)OG2=a29om~h9SdsYPS>$u2)X%|Bp-e7U}@I_dl_W-eR z+FOzL!i!d0)QrP1qbIy{V)2C08+q&%d`B#hAUmlRd}T3^zJ(Qw>`}S1g4r_;P@Wo4 zrgT9|XKmLgG2LQO(lO!y1Fcbnh3plbKI5iuW9uy>Ow;gu%zW)IYN6!{l`iMFZLSQ9 z^#~9f&aKaxzL@=@F<9$yv*e3epkh|x6x;v#Hl4t8}F{ z6b;e&VW;`^DV17}aF@w4M+)zK1}U@KQ?N$IFV%Dreu$;^6I-9H>7sl13a*L)0r32x zb^rc~-+2pK4?!c6fNFTBVz!LyWf~@ZfKn4^&248U0t@&KB_`%d9 zGc#AX;A^V3<(2H$7`vUC)evzH{~8fFWFdlYoP(9X!R7O-V=H4ue|$B(5{3#8fkcQn zPvi(U66rAIR0=gVl`@-BseDnH(y;AMr9PZWYt{@!!!qSJ?4QJOvij2;V`Tvg`~{3- z=1jYh^dLEmB#Pt=63iXxIV7(mc@qgjPv1rI9*`BnZi!hG`)P&|JeYnS$Q5FQ_O6F| zE1}-?&|oDrc=_C>C`pNjtzKzxvt5t|Hk$a!r$2h_ zSFe2*cw($2R(3jWto8 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/Xlib/xobject/__pycache__/cursor.cpython-312.pyc b/venv/lib/python3.12/site-packages/Xlib/xobject/__pycache__/cursor.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f083624b3bd7c20926ca5fb01fb0f4b3065dbfb0 GIT binary patch literal 1480 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 WMIIgWY&JI2EiS9OjYfVr%Krnz)XUNU literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/Xlib/xobject/__pycache__/fontable.cpython-312.pyc b/venv/lib/python3.12/site-packages/Xlib/xobject/__pycache__/fontable.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..93b3e8090c8fcdf079aca1ded2906deb5f88ff33 GIT binary patch literal 4644 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/Xlib/xobject/__pycache__/icccm.cpython-312.pyc b/venv/lib/python3.12/site-packages/Xlib/xobject/__pycache__/icccm.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..53c99e84d20ffe67e65a753087ac9b1c4e2a6ea3 GIT binary patch literal 2910 zcmb`JPfQ|L9LHw{7#t8QRPYaqtGjhWs!kSL|7_cBwoS8cy6UQ_{7Dlt@86dn=}AowVtQEGOWoL{9z8X^_hcZEyrjt{J$WOcNt2%X=3l{Os`Sr0%)IaKeSZJu zJ!bgX;jm$7{Fr+Xd+NZjUuB^Wmo}-nNDMo`00wX#OW+YaK|}~#)&y@#m?LH!BQVyy zp+wT1)w^PEzig8gFdgI95N4e?CR8$Fy)sLuN;O`AMUSC)>iskzfV@N)RcZy;_icI& zf7=h$5@l87(rAaj?T^ezn2At6|b2eo)qFgOeuQyW1 z=#0uEV*ih4!RWMfHD*%c_o&$#ufPpFEV0qoXjA9N+HYv}HCxwB#x&Xkvq~%ZZ!~*? z?xre-4XB;u0d5 zO_e}qG}X$gr`V|ECq(%(pE}9fpQ`}~PNofLkf@BVo%F3p8&qGSl2`2pn zwyOw=pUkA7MF|JZ^7_2r1I;0xTNCA%t*E4M$a*{_CZ%LF$%_^_Ex9a-nWzLU4+Uu= z0LlAGn~?mF5dqSs#|(hv!rBJv9Xf(@^GPwm@UxsCrJ-q=m0(AZlj1;Ra>BCQ3$&|* zCLW?nxTq?~$7*k6P;JW^oKxeN=NINbf=H^IEjTB;Epwl-FR&V_5&L76PK#MO!2*t< zL5k0$=~P~dCxtP2QIR5)6hWGt~^}nQC+pgW-o!-6K zy$=p%_h$>Ae6>&v6_>sXeG@v0mEM>vQPW%G%g)|C;(*$x3NwYk^O?h$VzA^Lt9XZy znmn8=4u5^O;=PH)^x<^zu?TiIjTO)-nBiv>)-M3h4+>Y!u#PuuH?R5ar<<2GE{cIRdIWf zUfEwMEF3LXZP?(gb6?=h7pVAdp8M!CAN|*)Y9R&!RT8^BdOk9BHZt{_v&}P8bzz=C zE#T*;c-eioo+Pk-`)scEXD_X@5 zii=8hSJYcGnLHEKwtA7-Bj*pE7oOs?l6#^?S(MP7SV#Bv(r$PsT%ZcXbLx;PzFF!S cuk;LQYP8ft*VR8;tJ%qpzAtU!+vu$R2|`$7sQ>@~ literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/Xlib/xobject/__pycache__/resource.cpython-312.pyc b/venv/lib/python3.12/site-packages/Xlib/xobject/__pycache__/resource.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6be6df7e23d545ab3b69d58f4cbdec617f8000a6 GIT binary patch literal 2068 zcma)7&rc&&9Di?qv_lJY7q->~WUEM}2n>n|L^qqD(LHE5hzHYjCO@D@tf0*p+Ot>u>fj>YyUn zmgxVae7C&U%M!3xo6y4sq4e!}2#YFlnzp*sY05oltk?|LiyCdirJcCzV}!7)paIF< zK0u=b7c~}1g*xcHKV0&lVNnZ@hP*&N%PqVGnG!Q>qhLGvf~qqtA3tdV068B(kB8{m z=t{Z)V?_0w6M;1sVHIAa}@*@#MaGf9{9)^9Z7Q*S%+dar?8|-zUcFsljUb zpnN!ToH@#zrp9WQ#(qi-{nDS@*FK%Q&kjdEFQ4{jYTcQCf{r%$p!dQ8lfb3uN;f#~ z2mXYxB%07>Ye8?b6&d3wi1$F4`&0L34qn^)pe79mk2a$T=lG!i=mab-M4GHM;tL1O z5n>$XBIof2)Dk8ny9}f?9ic>4^Y&_6i3F@kl)VH5uuSyrzfzq&nElYLNrV4k;X5D> zO%GZ~r|RfrZRfna#qB_rEfUC(o%r=pJ3YNUIz6|21G-I@qNrxxwiN{nypZ1jDF4+t zrWaY8a{+4_olE=9)e}R9!g23W@1ykWX?pgnE8nKRPSvi>pC;yO(!B5N!iCDi9QEU| z1dG;q{D1$j$#$xvFKPH=pwM2y`z#-{(5MAnm08S_!ak7|7#iWl-Zo704b#ve#@KCr zEV4o2un}NfNXGa&NCSWt12hU+6&NO zdhj1HRb-Z9sg@bw776|s!3!5(^`z^812@=<@FLct{S=VjcuMJ$2|}NHEDTe5uk?h# H +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public License +# as published by the Free Software Foundation; either version 2.1 +# of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the +# Free Software Foundation, Inc., +# 59 Temple Place, +# Suite 330, +# Boston, MA 02111-1307 USA + +from Xlib import error +from Xlib.protocol import request + +from . import resource + +import re + +rgb_res = [ + re.compile(r'\Argb:([0-9a-fA-F]{1,4})/([0-9a-fA-F]{1,4})/([0-9a-fA-F]{1,4})\Z'), + re.compile(r'\A#([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])\Z'), + re.compile(r'\A#([0-9a-fA-F][0-9a-fA-F])([0-9a-fA-F][0-9a-fA-F])([0-9a-fA-F][0-9a-fA-F])\Z'), + re.compile(r'\A#([0-9a-fA-F][0-9a-fA-F][0-9a-fA-F])([0-9a-fA-F][0-9a-fA-F][0-9a-fA-F])([0-9a-fA-F][0-9a-fA-F][0-9a-fA-F])\Z'), + re.compile(r'\A#([0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F])([0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F])([0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F])\Z'), + ] + +class Colormap(resource.Resource): + __colormap__ = resource.Resource.__resource__ + + def free(self, onerror = None): + request.FreeColormap(display = self.display, + onerror = onerror, + cmap = self.id) + + self.display.free_resource_id(self.id) + + def copy_colormap_and_free(self, scr_cmap): + mid = self.display.allocate_resource_id() + request.CopyColormapAndFree(display = self.display, + mid = mid, + src_cmap = src_cmap) + + cls = self.display.get_resource_class('colormap', Colormap) + return cls(self.display, mid, owner = 1) + + def install_colormap(self, onerror = None): + request.InstallColormap(display = self.display, + onerror = onerror, + cmap = self.id) + + def uninstall_colormap(self, onerror = None): + request.UninstallColormap(display = self.display, + onerror = onerror, + cmap = self.id) + + def alloc_color(self, red, green, blue): + return request.AllocColor(display = self.display, + cmap = self.id, + red = red, + green = green, + blue = blue) + + def alloc_named_color(self, name): + for r in rgb_res: + m = r.match(name) + if m: + rs = m.group(1) + r = int(rs + '0' * (4 - len(rs)), 16) + + gs = m.group(2) + g = int(gs + '0' * (4 - len(gs)), 16) + + bs = m.group(3) + b = int(bs + '0' * (4 - len(bs)), 16) + + return self.alloc_color(r, g, b) + + try: + return request.AllocNamedColor(display = self.display, + cmap = self.id, + name = name) + except error.BadName: + return None + + def alloc_color_cells(self, contiguous, colors, planes): + return request.AllocColorCells(display = self.display, + contiguous = contiguous, + cmap = self.id, + colors = colors, + planes = planes) + + def alloc_color_planes(self, contiguous, colors, red, green, blue): + return request.AllocColorPlanes(display = self.display, + contiguous = contiguous, + cmap = self.id, + colors = colors, + red = red, + green = green, + blue = blue) + + def free_colors(self, pixels, plane_mask, onerror = None): + request.FreeColors(display = self.display, + onerror = onerror, + cmap = self.id, + plane_mask = plane_mask, + pixels = pixels) + + def store_colors(self, items, onerror = None): + request.StoreColors(display = self.display, + onerror = onerror, + cmap = self.id, + items = items) + + def store_named_color(self, name, pixel, flags, onerror = None): + request.StoreNamedColor(display = self.display, + onerror = onerror, + flags = flags, + cmap = self.id, + pixel = pixel, + name = name) + + def query_colors(self, pixels): + r = request.QueryColors(display = self.display, + cmap = self.id, + pixels = pixels) + return r.colors + + def lookup_color(self, name): + return request.LookupColor(display = self.display, + cmap = self.id, + name = name) diff --git a/venv/lib/python3.12/site-packages/Xlib/xobject/cursor.py b/venv/lib/python3.12/site-packages/Xlib/xobject/cursor.py new file mode 100644 index 0000000..2d49bbb --- /dev/null +++ b/venv/lib/python3.12/site-packages/Xlib/xobject/cursor.py @@ -0,0 +1,47 @@ +# Xlib.xobject.cursor -- cursor object +# +# Copyright (C) 2000 Peter Liljenberg +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public License +# as published by the Free Software Foundation; either version 2.1 +# of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the +# Free Software Foundation, Inc., +# 59 Temple Place, +# Suite 330, +# Boston, MA 02111-1307 USA + +from Xlib.protocol import request + +from . import resource + +class Cursor(resource.Resource): + __cursor__ = resource.Resource.__resource__ + + def free(self, onerror = None): + request.FreeCursor(display = self.display, + onerror = onerror, + cursor = self.id) + self.display.free_resource_id(self.id) + + def recolor(self, foreground, background, onerror=None): + fore_red, fore_green, fore_blue = foreground + back_red, back_green, back_blue = background + + request.RecolorCursor(display = self.display, + onerror = onerror, + cursor = self.id, + fore_red = fore_red, + fore_green = fore_green, + fore_blue = fore_blue, + back_red = back_red, + back_green = back_green, + back_blue = back_blue) diff --git a/venv/lib/python3.12/site-packages/Xlib/xobject/drawable.py b/venv/lib/python3.12/site-packages/Xlib/xobject/drawable.py new file mode 100644 index 0000000..c47b91b --- /dev/null +++ b/venv/lib/python3.12/site-packages/Xlib/xobject/drawable.py @@ -0,0 +1,835 @@ +# Xlib.xobject.drawable -- drawable objects (window and pixmap) +# +# Copyright (C) 2000 Peter Liljenberg +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public License +# as published by the Free Software Foundation; either version 2.1 +# of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the +# Free Software Foundation, Inc., +# 59 Temple Place, +# Suite 330, +# Boston, MA 02111-1307 USA + +from Xlib import X, Xatom +from Xlib.protocol import request, rq + +# Other X resource objects +from . import resource +from . import colormap +from . import cursor +from . import fontable + +# Inter-client communication conventions +from . import icccm + +class Drawable(resource.Resource): + __drawable__ = resource.Resource.__resource__ + + def get_geometry(self): + return request.GetGeometry(display = self.display, + drawable = self) + + def create_pixmap(self, width, height, depth): + pid = self.display.allocate_resource_id() + request.CreatePixmap(display = self.display, + depth = depth, + pid = pid, + drawable = self.id, + width = width, + height = height) + + cls = self.display.get_resource_class('pixmap', Pixmap) + return cls(self.display, pid, owner = 1) + + def create_gc(self, **keys): + cid = self.display.allocate_resource_id() + request.CreateGC(display = self.display, + cid = cid, + drawable = self.id, + attrs = keys) + + cls = self.display.get_resource_class('gc', fontable.GC) + return cls(self.display, cid, owner = 1) + + def copy_area(self, gc, src_drawable, src_x, src_y, width, height, dst_x, dst_y, onerror = None): + request.CopyArea(display = self.display, + onerror = onerror, + src_drawable = src_drawable, + dst_drawable = self.id, + gc = gc, + src_x = src_x, + src_y = src_y, + dst_x = dst_x, + dst_y = dst_y, + width = width, + height = height) + + def copy_plane(self, gc, src_drawable, src_x, src_y, width, height, + dst_x, dst_y, bit_plane, onerror = None): + request.CopyPlane(display = self.display, + onerror = onerror, + src_drawable = src_drawable, + dst_drawable = self.id, + gc = gc, + src_x = src_x, + src_y = src_y, + dst_x = dst_x, + dst_y = dst_y, + width = width, + height = height, + bit_plane = bit_plane) + + def poly_point(self, gc, coord_mode, points, onerror = None): + request.PolyPoint(display = self.display, + onerror = onerror, + coord_mode = coord_mode, + drawable = self.id, + gc = gc, + points = points) + + def point(self, gc, x, y, onerror = None): + request.PolyPoint(display = self.display, + onerror = onerror, + coord_mode = X.CoordModeOrigin, + drawable = self.id, + gc = gc, + points = [(x, y)]) + + def poly_line(self, gc, coord_mode, points, onerror = None): + request.PolyLine(display = self.display, + onerror = onerror, + coord_mode = coord_mode, + drawable = self.id, + gc = gc, + points = points) + + def line(self, gc, x1, y1, x2, y2, onerror = None): + request.PolySegment(display = self.display, + onerror = onerror, + drawable = self.id, + gc = gc, + segments = [(x1, y1, x2, y2)]) + + def poly_segment(self, gc, segments, onerror = None): + request.PolySegment(display = self.display, + onerror = onerror, + drawable = self.id, + gc = gc, + segments = segments) + + def poly_rectangle(self, gc, rectangles, onerror = None): + request.PolyRectangle(display = self.display, + onerror = onerror, + drawable = self.id, + gc = gc, + rectangles = rectangles) + + def rectangle(self, gc, x, y, width, height, onerror = None): + request.PolyRectangle(display = self.display, + onerror = onerror, + drawable = self.id, + gc = gc, + rectangles = [(x, y, width, height)]) + + + def poly_arc(self, gc, arcs, onerror = None): + request.PolyArc(display = self.display, + onerror = onerror, + drawable = self.id, + gc = gc, + arcs = arcs) + + def arc(self, gc, x, y, width, height, angle1, angle2, onerror = None): + request.PolyArc(display = self.display, + onerror = onerror, + drawable = self.id, + gc = gc, + arcs = [(x, y, width, height, angle1, angle2)]) + + def fill_poly(self, gc, shape, coord_mode, points, onerror = None): + request.FillPoly(display = self.display, + onerror = onerror, + shape = shape, + coord_mode = coord_mode, + drawable = self.id, + gc = gc, + points = points) + + def poly_fill_rectangle(self, gc, rectangles, onerror = None): + request.PolyFillRectangle(display = self.display, + onerror = onerror, + drawable = self.id, + gc = gc, + rectangles = rectangles) + + def fill_rectangle(self, gc, x, y, width, height, onerror = None): + request.PolyFillRectangle(display = self.display, + onerror = onerror, + drawable = self.id, + gc = gc, + rectangles = [(x, y, width, height)]) + + def poly_fill_arc(self, gc, arcs, onerror = None): + request.PolyFillArc(display = self.display, + onerror = onerror, + drawable = self.id, + gc = gc, + arcs = arcs) + + def fill_arc(self, gc, x, y, width, height, angle1, angle2, onerror = None): + request.PolyFillArc(display = self.display, + onerror = onerror, + drawable = self.id, + gc = gc, + arcs = [(x, y, width, height, angle1, angle2)]) + + + def put_image(self, gc, x, y, width, height, format, + depth, left_pad, data, onerror = None): + request.PutImage(display = self.display, + onerror = onerror, + format = format, + drawable = self.id, + gc = gc, + width = width, + height = height, + dst_x = x, + dst_y = y, + left_pad = left_pad, + depth = depth, + data = data) + + # Trivial little method for putting PIL images. Will break on anything + # but depth 1 or 24... + def put_pil_image(self, gc, x, y, image, onerror = None): + width, height = image.size + if image.mode == '1': + format = X.XYBitmap + depth = 1 + if self.display.info.bitmap_format_bit_order == 0: + rawmode = '1;R' + else: + rawmode = '1' + pad = self.display.info.bitmap_format_scanline_pad + stride = roundup(width, pad) >> 3 + elif image.mode == 'RGB': + format = X.ZPixmap + depth = 24 + if self.display.info.image_byte_order == 0: + rawmode = 'BGRX' + else: + rawmode = 'RGBX' + pad = self.display.info.bitmap_format_scanline_pad + unit = self.display.info.bitmap_format_scanline_unit + stride = roundup(width * unit, pad) >> 3 + else: + raise ValueError('Unknown data format') + + maxlen = (self.display.info.max_request_length << 2) \ + - request.PutImage._request.static_size + split = maxlen // stride + + x1 = 0 + x2 = width + y1 = 0 + + while y1 < height: + h = min(height, split) + if h < height: + subimage = image.crop((x1, y1, x2, y1 + h)) + else: + subimage = image + w, h = subimage.size + data = subimage.tobytes("raw", rawmode, stride, 0) + self.put_image(gc, x, y, w, h, format, depth, 0, data) + y1 = y1 + h + y = y + h + + + def get_image(self, x, y, width, height, format, plane_mask): + return request.GetImage(display = self.display, + format = format, + drawable = self.id, + x = x, + y = y, + width = width, + height = height, + plane_mask = plane_mask) + + def draw_text(self, gc, x, y, text, onerror = None): + request.PolyText8(display = self.display, + onerror = onerror, + drawable = self.id, + gc = gc, + x = x, + y = y, + items = [text]) + + def poly_text(self, gc, x, y, items, onerror = None): + request.PolyText8(display = self.display, + onerror = onerror, + drawable = self.id, + gc = gc, + x = x, + y = y, + items = items) + + def poly_text_16(self, gc, x, y, items, onerror = None): + request.PolyText16(display = self.display, + onerror = onerror, + drawable = self.id, + gc = gc, + x = x, + y = y, + items = items) + + def image_text(self, gc, x, y, string, onerror = None): + request.ImageText8(display = self.display, + onerror = onerror, + drawable = self.id, + gc = gc, + x = x, + y = y, + string = string) + + def image_text_16(self, gc, x, y, string, onerror = None): + request.ImageText16(display = self.display, + onerror = onerror, + drawable = self.id, + gc = gc, + x = x, + y = y, + string = string) + + def query_best_size(self, item_class, width, height): + return request.QueryBestSize(display = self.display, + item_class = item_class, + drawable = self.id, + width = width, + height = height) + +class Window(Drawable): + __window__ = resource.Resource.__resource__ + + _STRING_ENCODING = 'ISO-8859-1' + _UTF8_STRING_ENCODING = 'UTF-8' + + def create_window(self, x, y, width, height, border_width, depth, + window_class = X.CopyFromParent, + visual = X.CopyFromParent, + onerror = None, + **keys): + + wid = self.display.allocate_resource_id() + request.CreateWindow(display = self.display, + onerror = onerror, + depth = depth, + wid = wid, + parent = self.id, + x = x, + y = y, + width = width, + height = height, + border_width = border_width, + window_class = window_class, + visual = visual, + attrs = keys) + + cls = self.display.get_resource_class('window', Window) + return cls(self.display, wid, owner = 1) + + def change_attributes(self, onerror = None, **keys): + request.ChangeWindowAttributes(display = self.display, + onerror = onerror, + window = self.id, + attrs = keys) + + def get_attributes(self): + return request.GetWindowAttributes(display = self.display, + window = self.id) + + def destroy(self, onerror = None): + request.DestroyWindow(display = self.display, + onerror = onerror, + window = self.id) + + self.display.free_resource_id(self.id) + + def destroy_sub_windows(self, onerror = None): + request.DestroySubWindows(display = self.display, + onerror = onerror, + window = self.id) + + + def change_save_set(self, mode, onerror = None): + request.ChangeSaveSet(display = self.display, + onerror = onerror, + mode = mode, + window = self.id) + + def reparent(self, parent, x, y, onerror = None): + request.ReparentWindow(display = self.display, + onerror = onerror, + window = self.id, + parent = parent, + x = x, + y = y) + + def map(self, onerror = None): + request.MapWindow(display = self.display, + onerror = onerror, + window = self.id) + + def map_sub_windows(self, onerror = None): + request.MapSubwindows(display = self.display, + onerror = onerror, + window = self.id) + + def unmap(self, onerror = None): + request.UnmapWindow(display = self.display, + onerror = onerror, + window = self.id) + + def unmap_sub_windows(self, onerror = None): + request.UnmapSubwindows(display = self.display, + onerror = onerror, + window = self.id) + + def configure(self, onerror = None, **keys): + request.ConfigureWindow(display = self.display, + onerror = onerror, + window = self.id, + attrs = keys) + + def circulate(self, direction, onerror = None): + request.CirculateWindow(display = self.display, + onerror = onerror, + direction = direction, + window = self.id) + + def raise_window(self, onerror = None): + """alias for raising the window to the top - as in XRaiseWindow""" + self.configure(onerror, stack_mode = X.Above) + + def query_tree(self): + return request.QueryTree(display = self.display, + window = self.id) + + def change_property(self, property, property_type, format, data, + mode = X.PropModeReplace, onerror = None): + + request.ChangeProperty(display = self.display, + onerror = onerror, + mode = mode, + window = self.id, + property = property, + type = property_type, + data = (format, data)) + + def change_text_property(self, property, property_type, data, + mode = X.PropModeReplace, onerror = None): + if not isinstance(data, bytes): + if property_type == Xatom.STRING: + data = data.encode(self._STRING_ENCODING) + elif property_type == self.display.get_atom('UTF8_STRING'): + data = data.encode(self._UTF8_STRING_ENCODING) + self.change_property(property, property_type, 8, data, + mode=mode, onerror=onerror) + + def delete_property(self, property, onerror = None): + request.DeleteProperty(display = self.display, + onerror = onerror, + window = self.id, + property = property) + + def get_property(self, property, property_type, offset, length, delete = False): + r = request.GetProperty(display = self.display, + delete = delete, + window = self.id, + property = property, + type = property_type, + long_offset = offset, + long_length = length) + + if r.property_type: + fmt, value = r.value + r.format = fmt + r.value = value + return r + else: + return None + + def get_full_property(self, property, property_type, sizehint = 10): + prop = self.get_property(property, property_type, 0, sizehint) + if prop: + val = prop.value + if prop.bytes_after: + prop = self.get_property(property, property_type, sizehint, + prop.bytes_after // 4 + 1) + val = val + prop.value + + prop.value = val + return prop + else: + return None + + def get_full_text_property(self, property, property_type=X.AnyPropertyType, sizehint = 10): + prop = self.get_full_property(property, property_type, + sizehint=sizehint) + if prop is None or prop.format != 8: + return None + if prop.property_type == Xatom.STRING: + prop.value = prop.value.decode(self._STRING_ENCODING) + elif prop.property_type == self.display.get_atom('UTF8_STRING'): + prop.value = prop.value.decode(self._UTF8_STRING_ENCODING) + # FIXME: at least basic support for compound text would be nice. + # elif prop.property_type == self.display.get_atom('COMPOUND_TEXT'): + return prop.value + + def list_properties(self): + r = request.ListProperties(display = self.display, + window = self.id) + return r.atoms + + def set_selection_owner(self, selection, time, onerror = None): + request.SetSelectionOwner(display = self.display, + onerror = onerror, + window = self.id, + selection = selection, + time = time) + + def convert_selection(self, selection, target, property, time, onerror = None): + request.ConvertSelection(display = self.display, + onerror = onerror, + requestor = self.id, + selection = selection, + target = target, + property = property, + time = time) + + def send_event(self, event, event_mask = 0, propagate = False, onerror = None): + request.SendEvent(display = self.display, + onerror = onerror, + propagate = propagate, + destination = self.id, + event_mask = event_mask, + event = event) + + def grab_pointer(self, owner_events, event_mask, + pointer_mode, keyboard_mode, + confine_to, cursor, time): + + r = request.GrabPointer(display = self.display, + owner_events = owner_events, + grab_window = self.id, + event_mask = event_mask, + pointer_mode = pointer_mode, + keyboard_mode = keyboard_mode, + confine_to = confine_to, + cursor = cursor, + time = time) + return r.status + + def grab_button(self, button, modifiers, owner_events, event_mask, + pointer_mode, keyboard_mode, + confine_to, cursor, onerror = None): + + request.GrabButton(display = self.display, + onerror = onerror, + owner_events = owner_events, + grab_window = self.id, + event_mask = event_mask, + pointer_mode = pointer_mode, + keyboard_mode = keyboard_mode, + confine_to = confine_to, + cursor = cursor, + button = button, + modifiers = modifiers) + + def ungrab_button(self, button, modifiers, onerror = None): + request.UngrabButton(display = self.display, + onerror = onerror, + button = button, + grab_window = self.id, + modifiers = modifiers) + + + def grab_keyboard(self, owner_events, pointer_mode, keyboard_mode, time): + r = request.GrabKeyboard(display = self.display, + owner_events = owner_events, + grab_window = self.id, + time = time, + pointer_mode = pointer_mode, + keyboard_mode = keyboard_mode) + + return r.status + + def grab_key(self, key, modifiers, owner_events, pointer_mode, keyboard_mode, onerror = None): + request.GrabKey(display = self.display, + onerror = onerror, + owner_events = owner_events, + grab_window = self.id, + modifiers = modifiers, + key = key, + pointer_mode = pointer_mode, + keyboard_mode = keyboard_mode) + + def ungrab_key(self, key, modifiers, onerror = None): + request.UngrabKey(display = self.display, + onerror = onerror, + key = key, + grab_window = self.id, + modifiers = modifiers) + + def query_pointer(self): + return request.QueryPointer(display = self.display, + window = self.id) + + def get_motion_events(self, start, stop): + r = request.GetMotionEvents(display = self.display, + window = self.id, + start = start, + stop = stop) + return r.events + + def translate_coords(self, src_window, src_x, src_y): + return request.TranslateCoords(display = self.display, + src_wid = src_window, + dst_wid = self.id, + src_x = src_x, + src_y = src_y) + + def warp_pointer(self, x, y, src_window = 0, src_x = 0, src_y = 0, + src_width = 0, src_height = 0, onerror = None): + + request.WarpPointer(display = self.display, + onerror = onerror, + src_window = src_window, + dst_window = self.id, + src_x = src_x, + src_y = src_y, + src_width = src_width, + src_height = src_height, + dst_x = x, + dst_y = y) + + def set_input_focus(self, revert_to, time, onerror = None): + request.SetInputFocus(display = self.display, + onerror = onerror, + revert_to = revert_to, + focus = self.id, + time = time) + + def clear_area(self, x = 0, y = 0, width = 0, height = 0, exposures = False, onerror = None): + request.ClearArea(display = self.display, + onerror = onerror, + exposures = exposures, + window = self.id, + x = x, + y = y, + width = width, + height = height) + + def create_colormap(self, visual, alloc): + mid = self.display.allocate_resource_id() + request.CreateColormap(display = self.display, + alloc = alloc, + mid = mid, + window = self.id, + visual = visual) + cls = self.display.get_resource_class('colormap', colormap.Colormap) + return cls(self.display, mid, owner = 1) + + def list_installed_colormaps(self): + r = request.ListInstalledColormaps(display = self.display, + window = self.id) + return r.cmaps + + def rotate_properties(self, properties, delta, onerror = None): + request.RotateProperties(display = self.display, + onerror = onerror, + window = self.id, + delta = delta, + properties = properties) + + def set_wm_name(self, name, onerror = None): + self.change_text_property(Xatom.WM_NAME, Xatom.STRING, name, + onerror = onerror) + + def get_wm_name(self): + return self.get_full_text_property(Xatom.WM_NAME, Xatom.STRING) + + def set_wm_icon_name(self, name, onerror = None): + self.change_text_property(Xatom.WM_ICON_NAME, Xatom.STRING, name, + onerror = onerror) + + def get_wm_icon_name(self): + return self.get_full_text_property(Xatom.WM_ICON_NAME, Xatom.STRING) + + def set_wm_class(self, inst, cls, onerror = None): + self.change_text_property(Xatom.WM_CLASS, Xatom.STRING, + '%s\0%s\0' % (inst, cls), + onerror = onerror) + + def get_wm_class(self): + value = self.get_full_text_property(Xatom.WM_CLASS, Xatom.STRING) + if value is None: + return None + parts = value.split('\0') + if len(parts) < 2: + return None + else: + return parts[0], parts[1] + + def set_wm_transient_for(self, window, onerror = None): + self.change_property(Xatom.WM_TRANSIENT_FOR, Xatom.WINDOW, + 32, [window.id], + onerror = onerror) + + def get_wm_transient_for(self): + d = self.get_property(Xatom.WM_TRANSIENT_FOR, Xatom.WINDOW, 0, 1) + if d is None or d.format != 32 or len(d.value) < 1: + return None + else: + cls = self.display.get_resource_class('window', Window) + return cls(self.display, d.value[0]) + + + def set_wm_protocols(self, protocols, onerror = None): + self.change_property(self.display.get_atom('WM_PROTOCOLS'), + Xatom.ATOM, 32, protocols, + onerror = onerror) + + def get_wm_protocols(self): + d = self.get_full_property(self.display.get_atom('WM_PROTOCOLS'), Xatom.ATOM) + if d is None or d.format != 32: + return [] + else: + return d.value + + def set_wm_colormap_windows(self, windows, onerror = None): + self.change_property(self.display.get_atom('WM_COLORMAP_WINDOWS'), + Xatom.WINDOW, 32, + map(lambda w: w.id, windows), + onerror = onerror) + + def get_wm_colormap_windows(self): + d = self.get_full_property(self.display.get_atom('WM_COLORMAP_WINDOWS'), + Xatom.WINDOW) + if d is None or d.format != 32: + return [] + else: + cls = self.display.get_resource_class('window', Window) + return map(lambda i, d = self.display, c = cls: c(d, i), + d.value) + + + def set_wm_client_machine(self, name, onerror = None): + self.change_text_property(Xatom.WM_CLIENT_MACHINE, Xatom.STRING, name, + onerror = onerror) + + def get_wm_client_machine(self): + return self.get_full_text_property(Xatom.WM_CLIENT_MACHINE, Xatom.STRING) + + def set_wm_normal_hints(self, hints = {}, onerror = None, **keys): + self._set_struct_prop(Xatom.WM_NORMAL_HINTS, Xatom.WM_SIZE_HINTS, + icccm.WMNormalHints, hints, keys, onerror) + + def get_wm_normal_hints(self): + return self._get_struct_prop(Xatom.WM_NORMAL_HINTS, Xatom.WM_SIZE_HINTS, + icccm.WMNormalHints) + + def set_wm_hints(self, hints = {}, onerror = None, **keys): + self._set_struct_prop(Xatom.WM_HINTS, Xatom.WM_HINTS, + icccm.WMHints, hints, keys, onerror) + + def get_wm_hints(self): + return self._get_struct_prop(Xatom.WM_HINTS, Xatom.WM_HINTS, + icccm.WMHints) + + def set_wm_state(self, hints = {}, onerror = None, **keys): + atom = self.display.get_atom('WM_STATE') + self._set_struct_prop(atom, atom, icccm.WMState, hints, keys, onerror) + + def get_wm_state(self): + atom = self.display.get_atom('WM_STATE') + return self._get_struct_prop(atom, atom, icccm.WMState) + + def set_wm_icon_size(self, hints = {}, onerror = None, **keys): + self._set_struct_prop(Xatom.WM_ICON_SIZE, Xatom.WM_ICON_SIZE, + icccm.WMIconSize, hints, keys, onerror) + + def get_wm_icon_size(self): + return self._get_struct_prop(Xatom.WM_ICON_SIZE, Xatom.WM_ICON_SIZE, + icccm.WMIconSize) + + # Helper function for getting structured properties. + # pname and ptype are atoms, and pstruct is a Struct object. + # Returns a DictWrapper, or None + + def _get_struct_prop(self, pname, ptype, pstruct): + r = self.get_property(pname, ptype, 0, pstruct.static_size // 4) + if r and r.format == 32: + value = rq.encode_array(r.value) + if len(value) == pstruct.static_size: + return pstruct.parse_binary(value, self.display)[0] + + return None + + # Helper function for setting structured properties. + # pname and ptype are atoms, and pstruct is a Struct object. + # hints is a mapping or a DictWrapper, keys is a mapping. keys + # will be modified. onerror is the error handler. + + def _set_struct_prop(self, pname, ptype, pstruct, hints, keys, onerror): + if isinstance(hints, rq.DictWrapper): + keys.update(hints._data) + else: + keys.update(hints) + + value = pstruct.to_binary(*(), **keys) + + self.change_property(pname, ptype, 32, value, onerror = onerror) + + +class Pixmap(Drawable): + __pixmap__ = resource.Resource.__resource__ + + def free(self, onerror = None): + request.FreePixmap(display = self.display, + onerror = onerror, + pixmap = self.id) + + self.display.free_resource_id(self.id) + + def create_cursor(self, mask, foreground, background, x, y): + fore_red, fore_green, fore_blue = foreground + back_red, back_green, back_blue = background + cid = self.display.allocate_resource_id() + request.CreateCursor(display = self.display, + cid = cid, + source = self.id, + mask = mask, + fore_red = fore_red, + fore_green = fore_green, + fore_blue = fore_blue, + back_red = back_red, + back_green = back_green, + back_blue = back_blue, + x = x, + y = y) + cls = self.display.get_resource_class('cursor', cursor.Cursor) + return cls(self.display, cid, owner = 1) + + +def roundup(value, unit): + return (value + (unit - 1)) & ~(unit - 1) diff --git a/venv/lib/python3.12/site-packages/Xlib/xobject/fontable.py b/venv/lib/python3.12/site-packages/Xlib/xobject/fontable.py new file mode 100644 index 0000000..4a33890 --- /dev/null +++ b/venv/lib/python3.12/site-packages/Xlib/xobject/fontable.py @@ -0,0 +1,110 @@ +# Xlib.xobject.fontable -- fontable objects (GC, font) +# +# Copyright (C) 2000 Peter Liljenberg +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public License +# as published by the Free Software Foundation; either version 2.1 +# of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the +# Free Software Foundation, Inc., +# 59 Temple Place, +# Suite 330, +# Boston, MA 02111-1307 USA + +from Xlib.protocol import request + +from . import resource +from . import cursor + +class Fontable(resource.Resource): + __fontable__ = resource.Resource.__resource__ + + def query(self): + return request.QueryFont(display = self.display, + font = self.id) + + def query_text_extents(self, string): + return request.QueryTextExtents(display = self.display, + font = self.id, + string = string) + + +class GC(Fontable): + __gc__ = resource.Resource.__resource__ + + def change(self, onerror = None, **keys): + request.ChangeGC(display = self.display, + onerror = onerror, + gc = self.id, + attrs = keys) + + + def copy(self, src_gc, mask, onerror = None): + request.CopyGC(display = self.display, + onerror = onerror, + src_gc = src_gc, + dst_gc = self.id, + mask = mask) + + def set_dashes(self, offset, dashes, onerror = None): + request.SetDashes(display = self.display, + onerror = onerror, + gc = self.id, + dash_offset = offset, + dashes = dashes) + + def set_clip_rectangles(self, x_origin, y_origin, rectangles, ordering, onerror = None): + request.SetClipRectangles(display = self.display, + onerror = onerror, + ordering = ordering, + gc = self.id, + x_origin = x_origin, + y_origin = y_origin, + rectangles = rectangles) + def free(self, onerror = None): + request.FreeGC(display = self.display, + onerror = onerror, + gc = self.id) + + self.display.free_resource_id(self.id) + + + +class Font(Fontable): + __font__ = resource.Resource.__resource__ + + def close(self, onerror = None): + request.CloseFont(display = self.display, + onerror = onerror, + font = self.id) + self.display.free_resource_id(self.id) + + def create_glyph_cursor(self, mask, source_char, mask_char, + foreground, background): + fore_red, fore_green, fore_blue = foreground + back_red, back_green, back_blue = background + + cid = self.display.allocate_resource_id() + request.CreateGlyphCursor(display = self.display, + cid = cid, + source = self.id, + mask = mask, + source_char = source_char, + mask_char = mask_char, + fore_red = fore_red, + fore_green = fore_green, + fore_blue = fore_blue, + back_red = back_red, + back_green = back_green, + back_blue = back_blue) + + cls = self.display.get_resource_class('cursor', cursor.Cursor) + return cls(self.display, cid, owner = 1) diff --git a/venv/lib/python3.12/site-packages/Xlib/xobject/icccm.py b/venv/lib/python3.12/site-packages/Xlib/xobject/icccm.py new file mode 100644 index 0000000..a328925 --- /dev/null +++ b/venv/lib/python3.12/site-packages/Xlib/xobject/icccm.py @@ -0,0 +1,75 @@ +# Xlib.xobject.icccm -- ICCCM structures +# +# Copyright (C) 2000 Peter Liljenberg +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public License +# as published by the Free Software Foundation; either version 2.1 +# of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the +# Free Software Foundation, Inc., +# 59 Temple Place, +# Suite 330, +# Boston, MA 02111-1307 USA + +from Xlib import X, Xutil +from Xlib.protocol import rq + +Aspect = rq.Struct( rq.Int32('num'), rq.Int32('denum') ) + +WMNormalHints = rq.Struct( rq.Card32('flags'), + rq.Pad(16), + rq.Int32('min_width', default = 0), + rq.Int32('min_height', default = 0), + rq.Int32('max_width', default = 0), + rq.Int32('max_height', default = 0), + rq.Int32('width_inc', default = 0), + rq.Int32('height_inc', default = 0), + rq.Object('min_aspect', Aspect, default = (0, 0)), + rq.Object('max_aspect', Aspect, default = (0, 0)), + rq.Int32('base_width', default = 0), + rq.Int32('base_height', default = 0), + rq.Int32('win_gravity', default = 0), + ) + +WMHints = rq.Struct( rq.Card32('flags'), + rq.Card32('input', default = 0), + rq.Set('initial_state', 4, + # withdrawn is totally bogus according to + # ICCCM, but some window managers seem to + # use this value to identify dockapps. + # Oh well. + ( Xutil.WithdrawnState, + Xutil.NormalState, + Xutil.IconicState ), + default = Xutil.NormalState), + rq.Pixmap('icon_pixmap', default = 0), + rq.Window('icon_window', default = 0), + rq.Int32('icon_x', default = 0), + rq.Int32('icon_y', default = 0), + rq.Pixmap('icon_mask', default = 0), + rq.Window('window_group', default = 0), + ) + +WMState = rq.Struct( rq.Set('state', 4, + ( Xutil.WithdrawnState, + Xutil.NormalState, + Xutil.IconicState )), + rq.Window('icon', ( X.NONE, )), + ) + + +WMIconSize = rq.Struct( rq.Card32('min_width'), + rq.Card32('min_height'), + rq.Card32('max_width'), + rq.Card32('max_height'), + rq.Card32('width_inc'), + rq.Card32('height_inc'), + ) diff --git a/venv/lib/python3.12/site-packages/Xlib/xobject/resource.py b/venv/lib/python3.12/site-packages/Xlib/xobject/resource.py new file mode 100644 index 0000000..460b1f0 --- /dev/null +++ b/venv/lib/python3.12/site-packages/Xlib/xobject/resource.py @@ -0,0 +1,54 @@ +# Xlib.xobject.resource -- any X resource object +# +# Copyright (C) 2000 Peter Liljenberg +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public License +# as published by the Free Software Foundation; either version 2.1 +# of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the +# Free Software Foundation, Inc., +# 59 Temple Place, +# Suite 330, +# Boston, MA 02111-1307 USA + +from Xlib.protocol import request + +class Resource(object): + def __init__(self, display, rid, owner = 0): + self.display = display + self.id = rid + self.owner = owner + + def __resource__(self): + return self.id + + def __eq__(self, obj): + if isinstance(obj, Resource): + if self.display == obj.display: + return self.id == obj.id + else: + return False + else: + return id(self) == id(obj) + + def __ne__(self, obj): + return not self == obj + + def __hash__(self): + return int(self.id) + + def __repr__(self): + return '<%s 0x%08x>' % (self.__class__.__name__, self.id) + + def kill_client(self, onerror = None): + request.KillClient(display = self.display, + onerror = onerror, + resource = self.id) diff --git a/venv/lib/python3.12/site-packages/__pycache__/six.cpython-312.pyc b/venv/lib/python3.12/site-packages/__pycache__/six.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f164f02821240b405f74ad23745c99280e334d66 GIT binary patch literal 41204 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 SDKU{-;ka0D`J~PS_kRJGz)_t5 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/_dbus_bindings.cpython-312-x86_64-linux-gnu.so b/venv/lib/python3.12/site-packages/_dbus_bindings.cpython-312-x86_64-linux-gnu.so new file mode 100755 index 0000000000000000000000000000000000000000..7be02e94cc6c9ded4252bf97a78d34d5393d2588 GIT binary patch literal 197240 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/_dbus_glib_bindings.cpython-312-x86_64-linux-gnu.so b/venv/lib/python3.12/site-packages/_dbus_glib_bindings.cpython-312-x86_64-linux-gnu.so new file mode 100755 index 0000000000000000000000000000000000000000..3f4acdc6b196480a109eac98c45e32ee42230adb GIT binary patch literal 29232 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/bidict-0.23.1.dist-info/INSTALLER b/venv/lib/python3.12/site-packages/bidict-0.23.1.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/venv/lib/python3.12/site-packages/bidict-0.23.1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/venv/lib/python3.12/site-packages/bidict-0.23.1.dist-info/LICENSE b/venv/lib/python3.12/site-packages/bidict-0.23.1.dist-info/LICENSE new file mode 100644 index 0000000..d1cc6f8 --- /dev/null +++ b/venv/lib/python3.12/site-packages/bidict-0.23.1.dist-info/LICENSE @@ -0,0 +1,376 @@ +Mozilla Public License Version 2.0 +================================== + +Copyright 2009-2024 Joshua Bronson. All rights reserved. + + +1. Definitions +-------------- + +1.1. "Contributor" + means each individual or legal entity that creates, contributes to + the creation of, or owns Covered Software. + +1.2. "Contributor Version" + means the combination of the Contributions of others (if any) used + by a Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + means Source Code Form to which the initial Contributor has attached + the notice in Exhibit A, the Executable Form of such Source Code + Form, and Modifications of such Source Code Form, in each case + including portions thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + (a) that the initial Contributor has attached the notice described + in Exhibit B to the Covered Software; or + + (b) that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the + terms of a Secondary License. + +1.6. "Executable Form" + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + means a work that combines Covered Software with other material, in + a separate file or files, that is not Covered Software. + +1.8. "License" + means this document. + +1.9. "Licensable" + means having the right to grant, to the maximum extent possible, + whether at the time of the initial grant or subsequently, any and + all of the rights conveyed by this License. + +1.10. "Modifications" + means any of the following: + + (a) any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + Software; or + + (b) any new file in Source Code Form that contains any Covered + Software. + +1.11. "Patent Claims" of a Contributor + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the + License, by the making, using, selling, offering for sale, having + made, import, or transfer of either its Contributions or its + Contributor Version. + +1.12. "Secondary License" + means either the GNU General Public License, Version 2.0, the GNU + Lesser General Public License, Version 2.1, the GNU Affero General + Public License, Version 3.0, or any later versions of those + licenses. + +1.13. "Source Code Form" + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that + controls, is controlled by, or is under common control with You. For + purposes of this definition, "control" means (a) the power, direct + or indirect, to cause the direction or management of such entity, + whether by contract or otherwise, or (b) ownership of more than + fifty percent (50%) of the outstanding shares or beneficial + ownership of such entity. + +2. License Grants and Conditions +-------------------------------- + +2.1. Grants + +Each Contributor hereby grants You a world-wide, royalty-free, +non-exclusive license: + +(a) under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + +(b) under Patent Claims of such Contributor to make, use, sell, offer + for sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + +The licenses granted in Section 2.1 with respect to any Contribution +become effective for each Contribution on the date the Contributor first +distributes such Contribution. + +2.3. Limitations on Grant Scope + +The licenses granted in this Section 2 are the only rights granted under +this License. No additional rights or licenses will be implied from the +distribution or licensing of Covered Software under this License. +Notwithstanding Section 2.1(b) above, no patent license is granted by a +Contributor: + +(a) for any code that a Contributor has removed from Covered Software; + or + +(b) for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + +(c) under Patent Claims infringed by Covered Software in the absence of + its Contributions. + +This License does not grant any rights in the trademarks, service marks, +or logos of any Contributor (except as may be necessary to comply with +the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + +No Contributor makes additional grants as a result of Your choice to +distribute the Covered Software under a subsequent version of this +License (see Section 10.2) or under the terms of a Secondary License (if +permitted under the terms of Section 3.3). + +2.5. Representation + +Each Contributor represents that the Contributor believes its +Contributions are its original creation(s) or it has sufficient rights +to grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + +This License is not intended to limit any rights You have under +applicable copyright doctrines of fair use, fair dealing, or other +equivalents. + +2.7. Conditions + +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted +in Section 2.1. + +3. Responsibilities +------------------- + +3.1. Distribution of Source Form + +All distribution of Covered Software in Source Code Form, including any +Modifications that You create or to which You contribute, must be under +the terms of this License. You must inform recipients that the Source +Code Form of the Covered Software is governed by the terms of this +License, and how they can obtain a copy of this License. You may not +attempt to alter or restrict the recipients' rights in the Source Code +Form. + +3.2. Distribution of Executable Form + +If You distribute Covered Software in Executable Form then: + +(a) such Covered Software must also be made available in Source Code + Form, as described in Section 3.1, and You must inform recipients of + the Executable Form how they can obtain a copy of such Source Code + Form by reasonable means in a timely manner, at a charge no more + than the cost of distribution to the recipient; and + +(b) You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter + the recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + +You may create and distribute a Larger Work under terms of Your choice, +provided that You also comply with the requirements of this License for +the Covered Software. If the Larger Work is a combination of Covered +Software with a work governed by one or more Secondary Licenses, and the +Covered Software is not Incompatible With Secondary Licenses, this +License permits You to additionally distribute such Covered Software +under the terms of such Secondary License(s), so that the recipient of +the Larger Work may, at their option, further distribute the Covered +Software under the terms of either this License or such Secondary +License(s). + +3.4. Notices + +You may not remove or alter the substance of any license notices +(including copyright notices, patent notices, disclaimers of warranty, +or limitations of liability) contained within the Source Code Form of +the Covered Software, except that You may alter any license notices to +the extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + +You may choose to offer, and to charge a fee for, warranty, support, +indemnity or liability obligations to one or more recipients of Covered +Software. However, You may do so only on Your own behalf, and not on +behalf of any Contributor. You must make it absolutely clear that any +such warranty, support, indemnity, or liability obligation is offered by +You alone, and You hereby agree to indemnify every Contributor for any +liability incurred by such Contributor as a result of warranty, support, +indemnity or liability terms You offer. You may include additional +disclaimers of warranty and limitations of liability specific to any +jurisdiction. + +4. Inability to Comply Due to Statute or Regulation +--------------------------------------------------- + +If it is impossible for You to comply with any of the terms of this +License with respect to some or all of the Covered Software due to +statute, judicial order, or regulation then You must: (a) comply with +the terms of this License to the maximum extent possible; and (b) +describe the limitations and the code they affect. Such description must +be placed in a text file included with all distributions of the Covered +Software under this License. Except to the extent prohibited by statute +or regulation, such description must be sufficiently detailed for a +recipient of ordinary skill to be able to understand it. + +5. Termination +-------------- + +5.1. The rights granted under this License will terminate automatically +if You fail to comply with any of its terms. However, if You become +compliant, then the rights granted under this License from a particular +Contributor are reinstated (a) provisionally, unless and until such +Contributor explicitly and finally terminates Your grants, and (b) on an +ongoing basis, if such Contributor fails to notify You of the +non-compliance by some reasonable means prior to 60 days after You have +come back into compliance. Moreover, Your grants from a particular +Contributor are reinstated on an ongoing basis if such Contributor +notifies You of the non-compliance by some reasonable means, this is the +first time You have received notice of non-compliance with this License +from such Contributor, and You become compliant prior to 30 days after +Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent +infringement claim (excluding declaratory judgment actions, +counter-claims, and cross-claims) alleging that a Contributor Version +directly or indirectly infringes any patent, then the rights granted to +You by any and all Contributors for the Covered Software under Section +2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all +end user license agreements (excluding distributors and resellers) which +have been validly granted by You or Your distributors under this License +prior to termination shall survive termination. + +************************************************************************ +* * +* 6. Disclaimer of Warranty * +* ------------------------- * +* * +* Covered Software is provided under this License on an "as is" * +* basis, without warranty of any kind, either expressed, implied, or * +* statutory, including, without limitation, warranties that the * +* Covered Software is free of defects, merchantable, fit for a * +* particular purpose or non-infringing. The entire risk as to the * +* quality and performance of the Covered Software is with You. * +* Should any Covered Software prove defective in any respect, You * +* (not any Contributor) assume the cost of any necessary servicing, * +* repair, or correction. This disclaimer of warranty constitutes an * +* essential part of this License. No use of any Covered Software is * +* authorized under this License except under this disclaimer. * +* * +************************************************************************ + +************************************************************************ +* * +* 7. Limitation of Liability * +* -------------------------- * +* * +* Under no circumstances and under no legal theory, whether tort * +* (including negligence), contract, or otherwise, shall any * +* Contributor, or anyone who distributes Covered Software as * +* permitted above, be liable to You for any direct, indirect, * +* special, incidental, or consequential damages of any character * +* including, without limitation, damages for lost profits, loss of * +* goodwill, work stoppage, computer failure or malfunction, or any * +* and all other commercial damages or losses, even if such party * +* shall have been informed of the possibility of such damages. This * +* limitation of liability shall not apply to liability for death or * +* personal injury resulting from such party's negligence to the * +* extent applicable law prohibits such limitation. Some * +* jurisdictions do not allow the exclusion or limitation of * +* incidental or consequential damages, so this exclusion and * +* limitation may not apply to You. * +* * +************************************************************************ + +8. Litigation +------------- + +Any litigation relating to this License may be brought only in the +courts of a jurisdiction where the defendant maintains its principal +place of business and such litigation shall be governed by laws of that +jurisdiction, without reference to its conflict-of-law provisions. +Nothing in this Section shall prevent a party's ability to bring +cross-claims or counter-claims. + +9. Miscellaneous +---------------- + +This License represents the complete agreement concerning the subject +matter hereof. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent +necessary to make it enforceable. Any law or regulation which provides +that the language of a contract shall be construed against the drafter +shall not be used to construe this License against a Contributor. + +10. Versions of the License +--------------------------- + +10.1. New Versions + +Mozilla Foundation is the license steward. Except as provided in Section +10.3, no one other than the license steward has the right to modify or +publish new versions of this License. Each version will be given a +distinguishing version number. + +10.2. Effect of New Versions + +You may distribute the Covered Software under the terms of the version +of the License under which You originally received the Covered Software, +or under the terms of any subsequent version published by the license +steward. + +10.3. Modified Versions + +If you create software not governed by this License, and you want to +create a new license for such software, you may create and use a +modified version of this License if you rename the license and remove +any references to the name of the license steward (except to note that +such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary +Licenses + +If You choose to distribute Source Code Form that is Incompatible With +Secondary Licenses under the terms of this version of the License, the +notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice +------------------------------------------- + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular +file, then You may include the notice in a location (such as a LICENSE +file in a relevant directory) where a recipient would be likely to look +for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice +--------------------------------------------------------- + + This Source Code Form is "Incompatible With Secondary Licenses", as + defined by the Mozilla Public License, v. 2.0. diff --git a/venv/lib/python3.12/site-packages/bidict-0.23.1.dist-info/METADATA b/venv/lib/python3.12/site-packages/bidict-0.23.1.dist-info/METADATA new file mode 100644 index 0000000..5356d23 --- /dev/null +++ b/venv/lib/python3.12/site-packages/bidict-0.23.1.dist-info/METADATA @@ -0,0 +1,260 @@ +Metadata-Version: 2.1 +Name: bidict +Version: 0.23.1 +Summary: The bidirectional mapping library for Python. +Author-email: Joshua Bronson +License: MPL 2.0 +Project-URL: Changelog, https://bidict.readthedocs.io/changelog.html +Project-URL: Documentation, https://bidict.readthedocs.io +Project-URL: Funding, https://bidict.readthedocs.io/#sponsoring +Project-URL: Repository, https://github.com/jab/bidict +Keywords: bidict,bimap,bidirectional,dict,dictionary,mapping,collections +Classifier: License :: OSI Approved :: Mozilla Public License 2.0 (MPL 2.0) +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Typing :: Typed +Requires-Python: >=3.8 +Description-Content-Type: text/x-rst +License-File: LICENSE + +.. role:: doc +.. (Forward declaration for the "doc" role that Sphinx defines for interop with renderers that + are often used to show this doc and that are unaware of Sphinx (GitHub.com, PyPI.org, etc.). + Use :doc: rather than :ref: here for better interop as well.) + + +bidict +====== + +*The bidirectional mapping library for Python.* + + +Status +------ + +.. image:: https://img.shields.io/pypi/v/bidict.svg + :target: https://pypi.org/project/bidict + :alt: Latest release + +.. image:: https://img.shields.io/readthedocs/bidict/main.svg + :target: https://bidict.readthedocs.io/en/main/ + :alt: Documentation + +.. image:: https://github.com/jab/bidict/actions/workflows/test.yml/badge.svg + :target: https://github.com/jab/bidict/actions/workflows/test.yml?query=branch%3Amain + :alt: GitHub Actions CI status + +.. image:: https://img.shields.io/pypi/l/bidict.svg + :target: https://raw.githubusercontent.com/jab/bidict/main/LICENSE + :alt: License + +.. image:: https://static.pepy.tech/badge/bidict + :target: https://pepy.tech/project/bidict + :alt: PyPI Downloads + +.. image:: https://img.shields.io/badge/GitHub-sponsor-ff69b4 + :target: https://github.com/sponsors/jab + :alt: Sponsor + + +Features +-------- + +- Mature: Depended on by + Google, Venmo, CERN, Baidu, Tencent, + and teams across the world since 2009 + +- Familiar, Pythonic APIs + that are carefully designed for + safety, simplicity, flexibility, and ergonomics + +- Lightweight, with no runtime dependencies + outside Python's standard library + +- Implemented in + concise, well-factored, fully type-hinted Python code + that is optimized for running efficiently + as well as for long-term maintenance and stability + (as well as `joy <#learning-from-bidict>`__) + +- Extensively `documented `__ + +- 100% test coverage + running continuously across all supported Python versions + (including property-based tests and benchmarks) + + +Installation +------------ + +``pip install bidict`` + + +Quick Start +----------- + +.. code:: python + + >>> from bidict import bidict + >>> element_by_symbol = bidict({'H': 'hydrogen'}) + >>> element_by_symbol['H'] + 'hydrogen' + >>> element_by_symbol.inverse['hydrogen'] + 'H' + + +For more usage documentation, +head to the :doc:`intro` [#fn-intro]_ +and proceed from there. + + +Enterprise Support +------------------ + +Enterprise-level support for bidict can be obtained via the +`Tidelift subscription `__ +or by `contacting me directly `__. + +I have a US-based LLC set up for invoicing, +and I have 15+ years of professional experience +delivering software and support to companies successfully. + +You can also sponsor my work through several platforms, including GitHub Sponsors. +See the `Sponsoring <#sponsoring>`__ section below for details, +including rationale and examples of companies +supporting the open source projects they depend on. + + +Voluntary Community Support +--------------------------- + +Please search through already-asked questions and answers +in `GitHub Discussions `__ +and the `issue tracker `__ +in case your question has already been addressed. + +Otherwise, please feel free to +`start a new discussion `__ +or `create a new issue `__ on GitHub +for voluntary community support. + + +Notice of Usage +--------------- + +If you use bidict, +and especially if your usage or your organization is significant in some way, +please let me know in any of the following ways: + +- `star bidict on GitHub `__ +- post in `GitHub Discussions `__ +- `email me `__ + + +Changelog +--------- + +For bidict release notes, see the :doc:`changelog`. [#fn-changelog]_ + + +Release Notifications +--------------------- + +.. duplicated in CHANGELOG.rst: + (Would use `.. include::` but GitHub's renderer doesn't support it.) + +Watch `bidict releases on GitHub `__ +to be notified when new versions of bidict are published. +Click the "Watch" dropdown, choose "Custom", and then choose "Releases". + + +Learning from bidict +-------------------- + +One of the best things about bidict +is that it touches a surprising number of +interesting Python corners, +especially given its small size and scope. + +Check out :doc:`learning-from-bidict` [#fn-learning]_ +if you're interested in learning more. + + +Contributing +------------ + +I have been bidict's sole maintainer +and `active contributor `__ +since I started the project ~15 years ago. + +Your help would be most welcome! +See the :doc:`contributors-guide` [#fn-contributing]_ +for more information. + + +Sponsoring +---------- + +.. duplicated in CONTRIBUTING.rst + (Would use `.. include::` but GitHub's renderer doesn't support it.) + +.. image:: https://img.shields.io/badge/GitHub-sponsor-ff69b4 + :target: https://github.com/sponsors/jab + :alt: Sponsor through GitHub + +Bidict is the product of thousands of hours of my unpaid work +over the 15+ years that I've been the sole maintainer. + +If bidict has helped you or your company accomplish your work, +please sponsor my work through one of the following, +and/or ask your company to do the same: + +- `GitHub `__ +- `PayPal `__ +- `Tidelift `__ +- `thanks.dev `__ +- `Gumroad `__ +- `a support engagement with my LLC <#enterprise-support>`__ + +If you're not sure which to use, GitHub is an easy option, +especially if you already have a GitHub account. +Just choose a monthly or one-time amount, and GitHub handles everything else. +Your bidict sponsorship on GitHub will automatically go +on the same regular bill as any other GitHub charges you pay for. +PayPal is another easy option for one-time contributions. + +See the following for rationale and examples of companies +supporting the open source projects they depend on +in this manner: + +- ``__ +- ``__ +- ``__ + +.. - ``__ +.. - ``__ +.. - ``__ + + +Finding Documentation +--------------------- + +If you're viewing this on ``__, +note that multiple versions of the documentation are available, +and you can choose a different version using the popup menu at the bottom-right. +Please make sure you're viewing the version of the documentation +that corresponds to the version of bidict you'd like to use. + +If you're viewing this on GitHub, PyPI, or some other place +that can't render and link this documentation properly +and are seeing broken links, +try these alternate links instead: + +.. [#fn-intro] ``__ | ``__ + +.. [#fn-changelog] ``__ | ``__ + +.. [#fn-learning] ``__ | ``__ + +.. [#fn-contributing] ``__ | ``__ diff --git a/venv/lib/python3.12/site-packages/bidict-0.23.1.dist-info/RECORD b/venv/lib/python3.12/site-packages/bidict-0.23.1.dist-info/RECORD new file mode 100644 index 0000000..86bd147 --- /dev/null +++ b/venv/lib/python3.12/site-packages/bidict-0.23.1.dist-info/RECORD @@ -0,0 +1,31 @@ +bidict-0.23.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +bidict-0.23.1.dist-info/LICENSE,sha256=8_U63OyqSNc6ZuI4-lupBstBh2eDtF0ooTRrMULuvZo,16784 +bidict-0.23.1.dist-info/METADATA,sha256=2ovIRm6Df8gdwAMekGqkeBSF5TWj2mv1jpmh4W4ks7o,8704 +bidict-0.23.1.dist-info/RECORD,, +bidict-0.23.1.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92 +bidict-0.23.1.dist-info/top_level.txt,sha256=WuQO02jp0ODioS7sJoaHg3JJ5_3h6Sxo9RITvNGPYmc,7 +bidict/__init__.py,sha256=pL87KsrDpBsl3AG09LQk1t1TSFt0hIJVYa2POMdErN8,4398 +bidict/__pycache__/__init__.cpython-312.pyc,, +bidict/__pycache__/_abc.cpython-312.pyc,, +bidict/__pycache__/_base.cpython-312.pyc,, +bidict/__pycache__/_bidict.cpython-312.pyc,, +bidict/__pycache__/_dup.cpython-312.pyc,, +bidict/__pycache__/_exc.cpython-312.pyc,, +bidict/__pycache__/_frozen.cpython-312.pyc,, +bidict/__pycache__/_iter.cpython-312.pyc,, +bidict/__pycache__/_orderedbase.cpython-312.pyc,, +bidict/__pycache__/_orderedbidict.cpython-312.pyc,, +bidict/__pycache__/_typing.cpython-312.pyc,, +bidict/__pycache__/metadata.cpython-312.pyc,, +bidict/_abc.py,sha256=SMCNdCsmqSWg0OGnMZtnnXY8edjXcyZup5tva4HBm_c,3172 +bidict/_base.py,sha256=YiauA0aj52fNB6cfZ4gBt6OV-CRQoZm7WVhuw1nT-Cg,24439 +bidict/_bidict.py,sha256=Sr-RoEzWOaxpnDRbDJ7ngaGRIsyGnqZgzvR-NyT4jl4,6923 +bidict/_dup.py,sha256=YAn5gWA6lwMBA5A6ebVF19UTZyambGS8WxmbK4TN1Ww,2079 +bidict/_exc.py,sha256=HnD_WgteI5PrXa3zBx9RUiGlgnZTO6CF4nIU9p3-njk,1066 +bidict/_frozen.py,sha256=p4TaRHKeyTs0KmlpwSnZiTlN_CR4J97kAgBpNdZHQMs,1771 +bidict/_iter.py,sha256=zVUx-hJ1M4YuJROoFWRjPKlcaFnyo1AAuRpOaKAFhOQ,1530 +bidict/_orderedbase.py,sha256=M7v5rHa7vrym9Z3DxQBFQDxjnrr39Z8p26V0c1PggoE,8942 +bidict/_orderedbidict.py,sha256=pPnmC19mIISrj8_yjnb-4r_ti1B74tD5eTd08DETNuI,7080 +bidict/_typing.py,sha256=AylMZpBhEFTQegfziPSxfKkKLk7oUsH6o3awDIg2z_k,1289 +bidict/metadata.py,sha256=BMIKu6fBY_OKeV_q48EpumE7MdmFw8rFcdaUz8kcIYk,573 +bidict/py.typed,sha256=RJao5SVFYIp8IfbxhL_SpZkBQYe3XXzPlobSRdh4B_c,16 diff --git a/venv/lib/python3.12/site-packages/bidict-0.23.1.dist-info/WHEEL b/venv/lib/python3.12/site-packages/bidict-0.23.1.dist-info/WHEEL new file mode 100644 index 0000000..98c0d20 --- /dev/null +++ b/venv/lib/python3.12/site-packages/bidict-0.23.1.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.42.0) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/venv/lib/python3.12/site-packages/bidict-0.23.1.dist-info/top_level.txt b/venv/lib/python3.12/site-packages/bidict-0.23.1.dist-info/top_level.txt new file mode 100644 index 0000000..6ff5b04 --- /dev/null +++ b/venv/lib/python3.12/site-packages/bidict-0.23.1.dist-info/top_level.txt @@ -0,0 +1 @@ +bidict diff --git a/venv/lib/python3.12/site-packages/bidict/__init__.py b/venv/lib/python3.12/site-packages/bidict/__init__.py new file mode 100644 index 0000000..07e5ba5 --- /dev/null +++ b/venv/lib/python3.12/site-packages/bidict/__init__.py @@ -0,0 +1,103 @@ +# Copyright 2009-2024 Joshua Bronson. All rights reserved. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +# ============================================================================ +# * Welcome to the bidict source code * +# ============================================================================ + +# Reading through the code? You'll find a "Code review nav" comment like the one +# below at the top and bottom of the key source files. Follow these cues to take +# a path through the code that's optimized for familiarizing yourself with it. +# +# If you're not reading this on https://github.com/jab/bidict already, go there +# to ensure you have the latest version of the code. While there, you can also +# star the project, watch it for updates, fork the code, and submit an issue or +# pull request with any proposed changes. More information can be found linked +# from README.rst, which is also shown on https://github.com/jab/bidict. + +# * Code review nav * +# ============================================================================ +# Current: __init__.py Next: _abc.py → +# ============================================================================ + + +"""The bidirectional mapping library for Python. + +---- + +bidict by example: + +.. code-block:: python + + >>> from bidict import bidict + >>> element_by_symbol = bidict({'H': 'hydrogen'}) + >>> element_by_symbol['H'] + 'hydrogen' + >>> element_by_symbol.inverse['hydrogen'] + 'H' + + +Please see https://github.com/jab/bidict for the most up-to-date code and +https://bidict.readthedocs.io for the most up-to-date documentation +if you are reading this elsewhere. + +---- + +.. :copyright: (c) 2009-2024 Joshua Bronson. +.. :license: MPLv2. See LICENSE for details. +""" + +# Use private aliases to not re-export these publicly (for Sphinx automodule with imported-members). +from __future__ import annotations as _annotations + +from contextlib import suppress as _suppress + +from ._abc import BidirectionalMapping as BidirectionalMapping +from ._abc import MutableBidirectionalMapping as MutableBidirectionalMapping +from ._base import BidictBase as BidictBase +from ._base import BidictKeysView as BidictKeysView +from ._base import GeneratedBidictInverse as GeneratedBidictInverse +from ._bidict import MutableBidict as MutableBidict +from ._bidict import bidict as bidict +from ._dup import DROP_NEW as DROP_NEW +from ._dup import DROP_OLD as DROP_OLD +from ._dup import ON_DUP_DEFAULT as ON_DUP_DEFAULT +from ._dup import ON_DUP_DROP_OLD as ON_DUP_DROP_OLD +from ._dup import ON_DUP_RAISE as ON_DUP_RAISE +from ._dup import RAISE as RAISE +from ._dup import OnDup as OnDup +from ._dup import OnDupAction as OnDupAction +from ._exc import BidictException as BidictException +from ._exc import DuplicationError as DuplicationError +from ._exc import KeyAndValueDuplicationError as KeyAndValueDuplicationError +from ._exc import KeyDuplicationError as KeyDuplicationError +from ._exc import ValueDuplicationError as ValueDuplicationError +from ._frozen import frozenbidict as frozenbidict +from ._iter import inverted as inverted +from ._orderedbase import OrderedBidictBase as OrderedBidictBase +from ._orderedbidict import OrderedBidict as OrderedBidict +from .metadata import __author__ as __author__ +from .metadata import __copyright__ as __copyright__ +from .metadata import __description__ as __description__ +from .metadata import __license__ as __license__ +from .metadata import __url__ as __url__ +from .metadata import __version__ as __version__ + + +# Set __module__ of re-exported classes to the 'bidict' top-level module, so that e.g. +# 'bidict.bidict' shows up as 'bidict.bidict` rather than 'bidict._bidict.bidict'. +for _obj in tuple(locals().values()): # pragma: no cover + if not getattr(_obj, '__module__', '').startswith('bidict.'): + continue + with _suppress(AttributeError): + _obj.__module__ = 'bidict' + + +# * Code review nav * +# ============================================================================ +# Current: __init__.py Next: _abc.py → +# ============================================================================ diff --git a/venv/lib/python3.12/site-packages/bidict/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/bidict/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1219f883b5d5363e9531e605c200cce41296ba3c GIT binary patch literal 2490 zcmZ{l$#2_66o-elB}P~XvT1ia|Ae!icxvop#ZxZWrcsi}mI8@X97nfyB||S#g;t~;n@Zai zuVh;pQB1=niY!3&q+&%P2a4$!Brl4YjHKEcNf!-Uy_e5R4i6DUNs?AqSEU_loBT!) zr<;yVA)K$$a3BUTiRH<~itJX*qHRbY)jejuOkGaprBtb+QG1tIsjp^F47vlZciHT* z_ldq4-6|96k~_z~LFna_D2m$#QCuRqgh(aNbKHD3yQ_O8znD>NGrOl0v-K>n{CJQ> z({??{cha7n))bHMY)FcwiH-2UKSPP4fxl*}Zbr9xdfyig^FB+6!pb7*J5t5=C4~}+ z#k2Z&CEb;X;gbClq2#DGP=~x~I~A($mb|<)qs~gXg@q5(xrN-4^r`KZd_}rIZOdi# zWX^`J63Zod>FV}IIhT>H!xL{@xwyW0eVuPkBc7rgZbp2`+GcLFnorP5ogm95B1r#Y<+uD{l*FQhvt&IY3+t#LBxVbGC)<0Rhxp4!O_J+a& z0;hOgy0&)Z`Z~CTj$q3w_zoyB4r~0?VQU0CTR%{V!^#Fy2RK58c@@_wwJB&r@KkG- zc1tmQ@}B7~n0}AkbCQ1?-mUw@I(}x}*N`W;Rp%DfpgZa*tLHZHKM}k{Syp^_!>KI8 zC?U&74a9|ZS=NZFQk_2(mtwM9?;AdBm1UnAjT!bheA)mkd87V zF*C-@I5QJqsv!>=id4gJ%qoUk4VPILxv)RGxL0l6g+)A%Rz(*U^4xtmv8rurpy);4 zBfJ6WBrNj-dJPu6{UYnqa@Hi8u4FaG@ZD^1Zl^U;&RVeZvSWEvsbtHvoE8PEF4V|x{Gc}arkmqjT ze71%bYG?-RD-k7Azyjzr~h+)PIki ze-`O@9!)-6{UbX5Y;gRWmIv)`nvpp1YjpfoD@shg2?v9>F6*Bs&5=TH=t*y=FdF?2 DOQXz` literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/bidict/__pycache__/_abc.cpython-312.pyc b/venv/lib/python3.12/site-packages/bidict/__pycache__/_abc.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..31c941ef06e5b53ae43fa23278928fec3be800ce GIT binary patch literal 2818 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/bidict/__pycache__/_iter.cpython-312.pyc b/venv/lib/python3.12/site-packages/bidict/__pycache__/_iter.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a6373b4fad1c70eecba0466531ed7a90d6cf1df6 GIT binary patch literal 2363 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/bidict/__pycache__/metadata.cpython-312.pyc b/venv/lib/python3.12/site-packages/bidict/__pycache__/metadata.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..992266d9e32dae04e3b40eafe3bd814ad62bed75 GIT binary patch literal 561 zcmZ8dyN=W_6iqUZELoC8AT0$#xEg7SJT}mP00Ba*gaB_1DhOY6l+`HKJ9N^LptFQ-*3X%*ghsxnZ1qJ_l)% z+zrzty#xN!2w#`G&64Dra)v5UBOxd&Kt)#)$qt-y2~Ij)au)UO%aa!%jgtOmskKn| z;&|sek_2I063lZIQT}S_4laa-K{)I~*b=FXxFH^ds4-g7U?0Mqi%!y_)P^3I0itqA z#n#Afu%bC(iWp+#8d*VjZe46s{{1FavW;tkDT=YE8WoGb9z#spm~n|)!L&qO+!EHt z<}YL41ewN)Y7&k?tMLm)YYbd;!`}UxrMd)A5$?U3uAz`~fFewA%mx literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/bidict/_abc.py b/venv/lib/python3.12/site-packages/bidict/_abc.py new file mode 100644 index 0000000..d4a30aa --- /dev/null +++ b/venv/lib/python3.12/site-packages/bidict/_abc.py @@ -0,0 +1,79 @@ +# Copyright 2009-2024 Joshua Bronson. All rights reserved. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +# * Code review nav * +# (see comments in __init__.py) +# ============================================================================ +# ← Prev: __init__.py Current: _abc.py Next: _base.py → +# ============================================================================ + + +"""Provide the :class:`BidirectionalMapping` abstract base class.""" + +from __future__ import annotations + +import typing as t +from abc import abstractmethod + +from ._typing import KT +from ._typing import VT + + +class BidirectionalMapping(t.Mapping[KT, VT]): + """Abstract base class for bidirectional mapping types. + + Extends :class:`collections.abc.Mapping` primarily by adding the + (abstract) :attr:`inverse` property, + which implementers of :class:`BidirectionalMapping` + should override to return a reference to the inverse + :class:`BidirectionalMapping` instance. + """ + + __slots__ = () + + @property + @abstractmethod + def inverse(self) -> BidirectionalMapping[VT, KT]: + """The inverse of this bidirectional mapping instance. + + *See also* :attr:`bidict.BidictBase.inverse`, :attr:`bidict.BidictBase.inv` + + :raises NotImplementedError: Meant to be overridden in subclasses. + """ + # The @abstractmethod decorator prevents subclasses from being instantiated unless they + # override this method. But an overriding implementation may merely return super().inverse, + # in which case this implementation is used. Raise NotImplementedError to indicate that + # subclasses must actually provide their own implementation. + raise NotImplementedError + + def __inverted__(self) -> t.Iterator[tuple[VT, KT]]: + """Get an iterator over the items in :attr:`inverse`. + + This is functionally equivalent to iterating over the items in the + forward mapping and inverting each one on the fly, but this provides a + more efficient implementation: Assuming the already-inverted items + are stored in :attr:`inverse`, just return an iterator over them directly. + + Providing this default implementation enables external functions, + particularly :func:`~bidict.inverted`, to use this optimized + implementation when available, instead of having to invert on the fly. + + *See also* :func:`bidict.inverted` + """ + return iter(self.inverse.items()) + + +class MutableBidirectionalMapping(BidirectionalMapping[KT, VT], t.MutableMapping[KT, VT]): + """Abstract base class for mutable bidirectional mapping types.""" + + __slots__ = () + + +# * Code review nav * +# ============================================================================ +# ← Prev: __init__.py Current: _abc.py Next: _base.py → +# ============================================================================ diff --git a/venv/lib/python3.12/site-packages/bidict/_base.py b/venv/lib/python3.12/site-packages/bidict/_base.py new file mode 100644 index 0000000..848a376 --- /dev/null +++ b/venv/lib/python3.12/site-packages/bidict/_base.py @@ -0,0 +1,556 @@ +# Copyright 2009-2024 Joshua Bronson. All rights reserved. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +# * Code review nav * +# (see comments in __init__.py) +# ============================================================================ +# ← Prev: _abc.py Current: _base.py Next: _frozen.py → +# ============================================================================ + + +"""Provide :class:`BidictBase`.""" + +from __future__ import annotations + +import typing as t +import weakref +from itertools import starmap +from operator import eq +from types import MappingProxyType + +from ._abc import BidirectionalMapping +from ._dup import DROP_NEW +from ._dup import DROP_OLD +from ._dup import ON_DUP_DEFAULT +from ._dup import RAISE +from ._dup import OnDup +from ._exc import DuplicationError +from ._exc import KeyAndValueDuplicationError +from ._exc import KeyDuplicationError +from ._exc import ValueDuplicationError +from ._iter import inverted +from ._iter import iteritems +from ._typing import KT +from ._typing import MISSING +from ._typing import OKT +from ._typing import OVT +from ._typing import VT +from ._typing import Maplike +from ._typing import MapOrItems + + +OldKV = t.Tuple[OKT[KT], OVT[VT]] +DedupResult = t.Optional[OldKV[KT, VT]] +Unwrites = t.List[t.Tuple[t.Any, ...]] +BT = t.TypeVar('BT', bound='BidictBase[t.Any, t.Any]') + + +class BidictKeysView(t.KeysView[KT], t.ValuesView[KT]): + """Since the keys of a bidict are the values of its inverse (and vice versa), + the :class:`~collections.abc.ValuesView` result of calling *bi.values()* + is also a :class:`~collections.abc.KeysView` of *bi.inverse*. + """ + + +class BidictBase(BidirectionalMapping[KT, VT]): + """Base class implementing :class:`BidirectionalMapping`.""" + + #: The default :class:`~bidict.OnDup` + #: that governs behavior when a provided item + #: duplicates the key or value of other item(s). + #: + #: *See also* + #: :ref:`basic-usage:Values Must Be Unique` (https://bidict.rtfd.io/basic-usage.html#values-must-be-unique), + #: :doc:`extending` (https://bidict.rtfd.io/extending.html) + on_dup = ON_DUP_DEFAULT + + _fwdm: t.MutableMapping[KT, VT] #: the backing forward mapping (*key* → *val*) + _invm: t.MutableMapping[VT, KT] #: the backing inverse mapping (*val* → *key*) + + # Use Any rather than KT/VT in the following to avoid "ClassVar cannot contain type variables" errors: + _fwdm_cls: t.ClassVar[type[t.MutableMapping[t.Any, t.Any]]] = dict #: class of the backing forward mapping + _invm_cls: t.ClassVar[type[t.MutableMapping[t.Any, t.Any]]] = dict #: class of the backing inverse mapping + + #: The class of the inverse bidict instance. + _inv_cls: t.ClassVar[type[BidictBase[t.Any, t.Any]]] + + def __init_subclass__(cls) -> None: + super().__init_subclass__() + cls._init_class() + + @classmethod + def _init_class(cls) -> None: + cls._ensure_inv_cls() + cls._set_reversed() + + __reversed__: t.ClassVar[t.Any] + + @classmethod + def _set_reversed(cls) -> None: + """Set __reversed__ for subclasses that do not set it explicitly + according to whether backing mappings are reversible. + """ + if cls is not BidictBase: + resolved = cls.__reversed__ + overridden = resolved is not BidictBase.__reversed__ + if overridden: # E.g. OrderedBidictBase, OrderedBidict + return + backing_reversible = all(issubclass(i, t.Reversible) for i in (cls._fwdm_cls, cls._invm_cls)) + cls.__reversed__ = _fwdm_reversed if backing_reversible else None + + @classmethod + def _ensure_inv_cls(cls) -> None: + """Ensure :attr:`_inv_cls` is set, computing it dynamically if necessary. + + All subclasses provided in :mod:`bidict` are their own inverse classes, + i.e., their backing forward and inverse mappings are both the same type, + but users may define subclasses where this is not the case. + This method ensures that the inverse class is computed correctly regardless. + + See: :ref:`extending:Dynamic Inverse Class Generation` + (https://bidict.rtfd.io/extending.html#dynamic-inverse-class-generation) + """ + # This _ensure_inv_cls() method is (indirectly) corecursive with _make_inv_cls() below + # in the case that we need to dynamically generate the inverse class: + # 1. _ensure_inv_cls() calls cls._make_inv_cls() + # 2. cls._make_inv_cls() calls type(..., (cls, ...), ...) to dynamically generate inv_cls + # 3. Our __init_subclass__ hook (see above) is automatically called on inv_cls + # 4. inv_cls.__init_subclass__() calls inv_cls._ensure_inv_cls() + # 5. inv_cls._ensure_inv_cls() resolves to this implementation + # (inv_cls deliberately does not override this), so we're back where we started. + # But since the _make_inv_cls() call will have set inv_cls.__dict__._inv_cls, + # just check if it's already set before calling _make_inv_cls() to prevent infinite recursion. + if getattr(cls, '__dict__', {}).get('_inv_cls'): # Don't assume cls.__dict__ (e.g. mypyc native class) + return + cls._inv_cls = cls._make_inv_cls() + + @classmethod + def _make_inv_cls(cls: type[BT]) -> type[BT]: + diff = cls._inv_cls_dict_diff() + cls_is_own_inv = all(getattr(cls, k, MISSING) == v for (k, v) in diff.items()) + if cls_is_own_inv: + return cls + # Suppress auto-calculation of _inv_cls's _inv_cls since we know it already. + # Works with the guard in BidictBase._ensure_inv_cls() to prevent infinite recursion. + diff['_inv_cls'] = cls + inv_cls = type(f'{cls.__name__}Inv', (cls, GeneratedBidictInverse), diff) + inv_cls.__module__ = cls.__module__ + return t.cast(t.Type[BT], inv_cls) + + @classmethod + def _inv_cls_dict_diff(cls) -> dict[str, t.Any]: + return { + '_fwdm_cls': cls._invm_cls, + '_invm_cls': cls._fwdm_cls, + } + + def __init__(self, arg: MapOrItems[KT, VT] = (), /, **kw: VT) -> None: + """Make a new bidirectional mapping. + The signature behaves like that of :class:`dict`. + ktems passed via positional arg are processed first, + followed by any items passed via keyword argument. + Any duplication encountered along the way + is handled as per :attr:`on_dup`. + """ + self._fwdm = self._fwdm_cls() + self._invm = self._invm_cls() + self._update(arg, kw, rollback=False) + + # If Python ever adds support for higher-kinded types, `inverse` could use them, e.g. + # def inverse(self: BT[KT, VT]) -> BT[VT, KT]: + # Ref: https://github.com/python/typing/issues/548#issuecomment-621571821 + @property + def inverse(self) -> BidictBase[VT, KT]: + """The inverse of this bidirectional mapping instance.""" + # When `bi.inverse` is called for the first time, this method + # computes the inverse instance, stores it for subsequent use, and then + # returns it. It also stores a reference on `bi.inverse` back to `bi`, + # but uses a weakref to avoid creating a reference cycle. Strong references + # to inverse instances are stored in ._inv, and weak references are stored + # in ._invweak. + + # First check if a strong reference is already stored. + inv: BidictBase[VT, KT] | None = getattr(self, '_inv', None) + if inv is not None: + return inv + # Next check if a weak reference is already stored. + invweak = getattr(self, '_invweak', None) + if invweak is not None: + inv = invweak() # Try to resolve a strong reference and return it. + if inv is not None: + return inv + # No luck. Compute the inverse reference and store it for subsequent use. + inv = self._make_inverse() + self._inv: BidictBase[VT, KT] | None = inv + self._invweak: weakref.ReferenceType[BidictBase[VT, KT]] | None = None + # Also store a weak reference back to `instance` on its inverse instance, so that + # the second `.inverse` access in `bi.inverse.inverse` hits the cached weakref. + inv._inv = None + inv._invweak = weakref.ref(self) + # In e.g. `bidict().inverse.inverse`, this design ensures that a strong reference + # back to the original instance is retained before its refcount drops to zero, + # avoiding an unintended potential deallocation. + return inv + + def _make_inverse(self) -> BidictBase[VT, KT]: + inv: BidictBase[VT, KT] = self._inv_cls() + inv._fwdm = self._invm + inv._invm = self._fwdm + return inv + + @property + def inv(self) -> BidictBase[VT, KT]: + """Alias for :attr:`inverse`.""" + return self.inverse + + def __repr__(self) -> str: + """See :func:`repr`.""" + clsname = self.__class__.__name__ + items = dict(self.items()) if self else '' + return f'{clsname}({items})' + + def values(self) -> BidictKeysView[VT]: + """A set-like object providing a view on the contained values. + + Since the values of a bidict are equivalent to the keys of its inverse, + this method returns a set-like object for this bidict's values + rather than just a collections.abc.ValuesView. + This object supports set operations like union and difference, + and constant- rather than linear-time containment checks, + and is no more expensive to provide than the less capable + collections.abc.ValuesView would be. + + See :meth:`keys` for more information. + """ + return t.cast(BidictKeysView[VT], self.inverse.keys()) + + def keys(self) -> t.KeysView[KT]: + """A set-like object providing a view on the contained keys. + + When *b._fwdm* is a :class:`dict`, *b.keys()* returns a + *dict_keys* object that behaves exactly the same as + *collections.abc.KeysView(b)*, except for + + - offering better performance + + - being reversible on Python 3.8+ + + - having a .mapping attribute in Python 3.10+ + that exposes a mappingproxy to *b._fwdm*. + """ + fwdm, fwdm_cls = self._fwdm, self._fwdm_cls + return fwdm.keys() if fwdm_cls is dict else BidictKeysView(self) + + def items(self) -> t.ItemsView[KT, VT]: + """A set-like object providing a view on the contained items. + + When *b._fwdm* is a :class:`dict`, *b.items()* returns a + *dict_items* object that behaves exactly the same as + *collections.abc.ItemsView(b)*, except for: + + - offering better performance + + - being reversible on Python 3.8+ + + - having a .mapping attribute in Python 3.10+ + that exposes a mappingproxy to *b._fwdm*. + """ + return self._fwdm.items() if self._fwdm_cls is dict else super().items() + + # The inherited collections.abc.Mapping.__contains__() method is implemented by doing a `try` + # `except KeyError` around `self[key]`. The following implementation is much faster, + # especially in the missing case. + def __contains__(self, key: t.Any) -> bool: + """True if the mapping contains the specified key, else False.""" + return key in self._fwdm + + # The inherited collections.abc.Mapping.__eq__() method is implemented in terms of an inefficient + # `dict(self.items()) == dict(other.items())` comparison, so override it with a + # more efficient implementation. + def __eq__(self, other: object) -> bool: + """*x.__eq__(other) ⟺ x == other* + + Equivalent to *dict(x.items()) == dict(other.items())* + but more efficient. + + Note that :meth:`bidict's __eq__() ` implementation + is inherited by subclasses, + in particular by the ordered bidict subclasses, + so even with ordered bidicts, + :ref:`== comparison is order-insensitive ` + (https://bidict.rtfd.io/other-bidict-types.html#eq-is-order-insensitive). + + *See also* :meth:`equals_order_sensitive` + """ + if isinstance(other, t.Mapping): + return self._fwdm.items() == other.items() + # Ref: https://docs.python.org/3/library/constants.html#NotImplemented + return NotImplemented + + def equals_order_sensitive(self, other: object) -> bool: + """Order-sensitive equality check. + + *See also* :ref:`eq-order-insensitive` + (https://bidict.rtfd.io/other-bidict-types.html#eq-is-order-insensitive) + """ + if not isinstance(other, t.Mapping) or len(self) != len(other): + return False + return all(starmap(eq, zip(self.items(), other.items()))) + + def _dedup(self, key: KT, val: VT, on_dup: OnDup) -> DedupResult[KT, VT]: + """Check *key* and *val* for any duplication in self. + + Handle any duplication as per the passed in *on_dup*. + + If (key, val) is already present, return None + since writing (key, val) would be a no-op. + + If duplication is found and the corresponding :class:`~bidict.OnDupAction` is + :attr:`~bidict.DROP_NEW`, return None. + + If duplication is found and the corresponding :class:`~bidict.OnDupAction` is + :attr:`~bidict.RAISE`, raise the appropriate exception. + + If duplication is found and the corresponding :class:`~bidict.OnDupAction` is + :attr:`~bidict.DROP_OLD`, or if no duplication is found, + return *(oldkey, oldval)*. + """ + fwdm, invm = self._fwdm, self._invm + oldval: OVT[VT] = fwdm.get(key, MISSING) + oldkey: OKT[KT] = invm.get(val, MISSING) + isdupkey, isdupval = oldval is not MISSING, oldkey is not MISSING + if isdupkey and isdupval: + if key == oldkey: + assert val == oldval + # (key, val) duplicates an existing item -> no-op. + return None + # key and val each duplicate a different existing item. + if on_dup.val is RAISE: + raise KeyAndValueDuplicationError(key, val) + if on_dup.val is DROP_NEW: + return None + assert on_dup.val is DROP_OLD + # Fall through to the return statement on the last line. + elif isdupkey: + if on_dup.key is RAISE: + raise KeyDuplicationError(key) + if on_dup.key is DROP_NEW: + return None + assert on_dup.key is DROP_OLD + # Fall through to the return statement on the last line. + elif isdupval: + if on_dup.val is RAISE: + raise ValueDuplicationError(val) + if on_dup.val is DROP_NEW: + return None + assert on_dup.val is DROP_OLD + # Fall through to the return statement on the last line. + # else neither isdupkey nor isdupval. + return oldkey, oldval + + def _write(self, newkey: KT, newval: VT, oldkey: OKT[KT], oldval: OVT[VT], unwrites: Unwrites | None) -> None: + """Insert (newkey, newval), extending *unwrites* with associated inverse operations if provided. + + *oldkey* and *oldval* are as returned by :meth:`_dedup`. + + If *unwrites* is not None, it is extended with the inverse operations necessary to undo the write. + This design allows :meth:`_update` to roll back a partially applied update that fails part-way through + when necessary. + + This design also allows subclasses that require additional operations to easily extend this implementation. + For example, :class:`bidict.OrderedBidictBase` calls this inherited implementation, and then extends *unwrites* + with additional operations needed to keep its internal linked list nodes consistent with its items' order + as changes are made. + """ + fwdm, invm = self._fwdm, self._invm + fwdm_set, invm_set = fwdm.__setitem__, invm.__setitem__ + fwdm_del, invm_del = fwdm.__delitem__, invm.__delitem__ + # Always perform the following writes regardless of duplication. + fwdm_set(newkey, newval) + invm_set(newval, newkey) + if oldval is MISSING and oldkey is MISSING: # no key or value duplication + # {0: 1, 2: 3} | {4: 5} => {0: 1, 2: 3, 4: 5} + if unwrites is not None: + unwrites.extend(( + (fwdm_del, newkey), + (invm_del, newval), + )) + elif oldval is not MISSING and oldkey is not MISSING: # key and value duplication across two different items + # {0: 1, 2: 3} | {0: 3} => {0: 3} + fwdm_del(oldkey) + invm_del(oldval) + if unwrites is not None: + unwrites.extend(( + (fwdm_set, newkey, oldval), + (invm_set, oldval, newkey), + (fwdm_set, oldkey, newval), + (invm_set, newval, oldkey), + )) + elif oldval is not MISSING: # just key duplication + # {0: 1, 2: 3} | {2: 4} => {0: 1, 2: 4} + invm_del(oldval) + if unwrites is not None: + unwrites.extend(( + (fwdm_set, newkey, oldval), + (invm_set, oldval, newkey), + (invm_del, newval), + )) + else: + assert oldkey is not MISSING # just value duplication + # {0: 1, 2: 3} | {4: 3} => {0: 1, 4: 3} + fwdm_del(oldkey) + if unwrites is not None: + unwrites.extend(( + (fwdm_set, oldkey, newval), + (invm_set, newval, oldkey), + (fwdm_del, newkey), + )) + + def _update( + self, + arg: MapOrItems[KT, VT], + kw: t.Mapping[str, VT] = MappingProxyType({}), + *, + rollback: bool | None = None, + on_dup: OnDup | None = None, + ) -> None: + """Update with the items from *arg* and *kw*, maybe failing and rolling back as per *on_dup* and *rollback*.""" + # Note: We must process input in a single pass, since arg may be a generator. + if not isinstance(arg, (t.Iterable, Maplike)): + raise TypeError(f"'{arg.__class__.__name__}' object is not iterable") + if not arg and not kw: + return + if on_dup is None: + on_dup = self.on_dup + if rollback is None: + rollback = RAISE in on_dup + + # Fast path when we're empty and updating only from another bidict (i.e. no dup vals in new items). + if not self and not kw and isinstance(arg, BidictBase): + self._init_from(arg) + return + + # Fast path when we're adding more items than we contain already and rollback is enabled: + # Update a copy of self with rollback disabled. Fail if that fails, otherwise become the copy. + if rollback and isinstance(arg, t.Sized) and len(arg) + len(kw) > len(self): + tmp = self.copy() + tmp._update(arg, kw, rollback=False, on_dup=on_dup) + self._init_from(tmp) + return + + # In all other cases, benchmarking has indicated that the update is best implemented as follows: + # For each new item, perform a dup check (raising if necessary), and apply the associated writes we need to + # perform on our backing _fwdm and _invm mappings. If rollback is enabled, also compute the associated unwrites + # as we go. If the update results in a DuplicationError and rollback is enabled, apply the accumulated unwrites + # before raising, to ensure that we fail clean. + write = self._write + unwrites: Unwrites | None = [] if rollback else None + for key, val in iteritems(arg, **kw): + try: + dedup_result = self._dedup(key, val, on_dup) + except DuplicationError: + if unwrites is not None: + for fn, *args in reversed(unwrites): + fn(*args) + raise + if dedup_result is not None: + write(key, val, *dedup_result, unwrites=unwrites) + + def __copy__(self: BT) -> BT: + """Used for the copy protocol. See the :mod:`copy` module.""" + return self.copy() + + def copy(self: BT) -> BT: + """Make a (shallow) copy of this bidict.""" + # Could just `return self.__class__(self)` here, but the below is faster. The former + # would copy this bidict's items into a new instance one at a time (checking for duplication + # for each item), whereas the below copies from the backing mappings all at once, and foregoes + # item-by-item duplication checking since the backing mappings have been checked already. + return self._from_other(self.__class__, self) + + @staticmethod + def _from_other(bt: type[BT], other: MapOrItems[KT, VT], inv: bool = False) -> BT: + """Fast, private constructor based on :meth:`_init_from`. + + If *inv* is true, return the inverse of the instance instead of the instance itself. + (Useful for pickling with dynamically-generated inverse classes -- see :meth:`__reduce__`.) + """ + inst = bt() + inst._init_from(other) + return t.cast(BT, inst.inverse) if inv else inst + + def _init_from(self, other: MapOrItems[KT, VT]) -> None: + """Fast init from *other*, bypassing item-by-item duplication checking.""" + self._fwdm.clear() + self._invm.clear() + self._fwdm.update(other) + # If other is a bidict, use its existing backing inverse mapping, otherwise + # other could be a generator that's now exhausted, so invert self._fwdm on the fly. + inv = other.inverse if isinstance(other, BidictBase) else inverted(self._fwdm) + self._invm.update(inv) + + # other's type is Mapping rather than Maplike since bidict() | SupportsKeysAndGetItem({}) + # raises a TypeError, just like dict() | SupportsKeysAndGetItem({}) does. + def __or__(self: BT, other: t.Mapping[KT, VT]) -> BT: + """Return self|other.""" + if not isinstance(other, t.Mapping): + return NotImplemented + new = self.copy() + new._update(other, rollback=False) + return new + + def __ror__(self: BT, other: t.Mapping[KT, VT]) -> BT: + """Return other|self.""" + if not isinstance(other, t.Mapping): + return NotImplemented + new = self.__class__(other) + new._update(self, rollback=False) + return new + + def __len__(self) -> int: + """The number of contained items.""" + return len(self._fwdm) + + def __iter__(self) -> t.Iterator[KT]: + """Iterator over the contained keys.""" + return iter(self._fwdm) + + def __getitem__(self, key: KT) -> VT: + """*x.__getitem__(key) ⟺ x[key]*""" + return self._fwdm[key] + + def __reduce__(self) -> tuple[t.Any, ...]: + """Return state information for pickling.""" + cls = self.__class__ + inst: t.Mapping[t.Any, t.Any] = self + # If this bidict's class is dynamically generated, pickle the inverse instead, whose (presumably not + # dynamically generated) class the caller is more likely to have a reference to somewhere in sys.modules + # that pickle can discover. + if should_invert := isinstance(self, GeneratedBidictInverse): + cls = self._inv_cls + inst = self.inverse + return self._from_other, (cls, dict(inst), should_invert) + + +# See BidictBase._set_reversed() above. +def _fwdm_reversed(self: BidictBase[KT, t.Any]) -> t.Iterator[KT]: + """Iterator over the contained keys in reverse order.""" + assert isinstance(self._fwdm, t.Reversible) + return reversed(self._fwdm) + + +BidictBase._init_class() + + +class GeneratedBidictInverse: + """Base class for dynamically-generated inverse bidict classes.""" + + +# * Code review nav * +# ============================================================================ +# ← Prev: _abc.py Current: _base.py Next: _frozen.py → +# ============================================================================ diff --git a/venv/lib/python3.12/site-packages/bidict/_bidict.py b/venv/lib/python3.12/site-packages/bidict/_bidict.py new file mode 100644 index 0000000..94dd3db --- /dev/null +++ b/venv/lib/python3.12/site-packages/bidict/_bidict.py @@ -0,0 +1,194 @@ +# Copyright 2009-2024 Joshua Bronson. All rights reserved. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +# * Code review nav * +# (see comments in __init__.py) +# ============================================================================ +# ← Prev: _frozen.py Current: _bidict.py Next: _orderedbase.py → +# ============================================================================ + + +"""Provide :class:`MutableBidict` and :class:`bidict`.""" + +from __future__ import annotations + +import typing as t + +from ._abc import MutableBidirectionalMapping +from ._base import BidictBase +from ._dup import ON_DUP_DROP_OLD +from ._dup import ON_DUP_RAISE +from ._dup import OnDup +from ._typing import DT +from ._typing import KT +from ._typing import MISSING +from ._typing import ODT +from ._typing import VT +from ._typing import MapOrItems + + +class MutableBidict(BidictBase[KT, VT], MutableBidirectionalMapping[KT, VT]): + """Base class for mutable bidirectional mappings.""" + + if t.TYPE_CHECKING: + + @property + def inverse(self) -> MutableBidict[VT, KT]: ... + + @property + def inv(self) -> MutableBidict[VT, KT]: ... + + def _pop(self, key: KT) -> VT: + val = self._fwdm.pop(key) + del self._invm[val] + return val + + def __delitem__(self, key: KT) -> None: + """*x.__delitem__(y) ⟺ del x[y]*""" + self._pop(key) + + def __setitem__(self, key: KT, val: VT) -> None: + """Set the value for *key* to *val*. + + If *key* is already associated with *val*, this is a no-op. + + If *key* is already associated with a different value, + the old value will be replaced with *val*, + as with dict's :meth:`__setitem__`. + + If *val* is already associated with a different key, + an exception is raised + to protect against accidental removal of the key + that's currently associated with *val*. + + Use :meth:`put` instead if you want to specify different behavior in + the case that the provided key or value duplicates an existing one. + Or use :meth:`forceput` to unconditionally associate *key* with *val*, + replacing any existing items as necessary to preserve uniqueness. + + :raises bidict.ValueDuplicationError: if *val* duplicates that of an + existing item. + + :raises bidict.KeyAndValueDuplicationError: if *key* duplicates the key of an + existing item and *val* duplicates the value of a different + existing item. + """ + self.put(key, val, on_dup=self.on_dup) + + def put(self, key: KT, val: VT, on_dup: OnDup = ON_DUP_RAISE) -> None: + """Associate *key* with *val*, honoring the :class:`OnDup` given in *on_dup*. + + For example, if *on_dup* is :attr:`~bidict.ON_DUP_RAISE`, + then *key* will be associated with *val* if and only if + *key* is not already associated with an existing value and + *val* is not already associated with an existing key, + otherwise an exception will be raised. + + If *key* is already associated with *val*, this is a no-op. + + :raises bidict.KeyDuplicationError: if attempting to insert an item + whose key only duplicates an existing item's, and *on_dup.key* is + :attr:`~bidict.RAISE`. + + :raises bidict.ValueDuplicationError: if attempting to insert an item + whose value only duplicates an existing item's, and *on_dup.val* is + :attr:`~bidict.RAISE`. + + :raises bidict.KeyAndValueDuplicationError: if attempting to insert an + item whose key duplicates one existing item's, and whose value + duplicates another existing item's, and *on_dup.val* is + :attr:`~bidict.RAISE`. + """ + self._update(((key, val),), on_dup=on_dup) + + def forceput(self, key: KT, val: VT) -> None: + """Associate *key* with *val* unconditionally. + + Replace any existing mappings containing key *key* or value *val* + as necessary to preserve uniqueness. + """ + self.put(key, val, on_dup=ON_DUP_DROP_OLD) + + def clear(self) -> None: + """Remove all items.""" + self._fwdm.clear() + self._invm.clear() + + @t.overload + def pop(self, key: KT, /) -> VT: ... + @t.overload + def pop(self, key: KT, default: DT = ..., /) -> VT | DT: ... + + def pop(self, key: KT, default: ODT[DT] = MISSING, /) -> VT | DT: + """*x.pop(k[, d]) → v* + + Remove specified key and return the corresponding value. + + :raises KeyError: if *key* is not found and no *default* is provided. + """ + try: + return self._pop(key) + except KeyError: + if default is MISSING: + raise + return default + + def popitem(self) -> tuple[KT, VT]: + """*x.popitem() → (k, v)* + + Remove and return some item as a (key, value) pair. + + :raises KeyError: if *x* is empty. + """ + key, val = self._fwdm.popitem() + del self._invm[val] + return key, val + + def update(self, arg: MapOrItems[KT, VT] = (), /, **kw: VT) -> None: + """Like calling :meth:`putall` with *self.on_dup* passed for *on_dup*.""" + self._update(arg, kw=kw) + + def forceupdate(self, arg: MapOrItems[KT, VT] = (), /, **kw: VT) -> None: + """Like a bulk :meth:`forceput`.""" + self._update(arg, kw=kw, on_dup=ON_DUP_DROP_OLD) + + def putall(self, items: MapOrItems[KT, VT], on_dup: OnDup = ON_DUP_RAISE) -> None: + """Like a bulk :meth:`put`. + + If one of the given items causes an exception to be raised, + none of the items is inserted. + """ + self._update(items, on_dup=on_dup) + + # other's type is Mapping rather than Maplike since bidict() |= SupportsKeysAndGetItem({}) + # raises a TypeError, just like dict() |= SupportsKeysAndGetItem({}) does. + def __ior__(self, other: t.Mapping[KT, VT]) -> MutableBidict[KT, VT]: + """Return self|=other.""" + self.update(other) + return self + + +class bidict(MutableBidict[KT, VT]): + """The main bidirectional mapping type. + + See :ref:`intro:Introduction` and :ref:`basic-usage:Basic Usage` + to get started (also available at https://bidict.rtfd.io). + """ + + if t.TYPE_CHECKING: + + @property + def inverse(self) -> bidict[VT, KT]: ... + + @property + def inv(self) -> bidict[VT, KT]: ... + + +# * Code review nav * +# ============================================================================ +# ← Prev: _frozen.py Current: _bidict.py Next: _orderedbase.py → +# ============================================================================ diff --git a/venv/lib/python3.12/site-packages/bidict/_dup.py b/venv/lib/python3.12/site-packages/bidict/_dup.py new file mode 100644 index 0000000..fd25b61 --- /dev/null +++ b/venv/lib/python3.12/site-packages/bidict/_dup.py @@ -0,0 +1,61 @@ +# Copyright 2009-2024 Joshua Bronson. All rights reserved. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +"""Provide :class:`OnDup` and related functionality.""" + +from __future__ import annotations + +import typing as t +from enum import Enum + + +class OnDupAction(Enum): + """An action to take to prevent duplication from occurring.""" + + #: Raise a :class:`~bidict.DuplicationError`. + RAISE = 'RAISE' + #: Overwrite existing items with new items. + DROP_OLD = 'DROP_OLD' + #: Keep existing items and drop new items. + DROP_NEW = 'DROP_NEW' + + def __repr__(self) -> str: + return f'{self.__class__.__name__}.{self.name}' + + +RAISE: t.Final[OnDupAction] = OnDupAction.RAISE +DROP_OLD: t.Final[OnDupAction] = OnDupAction.DROP_OLD +DROP_NEW: t.Final[OnDupAction] = OnDupAction.DROP_NEW + + +class OnDup(t.NamedTuple): + r"""A combination of :class:`~bidict.OnDupAction`\s specifying how to handle various types of duplication. + + The :attr:`~OnDup.key` field specifies what action to take when a duplicate key is encountered. + + The :attr:`~OnDup.val` field specifies what action to take when a duplicate value is encountered. + + In the case of both key and value duplication across two different items, + only :attr:`~OnDup.val` is used. + + *See also* :ref:`basic-usage:Values Must Be Unique` + (https://bidict.rtfd.io/basic-usage.html#values-must-be-unique) + """ + + key: OnDupAction = DROP_OLD + val: OnDupAction = RAISE + + +#: Default :class:`OnDup` used for the +#: :meth:`~bidict.bidict.__init__`, +#: :meth:`~bidict.bidict.__setitem__`, and +#: :meth:`~bidict.bidict.update` methods. +ON_DUP_DEFAULT: t.Final[OnDup] = OnDup(key=DROP_OLD, val=RAISE) +#: An :class:`OnDup` whose members are all :obj:`RAISE`. +ON_DUP_RAISE: t.Final[OnDup] = OnDup(key=RAISE, val=RAISE) +#: An :class:`OnDup` whose members are all :obj:`DROP_OLD`. +ON_DUP_DROP_OLD: t.Final[OnDup] = OnDup(key=DROP_OLD, val=DROP_OLD) diff --git a/venv/lib/python3.12/site-packages/bidict/_exc.py b/venv/lib/python3.12/site-packages/bidict/_exc.py new file mode 100644 index 0000000..e2a96f3 --- /dev/null +++ b/venv/lib/python3.12/site-packages/bidict/_exc.py @@ -0,0 +1,36 @@ +# Copyright 2009-2024 Joshua Bronson. All rights reserved. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +"""Provide all bidict exceptions.""" + +from __future__ import annotations + + +class BidictException(Exception): + """Base class for bidict exceptions.""" + + +class DuplicationError(BidictException): + """Base class for exceptions raised when uniqueness is violated + as per the :attr:`~bidict.RAISE` :class:`~bidict.OnDupAction`. + """ + + +class KeyDuplicationError(DuplicationError): + """Raised when a given key is not unique.""" + + +class ValueDuplicationError(DuplicationError): + """Raised when a given value is not unique.""" + + +class KeyAndValueDuplicationError(KeyDuplicationError, ValueDuplicationError): + """Raised when a given item's key and value are not unique. + + That is, its key duplicates that of another item, + and its value duplicates that of a different other item. + """ diff --git a/venv/lib/python3.12/site-packages/bidict/_frozen.py b/venv/lib/python3.12/site-packages/bidict/_frozen.py new file mode 100644 index 0000000..e2f789d --- /dev/null +++ b/venv/lib/python3.12/site-packages/bidict/_frozen.py @@ -0,0 +1,50 @@ +# Copyright 2009-2024 Joshua Bronson. All rights reserved. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +# * Code review nav * +# (see comments in __init__.py) +# ============================================================================ +# ← Prev: _base.py Current: _frozen.py Next: _bidict.py → +# ============================================================================ + +"""Provide :class:`frozenbidict`, an immutable, hashable bidirectional mapping type.""" + +from __future__ import annotations + +import typing as t + +from ._base import BidictBase +from ._typing import KT +from ._typing import VT + + +class frozenbidict(BidictBase[KT, VT]): + """Immutable, hashable bidict type.""" + + _hash: int + + if t.TYPE_CHECKING: + + @property + def inverse(self) -> frozenbidict[VT, KT]: ... + + @property + def inv(self) -> frozenbidict[VT, KT]: ... + + def __hash__(self) -> int: + """The hash of this bidict as determined by its items.""" + if getattr(self, '_hash', None) is None: + # The following is like hash(frozenset(self.items())) + # but more memory efficient. See also: https://bugs.python.org/issue46684 + self._hash = t.ItemsView(self)._hash() + return self._hash + + +# * Code review nav * +# ============================================================================ +# ← Prev: _base.py Current: _frozen.py Next: _bidict.py → +# ============================================================================ diff --git a/venv/lib/python3.12/site-packages/bidict/_iter.py b/venv/lib/python3.12/site-packages/bidict/_iter.py new file mode 100644 index 0000000..53ad25d --- /dev/null +++ b/venv/lib/python3.12/site-packages/bidict/_iter.py @@ -0,0 +1,51 @@ +# Copyright 2009-2024 Joshua Bronson. All rights reserved. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +"""Functions for iterating over items in a mapping.""" + +from __future__ import annotations + +import typing as t +from operator import itemgetter + +from ._typing import KT +from ._typing import VT +from ._typing import ItemsIter +from ._typing import Maplike +from ._typing import MapOrItems + + +def iteritems(arg: MapOrItems[KT, VT] = (), /, **kw: VT) -> ItemsIter[KT, VT]: + """Yield the items from *arg* and *kw* in the order given.""" + if isinstance(arg, t.Mapping): + yield from arg.items() + elif isinstance(arg, Maplike): + yield from ((k, arg[k]) for k in arg.keys()) + else: + yield from arg + yield from t.cast(ItemsIter[KT, VT], kw.items()) + + +swap: t.Final = itemgetter(1, 0) + + +def inverted(arg: MapOrItems[KT, VT]) -> ItemsIter[VT, KT]: + """Yield the inverse items of the provided object. + + If *arg* has a :func:`callable` ``__inverted__`` attribute, + return the result of calling it. + + Otherwise, return an iterator over the items in `arg`, + inverting each item on the fly. + + *See also* :attr:`bidict.BidirectionalMapping.__inverted__` + """ + invattr = getattr(arg, '__inverted__', None) + if callable(invattr): + inv: ItemsIter[VT, KT] = invattr() + return inv + return map(swap, iteritems(arg)) diff --git a/venv/lib/python3.12/site-packages/bidict/_orderedbase.py b/venv/lib/python3.12/site-packages/bidict/_orderedbase.py new file mode 100644 index 0000000..92f2633 --- /dev/null +++ b/venv/lib/python3.12/site-packages/bidict/_orderedbase.py @@ -0,0 +1,238 @@ +# Copyright 2009-2024 Joshua Bronson. All rights reserved. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +# * Code review nav * +# (see comments in __init__.py) +# ============================================================================ +# ← Prev: _bidict.py Current: _orderedbase.py Next: _orderedbidict.py → +# ============================================================================ + + +"""Provide :class:`OrderedBidictBase`.""" + +from __future__ import annotations + +import typing as t +from weakref import ref as weakref + +from ._base import BidictBase +from ._base import Unwrites +from ._bidict import bidict +from ._iter import iteritems +from ._typing import KT +from ._typing import MISSING +from ._typing import OKT +from ._typing import OVT +from ._typing import VT +from ._typing import MapOrItems + + +AT = t.TypeVar('AT') # attr type + + +class WeakAttr(t.Generic[AT]): + """Descriptor to automatically manage (de)referencing the given slot as a weakref. + + See https://docs.python.org/3/howto/descriptor.html#managed-attributes + for an intro to using descriptors like this for managed attributes. + """ + + def __init__(self, *, slot: str) -> None: + self.slot = slot + + def __set__(self, instance: t.Any, value: AT) -> None: + setattr(instance, self.slot, weakref(value)) + + def __get__(self, instance: t.Any, __owner: t.Any = None) -> AT: + return t.cast(AT, getattr(instance, self.slot)()) + + +class Node: + """A node in a circular doubly-linked list + used to encode the order of items in an ordered bidict. + + A weak reference to the previous node is stored + to avoid creating strong reference cycles. + Referencing/dereferencing the weakref is handled automatically by :class:`WeakAttr`. + """ + + prv: WeakAttr[Node] = WeakAttr(slot='_prv_weak') + __slots__ = ('__weakref__', '_prv_weak', 'nxt') + + nxt: Node | WeakAttr[Node] # Allow subclasses to use a WeakAttr for nxt too (see SentinelNode) + + def __init__(self, prv: Node, nxt: Node) -> None: + self.prv = prv + self.nxt = nxt + + def unlink(self) -> None: + """Remove self from in between prv and nxt. + Self's references to prv and nxt are retained so it can be relinked (see below). + """ + self.prv.nxt = self.nxt + self.nxt.prv = self.prv + + def relink(self) -> None: + """Restore self between prv and nxt after unlinking (see above).""" + self.prv.nxt = self.nxt.prv = self + + +class SentinelNode(Node): + """Special node in a circular doubly-linked list + that links the first node with the last node. + When its next and previous references point back to itself + it represents an empty list. + """ + + nxt: WeakAttr[Node] = WeakAttr(slot='_nxt_weak') + __slots__ = ('_nxt_weak',) + + def __init__(self) -> None: + super().__init__(self, self) + + def iternodes(self, *, reverse: bool = False) -> t.Iterator[Node]: + """Iterator yielding nodes in the requested order.""" + attr = 'prv' if reverse else 'nxt' + node = getattr(self, attr) + while node is not self: + yield node + node = getattr(node, attr) + + def new_last_node(self) -> Node: + """Create and return a new terminal node.""" + old_last = self.prv + new_last = Node(old_last, self) + old_last.nxt = self.prv = new_last + return new_last + + +class OrderedBidictBase(BidictBase[KT, VT]): + """Base class implementing an ordered :class:`BidirectionalMapping`.""" + + _node_by_korv: bidict[t.Any, Node] + _bykey: bool + + def __init__(self, arg: MapOrItems[KT, VT] = (), /, **kw: VT) -> None: + """Make a new ordered bidirectional mapping. + The signature behaves like that of :class:`dict`. + Items passed in are added in the order they are passed, + respecting the :attr:`~bidict.BidictBase.on_dup` + class attribute in the process. + + The order in which items are inserted is remembered, + similar to :class:`collections.OrderedDict`. + """ + self._sntl = SentinelNode() + self._node_by_korv = bidict() + self._bykey = True + super().__init__(arg, **kw) + + if t.TYPE_CHECKING: + + @property + def inverse(self) -> OrderedBidictBase[VT, KT]: ... + + @property + def inv(self) -> OrderedBidictBase[VT, KT]: ... + + def _make_inverse(self) -> OrderedBidictBase[VT, KT]: + inv = t.cast(OrderedBidictBase[VT, KT], super()._make_inverse()) + inv._sntl = self._sntl + inv._node_by_korv = self._node_by_korv + inv._bykey = not self._bykey + return inv + + def _assoc_node(self, node: Node, key: KT, val: VT) -> None: + korv = key if self._bykey else val + self._node_by_korv.forceput(korv, node) + + def _dissoc_node(self, node: Node) -> None: + del self._node_by_korv.inverse[node] + node.unlink() + + def _init_from(self, other: MapOrItems[KT, VT]) -> None: + """See :meth:`BidictBase._init_from`.""" + super()._init_from(other) + bykey = self._bykey + korv_by_node = self._node_by_korv.inverse + korv_by_node.clear() + korv_by_node_set = korv_by_node.__setitem__ + self._sntl.nxt = self._sntl.prv = self._sntl + new_node = self._sntl.new_last_node + for k, v in iteritems(other): + korv_by_node_set(new_node(), k if bykey else v) + + def _write(self, newkey: KT, newval: VT, oldkey: OKT[KT], oldval: OVT[VT], unwrites: Unwrites | None) -> None: + """See :meth:`bidict.BidictBase._spec_write`.""" + super()._write(newkey, newval, oldkey, oldval, unwrites) + assoc, dissoc = self._assoc_node, self._dissoc_node + node_by_korv, bykey = self._node_by_korv, self._bykey + if oldval is MISSING and oldkey is MISSING: # no key or value duplication + # {0: 1, 2: 3} | {4: 5} => {0: 1, 2: 3, 4: 5} + newnode = self._sntl.new_last_node() + assoc(newnode, newkey, newval) + if unwrites is not None: + unwrites.append((dissoc, newnode)) + elif oldval is not MISSING and oldkey is not MISSING: # key and value duplication across two different items + # {0: 1, 2: 3} | {0: 3} => {0: 3} + # n1, n2 => n1 (collapse n1 and n2 into n1) + # oldkey: 2, oldval: 1, oldnode: n2, newkey: 0, newval: 3, newnode: n1 + if bykey: + oldnode = node_by_korv[oldkey] + newnode = node_by_korv[newkey] + else: + oldnode = node_by_korv[newval] + newnode = node_by_korv[oldval] + dissoc(oldnode) + assoc(newnode, newkey, newval) + if unwrites is not None: + unwrites.extend(( + (assoc, newnode, newkey, oldval), + (assoc, oldnode, oldkey, newval), + (oldnode.relink,), + )) + elif oldval is not MISSING: # just key duplication + # {0: 1, 2: 3} | {2: 4} => {0: 1, 2: 4} + # oldkey: MISSING, oldval: 3, newkey: 2, newval: 4 + node = node_by_korv[newkey if bykey else oldval] + assoc(node, newkey, newval) + if unwrites is not None: + unwrites.append((assoc, node, newkey, oldval)) + else: + assert oldkey is not MISSING # just value duplication + # {0: 1, 2: 3} | {4: 3} => {0: 1, 4: 3} + # oldkey: 2, oldval: MISSING, newkey: 4, newval: 3 + node = node_by_korv[oldkey if bykey else newval] + assoc(node, newkey, newval) + if unwrites is not None: + unwrites.append((assoc, node, oldkey, newval)) + + def __iter__(self) -> t.Iterator[KT]: + """Iterator over the contained keys in insertion order.""" + return self._iter(reverse=False) + + def __reversed__(self) -> t.Iterator[KT]: + """Iterator over the contained keys in reverse insertion order.""" + return self._iter(reverse=True) + + def _iter(self, *, reverse: bool = False) -> t.Iterator[KT]: + nodes = self._sntl.iternodes(reverse=reverse) + korv_by_node = self._node_by_korv.inverse + if self._bykey: + for node in nodes: + yield korv_by_node[node] + else: + key_by_val = self._invm + for node in nodes: + val = korv_by_node[node] + yield key_by_val[val] + + +# * Code review nav * +# ============================================================================ +# ← Prev: _bidict.py Current: _orderedbase.py Next: _orderedbidict.py → +# ============================================================================ diff --git a/venv/lib/python3.12/site-packages/bidict/_orderedbidict.py b/venv/lib/python3.12/site-packages/bidict/_orderedbidict.py new file mode 100644 index 0000000..2fb1757 --- /dev/null +++ b/venv/lib/python3.12/site-packages/bidict/_orderedbidict.py @@ -0,0 +1,172 @@ +# Copyright 2009-2024 Joshua Bronson. All rights reserved. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +# * Code review nav * +# (see comments in __init__.py) +# ============================================================================ +# ← Prev: _orderedbase.py Current: _orderedbidict.py +# ============================================================================ + + +"""Provide :class:`OrderedBidict`.""" + +from __future__ import annotations + +import typing as t +from collections.abc import Set + +from ._base import BidictKeysView +from ._bidict import MutableBidict +from ._orderedbase import OrderedBidictBase +from ._typing import KT +from ._typing import VT + + +class OrderedBidict(OrderedBidictBase[KT, VT], MutableBidict[KT, VT]): + """Mutable bidict type that maintains items in insertion order.""" + + if t.TYPE_CHECKING: + + @property + def inverse(self) -> OrderedBidict[VT, KT]: ... + + @property + def inv(self) -> OrderedBidict[VT, KT]: ... + + def clear(self) -> None: + """Remove all items.""" + super().clear() + self._node_by_korv.clear() + self._sntl.nxt = self._sntl.prv = self._sntl + + def _pop(self, key: KT) -> VT: + val = super()._pop(key) + node = self._node_by_korv[key if self._bykey else val] + self._dissoc_node(node) + return val + + def popitem(self, last: bool = True) -> tuple[KT, VT]: + """*b.popitem() → (k, v)* + + If *last* is true, + remove and return the most recently added item as a (key, value) pair. + Otherwise, remove and return the least recently added item. + + :raises KeyError: if *b* is empty. + """ + if not self: + raise KeyError('OrderedBidict is empty') + node = getattr(self._sntl, 'prv' if last else 'nxt') + korv = self._node_by_korv.inverse[node] + if self._bykey: + return korv, self._pop(korv) + return self.inverse._pop(korv), korv + + def move_to_end(self, key: KT, last: bool = True) -> None: + """Move the item with the given key to the end if *last* is true, else to the beginning. + + :raises KeyError: if *key* is missing + """ + korv = key if self._bykey else self._fwdm[key] + node = self._node_by_korv[korv] + node.prv.nxt = node.nxt + node.nxt.prv = node.prv + sntl = self._sntl + if last: + lastnode = sntl.prv + node.prv = lastnode + node.nxt = sntl + sntl.prv = lastnode.nxt = node + else: + firstnode = sntl.nxt + node.prv = sntl + node.nxt = firstnode + sntl.nxt = firstnode.prv = node + + # Override the keys() and items() implementations inherited from BidictBase, + # which may delegate to the backing _fwdm dict, since this is a mutable ordered bidict, + # and therefore the ordering of items can get out of sync with the backing mappings + # after mutation. (Need not override values() because it delegates to .inverse.keys().) + def keys(self) -> t.KeysView[KT]: + """A set-like object providing a view on the contained keys.""" + return _OrderedBidictKeysView(self) + + def items(self) -> t.ItemsView[KT, VT]: + """A set-like object providing a view on the contained items.""" + return _OrderedBidictItemsView(self) + + +# The following MappingView implementations use the __iter__ implementations +# inherited from their superclass counterparts in collections.abc, so they +# continue to yield items in the correct order even after an OrderedBidict +# is mutated. They also provide a __reversed__ implementation, which is not +# provided by the collections.abc superclasses. +class _OrderedBidictKeysView(BidictKeysView[KT]): + _mapping: OrderedBidict[KT, t.Any] + + def __reversed__(self) -> t.Iterator[KT]: + return reversed(self._mapping) + + +class _OrderedBidictItemsView(t.ItemsView[KT, VT]): + _mapping: OrderedBidict[KT, VT] + + def __reversed__(self) -> t.Iterator[tuple[KT, VT]]: + ob = self._mapping + for key in reversed(ob): + yield key, ob[key] + + +# For better performance, make _OrderedBidictKeysView and _OrderedBidictItemsView delegate +# to backing dicts for the methods they inherit from collections.abc.Set. (Cannot delegate +# for __iter__ and __reversed__ since they are order-sensitive.) See also: https://bugs.python.org/issue46713 +_OView = t.Union[t.Type[_OrderedBidictKeysView[KT]], t.Type[_OrderedBidictItemsView[KT, t.Any]]] +_setmethodnames: t.Iterable[str] = ( + '__lt__ __le__ __gt__ __ge__ __eq__ __ne__ __sub__ __rsub__ ' + '__or__ __ror__ __xor__ __rxor__ __and__ __rand__ isdisjoint' +).split() + + +def _override_set_methods_to_use_backing_dict(cls: _OView[KT], viewname: str) -> None: + def make_proxy_method(methodname: str) -> t.Any: + def method(self: _OrderedBidictKeysView[KT] | _OrderedBidictItemsView[KT, t.Any], *args: t.Any) -> t.Any: + fwdm = self._mapping._fwdm + if not isinstance(fwdm, dict): # dict view speedup not available, fall back to Set's implementation. + return getattr(Set, methodname)(self, *args) + fwdm_dict_view = getattr(fwdm, viewname)() + fwdm_dict_view_method = getattr(fwdm_dict_view, methodname) + if ( + len(args) != 1 + or not isinstance((arg := args[0]), self.__class__) + or not isinstance(arg._mapping._fwdm, dict) + ): + return fwdm_dict_view_method(*args) + # self and arg are both _OrderedBidictKeysViews or _OrderedBidictItemsViews whose bidicts are backed by + # a dict. Use arg's backing dict's corresponding view instead of arg. Otherwise, e.g. `ob1.keys() + # < ob2.keys()` would give "TypeError: '<' not supported between instances of '_OrderedBidictKeysView' and + # '_OrderedBidictKeysView'", because both `dict_keys(ob1).__lt__(ob2.keys()) is NotImplemented` and + # `dict_keys(ob2).__gt__(ob1.keys()) is NotImplemented`. + arg_dict = arg._mapping._fwdm + arg_dict_view = getattr(arg_dict, viewname)() + return fwdm_dict_view_method(arg_dict_view) + + method.__name__ = methodname + method.__qualname__ = f'{cls.__qualname__}.{methodname}' + return method + + for name in _setmethodnames: + setattr(cls, name, make_proxy_method(name)) + + +_override_set_methods_to_use_backing_dict(_OrderedBidictKeysView, 'keys') +_override_set_methods_to_use_backing_dict(_OrderedBidictItemsView, 'items') + + +# * Code review nav * +# ============================================================================ +# ← Prev: _orderedbase.py Current: _orderedbidict.py +# ============================================================================ diff --git a/venv/lib/python3.12/site-packages/bidict/_typing.py b/venv/lib/python3.12/site-packages/bidict/_typing.py new file mode 100644 index 0000000..ce95053 --- /dev/null +++ b/venv/lib/python3.12/site-packages/bidict/_typing.py @@ -0,0 +1,49 @@ +# Copyright 2009-2024 Joshua Bronson. All rights reserved. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +"""Provide typing-related objects.""" + +from __future__ import annotations + +import typing as t +from enum import Enum + + +KT = t.TypeVar('KT') +VT = t.TypeVar('VT') +VT_co = t.TypeVar('VT_co', covariant=True) + + +Items = t.Iterable[t.Tuple[KT, VT]] + + +@t.runtime_checkable +class Maplike(t.Protocol[KT, VT_co]): + """Like typeshed's SupportsKeysAndGetItem, but usable at runtime.""" + + def keys(self) -> t.Iterable[KT]: ... + + def __getitem__(self, __key: KT) -> VT_co: ... + + +MapOrItems = t.Union[Maplike[KT, VT], Items[KT, VT]] +MappOrItems = t.Union[t.Mapping[KT, VT], Items[KT, VT]] +ItemsIter = t.Iterator[t.Tuple[KT, VT]] + + +class MissingT(Enum): + """Sentinel used to represent none/missing when None itself can't be used.""" + + MISSING = 'MISSING' + + +MISSING: t.Final[t.Literal[MissingT.MISSING]] = MissingT.MISSING +OKT = t.Union[KT, MissingT] #: optional key type +OVT = t.Union[VT, MissingT] #: optional value type + +DT = t.TypeVar('DT') #: for default arguments +ODT = t.Union[DT, MissingT] #: optional default arg type diff --git a/venv/lib/python3.12/site-packages/bidict/metadata.py b/venv/lib/python3.12/site-packages/bidict/metadata.py new file mode 100644 index 0000000..30ad836 --- /dev/null +++ b/venv/lib/python3.12/site-packages/bidict/metadata.py @@ -0,0 +1,14 @@ +# Copyright 2009-2024 Joshua Bronson. All rights reserved. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +"""Define bidict package metadata.""" + +__version__ = '0.23.1' +__author__ = {'name': 'Joshua Bronson', 'email': 'jabronson@gmail.com'} +__copyright__ = '© 2009-2024 Joshua Bronson' +__description__ = 'The bidirectional mapping library for Python.' +__license__ = 'MPL 2.0' +__url__ = 'https://bidict.readthedocs.io' diff --git a/venv/lib/python3.12/site-packages/bidict/py.typed b/venv/lib/python3.12/site-packages/bidict/py.typed new file mode 100644 index 0000000..342ea76 --- /dev/null +++ b/venv/lib/python3.12/site-packages/bidict/py.typed @@ -0,0 +1 @@ +PEP-561 marker. diff --git a/venv/lib/python3.12/site-packages/cairo/__init__.py b/venv/lib/python3.12/site-packages/cairo/__init__.py new file mode 100755 index 0000000..e61c7a3 --- /dev/null +++ b/venv/lib/python3.12/site-packages/cairo/__init__.py @@ -0,0 +1,25 @@ +from ._cairo import * # noqa: F401,F403 + + +def get_include(): + """Returns a path to the directory containing the C header files""" + + import os + + def is_ok(path): + return os.path.exists(path) and os.path.isdir(path) + + package_path = os.path.dirname(os.path.realpath(__file__)) + install_path = os.path.join(package_path, "include") + + # in case we are installed + if is_ok(install_path): + return install_path + + # in case we are running from source + if is_ok(package_path): + return package_path + + # in case we are in an .egg + import pkg_resources + return pkg_resources.resource_filename(__name__, "include") diff --git a/venv/lib/python3.12/site-packages/cairo/__init__.pyi b/venv/lib/python3.12/site-packages/cairo/__init__.pyi new file mode 100644 index 0000000..79a0fa0 --- /dev/null +++ b/venv/lib/python3.12/site-packages/cairo/__init__.pyi @@ -0,0 +1,5889 @@ +from __future__ import annotations + +from typing import (Any, BinaryIO, ByteString, Callable, Generic, List, Optional, + Sequence, Text, Tuple, TypeVar, Union) + +del annotations + +HAS_ATSUI_FONT: bool = ... +HAS_FT_FONT: bool = ... +HAS_GLITZ_SURFACE: bool = ... +HAS_IMAGE_SURFACE: bool = ... +HAS_MIME_SURFACE: bool = ... +""" +.. versionadded:: 1.12.0 +""" +HAS_PDF_SURFACE: bool = ... +HAS_PNG_FUNCTIONS: bool = ... +HAS_PS_SURFACE: bool = ... +HAS_QUARTZ_SURFACE: bool = ... +HAS_RECORDING_SURFACE: bool = ... +HAS_SCRIPT_SURFACE: bool = ... +""" +.. versionadded:: 1.12.0 +""" +HAS_SVG_SURFACE: bool = ... +HAS_TEE_SURFACE: bool = ... +""" +.. versionadded:: 1.15.3 +""" +HAS_USER_FONT: bool = ... +HAS_WIN32_FONT: bool = ... +HAS_WIN32_SURFACE: bool = ... +HAS_XCB_SURFACE: bool = ... +HAS_XLIB_SURFACE: bool = ... +HAS_DWRITE_FONT: bool = ... +""" +.. versionadded:: 1.23.0 +""" + +PDF_OUTLINE_ROOT: int = ... +""" +The root outline item in :meth:`PDFSurface.add_outline` + +.. versionadded:: 1.18.0 Only available with cairo 1.15.10+ +""" + +COLOR_PALETTE_DEFAULT: int = ... +""" +The default color palette index. See :meth:`FontOptions.set_color_palette` + +.. versionadded:: 1.25.0 Only available with cairo 1.17.8+ +""" + +version: str = ... +"""the pycairo version, as a string""" + +version_info: Tuple[int, int, int] = ... +"""the pycairo version, as a tuple""" + +CAIRO_VERSION: int = ... +""" +The version of cairo available at compile-time in the same format as +returned by :func:`cairo_version` + +.. versionadded:: 1.18.0 +""" + +CAIRO_VERSION_STRING: str = ... +""" +A human-readable string literal containing the version of cairo available +at compile-time, in the form of "X.Y.Z". + +.. versionadded:: 1.18.0 +""" + +CAIRO_VERSION_MAJOR: int = ... +""" +The major component of the version of cairo available at compile-time. + +.. versionadded:: 1.18.0 +""" + +CAIRO_VERSION_MINOR: int = ... +""" +The minor component of the version of cairo available at compile-time. + +.. versionadded:: 1.18.0 +""" + +CAIRO_VERSION_MICRO: int = ... +""" +The micro component of the version of cairo available at compile-time. + +.. versionadded:: 1.18.0 +""" + +def cairo_version() -> int: + """ + :returns: the encoded version + + Returns the version of the underlying C cairo library, encoded in a single + integer. + """ + +def cairo_version_string() -> str: + """ + :returns: the encoded version + + Returns the version of the underlying C cairo library as a human-readable + string of the form "X.Y.Z". + """ + +class Path: + """ + *Path* cannot be instantiated directly, it is created by calling + :meth:`Context.copy_path` and :meth:`Context.copy_path_flat`. + + str(path) lists the path elements. + + See :class:`path attributes ` + + Path is an iterator. + + See examples/warpedtext.py for example usage. + """ + +class Rectangle(Tuple[float, float, float, float]): + """ + .. versionadded:: 1.15 + In prior versions a (float, float, float, float) tuple was + used instead of :class:`Rectangle`. + + A data structure for holding a rectangle. + """ + + x: float = ... + y: float = ... + width: float = ... + height: float = ... + + def __init__(self, x: float, y: float, width: float, height: float) -> None: + """ + :param x: + X coordinate of the left side of the rectangle + :param y: + Y coordinate of the the top side of the rectangle + :param width: + width of the rectangle + :param height: + height of the rectangle + """ + +class _IntEnum(int): + def __init__(self, value: int) -> None: ... + +class Antialias(_IntEnum): + """ + Specifies the type of antialiasing to do when rendering text or shapes. + + .. versionadded:: 1.13 + """ + + BEST: "Antialias" = ... + """ + Hint that the backend should render at the highest quality, sacrificing + speed if necessary. + """ + + DEFAULT: "Antialias" = ... + """Use the default antialiasing for the subsystem and target device""" + + FAST: "Antialias" = ... + """ + Hint that the backend should perform some antialiasing but prefer + speed over quality. + """ + + GOOD: "Antialias" = ... + """The backend should balance quality against performance.""" + + GRAY: "Antialias" = ... + """ + Perform single-color antialiasing (using shades of gray for black text + on a white background, for example). + """ + + NONE: "Antialias" = ... + """Use a bilevel alpha mask""" + + SUBPIXEL: "Antialias" = ... + """ + Perform antialiasing by taking advantage of the order of subpixel + elements on devices such as LCD panels. + """ + +class Content(_IntEnum): + """ + These constants are used to describe the content that a :class:`Surface` + will contain, whether color information, alpha information (translucence + vs. opacity), or both. + + .. versionadded:: 1.13 + """ + + ALPHA: "Content" = ... + """The surface will hold alpha content only.""" + + COLOR: "Content" = ... + """The surface will hold color content only.""" + + COLOR_ALPHA: "Content" = ... + """The surface will hold color and alpha content.""" + +class FillRule(_IntEnum): + """ + These constants are used to select how paths are filled. For both fill + rules, whether or not a point is included in the fill is determined by + taking a ray from that point to infinity and looking at intersections with + the path. The ray can be in any direction, as long as it doesn't pass + through the end point of a segment or have a tricky intersection such as + intersecting tangent to the path. (Note that filling is not actually + implemented in this way. This is just a description of the rule that is + applied.) + + The default fill rule is :attr:`WINDING`. + + .. versionadded:: 1.13 + """ + + EVEN_ODD: "FillRule" = ... + """ + Counts the total number of intersections, without regard to the + orientation of the contour. If the total number of intersections is + odd, the point will be filled. + """ + + WINDING: "FillRule" = ... + """ + If the path crosses the ray from left-to-right, counts +1. If the path + crosses the ray from right to left, counts -1. (Left and right are + determined from the perspective of looking along the ray from the + starting point.) If the total count is non-zero, the point will be + filled. + """ + +class Format(_IntEnum): + """ + These constants are used to identify the memory format of + :class:`ImageSurface` data. + + New entries may be added in future versions. + + .. versionadded:: 1.13 + """ + + def stride_for_width(self, width: int) -> int: + """ + :param width: the desired width of an :class:`ImageSurface` + to be created. + :returns: the appropriate stride to use given the desired format and + width, or -1 if either the format is invalid or the width too + large. + + This method provides a stride value that will respect all alignment + requirements of the accelerated image-rendering code within cairo. + Typical usage will be of the form:: + + format = cairo.Format.RGB24 + stride = format.stride_for_width(width) + surface = cairo.ImageSurface.create_for_data( + data, format, width, height, stride) + + Also available under + :meth:`cairo.ImageSurface.format_stride_for_width`. + + .. versionadded:: 1.14 + """ + + A1: "Format" = ... + """ + each pixel is a 1-bit quantity holding an alpha value. Pixels are + packed together into 32-bit quantities. The ordering of the bits + matches the endianess of the platform. On a big-endian machine, the + first pixel is in the uppermost bit, on a little-endian machine the + first pixel is in the least-significant bit. + """ + + A8: "Format" = ... + """ + each pixel is a 8-bit quantity holding an alpha value. + """ + + ARGB32: "Format" = ... + """ + each pixel is a 32-bit quantity, with alpha in the upper 8 bits, then + red, then green, then blue. The 32-bit quantities are stored + native-endian. Pre-multiplied alpha is used. (That is, 50% transparent + red is 0x80800000, not 0x80ff0000.) + """ + + INVALID: "Format" = ... + """no such format exists or is supported.""" + + RGB16_565: "Format" = ... + """ + each pixel is a 16-bit quantity with red in the upper 5 bits, then + green in the middle 6 bits, and blue in the lower 5 bits. + """ + + RGB24: "Format" = ... + """ + each pixel is a 32-bit quantity, with the upper 8 bits unused. [#]_ Red, + Green, and Blue are stored in the remaining 24 bits in that order. + + .. [#] Cairo operators (for example CLEAR and SRC) may overwrite unused bytes as an implementation side-effect, their values should be considered undefined. + """ + + RGB30: "Format" = ... + """ + like :data:`RGB24` but with 10bpc. + """ + + RGB96F: "Format" = ... + """ + 3 floats, R, G, B. + + .. versionadded:: 1.23 Only available with cairo 1.17.2+ + """ + + RGBA128F: "Format" = ... + """ + 4 floats, R, G, B, A. + + .. versionadded:: 1.23 Only available with cairo 1.17.2+ + """ + +class HintMetrics(_IntEnum): + """ + These constants specify whether to hint font metrics; hinting font metrics + means quantizing them so that they are integer values in device space. + Doing this improves the consistency of letter and line spacing, however it + also means that text will be laid out differently at different zoom + factors. + + .. versionadded:: 1.13 + """ + + DEFAULT: "HintMetrics" = ... + """ + Hint metrics in the default manner for the font backend and target + device + """ + + OFF: "HintMetrics" = ... + """"Do not hint font metrics""" + + ON: "HintMetrics" = ... + """Hint font metrics""" + +class ColorMode(_IntEnum): + """ + Specifies if color fonts are to be rendered using the color glyphs or + outline glyphs. Glyphs that do not have a color presentation, and non-color + fonts are not affected by this font option. + + .. versionadded:: 1.25 Only available with cairo 1.17.8+ + """ + + DEFAULT: "ColorMode" = ... + """ + Use the default color mode for font backend and target device. + """ + + NO_COLOR: "ColorMode" = ... + """ + Disable rendering color glyphs. Glyphs are always rendered as outline glyphs + """ + + COLOR: "ColorMode" = ... + """ + Enable rendering color glyphs. If the font contains a color presentation for + a glyph, and when supported by the font backend, the glyph will be rendered + in color. + """ + +class Dither(_IntEnum): + """ + Dither is an intentionally applied form of noise used to randomize + quantization error, preventing large-scale patterns such as color banding in + images (e.g. for gradients). Ordered dithering applies a precomputed + threshold matrix to spread the errors smoothly. + + :class:`Dither` is modeled on pixman dithering algorithm choice. As of + Pixman 0.40, FAST corresponds to a 8x8 ordered bayer noise and GOOD and BEST + use an ordered 64x64 precomputed blue noise. + + .. versionadded:: 1.25 Only available with cairo 1.18.0+ + """ + + NONE: "Dither" = ... + """ + No dithering. + """ + + DEFAULT: "Dither" = ... + """ + Default choice at cairo compile time. Currently NONE. + """ + + FAST: "Dither" = ... + """ + Fastest dithering algorithm supported by the backend + """ + + GOOD: "Dither" = ... + """ + An algorithm with smoother dithering than FAST + """ + + BEST: "Dither" = ... + """ + Best algorithm available in the backend + """ + +class HintStyle(_IntEnum): + """ + These constants specify the type of hinting to do on font outlines. + Hinting is the process of fitting outlines to the pixel grid in order to + improve the appearance of the result. Since hinting outlines involves + distorting them, it also reduces the faithfulness to the original outline + shapes. Not all of the outline hinting styles are supported by all font + backends. + + New entries may be added in future versions. + + .. versionadded:: 1.13 + """ + + DEFAULT: "HintStyle" = ... + """ + Use the default hint style for font backend and target device + """ + + FULL: "HintStyle" = ... + """ + Hint outlines to maximize contrast + """ + + MEDIUM: "HintStyle" = ... + """ + Hint outlines with medium strength giving a compromise between fidelity + to the original shapes and contrast + """ + + NONE: "HintStyle" = ... + """Do not hint outlines""" + + SLIGHT: "HintStyle" = ... + """ + Hint outlines slightly to improve contrast while retaining good + fidelity to the original shapes. + """ + +class SubpixelOrder(_IntEnum): + """ + The subpixel order specifies the order of color elements within each pixel + on the display device when rendering with an antialiasing mode of + :attr:`Antialias.SUBPIXEL`. + + .. versionadded:: 1.13 + """ + + BGR: "SubpixelOrder" = ... + """Subpixel elements are arranged horizontally with blue at the left""" + + DEFAULT: "SubpixelOrder" = ... + """Use the default subpixel order for for the target device""" + + RGB: "SubpixelOrder" = ... + """Subpixel elements are arranged horizontally with red at the left""" + + VBGR: "SubpixelOrder" = ... + """Subpixel elements are arranged vertically with blue at the top""" + + VRGB: "SubpixelOrder" = ... + """Subpixel elements are arranged vertically with red at the top""" + +class LineCap(_IntEnum): + """ + These constants specify how to render the endpoints of the path when + stroking. + + The default line cap style is :attr:`BUTT` + + .. versionadded:: 1.13 + """ + + BUTT: "LineCap" = ... + """start(stop) the line exactly at the start(end) point""" + + ROUND: "LineCap" = ... + """use a round ending, the center of the circle is the end point""" + + SQUARE: "LineCap" = ... + """use squared ending, the center of the square is the end point""" + +class LineJoin(_IntEnum): + """ + These constants specify how to render the junction of two lines when + stroking. + + The default line join style is :attr:`MITER` + + .. versionadded:: 1.13 + """ + + BEVEL: "LineJoin" = ... + """ + use a cut-off join, the join is cut off at half the line width from + the joint point + """ + + MITER: "LineJoin" = ... + """ + use a sharp (angled) corner, see :meth:`Context.set_miter_limit` + """ + + ROUND: "LineJoin" = ... + """use a rounded join, the center of the circle is the joint point""" + +class Filter(_IntEnum): + """ + These constants are used to indicate what filtering should be applied when + reading pixel values from patterns. See :meth:`Pattern.set_filter` for + indicating the desired filter to be used with a particular pattern. + + .. versionadded:: 1.13 + """ + + BEST: "Filter" = ... + """ + The highest-quality available, performance may not be suitable for + interactive use. + """ + + BILINEAR: "Filter" = ... + """Linear interpolation in two dimensions""" + + FAST: "Filter" = ... + """A high-performance filter, with quality similar *FILTER_NEAREST*""" + + GAUSSIAN: "Filter" = ... + """ + This filter value is currently unimplemented, and should not be used + in current code. + """ + + GOOD: "Filter" = ... + """ + A reasonable-performance filter, with quality similar to + *FILTER_BILINEAR* + """ + + NEAREST: "Filter" = ... + """Nearest-neighbor filtering""" + +class Operator(_IntEnum): + """ + These constants are used to set the compositing operator for all cairo + drawing operations. + + The default operator is :attr:`OVER`. + + The operators marked as *unbounded* modify their destination even outside + of the mask layer (that is, their effect is not bound by the mask layer). + However, their effect can still be limited by way of clipping. + + To keep things simple, the operator descriptions here document the + behavior for when both source and destination are either fully transparent + or fully opaque. The actual implementation works for translucent layers + too. + + For a more detailed explanation of the effects of each operator, including + the mathematical definitions, see https://cairographics.org/operators. + + .. versionadded:: 1.13 + """ + + ADD: "Operator" = ... + """source and destination layers are accumulated""" + + ATOP: "Operator" = ... + """draw source on top of destination content and only there""" + + CLEAR: "Operator" = ... + """clear destination layer (bounded)""" + + COLOR_BURN: "Operator" = ... + """darkens the destination color to reflect the source color.""" + + COLOR_DODGE: "Operator" = ... + """brightens the destination color to reflect the source color.""" + + DARKEN: "Operator" = ... + """ + replaces the destination with the source if it is darker, otherwise + keeps the source. + """ + + DEST: "Operator" = ... + """ignore the source""" + + DEST_ATOP: "Operator" = ... + """leave destination on top of source content and only there (unbounded)""" + + DEST_IN: "Operator" = ... + """leave destination only where there was source content (unbounded)""" + + DEST_OUT: "Operator" = ... + """leave destination only where there was no source content""" + + DEST_OVER: "Operator" = ... + """draw destination on top of source""" + + DIFFERENCE: "Operator" = ... + """Takes the difference of the source and destination color.""" + + EXCLUSION: "Operator" = ... + """Produces an effect similar to difference, but with lower contrast.""" + + HARD_LIGHT: "Operator" = ... + """Multiplies or screens, dependent on source color.""" + + HSL_COLOR: "Operator" = ... + """ + Creates a color with the hue and saturation of the source and the + luminosity of the target. This preserves the gray levels of the target + and is useful for coloring monochrome images or tinting color images. + """ + + HSL_HUE: "Operator" = ... + """ + Creates a color with the hue of the source and the saturation and + luminosity of the target. + """ + + HSL_LUMINOSITY: "Operator" = ... + """ + Creates a color with the luminosity of the source and the hue and + saturation of the target. This produces an inverse effect to + :attr:`HSL_COLOR` + """ + + HSL_SATURATION: "Operator" = ... + """ + Creates a color with the saturation of the source and the hue and + luminosity of the target. Painting with this mode onto a gray area + produces no change. + """ + + IN: "Operator" = ... + """draw source where there was destination content (unbounded)""" + + LIGHTEN: "Operator" = ... + """ + replaces the destination with the source if it is lighter, otherwise + keeps the source. + """ + + MULTIPLY: "Operator" = ... + """ + source and destination layers are multiplied. This causes the result + to be at least as dark as the darker inputs. + """ + + OUT: "Operator" = ... + """draw source where there was no destination content (unbounded)""" + + OVER: "Operator" = ... + """draw source layer on top of destination layer (bounded)""" + + OVERLAY: "Operator" = ... + """ + multiplies or screens, depending on the lightness of the destination + color. + """ + + SATURATE: "Operator" = ... + """like over, but assuming source and dest are disjoint geometries""" + + SCREEN: "Operator" = ... + """ + source and destination are complemented and multiplied. This causes + the result to be at least as light as the lighter inputs. + """ + + SOFT_LIGHT: "Operator" = ... + """Darkens or lightens, dependent on source color.""" + + SOURCE: "Operator" = ... + """replace destination layer (bounded)""" + + XOR: "Operator" = ... + """source and destination are shown where there is only one of them""" + +class Extend(_IntEnum): + """ + These constants are used to describe how :class:`Pattern` color/alpha will + be determined for areas "outside" the pattern's natural area, (for + example, outside the surface bounds or outside the gradient geometry). + + The default extend mode is :attr:`NONE` for :class:`SurfacePattern` and + :attr:`PAD` for :class:`Gradient` patterns. + + .. versionadded:: 1.13 + """ + + NONE: "Extend" = ... + """pixels outside of the source pattern are fully transparent""" + + PAD: "Extend" = ... + """ + pixels outside of the pattern copy the closest pixel from the source + (Since 1.2; but only implemented for surface patterns since 1.6) + """ + + REFLECT: "Extend" = ... + """ + the pattern is tiled by reflecting at the edges (Implemented for + surface patterns since 1.6) + """ + + REPEAT: "Extend" = ... + """the pattern is tiled by repeating""" + +class FontSlant(_IntEnum): + """ + These constants specify variants of a :class:`FontFace` based on their + slant. + + .. versionadded:: 1.13 + """ + + ITALIC: "FontSlant" = ... + """Italic font style""" + + NORMAL: "FontSlant" = ... + """Upright font style""" + + OBLIQUE: "FontSlant" = ... + """Oblique font style""" + +class FontWeight(_IntEnum): + """ + These constants specify variants of a :class:`FontFace` based on their + weight. + + .. versionadded:: 1.13 + """ + + BOLD: "FontWeight" = ... + """Bold font weight""" + + NORMAL: "FontWeight" = ... + """Normal font weight""" + +class Status(_IntEnum): + """ + .. versionadded:: 1.13 + """ + + CLIP_NOT_REPRESENTABLE: "Status" = ... + DEVICE_ERROR: "Status" = ... + DEVICE_FINISHED: "Status" = ... + DEVICE_TYPE_MISMATCH: "Status" = ... + FILE_NOT_FOUND: "Status" = ... + FONT_TYPE_MISMATCH: "Status" = ... + INVALID_CLUSTERS: "Status" = ... + INVALID_CONTENT: "Status" = ... + INVALID_DASH: "Status" = ... + INVALID_DSC_COMMENT: "Status" = ... + INVALID_FORMAT: "Status" = ... + INVALID_INDEX: "Status" = ... + INVALID_MATRIX: "Status" = ... + INVALID_MESH_CONSTRUCTION: "Status" = ... + INVALID_PATH_DATA: "Status" = ... + INVALID_POP_GROUP: "Status" = ... + INVALID_RESTORE: "Status" = ... + INVALID_SIZE: "Status" = ... + INVALID_SLANT: "Status" = ... + INVALID_STATUS: "Status" = ... + INVALID_STRIDE: "Status" = ... + INVALID_STRING: "Status" = ... + INVALID_VISUAL: "Status" = ... + INVALID_WEIGHT: "Status" = ... + JBIG2_GLOBAL_MISSING: "Status" = ... + """ + .. versionadded:: 1.14 + """ + LAST_STATUS: "Status" = ... + NEGATIVE_COUNT: "Status" = ... + NO_CURRENT_POINT: "Status" = ... + NO_MEMORY: "Status" = ... + NULL_POINTER: "Status" = ... + PATTERN_TYPE_MISMATCH: "Status" = ... + READ_ERROR: "Status" = ... + SUCCESS: "Status" = ... + SURFACE_FINISHED: "Status" = ... + SURFACE_TYPE_MISMATCH: "Status" = ... + TEMP_FILE_ERROR: "Status" = ... + USER_FONT_ERROR: "Status" = ... + USER_FONT_IMMUTABLE: "Status" = ... + USER_FONT_NOT_IMPLEMENTED: "Status" = ... + WRITE_ERROR: "Status" = ... + TAG_ERROR: "Status" = ... + """ + .. versionadded:: 1.18.0 Only available with cairo 1.15.10+ + """ + FREETYPE_ERROR: "Status" = ... + """ + .. versionadded:: 1.18.0 Only available with cairo 1.15.10+ + """ + PNG_ERROR: "Status" = ... + """ + .. versionadded:: 1.18.0 Only available with cairo 1.15.10+ + """ + WIN32_GDI_ERROR: "Status" = ... + """ + .. versionadded:: 1.18.0 Only available with cairo 1.15.10+ + """ + DWRITE_ERROR: "Status" = ... + """ + .. versionadded:: 1.23.0 Only available with cairo 1.17.6+ + """ + SVG_FONT_ERROR: "Status" = ... + """ + .. versionadded:: 1.25.0 Only available with cairo 1.17.8+ + """ + +class PDFVersion(_IntEnum): + """ + These constants are used to describe the version number of the PDF + specification that a generated PDF file will conform to. + + .. versionadded:: 1.13 + """ + + VERSION_1_4: "PDFVersion" = ... + """The version 1.4 of the PDF specification.""" + + VERSION_1_5: "PDFVersion" = ... + """The version 1.5 of the PDF specification.""" + + VERSION_1_6: "PDFVersion" = ... + """ + The version 1.6 of the PDF specification. + + .. versionadded:: 1.23.0 Only available with cairo 1.17.6+ + """ + + VERSION_1_7: "PDFVersion" = ... + """ + The version 1.7 of the PDF specification. + + .. versionadded:: 1.23.0 Only available with cairo 1.17.6+ + """ + +class PSLevel(_IntEnum): + """ + These constants are used to describe the language level of the PostScript + Language Reference that a generated PostScript file will conform to. + Note: the constants are only defined when cairo has been compiled with PS + support enabled. + + .. versionadded:: 1.13 + """ + + LEVEL_2: "PSLevel" = ... + """The language level 2 of the PostScript specification.""" + + LEVEL_3: "PSLevel" = ... + """The language level 3 of the PostScript specification.""" + +class PathDataType(_IntEnum): + """ + These constants are used to describe the type of one portion of a path + when represented as a :class:`Path`. + + .. versionadded:: 1.13 + """ + + CLOSE_PATH: "PathDataType" = ... + """A close-path operation""" + + CURVE_TO: "PathDataType" = ... + """A curve-to operation""" + + LINE_TO: "PathDataType" = ... + """ A line-to operation""" + + MOVE_TO: "PathDataType" = ... + """A move-to operation""" + +class RegionOverlap(_IntEnum): + """ + .. versionadded:: 1.13 + """ + + IN: "RegionOverlap" = ... + """The contents are entirely inside the region.""" + + OUT: "RegionOverlap" = ... + """The contents are entirely outside the region.""" + + PART: "RegionOverlap" = ... + """The contents are partially inside and partially outside the region.""" + +class SVGVersion(_IntEnum): + """ + These constants are used to describe the version number of the SVG + specification that a generated SVG file will conform to. + + .. versionadded:: 1.13 + """ + + VERSION_1_1: "SVGVersion" = ... + """The version 1.1 of the SVG specification.""" + + VERSION_1_2: "SVGVersion" = ... + """The version 1.2 of the SVG specification.""" + +class SVGUnit(_IntEnum): + """ + :class:`SVGUnit` is used to describe the units valid for coordinates and + lengths in the SVG specification. + + See also: + + * https://www.w3.org/TR/SVG/coords.htmlUnits + * https://www.w3.org/TR/SVG/types.htmlDataTypeLength + * https://www.w3.org/TR/css-values-3/lengths + + .. versionadded:: 1.18.0 Only available with cairo 1.15.10+ + """ + + USER: "SVGUnit" = ... + """ + User unit, a value in the current coordinate system. If used in the + root element for the initial coordinate systems it corresponds to + pixels. + """ + + EM: "SVGUnit" = ... + """The size of the element's font.""" + + EX: "SVGUnit" = ... + """The x-height of the element’s font.""" + + PX: "SVGUnit" = ... + """Pixels (1px = 1/96th of 1in).""" + + IN: "SVGUnit" = ... + """Inches (1in = 2.54cm = 96px)""" + + CM: "SVGUnit" = ... + """Centimeters (1cm = 96px/2.54).""" + + MM: "SVGUnit" = ... + """Millimeters (1mm = 1/10th of 1cm).""" + + PT: "SVGUnit" = ... + """Points (1pt = 1/72th of 1in).""" + + PC: "SVGUnit" = ... + """Picas (1pc = 1/6th of 1in).""" + + PERCENT: "SVGUnit" = ... + """Percent, a value that is some fraction of another reference value.""" + +class PDFMetadata(_IntEnum): + """ + :class:`PDFMetadata` is used by the :meth:`PDFSurface.set_metadata` method + to specify the metadata to set. + + .. versionadded:: 1.18.0 Only available with cairo 1.15.10+ + """ + + TITLE: "PDFMetadata" = ... + """The document title""" + + AUTHOR: "PDFMetadata" = ... + """The document author""" + + SUBJECT: "PDFMetadata" = ... + """The document subject""" + + KEYWORDS: "PDFMetadata" = ... + """The document keywords""" + + CREATOR: "PDFMetadata" = ... + """The document creator""" + + CREATE_DATE: "PDFMetadata" = ... + """The document creation date""" + + MOD_DATE: "PDFMetadata" = ... + """The document modification date""" + +class PDFOutlineFlags(_IntEnum): + """ + :class:`PDFOutlineFlags` is used by the :meth:`PDFSurface.add_outline` + method to specify the attributes of an outline item. These flags may be + bitwise-or'd to produce any combination of flags. + + .. versionadded:: 1.18.0 Only available with cairo 1.15.10+ + """ + + OPEN: "PDFOutlineFlags" = ... + """The outline item defaults to open in the PDF viewer""" + + BOLD: "PDFOutlineFlags" = ... + """The outline item is displayed by the viewer in bold text""" + + ITALIC: "PDFOutlineFlags" = ... + """The outline item is displayed by the viewer in italic text""" + +class ScriptMode(_IntEnum): + """ + A set of script output variants. + + .. versionadded:: 1.14 + """ + + ASCII: "ScriptMode" = ... + """the output will be in readable text (default)""" + + BINARY: "ScriptMode" = ... + """the output will use byte codes.""" + +class Matrix: + """ + *Matrix* is used throughout cairo to convert between different coordinate + spaces. A *Matrix* holds an affine transformation, such as a scale, + rotation, shear, or a combination of these. The transformation of a point + (x,y) is given by:: + + x_new = xx * x + xy * y + x0 + y_new = yx * x + yy * y + y0 + + The current transformation matrix of a :class:`Context`, represented as a + *Matrix*, defines the transformation from user-space coordinates to + device-space coordinates. + + Some standard Python operators can be used with matrices: + + To read the values from a *Matrix*:: + + xx, yx, xy, yy, x0, y0 = matrix + + To multiply two matrices:: + + matrix3 = matrix1.multiply(matrix2) + # or equivalently + matrix3 = matrix1 * matrix2 + + To compare two matrices:: + + matrix1 == matrix2 + matrix1 != matrix2 + + For more information on matrix transformation see + https://www.cairographics.org/cookbook/matrix_transform/ + """ + + def __init__(self, xx: float = 1.0, yx: float = 0.0, xy: float = 0.0, yy: float = 1.0, x0: float = 0.0, y0: float = 0.0) -> None: + """ + :param xx: xx component of the affine transformation + :param yx: yx component of the affine transformation + :param xy: xy component of the affine transformation + :param yy: yy component of the affine transformation + :param x0: X translation component of the affine transformation + :param y0: Y translation component of the affine transformation + + Create a new *Matrix* with the affine transformation given by *xx, yx, + xy, yy, x0, y0*. The transformation is given by:: + + x_new = xx * x + xy * y + x0 + y_new = yx * x + yy * y + y0 + + To create a new identity matrix:: + + matrix = cairo.Matrix() + + To create a matrix with a transformation which translates by tx and ty + in the X and Y dimensions, respectively:: + + matrix = cairo.Matrix(x0=tx, y0=ty) + + To create a matrix with a transformation that scales by sx and sy in the + X and Y dimensions, respectively:: + + matrix = cairo.Matrix(xx=sy, yy=sy) + """ + + @classmethod + def init_rotate(cls, radians: float) -> "Matrix": + """ + :param radians: angle of rotation, in radians. The direction of rotation + is defined such that positive angles rotate in the direction from the + positive X axis toward the positive Y axis. With the default axis + orientation of cairo, positive angles rotate in a clockwise direction. + :returns: a new *Matrix* set to a transformation that rotates by *radians*. + """ + + def invert(self) -> Optional["Matrix"]: + """ + :returns: If *Matrix* has an inverse, modifies *Matrix* to be the + inverse matrix and returns *None* + :raises: :exc:`cairo.Error` if the *Matrix* as no inverse + + Changes *Matrix* to be the inverse of it's original value. Not all + transformation matrices have inverses; if the matrix collapses points + together (it is *degenerate*), then it has no inverse and this function + will fail. + """ + + def multiply(self, matrix2: "Matrix") -> "Matrix": + """ + :param matrix2: a second matrix + :returns: a new *Matrix* + + Multiplies the affine transformations in *Matrix* and *matrix2* + together. The effect of the resulting transformation is to first apply + the transformation in *Matrix* to the coordinates and then apply the + transformation in *matrix2* to the coordinates. + + It is allowable for result to be identical to either *Matrix* or *matrix2*. + """ + + def rotate(self, radians: float) -> None: + """ + :param radians: angle of rotation, in radians. The direction of rotation + is defined such that positive angles rotate in the direction from the + positive X axis toward the positive Y axis. With the default axis + orientation of cairo, positive angles rotate in a clockwise direction. + + Initialize *Matrix* to a transformation that rotates by *radians*. + """ + + def scale(self, sx: float, sy: float) -> None: + """ + :param sx: scale factor in the X direction + :param sy: scale factor in the Y direction + + Applies scaling by *sx, sy* to the transformation in *Matrix*. The + effect of the new transformation is to first scale the coordinates by + *sx* and *sy*, then apply the original transformation to the + coordinates. + """ + + def transform_distance(self, dx: float, dy: float) -> Tuple[float, float]: + """ + :param dx: X component of a distance vector. + :param dy: Y component of a distance vector. + :returns: the transformed distance vector (dx,dy), both float + + Transforms the distance vector *(dx,dy)* by *Matrix*. This is similar to + :meth:`.transform_point` except that the translation components of + the transformation are ignored. The calculation of the returned vector + is as follows:: + + dx2 = dx1 * a + dy1 * c + dy2 = dx1 * b + dy1 * d + + Affine transformations are position invariant, so the same vector always + transforms to the same vector. If *(x1,y1)* transforms to *(x2,y2)* then + *(x1+dx1,y1+dy1)* will transform to *(x1+dx2,y1+dy2)* for all values + of *x1* and *x2*. + """ + + def transform_point(self, x: float, y: float) -> Tuple[float, float]: + """ + :param x: X position. + :param y: Y position. + :returns: the transformed point (x,y), both float + + Transforms the point *(x, y)* by *Matrix*. + """ + + def translate(self, tx: float, ty: float) -> None: + """ + :param tx: amount to translate in the X direction + :param ty: amount to translate in the Y direction + + Applies a transformation by *tx, ty* to the transformation in + *Matrix*. The effect of the new transformation is to first translate the + coordinates by *tx* and *ty*, then apply the original transformation to the + coordinates. + """ + + xx: float = ... + """ + xx component of the affine transformation + + .. versionadded:: 1.12.0 + """ + + yx: float = ... + """ + yx component of the affine transformation + + .. versionadded:: 1.12.0 + """ + + xy: float = ... + """ + xy component of the affine transformation + + .. versionadded:: 1.12.0 + """ + + yy: float = ... + """ + yy component of the affine transformation + + .. versionadded:: 1.12.0 + """ + + x0: float = ... + """ + X translation component of the affine transformation + + .. versionadded:: 1.12.0 + """ + + y0: float = ... + """ + Y translation component of the affine transformation + + .. versionadded:: 1.12.0 + """ + +class Pattern: + """ + *Pattern* is the abstract base class from which all the other pattern classes + derive. It cannot be instantiated directly. + """ + + def get_extend(self) -> Extend: + """ + :returns: the current extend strategy used for drawing the *Pattern*. + + Gets the current extend mode for the *Pattern*. See + :class:`cairo.Extend` attributes for details on the semantics of each + extend strategy. + """ + + def get_matrix(self) -> Matrix: + """ + :returns: a new :class:`Matrix` which stores a copy of the *Pattern's* + transformation matrix + """ + + def get_filter(self) -> Filter: + """ + :returns: the current filter used for + resizing the pattern. + + .. versionadded:: 1.12.0 + + Used to be a method of :class:`SurfacePattern` before + """ + + def set_filter(self, filter: Filter) -> None: + """ + :param filter: a filter describing the filter + to use for resizing the pattern + + Note that you might want to control filtering even when you do not have + an explicit *Pattern* object, (for example when using + :meth:`Context.set_source_surface`). In these cases, it is convenient to + use :meth:`Context.get_source` to get access to the pattern that cairo + creates implicitly. For example:: + + context.set_source_surface(image, x, y) + context.get_source().set_filter(cairo.FILTER_NEAREST) + + .. versionadded:: 1.12.0 + + Used to be a method of :class:`SurfacePattern` before + """ + + def set_extend(self, extend: Extend) -> None: + """ + :param extend: an extend describing how the + area outside of the *Pattern* will be drawn + + Sets the mode to be used for drawing outside the area of a *Pattern*. + + The default extend mode is :attr:`cairo.Extend.NONE` for + :class:`SurfacePattern` and :attr:`cairo.Extend.PAD` for + :class:`Gradient` Patterns. + """ + + def set_matrix(self, matrix: Matrix) -> None: + """ + :param matrix: a :class:`Matrix` + + Sets the *Pattern's* transformation matrix to *matrix*. This matrix is a + transformation from user space to pattern space. + + When a *Pattern* is first created it always has the identity matrix for + its transformation matrix, which means that pattern space is initially + identical to user space. + + Important: Please note that the direction of this transformation matrix + is from user space to pattern space. This means that if you imagine the + flow from a *Pattern* to user space (and on to device space), then + coordinates in that flow will be transformed by the inverse of the + *Pattern* matrix. + + For example, if you want to make a *Pattern* appear twice as large as it + does by default the correct code to use is:: + + matrix = cairo.Matrix(xx=0.5,yy=0.5) + pattern.set_matrix(matrix) + + Meanwhile, using values of 2.0 rather than 0.5 in the code above would + cause the *Pattern* to appear at half of its default size. + + Also, please note the discussion of the user-space locking semantics of + :class:`Context.set_source`. + """ + + def get_dither(self) -> Dither: + """ + :returns: the current dithering mode. + + Gets the current dithering mode, as set by :meth:`Pattern.set_dither`. + + .. versionadded:: 1.25.0 Only available with cairo 1.18.0+ + """ + + def set_dither(self, dither: Dither) -> None: + """ + :param dither: a :class:`Dither` describing the new dithering mode + + Set the dithering mode of the rasterizer used for drawing shapes. This + value is a hint, and a particular backend may or may not support a + particular value. At the current time, only pixman is supported. + + .. versionadded:: 1.25.0 Only available with cairo 1.18.0+ + """ + +class Glyph(Tuple[int, float, float]): + """ + The :class:`Glyph` holds information about a single glyph when drawing or + measuring text. A font is (in simple terms) a collection of shapes used to + draw text. A glyph is one of these shapes. There can be multiple glyphs + for a single character (alternates to be used in different contexts, for + example), or a glyph can be a ligature of multiple characters. Cairo + doesn't expose any way of converting input text into glyphs, so in order + to use the Cairo interfaces that take arrays of glyphs, you must directly + access the appropriate underlying font system. + + Note that the offsets given by x and y are not cumulative. When drawing or + measuring text, each glyph is individually positioned with respect to the + overall origin + + .. versionadded:: 1.15 + In prior versions a (int, float, float) tuple was used instead + of :class:`Glyph`. + """ + + index: int = ... # type: ignore + x: float = ... + y: float = ... + + def __init__(self, index: int, x: float, y: float) -> None: + """ + :param index: + glyph index in the font. The exact interpretation of the glyph index + depends on the font technology being used. + :param x: + the offset in the X direction between the origin used for drawing or + measuring the string and the origin of this glyph. + :param y: + the offset in the Y direction between the origin used for drawing or + measuring the string and the origin of this glyph. + """ + +class TextCluster(Tuple[int, int]): + """ + .. versionadded:: 1.15 + + The :class:`TextCluster` structure holds information about a single text + cluster. A text cluster is a minimal mapping of some glyphs corresponding + to some UTF-8 text. + + For a cluster to be valid, both ``num_bytes`` and ``num_glyphs`` should be + non-negative, and at least one should be non-zero. Note that clusters with + zero glyphs are not as well supported as normal clusters. For example, PDF + rendering applications typically ignore those clusters when PDF text is + being selected. + + See :meth:`Context.show_text_glyphs` for how clusters are used in advanced + text operations. + """ + num_bytes: int = ... + num_glyphs: int = ... + def __init__(self, num_bytes: int, num_glyphs: int) -> None: + """ + :param num_bytes: + the number of bytes of UTF-8 text covered by cluster + :param num_glyphs: + the number of glyphs covered by cluster + """ + +class TextClusterFlags(_IntEnum): + """ + Specifies properties of a text cluster mapping. + + .. versionadded:: 1.14 + """ + + BACKWARD: "TextClusterFlags" = ... + """ + The clusters in the cluster array map to glyphs in the glyph array + from end to start. + """ + +class TextExtents(Tuple[float, float, float, float, float, float]): + """ + .. versionadded:: 1.15 + In prior versions a (float, float, float, float, float, float) tuple + was used instead of :class:`TextExtents`. + + The :class:`TextExtents` class stores the extents of a single glyph or a + string of glyphs in user-space coordinates. Because text extents are in + user-space coordinates, they are mostly, but not entirely, independent of + the current transformation matrix. If you call ``context.scale(2.0, + 2.0)``, text will be drawn twice as big, but the reported text extents + will not be doubled. They will change slightly due to hinting (so you + can't assume that metrics are independent of the transformation matrix), + but otherwise will remain unchanged. + """ + x_bearing: float = ... + y_bearing: float = ... + width: float = ... + height: float = ... + x_advance: float = ... + y_advance: float = ... + def __init__(self, x_bearing: float, y_bearing: float, width: float, height: float, x_advance: float, y_advance: float) -> None: + """ + :param x_bearing: + the horizontal distance from the origin to the leftmost part of the + glyphs as drawn. Positive if the glyphs lie entirely to the right of + the origin. + :param y_bearing: + the vertical distance from the origin to the topmost part of the + glyphs as drawn. Positive only if the glyphs lie completely below the + origin; will usually be negative. + :param width: + width of the glyphs as drawn + :param height: + height of the glyphs as drawn + :param x_advance: + distance to advance in the X direction after drawing these glyphs + :param y_advance: + distance to advance in the Y direction after drawing these glyphs. + Will typically be zero except for vertical text layout as found in + East-Asian languages. + """ + +class RectangleInt: + """ + RectangleInt is a data structure for holding a rectangle with integer coordinates. + + .. versionadded:: 1.11.0 + """ + + height: int = ... + width: int = ... + x: int = ... + y: int = ... + + def __init__(self, x: int=0, y: int=0, width: int=0, height: int=0) -> None: + """ + :param x: + X coordinate of the left side of the rectangle. + :param y: + Y coordinate of the top side of the rectangle. + :param width: + Width of the rectangle. + :param height: + Height of the rectangle. + + Allocates a new RectangleInt object. + """ + + +class FontFace: + """ + A *cairo.FontFace* specifies all aspects of a font other than the size or font + matrix (a font matrix is used to distort a font by sheering it or scaling it + unequally in the two directions). A *FontFace* can be set on a + :class:`Context` by using :meth:`Context.set_font_face` the size and font + matrix are set with :meth:`Context.set_font_size` and + :meth:`Context.set_font_matrix`. + + There are various types of *FontFace*, depending on the font backend they + use. + + .. note:: This class cannot be instantiated directly, it is returned by + :meth:`Context.get_font_face`. + """ + +class FontOptions: + """ + An opaque structure holding all options that are used when rendering fonts. + + Individual features of a *FontOptions* can be set or accessed using functions + named *FontOptions.set_* and + *FontOptions.get_*, like :meth:`FontOptions.set_antialias` + and :meth:`FontOptions.get_antialias`. + + New features may be added to a *FontOptions* in the future. For this reason, + :meth:`FontOptions.copy()`, :meth:`FontOptions.equal()`, + :meth:`FontOptions.merge()`, and :meth:`FontOptions.hash()` should be used to + copy, check for equality, merge, or compute a hash value of FontOptions + objects. + + Implements `__eq__` and `__ne__` using `equal()` since 1.12.0. + """ + + def __init__(self) -> None: + """ + Allocates a new FontOptions object with all options initialized to default + values. + """ + + def get_antialias(self) -> Antialias: + """ + :returns: the antialias mode for the *FontOptions* object + """ + + def get_hint_style(self) -> HintStyle: + """ + :returns: the hint style for the *FontOptions* object + """ + + def get_subpixel_order(self) -> SubpixelOrder: + """ + :returns: the subpixel order for the *FontOptions* object + """ + + def set_antialias(self, antialias: Antialias) -> None: + """ + :param antialias: the antialias mode + + This specifies the type of antialiasing to do when rendering text. + """ + + def set_hint_metrics(self, hint_metrics: HintMetrics) -> None: + """ + :param hint_metrics: the hint metrics mode + + This controls whether metrics are quantized to integer values in device + units. + """ + + def set_hint_style(self, hint_style: HintStyle) -> None: + """ + :param hint_style: the hint style + + This controls whether to fit font outlines to the pixel grid, and if so, + whether to optimize for fidelity or contrast. + """ + + def merge(self, other: "FontOptions") -> None: + """ + :param FontOptions other: another :class:`FontOptions` + + Merges non-default options from other into options , replacing existing + values. This operation can be thought of as somewhat similar to + compositing other onto options with the operation of + :attr:`Operator.OVER`. + + .. versionadded:: 1.12.0 + """ + + def copy(self) -> "FontOptions": + """ + :returns: a new :class:`FontOptions` + + Returns a new font options object copying the option values from + original. + + .. versionadded:: 1.12.0 + """ + + def hash(self) -> int: + """ + :returns: the hash value for the font options object + + Compute a hash for the font options object; this value will be useful + when storing an object containing a :class:`FontOptions` in a hash + table. + + .. versionadded:: 1.12.0 + """ + + def equal(self, other: "FontOptions") -> bool: + """ + :param other: another :class:`FontOptions` + :returns: :obj:`True` if all fields of the two font options objects + match. Note that this function will return :obj:`False` if either + object is in error. + + Compares two font options objects for equality. + + .. versionadded:: 1.12.0 + """ + + def set_variations(self, variations: Optional[str]) -> None: + """ + :param variations: the new font variations, or :obj:`None` + + Sets the OpenType font variations for the font options object. Font + variations are specified as a string with a format that is similar to + the CSS font-variation-settings. The string contains a comma-separated + list of axis assignments, which each assignment consists of a + 4-character axis name and a value, separated by whitespace and + optional equals sign. + + Examples: + + * wght=200,wdth=140.5 + * wght 200 , wdth 140.5 + + .. versionadded:: 1.18.0 Only available with cairo 1.15.12+ + """ + + def get_variations(self) -> str: + """ + :returns: + the font variations for the font options object. The returned + string belongs to the options and must not be modified. It is + valid until either the font options object is destroyed or the + font variations in this object is modified with + :meth:`set_variations`. + + Gets the OpenType font variations for the font options object. See + :meth:`set_variations` for details about the string format. + + .. versionadded:: 1.18.0 Only available with cairo 1.15.12+ + """ + + def get_hint_metrics(self) -> HintMetrics: + """ + :returns: the hint metrics mode for the *FontOptions* object + """ + + def set_subpixel_order(self, subpixel_order: SubpixelOrder) -> None: + """ + :param subpixel_order: the subpixel order + + The subpixel order specifies the order of color elements within each + pixel on the display device when rendering with an antialiasing mode of + :attr:`cairo.Antialias.SUBPIXEL`. + """ + + def set_color_mode(self, color_mode: ColorMode) -> None: + """ + :param color_mode: the new color mode + + Sets the color mode for the font options object. This controls whether + color fonts are to be rendered in color or as outlines. See the + documentation for :class:`ColorMode` for full details. + + .. versionadded:: 1.25.0 Only available with cairo 1.17.8+ + """ + + def get_color_mode(self) -> ColorMode: + """ + :returns: the color mode for the font options object + + Gets the color mode for the font options object. See the documentation + for :class:`ColorMode` for full details. + + .. versionadded:: 1.25.0 Only available with cairo 1.17.8+ + """ + + def set_color_palette(self, palette_index: int) -> None: + """ + :param palette_index: the palette index in the CPAL table + + Sets the OpenType font color palette for the font options object. + OpenType color fonts with a CPAL table may contain multiple palettes. + The default color palette index is :data:`COLOR_PALETTE_DEFAULT`. If + palette_index is invalid, the default palette is used. + + .. versionadded:: 1.25.0 Only available with cairo 1.17.8+ + """ + + def get_color_palette(self) -> int: + """ + :returns: the palette index + + Gets the OpenType color font palette for the font options object. + + .. versionadded:: 1.25.0 Only available with cairo 1.17.8+ + """ + + def set_custom_palette_color(self, index: int, red: float, green: float, blue: float, alpha: float) -> None: + """ + :param index: the index of the color to set + :param red: red component of color + :param green: green component of color + :param blue: blue component of color + :param alpha: alpha component of color + + Sets a custom palette color for the font options object. This overrides + the palette color at the specified color index. This override is + independent of the selected palette index and will remain in place even + if :meth:`FontOptions.set_color_palette` is called to change the palette + index. + + It is only possible to override color indexes already in the font + palette. + + .. versionadded:: 1.25.0 Only available with cairo 1.17.8+ + """ + + def get_custom_palette_color(self, index: int) -> Tuple[float, float, float, float]: + """ + :param index: the index of the color to get + :returns: a (red, green, blue, alpha) tuple of float + :raises Error: if no custom color exists for the color index. + + Gets the custom palette color for the color index for the font options + object. + + .. versionadded:: 1.25.0 Only available with cairo 1.17.8+ + """ + +class ScaledFont: + """ + A *ScaledFont* is a font scaled to a particular size and device resolution. A + *ScaledFont* is most useful for low-level font usage where a library or + application wants to cache a reference to a scaled font to speed up the + computation of metrics. + + There are various types of scaled fonts, depending on the font backend they + use. + """ + + def __init__(self, font_face: FontFace, font_matrix: Matrix, ctm: Matrix, options: FontOptions) -> None: + """ + :param font_face: a :class:`FontFace` instance + :param font_matrix: font space to user space transformation :class:`Matrix` + for the font. In the simplest case of a N point font, this matrix is just + a scale by N, but it can also be used to shear the font or stretch it + unequally along the two axes. See :meth:`Context.set_font_matrix`. + :param ctm: user to device transformation :class:`Matrix` with which the + font will be used. + :param options: a :class:`FontOptions` instance to use when getting metrics + for the font and rendering with it. + + Creates a *ScaledFont* object from a *FontFace* and matrices that describe + the size of the font and the environment in which it will be used. + """ + + def extents(self) -> Tuple[float, float, float, float, float]: + """ + Gets the metrics for a *ScaledFont*. + """ + + def get_ctm(self) -> Matrix: + """ + :returns: the CTM + + Returns the CTM with which scaled_font was created into ctm. Note that + the translation offsets (x0, y0) of the CTM are ignored by + :func:`ScaledFont`. So, the matrix this function returns always has 0, + 0 as x0, y0. + + .. versionadded:: 1.12.0 + """ + + def get_font_face(self) -> FontFace: + """ + :returns: the :class:`FontFace` that this *ScaledFont* was created for. + + .. versionadded:: 1.2 + """ + + def get_font_matrix(self) -> Matrix: + """ + :returns: the matrix + + Returns the font matrix with which scaled_font was created. + """ + + def get_font_options(self) -> FontOptions: + """ + :returns: font options + + Returns the font options with which scaled_font was created. + + .. versionadded:: 1.12.0 + """ + + def get_scale_matrix(self) -> Matrix: + """ + :returns: the scale :class:`Matrix` + + The scale matrix is product of the font matrix and the ctm associated + with the scaled font, and hence is the matrix mapping from font space to + device space. + + .. versionadded:: 1.8 + """ + + def glyph_extents(self, glyphs: Sequence[Glyph]) -> TextExtents: + """ + :param glyphs: glyphs, a sequence of :class:`Glyph` + + .. versionadded:: 1.15 + + Gets the extents for a list of glyphs. The extents describe a user-space + rectangle that encloses the "inked" portion of the glyphs, (as they + would be drawn by :meth:`Context.show_glyphs` if the cairo graphics + state were set to the same font_face, font_matrix, ctm, and font_options + as scaled_font ). Additionally, the x_advance and y_advance values + indicate the amount by which the current point would be advanced by + cairo_show_glyphs(). + + Note that whitespace glyphs do not contribute to the size of the + rectangle (extents.width and extents.height). + """ + + def text_extents(self, text: str) -> TextExtents: + """ + :param text: text + + Gets the extents for a string of text. The extents describe a user-space + rectangle that encloses the "inked" portion of the text drawn at the + origin (0,0) (as it would be drawn by :meth:`Context.show_text` if the + cairo graphics state were set to the same font_face, font_matrix, ctm, + and font_options as *ScaledFont*). Additionally, the x_advance and + y_advance values indicate the amount by which the current point would be + advanced by :meth:`Context.show_text`. + + Note that whitespace characters do not directly contribute to the size + of the rectangle (width and height). They do contribute indirectly by + changing the position of non-whitespace characters. In particular, + trailing whitespace characters are likely to not affect the size of the + rectangle, though they will affect the x_advance and y_advance values. + + .. versionadded:: 1.2 + """ + + def text_to_glyphs(self, x: float, y: float, utf8: str, with_clusters: bool = True) -> Union[Tuple[List[Glyph], List["TextCluster"], TextClusterFlags], List[Glyph]]: + """ + :param x: X position to place first glyph + :param y: Y position to place first glyph + :param utf8: a string of text + :param with_clusters: + If :obj:`False` only the glyph list will computed and returned + :returns: + a tuple of ([:class:`Glyph`], [:class:`TextCluster`], + :class:`TextClusterFlags`) + :raises Error: + + .. versionadded:: 1.15 + + Converts UTF-8 text to a list of glyphs, with cluster mapping, that can + be used to render later. + + For details of how clusters, and cluster_flags map input UTF-8 text to + the output glyphs see :meth:`Context.show_text_glyphs`. + + The output values can be readily passed to + :meth:`Context.show_text_glyphs` :meth:`Context.show_glyphs`, or related + functions, assuming that the exact same scaled font is used for the + operation. + """ + +_SomeDevice = TypeVar("_SomeDevice", bound="Device") + +class Device: + """ + A :class:`Device` represents the driver interface for drawing operations + to a :class:`Surface`. + + .. versionadded:: 1.14 + + .. note:: + + .. versionadded:: 1.17.0 + + :class:`cairo.Device` can be used as a context manager: + + .. code:: python + + # device.finish() will be called on __exit__ + with cairo.ScriptDevice(f) as device: + pass + """ + + def finish(self) -> None: + """ + This function finishes the device and drops all references to external + resources. All surfaces, fonts and other objects created for this + device will be finished, too. Further operations on the device will + not affect the device but will instead trigger a + :attr:`Status.DEVICE_FINISHED` error. + + This function may acquire devices. + + .. versionadded:: 1.14 + """ + + def flush(self) -> None: + """ + Finish any pending operations for the device and also restore any + temporary modifications cairo has made to the device's state. This + function must be called before switching from using the device with + Cairo to operating on it directly with native APIs. If the device + doesn't support direct access, then this function does nothing. + + This function may acquire devices. + + .. versionadded:: 1.14 + """ + + def acquire(self) -> None: + """ + :raises cairo.Error: + If the device is in an error state and could not be acquired. + + Acquires the device for the current thread. This function will block + until no other thread has acquired the device. + + If the does not raise, you successfully acquired the device. From now + on your thread owns the device and no other thread will be able to + acquire it until a matching call to :meth:`release`. It is allowed to + recursively acquire the device multiple times from the same thread. + + After a successful call to :meth:`acquire`, a matching call to + :meth:`release` is required. + + .. note:: + + You must never acquire two different devices at the same time + unless this is explicitly allowed. Otherwise the possibility of + deadlocks exist. As various Cairo functions can acquire devices + when called, these functions may also cause deadlocks when you + call them with an acquired device. So you must not have a device + acquired when calling them. These functions are marked in the + documentation. + + .. versionadded:: 1.14 + """ + + def release(self) -> None: + """ + Releases a device previously acquired using :meth:`acquire`. See that + function for details. + + .. versionadded:: 1.14 + """ + + def __enter__(self: _SomeDevice) -> _SomeDevice: ... + __exit__: Any = ... + +_PathLike = Union[Text, ByteString] +_FileLike = BinaryIO +_SomeSurface = TypeVar("_SomeSurface", bound="Surface") + +class Surface: + """ + cairo.Surface is the abstract type representing all different drawing targets + that cairo can render to. The actual drawings are performed using a + :class:`Context`. + + A cairo.Surface is created by using backend-specific constructors + of the form cairo.Surface(). + + *Surface* is the abstract base class from which all the other surface + classes derive. It cannot be instantiated directly. + + .. note:: + + .. versionadded:: 1.17.0 + + :class:`cairo.Surface` can be used as a context manager: + + .. code:: python + + # surface.finish() will be called on __exit__ + with cairo.SVGSurface("example.svg", 200, 200) as surface: + pass + + # surface.unmap_image(image_surface) will be called on __exit__ + with surface.map_to_image(None) as image_surface: + pass + """ + + def copy_page(self) -> None: + """ + Emits the current page for backends that support multiple pages, but + doesn't clear it, so that the contents of the current page will be + retained for the next page. Use :meth:`.show_page` if you want to get an + empty page after the emission. + + :meth:`Context.copy_page` is a convenience function for this. + + .. versionadded:: 1.6 + """ + + def create_for_rectangle(self, x: float, y: float, width: float, height: float) -> "Surface": + """ + :param x: the x-origin of the sub-surface from the top-left of the + target surface (in device-space units) + :param y: the y-origin of the sub-surface from the top-left of the + target surface (in device-space units) + :param width: width of the sub-surface (in device-space units) + :param height: height of the sub-surface (in device-space units) + :returns: a new surface + + Create a new surface that is a rectangle within the target surface. All + operations drawn to this surface are then clipped and translated onto + the target surface. Nothing drawn via this sub-surface outside of its + bounds is drawn onto the target surface, making this a useful method for + passing constrained child surfaces to library routines that draw + directly onto the parent surface, i.e. with no further backend + allocations, double buffering or copies. + + .. note:: + + The semantics of subsurfaces have not been finalized yet unless the + rectangle is in full device units, is contained within the extents of + the target surface, and the target or subsurface's device transforms + are not changed. + + .. versionadded:: 1.12.0 + """ + + def create_similar(self, content: Content, width: int, height: int) -> "Surface": + """ + :param content: the content for the new + surface + :param width: width of the new surface, (in device-space units) + :param height: height of the new surface (in device-space units) + + :returns: a newly allocated *Surface*. + + Create a *Surface* that is as compatible as possible with the existing + surface. For example the new surface will have the same fallback + resolution and :class:`FontOptions`. Generally, the new surface will + also use the same backend, unless that is not possible for some + reason. + + Initially the surface contents are all 0 (transparent if contents have + transparency, black otherwise.) + """ + + def create_similar_image(self, format: Format, width: int, height: int) -> "ImageSurface": + """ + :param cairo.Format format: the format for the new surface + :param width: width of the new surface, (in device-space units) + :param height: height of the new surface, (in device-space units) + :returns: a new image surface + + Create a new image surface that is as compatible as possible for + uploading to and the use in conjunction with an existing surface. + However, this surface can still be used like any normal image surface. + + Initially the surface contents are all 0 (transparent if contents have + transparency, black otherwise.) + + .. versionadded:: 1.12.0 + """ + + def finish(self) -> None: + """ + This method finishes the Surface and drops all references to external + resources. For example, for the Xlib backend it means that cairo will no + longer access the drawable, which can be freed. After calling finish() + the only valid operations on a Surface are flushing and finishing it. + Further drawing to the surface will not affect the surface but will + instead trigger a `cairo.Error` exception. + """ + + def flush(self) -> None: + """ + Do any pending drawing for the *Surface* and also restore any temporary + modification's cairo has made to the *Surface's* state. This method + must be called before switching from drawing on the *Surface* with cairo + to drawing on it directly with native APIs. If the *Surface* doesn't + support direct access, then this function does nothing. + """ + + def get_content(self) -> Content: + """ + :returns: The content type of *Surface*, + which indicates whether the *Surface* contains color and/or alpha + information. + + .. versionadded:: 1.2 + """ + + def get_device(self) -> Optional["Device"]: + """ + :returns: the device or :obj:`None` if the surface does not have an + associated device + + This function returns the device for a surface. + + .. versionadded:: 1.14.0 + """ + + def get_device_offset(self) -> Tuple[float, float]: + """ + :returns: (x_offset, y_offset) a tuple of float + + * x_offset: the offset in the X direction, in device units + * y_offset: the offset in the Y direction, in device units + + This method returns the previous device offset set by + :meth:`.set_device_offset`. + + .. versionadded:: 1.2 + """ + + def get_device_scale(self) -> Tuple[float, float]: + """ + :returns: (x_scale,y_scale) a 2-tuple of float + + This function returns the previous device offset set by + :meth:`Surface.set_device_scale`. + + .. versionadded:: 1.14.0 + """ + + def get_fallback_resolution(self) -> Tuple[float, float]: + """ + :returns: (x_pixels_per_inch, y_pixels_per_inch) a tuple of float + + * x_pixels_per_inch: horizontal pixels per inch + * y_pixels_per_inch: vertical pixels per inch + + This method returns the previous fallback resolution set by + :meth:`.set_fallback_resolution`, or default fallback resolution if + never set. + + .. versionadded:: 1.8 + """ + + def get_font_options(self) -> FontOptions: + """ + :returns: a :class:`FontOptions` + + Retrieves the default font rendering options for the *Surface*. This + allows display surfaces to report the correct subpixel order for + rendering on them, print surfaces to disable hinting of metrics and so + forth. The result can then be used with :class:`ScaledFont`. + """ + + def get_mime_data(self, mime_type: str) -> Optional[bytes]: + """ + :param mime_type: the MIME type of the image data + (:ref:`constants_MIME_TYPE`) + :returns: :class:`bytes` or :obj:`None` + + Return mime data previously attached to surface + with :meth:`set_mime_data` using the specified mime type. + If no data has been attached with the given mime type, + :obj:`None` is returned. + + .. versionadded:: 1.12.0 + """ + + def has_show_text_glyphs(self) -> bool: + """ + :returns: :obj:`True` if surface supports + :meth:`Context.show_text_glyphs`, :obj:`False` otherwise + + Returns whether the surface supports sophisticated + :meth:`Context.show_text_glyphs` operations. That is, whether it + actually uses the provided text and cluster data to a + :meth:`Context.show_text_glyphs` call. + + Note: Even if this function returns :obj:`False`, a + :meth:`Context.show_text_glyphs` operation targeted at surface will + still succeed. It just will act like a :meth:`Context.show_glyphs` + operation. Users can use this function to avoid computing UTF-8 text and + cluster mapping if the target surface does not use it. + + .. versionadded:: 1.12.0 + """ + + def map_to_image(self, extents: Optional[RectangleInt]) -> "ImageSurface": + """ + :param extents: limit the extraction to an rectangular + region or :obj:`None` for the whole surface + + :returns: newly allocated image surface + :raises Error: + + Returns an image surface that is the most efficient mechanism for + modifying the backing store of the target surface. + + Note, the use of the original surface as a target or source whilst it is + mapped is undefined. The result of mapping the surface multiple times is + undefined. Calling :meth:`Surface.finish` on the resulting image surface + results in undefined behavior. Changing the device transform of the + image surface or of surface before the image surface is unmapped results + in undefined behavior. + + The caller must use :meth:`Surface.unmap_image` to destroy this image + surface. + + .. versionadded:: 1.15.0 + """ + + def mark_dirty(self) -> None: + """ + Tells cairo that drawing has been done to *Surface* using means other + than cairo, and that cairo should reread any cached areas. Note that you + must call :meth:`.flush` before doing such drawing. + """ + + def mark_dirty_rectangle(self, x: int, y: int, width: int, height: int) -> None: + """ + :param x: X coordinate of dirty rectangle + :param y: Y coordinate of dirty rectangle + :param width: width of dirty rectangle + :param height: height of dirty rectangle + + Like :meth:`.mark_dirty`, but drawing has been done only to the + specified rectangle, so that cairo can retain cached contents for other + parts of the surface. + + Any cached clip set on the *Surface* will be reset by this function, to + make sure that future cairo calls have the clip set that they expect. + """ + + def set_device_offset(self, x_offset: float, y_offset: float) -> None: + """ + :param x_offset: the offset in the X direction, in device units + :param y_offset: the offset in the Y direction, in device units + + Sets an offset that is added to the device coordinates determined by the + CTM when drawing to *Surface*. One use case for this function is when we + want to create a *Surface* that redirects drawing for a portion of an + onscreen surface to an offscreen surface in a way that is completely + invisible to the user of the cairo API. Setting a transformation via + :meth:`Context.translate` isn't sufficient to do this, since functions + like :meth:`Context.device_to_user` will expose the hidden offset. + + Note that the offset affects drawing to the surface as well as using the + surface in a source pattern. + """ + + def set_device_scale(self, x_scale: float, y_scale: float) -> None: + """ + :param x_scale: a scale factor in the X direction + :param y_scale: a scale factor in the Y direction + + Sets a scale that is multiplied to the device coordinates determined by + the CTM when drawing to surface . One common use for this is to render + to very high resolution display devices at a scale factor, so that code + that assumes 1 pixel will be a certain size will still work. Setting a + transformation via :meth:`Context.translate` isn't sufficient to do + this, since functions like :meth:`Context.device_to_user` will expose + the hidden scale. + + .. versionadded:: 1.14.0 + """ + + def set_fallback_resolution(self, x_pixels_per_inch: float, y_pixels_per_inch: float) -> None: + """ + :param x_pixels_per_inch: horizontal setting for pixels per inch + :param y_pixels_per_inch: vertical setting for pixels per inch + + Set the horizontal and vertical resolution for image fallbacks. + + When certain operations aren't supported natively by a backend, cairo + will fallback by rendering operations to an image and then overlaying + that image onto the output. For backends that are natively + vector-oriented, this function can be used to set the resolution used + for these image fallbacks, (larger values will result in more detailed + images, but also larger file sizes). + + Some examples of natively vector-oriented backends are the ps, pdf, and + svg backends. + + For backends that are natively raster-oriented, image fallbacks are + still possible, but they are always performed at the native device + resolution. So this function has no effect on those backends. + + Note: The fallback resolution only takes effect at the time of + completing a page (with :meth:`Context.show_page` or + :meth:`Context.copy_page`) so there is currently no way to have more + than one fallback resolution in effect on a single page. + + The default fallback resoultion is 300 pixels per inch in both + dimensions. + + .. versionadded:: 1.2 + """ + + def set_mime_data(self, mime_type: str, data: bytes) -> None: + """ + :param mime_type: the MIME type of the image data + (:ref:`constants_MIME_TYPE`) + :param data: the image data to attach to the surface + + Attach an image in the format ``mime_type`` to *Surface*. + To remove the data from a surface, + call this function with same mime type and :obj:`None` for data. + + The attached image (or filename) data can later be used + by backends which support it + (currently: PDF, PS, SVG and Win32 Printing surfaces) + to emit this data instead of making a snapshot of the surface. + This approach tends to be faster and requires less memory and disk space. + + The recognized MIME types are listed under :ref:`constants_MIME_TYPE`. + + See corresponding backend surface docs for details + about which MIME types it can handle. + Caution: the associated MIME data will be discarded + if you draw on the surface afterwards. + Use this function with care. + + .. versionadded:: 1.12.0 + """ + + def show_page(self) -> None: + """ + Emits and clears the current page for backends that support multiple + pages. Use :meth:`.copy_page` if you don't want to clear the page. + + There is a convenience function for this that takes a + :meth:`Context.show_page`. + + .. versionadded:: 1.6 + """ + + def supports_mime_type(self, mime_type: str) -> bool: + """ + :param mime_type: the mime type (:ref:`constants_MIME_TYPE`) + :returns: :obj:`True` if surface supports mime_type, :obj:`False` + otherwise + + Return whether surface supports ``mime_type``. + + .. versionadded:: 1.12.0 + """ + + def write_to_png(self, fobj: Union[_FileLike, _PathLike]) -> None: + """ + :param fobj: a filename or writable file object + :raises: :exc:`MemoryError` if memory could not be allocated for the operation + + :exc:`IOError` if an I/O error occurs while attempting to write + the file + + Writes the contents of *Surface* to *fobj* as a PNG image. *fobj* can either be + a filename or a file object opened in binary mode. + """ + + def unmap_image(self, image: "ImageSurface") -> None: + """ + :param image: the currently mapped image + + Unmaps the image surface as returned from :meth:`Surface.map_to_image`. + + The content of the image will be uploaded to the target surface. + Afterwards, the image is destroyed. + + Using an image surface which wasn't returned by + :meth:`Surface.map_to_image` results in undefined behavior. + + .. versionadded:: 1.15.0 + """ + + def __enter__(self: _SomeSurface) -> _SomeSurface: ... + __exit__: Any = ... + +class ImageSurface(Surface): + """ + A *cairo.ImageSurface* provides the ability to render to memory buffers + either allocated by cairo or by the calling code. The supported image + formats are those defined in :class:`cairo.Format`. + """ + + def __init__(self, format: Format, width: int, height: int) -> None: + """ + :param format: format of pixels in the surface to create + :param width: width of the surface, in pixels + :param height: height of the surface, in pixels + :returns: a new *ImageSurface* + + Creates an *ImageSurface* of the specified format and dimensions. Initially + the surface contents are all 0. (Specifically, within each pixel, each + color or alpha channel belonging to format will be 0. The contents of bits + within a pixel, but not belonging to the given format are undefined). + """ + + @classmethod + def create_for_data(cls, data: memoryview, format: Format, width: int, height: int, stride: int = ...) -> "ImageSurface": + """ + :param data: a writable Python buffer/memoryview object + :param format: the format of pixels in the + buffer + :param width: the width of the image to be stored in the buffer + :param height: the height of the image to be stored in the buffer + :param stride: the number of bytes between the start of rows in the + buffer as allocated. If not given the value from + :meth:`cairo.Format.stride_for_width` is used. + :returns: a new *ImageSurface* + :raises: :exc:`MemoryError` in case of no memory. + + :exc:`cairo.Error` in case of invalid *stride* value. + + Creates an *ImageSurface* for the provided pixel data. The initial + contents of buffer will be used as the initial image contents; you must + explicitly clear the buffer, using, for example, cairo_rectangle() and + cairo_fill() if you want it cleared. + + Note that the *stride* may be larger than width*bytes_per_pixel to + provide proper alignment for each pixel and row. This alignment is + required to allow high-performance rendering within cairo. The correct + way to obtain a legal stride value is to call + :meth:`cairo.Format.stride_for_width` with the desired format and + maximum image width value, and use the resulting stride value to + allocate the data and to create the :class:`ImageSurface`. See + :meth:`cairo.Format.stride_for_width` for example code. + """ + + @classmethod + def create_from_png(cls, fobj: Union[_PathLike, _FileLike]) -> "ImageSurface": + """ + :param fobj: + a :obj:`_PathLike`, file, or file-like object of the PNG to load. + :returns: a new *ImageSurface* initialized the contents to the given PNG + file. + + Creates a new image surface and initializes the contents to the given + PNG file. *fobj* can either be a filename or a file object opened in + binary mode. + """ + + format_stride_for_width = Format.stride_for_width + """ + See :meth:`cairo.Format.stride_for_width`. + + .. versionadded:: 1.6 + """ + + def get_data(self) -> memoryview: + """ + :returns: a Python buffer object for the data of the *ImageSurface*, for + direct inspection or modification. On Python 3 a memoryview object is + returned. + + .. versionadded:: 1.2 + """ + + def get_format(self) -> Format: + """ + :returns: the format of the *ImageSurface*. + :rtype: cairo.Format + + .. versionadded:: 1.2 + """ + + def get_height(self) -> int: + """ + :returns: the height of the *ImageSurface* in pixels. + """ + + def get_stride(self) -> int: + """ + :returns: the stride of the *ImageSurface* in bytes. The stride is the + distance in bytes from the beginning of one row of the image data to + the beginning of the next row. + """ + + def get_width(self) -> int: + """ + :returns: the width of the *ImageSurface* in pixels. + """ + +class SurfacePattern(Pattern): + + def __init__(self, surface: Surface) -> None: + """ + :param surface: a cairo :class:`Surface` + """ + + def get_surface(self) -> Surface: + """ + :returns: the :class:`Surface` of the *SurfacePattern*. + + .. versionadded:: 1.4 + """ + +class Context(Generic[_SomeSurface]): + """ + *Context* is the main object used when drawing with cairo. To draw with cairo, + you create a *Context*, set the target surface, and drawing options for the + *Context*, create shapes with functions like :meth:`Context.move_to` and + :meth:`Context.line_to`, and then draw shapes with :meth:`Context.stroke` or + :meth:`Context.fill`. + + *Contexts* can be pushed to a stack via :meth:`Context.save`. They may then + safely be changed, without losing the current state. Use + :meth:`Context.restore` to restore to the saved state. + """ + + def __init__(self, target: _SomeSurface) -> None: + """ + :param target: target :class:`Surface` for the context + :raises: :exc:`MemoryError` in case of no memory + + Creates a new *Context* with all graphics state parameters set to default + values and with *target* as a target surface. The target surface should be + constructed with a backend-specific function such as :class:`ImageSurface` + (or any other cairo backend surface create variant). + """ + + def append_path(self, path: Path) -> None: + """ + :param path: :class:`Path` to be appended + + Append the *path* onto the current path. The *path* may be either the + return value from one of :meth:`Context.copy_path` or + :meth:`Context.copy_path_flat` or it may be constructed manually (in C). + """ + + def arc(self, xc: float, yc: float, radius: float, angle1: float, angle2: float) -> None: + """ + :param xc: X position of the center of the arc + :param yc: Y position of the center of the arc + :param radius: the radius of the arc + :param angle1: the start angle, in radians + :param angle2: the end angle, in radians + + Adds a circular arc of the given *radius* to the current path. The arc + is centered at (*xc, yc*), begins at *angle1* and proceeds in the + direction of increasing angles to end at *angle2*. If *angle2* is less + than *angle1* it will be progressively increased by 2*PI until it is + greater than *angle1*. + + If there is a current point, an initial line segment will be added to + the path to connect the current point to the beginning of the arc. If + this initial line is undesired, it can be avoided by calling + :meth:`Context.new_sub_path` before calling :meth:`Context.arc`. + + Angles are measured in radians. An angle of 0.0 is in the direction of + the positive X axis (in user space). An angle of PI/2.0 radians (90 + degrees) is in the direction of the positive Y axis (in user + space). Angles increase in the direction from the positive X axis toward + the positive Y axis. So with the default transformation matrix, angles + increase in a clockwise direction. + + To convert from degrees to radians, use ``degrees * (math.pi / 180)``. + + This function gives the arc in the direction of increasing angles; see + :meth:`Context.arc_negative` to get the arc in the direction of + decreasing angles. + + The arc is circular in user space. To achieve an elliptical arc, + you can scale the current transformation matrix by different + amounts in the X and Y directions. For example, to draw an ellipse + in the box given by *x, y, width, height*:: + + ctx.save() + ctx.translate(x + width / 2., y + height / 2.) + ctx.scale(width / 2., height / 2.) + ctx.arc(0., 0., 1., 0., 2 * math.pi) + ctx.restore() + """ + + def arc_negative(self, xc: float, yc: float, radius: float, angle1: float, angle2: float) -> None: + """ + :param xc: X position of the center of the arc + :param yc: Y position of the center of the arc + :param radius: the radius of the arc + :param angle1: the start angle, in radians + :param angle2: the end angle, in radians + + Adds a circular arc of the given *radius* to the current path. The arc + is centered at (*xc, yc*), begins at *angle1* and proceeds in the + direction of decreasing angles to end at *angle2*. If *angle2* is + greater than *angle1* it will be progressively decreased by 2*PI until + it is less than *angle1*. + + See :meth:`Context.arc` for more details. This function differs only in + the direction of the arc between the two angles. + """ + + def clip(self) -> None: + """ + Establishes a new clip region by intersecting the current clip region + with the current path as it would be filled by :meth:`Context.fill` and + according to the current :class:`fill rule ` (see + :meth:`Context.set_fill_rule`). + + After :meth:`.clip`, the current path will be cleared from the + :class:`Context`. + + The current clip region affects all drawing operations by effectively + masking out any changes to the surface that are outside the current clip + region. + + Calling :meth:`.clip` can only make the clip region smaller, never + larger. But the current clip is part of the graphics state, so a + temporary restriction of the clip region can be achieved by calling + :meth:`.clip` within a :meth:`Context.save`/:meth:`Context.restore` + pair. The only other means of increasing the size of the clip region is + :meth:`Context.reset_clip`. + """ + + def clip_extents(self) -> Tuple[float, float, float, float]: + """ + :returns: (x1, y1, x2, y2), all float + + * *x1*: left of the resulting extents + * *y1*: top of the resulting extents + * *x2*: right of the resulting extents + * *y2*: bottom of the resulting extents + + Computes a bounding box in user coordinates covering the area inside the + current clip. + + .. versionadded:: 1.4 + """ + + def clip_preserve(self) -> None: + """ + Establishes a new clip region by intersecting the current clip region + with the current path as it would be filled by :meth:`Context.fill` and + according to the current :class:`fill rule ` (see + :meth:`Context.set_fill_rule`). + + Unlike :meth:`Context.clip`, :meth:`.clip_preserve` preserves the path + within the :class:`Context`. + + The current clip region affects all drawing operations by effectively + masking out any changes to the surface that are outside the current clip + region. + + Calling :meth:`.clip_preserve` can only make the clip region smaller, + never larger. But the current clip is part of the graphics state, so a + temporary restriction of the clip region can be achieved by calling + :meth:`.clip_preserve` within a + :meth:`Context.save`/:meth:`Context.restore` pair. The only other means + of increasing the size of the clip region is :meth:`Context.reset_clip`. + """ + + def close_path(self) -> None: + """ + Adds a line segment to the path from the current point to the beginning + of the current sub-path, (the most recent point passed to + :meth:`Context.move_to`), and closes this sub-path. After this call the + current point will be at the joined endpoint of the sub-path. + + The behavior of :meth:`.close_path` is distinct from simply calling + :meth:`Context.line_to` with the equivalent coordinate in the case of + stroking. When a closed sub-path is stroked, there are no caps on the + ends of the sub-path. Instead, there is a line join connecting the final + and initial segments of the sub-path. + + If there is no current point before the call to :meth:`.close_path`, + this function will have no effect. + + Note: As of cairo version 1.2.4 any call to :meth:`.close_path` will + place an explicit MOVE_TO element into the path immediately after the + CLOSE_PATH element, (which can be seen in :meth:`Context.copy_path` for + example). This can simplify path processing in some cases as it may not + be necessary to save the "last move_to point" during processing as the + MOVE_TO immediately after the CLOSE_PATH will provide that point. + """ + + def copy_clip_rectangle_list(self) -> List[Rectangle]: + """ + :returns: the current clip region as a list of rectangles in user + coordinates. Returns a list of :class:`Rectangle` + + .. versionadded:: 1.4 + """ + + def copy_page(self) -> None: + """ + Emits the current page for backends that support multiple pages, but + doesn't clear it, so, the contents of the current page will be retained + for the next page too. Use :meth:`Context.show_page` if you want to get + an empty page after the emission. + + This is a convenience function that simply calls + :meth:`Surface.copy_page` on *Context's* target. + """ + + def copy_path(self) -> Path: + """ + :returns: :class:`Path` + :raises: :exc:`MemoryError` in case of no memory + + Creates a copy of the current path and returns it to the user as a + :class:`Path`. + """ + + def copy_path_flat(self) -> Path: + """ + :returns: :class:`Path` + :raises: :exc:`MemoryError` in case of no memory + + Gets a flattened copy of the current path and returns it to the + user as a :class:`Path`. + + This function is like :meth:`Context.copy_path` except that any curves + in the path will be approximated with piecewise-linear approximations, + (accurate to within the current tolerance value). That is, the result is + guaranteed to not have any elements of type CAIRO_PATH_CURVE_TO which + will instead be replaced by a series of CAIRO_PATH_LINE_TO elements. + """ + + def curve_to(self, x1: float, y1: float, x2: float, y2: float, x3: float, y3: float) -> None: + """ + :param x1: the X coordinate of the first control point + :param y1: the Y coordinate of the first control point + :param x2: the X coordinate of the second control point + :param y2: the Y coordinate of the second control point + :param x3: the X coordinate of the end of the curve + :param y3: the Y coordinate of the end of the curve + + Adds a cubic Bézier spline to the path from the current point to + position *(x3, y3)* in user-space coordinates, using *(x1, y1)* and + *(x2, y2)* as the control points. After this call the current point will + be *(x3, y3)*. + + If there is no current point before the call to :meth:`.curve_to` + this function will behave as if preceded by a call to + ``ctx.move_to(x1, y1)``. + """ + + def device_to_user(self, x: float, y: float) -> Tuple[float, float]: + """ + :param x: X value of coordinate + :param y: Y value of coordinate + :returns: (x, y), both float + + Transform a coordinate from device space to user space by multiplying + the given point by the inverse of the current transformation matrix + (CTM). + """ + + def device_to_user_distance(self, dx: float, dy: float) -> Tuple[float, float]: + """ + :param dx: X component of a distance vector + :param dy: Y component of a distance vector + :returns: (dx, dy), both float + + Transform a distance vector from device space to user space. This + function is similar to :meth:`Context.device_to_user` except that the + translation components of the inverse CTM will be ignored when + transforming *(dx,dy)*. + """ + + def fill(self) -> None: + """ + A drawing operator that fills the current path according to the current + :class:`fill rule `, (each sub-path is implicitly + closed before being filled). After :meth:`.fill`, the current path will + be cleared from the :class:`Context`. See :meth:`Context.set_fill_rule` + and :meth:`Context.fill_preserve`. + """ + + def fill_extents(self) -> Tuple[float, float, float, float]: + """ + :returns: (x1, y1, x2, y2), all float + + * *x1*: left of the resulting extents + * *y1*: top of the resulting extents + * *x2*: right of the resulting extents + * *y2*: bottom of the resulting extents + + Computes a bounding box in user coordinates covering the area that would + be affected, (the "inked" area), by a :meth:`Context.fill` operation + given the current path and fill parameters. If the current path is + empty, returns an empty rectangle (0,0,0,0). Surface dimensions and + clipping are not taken into account. + + Contrast with :meth:`Context.path_extents`, which is similar, but returns + non-zero extents for some paths with no inked area, (such as a + simple line segment). + + Note that :meth:`.fill_extents` must necessarily do more work to compute + the precise inked areas in light of the fill rule, so + :meth:`Context.path_extents` may be more desirable for sake of + performance if the non-inked path extents are desired. + + See :meth:`Context.fill`, :meth:`Context.set_fill_rule` and + :meth:`Context.fill_preserve`. + """ + + def fill_preserve(self) -> None: + """ + A drawing operator that fills the current path according to the current + :class:`fill rule `, (each sub-path is implicitly + closed before being filled). Unlike :meth:`Context.fill`, + :meth:`.fill_preserve` preserves the path within the :class:`Context`. + + See :meth:`Context.set_fill_rule` and :meth:`Context.fill`. + """ + + def font_extents(self) -> Tuple[float, float, float, float, float]: + """ + :returns: (ascent, descent, height, max_x_advance, max_y_advance), + all float + + Gets the font extents for the currently selected font. + """ + + def get_antialias(self) -> Antialias: + """ + :returns: the current antialias mode, + as set by :meth:`Context.set_antialias`. + """ + + def get_current_point(self) -> Tuple[float, float]: + """ + :returns: (x, y), both float + + * *x*: X coordinate of the current point + * *y*: Y coordinate of the current point + + Gets the current point of the current path, which is conceptually the + final point reached by the path so far. + + The current point is returned in the user-space coordinate system. If + there is no defined current point or if :class:`Context` is in an error + status, *x* and *y* will both be set to 0.0. It is possible to check this + in advance with :meth:`Context.has_current_point`. + + Most path construction functions alter the current point. See the + following for details on how they affect the current point: + :meth:`Context.new_path`, :meth:`Context.new_sub_path`, + :meth:`Context.append_path`, :meth:`Context.close_path`, + :meth:`Context.move_to`, :meth:`Context.line_to`, + :meth:`Context.curve_to`, :meth:`Context.rel_move_to`, + :meth:`Context.rel_line_to`, :meth:`Context.rel_curve_to`, + :meth:`Context.arc`, :meth:`Context.arc_negative`, + :meth:`Context.rectangle`, :meth:`Context.text_path`, + :meth:`Context.glyph_path`. + + Some functions use and alter the current point but do not otherwise + change current path: + :meth:`Context.show_text`. + + Some functions unset the current path and as a result, current point: + :meth:`Context.fill`, :meth:`Context.stroke`. + """ + + def get_dash(self) -> Tuple[List[float], float]: + """ + :returns: (dashes, offset) + + * *dashes*: return value as a tuple for the dash array + * *offset*: return value as float for the current dash offset + + Gets the current dash array. + + .. versionadded:: 1.4 + """ + + def get_dash_count(self) -> int: + """ + :returns: the length of the dash array, or 0 if no dash array set. + + See also :meth:`Context.set_dash` and :meth:`Context.get_dash`. + + .. versionadded:: 1.4 + """ + + def get_fill_rule(self) -> FillRule: + """ + :returns: the current fill rule, as + set by :meth:`Context.set_fill_rule`. + """ + + def get_font_face(self) -> FontFace: + """ + :returns: the current :class:`FontFace` for the :class:`Context`. + """ + + def get_font_matrix(self) -> Matrix: + """ + :returns: the current :class:`Matrix` for the :class:`Context`. + + See :meth:`Context.set_font_matrix`. + """ + + def get_font_options(self) -> FontOptions: + """ + :returns: the current :class:`FontOptions` for the :class:`Context`. + + Retrieves font rendering options set via + :meth:`Context.set_font_options`. Note that the returned options do not + include any options derived from the underlying surface; they are + literally the options passed to :meth:`Context.set_font_options`. + """ + + def get_group_target(self) -> Surface: + """ + :returns: the target :class:`Surface`. + + Gets the current destination :class:`Surface` for the + :class:`Context`. This is either the original target surface as passed + to :class:`Context` or the target surface for the current group as + started by the most recent call to :meth:`Context.push_group` or + :meth:`Context.push_group_with_content`. + + .. versionadded:: 1.2 + """ + + def get_hairline(self) -> bool: + """ + :returns: whether hairline mode is set. + + Returns whether or not hairline mode is set, as set by + :meth:`Context.set_hairline`. + + .. versionadded:: 1.23 Only available with cairo 1.17.6+ + """ + + def get_line_cap(self) -> LineCap: + """ + :returns: the current line cap style, as + set by :meth:`Context.set_line_cap`. + """ + + def get_line_join(self) -> LineJoin: + """ + :returns: the current line join style, as + set by :meth:`Context.set_line_join`. + """ + + def get_line_width(self) -> float: + """ + :returns: the current line width + + This function returns the current line width value exactly as set by + :meth:`Context.set_line_width`. Note that the value is unchanged even if + the CTM has changed between the calls to :meth:`Context.set_line_width` + and :meth:`.get_line_width`. + """ + + def get_matrix(self) -> Matrix: + """ + :returns: the current transformation :class:`Matrix` (CTM) + """ + + def get_miter_limit(self) -> float: + """ + :returns: the current miter limit, as set by + :meth:`Context.set_miter_limit`. + """ + + def get_operator(self) -> Operator: + """ + :returns: the current compositing operator + for a :class:`Context`. + """ + + def get_scaled_font(self) -> ScaledFont: + """ + :returns: the current :class:`ScaledFont` for a :class:`Context`. + + .. versionadded:: 1.4 + """ + + def get_source(self) -> Pattern: + """ + :returns: the current source :class:`Pattern` for a :class:`Context`. + """ + + def get_target(self) -> _SomeSurface: + """ + :returns: the target :class:`Surface` for the :class:`Context` + """ + + def get_tolerance(self) -> float: + """ + :returns: the current tolerance value, as set by + :meth:`Context.set_tolerance` + """ + + def glyph_extents(self, glyphs: Sequence[Glyph]) -> TextExtents: + """ + :param glyphs: glyphs, a sequence of :class:`Glyph` + + Gets the extents for an array of glyphs. The extents describe a + user-space rectangle that encloses the "inked" portion of the glyphs, + (as they would be drawn by :meth:`Context.show_glyphs`). Additionally, + the x_advance and y_advance values indicate the amount by which the + current point would be advanced by :meth:`Context.show_glyphs`. + + Note that whitespace glyphs do not contribute to the size of the + rectangle (extents.width and extents.height). + """ + + def glyph_path(self, glyphs: Sequence[Glyph]) -> None: + """ + :param glyphs: glyphs to show, a sequence of :class:`Glyph` + + Adds closed paths for the glyphs to the current path. The generated path + if filled, achieves an effect similar to that of + :meth:`Context.show_glyphs`. + """ + + def has_current_point(self) -> bool: + """ + :returns: True iff a current point is defined on the current path. + See :meth:`Context.get_current_point` for details on the current point. + + .. versionadded:: 1.6 + """ + + def identity_matrix(self) -> None: + """ + Resets the current transformation :class:`Matrix` (CTM) by setting it + equal to the identity matrix. That is, the user-space and device-space + axes will be aligned and one user-space unit will transform to one + device-space unit. + """ + + def in_clip(self, x: float, y: float) -> bool: + """ + :param x: X coordinate of the point to test + :param y: Y coordinate of the point to test + :returns: :obj:`True` if the point is inside, or :obj:`False` if outside. + + Tests whether the given point is inside the area that would be visible + through the current clip, i.e. the area that would be filled by a + :meth:`paint` operation. + + See :meth:`clip`, and :meth:`clip_preserve`. + + .. versionadded:: 1.12.0 + """ + + def in_fill(self, x: float, y: float) -> bool: + """ + :param x: X coordinate of the point to test + :param y: Y coordinate of the point to test + :returns: True iff the point is inside the area that would be affected + by a :meth:`Context.fill` operation given the current path and filling + parameters. Surface dimensions and clipping are not taken into account. + + See :meth:`Context.fill`, :meth:`Context.set_fill_rule` and + :meth:`Context.fill_preserve`. + """ + + def in_stroke(self, x: float, y: float) -> bool: + """ + :param x: X coordinate of the point to test + :param y: Y coordinate of the point to test + + :returns: True iff the point is inside the area that would be affected + by a :meth:`Context.stroke` operation given the current path and + stroking parameters. Surface dimensions and clipping are not taken + into account. + + See :meth:`Context.stroke`, :meth:`Context.set_line_width`, + :meth:`Context.set_line_join`, :meth:`Context.set_line_cap`, + :meth:`Context.set_dash`, and :meth:`Context.stroke_preserve`. + """ + + def line_to(self, x: float, y: float) -> None: + """ + :param x: the X coordinate of the end of the new line + :param y: the Y coordinate of the end of the new line + + Adds a line to the path from the current point to position *(x, y)* in + user-space coordinates. After this call the current point will be *(x, + y)*. + + If there is no current point before the call to :meth:`.line_to` + this function will behave as ``ctx.move_to(x, y)``. + """ + + def mask(self, pattern: Pattern) -> None: + """ + :param pattern: a :class:`Pattern` + + A drawing operator that paints the current source using the alpha + channel of *pattern* as a mask. (Opaque areas of *pattern* are painted + with the source, transparent areas are not painted.) + """ + + def mask_surface(self, surface: Surface, x: float = 0.0, y: float = 0.0) -> None: + """ + :param surface: a :class:`Surface` + :param x: X coordinate at which to place the origin of *surface* + :param y: Y coordinate at which to place the origin of *surface* + + A drawing operator that paints the current source using the alpha + channel of *surface* as a mask. (Opaque areas of *surface* are painted + with the source, transparent areas are not painted.) + """ + + def move_to(self, x: float, y: float) -> None: + """ + :param x: the X coordinate of the new position + :param y: the Y coordinate of the new position + + Begin a new sub-path. After this call the current point will be *(x, + y)*. + """ + + def new_path(self) -> None: + """ + Clears the current path. After this call there will be no path and no + current point. + """ + + def new_sub_path(self) -> None: + """ + Begin a new sub-path. Note that the existing path is not affected. After + this call there will be no current point. + + In many cases, this call is not needed since new sub-paths are + frequently started with :meth:`Context.move_to`. + + A call to :meth:`.new_sub_path` is particularly useful when beginning a + new sub-path with one of the :meth:`Context.arc` calls. This makes + things easier as it is no longer necessary to manually compute the arc's + initial coordinates for a call to :meth:`Context.move_to`. + + .. versionadded:: 1.6 + """ + + def paint(self) -> None: + """ + A drawing operator that paints the current source everywhere within the + current clip region. + """ + + def paint_with_alpha(self, alpha: float) -> None: + """ + :param alpha: alpha value, between 0 (transparent) and 1 (opaque) + + A drawing operator that paints the current source everywhere within the + current clip region using a mask of constant alpha value *alpha*. The + effect is similar to :meth:`Context.paint`, but the drawing is faded out + using the alpha value. + """ + + def path_extents(self) -> Tuple[float, float, float, float]: + """ + :returns: (x1, y1, x2, y2), all float + + * *x1*: left of the resulting extents + * *y1*: top of the resulting extents + * *x2*: right of the resulting extents + * *y2*: bottom of the resulting extents + + Computes a bounding box in user-space coordinates covering the points on + the current path. If the current path is empty, returns an empty + rectangle (0, 0, 0, 0). Stroke parameters, fill rule, surface + dimensions and clipping are not taken into account. + + Contrast with :meth:`Context.fill_extents` and + :meth:`Context.stroke_extents` which return the extents of only the area + that would be "inked" by the corresponding drawing operations. + + The result of :meth:`.path_extents` is defined as equivalent to the + limit of :meth:`Context.stroke_extents` with cairo.LINE_CAP_ROUND as the + line width approaches 0.0, (but never reaching the empty-rectangle + returned by :meth:`Context.stroke_extents` for a line width of 0.0). + + Specifically, this means that zero-area sub-paths such as + :meth:`Context.move_to`; :meth:`Context.line_to` segments, (even + degenerate cases where the coordinates to both calls are identical), + will be considered as contributing to the extents. However, a lone + :meth:`Context.move_to` will not contribute to the results of + :meth:`Context.path_extents`. + + .. versionadded:: 1.6 + """ + + def pop_group(self) -> SurfacePattern: + """ + :returns: a newly created :class:`SurfacePattern` containing the results + of all drawing operations performed to the group. + + Terminates the redirection begun by a call to :meth:`Context.push_group` + or :meth:`Context.push_group_with_content` and returns a new pattern + containing the results of all drawing operations performed to the group. + + The :meth:`.pop_group` function calls :meth:`Context.restore`, + (balancing a call to :meth:`Context.save` by the + :meth:`Context.push_group` function), so that any changes to the graphics + state will not be visible outside the group. + + .. versionadded:: 1.2 + """ + + def pop_group_to_source(self) -> None: + """ + Terminates the redirection begun by a call to :meth:`Context.push_group` + or :meth:`Context.push_group_with_content` and installs the resulting + pattern as the source :class:`Pattern` in the given :class:`Context`. + + The behavior of this function is equivalent to the sequence of + operations:: + + group = cairo_pop_group() + ctx.set_source(group) + + but is more convenient as their is no need for a variable to store + the short-lived pointer to the pattern. + + The :meth:`Context.pop_group` function calls :meth:`Context.restore`, + (balancing a call to :meth:`Context.save` by the + :meth:`Context.push_group` function), so that any changes to the graphics + state will not be visible outside the group. + + .. versionadded:: 1.2 + """ + + def push_group(self) -> None: + """ + Temporarily redirects drawing to an intermediate surface known as a + group. The redirection lasts until the group is completed by a call to + :meth:`Context.pop_group` or :meth:`Context.pop_group_to_source`. These + calls provide the result of any drawing to the group as a pattern, + (either as an explicit object, or set as the source pattern). + + This group functionality can be convenient for performing intermediate + compositing. One common use of a group is to render objects as opaque + within the group, (so that they occlude each other), and then blend the + result with translucence onto the destination. + + Groups can be nested arbitrarily deep by making balanced calls to + :meth:`Context.push_group`/:meth:`Context.pop_group`. Each call + pushes/pops the new target group onto/from a stack. + + The :meth:`.push_group` function calls :meth:`Context.save` so that any + changes to the graphics state will not be visible outside the group, + (the pop_group functions call :meth:`Context.restore`). + + By default the intermediate group will have a :class:`cairo.Content` + type of :attr:`cairo.Content.COLOR_ALPHA`. Other content types can be + chosen for the group by using :meth:`Context.push_group_with_content` + instead. + + As an example, here is how one might fill and stroke a path with + translucence, but without any portion of the fill being visible + under the stroke:: + + ctx.push_group() + ctx.set_source(fill_pattern) + ctx.fill_preserve() + ctx.set_source(stroke_pattern) + ctx.stroke() + ctx.pop_group_to_source() + ctx.paint_with_alpha(alpha) + + .. versionadded:: 1.2 + """ + + def push_group_with_content(self, content: Content) -> None: + """ + :param cairo.Content content: a content indicating the + type of group that will be created + + Temporarily redirects drawing to an intermediate surface known as a + group. The redirection lasts until the group is completed by a call to + :meth:`Context.pop_group` or :meth:`Context.pop_group_to_source`. These + calls provide the result of any drawing to the group as a pattern, + (either as an explicit object, or set as the source pattern). + + The group will have a content type of *content*. The ability to control + this content type is the only distinction between this function and + :meth:`Context.push_group` which you should see for a more detailed + description of group rendering. + + .. versionadded:: 1.2 + """ + + def rectangle(self, x: float, y: float, width: float, height: float) -> None: + """ + :param x: the X coordinate of the top left corner of the rectangle + :param y: the Y coordinate to the top left corner of the rectangle + :param width: the width of the rectangle + :param height: the height of the rectangle + + Adds a closed sub-path rectangle of the given size to the current path + at position *(x, y)* in user-space coordinates. + + This function is logically equivalent to:: + + ctx.move_to(x, y) + ctx.rel_line_to(width, 0) + ctx.rel_line_to(0, height) + ctx.rel_line_to(-width, 0) + ctx.close_path() + """ + + def rel_curve_to(self, dx1: float, dy1: float, dx2: float, dy2: float, dx3: float, dy3: float) -> None: + """ + :param dx1: the X offset to the first control point + :param dy1: the Y offset to the first control point + :param dx2: the X offset to the second control point + :param dy2: the Y offset to the second control point + :param dx3: the X offset to the end of the curve + :param dy3: the Y offset to the end of the curve + :raises: :exc:`cairo.Error` if called with no current point. + + Relative-coordinate version of :meth:`Context.curve_to`. All + offsets are relative to the current point. Adds a cubic Bézier spline to + the path from the current point to a point offset from the current point + by *(dx3, dy3)*, using points offset by *(dx1, dy1)* and *(dx2, dy2)* as + the control points. After this call the current point will be offset by + *(dx3, dy3)*. + + Given a current point of (x, y), ``ctx.rel_curve_to(dx1, dy1, dx2, dy2, + dx3, dy3)`` is logically equivalent to ``ctx.curve_to(x+dx1, y+dy1, + x+dx2, y+dy2, x+dx3, y+dy3)``. + """ + + def rel_line_to(self, dx: float, dy: float) -> None: + """ + :param dx: the X offset to the end of the new line + :param dy: the Y offset to the end of the new line + :raises: :exc:`cairo.Error` if called with no current point. + + Relative-coordinate version of :meth:`Context.line_to`. Adds a line to + the path from the current point to a point that is offset from the + current point by *(dx, dy)* in user space. After this call the current + point will be offset by *(dx, dy)*. + + Given a current point of (x, y), ``ctx.rel_line_to(dx, dy)`` is logically + equivalent to ``ctx.line_to(x + dx, y + dy)``. + """ + + def rel_move_to(self, dx: float, dy: float) -> None: + """ + :param dx: the X offset + :param dy: the Y offset + :raises: :exc:`cairo.Error` if called with no current point. + + Begin a new sub-path. After this call the current point will offset by + *(dx, dy)*. + + Given a current point of (x, y), ``ctx.rel_move_to(dx, dy)`` is logically + equivalent to ``ctx.(x + dx, y + dy)``. + """ + + def reset_clip(self) -> None: + """ + Reset the current clip region to its original, unrestricted state. That + is, set the clip region to an infinitely large shape containing the + target surface. Equivalently, if infinity is too hard to grasp, one can + imagine the clip region being reset to the exact bounds of the target + surface. + + Note that code meant to be reusable should not call :meth:`.reset_clip` + as it will cause results unexpected by higher-level code which calls + :meth:`.clip`. Consider using :meth:`.save` and :meth:`.restore` around + :meth:`.clip` as a more robust means of temporarily restricting the clip + region. + """ + + def restore(self) -> None: + """ + Restores :class:`Context` to the state saved by a preceding call to + :meth:`.save` and removes that state from the stack of saved states. + """ + + def rotate(self, angle: float) -> None: + """ + :param angle: angle (in radians) by which the user-space axes will be + rotated + + Modifies the current transformation matrix (CTM) by rotating the + user-space axes by *angle* radians. The rotation of the axes takes places + after any existing transformation of user space. The rotation direction + for positive angles is from the positive X axis toward the positive Y + axis. + """ + + def save(self) -> None: + """ + Makes a copy of the current state of :class:`Context` and saves it on an + internal stack of saved states. When :meth:`.restore` is called, + :class:`Context` will be restored to the saved state. Multiple calls to + :meth:`.save` and :meth:`.restore` can be nested; each call to + :meth:`.restore` restores the state from the matching paired + :meth:`.save`. + """ + + def scale(self, sx: float, sy: float) -> None: + """ + :param sx: scale factor for the X dimension + :param sy: scale factor for the Y dimension + + Modifies the current transformation matrix (CTM) by scaling the X and Y + user-space axes by *sx* and *sy* respectively. The scaling of the axes + takes place after any existing transformation of user space. + """ + + def select_font_face(self, family: str, slant: FontSlant = FontSlant.NORMAL, weight: FontWeight = FontWeight.NORMAL) -> None: + """ + :param family: a font family name + :param slant: the font slant of the font, + defaults to :attr:`cairo.FontSlant.NORMAL`. + :param weight: the font weight of the + font, defaults to :attr:`cairo.FontWeight.NORMAL`. + + Note: The :meth:`.select_font_face` function call is part of what the + cairo designers call the "toy" text API. It is convenient for short + demos and simple programs, but it is not expected to be adequate for + serious text-using applications. + + Selects a family and style of font from a simplified description as a + family name, slant and weight. Cairo provides no operation to list + available family names on the system (this is a "toy", remember), but + the standard CSS2 generic family names, ("serif", "sans-serif", + "cursive", "fantasy", "monospace"), are likely to work as expected. + + For "real" font selection, see the font-backend-specific + font_face_create functions for the font backend you are using. (For + example, if you are using the freetype-based cairo-ft font backend, see + cairo_ft_font_face_create_for_ft_face() or + cairo_ft_font_face_create_for_pattern().) The resulting font face could + then be used with cairo_scaled_font_create() and + cairo_set_scaled_font(). + + Similarly, when using the "real" font support, you can call directly + into the underlying font system, (such as fontconfig or freetype), for + operations such as listing available fonts, etc. + + It is expected that most applications will need to use a more + comprehensive font handling and text layout library, (for example, + pango), in conjunction with cairo. + + If text is drawn without a call to :meth:`.select_font_face`, (nor + :meth:`.set_font_face` nor :meth:`.set_scaled_font`), the default family + is platform-specific, but is essentially "sans-serif". Default slant is + :attr:`cairo.FontSlant.NORMAL`, and default weight is + :attr:`cairo.FontWeight.NORMAL`. + + This function is equivalent to a call to :class:`ToyFontFace` + followed by :meth:`.set_font_face`. + """ + + def set_antialias(self, antialias: Antialias) -> None: + """ + :param antialias: the new antialias mode + + Set the antialiasing mode of the rasterizer used for drawing shapes. + This value is a hint, and a particular backend may or may not support a + particular value. At the current time, no backend supports + :attr:`cairo.Antialias.SUBPIXEL` when drawing shapes. + + Note that this option does not affect text rendering, instead see + :meth:`FontOptions.set_antialias`. + """ + + def set_dash(self, dashes: Sequence[float], offset: float = 0) -> None: + """ + :param dashes: a sequence specifying alternate lengths of on and off + stroke portions as float. + :param offset: an offset into the dash pattern at which the stroke + should start, defaults to 0. + :raises: :exc:`cairo.Error` if any value in *dashes* is negative, or if + all values are 0. + + Sets the dash pattern to be used by :meth:`.stroke`. A dash pattern is + specified by *dashes* - a sequence of positive values. Each value + provides the length of alternate "on" and "off" portions of the + stroke. The *offset* specifies an offset into the pattern at which the + stroke begins. + + Each "on" segment will have caps applied as if the segment were a + separate sub-path. In particular, it is valid to use an "on" length of + 0.0 with :attr:`cairo.LineCap.ROUND` or :attr:`cairo.LineCap.SQUARE` + in order to distributed dots or squares along a path. + + Note: The length values are in user-space units as evaluated at the time + of stroking. This is not necessarily the same as the user space at the + time of :meth:`.set_dash`. + + If the number of dashes is 0 dashing is disabled. + + If the number of dashes is 1 a symmetric pattern is assumed with + alternating on and off portions of the size specified by the single + value in *dashes*. + """ + + def set_fill_rule(self, fill_rule: FillRule) -> None: + """ + :param fill_rule: a fill rule to set the + within the cairo context. The fill rule is used to determine which + regions are inside or outside a complex (potentially + self-intersecting) path. The current fill rule affects both + :meth:`.fill` and :meth:`.clip`. + + The default fill rule is :attr:`cairo.FillRule.WINDING`. + """ + + def set_font_face(self, font_face: Optional[FontFace]) -> None: + """ + :param font_face: a :class:`FontFace`, or None to restore to the + default :class:`FontFace` + + Replaces the current :class:`FontFace` object in the :class:`Context` + with *font_face*. + """ + + def set_font_matrix(self, matrix: Matrix) -> None: + """ + :param matrix: a :class:`Matrix` describing a transform to be applied to + the current font. + + Sets the current font matrix to *matrix*. The font matrix gives a + transformation from the design space of the font (in this space, the + em-square is 1 unit by 1 unit) to user space. Normally, a simple scale + is used (see :meth:`.set_font_size`), but a more complex font matrix can + be used to shear the font or stretch it unequally along the two axes + """ + + def set_font_options(self, options: FontOptions) -> None: + """ + :param options: :class:`FontOptions` to use + + Sets a set of custom font rendering options for the :class:`Context`. + Rendering options are derived by merging these options with the options + derived from underlying surface; if the value in *options* has a default + value (like :attr:`cairo.Antialias.DEFAULT`), then the value from the + surface is used. + """ + + def set_font_size(self, size: float) -> None: + """ + :param size: the new font size, in user space units + + Sets the current font matrix to a scale by a factor of *size*, replacing + any font matrix previously set with :meth:`.set_font_size` or + :meth:`.set_font_matrix`. This results in a font size of *size* user + space units. (More precisely, this matrix will result in the font's + em-square being a *size* by *size* square in user space.) + + If text is drawn without a call to :meth:`.set_font_size`, (nor + :meth:`.set_font_matrix` nor :meth:`.set_scaled_font`), the default font + size is 10.0. + """ + + def set_hairline(self, set_hairline: bool) -> None: + """ + :param set_hairline: whether or not to set hairline mode + + Sets lines within the cairo context to be hairlines. Hairlines are + logically zero-width lines that are drawn at the thinnest renderable + width possible in the current context. On surfaces with native hairline + support, the native hairline functionality will be used. Surfaces that + support hairlines include: + + - pdf/ps: Encoded as 0-width line. + - win32_printing: Rendered with PS_COSMETIC pen. + - svg: Encoded as 1px non-scaling-stroke. + - script: Encoded with set-hairline function. + + Cairo will always render hairlines at 1 device unit wide, even if an + anisotropic scaling was applied to the stroke width. In the wild, + handling of this situation is not well-defined. Some PDF, PS, and SVG + renderers match Cairo's output, but some very popular implementations + (Acrobat, Chrome, rsvg) will scale the hairline unevenly. As such, best + practice is to reset any anisotropic scaling before calling + :meth:`.stroke`. See https://cairographics.org/cookbook/ellipses/ for an + example. + + .. versionadded:: 1.23 Only available with cairo 1.17.6+ + """ + + def set_line_cap(self, line_cap: LineCap) -> None: + """ + :param line_cap: a line cap style + + Sets the current line cap style within the :class:`Context`. + + As with the other stroke parameters, the current line cap style is + examined by :meth:`.stroke` and :meth:`.stroke_extents`, but does not + have any effect during path construction. + + The default line cap style is :attr:`cairo.LineCap.BUTT`. + """ + + def set_line_join(self, line_join: LineJoin) -> None: + """ + :param line_join: a line join style + + Sets the current line join style within the :class:`Context`. + + As with the other stroke parameters, the current line join style is + examined by :meth:`.stroke` and :meth:`.stroke_extents`, but does not + have any effect during path construction. + + The default line join style is :attr:`cairo.LineJoin.MITER`. + """ + + def set_line_width(self, width: float) -> None: + """ + :param width: a line width + + Sets the current line width within the :class:`Context`. The line width + value specifies the diameter of a pen that is circular in user space, + (though device-space pen may be an ellipse in general due to + scaling/shear/rotation of the CTM). + + Note: When the description above refers to user space and CTM it refers + to the user space and CTM in effect at the time of the stroking + operation, not the user space and CTM in effect at the time of the call + to :meth:`.set_line_width`. The simplest usage makes both of these + spaces identical. That is, if there is no change to the CTM between a + call to :meth:`.set_line_width` and the stroking operation, then one can + just pass user-space values to :meth:`.set_line_width` and ignore this + note. + + As with the other stroke parameters, the current line width is examined + by :meth:`.stroke` and :meth:`.stroke_extents`, but does not have any + effect during path construction. + + The default line width value is 2.0. + """ + + def set_matrix(self, matrix: Matrix) -> None: + """ + :param matrix: a transformation :class:`Matrix` from user space to + device space. + + Modifies the current transformation matrix (CTM) by setting it equal to + *matrix*. + """ + + def set_miter_limit(self, limit: float) -> None: + """ + :param limit: miter limit to set + + Sets the current miter limit within the :class:`Context`. + + If the current line join style is set to :attr:`cairo.LineJoin.MITER` + (see :meth:`.set_line_join`), the miter limit is used to determine + whether the lines should be joined with a bevel instead of a miter. + Cairo divides the length of the miter by the line width. If the result + is greater than the miter limit, the style is converted to a bevel. + + As with the other stroke parameters, the current line miter limit is + examined by :meth:`.stroke` and :meth:`.stroke_extents`, but does not + have any effect during path construction. + + The default miter limit value is 10.0, which will convert joins with + interior angles less than 11 degrees to bevels instead of miters. For + reference, a miter limit of 2.0 makes the miter cutoff at 60 degrees, + and a miter limit of 1.414 makes the cutoff at 90 degrees. + + A miter limit for a desired angle can be computed as:: + + miter limit = 1/math.sin(angle/2) + """ + + def set_operator(self, op: Operator) -> None: + """ + :param op: the compositing operator to set + for use in all drawing operations. + + The default operator is :attr:`cairo.Operator.OVER`. + """ + + def set_scaled_font(self, scaled_font: ScaledFont) -> None: + """ + :param scaled_font: a :class:`ScaledFont` + + Replaces the current font face, font matrix, and font options in the + :class:`Context` with those of the :class:`ScaledFont`. Except for some + translation, the current CTM of the :class:`Context` should be the same + as that of the :class:`ScaledFont`, which can be accessed using + :meth:`ScaledFont.get_ctm`. + + .. versionadded:: 1.2 + """ + + def set_source(self, source: Pattern) -> None: + """ + :param source: a :class:`Pattern` to be used as the source for + subsequent drawing operations. + + Sets the source pattern within :class:`Context` to *source*. This + pattern will then be used for any subsequent drawing operation until a + new source pattern is set. + + Note: The pattern's transformation matrix will be locked to the user + space in effect at the time of :meth:`.set_source`. This means that + further modifications of the current transformation matrix will not + affect the source pattern. See :meth:`Pattern.set_matrix`. + + The default source pattern is a solid pattern that is opaque black, + (that is, it is equivalent to ``set_source_rgb(0.0, 0.0, 0.0)``. + """ + + def set_source_rgb(self, red: float, green: float, blue: float) -> None: + """ + :param red: red component of color + :param green: green component of color + :param blue: blue component of color + + Sets the source pattern within :class:`Context` to an opaque color. This + opaque color will then be used for any subsequent drawing operation + until a new source pattern is set. + + The color components are floating point numbers in the range 0 to + 1. If the values passed in are outside that range, they will be + clamped. + + The default source pattern is opaque black, (that is, it is + equivalent to ``set_source_rgb(0.0, 0.0, 0.0)``. + """ + + def set_source_rgba(self, red: float, green: float, blue: float, alpha: float = 1.0) -> None: + """ + :param red: red component of color + :param green: green component of color + :param blue: blue component of color + :param alpha: alpha component of color + + Sets the source pattern within :class:`Context` to a translucent + color. This color will then be used for any subsequent drawing operation + until a new source pattern is set. + + The color and alpha components are floating point numbers in the range 0 + to 1. If the values passed in are outside that range, they will be + clamped. + + The default source pattern is opaque black, (that is, it is + equivalent to ``set_source_rgba(0.0, 0.0, 0.0, 1.0)``. + """ + + def set_source_surface(self, surface: Surface, x: float = 0.0, y: float = 0.0) -> None: + """ + :param surface: a :class:`Surface` to be used to set the source pattern + :param x: User-space X coordinate for surface origin + :param y: User-space Y coordinate for surface origin + + This is a convenience function for creating a pattern from a + :class:`Surface` and setting it as the source in :class:`Context` with + :meth:`.set_source`. + + The *x* and *y* parameters give the user-space coordinate at which the + surface origin should appear. (The surface origin is its upper-left + corner before any transformation has been applied.) The *x* and *y* + patterns are negated and then set as translation values in the pattern + matrix. + + Other than the initial translation pattern matrix, as described above, + all other pattern attributes, (such as its extend mode), are set to the + default values as in :class:`SurfacePattern`. The resulting pattern can + be queried with :meth:`.get_source` so that these attributes can be + modified if desired, (eg. to create a repeating pattern with + :meth:`.Pattern.set_extend`). + """ + + def set_tolerance(self, tolerance: float) -> None: + """ + :param tolerance: the tolerance, in device units (typically pixels) + + Sets the tolerance used when converting paths into trapezoids. Curved + segments of the path will be subdivided until the maximum deviation + between the original path and the polygonal approximation is less than + *tolerance*. The default value is 0.1. A larger value will give better + performance, a smaller value, better appearance. (Reducing the value + from the default value of 0.1 is unlikely to improve appearance + significantly.) The accuracy of paths within Cairo is limited by the + precision of its internal arithmetic, and the prescribed *tolerance* is + restricted to the smallest representable internal value. + """ + + def show_glyphs(self, glyphs: Sequence[Glyph]) -> None: + """ + :param glyphs: glyphs to show as a sequence of :class:`Glyph` + + A drawing operator that generates the shape from an array of glyphs, + rendered according to the current font face, font size (font matrix), + and font options. + """ + + def show_page(self) -> None: + """ + Emits and clears the current page for backends that support multiple + pages. Use :meth:`.copy_page` if you don't want to clear the page. + + This is a convenience function that simply calls + ``ctx.get_target() . show_page()`` + """ + + def show_text(self, text: str) -> None: + """ + :param text: text + + A drawing operator that generates the shape from a string of text, + rendered according to the current font_face, font_size (font_matrix), + and font_options. + + This function first computes a set of glyphs for the string of text. The + first glyph is placed so that its origin is at the current point. The + origin of each subsequent glyph is offset from that of the previous + glyph by the advance values of the previous glyph. + + After this call the current point is moved to the origin of where the + next glyph would be placed in this same progression. That is, the + current point will be at the origin of the final glyph offset by its + advance values. This allows for easy display of a single logical string + with multiple calls to :meth:`.show_text`. + + Note: The :meth:`.show_text` function call is part of what the cairo + designers call the "toy" text API. It is convenient for short demos + and simple programs, but it is not expected to be adequate for + serious text-using applications. See :meth:`.show_glyphs` for the + "real" text display API in cairo. + """ + + def show_text_glyphs(self, utf8: str, glyphs: List["Glyph"], clusters: List[TextCluster], cluster_flags: TextClusterFlags) -> None: + """ + :param utf8: a string of text + :param glyphs: list of glyphs to show + :param clusters: list of cluster mapping information + :param cluster_flags: cluster mapping flags + :raises Error: + + .. versionadded:: 1.15 + + This operation has rendering effects similar to + :meth:`Context.show_glyphs` but, if the target surface supports it, uses + the provided text and cluster mapping to embed the text for the glyphs + shown in the output. If the target does not support the extended + attributes, this function acts like the basic + :meth:`Context.show_glyphs` as if it had been passed ``glyphs`` . + + The mapping between utf8 and glyphs is provided by a list of clusters. + Each cluster covers a number of text bytes and glyphs, and neighboring + clusters cover neighboring areas of utf8 and glyphs . The clusters + should collectively cover utf8 and glyphs in entirety. + + The first cluster always covers bytes from the beginning of utf8 . If + ``cluster_flags`` do not have the :attr:`TextClusterFlags.BACKWARD` set, + the first cluster also covers the beginning of glyphs , otherwise it + covers the end of the glyphs array and following clusters move backward. + + See :class:`TextCluster` for constraints on valid clusters. + """ + + def stroke(self) -> None: + """ + A drawing operator that strokes the current path according to the + current line width, line join, line cap, and dash settings. After + :meth:`.stroke`, the current path will be cleared from the cairo + context. See :meth:`.set_line_width`, :meth:`.set_line_join`, + :meth:`.set_line_cap`, :meth:`.set_dash`, and :meth:`.stroke_preserve`. + + Note: Degenerate segments and sub-paths are treated specially and + provide a useful result. These can result in two different situations: + + 1. Zero-length "on" segments set in :meth:`.set_dash`. If the cap + style is :attr:`cairo.LineCap.ROUND` or :attr:`cairo.LineCap.SQUARE` + then these segments will be drawn as circular dots or squares + respectively. In the case of :attr:`cairo.LineCap.SQUARE`, the + orientation of the squares is determined by the direction of the + underlying path. + + 2. A sub-path created by :meth:`.move_to` followed by either a + :meth:`.close_path` or one or more calls to :meth:`.line_to` to the same + coordinate as the :meth:`.move_to`. If the cap style is + :attr:`cairo.LineCap.ROUND` then these sub-paths will be drawn as + circular dots. Note that in the case of :attr:`cairo.LineCap.SQUARE` a + degenerate sub-path will not be drawn at all, (since the correct + orientation is indeterminate). + + In no case will a cap style of :attr:`cairo.LineCap.BUTT` cause anything + to be drawn in the case of either degenerate segments or sub-paths. + """ + + def stroke_extents(self) -> Tuple[float, float, float, float]: + """ + :returns: (x1, y1, x2, y2), all float + + * *x1*: left of the resulting extents + * *y1*: top of the resulting extents + * *x2*: right of the resulting extents + * *y2*: bottom of the resulting extents + + Computes a bounding box in user coordinates covering the area that would + be affected, (the "inked" area), by a :meth:`.stroke` operation given + the current path and stroke parameters. If the current path is empty, + returns an empty rectangle (0, 0, 0, 0). Surface dimensions and + clipping are not taken into account. + + Note that if the line width is set to exactly zero, then + :meth:`.stroke_extents` will return an empty rectangle. Contrast with + :meth:`.path_extents` which can be used to compute the non-empty bounds + as the line width approaches zero. + + Note that :meth:`.stroke_extents` must necessarily do more work to + compute the precise inked areas in light of the stroke parameters, so + :meth:`.path_extents` may be more desirable for sake of performance if + non-inked path extents are desired. + + See :meth:`.stroke`, :meth:`.set_line_width`, :meth:`.set_line_join`, + :meth:`.set_line_cap`, :meth:`.set_dash`, and :meth:`.stroke_preserve`. + """ + + def stroke_preserve(self) -> None: + """ + A drawing operator that strokes the current path according to the + current line width, line join, line cap, and dash settings. Unlike + :meth:`.stroke`, :meth:`.stroke_preserve` preserves the path within the + cairo context. + + See :meth:`.set_line_width`, :meth:`.set_line_join`, + :meth:`.set_line_cap`, :meth:`.set_dash`, and :meth:`.stroke_preserve`. + """ + + def tag_begin(self, tag_name: str, attributes: str) -> None: + """ + :param tag_name: tag name + :param attributes: tag attributes + + Marks the beginning of the tag_name structure. Call :meth:`tag_end` + with the same tag_name to mark the end of the structure. + + The attributes string is of the form "key1=value2 key2=value2 ...". + Values may be boolean (true/false or 1/0), integer, float, string, or + an array. + + String values are enclosed in single quotes ('). Single quotes and + backslashes inside the string should be escaped with a backslash. + + Boolean values may be set to true by only specifying the key. eg the + attribute string "key" is the equivalent to "key=true". + + Arrays are enclosed in '[]'. eg "rect=[1.2 4.3 2.0 3.0]". + + If no attributes are required, attributes can be an empty string. + + See `Tags and Links Description + `__ + for the list of tags and attributes. + + Invalid nesting of tags or invalid attributes will cause the context + to shutdown with a status of :attr:`Status.TAG_ERROR`. + + See :meth:`tag_end`. + + .. versionadded:: 1.18.0 Only available with cairo 1.15.10+ + """ + + def tag_end(self, tag_name: str) -> None: + """ + :param tag_name: tag name + + Marks the end of the tag_name structure. + + Invalid nesting of tags will cause the context to shutdown with a + status of :attr:`Status.TAG_ERROR`. + + See :meth:`tag_begin`. + + .. versionadded:: 1.18.0 Only available with cairo 1.15.10+ + """ + + def text_extents(self, text: str) -> TextExtents: + """ + :param text: text to get extents for + + Gets the extents for a string of text. The extents describe a user-space + rectangle that encloses the "inked" portion of the text, (as it would be + drawn by :meth:`Context.show_text`). Additionally, the x_advance and + y_advance values indicate the amount by which the current point would be + advanced by :meth:`Context.show_text`. + + Note that whitespace characters do not directly contribute to the size + of the rectangle (extents.width and extents.height). They do contribute + indirectly by changing the position of non-whitespace characters. In + particular, trailing whitespace characters are likely to not affect the + size of the rectangle, though they will affect the x_advance and + y_advance values. + """ + + def text_path(self, text: str) -> None: + """ + :param text: text + + Adds closed paths for text to the current path. The generated path if + filled, achieves an effect similar to that of :meth:`Context.show_text`. + + Text conversion and positioning is done similar to + :meth:`Context.show_text`. + + Like :meth:`Context.show_text`, After this call the current point is + moved to the origin of where the next glyph would be placed in this same + progression. That is, the current point will be at the origin of the + final glyph offset by its advance values. This allows for chaining + multiple calls to to :meth:`Context.text_path` without having to set + current point in between. + + Note: The :meth:`.text_path` function call is part of what the cairo + designers call the "toy" text API. It is convenient for short demos and + simple programs, but it is not expected to be adequate for serious + text-using applications. See :meth:`Context.glyph_path` for the "real" + text path API in cairo. + """ + + def transform(self, matrix: Matrix) -> None: + """ + :param matrix: a transformation :class:`Matrix` to be applied to the + user-space axes + + Modifies the current transformation matrix (CTM) by applying *matrix* as + an additional transformation. The new transformation of user space takes + place after any existing transformation. + """ + + def translate(self, tx: float, ty: float) -> None: + """ + :param tx: amount to translate in the X direction + :param ty: amount to translate in the Y direction + + Modifies the current transformation matrix (CTM) by translating the + user-space origin by *(tx, ty)*. This offset is interpreted as a + user-space coordinate according to the CTM in place before the new call + to :meth:`.translate`. In other words, the translation of the user-space + origin takes place after any existing transformation. + """ + + def user_to_device(self, x: float, y: float) -> Tuple[float, float]: + """ + :param x: X value of coordinate + :param y: Y value of coordinate + :returns: (x, y), both float + + * *x*: X value of coordinate + * *y*: Y value of coordinate + + Transform a coordinate from user space to device space by multiplying + the given point by the current transformation matrix (CTM). + """ + + def user_to_device_distance(self, dx: float, dy: float) -> Tuple[float, float]: + """ + :param dx: X value of a distance vector + :param dy: Y value of a distance vector + :returns: (dx, dy), both float + + * *dx*: X value of a distance vector + * *dy*: Y value of a distance vector + + Transform a distance vector from user space to device space. This + function is similar to :meth:`Context.user_to_device` except that the + translation components of the CTM will be ignored when transforming + *(dx,dy)*. + """ + +class Error(Exception): + """This exception is raised when a cairo object returns an error status.""" + status: Status = ... + +CairoError = Error +""" +An alias for :exc:`Error` + +.. versionadded:: 1.12.0 +""" + +class Gradient(Pattern): + """ + *Gradient* is an abstract base class from which other *Pattern* classes + derive. It cannot be instantiated directly. + """ + + def add_color_stop_rgb(self, offset: float, red: float, green: float, blue: float) -> None: + """ + :param offset: an offset in the range [0.0 .. 1.0] + :param red: red component of color + :param green: green component of color + :param blue: blue component of color + + Adds an opaque color stop to a *Gradient* pattern. The offset specifies + the location along the gradient's control vector. For example, a + *LinearGradient's* control vector is from (x0,y0) to (x1,y1) while a + *RadialGradient's* control vector is from any point on the start circle + to the corresponding point on the end circle. + + The color is specified in the same way as in :meth:`Context.set_source_rgb`. + + If two (or more) stops are specified with identical offset values, they + will be sorted according to the order in which the stops are added, + (stops added earlier will compare less than stops added later). This can + be useful for reliably making sharp color transitions instead of the + typical blend. + """ + + def add_color_stop_rgba(self, offset: float, red: float, green: float, blue: float, alpha: float) -> None: + """ + :param offset: an offset in the range [0.0 .. 1.0] + :param red: red component of color + :param green: green component of color + :param blue: blue component of color + :param alpha: alpha component of color + + Adds an opaque color stop to a *Gradient* pattern. The offset specifies + the location along the gradient's control vector. For example, a + *LinearGradient's* control vector is from (x0,y0) to (x1,y1) while a + *RadialGradient's* control vector is from any point on the start circle + to the corresponding point on the end circle. + + The color is specified in the same way as in :meth:`Context.set_source_rgb`. + + If two (or more) stops are specified with identical offset values, they + will be sorted according to the order in which the stops are added, + (stops added earlier will compare less than stops added later). This can + be useful for reliably making sharp color transitions instead of the + typical blend. + """ + + def get_color_stops_rgba(self) -> List[Tuple[float, float, float, float, float]]: + """ + :returns: a list of (offset, red, green, blue, alpha) tuples of float + + Gets the color and offset information for all color stops specified in + the given gradient pattern. + + .. versionadded:: 1.14 + """ + +class LinearGradient(Gradient): + def __init__(self, x0: float, y0: float, x1: float, y1: float) -> None: + """ + :param x0: x coordinate of the start point + :param y0: y coordinate of the start point + :param x1: x coordinate of the end point + :param y1: y coordinate of the end point + + Create a new *LinearGradient* along the line defined by (x0, y0) and (x1, + y1). Before using the *Gradient* pattern, a number of color stops should + be defined using :meth:`Gradient.add_color_stop_rgb` or + :meth:`Gradient.add_color_stop_rgba` + + Note: The coordinates here are in pattern space. For a new *Pattern*, + pattern space is identical to user space, but the relationship between the + spaces can be changed with :meth:`Pattern.set_matrix` + """ + + def get_linear_points(self) -> Tuple[float, float, float, float]: + """ + :returns: (x0, y0, x1, y1) - a tuple of float + + * x0: return value for the x coordinate of the first point + * y0: return value for the y coordinate of the first point + * x1: return value for the x coordinate of the second point + * y1: return value for the y coordinate of the second point + + Gets the gradient endpoints for a *LinearGradient*. + + .. versionadded:: 1.4 + """ + +class MeshPattern(Pattern): + """ + Mesh patterns are tensor-product patch meshes (type 7 shadings in PDF). + Mesh patterns may also be used to create other types of shadings that are + special cases of tensor-product patch meshes such as Coons patch meshes + (type 6 shading in PDF) and Gouraud-shaded triangle meshes (type 4 and 5 + shadings in PDF). + + Mesh patterns consist of one or more tensor-product patches, which should + be defined before using the mesh pattern. Using a mesh pattern with a + partially defined patch as source or mask will put the context in an error + status with a status of :attr:`cairo.Status.INVALID_MESH_CONSTRUCTION`. + + A tensor-product patch is defined by 4 Bézier curves (side 0, 1, 2, 3) and + by 4 additional control points (P0, P1, P2, P3) that provide further + control over the patch and complete the definition of the tensor-product + patch. The corner C0 is the first point of the patch. + + Degenerate sides are permitted so straight lines may be used. A zero + length line on one side may be used to create 3 sided patches. + + :: + + C1 Side 1 C2 + +---------------+ + | | + | P1 P2 | + | | + Side 0 | | Side 2 + | | + | | + | P0 P3 | + | | + +---------------+ + C0 Side 3 C3 + + Each patch is constructed by first calling :meth:`begin_patch`, then + :meth:`move_to` to specify the first point in the patch (C0). Then the + sides are specified with calls to :meth:`curve_to` and :meth:`line_to`. + + The four additional control points (P0, P1, P2, P3) in a patch can be + specified with :meth:`set_control_point`. + + At each corner of the patch (C0, C1, C2, C3) a color may be specified with + :meth:`set_corner_color_rgb` or :meth:`set_corner_color_rgba`. Any corner + whose color is not explicitly specified defaults to transparent black. + + A Coons patch is a special case of the tensor-product patch where the + control points are implicitly defined by the sides of the patch. The + default value for any control point not specified is the implicit value + for a Coons patch, i.e. if no control points are specified the patch is a + Coons patch. + + A triangle is a special case of the tensor-product patch where the control + points are implicitly defined by the sides of the patch, all the sides are + lines and one of them has length 0, i.e. if the patch is specified using + just 3 lines, it is a triangle. If the corners connected by the 0-length + side have the same color, the patch is a Gouraud-shaded triangle. + + Patches may be oriented differently to the above diagram. For example the + first point could be at the top left. The diagram only shows the + relationship between the sides, corners and control points. Regardless of + where the first point is located, when specifying colors, corner 0 will + always be the first point, corner 1 the point between side 0 and side 1 + etc. + + Calling :meth:`end_patch` completes the current patch. If less than 4 + sides have been defined, the first missing side is defined as a line from + the current point to the first point of the patch (C0) and the other sides + are degenerate lines from C0 to C0. The corners between the added sides + will all be coincident with C0 of the patch and their color will be set to + be the same as the color of C0. + + Additional patches may be added with additional calls to + :meth:`begin_patch`/:meth:`end_patch`. + + :: + + # Add a Coons patch + pattern = cairo.MeshPattern() + pattern.begin_patch() + pattern.move_to(0, 0) + pattern.curve_to(30, -30, 60, 30, 100, 0) + pattern.curve_to(60, 30, 130, 60, 100, 100) + pattern.curve_to(60, 70, 30, 130, 0, 100) + pattern.curve_to(30, 70, -30, 30, 0, 0) + pattern.set_corner_color_rgb(0, 1, 0, 0) + pattern.set_corner_color_rgb(1, 0, 1, 0) + pattern.set_corner_color_rgb(2, 0, 0, 1) + pattern.set_corner_color_rgb(3, 1, 1, 0) + pattern.end_patch() + + # Add a Gouraud-shaded triangle + pattern = cairo.MeshPattern() + pattern.begin_patch() + pattern.move_to(100, 100) + pattern.line_to(130, 130) + pattern.line_to(130, 70) + pattern.set_corner_color_rgb(0, 1, 0, 0) + pattern.set_corner_color_rgb(1, 0, 1, 0) + pattern.set_corner_color_rgb(2, 0, 0, 1) + pattern.end_patch() + + When two patches overlap, the last one that has been added is drawn over + the first one. + + When a patch folds over itself, points are sorted depending on their + parameter coordinates inside the patch. The v coordinate ranges from 0 to + 1 when moving from side 3 to side 1; the u coordinate ranges from 0 to 1 + when going from side 0 to side + + Points with higher v coordinate hide points with lower v coordinate. When + two points have the same v coordinate, the one with higher u coordinate is + above. This means that points nearer to side 1 are above points nearer to + side 3; when this is not sufficient to decide which point is above (for + example when both points belong to side 1 or side 3) points nearer to side + 2 are above points nearer to side 0. + + For a complete definition of tensor-product patches, see the PDF + specification (ISO32000), which describes the parametrization in detail. + + Note: The coordinates are always in pattern space. For a new pattern, + pattern space is identical to user space, but the relationship between the + spaces can be changed with :meth:`Pattern.set_matrix`. + + .. versionadded:: 1.14 + """ + + def __init__(self) -> None: + """ + Create a new mesh pattern. + + .. versionadded:: 1.14 + """ + + def begin_patch(self) -> None: + """ + :raises Error: + + Begin a patch in a mesh pattern. + + After calling this function, the patch shape should be defined with + :meth:`move_to`, :meth:`line_to` and :meth:`curve_to`. + + After defining the patch, :meth:`end_patch` must be called before + using pattern as a source or mask. + """ + + def curve_to(self, x1: float, y1: float, x2: float, y2: float, x3: float, y3: float) -> None: + """ + :param x1: the X coordinate of the first control point + :param y1: the Y coordinate of the first control point + :param x2: the X coordinate of the second control point + :param y2: the Y coordinate of the second control point + :param x3: the X coordinate of the end of the curve + :param y3: the Y coordinate of the end of the curve + :raises Error: + + Adds a cubic Bézier spline to the current patch from the current point + to position (x3 , y3 ) in pattern-space coordinates, using (x1 , y1 ) + and (x2 , y2 ) as the control points. + + If the current patch has no current point before the call to + :meth:`curve_to`, this function will behave as if + preceded by a call to ``pattern.move_to(x1, y1)``. + + After this call the current point will be (x3 , y3 ). + """ + + def end_patch(self) -> None: + """ + :raises Error: + + Indicates the end of the current patch in a mesh pattern. + + If the current patch has less than 4 sides, it is closed with a + straight line from the current point to the first point of the patch + as if :meth:`line_to` was used. + """ + + def get_control_point(self, patch_num: int, point_num: int) -> Tuple[float, float]: + """ + :param patch_num: the patch number to return data for + :param point_num: he control point number to return data for + :returns: a (x, y) tuple of float - coordinates of the control point + :raises Error: + + Gets the control point point_num of patch patch_num for a mesh + pattern. + + ``patch_num`` can range from 0 to n-1 where n is the number returned + by :meth:`get_patch_count`. + + Valid values for ``point_num`` are from 0 to 3 and identify the control + points as explained in :class:`MeshPattern`. + """ + + def get_corner_color_rgba(self, patch_num: int, corner_num: int) -> Tuple[float, float, float, float]: + """ + :param patch_num: the patch number to return data for + :param corner_num: the corner number to return data for + :returns: a (red, green, blue, alpha) tuple of float + :raises Error: + + Gets the color information in corner ``corner_num`` of patch + ``patch_num`` for a mesh pattern. + + ``patch_num`` can range from 0 to n-1 where n is the number returned + by :meth:`get_patch_count`. + + Valid values for ``corner_num`` are from 0 to 3 and identify the + corners as explained in :class:`MeshPattern`. + """ + + def get_patch_count(self) -> int: + """ + :returns: number of patches + + Gets the number of patches specified in the given mesh pattern. + + The number only includes patches which have been finished by calling + :meth:`end_patch`. For example it will be 0 during the definition of + the first patch. + """ + + def line_to(self, x: float, y: float) -> None: + """ + :param x: the X coordinate of the end of the new line + :param y: the Y coordinate of the end of the new line + :raises Error: + + Adds a line to the current patch from the current point to position (x + , y ) in pattern-space coordinates. + + If there is no current point before the call to :meth:`line_to` this + function will behave as ``pattern.move_to(x ,y)``. + + After this call the current point will be (x , y ). + """ + + def move_to(self, x: float, y: float) -> None: + """ + :param x: the X coordinate of the new position + :param y: the Y coordinate of the new position + :raises Error: + + Define the first point of the current patch in a mesh pattern. + + After this call the current point will be (x , y ). + """ + + def set_control_point(self, point_num: int, x: float, y: float) -> None: + """ + :param point_num: the control point to set the position for + :param x: the X coordinate of the control point + :param y: the Y coordinate of the control point + :raises Error: + + Set an internal control point of the current patch. + + Valid values for point_num are from 0 to 3 and identify the control + points as explained in :class:`MeshPattern`. + """ + + def set_corner_color_rgb(self, corner_num: int, red: float, green: float, blue: float) -> None: + """ + :param corner_num: the corner to set the color for + :param red: red component of color + :param green: green component of color + :param blue: blue component of color + :raises Error: + + Sets the color of a corner of the current patch in a mesh pattern. + + The color is specified in the same way as in + :meth:`Context.set_source_rgb`. + + Valid values for corner_num are from 0 to 3 and identify the corners + as explained in :class:`MeshPattern`. + """ + + def set_corner_color_rgba(self, corner_num: int, red: float, green: float, blue: float, alpha: float) -> None: + """ + :param corner_num: the corner to set the color for + :param red: red component of color + :param green: green component of color + :param blue: blue component of color + :param alpha: alpha component of color + :raises Error: + + Sets the color of a corner of the current patch in a mesh pattern. + + The color is specified in the same way as in + :meth:`Context.set_source_rgba`. + + Valid values for corner_num are from 0 to 3 and identify the corners + as explained in :class:`MeshPattern`. + """ + + def get_path(self, patch_num: int) -> Path: + """ + :param patch_num: the patch number to return data for + :returns: the path defining the patch + :raises Error: + + Gets path defining the patch ``patch_num`` for a mesh pattern. + + ``patch_num`` can range from 0 to n-1 where n is the number returned + by :meth:`get_patch_count`. + """ + +class PDFSurface(Surface): + """ + The PDFSurface is used to render cairo graphics to Adobe PDF files and is a + multi-page vector surface backend. + + .. versionadded:: 1.2 + """ + + def __init__(self, fobj: Union[_PathLike, _FileLike], width_in_points: float, height_in_points: float) -> None: + """ + :param fobj: a filename or writable file object. None may be used to + specify no output. This will generate a *PDFSurface* that may be + queried and used as a source, without generating a temporary file. + :param width_in_points: width of the surface, in points (1 point == + 1/72.0 inch) + :param height_in_points: height of the surface, in points (1 point == + 1/72.0 inch) + :returns: a new *PDFSurface* of the specified size in points to be + written to *fobj*. + + .. versionadded:: 1.2 + """ + + def set_custom_metadata(self, name: str, value: Optional[str]) -> None: + """ + :param name: The name of the custom metadata item to set. + :param value: The value of the metadata. + + Set custom document metadata. *name* may be any string except for the + following names reserved by PDF: "Title", "Author", "Subject", + "Keywords", "Creator", "Producer", "CreationDate", "ModDate", "Trapped". + + If *value* is :obj:`None` or an empty string, the *name* metadata will + not be set. + + For example:: + + surface.set_custom_metadata("ISBN", "978-0123456789") + + .. versionadded:: 1.23.0 Only available with cairo 1.17.6+ + """ + + def set_size(self, width_in_points: float, height_in_points: float) -> None: + """ + :param width_in_points: new surface width, in points + (1 point == 1/72.0 inch) + :param height_in_points: new surface height, in points + (1 point == 1/72.0 inch) + + Changes the size of a *PDFSurface* for the current (and subsequent) pages. + + This function should only be called before any drawing operations have + been performed on the current page. The simplest way to do this is to + call this function immediately after creating the surface or immediately + after completing a page with either :meth:`Context.show_page` or + :meth:`Context.copy_page`. + + .. versionadded:: 1.2 + """ + + def restrict_to_version(self, version: PDFVersion) -> None: + """ + :param version: PDF version + + Restricts the generated PDF file to version . See :meth:`get_versions` + for a list of available version values that can be used here. + + This function should only be called before any drawing operations have + been performed on the given surface. The simplest way to do this is to + call this function immediately after creating the surface. + + .. versionadded:: 1.12.0 + """ + + @staticmethod + def get_versions() -> List[PDFVersion]: + """ + :returns: supported version list + + Retrieve the list of supported versions. See + :meth:`restrict_to_version`. + + .. versionadded:: 1.12.0 + """ + + @staticmethod + def version_to_string(version: PDFVersion) -> str: + """ + :param version: PDF version + :returns: the string associated to the given version + :raises ValueError: if version isn't valid + + Get the string representation of the given version id. See + :meth:`get_versions` for a way to get the list of valid version ids. + + .. versionadded:: 1.12.0 + """ + + def add_outline(self, parent_id: int, utf8: str, link_attribs: str, flags: PDFOutlineFlags) -> int: + """ + :param parent_id: + the id of the parent item or :data:`PDF_OUTLINE_ROOT` if this is a top + level item. + :param utf8: + the name of the outline + :param link_attribs: + the link attributes specifying where this outline links to + :param flags: + outline item flags + :returns: the id for the added item. + + .. versionadded:: 1.18.0 Only available with cairo 1.15.10+ + """ + + def set_metadata(self, metadata: PDFMetadata, utf8: str) -> None: + """ + :param metadata: The metadata item to set. + :param utf8: metadata value + + Set document metadata. The :attr:`PDFMetadata.CREATE_DATE` and + :attr:`PDFMetadata.MOD_DATE` values must be in ISO-8601 format: + YYYY-MM-DDThh:mm:ss. An optional timezone of the form "[+/-]hh:mm" or + "Z" for UTC time can be appended. All other metadata values can be any + UTF-8 string. + + .. versionadded:: 1.18.0 Only available with cairo 1.15.10+ + """ + + def set_page_label(self, utf8: str) -> None: + """ + :param utf8: metadata value + + Set page label for the current page. + + .. versionadded:: 1.18.0 Only available with cairo 1.15.10+ + """ + + def set_thumbnail_size(self, width: int, height: int) -> None: + """ + :param width: Thumbnail width. + :param height: Thumbnail height + + Set the thumbnail image size for the current and all subsequent pages. + Setting a width or height of 0 disables thumbnails for the current and + subsequent pages. + + .. versionadded:: 1.18.0 Only available with cairo 1.15.10+ + """ + +class PSSurface(Surface): + """ + The *PSSurface* is used to render cairo graphics to Adobe PostScript files and + is a multi-page vector surface backend. + """ + + def __init__(self, fobj: Union[_FileLike, _PathLike], width_in_points: float, height_in_points: float) -> None: + """ + :param fobj: a filename or writable file object. None may be used to specify no output. This will generate a *PSSurface* that may be queried and used as a source, without generating a temporary file. + :param width_in_points: width of the surface, in points + (1 point == 1/72.0 inch) + :param height_in_points: height of the surface, in points + (1 point == 1/72.0 inch) + :returns: a new *PDFSurface* of the specified size in points to be written + to *fobj*. + :raises: :exc:`MemoryError` in case of no memory + + Note that the size of individual pages of the PostScript output can + vary. See :meth:`.set_size`. + """ + + def dsc_begin_page_setup(self) -> None: + """ + This method indicates that subsequent calls to + :meth:`.dsc_comment` should direct comments to the PageSetup + section of the PostScript output. + + This method call is only needed for the first page of a surface. It + should be called after any call to :meth:`.dsc_begin_setup` and + before any drawing is performed to the surface. + + See :meth:`.dsc_comment` for more details. + + .. versionadded:: 1.2 + """ + + def dsc_begin_setup(self) -> None: + """ + This function indicates that subsequent calls to :meth:`.dsc_comment` + should direct comments to the Setup section of the PostScript output. + + This function should be called at most once per surface, and must be + called before any call to :meth:`.dsc_begin_page_setup` and before any + drawing is performed to the surface. + + See :meth:`.dsc_comment` for more details. + + .. versionadded:: 1.2 + """ + + def dsc_comment(self, comment: str) -> None: + """ + :param comment: a comment string to be emitted into the PostScript output + + Emit a comment into the PostScript output for the given surface. + + The comment is expected to conform to the PostScript Language + Document Structuring Conventions (DSC). Please see that manual for + details on the available comments and their meanings. In + particular, the %%IncludeFeature comment allows a + device-independent means of controlling printer device features. So + the PostScript Printer Description Files Specification will also be + a useful reference. + + The comment string must begin with a percent character (%) and the + total length of the string (including any initial percent + characters) must not exceed 255 characters. Violating either of + these conditions will place *PSSurface* into an error state. But + beyond these two conditions, this function will not enforce + conformance of the comment with any particular specification. + + The comment string should not have a trailing newline. + + The DSC specifies different sections in which particular comments + can appear. This function provides for comments to be emitted + within three sections: the header, the Setup section, and the + PageSetup section. Comments appearing in the first two sections + apply to the entire document while comments in the BeginPageSetup + section apply only to a single page. + + For comments to appear in the header section, this function should + be called after the surface is created, but before a call to + :meth:`.dsc_begin_setup`. + + For comments to appear in the Setup section, this function should be + called after a call to :meth:`.dsc_begin_setup` but before a call to + :meth:`.dsc_begin_page_setup`. + + For comments to appear in the PageSetup section, this function should be + called after a call to :meth:`.dsc_begin_page_setup`. + + Note that it is only necessary to call :meth:`.dsc_begin_page_setup` for + the first page of any surface. After a call to :meth:`Context.show_page` + or :meth:`Context.copy_page` comments are unambiguously directed to the + PageSetup section of the current page. But it doesn't hurt to call this + function at the beginning of every page as that consistency may make the + calling code simpler. + + As a final note, cairo automatically generates several comments on + its own. As such, applications must not manually generate any of + the following comments: + + Header section: %!PS-Adobe-3.0, %Creator, %CreationDate, %Pages, + %BoundingBox, %DocumentData, %LanguageLevel, %EndComments. + + Setup section: %BeginSetup, %EndSetup + + PageSetup section: %BeginPageSetup, %PageBoundingBox, + %EndPageSetup. + + Other sections: %BeginProlog, %EndProlog, %Page, %Trailer, %EOF + + Here is an example sequence showing how this function might be used:: + + surface = PSSurface (filename, width, height) + ... + surface.dsc_comment (surface, "%%Title: My excellent document") + surface.dsc_comment (surface, "%%Copyright: Copyright (C) 2006 Cairo Lover") + ... + surface.dsc_begin_setup (surface) + surface.dsc_comment (surface, "%%IncludeFeature: *MediaColor White") + ... + surface.dsc_begin_page_setup (surface) + surface.dsc_comment (surface, "%%IncludeFeature: *PageSize A3") + surface.dsc_comment (surface, "%%IncludeFeature: *InputSlot LargeCapacity") + surface.dsc_comment (surface, "%%IncludeFeature: *MediaType Glossy") + surface.dsc_comment (surface, "%%IncludeFeature: *MediaColor Blue") + ... draw to first page here .. + ctx.show_page (cr) + ... + surface.dsc_comment (surface, "%%IncludeFeature: PageSize A5"); + ... + + .. versionadded:: 1.2 + """ + + def get_eps(self) -> bool: + """ + :returns: True iff the *PSSurface* will output Encapsulated PostScript. + + .. versionadded:: 1.6 + """ + + @staticmethod + def level_to_string(level: PSLevel) -> str: + """ + :param level: a PS level + :returns: the string associated to given level. + + Get the string representation of the given *level*. See + :meth:`get_levels` for a way to get the list of valid level + ids. + + .. note:: Prior to 1.12 this was available under + :meth:`ps_level_to_string` + + .. versionadded:: 1.12.0 + """ + + ps_level_to_string = level_to_string + """ + Alias for :meth:`level_to_string` + + .. versionadded:: 1.6 + """ + + def restrict_to_level(self, level: PSLevel) -> None: + """ + :param level: a PS level + + Restricts the generated PostSript file to *level*. See + :meth:`get_levels` for a list of available level values that + can be used here. + + This function should only be called before any drawing operations have + been performed on the given surface. The simplest way to do this is to + call this function immediately after creating the surface. + + .. versionadded:: 1.6 + """ + + def set_eps(self, eps: bool) -> None: + """ + :param eps: True to output EPS format PostScript + + If *eps* is True, the PostScript surface will output Encapsulated + PostScript. + + This function should only be called before any drawing operations have + been performed on the current page. The simplest way to do this is to + call this function immediately after creating the surface. An + Encapsulated PostScript file should never contain more than one page. + + .. versionadded:: 1.6 + """ + + def set_size(self, width_in_points: float, height_in_points: float) -> None: + """ + :param width_in_points: new surface width, in points (1 point == 1/72.0 inch) + :param height_in_points: new surface height, in points (1 point == 1/72.0 inch) + + Changes the size of a PostScript surface for the current (and + subsequent) pages. + + This function should only be called before any drawing operations + have been performed on the current page. The simplest way to do + this is to call this function immediately after creating the + surface or immediately after completing a page with either + :meth:`Context.show_page` or :meth:`Context.copy_page`. + + .. versionadded:: 1.2 + """ + + @staticmethod + def get_levels() -> List[PSLevel]: + """ + :returns: supported level list + + Retrieve the list of supported levels. See + :meth:`restrict_to_level`. + + .. versionadded:: 1.12.0 + """ + +class SVGSurface(Surface): + """ + The *SVGSurface* is used to render cairo graphics to SVG files and is a + multi-page vector surface backend + """ + + def __init__(self, fobj: "Union[_PathLike, _FileLike]", width_in_points: float, height_in_points: float) -> None: + """ + :param fobj: a filename or writable file object. None may be used to specify no output. This will generate a *SVGSurface* that may be queried and used as a source, without generating a temporary file. + :param width_in_points: width of the surface, in points (1 point == 1/72.0 inch) + :param height_in_points: height of the surface, in points (1 point == 1/72.0 inch) + """ + + def restrict_to_version(self, version: SVGVersion) -> None: + """ + :param version: SVG version + + Restricts the generated SVG file to version . See :meth:`get_versions` + for a list of available version values that can be used here. + + This function should only be called before any drawing operations have + been performed on the given surface. The simplest way to do this is to + call this function immediately after creating the surface. + + .. versionadded:: 1.12.0 + """ + + @staticmethod + def get_versions() -> List[SVGVersion]: + """ + :returns: supported version list + + Retrieve the list of supported versions. See + :meth:`restrict_to_version`. + + .. versionadded:: 1.12.0 + """ + + @staticmethod + def version_to_string(version: SVGVersion) -> str: + """ + :param version: SVG version + :returns: the string associated to the given version + :raises ValueError: if version isn't valid + + Get the string representation of the given version id. See + :meth:`get_versions` for a way to get the list of valid version ids. + + .. versionadded:: 1.12.0 + """ + + def get_document_unit(self) -> SVGUnit: + """ + :returns: the SVG unit of the SVG surface. + :rtype: SVGUnit + + Get the unit of the SVG surface. + + .. versionadded:: 1.18.0 Only available with cairo 1.15.10+ + """ + + def set_document_unit(self, unit: SVGUnit) -> None: + """ + :param SVGUnit unit: SVG unit + + Use the specified unit for the width and height of the generated SVG + file. See :class:`SVGUnit` for a list of available unit values that can + be used here. + + This function can be called at any time before generating the SVG file. + + However to minimize the risk of ambiguities it's recommended to call it + before any drawing operations have been performed on the given surface, + to make it clearer what the unit used in the drawing operations is. + + The simplest way to do this is to call this function immediately after + creating the SVG surface. + + Note if this function is never called, the default unit for SVG + documents generated by cairo will be "pt". This is for historical + reasons. + + .. versionadded:: 1.18.0 Only available with cairo 1.15.10+ + """ + +class RadialGradient(Gradient): + + def __init__(self, cx0: float, cy0: float, radius0: float, cx1: float, cy1: float, radius1: float) -> None: + """ + :param cx0: x coordinate for the center of the start circle + :param cy0: y coordinate for the center of the start circle + :param radius0: radius of the start circle + :param cx1: x coordinate for the center of the end circle + :param cy1: y coordinate for the center of the end circle + :param radius1: radius of the end circle + + Creates a new *RadialGradient* pattern between the two circles defined by + (cx0, cy0, radius0) and (cx1, cy1, radius1). Before using the gradient + pattern, a number of color stops should be defined using + :meth:`Gradient.add_color_stop_rgb` or :meth:`Gradient.add_color_stop_rgba`. + + Note: The coordinates here are in pattern space. For a new pattern, pattern + space is identical to user space, but the relationship between the spaces + can be changed with :meth:`Pattern.set_matrix`. + """ + + def get_radial_circles(self) -> Tuple[float, float, float, float, float, float]: + """ + :returns: (x0, y0, r0, x1, y1, r1) - a tuple of float + + * x0: return value for the x coordinate of the center of the first circle + * y0: return value for the y coordinate of the center of the first circle + * r0: return value for the radius of the first circle + * x1: return value for the x coordinate of the center of the second circle + * y1: return value for the y coordinate of the center of the second circle + * r1: return value for the radius of the second circle + + Gets the *Gradient* endpoint circles for a *RadialGradient*, each + specified as a center coordinate and a radius. + + .. versionadded:: 1.4 + """ + +_AcquireCallback = Callable[[Surface, RectangleInt], Surface] +_ReleaseCallback = Callable[[Surface], None] + +class RasterSourcePattern(Pattern): + """ + The raster source provides the ability to supply arbitrary pixel data whilst + rendering. The pixels are queried at the time of rasterisation by means of + user callback functions, allowing for the ultimate flexibility. For example, + in handling compressed image sources, you may keep a MRU cache of decompressed + images and decompress sources on the fly and discard old ones to conserve + memory. + + For the raster source to be effective, you must at least specify the acquire + and release callbacks which are used to retrieve the pixel data for the region + of interest and demark when it can be freed afterwards. Other callbacks are + provided for when the pattern is copied temporarily during rasterisation, or + more permanently as a snapshot in order to keep the pixel data available for + printing. + + .. versionadded:: 1.15 + """ + + def __init__(self, content: Content, width: int, height: int) -> None: + """ + :param content: + content type for the pixel data that will be returned. Knowing the + content type ahead of time is used for analysing the operation and + picking the appropriate rendering path. + :param width: + maximum size of the sample area + :param height: + maximum size of the sample area + + Creates a new user pattern for providing pixel data. + + Use the setter functions to associate callbacks with the returned pattern. + + .. versionadded:: 1.15 + """ + + def set_acquire(self, acquire: Optional[_AcquireCallback], release: Optional[_ReleaseCallback]) -> None: + """ + :param acquire: + acquire callback or :obj:`None` to unset it + :type acquire: :obj:`callable` + :param release: + (optional) release callback or :obj:`None` + :type release: :obj:`callable` + :raises Error: + + Specifies the callbacks used to generate the image surface for a + rendering operation (acquire) and the function used to cleanup that + surface afterwards. + + The acquire callback should create a surface (preferably an image + surface created to match the target using + :meth:`Surface.create_similar_image`) that defines at least the region + of interest specified by extents. The surface is allowed to be the + entire sample area, but if it does contain a subsection of the sample + area, the surface extents should be provided by setting the device + offset (along with its width and height) using + :meth:`Surface.set_device_offset`. + + .. function:: acquire(target, extents) + + :param Surface target: + the rendering target surface + :param RectangleInt extents: + rectangular region of interest in pixels in sample space + :rtype: Surface + + This function is called when a pattern is being rendered from. It + should create a surface that provides the pixel data for the + region of interest as defined by extents, though the surface + itself does not have to be limited to that area. For convenience + the surface should probably be of image type, created with + :meth:`Surface.create_similar_image` for the target (which enables + the number of copies to be reduced during transfer to the device). + Another option, might be to return a similar surface to the target + for explicit handling by the application of a set of cached + sources on the device. The region of sample data provided should + be defined using :meth:`Surface.set_device_offset` to specify the + top-left corner of the sample data (along with width and height of + the surface). + + .. function:: release(surface) + + :param Surface surface: + the surface created during acquire + + This function is called when the pixel data is no longer being + accessed by the pattern for the rendering operation. + + .. versionadded:: 1.15 + """ + + def get_acquire(self) -> Tuple[Optional[_AcquireCallback], Optional[_ReleaseCallback]]: + """ + :returns: a (acquire, release) tuple of callables or None as set + through :meth:`set_acquire` + + Queries the current acquire and release callbacks. + + .. versionadded:: 1.15 + """ + +class RecordingSurface(Surface): + """ + A *RecordingSurface* is a surface that records all drawing operations at the + highest level of the surface backend interface, (that is, the level of paint, + mask, stroke, fill, and show_text_glyphs). The recording surface can then be + "replayed" against any target surface by using it as a source surface. + + If you want to replay a surface so that the results in target will be + identical to the results that would have been obtained if the original + operations applied to the recording surface had instead been applied to the + target surface, you can use code like this:: + + cr = cairo.Context(target) + cr.set_source_surface(recording_surface, 0.0, 0.0) + cr.paint() + + A *RecordingSurface* is logically unbounded, i.e. it has no implicit + constraint on the size of the drawing surface. However, in practice this is + rarely useful as you wish to replay against a particular target surface with + known bounds. For this case, it is more efficient to specify the target + extents to the recording surface upon creation. + + The recording phase of the recording surface is careful to snapshot all + necessary objects (paths, patterns, etc.), in order to achieve accurate + replay. + + .. versionadded:: 1.11.0 + """ + + def __init__(self, content: Content, rectangle: Rectangle) -> None: + """ + :param content: the content for the new surface + :param rectangle: or None to record unbounded operations. + + Creates a *RecordingSurface* which can be used to record all drawing + operations at the highest level (that is, the level of paint, mask, stroke, + fill and show_text_glyphs). The *RecordingSurface* can then be "replayed" + against any target surface by using it as a source to drawing operations. + + The recording phase of the *RecordingSurface* is careful to snapshot all + necessary objects (paths, patterns, etc.), in order to achieve accurate + replay. + + .. versionadded:: 1.11.0 + """ + + def ink_extents(self) -> Tuple[float, float, float, float]: + """ + * x0: the x-coordinate of the top-left of the ink bounding box + * y0: the y-coordinate of the top-left of the ink bounding box + * width: the width of the ink bounding box + * height: the height of the ink bounding box + + Measures the extents of the operations stored within the + *RecordingSurface*. This is useful to compute the required size of an + *ImageSurface* (or equivalent) into which to replay the full sequence of + drawing operations. + + .. versionadded:: 1.11.0 + """ + + def get_extents(self) -> Optional[Rectangle]: + """ + :returns: a rectangle or :obj:`None` if the surface is unbounded. + + Get the extents of the recording-surface. + + .. versionadded:: 1.12.0 + """ + +class Region: + """ + Region is a simple graphical data type representing an area of + integer-aligned rectangles. They are often used on raster surfaces to track + areas of interest, such as change or clip areas. + + .. versionadded:: 1.11.0 + """ + + def __init__(self, rectangle: Union[RectangleInt, List[RectangleInt]]) -> None: + """ + :param rectangle_int: a rectangle or a list of rectangle + + Allocates a new empty region object or a region object with the + containing rectangle(s). + """ + + def copy(self) -> "Region": + """ + :returns: A newly allocated :class:`Region`. + + Allocates a new *Region* object copying the area from original. + """ + + def get_extents(self) -> RectangleInt: + """ + :returns: The bounding rectangle of region + """ + + def num_rectangles(self) -> int: + """ + :returns: The number of rectangles contained in region + """ + + def get_rectangle(self, nth: int) -> RectangleInt: + """ + :param nth: a number indicating which rectangle should be returned + :returns: The *nth* rectangle from the region + """ + + def is_empty(self) -> bool: + """ + :returns: Whether region is empty + """ + + def contains_point(self, x: int, y: int) -> bool: + """ + :param x: The x coordinate of a point + :param y: The y coordinate of a point + :returns: Whether (x , y) is contained in the region + """ + + def contains_rectangle(self, rectangle: RectangleInt) -> RegionOverlap: + """ + :param rectangle: a region + :returns: region overlap + + Checks whether rectangle is inside, outside or partially contained in + region + """ + + def equal(self, region: "Region") -> bool: + """ + :param region: a region + :returns: Whether both regions contained the same coverage + """ + + def translate(self, dx: int, dy: int) -> None: + """ + :param dx: Amount to translate in the x direction + :param dy: Amount to translate in the y direction + + Translates region by (dx , dy ). + """ + + def intersect(self, other: "Union[Region, RectangleInt]") -> "Region": + """ + :param other: region or rectangle + :returns: The intersection of the region and the passed region or + rectangle + """ + + def subtract(self, other: "Union[Region, RectangleInt]") -> "Region": + """ + :param other: region or rectangle + :returns: The result of the subtraction of the region and the passed + region or rectangle + """ + + def union(self, other: "Union[Region, RectangleInt]") -> "Region": + """ + :param other: region or rectangle + :returns: The union of the region and the passed region or rectangle + """ + + def xor(self, other: "Union[Region, RectangleInt]") -> "Region": + """ + :param other: region or rectangle + :returns: The exclusive difference of the region and the passed region + or rectangle + """ + +class ScriptDevice(Device): + """ + .. versionadded:: 1.14 + """ + + def __init__(self, fobj: Union[_FileLike, _PathLike]) -> None: + """ + :param fobj: a filename or writable file object. + + Creates a output device for emitting the script, used when creating the + individual surfaces. + """ + + def set_mode(self, mode: ScriptMode) -> None: + """ + :param mode: the new mode + + Change the output mode of the script + """ + + def get_mode(self) -> ScriptMode: + """ + :returns: the current output mode of the script + + Queries the script for its current output mode. + """ + + def write_comment(self, comment: str) -> None: + """ + :param comment: the string to emit + + Emit a string verbatim into the script. + """ + + def from_recording_surface(self, recording_surface: RecordingSurface) -> None: + """ + :param recording_surface: + the recording surface to replay + :raises cairo.Error: + + Converts the record operations in recording_surface into a script. + """ + +class ScriptSurface(Surface): + """ + The script surface provides the ability to render to a native script that + matches the cairo drawing model. The scripts can be replayed using tools + under the util/cairo-script directory, or with cairo-perf-trace. + + .. versionadded:: 1.14 + """ + + def __init__(self, script: ScriptDevice, content: Content, width: float, height: float) -> None: + """ + :param script: the script (output device) + :param content: the content of the surface + :param width: width in pixels + :param height: height in pixels + :raises cairo.Error: + + Create a new surface that will emit its rendering through ``script``. + """ + + @classmethod + def create_for_target(cls, script: ScriptDevice, target: Surface) -> "ScriptSurface": + """ + :param script: the script (output device) + :param target: a target surface to wrap + :raises cairo.Error: + + Create a proxy surface that will render to ``target`` and record the + operations to ``device``. + + .. versionadded:: 1.14 + """ + +class Win32Surface(Surface): + """ + The Microsoft Windows surface is used to render cairo graphics to Microsoft + Windows windows, bitmaps, and printing device contexts. + """ + + def __init__(self, hdc: int) -> None: + """ + :param hdc: the DC to create a surface for + :type hdc: int + + Creates a cairo surface that targets the given DC. The DC will be + queried for its initial clip extents, and this will be used as the size + of the cairo surface. The resulting surface will always be of format + cairo.FORMAT_RGB24, see :class:`cairo.Format`. + """ + +class Win32PrintingSurface(Surface): + """ + The Win32PrintingSurface is a multi-page vector surface type. + """ + + def __init__(self, hdc: int) -> None: + """ + :param hdc: the DC to create a surface for + :returns: the newly created surface + + Creates a cairo surface that targets the given DC. The DC will be queried + for its initial clip extents, and this will be used as the size of the + cairo surface. The DC should be a printing DC; antialiasing will be + ignored, and GDI will be used as much as possible to draw to the surface. + + The returned surface will be wrapped using the paginated surface to provide + correct complex rendering behaviour; :meth:`cairo.Surface.show_page` and + associated methods must be used for correct output. + """ + +class SolidPattern(Pattern): + + def __init__(self, red: float, green: float, blue: float, alpha: float=1.0) -> None: + """ + :param red: red component of the color + :param green: green component of the color + :param blue: blue component of the color + :param alpha: alpha component of the color + + Creates a new *SolidPattern* corresponding to a translucent color. The + color components are floating point numbers in the range 0 to 1. If the + values passed in are outside that range, they will be clamped. + """ + + def get_rgba(self) -> Tuple[float, float, float, float]: + """ + :returns: (red, green, blue, alpha) a tuple of float + + Gets the solid color for a *SolidPattern*. + + .. versionadded:: 1.4 + """ + +class SurfaceObserverMode(_IntEnum): + """ + Whether operations should be recorded. + + .. versionadded:: 1.14 + """ + + NORMAL: "SurfaceObserverMode" = ... + """no recording is done""" + + RECORD_OPERATIONS: "SurfaceObserverMode" = ... + """operations are recorded""" + +class TeeSurface(Surface): + """ + This surface supports redirecting all its input to multiple surfaces. + + .. versionadded:: 1.14 + """ + + def __init__(self, master: Surface) -> None: ... + + def add(self, target: Surface) -> None: + """ + :param target: + :raises cairo.Error: + + Add the surface + + .. versionadded:: 1.14 + """ + + def remove(self, target: Surface) -> None: + """ + :param target: + :raises cairo.Error: + + Remove the surface + + .. versionadded:: 1.14 + """ + + def index(self, index: int) -> Surface: + """ + :param index: + :raises cairo.Error: + + Returns the surface at index ``index``. The master surface is + at index 0. + + .. versionadded:: 1.14 + """ + +class ToyFontFace(FontFace): + """ + The *cairo.ToyFontFace* class can be used instead of :meth:`Context.select_font_face` to create a toy font independently of a context. + + .. versionadded:: 1.8.4 + """ + + def __init__(self, family: str, slant: FontSlant=..., weight: FontWeight=...) -> None: + """ + :param family: a font family name + :param slant: the font slant of the font, + defaults to :attr:`cairo.FontSlant.NORMAL`. + :param weight: the font weight of the font, + defaults to :attr:`cairo.FontWeight.NORMAL`. + + Creates a *ToyFontFace* from a triplet of family, slant, and weight. These + font faces are used in implementation of the the "toy" font API. + + If family is the zero-length string "", the platform-specific default + family is assumed. The default family then can be queried using + :meth:`.get_family`. + + The :meth:`Context.select_font_face` method uses this to create font + faces. See that function for limitations of toy font faces. + """ + + def get_family(self) -> str: + """ + :returns: the family name of a toy font + + .. versionadded:: 1.8.4 + """ + + def get_slant(self) -> FontSlant: + """ + :returns: the font slant value + + .. versionadded:: 1.8.4 + """ + + def get_weight(self) -> FontWeight: + """ + :returns: the font weight value + + .. versionadded:: 1.8.4 + """ + +class XCBSurface(Surface): + """ + The XCB surface is used to render cairo graphics to X Window System windows + and pixmaps using the XCB library. + + Note that the XCB surface automatically takes advantage of the X render + extension if it is available. + """ + + def __init__(self, connection: Any, drawable: Any, visualtype: Any, width: int, height: int) -> None: + """ + :param connection: an XCB connection + :param drawable: a X drawable + :param visualtype: a X visualtype + :param width: The surface width + :param height: The surface height + + Creates a cairo surface that targets the given drawable (pixmap or window). + + .. note:: This type isn't implemented. Please file a bug if you need it. + """ + + def set_size(self, width: int, height: int) -> None: + """ + :param width: The width of the surface + :param height: The height of the surface + + Informs cairo of the new size of the X Drawable underlying the surface. + For a surface created for a Window (rather than a Pixmap), this function + must be called each time the size of the window changes. (For a + subwindow, you are normally resizing the window yourself, but for a + toplevel window, it is necessary to listen for ConfigureNotify events.) + + A Pixmap can never change size, so it is never necessary to call this + function on a surface created for a Pixmap. + """ + +class XlibSurface(Surface): + """ + The XLib surface is used to render cairo graphics to X Window System windows + and pixmaps using the XLib library. + + Note that the XLib surface automatically takes advantage of X render + extension if it is available. + + .. note:: *XlibSurface* cannot be instantiated directly because Python + interaction with Xlib would require open source Python bindings to Xlib + which provided a C API. + However, an *XlibSurface* instance can be returned from a function call + when using pygtk http://www.pygtk.org/. + """ + + def get_depth(self) -> int: + """ + :returns: the number of bits used to represent each pixel value. + + .. versionadded:: 1.2 + """ + + def get_height(self) -> int: + """ + :returns: the height of the X Drawable underlying the surface in pixels. + + .. versionadded:: 1.2 + """ + + def get_width(self) -> int: + """ + :returns: the width of the X Drawable underlying the surface in pixels. + + .. versionadded:: 1.2 + """ + +def get_include() -> str: + """ + :returns: a path to the directory containing the C header files + + Gives the include path which should be passed to the compiler. + + .. versionadded:: 1.16.0 + """ + +MIME_TYPE_JP2: str = ... +""" +The Joint Photographic Experts Group (JPEG) 2000 image coding standard +(ISO/IEC 15444-1). + +.. versionadded:: 1.12.0 +""" + +MIME_TYPE_JPEG: str = ... +""" +The Joint Photographic Experts Group (JPEG) image coding standard (ISO/IEC +10918-1). + +.. versionadded:: 1.12.0 +""" + +MIME_TYPE_PNG: str = ... +""" +The Portable Network Graphics image file format (ISO/IEC 15948). + +.. versionadded:: 1.12.0 +""" + +MIME_TYPE_URI: str = ... +""" +URI for an image file (unofficial MIME type). + +.. versionadded:: 1.12.0 +""" + +MIME_TYPE_UNIQUE_ID: str = ... +""" +Unique identifier for a surface (cairo specific MIME type). All surfaces +with the same unique identifier will only be embedded once. + +.. versionadded:: 1.12.0 +""" + +MIME_TYPE_CCITT_FAX: str = ... +""" +Group 3 or Group 4 CCITT facsimile encoding (International +Telecommunication Union, Recommendations T.4 and T.6.) + +.. versionadded:: 1.18.0 Only available with cairo 1.15.10+ +""" + +MIME_TYPE_CCITT_FAX_PARAMS: str = ... +""" +Decode parameters for Group 3 or Group 4 CCITT facsimile encoding. See +`CCITT Fax Images +`__. + +.. versionadded:: 1.18.0 Only available with cairo 1.15.10+ +""" + +MIME_TYPE_EPS: str = ... +""" +Encapsulated PostScript file. Encapsulated PostScript File Format +Specification + +.. versionadded:: 1.18.0 Only available with cairo 1.15.10+ +""" + +MIME_TYPE_EPS_PARAMS: str = ... +""" +Embedding parameters Encapsulated PostScript data. See Embedding EPS files. + +.. versionadded:: 1.18.0 Only available with cairo 1.15.10+ +""" + +MIME_TYPE_JBIG2: str = ... +""" +Joint Bi-level Image Experts Group image coding standard (ISO/IEC 11544). + +.. versionadded:: 1.18.0 +""" + +MIME_TYPE_JBIG2_GLOBAL: str = ... +""" +Joint Bi-level Image Experts Group image coding standard (ISO/IEC 11544) +global segment. + +.. versionadded:: 1.18.0 +""" + +MIME_TYPE_JBIG2_GLOBAL_ID: str = ... +""" +An unique identifier shared by a JBIG2 global segment and all JBIG2 images +that depend on the global segment. + +.. versionadded:: 1.18.0 +""" + +TAG_DEST: str = ... +""" +Create a destination for a hyperlink. Destination tag attributes are +detailed at Destinations. + +.. versionadded:: 1.18.0 Only available with cairo 1.15.10+ +""" + +TAG_LINK: str = ... +""" +Create hyperlink. Link tag attributes are detailed at Links. + +.. versionadded:: 1.18.0 Only available with cairo 1.15.10+ +""" + +TAG_CONTENT: str = ... +""" +Create a content tag. + +.. versionadded:: 1.25.0 Only available with cairo 1.18.0+ +""" + +TAG_CONTENT_REF: str = ... +""" +Create a content reference tag. + +.. versionadded:: 1.25.0 Only available with cairo 1.18.0+ +""" + +CAPI: Any = ... + +ANTIALIAS_BEST = Antialias.BEST +ANTIALIAS_DEFAULT = Antialias.DEFAULT +ANTIALIAS_FAST = Antialias.FAST +ANTIALIAS_GOOD = Antialias.GOOD +ANTIALIAS_GRAY = Antialias.GRAY +ANTIALIAS_NONE = Antialias.NONE +ANTIALIAS_SUBPIXEL = Antialias.SUBPIXEL +CONTENT_ALPHA = Content.ALPHA +CONTENT_COLOR = Content.COLOR +CONTENT_COLOR_ALPHA = Content.COLOR_ALPHA +EXTEND_NONE = Extend.NONE +EXTEND_PAD = Extend.PAD +EXTEND_REFLECT = Extend.REFLECT +EXTEND_REPEAT = Extend.REPEAT +FILL_RULE_EVEN_ODD = FillRule.EVEN_ODD +FILL_RULE_WINDING = FillRule.WINDING +FILTER_BEST = Filter.BEST +FILTER_BILINEAR = Filter.BILINEAR +FILTER_FAST = Filter.FAST +FILTER_GAUSSIAN = Filter.GAUSSIAN +FILTER_GOOD = Filter.GOOD +FILTER_NEAREST = Filter.NEAREST +FONT_SLANT_ITALIC = FontSlant.ITALIC +FONT_SLANT_NORMAL = FontSlant.NORMAL +FONT_SLANT_OBLIQUE = FontSlant.OBLIQUE +FONT_WEIGHT_BOLD = FontWeight.BOLD +FONT_WEIGHT_NORMAL = FontWeight.NORMAL +FORMAT_A1 = Format.A1 +FORMAT_A8 = Format.A8 +FORMAT_ARGB32 = Format.ARGB32 +FORMAT_INVALID = Format.INVALID +FORMAT_RGB16_565 = Format.RGB16_565 +FORMAT_RGB24 = Format.RGB24 +FORMAT_RGB30 = Format.RGB30 +FORMAT_RGB96F = Format.RGB96F +FORMAT_RGBA128F = Format.RGBA128F +HINT_METRICS_DEFAULT = HintMetrics.DEFAULT +HINT_METRICS_OFF = HintMetrics.OFF +HINT_METRICS_ON = HintMetrics.ON +HINT_STYLE_DEFAULT = HintStyle.DEFAULT +HINT_STYLE_FULL = HintStyle.FULL +HINT_STYLE_MEDIUM = HintStyle.MEDIUM +HINT_STYLE_NONE = HintStyle.NONE +HINT_STYLE_SLIGHT = HintStyle.SLIGHT +LINE_CAP_BUTT = LineCap.BUTT +LINE_CAP_ROUND = LineCap.ROUND +LINE_CAP_SQUARE = LineCap.SQUARE +LINE_JOIN_BEVEL = LineJoin.BEVEL +LINE_JOIN_MITER = LineJoin.MITER +LINE_JOIN_ROUND = LineJoin.ROUND +OPERATOR_ADD = Operator.ADD +OPERATOR_ATOP = Operator.ATOP +OPERATOR_CLEAR = Operator.CLEAR +OPERATOR_COLOR_BURN = Operator.COLOR_BURN +OPERATOR_COLOR_DODGE = Operator.COLOR_DODGE +OPERATOR_DARKEN = Operator.DARKEN +OPERATOR_DEST = Operator.DEST +OPERATOR_DEST_ATOP = Operator.DEST_ATOP +OPERATOR_DEST_IN = Operator.DEST_IN +OPERATOR_DEST_OUT = Operator.DEST_OUT +OPERATOR_DEST_OVER = Operator.DEST_OVER +OPERATOR_DIFFERENCE = Operator.DIFFERENCE +OPERATOR_EXCLUSION = Operator.EXCLUSION +OPERATOR_HARD_LIGHT = Operator.HARD_LIGHT +OPERATOR_HSL_COLOR = Operator.HSL_COLOR +OPERATOR_HSL_HUE = Operator.HSL_HUE +OPERATOR_HSL_LUMINOSITY = Operator.HSL_LUMINOSITY +OPERATOR_HSL_SATURATION = Operator.HSL_SATURATION +OPERATOR_IN = Operator.IN +OPERATOR_LIGHTEN = Operator.LIGHTEN +OPERATOR_MULTIPLY = Operator.MULTIPLY +OPERATOR_OUT = Operator.OUT +OPERATOR_OVER = Operator.OVER +OPERATOR_OVERLAY = Operator.OVERLAY +OPERATOR_SATURATE = Operator.SATURATE +OPERATOR_SCREEN = Operator.SCREEN +OPERATOR_SOFT_LIGHT = Operator.SOFT_LIGHT +OPERATOR_SOURCE = Operator.SOURCE +OPERATOR_XOR = Operator.XOR +PATH_CLOSE_PATH = PathDataType.CLOSE_PATH +PATH_CURVE_TO = PathDataType.CURVE_TO +PATH_LINE_TO = PathDataType.LINE_TO +PATH_MOVE_TO = PathDataType.MOVE_TO +PDF_VERSION_1_4 = PDFVersion.VERSION_1_4 +PDF_VERSION_1_5 = PDFVersion.VERSION_1_5 +PDF_VERSION_1_6 = PDFVersion.VERSION_1_6 +PDF_VERSION_1_7 = PDFVersion.VERSION_1_7 +PS_LEVEL_2 = PSLevel.LEVEL_2 +PS_LEVEL_3 = PSLevel.LEVEL_3 +REGION_OVERLAP_IN = RegionOverlap.IN +REGION_OVERLAP_OUT = RegionOverlap.OUT +REGION_OVERLAP_PART = RegionOverlap.PART +SCRIPT_MODE_ASCII = ScriptMode.ASCII +SCRIPT_MODE_BINARY = ScriptMode.BINARY +STATUS_CLIP_NOT_REPRESENTABLE = Status.CLIP_NOT_REPRESENTABLE +STATUS_DEVICE_ERROR = Status.DEVICE_ERROR +STATUS_DEVICE_FINISHED = Status.DEVICE_FINISHED +STATUS_DEVICE_TYPE_MISMATCH = Status.DEVICE_TYPE_MISMATCH +STATUS_FILE_NOT_FOUND = Status.FILE_NOT_FOUND +STATUS_FONT_TYPE_MISMATCH = Status.FONT_TYPE_MISMATCH +STATUS_INVALID_CLUSTERS = Status.INVALID_CLUSTERS +STATUS_INVALID_CONTENT = Status.INVALID_CONTENT +STATUS_INVALID_DASH = Status.INVALID_DASH +STATUS_INVALID_DSC_COMMENT = Status.INVALID_DSC_COMMENT +STATUS_INVALID_FORMAT = Status.INVALID_FORMAT +STATUS_INVALID_INDEX = Status.INVALID_INDEX +STATUS_INVALID_MATRIX = Status.INVALID_MATRIX +STATUS_INVALID_MESH_CONSTRUCTION = Status.INVALID_MESH_CONSTRUCTION +STATUS_INVALID_PATH_DATA = Status.INVALID_PATH_DATA +STATUS_INVALID_POP_GROUP = Status.INVALID_POP_GROUP +STATUS_INVALID_RESTORE = Status.INVALID_RESTORE +STATUS_INVALID_SIZE = Status.INVALID_SIZE +STATUS_INVALID_SLANT = Status.INVALID_SLANT +STATUS_INVALID_STATUS = Status.INVALID_STATUS +STATUS_INVALID_STRIDE = Status.INVALID_STRIDE +STATUS_INVALID_STRING = Status.INVALID_STRING +STATUS_INVALID_VISUAL = Status.INVALID_VISUAL +STATUS_INVALID_WEIGHT = Status.INVALID_WEIGHT +STATUS_JBIG2_GLOBAL_MISSING = Status.JBIG2_GLOBAL_MISSING +STATUS_LAST_STATUS = Status.LAST_STATUS +STATUS_NEGATIVE_COUNT = Status.NEGATIVE_COUNT +STATUS_NO_CURRENT_POINT = Status.NO_CURRENT_POINT +STATUS_NO_MEMORY = Status.NO_MEMORY +STATUS_NULL_POINTER = Status.NULL_POINTER +STATUS_PATTERN_TYPE_MISMATCH = Status.PATTERN_TYPE_MISMATCH +STATUS_READ_ERROR = Status.READ_ERROR +STATUS_SUCCESS = Status.SUCCESS +STATUS_SURFACE_FINISHED = Status.SURFACE_FINISHED +STATUS_SURFACE_TYPE_MISMATCH = Status.SURFACE_TYPE_MISMATCH +STATUS_TEMP_FILE_ERROR = Status.TEMP_FILE_ERROR +STATUS_USER_FONT_ERROR = Status.USER_FONT_ERROR +STATUS_USER_FONT_IMMUTABLE = Status.USER_FONT_IMMUTABLE +STATUS_USER_FONT_NOT_IMPLEMENTED = Status.USER_FONT_NOT_IMPLEMENTED +STATUS_WRITE_ERROR = Status.WRITE_ERROR +SUBPIXEL_ORDER_BGR = SubpixelOrder.BGR +SUBPIXEL_ORDER_DEFAULT = SubpixelOrder.DEFAULT +SUBPIXEL_ORDER_RGB = SubpixelOrder.RGB +SUBPIXEL_ORDER_VBGR = SubpixelOrder. VBGR +SUBPIXEL_ORDER_VRGB = SubpixelOrder.VRGB +SURFACE_OBSERVER_NORMAL = SurfaceObserverMode.NORMAL +SURFACE_OBSERVER_RECORD_OPERATIONS = SurfaceObserverMode.RECORD_OPERATIONS +SVG_VERSION_1_1 = SVGVersion.VERSION_1_1 +SVG_VERSION_1_2 = SVGVersion.VERSION_1_2 +TEXT_CLUSTER_FLAG_BACKWARD = TextClusterFlags.BACKWARD +PDF_METADATA_TITLE = PDFMetadata.TITLE +PDF_METADATA_AUTHOR = PDFMetadata.AUTHOR +PDF_METADATA_SUBJECT = PDFMetadata.SUBJECT +PDF_METADATA_KEYWORDS = PDFMetadata.KEYWORDS +PDF_METADATA_CREATOR = PDFMetadata.CREATOR +PDF_METADATA_CREATE_DATE = PDFMetadata.CREATE_DATE +PDF_METADATA_MOD_DATE = PDFMetadata.MOD_DATE +SVG_UNIT_USER = SVGUnit.USER +SVG_UNIT_EM = SVGUnit.EM +SVG_UNIT_EX = SVGUnit.EX +SVG_UNIT_PX = SVGUnit.PX +SVG_UNIT_IN = SVGUnit.IN +SVG_UNIT_CM = SVGUnit.CM +SVG_UNIT_MM = SVGUnit.MM +SVG_UNIT_PT = SVGUnit.PT +SVG_UNIT_PC = SVGUnit.PC +SVG_UNIT_PERCENT = SVGUnit.PERCENT +STATUS_TAG_ERROR = Status.TAG_ERROR +STATUS_FREETYPE_ERROR = Status.FREETYPE_ERROR +STATUS_WIN32_GDI_ERROR = Status.WIN32_GDI_ERROR +STATUS_PNG_ERROR = Status.PNG_ERROR +STATUS_DWRITE_ERROR = Status.DWRITE_ERROR +STATUS_SVG_FONT_ERROR = Status.SVG_FONT_ERROR +PDF_OUTLINE_FLAG_OPEN = PDFOutlineFlags.OPEN +PDF_OUTLINE_FLAG_BOLD = PDFOutlineFlags.BOLD +PDF_OUTLINE_FLAG_ITALIC = PDFOutlineFlags.ITALIC +COLOR_MODE_DEFAULT = ColorMode.DEFAULT +COLOR_MODE_NO_COLOR = ColorMode.NO_COLOR +COLOR_MODE_COLOR = ColorMode.COLOR +DITHER_NONE = Dither.NONE +DITHER_DEFAULT = Dither.DEFAULT +DITHER_FAST = Dither.FAST +DITHER_GOOD = Dither.GOOD +DITHER_BEST = Dither.BEST diff --git a/venv/lib/python3.12/site-packages/cairo/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/cairo/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..db37010cc274332a76680b596cb6e33c09406258 GIT binary patch literal 1208 zcmZ`&&r2IY6rR~^lC?=pC0eYxEac(}W~m+`7>&?Fdk_!x)E}^HcgJMox*KLT(MTdW z2sOQk(2^eQsfsOn=zr0RHU(wrttW4mlu~-?%qFR6s1N4NzW2WO=6&;KKSd(90F|HX z53;W~0KPG!E7bO+HB7e#(18w3@PUIs=eEHUSoTT$C8QwTCF&clt z(_E-?CV0v3@GDUFZ3|UU=kwkAJ(+oy*(Wz3gMBb+IzrcX#QLJr-K+41Dxo&6S686U zA9Z@GavZ3D3fHZJxeB)oJRj`w!R0o?K-E|A<)gjT+TYIYuJ5|`GLZb6bB~Zy#1;`% zv7kCR(XmA*heX}LNONpl7B$;)RKqf?tQWX1=8&o*EUp+PBA2Y{lGY*X9l@?WMpw(B z>NRYDI?Q{4e^s90`lRyrx;7w=!<#byGotHEN(wGXK9^@~+yL4zh(lbzK`0}M!)$0S zXA{EiSFHVhDid6i*N|?gvR*KYL@tz_oNZ0&s3co9)=LG;!D?A9A*&>t#`8{mI(ctO zCWeD13#zuNW)YD!)xfr_DD{P{G-5kpzhk7-$sH0@sv^CWv^GPo@K)WF0 zRQ;-fi|EkqdVPI&tG@L{Z$=ZJqq7IxaquvB965}f=*{ujQ(?A6vA_*>s!0Qw{XK0~ zLCVll*N`hs~oKRr}CS5ermD3TwC*-_yR zKgBB;HZ0<(rs-LjjoE8}u#t#V7BG9yZm5Sb9;F_hE>fY2@@xfwfA9wn{pqU!7{1d; z?WG!-z0Cg9yVTp%d1Cr3G5zsjGcnhU&DRz$Vj~_Py_en(9~jNpOl|Rd00@ztXJ3M2 z7t#2s5bw9y0e3G#qvxTCv(Uu*nUlxOQ0A1+;0SGCN#fjq;?2tI>=1bFcHcsJ&DM)1 bn#XYpWv`kHQg!8n5Pk(Ct-uIefFAx2G&&97 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/cairo/_cairo.cpython-312-x86_64-linux-gnu.so b/venv/lib/python3.12/site-packages/cairo/_cairo.cpython-312-x86_64-linux-gnu.so new file mode 100755 index 0000000000000000000000000000000000000000..91ee3a7e2c3880f10a6400efe074bf54126234ec GIT binary patch literal 265512 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 <}Xdk)3h@WcbU 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

    + + CI Status + + + Documentation Status + + + Test coverage percentage + +

    +

    + + Poetry + + + black + + + pre-commit + +

    +

    + + PyPI Version + + Supported Python versions + License +

    + +A faster version of dbus-next originally from the [great DBus next library](https://github.com/altdesktop/python-dbus-next) ❤️ + +## Installation + +Install this via pip (or your favourite package manager): + +`pip install dbus-fast` + +[Documentation](https://dbus-fast.readthedocs.io/en/latest/) + +dbus-fast is a Python library for DBus that aims to be a performant fully featured high level library primarily geared towards integration of applications into Linux desktop and mobile environments. + +Desktop application developers can use this library for integrating their applications into desktop environments by implementing common DBus standard interfaces or creating custom plugin interfaces. + +Desktop users can use this library to create their own scripts and utilities to interact with those interfaces for customization of their desktop environment. + +dbus-fast plans to improve over other DBus libraries for Python in the following ways: + +- Zero dependencies and pure Python 3 +- An optional cython extension is available to speed up (un)marshalling +- Focus on performance +- Support for multiple IO backends including asyncio and the GLib main loop. +- Nonblocking IO suitable for GUI development. +- Target the latest language features of Python for beautiful services and clients. +- Complete implementation of the DBus type system without ever guessing types. +- Integration tests for all features of the library. +- Completely documented public API. + +## Installing + +This library is available on PyPi as [dbus-fast](https://pypi.org/project/dbus-fast/). + +``` +pip3 install dbus-fast +``` + +## The Client Interface + +To use a service on the bus, the library constructs a proxy object you can use to call methods, get and set properties, and listen to signals. + +For more information, see the [overview for the high-level client](https://dbus-fast.readthedocs.io/en/latest/high-level-client/index.html). + +This example connects to a media player and controls it with the [MPRIS](https://specifications.freedesktop.org/mpris-spec/latest/) DBus interface. + +```python +from dbus_fast.aio import MessageBus + +import asyncio + + +async def main(): + bus = await MessageBus().connect() + # the introspection xml would normally be included in your project, but + # this is convenient for development + introspection = await bus.introspect('org.mpris.MediaPlayer2.vlc', '/org/mpris/MediaPlayer2') + + obj = bus.get_proxy_object('org.mpris.MediaPlayer2.vlc', '/org/mpris/MediaPlayer2', introspection) + player = obj.get_interface('org.mpris.MediaPlayer2.Player') + properties = obj.get_interface('org.freedesktop.DBus.Properties') + + # call methods on the interface (this causes the media player to play) + await player.call_play() + + volume = await player.get_volume() + print(f'current volume: {volume}, setting to 0.5') + + await player.set_volume(0.5) + + # listen to signals + def on_properties_changed(interface_name, changed_properties, invalidated_properties): + for changed, variant in changed_properties.items(): + print(f'property changed: {changed} - {variant.value}') + + properties.on_properties_changed(on_properties_changed) + + await asyncio.Event().wait() + +asyncio.run(main()) +``` + +## The Service Interface + +To define a service on the bus, use the `ServiceInterface` class and decorate class methods to specify DBus methods, properties, and signals with their type signatures. + +For more information, see the [overview for the high-level service](https://python-dbus-fast.readthedocs.io/en/latest/high-level-service/index.html). + +```python +from dbus_fast.service import ServiceInterface, method, dbus_property, signal, Variant +from dbus_fast.aio MessageBus + +import asyncio + +class ExampleInterface(ServiceInterface): + def __init__(self, name): + super().__init__(name) + self._string_prop = 'kevin' + + @method() + def Echo(self, what: 's') -> 's': + return what + + @method() + def GetVariantDict() -> 'a{sv}': + return { + 'foo': Variant('s', 'bar'), + 'bat': Variant('x', -55), + 'a_list': Variant('as', ['hello', 'world']) + } + + @dbus_property() + def string_prop(self) -> 's': + return self._string_prop + + @string_prop.setter + def string_prop_setter(self, val: 's'): + self._string_prop = val + + @signal() + def signal_simple(self) -> 's': + return 'hello' + +async def main(): + bus = await MessageBus().connect() + interface = ExampleInterface('test.interface') + bus.export('/test/path', interface) + # now that we are ready to handle requests, we can request name from D-Bus + await bus.request_name('test.name') + # wait indefinitely + await asyncio.Event().wait() + +asyncio.run(main()) +``` + +## The Low-Level Interface + +The low-level interface works with DBus messages directly. + +For more information, see the [overview for the low-level interface](https://python-dbus-fast.readthedocs.io/en/latest/low-level-interface/index.html). + +```python +from dbus_fast.message import Message, MessageType +from dbus_fast.aio import MessageBus + +import asyncio +import json + + +async def main(): + bus = await MessageBus().connect() + + reply = await bus.call( + Message(destination='org.freedesktop.DBus', + path='/org/freedesktop/DBus', + interface='org.freedesktop.DBus', + member='ListNames')) + + if reply.message_type == MessageType.ERROR: + raise Exception(reply.body[0]) + + print(json.dumps(reply.body[0], indent=2)) + + +asyncio.run(main()) +``` + +## Projects that use python-dbus-fast + +- [Bluetooth Adapters](https://github.com/bluetooth-devices/bluetooth-adapters) + +## Contributing + +Contributions are welcome. Development happens on [Github](https://github.com/Bluetooth-Devices/dbus-fast). + +Before you commit, run `pre-commit run --all-files` to run the linter, code formatter, and the test suite. + +## Copyright + +You can use this code under an MIT license (see LICENSE). + +- © 2019, Tony Crisci +- © 2022, Bluetooth Devices authors + +## Contributors ✨ + +Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)): + + + + + + + + +This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome! + +## Credits + +This package was created with +[Cookiecutter](https://github.com/audreyr/cookiecutter) and the +[browniebroke/cookiecutter-pypackage](https://github.com/browniebroke/cookiecutter-pypackage) +project template. + diff --git a/venv/lib/python3.12/site-packages/dbus_fast-2.24.4.dist-info/RECORD b/venv/lib/python3.12/site-packages/dbus_fast-2.24.4.dist-info/RECORD new file mode 100644 index 0000000..8347532 --- /dev/null +++ b/venv/lib/python3.12/site-packages/dbus_fast-2.24.4.dist-info/RECORD @@ -0,0 +1,82 @@ +dbus_fast-2.24.4.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +dbus_fast-2.24.4.dist-info/LICENSE,sha256=w36cdREOAdHwxTYNx9d3ajCsX3DSRA2yFEI-S3p3pq8,1083 +dbus_fast-2.24.4.dist-info/METADATA,sha256=x7_jwyIfPNaBS0DzzMGQZpyfDKnHNONxxUBFfm221KQ,10659 +dbus_fast-2.24.4.dist-info/RECORD,, +dbus_fast-2.24.4.dist-info/WHEEL,sha256=DTNILNjAIdgAw3pW4Q0CegrJVLbFMsUNs089XTGst8U,149 +dbus_fast/__init__.py,sha256=yzyP91zF-Ccc7CcAw6yUIE7W9FaVbktIhDFvUHRf9uk,1948 +dbus_fast/__pycache__/__init__.cpython-312.pyc,, +dbus_fast/__pycache__/__version__.cpython-312.pyc,, +dbus_fast/__pycache__/auth.cpython-312.pyc,, +dbus_fast/__pycache__/constants.cpython-312.pyc,, +dbus_fast/__pycache__/errors.cpython-312.pyc,, +dbus_fast/__pycache__/introspection.cpython-312.pyc,, +dbus_fast/__pycache__/main.cpython-312.pyc,, +dbus_fast/__pycache__/message.cpython-312.pyc,, +dbus_fast/__pycache__/message_bus.cpython-312.pyc,, +dbus_fast/__pycache__/proxy_object.cpython-312.pyc,, +dbus_fast/__pycache__/send_reply.cpython-312.pyc,, +dbus_fast/__pycache__/service.cpython-312.pyc,, +dbus_fast/__pycache__/signature.cpython-312.pyc,, +dbus_fast/__pycache__/unpack.cpython-312.pyc,, +dbus_fast/__pycache__/validators.cpython-312.pyc,, +dbus_fast/__version__.py,sha256=k5Bo9d3YurLsmyrHEs3Y7UjbkX-00_LGJ_1NQkz4z5U,401 +dbus_fast/_private/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +dbus_fast/_private/__pycache__/__init__.cpython-312.pyc,, +dbus_fast/_private/__pycache__/_cython_compat.cpython-312.pyc,, +dbus_fast/_private/__pycache__/address.cpython-312.pyc,, +dbus_fast/_private/__pycache__/constants.cpython-312.pyc,, +dbus_fast/_private/__pycache__/marshaller.cpython-312.pyc,, +dbus_fast/_private/__pycache__/unmarshaller.cpython-312.pyc,, +dbus_fast/_private/__pycache__/util.cpython-312.pyc,, +dbus_fast/_private/_cython_compat.py,sha256=IVr_uS6HqBav_83YxPPPuU9S90bLdHEm3jRH3WevCZ0,211 +dbus_fast/_private/address.cpython-312-x86_64-linux-gnu.so,sha256=jDPjZz1L9fa9wgPYdGq11fbJQ-zx5J5jLApxdiYVe1s,913656 +dbus_fast/_private/address.pxd,sha256=1RKICTK01HOk253rRCqmgFCD3NDXXHbEKPyQvUIvtLU,287 +dbus_fast/_private/address.py,sha256=huyPmBWbNTEuf7YvmV8f2pLEcMdqzl3u23KJccQ5gsg,4024 +dbus_fast/_private/constants.py,sha256=EPQOEwOi3rwg39R2k3YMrACsHLK7J5g6JXUqO8cG6_M,275 +dbus_fast/_private/marshaller.cpython-312-x86_64-linux-gnu.so,sha256=yFUli6bln7iGh-sRnB9q7lpsaxAEgPRBd--mWxMHPZw,1296552 +dbus_fast/_private/marshaller.pxd,sha256=m3nDbsBAT05pUcm9tJq0cbX6koMRPkAizNnjA2D3Qu8,2669 +dbus_fast/_private/marshaller.py,sha256=8Y0HfXC5FEqKXMaXw42saHJw5KOtK-6q9u7aKnM6NmE,7847 +dbus_fast/_private/unmarshaller.cpython-312-x86_64-linux-gnu.so,sha256=v6yrCh2eTU1UjjAEnvbh8fwwocmA0uPJGSgjUy_YLbU,2134224 +dbus_fast/_private/unmarshaller.pxd,sha256=cizHQaJfrHhowwik7FbONQRtjSwWv1hzyROdPAwlX80,6524 +dbus_fast/_private/unmarshaller.py,sha256=BCtdgwDI5EBGcuFG9BS4eQMyJshTVP6M0D2DsBMe2gs,30520 +dbus_fast/_private/util.py,sha256=o_f44092YKEegm1h6czJEIPaose67syTFjk45d1yShA,5660 +dbus_fast/aio/__init__.py,sha256=gJuzuS4GB66voxTVVu-c__-wBD-g-XhSqEVU5TcVMYs,90 +dbus_fast/aio/__pycache__/__init__.cpython-312.pyc,, +dbus_fast/aio/__pycache__/message_bus.cpython-312.pyc,, +dbus_fast/aio/__pycache__/message_reader.cpython-312.pyc,, +dbus_fast/aio/__pycache__/proxy_object.cpython-312.pyc,, +dbus_fast/aio/message_bus.py,sha256=x65yrK-hZEHr-Ba46vSAPtftklz1mle2cNheji1Jeok,20183 +dbus_fast/aio/message_reader.cpython-312-x86_64-linux-gnu.so,sha256=4CdfksW4htk1GGAA_ClgXYFHHhZrtRT0VKVX01YS0gs,530352 +dbus_fast/aio/message_reader.pxd,sha256=aC5SXPLJcaJ-UR0q1RLNZ5f4Q4qgJWH5FegT9xanJDo,226 +dbus_fast/aio/message_reader.py,sha256=CvT8tuYgV1pVCyhFg8Z1Qs7Y4usf25yYoCnrKLOgq0w,1613 +dbus_fast/aio/proxy_object.py,sha256=ck3Z6Kne4foMrPxf3IjcDGsA-6rPdqvgTpxMBm5WjkI,7045 +dbus_fast/auth.py,sha256=x8xLth82We4roIkxALRx9ii4CtV6wo-tuabMB8PxUt4,4408 +dbus_fast/constants.py,sha256=iFknCEaXhSPx9SR1kMfKJdZYplVjgoxQ9Q9SOh-7le4,5495 +dbus_fast/errors.py,sha256=-tNkM1wgyAUNhCPbuMC6X8-QYSGqkY266JMFd3FjjoQ,1982 +dbus_fast/glib/__init__.py,sha256=gJuzuS4GB66voxTVVu-c__-wBD-g-XhSqEVU5TcVMYs,90 +dbus_fast/glib/__pycache__/__init__.cpython-312.pyc,, +dbus_fast/glib/__pycache__/message_bus.cpython-312.pyc,, +dbus_fast/glib/__pycache__/proxy_object.cpython-312.pyc,, +dbus_fast/glib/message_bus.py,sha256=aeFwSvltlbOFimBE7G8uydRS6OHgE55Ld1KvOfTDl3s,16455 +dbus_fast/glib/proxy_object.py,sha256=Gl7fGRRECboW66csjImwpjA4j4Frn3k6ZFhooGJ4H7U,10724 +dbus_fast/introspection.py,sha256=0tn90FBScnt79IeLG4zX_fpNK5xiHcNHaK9Vc6yExh0,22597 +dbus_fast/main.py,sha256=zUkqAk0jOjJG4EOWTwWtVomh9eiP9P35g8XoP3c1yrQ,53 +dbus_fast/message.cpython-312-x86_64-linux-gnu.so,sha256=3exLpwcCpsKVB4cECpMBJeYgSijjOU1KvV--2aaE_Z4,1188256 +dbus_fast/message.pxd,sha256=QV4d11nxc1ND1RpzI8MD1NOlBd0Fd_JAWVjKvwnSPdg,1287 +dbus_fast/message.py,sha256=gB8uOB9CyNh8qql-keRytAlOEYn5i_siEIGZiNDbXcw,12432 +dbus_fast/message_bus.cpython-312-x86_64-linux-gnu.so,sha256=0Gn-3Qg9Yyx41SsUdWYXltB_3C8pMgJdmGoQOMs5ygg,4405448 +dbus_fast/message_bus.pxd,sha256=A1BjLX5_EKHCymmAIJHhIaLZSx9QsLOBrmSp28rdbS8,1866 +dbus_fast/message_bus.py,sha256=TSBIXhsIMjLR0eD5K0o3WWgqY3_woXPhcFOWJEuBuA4,47386 +dbus_fast/proxy_object.py,sha256=17FLHcGTl-kMIeCfkTKpVG-QKIlYF58cPW0DLKio8Lg,14103 +dbus_fast/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +dbus_fast/send_reply.py,sha256=0A_WoGLGlc2HCgKhCtp4NQqoMEie-N8sUDJYvMzoaN0,1637 +dbus_fast/service.cpython-312-x86_64-linux-gnu.so,sha256=picZJsiXvr4foJinlqf4_O9C4I-e5CzZPDOApKbtZ4s,2882176 +dbus_fast/service.pxd,sha256=PXKGvBGRtvmtQ3UMGAMiTFvr1uoHwzxJaMYtElcpeQY,1105 +dbus_fast/service.py,sha256=joBujuPx1rD9V61fk2CUPC0VRhCY1nCKtv2PzD0WPOQ,23516 +dbus_fast/signature.cpython-312-x86_64-linux-gnu.so,sha256=0zX1WphvzTqpEgFRlW1YtdlxJr7phV0JMOA573YF6Go,2142408 +dbus_fast/signature.pxd,sha256=6zWBiEkZB5mQ0b9BSyC8YnnHHBA93rvH3VJq-xfWpJw,480 +dbus_fast/signature.py,sha256=uz2JOC1fNcPPuOnBjdqVbQcxQR2rgl-YZcMEP1Pybno,16875 +dbus_fast/unpack.cpython-312-x86_64-linux-gnu.so,sha256=YTKh9H1zBDGv53xAddJABzxKlkzfSOj6HwUucK9JxVs,341624 +dbus_fast/unpack.pxd,sha256=jwrWP1loFA5YT9DCNb0TZubJACJgckzuNZCXtlrgdB8,181 +dbus_fast/unpack.py,sha256=xhV38jJZJKas-RG92_dJhKbNuHfWgmo5DD_76t2gwfg,622 +dbus_fast/validators.py,sha256=LId-6u87hhm7D4XGe3N_kSzX6rO5I9QRVTlHH8rdYbs,5239 diff --git a/venv/lib/python3.12/site-packages/dbus_fast-2.24.4.dist-info/WHEEL b/venv/lib/python3.12/site-packages/dbus_fast-2.24.4.dist-info/WHEEL new file mode 100644 index 0000000..80847da --- /dev/null +++ b/venv/lib/python3.12/site-packages/dbus_fast-2.24.4.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: poetry-core 1.9.1 +Root-Is-Purelib: false +Tag: cp312-cp312-manylinux_2_17_x86_64 +Tag: cp312-cp312-manylinux2014_x86_64 + diff --git a/venv/lib/python3.12/site-packages/dbus_fast/__init__.py b/venv/lib/python3.12/site-packages/dbus_fast/__init__.py new file mode 100644 index 0000000..28fbe47 --- /dev/null +++ b/venv/lib/python3.12/site-packages/dbus_fast/__init__.py @@ -0,0 +1,82 @@ +from . import introspection, message_bus, proxy_object, service +from .constants import ( + ArgDirection, + BusType, + ErrorType, + MessageFlag, + MessageType, + NameFlag, + PropertyAccess, + ReleaseNameReply, + RequestNameReply, +) +from .errors import ( + AuthError, + DBusError, + InterfaceNotFoundError, + InvalidAddressError, + InvalidBusNameError, + InvalidInterfaceNameError, + InvalidIntrospectionError, + InvalidMemberNameError, + InvalidMessageError, + InvalidObjectPathError, + InvalidSignatureError, + SignalDisabledError, + SignatureBodyMismatchError, +) +from .message import Message +from .signature import SignatureTree, SignatureType, Variant +from .unpack import unpack_variants +from .validators import ( + assert_bus_name_valid, + assert_interface_name_valid, + assert_member_name_valid, + assert_object_path_valid, + is_bus_name_valid, + is_interface_name_valid, + is_member_name_valid, + is_object_path_valid, +) + +__all__ = [ + "introspection", + "message_bus", + "proxy_object", + "service", + "ArgDirection", + "BusType", + "ErrorType", + "MessageFlag", + "MessageType", + "NameFlag", + "PropertyAccess", + "ReleaseNameReply", + "RequestNameReply", + "AuthError", + "DBusError", + "InterfaceNotFoundError", + "InvalidAddressError", + "InvalidBusNameError", + "InvalidInterfaceNameError", + "InvalidIntrospectionError", + "InvalidMemberNameError", + "InvalidMessageError", + "InvalidObjectPathError", + "InvalidSignatureError", + "SignalDisabledError", + "SignatureBodyMismatchError", + "Message", + "SignatureTree", + "SignatureType", + "Variant", + "assert_bus_name_valid", + "assert_interface_name_valid", + "assert_member_name_valid", + "assert_object_path_valid", + "is_bus_name_valid", + "is_interface_name_valid", + "is_member_name_valid", + "is_object_path_valid", + "unpack_variants", +] diff --git a/venv/lib/python3.12/site-packages/dbus_fast/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/dbus_fast/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a00d77dff5f5ace863173a3e67dbc785c3cf7b6c GIT binary patch literal 1680 zcmbu9OK;>v5P{cwp)OX>xOdjzvQ4*V zV2=C>E}XdWC-?)L5Vw}lB5~q|h@wcG=<;}yedGYbhfmd2)m5(Q>i((Gs2ckF@vD#f z-&uz7J1r((Ar~%w)55ogZ}?_tpa~`xpnydvVhKtn=?mc$mZ6LmSXhAy+F)Z9s#t>> z)}f9KXkZhXnQt+i#u=EwS(wE+n8Oyda31Ed4Q=c|2Nz%g7hw^XUD!hXmuz{PfiCeIh>B`|Y?!ZnaTj5>Ygqi^_??@c%y*-rHjQguSZ_o{ajm> zCAk;|J?_}5ek}SYfynn*j|cMkDB;TfNQhWuV(oMs=Sj%=YO=^Il{1DsQ#YT9IN>54 z9rt?LTg{yFkTc22;hZPoh%{dgxJ<7#PD9zpgY;#VNZBVk^H}UWjZ!XNupU2)(w>c)VnG2Sh2>+mFytQ+#Ypyg|)$FV;;4J5L(H|~dHDl5gg6G!W5xQ&^O)?6@pEmr$E#Q zbwY#CBuo=#2(yGaLW?j@XcIbw1;Qd>iLgvqA*>SC2=E_} z4q;Q{%yE@*TOG>o#gR<);mQA0k}7k$p7MW}rmXyt$ZAx!oQ&;T<*M>{va)hiHJc%p z(jWZGJ}ArcSQvWV55|S=i1D}QN-=bi`vG(PBpgUL8Kp1d=)mVgH;RQnO!RBUM(&VD zLpKb%x&7hcd+)n4NcjOxx_;iI>(gw%U@~<*J#Rtkd56hJRgN(B2OJ4*hsFirug-q0 L@Qo!N>ahO+MNsCm literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/dbus_fast/__pycache__/__version__.cpython-312.pyc b/venv/lib/python3.12/site-packages/dbus_fast/__pycache__/__version__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e17ec02b670ce8137ae606caac7fa703a4e6a96f GIT binary patch literal 647 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 Y2R>zEpR$ANkzG>mdh|;M6}j5~0NpDWp#T5? literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/dbus_fast/__pycache__/introspection.cpython-312.pyc b/venv/lib/python3.12/site-packages/dbus_fast/__pycache__/introspection.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..99f8842e1a0e73e2b748374fce91924182cb6783 GIT binary patch literal 27518 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 LJ)bccl41P+39ND~ literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/dbus_fast/__pycache__/main.cpython-312.pyc b/venv/lib/python3.12/site-packages/dbus_fast/__pycache__/main.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..511ea455151cac507c73357ad0a43ca3705568fb GIT binary patch literal 362 zcmXv~u};G<5IsAk6iOx*Ho9hLtrj5`#KORqB^wOLt=$rlIFX$M1$F4a09&{63;YB> zzz?9T{6M5IF>#LClkUBD^4)uqzg+haus)w|7U#%6cGy*SE1DA&8xSBt5Ns-8-WASE z=a!TmZ?B?ij6JEkT4uRcGrBWCw%WmNju1Amge7@K6@W+l5AdkA3)*fNs|JI=J7#pj zVktt-L>lFWrDgVzsG*PrQ;8Nusxr+>R!CK_D4cHJ&qm`3Ghrr&DW5&^g)~e|b8|oE zCSx%V)hI11hYO*57({GhA7KUGeRoaYE>?bnBlsSzoDdW2mbPD@4=n5>RK3eM5qTu9 fv^{M-PEphjA*7~+9KT-IfV2);dJlf>)EfK)&rei7 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/dbus_fast/__pycache__/message.cpython-312.pyc b/venv/lib/python3.12/site-packages/dbus_fast/__pycache__/message.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..43158bfc21644624b065d54f4618f8b3c8828dc6 GIT binary patch literal 14380 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/dbus_fast/__pycache__/message_bus.cpython-312.pyc b/venv/lib/python3.12/site-packages/dbus_fast/__pycache__/message_bus.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a15a96034c087105899ab4b118e2e838e1923153 GIT binary patch literal 52344 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/dbus_fast/__pycache__/proxy_object.cpython-312.pyc b/venv/lib/python3.12/site-packages/dbus_fast/__pycache__/proxy_object.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a17512ab9c90a754e49a0f3fc3ef221e42a1e26f GIT binary patch literal 19349 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/dbus_fast/__pycache__/service.cpython-312.pyc b/venv/lib/python3.12/site-packages/dbus_fast/__pycache__/service.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..df81c1d14c611818f66dd942ef6192dcb9f08dd9 GIT binary patch literal 28853 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 HY_|P>X%V^{ literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/dbus_fast/__pycache__/signature.cpython-312.pyc b/venv/lib/python3.12/site-packages/dbus_fast/__pycache__/signature.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1a24fb9c5f63f378b970edcf28c14b92316bc115 GIT binary patch literal 20767 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 TSUSI4`E-VXEu9k9M!Nlf>_Z)l literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/dbus_fast/__pycache__/unpack.cpython-312.pyc b/venv/lib/python3.12/site-packages/dbus_fast/__pycache__/unpack.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..01732af3d7f60023fd7890e0801628fba27bdd3c GIT binary patch literal 1270 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 R#Kj=SM`lJw#v*1Q3ji&AH%b5i literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/dbus_fast/_private/__pycache__/_cython_compat.cpython-312.pyc b/venv/lib/python3.12/site-packages/dbus_fast/_private/__pycache__/_cython_compat.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d66d732937a907d558ef013395f2f0f856923fae GIT binary patch literal 669 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/dbus_fast/_private/__pycache__/constants.cpython-312.pyc b/venv/lib/python3.12/site-packages/dbus_fast/_private/__pycache__/constants.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6e3a298ab094f487265bb1fae95d49ec4d8b5e83 GIT binary patch literal 755 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 QKdv+M?^6D_od);+0&e(nj{pDw literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/dbus_fast/_private/__pycache__/util.cpython-312.pyc b/venv/lib/python3.12/site-packages/dbus_fast/_private/__pycache__/util.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..45dc82797518c7fa62c0a821475441a785fe204a GIT binary patch literal 7831 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 XhkVo^mD@YZ+&J(EOw}MocH;j4`6cMM literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/dbus_fast/_private/_cython_compat.py b/venv/lib/python3.12/site-packages/dbus_fast/_private/_cython_compat.py new file mode 100644 index 0000000..27c9626 --- /dev/null +++ b/venv/lib/python3.12/site-packages/dbus_fast/_private/_cython_compat.py @@ -0,0 +1,12 @@ +"""Stub for when Cython is not available.""" + + +class FakeCython: + """Stub for when Cython is not available.""" + + @property + def compiled(self) -> bool: + return False + + +FAKE_CYTHON = FakeCython() diff --git a/venv/lib/python3.12/site-packages/dbus_fast/_private/address.cpython-312-x86_64-linux-gnu.so b/venv/lib/python3.12/site-packages/dbus_fast/_private/address.cpython-312-x86_64-linux-gnu.so new file mode 100755 index 0000000000000000000000000000000000000000..ae924bc7506505a64af8ab308c6383a66663f935 GIT binary patch literal 913656 zcmeFad3;nw);Hb(0s+B}3mUf}YS5tKB#zNUh^8UHZR}{+1Vtx72m-Ri(9r-Y(R7?# z+h9f=#bss~of#RIkx@qxkqKc5;1+R185Q??iAdZKaWwDud#bAYrb*B9d_KST_utzy za;r|AI(6!tQ>RWX_h#v+(C8j1DL(V-={w)YT+ulSQlty=odG(9GGD&0FaAB*caq@t zij^FkSbc_qnWryZ<=I9mlQ}A%_}nv0@noLfdeUB{<~iY6oTccQr?*~j6lMNi)ysUm z>vKhaRd1H&&(!MyFze;(dilDZdA4ab%ri}q@sUUVmrnxSJT;p>^CT{RrJsgpFzwVS z!imr0H9hk*^~Rwd`TXDhOgG2t_L9kEmu}BIb$6w2N20Nw_;1WblYAS0o{+oe`G;2g zG60r@FSDRXK@la9Fl~eO)$Xj__;etzj`KV z_wyw5Z%txX_a}jWnWVpM=-1(ig9Z7!lknd=3IA6mY4_U#g*VH6(&Q4-iElKc) zB!QEm;=Lt#ZUy-E0bG7M4q#g$bV`Qeu7E(8J=W3wj{xSC<*;#N%VVu z68N)8`2Rx^{Amz;cYdZl37<=n$a6=M{%%VGe=~_aY)%5NOv2~XB>cRWM4mq+;b&|T zxiu$|+mA`)Ge3zPzLA8_B}w}AdJ;N|lkk5*68tNZ@P9-S{JbRnIyH%2#wX$Dnk4Oh zmZaU^C!zD#B=UJ637>yYLg%a`_K*+ynfNd9$1uLTaj_4G-ND~Y!q3Je?T!bXlM)+6 zzB7s3>?Cx~OJcW`N%S=`37suT?DIR&Kg@TuZ`X4W2!0?dKg!^6tR`dYKMg-h;Qf7{ zT&?gm*!L;uAMQKEH<1GwKfP@8`O3>k$&%X*qqiUv?OP5;9zmQ2dEdL74H;V2aYfSX350l+2L7UNnAXAdUaJ* z#SEZPZ5LKhl`)k9pxrv)PL9tOYX+yHbJ%Cd{2Zol;b&x<$dBS5{)Q zrwUa^g|mw)YRF|t#k{i7RTZoc7GRVBET~#U-5cSK)D6b-6RQ+IWus`L<15gag|n}% z7>UL}rz})4?b?b&sIIMXMl1?fEJVY`xC8TN#0(Ro4uh#|BnJT)rtC@=EWCLB+(m(^ zt7u)uGKwoWP&|O{=;?N?X$xloQ`?YwD3ygOuC17>uz)aP+QJH5g(D3Rie(IXH$RD; zkFTB|o;|N(^0cb?dX%C9bE9fl+YF8}Xq9rSxKhbZH=<>)b7Mx9O`30{t6?%~CRa?m zdVIx9_CAhUTrpS1=;/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%0DIT=mkPM<+LkL{thwHGr!7ur=}xVeoL?*! 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

    6^&YS!+# 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/cairo/include/py3cairo.h b/venv/lib/python3.12/site-packages/cairo/include/py3cairo.h new file mode 100644 index 0000000..0e3d938 --- /dev/null +++ b/venv/lib/python3.12/site-packages/cairo/include/py3cairo.h @@ -0,0 +1,266 @@ +/* -*- mode: C; c-basic-offset: 2 -*- + * + * Pycairo - Python bindings for cairo + * + * Copyright © 2003 James Henstridge + * Copyright © 2004-2011 Steven Chaplin + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + */ + +#ifndef _PYCAIRO_H_ +#define _PYCAIRO_H_ + +#include + +#include + + +typedef struct { + PyObject_HEAD + cairo_t *ctx; + PyObject *base; /* base object used to create context, or NULL */ +} PycairoContext; + +typedef struct { + PyObject_HEAD + cairo_font_face_t *font_face; +} PycairoFontFace; + +#define PycairoToyFontFace PycairoFontFace + +typedef struct { + PyObject_HEAD + cairo_font_options_t *font_options; +} PycairoFontOptions; + +typedef struct { + PyObject_HEAD + cairo_matrix_t matrix; +} PycairoMatrix; + +typedef struct { + PyObject_HEAD + cairo_path_t *path; +} PycairoPath; + +typedef struct { + PyObject_HEAD + cairo_pattern_t *pattern; + PyObject *base; /* base object used to create pattern, or NULL */ +} PycairoPattern; + +typedef struct { + PyObject_HEAD + cairo_rectangle_int_t rectangle_int; +} PycairoRectangleInt; + +typedef struct { + PyObject_HEAD + cairo_region_t *region; +} PycairoRegion; + +#define PycairoSolidPattern PycairoPattern +#define PycairoSurfacePattern PycairoPattern +#define PycairoGradient PycairoPattern +#define PycairoLinearGradient PycairoPattern +#define PycairoRadialGradient PycairoPattern + +typedef struct { + PyObject_HEAD + cairo_scaled_font_t *scaled_font; +} PycairoScaledFont; + +typedef struct { + PyObject_HEAD + cairo_surface_t *surface; + PyObject *base; /* base object used to create surface, or NULL */ +} PycairoSurface; + +#define PycairoImageSurface PycairoSurface +#define PycairoPDFSurface PycairoSurface +#define PycairoPSSurface PycairoSurface +#define PycairoRecordingSurface PycairoSurface +#define PycairoSVGSurface PycairoSurface +#define PycairoWin32Surface PycairoSurface +#define PycairoWin32PrintingSurface PycairoSurface +#define PycairoXCBSurface PycairoSurface +#define PycairoXlibSurface PycairoSurface + +/* get C object out of the Python wrapper */ +#define PycairoContext_GET(obj) (((PycairoContext *)(obj))->ctx) + +/* Define structure for C API. */ +typedef struct { + /* (type object, constructor) pairs */ + PyTypeObject *Context_Type; + PyObject *(*Context_FromContext)(cairo_t *ctx, PyTypeObject *type, + PyObject *base); + PyTypeObject *FontFace_Type; + PyTypeObject *ToyFontFace_Type; + PyObject *(*FontFace_FromFontFace)(cairo_font_face_t *font_face); + PyTypeObject *FontOptions_Type; + PyObject *(*FontOptions_FromFontOptions)( + cairo_font_options_t *font_options); + PyTypeObject *Matrix_Type; + PyObject *(*Matrix_FromMatrix)(const cairo_matrix_t *matrix); + PyTypeObject *Path_Type; + PyObject *(*Path_FromPath)(cairo_path_t *path); + + PyTypeObject *Pattern_Type; + PyTypeObject *SolidPattern_Type; + PyTypeObject *SurfacePattern_Type; + PyTypeObject *Gradient_Type; + PyTypeObject *LinearGradient_Type; + PyTypeObject *RadialGradient_Type; + PyObject *(*Pattern_FromPattern)(cairo_pattern_t *pattern, PyObject *base); + + PyTypeObject *ScaledFont_Type; + PyObject *(*ScaledFont_FromScaledFont)(cairo_scaled_font_t *scaled_font); + + PyTypeObject *Surface_Type; + PyTypeObject *ImageSurface_Type; + PyTypeObject *PDFSurface_Type; + PyTypeObject *PSSurface_Type; + PyTypeObject *SVGSurface_Type; + PyTypeObject *Win32Surface_Type; + PyTypeObject *Win32PrintingSurface_Type; + PyTypeObject *XCBSurface_Type; + PyTypeObject *XlibSurface_Type; + PyObject *(*Surface_FromSurface)(cairo_surface_t *surface, PyObject *base); + + /* misc functions */ + int (*Check_Status)(cairo_status_t status); + + PyTypeObject *RectangleInt_Type; + PyObject *(*RectangleInt_FromRectangleInt)( + const cairo_rectangle_int_t *rectangle_int); + + PyTypeObject *Region_Type; + PyObject *(*Region_FromRegion)(cairo_region_t *region); + + PyTypeObject *RecordingSurface_Type; +} Pycairo_CAPI_t; + + +#ifndef _INSIDE_PYCAIRO_ + +/* Macros for accessing the C API */ +#define PycairoContext_Type *(Pycairo_CAPI->Context_Type) +#define PycairoContext_FromContext (Pycairo_CAPI->Context_FromContext) +#define PycairoFontFace_Type *(Pycairo_CAPI->FontFace_Type) +#define PycairoToyFontFace_Type *(Pycairo_CAPI->ToyFontFace_Type) +#define PycairoFontFace_FromFontFace (Pycairo_CAPI->FontFace_FromFontFace) +#define PycairoFontOptions_Type *(Pycairo_CAPI->FontOptions_Type) +#define PycairoFontOptions_FromFontOptions \ + (Pycairo_CAPI->FontOptions_FromFontOptions) +#define PycairoMatrix_Type *(Pycairo_CAPI->Matrix_Type) +#define PycairoMatrix_FromMatrix (Pycairo_CAPI->Matrix_FromMatrix) +#define PycairoPath_Type *(Pycairo_CAPI->Path_Type) +#define PycairoPath_FromPath (Pycairo_CAPI->Path_FromPath) + +#define PycairoPattern_Type *(Pycairo_CAPI->Pattern_Type) +#define PycairoSolidPattern_Type *(Pycairo_CAPI->SolidPattern_Type) +#define PycairoSurfacePattern_Type *(Pycairo_CAPI->SurfacePattern_Type) +#define PycairoGradient_Type *(Pycairo_CAPI->Gradient_Type) +#define PycairoLinearGradient_Type *(Pycairo_CAPI->LinearGradient_Type) +#define PycairoRadialGradient_Type *(Pycairo_CAPI->RadialGradient_Type) +#define PycairoPattern_FromPattern (Pycairo_CAPI->Pattern_FromPattern) + +#define PycairoRectangleInt_Type *(Pycairo_CAPI->RectangleInt_Type) +#define PycairoRectangleInt_FromRectangleInt \ + (Pycairo_CAPI->RectangleInt_FromRectangleInt) + +#define PycairoRegion_Type *(Pycairo_CAPI->Region_Type) +#define PycairoRegion_FromRegion (Pycairo_CAPI->Region_FromRegion) + +#define PycairoScaledFont_Type *(Pycairo_CAPI->ScaledFont_Type) +#define PycairoScaledFont_FromScaledFont \ + (Pycairo_CAPI->ScaledFont_FromScaledFont) + +#define PycairoSurface_Type *(Pycairo_CAPI->Surface_Type) +#define PycairoImageSurface_Type *(Pycairo_CAPI->ImageSurface_Type) + +#ifdef CAIRO_HAS_PDF_SURFACE +#define PycairoPDFSurface_Type *(Pycairo_CAPI->PDFSurface_Type) +#endif + +#ifdef CAIRO_HAS_PS_SURFACE +#define PycairoPSSurface_Type *(Pycairo_CAPI->PSSurface_Type) +#endif + +#ifdef CAIRO_HAS_RECORDING_SURFACE +#define PycairoRecordingSurface_Type \ + *(Pycairo_CAPI->RecordingSurface_Type) +#endif + +#ifdef CAIRO_HAS_SVG_SURFACE +#define PycairoSVGSurface_Type *(Pycairo_CAPI->SVGSurface_Type) +#endif + +#ifdef CAIRO_HAS_WIN32_SURFACE +#define PycairoWin32Surface_Type *(Pycairo_CAPI->Win32Surface_Type) +#define PycairoWin32PrintingSurface_Type \ + *(Pycairo_CAPI->Win32PrintingSurface_Type) +#endif + +#ifdef CAIRO_HAS_XCB_SURFACE +#define PycairoXCBSurface_Type *(Pycairo_CAPI->XCBSurface_Type) +#endif + +#ifdef CAIRO_HAS_XLIB_SURFACE +#define PycairoXlibSurface_Type *(Pycairo_CAPI->XlibSurface_Type) +#endif + +#define PycairoSurface_FromSurface (Pycairo_CAPI->Surface_FromSurface) + +#define Pycairo_Check_Status (Pycairo_CAPI->Check_Status) + +#ifdef PYCAIRO_NO_IMPORT + +extern Pycairo_CAPI_t *Pycairo_CAPI; + +#else + +/* To access the Pycairo C API, the client module should call 'import_cairo()' + * from the init function, and check the return value, < 0 means the + * import failed. + */ +Pycairo_CAPI_t *Pycairo_CAPI; + +/* Return -1 on error, 0 on success. + * PyCapsule_Import will set an exception if there's an error. + */ +static inline int +import_cairo(void) +{ + Pycairo_CAPI = (Pycairo_CAPI_t*) PyCapsule_Import("cairo.CAPI", 0); + return (Pycairo_CAPI != 0) ? 0 : -1; +} + +#endif + +#endif /* ifndef _INSIDE_PYCAIRO_ */ + +#endif /* ifndef _PYCAIRO_H_ */ diff --git a/venv/lib/python3.12/site-packages/cairo/py.typed b/venv/lib/python3.12/site-packages/cairo/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/venv/lib/python3.12/site-packages/dbus/__init__.py b/venv/lib/python3.12/site-packages/dbus/__init__.py new file mode 100644 index 0000000..8cf3989 --- /dev/null +++ b/venv/lib/python3.12/site-packages/dbus/__init__.py @@ -0,0 +1,93 @@ +"""\ +Implements the public API for a D-Bus client. See the dbus.service module +to export objects or claim well-known names. +""" + +# Copyright (C) 2003, 2004, 2005, 2006 Red Hat Inc. +# Copyright (C) 2003 David Zeuthen +# Copyright (C) 2004 Rob Taylor +# Copyright (C) 2005, 2006 Collabora Ltd. +# +# SPDX-License-Identifier: MIT +# +# Permission is hereby granted, free of charge, to any person +# obtaining a copy of this software and associated documentation +# files (the "Software"), to deal in the Software without +# restriction, including without limitation the rights to use, copy, +# modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +# DEALINGS IN THE SOFTWARE. + +__all__ = [ + # from _dbus + 'Bus', 'SystemBus', 'SessionBus', 'StarterBus', + + # from proxies + 'Interface', + + # from _dbus_bindings + 'get_default_main_loop', 'set_default_main_loop', + + 'validate_interface_name', 'validate_member_name', + 'validate_bus_name', 'validate_object_path', + 'validate_error_name', + + 'BUS_DAEMON_NAME', 'BUS_DAEMON_PATH', 'BUS_DAEMON_IFACE', + 'LOCAL_PATH', 'LOCAL_IFACE', 'PEER_IFACE', + 'INTROSPECTABLE_IFACE', 'PROPERTIES_IFACE', + + 'ObjectPath', 'ByteArray', 'Signature', 'Byte', 'Boolean', + 'Int16', 'UInt16', 'Int32', 'UInt32', 'Int64', 'UInt64', + 'Double', 'String', 'Array', 'Struct', 'Dictionary', + + # from exceptions + 'DBusException', + 'MissingErrorHandlerException', 'MissingReplyHandlerException', + 'ValidationException', 'IntrospectionParserException', + 'UnknownMethodException', 'NameExistsException', + + # submodules + 'service', 'mainloop', 'lowlevel' + ] + +from dbus._compat import is_py2 + +__docformat__ = 'restructuredtext' + +# OLPC Sugar compatibility +import dbus.exceptions as exceptions +import dbus.types as types + +from _dbus_bindings import __version__ +version = tuple(map(int, __version__.split('.'))) + +from _dbus_bindings import ( + get_default_main_loop, set_default_main_loop, validate_bus_name, + validate_error_name, validate_interface_name, validate_member_name, + validate_object_path) +from _dbus_bindings import ( + BUS_DAEMON_IFACE, BUS_DAEMON_NAME, BUS_DAEMON_PATH, INTROSPECTABLE_IFACE, + LOCAL_IFACE, LOCAL_PATH, PEER_IFACE, PROPERTIES_IFACE) + +from dbus.exceptions import ( + DBusException, IntrospectionParserException, MissingErrorHandlerException, + MissingReplyHandlerException, NameExistsException, UnknownMethodException, + ValidationException) +from _dbus_bindings import ( + Array, Boolean, Byte, ByteArray, Dictionary, Double, Int16, Int32, Int64, + ObjectPath, Signature, String, Struct, UInt16, UInt32, UInt64) + +from dbus._dbus import Bus, SystemBus, SessionBus, StarterBus +from dbus.proxies import Interface diff --git a/venv/lib/python3.12/site-packages/dbus/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/dbus/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fdb51649c4fb1ac528472edb7583f23ab7ddb689 GIT binary patch literal 2150 zcmb`IOK;mo5P(VRY1)eA_!ZfX%{Z|WIk6PmdA|_ZRvH(vEm%$udniGP8-)pnB$kwH z^^~8`p4v+K znu6E2yB{<@JfN%c7*Ylq4+TF7OjGD$sS(b%C zHVDVraTsDlFwBNwgpI%`8;wruMV~P?1}E4F$gv!ZvvHVU6EMjp;Uqf=Q*0{o)9`7h z*)-@(hg0kn%&-|a%}&D^b_QnIY~<62vF6wuoMmU>96JYjmWO#Z59ir=xWF#J0$YFr zD?pJI;Uc>Ti);~=*b*$WWw^vH!DV(iiqr30fvfB)Tw~YZI=c=x*o{b^ac;sbc1u;- ziTtrocGtmoIB+)%^zbp){btRv>w2lOu0QgGZt80bE6qT!J2tu$^eX3(n^kKDg@B8e zUFSM@R@32H=;?gV_e7|BwI{re0Wm<`F>TOyx#KK6b-i6zcTM0yLCY6p3F85ZIpEkwa62TtqJGE=rHgI+r629vT*ZWHz190Mm92$MbwS61-DA)-oO2GDB|I zhY<`qUJk!D0EZeE9qr(2ZLJyn*Rk_ThHr+C<JQ&CJ2bVNQb zXb_4RAx=n;RuxHFZp)NmSY91p7zNXDQ0R~5fl>DWKM=8qZZZ=&;S2#YM2~^UgCBMU ze(gu)$QZVL9>_#zIcAW~sM)TCy%UIKikS$TIILt0Okc)qHTq*{3$QOLG{?u&nph%||4V;)ZmaX8oW%^cUzTXk| z@hJLd48BDC8BdQP!y}GL^s{U(s=2_-dQc-7rR>pr<=6=!!K8t<2 z`h9Nxi-{j|^FQR~zh2(Y75B3j_qD}mse^b-9Y0VIF9-+e9`)vdf_OHs7Wj8oqgr@FUpL#hfnwq)FoXM literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/dbus/__pycache__/_compat.cpython-312.pyc b/venv/lib/python3.12/site-packages/dbus/__pycache__/_compat.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cc3a0c1bde1637a530440c13a46cc5ddd4bc4fcf GIT binary patch literal 467 zcmYL_KTiTN7{=QxG$7*QpbVO>Bp!{p8V!SgCS!~-k%bgm;P7ah_U_C%5x<0f1><+{ z3pn9|-bCW$M#ARgU4ZxueSdHJ!V}+}UDLULDiUEk}9J;Ed>yd7FsFRW4#U&)>@#D-cc6IkK}wJJ`KjctNG+tTsD zveuLJNEquW+45vpCHWy6D3fe7tQ96muTP9o<^{~NrG9UzH4z;O?lH=>A6mMIbh(JA zRE9@d28P8n5;CH`*IvFK)b{JtdVz2?>)f%PurynkwmNF4Sy0n)QaBtc9{S?Ql+&c_ zL+o*S%n*cdz7Ak%S}c$7XK`bMrwC8b<``{GP-ToN&y5eX^R>1;b6|06j!+5D0LtST L0=ZpNN@x55ioJf8 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/dbus/__pycache__/_dbus.cpython-312.pyc b/venv/lib/python3.12/site-packages/dbus/__pycache__/_dbus.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7af9fcce9f850ae6936eda46c7e27a4382b0f114 GIT binary patch literal 8710 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/dbus/__pycache__/_expat_introspect_parser.cpython-312.pyc b/venv/lib/python3.12/site-packages/dbus/__pycache__/_expat_introspect_parser.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6df6d853a432d9ea98ecf18fa892fe6d774f94d7 GIT binary patch literal 3186 zcmaJ@Uu+vi8lTx+JI?>4Nu&HBWz)16lh%fYKf%`o^-!8rq6RKO;v$_k8}G*5V6V;W zIJHx!RH!GV{82-7cP^^XMJI$(^#LRv;0cK*9(ZZmldx7j@xar)MGZ&@Uhey5?TwqJ zH`30|eE;T~Z+`R5_kC+?6M^>4`Ki?Ft%Ur9lUfT@2RmahC=-JiG)*#ej#3;;X(=Pm z$&^TBiWu@`Vko9^OZIf;0!H96nF|(!k%s>wDMH}6)^+=TgKXKc>0PR>kn zD{Fhq$wJc1;WX*l@p@XF>^upBGBL>OCMhb0wUQY_qn3%d=PXZ5Dy z${9W9hAdmN7WJg*Ho_=l@^e|kl^rXUtgV0xN$}w|c1}W9CKf3X4MtuwD9n6mF++LL z#H<pr-oUQp{n?v5aY0dd$eB^G+;R1YhjqhPfQGv&>k| zL1^@1Y}vGzV`*!l${&qBb0X$g+&rGslW*xM(}@`ipsksOoX$1NkEfOsp^oN?Zb$>V z#WiiEqZ*B9jWPtzIESFSL@Hee*OU)JmEL~%wO0BD;MXRIABJ{7f+YQ2!bE{jMCdaZ zlnJkkhaugnO0G(VT#|NURU%8Mx2J)GZy6+ld)P1q2|uPKX{m7^33{vQ0fn<#5`cbC zYKBCV#7f|e+0)0zT&m7Sf(&iC%?tU(MU!dVEO57LhU<(^rp=6L^J(2S(k62|Cv9U7 zDd2%B1O_59YePGVp>y30dQo@Kw5qDC9a#ZETxqQZUrfWmai*ZVMDBGCUQcZ}cRNSc zf|bFcwcx)){gtDUAC8W19UaHn;mUCMhv65uhF`>)S_!pXZMo92K8tegT~`ZN3Ty4G z6Ko~@Fu}w>q5}|`GKK|+dz*6z=zjQjxlU(^8uTr=ZLGN@8B!mx>MubNz+FU}`{{Oo zuKbX$50OXdvFAWf5qdE==34IAb&41PBUl5M5fqYrB~qaKgT`n;uU8c@9@I zl)xOoO(xQTV(S^x4c0P(&QflpVKFZ=xsqkO3NPl&h{6zl3=!taDU-8i7*#>Q29esN zbIz=VJU5*OaKH`%cV(c4f_NPFzcD@XZT%!tsjw)aLVB z>WOvb@2%T1dGZhIiR~ac*jE)P+zG!>85-F}@N=*H~k8~^%CrE9P} z@zKP_$R@wr_3YQmovxE;eEQn-Mw2kQ)qUb0(_poG9J(h)*P|Yy>d)6l)UV*miA8f@Cf(H}tqSKrfsx?j537wLww0^0kpgd9xu!Y?1EV&?DP$4wx? z9s^khxFQU5r%R*tun>q~A~#4PHwaibXsDVISPzU>`f5mcD8Iyk?ci+%95lCI9e;0p zFAfeP1a{B&%{xb*tDKtruJ_yCb)_8oD0IF1pMxI{Zgy?;9oyueU%Yv7t8aX(W1=!N zysrGMtuinO`l0Ox^2GD&QTVm=iNj7rLikwVP0%#ANz*b}BcH}`i>AGu*V9!_qoz6O zEO#`Gb%2+wA3H?1*w{@XjEUUG@OVV`I1HQt=q{5=#|xLv+?SL<&;6EQp!a@9V_?`SE4uQCvwfoyVQ_Y=|y^;o+kzQ&*VIf$oh|fmOq(1&ump!4J*l2s4{Yv zol@uL{p1q$vda9t>Of|&Q;y2BDnDm7!4sh-q0)hB$kwsuQL~Gxo=zjvVrtm3!z#QM za2}ARoMS4yNHzOHw|)(%VQfA9&>H{8zA&+CKH4M*lLbAKOPgvo&vSVmk9$<~^n&2y z2wOOr%|uO4I65O1pUhYs9F4wen=@jg;kX)h!p9!1cUBZ&XK+D$ah{R#yKPgqLsP$R%gFl8IRG}^?HwRD8c)gcr~MQ1Hvt$Vpb+jXWYSSl zc`yf#4T?pt{%ObZ5eU_y+wpc3%q}d!)939OJ!B);VU6L{G@+ATZkS-t0u589qe2IM gQ2NUlp(FnxV?Qg0>7lj7p9%bSrfD~wrozJi02PAP%K!iX literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/dbus/__pycache__/bus.cpython-312.pyc b/venv/lib/python3.12/site-packages/dbus/__pycache__/bus.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b2b5c29305f2d3f22a8f539c1ab4eccf2cdffdff GIT binary patch literal 16566 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 X(h~tcPx{0&Zn62DlTQWu<-`AP51>nD literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/dbus/__pycache__/connection.cpython-312.pyc b/venv/lib/python3.12/site-packages/dbus/__pycache__/connection.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f3e7d070605b87ffca2a74c841189eaaddd5b91b GIT binary patch literal 25124 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/dbus/__pycache__/decorators.cpython-312.pyc b/venv/lib/python3.12/site-packages/dbus/__pycache__/decorators.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fe2a313e8b8eceb5b606708db195d2f2f5907c8c GIT binary patch literal 14695 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/dbus/__pycache__/exceptions.cpython-312.pyc b/venv/lib/python3.12/site-packages/dbus/__pycache__/exceptions.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..84afff62df50bff77177828c46b543f67658523b GIT binary patch literal 5201 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/dbus/__pycache__/gi_service.cpython-312.pyc b/venv/lib/python3.12/site-packages/dbus/__pycache__/gi_service.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3285a0cc8a30bd8e65a94acb20a37853968bc098 GIT binary patch literal 2718 zcma)7&u`OK9DjD~#!V9nl%=#Q;Q;g2N6>-Jz2vjm!2A?9vRTWL^)GrX6-G3cKvI_Z&NEOOa+N?|q#2 z_4oJp^L~!SB7iM^O!h5V%m#)dJMb0>ZjOU=CX)IA=Kp z=v)1ONQuix zUMQ^iERoIcy?`9=Pqq}>r~`_82M4Gq2B@=FL6xiW)lkp~9B|rAR+Kt&0V;ZJ9lW*n z|EIS?OO;M^VHT3xEz4eZW!aTvSvPfuB7r5(4g1-1V|&s^YZX!r;tHlxLasQc5JcRN zraFWvWV!$MZi?XfR0(OilG1FWOj35mDOl#1hUQbIg|&Ixbg)uM%_DO@W$1JM`FQf} z3n`*IXv|jBdrBUW6!RpN*X5v+b_I7+GmAs}>ck403<5|}3381tOJG~-UF%)#txLl- zX}B(p)}+xVBI!>3WlD0O^Ft zGQ)zUnTg19$9?MO25TN*uu)_Eu$0=%0XZSyx@6J zYIgDB6xWhuLaINV6av8h=%K%6l+MpOsD_Hc9I;dX(I``G_zm`{@ERF9Wo;R;DlQ+P za=R`0x~k%aZ-KU6yFrV)8{d~ai2bS{$LZ9|uer}T`hB}$4{Xx|n6emfaS$5a{gDv9 z6*@yv;S-`VK|{VtTUA#KeG$=_hsYS%*SuXb!;w zGBjwJ6c!XC2d&(0qvu&vY0E?{>&)+LJ_rn3Ho}gMh-X+=ojrzp3Wj!D%r{7o!|XAl zrP-rtDXa9}Xh*q6$)s6eb}7+2KsOAi7{m)kXRK~xTHY4t zGl$tjiTzc7Ix)FYki)cl^wszhAy;69c6)-*X~FOS?Z-se4cV6Mc9m^Sp{Chrc;k*4 z7h^W9Zr6<02#GFNAjrt!H`&RMcXDrm#z8zyc#!@>*ob=$Lysuj{(YPl&>0?~g5&Iq z1-dMOoe^+2zP7l!_+a$0_N@2Z(tC}8laB@;4sM;g^7PcRfp@lq_#fect?*k7>Cjqi zHMSK$`&>$F3qAK|mS^h1P)!(mFk2JOKmO;lIG}@1XDH@h)zPdvNAa>S3xrI9?kZ z-<i#{z3wMryIf>4KaFOUY5Vm){QTXdOT5! bC$@yq#*wp)!>3<_crn}zi+$2^ujkr-ao3Di literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/dbus/__pycache__/glib.cpython-312.pyc b/venv/lib/python3.12/site-packages/dbus/__pycache__/glib.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cac23a190cf8f019057bbd689b1f3c77a89bc373 GIT binary patch literal 1130 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 Rdxeko`j0xDA3H>({}(N>)ZzdD literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/dbus/__pycache__/server.cpython-312.pyc b/venv/lib/python3.12/site-packages/dbus/__pycache__/server.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..380541131763d028209bf059bd02ac3b496135b1 GIT binary patch literal 4062 zcmd57&-6`tKCsnuUZOSY6aax#%DCxl{BPShY^i?)sfs6ZVeh>WCQ8!VT*BXQ;B z?q+65hK368AfP_9Kn@M8p6X)^13mRz^xjJqJCL$KfB;1gxzSbv1UdD++2x<)=GGzu zaCUy)ym|AzZ{8dJV|sdmK>1s1WBbZ1A^*ZoucVX4aS)x>q8lN|pA`o9B<7y)ZYSp};!mI7PUE$uehQfzH+yqvaE zd!(E}i^^km25Q|NgL+&gY=TYhJUy&BZr@kpZ+SYAS^OTEnM8(ukIb3dM5h?vMv$cY;@M^MW(g`m*z{E#*T+iJKp^r_>C(1h*GkWt&=V1wH( z(zf5A^@a$kXjGGhAvHZ)s$-7a2pq;d8*F2=&cd2+4_RfHw$1F9DVPfONHHHJ<$62_ z^*v*7h*&(awz%nd7Aw-V{Ohku`I6ORAHq8ZKlJ|bD^Pu`+#w-+;}RmSvh0#SOcJt7 zc9mUqSKCe9Pc#7fig_2rfL20s4?y-jOqFQA=B=SSo!Lr0hJqO!0Z#Q30=UU{#^JZa!y1-R0$GjQC?BhHh% z_1rbG8|w16s9kM{{6I|}AV_W&@}N&VbW?rQTvTua+-$Qgv*CtFqQT-((MsKPJlFRF zJdxb7H;^v@C!6don7an{R+%(`8qVXixU4Mq6tsZ z2e&E+d>%5JR@<~vah)ncRjCY)kkg_xNHH#B1w=#xSZWx#Or%+^h{h6HMcIKv4auZP z?*SgooPZ!2H)0vX5E-~8=vLbK?pFoDn}s^F9kXBuZbKA;He6@#vdx+W&*yeC@Ir33 z3r*%V3t($9|7!lqD+S?%>~dgQH_dG(3V4b_9JBI4n`1h;^;B}Tk`t`Lm{@`8+Yb49 ziDb|H@!kE+gPGhX%b&FV`T8%8vQO_9jx{B_+9k^P>M;lsD+$HehRj094E&DQpt?gG zxa0=3;8pf@eJ^=B+&tO`-2vvuCdExonsfYUcFPB&FOS`Hv z{!68sA(vjl{!&*}#}_!{Vq*1A0Ug{(hQQxI;|>J5o&K3&ASt_KXLwCAdOwj=0I8kf zu-aRt3?$lwpM_yK?KulbZU7dxBLuv~no|5%P)IM6Tb+n?#nr!h;xN{QLq z&;ZQH4t!4*e*VehZ<6fo{>+@|W)5z>xH3hqzWZHV*vO2_#c<~OVVaIFwH<^&h7JX5L8wbhU>xUhThofAT z;8QaUxl?U~Y-q#(p4!k6{lGo&%22B4ZwN$}<2M02<_($==XHE}#CTOs zXWOAbTgoYX9(Zt1lQiWN+L3BiM{YBJ9!761B-|VvHGa3e1Ct^LRflxXld0_C+U}S0hsw|Nr#-`)PWP+~t^~*ZNKza@GHcpGm;@ zVK7v_s0M&Ad+7W1Q4d!*ppxU?czo|JUj!JOrYr416CMRmZd8-<^nIn30d{4g?-(=|va_Q^TyNdGK?f1SR_?2q@ E13WfL2><{9 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/dbus/__pycache__/service.cpython-312.pyc b/venv/lib/python3.12/site-packages/dbus/__pycache__/service.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4d4cd7328fffefcd75e6001e1a90d8fe700c552e GIT binary patch literal 31800 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 literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/dbus/_compat.py b/venv/lib/python3.12/site-packages/dbus/_compat.py new file mode 100644 index 0000000..3e5f148 --- /dev/null +++ b/venv/lib/python3.12/site-packages/dbus/_compat.py @@ -0,0 +1,15 @@ +# Python 2 / Python 3 compatibility helpers. +# Copyright 2011 Barry Warsaw +# Copyright 2021 Collabora Ltd. +# SPDX-License-Identifier: MIT + +import sys + +is_py3 = True +is_py2 = False + +if sys.version_info.major < 3: + raise AssertionError( + 'Python 2 has reached end-of-life, and dbus-python no longer ' + 'supports it.' + ) diff --git a/venv/lib/python3.12/site-packages/dbus/_dbus.py b/venv/lib/python3.12/site-packages/dbus/_dbus.py new file mode 100644 index 0000000..2891194 --- /dev/null +++ b/venv/lib/python3.12/site-packages/dbus/_dbus.py @@ -0,0 +1,229 @@ +"""Implementation for dbus.Bus. Not to be imported directly.""" + +# Copyright (C) 2003, 2004, 2005, 2006 Red Hat Inc. +# Copyright (C) 2003 David Zeuthen +# Copyright (C) 2004 Rob Taylor +# Copyright (C) 2005, 2006 Collabora Ltd. +# +# SPDX-License-Identifier: MIT +# +# Permission is hereby granted, free of charge, to any person +# obtaining a copy of this software and associated documentation +# files (the "Software"), to deal in the Software without +# restriction, including without limitation the rights to use, copy, +# modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +# DEALINGS IN THE SOFTWARE. + +from __future__ import generators + +__all__ = ('Bus', 'SystemBus', 'SessionBus', 'StarterBus') +__docformat__ = 'reStructuredText' + +from dbus.exceptions import DBusException +from _dbus_bindings import ( + BUS_DAEMON_IFACE, BUS_DAEMON_NAME, BUS_DAEMON_PATH, BUS_SESSION, + BUS_STARTER, BUS_SYSTEM, DBUS_START_REPLY_ALREADY_RUNNING, + DBUS_START_REPLY_SUCCESS, validate_bus_name, + validate_interface_name, validate_member_name, validate_object_path) +from dbus.bus import BusConnection +from dbus.lowlevel import SignalMessage +from dbus._compat import is_py2 + + +class Bus(BusConnection): + """A connection to one of three possible standard buses, the SESSION, + SYSTEM, or STARTER bus. This class manages shared connections to those + buses. + + If you're trying to subclass `Bus`, you may be better off subclassing + `BusConnection`, which doesn't have all this magic. + """ + + _shared_instances = {} + + def __new__(cls, bus_type=BusConnection.TYPE_SESSION, private=False, + mainloop=None): + """Constructor, returning an existing instance where appropriate. + + The returned instance is actually always an instance of `SessionBus`, + `SystemBus` or `StarterBus`. + + :Parameters: + `bus_type` : cls.TYPE_SESSION, cls.TYPE_SYSTEM or cls.TYPE_STARTER + Connect to the appropriate bus + `private` : bool + If true, never return an existing shared instance, but instead + return a private connection. + + :Deprecated: since 0.82.3. Use dbus.bus.BusConnection for + private connections. + + `mainloop` : dbus.mainloop.NativeMainLoop + The main loop to use. The default is to use the default + main loop if one has been set up, or raise an exception + if none has been. + :Changed: in dbus-python 0.80: + converted from a wrapper around a Connection to a Connection + subclass. + """ + if (not private and bus_type in cls._shared_instances): + return cls._shared_instances[bus_type] + + # this is a bit odd, but we create instances of the subtypes + # so we can return the shared instances if someone tries to + # construct one of them (otherwise we'd eg try and return an + # instance of Bus from __new__ in SessionBus). why are there + # three ways to construct this class? we just don't know. + if bus_type == BUS_SESSION: + subclass = SessionBus + elif bus_type == BUS_SYSTEM: + subclass = SystemBus + elif bus_type == BUS_STARTER: + subclass = StarterBus + else: + raise ValueError('invalid bus_type %s' % bus_type) + + bus = BusConnection.__new__(subclass, bus_type, mainloop=mainloop) + + bus._bus_type = bus_type + + if not private: + cls._shared_instances[bus_type] = bus + + return bus + + def close(self): + t = self._bus_type + if self.__class__._shared_instances.get(t) is self: + del self.__class__._shared_instances[t] + super(Bus, self).close() + + def get_connection(self): + """Return self, for backwards compatibility with earlier dbus-python + versions where Bus was not a subclass of Connection. + + :Deprecated: since 0.80.0 + """ + return self + _connection = property(get_connection, None, None, + """self._connection == self, for backwards + compatibility with earlier dbus-python versions + where Bus was not a subclass of Connection.""") + + def get_session(private=False): + """Static method that returns a connection to the session bus. + + :Parameters: + `private` : bool + If true, do not return a shared connection. + """ + return SessionBus(private=private) + + get_session = staticmethod(get_session) + + def get_system(private=False): + """Static method that returns a connection to the system bus. + + :Parameters: + `private` : bool + If true, do not return a shared connection. + """ + return SystemBus(private=private) + + get_system = staticmethod(get_system) + + + def get_starter(private=False): + """Static method that returns a connection to the starter bus. + + :Parameters: + `private` : bool + If true, do not return a shared connection. + """ + return StarterBus(private=private) + + get_starter = staticmethod(get_starter) + + def __repr__(self): + if self._bus_type == BUS_SESSION: + name = 'session' + elif self._bus_type == BUS_SYSTEM: + name = 'system' + elif self._bus_type == BUS_STARTER: + name = 'starter' + else: + name = 'unknown bus type' + + return '<%s.%s (%s) at %#x>' % (self.__class__.__module__, + self.__class__.__name__, + name, id(self)) + __str__ = __repr__ + + +# FIXME: Drop the subclasses here? I can't think why we'd ever want +# polymorphism +class SystemBus(Bus): + """The system-wide message bus.""" + def __new__(cls, private=False, mainloop=None): + """Return a connection to the system bus. + + :Parameters: + `private` : bool + If true, never return an existing shared instance, but instead + return a private connection. + `mainloop` : dbus.mainloop.NativeMainLoop + The main loop to use. The default is to use the default + main loop if one has been set up, or raise an exception + if none has been. + """ + return Bus.__new__(cls, Bus.TYPE_SYSTEM, mainloop=mainloop, + private=private) + +class SessionBus(Bus): + """The session (current login) message bus.""" + def __new__(cls, private=False, mainloop=None): + """Return a connection to the session bus. + + :Parameters: + `private` : bool + If true, never return an existing shared instance, but instead + return a private connection. + `mainloop` : dbus.mainloop.NativeMainLoop + The main loop to use. The default is to use the default + main loop if one has been set up, or raise an exception + if none has been. + """ + return Bus.__new__(cls, Bus.TYPE_SESSION, private=private, + mainloop=mainloop) + +class StarterBus(Bus): + """The bus that activated this process (only valid if + this process was launched by DBus activation). + """ + def __new__(cls, private=False, mainloop=None): + """Return a connection to the bus that activated this process. + + :Parameters: + `private` : bool + If true, never return an existing shared instance, but instead + return a private connection. + `mainloop` : dbus.mainloop.NativeMainLoop + The main loop to use. The default is to use the default + main loop if one has been set up, or raise an exception + if none has been. + """ + return Bus.__new__(cls, Bus.TYPE_STARTER, private=private, + mainloop=mainloop) diff --git a/venv/lib/python3.12/site-packages/dbus/_expat_introspect_parser.py b/venv/lib/python3.12/site-packages/dbus/_expat_introspect_parser.py new file mode 100644 index 0000000..2c6f341 --- /dev/null +++ b/venv/lib/python3.12/site-packages/dbus/_expat_introspect_parser.py @@ -0,0 +1,87 @@ +# Copyright (C) 2003, 2004, 2005, 2006 Red Hat Inc. +# Copyright (C) 2003 David Zeuthen +# Copyright (C) 2004 Rob Taylor +# Copyright (C) 2005, 2006 Collabora Ltd. +# +# SPDX-License-Identifier: MIT +# +# Permission is hereby granted, free of charge, to any person +# obtaining a copy of this software and associated documentation +# files (the "Software"), to deal in the Software without +# restriction, including without limitation the rights to use, copy, +# modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +# DEALINGS IN THE SOFTWARE. + +from xml.parsers.expat import ParserCreate +from dbus.exceptions import IntrospectionParserException + +class _Parser(object): + __slots__ = ('map', 'in_iface', 'in_method', 'sig') + def __init__(self): + self.map = {} + self.in_iface = '' + self.in_method = '' + self.sig = '' + + def parse(self, data): + parser = ParserCreate('UTF-8', ' ') + parser.buffer_text = True + parser.StartElementHandler = self.StartElementHandler + parser.EndElementHandler = self.EndElementHandler + parser.Parse(data) + return self.map + + def StartElementHandler(self, name, attributes): + if not self.in_iface: + if (not self.in_method and name == 'interface'): + self.in_iface = attributes['name'] + else: + if (not self.in_method and name == 'method'): + self.in_method = attributes['name'] + elif (self.in_method and name == 'arg'): + if attributes.get('direction', 'in') == 'in': + self.sig += attributes['type'] + + def EndElementHandler(self, name): + if self.in_iface: + if (not self.in_method and name == 'interface'): + self.in_iface = '' + elif (self.in_method and name == 'method'): + self.map[self.in_iface + '.' + self.in_method] = self.sig + self.in_method = '' + self.sig = '' + +def process_introspection_data(data): + """Return a dict mapping ``interface.method`` strings to the + concatenation of all their 'in' parameters, and mapping + ``interface.signal`` strings to the concatenation of all their + parameters. + + Example output:: + + { + 'com.example.SignalEmitter.OneString': 's', + 'com.example.MethodImplementor.OneInt32Argument': 'i', + } + + :Parameters: + `data` : str + The introspection XML. Must be an 8-bit string of UTF-8. + """ + try: + return _Parser().parse(data) + except Exception as e: + raise IntrospectionParserException('%s: %s' % (e.__class__, e)) diff --git a/venv/lib/python3.12/site-packages/dbus/bus.py b/venv/lib/python3.12/site-packages/dbus/bus.py new file mode 100644 index 0000000..fd5a281 --- /dev/null +++ b/venv/lib/python3.12/site-packages/dbus/bus.py @@ -0,0 +1,434 @@ +# Copyright (C) 2007 Collabora Ltd. +# +# SPDX-License-Identifier: MIT +# +# Permission is hereby granted, free of charge, to any person +# obtaining a copy of this software and associated documentation +# files (the "Software"), to deal in the Software without +# restriction, including without limitation the rights to use, copy, +# modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +# DEALINGS IN THE SOFTWARE. + +__all__ = ('BusConnection',) +__docformat__ = 'reStructuredText' + +import logging +import weakref + +from _dbus_bindings import ( + BUS_DAEMON_IFACE, BUS_DAEMON_NAME, BUS_DAEMON_PATH, BUS_SESSION, + BUS_STARTER, BUS_SYSTEM, DBUS_START_REPLY_ALREADY_RUNNING, + DBUS_START_REPLY_SUCCESS, NAME_FLAG_ALLOW_REPLACEMENT, + NAME_FLAG_DO_NOT_QUEUE, NAME_FLAG_REPLACE_EXISTING, + RELEASE_NAME_REPLY_NON_EXISTENT, RELEASE_NAME_REPLY_NOT_OWNER, + RELEASE_NAME_REPLY_RELEASED, REQUEST_NAME_REPLY_ALREADY_OWNER, + REQUEST_NAME_REPLY_EXISTS, REQUEST_NAME_REPLY_IN_QUEUE, + REQUEST_NAME_REPLY_PRIMARY_OWNER, validate_bus_name, validate_error_name, + validate_interface_name, validate_member_name, validate_object_path) +from dbus.connection import Connection +from dbus.exceptions import DBusException +from dbus.lowlevel import HANDLER_RESULT_NOT_YET_HANDLED +from dbus._compat import is_py2 + + +_NAME_OWNER_CHANGE_MATCH = ("type='signal',sender='%s'," + "interface='%s',member='NameOwnerChanged'," + "path='%s',arg0='%%s'" + % (BUS_DAEMON_NAME, BUS_DAEMON_IFACE, + BUS_DAEMON_PATH)) +"""(_NAME_OWNER_CHANGE_MATCH % sender) matches relevant NameOwnerChange +messages""" + +_NAME_HAS_NO_OWNER = 'org.freedesktop.DBus.Error.NameHasNoOwner' + +_logger = logging.getLogger('dbus.bus') + + +class NameOwnerWatch(object): + __slots__ = ('_match', '_pending_call') + + def __init__(self, bus_conn, bus_name, callback): + validate_bus_name(bus_name) + + def signal_cb(owned, old_owner, new_owner): + callback(new_owner) + + def error_cb(e): + if e.get_dbus_name() == _NAME_HAS_NO_OWNER: + callback('') + else: + logging.basicConfig() + _logger.debug('GetNameOwner(%s) failed:', bus_name, + exc_info=(e.__class__, e, None)) + + self._match = bus_conn.add_signal_receiver(signal_cb, + 'NameOwnerChanged', + BUS_DAEMON_IFACE, + BUS_DAEMON_NAME, + BUS_DAEMON_PATH, + arg0=bus_name) + self._pending_call = bus_conn.call_async(BUS_DAEMON_NAME, + BUS_DAEMON_PATH, + BUS_DAEMON_IFACE, + 'GetNameOwner', + 's', (bus_name,), + callback, error_cb) + + def cancel(self): + if self._match is not None: + self._match.remove() + if self._pending_call is not None: + self._pending_call.cancel() + self._match = None + self._pending_call = None + + +class BusConnection(Connection): + """A connection to a D-Bus daemon that implements the + ``org.freedesktop.DBus`` pseudo-service. + + :Since: 0.81.0 + """ + + TYPE_SESSION = BUS_SESSION + """Represents a session bus (same as the global dbus.BUS_SESSION)""" + + TYPE_SYSTEM = BUS_SYSTEM + """Represents the system bus (same as the global dbus.BUS_SYSTEM)""" + + TYPE_STARTER = BUS_STARTER + """Represents the bus that started this service by activation (same as + the global dbus.BUS_STARTER)""" + + START_REPLY_SUCCESS = DBUS_START_REPLY_SUCCESS + START_REPLY_ALREADY_RUNNING = DBUS_START_REPLY_ALREADY_RUNNING + + def __new__(cls, address_or_type=TYPE_SESSION, mainloop=None): + bus = cls._new_for_bus(address_or_type, mainloop=mainloop) + + # _bus_names is used by dbus.service.BusName! + bus._bus_names = weakref.WeakValueDictionary() + + bus._signal_sender_matches = {} + """Map from SignalMatch to NameOwnerWatch.""" + + return bus + + def add_signal_receiver(self, handler_function, signal_name=None, + dbus_interface=None, bus_name=None, + path=None, **keywords): + named_service = keywords.pop('named_service', None) + if named_service is not None: + if bus_name is not None: + raise TypeError('bus_name and named_service cannot both be ' + 'specified') + bus_name = named_service + from warnings import warn + warn('Passing the named_service parameter to add_signal_receiver ' + 'by name is deprecated: please use positional parameters', + DeprecationWarning, stacklevel=2) + + match = super(BusConnection, self).add_signal_receiver( + handler_function, signal_name, dbus_interface, bus_name, + path, **keywords) + + if (bus_name is not None and bus_name != BUS_DAEMON_NAME): + if bus_name[:1] == ':': + def callback(new_owner): + if new_owner == '': + match.remove() + else: + callback = match.set_sender_name_owner + watch = self.watch_name_owner(bus_name, callback) + self._signal_sender_matches[match] = watch + + self.add_match_string(str(match)) + + return match + + def _clean_up_signal_match(self, match): + # The signals lock is no longer held here (it was in <= 0.81.0) + self.remove_match_string_non_blocking(str(match)) + watch = self._signal_sender_matches.pop(match, None) + if watch is not None: + watch.cancel() + + def activate_name_owner(self, bus_name): + if (bus_name is not None and bus_name[:1] != ':' + and bus_name != BUS_DAEMON_NAME): + try: + return self.get_name_owner(bus_name) + except DBusException as e: + if e.get_dbus_name() != _NAME_HAS_NO_OWNER: + raise + # else it doesn't exist: try to start it + self.start_service_by_name(bus_name) + return self.get_name_owner(bus_name) + else: + # already unique + return bus_name + + def get_object(self, bus_name, object_path, introspect=True, + follow_name_owner_changes=False, **kwargs): + """Return a local proxy for the given remote object. + + Method calls on the proxy are translated into method calls on the + remote object. + + :Parameters: + `bus_name` : str + A bus name (either the unique name or a well-known name) + of the application owning the object. The keyword argument + named_service is a deprecated alias for this. + `object_path` : str + The object path of the desired object + `introspect` : bool + If true (default), attempt to introspect the remote + object to find out supported methods and their signatures + `follow_name_owner_changes` : bool + If the object path is a well-known name and this parameter + is false (default), resolve the well-known name to the unique + name of its current owner and bind to that instead; if the + ownership of the well-known name changes in future, + keep communicating with the original owner. + This is necessary if the D-Bus API used is stateful. + + If the object path is a well-known name and this parameter + is true, whenever the well-known name changes ownership in + future, bind to the new owner, if any. + + If the given object path is a unique name, this parameter + has no effect. + + :Returns: a `dbus.proxies.ProxyObject` + :Raises `DBusException`: if resolving the well-known name to a + unique name fails + """ + if follow_name_owner_changes: + self._require_main_loop() # we don't get the signals otherwise + + named_service = kwargs.pop('named_service', None) + if named_service is not None: + if bus_name is not None: + raise TypeError('bus_name and named_service cannot both ' + 'be specified') + from warnings import warn + warn('Passing the named_service parameter to get_object by name ' + 'is deprecated: please use positional parameters', + DeprecationWarning, stacklevel=2) + bus_name = named_service + if kwargs: + raise TypeError('get_object does not take these keyword ' + 'arguments: %s' % ', '.join(kwargs.keys())) + + return self.ProxyObjectClass(self, bus_name, object_path, + introspect=introspect, + follow_name_owner_changes=follow_name_owner_changes) + + def get_unix_user(self, bus_name): + """Get the numeric uid of the process owning the given bus name. + + :Parameters: + `bus_name` : str + A bus name, either unique or well-known + :Returns: a `dbus.UInt32` + :Since: 0.80.0 + """ + validate_bus_name(bus_name) + return self.call_blocking(BUS_DAEMON_NAME, BUS_DAEMON_PATH, + BUS_DAEMON_IFACE, 'GetConnectionUnixUser', + 's', (bus_name,)) + + def start_service_by_name(self, bus_name, flags=0): + """Start a service which will implement the given bus name on this Bus. + + :Parameters: + `bus_name` : str + The well-known bus name to be activated. + `flags` : dbus.UInt32 + Flags to pass to StartServiceByName (currently none are + defined) + + :Returns: A tuple of 2 elements. The first is always True, the + second is either START_REPLY_SUCCESS or + START_REPLY_ALREADY_RUNNING. + + :Raises `DBusException`: if the service could not be started. + :Since: 0.80.0 + """ + validate_bus_name(bus_name) + return (True, self.call_blocking(BUS_DAEMON_NAME, BUS_DAEMON_PATH, + BUS_DAEMON_IFACE, + 'StartServiceByName', + 'su', (bus_name, flags))) + + # XXX: it might be nice to signal IN_QUEUE, EXISTS by exception, + # but this would not be backwards-compatible + def request_name(self, name, flags=0): + """Request a bus name. + + :Parameters: + `name` : str + The well-known name to be requested + `flags` : dbus.UInt32 + A bitwise-OR of 0 or more of the flags + `NAME_FLAG_ALLOW_REPLACEMENT`, + `NAME_FLAG_REPLACE_EXISTING` + and `NAME_FLAG_DO_NOT_QUEUE` + :Returns: `REQUEST_NAME_REPLY_PRIMARY_OWNER`, + `REQUEST_NAME_REPLY_IN_QUEUE`, + `REQUEST_NAME_REPLY_EXISTS` or + `REQUEST_NAME_REPLY_ALREADY_OWNER` + :Raises `DBusException`: if the bus daemon cannot be contacted or + returns an error. + """ + validate_bus_name(name, allow_unique=False) + return self.call_blocking(BUS_DAEMON_NAME, BUS_DAEMON_PATH, + BUS_DAEMON_IFACE, 'RequestName', + 'su', (name, flags)) + + def release_name(self, name): + """Release a bus name. + + :Parameters: + `name` : str + The well-known name to be released + :Returns: `RELEASE_NAME_REPLY_RELEASED`, + `RELEASE_NAME_REPLY_NON_EXISTENT` + or `RELEASE_NAME_REPLY_NOT_OWNER` + :Raises `DBusException`: if the bus daemon cannot be contacted or + returns an error. + """ + validate_bus_name(name, allow_unique=False) + return self.call_blocking(BUS_DAEMON_NAME, BUS_DAEMON_PATH, + BUS_DAEMON_IFACE, 'ReleaseName', + 's', (name,)) + + def list_names(self): + """Return a list of all currently-owned names on the bus. + + :Returns: a dbus.Array of dbus.UTF8String + :Since: 0.81.0 + """ + return self.call_blocking(BUS_DAEMON_NAME, BUS_DAEMON_PATH, + BUS_DAEMON_IFACE, 'ListNames', + '', ()) + + def list_activatable_names(self): + """Return a list of all names that can be activated on the bus. + + :Returns: a dbus.Array of dbus.UTF8String + :Since: 0.81.0 + """ + return self.call_blocking(BUS_DAEMON_NAME, BUS_DAEMON_PATH, + BUS_DAEMON_IFACE, 'ListActivatableNames', + '', ()) + + def get_name_owner(self, bus_name): + """Return the unique connection name of the primary owner of the + given name. + + :Raises `DBusException`: if the `bus_name` has no owner + :Since: 0.81.0 + """ + validate_bus_name(bus_name, allow_unique=False) + return self.call_blocking(BUS_DAEMON_NAME, BUS_DAEMON_PATH, + BUS_DAEMON_IFACE, 'GetNameOwner', + 's', (bus_name,)) + + def watch_name_owner(self, bus_name, callback): + """Watch the unique connection name of the primary owner of the + given name. + + `callback` will be called with one argument, which is either the + unique connection name, or the empty string (meaning the name is + not owned). + + :Since: 0.81.0 + """ + return NameOwnerWatch(self, bus_name, callback) + + def name_has_owner(self, bus_name): + """Return True iff the given bus name has an owner on this bus. + + :Parameters: + `bus_name` : str + The bus name to look up + :Returns: a `bool` + """ + return bool(self.call_blocking(BUS_DAEMON_NAME, BUS_DAEMON_PATH, + BUS_DAEMON_IFACE, 'NameHasOwner', + 's', (bus_name,))) + + def add_match_string(self, rule): + """Arrange for this application to receive messages on the bus that + match the given rule. This version will block. + + :Parameters: + `rule` : str + The match rule + :Raises `DBusException`: on error. + :Since: 0.80.0 + """ + self.call_blocking(BUS_DAEMON_NAME, BUS_DAEMON_PATH, + BUS_DAEMON_IFACE, 'AddMatch', 's', (rule,)) + + # FIXME: add an async success/error handler capability? + # (and the same for remove_...) + def add_match_string_non_blocking(self, rule): + """Arrange for this application to receive messages on the bus that + match the given rule. This version will not block, but any errors + will be ignored. + + + :Parameters: + `rule` : str + The match rule + :Raises `DBusException`: on error. + :Since: 0.80.0 + """ + self.call_async(BUS_DAEMON_NAME, BUS_DAEMON_PATH, + BUS_DAEMON_IFACE, 'AddMatch', 's', (rule,), + None, None) + + def remove_match_string(self, rule): + """Arrange for this application to receive messages on the bus that + match the given rule. This version will block. + + :Parameters: + `rule` : str + The match rule + :Raises `DBusException`: on error. + :Since: 0.80.0 + """ + self.call_blocking(BUS_DAEMON_NAME, BUS_DAEMON_PATH, + BUS_DAEMON_IFACE, 'RemoveMatch', 's', (rule,)) + + def remove_match_string_non_blocking(self, rule): + """Arrange for this application to receive messages on the bus that + match the given rule. This version will not block, but any errors + will be ignored. + + + :Parameters: + `rule` : str + The match rule + :Raises `DBusException`: on error. + :Since: 0.80.0 + """ + self.call_async(BUS_DAEMON_NAME, BUS_DAEMON_PATH, + BUS_DAEMON_IFACE, 'RemoveMatch', 's', (rule,), + None, None) diff --git a/venv/lib/python3.12/site-packages/dbus/connection.py b/venv/lib/python3.12/site-packages/dbus/connection.py new file mode 100644 index 0000000..fd20800 --- /dev/null +++ b/venv/lib/python3.12/site-packages/dbus/connection.py @@ -0,0 +1,651 @@ +# Copyright (C) 2007 Collabora Ltd. +# +# SPDX-License-Identifier: MIT +# +# Permission is hereby granted, free of charge, to any person +# obtaining a copy of this software and associated documentation +# files (the "Software"), to deal in the Software without +# restriction, including without limitation the rights to use, copy, +# modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +# DEALINGS IN THE SOFTWARE. + +__all__ = ('Connection', 'SignalMatch') +__docformat__ = 'reStructuredText' + +import logging +import threading +import weakref + +from _dbus_bindings import ( + Connection as _Connection, LOCAL_IFACE, LOCAL_PATH, validate_bus_name, + validate_interface_name, validate_member_name, validate_object_path) +from dbus.exceptions import DBusException +from dbus.lowlevel import ( + ErrorMessage, HANDLER_RESULT_NOT_YET_HANDLED, MethodCallMessage, + MethodReturnMessage, SignalMessage) +from dbus.proxies import ProxyObject +from dbus._compat import is_py2, is_py3 + +from _dbus_bindings import String + + +_logger = logging.getLogger('dbus.connection') + + +def _noop(*args, **kwargs): + pass + + +class SignalMatch(object): + _slots = ['_sender_name_owner', '_member', '_interface', '_sender', + '_path', '_handler', '_args_match', '_rule', + '_byte_arrays', '_conn_weakref', + '_destination_keyword', '_interface_keyword', + '_message_keyword', '_member_keyword', + '_sender_keyword', '_path_keyword', '_int_args_match'] + + __slots__ = tuple(_slots) + + def __init__(self, conn, sender, object_path, dbus_interface, + member, handler, byte_arrays=False, + sender_keyword=None, path_keyword=None, + interface_keyword=None, member_keyword=None, + message_keyword=None, destination_keyword=None, + **kwargs): + if member is not None: + validate_member_name(member) + if dbus_interface is not None: + validate_interface_name(dbus_interface) + if sender is not None: + validate_bus_name(sender) + if object_path is not None: + validate_object_path(object_path) + + self._rule = None + self._conn_weakref = weakref.ref(conn) + self._sender = sender + self._interface = dbus_interface + self._member = member + self._path = object_path + self._handler = handler + + # if the connection is actually a bus, it's responsible for changing + # this later + self._sender_name_owner = sender + + if 'utf8_strings' in kwargs: + raise TypeError("unexpected keyword argument 'utf8_strings'") + + self._byte_arrays = byte_arrays + self._sender_keyword = sender_keyword + self._path_keyword = path_keyword + self._member_keyword = member_keyword + self._interface_keyword = interface_keyword + self._message_keyword = message_keyword + self._destination_keyword = destination_keyword + + self._args_match = kwargs + if not kwargs: + self._int_args_match = None + else: + self._int_args_match = {} + for kwarg in kwargs: + if not kwarg.startswith('arg'): + raise TypeError('SignalMatch: unknown keyword argument %s' + % kwarg) + try: + index = int(kwarg[3:]) + except ValueError: + raise TypeError('SignalMatch: unknown keyword argument %s' + % kwarg) + if index < 0 or index > 63: + raise TypeError('SignalMatch: arg match index must be in ' + 'range(64), not %d' % index) + self._int_args_match[index] = kwargs[kwarg] + + def __hash__(self): + """SignalMatch objects are compared by identity.""" + return hash(id(self)) + + def __eq__(self, other): + """SignalMatch objects are compared by identity.""" + return self is other + + def __ne__(self, other): + """SignalMatch objects are compared by identity.""" + return self is not other + + sender = property(lambda self: self._sender) + + def __str__(self): + if self._rule is None: + rule = ["type='signal'"] + if self._sender is not None: + rule.append("sender='%s'" % self._sender) + if self._path is not None: + rule.append("path='%s'" % self._path) + if self._interface is not None: + rule.append("interface='%s'" % self._interface) + if self._member is not None: + rule.append("member='%s'" % self._member) + if self._int_args_match is not None: + for index, value in self._int_args_match.items(): + rule.append("arg%d='%s'" % (index, value)) + + self._rule = ','.join(rule) + + return self._rule + + def __repr__(self): + return ('<%s at %x "%s" on conn %r>' + % (self.__class__, id(self), self._rule, self._conn_weakref())) + + def set_sender_name_owner(self, new_name): + self._sender_name_owner = new_name + + def matches_removal_spec(self, sender, object_path, + dbus_interface, member, handler, **kwargs): + if handler not in (None, self._handler): + return False + if sender != self._sender: + return False + if object_path != self._path: + return False + if dbus_interface != self._interface: + return False + if member != self._member: + return False + if kwargs != self._args_match: + return False + return True + + def maybe_handle_message(self, message): + args = None + + # these haven't been checked yet by the match tree + if self._sender_name_owner not in (None, message.get_sender()): + return False + if self._int_args_match is not None: + # extracting args with byte_arrays is less work + kwargs = dict(byte_arrays=True) + args = message.get_args_list(**kwargs) + for index, value in self._int_args_match.items(): + if (index >= len(args) + or not isinstance(args[index], String) + or args[index] != value): + return False + + # these have likely already been checked by the match tree + if self._member not in (None, message.get_member()): + return False + if self._interface not in (None, message.get_interface()): + return False + if self._path not in (None, message.get_path()): + return False + + try: + # minor optimization: if we already extracted the args with the + # right calling convention to do the args match, don't bother + # doing so again + if args is None or not self._byte_arrays: + args = message.get_args_list(byte_arrays=self._byte_arrays) + kwargs = {} + if self._sender_keyword is not None: + kwargs[self._sender_keyword] = message.get_sender() + if self._destination_keyword is not None: + kwargs[self._destination_keyword] = message.get_destination() + if self._path_keyword is not None: + kwargs[self._path_keyword] = message.get_path() + if self._member_keyword is not None: + kwargs[self._member_keyword] = message.get_member() + if self._interface_keyword is not None: + kwargs[self._interface_keyword] = message.get_interface() + if self._message_keyword is not None: + kwargs[self._message_keyword] = message + self._handler(*args, **kwargs) + except: + # basicConfig is a no-op if logging is already configured + logging.basicConfig() + _logger.error('Exception in handler for D-Bus signal:', exc_info=1) + + return True + + def remove(self): + conn = self._conn_weakref() + # do nothing if the connection has already vanished + if conn is not None: + conn.remove_signal_receiver(self, self._member, + self._interface, self._sender, + self._path, + **self._args_match) + + +class Connection(_Connection): + """A connection to another application. In this base class there is + assumed to be no bus daemon. + + :Since: 0.81.0 + """ + + ProxyObjectClass = ProxyObject + + def __init__(self, *args, **kwargs): + super(Connection, self).__init__(*args, **kwargs) + + # this if-block is needed because shared bus connections can be + # __init__'ed more than once + if not hasattr(self, '_dbus_Connection_initialized'): + self._dbus_Connection_initialized = 1 + + self.__call_on_disconnection = [] + + self._signal_recipients_by_object_path = {} + """Map from object path to dict mapping dbus_interface to dict + mapping member to list of SignalMatch objects.""" + + self._signals_lock = threading.Lock() + """Lock used to protect signal data structures""" + + self.add_message_filter(self.__class__._signal_func) + + def activate_name_owner(self, bus_name): + """Return the unique name for the given bus name, activating it + if necessary and possible. + + If the name is already unique or this connection is not to a + bus daemon, just return it. + + :Returns: a bus name. If the given `bus_name` exists, the returned + name identifies its current owner; otherwise the returned name + does not exist. + :Raises DBusException: if the implementation has failed + to activate the given bus name. + :Since: 0.81.0 + """ + return bus_name + + def get_object(self, bus_name=None, object_path=None, introspect=True, + **kwargs): + """Return a local proxy for the given remote object. + + Method calls on the proxy are translated into method calls on the + remote object. + + :Parameters: + `bus_name` : str + A bus name (either the unique name or a well-known name) + of the application owning the object. The keyword argument + named_service is a deprecated alias for this. + `object_path` : str + The object path of the desired object + `introspect` : bool + If true (default), attempt to introspect the remote + object to find out supported methods and their signatures + + :Returns: a `dbus.proxies.ProxyObject` + """ + named_service = kwargs.pop('named_service', None) + if named_service is not None: + if bus_name is not None: + raise TypeError('bus_name and named_service cannot both ' + 'be specified') + from warnings import warn + warn('Passing the named_service parameter to get_object by name ' + 'is deprecated: please use positional parameters', + DeprecationWarning, stacklevel=2) + bus_name = named_service + if kwargs: + raise TypeError('get_object does not take these keyword ' + 'arguments: %s' % ', '.join(kwargs.keys())) + + return self.ProxyObjectClass(self, bus_name, object_path, + introspect=introspect) + + def add_signal_receiver(self, handler_function, + signal_name=None, + dbus_interface=None, + bus_name=None, + path=None, + **keywords): + """Arrange for the given function to be called when a signal matching + the parameters is received. + + :Parameters: + `handler_function` : callable + The function to be called. Its positional arguments will + be the arguments of the signal. By default it will receive + no keyword arguments, but see the description of + the optional keyword arguments below. + `signal_name` : str + The signal name; None (the default) matches all names + `dbus_interface` : str + The D-Bus interface name with which to qualify the signal; + None (the default) matches all interface names + `bus_name` : str + A bus name for the sender, which will be resolved to a + unique name if it is not already; None (the default) matches + any sender. + `path` : str + The object path of the object which must have emitted the + signal; None (the default) matches any object path + :Keywords: + `utf8_strings` : bool + If True, the handler function will receive any string + arguments as dbus.UTF8String objects (a subclass of str + guaranteed to be UTF-8). If False (default) it will receive + any string arguments as dbus.String objects (a subclass of + unicode). + `byte_arrays` : bool + If True, the handler function will receive any byte-array + arguments as dbus.ByteArray objects (a subclass of str). + If False (default) it will receive any byte-array + arguments as a dbus.Array of dbus.Byte (subclasses of: + a list of ints). + `sender_keyword` : str + If not None (the default), the handler function will receive + the unique name of the sending endpoint as a keyword + argument with this name. + `destination_keyword` : str + If not None (the default), the handler function will receive + the bus name of the destination (or None if the signal is a + broadcast, as is usual) as a keyword argument with this name. + `interface_keyword` : str + If not None (the default), the handler function will receive + the signal interface as a keyword argument with this name. + `member_keyword` : str + If not None (the default), the handler function will receive + the signal name as a keyword argument with this name. + `path_keyword` : str + If not None (the default), the handler function will receive + the object-path of the sending object as a keyword argument + with this name. + `message_keyword` : str + If not None (the default), the handler function will receive + the `dbus.lowlevel.SignalMessage` as a keyword argument with + this name. + `arg...` : unicode or UTF-8 str + If there are additional keyword parameters of the form + ``arg``\\ *n*, match only signals where the *n*\\ th argument + is the value given for that keyword parameter. As of this + time only string arguments can be matched (in particular, + object paths and signatures can't). + `named_service` : str + A deprecated alias for `bus_name`. + """ + self._require_main_loop() + + named_service = keywords.pop('named_service', None) + if named_service is not None: + if bus_name is not None: + raise TypeError('bus_name and named_service cannot both be ' + 'specified') + bus_name = named_service + from warnings import warn + warn('Passing the named_service parameter to add_signal_receiver ' + 'by name is deprecated: please use positional parameters', + DeprecationWarning, stacklevel=2) + + match = SignalMatch(self, bus_name, path, dbus_interface, + signal_name, handler_function, **keywords) + + self._signals_lock.acquire() + try: + by_interface = self._signal_recipients_by_object_path.setdefault( + path, {}) + by_member = by_interface.setdefault(dbus_interface, {}) + matches = by_member.setdefault(signal_name, []) + + matches.append(match) + finally: + self._signals_lock.release() + + return match + + def _iter_easy_matches(self, path, dbus_interface, member): + if path is not None: + path_keys = (None, path) + else: + path_keys = (None,) + if dbus_interface is not None: + interface_keys = (None, dbus_interface) + else: + interface_keys = (None,) + if member is not None: + member_keys = (None, member) + else: + member_keys = (None,) + + for path in path_keys: + by_interface = self._signal_recipients_by_object_path.get(path) + if by_interface is None: + continue + for dbus_interface in interface_keys: + by_member = by_interface.get(dbus_interface, None) + if by_member is None: + continue + for member in member_keys: + matches = by_member.get(member, None) + if matches is None: + continue + for m in matches: + yield m + + def remove_signal_receiver(self, handler_or_match, + signal_name=None, + dbus_interface=None, + bus_name=None, + path=None, + **keywords): + named_service = keywords.pop('named_service', None) + if named_service is not None: + if bus_name is not None: + raise TypeError('bus_name and named_service cannot both be ' + 'specified') + bus_name = named_service + from warnings import warn + warn('Passing the named_service parameter to ' + 'remove_signal_receiver by name is deprecated: please use ' + 'positional parameters', + DeprecationWarning, stacklevel=2) + + new = [] + deletions = [] + self._signals_lock.acquire() + try: + by_interface = self._signal_recipients_by_object_path.get(path, + None) + if by_interface is None: + return + by_member = by_interface.get(dbus_interface, None) + if by_member is None: + return + matches = by_member.get(signal_name, None) + if matches is None: + return + + for match in matches: + if (handler_or_match is match + or match.matches_removal_spec(bus_name, + path, + dbus_interface, + signal_name, + handler_or_match, + **keywords)): + deletions.append(match) + else: + new.append(match) + + if new: + by_member[signal_name] = new + else: + del by_member[signal_name] + if not by_member: + del by_interface[dbus_interface] + if not by_interface: + del self._signal_recipients_by_object_path[path] + finally: + self._signals_lock.release() + + for match in deletions: + self._clean_up_signal_match(match) + + def _clean_up_signal_match(self, match): + # Now called without the signals lock held (it was held in <= 0.81.0) + pass + + def _signal_func(self, message): + """D-Bus filter function. Handle signals by dispatching to Python + callbacks kept in the match-rule tree. + """ + + if not isinstance(message, SignalMessage): + return HANDLER_RESULT_NOT_YET_HANDLED + + dbus_interface = message.get_interface() + path = message.get_path() + signal_name = message.get_member() + + for match in self._iter_easy_matches(path, dbus_interface, + signal_name): + match.maybe_handle_message(message) + + if (dbus_interface == LOCAL_IFACE and + path == LOCAL_PATH and + signal_name == 'Disconnected'): + for cb in self.__call_on_disconnection: + try: + cb(self) + except Exception: + # basicConfig is a no-op if logging is already configured + logging.basicConfig() + _logger.error('Exception in handler for Disconnected ' + 'signal:', exc_info=1) + + return HANDLER_RESULT_NOT_YET_HANDLED + + def call_async(self, bus_name, object_path, dbus_interface, method, + signature, args, reply_handler, error_handler, + timeout=-1.0, byte_arrays=False, + require_main_loop=True, **kwargs): + """Call the given method, asynchronously. + + If the reply_handler is None, successful replies will be ignored. + If the error_handler is None, failures will be ignored. If both + are None, the implementation may request that no reply is sent. + + :Returns: The dbus.lowlevel.PendingCall. + :Since: 0.81.0 + """ + if object_path == LOCAL_PATH: + raise DBusException('Methods may not be called on the reserved ' + 'path %s' % LOCAL_PATH) + if dbus_interface == LOCAL_IFACE: + raise DBusException('Methods may not be called on the reserved ' + 'interface %s' % LOCAL_IFACE) + # no need to validate other args - MethodCallMessage ctor will do + + get_args_opts = dict(byte_arrays=byte_arrays) + if 'utf8_strings' in kwargs: + raise TypeError("unexpected keyword argument 'utf8_strings'") + + message = MethodCallMessage(destination=bus_name, + path=object_path, + interface=dbus_interface, + method=method) + # Add the arguments to the function + try: + message.append(signature=signature, *args) + except Exception as e: + logging.basicConfig() + _logger.error('Unable to set arguments %r according to ' + 'signature %r: %s: %s', + args, signature, e.__class__, e) + raise + + if reply_handler is None and error_handler is None: + # we don't care what happens, so just send it + self.send_message(message) + return + + if reply_handler is None: + reply_handler = _noop + if error_handler is None: + error_handler = _noop + + def msg_reply_handler(message): + if isinstance(message, MethodReturnMessage): + reply_handler(*message.get_args_list(**get_args_opts)) + elif isinstance(message, ErrorMessage): + error_handler(DBusException(name=message.get_error_name(), + *message.get_args_list())) + else: + error_handler(TypeError('Unexpected type for reply ' + 'message: %r' % message)) + return self.send_message_with_reply(message, msg_reply_handler, + timeout, + require_main_loop=require_main_loop) + + def call_blocking(self, bus_name, object_path, dbus_interface, method, + signature, args, timeout=-1.0, + byte_arrays=False, **kwargs): + """Call the given method, synchronously. + :Since: 0.81.0 + """ + if object_path == LOCAL_PATH: + raise DBusException('Methods may not be called on the reserved ' + 'path %s' % LOCAL_PATH) + if dbus_interface == LOCAL_IFACE: + raise DBusException('Methods may not be called on the reserved ' + 'interface %s' % LOCAL_IFACE) + # no need to validate other args - MethodCallMessage ctor will do + + get_args_opts = dict(byte_arrays=byte_arrays) + if 'utf8_strings' in kwargs: + raise TypeError("unexpected keyword argument 'utf8_strings'") + + message = MethodCallMessage(destination=bus_name, + path=object_path, + interface=dbus_interface, + method=method) + # Add the arguments to the function + try: + message.append(signature=signature, *args) + except Exception as e: + logging.basicConfig() + _logger.error('Unable to set arguments %r according to ' + 'signature %r: %s: %s', + args, signature, e.__class__, e) + raise + + # make a blocking call + reply_message = self.send_message_with_reply_and_block( + message, timeout) + args_list = reply_message.get_args_list(**get_args_opts) + if len(args_list) == 0: + return None + elif len(args_list) == 1: + return args_list[0] + else: + return tuple(args_list) + + def call_on_disconnection(self, callable): + """Arrange for `callable` to be called with one argument (this + Connection object) when the Connection becomes + disconnected. + + :Since: 0.83.0 + """ + self.__call_on_disconnection.append(callable) diff --git a/venv/lib/python3.12/site-packages/dbus/decorators.py b/venv/lib/python3.12/site-packages/dbus/decorators.py new file mode 100644 index 0000000..3dc04a6 --- /dev/null +++ b/venv/lib/python3.12/site-packages/dbus/decorators.py @@ -0,0 +1,362 @@ +"""Service-side D-Bus decorators.""" + +# Copyright (C) 2003, 2004, 2005, 2006 Red Hat Inc. +# Copyright (C) 2003 David Zeuthen +# Copyright (C) 2004 Rob Taylor +# Copyright (C) 2005, 2006 Collabora Ltd. +# +# SPDX-License-Identifier: MIT +# +# Permission is hereby granted, free of charge, to any person +# obtaining a copy of this software and associated documentation +# files (the "Software"), to deal in the Software without +# restriction, including without limitation the rights to use, copy, +# modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +# DEALINGS IN THE SOFTWARE. + +__all__ = ('method', 'signal') +__docformat__ = 'restructuredtext' + +import inspect + +from dbus import validate_interface_name, Signature, validate_member_name +from dbus.lowlevel import SignalMessage +from dbus.exceptions import DBusException +from dbus._compat import is_py2 + + +def method(dbus_interface, in_signature=None, out_signature=None, + async_callbacks=None, + sender_keyword=None, path_keyword=None, destination_keyword=None, + message_keyword=None, connection_keyword=None, + byte_arrays=False, + rel_path_keyword=None, **kwargs): + """Factory for decorators used to mark methods of a `dbus.service.Object` + to be exported on the D-Bus. + + The decorated method will be exported over D-Bus as the method of the + same name on the given D-Bus interface. + + :Parameters: + `dbus_interface` : str + Name of a D-Bus interface + `in_signature` : str or None + If not None, the signature of the method parameters in the usual + D-Bus notation + `out_signature` : str or None + If not None, the signature of the return value in the usual + D-Bus notation + `async_callbacks` : tuple containing (str,str), or None + If None (default) the decorated method is expected to return + values matching the `out_signature` as usual, or raise + an exception on error. If not None, the following applies: + + `async_callbacks` contains the names of two keyword arguments to + the decorated function, which will be used to provide a success + callback and an error callback (in that order). + + When the decorated method is called via the D-Bus, its normal + return value will be ignored; instead, a pair of callbacks are + passed as keyword arguments, and the decorated method is + expected to arrange for one of them to be called. + + On success the success callback must be called, passing the + results of this method as positional parameters in the format + given by the `out_signature`. + + On error the decorated method may either raise an exception + before it returns, or arrange for the error callback to be + called with an Exception instance as parameter. + + `sender_keyword` : str or None + If not None, contains the name of a keyword argument to the + decorated function, conventionally ``'sender'``. When the + method is called, the sender's unique name will be passed as + this keyword argument. + + `path_keyword` : str or None + If not None (the default), the decorated method will receive + the destination object path as a keyword argument with this + name. Normally you already know the object path, but in the + case of "fallback paths" you'll usually want to use the object + path in the method's implementation. + + For fallback objects, `rel_path_keyword` (new in 0.82.2) is + likely to be more useful. + + :Since: 0.80.0? + + `rel_path_keyword` : str or None + If not None (the default), the decorated method will receive + the destination object path, relative to the path at which the + object was exported, as a keyword argument with this + name. For non-fallback objects the relative path will always be + '/'. + + :Since: 0.82.2 + + `destination_keyword` : str or None + If not None (the default), the decorated method will receive + the destination bus name as a keyword argument with this name. + Included for completeness - you shouldn't need this. + + :Since: 0.80.0? + + `message_keyword` : str or None + If not None (the default), the decorated method will receive + the `dbus.lowlevel.MethodCallMessage` as a keyword argument + with this name. + + :Since: 0.80.0? + + `connection_keyword` : str or None + If not None (the default), the decorated method will receive + the `dbus.connection.Connection` as a keyword argument + with this name. This is generally only useful for objects + that are available on more than one connection. + + :Since: 0.82.0 + + `utf8_strings` : bool + If False (default), D-Bus strings are passed to the decorated + method as objects of class dbus.String, a unicode subclass. + + If True, D-Bus strings are passed to the decorated method + as objects of class dbus.UTF8String, a str subclass guaranteed + to be encoded in UTF-8. + + This option does not affect object-paths and signatures, which + are always 8-bit strings (str subclass) encoded in ASCII. + + :Since: 0.80.0 + + `byte_arrays` : bool + If False (default), a byte array will be passed to the decorated + method as an `Array` (a list subclass) of `Byte` objects. + + If True, a byte array will be passed to the decorated method as + a `ByteArray`, a str subclass. This is usually what you want, + but is switched off by default to keep dbus-python's API + consistent. + + :Since: 0.80.0 + """ + validate_interface_name(dbus_interface) + + def decorator(func): + if hasattr(inspect, 'Signature'): + args = [] + + for arg in inspect.signature(func).parameters.values(): + if arg.kind in (inspect.Parameter.POSITIONAL_ONLY, + inspect.Parameter.POSITIONAL_OR_KEYWORD): + args.append(arg.name) + else: + args = inspect.getargspec(func)[0] + + args.pop(0) + + if async_callbacks: + if type(async_callbacks) != tuple: + raise TypeError('async_callbacks must be a tuple of (keyword for return callback, keyword for error callback)') + if len(async_callbacks) != 2: + raise ValueError('async_callbacks must be a tuple of (keyword for return callback, keyword for error callback)') + args.remove(async_callbacks[0]) + args.remove(async_callbacks[1]) + + if sender_keyword: + args.remove(sender_keyword) + if rel_path_keyword: + args.remove(rel_path_keyword) + if path_keyword: + args.remove(path_keyword) + if destination_keyword: + args.remove(destination_keyword) + if message_keyword: + args.remove(message_keyword) + if connection_keyword: + args.remove(connection_keyword) + + if in_signature: + in_sig = tuple(Signature(in_signature)) + + if len(in_sig) > len(args): + raise ValueError('input signature is longer than the number of arguments taken') + elif len(in_sig) < len(args): + raise ValueError('input signature is shorter than the number of arguments taken') + + func._dbus_is_method = True + func._dbus_async_callbacks = async_callbacks + func._dbus_interface = dbus_interface + func._dbus_in_signature = in_signature + func._dbus_out_signature = out_signature + func._dbus_sender_keyword = sender_keyword + func._dbus_path_keyword = path_keyword + func._dbus_rel_path_keyword = rel_path_keyword + func._dbus_destination_keyword = destination_keyword + func._dbus_message_keyword = message_keyword + func._dbus_connection_keyword = connection_keyword + func._dbus_args = args + func._dbus_get_args_options = dict(byte_arrays=byte_arrays) + if 'utf8_strings' in kwargs: + raise TypeError("unexpected keyword argument 'utf8_strings'") + return func + + return decorator + + +def signal(dbus_interface, signature=None, path_keyword=None, + rel_path_keyword=None): + """Factory for decorators used to mark methods of a `dbus.service.Object` + to emit signals on the D-Bus. + + Whenever the decorated method is called in Python, after the method + body is executed, a signal with the same name as the decorated method, + with the given D-Bus interface, will be emitted from this object. + + :Parameters: + `dbus_interface` : str + The D-Bus interface whose signal is emitted + `signature` : str + The signature of the signal in the usual D-Bus notation + + `path_keyword` : str or None + A keyword argument to the decorated method. If not None, + that argument will not be emitted as an argument of + the signal, and when the signal is emitted, it will appear + to come from the object path given by the keyword argument. + + Note that when calling the decorated method, you must always + pass in the object path as a keyword argument, not as a + positional argument. + + This keyword argument cannot be used on objects where + the class attribute ``SUPPORTS_MULTIPLE_OBJECT_PATHS`` is true. + + :Deprecated: since 0.82.0. Use `rel_path_keyword` instead. + + `rel_path_keyword` : str or None + A keyword argument to the decorated method. If not None, + that argument will not be emitted as an argument of + the signal. + + When the signal is emitted, if the named keyword argument is given, + the signal will appear to come from the object path obtained by + appending the keyword argument to the object's object path. + This is useful to implement "fallback objects" (objects which + own an entire subtree of the object-path tree). + + If the object is available at more than one object-path on the + same or different connections, the signal will be emitted at + an appropriate object-path on each connection - for instance, + if the object is exported at /abc on connection 1 and at + /def and /x/y/z on connection 2, and the keyword argument is + /foo, then signals will be emitted from /abc/foo and /def/foo + on connection 1, and /x/y/z/foo on connection 2. + + :Since: 0.82.0 + """ + validate_interface_name(dbus_interface) + + if path_keyword is not None: + from warnings import warn + warn(DeprecationWarning('dbus.service.signal::path_keyword has been ' + 'deprecated since dbus-python 0.82.0, and ' + 'will not work on objects that support ' + 'multiple object paths'), + DeprecationWarning, stacklevel=2) + if rel_path_keyword is not None: + raise TypeError('dbus.service.signal::path_keyword and ' + 'rel_path_keyword cannot both be used') + + def decorator(func): + member_name = func.__name__ + validate_member_name(member_name) + + def emit_signal(self, *args, **keywords): + abs_path = None + if path_keyword is not None: + if self.SUPPORTS_MULTIPLE_OBJECT_PATHS: + raise TypeError('path_keyword cannot be used on the ' + 'signals of an object that supports ' + 'multiple object paths') + abs_path = keywords.pop(path_keyword, None) + if (abs_path != self.__dbus_object_path__ and + not self.__dbus_object_path__.startswith(abs_path + '/')): + raise ValueError('Path %r is not below %r', abs_path, + self.__dbus_object_path__) + + rel_path = None + if rel_path_keyword is not None: + rel_path = keywords.pop(rel_path_keyword, None) + + func(self, *args, **keywords) + + for location in self.locations: + if abs_path is None: + # non-deprecated case + if rel_path is None or rel_path in ('/', ''): + object_path = location[1] + else: + # will be validated by SignalMessage ctor in a moment + object_path = location[1] + rel_path + else: + object_path = abs_path + + message = SignalMessage(object_path, + dbus_interface, + member_name) + message.append(signature=signature, *args) + + location[0].send_message(message) + # end emit_signal + + if hasattr(inspect, 'Signature'): + args = [] + + for arg in inspect.signature(func).parameters.values(): + if arg.kind in (inspect.Parameter.POSITIONAL_ONLY, + inspect.Parameter.POSITIONAL_OR_KEYWORD): + args.append(arg.name) + else: + args = inspect.getargspec(func)[0] + + args.pop(0) + + for keyword in rel_path_keyword, path_keyword: + if keyword is not None: + try: + args.remove(keyword) + except ValueError: + raise ValueError('function has no argument "%s"' % keyword) + + if signature: + sig = tuple(Signature(signature)) + + if len(sig) > len(args): + raise ValueError('signal signature is longer than the number of arguments provided') + elif len(sig) < len(args): + raise ValueError('signal signature is shorter than the number of arguments provided') + + emit_signal.__name__ = func.__name__ + emit_signal.__doc__ = func.__doc__ + emit_signal._dbus_is_signal = True + emit_signal._dbus_interface = dbus_interface + emit_signal._dbus_signature = signature + emit_signal._dbus_args = args + return emit_signal + + return decorator diff --git a/venv/lib/python3.12/site-packages/dbus/exceptions.py b/venv/lib/python3.12/site-packages/dbus/exceptions.py new file mode 100644 index 0000000..870b731 --- /dev/null +++ b/venv/lib/python3.12/site-packages/dbus/exceptions.py @@ -0,0 +1,133 @@ +"""D-Bus exceptions.""" + +# Copyright (C) 2007 Collabora Ltd. +# +# SPDX-License-Identifier: MIT +# +# Permission is hereby granted, free of charge, to any person +# obtaining a copy of this software and associated documentation +# files (the "Software"), to deal in the Software without +# restriction, including without limitation the rights to use, copy, +# modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +# DEALINGS IN THE SOFTWARE. + +__all__ = ('DBusException', 'MissingErrorHandlerException', + 'MissingReplyHandlerException', 'ValidationException', + 'IntrospectionParserException', 'UnknownMethodException', + 'NameExistsException') + +from dbus._compat import is_py3 + + +class DBusException(Exception): + + include_traceback = False + """If True, tracebacks will be included in the exception message sent to + D-Bus clients. + + Exceptions that are not DBusException subclasses always behave + as though this is True. Set this to True on DBusException subclasses + that represent a programming error, and leave it False on subclasses that + represent an expected failure condition (e.g. a network server not + responding).""" + + def __init__(self, *args, **kwargs): + name = kwargs.pop('name', None) + if name is not None or getattr(self, '_dbus_error_name', None) is None: + self._dbus_error_name = name + if kwargs: + raise TypeError('DBusException does not take keyword arguments: %s' + % ', '.join(kwargs.keys())) + Exception.__init__(self, *args) + + def __unicode__(self): + """Return a unicode error""" + # We can't just use Exception.__unicode__ because it chains up weirdly. + # https://code.launchpad.net/~mvo/ubuntu/quantal/dbus-python/lp846044/+merge/129214 + if len(self.args) > 1: + s = unicode(self.args) + else: + s = ''.join(self.args) + + if self._dbus_error_name is not None: + return '%s: %s' % (self._dbus_error_name, s) + else: + return s + + def __str__(self): + """Return a str error""" + s = Exception.__str__(self) + if self._dbus_error_name is not None: + return '%s: %s' % (self._dbus_error_name, s) + else: + return s + + def get_dbus_message(self): + if len(self.args) > 1: + s = str(self.args) + else: + s = ''.join(self.args) + + if isinstance(s, bytes): + return s.decode('utf-8', 'replace') + + return s + + def get_dbus_name(self): + return self._dbus_error_name + +class MissingErrorHandlerException(DBusException): + + include_traceback = True + + def __init__(self): + DBusException.__init__(self, "error_handler not defined: if you define a reply_handler you must also define an error_handler") + +class MissingReplyHandlerException(DBusException): + + include_traceback = True + + def __init__(self): + DBusException.__init__(self, "reply_handler not defined: if you define an error_handler you must also define a reply_handler") + +class ValidationException(DBusException): + + include_traceback = True + + def __init__(self, msg=''): + DBusException.__init__(self, "Error validating string: %s"%msg) + +class IntrospectionParserException(DBusException): + + include_traceback = True + + def __init__(self, msg=''): + DBusException.__init__(self, "Error parsing introspect data: %s"%msg) + +class UnknownMethodException(DBusException): + + include_traceback = True + _dbus_error_name = 'org.freedesktop.DBus.Error.UnknownMethod' + + def __init__(self, method): + DBusException.__init__(self, "Unknown method: %s"%method) + +class NameExistsException(DBusException): + + include_traceback = True + + def __init__(self, name): + DBusException.__init__(self, "Bus name already exists: %s"%name) diff --git a/venv/lib/python3.12/site-packages/dbus/gi_service.py b/venv/lib/python3.12/site-packages/dbus/gi_service.py new file mode 100644 index 0000000..f68b088 --- /dev/null +++ b/venv/lib/python3.12/site-packages/dbus/gi_service.py @@ -0,0 +1,87 @@ +"""Support code for implementing D-Bus services via PyGI.""" + +# Copyright (C) 2007 Collabora Ltd. +# +# SPDX-License-Identifier: MIT +# +# Permission is hereby granted, free of charge, to any person +# obtaining a copy of this software and associated documentation +# files (the "Software"), to deal in the Software without +# restriction, including without limitation the rights to use, copy, +# modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +# DEALINGS IN THE SOFTWARE. + +__all__ = ['ExportedGObject'] + +from gi.repository import GObject +import dbus.service + +# The odd syntax used here is required so that the code is compatible with +# both Python 2 and Python 3. It essentially creates a new class called +# ExportedGObject with a metaclass of ExportGObjectType and an __init__() +# function. +# +# Because GObject and `dbus.service.Object` both have custom metaclasses, the +# naive approach using simple multiple inheritance won't work. This class has +# `ExportedGObjectType` as its metaclass, which is sufficient to make it work +# correctly. + +class ExportedGObjectType(GObject.GObject.__class__, dbus.service.InterfaceType): + """A metaclass which inherits from both GObjectMeta and + `dbus.service.InterfaceType`. Used as the metaclass for `ExportedGObject`. + """ + def __init__(cls, name, bases, dct): + GObject.GObject.__class__.__init__(cls, name, bases, dct) + dbus.service.InterfaceType.__init__(cls, name, bases, dct) + + +def ExportedGObject__init__(self, conn=None, object_path=None, **kwargs): + """Initialize an exported GObject. + + :Parameters: + `conn` : dbus.connection.Connection + The D-Bus connection or bus + `object_path` : str + The object path at which to register this object. + :Keywords: + `bus_name` : dbus.service.BusName + A bus name to be held on behalf of this object, or None. + `gobject_properties` : dict + GObject properties to be set on the constructed object. + + Any unrecognised keyword arguments will also be interpreted + as GObject properties. + """ + bus_name = kwargs.pop('bus_name', None) + gobject_properties = kwargs.pop('gobject_properties', None) + + if gobject_properties is not None: + kwargs.update(gobject_properties) + GObject.GObject.__init__(self, **kwargs) + dbus.service.Object.__init__(self, conn=conn, + object_path=object_path, + bus_name=bus_name) + +ExportedGObject__doc__ = ''' +A GObject which is exported on D-Bus. +''' + +ExportedGObject = ExportedGObjectType( + 'ExportedGObject', + (GObject.GObject, dbus.service.Object), + {'__init__': ExportedGObject__init__, + '__doc__': ExportedGObject__doc__, + }) diff --git a/venv/lib/python3.12/site-packages/dbus/glib.py b/venv/lib/python3.12/site-packages/dbus/glib.py new file mode 100644 index 0000000..b521fcf --- /dev/null +++ b/venv/lib/python3.12/site-packages/dbus/glib.py @@ -0,0 +1,53 @@ +# Copyright (C) 2004 Anders Carlsson +# Copyright (C) 2004, 2005, 2006 Red Hat Inc. +# Copyright (C) 2005, 2006 Collabora Ltd. +# +# SPDX-License-Identifier: MIT +# +# Permission is hereby granted, free of charge, to any person +# obtaining a copy of this software and associated documentation +# files (the "Software"), to deal in the Software without +# restriction, including without limitation the rights to use, copy, +# modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +# DEALINGS IN THE SOFTWARE. + +"""Deprecated module which sets the default GLib main context as the mainloop +implementation within D-Bus, as a side-effect of being imported! + +This API is highly non-obvious, so instead of importing this module, +new programs which don't need pre-0.80 compatibility should use this +equivalent code:: + + from dbus.mainloop.glib import DBusGMainLoop + DBusGMainLoop(set_as_default=True) +""" +__docformat__ = 'restructuredtext' + +from dbus.mainloop.glib import DBusGMainLoop, threads_init +from warnings import warn as _warn + +init_threads = threads_init + +DBusGMainLoop(set_as_default=True) + +_warn(DeprecationWarning("""\ +Importing dbus.glib to use the GLib main loop with dbus-python is deprecated. +Instead, use this sequence: + + from dbus.mainloop.glib import DBusGMainLoop + + DBusGMainLoop(set_as_default=True) +"""), DeprecationWarning, stacklevel=2) diff --git a/venv/lib/python3.12/site-packages/dbus/lowlevel.py b/venv/lib/python3.12/site-packages/dbus/lowlevel.py new file mode 100644 index 0000000..59bd8fe --- /dev/null +++ b/venv/lib/python3.12/site-packages/dbus/lowlevel.py @@ -0,0 +1,38 @@ +# Copyright (C) 2006 Collabora Ltd. +# +# SPDX-License-Identifier: MIT +# +# Permission is hereby granted, free of charge, to any person +# obtaining a copy of this software and associated documentation +# files (the "Software"), to deal in the Software without +# restriction, including without limitation the rights to use, copy, +# modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +# DEALINGS IN THE SOFTWARE. + +"""Low-level interface to D-Bus.""" + +__all__ = ('PendingCall', 'Message', 'MethodCallMessage', + 'MethodReturnMessage', 'ErrorMessage', 'SignalMessage', + 'HANDLER_RESULT_HANDLED', 'HANDLER_RESULT_NOT_YET_HANDLED', + 'MESSAGE_TYPE_INVALID', 'MESSAGE_TYPE_METHOD_CALL', + 'MESSAGE_TYPE_METHOD_RETURN', 'MESSAGE_TYPE_ERROR', + 'MESSAGE_TYPE_SIGNAL') + +from _dbus_bindings import ( + ErrorMessage, HANDLER_RESULT_HANDLED, HANDLER_RESULT_NOT_YET_HANDLED, + MESSAGE_TYPE_ERROR, MESSAGE_TYPE_INVALID, MESSAGE_TYPE_METHOD_CALL, + MESSAGE_TYPE_METHOD_RETURN, MESSAGE_TYPE_SIGNAL, Message, + MethodCallMessage, MethodReturnMessage, PendingCall, SignalMessage) diff --git a/venv/lib/python3.12/site-packages/dbus/mainloop/__init__.py b/venv/lib/python3.12/site-packages/dbus/mainloop/__init__.py new file mode 100644 index 0000000..b0d20a9 --- /dev/null +++ b/venv/lib/python3.12/site-packages/dbus/mainloop/__init__.py @@ -0,0 +1,64 @@ +# Copyright (C) 2006 Collabora Ltd. +# +# SPDX-License-Identifier: MIT +# +# Permission is hereby granted, free of charge, to any person +# obtaining a copy of this software and associated documentation +# files (the "Software"), to deal in the Software without +# restriction, including without limitation the rights to use, copy, +# modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +# DEALINGS IN THE SOFTWARE. + +"""Base definitions, etc. for main loop integration. + +""" + +import _dbus_bindings + +NativeMainLoop = _dbus_bindings.NativeMainLoop + +NULL_MAIN_LOOP = _dbus_bindings.NULL_MAIN_LOOP +"""A null mainloop which doesn't actually do anything. + +For advanced users who want to dispatch events by hand. This is almost +certainly a bad idea - if in doubt, use the GLib main loop found in +`dbus.mainloop.glib`. +""" + +WATCH_READABLE = _dbus_bindings.WATCH_READABLE +"""Represents a file descriptor becoming readable. +Used to implement file descriptor watches.""" + +WATCH_WRITABLE = _dbus_bindings.WATCH_WRITABLE +"""Represents a file descriptor becoming readable. +Used to implement file descriptor watches.""" + +WATCH_HANGUP = _dbus_bindings.WATCH_HANGUP +"""Represents a file descriptor reaching end-of-file. +Used to implement file descriptor watches.""" + +WATCH_ERROR = _dbus_bindings.WATCH_ERROR +"""Represents an error condition on a file descriptor. +Used to implement file descriptor watches.""" + +__all__ = ( + # Imported into this module + 'NativeMainLoop', 'WATCH_READABLE', 'WATCH_WRITABLE', + 'WATCH_HANGUP', 'WATCH_ERROR', 'NULL_MAIN_LOOP', + + # Submodules + 'glib' + ) diff --git a/venv/lib/python3.12/site-packages/dbus/mainloop/__pycache__/__init__.cpython-312.pyc b/venv/lib/python3.12/site-packages/dbus/mainloop/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..97824e2b99159285ba2a20337a99f4bf9610436e GIT binary patch literal 700 zcmZuuO>fgM7`D^2>1Vof;0ENlPAnGN6(MD#+9qY~6m6Q6ip z7k&bNfKyMEazf(7EvPq6*jb~3G)sB?J|DJUJ^9}2wEKAyQo3xJ;jR7=`6o3Fh2 z3<$6Rfkg754JmvtSGL`5OPp`)aMjth7T`*=!n@s;OQoD)$BNFbmrD14wp1FWqCTQ1 zEkJ5^Gn0n${qcztQ;pC&FYppC4C0p>O=h}w7cy<`c!B1JVWfFMLS5zvgWhic5_gV= zO0JGMmC{S@Gr28SZ;k8Ib8L-_x5kM%s_?CKab4o>gMMy|&u*^r&I1}**2Lmh-Iyl6 zG%m*2oJ_8A+4a5Yu$3zqlW>M{u3|D>#CYlj#0%V*)%XldWW_|ptS*WOl_|W4V~+1* z`~_?{1b=2IW+|Fe;yH*!{vt+Emb?ptLqby&gp8z7kT54hDGgG@pWf=n`l}-pdkH;^ zoY@D*r7;p?AQ6p724O6M!&r~9y!m<_l7&y-us!}JN-QJ@^`h|zv-f=6KUnn-mfgzJf3{ZlSL*(Ej_ literal 0 HcmV?d00001 diff --git a/venv/lib/python3.12/site-packages/dbus/mainloop/__pycache__/glib.cpython-312.pyc b/venv/lib/python3.12/site-packages/dbus/mainloop/__pycache__/glib.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3e962abf6015d192c8da5098a23ae1491fbe8cb5 GIT binary patch literal 753 zcmY*XL5tHs6rLpQwp%v!AR;U*36(EO-!aE5(Z^-=wMNgS>oi-n{p|_uhOA!vO;M@MfA0dkB4V##a0m ztPcTPAckg$c{7jsEXe#km<4%f*6|SQ&@St~MYElHC+aOH(-SerITaFTN)=d0%TrCQ zP!g9$$P{N{&gP{VrvN6AzY3o{EzR^LM4UjtYR@h-r_97c3j4!xhP`TuW8B+aRrIns9Pv$)>hQoO|?-Y z0OmHRbM$M7_71=HZ@s(m2tsB!dZ= zX4g$C8eZh4gzh`!@@V&7SN-G7T%PD5m>zuQ0MvEhdEU>*$a{1(xO?9Fj*hPmMxW6B K+TZn#n(#kjS +# Copyright (C) 2005-2006 Collabora Ltd. +# +# SPDX-License-Identifier: MIT +# +# Permission is hereby granted, free of charge, to any person +# obtaining a copy of this software and associated documentation +# files (the "Software"), to deal in the Software without +# restriction, including without limitation the rights to use, copy, +# modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +# DEALINGS IN THE SOFTWARE. + +"""GLib main loop integration using libdbus-glib.""" + +__all__ = ('DBusGMainLoop', 'threads_init') + +from _dbus_glib_bindings import DBusGMainLoop, gthreads_init + +_dbus_gthreads_initialized = False +def threads_init(): + """Initialize threads in dbus-glib, if this has not already been done. + + This must be called before creating a second thread in a program that + uses this module. + """ + global _dbus_gthreads_initialized + if not _dbus_gthreads_initialized: + gthreads_init() + _dbus_gthreads_initialized = True diff --git a/venv/lib/python3.12/site-packages/dbus/proxies.py b/venv/lib/python3.12/site-packages/dbus/proxies.py new file mode 100644 index 0000000..487976c --- /dev/null +++ b/venv/lib/python3.12/site-packages/dbus/proxies.py @@ -0,0 +1,567 @@ +# Copyright (C) 2003-2007 Red Hat Inc. +# Copyright (C) 2003 David Zeuthen +# Copyright (C) 2004 Rob Taylor +# Copyright (C) 2005-2007 Collabora Ltd. +# +# SPDX-License-Identifier: MIT +# +# Permission is hereby granted, free of charge, to any person +# obtaining a copy of this software and associated documentation +# files (the "Software"), to deal in the Software without +# restriction, including without limitation the rights to use, copy, +# modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +# DEALINGS IN THE SOFTWARE. + +import logging + +try: + from threading import RLock +except ImportError: + from dummy_threading import RLock + +import _dbus_bindings +from dbus._expat_introspect_parser import process_introspection_data +from dbus.exceptions import ( + DBusException, IntrospectionParserException, MissingErrorHandlerException, + MissingReplyHandlerException) + +__docformat__ = 'restructuredtext' + + +_logger = logging.getLogger('dbus.proxies') + +from _dbus_bindings import ( + BUS_DAEMON_IFACE, BUS_DAEMON_NAME, BUS_DAEMON_PATH, INTROSPECTABLE_IFACE, + LOCAL_PATH) +from dbus._compat import is_py2 + + +class _DeferredMethod: + """A proxy method which will only get called once we have its + introspection reply. + """ + def __init__(self, proxy_method, append, block): + self._proxy_method = proxy_method + # the test suite relies on the existence of this property + self._method_name = proxy_method._method_name + self._append = append + self._block = block + + def __call__(self, *args, **keywords): + if ('reply_handler' in keywords or + keywords.get('ignore_reply', False)): + # defer the async call til introspection finishes + self._append(self._proxy_method, args, keywords) + return None + else: + # we're being synchronous, so block + self._block() + return self._proxy_method(*args, **keywords) + + def call_async(self, *args, **keywords): + self._append(self._proxy_method, args, keywords) + + +class _ProxyMethod: + """A proxy method. + + Typically a member of a ProxyObject. Calls to the + method produce messages that travel over the Bus and are routed + to a specific named Service. + """ + def __init__(self, proxy, connection, bus_name, object_path, method_name, + iface): + if object_path == LOCAL_PATH: + raise DBusException('Methods may not be called on the reserved ' + 'path %s' % LOCAL_PATH) + + # trust that the proxy, and the properties it had, are OK + self._proxy = proxy + self._connection = connection + self._named_service = bus_name + self._object_path = object_path + # fail early if the method name is bad + _dbus_bindings.validate_member_name(method_name) + # the test suite relies on the existence of this property + self._method_name = method_name + # fail early if the interface name is bad + if iface is not None: + _dbus_bindings.validate_interface_name(iface) + self._dbus_interface = iface + + def __call__(self, *args, **keywords): + reply_handler = keywords.pop('reply_handler', None) + error_handler = keywords.pop('error_handler', None) + ignore_reply = keywords.pop('ignore_reply', False) + signature = keywords.pop('signature', None) + + if reply_handler is not None or error_handler is not None: + if reply_handler is None: + raise MissingReplyHandlerException() + elif error_handler is None: + raise MissingErrorHandlerException() + elif ignore_reply: + raise TypeError('ignore_reply and reply_handler cannot be ' + 'used together') + + dbus_interface = keywords.pop('dbus_interface', self._dbus_interface) + + if signature is None: + if dbus_interface is None: + key = self._method_name + else: + key = dbus_interface + '.' + self._method_name + + signature = self._proxy._introspect_method_map.get(key, None) + + if ignore_reply or reply_handler is not None: + self._connection.call_async(self._named_service, + self._object_path, + dbus_interface, + self._method_name, + signature, + args, + reply_handler, + error_handler, + **keywords) + else: + return self._connection.call_blocking(self._named_service, + self._object_path, + dbus_interface, + self._method_name, + signature, + args, + **keywords) + + def call_async(self, *args, **keywords): + reply_handler = keywords.pop('reply_handler', None) + error_handler = keywords.pop('error_handler', None) + signature = keywords.pop('signature', None) + + dbus_interface = keywords.pop('dbus_interface', self._dbus_interface) + + if signature is None: + if dbus_interface: + key = dbus_interface + '.' + self._method_name + else: + key = self._method_name + signature = self._proxy._introspect_method_map.get(key, None) + + self._connection.call_async(self._named_service, + self._object_path, + dbus_interface, + self._method_name, + signature, + args, + reply_handler, + error_handler, + **keywords) + + +class ProxyObject(object): + """A proxy to the remote Object. + + A ProxyObject is provided by the Bus. ProxyObjects + have member functions, and can be called like normal Python objects. + """ + ProxyMethodClass = _ProxyMethod + DeferredMethodClass = _DeferredMethod + + INTROSPECT_STATE_DONT_INTROSPECT = 0 + INTROSPECT_STATE_INTROSPECT_IN_PROGRESS = 1 + INTROSPECT_STATE_INTROSPECT_DONE = 2 + + def __init__(self, conn=None, bus_name=None, object_path=None, + introspect=True, follow_name_owner_changes=False, **kwargs): + """Initialize the proxy object. + + :Parameters: + `conn` : `dbus.connection.Connection` + The bus or connection on which to find this object. + The keyword argument `bus` is a deprecated alias for this. + `bus_name` : str + A bus name for the application owning the object, to be used + as the destination for method calls and the sender for + signal matches. The keyword argument ``named_service`` is a + deprecated alias for this. + `object_path` : str + The object path at which the application exports the object + `introspect` : bool + If true (default), attempt to introspect the remote + object to find out supported methods and their signatures + `follow_name_owner_changes` : bool + If true (default is false) and the `bus_name` is a + well-known name, follow ownership changes for that name + """ + bus = kwargs.pop('bus', None) + if bus is not None: + if conn is not None: + raise TypeError('conn and bus cannot both be specified') + conn = bus + from warnings import warn + warn('Passing the bus parameter to ProxyObject by name is ' + 'deprecated: please use positional parameters', + DeprecationWarning, stacklevel=2) + named_service = kwargs.pop('named_service', None) + if named_service is not None: + if bus_name is not None: + raise TypeError('bus_name and named_service cannot both be ' + 'specified') + bus_name = named_service + from warnings import warn + warn('Passing the named_service parameter to ProxyObject by name ' + 'is deprecated: please use positional parameters', + DeprecationWarning, stacklevel=2) + if kwargs: + raise TypeError('ProxyObject.__init__ does not take these ' + 'keyword arguments: %s' + % ', '.join(kwargs.keys())) + + if follow_name_owner_changes: + # we don't get the signals unless the Bus has a main loop + # XXX: using Bus internals + conn._require_main_loop() + + self._bus = conn + + if bus_name is not None: + _dbus_bindings.validate_bus_name(bus_name) + # the attribute is still called _named_service for the moment, + # for the benefit of telepathy-python + self._named_service = self._requested_bus_name = bus_name + + _dbus_bindings.validate_object_path(object_path) + self.__dbus_object_path__ = object_path + + if not follow_name_owner_changes: + self._named_service = conn.activate_name_owner(bus_name) + + #PendingCall object for Introspect call + self._pending_introspect = None + #queue of async calls waiting on the Introspect to return + self._pending_introspect_queue = [] + #dictionary mapping method names to their input signatures + self._introspect_method_map = {} + + # must be a recursive lock because block() is called while locked, + # and calls the callback which re-takes the lock + self._introspect_lock = RLock() + + if not introspect or self.__dbus_object_path__ == LOCAL_PATH: + self._introspect_state = self.INTROSPECT_STATE_DONT_INTROSPECT + else: + self._introspect_state = self.INTROSPECT_STATE_INTROSPECT_IN_PROGRESS + + self._pending_introspect = self._Introspect() + + bus_name = property(lambda self: self._named_service, None, None, + """The bus name to which this proxy is bound. (Read-only, + may change.) + + If the proxy was instantiated using a unique name, this property + is that unique name. + + If the proxy was instantiated with a well-known name and with + ``follow_name_owner_changes`` set false (the default), this + property is the unique name of the connection that owned that + well-known name when the proxy was instantiated, which might + not actually own the requested well-known name any more. + + If the proxy was instantiated with a well-known name and with + ``follow_name_owner_changes`` set true, this property is that + well-known name. + """) + + requested_bus_name = property(lambda self: self._requested_bus_name, + None, None, + """The bus name which was requested when this proxy was + instantiated. + """) + + object_path = property(lambda self: self.__dbus_object_path__, + None, None, + """The object-path of this proxy.""") + + # XXX: We don't currently support this because it's the signal receiver + # that's responsible for tracking name owner changes, but it + # seems a natural thing to add in future. + #unique_bus_name = property(lambda self: something, None, None, + # """The unique name of the connection to which this proxy is + # currently bound. (Read-only, may change.) + # """) + + def connect_to_signal(self, signal_name, handler_function, dbus_interface=None, **keywords): + """Arrange for the given function to be called when the given signal + is received. + + :Parameters: + `signal_name` : str + The name of the signal + `handler_function` : callable + A function to be called when the signal is emitted by + the remote object. Its positional arguments will be the + arguments of the signal; optionally, it may be given + keyword arguments as described below. + `dbus_interface` : str + Optional interface with which to qualify the signal name. + If None (the default) the handler will be called whenever a + signal of the given member name is received, whatever + its interface. + :Keywords: + `utf8_strings` : bool + If True, the handler function will receive any string + arguments as dbus.UTF8String objects (a subclass of str + guaranteed to be UTF-8). If False (default) it will receive + any string arguments as dbus.String objects (a subclass of + unicode). + `byte_arrays` : bool + If True, the handler function will receive any byte-array + arguments as dbus.ByteArray objects (a subclass of str). + If False (default) it will receive any byte-array + arguments as a dbus.Array of dbus.Byte (subclasses of: + a list of ints). + `sender_keyword` : str + If not None (the default), the handler function will receive + the unique name of the sending endpoint as a keyword + argument with this name + `destination_keyword` : str + If not None (the default), the handler function will receive + the bus name of the destination (or None if the signal is a + broadcast, as is usual) as a keyword argument with this name. + `interface_keyword` : str + If not None (the default), the handler function will receive + the signal interface as a keyword argument with this name. + `member_keyword` : str + If not None (the default), the handler function will receive + the signal name as a keyword argument with this name. + `path_keyword` : str + If not None (the default), the handler function will receive + the object-path of the sending object as a keyword argument + with this name + `message_keyword` : str + If not None (the default), the handler function will receive + the `dbus.lowlevel.SignalMessage` as a keyword argument with + this name. + `arg...` : unicode or UTF-8 str + If there are additional keyword parameters of the form + ``arg``\\ *n*, match only signals where the *n*\\ th argument + is the value given for that keyword parameter. As of this time + only string arguments can be matched (in particular, + object paths and signatures can't). + """ + return \ + self._bus.add_signal_receiver(handler_function, + signal_name=signal_name, + dbus_interface=dbus_interface, + bus_name=self._named_service, + path=self.__dbus_object_path__, + **keywords) + + def _Introspect(self): + kwargs = {} + return self._bus.call_async(self._named_service, + self.__dbus_object_path__, + INTROSPECTABLE_IFACE, 'Introspect', '', (), + self._introspect_reply_handler, + self._introspect_error_handler, + require_main_loop=False, **kwargs) + + def _introspect_execute_queue(self): + # FIXME: potential to flood the bus + # We should make sure mainloops all have idle handlers + # and do one message per idle + for (proxy_method, args, keywords) in self._pending_introspect_queue: + proxy_method(*args, **keywords) + self._pending_introspect_queue = [] + + def _introspect_reply_handler(self, data): + self._introspect_lock.acquire() + try: + try: + self._introspect_method_map = process_introspection_data(data) + except IntrospectionParserException as e: + self._introspect_error_handler(e) + return + + self._introspect_state = self.INTROSPECT_STATE_INTROSPECT_DONE + self._pending_introspect = None + self._introspect_execute_queue() + finally: + self._introspect_lock.release() + + def _introspect_error_handler(self, error): + logging.basicConfig() + _logger.error("Introspect error on %s:%s: %s.%s: %s", + self._named_service, self.__dbus_object_path__, + error.__class__.__module__, error.__class__.__name__, + error) + self._introspect_lock.acquire() + try: + _logger.debug('Executing introspect queue due to error') + self._introspect_state = self.INTROSPECT_STATE_DONT_INTROSPECT + self._pending_introspect = None + self._introspect_execute_queue() + finally: + self._introspect_lock.release() + + def _introspect_block(self): + self._introspect_lock.acquire() + try: + if self._pending_introspect is not None: + self._pending_introspect.block() + # else someone still has a _DeferredMethod from before we + # finished introspection: no need to do anything special any more + finally: + self._introspect_lock.release() + + def _introspect_add_to_queue(self, callback, args, kwargs): + self._introspect_lock.acquire() + try: + if self._introspect_state == self.INTROSPECT_STATE_INTROSPECT_IN_PROGRESS: + self._pending_introspect_queue.append((callback, args, kwargs)) + else: + # someone still has a _DeferredMethod from before we + # finished introspection + callback(*args, **kwargs) + finally: + self._introspect_lock.release() + + def __getattr__(self, member): + if member.startswith('__') and member.endswith('__'): + raise AttributeError(member) + else: + return self.get_dbus_method(member) + + def get_dbus_method(self, member, dbus_interface=None): + """Return a proxy method representing the given D-Bus method. The + returned proxy method can be called in the usual way. For instance, :: + + proxy.get_dbus_method("Foo", dbus_interface='com.example.Bar')(123) + + is equivalent to:: + + proxy.Foo(123, dbus_interface='com.example.Bar') + + or even:: + + getattr(proxy, "Foo")(123, dbus_interface='com.example.Bar') + + However, using `get_dbus_method` is the only way to call D-Bus + methods with certain awkward names - if the author of a service + implements a method called ``connect_to_signal`` or even + ``__getattr__``, you'll need to use `get_dbus_method` to call them. + + For services which follow the D-Bus convention of CamelCaseMethodNames + this won't be a problem. + """ + + ret = self.ProxyMethodClass(self, self._bus, + self._named_service, + self.__dbus_object_path__, member, + dbus_interface) + + # this can be done without taking the lock - the worst that can + # happen is that we accidentally return a _DeferredMethod just after + # finishing introspection, in which case _introspect_add_to_queue and + # _introspect_block will do the right thing anyway + if self._introspect_state == self.INTROSPECT_STATE_INTROSPECT_IN_PROGRESS: + ret = self.DeferredMethodClass(ret, self._introspect_add_to_queue, + self._introspect_block) + + return ret + + def __repr__(self): + return ''%( + self._bus, self._named_service, self.__dbus_object_path__, id(self)) + __str__ = __repr__ + + +class Interface(object): + """An interface into a remote object. + + An Interface can be used to wrap ProxyObjects + so that calls can be routed to their correct + D-Bus interface. + """ + + def __init__(self, object, dbus_interface): + """Construct a proxy for the given interface on the given object. + + :Parameters: + `object` : `dbus.proxies.ProxyObject` or `dbus.Interface` + The remote object or another of its interfaces + `dbus_interface` : str + An interface the `object` implements + """ + if isinstance(object, Interface): + self._obj = object.proxy_object + else: + self._obj = object + self._dbus_interface = dbus_interface + + object_path = property (lambda self: self._obj.object_path, None, None, + "The D-Bus object path of the underlying object") + __dbus_object_path__ = object_path + bus_name = property (lambda self: self._obj.bus_name, None, None, + "The bus name to which the underlying proxy object " + "is bound") + requested_bus_name = property (lambda self: self._obj.requested_bus_name, + None, None, + "The bus name which was requested when the " + "underlying object was created") + proxy_object = property (lambda self: self._obj, None, None, + """The underlying proxy object""") + dbus_interface = property (lambda self: self._dbus_interface, None, None, + """The D-Bus interface represented""") + + def connect_to_signal(self, signal_name, handler_function, + dbus_interface=None, **keywords): + """Arrange for a function to be called when the given signal is + emitted. + + The parameters and keyword arguments are the same as for + `dbus.proxies.ProxyObject.connect_to_signal`, except that if + `dbus_interface` is None (the default), the D-Bus interface that + was passed to the `Interface` constructor is used. + """ + if not dbus_interface: + dbus_interface = self._dbus_interface + + return self._obj.connect_to_signal(signal_name, handler_function, + dbus_interface, **keywords) + + def __getattr__(self, member): + if member.startswith('__') and member.endswith('__'): + raise AttributeError(member) + else: + return self._obj.get_dbus_method(member, self._dbus_interface) + + def get_dbus_method(self, member, dbus_interface=None): + """Return a proxy method representing the given D-Bus method. + + This is the same as `dbus.proxies.ProxyObject.get_dbus_method` + except that if `dbus_interface` is None (the default), + the D-Bus interface that was passed to the `Interface` constructor + is used. + """ + if dbus_interface is None: + dbus_interface = self._dbus_interface + return self._obj.get_dbus_method(member, dbus_interface) + + def __repr__(self): + return ''%( + self._obj, self._dbus_interface, id(self)) + __str__ = __repr__ diff --git a/venv/lib/python3.12/site-packages/dbus/server.py b/venv/lib/python3.12/site-packages/dbus/server.py new file mode 100644 index 0000000..40a7bb9 --- /dev/null +++ b/venv/lib/python3.12/site-packages/dbus/server.py @@ -0,0 +1,119 @@ +# Copyright (C) 2008 Openismus GmbH +# Copyright (C) 2008 Collabora Ltd. +# +# SPDX-License-Identifier: MIT +# +# Permission is hereby granted, free of charge, to any person +# obtaining a copy of this software and associated documentation +# files (the "Software"), to deal in the Software without +# restriction, including without limitation the rights to use, copy, +# modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +# DEALINGS IN THE SOFTWARE. + +__all__ = ('Server', ) +__docformat__ = 'reStructuredText' + +from _dbus_bindings import _Server +from dbus.connection import Connection + +class Server(_Server): + """An opaque object representing a server that listens for connections from + other applications. + + This class is not useful to instantiate directly: you must subclass it and + either extend the method connection_added, or append to the + list on_connection_added. + + :Since: 0.83 + """ + + def __new__(cls, address, connection_class=Connection, + mainloop=None, auth_mechanisms=None): + """Construct a new Server. + + :Parameters: + `address` : str + Listen on this address. + `connection_class` : type + When new connections come in, instantiate this subclass + of dbus.connection.Connection to represent them. + The default is Connection. + `mainloop` : dbus.mainloop.NativeMainLoop or None + The main loop with which to associate the new connections. + `auth_mechanisms` : sequence of str + Authentication mechanisms to allow. The default is to allow + any authentication mechanism supported by ``libdbus``. + """ + return super(Server, cls).__new__(cls, address, connection_class, + mainloop, auth_mechanisms) + + def __init__(self, *args, **kwargs): + + self.__connections = {} + + self.on_connection_added = [] + """A list of callbacks to invoke when a connection is added. + They receive two arguments: this Server and the new Connection.""" + + self.on_connection_removed = [] + """A list of callbacks to invoke when a connection becomes + disconnected. They receive two arguments: this Server and the removed + Connection.""" + + # This method name is hard-coded in _dbus_bindings._Server. + # This is not public API. + def _on_new_connection(self, conn): + conn.call_on_disconnection(self.connection_removed) + self.connection_added(conn) + + def connection_added(self, conn): + """Respond to the creation of a new Connection. + + This base-class implementation just invokes the callbacks in + the on_connection_added attribute. + + :Parameters: + `conn` : dbus.connection.Connection + A D-Bus connection which has just been added. + + The type of this parameter is whatever was passed + to the Server constructor as the ``connection_class``. + """ + if self.on_connection_added: + for cb in self.on_connection_added: + cb(conn) + + def connection_removed(self, conn): + """Respond to the disconnection of a Connection. + + This base-class implementation just invokes the callbacks in + the on_connection_removed attribute. + + :Parameters: + `conn` : dbus.connection.Connection + A D-Bus connection which has just become disconnected. + + The type of this parameter is whatever was passed + to the Server constructor as the ``connection_class``. + """ + if self.on_connection_removed: + for cb in self.on_connection_removed: + cb(conn) + + address = property(_Server.get_address) + id = property(_Server.get_id) + is_connected = property(_Server.get_is_connected) + diff --git a/venv/lib/python3.12/site-packages/dbus/service.py b/venv/lib/python3.12/site-packages/dbus/service.py new file mode 100644 index 0000000..2e13d3c --- /dev/null +++ b/venv/lib/python3.12/site-packages/dbus/service.py @@ -0,0 +1,840 @@ +# Copyright (C) 2003-2006 Red Hat Inc. +# Copyright (C) 2003 David Zeuthen +# Copyright (C) 2004 Rob Taylor +# Copyright (C) 2005-2006 Collabora Ltd. +# +# SPDX-License-Identifier: MIT +# +# Permission is hereby granted, free of charge, to any person +# obtaining a copy of this software and associated documentation +# files (the "Software"), to deal in the Software without +# restriction, including without limitation the rights to use, copy, +# modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +# DEALINGS IN THE SOFTWARE. + +__all__ = ('BusName', 'Object', 'FallbackObject', 'method', 'signal') +__docformat__ = 'restructuredtext' + +import sys +import logging +import threading +import traceback +try: + from collections.abc import Sequence +except ImportError: + # Python 2 (and 3.x < 3.3, but we don't support those) + from collections import Sequence + +import _dbus_bindings +from dbus import ( + INTROSPECTABLE_IFACE, ObjectPath, SessionBus, Signature, Struct, + validate_bus_name, validate_object_path) +from dbus.decorators import method, signal +from dbus.exceptions import ( + DBusException, NameExistsException, UnknownMethodException) +from dbus.lowlevel import ErrorMessage, MethodReturnMessage, MethodCallMessage +from dbus.proxies import LOCAL_PATH +from dbus._compat import is_py2 + + +_logger = logging.getLogger('dbus.service') + + +class _VariantSignature(object): + """A fake method signature which, when iterated, yields an endless stream + of 'v' characters representing variants (handy with zip()). + + It has no string representation. + """ + def __iter__(self): + """Return self.""" + return self + + def __next__(self): + """Return 'v' whenever called.""" + return 'v' + + +class BusName(object): + """A base class for exporting your own Named Services across the Bus. + + When instantiated, objects of this class attempt to claim the given + well-known name on the given bus for the current process. The name is + released when the BusName object becomes unreferenced. + + If a well-known name is requested multiple times, multiple references + to the same BusName object will be returned. + + :Caveats: + + - Assumes that named services are only ever requested using this class - + if you request names from the bus directly, confusion may occur. + - Does not handle queueing. + """ + def __new__(cls, name, bus=None, allow_replacement=False , replace_existing=False, do_not_queue=False): + """Constructor, which may either return an existing cached object + or a new object. + + :Parameters: + `name` : str + The well-known name to be advertised + `bus` : dbus.Bus + A Bus on which this service will be advertised. + + Omitting this parameter or setting it to None has been + deprecated since version 0.82.1. For backwards compatibility, + if this is done, the global shared connection to the session + bus will be used. + + `allow_replacement` : bool + If True, other processes trying to claim the same well-known + name will take precedence over this one. + `replace_existing` : bool + If True, this process can take over the well-known name + from other processes already holding it. + `do_not_queue` : bool + If True, this service will not be placed in the queue of + services waiting for the requested name if another service + already holds it. + """ + validate_bus_name(name, allow_well_known=True, allow_unique=False) + + # if necessary, get default bus (deprecated) + if bus is None: + import warnings + warnings.warn('Omitting the "bus" parameter to ' + 'dbus.service.BusName.__init__ is deprecated', + DeprecationWarning, stacklevel=2) + bus = SessionBus() + + # see if this name is already defined, return it if so + # FIXME: accessing internals of Bus + if name in bus._bus_names: + return bus._bus_names[name] + + # otherwise register the name + name_flags = ( + (allow_replacement and _dbus_bindings.NAME_FLAG_ALLOW_REPLACEMENT or 0) | + (replace_existing and _dbus_bindings.NAME_FLAG_REPLACE_EXISTING or 0) | + (do_not_queue and _dbus_bindings.NAME_FLAG_DO_NOT_QUEUE or 0)) + + retval = bus.request_name(name, name_flags) + + # TODO: more intelligent tracking of bus name states? + if retval == _dbus_bindings.REQUEST_NAME_REPLY_PRIMARY_OWNER: + pass + elif retval == _dbus_bindings.REQUEST_NAME_REPLY_IN_QUEUE: + # queueing can happen by default, maybe we should + # track this better or let the user know if they're + # queued or not? + pass + elif retval == _dbus_bindings.REQUEST_NAME_REPLY_EXISTS: + raise NameExistsException(name) + elif retval == _dbus_bindings.REQUEST_NAME_REPLY_ALREADY_OWNER: + # if this is a shared bus which is being used by someone + # else in this process, this can happen legitimately + pass + else: + raise RuntimeError('requesting bus name %s returned unexpected value %s' % (name, retval)) + + # and create the object + bus_name = object.__new__(cls) + bus_name._bus = bus + bus_name._name = name + + # cache instance (weak ref only) + # FIXME: accessing Bus internals again + bus._bus_names[name] = bus_name + + return bus_name + + # do nothing because this is called whether or not the bus name + # object was retrieved from the cache or created new + def __init__(self, *args, **keywords): + pass + + # we can delete the low-level name here because these objects + # are guaranteed to exist only once for each bus name + def __del__(self): + self._bus.release_name(self._name) + pass + + def get_bus(self): + """Get the Bus this Service is on""" + return self._bus + + def get_name(self): + """Get the name of this service""" + return self._name + + def __repr__(self): + return '' % (self._name, self._bus, id(self)) + __str__ = __repr__ + + +def _method_lookup(self, method_name, dbus_interface): + """Walks the Python MRO of the given class to find the method to invoke. + + Returns two methods, the one to call, and the one it inherits from which + defines its D-Bus interface name, signature, and attributes. + """ + parent_method = None + candidate_class = None + successful = False + + # split up the cases when we do and don't have an interface because the + # latter is much simpler + if dbus_interface: + # search through the class hierarchy in python MRO order + for cls in self.__class__.__mro__: + # if we haven't got a candidate class yet, and we find a class with a + # suitably named member, save this as a candidate class + if (not candidate_class and method_name in cls.__dict__): + if ("_dbus_is_method" in cls.__dict__[method_name].__dict__ + and "_dbus_interface" in cls.__dict__[method_name].__dict__): + # however if it is annotated for a different interface + # than we are looking for, it cannot be a candidate + if cls.__dict__[method_name]._dbus_interface == dbus_interface: + candidate_class = cls + parent_method = cls.__dict__[method_name] + successful = True + break + else: + pass + else: + candidate_class = cls + + # if we have a candidate class, carry on checking this and all + # superclasses for a method annoated as a dbus method + # on the correct interface + if (candidate_class and method_name in cls.__dict__ + and "_dbus_is_method" in cls.__dict__[method_name].__dict__ + and "_dbus_interface" in cls.__dict__[method_name].__dict__ + and cls.__dict__[method_name]._dbus_interface == dbus_interface): + # the candidate class has a dbus method on the correct interface, + # or overrides a method that is, success! + parent_method = cls.__dict__[method_name] + successful = True + break + + else: + # simpler version of above + for cls in self.__class__.__mro__: + if (not candidate_class and method_name in cls.__dict__): + candidate_class = cls + + if (candidate_class and method_name in cls.__dict__ + and "_dbus_is_method" in cls.__dict__[method_name].__dict__): + parent_method = cls.__dict__[method_name] + successful = True + break + + if successful: + return (candidate_class.__dict__[method_name], parent_method) + else: + if dbus_interface: + raise UnknownMethodException('%s is not a valid method of interface %s' % (method_name, dbus_interface)) + else: + raise UnknownMethodException('%s is not a valid method' % method_name) + + +def _method_reply_return(connection, message, method_name, signature, *retval): + reply = MethodReturnMessage(message) + try: + reply.append(signature=signature, *retval) + except Exception as e: + logging.basicConfig() + if signature is None: + try: + signature = reply.guess_signature(retval) + ' (guessed)' + except Exception as e: + _logger.error('Unable to guess signature for arguments %r: ' + '%s: %s', retval, e.__class__, e) + raise + _logger.error('Unable to append %r to message with signature %s: ' + '%s: %s', retval, signature, e.__class__, e) + raise + + if not message.get_no_reply(): + connection.send_message(reply) + + +def _method_reply_error(connection, message, exception): + name = getattr(exception, '_dbus_error_name', None) + + if name is not None: + pass + elif getattr(exception, '__module__', '') in ('', '__main__'): + name = 'org.freedesktop.DBus.Python.%s' % exception.__class__.__name__ + else: + name = 'org.freedesktop.DBus.Python.%s.%s' % (exception.__module__, exception.__class__.__name__) + + et, ev, etb = sys.exc_info() + if isinstance(exception, DBusException) and not exception.include_traceback: + # We don't actually want the traceback anyway + contents = exception.get_dbus_message() + elif ev is exception: + # The exception was actually thrown, so we can get a traceback + contents = ''.join(traceback.format_exception(et, ev, etb)) + else: + # We don't have any traceback for it, e.g. + # async_err_cb(MyException('Failed to badger the mushroom')) + # see also https://bugs.freedesktop.org/show_bug.cgi?id=12403 + contents = ''.join(traceback.format_exception_only(exception.__class__, + exception)) + reply = ErrorMessage(message, name, contents) + + if not message.get_no_reply(): + connection.send_message(reply) + + +class InterfaceType(type): + def __init__(cls, name, bases, dct): + # these attributes are shared between all instances of the Interface + # object, so this has to be a dictionary that maps class names to + # the per-class introspection/interface data + class_table = getattr(cls, '_dbus_class_table', {}) + cls._dbus_class_table = class_table + interface_table = class_table[cls.__module__ + '.' + name] = {} + + # merge all the name -> method tables for all the interfaces + # implemented by our base classes into our own + for b in bases: + base_name = b.__module__ + '.' + b.__name__ + if getattr(b, '_dbus_class_table', False): + for (interface, method_table) in class_table[base_name].items(): + our_method_table = interface_table.setdefault(interface, {}) + our_method_table.update(method_table) + + # add in all the name -> method entries for our own methods/signals + for func in dct.values(): + if getattr(func, '_dbus_interface', False): + method_table = interface_table.setdefault(func._dbus_interface, {}) + method_table[func.__name__] = func + + super(InterfaceType, cls).__init__(name, bases, dct) + + # methods are different to signals, so we have two functions... :) + def _reflect_on_method(cls, func): + args = func._dbus_args + + if func._dbus_in_signature: + # convert signature into a tuple so length refers to number of + # types, not number of characters. the length is checked by + # the decorator to make sure it matches the length of args. + in_sig = tuple(Signature(func._dbus_in_signature)) + else: + # magic iterator which returns as many v's as we need + in_sig = _VariantSignature() + + if func._dbus_out_signature: + out_sig = Signature(func._dbus_out_signature) + else: + # its tempting to default to Signature('v'), but + # for methods that return nothing, providing incorrect + # introspection data is worse than providing none at all + out_sig = [] + + reflection_data = ' \n' % (func.__name__) + for pair in zip(in_sig, args): + reflection_data += ' \n' % pair + for type in out_sig: + reflection_data += ' \n' % type + reflection_data += ' \n' + + return reflection_data + + def _reflect_on_signal(cls, func): + args = func._dbus_args + + if func._dbus_signature: + # convert signature into a tuple so length refers to number of + # types, not number of characters + sig = tuple(Signature(func._dbus_signature)) + else: + # magic iterator which returns as many v's as we need + sig = _VariantSignature() + + reflection_data = ' \n' % (func.__name__) + for pair in zip(sig, args): + reflection_data = reflection_data + ' \n' % pair + reflection_data = reflection_data + ' \n' + + return reflection_data + + +# Define Interface as an instance of the metaclass InterfaceType, in a way +# that is compatible across both Python 2 and Python 3. +Interface = InterfaceType('Interface', (object,), {}) + + +#: A unique object used as the value of Object._object_path and +#: Object._connection if it's actually in more than one place +_MANY = object() + +class Object(Interface): + r"""A base class for exporting your own Objects across the Bus. + + Just inherit from Object and mark exported methods with the + @\ `dbus.service.method` or @\ `dbus.service.signal` decorator. + + Example:: + + class Example(dbus.service.object): + def __init__(self, object_path): + dbus.service.Object.__init__(self, dbus.SessionBus(), path) + self._last_input = None + + @dbus.service.method(interface='com.example.Sample', + in_signature='v', out_signature='s') + def StringifyVariant(self, var): + self.LastInputChanged(var) # emits the signal + return str(var) + + @dbus.service.signal(interface='com.example.Sample', + signature='v') + def LastInputChanged(self, var): + # run just before the signal is actually emitted + # just put "pass" if nothing should happen + self._last_input = var + + @dbus.service.method(interface='com.example.Sample', + in_signature='', out_signature='v') + def GetLastInput(self): + return self._last_input + """ + + #: If True, this object can be made available at more than one object path. + #: If True but `SUPPORTS_MULTIPLE_CONNECTIONS` is False, the object may + #: handle more than one object path, but they must all be on the same + #: connection. + SUPPORTS_MULTIPLE_OBJECT_PATHS = False + + #: If True, this object can be made available on more than one connection. + #: If True but `SUPPORTS_MULTIPLE_OBJECT_PATHS` is False, the object must + #: have the same object path on all its connections. + SUPPORTS_MULTIPLE_CONNECTIONS = False + + def __init__(self, conn=None, object_path=None, bus_name=None): + """Constructor. Either conn or bus_name is required; object_path + is also required. + + :Parameters: + `conn` : dbus.connection.Connection or None + The connection on which to export this object. + + If None, use the Bus associated with the given ``bus_name``. + If there is no ``bus_name`` either, the object is not + initially available on any Connection. + + For backwards compatibility, if an instance of + dbus.service.BusName is passed as the first parameter, + this is equivalent to passing its associated Bus as + ``conn``, and passing the BusName itself as ``bus_name``. + + `object_path` : str or None + A D-Bus object path at which to make this Object available + immediately. If this is not None, a `conn` or `bus_name` must + also be provided. + + `bus_name` : dbus.service.BusName or None + Represents a well-known name claimed by this process. A + reference to the BusName object will be held by this + Object, preventing the name from being released during this + Object's lifetime (unless it's released manually). + """ + if object_path is not None: + validate_object_path(object_path) + + if isinstance(conn, BusName): + # someone's using the old API; don't gratuitously break them + bus_name = conn + conn = bus_name.get_bus() + elif conn is None: + if bus_name is not None: + # someone's using the old API but naming arguments, probably + conn = bus_name.get_bus() + + #: Either an object path, None or _MANY + self._object_path = None + #: Either a dbus.connection.Connection, None or _MANY + self._connection = None + #: A list of tuples (Connection, object path, False) where the False + #: is for future expansion (to support fallback paths) + self._locations = [] + #: Lock protecting `_locations`, `_connection` and `_object_path` + self._locations_lock = threading.Lock() + + #: True if this is a fallback object handling a whole subtree. + self._fallback = False + + self._name = bus_name + + if conn is None and object_path is not None: + raise TypeError('If object_path is given, either conn or bus_name ' + 'is required') + if conn is not None and object_path is not None: + self.add_to_connection(conn, object_path) + + @property + def __dbus_object_path__(self): + """The object-path at which this object is available. + Access raises AttributeError if there is no object path, or more than + one object path. + + Changed in 0.82.0: AttributeError can be raised. + """ + if self._object_path is _MANY: + raise AttributeError('Object %r has more than one object path: ' + 'use Object.locations instead' % self) + elif self._object_path is None: + raise AttributeError('Object %r has no object path yet' % self) + else: + return self._object_path + + @property + def connection(self): + """The Connection on which this object is available. + Access raises AttributeError if there is no Connection, or more than + one Connection. + + Changed in 0.82.0: AttributeError can be raised. + """ + if self._connection is _MANY: + raise AttributeError('Object %r is on more than one Connection: ' + 'use Object.locations instead' % self) + elif self._connection is None: + raise AttributeError('Object %r has no Connection yet' % self) + else: + return self._connection + + @property + def locations(self): + """An iterable over tuples representing locations at which this + object is available. + + Each tuple has at least two items, but may have more in future + versions of dbus-python, so do not rely on their exact length. + The first two items are the dbus.connection.Connection and the object + path. + + :Since: 0.82.0 + """ + return iter(self._locations) + + def add_to_connection(self, connection, path): + """Make this object accessible via the given D-Bus connection and + object path. + + :Parameters: + `connection` : dbus.connection.Connection + Export the object on this connection. If the class attribute + SUPPORTS_MULTIPLE_CONNECTIONS is False (default), this object + can only be made available on one connection; if the class + attribute is set True by a subclass, the object can be made + available on more than one connection. + + `path` : dbus.ObjectPath or other str + Place the object at this object path. If the class attribute + SUPPORTS_MULTIPLE_OBJECT_PATHS is False (default), this object + can only be made available at one object path; if the class + attribute is set True by a subclass, the object can be made + available with more than one object path. + + :Raises ValueError: if the object's class attributes do not allow the + object to be exported in the desired way. + :Since: 0.82.0 + """ + if path == LOCAL_PATH: + raise ValueError('Objects may not be exported on the reserved ' + 'path %s' % LOCAL_PATH) + + self._locations_lock.acquire() + try: + if (self._connection is not None and + self._connection is not connection and + not self.SUPPORTS_MULTIPLE_CONNECTIONS): + raise ValueError('%r is already exported on ' + 'connection %r' % (self, self._connection)) + + if (self._object_path is not None and + not self.SUPPORTS_MULTIPLE_OBJECT_PATHS and + self._object_path != path): + raise ValueError('%r is already exported at object ' + 'path %s' % (self, self._object_path)) + + connection._register_object_path(path, self._message_cb, + self._unregister_cb, + self._fallback) + + if self._connection is None: + self._connection = connection + elif self._connection is not connection: + self._connection = _MANY + + if self._object_path is None: + self._object_path = path + elif self._object_path != path: + self._object_path = _MANY + + self._locations.append((connection, path, self._fallback)) + finally: + self._locations_lock.release() + + def remove_from_connection(self, connection=None, path=None): + """Make this object inaccessible via the given D-Bus connection + and object path. If no connection or path is specified, + the object ceases to be accessible via any connection or path. + + :Parameters: + `connection` : dbus.connection.Connection or None + Only remove the object from this Connection. If None, + remove from all Connections on which it's exported. + `path` : dbus.ObjectPath or other str, or None + Only remove the object from this object path. If None, + remove from all object paths. + :Raises LookupError: + if the object was not exported on the requested connection + or path, or (if both are None) was not exported at all. + :Since: 0.81.1 + """ + self._locations_lock.acquire() + try: + if self._object_path is None or self._connection is None: + raise LookupError('%r is not exported' % self) + + if connection is not None or path is not None: + dropped = [] + for location in self._locations: + if ((connection is None or location[0] is connection) and + (path is None or location[1] == path)): + dropped.append(location) + else: + dropped = self._locations + self._locations = [] + + if not dropped: + raise LookupError('%r is not exported at a location matching ' + '(%r,%r)' % (self, connection, path)) + + for location in dropped: + try: + location[0]._unregister_object_path(location[1]) + except LookupError: + pass + if self._locations: + try: + self._locations.remove(location) + except ValueError: + pass + finally: + self._locations_lock.release() + + def _unregister_cb(self, connection): + # there's not really enough information to do anything useful here + _logger.info('Unregistering exported object %r from some path ' + 'on %r', self, connection) + + def _message_cb(self, connection, message): + if not isinstance(message, MethodCallMessage): + return + + try: + # lookup candidate method and parent method + method_name = message.get_member() + interface_name = message.get_interface() + (candidate_method, parent_method) = _method_lookup(self, method_name, interface_name) + + # set up method call parameters + args = message.get_args_list(**parent_method._dbus_get_args_options) + keywords = {} + + if parent_method._dbus_out_signature is not None: + signature = Signature(parent_method._dbus_out_signature) + else: + signature = None + + # set up async callback functions + if parent_method._dbus_async_callbacks: + (return_callback, error_callback) = parent_method._dbus_async_callbacks + keywords[return_callback] = lambda *retval: _method_reply_return(connection, message, method_name, signature, *retval) + keywords[error_callback] = lambda exception: _method_reply_error(connection, message, exception) + + # include the sender etc. if desired + if parent_method._dbus_sender_keyword: + keywords[parent_method._dbus_sender_keyword] = message.get_sender() + if parent_method._dbus_path_keyword: + keywords[parent_method._dbus_path_keyword] = message.get_path() + if parent_method._dbus_rel_path_keyword: + path = message.get_path() + rel_path = path + for exp in self._locations: + # pathological case: if we're exported in two places, + # one of which is a subtree of the other, then pick the + # subtree by preference (i.e. minimize the length of + # rel_path) + if exp[0] is connection: + if path == exp[1]: + rel_path = '/' + break + if exp[1] == '/': + # we already have rel_path == path at the beginning + continue + if path.startswith(exp[1] + '/'): + # yes we're in this exported subtree + suffix = path[len(exp[1]):] + if len(suffix) < len(rel_path): + rel_path = suffix + rel_path = ObjectPath(rel_path) + keywords[parent_method._dbus_rel_path_keyword] = rel_path + + if parent_method._dbus_destination_keyword: + keywords[parent_method._dbus_destination_keyword] = message.get_destination() + if parent_method._dbus_message_keyword: + keywords[parent_method._dbus_message_keyword] = message + if parent_method._dbus_connection_keyword: + keywords[parent_method._dbus_connection_keyword] = connection + + # call method + retval = candidate_method(self, *args, **keywords) + + # we're done - the method has got callback functions to reply with + if parent_method._dbus_async_callbacks: + return + + # otherwise we send the return values in a reply. if we have a + # signature, use it to turn the return value into a tuple as + # appropriate + if signature is not None: + signature_tuple = tuple(signature) + # if we have zero or one return values we want make a tuple + # for the _method_reply_return function, otherwise we need + # to check we're passing it a sequence + if len(signature_tuple) == 0: + if retval == None: + retval = () + else: + raise TypeError('%s has an empty output signature but did not return None' % + method_name) + elif len(signature_tuple) == 1: + retval = (retval,) + else: + if isinstance(retval, Sequence): + # multi-value signature, multi-value return... proceed + # unchanged + pass + else: + raise TypeError('%s has multiple output values in signature %s but did not return a sequence' % + (method_name, signature)) + + # no signature, so just turn the return into a tuple and send it as normal + else: + if retval is None: + retval = () + elif (isinstance(retval, tuple) + and not isinstance(retval, Struct)): + # If the return is a tuple that is not a Struct, we use it + # as-is on the assumption that there are multiple return + # values - this is the usual Python idiom. (fd.o #10174) + pass + else: + retval = (retval,) + + _method_reply_return(connection, message, method_name, signature, *retval) + except Exception as exception: + # send error reply + _method_reply_error(connection, message, exception) + + @method(INTROSPECTABLE_IFACE, in_signature='', out_signature='s', + path_keyword='object_path', connection_keyword='connection') + def Introspect(self, object_path, connection): + """Return a string of XML encoding this object's supported interfaces, + methods and signals. + """ + reflection_data = _dbus_bindings.DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE + reflection_data += '\n' % object_path + + interfaces = self._dbus_class_table[self.__class__.__module__ + '.' + self.__class__.__name__] + for (name, funcs) in interfaces.items(): + reflection_data += ' \n' % (name) + + for func in funcs.values(): + if getattr(func, '_dbus_is_method', False): + reflection_data += self.__class__._reflect_on_method(func) + elif getattr(func, '_dbus_is_signal', False): + reflection_data += self.__class__._reflect_on_signal(func) + + reflection_data += ' \n' + + for name in connection.list_exported_child_objects(object_path): + reflection_data += ' \n' % name + + reflection_data += '\n' + + return reflection_data + + def __repr__(self): + where = '' + if (self._object_path is not _MANY + and self._object_path is not None): + where = ' at %s' % self._object_path + return '<%s.%s%s at %#x>' % (self.__class__.__module__, + self.__class__.__name__, where, + id(self)) + __str__ = __repr__ + +class FallbackObject(Object): + """An object that implements an entire subtree of the object-path + tree. + + :Since: 0.82.0 + """ + + SUPPORTS_MULTIPLE_OBJECT_PATHS = True + + def __init__(self, conn=None, object_path=None): + """Constructor. + + Note that the superclass' ``bus_name`` __init__ argument is not + supported here. + + :Parameters: + `conn` : dbus.connection.Connection or None + The connection on which to export this object. If this is not + None, an `object_path` must also be provided. + + If None, the object is not initially available on any + Connection. + + `object_path` : str or None + A D-Bus object path at which to make this Object available + immediately. If this is not None, a `conn` must also be + provided. + + This object will implements all object-paths in the subtree + starting at this object-path, except where a more specific + object has been added. + """ + super(FallbackObject, self).__init__() + self._fallback = True + + if conn is None: + if object_path is not None: + raise TypeError('If object_path is given, conn is required') + elif object_path is None: + raise TypeError('If conn is given, object_path is required') + else: + self.add_to_connection(conn, object_path) diff --git a/venv/lib/python3.12/site-packages/dbus/types.py b/venv/lib/python3.12/site-packages/dbus/types.py new file mode 100644 index 0000000..461639e --- /dev/null +++ b/venv/lib/python3.12/site-packages/dbus/types.py @@ -0,0 +1,15 @@ +# Copyright 2006-2021 Collabora Ltd. +# Copyright 2011 Barry Warsaw +# SPDX-License-Identifier: MIT + +__all__ = ['ObjectPath', 'ByteArray', 'Signature', 'Byte', 'Boolean', + 'Int16', 'UInt16', 'Int32', 'UInt32', 'Int64', 'UInt64', + 'Double', 'String', 'Array', 'Struct', 'Dictionary', + 'UnixFd'] + +from _dbus_bindings import ( + Array, Boolean, Byte, ByteArray, Dictionary, Double, Int16, Int32, Int64, + ObjectPath, Signature, String, Struct, UInt16, UInt32, UInt64, + UnixFd) + +from dbus._compat import is_py2 diff --git a/venv/lib/python3.12/site-packages/dbus_fast-2.24.4.dist-info/INSTALLER b/venv/lib/python3.12/site-packages/dbus_fast-2.24.4.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/venv/lib/python3.12/site-packages/dbus_fast-2.24.4.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/venv/lib/python3.12/site-packages/dbus_fast-2.24.4.dist-info/LICENSE b/venv/lib/python3.12/site-packages/dbus_fast-2.24.4.dist-info/LICENSE new file mode 100644 index 0000000..6974ffc --- /dev/null +++ b/venv/lib/python3.12/site-packages/dbus_fast-2.24.4.dist-info/LICENSE @@ -0,0 +1,22 @@ + +MIT License + +Copyright (c) 2022 Bluetooth Devices Authors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/venv/lib/python3.12/site-packages/dbus_fast-2.24.4.dist-info/METADATA b/venv/lib/python3.12/site-packages/dbus_fast-2.24.4.dist-info/METADATA new file mode 100644 index 0000000..9fb0489 --- /dev/null +++ b/venv/lib/python3.12/site-packages/dbus_fast-2.24.4.dist-info/METADATA @@ -0,0 +1,262 @@ +Metadata-Version: 2.1 +Name: dbus-fast +Version: 2.24.4 +Summary: A faster version of dbus-next +Home-page: https://github.com/bluetooth-devices/dbus-fast +License: MIT +Author: Bluetooth Devices Authors +Author-email: bluetooth@koston.org +Requires-Python: >=3.8,<4.0 +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Natural Language :: English +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: 3.12 +Classifier: Programming Language :: Python :: 3.13 +Classifier: Topic :: Software Development :: Libraries +Project-URL: Bug Tracker, https://github.com/bluetooth-devices/dbus-fast/issues +Project-URL: Changelog, https://github.com/bluetooth-devices/dbus-fast/blob/main/CHANGELOG.md +Project-URL: Documentation, https://dbus-fast.readthedocs.io +Project-URL: Repository, https://github.com/bluetooth-devices/dbus-fast +Description-Content-Type: text/markdown + +# dbus-fast + +