From 2f45997b797c75379c604d4862b0e1614693b83f Mon Sep 17 00:00:00 2001 From: hellcat <> Date: Fri, 2 Jan 2026 19:10:22 +0800 Subject: [PATCH] no message --- .editorconfig | 0 .env.example | 0 .gitignore | 0 app/Services/Article/CacheTg.php | 0 app/Services/Article/Cmd.php | 0 app/Services/Article/Schema.php | 0 app/Services/Article_old.php | 0 app/Services/Country-meiyong.php | 0 app/Services/Cron.php | 28 +- app/Services/Cron/ArticleSchema.php | 0 app/Services/Cron/Book.php | 0 app/Services/Cron/FnTgPublish.php | 77 ++ app/Services/Cron/FreenodeCrawl.php | 0 app/Services/Cron/FreenodeFile.php | 0 app/Services/Cron/FreenodeLog.php | 0 app/Services/Cron/FreenodeMerge.php | 0 app/Services/Cron/FreenodePool.php | 0 app/Services/Cron/FreenodeSync.php | 0 app/Services/Cron/HttpQueue.php | 8 + app/Services/HttpQueue.php | 0 app/Services/OpenApi/Telegram.php | 9 +- app/Services/SDK/Master/Master.php | 0 app/Services/SDK/Master/Telegram.php | 0 app/Services/SlaveMap.php | 0 app/Services/Tg/Hook/Dog.php | 0 app/Services/Tg/Hook/Mod/Article.php | 0 app/Services/Tg/Hook/Mod/ArticleCache.php | 0 app/Services/Tg/Hook/Mod/ArticleConfig.php | 0 app/Services/Tg/Hook/Mod/ArticleSchema.php | 0 .../Tg/Hook/Mod/ArticleSiteMapGroup.php | 0 app/Services/Tg/Hook/Mod/Article_old.php | 0 app/Services/Tg/Hook/Mod/Base.php | 0 app/Services/Tg/Hook/Mod/Blade.php | 0 app/Services/Tg/Hook/Mod/BladeOld.php | 0 app/Services/Tg/Hook/Mod/Book.php | 0 app/Services/Tg/Hook/Mod/Box.php | 0 app/Services/Tg/Hook/Mod/Cron.php | 0 app/Services/Tg/Hook/Mod/Db.php | 0 app/Services/Tg/Hook/Mod/Dev.php | 0 app/Services/Tg/Hook/Mod/Dove.php | 0 app/Services/Tg/Hook/Mod/DoveSite.php | 0 app/Services/Tg/Hook/Mod/FreenodeFrom.php | 0 app/Services/Tg/Hook/Mod/FreenodePool.php | 0 app/Services/Tg/Hook/Mod/GemboxDns.php | 0 app/Services/Tg/Hook/Mod/Good.php | 0 app/Services/Tg/Hook/Mod/Hook.php | 0 app/Services/Tg/Hook/Mod/Hook_old.php | 0 app/Services/Tg/Hook/Mod/HttpQueue.php | 0 app/Services/Tg/Hook/Mod/Jctj.php | 0 app/Services/Tg/Hook/Mod/JctjOption.php | 0 app/Services/Tg/Hook/Mod/Note.php | 0 app/Services/Tg/Hook/Mod/Note_option.php | 0 app/Services/Tg/Hook/Mod/Option.php | 0 app/Services/Tg/Hook/Mod/Ship.php | 0 app/Services/Tg/Hook/Mod/SiteMap.php | 0 app/Services/Tg/Hook/Mod/SitePathMap.php | 0 app/Services/Tg/Hook/Mod/TelegramKey.php | 0 app/Services/Tg/Hook/Mod/Test.php | 0 app/Services/Tg/Hook/Mod/Tool.php | 0 app/Services/Tg/Hook/Mod/Upload.php | 0 app/Services/Tg/Http.php | 0 app/Services/TomTool/Telegram/Master.php | 29 +- app/Services/TomTool/Telegram/Sdk.php | 74 +- app/Services/TomTool/Telegram/Slave.php | 29 +- composer.json | 1 + composer.lock | 146 ++- fn的tg策略.md | 0 fn部署.md | 0 public/js/jquery.min.js | 0 public/upload/无标题.png | Bin resources/views/cmd.blade.php | 0 resources/views/cmd/image/upload.blade.php | 0 scripts/cron.php | 0 tg发送逻辑.md | 8 + vendor/composer/autoload_classmap.php | 409 ++++++- vendor/composer/autoload_psr4.php | 2 + vendor/composer/autoload_static.php | 419 ++++++- vendor/composer/installed.json | 150 +++ vendor/composer/installed.php | 22 +- .../tmp-b1bec4785aa3cb26f6cad297d3828558.zip | Bin vendor/intervention/gif/LICENSE | 21 + vendor/intervention/gif/composer.json | 44 + vendor/intervention/gif/phpunit.xml.dist | 13 + .../intervention/gif/src/AbstractEntity.php | 40 + .../gif/src/AbstractExtension.php | 10 + .../gif/src/Blocks/ApplicationExtension.php | 95 ++ vendor/intervention/gif/src/Blocks/Color.php | 100 ++ .../gif/src/Blocks/ColorTable.php | 140 +++ .../gif/src/Blocks/CommentExtension.php | 52 + .../gif/src/Blocks/DataSubBlock.php | 47 + .../gif/src/Blocks/FrameBlock.php | 262 ++++ .../src/Blocks/GraphicControlExtension.php | 159 +++ vendor/intervention/gif/src/Blocks/Header.php | 42 + .../intervention/gif/src/Blocks/ImageData.php | 80 ++ .../gif/src/Blocks/ImageDescriptor.php | 246 ++++ .../src/Blocks/LogicalScreenDescriptor.php | 254 ++++ .../Blocks/NetscapeApplicationExtension.php | 52 + .../gif/src/Blocks/PlainTextExtension.php | 63 + .../gif/src/Blocks/TableBasedImage.php | 50 + .../intervention/gif/src/Blocks/Trailer.php | 12 + vendor/intervention/gif/src/Builder.php | 219 ++++ vendor/intervention/gif/src/Decoder.php | 47 + .../gif/src/Decoders/AbstractDecoder.php | 165 +++ .../src/Decoders/AbstractPackedBitDecoder.php | 43 + .../Decoders/ApplicationExtensionDecoder.php | 71 ++ .../gif/src/Decoders/ColorDecoder.php | 38 + .../gif/src/Decoders/ColorTableDecoder.php | 28 + .../src/Decoders/CommentExtensionDecoder.php | 61 + .../gif/src/Decoders/DataSubBlockDecoder.php | 27 + .../gif/src/Decoders/FrameBlockDecoder.php | 53 + .../gif/src/Decoders/GifDataStreamDecoder.php | 59 + .../GraphicControlExtensionDecoder.php | 97 ++ .../gif/src/Decoders/HeaderDecoder.php | 42 + .../gif/src/Decoders/ImageDataDecoder.php | 42 + .../src/Decoders/ImageDescriptorDecoder.php | 94 ++ .../LogicalScreenDescriptorDecoder.php | 139 +++ .../NetscapeApplicationExtensionDecoder.php | 9 + .../Decoders/PlainTextExtensionDecoder.php | 65 + .../src/Decoders/TableBasedImageDecoder.php | 42 + .../intervention/gif/src/DisposalMethod.php | 13 + .../gif/src/Encoders/AbstractEncoder.php | 24 + .../Encoders/ApplicationExtensionEncoder.php | 40 + .../gif/src/Encoders/ColorEncoder.php | 44 + .../gif/src/Encoders/ColorTableEncoder.php | 36 + .../src/Encoders/CommentExtensionEncoder.php | 47 + .../gif/src/Encoders/DataSubBlockEncoder.php | 30 + .../gif/src/Encoders/FrameBlockEncoder.php | 49 + .../gif/src/Encoders/GifDataStreamEncoder.php | 78 ++ .../GraphicControlExtensionEncoder.php | 73 ++ .../gif/src/Encoders/HeaderEncoder.php | 30 + .../gif/src/Encoders/ImageDataEncoder.php | 45 + .../src/Encoders/ImageDescriptorEncoder.php | 113 ++ .../LogicalScreenDescriptorEncoder.php | 111 ++ .../NetscapeApplicationExtensionEncoder.php | 39 + .../Encoders/PlainTextExtensionEncoder.php | 63 + .../src/Encoders/TableBasedImageEncoder.php | 29 + .../gif/src/Encoders/TrailerEncoder.php | 30 + .../gif/src/Exceptions/DecoderException.php | 9 + .../gif/src/Exceptions/EncoderException.php | 9 + .../gif/src/Exceptions/FormatException.php | 9 + .../src/Exceptions/NotReadableException.php | 9 + vendor/intervention/gif/src/GifDataStream.php | 225 ++++ vendor/intervention/gif/src/Splitter.php | 283 +++++ .../intervention/gif/src/Traits/CanDecode.php | 53 + .../intervention/gif/src/Traits/CanEncode.php | 49 + .../gif/src/Traits/CanHandleFiles.php | 56 + vendor/intervention/image/LICENSE | 21 + vendor/intervention/image/composer.json | 51 + .../src/Analyzers/ColorspaceAnalyzer.php | 12 + .../image/src/Analyzers/HeightAnalyzer.php | 12 + .../src/Analyzers/PixelColorAnalyzer.php | 18 + .../src/Analyzers/PixelColorsAnalyzer.php | 17 + .../image/src/Analyzers/ProfileAnalyzer.php | 12 + .../src/Analyzers/ResolutionAnalyzer.php | 12 + .../image/src/Analyzers/WidthAnalyzer.php | 12 + vendor/intervention/image/src/Collection.php | 217 ++++ .../image/src/Colors/AbstractColor.php | 116 ++ .../image/src/Colors/AbstractColorChannel.php | 92 ++ .../image/src/Colors/Cmyk/Channels/Cyan.php | 20 + .../image/src/Colors/Cmyk/Channels/Key.php | 10 + .../src/Colors/Cmyk/Channels/Magenta.php | 10 + .../image/src/Colors/Cmyk/Channels/Yellow.php | 10 + .../image/src/Colors/Cmyk/Color.php | 153 +++ .../image/src/Colors/Cmyk/Colorspace.php | 77 ++ .../Cmyk/Decoders/StringColorDecoder.php | 36 + .../image/src/Colors/Hsl/Channels/Hue.php | 30 + .../src/Colors/Hsl/Channels/Luminance.php | 30 + .../src/Colors/Hsl/Channels/Saturation.php | 30 + .../image/src/Colors/Hsl/Color.php | 132 ++ .../image/src/Colors/Hsl/Colorspace.php | 137 +++ .../Hsl/Decoders/StringColorDecoder.php | 39 + .../image/src/Colors/Hsv/Channels/Hue.php | 30 + .../src/Colors/Hsv/Channels/Saturation.php | 30 + .../image/src/Colors/Hsv/Channels/Value.php | 30 + .../image/src/Colors/Hsv/Color.php | 132 ++ .../image/src/Colors/Hsv/Colorspace.php | 122 ++ .../Hsv/Decoders/StringColorDecoder.php | 39 + .../intervention/image/src/Colors/Profile.php | 22 + .../image/src/Colors/Rgb/Channels/Alpha.php | 18 + .../image/src/Colors/Rgb/Channels/Blue.php | 10 + .../image/src/Colors/Rgb/Channels/Green.php | 10 + .../image/src/Colors/Rgb/Channels/Red.php | 30 + .../image/src/Colors/Rgb/Color.php | 179 +++ .../image/src/Colors/Rgb/Colorspace.php | 135 ++ .../Colors/Rgb/Decoders/HexColorDecoder.php | 46 + .../Rgb/Decoders/HtmlColornameDecoder.php | 176 +++ .../Rgb/Decoders/StringColorDecoder.php | 49 + .../Rgb/Decoders/TransparentColorDecoder.php | 30 + vendor/intervention/image/src/Config.php | 70 ++ .../image/src/Decoders/Base64ImageDecoder.php | 12 + .../image/src/Decoders/BinaryImageDecoder.php | 12 + .../image/src/Decoders/ColorObjectDecoder.php | 27 + .../src/Decoders/DataUriImageDecoder.php | 12 + .../Decoders/EncodedImageObjectDecoder.php | 12 + .../src/Decoders/FilePathImageDecoder.php | 12 + .../src/Decoders/FilePointerImageDecoder.php | 12 + .../image/src/Decoders/ImageObjectDecoder.php | 27 + .../src/Decoders/NativeObjectDecoder.php | 12 + .../src/Decoders/SplFileInfoImageDecoder.php | 12 + .../image/src/Drivers/AbstractDecoder.php | 146 +++ .../image/src/Drivers/AbstractDriver.php | 127 ++ .../image/src/Drivers/AbstractEncoder.php | 42 + .../src/Drivers/AbstractFontProcessor.php | 172 +++ .../image/src/Drivers/AbstractFrame.php | 25 + .../Gd/Analyzers/ColorspaceAnalyzer.php | 23 + .../Drivers/Gd/Analyzers/HeightAnalyzer.php | 22 + .../Gd/Analyzers/PixelColorAnalyzer.php | 51 + .../Gd/Analyzers/PixelColorsAnalyzer.php | 30 + .../Gd/Analyzers/ResolutionAnalyzer.php | 23 + .../Drivers/Gd/Analyzers/WidthAnalyzer.php | 22 + .../image/src/Drivers/Gd/Cloner.php | 90 ++ .../image/src/Drivers/Gd/ColorProcessor.php | 148 +++ .../image/src/Drivers/Gd/Core.php | 117 ++ .../Drivers/Gd/Decoders/AbstractDecoder.php | 57 + .../Gd/Decoders/Base64ImageDecoder.php | 27 + .../Gd/Decoders/BinaryImageDecoder.php | 68 ++ .../Gd/Decoders/DataUriImageDecoder.php | 37 + .../Gd/Decoders/EncodedImageObjectDecoder.php | 27 + .../Gd/Decoders/FilePathImageDecoder.php | 60 + .../Gd/Decoders/FilePointerImageDecoder.php | 32 + .../Gd/Decoders/NativeObjectDecoder.php | 109 ++ .../Gd/Decoders/SplFileInfoImageDecoder.php | 28 + .../image/src/Drivers/Gd/Driver.php | 163 +++ .../src/Drivers/Gd/Encoders/AvifEncoder.php | 25 + .../src/Drivers/Gd/Encoders/BmpEncoder.php | 25 + .../src/Drivers/Gd/Encoders/GifEncoder.php | 64 + .../src/Drivers/Gd/Encoders/JpegEncoder.php | 36 + .../src/Drivers/Gd/Encoders/PngEncoder.php | 52 + .../src/Drivers/Gd/Encoders/WebpEncoder.php | 27 + .../image/src/Drivers/Gd/FontProcessor.php | 107 ++ .../image/src/Drivers/Gd/Frame.php | 193 +++ .../Gd/Modifiers/AlignRotationModifier.php | 52 + .../Modifiers/BlendTransparencyModifier.php | 36 + .../src/Drivers/Gd/Modifiers/BlurModifier.php | 28 + .../Gd/Modifiers/BrightnessModifier.php | 26 + .../Drivers/Gd/Modifiers/ColorizeModifier.php | 31 + .../Gd/Modifiers/ColorspaceModifier.php | 30 + .../Drivers/Gd/Modifiers/ContainModifier.php | 93 ++ .../Drivers/Gd/Modifiers/ContrastModifier.php | 26 + .../Gd/Modifiers/CoverDownModifier.php | 19 + .../Drivers/Gd/Modifiers/CoverModifier.php | 59 + .../src/Drivers/Gd/Modifiers/CropModifier.php | 78 ++ .../Gd/Modifiers/DrawBezierModifier.php | 234 ++++ .../Gd/Modifiers/DrawEllipseModifier.php | 78 ++ .../Drivers/Gd/Modifiers/DrawLineModifier.php | 39 + .../Gd/Modifiers/DrawPixelModifier.php | 36 + .../Gd/Modifiers/DrawPolygonModifier.php | 51 + .../Gd/Modifiers/DrawRectangleModifier.php | 61 + .../src/Drivers/Gd/Modifiers/FillModifier.php | 67 + .../src/Drivers/Gd/Modifiers/FlipModifier.php | 26 + .../src/Drivers/Gd/Modifiers/FlopModifier.php | 26 + .../Drivers/Gd/Modifiers/GammaModifier.php | 26 + .../Gd/Modifiers/GreyscaleModifier.php | 26 + .../Drivers/Gd/Modifiers/InvertModifier.php | 26 + .../src/Drivers/Gd/Modifiers/PadModifier.php | 24 + .../Drivers/Gd/Modifiers/PixelateModifier.php | 26 + .../Drivers/Gd/Modifiers/PlaceModifier.php | 111 ++ .../Drivers/Gd/Modifiers/ProfileModifier.php | 25 + .../Gd/Modifiers/ProfileRemovalModifier.php | 24 + .../Gd/Modifiers/QuantizeColorsModifier.php | 65 + .../Gd/Modifiers/RemoveAnimationModifier.php | 26 + .../Gd/Modifiers/ResizeCanvasModifier.php | 32 + .../ResizeCanvasRelativeModifier.php | 16 + .../Gd/Modifiers/ResizeDownModifier.php | 16 + .../Drivers/Gd/Modifiers/ResizeModifier.php | 70 ++ .../Gd/Modifiers/ResolutionModifier.php | 29 + .../Drivers/Gd/Modifiers/RotateModifier.php | 106 ++ .../Gd/Modifiers/ScaleDownModifier.php | 21 + .../Drivers/Gd/Modifiers/ScaleModifier.php | 16 + .../Drivers/Gd/Modifiers/SharpenModifier.php | 45 + .../Gd/Modifiers/SliceAnimationModifier.php | 29 + .../src/Drivers/Gd/Modifiers/TextModifier.php | 145 +++ .../src/Drivers/Gd/Modifiers/TrimModifier.php | 85 ++ .../Imagick/Analyzers/ColorspaceAnalyzer.php | 23 + .../Imagick/Analyzers/HeightAnalyzer.php | 17 + .../Imagick/Analyzers/PixelColorAnalyzer.php | 36 + .../Imagick/Analyzers/PixelColorsAnalyzer.php | 25 + .../Imagick/Analyzers/ProfileAnalyzer.php | 25 + .../Imagick/Analyzers/ResolutionAnalyzer.php | 25 + .../Imagick/Analyzers/WidthAnalyzer.php | 17 + .../src/Drivers/Imagick/ColorProcessor.php | 45 + .../image/src/Drivers/Imagick/Core.php | 324 +++++ .../Imagick/Decoders/Base64ImageDecoder.php | 26 + .../Imagick/Decoders/BinaryImageDecoder.php | 47 + .../Imagick/Decoders/DataUriImageDecoder.php | 36 + .../Decoders/EncodedImageObjectDecoder.php | 27 + .../Imagick/Decoders/FilePathImageDecoder.php | 46 + .../Decoders/FilePointerImageDecoder.php | 32 + .../Imagick/Decoders/NativeObjectDecoder.php | 70 ++ .../Decoders/SplFileInfoImageDecoder.php | 27 + .../image/src/Drivers/Imagick/Driver.php | 175 +++ .../Drivers/Imagick/Encoders/AvifEncoder.php | 37 + .../Drivers/Imagick/Encoders/BmpEncoder.php | 29 + .../Drivers/Imagick/Encoders/GifEncoder.php | 34 + .../Drivers/Imagick/Encoders/HeicEncoder.php | 33 + .../Imagick/Encoders/Jpeg2000Encoder.php | 39 + .../Drivers/Imagick/Encoders/JpegEncoder.php | 57 + .../Drivers/Imagick/Encoders/PngEncoder.php | 46 + .../Drivers/Imagick/Encoders/TiffEncoder.php | 35 + .../Drivers/Imagick/Encoders/WebpEncoder.php | 47 + .../src/Drivers/Imagick/FontProcessor.php | 69 ++ .../image/src/Drivers/Imagick/Frame.php | 185 +++ .../Modifiers/AlignRotationModifier.php | 54 + .../Modifiers/BlendTransparencyModifier.php | 32 + .../Imagick/Modifiers/BlurModifier.php | 21 + .../Imagick/Modifiers/BrightnessModifier.php | 21 + .../Imagick/Modifiers/ColorizeModifier.php | 34 + .../Imagick/Modifiers/ColorspaceModifier.php | 51 + .../Imagick/Modifiers/ContainModifier.php | 95 ++ .../Imagick/Modifiers/ContrastModifier.php | 21 + .../Imagick/Modifiers/CoverDownModifier.php | 19 + .../Imagick/Modifiers/CoverModifier.php | 36 + .../Imagick/Modifiers/CropModifier.php | 75 ++ .../Imagick/Modifiers/DrawBezierModifier.php | 77 ++ .../Imagick/Modifiers/DrawEllipseModifier.php | 51 + .../Imagick/Modifiers/DrawLineModifier.php | 42 + .../Imagick/Modifiers/DrawPixelModifier.php | 30 + .../Imagick/Modifiers/DrawPolygonModifier.php | 64 + .../Modifiers/DrawRectangleModifier.php | 50 + .../Imagick/Modifiers/FillModifier.php | 63 + .../Imagick/Modifiers/FlipModifier.php | 21 + .../Imagick/Modifiers/FlopModifier.php | 21 + .../Imagick/Modifiers/GammaModifier.php | 21 + .../Imagick/Modifiers/GreyscaleModifier.php | 21 + .../Imagick/Modifiers/InvertModifier.php | 21 + .../Drivers/Imagick/Modifiers/PadModifier.php | 24 + .../Imagick/Modifiers/PixelateModifier.php | 34 + .../Imagick/Modifiers/PlaceModifier.php | 40 + .../Imagick/Modifiers/ProfileModifier.php | 25 + .../Modifiers/ProfileRemovalModifier.php | 25 + .../Modifiers/QuantizeColorsModifier.php | 37 + .../Modifiers/RemoveAnimationModifier.php | 26 + .../Modifiers/ResizeCanvasModifier.php | 27 + .../ResizeCanvasRelativeModifier.php | 16 + .../Imagick/Modifiers/ResizeDownModifier.php | 16 + .../Imagick/Modifiers/ResizeModifier.php | 36 + .../Imagick/Modifiers/ResolutionModifier.php | 20 + .../Imagick/Modifiers/RotateModifier.php | 28 + .../Imagick/Modifiers/ScaleDownModifier.php | 16 + .../Imagick/Modifiers/ScaleModifier.php | 16 + .../Imagick/Modifiers/SharpenModifier.php | 21 + .../Modifiers/SliceAnimationModifier.php | 24 + .../Imagick/Modifiers/StripMetaModifier.php | 34 + .../Imagick/Modifiers/TextModifier.php | 139 +++ .../Imagick/Modifiers/TrimModifier.php | 26 + .../image/src/Drivers/Specializable.php | 13 + .../src/Drivers/SpecializableAnalyzer.php | 21 + .../src/Drivers/SpecializableDecoder.php | 26 + .../src/Drivers/SpecializableEncoder.php | 13 + .../src/Drivers/SpecializableModifier.php | 21 + .../intervention/image/src/EncodedImage.php | 65 + .../image/src/Encoders/AutoEncoder.php | 25 + .../image/src/Encoders/AvifEncoder.php | 23 + .../image/src/Encoders/BmpEncoder.php | 15 + .../src/Encoders/FileExtensionEncoder.php | 69 ++ .../image/src/Encoders/FilePathEncoder.php | 38 + .../image/src/Encoders/GifEncoder.php | 20 + .../image/src/Encoders/HeicEncoder.php | 23 + .../image/src/Encoders/Jpeg2000Encoder.php | 23 + .../image/src/Encoders/JpegEncoder.php | 24 + .../image/src/Encoders/MediaTypeEncoder.php | 64 + .../image/src/Encoders/PngEncoder.php | 20 + .../image/src/Encoders/TiffEncoder.php | 23 + .../image/src/Encoders/WebpEncoder.php | 23 + .../src/Exceptions/AnimationException.php | 10 + .../image/src/Exceptions/ColorException.php | 10 + .../image/src/Exceptions/DecoderException.php | 10 + .../image/src/Exceptions/DriverException.php | 10 + .../image/src/Exceptions/EncoderException.php | 10 + .../image/src/Exceptions/FontException.php | 10 + .../src/Exceptions/GeometryException.php | 10 + .../image/src/Exceptions/InputException.php | 10 + .../src/Exceptions/NotSupportedException.php | 10 + .../src/Exceptions/NotWritableException.php | 10 + .../image/src/Exceptions/RuntimeException.php | 10 + vendor/intervention/image/src/File.php | 122 ++ .../intervention/image/src/FileExtension.php | 127 ++ vendor/intervention/image/src/Format.php | 165 +++ .../image/src/Geometry/Bezier.php | 202 +++ .../image/src/Geometry/Circle.php | 57 + .../image/src/Geometry/Ellipse.php | 103 ++ .../src/Geometry/Factories/BezierFactory.php | 88 ++ .../src/Geometry/Factories/CircleFactory.php | 102 ++ .../image/src/Geometry/Factories/Drawable.php | 56 + .../src/Geometry/Factories/EllipseFactory.php | 112 ++ .../src/Geometry/Factories/LineFactory.php | 122 ++ .../src/Geometry/Factories/PolygonFactory.php | 88 ++ .../Geometry/Factories/RectangleFactory.php | 112 ++ .../intervention/image/src/Geometry/Line.php | 127 ++ .../intervention/image/src/Geometry/Pixel.php | 45 + .../intervention/image/src/Geometry/Point.php | 145 +++ .../image/src/Geometry/Polygon.php | 390 ++++++ .../image/src/Geometry/Rectangle.php | 335 +++++ .../src/Geometry/Tools/RectangleResizer.php | 341 ++++++ .../Geometry/Traits/HasBackgroundColor.php | 42 + .../image/src/Geometry/Traits/HasBorder.php | 75 ++ vendor/intervention/image/src/Image.php | 1082 +++++++++++++++++ .../intervention/image/src/ImageManager.php | 143 +++ .../intervention/image/src/InputHandler.php | 132 ++ .../src/Interfaces/AnalyzerInterface.php | 17 + .../src/Interfaces/CollectionInterface.php | 71 ++ .../src/Interfaces/ColorChannelInterface.php | 57 + .../image/src/Interfaces/ColorInterface.php | 87 ++ .../Interfaces/ColorProcessorInterface.php | 24 + .../src/Interfaces/ColorspaceInterface.php | 20 + .../image/src/Interfaces/CoreInterface.php | 70 ++ .../image/src/Interfaces/DecoderInterface.php | 17 + .../Interfaces/DrawableFactoryInterface.php | 35 + .../src/Interfaces/DrawableInterface.php | 63 + .../image/src/Interfaces/DriverInterface.php | 92 ++ .../src/Interfaces/EncodedImageInterface.php | 23 + .../image/src/Interfaces/EncoderInterface.php | 17 + .../image/src/Interfaces/FileInterface.php | 39 + .../image/src/Interfaces/FontInterface.php | 123 ++ .../src/Interfaces/FontProcessorInterface.php | 52 + .../image/src/Interfaces/FrameInterface.php | 77 ++ .../image/src/Interfaces/ImageInterface.php | 771 ++++++++++++ .../src/Interfaces/ImageManagerInterface.php | 63 + .../src/Interfaces/InputHandlerInterface.php | 17 + .../src/Interfaces/ModifierInterface.php | 17 + .../image/src/Interfaces/PointInterface.php | 53 + .../image/src/Interfaces/ProfileInterface.php | 13 + .../src/Interfaces/ResolutionInterface.php | 53 + .../image/src/Interfaces/SizeInterface.php | 123 ++ .../src/Interfaces/SpecializableInterface.php | 30 + .../src/Interfaces/SpecializedInterface.php | 10 + vendor/intervention/image/src/MediaType.php | 143 +++ .../intervention/image/src/ModifierStack.php | 44 + .../src/Modifiers/AbstractDrawModifier.php | 47 + .../src/Modifiers/AlignRotationModifier.php | 12 + .../Modifiers/BlendTransparencyModifier.php | 54 + .../image/src/Modifiers/BlurModifier.php | 15 + .../src/Modifiers/BrightnessModifier.php | 15 + .../image/src/Modifiers/ColorizeModifier.php | 23 + .../src/Modifiers/ColorspaceModifier.php | 39 + .../image/src/Modifiers/ContainModifier.php | 44 + .../image/src/Modifiers/ContrastModifier.php | 20 + .../image/src/Modifiers/CoverDownModifier.php | 10 + .../image/src/Modifiers/CoverModifier.php | 49 + .../image/src/Modifiers/CropModifier.php | 44 + .../src/Modifiers/DrawBezierModifier.php | 29 + .../src/Modifiers/DrawEllipseModifier.php | 21 + .../image/src/Modifiers/DrawLineModifier.php | 29 + .../image/src/Modifiers/DrawPixelModifier.php | 23 + .../src/Modifiers/DrawPolygonModifier.php | 21 + .../src/Modifiers/DrawRectangleModifier.php | 29 + .../image/src/Modifiers/FillModifier.php | 23 + .../image/src/Modifiers/FlipModifier.php | 12 + .../image/src/Modifiers/FlopModifier.php | 12 + .../image/src/Modifiers/GammaModifier.php | 15 + .../image/src/Modifiers/GreyscaleModifier.php | 12 + .../image/src/Modifiers/InvertModifier.php | 12 + .../image/src/Modifiers/PadModifier.php | 24 + .../image/src/Modifiers/PixelateModifier.php | 15 + .../image/src/Modifiers/PlaceModifier.php | 46 + .../image/src/Modifiers/ProfileModifier.php | 16 + .../src/Modifiers/ProfileRemovalModifier.php | 12 + .../src/Modifiers/QuantizeColorsModifier.php | 22 + .../src/Modifiers/RemoveAnimationModifier.php | 55 + .../src/Modifiers/ResizeCanvasModifier.php | 49 + .../ResizeCanvasRelativeModifier.php | 10 + .../src/Modifiers/ResizeDownModifier.php | 10 + .../image/src/Modifiers/ResizeModifier.php | 20 + .../src/Modifiers/ResolutionModifier.php | 20 + .../image/src/Modifiers/RotateModifier.php | 24 + .../image/src/Modifiers/ScaleDownModifier.php | 10 + .../image/src/Modifiers/ScaleModifier.php | 10 + .../image/src/Modifiers/SharpenModifier.php | 15 + .../src/Modifiers/SliceAnimationModifier.php | 15 + .../image/src/Modifiers/TextModifier.php | 94 ++ .../image/src/Modifiers/TrimModifier.php | 20 + vendor/intervention/image/src/Origin.php | 88 ++ vendor/intervention/image/src/Resolution.php | 162 +++ .../src/Traits/CanBeDriverSpecialized.php | 77 ++ .../image/src/Traits/CanBuildFilePointer.php | 42 + .../image/src/Typography/Font.php | 279 +++++ .../image/src/Typography/FontFactory.php | 141 +++ .../image/src/Typography/Line.php | 125 ++ .../image/src/Typography/TextBlock.php | 72 ++ vendor/irazasyed/telegram-bot-sdk/LICENSE.md | 0 .../irazasyed/telegram-bot-sdk/composer.json | 0 .../telegram-bot-sdk/src/Actions.php | 0 .../src/Answers/AnswerBus.php | 0 .../src/Answers/Answerable.php | 0 vendor/irazasyed/telegram-bot-sdk/src/Api.php | 0 .../telegram-bot-sdk/src/BotsManager.php | 0 .../telegram-bot-sdk/src/Commands/Command.php | 0 .../src/Commands/CommandBus.php | 0 .../src/Commands/CommandInterface.php | 0 .../src/Commands/HelpCommand.php | 0 .../telegram-bot-sdk/src/EntityType.php | 0 .../src/Events/AbstractEvent.php | 0 .../telegram-bot-sdk/src/Events/Emitter.php | 0 .../src/Events/EventDispatcherFactory.php | 0 .../EventDispatcherListenerContract.php | 0 .../src/Events/HasEventDispatcher.php | 0 .../src/Events/HasEventName.php | 0 .../src/Events/LeagueEventDispatcher.php | 0 .../src/Events/UpdateEvent.php | 0 .../src/Events/UpdateWasReceived.php | 0 .../Exceptions/CouldNotUploadInputFile.php | 0 .../src/Exceptions/ResponseParameters.php | 0 .../TelegramBotNotFoundException.php | 0 .../TelegramEmojiMapFileNotFoundException.php | 0 .../src/Exceptions/TelegramOtherException.php | 0 .../Exceptions/TelegramResponseException.php | 0 .../src/Exceptions/TelegramSDKException.php | 0 .../TelegramUndefinedPropertyException.php | 0 .../src/FileUpload/InputFile.php | 0 .../telegram-bot-sdk/src/Helpers/Emojify.php | 0 .../telegram-bot-sdk/src/Helpers/Entities.php | 0 .../src/HttpClients/GuzzleHttpClient.php | 0 .../src/HttpClients/HttpClientInterface.php | 0 .../telegram-bot-sdk/src/Keyboard/Base.php | 0 .../telegram-bot-sdk/src/Keyboard/Button.php | 0 .../src/Keyboard/Keyboard.php | 0 .../src/Laravel/Artisan/WebhookCommand.php | 0 .../src/Laravel/Facades/Telegram.php | 0 .../src/Laravel/TelegramServiceProvider.php | 0 .../src/Laravel/config/telegram.php | 0 .../telegram-bot-sdk/src/Methods/Chat.php | 0 .../telegram-bot-sdk/src/Methods/Commands.php | 0 .../src/Methods/EditMessage.php | 0 .../telegram-bot-sdk/src/Methods/Forum.php | 0 .../telegram-bot-sdk/src/Methods/Game.php | 0 .../telegram-bot-sdk/src/Methods/Get.php | 0 .../telegram-bot-sdk/src/Methods/Location.php | 0 .../telegram-bot-sdk/src/Methods/Message.php | 0 .../telegram-bot-sdk/src/Methods/Passport.php | 0 .../telegram-bot-sdk/src/Methods/Payments.php | 0 .../telegram-bot-sdk/src/Methods/Query.php | 0 .../telegram-bot-sdk/src/Methods/Stickers.php | 0 .../telegram-bot-sdk/src/Methods/Update.php | 0 .../src/Objects/Animation.php | 0 .../telegram-bot-sdk/src/Objects/Audio.php | 0 .../src/Objects/BaseObject.php | 0 .../src/Objects/BotCommand.php | 0 .../src/Objects/CallbackQuery.php | 0 .../telegram-bot-sdk/src/Objects/Chat.php | 0 .../src/Objects/ChatInviteLink.php | 0 .../src/Objects/ChatJoinRequest.php | 0 .../src/Objects/ChatLocation.php | 0 .../src/Objects/ChatMember.php | 0 .../src/Objects/ChatMemberUpdated.php | 0 .../src/Objects/ChatPermissions.php | 0 .../src/Objects/ChatPhoto.php | 0 .../src/Objects/ChosenInlineResult.php | 0 .../telegram-bot-sdk/src/Objects/Contact.php | 0 .../telegram-bot-sdk/src/Objects/Dice.php | 0 .../telegram-bot-sdk/src/Objects/Document.php | 0 .../src/Objects/EditedMessage.php | 0 .../telegram-bot-sdk/src/Objects/File.php | 0 .../src/Objects/ForumTopic.php | 0 .../telegram-bot-sdk/src/Objects/Game.php | 0 .../src/Objects/GameHighScore.php | 0 .../src/Objects/InlineQuery.php | 0 .../Objects/InlineQuery/InlineBaseObject.php | 0 .../InlineQuery/InlineQueryResultArticle.php | 0 .../InlineQuery/InlineQueryResultAudio.php | 0 .../InlineQueryResultCachedAudio.php | 0 .../InlineQueryResultCachedDocument.php | 0 .../InlineQueryResultCachedGif.php | 0 .../InlineQueryResultCachedMpeg4Gif.php | 0 .../InlineQueryResultCachedPhoto.php | 0 .../InlineQueryResultCachedSticker.php | 0 .../InlineQueryResultCachedVideo.php | 0 .../InlineQueryResultCachedVoice.php | 0 .../InlineQuery/InlineQueryResultContact.php | 0 .../InlineQuery/InlineQueryResultDocument.php | 0 .../InlineQuery/InlineQueryResultGame.php | 0 .../InlineQuery/InlineQueryResultGif.php | 0 .../InlineQuery/InlineQueryResultLocation.php | 0 .../InlineQuery/InlineQueryResultMpeg4Gif.php | 0 .../InlineQuery/InlineQueryResultPhoto.php | 0 .../InlineQuery/InlineQueryResultVenue.php | 0 .../InlineQuery/InlineQueryResultVideo.php | 0 .../InlineQuery/InlineQueryResultVoice.php | 0 .../InputContactMessageContent.php | 0 .../InputLocationMessageContent.php | 0 .../InputContent/InputTextMessageContent.php | 0 .../InputContent/InputVenueMessageContent.php | 0 .../src/Objects/InputMedia/InputMedia.php | 0 .../InputMedia/InputMediaAnimation.php | 0 .../Objects/InputMedia/InputMediaAudio.php | 0 .../Objects/InputMedia/InputMediaDocument.php | 0 .../Objects/InputMedia/InputMediaPhoto.php | 0 .../Objects/InputMedia/InputMediaVideo.php | 0 .../telegram-bot-sdk/src/Objects/Location.php | 0 .../telegram-bot-sdk/src/Objects/LoginUrl.php | 0 .../src/Objects/MaskPosition.php | 0 .../telegram-bot-sdk/src/Objects/Message.php | 0 .../Objects/MessageAutoDeleteTimerChanged.php | 0 .../src/Objects/MessageEntity.php | 0 .../src/Objects/Passport/Credentials.php | 0 .../src/Objects/Passport/DataCredentials.php | 0 .../Objects/Passport/EncryptedCredentials.php | 0 .../Passport/EncryptedPassportElement.php | 0 .../src/Objects/Passport/FileCredentials.php | 0 .../src/Objects/Passport/IdDocumentData.php | 0 .../src/Objects/Passport/PassportData.php | 0 .../Objects/Passport/PassportElementError.php | 0 .../PassportElementErrorDataField.php | 0 .../Passport/PassportElementErrorFile.php | 0 .../Passport/PassportElementErrorFiles.php | 0 .../PassportElementErrorFrontSide.php | 0 .../PassportElementErrorReverseSide.php | 0 .../Passport/PassportElementErrorSelfie.php | 0 .../PassportElementErrorTranslationFile.php | 0 .../PassportElementErrorTranslationFiles.php | 0 .../PassportElementErrorUnspecified.php | 0 .../src/Objects/Passport/PassportFile.php | 0 .../src/Objects/Passport/PassportScope.php | 0 .../Objects/Passport/PassportScopeElement.php | 0 .../Passport/PassportScopeElementOne.php | 0 .../PassportScopeElementOneOfSeveral.php | 0 .../src/Objects/Passport/PersonalDetails.php | 0 .../Objects/Passport/ResidentialAddress.php | 0 .../src/Objects/Passport/SecureData.php | 0 .../src/Objects/Passport/SecureValue.php | 0 .../src/Objects/Payments/Invoice.php | 0 .../src/Objects/Payments/LabeledPrice.php | 0 .../src/Objects/Payments/OrderInfo.php | 0 .../src/Objects/Payments/PreCheckoutQuery.php | 0 .../src/Objects/Payments/ShippingAddress.php | 0 .../src/Objects/Payments/ShippingOption.php | 0 .../src/Objects/Payments/ShippingQuery.php | 0 .../Objects/Payments/SuccessfulPayment.php | 0 .../src/Objects/PhotoSize.php | 0 .../telegram-bot-sdk/src/Objects/Poll.php | 0 .../src/Objects/PollAnswer.php | 0 .../src/Objects/PollOption.php | 0 .../src/Objects/ProximityAlertTriggered.php | 0 .../src/Objects/ReactionType.php | 0 .../src/Objects/ResponseParameters.php | 0 .../telegram-bot-sdk/src/Objects/Sticker.php | 0 .../src/Objects/StickerSet.php | 0 .../src/Objects/TelegramObject.php | 0 .../src/Objects/UnknownObject.php | 0 .../telegram-bot-sdk/src/Objects/Update.php | 0 .../telegram-bot-sdk/src/Objects/User.php | 0 .../src/Objects/UserProfilePhotos.php | 0 .../telegram-bot-sdk/src/Objects/Venue.php | 0 .../telegram-bot-sdk/src/Objects/Video.php | 0 .../src/Objects/VideoNote.php | 0 .../telegram-bot-sdk/src/Objects/Voice.php | 0 .../src/Objects/VoiceChatEnded.php | 0 .../Objects/VoiceChatParticipantsInvited.php | 0 .../src/Objects/VoiceChatScheduled.php | 0 .../src/Objects/VoiceChatStarted.php | 0 .../src/Objects/WebApp/WebAppData.php | 0 .../src/Objects/WebhookInfo.php | 0 .../telegram-bot-sdk/src/Storage/emoji.json | 0 .../telegram-bot-sdk/src/TelegramClient.php | 0 .../telegram-bot-sdk/src/TelegramRequest.php | 0 .../telegram-bot-sdk/src/TelegramResponse.php | 0 .../src/Traits/CommandsHandler.php | 0 .../src/Traits/HasContainer.php | 0 .../telegram-bot-sdk/src/Traits/Http.php | 0 .../telegram-bot-sdk/src/Traits/Singleton.php | 0 .../telegram-bot-sdk/src/Traits/Telegram.php | 0 .../telegram-bot-sdk/src/Traits/Validator.php | 0 vendor/symfony/yaml/CHANGELOG.md | 0 vendor/symfony/yaml/Command/LintCommand.php | 0 vendor/symfony/yaml/Dumper.php | 0 vendor/symfony/yaml/Escaper.php | 0 .../symfony/yaml/Exception/DumpException.php | 0 .../yaml/Exception/ExceptionInterface.php | 0 .../symfony/yaml/Exception/ParseException.php | 0 .../yaml/Exception/RuntimeException.php | 0 vendor/symfony/yaml/Inline.php | 0 vendor/symfony/yaml/LICENSE | 0 vendor/symfony/yaml/Parser.php | 0 vendor/symfony/yaml/Tag/TaggedValue.php | 0 vendor/symfony/yaml/Unescaper.php | 0 vendor/symfony/yaml/Yaml.php | 0 vendor/symfony/yaml/composer.json | 0 676 files changed, 25455 insertions(+), 30 deletions(-) mode change 100644 => 100755 .editorconfig mode change 100644 => 100755 .env.example mode change 100644 => 100755 .gitignore mode change 100644 => 100755 app/Services/Article/CacheTg.php mode change 100644 => 100755 app/Services/Article/Cmd.php mode change 100644 => 100755 app/Services/Article/Schema.php mode change 100644 => 100755 app/Services/Article_old.php mode change 100644 => 100755 app/Services/Country-meiyong.php mode change 100644 => 100755 app/Services/Cron.php mode change 100644 => 100755 app/Services/Cron/ArticleSchema.php mode change 100644 => 100755 app/Services/Cron/Book.php create mode 100755 app/Services/Cron/FnTgPublish.php mode change 100644 => 100755 app/Services/Cron/FreenodeCrawl.php mode change 100644 => 100755 app/Services/Cron/FreenodeFile.php mode change 100644 => 100755 app/Services/Cron/FreenodeLog.php mode change 100644 => 100755 app/Services/Cron/FreenodeMerge.php mode change 100644 => 100755 app/Services/Cron/FreenodePool.php mode change 100644 => 100755 app/Services/Cron/FreenodeSync.php mode change 100644 => 100755 app/Services/Cron/HttpQueue.php mode change 100644 => 100755 app/Services/HttpQueue.php mode change 100644 => 100755 app/Services/OpenApi/Telegram.php mode change 100644 => 100755 app/Services/SDK/Master/Master.php mode change 100644 => 100755 app/Services/SDK/Master/Telegram.php mode change 100644 => 100755 app/Services/SlaveMap.php mode change 100644 => 100755 app/Services/Tg/Hook/Dog.php mode change 100644 => 100755 app/Services/Tg/Hook/Mod/Article.php mode change 100644 => 100755 app/Services/Tg/Hook/Mod/ArticleCache.php mode change 100644 => 100755 app/Services/Tg/Hook/Mod/ArticleConfig.php mode change 100644 => 100755 app/Services/Tg/Hook/Mod/ArticleSchema.php mode change 100644 => 100755 app/Services/Tg/Hook/Mod/ArticleSiteMapGroup.php mode change 100644 => 100755 app/Services/Tg/Hook/Mod/Article_old.php mode change 100644 => 100755 app/Services/Tg/Hook/Mod/Base.php mode change 100644 => 100755 app/Services/Tg/Hook/Mod/Blade.php mode change 100644 => 100755 app/Services/Tg/Hook/Mod/BladeOld.php mode change 100644 => 100755 app/Services/Tg/Hook/Mod/Book.php mode change 100644 => 100755 app/Services/Tg/Hook/Mod/Box.php mode change 100644 => 100755 app/Services/Tg/Hook/Mod/Cron.php mode change 100644 => 100755 app/Services/Tg/Hook/Mod/Db.php mode change 100644 => 100755 app/Services/Tg/Hook/Mod/Dev.php mode change 100644 => 100755 app/Services/Tg/Hook/Mod/Dove.php mode change 100644 => 100755 app/Services/Tg/Hook/Mod/DoveSite.php mode change 100644 => 100755 app/Services/Tg/Hook/Mod/FreenodeFrom.php mode change 100644 => 100755 app/Services/Tg/Hook/Mod/FreenodePool.php mode change 100644 => 100755 app/Services/Tg/Hook/Mod/GemboxDns.php mode change 100644 => 100755 app/Services/Tg/Hook/Mod/Good.php mode change 100644 => 100755 app/Services/Tg/Hook/Mod/Hook.php mode change 100644 => 100755 app/Services/Tg/Hook/Mod/Hook_old.php mode change 100644 => 100755 app/Services/Tg/Hook/Mod/HttpQueue.php mode change 100644 => 100755 app/Services/Tg/Hook/Mod/Jctj.php mode change 100644 => 100755 app/Services/Tg/Hook/Mod/JctjOption.php mode change 100644 => 100755 app/Services/Tg/Hook/Mod/Note.php mode change 100644 => 100755 app/Services/Tg/Hook/Mod/Note_option.php mode change 100644 => 100755 app/Services/Tg/Hook/Mod/Option.php mode change 100644 => 100755 app/Services/Tg/Hook/Mod/Ship.php mode change 100644 => 100755 app/Services/Tg/Hook/Mod/SiteMap.php mode change 100644 => 100755 app/Services/Tg/Hook/Mod/SitePathMap.php mode change 100644 => 100755 app/Services/Tg/Hook/Mod/TelegramKey.php mode change 100644 => 100755 app/Services/Tg/Hook/Mod/Test.php mode change 100644 => 100755 app/Services/Tg/Hook/Mod/Tool.php mode change 100644 => 100755 app/Services/Tg/Hook/Mod/Upload.php mode change 100644 => 100755 app/Services/Tg/Http.php mode change 100644 => 100755 fn的tg策略.md mode change 100644 => 100755 fn部署.md mode change 100644 => 100755 public/js/jquery.min.js mode change 100644 => 100755 public/upload/无标题.png mode change 100644 => 100755 resources/views/cmd.blade.php mode change 100644 => 100755 resources/views/cmd/image/upload.blade.php mode change 100644 => 100755 scripts/cron.php create mode 100644 tg发送逻辑.md mode change 100644 => 100755 vendor/composer/tmp-b1bec4785aa3cb26f6cad297d3828558.zip create mode 100755 vendor/intervention/gif/LICENSE create mode 100755 vendor/intervention/gif/composer.json create mode 100755 vendor/intervention/gif/phpunit.xml.dist create mode 100755 vendor/intervention/gif/src/AbstractEntity.php create mode 100755 vendor/intervention/gif/src/AbstractExtension.php create mode 100755 vendor/intervention/gif/src/Blocks/ApplicationExtension.php create mode 100755 vendor/intervention/gif/src/Blocks/Color.php create mode 100755 vendor/intervention/gif/src/Blocks/ColorTable.php create mode 100755 vendor/intervention/gif/src/Blocks/CommentExtension.php create mode 100755 vendor/intervention/gif/src/Blocks/DataSubBlock.php create mode 100755 vendor/intervention/gif/src/Blocks/FrameBlock.php create mode 100755 vendor/intervention/gif/src/Blocks/GraphicControlExtension.php create mode 100755 vendor/intervention/gif/src/Blocks/Header.php create mode 100755 vendor/intervention/gif/src/Blocks/ImageData.php create mode 100755 vendor/intervention/gif/src/Blocks/ImageDescriptor.php create mode 100755 vendor/intervention/gif/src/Blocks/LogicalScreenDescriptor.php create mode 100755 vendor/intervention/gif/src/Blocks/NetscapeApplicationExtension.php create mode 100755 vendor/intervention/gif/src/Blocks/PlainTextExtension.php create mode 100755 vendor/intervention/gif/src/Blocks/TableBasedImage.php create mode 100755 vendor/intervention/gif/src/Blocks/Trailer.php create mode 100755 vendor/intervention/gif/src/Builder.php create mode 100755 vendor/intervention/gif/src/Decoder.php create mode 100755 vendor/intervention/gif/src/Decoders/AbstractDecoder.php create mode 100755 vendor/intervention/gif/src/Decoders/AbstractPackedBitDecoder.php create mode 100755 vendor/intervention/gif/src/Decoders/ApplicationExtensionDecoder.php create mode 100755 vendor/intervention/gif/src/Decoders/ColorDecoder.php create mode 100755 vendor/intervention/gif/src/Decoders/ColorTableDecoder.php create mode 100755 vendor/intervention/gif/src/Decoders/CommentExtensionDecoder.php create mode 100755 vendor/intervention/gif/src/Decoders/DataSubBlockDecoder.php create mode 100755 vendor/intervention/gif/src/Decoders/FrameBlockDecoder.php create mode 100755 vendor/intervention/gif/src/Decoders/GifDataStreamDecoder.php create mode 100755 vendor/intervention/gif/src/Decoders/GraphicControlExtensionDecoder.php create mode 100755 vendor/intervention/gif/src/Decoders/HeaderDecoder.php create mode 100755 vendor/intervention/gif/src/Decoders/ImageDataDecoder.php create mode 100755 vendor/intervention/gif/src/Decoders/ImageDescriptorDecoder.php create mode 100755 vendor/intervention/gif/src/Decoders/LogicalScreenDescriptorDecoder.php create mode 100755 vendor/intervention/gif/src/Decoders/NetscapeApplicationExtensionDecoder.php create mode 100755 vendor/intervention/gif/src/Decoders/PlainTextExtensionDecoder.php create mode 100755 vendor/intervention/gif/src/Decoders/TableBasedImageDecoder.php create mode 100755 vendor/intervention/gif/src/DisposalMethod.php create mode 100755 vendor/intervention/gif/src/Encoders/AbstractEncoder.php create mode 100755 vendor/intervention/gif/src/Encoders/ApplicationExtensionEncoder.php create mode 100755 vendor/intervention/gif/src/Encoders/ColorEncoder.php create mode 100755 vendor/intervention/gif/src/Encoders/ColorTableEncoder.php create mode 100755 vendor/intervention/gif/src/Encoders/CommentExtensionEncoder.php create mode 100755 vendor/intervention/gif/src/Encoders/DataSubBlockEncoder.php create mode 100755 vendor/intervention/gif/src/Encoders/FrameBlockEncoder.php create mode 100755 vendor/intervention/gif/src/Encoders/GifDataStreamEncoder.php create mode 100755 vendor/intervention/gif/src/Encoders/GraphicControlExtensionEncoder.php create mode 100755 vendor/intervention/gif/src/Encoders/HeaderEncoder.php create mode 100755 vendor/intervention/gif/src/Encoders/ImageDataEncoder.php create mode 100755 vendor/intervention/gif/src/Encoders/ImageDescriptorEncoder.php create mode 100755 vendor/intervention/gif/src/Encoders/LogicalScreenDescriptorEncoder.php create mode 100755 vendor/intervention/gif/src/Encoders/NetscapeApplicationExtensionEncoder.php create mode 100755 vendor/intervention/gif/src/Encoders/PlainTextExtensionEncoder.php create mode 100755 vendor/intervention/gif/src/Encoders/TableBasedImageEncoder.php create mode 100755 vendor/intervention/gif/src/Encoders/TrailerEncoder.php create mode 100755 vendor/intervention/gif/src/Exceptions/DecoderException.php create mode 100755 vendor/intervention/gif/src/Exceptions/EncoderException.php create mode 100755 vendor/intervention/gif/src/Exceptions/FormatException.php create mode 100755 vendor/intervention/gif/src/Exceptions/NotReadableException.php create mode 100755 vendor/intervention/gif/src/GifDataStream.php create mode 100755 vendor/intervention/gif/src/Splitter.php create mode 100755 vendor/intervention/gif/src/Traits/CanDecode.php create mode 100755 vendor/intervention/gif/src/Traits/CanEncode.php create mode 100755 vendor/intervention/gif/src/Traits/CanHandleFiles.php create mode 100755 vendor/intervention/image/LICENSE create mode 100755 vendor/intervention/image/composer.json create mode 100755 vendor/intervention/image/src/Analyzers/ColorspaceAnalyzer.php create mode 100755 vendor/intervention/image/src/Analyzers/HeightAnalyzer.php create mode 100755 vendor/intervention/image/src/Analyzers/PixelColorAnalyzer.php create mode 100755 vendor/intervention/image/src/Analyzers/PixelColorsAnalyzer.php create mode 100755 vendor/intervention/image/src/Analyzers/ProfileAnalyzer.php create mode 100755 vendor/intervention/image/src/Analyzers/ResolutionAnalyzer.php create mode 100755 vendor/intervention/image/src/Analyzers/WidthAnalyzer.php create mode 100755 vendor/intervention/image/src/Collection.php create mode 100755 vendor/intervention/image/src/Colors/AbstractColor.php create mode 100755 vendor/intervention/image/src/Colors/AbstractColorChannel.php create mode 100755 vendor/intervention/image/src/Colors/Cmyk/Channels/Cyan.php create mode 100755 vendor/intervention/image/src/Colors/Cmyk/Channels/Key.php create mode 100755 vendor/intervention/image/src/Colors/Cmyk/Channels/Magenta.php create mode 100755 vendor/intervention/image/src/Colors/Cmyk/Channels/Yellow.php create mode 100755 vendor/intervention/image/src/Colors/Cmyk/Color.php create mode 100755 vendor/intervention/image/src/Colors/Cmyk/Colorspace.php create mode 100755 vendor/intervention/image/src/Colors/Cmyk/Decoders/StringColorDecoder.php create mode 100755 vendor/intervention/image/src/Colors/Hsl/Channels/Hue.php create mode 100755 vendor/intervention/image/src/Colors/Hsl/Channels/Luminance.php create mode 100755 vendor/intervention/image/src/Colors/Hsl/Channels/Saturation.php create mode 100755 vendor/intervention/image/src/Colors/Hsl/Color.php create mode 100755 vendor/intervention/image/src/Colors/Hsl/Colorspace.php create mode 100755 vendor/intervention/image/src/Colors/Hsl/Decoders/StringColorDecoder.php create mode 100755 vendor/intervention/image/src/Colors/Hsv/Channels/Hue.php create mode 100755 vendor/intervention/image/src/Colors/Hsv/Channels/Saturation.php create mode 100755 vendor/intervention/image/src/Colors/Hsv/Channels/Value.php create mode 100755 vendor/intervention/image/src/Colors/Hsv/Color.php create mode 100755 vendor/intervention/image/src/Colors/Hsv/Colorspace.php create mode 100755 vendor/intervention/image/src/Colors/Hsv/Decoders/StringColorDecoder.php create mode 100755 vendor/intervention/image/src/Colors/Profile.php create mode 100755 vendor/intervention/image/src/Colors/Rgb/Channels/Alpha.php create mode 100755 vendor/intervention/image/src/Colors/Rgb/Channels/Blue.php create mode 100755 vendor/intervention/image/src/Colors/Rgb/Channels/Green.php create mode 100755 vendor/intervention/image/src/Colors/Rgb/Channels/Red.php create mode 100755 vendor/intervention/image/src/Colors/Rgb/Color.php create mode 100755 vendor/intervention/image/src/Colors/Rgb/Colorspace.php create mode 100755 vendor/intervention/image/src/Colors/Rgb/Decoders/HexColorDecoder.php create mode 100755 vendor/intervention/image/src/Colors/Rgb/Decoders/HtmlColornameDecoder.php create mode 100755 vendor/intervention/image/src/Colors/Rgb/Decoders/StringColorDecoder.php create mode 100755 vendor/intervention/image/src/Colors/Rgb/Decoders/TransparentColorDecoder.php create mode 100755 vendor/intervention/image/src/Config.php create mode 100755 vendor/intervention/image/src/Decoders/Base64ImageDecoder.php create mode 100755 vendor/intervention/image/src/Decoders/BinaryImageDecoder.php create mode 100755 vendor/intervention/image/src/Decoders/ColorObjectDecoder.php create mode 100755 vendor/intervention/image/src/Decoders/DataUriImageDecoder.php create mode 100755 vendor/intervention/image/src/Decoders/EncodedImageObjectDecoder.php create mode 100755 vendor/intervention/image/src/Decoders/FilePathImageDecoder.php create mode 100755 vendor/intervention/image/src/Decoders/FilePointerImageDecoder.php create mode 100755 vendor/intervention/image/src/Decoders/ImageObjectDecoder.php create mode 100755 vendor/intervention/image/src/Decoders/NativeObjectDecoder.php create mode 100755 vendor/intervention/image/src/Decoders/SplFileInfoImageDecoder.php create mode 100755 vendor/intervention/image/src/Drivers/AbstractDecoder.php create mode 100755 vendor/intervention/image/src/Drivers/AbstractDriver.php create mode 100755 vendor/intervention/image/src/Drivers/AbstractEncoder.php create mode 100755 vendor/intervention/image/src/Drivers/AbstractFontProcessor.php create mode 100755 vendor/intervention/image/src/Drivers/AbstractFrame.php create mode 100755 vendor/intervention/image/src/Drivers/Gd/Analyzers/ColorspaceAnalyzer.php create mode 100755 vendor/intervention/image/src/Drivers/Gd/Analyzers/HeightAnalyzer.php create mode 100755 vendor/intervention/image/src/Drivers/Gd/Analyzers/PixelColorAnalyzer.php create mode 100755 vendor/intervention/image/src/Drivers/Gd/Analyzers/PixelColorsAnalyzer.php create mode 100755 vendor/intervention/image/src/Drivers/Gd/Analyzers/ResolutionAnalyzer.php create mode 100755 vendor/intervention/image/src/Drivers/Gd/Analyzers/WidthAnalyzer.php create mode 100755 vendor/intervention/image/src/Drivers/Gd/Cloner.php create mode 100755 vendor/intervention/image/src/Drivers/Gd/ColorProcessor.php create mode 100755 vendor/intervention/image/src/Drivers/Gd/Core.php create mode 100755 vendor/intervention/image/src/Drivers/Gd/Decoders/AbstractDecoder.php create mode 100755 vendor/intervention/image/src/Drivers/Gd/Decoders/Base64ImageDecoder.php create mode 100755 vendor/intervention/image/src/Drivers/Gd/Decoders/BinaryImageDecoder.php create mode 100755 vendor/intervention/image/src/Drivers/Gd/Decoders/DataUriImageDecoder.php create mode 100755 vendor/intervention/image/src/Drivers/Gd/Decoders/EncodedImageObjectDecoder.php create mode 100755 vendor/intervention/image/src/Drivers/Gd/Decoders/FilePathImageDecoder.php create mode 100755 vendor/intervention/image/src/Drivers/Gd/Decoders/FilePointerImageDecoder.php create mode 100755 vendor/intervention/image/src/Drivers/Gd/Decoders/NativeObjectDecoder.php create mode 100755 vendor/intervention/image/src/Drivers/Gd/Decoders/SplFileInfoImageDecoder.php create mode 100755 vendor/intervention/image/src/Drivers/Gd/Driver.php create mode 100755 vendor/intervention/image/src/Drivers/Gd/Encoders/AvifEncoder.php create mode 100755 vendor/intervention/image/src/Drivers/Gd/Encoders/BmpEncoder.php create mode 100755 vendor/intervention/image/src/Drivers/Gd/Encoders/GifEncoder.php create mode 100755 vendor/intervention/image/src/Drivers/Gd/Encoders/JpegEncoder.php create mode 100755 vendor/intervention/image/src/Drivers/Gd/Encoders/PngEncoder.php create mode 100755 vendor/intervention/image/src/Drivers/Gd/Encoders/WebpEncoder.php create mode 100755 vendor/intervention/image/src/Drivers/Gd/FontProcessor.php create mode 100755 vendor/intervention/image/src/Drivers/Gd/Frame.php create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/AlignRotationModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/BlendTransparencyModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/BlurModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/BrightnessModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/ColorizeModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/ColorspaceModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/ContainModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/ContrastModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/CoverDownModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/CoverModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/CropModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/DrawBezierModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/DrawEllipseModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/DrawLineModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/DrawPixelModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/DrawPolygonModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/DrawRectangleModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/FillModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/FlipModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/FlopModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/GammaModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/GreyscaleModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/InvertModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/PadModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/PixelateModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/PlaceModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/ProfileModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/ProfileRemovalModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/QuantizeColorsModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/RemoveAnimationModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/ResizeCanvasModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/ResizeCanvasRelativeModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/ResizeDownModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/ResizeModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/ResolutionModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/RotateModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/ScaleDownModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/ScaleModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/SharpenModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/SliceAnimationModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/TextModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Gd/Modifiers/TrimModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Analyzers/ColorspaceAnalyzer.php create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Analyzers/HeightAnalyzer.php create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Analyzers/PixelColorAnalyzer.php create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Analyzers/PixelColorsAnalyzer.php create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Analyzers/ProfileAnalyzer.php create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Analyzers/ResolutionAnalyzer.php create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Analyzers/WidthAnalyzer.php create mode 100755 vendor/intervention/image/src/Drivers/Imagick/ColorProcessor.php create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Core.php create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Decoders/Base64ImageDecoder.php create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Decoders/BinaryImageDecoder.php create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Decoders/DataUriImageDecoder.php create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Decoders/EncodedImageObjectDecoder.php create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Decoders/FilePathImageDecoder.php create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Decoders/FilePointerImageDecoder.php create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Decoders/NativeObjectDecoder.php create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Decoders/SplFileInfoImageDecoder.php create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Driver.php create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Encoders/AvifEncoder.php create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Encoders/BmpEncoder.php create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Encoders/GifEncoder.php create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Encoders/HeicEncoder.php create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Encoders/Jpeg2000Encoder.php create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Encoders/JpegEncoder.php create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Encoders/PngEncoder.php create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Encoders/TiffEncoder.php create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Encoders/WebpEncoder.php create mode 100755 vendor/intervention/image/src/Drivers/Imagick/FontProcessor.php create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Frame.php create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/AlignRotationModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/BlendTransparencyModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/BlurModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/BrightnessModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/ColorizeModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/ColorspaceModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/ContainModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/ContrastModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/CoverDownModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/CoverModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/CropModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/DrawBezierModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/DrawEllipseModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/DrawLineModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/DrawPixelModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/DrawPolygonModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/DrawRectangleModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/FillModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/FlipModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/FlopModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/GammaModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/GreyscaleModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/InvertModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/PadModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/PixelateModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/PlaceModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/ProfileModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/ProfileRemovalModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/QuantizeColorsModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/RemoveAnimationModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/ResizeCanvasModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/ResizeCanvasRelativeModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/ResizeDownModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/ResizeModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/ResolutionModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/RotateModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/ScaleDownModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/ScaleModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/SharpenModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/SliceAnimationModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/StripMetaModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/TextModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Imagick/Modifiers/TrimModifier.php create mode 100755 vendor/intervention/image/src/Drivers/Specializable.php create mode 100755 vendor/intervention/image/src/Drivers/SpecializableAnalyzer.php create mode 100755 vendor/intervention/image/src/Drivers/SpecializableDecoder.php create mode 100755 vendor/intervention/image/src/Drivers/SpecializableEncoder.php create mode 100755 vendor/intervention/image/src/Drivers/SpecializableModifier.php create mode 100755 vendor/intervention/image/src/EncodedImage.php create mode 100755 vendor/intervention/image/src/Encoders/AutoEncoder.php create mode 100755 vendor/intervention/image/src/Encoders/AvifEncoder.php create mode 100755 vendor/intervention/image/src/Encoders/BmpEncoder.php create mode 100755 vendor/intervention/image/src/Encoders/FileExtensionEncoder.php create mode 100755 vendor/intervention/image/src/Encoders/FilePathEncoder.php create mode 100755 vendor/intervention/image/src/Encoders/GifEncoder.php create mode 100755 vendor/intervention/image/src/Encoders/HeicEncoder.php create mode 100755 vendor/intervention/image/src/Encoders/Jpeg2000Encoder.php create mode 100755 vendor/intervention/image/src/Encoders/JpegEncoder.php create mode 100755 vendor/intervention/image/src/Encoders/MediaTypeEncoder.php create mode 100755 vendor/intervention/image/src/Encoders/PngEncoder.php create mode 100755 vendor/intervention/image/src/Encoders/TiffEncoder.php create mode 100755 vendor/intervention/image/src/Encoders/WebpEncoder.php create mode 100755 vendor/intervention/image/src/Exceptions/AnimationException.php create mode 100755 vendor/intervention/image/src/Exceptions/ColorException.php create mode 100755 vendor/intervention/image/src/Exceptions/DecoderException.php create mode 100755 vendor/intervention/image/src/Exceptions/DriverException.php create mode 100755 vendor/intervention/image/src/Exceptions/EncoderException.php create mode 100755 vendor/intervention/image/src/Exceptions/FontException.php create mode 100755 vendor/intervention/image/src/Exceptions/GeometryException.php create mode 100755 vendor/intervention/image/src/Exceptions/InputException.php create mode 100755 vendor/intervention/image/src/Exceptions/NotSupportedException.php create mode 100755 vendor/intervention/image/src/Exceptions/NotWritableException.php create mode 100755 vendor/intervention/image/src/Exceptions/RuntimeException.php create mode 100755 vendor/intervention/image/src/File.php create mode 100755 vendor/intervention/image/src/FileExtension.php create mode 100755 vendor/intervention/image/src/Format.php create mode 100755 vendor/intervention/image/src/Geometry/Bezier.php create mode 100755 vendor/intervention/image/src/Geometry/Circle.php create mode 100755 vendor/intervention/image/src/Geometry/Ellipse.php create mode 100755 vendor/intervention/image/src/Geometry/Factories/BezierFactory.php create mode 100755 vendor/intervention/image/src/Geometry/Factories/CircleFactory.php create mode 100755 vendor/intervention/image/src/Geometry/Factories/Drawable.php create mode 100755 vendor/intervention/image/src/Geometry/Factories/EllipseFactory.php create mode 100755 vendor/intervention/image/src/Geometry/Factories/LineFactory.php create mode 100755 vendor/intervention/image/src/Geometry/Factories/PolygonFactory.php create mode 100755 vendor/intervention/image/src/Geometry/Factories/RectangleFactory.php create mode 100755 vendor/intervention/image/src/Geometry/Line.php create mode 100755 vendor/intervention/image/src/Geometry/Pixel.php create mode 100755 vendor/intervention/image/src/Geometry/Point.php create mode 100755 vendor/intervention/image/src/Geometry/Polygon.php create mode 100755 vendor/intervention/image/src/Geometry/Rectangle.php create mode 100755 vendor/intervention/image/src/Geometry/Tools/RectangleResizer.php create mode 100755 vendor/intervention/image/src/Geometry/Traits/HasBackgroundColor.php create mode 100755 vendor/intervention/image/src/Geometry/Traits/HasBorder.php create mode 100755 vendor/intervention/image/src/Image.php create mode 100755 vendor/intervention/image/src/ImageManager.php create mode 100755 vendor/intervention/image/src/InputHandler.php create mode 100755 vendor/intervention/image/src/Interfaces/AnalyzerInterface.php create mode 100755 vendor/intervention/image/src/Interfaces/CollectionInterface.php create mode 100755 vendor/intervention/image/src/Interfaces/ColorChannelInterface.php create mode 100755 vendor/intervention/image/src/Interfaces/ColorInterface.php create mode 100755 vendor/intervention/image/src/Interfaces/ColorProcessorInterface.php create mode 100755 vendor/intervention/image/src/Interfaces/ColorspaceInterface.php create mode 100755 vendor/intervention/image/src/Interfaces/CoreInterface.php create mode 100755 vendor/intervention/image/src/Interfaces/DecoderInterface.php create mode 100755 vendor/intervention/image/src/Interfaces/DrawableFactoryInterface.php create mode 100755 vendor/intervention/image/src/Interfaces/DrawableInterface.php create mode 100755 vendor/intervention/image/src/Interfaces/DriverInterface.php create mode 100755 vendor/intervention/image/src/Interfaces/EncodedImageInterface.php create mode 100755 vendor/intervention/image/src/Interfaces/EncoderInterface.php create mode 100755 vendor/intervention/image/src/Interfaces/FileInterface.php create mode 100755 vendor/intervention/image/src/Interfaces/FontInterface.php create mode 100755 vendor/intervention/image/src/Interfaces/FontProcessorInterface.php create mode 100755 vendor/intervention/image/src/Interfaces/FrameInterface.php create mode 100755 vendor/intervention/image/src/Interfaces/ImageInterface.php create mode 100755 vendor/intervention/image/src/Interfaces/ImageManagerInterface.php create mode 100755 vendor/intervention/image/src/Interfaces/InputHandlerInterface.php create mode 100755 vendor/intervention/image/src/Interfaces/ModifierInterface.php create mode 100755 vendor/intervention/image/src/Interfaces/PointInterface.php create mode 100755 vendor/intervention/image/src/Interfaces/ProfileInterface.php create mode 100755 vendor/intervention/image/src/Interfaces/ResolutionInterface.php create mode 100755 vendor/intervention/image/src/Interfaces/SizeInterface.php create mode 100755 vendor/intervention/image/src/Interfaces/SpecializableInterface.php create mode 100755 vendor/intervention/image/src/Interfaces/SpecializedInterface.php create mode 100755 vendor/intervention/image/src/MediaType.php create mode 100755 vendor/intervention/image/src/ModifierStack.php create mode 100755 vendor/intervention/image/src/Modifiers/AbstractDrawModifier.php create mode 100755 vendor/intervention/image/src/Modifiers/AlignRotationModifier.php create mode 100755 vendor/intervention/image/src/Modifiers/BlendTransparencyModifier.php create mode 100755 vendor/intervention/image/src/Modifiers/BlurModifier.php create mode 100755 vendor/intervention/image/src/Modifiers/BrightnessModifier.php create mode 100755 vendor/intervention/image/src/Modifiers/ColorizeModifier.php create mode 100755 vendor/intervention/image/src/Modifiers/ColorspaceModifier.php create mode 100755 vendor/intervention/image/src/Modifiers/ContainModifier.php create mode 100755 vendor/intervention/image/src/Modifiers/ContrastModifier.php create mode 100755 vendor/intervention/image/src/Modifiers/CoverDownModifier.php create mode 100755 vendor/intervention/image/src/Modifiers/CoverModifier.php create mode 100755 vendor/intervention/image/src/Modifiers/CropModifier.php create mode 100755 vendor/intervention/image/src/Modifiers/DrawBezierModifier.php create mode 100755 vendor/intervention/image/src/Modifiers/DrawEllipseModifier.php create mode 100755 vendor/intervention/image/src/Modifiers/DrawLineModifier.php create mode 100755 vendor/intervention/image/src/Modifiers/DrawPixelModifier.php create mode 100755 vendor/intervention/image/src/Modifiers/DrawPolygonModifier.php create mode 100755 vendor/intervention/image/src/Modifiers/DrawRectangleModifier.php create mode 100755 vendor/intervention/image/src/Modifiers/FillModifier.php create mode 100755 vendor/intervention/image/src/Modifiers/FlipModifier.php create mode 100755 vendor/intervention/image/src/Modifiers/FlopModifier.php create mode 100755 vendor/intervention/image/src/Modifiers/GammaModifier.php create mode 100755 vendor/intervention/image/src/Modifiers/GreyscaleModifier.php create mode 100755 vendor/intervention/image/src/Modifiers/InvertModifier.php create mode 100755 vendor/intervention/image/src/Modifiers/PadModifier.php create mode 100755 vendor/intervention/image/src/Modifiers/PixelateModifier.php create mode 100755 vendor/intervention/image/src/Modifiers/PlaceModifier.php create mode 100755 vendor/intervention/image/src/Modifiers/ProfileModifier.php create mode 100755 vendor/intervention/image/src/Modifiers/ProfileRemovalModifier.php create mode 100755 vendor/intervention/image/src/Modifiers/QuantizeColorsModifier.php create mode 100755 vendor/intervention/image/src/Modifiers/RemoveAnimationModifier.php create mode 100755 vendor/intervention/image/src/Modifiers/ResizeCanvasModifier.php create mode 100755 vendor/intervention/image/src/Modifiers/ResizeCanvasRelativeModifier.php create mode 100755 vendor/intervention/image/src/Modifiers/ResizeDownModifier.php create mode 100755 vendor/intervention/image/src/Modifiers/ResizeModifier.php create mode 100755 vendor/intervention/image/src/Modifiers/ResolutionModifier.php create mode 100755 vendor/intervention/image/src/Modifiers/RotateModifier.php create mode 100755 vendor/intervention/image/src/Modifiers/ScaleDownModifier.php create mode 100755 vendor/intervention/image/src/Modifiers/ScaleModifier.php create mode 100755 vendor/intervention/image/src/Modifiers/SharpenModifier.php create mode 100755 vendor/intervention/image/src/Modifiers/SliceAnimationModifier.php create mode 100755 vendor/intervention/image/src/Modifiers/TextModifier.php create mode 100755 vendor/intervention/image/src/Modifiers/TrimModifier.php create mode 100755 vendor/intervention/image/src/Origin.php create mode 100755 vendor/intervention/image/src/Resolution.php create mode 100755 vendor/intervention/image/src/Traits/CanBeDriverSpecialized.php create mode 100755 vendor/intervention/image/src/Traits/CanBuildFilePointer.php create mode 100755 vendor/intervention/image/src/Typography/Font.php create mode 100755 vendor/intervention/image/src/Typography/FontFactory.php create mode 100755 vendor/intervention/image/src/Typography/Line.php create mode 100755 vendor/intervention/image/src/Typography/TextBlock.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/LICENSE.md mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/composer.json mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Actions.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Answers/AnswerBus.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Answers/Answerable.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Api.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/BotsManager.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Commands/Command.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Commands/CommandBus.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Commands/CommandInterface.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Commands/HelpCommand.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/EntityType.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Events/AbstractEvent.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Events/Emitter.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Events/EventDispatcherFactory.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Events/EventDispatcherListenerContract.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Events/HasEventDispatcher.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Events/HasEventName.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Events/LeagueEventDispatcher.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Events/UpdateEvent.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Events/UpdateWasReceived.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Exceptions/CouldNotUploadInputFile.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Exceptions/ResponseParameters.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Exceptions/TelegramBotNotFoundException.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Exceptions/TelegramEmojiMapFileNotFoundException.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Exceptions/TelegramOtherException.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Exceptions/TelegramResponseException.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Exceptions/TelegramSDKException.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Exceptions/TelegramUndefinedPropertyException.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/FileUpload/InputFile.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Helpers/Emojify.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Helpers/Entities.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/HttpClients/GuzzleHttpClient.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/HttpClients/HttpClientInterface.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Keyboard/Base.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Keyboard/Button.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Keyboard/Keyboard.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Laravel/Artisan/WebhookCommand.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Laravel/Facades/Telegram.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Laravel/TelegramServiceProvider.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Laravel/config/telegram.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Methods/Chat.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Methods/Commands.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Methods/EditMessage.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Methods/Forum.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Methods/Game.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Methods/Get.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Methods/Location.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Methods/Message.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Methods/Passport.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Methods/Payments.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Methods/Query.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Methods/Stickers.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Methods/Update.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Animation.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Audio.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/BaseObject.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/BotCommand.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/CallbackQuery.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Chat.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/ChatInviteLink.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/ChatJoinRequest.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/ChatLocation.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/ChatMember.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/ChatMemberUpdated.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/ChatPermissions.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/ChatPhoto.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/ChosenInlineResult.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Contact.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Dice.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Document.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/EditedMessage.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/File.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/ForumTopic.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Game.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/GameHighScore.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineBaseObject.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultArticle.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultAudio.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultCachedAudio.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultCachedDocument.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultCachedGif.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultCachedMpeg4Gif.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultCachedPhoto.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultCachedSticker.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultCachedVideo.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultCachedVoice.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultContact.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultDocument.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultGame.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultGif.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultLocation.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultMpeg4Gif.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultPhoto.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultVenue.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultVideo.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultVoice.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/InputContent/InputContactMessageContent.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/InputContent/InputLocationMessageContent.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/InputContent/InputTextMessageContent.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/InputContent/InputVenueMessageContent.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/InputMedia/InputMedia.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/InputMedia/InputMediaAnimation.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/InputMedia/InputMediaAudio.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/InputMedia/InputMediaDocument.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/InputMedia/InputMediaPhoto.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/InputMedia/InputMediaVideo.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Location.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/LoginUrl.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/MaskPosition.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Message.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/MessageAutoDeleteTimerChanged.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/MessageEntity.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/Credentials.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/DataCredentials.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/EncryptedCredentials.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/EncryptedPassportElement.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/FileCredentials.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/IdDocumentData.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/PassportData.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/PassportElementError.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/PassportElementErrorDataField.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/PassportElementErrorFile.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/PassportElementErrorFiles.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/PassportElementErrorFrontSide.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/PassportElementErrorReverseSide.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/PassportElementErrorSelfie.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/PassportElementErrorTranslationFile.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/PassportElementErrorTranslationFiles.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/PassportElementErrorUnspecified.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/PassportFile.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/PassportScope.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/PassportScopeElement.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/PassportScopeElementOne.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/PassportScopeElementOneOfSeveral.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/PersonalDetails.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/ResidentialAddress.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/SecureData.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/SecureValue.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Payments/Invoice.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Payments/LabeledPrice.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Payments/OrderInfo.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Payments/PreCheckoutQuery.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Payments/ShippingAddress.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Payments/ShippingOption.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Payments/ShippingQuery.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Payments/SuccessfulPayment.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/PhotoSize.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Poll.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/PollAnswer.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/PollOption.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/ProximityAlertTriggered.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/ReactionType.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/ResponseParameters.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Sticker.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/StickerSet.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/TelegramObject.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/UnknownObject.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Update.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/User.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/UserProfilePhotos.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Venue.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Video.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/VideoNote.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/Voice.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/VoiceChatEnded.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/VoiceChatParticipantsInvited.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/VoiceChatScheduled.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/VoiceChatStarted.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/WebApp/WebAppData.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Objects/WebhookInfo.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Storage/emoji.json mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/TelegramClient.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/TelegramRequest.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/TelegramResponse.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Traits/CommandsHandler.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Traits/HasContainer.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Traits/Http.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Traits/Singleton.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Traits/Telegram.php mode change 100644 => 100755 vendor/irazasyed/telegram-bot-sdk/src/Traits/Validator.php mode change 100644 => 100755 vendor/symfony/yaml/CHANGELOG.md mode change 100644 => 100755 vendor/symfony/yaml/Command/LintCommand.php mode change 100644 => 100755 vendor/symfony/yaml/Dumper.php mode change 100644 => 100755 vendor/symfony/yaml/Escaper.php mode change 100644 => 100755 vendor/symfony/yaml/Exception/DumpException.php mode change 100644 => 100755 vendor/symfony/yaml/Exception/ExceptionInterface.php mode change 100644 => 100755 vendor/symfony/yaml/Exception/ParseException.php mode change 100644 => 100755 vendor/symfony/yaml/Exception/RuntimeException.php mode change 100644 => 100755 vendor/symfony/yaml/Inline.php mode change 100644 => 100755 vendor/symfony/yaml/LICENSE mode change 100644 => 100755 vendor/symfony/yaml/Parser.php mode change 100644 => 100755 vendor/symfony/yaml/Tag/TaggedValue.php mode change 100644 => 100755 vendor/symfony/yaml/Unescaper.php mode change 100644 => 100755 vendor/symfony/yaml/Yaml.php mode change 100644 => 100755 vendor/symfony/yaml/composer.json diff --git a/.editorconfig b/.editorconfig old mode 100644 new mode 100755 diff --git a/.env.example b/.env.example old mode 100644 new mode 100755 diff --git a/.gitignore b/.gitignore old mode 100644 new mode 100755 diff --git a/app/Services/Article/CacheTg.php b/app/Services/Article/CacheTg.php old mode 100644 new mode 100755 diff --git a/app/Services/Article/Cmd.php b/app/Services/Article/Cmd.php old mode 100644 new mode 100755 diff --git a/app/Services/Article/Schema.php b/app/Services/Article/Schema.php old mode 100644 new mode 100755 diff --git a/app/Services/Article_old.php b/app/Services/Article_old.php old mode 100644 new mode 100755 diff --git a/app/Services/Country-meiyong.php b/app/Services/Country-meiyong.php old mode 100644 new mode 100755 diff --git a/app/Services/Cron.php b/app/Services/Cron.php old mode 100644 new mode 100755 index 53bdfc99..301aeffe --- a/app/Services/Cron.php +++ b/app/Services/Cron.php @@ -13,6 +13,7 @@ use App\Services\Cron\FreenodeMerge as CronFreenodeMerge; use App\Services\Cron\FreenodeLog as CronFreenodeLog; use App\Services\Cron\FreenodeSync as CronFreenodeSync; use App\Services\Cron\ArticleSchema as CronArticleSchema; +use App\Services\Cron\FnTgPublish as CronFnTgPublish; use App\Services\TomTool\Telegram\Slave as TeleSlave; final class Cron @@ -50,22 +51,26 @@ final class Cron CronFreenodeSync::run(); } - if ($i % 3 === 0) { - CronArticleSchema::cacheTgSave(); - CronArticleSchema::pushToSlave(); - CronHttpQueue::pop(); - } - - if ($i === 0) { - // ReportSender::handle(); - } +// if ($i === 0) { +// // ReportSender::handle(); +// } if ($h == 5 && $i === 3) { CronFreenodeFile::clear(); } - if ($h == 15 && $i == 3) { -// CronFreenodeLog::fromLast(); +// if ($h == 15 && $i == 3) { +//// CronFreenodeLog::fromLast(); +// } + + if ($h == 11 && $i == 3) { // 中午12点03发布fn的tg + CronFnTgPublish::run(); + } + + if ($i % 3 === 0) { + CronArticleSchema::cacheTgSave(); + CronArticleSchema::pushToSlave(); + CronHttpQueue::pop(); } } catch (\Throwable $e) { @@ -90,7 +95,6 @@ final class Cron } - } public function setTestH(int $h): void diff --git a/app/Services/Cron/ArticleSchema.php b/app/Services/Cron/ArticleSchema.php old mode 100644 new mode 100755 diff --git a/app/Services/Cron/Book.php b/app/Services/Cron/Book.php old mode 100644 new mode 100755 diff --git a/app/Services/Cron/FnTgPublish.php b/app/Services/Cron/FnTgPublish.php new file mode 100755 index 00000000..ba5f71bb --- /dev/null +++ b/app/Services/Cron/FnTgPublish.php @@ -0,0 +1,77 @@ +get()->toArray(); + + foreach ($aSiteList as $aSite) { + $sConfig = $aSite["config"] ?? ""; + $sApiPath = $aSite["api_path"] ?? ""; + $sSiteDomain = $aSite["url"] ?? ""; + $sSiteCode = $aSite["code"] ?? ""; + $iImgId = $aSite["img_id"] ?? 1; + + //// test +// $sSiteCode = "clashfreenode.com"; + + $aConfig = json_decode($sConfig, true); + $aApiPath = json_decode($sApiPath, true); + + $sApiPath = $aApiPath["article_find"] ?? ""; + $sApiUrl = "https://".$sSiteDomain."/".$sApiPath; + + $aData = [ + "articleType" => "node", + "code" => date("Ymd") + ]; + + $sResult = HttpV2::make($sApiUrl, "post")->setDataA($aData)->enableJsonSend(true)->send(); + $aResult = json_decode($sResult, true); + + if (!isset($aResult["isDone"])) { + throw new \Exception("没有isDone? >>> ".$sResult); + } + + if (!$aResult["isDone"]) { + throw new \Exception($aResult["sMsg"]); + } + + $sTitle = "「".date("m月d日")."」最新免费节点,SSR/V2ray/Clash/Shadowrocket"; + + $sStr = $sTitle."\n\n👉 https://".$sSiteDomain."/fn/".date("Ymd").".html"; + + $sImgUrl = "https://".$sSiteDomain."/site/".$sSiteCode."/images/article/".$iImgId.".png"; +// $sImgUrl = "https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png"; +// $sImgUrl = "https://clashfreenode.com/site/clashfreenode.com/images/article/5.png"; +// $sImgUrl = "https://gips3.baidu.com/it/u=1821127123,1149655687&fm=3028&app=3028&f=JPEG&fmt=auto?w=720&h=1280"; +// $sImgUrl = ""; + + $r = TeleSlave::start($sSiteCode, $sSiteCode) +// ->enableSlaveQueue(false) + ->enableDetail(false) + ->enableAsync(false) + ->setPhotoUrl($sImgUrl, 1280, 720) + ->setMsgS($sStr) + ->setType("html") + ->send(); + + echo "\n - ok"; + } + } + +} diff --git a/app/Services/Cron/FreenodeCrawl.php b/app/Services/Cron/FreenodeCrawl.php old mode 100644 new mode 100755 diff --git a/app/Services/Cron/FreenodeFile.php b/app/Services/Cron/FreenodeFile.php old mode 100644 new mode 100755 diff --git a/app/Services/Cron/FreenodeLog.php b/app/Services/Cron/FreenodeLog.php old mode 100644 new mode 100755 diff --git a/app/Services/Cron/FreenodeMerge.php b/app/Services/Cron/FreenodeMerge.php old mode 100644 new mode 100755 diff --git a/app/Services/Cron/FreenodePool.php b/app/Services/Cron/FreenodePool.php old mode 100644 new mode 100755 diff --git a/app/Services/Cron/FreenodeSync.php b/app/Services/Cron/FreenodeSync.php old mode 100644 new mode 100755 diff --git a/app/Services/Cron/HttpQueue.php b/app/Services/Cron/HttpQueue.php old mode 100644 new mode 100755 index 300edf65..4ddeb95b --- a/app/Services/Cron/HttpQueue.php +++ b/app/Services/Cron/HttpQueue.php @@ -31,7 +31,11 @@ final class HttpQueue $sBotToken = $aArg["sBotToken"] ?? ''; $iChatId = $aArg["iChatId"] ?? 0; $sMsg = $aArg["sMsg"] ?? ''; + $sPhotoUrl = $aArg["sPhotoUrl"] ?? ''; + $iPhotoWidth = $aArg["iPhotoWidth"] ?? 0; + $iPhotoHeight = $aArg["iPhotoHeight"] ?? 0; $enableMaster = $aArg["enableMaster"] ?? null; + $sType = $aArg["sType"] ?? ''; if ($enableMaster) { $oTgSlave = TelegramSlave::start() @@ -44,6 +48,8 @@ final class HttpQueue ->setBotToken($sBotToken) ->setChatId($iChatId) ->setMsgS($sMsg) + ->setPhotoUrl($sPhotoUrl, $iPhotoWidth, $iPhotoHeight) + ->setType($sType) ->send(); if ($oTgSlave->isFail()) { @@ -62,6 +68,8 @@ final class HttpQueue ->setBotToken($sBotToken) ->setChatId($iChatId) ->setMsgS($sMsg) + ->setPhotoUrl($sPhotoUrl, $iPhotoWidth, $iPhotoHeight) + ->setType($sType) ->send(); if ($oTgSlave->isFail()) { diff --git a/app/Services/HttpQueue.php b/app/Services/HttpQueue.php old mode 100644 new mode 100755 diff --git a/app/Services/OpenApi/Telegram.php b/app/Services/OpenApi/Telegram.php old mode 100644 new mode 100755 index a04698e5..88465724 --- a/app/Services/OpenApi/Telegram.php +++ b/app/Services/OpenApi/Telegram.php @@ -33,15 +33,22 @@ final class Telegram $iChatId = (int) ($aArg["iChatId"] ?? 0); $enableMasterQueue = $aArg["enableMasterQueue"] ?? false; // 用不着了 $sMsg = $aArg["sMsg"] ?? ''; + $sPhotoUrl = $aArg["sPhotoUrl"] ?? ''; + $iPhotoWidth = $aArg["iPhotoWidth"] ?? 0; + $iPhotoHeight = $aArg["iPhotoHeight"] ?? 0; + $sType = $aArg["sType"] ?? ''; $r = TeleMaster::start() ->setBotCode($sBotCode) ->setChatCode($sChatCode) ->setBotToken($sBotToken) ->setChatId($iChatId) + ->setPhotoUrl($sPhotoUrl, $iPhotoWidth, $iPhotoHeight) + ->setType($sType) ->send($sMsg); - return $oFlow->done(); + echo json_encode($r->getResult()); + exit; } diff --git a/app/Services/SDK/Master/Master.php b/app/Services/SDK/Master/Master.php old mode 100644 new mode 100755 diff --git a/app/Services/SDK/Master/Telegram.php b/app/Services/SDK/Master/Telegram.php old mode 100644 new mode 100755 diff --git a/app/Services/SlaveMap.php b/app/Services/SlaveMap.php old mode 100644 new mode 100755 diff --git a/app/Services/Tg/Hook/Dog.php b/app/Services/Tg/Hook/Dog.php old mode 100644 new mode 100755 diff --git a/app/Services/Tg/Hook/Mod/Article.php b/app/Services/Tg/Hook/Mod/Article.php old mode 100644 new mode 100755 diff --git a/app/Services/Tg/Hook/Mod/ArticleCache.php b/app/Services/Tg/Hook/Mod/ArticleCache.php old mode 100644 new mode 100755 diff --git a/app/Services/Tg/Hook/Mod/ArticleConfig.php b/app/Services/Tg/Hook/Mod/ArticleConfig.php old mode 100644 new mode 100755 diff --git a/app/Services/Tg/Hook/Mod/ArticleSchema.php b/app/Services/Tg/Hook/Mod/ArticleSchema.php old mode 100644 new mode 100755 diff --git a/app/Services/Tg/Hook/Mod/ArticleSiteMapGroup.php b/app/Services/Tg/Hook/Mod/ArticleSiteMapGroup.php old mode 100644 new mode 100755 diff --git a/app/Services/Tg/Hook/Mod/Article_old.php b/app/Services/Tg/Hook/Mod/Article_old.php old mode 100644 new mode 100755 diff --git a/app/Services/Tg/Hook/Mod/Base.php b/app/Services/Tg/Hook/Mod/Base.php old mode 100644 new mode 100755 diff --git a/app/Services/Tg/Hook/Mod/Blade.php b/app/Services/Tg/Hook/Mod/Blade.php old mode 100644 new mode 100755 diff --git a/app/Services/Tg/Hook/Mod/BladeOld.php b/app/Services/Tg/Hook/Mod/BladeOld.php old mode 100644 new mode 100755 diff --git a/app/Services/Tg/Hook/Mod/Book.php b/app/Services/Tg/Hook/Mod/Book.php old mode 100644 new mode 100755 diff --git a/app/Services/Tg/Hook/Mod/Box.php b/app/Services/Tg/Hook/Mod/Box.php old mode 100644 new mode 100755 diff --git a/app/Services/Tg/Hook/Mod/Cron.php b/app/Services/Tg/Hook/Mod/Cron.php old mode 100644 new mode 100755 diff --git a/app/Services/Tg/Hook/Mod/Db.php b/app/Services/Tg/Hook/Mod/Db.php old mode 100644 new mode 100755 diff --git a/app/Services/Tg/Hook/Mod/Dev.php b/app/Services/Tg/Hook/Mod/Dev.php old mode 100644 new mode 100755 diff --git a/app/Services/Tg/Hook/Mod/Dove.php b/app/Services/Tg/Hook/Mod/Dove.php old mode 100644 new mode 100755 diff --git a/app/Services/Tg/Hook/Mod/DoveSite.php b/app/Services/Tg/Hook/Mod/DoveSite.php old mode 100644 new mode 100755 diff --git a/app/Services/Tg/Hook/Mod/FreenodeFrom.php b/app/Services/Tg/Hook/Mod/FreenodeFrom.php old mode 100644 new mode 100755 diff --git a/app/Services/Tg/Hook/Mod/FreenodePool.php b/app/Services/Tg/Hook/Mod/FreenodePool.php old mode 100644 new mode 100755 diff --git a/app/Services/Tg/Hook/Mod/GemboxDns.php b/app/Services/Tg/Hook/Mod/GemboxDns.php old mode 100644 new mode 100755 diff --git a/app/Services/Tg/Hook/Mod/Good.php b/app/Services/Tg/Hook/Mod/Good.php old mode 100644 new mode 100755 diff --git a/app/Services/Tg/Hook/Mod/Hook.php b/app/Services/Tg/Hook/Mod/Hook.php old mode 100644 new mode 100755 diff --git a/app/Services/Tg/Hook/Mod/Hook_old.php b/app/Services/Tg/Hook/Mod/Hook_old.php old mode 100644 new mode 100755 diff --git a/app/Services/Tg/Hook/Mod/HttpQueue.php b/app/Services/Tg/Hook/Mod/HttpQueue.php old mode 100644 new mode 100755 diff --git a/app/Services/Tg/Hook/Mod/Jctj.php b/app/Services/Tg/Hook/Mod/Jctj.php old mode 100644 new mode 100755 diff --git a/app/Services/Tg/Hook/Mod/JctjOption.php b/app/Services/Tg/Hook/Mod/JctjOption.php old mode 100644 new mode 100755 diff --git a/app/Services/Tg/Hook/Mod/Note.php b/app/Services/Tg/Hook/Mod/Note.php old mode 100644 new mode 100755 diff --git a/app/Services/Tg/Hook/Mod/Note_option.php b/app/Services/Tg/Hook/Mod/Note_option.php old mode 100644 new mode 100755 diff --git a/app/Services/Tg/Hook/Mod/Option.php b/app/Services/Tg/Hook/Mod/Option.php old mode 100644 new mode 100755 diff --git a/app/Services/Tg/Hook/Mod/Ship.php b/app/Services/Tg/Hook/Mod/Ship.php old mode 100644 new mode 100755 diff --git a/app/Services/Tg/Hook/Mod/SiteMap.php b/app/Services/Tg/Hook/Mod/SiteMap.php old mode 100644 new mode 100755 diff --git a/app/Services/Tg/Hook/Mod/SitePathMap.php b/app/Services/Tg/Hook/Mod/SitePathMap.php old mode 100644 new mode 100755 diff --git a/app/Services/Tg/Hook/Mod/TelegramKey.php b/app/Services/Tg/Hook/Mod/TelegramKey.php old mode 100644 new mode 100755 diff --git a/app/Services/Tg/Hook/Mod/Test.php b/app/Services/Tg/Hook/Mod/Test.php old mode 100644 new mode 100755 diff --git a/app/Services/Tg/Hook/Mod/Tool.php b/app/Services/Tg/Hook/Mod/Tool.php old mode 100644 new mode 100755 diff --git a/app/Services/Tg/Hook/Mod/Upload.php b/app/Services/Tg/Hook/Mod/Upload.php old mode 100644 new mode 100755 diff --git a/app/Services/Tg/Http.php b/app/Services/Tg/Http.php old mode 100644 new mode 100755 diff --git a/app/Services/TomTool/Telegram/Master.php b/app/Services/TomTool/Telegram/Master.php index 559671d7..03d800f7 100755 --- a/app/Services/TomTool/Telegram/Master.php +++ b/app/Services/TomTool/Telegram/Master.php @@ -36,6 +36,11 @@ final class Master public int $iChatId = 0; public string $sMsg = ''; + public string $sPhotoUrl = ''; + public int $iPhotoWidth = 0; + public int $iPhotoHeight = 0; + + public string $sType = ''; public bool $enableQueue = false; // 应该用不到了 @@ -79,6 +84,20 @@ final class Master return $this; } + public function setPhotoUrl(string $sPhotoUrl, int $iPhotoWidth = 0, int $iPhotoHeight = 0): self + { + $this->sPhotoUrl = $sPhotoUrl; + $this->iPhotoWidth = $iPhotoWidth; + $this->iPhotoHeight = $iPhotoHeight; + return $this; + } + + public function setType(string $sType): self + { + $this->sType = $sType; + return $this; + } + public function send($sMsg = ''): Flow { if ($sMsg) { @@ -99,9 +118,11 @@ final class Master ->setBotToken($this->sBotToken) ->setChatId($this->iChatId) ->setMsgS($this->sMsg) + ->setPhotoUrl($this->sPhotoUrl, $this->iPhotoWidth, $this->iPhotoHeight) + ->setType($this->sType) ->send(); } - + return $oFlow; } @@ -131,7 +152,11 @@ final class Master "sChatCode" => $this->sChatCode ?? '', "sBotToken" => $this->sBotToken ?? '', "iChatId" => $this->iChatId ?? '', - "sMsg" => $this->sMsg ?? '', + "sPhotoUrl" => $this->sPhotoUrl ?? '', + "iPhotoWidth" => $this->iPhotoWidth, + "iPhotoHeight" => $this->iPhotoHeight, + "sMsg" => $this->sMsg ?? '', + "sType" => $this->sType ?? '', ]; } diff --git a/app/Services/TomTool/Telegram/Sdk.php b/app/Services/TomTool/Telegram/Sdk.php index aaf55f1d..9375fb99 100755 --- a/app/Services/TomTool/Telegram/Sdk.php +++ b/app/Services/TomTool/Telegram/Sdk.php @@ -4,8 +4,13 @@ declare(strict_types=1); namespace App\Services\TomTool\Telegram; use Telegram\Bot\Api; +use Telegram\Bot\FileUpload\InputFile; use Telegram\Bot\Exceptions\TelegramSDKException; use App\Services\TomTool\Flow; +//use Intervention\Image\Laravel\Facades\Image; +use Intervention\Image\ImageManager; +use Intervention\Image\Drivers\Gd\Driver; +use App\Services\TomTool\HttpV2; class Sdk { @@ -13,6 +18,9 @@ class Sdk public $sMsgFormatType = 'none'; public $sBotToken = ''; public $iChatId = 0; + public $sPhotoUrl = ''; + public $iPhotoWidth = 0; + public $iPhotoHeight = 0; public $sMsg; public $oApi; @@ -43,20 +51,44 @@ class Sdk return $this; } + public function setPhotoUrl($sUrl = '', $iPhotoWidth = 0, $iPhotoHeight = 0) + { + $this->sPhotoUrl = $sUrl; + $this->iPhotoWidth = $iPhotoWidth; + $this->iPhotoHeight = $iPhotoHeight; +// tomd($iPhotoWidth, 1); + return $this; + } + + public function setType($sType) + { + if ($sType) { + $this->sMsgFormatType = $sType; + } + + return $this; + } + public function send() { $oFlow = Flow::start("tg_sdk_send"); $this->msgFormat(); - - try { - $r = $this->oApi->sendMessage($this->sMsgFormat); - if (!$r->isOk()) { - return $oFlow->fail(); + +// try { + + if ($this->sPhotoUrl) { + $r = $this->oApi->sendPhoto($this->sMsgFormat); + } else { + $r = $this->oApi->sendMessage($this->sMsgFormat); } - } catch (TelegramSDKException $e) { - return $oFlow->fail(['error' => $e->getMessage()]); - } + + if (!($r && $r->getMessageId())) { + return $oFlow->fail($r); + } +// } catch (TelegramSDKException $e) { +// return $oFlow->fail(['error' => $e->getMessage()]); +// } return $oFlow->done(); } @@ -73,9 +105,33 @@ class Sdk if (!in_array($this->sMsgFormatType, self::ALLOWED_FORMATS, true)) { throw new \RuntimeException("不支持的格式类型: {$this->sMsgFormatType}"); } - +// ini_set('memory_limit', '512M'); $method = 'msgFormat_' . $this->sMsgFormatType; $this->sMsgFormat = $this->$method(); + + if ($this->sPhotoUrl) { + + $oManager = new ImageManager(new Driver()); + + $sTempPath = $_ENV['dir_base'].'public/upload'; + $sTempPath .= "/tg_output.png"; + + $sImg = file_get_contents($this->sPhotoUrl); + $oImage = $oManager->read($sImg); +// tomd($this->iPhotoWidth, 1); + if ($this->iPhotoWidth && $this->iPhotoHeight) { + $oImage = $oImage->cover($this->iPhotoWidth, $this->iPhotoHeight); + } + + $oImage->toJpg(80)->save($sTempPath); + + $photo = InputFile::create($sTempPath, date("Y-m-d").'.jpg'); + + $this->sMsgFormat["photo"] = $photo; + + $this->sMsgFormat["caption"] = $this->sMsgFormat["text"]; + unset($this->sMsgFormat["text"]); + } return $this; } diff --git a/app/Services/TomTool/Telegram/Slave.php b/app/Services/TomTool/Telegram/Slave.php index 00ca8af4..2b7ed6fa 100755 --- a/app/Services/TomTool/Telegram/Slave.php +++ b/app/Services/TomTool/Telegram/Slave.php @@ -57,6 +57,11 @@ class Slave public int $iChatId = 0; public string $sMsg = ''; + public string $sPhotoUrl = ''; + public int $iPhotoWidth = 0; + public int $iPhotoHeight = 0; + + public string $sType = ''; public bool $enableMaster = true; public bool $enableMasterQueue = false; // 这里之前想错了,不会有master队列,只在slave有,master转发就行了 @@ -138,6 +143,22 @@ class Slave return $this; } + // set + public function setPhotoUrl(string $sPhotoUrl, int $iWidth = 0, int $iHeight = 0): self + { + $this->sPhotoUrl = $sPhotoUrl; + $this->iPhotoWidth = $iWidth; + $this->iPhotoHeight = $iHeight; + return $this; + } + + // set + public function setType(string $sType): self + { + $this->sType = $sType; + return $this; + } + // set public function setMsgS(string $sMsg = ''): self { @@ -240,6 +261,7 @@ class Slave private function _send_master(): Flow { +// tomd(11111,1); $aData = $this->buildDataTom(); if ($this->enableSlaveQueue) { @@ -264,7 +286,7 @@ class Slave } $r = $oHttpV2->enableJsonAs()->setData($aData)->send(); - + if ($this->enableAsync) { return $oFlow->sData("async")->done("async"); } else { @@ -287,6 +309,7 @@ class Slave return $oFlow; } + // 直接从本地发到tg,几乎用不上,都走master了 private function _send_local(): Flow { if ($this->enableSlaveQueue) { @@ -309,6 +332,10 @@ class Slave "enableMasterQueue" => $this->enableMasterQueue ?? '', "enableMaster" => $this->enableMaster, "sMsg" => $this->sMsg ?? '', + "sPhotoUrl" => $this->sPhotoUrl ?? '', + "iPhotoWidth" => $this->iPhotoWidth ?? 0, + "iPhotoHeight" => $this->iPhotoHeight ?? 0, + "sType" => $this->sType ?? '', ]; } diff --git a/composer.json b/composer.json index 284e66a8..c541d9c1 100755 --- a/composer.json +++ b/composer.json @@ -8,6 +8,7 @@ "require": { "php": "^8.2", "guzzlehttp/guzzle": "^7.9", + "intervention/image": "^3.11", "irazasyed/telegram-bot-sdk": "^3.15", "laravel/framework": "^11.31", "laravel/tinker": "^2.9", diff --git a/composer.lock b/composer.lock index 1cd220dc..2d25c574 100755 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "0276bc3b1e98a844fc7c078b38dc44f8", + "content-hash": "60674f80fc8b7a52ce2d729648d5b538", "packages": [ { "name": "brick/math", @@ -1054,6 +1054,150 @@ ], "time": "2023-12-03T19:50:20+00:00" }, + { + "name": "intervention/gif", + "version": "4.2.2", + "source": { + "type": "git", + "url": "https://github.com/Intervention/gif.git", + "reference": "5999eac6a39aa760fb803bc809e8909ee67b451a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Intervention/gif/zipball/5999eac6a39aa760fb803bc809e8909ee67b451a", + "reference": "5999eac6a39aa760fb803bc809e8909ee67b451a", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "phpstan/phpstan": "^2.1", + "phpunit/phpunit": "^10.0 || ^11.0 || ^12.0", + "slevomat/coding-standard": "~8.0", + "squizlabs/php_codesniffer": "^3.8" + }, + "type": "library", + "autoload": { + "psr-4": { + "Intervention\\Gif\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Oliver Vogel", + "email": "oliver@intervention.io", + "homepage": "https://intervention.io/" + } + ], + "description": "Native PHP GIF Encoder/Decoder", + "homepage": "https://github.com/intervention/gif", + "keywords": [ + "animation", + "gd", + "gif", + "image" + ], + "support": { + "issues": "https://github.com/Intervention/gif/issues", + "source": "https://github.com/Intervention/gif/tree/4.2.2" + }, + "funding": [ + { + "url": "https://paypal.me/interventionio", + "type": "custom" + }, + { + "url": "https://github.com/Intervention", + "type": "github" + }, + { + "url": "https://ko-fi.com/interventionphp", + "type": "ko_fi" + } + ], + "time": "2025-03-29T07:46:21+00:00" + }, + { + "name": "intervention/image", + "version": "3.11.6", + "source": { + "type": "git", + "url": "https://github.com/Intervention/image.git", + "reference": "5f6d27d9fd56312c47f347929e7ac15345c605a1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Intervention/image/zipball/5f6d27d9fd56312c47f347929e7ac15345c605a1", + "reference": "5f6d27d9fd56312c47f347929e7ac15345c605a1", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "intervention/gif": "^4.2", + "php": "^8.1" + }, + "require-dev": { + "mockery/mockery": "^1.6", + "phpstan/phpstan": "^2.1", + "phpunit/phpunit": "^10.0 || ^11.0 || ^12.0", + "slevomat/coding-standard": "~8.0", + "squizlabs/php_codesniffer": "^3.8" + }, + "suggest": { + "ext-exif": "Recommended to be able to read EXIF data properly." + }, + "type": "library", + "autoload": { + "psr-4": { + "Intervention\\Image\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Oliver Vogel", + "email": "oliver@intervention.io", + "homepage": "https://intervention.io" + } + ], + "description": "PHP Image Processing", + "homepage": "https://image.intervention.io", + "keywords": [ + "gd", + "image", + "imagick", + "resize", + "thumbnail", + "watermark" + ], + "support": { + "issues": "https://github.com/Intervention/image/issues", + "source": "https://github.com/Intervention/image/tree/3.11.6" + }, + "funding": [ + { + "url": "https://paypal.me/interventionio", + "type": "custom" + }, + { + "url": "https://github.com/Intervention", + "type": "github" + }, + { + "url": "https://ko-fi.com/interventionphp", + "type": "ko_fi" + } + ], + "time": "2025-12-17T13:38:29+00:00" + }, { "name": "irazasyed/telegram-bot-sdk", "version": "v3.15.0", diff --git a/fn的tg策略.md b/fn的tg策略.md old mode 100644 new mode 100755 diff --git a/fn部署.md b/fn部署.md old mode 100644 new mode 100755 diff --git a/public/js/jquery.min.js b/public/js/jquery.min.js old mode 100644 new mode 100755 diff --git a/public/upload/无标题.png b/public/upload/无标题.png old mode 100644 new mode 100755 diff --git a/resources/views/cmd.blade.php b/resources/views/cmd.blade.php old mode 100644 new mode 100755 diff --git a/resources/views/cmd/image/upload.blade.php b/resources/views/cmd/image/upload.blade.php old mode 100644 new mode 100755 diff --git a/scripts/cron.php b/scripts/cron.php old mode 100644 new mode 100755 diff --git a/tg发送逻辑.md b/tg发送逻辑.md new file mode 100644 index 00000000..86755f59 --- /dev/null +++ b/tg发送逻辑.md @@ -0,0 +1,8 @@ + +本地(队列) 》〉masterOpenApi(无队列) 》〉tg + +有点乱的地方: + 原设想本地和master都有队列,后来发现master队列没有必要,因为判断成功只从本地队列判断就够了。 + 所以现在的玩法是:数据严格的就走本地队列,不严格的直接发送master + 也是为什么master里的tg接受api没有队列代码,而sdk设计的有。(没必要的过度设计反而误导了) + 而master里的HttpQueue实际是他作为slave时使用的,别误会了 diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php index dc222020..7e1ef830 100755 --- a/vendor/composer/autoload_classmap.php +++ b/vendor/composer/autoload_classmap.php @@ -7,6 +7,7 @@ $baseDir = dirname($vendorDir); return array( 'App\\Http\\Controllers\\Api\\CountryController' => $baseDir . '/app/Http/Controllers/Api/CountryController.php', + 'App\\Http\\Controllers\\Api\\FreenodeController' => $baseDir . '/app/Http/Controllers/Api/FreenodeController.php', 'App\\Http\\Controllers\\Api\\GithubController' => $baseDir . '/app/Http/Controllers/Api/GithubController.php', 'App\\Http\\Controllers\\Api\\GoodController' => $baseDir . '/app/Http/Controllers/Api/GoodController.php', 'App\\Http\\Controllers\\Api\\ShipController' => $baseDir . '/app/Http/Controllers/Api/ShipController.php', @@ -32,6 +33,8 @@ return array( 'App\\Models\\CrawlFreenode' => $baseDir . '/app/Models/CrawlFreenode.php', 'App\\Models\\DogOption' => $baseDir . '/app/Models/DogOption.php', 'App\\Models\\DoveSite' => $baseDir . '/app/Models/DoveSite.php', + 'App\\Models\\FreenodePool' => $baseDir . '/app/Models/FreenodePool.php', + 'App\\Models\\GemboxDns' => $baseDir . '/app/Models/GemboxDns.php', 'App\\Models\\GoodPool' => $baseDir . '/app/Models/GoodPool.php', 'App\\Models\\Hook' => $baseDir . '/app/Models/Hook.php', 'App\\Models\\HttpQueue' => $baseDir . '/app/Models/HttpQueue.php', @@ -49,7 +52,13 @@ return array( 'App\\Services\\Article\\Schema' => $baseDir . '/app/Services/Article/Schema.php', 'App\\Services\\Cron' => $baseDir . '/app/Services/Cron.php', 'App\\Services\\Cron\\ArticleSchema' => $baseDir . '/app/Services/Cron/ArticleSchema.php', - 'App\\Services\\Cron\\CrawlFreenode' => $baseDir . '/app/Services/Cron/CrawlFreenode.php', + 'App\\Services\\Cron\\FnTgPublish' => $baseDir . '/app/Services/Cron/FnTgPublish.php', + 'App\\Services\\Cron\\FreenodeCrawl' => $baseDir . '/app/Services/Cron/FreenodeCrawl.php', + 'App\\Services\\Cron\\FreenodeFile' => $baseDir . '/app/Services/Cron/FreenodeFile.php', + 'App\\Services\\Cron\\FreenodeLog' => $baseDir . '/app/Services/Cron/FreenodeLog.php', + 'App\\Services\\Cron\\FreenodeMerge' => $baseDir . '/app/Services/Cron/FreenodeMerge.php', + 'App\\Services\\Cron\\FreenodePool' => $baseDir . '/app/Services/Cron/FreenodePool.php', + 'App\\Services\\Cron\\FreenodeSync' => $baseDir . '/app/Services/Cron/FreenodeSync.php', 'App\\Services\\Cron\\HttpQueue' => $baseDir . '/app/Services/Cron/HttpQueue.php', 'App\\Services\\HttpQueue' => $baseDir . '/app/Services/HttpQueue.php', 'App\\Services\\OpenApi\\Telegram' => $baseDir . '/app/Services/OpenApi/Telegram.php', @@ -70,8 +79,12 @@ return array( 'App\\Services\\Tg\\Hook\\Mod\\Dev' => $baseDir . '/app/Services/Tg/Hook/Mod/Dev.php', 'App\\Services\\Tg\\Hook\\Mod\\Dove' => $baseDir . '/app/Services/Tg/Hook/Mod/Dove.php', 'App\\Services\\Tg\\Hook\\Mod\\DoveSite' => $baseDir . '/app/Services/Tg/Hook/Mod/DoveSite.php', + 'App\\Services\\Tg\\Hook\\Mod\\FreenodeFrom' => $baseDir . '/app/Services/Tg/Hook/Mod/FreenodeFrom.php', + 'App\\Services\\Tg\\Hook\\Mod\\FreenodePool' => $baseDir . '/app/Services/Tg/Hook/Mod/FreenodePool.php', + 'App\\Services\\Tg\\Hook\\Mod\\GemboxDns' => $baseDir . '/app/Services/Tg/Hook/Mod/GemboxDns.php', 'App\\Services\\Tg\\Hook\\Mod\\Good' => $baseDir . '/app/Services/Tg/Hook/Mod/Good.php', 'App\\Services\\Tg\\Hook\\Mod\\Hook' => $baseDir . '/app/Services/Tg/Hook/Mod/Hook.php', + 'App\\Services\\Tg\\Hook\\Mod\\HttpQueue' => $baseDir . '/app/Services/Tg/Hook/Mod/HttpQueue.php', 'App\\Services\\Tg\\Hook\\Mod\\Jctj' => $baseDir . '/app/Services/Tg/Hook/Mod/Jctj.php', 'App\\Services\\Tg\\Hook\\Mod\\JctjOption' => $baseDir . '/app/Services/Tg/Hook/Mod/JctjOption.php', 'App\\Services\\Tg\\Hook\\Mod\\Note' => $baseDir . '/app/Services/Tg/Hook/Mod/Note.php', @@ -2422,6 +2435,400 @@ return array( 'Illuminate\\View\\ViewFinderInterface' => $vendorDir . '/laravel/framework/src/Illuminate/View/ViewFinderInterface.php', 'Illuminate\\View\\ViewName' => $vendorDir . '/laravel/framework/src/Illuminate/View/ViewName.php', 'Illuminate\\View\\ViewServiceProvider' => $vendorDir . '/laravel/framework/src/Illuminate/View/ViewServiceProvider.php', + 'Intervention\\Gif\\AbstractEntity' => $vendorDir . '/intervention/gif/src/AbstractEntity.php', + 'Intervention\\Gif\\AbstractExtension' => $vendorDir . '/intervention/gif/src/AbstractExtension.php', + 'Intervention\\Gif\\Blocks\\ApplicationExtension' => $vendorDir . '/intervention/gif/src/Blocks/ApplicationExtension.php', + 'Intervention\\Gif\\Blocks\\Color' => $vendorDir . '/intervention/gif/src/Blocks/Color.php', + 'Intervention\\Gif\\Blocks\\ColorTable' => $vendorDir . '/intervention/gif/src/Blocks/ColorTable.php', + 'Intervention\\Gif\\Blocks\\CommentExtension' => $vendorDir . '/intervention/gif/src/Blocks/CommentExtension.php', + 'Intervention\\Gif\\Blocks\\DataSubBlock' => $vendorDir . '/intervention/gif/src/Blocks/DataSubBlock.php', + 'Intervention\\Gif\\Blocks\\FrameBlock' => $vendorDir . '/intervention/gif/src/Blocks/FrameBlock.php', + 'Intervention\\Gif\\Blocks\\GraphicControlExtension' => $vendorDir . '/intervention/gif/src/Blocks/GraphicControlExtension.php', + 'Intervention\\Gif\\Blocks\\Header' => $vendorDir . '/intervention/gif/src/Blocks/Header.php', + 'Intervention\\Gif\\Blocks\\ImageData' => $vendorDir . '/intervention/gif/src/Blocks/ImageData.php', + 'Intervention\\Gif\\Blocks\\ImageDescriptor' => $vendorDir . '/intervention/gif/src/Blocks/ImageDescriptor.php', + 'Intervention\\Gif\\Blocks\\LogicalScreenDescriptor' => $vendorDir . '/intervention/gif/src/Blocks/LogicalScreenDescriptor.php', + 'Intervention\\Gif\\Blocks\\NetscapeApplicationExtension' => $vendorDir . '/intervention/gif/src/Blocks/NetscapeApplicationExtension.php', + 'Intervention\\Gif\\Blocks\\PlainTextExtension' => $vendorDir . '/intervention/gif/src/Blocks/PlainTextExtension.php', + 'Intervention\\Gif\\Blocks\\TableBasedImage' => $vendorDir . '/intervention/gif/src/Blocks/TableBasedImage.php', + 'Intervention\\Gif\\Blocks\\Trailer' => $vendorDir . '/intervention/gif/src/Blocks/Trailer.php', + 'Intervention\\Gif\\Builder' => $vendorDir . '/intervention/gif/src/Builder.php', + 'Intervention\\Gif\\Decoder' => $vendorDir . '/intervention/gif/src/Decoder.php', + 'Intervention\\Gif\\Decoders\\AbstractDecoder' => $vendorDir . '/intervention/gif/src/Decoders/AbstractDecoder.php', + 'Intervention\\Gif\\Decoders\\AbstractPackedBitDecoder' => $vendorDir . '/intervention/gif/src/Decoders/AbstractPackedBitDecoder.php', + 'Intervention\\Gif\\Decoders\\ApplicationExtensionDecoder' => $vendorDir . '/intervention/gif/src/Decoders/ApplicationExtensionDecoder.php', + 'Intervention\\Gif\\Decoders\\ColorDecoder' => $vendorDir . '/intervention/gif/src/Decoders/ColorDecoder.php', + 'Intervention\\Gif\\Decoders\\ColorTableDecoder' => $vendorDir . '/intervention/gif/src/Decoders/ColorTableDecoder.php', + 'Intervention\\Gif\\Decoders\\CommentExtensionDecoder' => $vendorDir . '/intervention/gif/src/Decoders/CommentExtensionDecoder.php', + 'Intervention\\Gif\\Decoders\\DataSubBlockDecoder' => $vendorDir . '/intervention/gif/src/Decoders/DataSubBlockDecoder.php', + 'Intervention\\Gif\\Decoders\\FrameBlockDecoder' => $vendorDir . '/intervention/gif/src/Decoders/FrameBlockDecoder.php', + 'Intervention\\Gif\\Decoders\\GifDataStreamDecoder' => $vendorDir . '/intervention/gif/src/Decoders/GifDataStreamDecoder.php', + 'Intervention\\Gif\\Decoders\\GraphicControlExtensionDecoder' => $vendorDir . '/intervention/gif/src/Decoders/GraphicControlExtensionDecoder.php', + 'Intervention\\Gif\\Decoders\\HeaderDecoder' => $vendorDir . '/intervention/gif/src/Decoders/HeaderDecoder.php', + 'Intervention\\Gif\\Decoders\\ImageDataDecoder' => $vendorDir . '/intervention/gif/src/Decoders/ImageDataDecoder.php', + 'Intervention\\Gif\\Decoders\\ImageDescriptorDecoder' => $vendorDir . '/intervention/gif/src/Decoders/ImageDescriptorDecoder.php', + 'Intervention\\Gif\\Decoders\\LogicalScreenDescriptorDecoder' => $vendorDir . '/intervention/gif/src/Decoders/LogicalScreenDescriptorDecoder.php', + 'Intervention\\Gif\\Decoders\\NetscapeApplicationExtensionDecoder' => $vendorDir . '/intervention/gif/src/Decoders/NetscapeApplicationExtensionDecoder.php', + 'Intervention\\Gif\\Decoders\\PlainTextExtensionDecoder' => $vendorDir . '/intervention/gif/src/Decoders/PlainTextExtensionDecoder.php', + 'Intervention\\Gif\\Decoders\\TableBasedImageDecoder' => $vendorDir . '/intervention/gif/src/Decoders/TableBasedImageDecoder.php', + 'Intervention\\Gif\\DisposalMethod' => $vendorDir . '/intervention/gif/src/DisposalMethod.php', + 'Intervention\\Gif\\Encoders\\AbstractEncoder' => $vendorDir . '/intervention/gif/src/Encoders/AbstractEncoder.php', + 'Intervention\\Gif\\Encoders\\ApplicationExtensionEncoder' => $vendorDir . '/intervention/gif/src/Encoders/ApplicationExtensionEncoder.php', + 'Intervention\\Gif\\Encoders\\ColorEncoder' => $vendorDir . '/intervention/gif/src/Encoders/ColorEncoder.php', + 'Intervention\\Gif\\Encoders\\ColorTableEncoder' => $vendorDir . '/intervention/gif/src/Encoders/ColorTableEncoder.php', + 'Intervention\\Gif\\Encoders\\CommentExtensionEncoder' => $vendorDir . '/intervention/gif/src/Encoders/CommentExtensionEncoder.php', + 'Intervention\\Gif\\Encoders\\DataSubBlockEncoder' => $vendorDir . '/intervention/gif/src/Encoders/DataSubBlockEncoder.php', + 'Intervention\\Gif\\Encoders\\FrameBlockEncoder' => $vendorDir . '/intervention/gif/src/Encoders/FrameBlockEncoder.php', + 'Intervention\\Gif\\Encoders\\GifDataStreamEncoder' => $vendorDir . '/intervention/gif/src/Encoders/GifDataStreamEncoder.php', + 'Intervention\\Gif\\Encoders\\GraphicControlExtensionEncoder' => $vendorDir . '/intervention/gif/src/Encoders/GraphicControlExtensionEncoder.php', + 'Intervention\\Gif\\Encoders\\HeaderEncoder' => $vendorDir . '/intervention/gif/src/Encoders/HeaderEncoder.php', + 'Intervention\\Gif\\Encoders\\ImageDataEncoder' => $vendorDir . '/intervention/gif/src/Encoders/ImageDataEncoder.php', + 'Intervention\\Gif\\Encoders\\ImageDescriptorEncoder' => $vendorDir . '/intervention/gif/src/Encoders/ImageDescriptorEncoder.php', + 'Intervention\\Gif\\Encoders\\LogicalScreenDescriptorEncoder' => $vendorDir . '/intervention/gif/src/Encoders/LogicalScreenDescriptorEncoder.php', + 'Intervention\\Gif\\Encoders\\NetscapeApplicationExtensionEncoder' => $vendorDir . '/intervention/gif/src/Encoders/NetscapeApplicationExtensionEncoder.php', + 'Intervention\\Gif\\Encoders\\PlainTextExtensionEncoder' => $vendorDir . '/intervention/gif/src/Encoders/PlainTextExtensionEncoder.php', + 'Intervention\\Gif\\Encoders\\TableBasedImageEncoder' => $vendorDir . '/intervention/gif/src/Encoders/TableBasedImageEncoder.php', + 'Intervention\\Gif\\Encoders\\TrailerEncoder' => $vendorDir . '/intervention/gif/src/Encoders/TrailerEncoder.php', + 'Intervention\\Gif\\Exceptions\\DecoderException' => $vendorDir . '/intervention/gif/src/Exceptions/DecoderException.php', + 'Intervention\\Gif\\Exceptions\\EncoderException' => $vendorDir . '/intervention/gif/src/Exceptions/EncoderException.php', + 'Intervention\\Gif\\Exceptions\\FormatException' => $vendorDir . '/intervention/gif/src/Exceptions/FormatException.php', + 'Intervention\\Gif\\Exceptions\\NotReadableException' => $vendorDir . '/intervention/gif/src/Exceptions/NotReadableException.php', + 'Intervention\\Gif\\GifDataStream' => $vendorDir . '/intervention/gif/src/GifDataStream.php', + 'Intervention\\Gif\\Splitter' => $vendorDir . '/intervention/gif/src/Splitter.php', + 'Intervention\\Gif\\Traits\\CanDecode' => $vendorDir . '/intervention/gif/src/Traits/CanDecode.php', + 'Intervention\\Gif\\Traits\\CanEncode' => $vendorDir . '/intervention/gif/src/Traits/CanEncode.php', + 'Intervention\\Gif\\Traits\\CanHandleFiles' => $vendorDir . '/intervention/gif/src/Traits/CanHandleFiles.php', + 'Intervention\\Image\\Analyzers\\ColorspaceAnalyzer' => $vendorDir . '/intervention/image/src/Analyzers/ColorspaceAnalyzer.php', + 'Intervention\\Image\\Analyzers\\HeightAnalyzer' => $vendorDir . '/intervention/image/src/Analyzers/HeightAnalyzer.php', + 'Intervention\\Image\\Analyzers\\PixelColorAnalyzer' => $vendorDir . '/intervention/image/src/Analyzers/PixelColorAnalyzer.php', + 'Intervention\\Image\\Analyzers\\PixelColorsAnalyzer' => $vendorDir . '/intervention/image/src/Analyzers/PixelColorsAnalyzer.php', + 'Intervention\\Image\\Analyzers\\ProfileAnalyzer' => $vendorDir . '/intervention/image/src/Analyzers/ProfileAnalyzer.php', + 'Intervention\\Image\\Analyzers\\ResolutionAnalyzer' => $vendorDir . '/intervention/image/src/Analyzers/ResolutionAnalyzer.php', + 'Intervention\\Image\\Analyzers\\WidthAnalyzer' => $vendorDir . '/intervention/image/src/Analyzers/WidthAnalyzer.php', + 'Intervention\\Image\\Collection' => $vendorDir . '/intervention/image/src/Collection.php', + 'Intervention\\Image\\Colors\\AbstractColor' => $vendorDir . '/intervention/image/src/Colors/AbstractColor.php', + 'Intervention\\Image\\Colors\\AbstractColorChannel' => $vendorDir . '/intervention/image/src/Colors/AbstractColorChannel.php', + 'Intervention\\Image\\Colors\\Cmyk\\Channels\\Cyan' => $vendorDir . '/intervention/image/src/Colors/Cmyk/Channels/Cyan.php', + 'Intervention\\Image\\Colors\\Cmyk\\Channels\\Key' => $vendorDir . '/intervention/image/src/Colors/Cmyk/Channels/Key.php', + 'Intervention\\Image\\Colors\\Cmyk\\Channels\\Magenta' => $vendorDir . '/intervention/image/src/Colors/Cmyk/Channels/Magenta.php', + 'Intervention\\Image\\Colors\\Cmyk\\Channels\\Yellow' => $vendorDir . '/intervention/image/src/Colors/Cmyk/Channels/Yellow.php', + 'Intervention\\Image\\Colors\\Cmyk\\Color' => $vendorDir . '/intervention/image/src/Colors/Cmyk/Color.php', + 'Intervention\\Image\\Colors\\Cmyk\\Colorspace' => $vendorDir . '/intervention/image/src/Colors/Cmyk/Colorspace.php', + 'Intervention\\Image\\Colors\\Cmyk\\Decoders\\StringColorDecoder' => $vendorDir . '/intervention/image/src/Colors/Cmyk/Decoders/StringColorDecoder.php', + 'Intervention\\Image\\Colors\\Hsl\\Channels\\Hue' => $vendorDir . '/intervention/image/src/Colors/Hsl/Channels/Hue.php', + 'Intervention\\Image\\Colors\\Hsl\\Channels\\Luminance' => $vendorDir . '/intervention/image/src/Colors/Hsl/Channels/Luminance.php', + 'Intervention\\Image\\Colors\\Hsl\\Channels\\Saturation' => $vendorDir . '/intervention/image/src/Colors/Hsl/Channels/Saturation.php', + 'Intervention\\Image\\Colors\\Hsl\\Color' => $vendorDir . '/intervention/image/src/Colors/Hsl/Color.php', + 'Intervention\\Image\\Colors\\Hsl\\Colorspace' => $vendorDir . '/intervention/image/src/Colors/Hsl/Colorspace.php', + 'Intervention\\Image\\Colors\\Hsl\\Decoders\\StringColorDecoder' => $vendorDir . '/intervention/image/src/Colors/Hsl/Decoders/StringColorDecoder.php', + 'Intervention\\Image\\Colors\\Hsv\\Channels\\Hue' => $vendorDir . '/intervention/image/src/Colors/Hsv/Channels/Hue.php', + 'Intervention\\Image\\Colors\\Hsv\\Channels\\Saturation' => $vendorDir . '/intervention/image/src/Colors/Hsv/Channels/Saturation.php', + 'Intervention\\Image\\Colors\\Hsv\\Channels\\Value' => $vendorDir . '/intervention/image/src/Colors/Hsv/Channels/Value.php', + 'Intervention\\Image\\Colors\\Hsv\\Color' => $vendorDir . '/intervention/image/src/Colors/Hsv/Color.php', + 'Intervention\\Image\\Colors\\Hsv\\Colorspace' => $vendorDir . '/intervention/image/src/Colors/Hsv/Colorspace.php', + 'Intervention\\Image\\Colors\\Hsv\\Decoders\\StringColorDecoder' => $vendorDir . '/intervention/image/src/Colors/Hsv/Decoders/StringColorDecoder.php', + 'Intervention\\Image\\Colors\\Profile' => $vendorDir . '/intervention/image/src/Colors/Profile.php', + 'Intervention\\Image\\Colors\\Rgb\\Channels\\Alpha' => $vendorDir . '/intervention/image/src/Colors/Rgb/Channels/Alpha.php', + 'Intervention\\Image\\Colors\\Rgb\\Channels\\Blue' => $vendorDir . '/intervention/image/src/Colors/Rgb/Channels/Blue.php', + 'Intervention\\Image\\Colors\\Rgb\\Channels\\Green' => $vendorDir . '/intervention/image/src/Colors/Rgb/Channels/Green.php', + 'Intervention\\Image\\Colors\\Rgb\\Channels\\Red' => $vendorDir . '/intervention/image/src/Colors/Rgb/Channels/Red.php', + 'Intervention\\Image\\Colors\\Rgb\\Color' => $vendorDir . '/intervention/image/src/Colors/Rgb/Color.php', + 'Intervention\\Image\\Colors\\Rgb\\Colorspace' => $vendorDir . '/intervention/image/src/Colors/Rgb/Colorspace.php', + 'Intervention\\Image\\Colors\\Rgb\\Decoders\\HexColorDecoder' => $vendorDir . '/intervention/image/src/Colors/Rgb/Decoders/HexColorDecoder.php', + 'Intervention\\Image\\Colors\\Rgb\\Decoders\\HtmlColornameDecoder' => $vendorDir . '/intervention/image/src/Colors/Rgb/Decoders/HtmlColornameDecoder.php', + 'Intervention\\Image\\Colors\\Rgb\\Decoders\\StringColorDecoder' => $vendorDir . '/intervention/image/src/Colors/Rgb/Decoders/StringColorDecoder.php', + 'Intervention\\Image\\Colors\\Rgb\\Decoders\\TransparentColorDecoder' => $vendorDir . '/intervention/image/src/Colors/Rgb/Decoders/TransparentColorDecoder.php', + 'Intervention\\Image\\Config' => $vendorDir . '/intervention/image/src/Config.php', + 'Intervention\\Image\\Decoders\\Base64ImageDecoder' => $vendorDir . '/intervention/image/src/Decoders/Base64ImageDecoder.php', + 'Intervention\\Image\\Decoders\\BinaryImageDecoder' => $vendorDir . '/intervention/image/src/Decoders/BinaryImageDecoder.php', + 'Intervention\\Image\\Decoders\\ColorObjectDecoder' => $vendorDir . '/intervention/image/src/Decoders/ColorObjectDecoder.php', + 'Intervention\\Image\\Decoders\\DataUriImageDecoder' => $vendorDir . '/intervention/image/src/Decoders/DataUriImageDecoder.php', + 'Intervention\\Image\\Decoders\\EncodedImageObjectDecoder' => $vendorDir . '/intervention/image/src/Decoders/EncodedImageObjectDecoder.php', + 'Intervention\\Image\\Decoders\\FilePathImageDecoder' => $vendorDir . '/intervention/image/src/Decoders/FilePathImageDecoder.php', + 'Intervention\\Image\\Decoders\\FilePointerImageDecoder' => $vendorDir . '/intervention/image/src/Decoders/FilePointerImageDecoder.php', + 'Intervention\\Image\\Decoders\\ImageObjectDecoder' => $vendorDir . '/intervention/image/src/Decoders/ImageObjectDecoder.php', + 'Intervention\\Image\\Decoders\\NativeObjectDecoder' => $vendorDir . '/intervention/image/src/Decoders/NativeObjectDecoder.php', + 'Intervention\\Image\\Decoders\\SplFileInfoImageDecoder' => $vendorDir . '/intervention/image/src/Decoders/SplFileInfoImageDecoder.php', + 'Intervention\\Image\\Drivers\\AbstractDecoder' => $vendorDir . '/intervention/image/src/Drivers/AbstractDecoder.php', + 'Intervention\\Image\\Drivers\\AbstractDriver' => $vendorDir . '/intervention/image/src/Drivers/AbstractDriver.php', + 'Intervention\\Image\\Drivers\\AbstractEncoder' => $vendorDir . '/intervention/image/src/Drivers/AbstractEncoder.php', + 'Intervention\\Image\\Drivers\\AbstractFontProcessor' => $vendorDir . '/intervention/image/src/Drivers/AbstractFontProcessor.php', + 'Intervention\\Image\\Drivers\\AbstractFrame' => $vendorDir . '/intervention/image/src/Drivers/AbstractFrame.php', + 'Intervention\\Image\\Drivers\\Gd\\Analyzers\\ColorspaceAnalyzer' => $vendorDir . '/intervention/image/src/Drivers/Gd/Analyzers/ColorspaceAnalyzer.php', + 'Intervention\\Image\\Drivers\\Gd\\Analyzers\\HeightAnalyzer' => $vendorDir . '/intervention/image/src/Drivers/Gd/Analyzers/HeightAnalyzer.php', + 'Intervention\\Image\\Drivers\\Gd\\Analyzers\\PixelColorAnalyzer' => $vendorDir . '/intervention/image/src/Drivers/Gd/Analyzers/PixelColorAnalyzer.php', + 'Intervention\\Image\\Drivers\\Gd\\Analyzers\\PixelColorsAnalyzer' => $vendorDir . '/intervention/image/src/Drivers/Gd/Analyzers/PixelColorsAnalyzer.php', + 'Intervention\\Image\\Drivers\\Gd\\Analyzers\\ResolutionAnalyzer' => $vendorDir . '/intervention/image/src/Drivers/Gd/Analyzers/ResolutionAnalyzer.php', + 'Intervention\\Image\\Drivers\\Gd\\Analyzers\\WidthAnalyzer' => $vendorDir . '/intervention/image/src/Drivers/Gd/Analyzers/WidthAnalyzer.php', + 'Intervention\\Image\\Drivers\\Gd\\Cloner' => $vendorDir . '/intervention/image/src/Drivers/Gd/Cloner.php', + 'Intervention\\Image\\Drivers\\Gd\\ColorProcessor' => $vendorDir . '/intervention/image/src/Drivers/Gd/ColorProcessor.php', + 'Intervention\\Image\\Drivers\\Gd\\Core' => $vendorDir . '/intervention/image/src/Drivers/Gd/Core.php', + 'Intervention\\Image\\Drivers\\Gd\\Decoders\\AbstractDecoder' => $vendorDir . '/intervention/image/src/Drivers/Gd/Decoders/AbstractDecoder.php', + 'Intervention\\Image\\Drivers\\Gd\\Decoders\\Base64ImageDecoder' => $vendorDir . '/intervention/image/src/Drivers/Gd/Decoders/Base64ImageDecoder.php', + 'Intervention\\Image\\Drivers\\Gd\\Decoders\\BinaryImageDecoder' => $vendorDir . '/intervention/image/src/Drivers/Gd/Decoders/BinaryImageDecoder.php', + 'Intervention\\Image\\Drivers\\Gd\\Decoders\\DataUriImageDecoder' => $vendorDir . '/intervention/image/src/Drivers/Gd/Decoders/DataUriImageDecoder.php', + 'Intervention\\Image\\Drivers\\Gd\\Decoders\\EncodedImageObjectDecoder' => $vendorDir . '/intervention/image/src/Drivers/Gd/Decoders/EncodedImageObjectDecoder.php', + 'Intervention\\Image\\Drivers\\Gd\\Decoders\\FilePathImageDecoder' => $vendorDir . '/intervention/image/src/Drivers/Gd/Decoders/FilePathImageDecoder.php', + 'Intervention\\Image\\Drivers\\Gd\\Decoders\\FilePointerImageDecoder' => $vendorDir . '/intervention/image/src/Drivers/Gd/Decoders/FilePointerImageDecoder.php', + 'Intervention\\Image\\Drivers\\Gd\\Decoders\\NativeObjectDecoder' => $vendorDir . '/intervention/image/src/Drivers/Gd/Decoders/NativeObjectDecoder.php', + 'Intervention\\Image\\Drivers\\Gd\\Decoders\\SplFileInfoImageDecoder' => $vendorDir . '/intervention/image/src/Drivers/Gd/Decoders/SplFileInfoImageDecoder.php', + 'Intervention\\Image\\Drivers\\Gd\\Driver' => $vendorDir . '/intervention/image/src/Drivers/Gd/Driver.php', + 'Intervention\\Image\\Drivers\\Gd\\Encoders\\AvifEncoder' => $vendorDir . '/intervention/image/src/Drivers/Gd/Encoders/AvifEncoder.php', + 'Intervention\\Image\\Drivers\\Gd\\Encoders\\BmpEncoder' => $vendorDir . '/intervention/image/src/Drivers/Gd/Encoders/BmpEncoder.php', + 'Intervention\\Image\\Drivers\\Gd\\Encoders\\GifEncoder' => $vendorDir . '/intervention/image/src/Drivers/Gd/Encoders/GifEncoder.php', + 'Intervention\\Image\\Drivers\\Gd\\Encoders\\JpegEncoder' => $vendorDir . '/intervention/image/src/Drivers/Gd/Encoders/JpegEncoder.php', + 'Intervention\\Image\\Drivers\\Gd\\Encoders\\PngEncoder' => $vendorDir . '/intervention/image/src/Drivers/Gd/Encoders/PngEncoder.php', + 'Intervention\\Image\\Drivers\\Gd\\Encoders\\WebpEncoder' => $vendorDir . '/intervention/image/src/Drivers/Gd/Encoders/WebpEncoder.php', + 'Intervention\\Image\\Drivers\\Gd\\FontProcessor' => $vendorDir . '/intervention/image/src/Drivers/Gd/FontProcessor.php', + 'Intervention\\Image\\Drivers\\Gd\\Frame' => $vendorDir . '/intervention/image/src/Drivers/Gd/Frame.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\AlignRotationModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/AlignRotationModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\BlendTransparencyModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/BlendTransparencyModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\BlurModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/BlurModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\BrightnessModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/BrightnessModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\ColorizeModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/ColorizeModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\ColorspaceModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/ColorspaceModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\ContainModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/ContainModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\ContrastModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/ContrastModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\CoverDownModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/CoverDownModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\CoverModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/CoverModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\CropModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/CropModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\DrawBezierModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/DrawBezierModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\DrawEllipseModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/DrawEllipseModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\DrawLineModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/DrawLineModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\DrawPixelModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/DrawPixelModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\DrawPolygonModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/DrawPolygonModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\DrawRectangleModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/DrawRectangleModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\FillModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/FillModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\FlipModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/FlipModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\FlopModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/FlopModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\GammaModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/GammaModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\GreyscaleModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/GreyscaleModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\InvertModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/InvertModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\PadModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/PadModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\PixelateModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/PixelateModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\PlaceModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/PlaceModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\ProfileModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/ProfileModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\ProfileRemovalModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/ProfileRemovalModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\QuantizeColorsModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/QuantizeColorsModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\RemoveAnimationModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/RemoveAnimationModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\ResizeCanvasModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/ResizeCanvasModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\ResizeCanvasRelativeModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/ResizeCanvasRelativeModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\ResizeDownModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/ResizeDownModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\ResizeModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/ResizeModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\ResolutionModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/ResolutionModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\RotateModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/RotateModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\ScaleDownModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/ScaleDownModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\ScaleModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/ScaleModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\SharpenModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/SharpenModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\SliceAnimationModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/SliceAnimationModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\TextModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/TextModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\TrimModifier' => $vendorDir . '/intervention/image/src/Drivers/Gd/Modifiers/TrimModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Analyzers\\ColorspaceAnalyzer' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Analyzers/ColorspaceAnalyzer.php', + 'Intervention\\Image\\Drivers\\Imagick\\Analyzers\\HeightAnalyzer' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Analyzers/HeightAnalyzer.php', + 'Intervention\\Image\\Drivers\\Imagick\\Analyzers\\PixelColorAnalyzer' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Analyzers/PixelColorAnalyzer.php', + 'Intervention\\Image\\Drivers\\Imagick\\Analyzers\\PixelColorsAnalyzer' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Analyzers/PixelColorsAnalyzer.php', + 'Intervention\\Image\\Drivers\\Imagick\\Analyzers\\ProfileAnalyzer' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Analyzers/ProfileAnalyzer.php', + 'Intervention\\Image\\Drivers\\Imagick\\Analyzers\\ResolutionAnalyzer' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Analyzers/ResolutionAnalyzer.php', + 'Intervention\\Image\\Drivers\\Imagick\\Analyzers\\WidthAnalyzer' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Analyzers/WidthAnalyzer.php', + 'Intervention\\Image\\Drivers\\Imagick\\ColorProcessor' => $vendorDir . '/intervention/image/src/Drivers/Imagick/ColorProcessor.php', + 'Intervention\\Image\\Drivers\\Imagick\\Core' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Core.php', + 'Intervention\\Image\\Drivers\\Imagick\\Decoders\\Base64ImageDecoder' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Decoders/Base64ImageDecoder.php', + 'Intervention\\Image\\Drivers\\Imagick\\Decoders\\BinaryImageDecoder' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Decoders/BinaryImageDecoder.php', + 'Intervention\\Image\\Drivers\\Imagick\\Decoders\\DataUriImageDecoder' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Decoders/DataUriImageDecoder.php', + 'Intervention\\Image\\Drivers\\Imagick\\Decoders\\EncodedImageObjectDecoder' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Decoders/EncodedImageObjectDecoder.php', + 'Intervention\\Image\\Drivers\\Imagick\\Decoders\\FilePathImageDecoder' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Decoders/FilePathImageDecoder.php', + 'Intervention\\Image\\Drivers\\Imagick\\Decoders\\FilePointerImageDecoder' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Decoders/FilePointerImageDecoder.php', + 'Intervention\\Image\\Drivers\\Imagick\\Decoders\\NativeObjectDecoder' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Decoders/NativeObjectDecoder.php', + 'Intervention\\Image\\Drivers\\Imagick\\Decoders\\SplFileInfoImageDecoder' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Decoders/SplFileInfoImageDecoder.php', + 'Intervention\\Image\\Drivers\\Imagick\\Driver' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Driver.php', + 'Intervention\\Image\\Drivers\\Imagick\\Encoders\\AvifEncoder' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Encoders/AvifEncoder.php', + 'Intervention\\Image\\Drivers\\Imagick\\Encoders\\BmpEncoder' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Encoders/BmpEncoder.php', + 'Intervention\\Image\\Drivers\\Imagick\\Encoders\\GifEncoder' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Encoders/GifEncoder.php', + 'Intervention\\Image\\Drivers\\Imagick\\Encoders\\HeicEncoder' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Encoders/HeicEncoder.php', + 'Intervention\\Image\\Drivers\\Imagick\\Encoders\\Jpeg2000Encoder' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Encoders/Jpeg2000Encoder.php', + 'Intervention\\Image\\Drivers\\Imagick\\Encoders\\JpegEncoder' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Encoders/JpegEncoder.php', + 'Intervention\\Image\\Drivers\\Imagick\\Encoders\\PngEncoder' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Encoders/PngEncoder.php', + 'Intervention\\Image\\Drivers\\Imagick\\Encoders\\TiffEncoder' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Encoders/TiffEncoder.php', + 'Intervention\\Image\\Drivers\\Imagick\\Encoders\\WebpEncoder' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Encoders/WebpEncoder.php', + 'Intervention\\Image\\Drivers\\Imagick\\FontProcessor' => $vendorDir . '/intervention/image/src/Drivers/Imagick/FontProcessor.php', + 'Intervention\\Image\\Drivers\\Imagick\\Frame' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Frame.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\AlignRotationModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/AlignRotationModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\BlendTransparencyModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/BlendTransparencyModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\BlurModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/BlurModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\BrightnessModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/BrightnessModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\ColorizeModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/ColorizeModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\ColorspaceModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/ColorspaceModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\ContainModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/ContainModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\ContrastModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/ContrastModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\CoverDownModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/CoverDownModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\CoverModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/CoverModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\CropModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/CropModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\DrawBezierModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/DrawBezierModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\DrawEllipseModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/DrawEllipseModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\DrawLineModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/DrawLineModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\DrawPixelModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/DrawPixelModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\DrawPolygonModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/DrawPolygonModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\DrawRectangleModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/DrawRectangleModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\FillModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/FillModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\FlipModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/FlipModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\FlopModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/FlopModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\GammaModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/GammaModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\GreyscaleModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/GreyscaleModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\InvertModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/InvertModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\PadModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/PadModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\PixelateModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/PixelateModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\PlaceModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/PlaceModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\ProfileModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/ProfileModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\ProfileRemovalModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/ProfileRemovalModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\QuantizeColorsModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/QuantizeColorsModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\RemoveAnimationModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/RemoveAnimationModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\ResizeCanvasModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/ResizeCanvasModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\ResizeCanvasRelativeModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/ResizeCanvasRelativeModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\ResizeDownModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/ResizeDownModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\ResizeModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/ResizeModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\ResolutionModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/ResolutionModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\RotateModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/RotateModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\ScaleDownModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/ScaleDownModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\ScaleModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/ScaleModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\SharpenModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/SharpenModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\SliceAnimationModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/SliceAnimationModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\StripMetaModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/StripMetaModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\TextModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/TextModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\TrimModifier' => $vendorDir . '/intervention/image/src/Drivers/Imagick/Modifiers/TrimModifier.php', + 'Intervention\\Image\\Drivers\\Specializable' => $vendorDir . '/intervention/image/src/Drivers/Specializable.php', + 'Intervention\\Image\\Drivers\\SpecializableAnalyzer' => $vendorDir . '/intervention/image/src/Drivers/SpecializableAnalyzer.php', + 'Intervention\\Image\\Drivers\\SpecializableDecoder' => $vendorDir . '/intervention/image/src/Drivers/SpecializableDecoder.php', + 'Intervention\\Image\\Drivers\\SpecializableEncoder' => $vendorDir . '/intervention/image/src/Drivers/SpecializableEncoder.php', + 'Intervention\\Image\\Drivers\\SpecializableModifier' => $vendorDir . '/intervention/image/src/Drivers/SpecializableModifier.php', + 'Intervention\\Image\\EncodedImage' => $vendorDir . '/intervention/image/src/EncodedImage.php', + 'Intervention\\Image\\Encoders\\AutoEncoder' => $vendorDir . '/intervention/image/src/Encoders/AutoEncoder.php', + 'Intervention\\Image\\Encoders\\AvifEncoder' => $vendorDir . '/intervention/image/src/Encoders/AvifEncoder.php', + 'Intervention\\Image\\Encoders\\BmpEncoder' => $vendorDir . '/intervention/image/src/Encoders/BmpEncoder.php', + 'Intervention\\Image\\Encoders\\FileExtensionEncoder' => $vendorDir . '/intervention/image/src/Encoders/FileExtensionEncoder.php', + 'Intervention\\Image\\Encoders\\FilePathEncoder' => $vendorDir . '/intervention/image/src/Encoders/FilePathEncoder.php', + 'Intervention\\Image\\Encoders\\GifEncoder' => $vendorDir . '/intervention/image/src/Encoders/GifEncoder.php', + 'Intervention\\Image\\Encoders\\HeicEncoder' => $vendorDir . '/intervention/image/src/Encoders/HeicEncoder.php', + 'Intervention\\Image\\Encoders\\Jpeg2000Encoder' => $vendorDir . '/intervention/image/src/Encoders/Jpeg2000Encoder.php', + 'Intervention\\Image\\Encoders\\JpegEncoder' => $vendorDir . '/intervention/image/src/Encoders/JpegEncoder.php', + 'Intervention\\Image\\Encoders\\MediaTypeEncoder' => $vendorDir . '/intervention/image/src/Encoders/MediaTypeEncoder.php', + 'Intervention\\Image\\Encoders\\PngEncoder' => $vendorDir . '/intervention/image/src/Encoders/PngEncoder.php', + 'Intervention\\Image\\Encoders\\TiffEncoder' => $vendorDir . '/intervention/image/src/Encoders/TiffEncoder.php', + 'Intervention\\Image\\Encoders\\WebpEncoder' => $vendorDir . '/intervention/image/src/Encoders/WebpEncoder.php', + 'Intervention\\Image\\Exceptions\\AnimationException' => $vendorDir . '/intervention/image/src/Exceptions/AnimationException.php', + 'Intervention\\Image\\Exceptions\\ColorException' => $vendorDir . '/intervention/image/src/Exceptions/ColorException.php', + 'Intervention\\Image\\Exceptions\\DecoderException' => $vendorDir . '/intervention/image/src/Exceptions/DecoderException.php', + 'Intervention\\Image\\Exceptions\\DriverException' => $vendorDir . '/intervention/image/src/Exceptions/DriverException.php', + 'Intervention\\Image\\Exceptions\\EncoderException' => $vendorDir . '/intervention/image/src/Exceptions/EncoderException.php', + 'Intervention\\Image\\Exceptions\\FontException' => $vendorDir . '/intervention/image/src/Exceptions/FontException.php', + 'Intervention\\Image\\Exceptions\\GeometryException' => $vendorDir . '/intervention/image/src/Exceptions/GeometryException.php', + 'Intervention\\Image\\Exceptions\\InputException' => $vendorDir . '/intervention/image/src/Exceptions/InputException.php', + 'Intervention\\Image\\Exceptions\\NotSupportedException' => $vendorDir . '/intervention/image/src/Exceptions/NotSupportedException.php', + 'Intervention\\Image\\Exceptions\\NotWritableException' => $vendorDir . '/intervention/image/src/Exceptions/NotWritableException.php', + 'Intervention\\Image\\Exceptions\\RuntimeException' => $vendorDir . '/intervention/image/src/Exceptions/RuntimeException.php', + 'Intervention\\Image\\File' => $vendorDir . '/intervention/image/src/File.php', + 'Intervention\\Image\\FileExtension' => $vendorDir . '/intervention/image/src/FileExtension.php', + 'Intervention\\Image\\Format' => $vendorDir . '/intervention/image/src/Format.php', + 'Intervention\\Image\\Geometry\\Bezier' => $vendorDir . '/intervention/image/src/Geometry/Bezier.php', + 'Intervention\\Image\\Geometry\\Circle' => $vendorDir . '/intervention/image/src/Geometry/Circle.php', + 'Intervention\\Image\\Geometry\\Ellipse' => $vendorDir . '/intervention/image/src/Geometry/Ellipse.php', + 'Intervention\\Image\\Geometry\\Factories\\BezierFactory' => $vendorDir . '/intervention/image/src/Geometry/Factories/BezierFactory.php', + 'Intervention\\Image\\Geometry\\Factories\\CircleFactory' => $vendorDir . '/intervention/image/src/Geometry/Factories/CircleFactory.php', + 'Intervention\\Image\\Geometry\\Factories\\Drawable' => $vendorDir . '/intervention/image/src/Geometry/Factories/Drawable.php', + 'Intervention\\Image\\Geometry\\Factories\\EllipseFactory' => $vendorDir . '/intervention/image/src/Geometry/Factories/EllipseFactory.php', + 'Intervention\\Image\\Geometry\\Factories\\LineFactory' => $vendorDir . '/intervention/image/src/Geometry/Factories/LineFactory.php', + 'Intervention\\Image\\Geometry\\Factories\\PolygonFactory' => $vendorDir . '/intervention/image/src/Geometry/Factories/PolygonFactory.php', + 'Intervention\\Image\\Geometry\\Factories\\RectangleFactory' => $vendorDir . '/intervention/image/src/Geometry/Factories/RectangleFactory.php', + 'Intervention\\Image\\Geometry\\Line' => $vendorDir . '/intervention/image/src/Geometry/Line.php', + 'Intervention\\Image\\Geometry\\Pixel' => $vendorDir . '/intervention/image/src/Geometry/Pixel.php', + 'Intervention\\Image\\Geometry\\Point' => $vendorDir . '/intervention/image/src/Geometry/Point.php', + 'Intervention\\Image\\Geometry\\Polygon' => $vendorDir . '/intervention/image/src/Geometry/Polygon.php', + 'Intervention\\Image\\Geometry\\Rectangle' => $vendorDir . '/intervention/image/src/Geometry/Rectangle.php', + 'Intervention\\Image\\Geometry\\Tools\\RectangleResizer' => $vendorDir . '/intervention/image/src/Geometry/Tools/RectangleResizer.php', + 'Intervention\\Image\\Geometry\\Traits\\HasBackgroundColor' => $vendorDir . '/intervention/image/src/Geometry/Traits/HasBackgroundColor.php', + 'Intervention\\Image\\Geometry\\Traits\\HasBorder' => $vendorDir . '/intervention/image/src/Geometry/Traits/HasBorder.php', + 'Intervention\\Image\\Image' => $vendorDir . '/intervention/image/src/Image.php', + 'Intervention\\Image\\ImageManager' => $vendorDir . '/intervention/image/src/ImageManager.php', + 'Intervention\\Image\\InputHandler' => $vendorDir . '/intervention/image/src/InputHandler.php', + 'Intervention\\Image\\Interfaces\\AnalyzerInterface' => $vendorDir . '/intervention/image/src/Interfaces/AnalyzerInterface.php', + 'Intervention\\Image\\Interfaces\\CollectionInterface' => $vendorDir . '/intervention/image/src/Interfaces/CollectionInterface.php', + 'Intervention\\Image\\Interfaces\\ColorChannelInterface' => $vendorDir . '/intervention/image/src/Interfaces/ColorChannelInterface.php', + 'Intervention\\Image\\Interfaces\\ColorInterface' => $vendorDir . '/intervention/image/src/Interfaces/ColorInterface.php', + 'Intervention\\Image\\Interfaces\\ColorProcessorInterface' => $vendorDir . '/intervention/image/src/Interfaces/ColorProcessorInterface.php', + 'Intervention\\Image\\Interfaces\\ColorspaceInterface' => $vendorDir . '/intervention/image/src/Interfaces/ColorspaceInterface.php', + 'Intervention\\Image\\Interfaces\\CoreInterface' => $vendorDir . '/intervention/image/src/Interfaces/CoreInterface.php', + 'Intervention\\Image\\Interfaces\\DecoderInterface' => $vendorDir . '/intervention/image/src/Interfaces/DecoderInterface.php', + 'Intervention\\Image\\Interfaces\\DrawableFactoryInterface' => $vendorDir . '/intervention/image/src/Interfaces/DrawableFactoryInterface.php', + 'Intervention\\Image\\Interfaces\\DrawableInterface' => $vendorDir . '/intervention/image/src/Interfaces/DrawableInterface.php', + 'Intervention\\Image\\Interfaces\\DriverInterface' => $vendorDir . '/intervention/image/src/Interfaces/DriverInterface.php', + 'Intervention\\Image\\Interfaces\\EncodedImageInterface' => $vendorDir . '/intervention/image/src/Interfaces/EncodedImageInterface.php', + 'Intervention\\Image\\Interfaces\\EncoderInterface' => $vendorDir . '/intervention/image/src/Interfaces/EncoderInterface.php', + 'Intervention\\Image\\Interfaces\\FileInterface' => $vendorDir . '/intervention/image/src/Interfaces/FileInterface.php', + 'Intervention\\Image\\Interfaces\\FontInterface' => $vendorDir . '/intervention/image/src/Interfaces/FontInterface.php', + 'Intervention\\Image\\Interfaces\\FontProcessorInterface' => $vendorDir . '/intervention/image/src/Interfaces/FontProcessorInterface.php', + 'Intervention\\Image\\Interfaces\\FrameInterface' => $vendorDir . '/intervention/image/src/Interfaces/FrameInterface.php', + 'Intervention\\Image\\Interfaces\\ImageInterface' => $vendorDir . '/intervention/image/src/Interfaces/ImageInterface.php', + 'Intervention\\Image\\Interfaces\\ImageManagerInterface' => $vendorDir . '/intervention/image/src/Interfaces/ImageManagerInterface.php', + 'Intervention\\Image\\Interfaces\\InputHandlerInterface' => $vendorDir . '/intervention/image/src/Interfaces/InputHandlerInterface.php', + 'Intervention\\Image\\Interfaces\\ModifierInterface' => $vendorDir . '/intervention/image/src/Interfaces/ModifierInterface.php', + 'Intervention\\Image\\Interfaces\\PointInterface' => $vendorDir . '/intervention/image/src/Interfaces/PointInterface.php', + 'Intervention\\Image\\Interfaces\\ProfileInterface' => $vendorDir . '/intervention/image/src/Interfaces/ProfileInterface.php', + 'Intervention\\Image\\Interfaces\\ResolutionInterface' => $vendorDir . '/intervention/image/src/Interfaces/ResolutionInterface.php', + 'Intervention\\Image\\Interfaces\\SizeInterface' => $vendorDir . '/intervention/image/src/Interfaces/SizeInterface.php', + 'Intervention\\Image\\Interfaces\\SpecializableInterface' => $vendorDir . '/intervention/image/src/Interfaces/SpecializableInterface.php', + 'Intervention\\Image\\Interfaces\\SpecializedInterface' => $vendorDir . '/intervention/image/src/Interfaces/SpecializedInterface.php', + 'Intervention\\Image\\MediaType' => $vendorDir . '/intervention/image/src/MediaType.php', + 'Intervention\\Image\\ModifierStack' => $vendorDir . '/intervention/image/src/ModifierStack.php', + 'Intervention\\Image\\Modifiers\\AbstractDrawModifier' => $vendorDir . '/intervention/image/src/Modifiers/AbstractDrawModifier.php', + 'Intervention\\Image\\Modifiers\\AlignRotationModifier' => $vendorDir . '/intervention/image/src/Modifiers/AlignRotationModifier.php', + 'Intervention\\Image\\Modifiers\\BlendTransparencyModifier' => $vendorDir . '/intervention/image/src/Modifiers/BlendTransparencyModifier.php', + 'Intervention\\Image\\Modifiers\\BlurModifier' => $vendorDir . '/intervention/image/src/Modifiers/BlurModifier.php', + 'Intervention\\Image\\Modifiers\\BrightnessModifier' => $vendorDir . '/intervention/image/src/Modifiers/BrightnessModifier.php', + 'Intervention\\Image\\Modifiers\\ColorizeModifier' => $vendorDir . '/intervention/image/src/Modifiers/ColorizeModifier.php', + 'Intervention\\Image\\Modifiers\\ColorspaceModifier' => $vendorDir . '/intervention/image/src/Modifiers/ColorspaceModifier.php', + 'Intervention\\Image\\Modifiers\\ContainModifier' => $vendorDir . '/intervention/image/src/Modifiers/ContainModifier.php', + 'Intervention\\Image\\Modifiers\\ContrastModifier' => $vendorDir . '/intervention/image/src/Modifiers/ContrastModifier.php', + 'Intervention\\Image\\Modifiers\\CoverDownModifier' => $vendorDir . '/intervention/image/src/Modifiers/CoverDownModifier.php', + 'Intervention\\Image\\Modifiers\\CoverModifier' => $vendorDir . '/intervention/image/src/Modifiers/CoverModifier.php', + 'Intervention\\Image\\Modifiers\\CropModifier' => $vendorDir . '/intervention/image/src/Modifiers/CropModifier.php', + 'Intervention\\Image\\Modifiers\\DrawBezierModifier' => $vendorDir . '/intervention/image/src/Modifiers/DrawBezierModifier.php', + 'Intervention\\Image\\Modifiers\\DrawEllipseModifier' => $vendorDir . '/intervention/image/src/Modifiers/DrawEllipseModifier.php', + 'Intervention\\Image\\Modifiers\\DrawLineModifier' => $vendorDir . '/intervention/image/src/Modifiers/DrawLineModifier.php', + 'Intervention\\Image\\Modifiers\\DrawPixelModifier' => $vendorDir . '/intervention/image/src/Modifiers/DrawPixelModifier.php', + 'Intervention\\Image\\Modifiers\\DrawPolygonModifier' => $vendorDir . '/intervention/image/src/Modifiers/DrawPolygonModifier.php', + 'Intervention\\Image\\Modifiers\\DrawRectangleModifier' => $vendorDir . '/intervention/image/src/Modifiers/DrawRectangleModifier.php', + 'Intervention\\Image\\Modifiers\\FillModifier' => $vendorDir . '/intervention/image/src/Modifiers/FillModifier.php', + 'Intervention\\Image\\Modifiers\\FlipModifier' => $vendorDir . '/intervention/image/src/Modifiers/FlipModifier.php', + 'Intervention\\Image\\Modifiers\\FlopModifier' => $vendorDir . '/intervention/image/src/Modifiers/FlopModifier.php', + 'Intervention\\Image\\Modifiers\\GammaModifier' => $vendorDir . '/intervention/image/src/Modifiers/GammaModifier.php', + 'Intervention\\Image\\Modifiers\\GreyscaleModifier' => $vendorDir . '/intervention/image/src/Modifiers/GreyscaleModifier.php', + 'Intervention\\Image\\Modifiers\\InvertModifier' => $vendorDir . '/intervention/image/src/Modifiers/InvertModifier.php', + 'Intervention\\Image\\Modifiers\\PadModifier' => $vendorDir . '/intervention/image/src/Modifiers/PadModifier.php', + 'Intervention\\Image\\Modifiers\\PixelateModifier' => $vendorDir . '/intervention/image/src/Modifiers/PixelateModifier.php', + 'Intervention\\Image\\Modifiers\\PlaceModifier' => $vendorDir . '/intervention/image/src/Modifiers/PlaceModifier.php', + 'Intervention\\Image\\Modifiers\\ProfileModifier' => $vendorDir . '/intervention/image/src/Modifiers/ProfileModifier.php', + 'Intervention\\Image\\Modifiers\\ProfileRemovalModifier' => $vendorDir . '/intervention/image/src/Modifiers/ProfileRemovalModifier.php', + 'Intervention\\Image\\Modifiers\\QuantizeColorsModifier' => $vendorDir . '/intervention/image/src/Modifiers/QuantizeColorsModifier.php', + 'Intervention\\Image\\Modifiers\\RemoveAnimationModifier' => $vendorDir . '/intervention/image/src/Modifiers/RemoveAnimationModifier.php', + 'Intervention\\Image\\Modifiers\\ResizeCanvasModifier' => $vendorDir . '/intervention/image/src/Modifiers/ResizeCanvasModifier.php', + 'Intervention\\Image\\Modifiers\\ResizeCanvasRelativeModifier' => $vendorDir . '/intervention/image/src/Modifiers/ResizeCanvasRelativeModifier.php', + 'Intervention\\Image\\Modifiers\\ResizeDownModifier' => $vendorDir . '/intervention/image/src/Modifiers/ResizeDownModifier.php', + 'Intervention\\Image\\Modifiers\\ResizeModifier' => $vendorDir . '/intervention/image/src/Modifiers/ResizeModifier.php', + 'Intervention\\Image\\Modifiers\\ResolutionModifier' => $vendorDir . '/intervention/image/src/Modifiers/ResolutionModifier.php', + 'Intervention\\Image\\Modifiers\\RotateModifier' => $vendorDir . '/intervention/image/src/Modifiers/RotateModifier.php', + 'Intervention\\Image\\Modifiers\\ScaleDownModifier' => $vendorDir . '/intervention/image/src/Modifiers/ScaleDownModifier.php', + 'Intervention\\Image\\Modifiers\\ScaleModifier' => $vendorDir . '/intervention/image/src/Modifiers/ScaleModifier.php', + 'Intervention\\Image\\Modifiers\\SharpenModifier' => $vendorDir . '/intervention/image/src/Modifiers/SharpenModifier.php', + 'Intervention\\Image\\Modifiers\\SliceAnimationModifier' => $vendorDir . '/intervention/image/src/Modifiers/SliceAnimationModifier.php', + 'Intervention\\Image\\Modifiers\\TextModifier' => $vendorDir . '/intervention/image/src/Modifiers/TextModifier.php', + 'Intervention\\Image\\Modifiers\\TrimModifier' => $vendorDir . '/intervention/image/src/Modifiers/TrimModifier.php', + 'Intervention\\Image\\Origin' => $vendorDir . '/intervention/image/src/Origin.php', + 'Intervention\\Image\\Resolution' => $vendorDir . '/intervention/image/src/Resolution.php', + 'Intervention\\Image\\Traits\\CanBeDriverSpecialized' => $vendorDir . '/intervention/image/src/Traits/CanBeDriverSpecialized.php', + 'Intervention\\Image\\Traits\\CanBuildFilePointer' => $vendorDir . '/intervention/image/src/Traits/CanBuildFilePointer.php', + 'Intervention\\Image\\Typography\\Font' => $vendorDir . '/intervention/image/src/Typography/Font.php', + 'Intervention\\Image\\Typography\\FontFactory' => $vendorDir . '/intervention/image/src/Typography/FontFactory.php', + 'Intervention\\Image\\Typography\\Line' => $vendorDir . '/intervention/image/src/Typography/Line.php', + 'Intervention\\Image\\Typography\\TextBlock' => $vendorDir . '/intervention/image/src/Typography/TextBlock.php', 'Laravel\\Pail\\Console\\Commands\\PailCommand' => $vendorDir . '/laravel/pail/src/Console/Commands/PailCommand.php', 'Laravel\\Pail\\Contracts\\Printer' => $vendorDir . '/laravel/pail/src/Contracts/Printer.php', 'Laravel\\Pail\\File' => $vendorDir . '/laravel/pail/src/File.php', diff --git a/vendor/composer/autoload_psr4.php b/vendor/composer/autoload_psr4.php index 5dacbe42..6f9b21b8 100755 --- a/vendor/composer/autoload_psr4.php +++ b/vendor/composer/autoload_psr4.php @@ -70,6 +70,8 @@ return array( 'Laravel\\Sail\\' => array($vendorDir . '/laravel/sail/src'), 'Laravel\\Prompts\\' => array($vendorDir . '/laravel/prompts/src'), 'Laravel\\Pail\\' => array($vendorDir . '/laravel/pail/src'), + 'Intervention\\Image\\' => array($vendorDir . '/intervention/image/src'), + 'Intervention\\Gif\\' => array($vendorDir . '/intervention/gif/src'), 'Illuminate\\Support\\' => array($vendorDir . '/laravel/framework/src/Illuminate/Macroable', $vendorDir . '/laravel/framework/src/Illuminate/Collections', $vendorDir . '/laravel/framework/src/Illuminate/Conditionable'), 'Illuminate\\' => array($vendorDir . '/laravel/framework/src/Illuminate'), 'GuzzleHttp\\UriTemplate\\' => array($vendorDir . '/guzzlehttp/uri-template/src'), diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php index d4af8bdd..2e18c020 100755 --- a/vendor/composer/autoload_static.php +++ b/vendor/composer/autoload_static.php @@ -137,6 +137,8 @@ class ComposerStaticInit626b9e7ddd47fb7eff9aaa53cce0c9ad ), 'I' => array ( + 'Intervention\\Image\\' => 19, + 'Intervention\\Gif\\' => 17, 'Illuminate\\Support\\' => 19, 'Illuminate\\' => 11, ), @@ -443,6 +445,14 @@ class ComposerStaticInit626b9e7ddd47fb7eff9aaa53cce0c9ad array ( 0 => __DIR__ . '/..' . '/laravel/pail/src', ), + 'Intervention\\Image\\' => + array ( + 0 => __DIR__ . '/..' . '/intervention/image/src', + ), + 'Intervention\\Gif\\' => + array ( + 0 => __DIR__ . '/..' . '/intervention/gif/src', + ), 'Illuminate\\Support\\' => array ( 0 => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Macroable', @@ -540,6 +550,7 @@ class ComposerStaticInit626b9e7ddd47fb7eff9aaa53cce0c9ad public static $classMap = array ( 'App\\Http\\Controllers\\Api\\CountryController' => __DIR__ . '/../..' . '/app/Http/Controllers/Api/CountryController.php', + 'App\\Http\\Controllers\\Api\\FreenodeController' => __DIR__ . '/../..' . '/app/Http/Controllers/Api/FreenodeController.php', 'App\\Http\\Controllers\\Api\\GithubController' => __DIR__ . '/../..' . '/app/Http/Controllers/Api/GithubController.php', 'App\\Http\\Controllers\\Api\\GoodController' => __DIR__ . '/../..' . '/app/Http/Controllers/Api/GoodController.php', 'App\\Http\\Controllers\\Api\\ShipController' => __DIR__ . '/../..' . '/app/Http/Controllers/Api/ShipController.php', @@ -565,6 +576,8 @@ class ComposerStaticInit626b9e7ddd47fb7eff9aaa53cce0c9ad 'App\\Models\\CrawlFreenode' => __DIR__ . '/../..' . '/app/Models/CrawlFreenode.php', 'App\\Models\\DogOption' => __DIR__ . '/../..' . '/app/Models/DogOption.php', 'App\\Models\\DoveSite' => __DIR__ . '/../..' . '/app/Models/DoveSite.php', + 'App\\Models\\FreenodePool' => __DIR__ . '/../..' . '/app/Models/FreenodePool.php', + 'App\\Models\\GemboxDns' => __DIR__ . '/../..' . '/app/Models/GemboxDns.php', 'App\\Models\\GoodPool' => __DIR__ . '/../..' . '/app/Models/GoodPool.php', 'App\\Models\\Hook' => __DIR__ . '/../..' . '/app/Models/Hook.php', 'App\\Models\\HttpQueue' => __DIR__ . '/../..' . '/app/Models/HttpQueue.php', @@ -582,7 +595,13 @@ class ComposerStaticInit626b9e7ddd47fb7eff9aaa53cce0c9ad 'App\\Services\\Article\\Schema' => __DIR__ . '/../..' . '/app/Services/Article/Schema.php', 'App\\Services\\Cron' => __DIR__ . '/../..' . '/app/Services/Cron.php', 'App\\Services\\Cron\\ArticleSchema' => __DIR__ . '/../..' . '/app/Services/Cron/ArticleSchema.php', - 'App\\Services\\Cron\\CrawlFreenode' => __DIR__ . '/../..' . '/app/Services/Cron/CrawlFreenode.php', + 'App\\Services\\Cron\\FnTgPublish' => __DIR__ . '/../..' . '/app/Services/Cron/FnTgPublish.php', + 'App\\Services\\Cron\\FreenodeCrawl' => __DIR__ . '/../..' . '/app/Services/Cron/FreenodeCrawl.php', + 'App\\Services\\Cron\\FreenodeFile' => __DIR__ . '/../..' . '/app/Services/Cron/FreenodeFile.php', + 'App\\Services\\Cron\\FreenodeLog' => __DIR__ . '/../..' . '/app/Services/Cron/FreenodeLog.php', + 'App\\Services\\Cron\\FreenodeMerge' => __DIR__ . '/../..' . '/app/Services/Cron/FreenodeMerge.php', + 'App\\Services\\Cron\\FreenodePool' => __DIR__ . '/../..' . '/app/Services/Cron/FreenodePool.php', + 'App\\Services\\Cron\\FreenodeSync' => __DIR__ . '/../..' . '/app/Services/Cron/FreenodeSync.php', 'App\\Services\\Cron\\HttpQueue' => __DIR__ . '/../..' . '/app/Services/Cron/HttpQueue.php', 'App\\Services\\HttpQueue' => __DIR__ . '/../..' . '/app/Services/HttpQueue.php', 'App\\Services\\OpenApi\\Telegram' => __DIR__ . '/../..' . '/app/Services/OpenApi/Telegram.php', @@ -603,8 +622,12 @@ class ComposerStaticInit626b9e7ddd47fb7eff9aaa53cce0c9ad 'App\\Services\\Tg\\Hook\\Mod\\Dev' => __DIR__ . '/../..' . '/app/Services/Tg/Hook/Mod/Dev.php', 'App\\Services\\Tg\\Hook\\Mod\\Dove' => __DIR__ . '/../..' . '/app/Services/Tg/Hook/Mod/Dove.php', 'App\\Services\\Tg\\Hook\\Mod\\DoveSite' => __DIR__ . '/../..' . '/app/Services/Tg/Hook/Mod/DoveSite.php', + 'App\\Services\\Tg\\Hook\\Mod\\FreenodeFrom' => __DIR__ . '/../..' . '/app/Services/Tg/Hook/Mod/FreenodeFrom.php', + 'App\\Services\\Tg\\Hook\\Mod\\FreenodePool' => __DIR__ . '/../..' . '/app/Services/Tg/Hook/Mod/FreenodePool.php', + 'App\\Services\\Tg\\Hook\\Mod\\GemboxDns' => __DIR__ . '/../..' . '/app/Services/Tg/Hook/Mod/GemboxDns.php', 'App\\Services\\Tg\\Hook\\Mod\\Good' => __DIR__ . '/../..' . '/app/Services/Tg/Hook/Mod/Good.php', 'App\\Services\\Tg\\Hook\\Mod\\Hook' => __DIR__ . '/../..' . '/app/Services/Tg/Hook/Mod/Hook.php', + 'App\\Services\\Tg\\Hook\\Mod\\HttpQueue' => __DIR__ . '/../..' . '/app/Services/Tg/Hook/Mod/HttpQueue.php', 'App\\Services\\Tg\\Hook\\Mod\\Jctj' => __DIR__ . '/../..' . '/app/Services/Tg/Hook/Mod/Jctj.php', 'App\\Services\\Tg\\Hook\\Mod\\JctjOption' => __DIR__ . '/../..' . '/app/Services/Tg/Hook/Mod/JctjOption.php', 'App\\Services\\Tg\\Hook\\Mod\\Note' => __DIR__ . '/../..' . '/app/Services/Tg/Hook/Mod/Note.php', @@ -2955,6 +2978,400 @@ class ComposerStaticInit626b9e7ddd47fb7eff9aaa53cce0c9ad 'Illuminate\\View\\ViewFinderInterface' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/View/ViewFinderInterface.php', 'Illuminate\\View\\ViewName' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/View/ViewName.php', 'Illuminate\\View\\ViewServiceProvider' => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/View/ViewServiceProvider.php', + 'Intervention\\Gif\\AbstractEntity' => __DIR__ . '/..' . '/intervention/gif/src/AbstractEntity.php', + 'Intervention\\Gif\\AbstractExtension' => __DIR__ . '/..' . '/intervention/gif/src/AbstractExtension.php', + 'Intervention\\Gif\\Blocks\\ApplicationExtension' => __DIR__ . '/..' . '/intervention/gif/src/Blocks/ApplicationExtension.php', + 'Intervention\\Gif\\Blocks\\Color' => __DIR__ . '/..' . '/intervention/gif/src/Blocks/Color.php', + 'Intervention\\Gif\\Blocks\\ColorTable' => __DIR__ . '/..' . '/intervention/gif/src/Blocks/ColorTable.php', + 'Intervention\\Gif\\Blocks\\CommentExtension' => __DIR__ . '/..' . '/intervention/gif/src/Blocks/CommentExtension.php', + 'Intervention\\Gif\\Blocks\\DataSubBlock' => __DIR__ . '/..' . '/intervention/gif/src/Blocks/DataSubBlock.php', + 'Intervention\\Gif\\Blocks\\FrameBlock' => __DIR__ . '/..' . '/intervention/gif/src/Blocks/FrameBlock.php', + 'Intervention\\Gif\\Blocks\\GraphicControlExtension' => __DIR__ . '/..' . '/intervention/gif/src/Blocks/GraphicControlExtension.php', + 'Intervention\\Gif\\Blocks\\Header' => __DIR__ . '/..' . '/intervention/gif/src/Blocks/Header.php', + 'Intervention\\Gif\\Blocks\\ImageData' => __DIR__ . '/..' . '/intervention/gif/src/Blocks/ImageData.php', + 'Intervention\\Gif\\Blocks\\ImageDescriptor' => __DIR__ . '/..' . '/intervention/gif/src/Blocks/ImageDescriptor.php', + 'Intervention\\Gif\\Blocks\\LogicalScreenDescriptor' => __DIR__ . '/..' . '/intervention/gif/src/Blocks/LogicalScreenDescriptor.php', + 'Intervention\\Gif\\Blocks\\NetscapeApplicationExtension' => __DIR__ . '/..' . '/intervention/gif/src/Blocks/NetscapeApplicationExtension.php', + 'Intervention\\Gif\\Blocks\\PlainTextExtension' => __DIR__ . '/..' . '/intervention/gif/src/Blocks/PlainTextExtension.php', + 'Intervention\\Gif\\Blocks\\TableBasedImage' => __DIR__ . '/..' . '/intervention/gif/src/Blocks/TableBasedImage.php', + 'Intervention\\Gif\\Blocks\\Trailer' => __DIR__ . '/..' . '/intervention/gif/src/Blocks/Trailer.php', + 'Intervention\\Gif\\Builder' => __DIR__ . '/..' . '/intervention/gif/src/Builder.php', + 'Intervention\\Gif\\Decoder' => __DIR__ . '/..' . '/intervention/gif/src/Decoder.php', + 'Intervention\\Gif\\Decoders\\AbstractDecoder' => __DIR__ . '/..' . '/intervention/gif/src/Decoders/AbstractDecoder.php', + 'Intervention\\Gif\\Decoders\\AbstractPackedBitDecoder' => __DIR__ . '/..' . '/intervention/gif/src/Decoders/AbstractPackedBitDecoder.php', + 'Intervention\\Gif\\Decoders\\ApplicationExtensionDecoder' => __DIR__ . '/..' . '/intervention/gif/src/Decoders/ApplicationExtensionDecoder.php', + 'Intervention\\Gif\\Decoders\\ColorDecoder' => __DIR__ . '/..' . '/intervention/gif/src/Decoders/ColorDecoder.php', + 'Intervention\\Gif\\Decoders\\ColorTableDecoder' => __DIR__ . '/..' . '/intervention/gif/src/Decoders/ColorTableDecoder.php', + 'Intervention\\Gif\\Decoders\\CommentExtensionDecoder' => __DIR__ . '/..' . '/intervention/gif/src/Decoders/CommentExtensionDecoder.php', + 'Intervention\\Gif\\Decoders\\DataSubBlockDecoder' => __DIR__ . '/..' . '/intervention/gif/src/Decoders/DataSubBlockDecoder.php', + 'Intervention\\Gif\\Decoders\\FrameBlockDecoder' => __DIR__ . '/..' . '/intervention/gif/src/Decoders/FrameBlockDecoder.php', + 'Intervention\\Gif\\Decoders\\GifDataStreamDecoder' => __DIR__ . '/..' . '/intervention/gif/src/Decoders/GifDataStreamDecoder.php', + 'Intervention\\Gif\\Decoders\\GraphicControlExtensionDecoder' => __DIR__ . '/..' . '/intervention/gif/src/Decoders/GraphicControlExtensionDecoder.php', + 'Intervention\\Gif\\Decoders\\HeaderDecoder' => __DIR__ . '/..' . '/intervention/gif/src/Decoders/HeaderDecoder.php', + 'Intervention\\Gif\\Decoders\\ImageDataDecoder' => __DIR__ . '/..' . '/intervention/gif/src/Decoders/ImageDataDecoder.php', + 'Intervention\\Gif\\Decoders\\ImageDescriptorDecoder' => __DIR__ . '/..' . '/intervention/gif/src/Decoders/ImageDescriptorDecoder.php', + 'Intervention\\Gif\\Decoders\\LogicalScreenDescriptorDecoder' => __DIR__ . '/..' . '/intervention/gif/src/Decoders/LogicalScreenDescriptorDecoder.php', + 'Intervention\\Gif\\Decoders\\NetscapeApplicationExtensionDecoder' => __DIR__ . '/..' . '/intervention/gif/src/Decoders/NetscapeApplicationExtensionDecoder.php', + 'Intervention\\Gif\\Decoders\\PlainTextExtensionDecoder' => __DIR__ . '/..' . '/intervention/gif/src/Decoders/PlainTextExtensionDecoder.php', + 'Intervention\\Gif\\Decoders\\TableBasedImageDecoder' => __DIR__ . '/..' . '/intervention/gif/src/Decoders/TableBasedImageDecoder.php', + 'Intervention\\Gif\\DisposalMethod' => __DIR__ . '/..' . '/intervention/gif/src/DisposalMethod.php', + 'Intervention\\Gif\\Encoders\\AbstractEncoder' => __DIR__ . '/..' . '/intervention/gif/src/Encoders/AbstractEncoder.php', + 'Intervention\\Gif\\Encoders\\ApplicationExtensionEncoder' => __DIR__ . '/..' . '/intervention/gif/src/Encoders/ApplicationExtensionEncoder.php', + 'Intervention\\Gif\\Encoders\\ColorEncoder' => __DIR__ . '/..' . '/intervention/gif/src/Encoders/ColorEncoder.php', + 'Intervention\\Gif\\Encoders\\ColorTableEncoder' => __DIR__ . '/..' . '/intervention/gif/src/Encoders/ColorTableEncoder.php', + 'Intervention\\Gif\\Encoders\\CommentExtensionEncoder' => __DIR__ . '/..' . '/intervention/gif/src/Encoders/CommentExtensionEncoder.php', + 'Intervention\\Gif\\Encoders\\DataSubBlockEncoder' => __DIR__ . '/..' . '/intervention/gif/src/Encoders/DataSubBlockEncoder.php', + 'Intervention\\Gif\\Encoders\\FrameBlockEncoder' => __DIR__ . '/..' . '/intervention/gif/src/Encoders/FrameBlockEncoder.php', + 'Intervention\\Gif\\Encoders\\GifDataStreamEncoder' => __DIR__ . '/..' . '/intervention/gif/src/Encoders/GifDataStreamEncoder.php', + 'Intervention\\Gif\\Encoders\\GraphicControlExtensionEncoder' => __DIR__ . '/..' . '/intervention/gif/src/Encoders/GraphicControlExtensionEncoder.php', + 'Intervention\\Gif\\Encoders\\HeaderEncoder' => __DIR__ . '/..' . '/intervention/gif/src/Encoders/HeaderEncoder.php', + 'Intervention\\Gif\\Encoders\\ImageDataEncoder' => __DIR__ . '/..' . '/intervention/gif/src/Encoders/ImageDataEncoder.php', + 'Intervention\\Gif\\Encoders\\ImageDescriptorEncoder' => __DIR__ . '/..' . '/intervention/gif/src/Encoders/ImageDescriptorEncoder.php', + 'Intervention\\Gif\\Encoders\\LogicalScreenDescriptorEncoder' => __DIR__ . '/..' . '/intervention/gif/src/Encoders/LogicalScreenDescriptorEncoder.php', + 'Intervention\\Gif\\Encoders\\NetscapeApplicationExtensionEncoder' => __DIR__ . '/..' . '/intervention/gif/src/Encoders/NetscapeApplicationExtensionEncoder.php', + 'Intervention\\Gif\\Encoders\\PlainTextExtensionEncoder' => __DIR__ . '/..' . '/intervention/gif/src/Encoders/PlainTextExtensionEncoder.php', + 'Intervention\\Gif\\Encoders\\TableBasedImageEncoder' => __DIR__ . '/..' . '/intervention/gif/src/Encoders/TableBasedImageEncoder.php', + 'Intervention\\Gif\\Encoders\\TrailerEncoder' => __DIR__ . '/..' . '/intervention/gif/src/Encoders/TrailerEncoder.php', + 'Intervention\\Gif\\Exceptions\\DecoderException' => __DIR__ . '/..' . '/intervention/gif/src/Exceptions/DecoderException.php', + 'Intervention\\Gif\\Exceptions\\EncoderException' => __DIR__ . '/..' . '/intervention/gif/src/Exceptions/EncoderException.php', + 'Intervention\\Gif\\Exceptions\\FormatException' => __DIR__ . '/..' . '/intervention/gif/src/Exceptions/FormatException.php', + 'Intervention\\Gif\\Exceptions\\NotReadableException' => __DIR__ . '/..' . '/intervention/gif/src/Exceptions/NotReadableException.php', + 'Intervention\\Gif\\GifDataStream' => __DIR__ . '/..' . '/intervention/gif/src/GifDataStream.php', + 'Intervention\\Gif\\Splitter' => __DIR__ . '/..' . '/intervention/gif/src/Splitter.php', + 'Intervention\\Gif\\Traits\\CanDecode' => __DIR__ . '/..' . '/intervention/gif/src/Traits/CanDecode.php', + 'Intervention\\Gif\\Traits\\CanEncode' => __DIR__ . '/..' . '/intervention/gif/src/Traits/CanEncode.php', + 'Intervention\\Gif\\Traits\\CanHandleFiles' => __DIR__ . '/..' . '/intervention/gif/src/Traits/CanHandleFiles.php', + 'Intervention\\Image\\Analyzers\\ColorspaceAnalyzer' => __DIR__ . '/..' . '/intervention/image/src/Analyzers/ColorspaceAnalyzer.php', + 'Intervention\\Image\\Analyzers\\HeightAnalyzer' => __DIR__ . '/..' . '/intervention/image/src/Analyzers/HeightAnalyzer.php', + 'Intervention\\Image\\Analyzers\\PixelColorAnalyzer' => __DIR__ . '/..' . '/intervention/image/src/Analyzers/PixelColorAnalyzer.php', + 'Intervention\\Image\\Analyzers\\PixelColorsAnalyzer' => __DIR__ . '/..' . '/intervention/image/src/Analyzers/PixelColorsAnalyzer.php', + 'Intervention\\Image\\Analyzers\\ProfileAnalyzer' => __DIR__ . '/..' . '/intervention/image/src/Analyzers/ProfileAnalyzer.php', + 'Intervention\\Image\\Analyzers\\ResolutionAnalyzer' => __DIR__ . '/..' . '/intervention/image/src/Analyzers/ResolutionAnalyzer.php', + 'Intervention\\Image\\Analyzers\\WidthAnalyzer' => __DIR__ . '/..' . '/intervention/image/src/Analyzers/WidthAnalyzer.php', + 'Intervention\\Image\\Collection' => __DIR__ . '/..' . '/intervention/image/src/Collection.php', + 'Intervention\\Image\\Colors\\AbstractColor' => __DIR__ . '/..' . '/intervention/image/src/Colors/AbstractColor.php', + 'Intervention\\Image\\Colors\\AbstractColorChannel' => __DIR__ . '/..' . '/intervention/image/src/Colors/AbstractColorChannel.php', + 'Intervention\\Image\\Colors\\Cmyk\\Channels\\Cyan' => __DIR__ . '/..' . '/intervention/image/src/Colors/Cmyk/Channels/Cyan.php', + 'Intervention\\Image\\Colors\\Cmyk\\Channels\\Key' => __DIR__ . '/..' . '/intervention/image/src/Colors/Cmyk/Channels/Key.php', + 'Intervention\\Image\\Colors\\Cmyk\\Channels\\Magenta' => __DIR__ . '/..' . '/intervention/image/src/Colors/Cmyk/Channels/Magenta.php', + 'Intervention\\Image\\Colors\\Cmyk\\Channels\\Yellow' => __DIR__ . '/..' . '/intervention/image/src/Colors/Cmyk/Channels/Yellow.php', + 'Intervention\\Image\\Colors\\Cmyk\\Color' => __DIR__ . '/..' . '/intervention/image/src/Colors/Cmyk/Color.php', + 'Intervention\\Image\\Colors\\Cmyk\\Colorspace' => __DIR__ . '/..' . '/intervention/image/src/Colors/Cmyk/Colorspace.php', + 'Intervention\\Image\\Colors\\Cmyk\\Decoders\\StringColorDecoder' => __DIR__ . '/..' . '/intervention/image/src/Colors/Cmyk/Decoders/StringColorDecoder.php', + 'Intervention\\Image\\Colors\\Hsl\\Channels\\Hue' => __DIR__ . '/..' . '/intervention/image/src/Colors/Hsl/Channels/Hue.php', + 'Intervention\\Image\\Colors\\Hsl\\Channels\\Luminance' => __DIR__ . '/..' . '/intervention/image/src/Colors/Hsl/Channels/Luminance.php', + 'Intervention\\Image\\Colors\\Hsl\\Channels\\Saturation' => __DIR__ . '/..' . '/intervention/image/src/Colors/Hsl/Channels/Saturation.php', + 'Intervention\\Image\\Colors\\Hsl\\Color' => __DIR__ . '/..' . '/intervention/image/src/Colors/Hsl/Color.php', + 'Intervention\\Image\\Colors\\Hsl\\Colorspace' => __DIR__ . '/..' . '/intervention/image/src/Colors/Hsl/Colorspace.php', + 'Intervention\\Image\\Colors\\Hsl\\Decoders\\StringColorDecoder' => __DIR__ . '/..' . '/intervention/image/src/Colors/Hsl/Decoders/StringColorDecoder.php', + 'Intervention\\Image\\Colors\\Hsv\\Channels\\Hue' => __DIR__ . '/..' . '/intervention/image/src/Colors/Hsv/Channels/Hue.php', + 'Intervention\\Image\\Colors\\Hsv\\Channels\\Saturation' => __DIR__ . '/..' . '/intervention/image/src/Colors/Hsv/Channels/Saturation.php', + 'Intervention\\Image\\Colors\\Hsv\\Channels\\Value' => __DIR__ . '/..' . '/intervention/image/src/Colors/Hsv/Channels/Value.php', + 'Intervention\\Image\\Colors\\Hsv\\Color' => __DIR__ . '/..' . '/intervention/image/src/Colors/Hsv/Color.php', + 'Intervention\\Image\\Colors\\Hsv\\Colorspace' => __DIR__ . '/..' . '/intervention/image/src/Colors/Hsv/Colorspace.php', + 'Intervention\\Image\\Colors\\Hsv\\Decoders\\StringColorDecoder' => __DIR__ . '/..' . '/intervention/image/src/Colors/Hsv/Decoders/StringColorDecoder.php', + 'Intervention\\Image\\Colors\\Profile' => __DIR__ . '/..' . '/intervention/image/src/Colors/Profile.php', + 'Intervention\\Image\\Colors\\Rgb\\Channels\\Alpha' => __DIR__ . '/..' . '/intervention/image/src/Colors/Rgb/Channels/Alpha.php', + 'Intervention\\Image\\Colors\\Rgb\\Channels\\Blue' => __DIR__ . '/..' . '/intervention/image/src/Colors/Rgb/Channels/Blue.php', + 'Intervention\\Image\\Colors\\Rgb\\Channels\\Green' => __DIR__ . '/..' . '/intervention/image/src/Colors/Rgb/Channels/Green.php', + 'Intervention\\Image\\Colors\\Rgb\\Channels\\Red' => __DIR__ . '/..' . '/intervention/image/src/Colors/Rgb/Channels/Red.php', + 'Intervention\\Image\\Colors\\Rgb\\Color' => __DIR__ . '/..' . '/intervention/image/src/Colors/Rgb/Color.php', + 'Intervention\\Image\\Colors\\Rgb\\Colorspace' => __DIR__ . '/..' . '/intervention/image/src/Colors/Rgb/Colorspace.php', + 'Intervention\\Image\\Colors\\Rgb\\Decoders\\HexColorDecoder' => __DIR__ . '/..' . '/intervention/image/src/Colors/Rgb/Decoders/HexColorDecoder.php', + 'Intervention\\Image\\Colors\\Rgb\\Decoders\\HtmlColornameDecoder' => __DIR__ . '/..' . '/intervention/image/src/Colors/Rgb/Decoders/HtmlColornameDecoder.php', + 'Intervention\\Image\\Colors\\Rgb\\Decoders\\StringColorDecoder' => __DIR__ . '/..' . '/intervention/image/src/Colors/Rgb/Decoders/StringColorDecoder.php', + 'Intervention\\Image\\Colors\\Rgb\\Decoders\\TransparentColorDecoder' => __DIR__ . '/..' . '/intervention/image/src/Colors/Rgb/Decoders/TransparentColorDecoder.php', + 'Intervention\\Image\\Config' => __DIR__ . '/..' . '/intervention/image/src/Config.php', + 'Intervention\\Image\\Decoders\\Base64ImageDecoder' => __DIR__ . '/..' . '/intervention/image/src/Decoders/Base64ImageDecoder.php', + 'Intervention\\Image\\Decoders\\BinaryImageDecoder' => __DIR__ . '/..' . '/intervention/image/src/Decoders/BinaryImageDecoder.php', + 'Intervention\\Image\\Decoders\\ColorObjectDecoder' => __DIR__ . '/..' . '/intervention/image/src/Decoders/ColorObjectDecoder.php', + 'Intervention\\Image\\Decoders\\DataUriImageDecoder' => __DIR__ . '/..' . '/intervention/image/src/Decoders/DataUriImageDecoder.php', + 'Intervention\\Image\\Decoders\\EncodedImageObjectDecoder' => __DIR__ . '/..' . '/intervention/image/src/Decoders/EncodedImageObjectDecoder.php', + 'Intervention\\Image\\Decoders\\FilePathImageDecoder' => __DIR__ . '/..' . '/intervention/image/src/Decoders/FilePathImageDecoder.php', + 'Intervention\\Image\\Decoders\\FilePointerImageDecoder' => __DIR__ . '/..' . '/intervention/image/src/Decoders/FilePointerImageDecoder.php', + 'Intervention\\Image\\Decoders\\ImageObjectDecoder' => __DIR__ . '/..' . '/intervention/image/src/Decoders/ImageObjectDecoder.php', + 'Intervention\\Image\\Decoders\\NativeObjectDecoder' => __DIR__ . '/..' . '/intervention/image/src/Decoders/NativeObjectDecoder.php', + 'Intervention\\Image\\Decoders\\SplFileInfoImageDecoder' => __DIR__ . '/..' . '/intervention/image/src/Decoders/SplFileInfoImageDecoder.php', + 'Intervention\\Image\\Drivers\\AbstractDecoder' => __DIR__ . '/..' . '/intervention/image/src/Drivers/AbstractDecoder.php', + 'Intervention\\Image\\Drivers\\AbstractDriver' => __DIR__ . '/..' . '/intervention/image/src/Drivers/AbstractDriver.php', + 'Intervention\\Image\\Drivers\\AbstractEncoder' => __DIR__ . '/..' . '/intervention/image/src/Drivers/AbstractEncoder.php', + 'Intervention\\Image\\Drivers\\AbstractFontProcessor' => __DIR__ . '/..' . '/intervention/image/src/Drivers/AbstractFontProcessor.php', + 'Intervention\\Image\\Drivers\\AbstractFrame' => __DIR__ . '/..' . '/intervention/image/src/Drivers/AbstractFrame.php', + 'Intervention\\Image\\Drivers\\Gd\\Analyzers\\ColorspaceAnalyzer' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Analyzers/ColorspaceAnalyzer.php', + 'Intervention\\Image\\Drivers\\Gd\\Analyzers\\HeightAnalyzer' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Analyzers/HeightAnalyzer.php', + 'Intervention\\Image\\Drivers\\Gd\\Analyzers\\PixelColorAnalyzer' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Analyzers/PixelColorAnalyzer.php', + 'Intervention\\Image\\Drivers\\Gd\\Analyzers\\PixelColorsAnalyzer' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Analyzers/PixelColorsAnalyzer.php', + 'Intervention\\Image\\Drivers\\Gd\\Analyzers\\ResolutionAnalyzer' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Analyzers/ResolutionAnalyzer.php', + 'Intervention\\Image\\Drivers\\Gd\\Analyzers\\WidthAnalyzer' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Analyzers/WidthAnalyzer.php', + 'Intervention\\Image\\Drivers\\Gd\\Cloner' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Cloner.php', + 'Intervention\\Image\\Drivers\\Gd\\ColorProcessor' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/ColorProcessor.php', + 'Intervention\\Image\\Drivers\\Gd\\Core' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Core.php', + 'Intervention\\Image\\Drivers\\Gd\\Decoders\\AbstractDecoder' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Decoders/AbstractDecoder.php', + 'Intervention\\Image\\Drivers\\Gd\\Decoders\\Base64ImageDecoder' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Decoders/Base64ImageDecoder.php', + 'Intervention\\Image\\Drivers\\Gd\\Decoders\\BinaryImageDecoder' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Decoders/BinaryImageDecoder.php', + 'Intervention\\Image\\Drivers\\Gd\\Decoders\\DataUriImageDecoder' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Decoders/DataUriImageDecoder.php', + 'Intervention\\Image\\Drivers\\Gd\\Decoders\\EncodedImageObjectDecoder' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Decoders/EncodedImageObjectDecoder.php', + 'Intervention\\Image\\Drivers\\Gd\\Decoders\\FilePathImageDecoder' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Decoders/FilePathImageDecoder.php', + 'Intervention\\Image\\Drivers\\Gd\\Decoders\\FilePointerImageDecoder' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Decoders/FilePointerImageDecoder.php', + 'Intervention\\Image\\Drivers\\Gd\\Decoders\\NativeObjectDecoder' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Decoders/NativeObjectDecoder.php', + 'Intervention\\Image\\Drivers\\Gd\\Decoders\\SplFileInfoImageDecoder' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Decoders/SplFileInfoImageDecoder.php', + 'Intervention\\Image\\Drivers\\Gd\\Driver' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Driver.php', + 'Intervention\\Image\\Drivers\\Gd\\Encoders\\AvifEncoder' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Encoders/AvifEncoder.php', + 'Intervention\\Image\\Drivers\\Gd\\Encoders\\BmpEncoder' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Encoders/BmpEncoder.php', + 'Intervention\\Image\\Drivers\\Gd\\Encoders\\GifEncoder' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Encoders/GifEncoder.php', + 'Intervention\\Image\\Drivers\\Gd\\Encoders\\JpegEncoder' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Encoders/JpegEncoder.php', + 'Intervention\\Image\\Drivers\\Gd\\Encoders\\PngEncoder' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Encoders/PngEncoder.php', + 'Intervention\\Image\\Drivers\\Gd\\Encoders\\WebpEncoder' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Encoders/WebpEncoder.php', + 'Intervention\\Image\\Drivers\\Gd\\FontProcessor' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/FontProcessor.php', + 'Intervention\\Image\\Drivers\\Gd\\Frame' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Frame.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\AlignRotationModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/AlignRotationModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\BlendTransparencyModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/BlendTransparencyModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\BlurModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/BlurModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\BrightnessModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/BrightnessModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\ColorizeModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/ColorizeModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\ColorspaceModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/ColorspaceModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\ContainModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/ContainModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\ContrastModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/ContrastModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\CoverDownModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/CoverDownModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\CoverModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/CoverModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\CropModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/CropModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\DrawBezierModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/DrawBezierModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\DrawEllipseModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/DrawEllipseModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\DrawLineModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/DrawLineModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\DrawPixelModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/DrawPixelModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\DrawPolygonModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/DrawPolygonModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\DrawRectangleModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/DrawRectangleModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\FillModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/FillModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\FlipModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/FlipModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\FlopModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/FlopModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\GammaModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/GammaModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\GreyscaleModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/GreyscaleModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\InvertModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/InvertModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\PadModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/PadModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\PixelateModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/PixelateModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\PlaceModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/PlaceModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\ProfileModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/ProfileModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\ProfileRemovalModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/ProfileRemovalModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\QuantizeColorsModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/QuantizeColorsModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\RemoveAnimationModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/RemoveAnimationModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\ResizeCanvasModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/ResizeCanvasModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\ResizeCanvasRelativeModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/ResizeCanvasRelativeModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\ResizeDownModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/ResizeDownModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\ResizeModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/ResizeModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\ResolutionModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/ResolutionModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\RotateModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/RotateModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\ScaleDownModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/ScaleDownModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\ScaleModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/ScaleModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\SharpenModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/SharpenModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\SliceAnimationModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/SliceAnimationModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\TextModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/TextModifier.php', + 'Intervention\\Image\\Drivers\\Gd\\Modifiers\\TrimModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Gd/Modifiers/TrimModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Analyzers\\ColorspaceAnalyzer' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Analyzers/ColorspaceAnalyzer.php', + 'Intervention\\Image\\Drivers\\Imagick\\Analyzers\\HeightAnalyzer' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Analyzers/HeightAnalyzer.php', + 'Intervention\\Image\\Drivers\\Imagick\\Analyzers\\PixelColorAnalyzer' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Analyzers/PixelColorAnalyzer.php', + 'Intervention\\Image\\Drivers\\Imagick\\Analyzers\\PixelColorsAnalyzer' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Analyzers/PixelColorsAnalyzer.php', + 'Intervention\\Image\\Drivers\\Imagick\\Analyzers\\ProfileAnalyzer' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Analyzers/ProfileAnalyzer.php', + 'Intervention\\Image\\Drivers\\Imagick\\Analyzers\\ResolutionAnalyzer' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Analyzers/ResolutionAnalyzer.php', + 'Intervention\\Image\\Drivers\\Imagick\\Analyzers\\WidthAnalyzer' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Analyzers/WidthAnalyzer.php', + 'Intervention\\Image\\Drivers\\Imagick\\ColorProcessor' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/ColorProcessor.php', + 'Intervention\\Image\\Drivers\\Imagick\\Core' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Core.php', + 'Intervention\\Image\\Drivers\\Imagick\\Decoders\\Base64ImageDecoder' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Decoders/Base64ImageDecoder.php', + 'Intervention\\Image\\Drivers\\Imagick\\Decoders\\BinaryImageDecoder' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Decoders/BinaryImageDecoder.php', + 'Intervention\\Image\\Drivers\\Imagick\\Decoders\\DataUriImageDecoder' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Decoders/DataUriImageDecoder.php', + 'Intervention\\Image\\Drivers\\Imagick\\Decoders\\EncodedImageObjectDecoder' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Decoders/EncodedImageObjectDecoder.php', + 'Intervention\\Image\\Drivers\\Imagick\\Decoders\\FilePathImageDecoder' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Decoders/FilePathImageDecoder.php', + 'Intervention\\Image\\Drivers\\Imagick\\Decoders\\FilePointerImageDecoder' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Decoders/FilePointerImageDecoder.php', + 'Intervention\\Image\\Drivers\\Imagick\\Decoders\\NativeObjectDecoder' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Decoders/NativeObjectDecoder.php', + 'Intervention\\Image\\Drivers\\Imagick\\Decoders\\SplFileInfoImageDecoder' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Decoders/SplFileInfoImageDecoder.php', + 'Intervention\\Image\\Drivers\\Imagick\\Driver' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Driver.php', + 'Intervention\\Image\\Drivers\\Imagick\\Encoders\\AvifEncoder' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Encoders/AvifEncoder.php', + 'Intervention\\Image\\Drivers\\Imagick\\Encoders\\BmpEncoder' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Encoders/BmpEncoder.php', + 'Intervention\\Image\\Drivers\\Imagick\\Encoders\\GifEncoder' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Encoders/GifEncoder.php', + 'Intervention\\Image\\Drivers\\Imagick\\Encoders\\HeicEncoder' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Encoders/HeicEncoder.php', + 'Intervention\\Image\\Drivers\\Imagick\\Encoders\\Jpeg2000Encoder' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Encoders/Jpeg2000Encoder.php', + 'Intervention\\Image\\Drivers\\Imagick\\Encoders\\JpegEncoder' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Encoders/JpegEncoder.php', + 'Intervention\\Image\\Drivers\\Imagick\\Encoders\\PngEncoder' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Encoders/PngEncoder.php', + 'Intervention\\Image\\Drivers\\Imagick\\Encoders\\TiffEncoder' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Encoders/TiffEncoder.php', + 'Intervention\\Image\\Drivers\\Imagick\\Encoders\\WebpEncoder' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Encoders/WebpEncoder.php', + 'Intervention\\Image\\Drivers\\Imagick\\FontProcessor' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/FontProcessor.php', + 'Intervention\\Image\\Drivers\\Imagick\\Frame' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Frame.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\AlignRotationModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/AlignRotationModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\BlendTransparencyModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/BlendTransparencyModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\BlurModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/BlurModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\BrightnessModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/BrightnessModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\ColorizeModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/ColorizeModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\ColorspaceModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/ColorspaceModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\ContainModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/ContainModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\ContrastModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/ContrastModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\CoverDownModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/CoverDownModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\CoverModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/CoverModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\CropModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/CropModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\DrawBezierModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/DrawBezierModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\DrawEllipseModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/DrawEllipseModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\DrawLineModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/DrawLineModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\DrawPixelModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/DrawPixelModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\DrawPolygonModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/DrawPolygonModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\DrawRectangleModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/DrawRectangleModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\FillModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/FillModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\FlipModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/FlipModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\FlopModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/FlopModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\GammaModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/GammaModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\GreyscaleModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/GreyscaleModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\InvertModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/InvertModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\PadModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/PadModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\PixelateModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/PixelateModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\PlaceModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/PlaceModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\ProfileModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/ProfileModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\ProfileRemovalModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/ProfileRemovalModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\QuantizeColorsModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/QuantizeColorsModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\RemoveAnimationModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/RemoveAnimationModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\ResizeCanvasModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/ResizeCanvasModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\ResizeCanvasRelativeModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/ResizeCanvasRelativeModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\ResizeDownModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/ResizeDownModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\ResizeModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/ResizeModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\ResolutionModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/ResolutionModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\RotateModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/RotateModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\ScaleDownModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/ScaleDownModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\ScaleModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/ScaleModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\SharpenModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/SharpenModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\SliceAnimationModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/SliceAnimationModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\StripMetaModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/StripMetaModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\TextModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/TextModifier.php', + 'Intervention\\Image\\Drivers\\Imagick\\Modifiers\\TrimModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Imagick/Modifiers/TrimModifier.php', + 'Intervention\\Image\\Drivers\\Specializable' => __DIR__ . '/..' . '/intervention/image/src/Drivers/Specializable.php', + 'Intervention\\Image\\Drivers\\SpecializableAnalyzer' => __DIR__ . '/..' . '/intervention/image/src/Drivers/SpecializableAnalyzer.php', + 'Intervention\\Image\\Drivers\\SpecializableDecoder' => __DIR__ . '/..' . '/intervention/image/src/Drivers/SpecializableDecoder.php', + 'Intervention\\Image\\Drivers\\SpecializableEncoder' => __DIR__ . '/..' . '/intervention/image/src/Drivers/SpecializableEncoder.php', + 'Intervention\\Image\\Drivers\\SpecializableModifier' => __DIR__ . '/..' . '/intervention/image/src/Drivers/SpecializableModifier.php', + 'Intervention\\Image\\EncodedImage' => __DIR__ . '/..' . '/intervention/image/src/EncodedImage.php', + 'Intervention\\Image\\Encoders\\AutoEncoder' => __DIR__ . '/..' . '/intervention/image/src/Encoders/AutoEncoder.php', + 'Intervention\\Image\\Encoders\\AvifEncoder' => __DIR__ . '/..' . '/intervention/image/src/Encoders/AvifEncoder.php', + 'Intervention\\Image\\Encoders\\BmpEncoder' => __DIR__ . '/..' . '/intervention/image/src/Encoders/BmpEncoder.php', + 'Intervention\\Image\\Encoders\\FileExtensionEncoder' => __DIR__ . '/..' . '/intervention/image/src/Encoders/FileExtensionEncoder.php', + 'Intervention\\Image\\Encoders\\FilePathEncoder' => __DIR__ . '/..' . '/intervention/image/src/Encoders/FilePathEncoder.php', + 'Intervention\\Image\\Encoders\\GifEncoder' => __DIR__ . '/..' . '/intervention/image/src/Encoders/GifEncoder.php', + 'Intervention\\Image\\Encoders\\HeicEncoder' => __DIR__ . '/..' . '/intervention/image/src/Encoders/HeicEncoder.php', + 'Intervention\\Image\\Encoders\\Jpeg2000Encoder' => __DIR__ . '/..' . '/intervention/image/src/Encoders/Jpeg2000Encoder.php', + 'Intervention\\Image\\Encoders\\JpegEncoder' => __DIR__ . '/..' . '/intervention/image/src/Encoders/JpegEncoder.php', + 'Intervention\\Image\\Encoders\\MediaTypeEncoder' => __DIR__ . '/..' . '/intervention/image/src/Encoders/MediaTypeEncoder.php', + 'Intervention\\Image\\Encoders\\PngEncoder' => __DIR__ . '/..' . '/intervention/image/src/Encoders/PngEncoder.php', + 'Intervention\\Image\\Encoders\\TiffEncoder' => __DIR__ . '/..' . '/intervention/image/src/Encoders/TiffEncoder.php', + 'Intervention\\Image\\Encoders\\WebpEncoder' => __DIR__ . '/..' . '/intervention/image/src/Encoders/WebpEncoder.php', + 'Intervention\\Image\\Exceptions\\AnimationException' => __DIR__ . '/..' . '/intervention/image/src/Exceptions/AnimationException.php', + 'Intervention\\Image\\Exceptions\\ColorException' => __DIR__ . '/..' . '/intervention/image/src/Exceptions/ColorException.php', + 'Intervention\\Image\\Exceptions\\DecoderException' => __DIR__ . '/..' . '/intervention/image/src/Exceptions/DecoderException.php', + 'Intervention\\Image\\Exceptions\\DriverException' => __DIR__ . '/..' . '/intervention/image/src/Exceptions/DriverException.php', + 'Intervention\\Image\\Exceptions\\EncoderException' => __DIR__ . '/..' . '/intervention/image/src/Exceptions/EncoderException.php', + 'Intervention\\Image\\Exceptions\\FontException' => __DIR__ . '/..' . '/intervention/image/src/Exceptions/FontException.php', + 'Intervention\\Image\\Exceptions\\GeometryException' => __DIR__ . '/..' . '/intervention/image/src/Exceptions/GeometryException.php', + 'Intervention\\Image\\Exceptions\\InputException' => __DIR__ . '/..' . '/intervention/image/src/Exceptions/InputException.php', + 'Intervention\\Image\\Exceptions\\NotSupportedException' => __DIR__ . '/..' . '/intervention/image/src/Exceptions/NotSupportedException.php', + 'Intervention\\Image\\Exceptions\\NotWritableException' => __DIR__ . '/..' . '/intervention/image/src/Exceptions/NotWritableException.php', + 'Intervention\\Image\\Exceptions\\RuntimeException' => __DIR__ . '/..' . '/intervention/image/src/Exceptions/RuntimeException.php', + 'Intervention\\Image\\File' => __DIR__ . '/..' . '/intervention/image/src/File.php', + 'Intervention\\Image\\FileExtension' => __DIR__ . '/..' . '/intervention/image/src/FileExtension.php', + 'Intervention\\Image\\Format' => __DIR__ . '/..' . '/intervention/image/src/Format.php', + 'Intervention\\Image\\Geometry\\Bezier' => __DIR__ . '/..' . '/intervention/image/src/Geometry/Bezier.php', + 'Intervention\\Image\\Geometry\\Circle' => __DIR__ . '/..' . '/intervention/image/src/Geometry/Circle.php', + 'Intervention\\Image\\Geometry\\Ellipse' => __DIR__ . '/..' . '/intervention/image/src/Geometry/Ellipse.php', + 'Intervention\\Image\\Geometry\\Factories\\BezierFactory' => __DIR__ . '/..' . '/intervention/image/src/Geometry/Factories/BezierFactory.php', + 'Intervention\\Image\\Geometry\\Factories\\CircleFactory' => __DIR__ . '/..' . '/intervention/image/src/Geometry/Factories/CircleFactory.php', + 'Intervention\\Image\\Geometry\\Factories\\Drawable' => __DIR__ . '/..' . '/intervention/image/src/Geometry/Factories/Drawable.php', + 'Intervention\\Image\\Geometry\\Factories\\EllipseFactory' => __DIR__ . '/..' . '/intervention/image/src/Geometry/Factories/EllipseFactory.php', + 'Intervention\\Image\\Geometry\\Factories\\LineFactory' => __DIR__ . '/..' . '/intervention/image/src/Geometry/Factories/LineFactory.php', + 'Intervention\\Image\\Geometry\\Factories\\PolygonFactory' => __DIR__ . '/..' . '/intervention/image/src/Geometry/Factories/PolygonFactory.php', + 'Intervention\\Image\\Geometry\\Factories\\RectangleFactory' => __DIR__ . '/..' . '/intervention/image/src/Geometry/Factories/RectangleFactory.php', + 'Intervention\\Image\\Geometry\\Line' => __DIR__ . '/..' . '/intervention/image/src/Geometry/Line.php', + 'Intervention\\Image\\Geometry\\Pixel' => __DIR__ . '/..' . '/intervention/image/src/Geometry/Pixel.php', + 'Intervention\\Image\\Geometry\\Point' => __DIR__ . '/..' . '/intervention/image/src/Geometry/Point.php', + 'Intervention\\Image\\Geometry\\Polygon' => __DIR__ . '/..' . '/intervention/image/src/Geometry/Polygon.php', + 'Intervention\\Image\\Geometry\\Rectangle' => __DIR__ . '/..' . '/intervention/image/src/Geometry/Rectangle.php', + 'Intervention\\Image\\Geometry\\Tools\\RectangleResizer' => __DIR__ . '/..' . '/intervention/image/src/Geometry/Tools/RectangleResizer.php', + 'Intervention\\Image\\Geometry\\Traits\\HasBackgroundColor' => __DIR__ . '/..' . '/intervention/image/src/Geometry/Traits/HasBackgroundColor.php', + 'Intervention\\Image\\Geometry\\Traits\\HasBorder' => __DIR__ . '/..' . '/intervention/image/src/Geometry/Traits/HasBorder.php', + 'Intervention\\Image\\Image' => __DIR__ . '/..' . '/intervention/image/src/Image.php', + 'Intervention\\Image\\ImageManager' => __DIR__ . '/..' . '/intervention/image/src/ImageManager.php', + 'Intervention\\Image\\InputHandler' => __DIR__ . '/..' . '/intervention/image/src/InputHandler.php', + 'Intervention\\Image\\Interfaces\\AnalyzerInterface' => __DIR__ . '/..' . '/intervention/image/src/Interfaces/AnalyzerInterface.php', + 'Intervention\\Image\\Interfaces\\CollectionInterface' => __DIR__ . '/..' . '/intervention/image/src/Interfaces/CollectionInterface.php', + 'Intervention\\Image\\Interfaces\\ColorChannelInterface' => __DIR__ . '/..' . '/intervention/image/src/Interfaces/ColorChannelInterface.php', + 'Intervention\\Image\\Interfaces\\ColorInterface' => __DIR__ . '/..' . '/intervention/image/src/Interfaces/ColorInterface.php', + 'Intervention\\Image\\Interfaces\\ColorProcessorInterface' => __DIR__ . '/..' . '/intervention/image/src/Interfaces/ColorProcessorInterface.php', + 'Intervention\\Image\\Interfaces\\ColorspaceInterface' => __DIR__ . '/..' . '/intervention/image/src/Interfaces/ColorspaceInterface.php', + 'Intervention\\Image\\Interfaces\\CoreInterface' => __DIR__ . '/..' . '/intervention/image/src/Interfaces/CoreInterface.php', + 'Intervention\\Image\\Interfaces\\DecoderInterface' => __DIR__ . '/..' . '/intervention/image/src/Interfaces/DecoderInterface.php', + 'Intervention\\Image\\Interfaces\\DrawableFactoryInterface' => __DIR__ . '/..' . '/intervention/image/src/Interfaces/DrawableFactoryInterface.php', + 'Intervention\\Image\\Interfaces\\DrawableInterface' => __DIR__ . '/..' . '/intervention/image/src/Interfaces/DrawableInterface.php', + 'Intervention\\Image\\Interfaces\\DriverInterface' => __DIR__ . '/..' . '/intervention/image/src/Interfaces/DriverInterface.php', + 'Intervention\\Image\\Interfaces\\EncodedImageInterface' => __DIR__ . '/..' . '/intervention/image/src/Interfaces/EncodedImageInterface.php', + 'Intervention\\Image\\Interfaces\\EncoderInterface' => __DIR__ . '/..' . '/intervention/image/src/Interfaces/EncoderInterface.php', + 'Intervention\\Image\\Interfaces\\FileInterface' => __DIR__ . '/..' . '/intervention/image/src/Interfaces/FileInterface.php', + 'Intervention\\Image\\Interfaces\\FontInterface' => __DIR__ . '/..' . '/intervention/image/src/Interfaces/FontInterface.php', + 'Intervention\\Image\\Interfaces\\FontProcessorInterface' => __DIR__ . '/..' . '/intervention/image/src/Interfaces/FontProcessorInterface.php', + 'Intervention\\Image\\Interfaces\\FrameInterface' => __DIR__ . '/..' . '/intervention/image/src/Interfaces/FrameInterface.php', + 'Intervention\\Image\\Interfaces\\ImageInterface' => __DIR__ . '/..' . '/intervention/image/src/Interfaces/ImageInterface.php', + 'Intervention\\Image\\Interfaces\\ImageManagerInterface' => __DIR__ . '/..' . '/intervention/image/src/Interfaces/ImageManagerInterface.php', + 'Intervention\\Image\\Interfaces\\InputHandlerInterface' => __DIR__ . '/..' . '/intervention/image/src/Interfaces/InputHandlerInterface.php', + 'Intervention\\Image\\Interfaces\\ModifierInterface' => __DIR__ . '/..' . '/intervention/image/src/Interfaces/ModifierInterface.php', + 'Intervention\\Image\\Interfaces\\PointInterface' => __DIR__ . '/..' . '/intervention/image/src/Interfaces/PointInterface.php', + 'Intervention\\Image\\Interfaces\\ProfileInterface' => __DIR__ . '/..' . '/intervention/image/src/Interfaces/ProfileInterface.php', + 'Intervention\\Image\\Interfaces\\ResolutionInterface' => __DIR__ . '/..' . '/intervention/image/src/Interfaces/ResolutionInterface.php', + 'Intervention\\Image\\Interfaces\\SizeInterface' => __DIR__ . '/..' . '/intervention/image/src/Interfaces/SizeInterface.php', + 'Intervention\\Image\\Interfaces\\SpecializableInterface' => __DIR__ . '/..' . '/intervention/image/src/Interfaces/SpecializableInterface.php', + 'Intervention\\Image\\Interfaces\\SpecializedInterface' => __DIR__ . '/..' . '/intervention/image/src/Interfaces/SpecializedInterface.php', + 'Intervention\\Image\\MediaType' => __DIR__ . '/..' . '/intervention/image/src/MediaType.php', + 'Intervention\\Image\\ModifierStack' => __DIR__ . '/..' . '/intervention/image/src/ModifierStack.php', + 'Intervention\\Image\\Modifiers\\AbstractDrawModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/AbstractDrawModifier.php', + 'Intervention\\Image\\Modifiers\\AlignRotationModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/AlignRotationModifier.php', + 'Intervention\\Image\\Modifiers\\BlendTransparencyModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/BlendTransparencyModifier.php', + 'Intervention\\Image\\Modifiers\\BlurModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/BlurModifier.php', + 'Intervention\\Image\\Modifiers\\BrightnessModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/BrightnessModifier.php', + 'Intervention\\Image\\Modifiers\\ColorizeModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/ColorizeModifier.php', + 'Intervention\\Image\\Modifiers\\ColorspaceModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/ColorspaceModifier.php', + 'Intervention\\Image\\Modifiers\\ContainModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/ContainModifier.php', + 'Intervention\\Image\\Modifiers\\ContrastModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/ContrastModifier.php', + 'Intervention\\Image\\Modifiers\\CoverDownModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/CoverDownModifier.php', + 'Intervention\\Image\\Modifiers\\CoverModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/CoverModifier.php', + 'Intervention\\Image\\Modifiers\\CropModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/CropModifier.php', + 'Intervention\\Image\\Modifiers\\DrawBezierModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/DrawBezierModifier.php', + 'Intervention\\Image\\Modifiers\\DrawEllipseModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/DrawEllipseModifier.php', + 'Intervention\\Image\\Modifiers\\DrawLineModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/DrawLineModifier.php', + 'Intervention\\Image\\Modifiers\\DrawPixelModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/DrawPixelModifier.php', + 'Intervention\\Image\\Modifiers\\DrawPolygonModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/DrawPolygonModifier.php', + 'Intervention\\Image\\Modifiers\\DrawRectangleModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/DrawRectangleModifier.php', + 'Intervention\\Image\\Modifiers\\FillModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/FillModifier.php', + 'Intervention\\Image\\Modifiers\\FlipModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/FlipModifier.php', + 'Intervention\\Image\\Modifiers\\FlopModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/FlopModifier.php', + 'Intervention\\Image\\Modifiers\\GammaModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/GammaModifier.php', + 'Intervention\\Image\\Modifiers\\GreyscaleModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/GreyscaleModifier.php', + 'Intervention\\Image\\Modifiers\\InvertModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/InvertModifier.php', + 'Intervention\\Image\\Modifiers\\PadModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/PadModifier.php', + 'Intervention\\Image\\Modifiers\\PixelateModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/PixelateModifier.php', + 'Intervention\\Image\\Modifiers\\PlaceModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/PlaceModifier.php', + 'Intervention\\Image\\Modifiers\\ProfileModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/ProfileModifier.php', + 'Intervention\\Image\\Modifiers\\ProfileRemovalModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/ProfileRemovalModifier.php', + 'Intervention\\Image\\Modifiers\\QuantizeColorsModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/QuantizeColorsModifier.php', + 'Intervention\\Image\\Modifiers\\RemoveAnimationModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/RemoveAnimationModifier.php', + 'Intervention\\Image\\Modifiers\\ResizeCanvasModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/ResizeCanvasModifier.php', + 'Intervention\\Image\\Modifiers\\ResizeCanvasRelativeModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/ResizeCanvasRelativeModifier.php', + 'Intervention\\Image\\Modifiers\\ResizeDownModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/ResizeDownModifier.php', + 'Intervention\\Image\\Modifiers\\ResizeModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/ResizeModifier.php', + 'Intervention\\Image\\Modifiers\\ResolutionModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/ResolutionModifier.php', + 'Intervention\\Image\\Modifiers\\RotateModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/RotateModifier.php', + 'Intervention\\Image\\Modifiers\\ScaleDownModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/ScaleDownModifier.php', + 'Intervention\\Image\\Modifiers\\ScaleModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/ScaleModifier.php', + 'Intervention\\Image\\Modifiers\\SharpenModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/SharpenModifier.php', + 'Intervention\\Image\\Modifiers\\SliceAnimationModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/SliceAnimationModifier.php', + 'Intervention\\Image\\Modifiers\\TextModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/TextModifier.php', + 'Intervention\\Image\\Modifiers\\TrimModifier' => __DIR__ . '/..' . '/intervention/image/src/Modifiers/TrimModifier.php', + 'Intervention\\Image\\Origin' => __DIR__ . '/..' . '/intervention/image/src/Origin.php', + 'Intervention\\Image\\Resolution' => __DIR__ . '/..' . '/intervention/image/src/Resolution.php', + 'Intervention\\Image\\Traits\\CanBeDriverSpecialized' => __DIR__ . '/..' . '/intervention/image/src/Traits/CanBeDriverSpecialized.php', + 'Intervention\\Image\\Traits\\CanBuildFilePointer' => __DIR__ . '/..' . '/intervention/image/src/Traits/CanBuildFilePointer.php', + 'Intervention\\Image\\Typography\\Font' => __DIR__ . '/..' . '/intervention/image/src/Typography/Font.php', + 'Intervention\\Image\\Typography\\FontFactory' => __DIR__ . '/..' . '/intervention/image/src/Typography/FontFactory.php', + 'Intervention\\Image\\Typography\\Line' => __DIR__ . '/..' . '/intervention/image/src/Typography/Line.php', + 'Intervention\\Image\\Typography\\TextBlock' => __DIR__ . '/..' . '/intervention/image/src/Typography/TextBlock.php', 'Laravel\\Pail\\Console\\Commands\\PailCommand' => __DIR__ . '/..' . '/laravel/pail/src/Console/Commands/PailCommand.php', 'Laravel\\Pail\\Contracts\\Printer' => __DIR__ . '/..' . '/laravel/pail/src/Contracts/Printer.php', 'Laravel\\Pail\\File' => __DIR__ . '/..' . '/laravel/pail/src/File.php', diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json index bec9380d..53f9853c 100755 --- a/vendor/composer/installed.json +++ b/vendor/composer/installed.json @@ -1281,6 +1281,156 @@ }, "install-path": "../hamcrest/hamcrest-php" }, + { + "name": "intervention/gif", + "version": "4.2.2", + "version_normalized": "4.2.2.0", + "source": { + "type": "git", + "url": "https://github.com/Intervention/gif.git", + "reference": "5999eac6a39aa760fb803bc809e8909ee67b451a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Intervention/gif/zipball/5999eac6a39aa760fb803bc809e8909ee67b451a", + "reference": "5999eac6a39aa760fb803bc809e8909ee67b451a", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "phpstan/phpstan": "^2.1", + "phpunit/phpunit": "^10.0 || ^11.0 || ^12.0", + "slevomat/coding-standard": "~8.0", + "squizlabs/php_codesniffer": "^3.8" + }, + "time": "2025-03-29T07:46:21+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Intervention\\Gif\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Oliver Vogel", + "email": "oliver@intervention.io", + "homepage": "https://intervention.io/" + } + ], + "description": "Native PHP GIF Encoder/Decoder", + "homepage": "https://github.com/intervention/gif", + "keywords": [ + "animation", + "gd", + "gif", + "image" + ], + "support": { + "issues": "https://github.com/Intervention/gif/issues", + "source": "https://github.com/Intervention/gif/tree/4.2.2" + }, + "funding": [ + { + "url": "https://paypal.me/interventionio", + "type": "custom" + }, + { + "url": "https://github.com/Intervention", + "type": "github" + }, + { + "url": "https://ko-fi.com/interventionphp", + "type": "ko_fi" + } + ], + "install-path": "../intervention/gif" + }, + { + "name": "intervention/image", + "version": "3.11.6", + "version_normalized": "3.11.6.0", + "source": { + "type": "git", + "url": "https://github.com/Intervention/image.git", + "reference": "5f6d27d9fd56312c47f347929e7ac15345c605a1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Intervention/image/zipball/5f6d27d9fd56312c47f347929e7ac15345c605a1", + "reference": "5f6d27d9fd56312c47f347929e7ac15345c605a1", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "intervention/gif": "^4.2", + "php": "^8.1" + }, + "require-dev": { + "mockery/mockery": "^1.6", + "phpstan/phpstan": "^2.1", + "phpunit/phpunit": "^10.0 || ^11.0 || ^12.0", + "slevomat/coding-standard": "~8.0", + "squizlabs/php_codesniffer": "^3.8" + }, + "suggest": { + "ext-exif": "Recommended to be able to read EXIF data properly." + }, + "time": "2025-12-17T13:38:29+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Intervention\\Image\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Oliver Vogel", + "email": "oliver@intervention.io", + "homepage": "https://intervention.io" + } + ], + "description": "PHP Image Processing", + "homepage": "https://image.intervention.io", + "keywords": [ + "gd", + "image", + "imagick", + "resize", + "thumbnail", + "watermark" + ], + "support": { + "issues": "https://github.com/Intervention/image/issues", + "source": "https://github.com/Intervention/image/tree/3.11.6" + }, + "funding": [ + { + "url": "https://paypal.me/interventionio", + "type": "custom" + }, + { + "url": "https://github.com/Intervention", + "type": "github" + }, + { + "url": "https://ko-fi.com/interventionphp", + "type": "ko_fi" + } + ], + "install-path": "../intervention/image" + }, { "name": "irazasyed/telegram-bot-sdk", "version": "v3.15.0", diff --git a/vendor/composer/installed.php b/vendor/composer/installed.php index adcbbbe6..bc96a316 100755 --- a/vendor/composer/installed.php +++ b/vendor/composer/installed.php @@ -3,7 +3,7 @@ 'name' => 'laravel/laravel', 'pretty_version' => 'dev-master', 'version' => 'dev-master', - 'reference' => '6843f40b786f201ee5dec7fe59e77678399fbc3a', + 'reference' => 'e87d0e91e4344582a24e8ed70cec7979575b73a4', 'type' => 'project', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), @@ -370,6 +370,24 @@ 0 => 'v11.36.1', ), ), + 'intervention/gif' => array( + 'pretty_version' => '4.2.2', + 'version' => '4.2.2.0', + 'reference' => '5999eac6a39aa760fb803bc809e8909ee67b451a', + 'type' => 'library', + 'install_path' => __DIR__ . '/../intervention/gif', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'intervention/image' => array( + 'pretty_version' => '3.11.6', + 'version' => '3.11.6.0', + 'reference' => '5f6d27d9fd56312c47f347929e7ac15345c605a1', + 'type' => 'library', + 'install_path' => __DIR__ . '/../intervention/image', + 'aliases' => array(), + 'dev_requirement' => false, + ), 'irazasyed/telegram-bot-sdk' => array( 'pretty_version' => 'v3.15.0', 'version' => '3.15.0.0', @@ -397,7 +415,7 @@ 'laravel/laravel' => array( 'pretty_version' => 'dev-master', 'version' => 'dev-master', - 'reference' => '6843f40b786f201ee5dec7fe59e77678399fbc3a', + 'reference' => 'e87d0e91e4344582a24e8ed70cec7979575b73a4', 'type' => 'project', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), diff --git a/vendor/composer/tmp-b1bec4785aa3cb26f6cad297d3828558.zip b/vendor/composer/tmp-b1bec4785aa3cb26f6cad297d3828558.zip old mode 100644 new mode 100755 diff --git a/vendor/intervention/gif/LICENSE b/vendor/intervention/gif/LICENSE new file mode 100755 index 00000000..d621d287 --- /dev/null +++ b/vendor/intervention/gif/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2020-present Oliver Vogel + +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/vendor/intervention/gif/composer.json b/vendor/intervention/gif/composer.json new file mode 100755 index 00000000..0fd37ab3 --- /dev/null +++ b/vendor/intervention/gif/composer.json @@ -0,0 +1,44 @@ +{ + "name": "intervention/gif", + "description": "Native PHP GIF Encoder/Decoder", + "homepage": "https://github.com/intervention/gif", + "keywords": [ + "image", + "gd", + "gif", + "animation" + ], + "license": "MIT", + "authors": [ + { + "name": "Oliver Vogel", + "email": "oliver@intervention.io", + "homepage": "https://intervention.io/" + } + ], + "require": { + "php": "^8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0 || ^11.0 || ^12.0", + "phpstan/phpstan": "^2.1", + "squizlabs/php_codesniffer": "^3.8", + "slevomat/coding-standard": "~8.0" + }, + "autoload": { + "psr-4": { + "Intervention\\Gif\\": "src" + } + }, + "autoload-dev": { + "psr-4": { + "Intervention\\Gif\\Tests\\": "tests" + } + }, + "minimum-stability": "stable", + "config": { + "allow-plugins": { + "dealerdirect/phpcodesniffer-composer-installer": true + } + } +} diff --git a/vendor/intervention/gif/phpunit.xml.dist b/vendor/intervention/gif/phpunit.xml.dist new file mode 100755 index 00000000..6a2bf073 --- /dev/null +++ b/vendor/intervention/gif/phpunit.xml.dist @@ -0,0 +1,13 @@ + + + + + ./tests/Unit/ + + + + + src + + + diff --git a/vendor/intervention/gif/src/AbstractEntity.php b/vendor/intervention/gif/src/AbstractEntity.php new file mode 100755 index 00000000..6acd426a --- /dev/null +++ b/vendor/intervention/gif/src/AbstractEntity.php @@ -0,0 +1,40 @@ +getShortName(); + } + + /** + * Cast object to string + * + * @throws EncoderException + * @return string + */ + public function __toString(): string + { + return $this->encode(); + } +} diff --git a/vendor/intervention/gif/src/AbstractExtension.php b/vendor/intervention/gif/src/AbstractExtension.php new file mode 100755 index 00000000..329ac501 --- /dev/null +++ b/vendor/intervention/gif/src/AbstractExtension.php @@ -0,0 +1,10 @@ + + */ + protected array $blocks = []; + + /** + * Get size of block + * + * @return int + */ + public function getBlockSize(): int + { + return strlen($this->application); + } + + /** + * Set application name + * + * @param string $value + * @return ApplicationExtension + */ + public function setApplication(string $value): self + { + $this->application = $value; + + return $this; + } + + /** + * Get application name + * + * @return string + */ + public function getApplication(): string + { + return $this->application; + } + + /** + * Add block to application extension + * + * @param DataSubBlock $block + * @return ApplicationExtension + */ + public function addBlock(DataSubBlock $block): self + { + $this->blocks[] = $block; + + return $this; + } + + /** + * Set data sub blocks of instance + * + * @param array $blocks + * @return ApplicationExtension + */ + public function setBlocks(array $blocks): self + { + $this->blocks = $blocks; + + return $this; + } + + /** + * Get blocks of ApplicationExtension + * + * @return array + */ + public function getBlocks(): array + { + return $this->blocks; + } +} diff --git a/vendor/intervention/gif/src/Blocks/Color.php b/vendor/intervention/gif/src/Blocks/Color.php new file mode 100755 index 00000000..7d473aef --- /dev/null +++ b/vendor/intervention/gif/src/Blocks/Color.php @@ -0,0 +1,100 @@ +r; + } + + /** + * Set red value + * + * @param int $value + */ + public function setRed(int $value): self + { + $this->r = $value; + + return $this; + } + + /** + * Get green value + * + * @return int + */ + public function getGreen(): int + { + return $this->g; + } + + /** + * Set green value + * + * @param int $value + */ + public function setGreen(int $value): self + { + $this->g = $value; + + return $this; + } + + /** + * Get blue value + * + * @return int + */ + public function getBlue(): int + { + return $this->b; + } + + /** + * Set blue value + * + * @param int $value + */ + public function setBlue(int $value): self + { + $this->b = $value; + + return $this; + } + + /** + * Return hash value of current color + * + * @return string + */ + public function getHash(): string + { + return md5($this->r . $this->g . $this->b); + } +} diff --git a/vendor/intervention/gif/src/Blocks/ColorTable.php b/vendor/intervention/gif/src/Blocks/ColorTable.php new file mode 100755 index 00000000..1a70f71f --- /dev/null +++ b/vendor/intervention/gif/src/Blocks/ColorTable.php @@ -0,0 +1,140 @@ + $colors + * @return void + */ + public function __construct(protected array $colors = []) + { + // + } + + /** + * Return array of current colors + * + * @return array + */ + public function getColors(): array + { + return array_values($this->colors); + } + + /** + * Add color to table + * + * @param int $r + * @param int $g + * @param int $b + * @return self + */ + public function addRgb(int $r, int $g, int $b): self + { + $this->addColor(new Color($r, $g, $b)); + + return $this; + } + + /** + * Add color to table + * + * @param Color $color + * @return self + */ + public function addColor(Color $color): self + { + $this->colors[] = $color; + + return $this; + } + + /** + * Reset colors to array of color objects + * + * @param array $colors + * @return self + */ + public function setColors(array $colors): self + { + $this->empty(); + foreach ($colors as $color) { + $this->addColor($color); + } + + return $this; + } + + /** + * Count colors of current instance + * + * @return int + */ + public function countColors(): int + { + return count($this->colors); + } + + /** + * Determine if any colors are present on the current table + * + * @return bool + */ + public function hasColors(): bool + { + return $this->countColors() >= 1; + } + + /** + * Empty color table + * + * @return self + */ + public function empty(): self + { + $this->colors = []; + + return $this; + } + + /** + * Get size of color table in logical screen descriptor + * + * @return int + */ + public function getLogicalSize(): int + { + return match ($this->countColors()) { + 4 => 1, + 8 => 2, + 16 => 3, + 32 => 4, + 64 => 5, + 128 => 6, + 256 => 7, + default => 0, + }; + } + + /** + * Calculate the number of bytes contained by the current table + * + * @return int + */ + public function getByteSize(): int + { + if (!$this->hasColors()) { + return 0; + } + + return 3 * pow(2, $this->getLogicalSize() + 1); + } +} diff --git a/vendor/intervention/gif/src/Blocks/CommentExtension.php b/vendor/intervention/gif/src/Blocks/CommentExtension.php new file mode 100755 index 00000000..7c8a54e3 --- /dev/null +++ b/vendor/intervention/gif/src/Blocks/CommentExtension.php @@ -0,0 +1,52 @@ + + */ + protected array $comments = []; + + /** + * Get all or one comment + * + * @return array + */ + public function getComments(): array + { + return $this->comments; + } + + /** + * Get one comment by key + * + * @param int $key + * @return mixed + */ + public function getComment(int $key): mixed + { + return array_key_exists($key, $this->comments) ? $this->comments[$key] : null; + } + + /** + * Set comment text + * + * @param string $value + */ + public function addComment(string $value): self + { + $this->comments[] = $value; + + return $this; + } +} diff --git a/vendor/intervention/gif/src/Blocks/DataSubBlock.php b/vendor/intervention/gif/src/Blocks/DataSubBlock.php new file mode 100755 index 00000000..613580b8 --- /dev/null +++ b/vendor/intervention/gif/src/Blocks/DataSubBlock.php @@ -0,0 +1,47 @@ +getSize() > 255) { + throw new FormatException( + 'Data Sub-Block can not have a block size larger than 255 bytes.' + ); + } + } + + /** + * Return size of current block + * + * @return int + */ + public function getSize(): int + { + return strlen($this->value); + } + + /** + * Return block value + * + * @return string + */ + public function getValue(): string + { + return $this->value; + } +} diff --git a/vendor/intervention/gif/src/Blocks/FrameBlock.php b/vendor/intervention/gif/src/Blocks/FrameBlock.php new file mode 100755 index 00000000..b5516698 --- /dev/null +++ b/vendor/intervention/gif/src/Blocks/FrameBlock.php @@ -0,0 +1,262 @@ + $applicationExtensions + */ + protected array $applicationExtensions = []; + + /** + * @var array $commentExtensions + */ + protected array $commentExtensions = []; + + public function __construct( + protected ImageDescriptor $imageDescriptor = new ImageDescriptor(), + protected ImageData $imageData = new ImageData() + ) { + // + } + + public function addEntity(AbstractEntity $entity): self + { + return match (true) { + $entity instanceof TableBasedImage => $this->setTableBasedImage($entity), + $entity instanceof GraphicControlExtension => $this->setGraphicControlExtension($entity), + $entity instanceof ImageDescriptor => $this->setImageDescriptor($entity), + $entity instanceof ColorTable => $this->setColorTable($entity), + $entity instanceof ImageData => $this->setImageData($entity), + $entity instanceof PlainTextExtension => $this->setPlainTextExtension($entity), + $entity instanceof NetscapeApplicationExtension, + $entity instanceof ApplicationExtension => $this->addApplicationExtension($entity), + $entity instanceof CommentExtension => $this->addCommentExtension($entity), + default => $this, + }; + } + + /** + * Return application extensions of current frame block + * + * @return array + */ + public function getApplicationExtensions(): array + { + return $this->applicationExtensions; + } + + /** + * Return comment extensions of current frame block + * + * @return array + */ + public function getCommentExtensions(): array + { + return $this->commentExtensions; + } + + /** + * Set the graphic control extension + * + * @param GraphicControlExtension $extension + * @return self + */ + public function setGraphicControlExtension(GraphicControlExtension $extension): self + { + $this->graphicControlExtension = $extension; + + return $this; + } + + /** + * Get the graphic control extension of the current frame block + * + * @return null|GraphicControlExtension + */ + public function getGraphicControlExtension(): ?GraphicControlExtension + { + return $this->graphicControlExtension; + } + + /** + * Set the image descriptor + * + * @param ImageDescriptor $descriptor + * @return self + */ + public function setImageDescriptor(ImageDescriptor $descriptor): self + { + $this->imageDescriptor = $descriptor; + return $this; + } + + /** + * Get the image descriptor of the frame block + * + * @return ImageDescriptor + */ + public function getImageDescriptor(): ImageDescriptor + { + return $this->imageDescriptor; + } + + /** + * Set the color table of the current frame block + * + * @param ColorTable $table + * @return FrameBlock + */ + public function setColorTable(ColorTable $table): self + { + $this->colorTable = $table; + + return $this; + } + + /** + * Get color table + * + * @return null|ColorTable + */ + public function getColorTable(): ?ColorTable + { + return $this->colorTable; + } + + /** + * Determine if frame block has color table + * + * @return bool + */ + public function hasColorTable(): bool + { + return !is_null($this->colorTable); + } + + /** + * Set image data of frame block + * + * @param ImageData $data + * @return self + */ + public function setImageData(ImageData $data): self + { + $this->imageData = $data; + + return $this; + } + + /** + * Get image data of current frame block + * + * @return ImageData + */ + public function getImageData(): ImageData + { + return $this->imageData; + } + + /** + * Set plain text extension + * + * @param PlainTextExtension $extension + * @return self + */ + public function setPlainTextExtension(PlainTextExtension $extension): self + { + $this->plainTextExtension = $extension; + + return $this; + } + + /** + * Get plain text extension + * + * @return null|PlainTextExtension + */ + public function getPlainTextExtension(): ?PlainTextExtension + { + return $this->plainTextExtension; + } + + /** + * Add given application extension to the current frame block + * + * @param ApplicationExtension $extension + * @return self + */ + public function addApplicationExtension(ApplicationExtension $extension): self + { + $this->applicationExtensions[] = $extension; + + return $this; + } + + /** + * Add given comment extension to the current frame block + * + * @param CommentExtension $extension + * @return self + */ + public function addCommentExtension(CommentExtension $extension): self + { + $this->commentExtensions[] = $extension; + + return $this; + } + + /** + * Return netscape extension of the frame block if available + * + * @return null|NetscapeApplicationExtension + */ + public function getNetscapeExtension(): ?NetscapeApplicationExtension + { + $extensions = array_filter( + $this->applicationExtensions, + fn(ApplicationExtension $extension): bool => $extension instanceof NetscapeApplicationExtension, + ); + + return count($extensions) ? reset($extensions) : null; + } + + /** + * Set the table based image of the current frame block + * + * @param TableBasedImage $tableBasedImage + * @return self + */ + public function setTableBasedImage(TableBasedImage $tableBasedImage): self + { + $this->setImageDescriptor($tableBasedImage->getImageDescriptor()); + + if ($colorTable = $tableBasedImage->getColorTable()) { + $this->setColorTable($colorTable); + } + + $this->setImageData($tableBasedImage->getImageData()); + + return $this; + } +} diff --git a/vendor/intervention/gif/src/Blocks/GraphicControlExtension.php b/vendor/intervention/gif/src/Blocks/GraphicControlExtension.php new file mode 100755 index 00000000..f95e15af --- /dev/null +++ b/vendor/intervention/gif/src/Blocks/GraphicControlExtension.php @@ -0,0 +1,159 @@ +delay = $value; + + return $this; + } + + /** + * Return delay time (1/100 second) + * + * @return int + */ + public function getDelay(): int + { + return $this->delay; + } + + /** + * Set disposal method + * + * @param DisposalMethod $method + * @return self + */ + public function setDisposalMethod(DisposalMethod $method): self + { + $this->disposalMethod = $method; + + return $this; + } + + /** + * Get disposal method + * + * @return DisposalMethod + */ + public function getDisposalMethod(): DisposalMethod + { + return $this->disposalMethod; + } + + /** + * Get transparent color index + * + * @return int + */ + public function getTransparentColorIndex(): int + { + return $this->transparentColorIndex; + } + + /** + * Set transparent color index + * + * @param int $index + */ + public function setTransparentColorIndex(int $index): self + { + $this->transparentColorIndex = $index; + + return $this; + } + + /** + * Get current transparent color existance + * + * @return bool + */ + public function getTransparentColorExistance(): bool + { + return $this->transparentColorExistance; + } + + /** + * Set existance flag of transparent color + * + * @param bool $existance + */ + public function setTransparentColorExistance(bool $existance = true): self + { + $this->transparentColorExistance = $existance; + + return $this; + } + + /** + * Get user input flag + * + * @return bool + */ + public function getUserInput(): bool + { + return $this->userInput; + } + + /** + * Set user input flag + * + * @param bool $value + */ + public function setUserInput(bool $value = true): self + { + $this->userInput = $value; + + return $this; + } +} diff --git a/vendor/intervention/gif/src/Blocks/Header.php b/vendor/intervention/gif/src/Blocks/Header.php new file mode 100755 index 00000000..ee561b91 --- /dev/null +++ b/vendor/intervention/gif/src/Blocks/Header.php @@ -0,0 +1,42 @@ +version = $value; + + return $this; + } + + /** + * Return current version + * + * @return string + */ + public function getVersion(): string + { + return $this->version; + } +} diff --git a/vendor/intervention/gif/src/Blocks/ImageData.php b/vendor/intervention/gif/src/Blocks/ImageData.php new file mode 100755 index 00000000..b07d300a --- /dev/null +++ b/vendor/intervention/gif/src/Blocks/ImageData.php @@ -0,0 +1,80 @@ + + */ + protected array $blocks = []; + + /** + * Get LZW min. code size + * + * @return int + */ + public function getLzwMinCodeSize(): int + { + return $this->lzw_min_code_size; + } + + /** + * Set lzw min. code size + * + * @param int $size + * @return ImageData + */ + public function setLzwMinCodeSize(int $size): self + { + $this->lzw_min_code_size = $size; + + return $this; + } + + /** + * Get current data sub blocks + * + * @return array + */ + public function getBlocks(): array + { + return $this->blocks; + } + + /** + * Addd sub block + * + * @param DataSubBlock $block + * @return ImageData + */ + public function addBlock(DataSubBlock $block): self + { + $this->blocks[] = $block; + + return $this; + } + + /** + * Determine if data sub blocks are present + * + * @return bool + */ + public function hasBlocks(): bool + { + return count($this->blocks) >= 1; + } +} diff --git a/vendor/intervention/gif/src/Blocks/ImageDescriptor.php b/vendor/intervention/gif/src/Blocks/ImageDescriptor.php new file mode 100755 index 00000000..29e2f65f --- /dev/null +++ b/vendor/intervention/gif/src/Blocks/ImageDescriptor.php @@ -0,0 +1,246 @@ +width); + } + + /** + * Get current width + * + * @return int + */ + public function getHeight(): int + { + return intval($this->height); + } + + /** + * Get current Top + * + * @return int + */ + public function getTop(): int + { + return intval($this->top); + } + + /** + * Get current Left + * + * @return int + */ + public function getLeft(): int + { + return intval($this->left); + } + + /** + * Set size of current instance + * + * @param int $width + * @param int $height + */ + public function setSize(int $width, int $height): self + { + $this->width = $width; + $this->height = $height; + + return $this; + } + + /** + * Set position of current instance + * + * @param int $left + * @param int $top + */ + public function setPosition(int $left, int $top): self + { + $this->left = $left; + $this->top = $top; + + return $this; + } + + /** + * Determine if frame is interlaced + * + * @return bool + */ + public function isInterlaced(): bool + { + return $this->interlaced; + } + + /** + * Set or unset interlaced value + * + * @param bool $value + */ + public function setInterlaced(bool $value = true): self + { + $this->interlaced = $value; + + return $this; + } + + /** + * Determine if local color table is present + * + * @return bool + */ + public function getLocalColorTableExistance(): bool + { + return $this->localColorTableExistance; + } + + /** + * Alias for getLocalColorTableExistance + * + * @return bool + */ + public function hasLocalColorTable(): bool + { + return $this->getLocalColorTableExistance(); + } + + /** + * Set local color table flag + * + * @param bool $existance + * @return self + */ + public function setLocalColorTableExistance(bool $existance = true): self + { + $this->localColorTableExistance = $existance; + + return $this; + } + + /** + * Get local color table sorted flag + * + * @return bool + */ + public function getLocalColorTableSorted(): bool + { + return $this->localColorTableSorted; + } + + /** + * Set local color table sorted flag + * + * @param bool $sorted + * @return self + */ + public function setLocalColorTableSorted(bool $sorted = true): self + { + $this->localColorTableSorted = $sorted; + + return $this; + } + + /** + * Get size of local color table + * + * @return int + */ + public function getLocalColorTableSize(): int + { + return $this->localColorTableSize; + } + + /** + * Get byte size of global color table + * + * @return int + */ + public function getLocalColorTableByteSize(): int + { + return 3 * pow(2, $this->getLocalColorTableSize() + 1); + } + + /** + * Set size of local color table + * + * @param int $size + */ + public function setLocalColorTableSize(int $size): self + { + $this->localColorTableSize = $size; + + return $this; + } +} diff --git a/vendor/intervention/gif/src/Blocks/LogicalScreenDescriptor.php b/vendor/intervention/gif/src/Blocks/LogicalScreenDescriptor.php new file mode 100755 index 00000000..821f1b27 --- /dev/null +++ b/vendor/intervention/gif/src/Blocks/LogicalScreenDescriptor.php @@ -0,0 +1,254 @@ +width = $width; + $this->height = $height; + + return $this; + } + + /** + * Get width of current instance + * + * @return int + */ + public function getWidth(): int + { + return intval($this->width); + } + + /** + * Get height of current instance + * + * @return int + */ + public function getHeight(): int + { + return intval($this->height); + } + + /** + * Determine if global color table is present + * + * @return bool + */ + public function getGlobalColorTableExistance(): bool + { + return $this->globalColorTableExistance; + } + + /** + * Alias of getGlobalColorTableExistance + * + * @return bool + */ + public function hasGlobalColorTable(): bool + { + return $this->getGlobalColorTableExistance(); + } + + /** + * Set global color table flag + * + * @param bool $existance + * @return self + */ + public function setGlobalColorTableExistance(bool $existance = true): self + { + $this->globalColorTableExistance = $existance; + + return $this; + } + + /** + * Get global color table sorted flag + * + * @return bool + */ + public function getGlobalColorTableSorted(): bool + { + return $this->globalColorTableSorted; + } + + /** + * Set global color table sorted flag + * + * @param bool $sorted + * @return self + */ + public function setGlobalColorTableSorted(bool $sorted = true): self + { + $this->globalColorTableSorted = $sorted; + + return $this; + } + + /** + * Get size of global color table + * + * @return int + */ + public function getGlobalColorTableSize(): int + { + return $this->globalColorTableSize; + } + + /** + * Get byte size of global color table + * + * @return int + */ + public function getGlobalColorTableByteSize(): int + { + return 3 * pow(2, $this->getGlobalColorTableSize() + 1); + } + + /** + * Set size of global color table + * + * @param int $size + */ + public function setGlobalColorTableSize(int $size): self + { + $this->globalColorTableSize = $size; + + return $this; + } + + /** + * Get background color index + * + * @return int + */ + public function getBackgroundColorIndex(): int + { + return $this->backgroundColorIndex; + } + + /** + * Set background color index + * + * @param int $index + */ + public function setBackgroundColorIndex(int $index): self + { + $this->backgroundColorIndex = $index; + + return $this; + } + + /** + * Get current pixel aspect ration + * + * @return int + */ + public function getPixelAspectRatio(): int + { + return $this->pixelAspectRatio; + } + + /** + * Set pixel aspect ratio + * + * @param int $ratio + */ + public function setPixelAspectRatio(int $ratio): self + { + $this->pixelAspectRatio = $ratio; + + return $this; + } + + /** + * Get color resolution + * + * @return int + */ + public function getBitsPerPixel(): int + { + return $this->bitsPerPixel; + } + + /** + * Set color resolution + * + * @param int $value + */ + public function setBitsPerPixel(int $value): self + { + $this->bitsPerPixel = $value; + + return $this; + } +} diff --git a/vendor/intervention/gif/src/Blocks/NetscapeApplicationExtension.php b/vendor/intervention/gif/src/Blocks/NetscapeApplicationExtension.php new file mode 100755 index 00000000..72fe59ad --- /dev/null +++ b/vendor/intervention/gif/src/Blocks/NetscapeApplicationExtension.php @@ -0,0 +1,52 @@ +setApplication(self::IDENTIFIER . self::AUTH_CODE); + $this->setBlocks([new DataSubBlock(self::SUB_BLOCK_PREFIX . "\x00\x00")]); + } + + /** + * Get number of loops + * + * @return int + */ + public function getLoops(): int + { + return unpack('v*', substr($this->getBlocks()[0]->getValue(), 1))[1]; + } + + /** + * Set number of loops + * + * @param int $loops + * @throws FormatException + * @return self + */ + public function setLoops(int $loops): self + { + $this->setBlocks([ + new DataSubBlock(self::SUB_BLOCK_PREFIX . pack('v*', $loops)) + ]); + + return $this; + } +} diff --git a/vendor/intervention/gif/src/Blocks/PlainTextExtension.php b/vendor/intervention/gif/src/Blocks/PlainTextExtension.php new file mode 100755 index 00000000..6b102f99 --- /dev/null +++ b/vendor/intervention/gif/src/Blocks/PlainTextExtension.php @@ -0,0 +1,63 @@ + + */ + protected array $text = []; + + /** + * Get current text + * + * @return array + */ + public function getText(): array + { + return $this->text; + } + + /** + * Add text + * + * @param string $text + */ + public function addText(string $text): self + { + $this->text[] = $text; + + return $this; + } + + /** + * Set text array of extension + * + * @param array $text + */ + public function setText(array $text): self + { + $this->text = $text; + + return $this; + } + + /** + * Determine if any text is present + * + * @return bool + */ + public function hasText(): bool + { + return $this->text !== []; + } +} diff --git a/vendor/intervention/gif/src/Blocks/TableBasedImage.php b/vendor/intervention/gif/src/Blocks/TableBasedImage.php new file mode 100755 index 00000000..cbd447bd --- /dev/null +++ b/vendor/intervention/gif/src/Blocks/TableBasedImage.php @@ -0,0 +1,50 @@ +imageDescriptor; + } + + public function setImageDescriptor(ImageDescriptor $descriptor): self + { + $this->imageDescriptor = $descriptor; + + return $this; + } + + public function getImageData(): ImageData + { + return $this->imageData; + } + + public function setImageData(ImageData $data): self + { + $this->imageData = $data; + + return $this; + } + + public function getColorTable(): ?ColorTable + { + return $this->colorTable; + } + + public function setColorTable(ColorTable $table): self + { + $this->colorTable = $table; + + return $this; + } +} diff --git a/vendor/intervention/gif/src/Blocks/Trailer.php b/vendor/intervention/gif/src/Blocks/Trailer.php new file mode 100755 index 00000000..2c68bc49 --- /dev/null +++ b/vendor/intervention/gif/src/Blocks/Trailer.php @@ -0,0 +1,12 @@ +gif; + } + + /** + * Set canvas size of gif + * + * @param int $width + * @param int $height + * @return Builder + */ + public function setSize(int $width, int $height): self + { + $this->gif->getLogicalScreenDescriptor()->setSize($width, $height); + + return $this; + } + + /** + * Create new canvas + * + * @param int $width + * @param int $height + * @return self + */ + public static function canvas(int $width, int $height): self + { + return (new self())->setSize($width, $height); + } + + /** + * Set loop count + * + * @param int $loops + * @return Builder + * @throws Exception + */ + public function setLoops(int $loops): self + { + if ($this->gif->getFrames() === []) { + throw new Exception('Add at least one frame before setting the loop count'); + } + + if ($loops >= 0) { + // add frame count to existing or new netscape extension on first frame + if (!$this->gif->getFirstFrame()->getNetscapeExtension()) { + $this->gif->getFirstFrame()->addApplicationExtension( + new NetscapeApplicationExtension() + ); + } + $this->gif->getFirstFrame()->getNetscapeExtension()->setLoops($loops); + } + + return $this; + } + + /** + * Create new animation frame from given source + * which can be path to a file or GIF image data + * + * @param string|resource $source + * @param float $delay time delay in seconds + * @param int $left position offset in pixels from left + * @param int $top position offset in pixels from top + * @param bool $interlaced + * @throws DecoderException + * @return Builder + */ + public function addFrame( + mixed $source, + float $delay = 0, + int $left = 0, + int $top = 0, + bool $interlaced = false + ): self { + $frame = new FrameBlock(); + $source = Decoder::decode($source); + + // store delay + $frame->setGraphicControlExtension( + $this->buildGraphicControlExtension( + $source, + intval($delay * 100) + ) + ); + + // store image + $frame->setTableBasedImage( + $this->buildTableBasedImage($source, $left, $top, $interlaced) + ); + + // add frame + $this->gif->addFrame($frame); + + return $this; + } + + /** + * Build new graphic control extension with given delay & disposal method + * + * @param GifDataStream $source + * @param int $delay + * @param DisposalMethod $disposalMethod + * @return GraphicControlExtension + */ + protected function buildGraphicControlExtension( + GifDataStream $source, + int $delay, + DisposalMethod $disposalMethod = DisposalMethod::BACKGROUND + ): GraphicControlExtension { + // create extension + $extension = new GraphicControlExtension($delay, $disposalMethod); + + // set transparency index + $control = $source->getFirstFrame()->getGraphicControlExtension(); + if ($control && $control->getTransparentColorExistance()) { + $extension->setTransparentColorExistance(); + $extension->setTransparentColorIndex( + $control->getTransparentColorIndex() + ); + } + + return $extension; + } + + /** + * Build table based image object from given source + * + * @param GifDataStream $source + * @param int $left + * @param int $top + * @param bool $interlaced + * @return TableBasedImage + */ + protected function buildTableBasedImage( + GifDataStream $source, + int $left, + int $top, + bool $interlaced + ): TableBasedImage { + $block = new TableBasedImage(); + $block->setImageDescriptor(new ImageDescriptor()); + + // set global color table from source as local color table + $block->getImageDescriptor()->setLocalColorTableExistance(); + $block->setColorTable($source->getGlobalColorTable()); + + $block->getImageDescriptor()->setLocalColorTableSorted( + $source->getLogicalScreenDescriptor()->getGlobalColorTableSorted() + ); + + $block->getImageDescriptor()->setLocalColorTableSize( + $source->getLogicalScreenDescriptor()->getGlobalColorTableSize() + ); + + $block->getImageDescriptor()->setSize( + $source->getLogicalScreenDescriptor()->getWidth(), + $source->getLogicalScreenDescriptor()->getHeight() + ); + + // set position + $block->getImageDescriptor()->setPosition($left, $top); + + // set interlaced flag + $block->getImageDescriptor()->setInterlaced($interlaced); + + // add image data from source + $block->setImageData($source->getFirstFrame()->getImageData()); + + return $block; + } + + /** + * Encode the current build + * + * @throws EncoderException + * @return string + */ + public function encode(): string + { + return $this->gif->encode(); + } +} diff --git a/vendor/intervention/gif/src/Decoder.php b/vendor/intervention/gif/src/Decoder.php new file mode 100755 index 00000000..f39025a8 --- /dev/null +++ b/vendor/intervention/gif/src/Decoder.php @@ -0,0 +1,47 @@ + self::getHandleFromFilePath($input), + is_string($input) => self::getHandleFromData($input), + self::isFileHandle($input) => $input, + default => throw new DecoderException( + 'Decoder input must be either file path, file pointer resource or binary data.' + ) + }; + + rewind($handle); + + return GifDataStream::decode($handle); + } + + /** + * Determine if input is file pointer resource + * + * @param mixed $input + * @return bool + */ + private static function isFileHandle(mixed $input): bool + { + return is_resource($input) && get_resource_type($input) === 'stream'; + } +} diff --git a/vendor/intervention/gif/src/Decoders/AbstractDecoder.php b/vendor/intervention/gif/src/Decoders/AbstractDecoder.php new file mode 100755 index 00000000..8253053c --- /dev/null +++ b/vendor/intervention/gif/src/Decoders/AbstractDecoder.php @@ -0,0 +1,165 @@ +handle = $handle; + + return $this; + } + + /** + * Read given number of bytes and move file pointer + * + * @param int $length + * @throws DecoderException + * @return string + */ + protected function getNextBytesOrFail(int $length): string + { + $bytes = fread($this->handle, $length); + + if (strlen($bytes) !== $length) { + throw new DecoderException('Unexpected end of file.'); + } + + return $bytes; + } + + /** + * Read given number of bytes and move pointer back to previous position + * + * @param int $length + * @throws DecoderException + * @return string + */ + protected function viewNextBytesOrFail(int $length): string + { + $bytes = $this->getNextBytesOrFail($length); + $this->movePointer($length * -1); + + return $bytes; + } + + /** + * Read next byte and move pointer back to previous position + * + * @throws DecoderException + * @return string + */ + protected function viewNextByteOrFail(): string + { + return $this->viewNextBytesOrFail(1); + } + + /** + * Read all remaining bytes from file handler + * + * @return string + */ + protected function getRemainingBytes(): string + { + $all = ''; + do { + $byte = fread($this->handle, 1); + $all .= $byte; + } while (!feof($this->handle)); + + return $all; + } + + /** + * Get next byte in stream and move file pointer + * + * @throws DecoderException + * @return string + */ + protected function getNextByteOrFail(): string + { + return $this->getNextBytesOrFail(1); + } + + /** + * Move file pointer on handle by given offset + * + * @param int $offset + * @return self + */ + protected function movePointer(int $offset): self + { + fseek($this->handle, $offset, SEEK_CUR); + + return $this; + } + + /** + * Decode multi byte value + * + * @return int + */ + protected function decodeMultiByte(string $bytes): int + { + return unpack('v*', $bytes)[1]; + } + + /** + * Set length + * + * @param int $length + */ + public function setLength(int $length): self + { + $this->length = $length; + + return $this; + } + + /** + * Get length + * + * @return null|int + */ + public function getLength(): ?int + { + return $this->length; + } + + /** + * Get current handle position + * + * @return int + */ + public function getPosition(): int + { + return ftell($this->handle); + } +} diff --git a/vendor/intervention/gif/src/Decoders/AbstractPackedBitDecoder.php b/vendor/intervention/gif/src/Decoders/AbstractPackedBitDecoder.php new file mode 100755 index 00000000..69066fa7 --- /dev/null +++ b/vendor/intervention/gif/src/Decoders/AbstractPackedBitDecoder.php @@ -0,0 +1,43 @@ +getPackedBits($byte)[$num]; + } + + /** + * Get packed bits + * + * @param int $start + * @param int $length + * @return string + */ + protected function getPackedBits(string $byte, int $start = 0, int $length = 8): string + { + $bits = str_pad(decbin($this->decodePackedByte($byte)), 8, '0', STR_PAD_LEFT); + + return substr($bits, $start, $length); + } +} diff --git a/vendor/intervention/gif/src/Decoders/ApplicationExtensionDecoder.php b/vendor/intervention/gif/src/Decoders/ApplicationExtensionDecoder.php new file mode 100755 index 00000000..ea59d5d3 --- /dev/null +++ b/vendor/intervention/gif/src/Decoders/ApplicationExtensionDecoder.php @@ -0,0 +1,71 @@ +getNextByteOrFail(); // marker + $this->getNextByteOrFail(); // label + $blocksize = $this->decodeBlockSize($this->getNextByteOrFail()); + $application = $this->getNextBytesOrFail($blocksize); + + if ($application === NetscapeApplicationExtension::IDENTIFIER . NetscapeApplicationExtension::AUTH_CODE) { + $result = new NetscapeApplicationExtension(); + + // skip length + $this->getNextByteOrFail(); + + $result->setBlocks([ + new DataSubBlock( + $this->getNextBytesOrFail(3) + ) + ]); + + // skip terminator + $this->getNextByteOrFail(); + + return $result; + } + + $result->setApplication($application); + + // decode data sub blocks + $blocksize = $this->decodeBlockSize($this->getNextByteOrFail()); + while ($blocksize > 0) { + $result->addBlock(new DataSubBlock($this->getNextBytesOrFail($blocksize))); + $blocksize = $this->decodeBlockSize($this->getNextByteOrFail()); + } + + return $result; + } + + /** + * Decode block size of ApplicationExtension from given byte + * + * @param string $byte + * @return int + */ + protected function decodeBlockSize(string $byte): int + { + return (int) @unpack('C', $byte)[1]; + } +} diff --git a/vendor/intervention/gif/src/Decoders/ColorDecoder.php b/vendor/intervention/gif/src/Decoders/ColorDecoder.php new file mode 100755 index 00000000..ef0e2b48 --- /dev/null +++ b/vendor/intervention/gif/src/Decoders/ColorDecoder.php @@ -0,0 +1,38 @@ +setRed($this->decodeColorValue($this->getNextByteOrFail())); + $color->setGreen($this->decodeColorValue($this->getNextByteOrFail())); + $color->setBlue($this->decodeColorValue($this->getNextByteOrFail())); + + return $color; + } + + /** + * Decode red value from source + * + * @return int + */ + protected function decodeColorValue(string $byte): int + { + return unpack('C', $byte)[1]; + } +} diff --git a/vendor/intervention/gif/src/Decoders/ColorTableDecoder.php b/vendor/intervention/gif/src/Decoders/ColorTableDecoder.php new file mode 100755 index 00000000..c5a48751 --- /dev/null +++ b/vendor/intervention/gif/src/Decoders/ColorTableDecoder.php @@ -0,0 +1,28 @@ +getLength() / 3); $i++) { + $table->addColor(Color::decode($this->handle)); + } + + return $table; + } +} diff --git a/vendor/intervention/gif/src/Decoders/CommentExtensionDecoder.php b/vendor/intervention/gif/src/Decoders/CommentExtensionDecoder.php new file mode 100755 index 00000000..18bbf7db --- /dev/null +++ b/vendor/intervention/gif/src/Decoders/CommentExtensionDecoder.php @@ -0,0 +1,61 @@ +getNextBytesOrFail(2); // skip marker & label + + $extension = new CommentExtension(); + foreach ($this->decodeComments() as $comment) { + $extension->addComment($comment); + } + + return $extension; + } + + /** + * Decode comment from current source + * + * @throws DecoderException + * @return array + */ + protected function decodeComments(): array + { + $comments = []; + + do { + $byte = $this->getNextByteOrFail(); + $size = $this->decodeBlocksize($byte); + if ($size > 0) { + $comments[] = $this->getNextBytesOrFail($size); + } + } while ($byte !== CommentExtension::TERMINATOR); + + return $comments; + } + + /** + * Decode blocksize of following comment + * + * @param string $byte + * @return int + */ + protected function decodeBlocksize(string $byte): int + { + return (int) @unpack('C', $byte)[1]; + } +} diff --git a/vendor/intervention/gif/src/Decoders/DataSubBlockDecoder.php b/vendor/intervention/gif/src/Decoders/DataSubBlockDecoder.php new file mode 100755 index 00000000..2715ea45 --- /dev/null +++ b/vendor/intervention/gif/src/Decoders/DataSubBlockDecoder.php @@ -0,0 +1,27 @@ +getNextByteOrFail(); + $size = (int) unpack('C', $char)[1]; + + return new DataSubBlock($this->getNextBytesOrFail($size)); + } +} diff --git a/vendor/intervention/gif/src/Decoders/FrameBlockDecoder.php b/vendor/intervention/gif/src/Decoders/FrameBlockDecoder.php new file mode 100755 index 00000000..600cee6d --- /dev/null +++ b/vendor/intervention/gif/src/Decoders/FrameBlockDecoder.php @@ -0,0 +1,53 @@ +viewNextBytesOrFail(2)) { + AbstractExtension::MARKER . GraphicControlExtension::LABEL + => GraphicControlExtension::decode($this->handle), + AbstractExtension::MARKER . NetscapeApplicationExtension::LABEL + => NetscapeApplicationExtension::decode($this->handle), + AbstractExtension::MARKER . ApplicationExtension::LABEL + => ApplicationExtension::decode($this->handle), + AbstractExtension::MARKER . PlainTextExtension::LABEL + => PlainTextExtension::decode($this->handle), + AbstractExtension::MARKER . CommentExtension::LABEL + => CommentExtension::decode($this->handle), + default => match ($this->viewNextByteOrFail()) { + ImageDescriptor::SEPARATOR => TableBasedImage::decode($this->handle), + default => throw new DecoderException('Unable to decode Data Block'), + } + }; + + $frame->addEntity($block); + } while (!($block instanceof TableBasedImage)); + + return $frame; + } +} diff --git a/vendor/intervention/gif/src/Decoders/GifDataStreamDecoder.php b/vendor/intervention/gif/src/Decoders/GifDataStreamDecoder.php new file mode 100755 index 00000000..ea4d8b31 --- /dev/null +++ b/vendor/intervention/gif/src/Decoders/GifDataStreamDecoder.php @@ -0,0 +1,59 @@ +setHeader( + Header::decode($this->handle), + ); + + $gif->setLogicalScreenDescriptor( + LogicalScreenDescriptor::decode($this->handle), + ); + + if ($gif->getLogicalScreenDescriptor()->hasGlobalColorTable()) { + $length = $gif->getLogicalScreenDescriptor()->getGlobalColorTableByteSize(); + $gif->setGlobalColorTable( + ColorTable::decode($this->handle, $length) + ); + } + + while ($this->viewNextByteOrFail() !== Trailer::MARKER) { + match ($this->viewNextBytesOrFail(2)) { + // trailing "global" comment blocks which are not part of "FrameBlock" + AbstractExtension::MARKER . CommentExtension::LABEL + => $gif->addComment( + CommentExtension::decode($this->handle) + ), + default => $gif->addFrame( + FrameBlock::decode($this->handle) + ), + }; + } + + return $gif; + } +} diff --git a/vendor/intervention/gif/src/Decoders/GraphicControlExtensionDecoder.php b/vendor/intervention/gif/src/Decoders/GraphicControlExtensionDecoder.php new file mode 100755 index 00000000..6e37e624 --- /dev/null +++ b/vendor/intervention/gif/src/Decoders/GraphicControlExtensionDecoder.php @@ -0,0 +1,97 @@ +getNextBytesOrFail(3); // skip marker, label & bytesize + + // byte #4 + $packedField = $this->getNextByteOrFail(); + $result->setDisposalMethod($this->decodeDisposalMethod($packedField)); + $result->setUserInput($this->decodeUserInput($packedField)); + $result->setTransparentColorExistance($this->decodeTransparentColorExistance($packedField)); + + // bytes 5-6 + $result->setDelay($this->decodeDelay($this->getNextBytesOrFail(2))); + + // byte #7 + $result->setTransparentColorIndex($this->decodeTransparentColorIndex( + $this->getNextByteOrFail() + )); + + // byte #8 (terminator) + $this->getNextByteOrFail(); + + return $result; + } + + /** + * Decode disposal method + * + * @return DisposalMethod + */ + protected function decodeDisposalMethod(string $byte): DisposalMethod + { + return DisposalMethod::from( + bindec($this->getPackedBits($byte, 3, 3)) + ); + } + + /** + * Decode user input flag + * + * @return bool + */ + protected function decodeUserInput(string $byte): bool + { + return $this->hasPackedBit($byte, 6); + } + + /** + * Decode transparent color existance + * + * @return bool + */ + protected function decodeTransparentColorExistance(string $byte): bool + { + return $this->hasPackedBit($byte, 7); + } + + /** + * Decode delay value + * + * @return int + */ + protected function decodeDelay(string $bytes): int + { + return unpack('v*', $bytes)[1]; + } + + /** + * Decode transparent color index + * + * @return int + */ + protected function decodeTransparentColorIndex(string $byte): int + { + return unpack('C', $byte)[1]; + } +} diff --git a/vendor/intervention/gif/src/Decoders/HeaderDecoder.php b/vendor/intervention/gif/src/Decoders/HeaderDecoder.php new file mode 100755 index 00000000..05616282 --- /dev/null +++ b/vendor/intervention/gif/src/Decoders/HeaderDecoder.php @@ -0,0 +1,42 @@ +setVersion($this->decodeVersion()); + + return $header; + } + + /** + * Decode version string + * + * @throws DecoderException + * @return string + */ + protected function decodeVersion(): string + { + $parsed = (bool) preg_match("/^GIF(?P[0-9]{2}[a-z])$/", $this->getNextBytesOrFail(6), $matches); + + if ($parsed === false) { + throw new DecoderException('Unable to parse file header.'); + } + + return $matches['version']; + } +} diff --git a/vendor/intervention/gif/src/Decoders/ImageDataDecoder.php b/vendor/intervention/gif/src/Decoders/ImageDataDecoder.php new file mode 100755 index 00000000..9bbacd81 --- /dev/null +++ b/vendor/intervention/gif/src/Decoders/ImageDataDecoder.php @@ -0,0 +1,42 @@ +getNextByteOrFail(); + $size = (int) unpack('C', $char)[1]; + $data->setLzwMinCodeSize($size); + + do { + // decode sub blocks + $char = $this->getNextByteOrFail(); + $size = (int) unpack('C', $char)[1]; + if ($size > 0) { + $data->addBlock(new DataSubBlock($this->getNextBytesOrFail($size))); + } + } while ($char !== AbstractEntity::TERMINATOR); + + return $data; + } +} diff --git a/vendor/intervention/gif/src/Decoders/ImageDescriptorDecoder.php b/vendor/intervention/gif/src/Decoders/ImageDescriptorDecoder.php new file mode 100755 index 00000000..4d3ed699 --- /dev/null +++ b/vendor/intervention/gif/src/Decoders/ImageDescriptorDecoder.php @@ -0,0 +1,94 @@ +getNextByteOrFail(); // skip separator + + $descriptor->setPosition( + $this->decodeMultiByte($this->getNextBytesOrFail(2)), + $this->decodeMultiByte($this->getNextBytesOrFail(2)) + ); + + $descriptor->setSize( + $this->decodeMultiByte($this->getNextBytesOrFail(2)), + $this->decodeMultiByte($this->getNextBytesOrFail(2)) + ); + + $packedField = $this->getNextByteOrFail(); + + $descriptor->setLocalColorTableExistance( + $this->decodeLocalColorTableExistance($packedField) + ); + + $descriptor->setLocalColorTableSorted( + $this->decodeLocalColorTableSorted($packedField) + ); + + $descriptor->setLocalColorTableSize( + $this->decodeLocalColorTableSize($packedField) + ); + + $descriptor->setInterlaced( + $this->decodeInterlaced($packedField) + ); + + return $descriptor; + } + + /** + * Decode local color table existance + * + * @return bool + */ + protected function decodeLocalColorTableExistance(string $byte): bool + { + return $this->hasPackedBit($byte, 0); + } + + /** + * Decode local color table sort method + * + * @return bool + */ + protected function decodeLocalColorTableSorted(string $byte): bool + { + return $this->hasPackedBit($byte, 2); + } + + /** + * Decode local color table size + * + * @return int + */ + protected function decodeLocalColorTableSize(string $byte): int + { + return bindec($this->getPackedBits($byte, 5, 3)); + } + + /** + * Decode interlaced flag + * + * @return bool + */ + protected function decodeInterlaced(string $byte): bool + { + return $this->hasPackedBit($byte, 1); + } +} diff --git a/vendor/intervention/gif/src/Decoders/LogicalScreenDescriptorDecoder.php b/vendor/intervention/gif/src/Decoders/LogicalScreenDescriptorDecoder.php new file mode 100755 index 00000000..1cd09893 --- /dev/null +++ b/vendor/intervention/gif/src/Decoders/LogicalScreenDescriptorDecoder.php @@ -0,0 +1,139 @@ +setSize( + $this->decodeWidth($this->getNextBytesOrFail(2)), + $this->decodeHeight($this->getNextBytesOrFail(2)) + ); + + // byte 5 + $packedField = $this->getNextByteOrFail(); + + $logicalScreenDescriptor->setGlobalColorTableExistance( + $this->decodeGlobalColorTableExistance($packedField) + ); + + $logicalScreenDescriptor->setBitsPerPixel( + $this->decodeBitsPerPixel($packedField) + ); + + $logicalScreenDescriptor->setGlobalColorTableSorted( + $this->decodeGlobalColorTableSorted($packedField) + ); + + $logicalScreenDescriptor->setGlobalColorTableSize( + $this->decodeGlobalColorTableSize($packedField) + ); + + // byte 6 + $logicalScreenDescriptor->setBackgroundColorIndex( + $this->decodeBackgroundColorIndex($this->getNextByteOrFail()) + ); + + // byte 7 + $logicalScreenDescriptor->setPixelAspectRatio( + $this->decodePixelAspectRatio($this->getNextByteOrFail()) + ); + + return $logicalScreenDescriptor; + } + + /** + * Decode width + * + * @return int + */ + protected function decodeWidth(string $source): int + { + return unpack('v*', $source)[1]; + } + + /** + * Decode height + * + * @return int + */ + protected function decodeHeight(string $source): int + { + return unpack('v*', $source)[1]; + } + + /** + * Decode existance of global color table + * + * @return bool + */ + protected function decodeGlobalColorTableExistance(string $byte): bool + { + return $this->hasPackedBit($byte, 0); + } + + /** + * Decode color resolution in bits per pixel + * + * @return int + */ + protected function decodeBitsPerPixel(string $byte): int + { + return bindec($this->getPackedBits($byte, 1, 3)) + 1; + } + + /** + * Decode global color table sorted status + * + * @return bool + */ + protected function decodeGlobalColorTableSorted(string $byte): bool + { + return $this->hasPackedBit($byte, 4); + } + + /** + * Decode size of global color table + * + * @return int + */ + protected function decodeGlobalColorTableSize(string $byte): int + { + return bindec($this->getPackedBits($byte, 5, 3)); + } + + /** + * Decode background color index + * + * @return int + */ + protected function decodeBackgroundColorIndex(string $source): int + { + return unpack('C', $source)[1]; + } + + /** + * Decode pixel aspect ratio + * + * @return int + */ + protected function decodePixelAspectRatio(string $source): int + { + return unpack('C', $source)[1]; + } +} diff --git a/vendor/intervention/gif/src/Decoders/NetscapeApplicationExtensionDecoder.php b/vendor/intervention/gif/src/Decoders/NetscapeApplicationExtensionDecoder.php new file mode 100755 index 00000000..3074f89f --- /dev/null +++ b/vendor/intervention/gif/src/Decoders/NetscapeApplicationExtensionDecoder.php @@ -0,0 +1,9 @@ +getNextBytesOrFail(2); + + // skip info block + $this->getNextBytesOrFail($this->getInfoBlockSize()); + + // text blocks + $extension->setText($this->decodeTextBlocks()); + + return $extension; + } + + /** + * Get number of bytes in header block + * + * @throws DecoderException + * @return int + */ + protected function getInfoBlockSize(): int + { + return unpack('C', $this->getNextByteOrFail())[1]; + } + + /** + * Decode text sub blocks + * + * @throws DecoderException + * @return array + */ + protected function decodeTextBlocks(): array + { + $blocks = []; + + do { + $char = $this->getNextByteOrFail(); + $size = (int) unpack('C', $char)[1]; + if ($size > 0) { + $blocks[] = $this->getNextBytesOrFail($size); + } + } while ($char !== PlainTextExtension::TERMINATOR); + + return $blocks; + } +} diff --git a/vendor/intervention/gif/src/Decoders/TableBasedImageDecoder.php b/vendor/intervention/gif/src/Decoders/TableBasedImageDecoder.php new file mode 100755 index 00000000..660a088f --- /dev/null +++ b/vendor/intervention/gif/src/Decoders/TableBasedImageDecoder.php @@ -0,0 +1,42 @@ +setImageDescriptor(ImageDescriptor::decode($this->handle)); + + if ($block->getImageDescriptor()->hasLocalColorTable()) { + $block->setColorTable( + ColorTable::decode( + $this->handle, + $block->getImageDescriptor()->getLocalColorTableByteSize() + ) + ); + } + + $block->setImageData( + ImageData::decode($this->handle) + ); + + return $block; + } +} diff --git a/vendor/intervention/gif/src/DisposalMethod.php b/vendor/intervention/gif/src/DisposalMethod.php new file mode 100755 index 00000000..7b05044f --- /dev/null +++ b/vendor/intervention/gif/src/DisposalMethod.php @@ -0,0 +1,13 @@ +source = $source; + } + + /** + * Encode current source + * + * @throws EncoderException + * @return string + */ + public function encode(): string + { + return implode('', [ + ApplicationExtension::MARKER, + ApplicationExtension::LABEL, + pack('C', $this->source->getBlockSize()), + $this->source->getApplication(), + implode('', array_map(fn(DataSubBlock $block): string => $block->encode(), $this->source->getBlocks())), + ApplicationExtension::TERMINATOR, + ]); + } +} diff --git a/vendor/intervention/gif/src/Encoders/ColorEncoder.php b/vendor/intervention/gif/src/Encoders/ColorEncoder.php new file mode 100755 index 00000000..1d5799c0 --- /dev/null +++ b/vendor/intervention/gif/src/Encoders/ColorEncoder.php @@ -0,0 +1,44 @@ +source = $source; + } + + /** + * Encode current source + * + * @return string + */ + public function encode(): string + { + return implode('', [ + $this->encodeColorValue($this->source->getRed()), + $this->encodeColorValue($this->source->getGreen()), + $this->encodeColorValue($this->source->getBlue()), + ]); + } + + /** + * Encode color value + * + * @return string + */ + protected function encodeColorValue(int $value): string + { + return pack('C', $value); + } +} diff --git a/vendor/intervention/gif/src/Encoders/ColorTableEncoder.php b/vendor/intervention/gif/src/Encoders/ColorTableEncoder.php new file mode 100755 index 00000000..a54dcd18 --- /dev/null +++ b/vendor/intervention/gif/src/Encoders/ColorTableEncoder.php @@ -0,0 +1,36 @@ +source = $source; + } + + /** + * Encode current source + * + * @throws EncoderException + * @return string + */ + public function encode(): string + { + return implode('', array_map( + fn(Color $color): string => $color->encode(), + $this->source->getColors(), + )); + } +} diff --git a/vendor/intervention/gif/src/Encoders/CommentExtensionEncoder.php b/vendor/intervention/gif/src/Encoders/CommentExtensionEncoder.php new file mode 100755 index 00000000..0bd56314 --- /dev/null +++ b/vendor/intervention/gif/src/Encoders/CommentExtensionEncoder.php @@ -0,0 +1,47 @@ +source = $source; + } + + /** + * Encode current source + * + * @return string + */ + public function encode(): string + { + return implode('', [ + CommentExtension::MARKER, + CommentExtension::LABEL, + $this->encodeComments(), + CommentExtension::TERMINATOR, + ]); + } + + /** + * Encode comment blocks + * + * @return string + */ + protected function encodeComments(): string + { + return implode('', array_map(function (string $comment): string { + return pack('C', strlen($comment)) . $comment; + }, $this->source->getComments())); + } +} diff --git a/vendor/intervention/gif/src/Encoders/DataSubBlockEncoder.php b/vendor/intervention/gif/src/Encoders/DataSubBlockEncoder.php new file mode 100755 index 00000000..a1474693 --- /dev/null +++ b/vendor/intervention/gif/src/Encoders/DataSubBlockEncoder.php @@ -0,0 +1,30 @@ +source = $source; + } + + /** + * Encode current source + * + * @return string + */ + public function encode(): string + { + return pack('C', $this->source->getSize()) . $this->source->getValue(); + } +} diff --git a/vendor/intervention/gif/src/Encoders/FrameBlockEncoder.php b/vendor/intervention/gif/src/Encoders/FrameBlockEncoder.php new file mode 100755 index 00000000..b74f1c3a --- /dev/null +++ b/vendor/intervention/gif/src/Encoders/FrameBlockEncoder.php @@ -0,0 +1,49 @@ +source = $source; + } + + /** + * @throws EncoderException + */ + public function encode(): string + { + $graphicControlExtension = $this->source->getGraphicControlExtension(); + $colorTable = $this->source->getColorTable(); + $plainTextExtension = $this->source->getPlainTextExtension(); + + return implode('', [ + implode('', array_map( + fn(ApplicationExtension $extension): string => $extension->encode(), + $this->source->getApplicationExtensions(), + )), + implode('', array_map( + fn(CommentExtension $extension): string => $extension->encode(), + $this->source->getCommentExtensions(), + )), + $plainTextExtension ? $plainTextExtension->encode() : '', + $graphicControlExtension ? $graphicControlExtension->encode() : '', + $this->source->getImageDescriptor()->encode(), + $colorTable ? $colorTable->encode() : '', + $this->source->getImageData()->encode(), + ]); + } +} diff --git a/vendor/intervention/gif/src/Encoders/GifDataStreamEncoder.php b/vendor/intervention/gif/src/Encoders/GifDataStreamEncoder.php new file mode 100755 index 00000000..4e691383 --- /dev/null +++ b/vendor/intervention/gif/src/Encoders/GifDataStreamEncoder.php @@ -0,0 +1,78 @@ +source = $source; + } + + /** + * Encode current source + * + * @throws EncoderException + * @return string + */ + public function encode(): string + { + return implode('', [ + $this->source->getHeader()->encode(), + $this->source->getLogicalScreenDescriptor()->encode(), + $this->maybeEncodeGlobalColorTable(), + $this->encodeFrames(), + $this->encodeComments(), + $this->source->getTrailer()->encode(), + ]); + } + + protected function maybeEncodeGlobalColorTable(): string + { + if (!$this->source->hasGlobalColorTable()) { + return ''; + } + + return $this->source->getGlobalColorTable()->encode(); + } + + /** + * Encode data blocks of source + * + * @throws EncoderException + * @return string + */ + protected function encodeFrames(): string + { + return implode('', array_map( + fn(FrameBlock $frame): string => $frame->encode(), + $this->source->getFrames(), + )); + } + + /** + * Encode comment extension blocks of source + * + * @throws EncoderException + * @return string + */ + protected function encodeComments(): string + { + return implode('', array_map( + fn(CommentExtension $commentExtension): string => $commentExtension->encode(), + $this->source->getComments() + )); + } +} diff --git a/vendor/intervention/gif/src/Encoders/GraphicControlExtensionEncoder.php b/vendor/intervention/gif/src/Encoders/GraphicControlExtensionEncoder.php new file mode 100755 index 00000000..eef4e9af --- /dev/null +++ b/vendor/intervention/gif/src/Encoders/GraphicControlExtensionEncoder.php @@ -0,0 +1,73 @@ +source = $source; + } + + /** + * Encode current source + * + * @return string + */ + public function encode(): string + { + return implode('', [ + GraphicControlExtension::MARKER, + GraphicControlExtension::LABEL, + GraphicControlExtension::BLOCKSIZE, + $this->encodePackedField(), + $this->encodeDelay(), + $this->encodeTransparentColorIndex(), + GraphicControlExtension::TERMINATOR, + ]); + } + + /** + * Encode delay time + * + * @return string + */ + protected function encodeDelay(): string + { + return pack('v*', $this->source->getDelay()); + } + + /** + * Encode transparent color index + * + * @return string + */ + protected function encodeTransparentColorIndex(): string + { + return pack('C', $this->source->getTransparentColorIndex()); + } + + /** + * Encode packed field + * + * @return string + */ + protected function encodePackedField(): string + { + return pack('C', bindec(implode('', [ + str_pad('0', 3, '0', STR_PAD_LEFT), + str_pad(decbin($this->source->getDisposalMethod()->value), 3, '0', STR_PAD_LEFT), + (int) $this->source->getUserInput(), + (int) $this->source->getTransparentColorExistance(), + ]))); + } +} diff --git a/vendor/intervention/gif/src/Encoders/HeaderEncoder.php b/vendor/intervention/gif/src/Encoders/HeaderEncoder.php new file mode 100755 index 00000000..336ce8bc --- /dev/null +++ b/vendor/intervention/gif/src/Encoders/HeaderEncoder.php @@ -0,0 +1,30 @@ +source = $source; + } + + /** + * Encode current source + * + * @return string + */ + public function encode(): string + { + return Header::SIGNATURE . $this->source->getVersion(); + } +} diff --git a/vendor/intervention/gif/src/Encoders/ImageDataEncoder.php b/vendor/intervention/gif/src/Encoders/ImageDataEncoder.php new file mode 100755 index 00000000..f601911a --- /dev/null +++ b/vendor/intervention/gif/src/Encoders/ImageDataEncoder.php @@ -0,0 +1,45 @@ +source = $source; + } + + /** + * Encode current source + * + * @throws EncoderException + * @return string + */ + public function encode(): string + { + if (!$this->source->hasBlocks()) { + throw new EncoderException("No data blocks in ImageData."); + } + + return implode('', [ + pack('C', $this->source->getLzwMinCodeSize()), + implode('', array_map( + fn(DataSubBlock $block): string => $block->encode(), + $this->source->getBlocks(), + )), + AbstractEntity::TERMINATOR, + ]); + } +} diff --git a/vendor/intervention/gif/src/Encoders/ImageDescriptorEncoder.php b/vendor/intervention/gif/src/Encoders/ImageDescriptorEncoder.php new file mode 100755 index 00000000..2566a106 --- /dev/null +++ b/vendor/intervention/gif/src/Encoders/ImageDescriptorEncoder.php @@ -0,0 +1,113 @@ +source = $source; + } + + /** + * Encode current source + * + * @return string + */ + public function encode(): string + { + return implode('', [ + ImageDescriptor::SEPARATOR, + $this->encodeLeft(), + $this->encodeTop(), + $this->encodeWidth(), + $this->encodeHeight(), + $this->encodePackedField(), + ]); + } + + /** + * Encode left value + * + * @return string + */ + protected function encodeLeft(): string + { + return pack('v*', $this->source->getLeft()); + } + + /** + * Encode top value + * + * @return string + */ + protected function encodeTop(): string + { + return pack('v*', $this->source->getTop()); + } + + /** + * Encode width value + * + * @return string + */ + protected function encodeWidth(): string + { + return pack('v*', $this->source->getWidth()); + } + + /** + * Encode height value + * + * @return string + */ + protected function encodeHeight(): string + { + return pack('v*', $this->source->getHeight()); + } + + /** + * Encode size of local color table + * + * @return string + */ + protected function encodeLocalColorTableSize(): string + { + return str_pad(decbin($this->source->getLocalColorTableSize()), 3, '0', STR_PAD_LEFT); + } + + /** + * Encode reserved field + * + * @return string + */ + protected function encodeReservedField(): string + { + return str_pad('0', 2, '0', STR_PAD_LEFT); + } + + /** + * Encode packed field + * + * @return string + */ + protected function encodePackedField(): string + { + return pack('C', bindec(implode('', [ + (int) $this->source->getLocalColorTableExistance(), + (int) $this->source->isInterlaced(), + (int) $this->source->getLocalColorTableSorted(), + $this->encodeReservedField(), + $this->encodeLocalColorTableSize(), + ]))); + } +} diff --git a/vendor/intervention/gif/src/Encoders/LogicalScreenDescriptorEncoder.php b/vendor/intervention/gif/src/Encoders/LogicalScreenDescriptorEncoder.php new file mode 100755 index 00000000..b9404163 --- /dev/null +++ b/vendor/intervention/gif/src/Encoders/LogicalScreenDescriptorEncoder.php @@ -0,0 +1,111 @@ +source = $source; + } + + /** + * Encode current source + * + * @return string + */ + public function encode(): string + { + return implode('', [ + $this->encodeWidth(), + $this->encodeHeight(), + $this->encodePackedField(), + $this->encodeBackgroundColorIndex(), + $this->encodePixelAspectRatio(), + ]); + } + + /** + * Encode width of current instance + * + * @return string + */ + protected function encodeWidth(): string + { + return pack('v*', $this->source->getWidth()); + } + + /** + * Encode height of current instance + * + * @return string + */ + protected function encodeHeight(): string + { + return pack('v*', $this->source->getHeight()); + } + + /** + * Encode background color index of global color table + * + * @return string + */ + protected function encodeBackgroundColorIndex(): string + { + return pack('C', $this->source->getBackgroundColorIndex()); + } + + /** + * Encode pixel aspect ratio + * + * @return string + */ + protected function encodePixelAspectRatio(): string + { + return pack('C', $this->source->getPixelAspectRatio()); + } + + /** + * Return color resolution for encoding + * + * @return string + */ + protected function encodeColorResolution(): string + { + return str_pad(decbin($this->source->getBitsPerPixel() - 1), 3, '0', STR_PAD_LEFT); + } + + /** + * Encode size of global color table + * + * @return string + */ + protected function encodeGlobalColorTableSize(): string + { + return str_pad(decbin($this->source->getGlobalColorTableSize()), 3, '0', STR_PAD_LEFT); + } + + /** + * Encode packed field of current instance + * + * @return string + */ + protected function encodePackedField(): string + { + return pack('C', bindec(implode('', [ + (int) $this->source->getGlobalColorTableExistance(), + $this->encodeColorResolution(), + (int) $this->source->getGlobalColorTableSorted(), + $this->encodeGlobalColorTableSize(), + ]))); + } +} diff --git a/vendor/intervention/gif/src/Encoders/NetscapeApplicationExtensionEncoder.php b/vendor/intervention/gif/src/Encoders/NetscapeApplicationExtensionEncoder.php new file mode 100755 index 00000000..a280e185 --- /dev/null +++ b/vendor/intervention/gif/src/Encoders/NetscapeApplicationExtensionEncoder.php @@ -0,0 +1,39 @@ +source = $source; + } + + /** + * Encode current source + * + * @return string + */ + public function encode(): string + { + return implode('', [ + ApplicationExtension::MARKER, + ApplicationExtension::LABEL, + pack('C', $this->source->getBlockSize()), + $this->source->getApplication(), + implode('', array_map(fn(DataSubBlock $block): string => $block->encode(), $this->source->getBlocks())), + ApplicationExtension::TERMINATOR, + ]); + } +} diff --git a/vendor/intervention/gif/src/Encoders/PlainTextExtensionEncoder.php b/vendor/intervention/gif/src/Encoders/PlainTextExtensionEncoder.php new file mode 100755 index 00000000..9ddd6fb9 --- /dev/null +++ b/vendor/intervention/gif/src/Encoders/PlainTextExtensionEncoder.php @@ -0,0 +1,63 @@ +source = $source; + } + + /** + * Encode current source + * + * @return string + */ + public function encode(): string + { + if (!$this->source->hasText()) { + return ''; + } + + return implode('', [ + PlainTextExtension::MARKER, + PlainTextExtension::LABEL, + $this->encodeHead(), + $this->encodeTexts(), + PlainTextExtension::TERMINATOR, + ]); + } + + /** + * Encode head block + * + * @return string + */ + protected function encodeHead(): string + { + return "\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"; + } + + /** + * Encode text chunks + * + * @return string + */ + protected function encodeTexts(): string + { + return implode('', array_map( + fn(string $text): string => pack('C', strlen($text)) . $text, + $this->source->getText(), + )); + } +} diff --git a/vendor/intervention/gif/src/Encoders/TableBasedImageEncoder.php b/vendor/intervention/gif/src/Encoders/TableBasedImageEncoder.php new file mode 100755 index 00000000..1f3867ce --- /dev/null +++ b/vendor/intervention/gif/src/Encoders/TableBasedImageEncoder.php @@ -0,0 +1,29 @@ +source = $source; + } + + public function encode(): string + { + return implode('', [ + $this->source->getImageDescriptor()->encode(), + $this->source->getColorTable() ? $this->source->getColorTable()->encode() : '', + $this->source->getImageData()->encode(), + ]); + } +} diff --git a/vendor/intervention/gif/src/Encoders/TrailerEncoder.php b/vendor/intervention/gif/src/Encoders/TrailerEncoder.php new file mode 100755 index 00000000..c24b8a64 --- /dev/null +++ b/vendor/intervention/gif/src/Encoders/TrailerEncoder.php @@ -0,0 +1,30 @@ +source = $source; + } + + /** + * Encode current source + * + * @return string + */ + public function encode(): string + { + return Trailer::MARKER; + } +} diff --git a/vendor/intervention/gif/src/Exceptions/DecoderException.php b/vendor/intervention/gif/src/Exceptions/DecoderException.php new file mode 100755 index 00000000..7b4650e2 --- /dev/null +++ b/vendor/intervention/gif/src/Exceptions/DecoderException.php @@ -0,0 +1,9 @@ + $frames + * @param array $comments + * @return void + */ + public function __construct( + protected Header $header = new Header(), + protected LogicalScreenDescriptor $logicalScreenDescriptor = new LogicalScreenDescriptor(), + protected ?ColorTable $globalColorTable = null, + protected array $frames = [], + protected array $comments = [] + ) { + } + + /** + * Get header + * + * @return Header + */ + public function getHeader(): Header + { + return $this->header; + } + + /** + * Set header + * + * @param Header $header + */ + public function setHeader(Header $header): self + { + $this->header = $header; + + return $this; + } + + /** + * Get logical screen descriptor + * + * @return LogicalScreenDescriptor + */ + public function getLogicalScreenDescriptor(): LogicalScreenDescriptor + { + return $this->logicalScreenDescriptor; + } + + /** + * Set logical screen descriptor + * + * @param LogicalScreenDescriptor $descriptor + * @return GifDataStream + */ + public function setLogicalScreenDescriptor(LogicalScreenDescriptor $descriptor): self + { + $this->logicalScreenDescriptor = $descriptor; + + return $this; + } + + /** + * Return global color table if available else null + * + * @return null|ColorTable + */ + public function getGlobalColorTable(): ?ColorTable + { + return $this->globalColorTable; + } + + /** + * Set global color table + * + * @param ColorTable $table + * @return GifDataStream + */ + public function setGlobalColorTable(ColorTable $table): self + { + $this->globalColorTable = $table; + $this->logicalScreenDescriptor->setGlobalColorTableExistance(true); + $this->logicalScreenDescriptor->setGlobalColorTableSize( + $table->getLogicalSize() + ); + + return $this; + } + + /** + * Get main graphic control extension + * + * @return NetscapeApplicationExtension + */ + public function getMainApplicationExtension(): ?NetscapeApplicationExtension + { + foreach ($this->frames as $frame) { + if ($extension = $frame->getNetscapeExtension()) { + return $extension; + } + } + + return null; + } + + /** + * Get array of frames + * + * @return array + */ + public function getFrames(): array + { + return $this->frames; + } + + /** + * Return array of "global" comments + * + * @return array + */ + public function getComments(): array + { + return $this->comments; + } + + /** + * Return first frame + * + * @return null|FrameBlock + */ + public function getFirstFrame(): ?FrameBlock + { + if (!array_key_exists(0, $this->frames)) { + return null; + } + + return $this->frames[0]; + } + + /** + * Add frame + * + * @param FrameBlock $frame + * @return GifDataStream + */ + public function addFrame(FrameBlock $frame): self + { + $this->frames[] = $frame; + + return $this; + } + + /** + * Add comment extension + * + * @param CommentExtension $comment + * @return GifDataStream + */ + public function addComment(CommentExtension $comment): self + { + $this->comments[] = $comment; + + return $this; + } + + /** + * Set the current data + * + * @param array $frames + */ + public function setFrames(array $frames): self + { + $this->frames = $frames; + + return $this; + } + + /** + * Get trailer + * + * @return Trailer + */ + public function getTrailer(): Trailer + { + return new Trailer(); + } + + /** + * Determine if gif is animated + * + * @return bool + */ + public function isAnimated(): bool + { + return count($this->getFrames()) > 1; + } + + /** + * Determine if global color table is set + * + * @return bool + */ + public function hasGlobalColorTable(): bool + { + return !is_null($this->globalColorTable); + } +} diff --git a/vendor/intervention/gif/src/Splitter.php b/vendor/intervention/gif/src/Splitter.php new file mode 100755 index 00000000..6377093f --- /dev/null +++ b/vendor/intervention/gif/src/Splitter.php @@ -0,0 +1,283 @@ + + */ +class Splitter implements IteratorAggregate +{ + /** + * Single frames resolved to GifDataStream + * + * @var array + */ + protected array $frames = []; + + /** + * Delays of each frame + * + * @var array + */ + protected array $delays = []; + + /** + * Create new instance + * + * @param GifDataStream $stream + */ + public function __construct(protected GifDataStream $stream) + { + // + } + + /** + * Iterator + * + * @return Traversable + */ + public function getIterator(): Traversable + { + return new ArrayIterator($this->frames); + } + + /** + * Get frames + * + * @return array + */ + public function getFrames(): array + { + return $this->frames; + } + + /** + * Get delays + * + * @return array + */ + public function getDelays(): array + { + return $this->delays; + } + + /** + * Set stream of instance + * + * @param GifDataStream $stream + */ + public function setStream(GifDataStream $stream): self + { + $this->stream = $stream; + + return $this; + } + + /** + * Static constructor method + * + * @param GifDataStream $stream + * @return Splitter + */ + public static function create(GifDataStream $stream): self + { + return new self($stream); + } + + /** + * Split current stream into array of seperate streams for each frame + * + * @return Splitter + */ + public function split(): self + { + $this->frames = []; + + foreach ($this->stream->getFrames() as $frame) { + // create separate stream for each frame + $gif = Builder::canvas( + $this->stream->getLogicalScreenDescriptor()->getWidth(), + $this->stream->getLogicalScreenDescriptor()->getHeight() + )->getGifDataStream(); + + // check if working stream has global color table + if ($this->stream->hasGlobalColorTable()) { + $gif->setGlobalColorTable($this->stream->getGlobalColorTable()); + $gif->getLogicalScreenDescriptor()->setGlobalColorTableExistance(true); + + $gif->getLogicalScreenDescriptor()->setGlobalColorTableSorted( + $this->stream->getLogicalScreenDescriptor()->getGlobalColorTableSorted() + ); + + $gif->getLogicalScreenDescriptor()->setGlobalColorTableSize( + $this->stream->getLogicalScreenDescriptor()->getGlobalColorTableSize() + ); + + $gif->getLogicalScreenDescriptor()->setBackgroundColorIndex( + $this->stream->getLogicalScreenDescriptor()->getBackgroundColorIndex() + ); + + $gif->getLogicalScreenDescriptor()->setPixelAspectRatio( + $this->stream->getLogicalScreenDescriptor()->getPixelAspectRatio() + ); + + $gif->getLogicalScreenDescriptor()->setBitsPerPixel( + $this->stream->getLogicalScreenDescriptor()->getBitsPerPixel() + ); + } + + // copy original frame + $gif->addFrame($frame); + + $this->frames[] = $gif; + $this->delays[] = match (is_object($frame->getGraphicControlExtension())) { + true => $frame->getGraphicControlExtension()->getDelay(), + default => 0, + }; + } + + return $this; + } + + /** + * Return array of GD library resources for each frame + * + * @throws EncoderException + * @return array + */ + public function toResources(): array + { + $resources = []; + + foreach ($this->frames as $frame) { + $resource = imagecreatefromstring($frame->encode()); + imagepalettetotruecolor($resource); + imagesavealpha($resource, true); + $resources[] = $resource; + } + + return $resources; + } + + /** + * Return array of coalesced GD library resources for each frame + * + * @throws EncoderException + * @return array + */ + public function coalesceToResources(): array + { + $resources = $this->toResources(); + + // static gif files don't need to be coalesced + if (count($resources) === 1) { + return $resources; + } + + $width = imagesx($resources[0]); + $height = imagesy($resources[0]); + $transparent = imagecolortransparent($resources[0]); + + foreach ($resources as $key => $resource) { + // get meta data + $gif = $this->frames[$key]; + $descriptor = $gif->getFirstFrame()->getImageDescriptor(); + $offset_x = $descriptor->getLeft(); + $offset_y = $descriptor->getTop(); + $w = $descriptor->getWidth(); + $h = $descriptor->getHeight(); + + if (in_array($this->getDisposalMethod($gif), [DisposalMethod::NONE, DisposalMethod::PREVIOUS])) { + if ($key >= 1) { + // create normalized gd image + $canvas = imagecreatetruecolor($width, $height); + if (imagecolortransparent($resource) != -1) { + $transparent = imagecolortransparent($resource); + } else { + $transparent = imagecolorallocatealpha($resource, 255, 0, 255, 127); + } + + // fill with transparent + imagefill($canvas, 0, 0, $transparent); + imagecolortransparent($canvas, $transparent); + imagealphablending($canvas, true); + + // insert last as base + imagecopy( + $canvas, + $resources[$key - 1], + 0, + 0, + 0, + 0, + $width, + $height + ); + + // insert resource + imagecopy( + $canvas, + $resource, + $offset_x, + $offset_y, + 0, + 0, + $w, + $h + ); + } else { + imagealphablending($resource, true); + $canvas = $resource; + } + } else { + // create normalized gd image + $canvas = imagecreatetruecolor($width, $height); + if (imagecolortransparent($resource) != -1) { + $transparent = imagecolortransparent($resource); + } else { + $transparent = imagecolorallocatealpha($resource, 255, 0, 255, 127); + } + + // fill with transparent + imagefill($canvas, 0, 0, $transparent); + imagecolortransparent($canvas, $transparent); + imagealphablending($canvas, true); + + // insert frame resource + imagecopy( + $canvas, + $resource, + $offset_x, + $offset_y, + 0, + 0, + $w, + $h + ); + } + + $resources[$key] = $canvas; + } + + return $resources; + } + + /** + * Find and return disposal method of given gif data stream + * + * @param GifDataStream $gif + * @return DisposalMethod + */ + private function getDisposalMethod(GifDataStream $gif): DisposalMethod + { + return $gif->getFirstFrame()->getGraphicControlExtension()->getDisposalMethod(); + } +} diff --git a/vendor/intervention/gif/src/Traits/CanDecode.php b/vendor/intervention/gif/src/Traits/CanDecode.php new file mode 100755 index 00000000..0a9109f6 --- /dev/null +++ b/vendor/intervention/gif/src/Traits/CanDecode.php @@ -0,0 +1,53 @@ +decode(); + } + + /** + * Get decoder for current instance + * + * @param resource $source + * @param null|int $length + * @throws DecoderException + * @return AbstractDecoder + */ + protected static function getDecoder($source, ?int $length = null): AbstractDecoder + { + $classname = self::getDecoderClassname(); + + if (!class_exists($classname)) { + throw new DecoderException("Decoder for '" . static::class . "' not found."); + } + + return new $classname($source, $length); + } + + /** + * Get classname of decoder for current classname + * + * @return string + */ + protected static function getDecoderClassname(): string + { + return sprintf('Intervention\Gif\Decoders\%sDecoder', self::getShortClassname()); + } +} diff --git a/vendor/intervention/gif/src/Traits/CanEncode.php b/vendor/intervention/gif/src/Traits/CanEncode.php new file mode 100755 index 00000000..3ff546ec --- /dev/null +++ b/vendor/intervention/gif/src/Traits/CanEncode.php @@ -0,0 +1,49 @@ +getEncoder()->encode(); + } + + /** + * Get encoder object for current entity + * + * @throws EncoderException + * @return AbstractEncoder + */ + protected function getEncoder(): AbstractEncoder + { + $classname = $this->getEncoderClassname(); + + if (!class_exists($classname)) { + throw new EncoderException("Encoder for '" . $this::class . "' not found."); + } + + return new $classname($this); + } + + /** + * Get encoder classname for current entity + * + * @return string + */ + protected function getEncoderClassname(): string + { + return sprintf('Intervention\Gif\Encoders\%sEncoder', $this->getShortClassname()); + } +} diff --git a/vendor/intervention/gif/src/Traits/CanHandleFiles.php b/vendor/intervention/gif/src/Traits/CanHandleFiles.php new file mode 100755 index 00000000..21ce0c84 --- /dev/null +++ b/vendor/intervention/gif/src/Traits/CanHandleFiles.php @@ -0,0 +1,56 @@ + + */ +class Collection implements CollectionInterface, IteratorAggregate, Countable +{ + /** + * Create new collection object + * + * @param array $items + * @return void + */ + public function __construct(protected array $items = []) + { + // + } + + /** + * Static constructor + * + * @param array $items + * @return self + */ + public static function create(array $items = []): self + { + return new self($items); + } + + /** + * {@inheritdoc} + * + * @see CollectionInterface::has() + */ + public function has(int|string $key): bool + { + return array_key_exists($key, $this->items); + } + + /** + * Returns Iterator + * + * @return Traversable + */ + public function getIterator(): Traversable + { + return new ArrayIterator($this->items); + } + + /** + * {@inheritdoc} + * + * @see CollectionInterface::toArray() + */ + public function toArray(): array + { + return $this->items; + } + + /** + * Count items in collection + */ + public function count(): int + { + return count($this->items); + } + + /** + * Append new item to collection + * + * @return CollectionInterface + */ + public function push(mixed $item): CollectionInterface + { + $this->items[] = $item; + + return $this; + } + + /** + * Return first item in collection + */ + public function first(): mixed + { + if ($item = reset($this->items)) { + return $item; + } + + return null; + } + + /** + * Returns last item in collection + */ + public function last(): mixed + { + if ($item = end($this->items)) { + return $item; + } + + return null; + } + + /** + * Return item at given position starting at 0 + */ + public function getAtPosition(int $key = 0, mixed $default = null): mixed + { + if ($this->count() == 0) { + return $default; + } + + $positions = array_values($this->items); + if (!array_key_exists($key, $positions)) { + return $default; + } + + return $positions[$key]; + } + + /** + * {@inheritdoc} + * + * @see CollectionInterface::get() + */ + public function get(int|string $query, mixed $default = null): mixed + { + if ($this->count() == 0) { + return $default; + } + + if (is_int($query) && array_key_exists($query, $this->items)) { + return $this->items[$query]; + } + + if (is_string($query) && !str_contains($query, '.')) { + return array_key_exists($query, $this->items) ? $this->items[$query] : $default; + } + + $query = explode('.', (string) $query); + + $result = $default; + $items = $this->items; + foreach ($query as $key) { + if (!is_array($items) || !array_key_exists($key, $items)) { + $result = $default; + break; + } + + $result = $items[$key]; + $items = $result; + } + + return $result; + } + + /** + * Map each item of collection by given callback + */ + public function map(callable $callback): self + { + + return new self( + array_map( + fn(mixed $item) => $callback($item), + $this->items, + ) + ); + } + + /** + * Run callback on each item of the collection an remove it if it does not return true + */ + public function filter(callable $callback): self + { + return new self( + array_filter( + $this->items, + fn(mixed $item) => $callback($item), + ) + ); + } + + /** + * {@inheritdoc} + * + * @see CollectionInterface::empty() + */ + public function empty(): CollectionInterface + { + $this->items = []; + + return $this; + } + + /** + * {@inheritdoc} + * + * @see CollectionInterface::slice() + */ + public function slice(int $offset, ?int $length = null): CollectionInterface + { + $this->items = array_slice($this->items, $offset, $length); + + return $this; + } +} diff --git a/vendor/intervention/image/src/Colors/AbstractColor.php b/vendor/intervention/image/src/Colors/AbstractColor.php new file mode 100755 index 00000000..9628795e --- /dev/null +++ b/vendor/intervention/image/src/Colors/AbstractColor.php @@ -0,0 +1,116 @@ + + */ + protected array $channels; + + /** + * {@inheritdoc} + * + * @see ColorInterface::channels() + */ + public function channels(): array + { + return $this->channels; + } + + /** + * {@inheritdoc} + * + * @see ColorInterface::channel() + */ + public function channel(string $classname): ColorChannelInterface + { + $channels = array_filter( + $this->channels(), + fn(ColorChannelInterface $channel): bool => $channel::class === $classname, + ); + + if (count($channels) == 0) { + throw new ColorException('Color channel ' . $classname . ' could not be found.'); + } + + return reset($channels); + } + + /** + * {@inheritdoc} + * + * @see ColorInterface::normalize() + */ + public function normalize(): array + { + return array_map( + fn(ColorChannelInterface $channel): float => $channel->normalize(), + $this->channels(), + ); + } + + /** + * {@inheritdoc} + * + * @see ColorInterface::toArray() + */ + public function toArray(): array + { + return array_map( + fn(ColorChannelInterface $channel): int => $channel->value(), + $this->channels() + ); + } + + /** + * {@inheritdoc} + * + * @see ColorInterface::convertTo() + */ + public function convertTo(string|ColorspaceInterface $colorspace): ColorInterface + { + $colorspace = match (true) { + is_object($colorspace) => $colorspace, + default => new $colorspace(), + }; + + return $colorspace->importColor($this); + } + + /** + * Show debug info for the current color + * + * @return array + */ + public function __debugInfo(): array + { + return array_reduce($this->channels(), function (array $result, ColorChannelInterface $item) { + $key = strtolower((new ReflectionClass($item))->getShortName()); + $result[$key] = $item->value(); + return $result; + }, []); + } + + /** + * {@inheritdoc} + * + * @see ColorInterface::__toString() + */ + public function __toString(): string + { + return $this->toString(); + } +} diff --git a/vendor/intervention/image/src/Colors/AbstractColorChannel.php b/vendor/intervention/image/src/Colors/AbstractColorChannel.php new file mode 100755 index 00000000..5c529092 --- /dev/null +++ b/vendor/intervention/image/src/Colors/AbstractColorChannel.php @@ -0,0 +1,92 @@ +value = $this->validate( + match (true) { + is_null($value) && is_numeric($normalized) => intval(round($normalized * $this->max())), + is_numeric($value) && is_null($normalized) => $value, + default => throw new ColorException('Color channels must either have a value or a normalized value') + } + ); + } + + /** + * Alias of value() + */ + public function toInt(): int + { + return $this->value; + } + + /** + * {@inheritdoc} + * + * @see ColorChannelInterface::value() + */ + public function value(): int + { + return $this->value; + } + + /** + * {@inheritdoc} + * + * @see ColorChannelInterface::normalize() + */ + public function normalize(int $precision = 32): float + { + return round(($this->value() - $this->min()) / ($this->max() - $this->min()), $precision); + } + + /** + * {@inheritdoc} + * + * @see ColorChannelInterface::validate() + */ + public function validate(mixed $value): mixed + { + if ($value < $this->min() || $value > $this->max()) { + throw new ColorException('Color channel value must be in range ' . $this->min() . ' to ' . $this->max()); + } + + return $value; + } + + /** + * {@inheritdoc} + * + * @see ColorChannelInterface::toString() + */ + public function toString(): string + { + return (string) $this->value(); + } + + /** + * {@inheritdoc} + * + * @see ColorChannelInterface::__toString() + */ + public function __toString(): string + { + return $this->toString(); + } +} diff --git a/vendor/intervention/image/src/Colors/Cmyk/Channels/Cyan.php b/vendor/intervention/image/src/Colors/Cmyk/Channels/Cyan.php new file mode 100755 index 00000000..f56b095c --- /dev/null +++ b/vendor/intervention/image/src/Colors/Cmyk/Channels/Cyan.php @@ -0,0 +1,20 @@ +channels = [ + new Cyan($c), + new Magenta($m), + new Yellow($y), + new Key($k), + ]; + } + + /** + * {@inheritdoc} + * + * @see ColorInterface::create() + */ + public static function create(mixed $input): ColorInterface + { + return InputHandler::withDecoders([ + Decoders\StringColorDecoder::class, + ])->handle($input); + } + + /** + * {@inheritdoc} + * + * @see ColorInterface::colorspace() + */ + public function colorspace(): ColorspaceInterface + { + return new Colorspace(); + } + + /** + * {@inheritdoc} + * + * @see ColorInterface::toHex() + */ + public function toHex(string $prefix = ''): string + { + return $this->convertTo(RgbColorspace::class)->toHex($prefix); + } + + /** + * Return the CMYK cyan channel + */ + public function cyan(): ColorChannelInterface + { + /** @throws void */ + return $this->channel(Cyan::class); + } + + /** + * Return the CMYK magenta channel + */ + public function magenta(): ColorChannelInterface + { + /** @throws void */ + return $this->channel(Magenta::class); + } + + /** + * Return the CMYK yellow channel + */ + public function yellow(): ColorChannelInterface + { + /** @throws void */ + return $this->channel(Yellow::class); + } + + /** + * Return the CMYK key channel + */ + public function key(): ColorChannelInterface + { + /** @throws void */ + return $this->channel(Key::class); + } + + /** + * {@inheritdoc} + * + * @see ColorInterface::toString() + */ + public function toString(): string + { + return sprintf( + 'cmyk(%d%%, %d%%, %d%%, %d%%)', + $this->cyan()->value(), + $this->magenta()->value(), + $this->yellow()->value(), + $this->key()->value() + ); + } + + /** + * {@inheritdoc} + * + * @see ColorInterface::isGreyscale() + */ + public function isGreyscale(): bool + { + return 0 === array_sum([ + $this->cyan()->value(), + $this->magenta()->value(), + $this->yellow()->value(), + ]); + } + + /** + * {@inheritdoc} + * + * @see ColorInterface::isTransparent() + */ + public function isTransparent(): bool + { + return false; + } + + /** + * {@inheritdoc} + * + * @see ColorInterface::isClear() + */ + public function isClear(): bool + { + return false; + } +} diff --git a/vendor/intervention/image/src/Colors/Cmyk/Colorspace.php b/vendor/intervention/image/src/Colors/Cmyk/Colorspace.php new file mode 100755 index 00000000..4484ef7c --- /dev/null +++ b/vendor/intervention/image/src/Colors/Cmyk/Colorspace.php @@ -0,0 +1,77 @@ + + */ + public static array $channels = [ + Channels\Cyan::class, + Channels\Magenta::class, + Channels\Yellow::class, + Channels\Key::class + ]; + + /** + * {@inheritdoc} + * + * @see ColorspaceInterface::createColor() + */ + public function colorFromNormalized(array $normalized): ColorInterface + { + return new Color(...array_map( + fn(string $classname, float $value_normalized) => (new $classname(normalized: $value_normalized))->value(), + self::$channels, + $normalized, + )); + } + + /** + * @throws ColorException + */ + public function importColor(ColorInterface $color): ColorInterface + { + return match ($color::class) { + RgbColor::class => $this->importRgbColor($color), + HsvColor::class => $this->importRgbColor($color->convertTo(RgbColorspace::class)), + HslColor::class => $this->importRgbColor($color->convertTo(RgbColorspace::class)), + default => $color, + }; + } + + /** + * @throws ColorException + */ + protected function importRgbColor(ColorInterface $color): CmykColor + { + if (!($color instanceof RgbColor)) { + throw new ColorException('Unabled to import color of type ' . $color::class . '.'); + } + + $c = (255 - $color->red()->value()) / 255.0 * 100; + $m = (255 - $color->green()->value()) / 255.0 * 100; + $y = (255 - $color->blue()->value()) / 255.0 * 100; + $k = intval(round(min([$c, $m, $y]))); + + $c = intval(round($c - $k)); + $m = intval(round($m - $k)); + $y = intval(round($y - $k)); + + return new CmykColor($c, $m, $y, $k); + } +} diff --git a/vendor/intervention/image/src/Colors/Cmyk/Decoders/StringColorDecoder.php b/vendor/intervention/image/src/Colors/Cmyk/Decoders/StringColorDecoder.php new file mode 100755 index 00000000..e160f2e3 --- /dev/null +++ b/vendor/intervention/image/src/Colors/Cmyk/Decoders/StringColorDecoder.php @@ -0,0 +1,36 @@ +[0-9\.]+%?), ?(?P[0-9\.]+%?), ?(?P[0-9\.]+%?), ?(?P[0-9\.]+%?)\)$/i'; + if (preg_match($pattern, $input, $matches) != 1) { + throw new DecoderException('Unable to decode input'); + } + + $values = array_map(function (string $value): int { + return intval(round(floatval(trim(str_replace('%', '', $value))))); + }, [$matches['c'], $matches['m'], $matches['y'], $matches['k']]); + + return new Color(...$values); + } +} diff --git a/vendor/intervention/image/src/Colors/Hsl/Channels/Hue.php b/vendor/intervention/image/src/Colors/Hsl/Channels/Hue.php new file mode 100755 index 00000000..049a849c --- /dev/null +++ b/vendor/intervention/image/src/Colors/Hsl/Channels/Hue.php @@ -0,0 +1,30 @@ +channels = [ + new Hue($h), + new Saturation($s), + new Luminance($l), + ]; + } + + /** + * {@inheritdoc} + * + * @see ColorInterface::colorspace() + */ + public function colorspace(): ColorspaceInterface + { + return new Colorspace(); + } + + /** + * {@inheritdoc} + * + * @see ColorInterface::create() + */ + public static function create(mixed $input): ColorInterface + { + return InputHandler::withDecoders([ + Decoders\StringColorDecoder::class, + ])->handle($input); + } + + /** + * Return the Hue channel + */ + public function hue(): ColorChannelInterface + { + /** @throws void */ + return $this->channel(Hue::class); + } + + /** + * Return the Saturation channel + */ + public function saturation(): ColorChannelInterface + { + /** @throws void */ + return $this->channel(Saturation::class); + } + + /** + * Return the Luminance channel + */ + public function luminance(): ColorChannelInterface + { + /** @throws void */ + return $this->channel(Luminance::class); + } + + public function toHex(string $prefix = ''): string + { + return $this->convertTo(RgbColorspace::class)->toHex($prefix); + } + + /** + * {@inheritdoc} + * + * @see ColorInterface::toString() + */ + public function toString(): string + { + return sprintf( + 'hsl(%d, %d%%, %d%%)', + $this->hue()->value(), + $this->saturation()->value(), + $this->luminance()->value() + ); + } + + /** + * {@inheritdoc} + * + * @see ColorInterface::isGreyscale() + */ + public function isGreyscale(): bool + { + return $this->saturation()->value() == 0; + } + + /** + * {@inheritdoc} + * + * @see ColorInterface::isTransparent() + */ + public function isTransparent(): bool + { + return false; + } + + /** + * {@inheritdoc} + * + * @see ColorInterface::isClear() + */ + public function isClear(): bool + { + return false; + } +} diff --git a/vendor/intervention/image/src/Colors/Hsl/Colorspace.php b/vendor/intervention/image/src/Colors/Hsl/Colorspace.php new file mode 100755 index 00000000..de4c2cf8 --- /dev/null +++ b/vendor/intervention/image/src/Colors/Hsl/Colorspace.php @@ -0,0 +1,137 @@ + + */ + public static array $channels = [ + Channels\Hue::class, + Channels\Saturation::class, + Channels\Luminance::class + ]; + + /** + * {@inheritdoc} + * + * @see ColorspaceInterface::colorFromNormalized() + */ + public function colorFromNormalized(array $normalized): ColorInterface + { + return new Color(...array_map( + fn(string $classname, float $value_normalized) => (new $classname(normalized: $value_normalized))->value(), + self::$channels, + $normalized + )); + } + + /** + * @throws ColorException + */ + public function importColor(ColorInterface $color): ColorInterface + { + return match ($color::class) { + CmykColor::class => $this->importRgbColor($color->convertTo(RgbColorspace::class)), + RgbColor::class => $this->importRgbColor($color), + HsvColor::class => $this->importHsvColor($color), + default => $color, + }; + } + + /** + * @throws ColorException + */ + protected function importRgbColor(ColorInterface $color): ColorInterface + { + if (!($color instanceof RgbColor)) { + throw new ColorException('Unabled to import color of type ' . $color::class . '.'); + } + + // normalized values of rgb channels + $values = array_map( + fn(ColorChannelInterface $channel): float => $channel->normalize(), + $color->channels(), + ); + + // take only RGB + $values = array_slice($values, 0, 3); + + // calculate Luminance + $min = min(...$values); + $max = max(...$values); + $luminance = ($max + $min) / 2; + $delta = $max - $min; + + // calculate saturation + $saturation = match (true) { + $delta == 0 => 0, + default => $delta / (1 - abs(2 * $luminance - 1)), + }; + + // calculate hue + [$r, $g, $b] = $values; + $hue = match (true) { + ($delta == 0) => 0, + ($max == $r) => 60 * fmod((($g - $b) / $delta), 6), + ($max == $g) => 60 * ((($b - $r) / $delta) + 2), + ($max == $b) => 60 * ((($r - $g) / $delta) + 4), + default => 0, + }; + + $hue = ($hue + 360) % 360; // normalize hue + + return new Color( + intval(round($hue)), + intval(round($saturation * 100)), + intval(round($luminance * 100)), + ); + } + + /** + * @throws ColorException + */ + protected function importHsvColor(ColorInterface $color): ColorInterface + { + if (!($color instanceof HsvColor)) { + throw new ColorException('Unabled to import color of type ' . $color::class . '.'); + } + + // normalized values of hsv channels + [$h, $s, $v] = array_map( + fn(ColorChannelInterface $channel): float => $channel->normalize(), + $color->channels(), + ); + + // calculate Luminance + $luminance = (2 - $s) * $v / 2; + + // calculate Saturation + $saturation = match (true) { + $luminance == 0 => $s, + $luminance == 1 => 0, + $luminance < .5 => $s * $v / ($luminance * 2), + default => $s * $v / (2 - $luminance * 2), + }; + + return new Color( + intval(round($h * 360)), + intval(round($saturation * 100)), + intval(round($luminance * 100)), + ); + } +} diff --git a/vendor/intervention/image/src/Colors/Hsl/Decoders/StringColorDecoder.php b/vendor/intervention/image/src/Colors/Hsl/Decoders/StringColorDecoder.php new file mode 100755 index 00000000..8ea7ed94 --- /dev/null +++ b/vendor/intervention/image/src/Colors/Hsl/Decoders/StringColorDecoder.php @@ -0,0 +1,39 @@ +[0-9\.]+), ?(?P[0-9\.]+%?), ?(?P[0-9\.]+%?)\)$/i'; + if (preg_match($pattern, $input, $matches) != 1) { + throw new DecoderException('Unable to decode input'); + } + + $values = array_map(function (string $value): int { + return match (strpos($value, '%')) { + false => intval(trim($value)), + default => intval(trim(str_replace('%', '', $value))), + }; + }, [$matches['h'], $matches['s'], $matches['l']]); + + return new Color(...$values); + } +} diff --git a/vendor/intervention/image/src/Colors/Hsv/Channels/Hue.php b/vendor/intervention/image/src/Colors/Hsv/Channels/Hue.php new file mode 100755 index 00000000..bbfc1feb --- /dev/null +++ b/vendor/intervention/image/src/Colors/Hsv/Channels/Hue.php @@ -0,0 +1,30 @@ +channels = [ + new Hue($h), + new Saturation($s), + new Value($v), + ]; + } + + /** + * {@inheritdoc} + * + * @see ColorInterface::colorspace() + */ + public function colorspace(): ColorspaceInterface + { + return new Colorspace(); + } + + /** + * {@inheritdoc} + * + * @see ColorInterface::create() + */ + public static function create(mixed $input): ColorInterface + { + return InputHandler::withDecoders([ + Decoders\StringColorDecoder::class, + ])->handle($input); + } + + /** + * Return the Hue channel + */ + public function hue(): ColorChannelInterface + { + /** @throws void */ + return $this->channel(Hue::class); + } + + /** + * Return the Saturation channel + */ + public function saturation(): ColorChannelInterface + { + /** @throws void */ + return $this->channel(Saturation::class); + } + + /** + * Return the Value channel + */ + public function value(): ColorChannelInterface + { + /** @throws void */ + return $this->channel(Value::class); + } + + public function toHex(string $prefix = ''): string + { + return $this->convertTo(RgbColorspace::class)->toHex($prefix); + } + + /** + * {@inheritdoc} + * + * @see ColorInterface::toString() + */ + public function toString(): string + { + return sprintf( + 'hsv(%d, %d%%, %d%%)', + $this->hue()->value(), + $this->saturation()->value(), + $this->value()->value() + ); + } + + /** + * {@inheritdoc} + * + * @see ColorInterface::isGreyscale() + */ + public function isGreyscale(): bool + { + return $this->saturation()->value() == 0; + } + + /** + * {@inheritdoc} + * + * @see ColorInterface::isTransparent() + */ + public function isTransparent(): bool + { + return false; + } + + /** + * {@inheritdoc} + * + * @see ColorInterface::isClear() + */ + public function isClear(): bool + { + return false; + } +} diff --git a/vendor/intervention/image/src/Colors/Hsv/Colorspace.php b/vendor/intervention/image/src/Colors/Hsv/Colorspace.php new file mode 100755 index 00000000..5cf08e2f --- /dev/null +++ b/vendor/intervention/image/src/Colors/Hsv/Colorspace.php @@ -0,0 +1,122 @@ + + */ + public static array $channels = [ + Channels\Hue::class, + Channels\Saturation::class, + Channels\Value::class + ]; + + /** + * {@inheritdoc} + * + * @see ColorspaceInterface::colorFromNormalized() + */ + public function colorFromNormalized(array $normalized): ColorInterface + { + return new Color(...array_map( + fn(string $classname, float $value_normalized) => (new $classname(normalized: $value_normalized))->value(), + self::$channels, + $normalized + )); + } + + /** + * @throws ColorException + */ + public function importColor(ColorInterface $color): ColorInterface + { + return match ($color::class) { + CmykColor::class => $this->importRgbColor($color->convertTo(RgbColorspace::class)), + RgbColor::class => $this->importRgbColor($color), + HslColor::class => $this->importHslColor($color), + default => $color, + }; + } + + /** + * @throws ColorException + */ + protected function importRgbColor(ColorInterface $color): ColorInterface + { + if (!($color instanceof RgbColor)) { + throw new ColorException('Unabled to import color of type ' . $color::class . '.'); + } + + // normalized values of rgb channels + $values = array_map(fn(ColorChannelInterface $channel): float => $channel->normalize(), $color->channels()); + + // take only RGB + $values = array_slice($values, 0, 3); + + // calculate chroma + $min = min(...$values); + $max = max(...$values); + $chroma = $max - $min; + + // calculate value + $v = 100 * $max; + + if ($chroma == 0) { + // greyscale color + return new Color(0, 0, intval(round($v))); + } + + // calculate saturation + $s = 100 * ($chroma / $max); + + // calculate hue + [$r, $g, $b] = $values; + $h = match (true) { + ($r == $min) => 3 - (($g - $b) / $chroma), + ($b == $min) => 1 - (($r - $g) / $chroma), + default => 5 - (($b - $r) / $chroma), + } * 60; + + return new Color( + intval(round($h)), + intval(round($s)), + intval(round($v)) + ); + } + + /** + * @throws ColorException + */ + protected function importHslColor(ColorInterface $color): ColorInterface + { + if (!($color instanceof HslColor)) { + throw new ColorException('Unabled to import color of type ' . $color::class . '.'); + } + + // normalized values of hsl channels + [$h, $s, $l] = array_map( + fn(ColorChannelInterface $channel): float => $channel->normalize(), + $color->channels() + ); + + $v = $l + $s * min($l, 1 - $l); + $s = ($v == 0) ? 0 : 2 * (1 - $l / $v); + + return $this->colorFromNormalized([$h, $s, $v]); + } +} diff --git a/vendor/intervention/image/src/Colors/Hsv/Decoders/StringColorDecoder.php b/vendor/intervention/image/src/Colors/Hsv/Decoders/StringColorDecoder.php new file mode 100755 index 00000000..0f1ada36 --- /dev/null +++ b/vendor/intervention/image/src/Colors/Hsv/Decoders/StringColorDecoder.php @@ -0,0 +1,39 @@ +[0-9\.]+), ?(?P[0-9\.]+%?), ?(?P[0-9\.]+%?)\)$/i'; + if (preg_match($pattern, $input, $matches) != 1) { + throw new DecoderException('Unable to decode input'); + } + + $values = array_map(function (string $value): int { + return match (strpos($value, '%')) { + false => intval(trim($value)), + default => intval(trim(str_replace('%', '', $value))), + }; + }, [$matches['h'], $matches['s'], $matches['v']]); + + return new Color(...$values); + } +} diff --git a/vendor/intervention/image/src/Colors/Profile.php b/vendor/intervention/image/src/Colors/Profile.php new file mode 100755 index 00000000..b6aa0e9e --- /dev/null +++ b/vendor/intervention/image/src/Colors/Profile.php @@ -0,0 +1,22 @@ +normalize(), 6)); + } +} diff --git a/vendor/intervention/image/src/Colors/Rgb/Channels/Blue.php b/vendor/intervention/image/src/Colors/Rgb/Channels/Blue.php new file mode 100755 index 00000000..c5f9ed74 --- /dev/null +++ b/vendor/intervention/image/src/Colors/Rgb/Channels/Blue.php @@ -0,0 +1,10 @@ +channels = [ + new Red($r), + new Green($g), + new Blue($b), + new Alpha($a), + ]; + } + + /** + * {@inheritdoc} + * + * @see ColorInterface::colorspace() + */ + public function colorspace(): ColorspaceInterface + { + return new Colorspace(); + } + + /** + * {@inheritdoc} + * + * @see ColorInterface::create() + */ + public static function create(mixed $input): ColorInterface + { + return InputHandler::withDecoders([ + Decoders\HexColorDecoder::class, + Decoders\StringColorDecoder::class, + Decoders\TransparentColorDecoder::class, + Decoders\HtmlColornameDecoder::class, + ])->handle($input); + } + + /** + * Return the RGB red color channel + */ + public function red(): ColorChannelInterface + { + /** @throws void */ + return $this->channel(Red::class); + } + + /** + * Return the RGB green color channel + */ + public function green(): ColorChannelInterface + { + /** @throws void */ + return $this->channel(Green::class); + } + + /** + * Return the RGB blue color channel + */ + public function blue(): ColorChannelInterface + { + /** @throws void */ + return $this->channel(Blue::class); + } + + /** + * Return the colors alpha channel + */ + public function alpha(): ColorChannelInterface + { + /** @throws void */ + return $this->channel(Alpha::class); + } + + /** + * {@inheritdoc} + * + * @see ColorInterface::toHex() + */ + public function toHex(string $prefix = ''): string + { + if ($this->isTransparent()) { + return sprintf( + '%s%02x%02x%02x%02x', + $prefix, + $this->red()->value(), + $this->green()->value(), + $this->blue()->value(), + $this->alpha()->value() + ); + } + + return sprintf( + '%s%02x%02x%02x', + $prefix, + $this->red()->value(), + $this->green()->value(), + $this->blue()->value() + ); + } + + /** + * {@inheritdoc} + * + * @see ColorInterface::toString() + */ + public function toString(): string + { + if ($this->isTransparent()) { + return sprintf( + 'rgba(%d, %d, %d, %.1F)', + $this->red()->value(), + $this->green()->value(), + $this->blue()->value(), + $this->alpha()->normalize(), + ); + } + + return sprintf( + 'rgb(%d, %d, %d)', + $this->red()->value(), + $this->green()->value(), + $this->blue()->value() + ); + } + + /** + * {@inheritdoc} + * + * @see ColorInterface::isGreyscale() + */ + public function isGreyscale(): bool + { + $values = [$this->red()->value(), $this->green()->value(), $this->blue()->value()]; + + return count(array_unique($values, SORT_REGULAR)) === 1; + } + + /** + * {@inheritdoc} + * + * @see ColorInterface::isTransparent() + */ + public function isTransparent(): bool + { + return $this->alpha()->value() < $this->alpha()->max(); + } + + /** + * {@inheritdoc} + * + * @see ColorInterface::isClear() + */ + public function isClear(): bool + { + return $this->alpha()->value() == 0; + } +} diff --git a/vendor/intervention/image/src/Colors/Rgb/Colorspace.php b/vendor/intervention/image/src/Colors/Rgb/Colorspace.php new file mode 100755 index 00000000..dfeaef64 --- /dev/null +++ b/vendor/intervention/image/src/Colors/Rgb/Colorspace.php @@ -0,0 +1,135 @@ + + */ + public static array $channels = [ + Channels\Red::class, + Channels\Green::class, + Channels\Blue::class, + Channels\Alpha::class + ]; + + /** + * {@inheritdoc} + * + * @see ColorspaceInterface::colorFromNormalized() + */ + public function colorFromNormalized(array $normalized): ColorInterface + { + return new Color(...array_map( + fn($classname, float $value_normalized) => (new $classname(normalized: $value_normalized))->value(), + self::$channels, + $normalized, + )); + } + + /** + * @throws ColorException + */ + public function importColor(ColorInterface $color): ColorInterface + { + return match ($color::class) { + CmykColor::class => $this->importCmykColor($color), + HsvColor::class => $this->importHsvColor($color), + HslColor::class => $this->importHslColor($color), + default => $color, + }; + } + + /** + * @throws ColorException + */ + protected function importCmykColor(ColorInterface $color): ColorInterface + { + if (!($color instanceof CmykColor)) { + throw new ColorException('Unabled to import color of type ' . $color::class . '.'); + } + + return new Color( + (int) (255 * (1 - $color->cyan()->normalize()) * (1 - $color->key()->normalize())), + (int) (255 * (1 - $color->magenta()->normalize()) * (1 - $color->key()->normalize())), + (int) (255 * (1 - $color->yellow()->normalize()) * (1 - $color->key()->normalize())), + ); + } + + /** + * @throws ColorException + */ + protected function importHsvColor(ColorInterface $color): ColorInterface + { + if (!($color instanceof HsvColor)) { + throw new ColorException('Unabled to import color of type ' . $color::class . '.'); + } + + $chroma = $color->value()->normalize() * $color->saturation()->normalize(); + $hue = $color->hue()->normalize() * 6; + $x = $chroma * (1 - abs(fmod($hue, 2) - 1)); + + // connect channel values + $values = match (true) { + $hue < 1 => [$chroma, $x, 0], + $hue < 2 => [$x, $chroma, 0], + $hue < 3 => [0, $chroma, $x], + $hue < 4 => [0, $x, $chroma], + $hue < 5 => [$x, 0, $chroma], + default => [$chroma, 0, $x], + }; + + // add to each value + $values = array_map(fn(float|int $value): float => $value + $color->value()->normalize() - $chroma, $values); + $values[] = 1; // append alpha channel value + + return $this->colorFromNormalized($values); + } + + /** + * @throws ColorException + */ + protected function importHslColor(ColorInterface $color): ColorInterface + { + if (!($color instanceof HslColor)) { + throw new ColorException('Unabled to import color of type ' . $color::class . '.'); + } + + // normalized values of hsl channels + [$h, $s, $l] = array_map( + fn(ColorChannelInterface $channel): float => $channel->normalize(), + $color->channels() + ); + + $c = (1 - abs(2 * $l - 1)) * $s; + $x = $c * (1 - abs(fmod($h * 6, 2) - 1)); + $m = $l - $c / 2; + + $values = match (true) { + $h < 1 / 6 => [$c, $x, 0], + $h < 2 / 6 => [$x, $c, 0], + $h < 3 / 6 => [0, $c, $x], + $h < 4 / 6 => [0, $x, $c], + $h < 5 / 6 => [$x, 0, $c], + default => [$c, 0, $x], + }; + + $values = array_map(fn(float|int $value): float => $value + $m, $values); + $values[] = 1; // append alpha channel value + + return $this->colorFromNormalized($values); + } +} diff --git a/vendor/intervention/image/src/Colors/Rgb/Decoders/HexColorDecoder.php b/vendor/intervention/image/src/Colors/Rgb/Decoders/HexColorDecoder.php new file mode 100755 index 00000000..b19eee2a --- /dev/null +++ b/vendor/intervention/image/src/Colors/Rgb/Decoders/HexColorDecoder.php @@ -0,0 +1,46 @@ +[a-f\d]{3}(?:[a-f\d]?|(?:[a-f\d]{3}(?:[a-f\d]{2})?)?)\b)$/i'; + if (preg_match($pattern, $input, $matches) != 1) { + throw new DecoderException('Unable to decode input'); + } + + $values = match (strlen($matches['hex'])) { + 3, 4 => str_split($matches['hex']), + 6, 8 => str_split($matches['hex'], 2), + default => throw new DecoderException('Unable to decode input'), + }; + + $values = array_map(function (string $value): float|int { + return match (strlen($value)) { + 1 => hexdec($value . $value), + 2 => hexdec($value), + default => throw new DecoderException('Unable to decode input'), + }; + }, $values); + + return new Color(...$values); + } +} diff --git a/vendor/intervention/image/src/Colors/Rgb/Decoders/HtmlColornameDecoder.php b/vendor/intervention/image/src/Colors/Rgb/Decoders/HtmlColornameDecoder.php new file mode 100755 index 00000000..8fc8e70d --- /dev/null +++ b/vendor/intervention/image/src/Colors/Rgb/Decoders/HtmlColornameDecoder.php @@ -0,0 +1,176 @@ + + */ + protected static array $names = [ + 'lightsalmon' => '#ffa07a', + 'salmon' => '#fa8072', + 'darksalmon' => '#e9967a', + 'lightcoral' => '#f08080', + 'indianred' => '#cd5c5c', + 'crimson' => '#dc143c', + 'firebrick' => '#b22222', + 'red' => '#ff0000', + 'darkred' => '#8b0000', + 'coral' => '#ff7f50', + 'tomato' => '#ff6347', + 'orangered' => '#ff4500', + 'gold' => '#ffd700', + 'orange' => '#ffa500', + 'darkorange' => '#ff8c00', + 'lightyellow' => '#ffffe0', + 'lemonchiffon' => '#fffacd', + 'lightgoldenrodyellow' => '#fafad2', + 'papayawhip' => '#ffefd5', + 'moccasin' => '#ffe4b5', + 'peachpuff' => '#ffdab9', + 'palegoldenrod' => '#eee8aa', + 'khaki' => '#f0e68c', + 'darkkhaki' => '#bdb76b', + 'yellow' => '#ffff00', + 'lawngreen' => '#7cfc00', + 'chartreuse' => '#7fff00', + 'limegreen' => '#32cd32', + 'lime' => '#00ff00', + 'forestgreen' => '#228b22', + 'green' => '#008000', + 'darkgreen' => '#006400', + 'greenyellow' => '#adff2f', + 'yellowgreen' => '#9acd32', + 'springgreen' => '#00ff7f', + 'mediumspringgreen' => '#00fa9a', + 'lightgreen' => '#90ee90', + 'palegreen' => '#98fb98', + 'darkseagreen' => '#8fbc8f', + 'mediumseagre' => 'en #3cb371', + 'seagreen' => '#2e8b57', + 'olive' => '#808000', + 'darkolivegreen' => '#556b2f', + 'olivedrab' => '#6b8e23', + 'lightcyan' => '#e0ffff', + 'cyan' => '#00ffff', + 'aqua' => '#00ffff', + 'aquamarine' => '#7fffd4', + 'mediumaquamarine' => '#66cdaa', + 'paleturquoise' => '#afeeee', + 'turquoise' => '#40e0d0', + 'mediumturquoise' => '#48d1cc', + 'darkturquoise' => '#00ced1', + 'lightseagreen' => '#20b2aa', + 'cadetblue' => '#5f9ea0', + 'darkcyan' => '#008b8b', + 'teal' => '#008080', + 'powderblue' => '#b0e0e6', + 'lightblue' => '#add8e6', + 'lightskyblue' => '#87cefa', + 'skyblue' => '#87ceeb', + 'deepskyblue' => '#00bfff', + 'lightsteelblue' => '#b0c4de', + 'dodgerblue' => '#1e90ff', + 'cornflowerblue' => '#6495ed', + 'steelblue' => '#4682b4', + 'royalblue' => '#4169e1', + 'blue' => '#0000ff', + 'mediumblue' => '#0000cd', + 'darkblue' => '#00008b', + 'navy' => '#000080', + 'midnightblue' => '#191970', + 'mediumslateblue' => '#7b68ee', + 'slateblue' => '#6a5acd', + 'darkslateblue' => '#483d8b', + 'lavender' => '#e6e6fa', + 'thistle' => '#d8bfd8', + 'plum' => '#dda0dd', + 'violet' => '#ee82ee', + 'orchid' => '#da70d6', + 'fuchsia' => '#ff00ff', + 'magenta' => '#ff00ff', + 'mediumorchid' => '#ba55d3', + 'mediumpurple' => '#9370db', + 'blueviolet' => '#8a2be2', + 'darkviolet' => '#9400d3', + 'darkorchid' => '#9932cc', + 'darkmagenta' => '#8b008b', + 'purple' => '#800080', + 'indigo' => '#4b0082', + 'pink' => '#ffc0cb', + 'lightpink' => '#ffb6c1', + 'hotpink' => '#ff69b4', + 'deeppink' => '#ff1493', + 'palevioletred' => '#db7093', + 'mediumvioletred' => '#c71585', + 'white' => '#ffffff', + 'snow' => '#fffafa', + 'honeydew' => '#f0fff0', + 'mintcream' => '#f5fffa', + 'azure' => '#f0ffff', + 'aliceblue' => '#f0f8ff', + 'ghostwhite' => '#f8f8ff', + 'whitesmoke' => '#f5f5f5', + 'seashell' => '#fff5ee', + 'beige' => '#f5f5dc', + 'oldlace' => '#fdf5e6', + 'floralwhite' => '#fffaf0', + 'ivory' => '#fffff0', + 'antiquewhite' => '#faebd7', + 'linen' => '#faf0e6', + 'lavenderblush' => '#fff0f5', + 'mistyrose' => '#ffe4e1', + 'gainsboro' => '#dcdcdc', + 'lightgray' => '#d3d3d3', + 'silver' => '#c0c0c0', + 'darkgray' => '#a9a9a9', + 'gray' => '#808080', + 'dimgray' => '#696969', + 'lightslategray' => '#778899', + 'slategray' => '#708090', + 'darkslategray' => '#2f4f4f', + 'black' => '#000000', + 'cornsilk' => '#fff8dc', + 'blanchedalmond' => '#ffebcd', + 'bisque' => '#ffe4c4', + 'navajowhite' => '#ffdead', + 'wheat' => '#f5deb3', + 'burlywood' => '#deb887', + 'tan' => '#d2b48c', + 'rosybrown' => '#bc8f8f', + 'sandybrown' => '#f4a460', + 'goldenrod' => '#daa520', + 'peru' => '#cd853f', + 'chocolate' => '#d2691e', + 'saddlebrown' => '#8b4513', + 'sienna' => '#a0522d', + 'brown' => '#a52a2a', + 'maroon' => '#800000', + ]; + + /** + * Decode html color names + */ + public function decode(mixed $input): ImageInterface|ColorInterface + { + if (!is_string($input)) { + throw new DecoderException('Unable to decode input'); + } + + if (!array_key_exists(strtolower($input), static::$names)) { + throw new DecoderException('Unable to decode input'); + } + + return parent::decode(static::$names[strtolower($input)]); + } +} diff --git a/vendor/intervention/image/src/Colors/Rgb/Decoders/StringColorDecoder.php b/vendor/intervention/image/src/Colors/Rgb/Decoders/StringColorDecoder.php new file mode 100755 index 00000000..a2ddb6ca --- /dev/null +++ b/vendor/intervention/image/src/Colors/Rgb/Decoders/StringColorDecoder.php @@ -0,0 +1,49 @@ +[0-9\.]+%?), ?(?P[0-9\.]+%?), ?(?P[0-9\.]+%?)' . + '(?:, ?(?P(?:1)|(?:1\.0*)|(?:0)|(?:0?\.\d+%?)|(?:\d{1,3}%)))?\)$/i'; + if (preg_match($pattern, $input, $matches) != 1) { + throw new DecoderException('Unable to decode input'); + } + + // rgb values + $values = array_map(function (string $value): int { + return match (strpos($value, '%')) { + false => intval(trim($value)), + default => intval(round(floatval(trim(str_replace('%', '', $value))) / 100 * 255)), + }; + }, [$matches['r'], $matches['g'], $matches['b']]); + + // alpha value + if (array_key_exists('a', $matches)) { + $values[] = match (true) { + strpos($matches['a'], '%') => round(intval(trim(str_replace('%', '', $matches['a']))) / 2.55), + default => intval(round(floatval(trim($matches['a'])) * 255)), + }; + } + + return new Color(...$values); + } +} diff --git a/vendor/intervention/image/src/Colors/Rgb/Decoders/TransparentColorDecoder.php b/vendor/intervention/image/src/Colors/Rgb/Decoders/TransparentColorDecoder.php new file mode 100755 index 00000000..8d968a66 --- /dev/null +++ b/vendor/intervention/image/src/Colors/Rgb/Decoders/TransparentColorDecoder.php @@ -0,0 +1,30 @@ +prepareOptions($options) as $name => $value) { + if (!property_exists($this, $name)) { + throw new InputException('Property ' . $name . ' does not exists for ' . $this::class . '.'); + } + + $this->{$name} = $value; + } + + return $this; + } + + /** + * This method makes it possible to call self::setOptions() with a single + * array instead of named parameters + * + * @param array $options + * @return array + */ + private function prepareOptions(array $options): array + { + if ($options === []) { + return $options; + } + + if (count($options) > 1) { + return $options; + } + + if (!array_key_exists(0, $options)) { + return $options; + } + + if (!is_array($options[0])) { + return $options; + } + + return $options[0]; + } +} diff --git a/vendor/intervention/image/src/Decoders/Base64ImageDecoder.php b/vendor/intervention/image/src/Decoders/Base64ImageDecoder.php new file mode 100755 index 00000000..6dffb2b8 --- /dev/null +++ b/vendor/intervention/image/src/Decoders/Base64ImageDecoder.php @@ -0,0 +1,12 @@ + PHP_MAXPATHLEN) { + return false; + } + + try { + if (!@is_file($input)) { + return false; + } + } catch (Exception) { + return false; + } + + return true; + } + + /** + * Extract and return EXIF data from given input which can be binary image + * data or a file path. + * + * @return CollectionInterface + */ + protected function extractExifData(string $path_or_data): CollectionInterface + { + if (!function_exists('exif_read_data')) { + return new Collection(); + } + + try { + $source = match (true) { + $this->isFile($path_or_data) => $path_or_data, // path + default => $this->buildFilePointer($path_or_data), // data + }; + + // extract exif data + $data = @exif_read_data($source, null, true); + if (is_resource($source)) { + fclose($source); + } + } catch (Exception) { + $data = []; + } + + return new Collection(is_array($data) ? $data : []); + } + + /** + * Determine if given input is base64 encoded data + */ + protected function isValidBase64(mixed $input): bool + { + if (!is_string($input)) { + return false; + } + + return base64_encode(base64_decode($input)) === str_replace(["\n", "\r"], '', $input); + } + + /** + * Parse data uri + */ + protected function parseDataUri(mixed $input): object + { + $pattern = "/^data:(?P\w+\/[-+.\w]+)?" . + "(?P(;[-\w]+=[-\w]+)*)(?P;base64)?,(?P.*)/"; + + $result = preg_match($pattern, (string) $input, $matches); + + return new class ($matches, $result) + { + /** + * @param array $matches + * @return void + */ + public function __construct(private array $matches, private int|false $result) + { + // + } + + public function isValid(): bool + { + return (bool) $this->result; + } + + public function mediaType(): ?string + { + if (isset($this->matches['mediatype']) && !empty($this->matches['mediatype'])) { + return $this->matches['mediatype']; + } + + return null; + } + + public function hasMediaType(): bool + { + return !empty($this->mediaType()); + } + + public function isBase64Encoded(): bool + { + return isset($this->matches['base64']) && $this->matches['base64'] === ';base64'; + } + + public function data(): ?string + { + if (isset($this->matches['data']) && !empty($this->matches['data'])) { + return $this->matches['data']; + } + + return null; + } + }; + } +} diff --git a/vendor/intervention/image/src/Drivers/AbstractDriver.php b/vendor/intervention/image/src/Drivers/AbstractDriver.php new file mode 100755 index 00000000..f5d70240 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/AbstractDriver.php @@ -0,0 +1,127 @@ +config = new Config(); + $this->checkHealth(); + } + + /** + * {@inheritdoc} + * + * @see DriverInterface::config() + */ + public function config(): Config + { + return $this->config; + } + + /** + * {@inheritdoc} + * + * @see DriverInterface::handleInput() + */ + public function handleInput(mixed $input, array $decoders = []): ImageInterface|ColorInterface + { + return InputHandler::withDecoders($decoders, $this)->handle($input); + } + + /** + * {@inheritdoc} + * + * @see DriverInterface::specialize() + */ + public function specialize( + ModifierInterface|AnalyzerInterface|EncoderInterface|DecoderInterface $object + ): ModifierInterface|AnalyzerInterface|EncoderInterface|DecoderInterface { + // return object directly if no specializing is possible + if (!($object instanceof SpecializableInterface)) { + return $object; + } + + // return directly and only attach driver if object is already specialized + if ($object instanceof SpecializedInterface) { + $object->setDriver($this); + + return $object; + } + + // resolve classname for specializable object + $specialized_classname = implode("\\", [ + (new ReflectionClass($this))->getNamespaceName(), // driver's namespace + match (true) { + $object instanceof ModifierInterface => 'Modifiers', + $object instanceof AnalyzerInterface => 'Analyzers', + $object instanceof EncoderInterface => 'Encoders', + $object instanceof DecoderInterface => 'Decoders', + }, + $object_shortname = (new ReflectionClass($object))->getShortName(), + ]); + + // fail if driver specialized classname does not exists + if (!class_exists($specialized_classname)) { + throw new NotSupportedException( + "Class '" . $object_shortname . "' is not supported by " . $this->id() . " driver." + ); + } + + // create a driver specialized object with the specializable properties of generic object + $specialized = new $specialized_classname(...$object->specializable()); + + // attach driver + return $specialized->setDriver($this); + } + + /** + * {@inheritdoc} + * + * @see DriverInterface::specializeMultiple() + * + * @throws NotSupportedException + * @throws DriverException + */ + public function specializeMultiple(array $objects): array + { + return array_map( + function (string|object $object): ModifierInterface|AnalyzerInterface|EncoderInterface|DecoderInterface { + return $this->specialize( + match (true) { + is_string($object) => new $object(), + is_object($object) => $object, + } + ); + }, + $objects + ); + } +} diff --git a/vendor/intervention/image/src/Drivers/AbstractEncoder.php b/vendor/intervention/image/src/Drivers/AbstractEncoder.php new file mode 100755 index 00000000..747cdcbc --- /dev/null +++ b/vendor/intervention/image/src/Drivers/AbstractEncoder.php @@ -0,0 +1,42 @@ +encode($this); + } + + /** + * Build new file pointer, run callback with it and return result as encoded image + * + * @throws RuntimeException + */ + protected function createEncodedImage(callable $callback, ?string $mediaType = null): EncodedImage + { + $pointer = $this->buildFilePointer(); + $callback($pointer); + + return is_string($mediaType) ? new EncodedImage($pointer, $mediaType) : new EncodedImage($pointer); + } +} diff --git a/vendor/intervention/image/src/Drivers/AbstractFontProcessor.php b/vendor/intervention/image/src/Drivers/AbstractFontProcessor.php new file mode 100755 index 00000000..6d0ae663 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/AbstractFontProcessor.php @@ -0,0 +1,172 @@ +wrapTextBlock(new TextBlock($text), $font); + $pivot = $this->buildPivot($lines, $font, $position); + + $leading = $this->leading($font); + $blockWidth = $this->boxSize((string) $lines->longestLine(), $font)->width(); + + $x = $pivot->x(); + $y = $font->hasFilename() ? $pivot->y() + $this->capHeight($font) : $pivot->y(); + $xAdjustment = 0; + + // adjust line positions according to alignment + foreach ($lines as $line) { + $lineBoxSize = $this->boxSize((string) $line, $font); + $lineWidth = $lineBoxSize->width() + $lineBoxSize->pivot()->x(); + $xAdjustment = $font->alignment() === 'left' ? 0 : $blockWidth - $lineWidth; + $xAdjustment = $font->alignment() === 'right' ? intval(round($xAdjustment)) : $xAdjustment; + $xAdjustment = $font->alignment() === 'center' ? intval(round($xAdjustment / 2)) : $xAdjustment; + $position = new Point($x + $xAdjustment, $y); + $position->rotate($font->angle(), $pivot); + $line->setPosition($position); + $y += $leading; + } + + return $lines; + } + + /** + * {@inheritdoc} + * + * @see FontProcessorInterface::nativeFontSize() + */ + public function nativeFontSize(FontInterface $font): float + { + return $font->size(); + } + + /** + * {@inheritdoc} + * + * @see FontProcessorInterface::typographicalSize() + */ + public function typographicalSize(FontInterface $font): int + { + return $this->boxSize('Hy', $font)->height(); + } + + /** + * {@inheritdoc} + * + * @see FontProcessorInterface::capHeight() + */ + public function capHeight(FontInterface $font): int + { + return $this->boxSize('T', $font)->height(); + } + + /** + * {@inheritdoc} + * + * @see FontProcessorInterface::leading() + */ + public function leading(FontInterface $font): int + { + return intval(round($this->typographicalSize($font) * $font->lineHeight())); + } + + /** + * Reformat a text block by wrapping each line before the given maximum width + * + * @throws FontException + */ + protected function wrapTextBlock(TextBlock $block, FontInterface $font): TextBlock + { + $newLines = []; + foreach ($block as $line) { + foreach ($this->wrapLine($line, $font) as $newLine) { + $newLines[] = $newLine; + } + } + + return $block->setLines($newLines); + } + + /** + * Check if a line exceeds the given maximum width and wrap it if necessary. + * The output will be an array of formatted lines that are all within the + * maximum width. + * + * @throws FontException + * @return array + */ + protected function wrapLine(Line $line, FontInterface $font): array + { + // no wrap width - no wrapping + if (is_null($font->wrapWidth())) { + return [$line]; + } + + $wrapped = []; + $formattedLine = new Line(); + + foreach ($line as $word) { + // calculate width of newly formatted line + $lineWidth = $this->boxSize(match ($formattedLine->count()) { + 0 => $word, + default => $formattedLine . ' ' . $word, + }, $font)->width(); + + // decide if word fits on current line or a new line must be created + if ($line->count() === 1 || $lineWidth <= $font->wrapWidth()) { + $formattedLine->add($word); + } else { + if ($formattedLine->count() !== 0) { + $wrapped[] = $formattedLine; + } + $formattedLine = new Line($word); + } + } + + $wrapped[] = $formattedLine; + + return $wrapped; + } + + /** + * Build pivot point of textblock according to the font settings and based on given position + * + * @throws FontException + */ + protected function buildPivot(TextBlock $block, FontInterface $font, PointInterface $position): PointInterface + { + // bounding box + $box = new Rectangle( + $this->boxSize((string) $block->longestLine(), $font)->width(), + $this->leading($font) * ($block->count() - 1) + $this->capHeight($font) + ); + + // set position + $box->setPivot($position); + + // alignment + $box->align($font->alignment()); + $box->valign($font->valignment()); + $box->rotate($font->angle()); + + return $box->last(); + } +} diff --git a/vendor/intervention/image/src/Drivers/AbstractFrame.php b/vendor/intervention/image/src/Drivers/AbstractFrame.php new file mode 100755 index 00000000..706ddf52 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/AbstractFrame.php @@ -0,0 +1,25 @@ + + */ + public function __debugInfo(): array + { + return [ + 'delay' => $this->delay(), + 'left' => $this->offsetLeft(), + 'top' => $this->offsetTop(), + 'dispose' => $this->dispose(), + ]; + } +} diff --git a/vendor/intervention/image/src/Drivers/Gd/Analyzers/ColorspaceAnalyzer.php b/vendor/intervention/image/src/Drivers/Gd/Analyzers/ColorspaceAnalyzer.php new file mode 100755 index 00000000..73057f72 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Gd/Analyzers/ColorspaceAnalyzer.php @@ -0,0 +1,23 @@ +core()->native()); + } +} diff --git a/vendor/intervention/image/src/Drivers/Gd/Analyzers/PixelColorAnalyzer.php b/vendor/intervention/image/src/Drivers/Gd/Analyzers/PixelColorAnalyzer.php new file mode 100755 index 00000000..80542f3c --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Gd/Analyzers/PixelColorAnalyzer.php @@ -0,0 +1,51 @@ +colorAt( + $image->colorspace(), + $image->core()->frame($this->frame_key)->native() + ); + } + + /** + * @throws GeometryException + * @throws ColorException + */ + protected function colorAt(ColorspaceInterface $colorspace, GdImage $gd): ColorInterface + { + $index = @imagecolorat($gd, $this->x, $this->y); + + if (!imageistruecolor($gd)) { + $index = imagecolorsforindex($gd, $index); + } + + if ($index === false) { + throw new GeometryException( + 'The specified position is not in the valid image area.' + ); + } + + return $this->driver()->colorProcessor($colorspace)->nativeToColor($index); + } +} diff --git a/vendor/intervention/image/src/Drivers/Gd/Analyzers/PixelColorsAnalyzer.php b/vendor/intervention/image/src/Drivers/Gd/Analyzers/PixelColorsAnalyzer.php new file mode 100755 index 00000000..862d41e1 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Gd/Analyzers/PixelColorsAnalyzer.php @@ -0,0 +1,30 @@ +colorspace(); + + foreach ($image as $frame) { + $colors->push( + parent::colorAt($colorspace, $frame->native()) + ); + } + + return $colors; + } +} diff --git a/vendor/intervention/image/src/Drivers/Gd/Analyzers/ResolutionAnalyzer.php b/vendor/intervention/image/src/Drivers/Gd/Analyzers/ResolutionAnalyzer.php new file mode 100755 index 00000000..93d37f24 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Gd/Analyzers/ResolutionAnalyzer.php @@ -0,0 +1,23 @@ +core()->native())); + } +} diff --git a/vendor/intervention/image/src/Drivers/Gd/Analyzers/WidthAnalyzer.php b/vendor/intervention/image/src/Drivers/Gd/Analyzers/WidthAnalyzer.php new file mode 100755 index 00000000..9c6b793b --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Gd/Analyzers/WidthAnalyzer.php @@ -0,0 +1,22 @@ +core()->native()); + } +} diff --git a/vendor/intervention/image/src/Drivers/Gd/Cloner.php b/vendor/intervention/image/src/Drivers/Gd/Cloner.php new file mode 100755 index 00000000..e8719963 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Gd/Cloner.php @@ -0,0 +1,90 @@ +width(), $size->height()); + + // copy resolution to clone + $resolution = imageresolution($gd); + if (is_array($resolution) && array_key_exists(0, $resolution) && array_key_exists(1, $resolution)) { + imageresolution($clone, $resolution[0], $resolution[1]); + } + + // fill with background + $processor = new ColorProcessor(); + imagefill($clone, 0, 0, $processor->colorToNative($background)); + imagealphablending($clone, true); + imagesavealpha($clone, true); + + // set background image as transparent if alpha channel value if color is below .5 + // comes into effect when the end format only supports binary transparency (like GIF) + if ($background->channel(Alpha::class)->value() < 128) { + imagecolortransparent($clone, $processor->colorToNative($background)); + } + + return $clone; + } + + /** + * Create a clone of an GdImage that is positioned on the specified background color. + * Possible transparent areas are mixed with this color. + * + * @throws ColorException + */ + public static function cloneBlended(GdImage $gd, ColorInterface $background): GdImage + { + // create empty canvas with same size + $clone = static::cloneEmpty($gd, background: $background); + + // transfer actual image to clone + imagecopy($clone, $gd, 0, 0, 0, 0, imagesx($gd), imagesy($gd)); + + return $clone; + } +} diff --git a/vendor/intervention/image/src/Drivers/Gd/ColorProcessor.php b/vendor/intervention/image/src/Drivers/Gd/ColorProcessor.php new file mode 100755 index 00000000..6d738a4f --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Gd/ColorProcessor.php @@ -0,0 +1,148 @@ +convertTo($this->colorspace); + + // gd only supports rgb so the channels can be accessed directly + $r = $color->channel(Red::class)->value(); + $g = $color->channel(Green::class)->value(); + $b = $color->channel(Blue::class)->value(); + $a = $color->channel(Alpha::class)->value(); + + // convert alpha value to gd alpha + // ([opaque]255-0[transparent]) to ([opaque]0-127[transparent]) + $a = (int) $this->convertRange($a, 0, 255, 127, 0); + + return ($a << 24) + ($r << 16) + ($g << 8) + $b; + } + + /** + * {@inheritdoc} + * + * @see ColorProcessorInterface::nativeToColor() + */ + public function nativeToColor(mixed $value): ColorInterface + { + if (!is_int($value) && !is_array($value)) { + throw new ColorException('GD driver can only decode colors in integer and array format.'); + } + + if (is_array($value)) { + // array conversion + if (!$this->isValidArrayColor($value)) { + throw new ColorException( + 'GD driver can only decode array color format array{red: int, green: int, blue: int, alpha: int}.', + ); + } + + $r = $value['red']; + $g = $value['green']; + $b = $value['blue']; + $a = $value['alpha']; + } else { + // integer conversion + $a = ($value >> 24) & 0xFF; + $r = ($value >> 16) & 0xFF; + $g = ($value >> 8) & 0xFF; + $b = $value & 0xFF; + } + + // convert gd apha integer to intervention alpha integer + // ([opaque]0-127[transparent]) to ([opaque]255-0[transparent]) + $a = (int) static::convertRange($a, 127, 0, 0, 255); + + return new Color($r, $g, $b, $a); + } + + /** + * Convert input in range (min) to (max) to the corresponding value + * in target range (targetMin) to (targetMax). + */ + protected function convertRange( + float|int $input, + float|int $min, + float|int $max, + float|int $targetMin, + float|int $targetMax + ): float|int { + return ceil(((($input - $min) * ($targetMax - $targetMin)) / ($max - $min)) + $targetMin); + } + + /** + * Check if given array is valid color format + * array{red: int, green: int, blue: int, alpha: int} + * i.e. result of imagecolorsforindex() + * + * @param array $color + */ + private function isValidArrayColor(array $color): bool + { + if (!array_key_exists('red', $color)) { + return false; + } + + if (!array_key_exists('green', $color)) { + return false; + } + + if (!array_key_exists('blue', $color)) { + return false; + } + + if (!array_key_exists('alpha', $color)) { + return false; + } + + if (!is_int($color['red'])) { + return false; + } + + if (!is_int($color['green'])) { + return false; + } + + if (!is_int($color['blue'])) { + return false; + } + + if (!is_int($color['alpha'])) { + return false; + } + + return true; + } +} diff --git a/vendor/intervention/image/src/Drivers/Gd/Core.php b/vendor/intervention/image/src/Drivers/Gd/Core.php new file mode 100755 index 00000000..66424ad1 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Gd/Core.php @@ -0,0 +1,117 @@ +push($frame); + + return $this; + } + + /** + * {@inheritdoc} + * + * @see CoreInterface::native() + */ + public function native(): mixed + { + return $this->first()->native(); + } + + /** + * {@inheritdoc} + * + * @see CoreInterface::setNative() + */ + public function setNative(mixed $native): self + { + $this->empty()->push(new Frame($native)); + + return $this; + } + + /** + * {@inheritdoc} + * + * @see CoreInterface::frame() + */ + public function frame(int $position): FrameInterface + { + $frame = $this->getAtPosition($position); + + if (!($frame instanceof FrameInterface)) { + throw new AnimationException('Frame #' . $position . ' could not be found in the image.'); + } + + return $frame; + } + + /** + * {@inheritdoc} + * + * @see CoreInterface::loops() + */ + public function loops(): int + { + return $this->loops; + } + + /** + * {@inheritdoc} + * + * @see CoreInterface::setLoops() + */ + public function setLoops(int $loops): self + { + $this->loops = $loops; + + return $this; + } + + /** + * {@inheritdoc} + * + * @see CollectionInterface::first() + */ + public function first(): FrameInterface + { + return parent::first(); + } + + /** + * {@inheritdoc} + * + * @see CollectionInterface::last() + */ + public function last(): FrameInterface + { + return parent::last(); + } + + /** + * Clone instance + */ + public function __clone(): void + { + foreach ($this->items as $key => $frame) { + $this->items[$key] = clone $frame; + } + } +} diff --git a/vendor/intervention/image/src/Drivers/Gd/Decoders/AbstractDecoder.php b/vendor/intervention/image/src/Drivers/Gd/Decoders/AbstractDecoder.php new file mode 100755 index 00000000..17e2559e --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Gd/Decoders/AbstractDecoder.php @@ -0,0 +1,57 @@ +isValidBase64($input)) { + throw new DecoderException('Unable to decode input'); + } + + return parent::decode(base64_decode((string) $input)); + } +} diff --git a/vendor/intervention/image/src/Drivers/Gd/Decoders/BinaryImageDecoder.php b/vendor/intervention/image/src/Drivers/Gd/Decoders/BinaryImageDecoder.php new file mode 100755 index 00000000..ea199580 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Gd/Decoders/BinaryImageDecoder.php @@ -0,0 +1,68 @@ +isGifFormat($input)) { + true => $this->decodeGif($input), + default => $this->decodeBinary($input), + }; + } + + /** + * Decode image from given binary data + * + * @throws RuntimeException + */ + private function decodeBinary(string $input): ImageInterface + { + $gd = @imagecreatefromstring($input); + + if ($gd === false) { + throw new DecoderException('Unable to decode input'); + } + + // create image instance + $image = parent::decode($gd); + + // get media type + $mediaType = $this->getMediaTypeByBinary($input); + + // extract & set exif data for appropriate formats + if (in_array($mediaType->format(), [Format::JPEG, Format::TIFF])) { + $image->setExif($this->extractExifData($input)); + } + + // set mediaType on origin + $image->origin()->setMediaType($mediaType); + + // adjust image orientation + if ($this->driver()->config()->autoOrientation) { + $image->modify(new AlignRotationModifier()); + } + + return $image; + } +} diff --git a/vendor/intervention/image/src/Drivers/Gd/Decoders/DataUriImageDecoder.php b/vendor/intervention/image/src/Drivers/Gd/Decoders/DataUriImageDecoder.php new file mode 100755 index 00000000..fe3abe6f --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Gd/Decoders/DataUriImageDecoder.php @@ -0,0 +1,37 @@ +parseDataUri($input); + + if (!$uri->isValid()) { + throw new DecoderException('Unable to decode input'); + } + + if ($uri->isBase64Encoded()) { + return parent::decode(base64_decode($uri->data())); + } + + return parent::decode(urldecode($uri->data())); + } +} diff --git a/vendor/intervention/image/src/Drivers/Gd/Decoders/EncodedImageObjectDecoder.php b/vendor/intervention/image/src/Drivers/Gd/Decoders/EncodedImageObjectDecoder.php new file mode 100755 index 00000000..f65d0a5b --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Gd/Decoders/EncodedImageObjectDecoder.php @@ -0,0 +1,27 @@ +toString()); + } +} diff --git a/vendor/intervention/image/src/Drivers/Gd/Decoders/FilePathImageDecoder.php b/vendor/intervention/image/src/Drivers/Gd/Decoders/FilePathImageDecoder.php new file mode 100755 index 00000000..bb6ddd5c --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Gd/Decoders/FilePathImageDecoder.php @@ -0,0 +1,60 @@ +isFile($input)) { + throw new DecoderException('Unable to decode input'); + } + + // detect media (mime) type + $mediaType = $this->getMediaTypeByFilePath($input); + + $image = match ($mediaType->format()) { + // gif files might be animated and therefore cannot + // be handled by the standard GD decoder. + Format::GIF => $this->decodeGif($input), + default => parent::decode(match ($mediaType->format()) { + Format::JPEG => @imagecreatefromjpeg($input), + Format::WEBP => @imagecreatefromwebp($input), + Format::PNG => @imagecreatefrompng($input), + Format::AVIF => @imagecreatefromavif($input), + Format::BMP => @imagecreatefrombmp($input), + default => throw new DecoderException('Unable to decode input'), + }), + }; + + // set file path & mediaType on origin + $image->origin()->setFilePath($input); + $image->origin()->setMediaType($mediaType); + + // extract exif for the appropriate formats + if ($mediaType->format() === Format::JPEG) { + $image->setExif($this->extractExifData($input)); + } + + // adjust image orientation + if ($this->driver()->config()->autoOrientation) { + $image->modify(new AlignRotationModifier()); + } + + return $image; + } +} diff --git a/vendor/intervention/image/src/Drivers/Gd/Decoders/FilePointerImageDecoder.php b/vendor/intervention/image/src/Drivers/Gd/Decoders/FilePointerImageDecoder.php new file mode 100755 index 00000000..0bf649dc --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Gd/Decoders/FilePointerImageDecoder.php @@ -0,0 +1,32 @@ +driver(), + new Core([ + new Frame($input) + ]) + ); + } + + /** + * Decode image from given GIF source which can be either a file path or binary data + * + * Depending on the configuration, this is taken over by the native GD function + * or, if animations are required, by our own extended decoder. + * + * @throws RuntimeException + */ + protected function decodeGif(mixed $input): ImageInterface + { + // create non-animated image depending on config + if (!$this->driver()->config()->decodeAnimation) { + $native = match (true) { + $this->isGifFormat($input) => @imagecreatefromstring($input), + default => @imagecreatefromgif($input), + }; + + if ($native === false) { + throw new DecoderException('Unable to decode input.'); + } + + $image = self::decode($native); + $image->origin()->setMediaType('image/gif'); + + return $image; + } + + try { + // create empty core + $core = new Core(); + + $gif = GifDecoder::decode($input); + $splitter = GifSplitter::create($gif)->split(); + $delays = $splitter->getDelays(); + + // set loops on core + if ($loops = $gif->getMainApplicationExtension()?->getLoops()) { + $core->setLoops($loops); + } + + // add GDImage instances to core + foreach ($splitter->coalesceToResources() as $key => $native) { + $core->push( + new Frame($native, $delays[$key] / 100) + ); + } + } catch (Exception $e) { + throw new DecoderException($e->getMessage(), $e->getCode(), $e); + } + + // create (possibly) animated image + $image = new Image($this->driver(), $core); + + // set media type + $image->origin()->setMediaType('image/gif'); + + return $image; + } +} diff --git a/vendor/intervention/image/src/Drivers/Gd/Decoders/SplFileInfoImageDecoder.php b/vendor/intervention/image/src/Drivers/Gd/Decoders/SplFileInfoImageDecoder.php new file mode 100755 index 00000000..7aee8f58 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Gd/Decoders/SplFileInfoImageDecoder.php @@ -0,0 +1,28 @@ +getRealPath()); + } +} diff --git a/vendor/intervention/image/src/Drivers/Gd/Driver.php b/vendor/intervention/image/src/Drivers/Gd/Driver.php new file mode 100755 index 00000000..a0202e11 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Gd/Driver.php @@ -0,0 +1,163 @@ +core->add( + $this->driver->handleInput($source)->core()->first()->setDelay($delay) + ); + + return $this; + } + + /** + * @throws RuntimeException + */ + public function __invoke(): ImageInterface + { + return new Image( + $this->driver, + $this->core + ); + } + }; + + $init($animation); + + return call_user_func($animation); + } + + /** + * {@inheritdoc} + * + * @see DriverInterface::colorProcessor() + */ + public function colorProcessor(ColorspaceInterface $colorspace): ColorProcessorInterface + { + return new ColorProcessor($colorspace); + } + + /** + * {@inheritdoc} + * + * @see DriverInterface::fontProcessor() + */ + public function fontProcessor(): FontProcessorInterface + { + return new FontProcessor(); + } + + /** + * {@inheritdoc} + * + * @see DriverInterface::supports() + */ + public function supports(string|Format|FileExtension|MediaType $identifier): bool + { + return match (Format::tryCreate($identifier)) { + Format::JPEG => boolval(imagetypes() & IMG_JPEG), + Format::WEBP => boolval(imagetypes() & IMG_WEBP), + Format::GIF => boolval(imagetypes() & IMG_GIF), + Format::PNG => boolval(imagetypes() & IMG_PNG), + Format::AVIF => boolval(imagetypes() & IMG_AVIF), + Format::BMP => boolval(imagetypes() & IMG_BMP), + default => false, + }; + } + + /** + * Return version of GD library + */ + public static function version(): string + { + return gd_info()['GD Version']; + } +} diff --git a/vendor/intervention/image/src/Drivers/Gd/Encoders/AvifEncoder.php b/vendor/intervention/image/src/Drivers/Gd/Encoders/AvifEncoder.php new file mode 100755 index 00000000..8b642719 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Gd/Encoders/AvifEncoder.php @@ -0,0 +1,25 @@ +createEncodedImage(function ($pointer) use ($image): void { + imageavif($image->core()->native(), $pointer, $this->quality); + }, 'image/avif'); + } +} diff --git a/vendor/intervention/image/src/Drivers/Gd/Encoders/BmpEncoder.php b/vendor/intervention/image/src/Drivers/Gd/Encoders/BmpEncoder.php new file mode 100755 index 00000000..1bb34c2c --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Gd/Encoders/BmpEncoder.php @@ -0,0 +1,25 @@ +createEncodedImage(function ($pointer) use ($image): void { + imagebmp($image->core()->native(), $pointer, false); + }, 'image/bmp'); + } +} diff --git a/vendor/intervention/image/src/Drivers/Gd/Encoders/GifEncoder.php b/vendor/intervention/image/src/Drivers/Gd/Encoders/GifEncoder.php new file mode 100755 index 00000000..29d97ecc --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Gd/Encoders/GifEncoder.php @@ -0,0 +1,64 @@ +isAnimated()) { + return $this->encodeAnimated($image); + } + + $gd = Cloner::clone($image->core()->native()); + + return $this->createEncodedImage(function ($pointer) use ($gd): void { + imageinterlace($gd, $this->interlaced); + imagegif($gd, $pointer); + }, 'image/gif'); + } + + /** + * @throws RuntimeException + */ + protected function encodeAnimated(ImageInterface $image): EncodedImage + { + try { + $builder = GifBuilder::canvas( + $image->width(), + $image->height() + ); + + foreach ($image as $frame) { + $builder->addFrame( + source: $this->encode($frame->toImage($image->driver()))->toFilePointer(), + delay: $frame->delay(), + interlaced: $this->interlaced + ); + } + + $builder->setLoops($image->loops()); + + return new EncodedImage($builder->encode(), 'image/gif'); + } catch (Exception $e) { + throw new EncoderException($e->getMessage(), $e->getCode(), $e); + } + } +} diff --git a/vendor/intervention/image/src/Drivers/Gd/Encoders/JpegEncoder.php b/vendor/intervention/image/src/Drivers/Gd/Encoders/JpegEncoder.php new file mode 100755 index 00000000..0e3ecb88 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Gd/Encoders/JpegEncoder.php @@ -0,0 +1,36 @@ +driver()->handleInput( + $this->driver()->config()->blendingColor + ); + + $output = Cloner::cloneBlended( + $image->core()->native(), + background: $blendingColor + ); + + return $this->createEncodedImage(function ($pointer) use ($output): void { + imageinterlace($output, $this->progressive); + imagejpeg($output, $pointer, $this->quality); + }, 'image/jpeg'); + } +} diff --git a/vendor/intervention/image/src/Drivers/Gd/Encoders/PngEncoder.php b/vendor/intervention/image/src/Drivers/Gd/Encoders/PngEncoder.php new file mode 100755 index 00000000..fc58e9f0 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Gd/Encoders/PngEncoder.php @@ -0,0 +1,52 @@ +prepareOutput($image); + + return $this->createEncodedImage(function ($pointer) use ($output): void { + imageinterlace($output, $this->interlaced); + imagepng($output, $pointer, -1); + }, 'image/png'); + } + + /** + * Prepare given image instance for PNG format output according to encoder settings + * + * @throws RuntimeException + * @throws ColorException + * @throws AnimationException + */ + private function prepareOutput(ImageInterface $image): GdImage + { + if ($this->indexed) { + $output = clone $image; + $output->reduceColors(255); + + return $output->core()->native(); + } + + return Cloner::clone($image->core()->native()); + } +} diff --git a/vendor/intervention/image/src/Drivers/Gd/Encoders/WebpEncoder.php b/vendor/intervention/image/src/Drivers/Gd/Encoders/WebpEncoder.php new file mode 100755 index 00000000..076c9155 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Gd/Encoders/WebpEncoder.php @@ -0,0 +1,27 @@ +quality === 100 && defined('IMG_WEBP_LOSSLESS') ? IMG_WEBP_LOSSLESS : $this->quality; + + return $this->createEncodedImage(function ($pointer) use ($image, $quality): void { + imagewebp($image->core()->native(), $pointer, $quality); + }, 'image/webp'); + } +} diff --git a/vendor/intervention/image/src/Drivers/Gd/FontProcessor.php b/vendor/intervention/image/src/Drivers/Gd/FontProcessor.php new file mode 100755 index 00000000..cedad439 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Gd/FontProcessor.php @@ -0,0 +1,107 @@ +hasFilename()) { + // calculate box size from gd font + $box = new Rectangle(0, 0); + $chars = mb_strlen($text); + if ($chars > 0) { + $box->setWidth( + $chars * $this->gdCharacterWidth((int) $font->filename()) + ); + $box->setHeight( + $this->gdCharacterHeight((int) $font->filename()) + ); + } + return $box; + } + + // build full path to font file to make sure to pass absolute path to imageftbbox() + // because of issues with different GD version behaving differently when passing + // relative paths to imageftbbox() + $fontPath = realpath($font->filename()); + if ($fontPath === false) { + throw new FontException('Font file ' . $font->filename() . ' does not exist.'); + } + + // calculate box size from ttf font file with angle 0 + $box = imageftbbox( + size: $this->nativeFontSize($font), + angle: 0, + font_filename: $fontPath, + string: $text, + ); + + if ($box === false) { + throw new FontException('Unable to calculate box size of font ' . $font->filename() . '.'); + } + + // build size from points + return new Rectangle( + width: intval(abs($box[6] - $box[4])), // difference of upper-left-x and upper-right-x + height: intval(abs($box[7] - $box[1])), // difference if upper-left-y and lower-left-y + pivot: new Point($box[6], $box[7]), // position of upper-left corner + ); + } + + /** + * {@inheritdoc} + * + * @see FontProcessorInterface::nativeFontSize() + */ + public function nativeFontSize(FontInterface $font): float + { + return floatval(round($font->size() * .76, 6)); + } + + /** + * {@inheritdoc} + * + * @see FontProcessorInterface::leading() + */ + public function leading(FontInterface $font): int + { + return (int) round(parent::leading($font) * .8); + } + + /** + * Return width of a single character + */ + protected function gdCharacterWidth(int $gdfont): int + { + return $gdfont + 4; + } + + /** + * Return height of a single character + */ + protected function gdCharacterHeight(int $gdfont): int + { + return match ($gdfont) { + 2, 3 => 14, + 4, 5 => 16, + default => 8, + }; + } +} diff --git a/vendor/intervention/image/src/Drivers/Gd/Frame.php b/vendor/intervention/image/src/Drivers/Gd/Frame.php new file mode 100755 index 00000000..e344f53f --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Gd/Frame.php @@ -0,0 +1,193 @@ +native = $native; + + return $this; + } + + /** + * {@inheritdoc} + * + * @see FrameInterface::native() + */ + public function native(): GdImage + { + return $this->native; + } + + /** + * {@inheritdoc} + * + * @see FrameInterface::size() + */ + public function size(): SizeInterface + { + return new Rectangle(imagesx($this->native), imagesy($this->native)); + } + + /** + * {@inheritdoc} + * + * @see FrameInterface::delay() + */ + public function delay(): float + { + return $this->delay; + } + + /** + * {@inheritdoc} + * + * @see FrameInterface::setDelay() + */ + public function setDelay(float $delay): FrameInterface + { + $this->delay = $delay; + + return $this; + } + + /** + * {@inheritdoc} + * + * @see FrameInterface::dispose() + */ + public function dispose(): int + { + return $this->dispose; + } + + /** + * {@inheritdoc} + * + * @see FrameInterface::setDispose() + * + * @throws InputException + */ + public function setDispose(int $dispose): FrameInterface + { + if (!in_array($dispose, [0, 1, 2, 3])) { + throw new InputException('Value for argument $dispose must be 0, 1, 2 or 3.'); + } + + $this->dispose = $dispose; + + return $this; + } + + /** + * {@inheritdoc} + * + * @see FrameInterface::setOffset() + */ + public function setOffset(int $left, int $top): FrameInterface + { + $this->offset_left = $left; + $this->offset_top = $top; + + return $this; + } + + /** + * {@inheritdoc} + * + * @see FrameInterface::offsetLeft() + */ + public function offsetLeft(): int + { + return $this->offset_left; + } + + /** + * {@inheritdoc} + * + * @see FrameInterface::setOffsetLeft() + */ + public function setOffsetLeft(int $offset): FrameInterface + { + $this->offset_left = $offset; + + return $this; + } + + /** + * {@inheritdoc} + * + * @see FrameInterface::offsetTop() + */ + public function offsetTop(): int + { + return $this->offset_top; + } + + /** + * {@inheritdoc} + * + * @see FrameInterface::setOffsetTop() + */ + public function setOffsetTop(int $offset): FrameInterface + { + $this->offset_top = $offset; + + return $this; + } + + /** + * This workaround helps cloning GdImages which is currently not possible. + * + * @throws ColorException + */ + public function __clone(): void + { + $this->native = Cloner::clone($this->native); + } +} diff --git a/vendor/intervention/image/src/Drivers/Gd/Modifiers/AlignRotationModifier.php b/vendor/intervention/image/src/Drivers/Gd/Modifiers/AlignRotationModifier.php new file mode 100755 index 00000000..4e453378 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Gd/Modifiers/AlignRotationModifier.php @@ -0,0 +1,52 @@ +exif('IFD0.Orientation')) { + 2 => $image->flop(), + 3 => $image->rotate(180), + 4 => $image->rotate(180)->flop(), + 5 => $image->rotate(270)->flop(), + 6 => $image->rotate(270), + 7 => $image->rotate(90)->flop(), + 8 => $image->rotate(90), + default => $image + }; + + return $this->markAligned($image); + } + + /** + * Set exif data of image to top-left orientation, marking the image as + * aligned and making sure the rotation correction process is not + * performed again. + */ + private function markAligned(ImageInterface $image): ImageInterface + { + $exif = $image->exif()->map(function ($item) { + if (is_array($item) && array_key_exists('Orientation', $item)) { + $item['Orientation'] = 1; + return $item; + } + + return $item; + }); + + return $image->setExif($exif); + } +} diff --git a/vendor/intervention/image/src/Drivers/Gd/Modifiers/BlendTransparencyModifier.php b/vendor/intervention/image/src/Drivers/Gd/Modifiers/BlendTransparencyModifier.php new file mode 100755 index 00000000..861d11cb --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Gd/Modifiers/BlendTransparencyModifier.php @@ -0,0 +1,36 @@ +blendingColor($this->driver()); + + foreach ($image as $frame) { + // create new canvas with blending color as background + $modified = Cloner::cloneBlended( + $frame->native(), + background: $blendingColor + ); + + // set new gd image + $frame->setNative($modified); + } + + return $image; + } +} diff --git a/vendor/intervention/image/src/Drivers/Gd/Modifiers/BlurModifier.php b/vendor/intervention/image/src/Drivers/Gd/Modifiers/BlurModifier.php new file mode 100755 index 00000000..14fe41a4 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Gd/Modifiers/BlurModifier.php @@ -0,0 +1,28 @@ +amount; $i++) { + imagefilter($frame->native(), IMG_FILTER_GAUSSIAN_BLUR); + } + } + + return $image; + } +} diff --git a/vendor/intervention/image/src/Drivers/Gd/Modifiers/BrightnessModifier.php b/vendor/intervention/image/src/Drivers/Gd/Modifiers/BrightnessModifier.php new file mode 100755 index 00000000..022c679a --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Gd/Modifiers/BrightnessModifier.php @@ -0,0 +1,26 @@ +native(), IMG_FILTER_BRIGHTNESS, intval($this->level * 2.55)); + } + + return $image; + } +} diff --git a/vendor/intervention/image/src/Drivers/Gd/Modifiers/ColorizeModifier.php b/vendor/intervention/image/src/Drivers/Gd/Modifiers/ColorizeModifier.php new file mode 100755 index 00000000..c753e438 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Gd/Modifiers/ColorizeModifier.php @@ -0,0 +1,31 @@ +red * 2.55); + $green = (int) round($this->green * 2.55); + $blue = (int) round($this->blue * 2.55); + + foreach ($image as $frame) { + imagefilter($frame->native(), IMG_FILTER_COLORIZE, $red, $green, $blue); + } + + return $image; + } +} diff --git a/vendor/intervention/image/src/Drivers/Gd/Modifiers/ColorspaceModifier.php b/vendor/intervention/image/src/Drivers/Gd/Modifiers/ColorspaceModifier.php new file mode 100755 index 00000000..2065a155 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Gd/Modifiers/ColorspaceModifier.php @@ -0,0 +1,30 @@ +targetColorspace() instanceof RgbColorspace)) { + throw new NotSupportedException( + 'Only RGB colorspace is supported by GD driver.' + ); + } + + return $image; + } +} diff --git a/vendor/intervention/image/src/Drivers/Gd/Modifiers/ContainModifier.php b/vendor/intervention/image/src/Drivers/Gd/Modifiers/ContainModifier.php new file mode 100755 index 00000000..8462e8ef --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Gd/Modifiers/ContainModifier.php @@ -0,0 +1,93 @@ +getCropSize($image); + $resize = $this->getResizeSize($image); + $background = $this->driver()->handleInput($this->background); + $blendingColor = $this->driver()->handleInput( + $this->driver()->config()->blendingColor + ); + + foreach ($image as $frame) { + $this->modify($frame, $crop, $resize, $background, $blendingColor); + } + + return $image; + } + + /** + * @throws ColorException + */ + protected function modify( + FrameInterface $frame, + SizeInterface $crop, + SizeInterface $resize, + ColorInterface $background, + ColorInterface $blendingColor + ): void { + // create new gd image + $modified = Cloner::cloneEmpty($frame->native(), $resize, $background); + + // make image area transparent to keep transparency + // even if background-color is set + $transparent = imagecolorallocatealpha( + $modified, + $blendingColor->channel(Red::class)->value(), + $blendingColor->channel(Green::class)->value(), + $blendingColor->channel(Blue::class)->value(), + 127, + ); + imagealphablending($modified, false); // do not blend / just overwrite + imagecolortransparent($modified, $transparent); + imagefilledrectangle( + $modified, + $crop->pivot()->x(), + $crop->pivot()->y(), + $crop->pivot()->x() + $crop->width() - 1, + $crop->pivot()->y() + $crop->height() - 1, + $transparent + ); + + // copy image from original with blending alpha + imagealphablending($modified, true); + imagecopyresampled( + $modified, + $frame->native(), + $crop->pivot()->x(), + $crop->pivot()->y(), + 0, + 0, + $crop->width(), + $crop->height(), + $frame->size()->width(), + $frame->size()->height() + ); + + // set new content as resource + $frame->setNative($modified); + } +} diff --git a/vendor/intervention/image/src/Drivers/Gd/Modifiers/ContrastModifier.php b/vendor/intervention/image/src/Drivers/Gd/Modifiers/ContrastModifier.php new file mode 100755 index 00000000..7a0ac6b8 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Gd/Modifiers/ContrastModifier.php @@ -0,0 +1,26 @@ +native(), IMG_FILTER_CONTRAST, ($this->level * -1)); + } + + return $image; + } +} diff --git a/vendor/intervention/image/src/Drivers/Gd/Modifiers/CoverDownModifier.php b/vendor/intervention/image/src/Drivers/Gd/Modifiers/CoverDownModifier.php new file mode 100755 index 00000000..ac1cec11 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Gd/Modifiers/CoverDownModifier.php @@ -0,0 +1,19 @@ +resizeDown($this->width, $this->height); + } +} diff --git a/vendor/intervention/image/src/Drivers/Gd/Modifiers/CoverModifier.php b/vendor/intervention/image/src/Drivers/Gd/Modifiers/CoverModifier.php new file mode 100755 index 00000000..e676e663 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Gd/Modifiers/CoverModifier.php @@ -0,0 +1,59 @@ +getCropSize($image); + $resize = $this->getResizeSize($crop); + + foreach ($image as $frame) { + $this->modifyFrame($frame, $crop, $resize); + } + + return $image; + } + + /** + * @throws ColorException + */ + protected function modifyFrame(FrameInterface $frame, SizeInterface $crop, SizeInterface $resize): void + { + // create new image + $modified = Cloner::cloneEmpty($frame->native(), $resize); + + // copy content from resource + imagecopyresampled( + $modified, + $frame->native(), + 0, + 0, + $crop->pivot()->x(), + $crop->pivot()->y(), + $resize->width(), + $resize->height(), + $crop->width(), + $crop->height() + ); + + // set new content as resource + $frame->setNative($modified); + } +} diff --git a/vendor/intervention/image/src/Drivers/Gd/Modifiers/CropModifier.php b/vendor/intervention/image/src/Drivers/Gd/Modifiers/CropModifier.php new file mode 100755 index 00000000..c1ea4825 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Gd/Modifiers/CropModifier.php @@ -0,0 +1,78 @@ +size(); + $crop = $this->crop($image); + $background = $this->driver()->handleInput($this->background); + + foreach ($image as $frame) { + $this->cropFrame($frame, $originalSize, $crop, $background); + } + + return $image; + } + + /** + * @throws ColorException + */ + protected function cropFrame( + FrameInterface $frame, + SizeInterface $originalSize, + SizeInterface $resizeTo, + ColorInterface $background + ): void { + // create new image with transparent background + $modified = Cloner::cloneEmpty($frame->native(), $resizeTo, $background); + + // define offset + $offset_x = $resizeTo->pivot()->x() + $this->offset_x; + $offset_y = $resizeTo->pivot()->y() + $this->offset_y; + + // define target width & height + $targetWidth = min($resizeTo->width(), $originalSize->width()); + $targetHeight = min($resizeTo->height(), $originalSize->height()); + $targetWidth = $targetWidth < $originalSize->width() ? $targetWidth + $offset_x : $targetWidth; + $targetHeight = $targetHeight < $originalSize->height() ? $targetHeight + $offset_y : $targetHeight; + + // don't alpha blend for copy operation to keep transparent areas of original image + imagealphablending($modified, false); + + // copy content from resource + imagecopyresampled( + $modified, + $frame->native(), + $offset_x * -1, + $offset_y * -1, + 0, + 0, + $targetWidth, + $targetHeight, + $targetWidth, + $targetHeight + ); + + // set new content as resource + $frame->setNative($modified); + } +} diff --git a/vendor/intervention/image/src/Drivers/Gd/Modifiers/DrawBezierModifier.php b/vendor/intervention/image/src/Drivers/Gd/Modifiers/DrawBezierModifier.php new file mode 100755 index 00000000..768d6f85 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Gd/Modifiers/DrawBezierModifier.php @@ -0,0 +1,234 @@ +drawable->count() !== 3 && $this->drawable->count() !== 4) { + throw new GeometryException('You must specify either 3 or 4 points to create a bezier curve'); + } + + [$polygon, $polygon_border_segments] = $this->calculateBezierPoints(); + + if ($this->drawable->hasBackgroundColor() || $this->drawable->hasBorder()) { + imagealphablending($frame->native(), true); + imageantialias($frame->native(), true); + } + + if ($this->drawable->hasBackgroundColor()) { + $background_color = $this->driver()->colorProcessor($image->colorspace())->colorToNative( + $this->backgroundColor() + ); + + imagesetthickness($frame->native(), 0); + imagefilledpolygon( + $frame->native(), + $polygon, + $background_color + ); + } + + if ($this->drawable->hasBorder() && $this->drawable->borderSize() > 0) { + $border_color = $this->driver()->colorProcessor($image->colorspace())->colorToNative( + $this->borderColor() + ); + + if ($this->drawable->borderSize() === 1) { + imagesetthickness($frame->native(), $this->drawable->borderSize()); + + $count = count($polygon); + for ($i = 0; $i < $count; $i += 2) { + if (array_key_exists($i + 2, $polygon) && array_key_exists($i + 3, $polygon)) { + imageline( + $frame->native(), + $polygon[$i], + $polygon[$i + 1], + $polygon[$i + 2], + $polygon[$i + 3], + $border_color + ); + } + } + } else { + $polygon_border_segments_total = count($polygon_border_segments); + + for ($i = 0; $i < $polygon_border_segments_total; $i += 1) { + imagefilledpolygon( + $frame->native(), + $polygon_border_segments[$i], + $border_color + ); + } + } + } + } + + return $image; + } + + /** + * Calculate interpolation points for quadratic beziers using the Bernstein polynomial form + * + * @return array{'x': float, 'y': float} + */ + private function calculateQuadraticBezierInterpolationPoint(float $t = 0.05): array + { + $remainder = 1 - $t; + $control_point_1_multiplier = $remainder * $remainder; + $control_point_2_multiplier = $remainder * $t * 2; + $control_point_3_multiplier = $t * $t; + + $x = ( + $this->drawable->first()->x() * $control_point_1_multiplier + + $this->drawable->second()->x() * $control_point_2_multiplier + + $this->drawable->last()->x() * $control_point_3_multiplier + ); + $y = ( + $this->drawable->first()->y() * $control_point_1_multiplier + + $this->drawable->second()->y() * $control_point_2_multiplier + + $this->drawable->last()->y() * $control_point_3_multiplier + ); + + return ['x' => $x, 'y' => $y]; + } + + /** + * Calculate interpolation points for cubic beziers using the Bernstein polynomial form + * + * @return array{'x': float, 'y': float} + */ + private function calculateCubicBezierInterpolationPoint(float $t = 0.05): array + { + $remainder = 1 - $t; + $t_squared = $t * $t; + $remainder_squared = $remainder * $remainder; + $control_point_1_multiplier = $remainder_squared * $remainder; + $control_point_2_multiplier = $remainder_squared * $t * 3; + $control_point_3_multiplier = $t_squared * $remainder * 3; + $control_point_4_multiplier = $t_squared * $t; + + $x = ( + $this->drawable->first()->x() * $control_point_1_multiplier + + $this->drawable->second()->x() * $control_point_2_multiplier + + $this->drawable->third()->x() * $control_point_3_multiplier + + $this->drawable->last()->x() * $control_point_4_multiplier + ); + $y = ( + $this->drawable->first()->y() * $control_point_1_multiplier + + $this->drawable->second()->y() * $control_point_2_multiplier + + $this->drawable->third()->y() * $control_point_3_multiplier + + $this->drawable->last()->y() * $control_point_4_multiplier + ); + + return ['x' => $x, 'y' => $y]; + } + + /** + * Calculate the points needed to draw a quadratic or cubic bezier with optional border/stroke + * + * @throws GeometryException + * @return array{0: array, 1: array} + */ + private function calculateBezierPoints(): array + { + if ($this->drawable->count() !== 3 && $this->drawable->count() !== 4) { + throw new GeometryException('You must specify either 3 or 4 points to create a bezier curve'); + } + + $polygon = []; + $inner_polygon = []; + $outer_polygon = []; + $polygon_border_segments = []; + + // define ratio t; equivalent to 5 percent distance along edge + $t = 0.05; + + $polygon[] = $this->drawable->first()->x(); + $polygon[] = $this->drawable->first()->y(); + for ($i = $t; $i < 1; $i += $t) { + if ($this->drawable->count() === 3) { + $ip = $this->calculateQuadraticBezierInterpolationPoint($i); + } elseif ($this->drawable->count() === 4) { + $ip = $this->calculateCubicBezierInterpolationPoint($i); + } + $polygon[] = (int) $ip['x']; + $polygon[] = (int) $ip['y']; + } + $polygon[] = $this->drawable->last()->x(); + $polygon[] = $this->drawable->last()->y(); + + if ($this->drawable->hasBorder() && $this->drawable->borderSize() > 1) { + // create the border/stroke effect by calculating two new curves with offset positions + // from the main polygon and then connecting the inner/outer curves to create separate + // 4-point polygon segments + $polygon_total_points = count($polygon); + $offset = ($this->drawable->borderSize() / 2); + + for ($i = 0; $i < $polygon_total_points; $i += 2) { + if (array_key_exists($i + 2, $polygon) && array_key_exists($i + 3, $polygon)) { + $dx = $polygon[$i + 2] - $polygon[$i]; + $dy = $polygon[$i + 3] - $polygon[$i + 1]; + $dxy_sqrt = ($dx * $dx + $dy * $dy) ** 0.5; + + // inner polygon + $scale = $offset / $dxy_sqrt; + $ox = -$dy * $scale; + $oy = $dx * $scale; + + $inner_polygon[] = $ox + $polygon[$i]; + $inner_polygon[] = $oy + $polygon[$i + 1]; + $inner_polygon[] = $ox + $polygon[$i + 2]; + $inner_polygon[] = $oy + $polygon[$i + 3]; + + // outer polygon + $scale = -$offset / $dxy_sqrt; + $ox = -$dy * $scale; + $oy = $dx * $scale; + + $outer_polygon[] = $ox + $polygon[$i]; + $outer_polygon[] = $oy + $polygon[$i + 1]; + $outer_polygon[] = $ox + $polygon[$i + 2]; + $outer_polygon[] = $oy + $polygon[$i + 3]; + } + } + + $inner_polygon_total_points = count($inner_polygon); + + for ($i = 0; $i < $inner_polygon_total_points; $i += 2) { + if (array_key_exists($i + 2, $inner_polygon) && array_key_exists($i + 3, $inner_polygon)) { + $polygon_border_segments[] = [ + $inner_polygon[$i], + $inner_polygon[$i + 1], + $outer_polygon[$i], + $outer_polygon[$i + 1], + $outer_polygon[$i + 2], + $outer_polygon[$i + 3], + $inner_polygon[$i + 2], + $inner_polygon[$i + 3], + ]; + } + } + } + + return [$polygon, $polygon_border_segments]; + } +} diff --git a/vendor/intervention/image/src/Drivers/Gd/Modifiers/DrawEllipseModifier.php b/vendor/intervention/image/src/Drivers/Gd/Modifiers/DrawEllipseModifier.php new file mode 100755 index 00000000..4c4f6696 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Gd/Modifiers/DrawEllipseModifier.php @@ -0,0 +1,78 @@ +drawable->hasBorder()) { + imagealphablending($frame->native(), true); + + // slightly smaller ellipse to keep 1px bordered edges clean + if ($this->drawable->hasBackgroundColor()) { + imagefilledellipse( + $frame->native(), + $this->drawable()->position()->x(), + $this->drawable->position()->y(), + $this->drawable->width() - 1, + $this->drawable->height() - 1, + $this->driver()->colorProcessor($image->colorspace())->colorToNative( + $this->backgroundColor() + ) + ); + } + + // gd's imageellipse ignores imagesetthickness + // so i use imagearc with 360 degrees instead. + imagesetthickness( + $frame->native(), + $this->drawable->borderSize(), + ); + + imagearc( + $frame->native(), + $this->drawable()->position()->x(), + $this->drawable()->position()->y(), + $this->drawable->width(), + $this->drawable->height(), + 0, + 360, + $this->driver()->colorProcessor($image->colorspace())->colorToNative( + $this->borderColor() + ) + ); + } else { + imagealphablending($frame->native(), true); + imagesetthickness($frame->native(), 0); + imagefilledellipse( + $frame->native(), + $this->drawable()->position()->x(), + $this->drawable()->position()->y(), + $this->drawable->width(), + $this->drawable->height(), + $this->driver()->colorProcessor($image->colorspace())->colorToNative( + $this->backgroundColor() + ) + ); + } + } + + return $image; + } +} diff --git a/vendor/intervention/image/src/Drivers/Gd/Modifiers/DrawLineModifier.php b/vendor/intervention/image/src/Drivers/Gd/Modifiers/DrawLineModifier.php new file mode 100755 index 00000000..ccf6974f --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Gd/Modifiers/DrawLineModifier.php @@ -0,0 +1,39 @@ +driver()->colorProcessor($image->colorspace())->colorToNative( + $this->backgroundColor() + ); + + foreach ($image as $frame) { + imagealphablending($frame->native(), true); + imageantialias($frame->native(), true); + imagesetthickness($frame->native(), $this->drawable->width()); + imageline( + $frame->native(), + $this->drawable->start()->x(), + $this->drawable->start()->y(), + $this->drawable->end()->x(), + $this->drawable->end()->y(), + $color + ); + } + + return $image; + } +} diff --git a/vendor/intervention/image/src/Drivers/Gd/Modifiers/DrawPixelModifier.php b/vendor/intervention/image/src/Drivers/Gd/Modifiers/DrawPixelModifier.php new file mode 100755 index 00000000..9fc954cd --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Gd/Modifiers/DrawPixelModifier.php @@ -0,0 +1,36 @@ +driver()->colorProcessor($image->colorspace())->colorToNative( + $this->driver()->handleInput($this->color) + ); + + foreach ($image as $frame) { + imagealphablending($frame->native(), true); + imagesetpixel( + $frame->native(), + $this->position->x(), + $this->position->y(), + $color + ); + } + + return $image; + } +} diff --git a/vendor/intervention/image/src/Drivers/Gd/Modifiers/DrawPolygonModifier.php b/vendor/intervention/image/src/Drivers/Gd/Modifiers/DrawPolygonModifier.php new file mode 100755 index 00000000..c0cc77b1 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Gd/Modifiers/DrawPolygonModifier.php @@ -0,0 +1,51 @@ +drawable->hasBackgroundColor()) { + imagealphablending($frame->native(), true); + imagesetthickness($frame->native(), 0); + imagefilledpolygon( + $frame->native(), + $this->drawable->toArray(), + $this->driver()->colorProcessor($image->colorspace())->colorToNative( + $this->backgroundColor() + ) + ); + } + + if ($this->drawable->hasBorder()) { + imagealphablending($frame->native(), true); + imagesetthickness($frame->native(), $this->drawable->borderSize()); + imagepolygon( + $frame->native(), + $this->drawable->toArray(), + $this->driver()->colorProcessor($image->colorspace())->colorToNative( + $this->borderColor() + ) + ); + } + } + + return $image; + } +} diff --git a/vendor/intervention/image/src/Drivers/Gd/Modifiers/DrawRectangleModifier.php b/vendor/intervention/image/src/Drivers/Gd/Modifiers/DrawRectangleModifier.php new file mode 100755 index 00000000..f4a2d790 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Gd/Modifiers/DrawRectangleModifier.php @@ -0,0 +1,61 @@ +drawable->position(); + + foreach ($image as $frame) { + // draw background + if ($this->drawable->hasBackgroundColor()) { + imagealphablending($frame->native(), true); + imagesetthickness($frame->native(), 0); + imagefilledrectangle( + $frame->native(), + $position->x(), + $position->y(), + $position->x() + $this->drawable->width(), + $position->y() + $this->drawable->height(), + $this->driver()->colorProcessor($image->colorspace())->colorToNative( + $this->backgroundColor() + ) + ); + } + + // draw border + if ($this->drawable->hasBorder()) { + imagealphablending($frame->native(), true); + imagesetthickness($frame->native(), $this->drawable->borderSize()); + imagerectangle( + $frame->native(), + $position->x(), + $position->y(), + $position->x() + $this->drawable->width(), + $position->y() + $this->drawable->height(), + $this->driver()->colorProcessor($image->colorspace())->colorToNative( + $this->borderColor() + ) + ); + } + } + + return $image; + } +} diff --git a/vendor/intervention/image/src/Drivers/Gd/Modifiers/FillModifier.php b/vendor/intervention/image/src/Drivers/Gd/Modifiers/FillModifier.php new file mode 100755 index 00000000..412f8059 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Gd/Modifiers/FillModifier.php @@ -0,0 +1,67 @@ +color($image); + + foreach ($image as $frame) { + if ($this->hasPosition()) { + $this->floodFillWithColor($frame, $color); + } else { + $this->fillAllWithColor($frame, $color); + } + } + + return $image; + } + + /** + * @throws RuntimeException + */ + private function color(ImageInterface $image): int + { + return $this->driver()->colorProcessor($image->colorspace())->colorToNative( + $this->driver()->handleInput($this->color) + ); + } + + private function floodFillWithColor(FrameInterface $frame, int $color): void + { + imagefill( + $frame->native(), + $this->position->x(), + $this->position->y(), + $color + ); + } + + private function fillAllWithColor(FrameInterface $frame, int $color): void + { + imagealphablending($frame->native(), true); + imagefilledrectangle( + $frame->native(), + 0, + 0, + $frame->size()->width() - 1, + $frame->size()->height() - 1, + $color + ); + } +} diff --git a/vendor/intervention/image/src/Drivers/Gd/Modifiers/FlipModifier.php b/vendor/intervention/image/src/Drivers/Gd/Modifiers/FlipModifier.php new file mode 100755 index 00000000..0107200a --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Gd/Modifiers/FlipModifier.php @@ -0,0 +1,26 @@ +native(), IMG_FLIP_VERTICAL); + } + + return $image; + } +} diff --git a/vendor/intervention/image/src/Drivers/Gd/Modifiers/FlopModifier.php b/vendor/intervention/image/src/Drivers/Gd/Modifiers/FlopModifier.php new file mode 100755 index 00000000..70331754 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Gd/Modifiers/FlopModifier.php @@ -0,0 +1,26 @@ +native(), IMG_FLIP_HORIZONTAL); + } + + return $image; + } +} diff --git a/vendor/intervention/image/src/Drivers/Gd/Modifiers/GammaModifier.php b/vendor/intervention/image/src/Drivers/Gd/Modifiers/GammaModifier.php new file mode 100755 index 00000000..8da6499e --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Gd/Modifiers/GammaModifier.php @@ -0,0 +1,26 @@ +native(), 1, $this->gamma); + } + + return $image; + } +} diff --git a/vendor/intervention/image/src/Drivers/Gd/Modifiers/GreyscaleModifier.php b/vendor/intervention/image/src/Drivers/Gd/Modifiers/GreyscaleModifier.php new file mode 100755 index 00000000..a1cf280a --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Gd/Modifiers/GreyscaleModifier.php @@ -0,0 +1,26 @@ +native(), IMG_FILTER_GRAYSCALE); + } + + return $image; + } +} diff --git a/vendor/intervention/image/src/Drivers/Gd/Modifiers/InvertModifier.php b/vendor/intervention/image/src/Drivers/Gd/Modifiers/InvertModifier.php new file mode 100755 index 00000000..e2c8dc67 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Gd/Modifiers/InvertModifier.php @@ -0,0 +1,26 @@ +native(), IMG_FILTER_NEGATE); + } + + return $image; + } +} diff --git a/vendor/intervention/image/src/Drivers/Gd/Modifiers/PadModifier.php b/vendor/intervention/image/src/Drivers/Gd/Modifiers/PadModifier.php new file mode 100755 index 00000000..52a6acb0 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Gd/Modifiers/PadModifier.php @@ -0,0 +1,24 @@ +size() + ->containMax( + $this->width, + $this->height + ) + ->alignPivotTo( + $this->getResizeSize($image), + $this->position + ); + } +} diff --git a/vendor/intervention/image/src/Drivers/Gd/Modifiers/PixelateModifier.php b/vendor/intervention/image/src/Drivers/Gd/Modifiers/PixelateModifier.php new file mode 100755 index 00000000..ecbe3e58 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Gd/Modifiers/PixelateModifier.php @@ -0,0 +1,26 @@ +native(), IMG_FILTER_PIXELATE, $this->size, true); + } + + return $image; + } +} diff --git a/vendor/intervention/image/src/Drivers/Gd/Modifiers/PlaceModifier.php b/vendor/intervention/image/src/Drivers/Gd/Modifiers/PlaceModifier.php new file mode 100755 index 00000000..44333c74 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Gd/Modifiers/PlaceModifier.php @@ -0,0 +1,111 @@ +driver()->handleInput($this->element); + $position = $this->getPosition($image, $watermark); + + foreach ($image as $frame) { + imagealphablending($frame->native(), true); + + if ($this->opacity === 100) { + $this->placeOpaque($frame, $watermark, $position); + } else { + $this->placeTransparent($frame, $watermark, $position); + } + } + + return $image; + } + + /** + * Insert watermark with 100% opacity + * + * @throws RuntimeException + */ + private function placeOpaque(FrameInterface $frame, ImageInterface $watermark, PointInterface $position): void + { + imagecopy( + $frame->native(), + $watermark->core()->native(), + $position->x(), + $position->y(), + 0, + 0, + $watermark->width(), + $watermark->height() + ); + } + + /** + * Insert watermark transparent with current opacity + * + * Unfortunately, the original PHP function imagecopymerge does not work reliably. + * For example, any transparency of the image to be inserted is not applied correctly. + * For this reason, a new GDImage is created into which the original image is inserted + * in the first step and the watermark is inserted with 100% opacity in the second + * step. This combination is then transferred to the original image again with the + * respective opacity. + * + * Please note: Unfortunately, there is still an edge case, when a transparent image + * is placed on a transparent background, the "double" transparent areas appear opaque! + * + * @throws RuntimeException + */ + private function placeTransparent(FrameInterface $frame, ImageInterface $watermark, PointInterface $position): void + { + $cut = imagecreatetruecolor($watermark->width(), $watermark->height()); + + imagecopy( + $cut, + $frame->native(), + 0, + 0, + $position->x(), + $position->y(), + imagesx($cut), + imagesy($cut) + ); + + imagecopy( + $cut, + $watermark->core()->native(), + 0, + 0, + 0, + 0, + imagesx($cut), + imagesy($cut) + ); + + imagecopymerge( + $frame->native(), + $cut, + $position->x(), + $position->y(), + 0, + 0, + $watermark->width(), + $watermark->height(), + $this->opacity + ); + } +} diff --git a/vendor/intervention/image/src/Drivers/Gd/Modifiers/ProfileModifier.php b/vendor/intervention/image/src/Drivers/Gd/Modifiers/ProfileModifier.php new file mode 100755 index 00000000..a862395b --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Gd/Modifiers/ProfileModifier.php @@ -0,0 +1,25 @@ +limit <= 0) { + throw new InputException('Quantization limit must be greater than 0.'); + } + + // no color reduction if the limit is higher than the colors in the img + $colorCount = imagecolorstotal($image->core()->native()); + if ($colorCount > 0 && $this->limit > $colorCount) { + return $image; + } + + $width = $image->width(); + $height = $image->height(); + + $background = $this->driver()->colorProcessor($image->colorspace())->colorToNative( + $this->driver()->handleInput($this->background) + ); + + $blendingColor = $this->driver()->handleInput( + $this->driver()->config()->blendingColor + ); + + foreach ($image as $frame) { + // create new image for color quantization + $reduced = Cloner::cloneEmpty($frame->native(), background: $blendingColor); + + // fill with background + imagefill($reduced, 0, 0, $background); + + // set transparency + imagecolortransparent($reduced, $background); + + // copy original image (colors are limited automatically in the copy process) + imagecopy($reduced, $frame->native(), 0, 0, 0, 0, $width, $height); + + // gd library does not support color quantization directly therefore the + // colors are decrease by transforming the image to a palette version + imagetruecolortopalette($reduced, true, $this->limit); + + $frame->setNative($reduced); + } + + return $image; + } +} diff --git a/vendor/intervention/image/src/Drivers/Gd/Modifiers/RemoveAnimationModifier.php b/vendor/intervention/image/src/Drivers/Gd/Modifiers/RemoveAnimationModifier.php new file mode 100755 index 00000000..2ef1d89a --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Gd/Modifiers/RemoveAnimationModifier.php @@ -0,0 +1,26 @@ +core()->setNative( + $this->selectedFrame($image)->native() + ); + + return $image; + } +} diff --git a/vendor/intervention/image/src/Drivers/Gd/Modifiers/ResizeCanvasModifier.php b/vendor/intervention/image/src/Drivers/Gd/Modifiers/ResizeCanvasModifier.php new file mode 100755 index 00000000..7f73cc73 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Gd/Modifiers/ResizeCanvasModifier.php @@ -0,0 +1,32 @@ +cropSize($image); + + $image->modify(new CropModifier( + $cropSize->width(), + $cropSize->height(), + $cropSize->pivot()->x(), + $cropSize->pivot()->y(), + $this->background, + )); + + return $image; + } +} diff --git a/vendor/intervention/image/src/Drivers/Gd/Modifiers/ResizeCanvasRelativeModifier.php b/vendor/intervention/image/src/Drivers/Gd/Modifiers/ResizeCanvasRelativeModifier.php new file mode 100755 index 00000000..53e375ff --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Gd/Modifiers/ResizeCanvasRelativeModifier.php @@ -0,0 +1,16 @@ +size()->resizeDown($this->width, $this->height); + } +} diff --git a/vendor/intervention/image/src/Drivers/Gd/Modifiers/ResizeModifier.php b/vendor/intervention/image/src/Drivers/Gd/Modifiers/ResizeModifier.php new file mode 100755 index 00000000..cfaa295d --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Gd/Modifiers/ResizeModifier.php @@ -0,0 +1,70 @@ +getAdjustedSize($image); + foreach ($image as $frame) { + $this->resizeFrame($frame, $resizeTo); + } + + return $image; + } + + /** + * @throws ColorException + */ + private function resizeFrame(FrameInterface $frame, SizeInterface $resizeTo): void + { + // create empty canvas in target size + $modified = Cloner::cloneEmpty($frame->native(), $resizeTo); + + // copy content from resource + imagecopyresampled( + $modified, + $frame->native(), + $resizeTo->pivot()->x(), + $resizeTo->pivot()->y(), + 0, + 0, + $resizeTo->width(), + $resizeTo->height(), + $frame->size()->width(), + $frame->size()->height() + ); + + // set new content as resource + $frame->setNative($modified); + } + + /** + * Return the size the modifier will resize to + * + * @throws RuntimeException + * @throws GeometryException + */ + protected function getAdjustedSize(ImageInterface $image): SizeInterface + { + return $image->size()->resize($this->width, $this->height); + } +} diff --git a/vendor/intervention/image/src/Drivers/Gd/Modifiers/ResolutionModifier.php b/vendor/intervention/image/src/Drivers/Gd/Modifiers/ResolutionModifier.php new file mode 100755 index 00000000..d6fd504c --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Gd/Modifiers/ResolutionModifier.php @@ -0,0 +1,29 @@ +x)); + $y = intval(round($this->y)); + + foreach ($image as $frame) { + imageresolution($frame->native(), $x, $y); + } + + return $image; + } +} diff --git a/vendor/intervention/image/src/Drivers/Gd/Modifiers/RotateModifier.php b/vendor/intervention/image/src/Drivers/Gd/Modifiers/RotateModifier.php new file mode 100755 index 00000000..4db07502 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Gd/Modifiers/RotateModifier.php @@ -0,0 +1,106 @@ +driver()->handleInput($this->background); + + foreach ($image as $frame) { + $this->modifyFrame($frame, $background); + } + + return $image; + } + + /** + * Apply rotation modification on given frame, given background + * color is used for newly create image areas + * + * @throws ColorException + */ + protected function modifyFrame(FrameInterface $frame, ColorInterface $background): void + { + // get transparent color from frame core + $transparent = match ($transparent = imagecolortransparent($frame->native())) { + -1 => imagecolorallocatealpha( + $frame->native(), + $background->channel(Red::class)->value(), + $background->channel(Green::class)->value(), + $background->channel(Blue::class)->value(), + 127 + ), + default => $transparent, + }; + + // rotate original image against transparent background + $rotated = imagerotate( + $frame->native(), + $this->rotationAngle(), + $transparent + ); + + // create size from original after rotation + $container = (new Rectangle( + imagesx($rotated), + imagesy($rotated), + ))->movePivot('center'); + + // create size from original and rotate points + $cutout = (new Rectangle( + imagesx($frame->native()), + imagesy($frame->native()), + $container->pivot() + ))->align('center') + ->valign('center') + ->rotate($this->rotationAngle() * -1); + + // create new gd image + $modified = Cloner::cloneEmpty($frame->native(), $container, $background); + + // draw the cutout on new gd image to have a transparent + // background where the rotated image will be placed + imagealphablending($modified, false); + imagefilledpolygon( + $modified, + $cutout->toArray(), + imagecolortransparent($modified) + ); + + // place rotated image on new gd image + imagealphablending($modified, true); + imagecopy( + $modified, + $rotated, + 0, + 0, + 0, + 0, + imagesx($rotated), + imagesy($rotated) + ); + + $frame->setNative($modified); + } +} diff --git a/vendor/intervention/image/src/Drivers/Gd/Modifiers/ScaleDownModifier.php b/vendor/intervention/image/src/Drivers/Gd/Modifiers/ScaleDownModifier.php new file mode 100755 index 00000000..15287e6c --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Gd/Modifiers/ScaleDownModifier.php @@ -0,0 +1,21 @@ +size()->scaleDown($this->width, $this->height); + } +} diff --git a/vendor/intervention/image/src/Drivers/Gd/Modifiers/ScaleModifier.php b/vendor/intervention/image/src/Drivers/Gd/Modifiers/ScaleModifier.php new file mode 100755 index 00000000..2486cbb6 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Gd/Modifiers/ScaleModifier.php @@ -0,0 +1,16 @@ +size()->scale($this->width, $this->height); + } +} diff --git a/vendor/intervention/image/src/Drivers/Gd/Modifiers/SharpenModifier.php b/vendor/intervention/image/src/Drivers/Gd/Modifiers/SharpenModifier.php new file mode 100755 index 00000000..3943d2cb --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Gd/Modifiers/SharpenModifier.php @@ -0,0 +1,45 @@ +matrix(); + foreach ($image as $frame) { + imageconvolution($frame->native(), $matrix, 1, 0); + } + + return $image; + } + + /** + * Create matrix to be used by imageconvolution() + * + * @return array> + */ + private function matrix(): array + { + $min = $this->amount >= 10 ? $this->amount * -0.01 : 0; + $max = $this->amount * -0.025; + $abs = ((4 * $min + 4 * $max) * -1) + 1; + + return [ + [$min, $max, $min], + [$max, $abs, $max], + [$min, $max, $min] + ]; + } +} diff --git a/vendor/intervention/image/src/Drivers/Gd/Modifiers/SliceAnimationModifier.php b/vendor/intervention/image/src/Drivers/Gd/Modifiers/SliceAnimationModifier.php new file mode 100755 index 00000000..8986e7fe --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Gd/Modifiers/SliceAnimationModifier.php @@ -0,0 +1,29 @@ +offset >= $image->count()) { + throw new AnimationException('Offset is not in the range of frames.'); + } + + $image->core()->slice($this->offset, $this->length); + + return $image; + } +} diff --git a/vendor/intervention/image/src/Drivers/Gd/Modifiers/TextModifier.php b/vendor/intervention/image/src/Drivers/Gd/Modifiers/TextModifier.php new file mode 100755 index 00000000..074f904c --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Gd/Modifiers/TextModifier.php @@ -0,0 +1,145 @@ +driver()->fontProcessor(); + $lines = $fontProcessor->textBlock($this->text, $this->font, $this->position); + + // decode text colors + $textColor = $this->gdTextColor($image); + $strokeColor = $this->gdStrokeColor($image); + + // build full path to font file to make sure to pass absolute path to imageftbbox() + // because of issues with different GD version behaving differently when passing + // relative paths to imagettftext() + $fontPath = $this->font->hasFilename() ? realpath($this->font->filename()) : false; + if ($this->font->hasFilename() && $fontPath === false) { + throw new FontException('Font file ' . $this->font->filename() . ' does not exist.'); + } + + foreach ($image as $frame) { + imagealphablending($frame->native(), true); + if ($this->font->hasFilename()) { + foreach ($lines as $line) { + foreach ($this->strokeOffsets($this->font) as $offset) { + imagettftext( + image: $frame->native(), + size: $fontProcessor->nativeFontSize($this->font), + angle: $this->font->angle() * -1, + x: $line->position()->x() + $offset->x(), + y: $line->position()->y() + $offset->y(), + color: $strokeColor, + font_filename: $fontPath, + text: (string) $line + ); + } + + imagettftext( + image: $frame->native(), + size: $fontProcessor->nativeFontSize($this->font), + angle: $this->font->angle() * -1, + x: $line->position()->x(), + y: $line->position()->y(), + color: $textColor, + font_filename: $fontPath, + text: (string) $line + ); + } + } else { + foreach ($lines as $line) { + foreach ($this->strokeOffsets($this->font) as $offset) { + imagestring( + $frame->native(), + $this->gdFont(), + $line->position()->x() + $offset->x(), + $line->position()->y() + $offset->y(), + (string) $line, + $strokeColor + ); + } + + imagestring( + $frame->native(), + $this->gdFont(), + $line->position()->x(), + $line->position()->y(), + (string) $line, + $textColor + ); + } + } + } + + return $image; + } + + /** + * Decode text color in GD compatible format + * + * @throws RuntimeException + * @throws ColorException + */ + protected function gdTextColor(ImageInterface $image): int + { + return $this + ->driver() + ->colorProcessor($image->colorspace()) + ->colorToNative(parent::textColor()); + } + + /** + * Decode color for stroke (outline) effect in GD compatible format + * + * @throws RuntimeException + * @throws ColorException + */ + protected function gdStrokeColor(ImageInterface $image): int + { + if (!$this->font->hasStrokeEffect()) { + return 0; + } + + $color = parent::strokeColor(); + + if ($color->isTransparent()) { + throw new ColorException( + 'The stroke color must be fully opaque.' + ); + } + + return $this + ->driver() + ->colorProcessor($image->colorspace()) + ->colorToNative($color); + } + + /** + * Return GD's internal font size (if no ttf file is set) + */ + private function gdFont(): int + { + if (is_numeric($this->font->filename())) { + return intval($this->font->filename()); + } + + return 1; + } +} diff --git a/vendor/intervention/image/src/Drivers/Gd/Modifiers/TrimModifier.php b/vendor/intervention/image/src/Drivers/Gd/Modifiers/TrimModifier.php new file mode 100755 index 00000000..ff86c8b4 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Gd/Modifiers/TrimModifier.php @@ -0,0 +1,85 @@ +isAnimated()) { + throw new NotSupportedException('Trim modifier cannot be applied to animated images.'); + } + + // apply tolerance with a min. value of .5 because the default tolerance of '0' should + // already trim away similar colors which is not the case with imagecropauto. + $trimmed = imagecropauto( + $image->core()->native(), + IMG_CROP_THRESHOLD, + max([.5, $this->tolerance / 10]), + $this->trimColor($image) + ); + + // if the tolerance is very high, it is possible that no image is left. + // imagick returns a 1x1 pixel image in this case. this does the same. + if ($trimmed === false) { + $trimmed = $this->driver()->createImage(1, 1)->core()->native(); + } + + $image->core()->setNative($trimmed); + + return $image; + } + + /** + * Create an average color from the colors of the four corner points of the given image + * + * @throws RuntimeException + * @throws AnimationException + */ + private function trimColor(ImageInterface $image): int + { + // trim color base + $red = 0; + $green = 0; + $blue = 0; + + // corner coordinates + $size = $image->size(); + $cornerPoints = [ + new Point(0, 0), + new Point($size->width() - 1, 0), + new Point(0, $size->height() - 1), + new Point($size->width() - 1, $size->height() - 1), + ]; + + // create an average color to be used in trim operation + foreach ($cornerPoints as $pos) { + $cornerColor = imagecolorat($image->core()->native(), $pos->x(), $pos->y()); + $rgb = imagecolorsforindex($image->core()->native(), $cornerColor); + $red += round(round(($rgb['red'] / 51)) * 51); + $green += round(round(($rgb['green'] / 51)) * 51); + $blue += round(round(($rgb['blue'] / 51)) * 51); + } + + $red = (int) round($red / 4); + $green = (int) round($green / 4); + $blue = (int) round($blue / 4); + + return imagecolorallocate($image->core()->native(), $red, $green, $blue); + } +} diff --git a/vendor/intervention/image/src/Drivers/Imagick/Analyzers/ColorspaceAnalyzer.php b/vendor/intervention/image/src/Drivers/Imagick/Analyzers/ColorspaceAnalyzer.php new file mode 100755 index 00000000..181b4e46 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Imagick/Analyzers/ColorspaceAnalyzer.php @@ -0,0 +1,23 @@ +core()->native()->getImageColorspace()) { + Imagick::COLORSPACE_CMYK => new CmykColorspace(), + default => new RgbColorspace(), + }; + } +} diff --git a/vendor/intervention/image/src/Drivers/Imagick/Analyzers/HeightAnalyzer.php b/vendor/intervention/image/src/Drivers/Imagick/Analyzers/HeightAnalyzer.php new file mode 100755 index 00000000..b3ab9969 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Imagick/Analyzers/HeightAnalyzer.php @@ -0,0 +1,17 @@ +core()->native()->getImageHeight(); + } +} diff --git a/vendor/intervention/image/src/Drivers/Imagick/Analyzers/PixelColorAnalyzer.php b/vendor/intervention/image/src/Drivers/Imagick/Analyzers/PixelColorAnalyzer.php new file mode 100755 index 00000000..d060e34d --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Imagick/Analyzers/PixelColorAnalyzer.php @@ -0,0 +1,36 @@ +colorAt( + $image->colorspace(), + $image->core()->frame($this->frame_key)->native() + ); + } + + /** + * @throws ColorException + */ + protected function colorAt(ColorspaceInterface $colorspace, Imagick $imagick): ColorInterface + { + return $this->driver() + ->colorProcessor($colorspace) + ->nativeToColor( + $imagick->getImagePixelColor($this->x, $this->y) + ); + } +} diff --git a/vendor/intervention/image/src/Drivers/Imagick/Analyzers/PixelColorsAnalyzer.php b/vendor/intervention/image/src/Drivers/Imagick/Analyzers/PixelColorsAnalyzer.php new file mode 100755 index 00000000..577b9c8c --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Imagick/Analyzers/PixelColorsAnalyzer.php @@ -0,0 +1,25 @@ +colorspace(); + + foreach ($image as $frame) { + $colors->push( + parent::colorAt($colorspace, $frame->native()) + ); + } + + return $colors; + } +} diff --git a/vendor/intervention/image/src/Drivers/Imagick/Analyzers/ProfileAnalyzer.php b/vendor/intervention/image/src/Drivers/Imagick/Analyzers/ProfileAnalyzer.php new file mode 100755 index 00000000..61fef32f --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Imagick/Analyzers/ProfileAnalyzer.php @@ -0,0 +1,25 @@ +core()->native()->getImageProfiles('icc'); + + if (!array_key_exists('icc', $profiles)) { + throw new ColorException('No ICC profile found in image.'); + } + + return new Profile($profiles['icc']); + } +} diff --git a/vendor/intervention/image/src/Drivers/Imagick/Analyzers/ResolutionAnalyzer.php b/vendor/intervention/image/src/Drivers/Imagick/Analyzers/ResolutionAnalyzer.php new file mode 100755 index 00000000..1a1b6321 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Imagick/Analyzers/ResolutionAnalyzer.php @@ -0,0 +1,25 @@ +core()->native(); + $imageResolution = $imagick->getImageResolution(); + + return new Resolution( + $imageResolution['x'], + $imageResolution['y'], + $imagick->getImageUnits(), + ); + } +} diff --git a/vendor/intervention/image/src/Drivers/Imagick/Analyzers/WidthAnalyzer.php b/vendor/intervention/image/src/Drivers/Imagick/Analyzers/WidthAnalyzer.php new file mode 100755 index 00000000..77b1d502 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Imagick/Analyzers/WidthAnalyzer.php @@ -0,0 +1,17 @@ +core()->native()->getImageWidth(); + } +} diff --git a/vendor/intervention/image/src/Drivers/Imagick/ColorProcessor.php b/vendor/intervention/image/src/Drivers/Imagick/ColorProcessor.php new file mode 100755 index 00000000..4676ab19 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Imagick/ColorProcessor.php @@ -0,0 +1,45 @@ +convertTo($this->colorspace) + ); + } + + public function nativeToColor(mixed $native): ColorInterface + { + return match ($this->colorspace::class) { + CmykColorspace::class => $this->colorspace->colorFromNormalized([ + $native->getColorValue(Imagick::COLOR_CYAN), + $native->getColorValue(Imagick::COLOR_MAGENTA), + $native->getColorValue(Imagick::COLOR_YELLOW), + $native->getColorValue(Imagick::COLOR_BLACK), + ]), + default => $this->colorspace->colorFromNormalized([ + $native->getColorValue(Imagick::COLOR_RED), + $native->getColorValue(Imagick::COLOR_GREEN), + $native->getColorValue(Imagick::COLOR_BLUE), + $native->getColorValue(Imagick::COLOR_ALPHA), + ]), + }; + } +} diff --git a/vendor/intervention/image/src/Drivers/Imagick/Core.php b/vendor/intervention/image/src/Drivers/Imagick/Core.php new file mode 100755 index 00000000..87dcf986 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Imagick/Core.php @@ -0,0 +1,324 @@ + + */ +class Core implements CoreInterface, Iterator +{ + protected int $iteratorIndex = 0; + + /** + * Create new core instance + * + * @return void + */ + public function __construct(protected Imagick $imagick) + { + // + } + + /** + * {@inheritdoc} + * + * @see CollectionInterface::has() + */ + public function has(int|string $key): bool + { + try { + $result = $this->imagick->setIteratorIndex($key); + } catch (ImagickException) { + return false; + } + + return $result; + } + + /** + * {@inheritdoc} + * + * @see CollectionInterface::push() + */ + public function push(mixed $item): CollectionInterface + { + return $this->add($item); + } + + /** + * {@inheritdoc} + * + * @see CollectionInterface::get() + */ + public function get(int|string $key, mixed $default = null): mixed + { + try { + $this->imagick->setIteratorIndex($key); + } catch (ImagickException) { + return $default; + } + + return new Frame($this->imagick->current()); + } + + /** + * {@inheritdoc} + * + * @see CollectionInterface::getAtPosition() + */ + public function getAtPosition(int $key = 0, mixed $default = null): mixed + { + return $this->get($key, $default); + } + + /** + * {@inheritdoc} + * + * @see CollectionInterface::empty() + */ + public function empty(): CollectionInterface + { + $this->imagick->clear(); + + return $this; + } + + /** + * {@inheritdoc} + * + * @see CollectionInterface::slice() + */ + public function slice(int $offset, ?int $length = null): CollectionInterface + { + $allowed_indexes = []; + $length = is_null($length) ? $this->count() : $length; + for ($i = $offset; $i < $offset + $length; $i++) { + $allowed_indexes[] = $i; + } + + $sliced = new Imagick(); + foreach ($this->imagick as $key => $native) { + if (in_array($key, $allowed_indexes)) { + $sliced->addImage($native->getImage()); + } + } + + $sliced = $sliced->coalesceImages(); + $sliced->setImageIterations($this->imagick->getImageIterations()); + + $this->imagick = $sliced; + + return $this; + } + + /** + * {@inheritdoc} + * + * @see CoreInterface::add() + */ + public function add(FrameInterface $frame): CoreInterface + { + $imagick = $frame->native(); + + $imagick->setImageDelay( + (int) round($frame->delay() * 100) + ); + + $imagick->setImageDispose($frame->dispose()); + + $size = $frame->size(); + $imagick->setImagePage( + $size->width(), + $size->height(), + $frame->offsetLeft(), + $frame->offsetTop() + ); + + $this->imagick->addImage($imagick); + + return $this; + } + + /** + * {@inheritdoc} + * + * @see CoreInterface::count() + */ + public function count(): int + { + return $this->imagick->getNumberImages(); + } + + /** + * {@inheritdoc} + * + * @see Iterator::rewind() + */ + public function current(): mixed + { + $this->imagick->setIteratorIndex($this->iteratorIndex); + + return new Frame($this->imagick->current()); + } + + /** + * {@inheritdoc} + * + * @see Iterator::rewind() + */ + public function next(): void + { + $this->iteratorIndex += 1; + } + + /** + * {@inheritdoc} + * + * @see Iterator::rewind() + */ + public function key(): mixed + { + return $this->iteratorIndex; + } + + /** + * {@inheritdoc} + * + * @see Iterator::rewind() + */ + public function valid(): bool + { + try { + $result = $this->imagick->setIteratorIndex($this->iteratorIndex); + } catch (ImagickException) { + return false; + } + + return $result; + } + + /** + * {@inheritdoc} + * + * @see Iterator::rewind() + */ + public function rewind(): void + { + $this->iteratorIndex = 0; + } + + /** + * {@inheritdoc} + * + * @see CoreInterface::native() + */ + public function native(): mixed + { + return $this->imagick; + } + + /** + * {@inheritdoc} + * + * @see CoreInterface::setNative() + */ + public function setNative(mixed $native): CoreInterface + { + $this->imagick = $native; + + return $this; + } + + /** + * {@inheritdoc} + * + * @see CoreInterface::frame() + */ + public function frame(int $position): FrameInterface + { + foreach ($this->imagick as $core) { + if ($core->getIteratorIndex() === $position) { + return new Frame($core); + } + } + + throw new AnimationException('Frame #' . $position . ' could not be found in the image.'); + } + + /** + * {@inheritdoc} + * + * @see CoreInterface::loops() + */ + public function loops(): int + { + return $this->imagick->getImageIterations(); + } + + /** + * {@inheritdoc} + * + * @see CoreInterface::setLoops() + */ + public function setLoops(int $loops): CoreInterface + { + $this->imagick = $this->imagick->coalesceImages(); + $this->imagick->setImageIterations($loops); + + return $this; + } + + /** + * {@inheritdoc} + * + * @see CollectionInterface::first() + */ + public function first(): FrameInterface + { + return $this->frame(0); + } + + /** + * {@inheritdoc} + * + * @see CollectableInterface::last() + */ + public function last(): FrameInterface + { + return $this->frame($this->count() - 1); + } + + /** + * {@inheritdoc} + * + * @see CollectionInterface::toArray() + */ + public function toArray(): array + { + $frames = []; + + foreach ($this as $frame) { + $frames[] = $frame; + } + + return $frames; + } + + /** + * Clone instance + */ + public function __clone(): void + { + $this->imagick = clone $this->imagick; + } +} diff --git a/vendor/intervention/image/src/Drivers/Imagick/Decoders/Base64ImageDecoder.php b/vendor/intervention/image/src/Drivers/Imagick/Decoders/Base64ImageDecoder.php new file mode 100755 index 00000000..ea150627 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Imagick/Decoders/Base64ImageDecoder.php @@ -0,0 +1,26 @@ +isValidBase64($input)) { + throw new DecoderException('Unable to decode input'); + } + + return parent::decode(base64_decode((string) $input)); + } +} diff --git a/vendor/intervention/image/src/Drivers/Imagick/Decoders/BinaryImageDecoder.php b/vendor/intervention/image/src/Drivers/Imagick/Decoders/BinaryImageDecoder.php new file mode 100755 index 00000000..96850b3c --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Imagick/Decoders/BinaryImageDecoder.php @@ -0,0 +1,47 @@ +readImageBlob($input); + } catch (ImagickException) { + throw new DecoderException('Unable to decode input'); + } + + // decode image + $image = parent::decode($imagick); + + // get media type enum from string media type + $format = Format::tryCreate($image->origin()->mediaType()); + + // extract exif data for appropriate formats + if (in_array($format, [Format::JPEG, Format::TIFF])) { + $image->setExif($this->extractExifData($input)); + } + + return $image; + } +} diff --git a/vendor/intervention/image/src/Drivers/Imagick/Decoders/DataUriImageDecoder.php b/vendor/intervention/image/src/Drivers/Imagick/Decoders/DataUriImageDecoder.php new file mode 100755 index 00000000..f395cb00 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Imagick/Decoders/DataUriImageDecoder.php @@ -0,0 +1,36 @@ +parseDataUri($input); + + if (!$uri->isValid()) { + throw new DecoderException('Unable to decode input'); + } + + if ($uri->isBase64Encoded()) { + return parent::decode(base64_decode($uri->data())); + } + + return parent::decode(urldecode($uri->data())); + } +} diff --git a/vendor/intervention/image/src/Drivers/Imagick/Decoders/EncodedImageObjectDecoder.php b/vendor/intervention/image/src/Drivers/Imagick/Decoders/EncodedImageObjectDecoder.php new file mode 100755 index 00000000..2348a6b7 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Imagick/Decoders/EncodedImageObjectDecoder.php @@ -0,0 +1,27 @@ +toString()); + } +} diff --git a/vendor/intervention/image/src/Drivers/Imagick/Decoders/FilePathImageDecoder.php b/vendor/intervention/image/src/Drivers/Imagick/Decoders/FilePathImageDecoder.php new file mode 100755 index 00000000..a418099c --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Imagick/Decoders/FilePathImageDecoder.php @@ -0,0 +1,46 @@ +isFile($input)) { + throw new DecoderException('Unable to decode input'); + } + + try { + $imagick = new Imagick(); + $imagick->readImage($input); + } catch (ImagickException) { + throw new DecoderException('Unable to decode input'); + } + + // decode image + $image = parent::decode($imagick); + + // set file path on origin + $image->origin()->setFilePath($input); + + // extract exif data for the appropriate formats + if (in_array($imagick->getImageFormat(), ['JPEG', 'TIFF', 'TIF'])) { + $image->setExif($this->extractExifData($input)); + } + + return $image; + } +} diff --git a/vendor/intervention/image/src/Drivers/Imagick/Decoders/FilePointerImageDecoder.php b/vendor/intervention/image/src/Drivers/Imagick/Decoders/FilePointerImageDecoder.php new file mode 100755 index 00000000..08717e09 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Imagick/Decoders/FilePointerImageDecoder.php @@ -0,0 +1,32 @@ +getImageFormat() !== 'JPEG') { + $input = $input->coalesceImages(); + } + + // turn images with colorspace 'GRAY' into 'SRGB' to avoid working on + // greyscale colorspace images as this results images loosing color + // information when placed into this image. + if ($input->getImageColorspace() == Imagick::COLORSPACE_GRAY) { + $input->setImageColorspace(Imagick::COLORSPACE_SRGB); + } + + // create image object + $image = new Image( + $this->driver(), + new Core($input) + ); + + // discard animation depending on config + if (!$this->driver()->config()->decodeAnimation) { + $image->modify(new RemoveAnimationModifier()); + } + + // adjust image rotatation + if ($this->driver()->config()->autoOrientation) { + $image->modify(new AlignRotationModifier()); + } + + // set media type on origin + $image->origin()->setMediaType($input->getImageMimeType()); + + return $image; + } +} diff --git a/vendor/intervention/image/src/Drivers/Imagick/Decoders/SplFileInfoImageDecoder.php b/vendor/intervention/image/src/Drivers/Imagick/Decoders/SplFileInfoImageDecoder.php new file mode 100755 index 00000000..8850123e --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Imagick/Decoders/SplFileInfoImageDecoder.php @@ -0,0 +1,27 @@ +getRealPath()); + } +} diff --git a/vendor/intervention/image/src/Drivers/Imagick/Driver.php b/vendor/intervention/image/src/Drivers/Imagick/Driver.php new file mode 100755 index 00000000..61fd05f5 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Imagick/Driver.php @@ -0,0 +1,175 @@ +newImage($width, $height, $background, 'png'); + $imagick->setType(Imagick::IMGTYPE_UNDEFINED); + $imagick->setImageType(Imagick::IMGTYPE_UNDEFINED); + $imagick->setColorspace(Imagick::COLORSPACE_SRGB); + $imagick->setImageResolution(96, 96); + $imagick->setImageBackgroundColor($background); + + return new Image($this, new Core($imagick)); + } + + /** + * {@inheritdoc} + * + * @see DriverInterface::createAnimation() + * + * @throws RuntimeException + */ + public function createAnimation(callable $init): ImageInterface + { + $imagick = new Imagick(); + $imagick->setFormat('gif'); + + $animation = new class ($this, $imagick) + { + public function __construct( + protected DriverInterface $driver, + public Imagick $imagick + ) { + // + } + + /** + * @throws RuntimeException + */ + public function add(mixed $source, float $delay = 1): self + { + $native = $this->driver->handleInput($source)->core()->native(); + $native->setImageDelay(intval(round($delay * 100))); + + $this->imagick->addImage($native); + + return $this; + } + + /** + * @throws RuntimeException + */ + public function __invoke(): ImageInterface + { + return new Image( + $this->driver, + new Core($this->imagick) + ); + } + }; + + $init($animation); + + return call_user_func($animation); + } + + /** + * {@inheritdoc} + * + * @see DriverInterface::colorProcessor() + */ + public function colorProcessor(ColorspaceInterface $colorspace): ColorProcessorInterface + { + return new ColorProcessor($colorspace); + } + + /** + * {@inheritdoc} + * + * @see DriverInterface::fontProcessor() + */ + public function fontProcessor(): FontProcessorInterface + { + return new FontProcessor(); + } + + /** + * {@inheritdoc} + * + * @see DriverInterface::supports() + */ + public function supports(string|Format|FileExtension|MediaType $identifier): bool + { + try { + $format = Format::create($identifier); + } catch (NotSupportedException) { + return false; + } + + return count(Imagick::queryFormats($format->name)) >= 1; + } + + /** + * Return version of ImageMagick library + * + * @throws DriverException + */ + public static function version(): string + { + $pattern = '/^ImageMagick (?P(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)' . + '(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?' . + '(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?)/'; + + if (preg_match($pattern, Imagick::getVersion()['versionString'], $matches) !== 1) { + throw new DriverException('Unable to read ImageMagick version number.'); + } + + return $matches['version']; + } +} diff --git a/vendor/intervention/image/src/Drivers/Imagick/Encoders/AvifEncoder.php b/vendor/intervention/image/src/Drivers/Imagick/Encoders/AvifEncoder.php new file mode 100755 index 00000000..64cb4aeb --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Imagick/Encoders/AvifEncoder.php @@ -0,0 +1,37 @@ +strip || (is_null($this->strip) && $this->driver()->config()->strip)) { + $image->modify(new StripMetaModifier()); + } + + $imagick = $image->core()->native(); + $imagick->setFormat($format); + $imagick->setImageFormat($format); + $imagick->setCompression($compression); + $imagick->setImageCompression($compression); + $imagick->setCompressionQuality($this->quality); + $imagick->setImageCompressionQuality($this->quality); + + return new EncodedImage($imagick->getImagesBlob(), 'image/avif'); + } +} diff --git a/vendor/intervention/image/src/Drivers/Imagick/Encoders/BmpEncoder.php b/vendor/intervention/image/src/Drivers/Imagick/Encoders/BmpEncoder.php new file mode 100755 index 00000000..eede0f09 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Imagick/Encoders/BmpEncoder.php @@ -0,0 +1,29 @@ +core()->native(); + $imagick->setFormat($format); + $imagick->setImageFormat($format); + $imagick->setCompression($compression); + $imagick->setImageCompression($compression); + + return new EncodedImage($imagick->getImagesBlob(), 'image/bmp'); + } +} diff --git a/vendor/intervention/image/src/Drivers/Imagick/Encoders/GifEncoder.php b/vendor/intervention/image/src/Drivers/Imagick/Encoders/GifEncoder.php new file mode 100755 index 00000000..f9c98b0e --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Imagick/Encoders/GifEncoder.php @@ -0,0 +1,34 @@ +core()->native(); + + $imagick->setFormat($format); + $imagick->setImageFormat($format); + $imagick->setCompression($compression); + $imagick->setImageCompression($compression); + + if ($this->interlaced) { + $imagick->setInterlaceScheme(Imagick::INTERLACE_LINE); + } + + return new EncodedImage($imagick->getImagesBlob(), 'image/gif'); + } +} diff --git a/vendor/intervention/image/src/Drivers/Imagick/Encoders/HeicEncoder.php b/vendor/intervention/image/src/Drivers/Imagick/Encoders/HeicEncoder.php new file mode 100755 index 00000000..471edb1f --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Imagick/Encoders/HeicEncoder.php @@ -0,0 +1,33 @@ +strip || (is_null($this->strip) && $this->driver()->config()->strip)) { + $image->modify(new StripMetaModifier()); + } + + $imagick = $image->core()->native(); + $imagick->setFormat($format); + $imagick->setImageFormat($format); + $imagick->setCompressionQuality($this->quality); + $imagick->setImageCompressionQuality($this->quality); + + return new EncodedImage($imagick->getImagesBlob(), 'image/heic'); + } +} diff --git a/vendor/intervention/image/src/Drivers/Imagick/Encoders/Jpeg2000Encoder.php b/vendor/intervention/image/src/Drivers/Imagick/Encoders/Jpeg2000Encoder.php new file mode 100755 index 00000000..16f6593b --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Imagick/Encoders/Jpeg2000Encoder.php @@ -0,0 +1,39 @@ +strip || (is_null($this->strip) && $this->driver()->config()->strip)) { + $image->modify(new StripMetaModifier()); + } + + $imagick = $image->core()->native(); + $imagick->setImageBackgroundColor('white'); + $imagick->setBackgroundColor('white'); + $imagick->setFormat($format); + $imagick->setImageFormat($format); + $imagick->setCompression($compression); + $imagick->setImageCompression($compression); + $imagick->setCompressionQuality($this->quality); + $imagick->setImageCompressionQuality($this->quality); + + return new EncodedImage($imagick->getImagesBlob(), 'image/jp2'); + } +} diff --git a/vendor/intervention/image/src/Drivers/Imagick/Encoders/JpegEncoder.php b/vendor/intervention/image/src/Drivers/Imagick/Encoders/JpegEncoder.php new file mode 100755 index 00000000..e2365f3c --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Imagick/Encoders/JpegEncoder.php @@ -0,0 +1,57 @@ +driver()->handleInput( + $this->driver()->config()->blendingColor + ); + + // resolve blending color because jpeg has no transparency + $background = $this->driver() + ->colorProcessor($image->colorspace()) + ->colorToNative($blendingColor); + + // set alpha value to 1 because Imagick renders + // possible full transparent colors as black + $background->setColorValue(Imagick::COLOR_ALPHA, 1); + + // strip meta data + if ($this->strip || (is_null($this->strip) && $this->driver()->config()->strip)) { + $image->modify(new StripMetaModifier()); + } + + /** @var Imagick $imagick */ + $imagick = $image->core()->native(); + $imagick->setImageBackgroundColor($background); + $imagick->setBackgroundColor($background); + $imagick->setFormat($format); + $imagick->setImageFormat($format); + $imagick->setCompression($compression); + $imagick->setImageCompression($compression); + $imagick->setCompressionQuality($this->quality); + $imagick->setImageCompressionQuality($this->quality); + $imagick->setImageAlphaChannel(Imagick::ALPHACHANNEL_REMOVE); + + if ($this->progressive) { + $imagick->setInterlaceScheme(Imagick::INTERLACE_PLANE); + } + + return new EncodedImage($imagick->getImagesBlob(), 'image/jpeg'); + } +} diff --git a/vendor/intervention/image/src/Drivers/Imagick/Encoders/PngEncoder.php b/vendor/intervention/image/src/Drivers/Imagick/Encoders/PngEncoder.php new file mode 100755 index 00000000..cce49d51 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Imagick/Encoders/PngEncoder.php @@ -0,0 +1,46 @@ +indexed) { + // reduce colors + $output = clone $image; + $output->reduceColors(256); + + $output = $output->core()->native(); + $output->setFormat('PNG'); + $output->setImageFormat('PNG'); + } else { + $output = clone $image->core()->native(); + $output->setFormat('PNG32'); + $output->setImageFormat('PNG32'); + } + + $output->setCompression(Imagick::COMPRESSION_ZIP); + $output->setImageCompression(Imagick::COMPRESSION_ZIP); + + if ($this->interlaced) { + $output->setInterlaceScheme(Imagick::INTERLACE_LINE); + } + + return new EncodedImage($output->getImagesBlob(), 'image/png'); + } +} diff --git a/vendor/intervention/image/src/Drivers/Imagick/Encoders/TiffEncoder.php b/vendor/intervention/image/src/Drivers/Imagick/Encoders/TiffEncoder.php new file mode 100755 index 00000000..46e66536 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Imagick/Encoders/TiffEncoder.php @@ -0,0 +1,35 @@ +strip || (is_null($this->strip) && $this->driver()->config()->strip)) { + $image->modify(new StripMetaModifier()); + } + + $imagick = $image->core()->native(); + $imagick->setFormat($format); + $imagick->setImageFormat($format); + $imagick->setCompression($imagick->getImageCompression()); + $imagick->setImageCompression($imagick->getImageCompression()); + $imagick->setCompressionQuality($this->quality); + $imagick->setImageCompressionQuality($this->quality); + + return new EncodedImage($imagick->getImagesBlob(), 'image/tiff'); + } +} diff --git a/vendor/intervention/image/src/Drivers/Imagick/Encoders/WebpEncoder.php b/vendor/intervention/image/src/Drivers/Imagick/Encoders/WebpEncoder.php new file mode 100755 index 00000000..b65be3bc --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Imagick/Encoders/WebpEncoder.php @@ -0,0 +1,47 @@ +strip || (is_null($this->strip) && $this->driver()->config()->strip)) { + $image->modify(new StripMetaModifier()); + } + + $imagick = $image->core()->native(); + $imagick->setImageBackgroundColor(new ImagickPixel('transparent')); + + if (!$image->isAnimated()) { + $imagick = $imagick->mergeImageLayers(Imagick::LAYERMETHOD_MERGE); + } + + $imagick->setFormat($format); + $imagick->setImageFormat($format); + $imagick->setCompression($compression); + $imagick->setImageCompression($compression); + $imagick->setImageCompressionQuality($this->quality); + + if ($this->quality === 100) { + $imagick->setOption('webp:lossless', 'true'); + } + + return new EncodedImage($imagick->getImagesBlob(), 'image/webp'); + } +} diff --git a/vendor/intervention/image/src/Drivers/Imagick/FontProcessor.php b/vendor/intervention/image/src/Drivers/Imagick/FontProcessor.php new file mode 100755 index 00000000..16fc4c8e --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Imagick/FontProcessor.php @@ -0,0 +1,69 @@ +toImagickDraw($font); + $dimensions = (new Imagick())->queryFontMetrics($draw, $text); + + return new Rectangle( + intval(round($dimensions['textWidth'])), + intval(round($dimensions['ascender'] + $dimensions['descender'])), + ); + } + + /** + * Imagick::annotateImage() needs an ImagickDraw object - this method takes + * the font object as the base and adds an optional passed color to the new + * ImagickDraw object. + * + * @throws FontException + * @throws ImagickDrawException + * @throws ImagickException + */ + public function toImagickDraw(FontInterface $font, ?ImagickPixel $color = null): ImagickDraw + { + if (!$font->hasFilename()) { + throw new FontException('No font file specified.'); + } + + $draw = new ImagickDraw(); + $draw->setStrokeAntialias(true); + $draw->setTextAntialias(true); + $draw->setFont($font->filename()); + $draw->setFontSize($this->nativeFontSize($font)); + $draw->setTextAlignment(Imagick::ALIGN_LEFT); + + if ($color instanceof ImagickPixel) { + $draw->setFillColor($color); + } + + return $draw; + } +} diff --git a/vendor/intervention/image/src/Drivers/Imagick/Frame.php b/vendor/intervention/image/src/Drivers/Imagick/Frame.php new file mode 100755 index 00000000..269a8dba --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Imagick/Frame.php @@ -0,0 +1,185 @@ +native->setImageBackgroundColor($background); + $this->native->setBackgroundColor($background); + } + + /** + * {@inheritdoc} + * + * @see DriverInterface::toImage() + */ + public function toImage(DriverInterface $driver): ImageInterface + { + return new Image($driver, new Core($this->native())); + } + + /** + * {@inheritdoc} + * + * @see DriverInterface::setNative() + */ + public function setNative(mixed $native): FrameInterface + { + $this->native = $native; + + return $this; + } + + /** + * {@inheritdoc} + * + * @see DriverInterface::native() + */ + public function native(): Imagick + { + return $this->native; + } + + /** + * {@inheritdoc} + * + * @see DriverInterface::size() + */ + public function size(): SizeInterface + { + return new Rectangle( + $this->native->getImageWidth(), + $this->native->getImageHeight() + ); + } + + /** + * {@inheritdoc} + * + * @see DriverInterface::delay() + */ + public function delay(): float + { + return $this->native->getImageDelay() / 100; + } + + /** + * {@inheritdoc} + * + * @see DriverInterface::setDelay() + */ + public function setDelay(float $delay): FrameInterface + { + $this->native->setImageDelay(intval(round($delay * 100))); + + return $this; + } + + /** + * {@inheritdoc} + * + * @see DriverInterface::dispose() + */ + public function dispose(): int + { + return $this->native->getImageDispose(); + } + + /** + * {@inheritdoc} + * + * @see DriverInterface::setDispose() + * + * @throws InputException + */ + public function setDispose(int $dispose): FrameInterface + { + if (!in_array($dispose, [0, 1, 2, 3])) { + throw new InputException('Value for argument $dispose must be 0, 1, 2 or 3.'); + } + + $this->native->setImageDispose($dispose); + + return $this; + } + + /** + * {@inheritdoc} + * + * @see DriverInterface::setOffset() + */ + public function setOffset(int $left, int $top): FrameInterface + { + $this->native->setImagePage( + $this->native->getImageWidth(), + $this->native->getImageHeight(), + $left, + $top + ); + + return $this; + } + + /** + * {@inheritdoc} + * + * @see DriverInterface::offsetLeft() + */ + public function offsetLeft(): int + { + return $this->native->getImagePage()['x']; + } + + /** + * {@inheritdoc} + * + * @see DriverInterface::setOffsetLeft() + */ + public function setOffsetLeft(int $offset): FrameInterface + { + return $this->setOffset($offset, $this->offsetTop()); + } + + /** + * {@inheritdoc} + * + * @see DriverInterface::offsetTop() + */ + public function offsetTop(): int + { + return $this->native->getImagePage()['y']; + } + + /** + * {@inheritdoc} + * + * @see DriverInterface::setOffsetTop() + */ + public function setOffsetTop(int $offset): FrameInterface + { + return $this->setOffset($this->offsetLeft(), $offset); + } +} diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/AlignRotationModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/AlignRotationModifier.php new file mode 100755 index 00000000..6b84b304 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/AlignRotationModifier.php @@ -0,0 +1,54 @@ +core()->native()->getImageOrientation()) { + case Imagick::ORIENTATION_TOPRIGHT: // 2 + $image->core()->native()->flopImage(); + break; + + case Imagick::ORIENTATION_BOTTOMRIGHT: // 3 + $image->core()->native()->rotateImage("#000", 180); + break; + + case Imagick::ORIENTATION_BOTTOMLEFT: // 4 + $image->core()->native()->rotateImage("#000", 180); + $image->core()->native()->flopImage(); + break; + + case Imagick::ORIENTATION_LEFTTOP: // 5 + $image->core()->native()->rotateImage("#000", -270); + $image->core()->native()->flopImage(); + break; + + case Imagick::ORIENTATION_RIGHTTOP: // 6 + $image->core()->native()->rotateImage("#000", -270); + break; + + case Imagick::ORIENTATION_RIGHTBOTTOM: // 7 + $image->core()->native()->rotateImage("#000", -90); + $image->core()->native()->flopImage(); + break; + + case Imagick::ORIENTATION_LEFTBOTTOM: // 8 + $image->core()->native()->rotateImage("#000", -90); + break; + } + + // set new orientation in image + $image->core()->native()->setImageOrientation(Imagick::ORIENTATION_TOPLEFT); + + return $image; + } +} diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/BlendTransparencyModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/BlendTransparencyModifier.php new file mode 100755 index 00000000..8fdc0b3b --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/BlendTransparencyModifier.php @@ -0,0 +1,32 @@ +blendingColor($this->driver()); + + // get imagickpixel from blending color + $pixel = $this->driver() + ->colorProcessor($image->colorspace()) + ->colorToNative($blendingColor); + + // merge transparent areas with the background color + foreach ($image as $frame) { + $frame->native()->setImageBackgroundColor($pixel); + $frame->native()->setImageAlphaChannel(Imagick::ALPHACHANNEL_REMOVE); + $frame->native()->mergeImageLayers(Imagick::LAYERMETHOD_FLATTEN); + } + + return $image; + } +} diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/BlurModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/BlurModifier.php new file mode 100755 index 00000000..94c52d1b --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/BlurModifier.php @@ -0,0 +1,21 @@ +native()->blurImage($this->amount, 0.5 * $this->amount); + } + + return $image; + } +} diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/BrightnessModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/BrightnessModifier.php new file mode 100755 index 00000000..80fd9dfa --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/BrightnessModifier.php @@ -0,0 +1,21 @@ +native()->modulateImage(100 + $this->level, 100, 100); + } + + return $image; + } +} diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ColorizeModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ColorizeModifier.php new file mode 100755 index 00000000..c4abc30e --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ColorizeModifier.php @@ -0,0 +1,34 @@ +normalizeLevel($this->red); + $green = $this->normalizeLevel($this->green); + $blue = $this->normalizeLevel($this->blue); + + foreach ($image as $frame) { + $qrange = $frame->native()->getQuantumRange(); + $frame->native()->levelImage(0, $red, $qrange['quantumRangeLong'], Imagick::CHANNEL_RED); + $frame->native()->levelImage(0, $green, $qrange['quantumRangeLong'], Imagick::CHANNEL_GREEN); + $frame->native()->levelImage(0, $blue, $qrange['quantumRangeLong'], Imagick::CHANNEL_BLUE); + } + + return $image; + } + + private function normalizeLevel(int $level): int + { + return $level > 0 ? intval(round($level / 5)) : intval(round(($level + 100) / 100)); + } +} diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ColorspaceModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ColorspaceModifier.php new file mode 100755 index 00000000..37e10200 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ColorspaceModifier.php @@ -0,0 +1,51 @@ + + */ + protected static array $mapping = [ + RgbColorspace::class => Imagick::COLORSPACE_SRGB, + CmykColorspace::class => Imagick::COLORSPACE_CMYK, + ]; + + public function apply(ImageInterface $image): ImageInterface + { + $colorspace = $this->targetColorspace(); + + $imagick = $image->core()->native(); + $imagick->transformImageColorspace( + $this->getImagickColorspace($colorspace) + ); + + return $image; + } + + /** + * @throws NotSupportedException + */ + private function getImagickColorspace(ColorspaceInterface $colorspace): int + { + if (!array_key_exists($colorspace::class, self::$mapping)) { + throw new NotSupportedException('Given colorspace is not supported.'); + } + + return self::$mapping[$colorspace::class]; + } +} diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ContainModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ContainModifier.php new file mode 100755 index 00000000..b01bfd3b --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ContainModifier.php @@ -0,0 +1,95 @@ +getCropSize($image); + $resize = $this->getResizeSize($image); + $transparent = new ImagickPixel('transparent'); + $background = $this->driver()->colorProcessor($image->colorspace())->colorToNative( + $this->driver()->handleInput($this->background) + ); + + foreach ($image as $frame) { + $frame->native()->scaleImage( + $crop->width(), + $crop->height(), + ); + + $frame->native()->setBackgroundColor($transparent); + $frame->native()->setImageBackgroundColor($transparent); + + $frame->native()->extentImage( + $resize->width(), + $resize->height(), + $crop->pivot()->x() * -1, + $crop->pivot()->y() * -1 + ); + + if ($resize->width() > $crop->width()) { + // fill new emerged background + $draw = new ImagickDraw(); + $draw->setFillColor($background); + + $delta = abs($crop->pivot()->x()); + + if ($delta > 0) { + $draw->rectangle( + 0, + 0, + $delta - 1, + $resize->height() + ); + } + + $draw->rectangle( + $crop->width() + $delta, + 0, + $resize->width(), + $resize->height() + ); + + $frame->native()->drawImage($draw); + } + + if ($resize->height() > $crop->height()) { + // fill new emerged background + $draw = new ImagickDraw(); + $draw->setFillColor($background); + + $delta = abs($crop->pivot()->y()); + + if ($delta > 0) { + $draw->rectangle( + 0, + 0, + $resize->width(), + $delta - 1 + ); + } + + $draw->rectangle( + 0, + $crop->height() + $delta, + $resize->width(), + $resize->height() + ); + + $frame->native()->drawImage($draw); + } + } + + return $image; + } +} diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ContrastModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ContrastModifier.php new file mode 100755 index 00000000..72083fa1 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ContrastModifier.php @@ -0,0 +1,21 @@ +native()->sigmoidalContrastImage($this->level > 0, abs($this->level / 4), 0); + } + + return $image; + } +} diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/CoverDownModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/CoverDownModifier.php new file mode 100755 index 00000000..44ab79e4 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/CoverDownModifier.php @@ -0,0 +1,19 @@ +resizeDown($this->width, $this->height); + } +} diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/CoverModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/CoverModifier.php new file mode 100755 index 00000000..835c4de3 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/CoverModifier.php @@ -0,0 +1,36 @@ +getCropSize($image); + $resize = $this->getResizeSize($crop); + + foreach ($image as $frame) { + $frame->native()->cropImage( + $crop->width(), + $crop->height(), + $crop->pivot()->x(), + $crop->pivot()->y() + ); + + $frame->native()->scaleImage( + $resize->width(), + $resize->height() + ); + + $frame->native()->setImagePage(0, 0, 0, 0); + } + + return $image; + } +} diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/CropModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/CropModifier.php new file mode 100755 index 00000000..6a2e8d31 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/CropModifier.php @@ -0,0 +1,75 @@ +driver()->colorProcessor($image->colorspace())->colorToNative( + $this->driver()->handleInput($this->background) + ); + + // create empty container imagick to rebuild core + $imagick = new Imagick(); + + // save resolution to add it later + $resolution = $image->resolution()->perInch(); + + // define position of the image on the new canvas + $crop = $this->crop($image); + $position = [ + ($crop->pivot()->x() + $this->offset_x) * -1, + ($crop->pivot()->y() + $this->offset_y) * -1, + ]; + + foreach ($image as $frame) { + // create new frame canvas with modifiers background + $canvas = new Imagick(); + $canvas->newImage($crop->width(), $crop->height(), $background, 'png'); + $canvas->setImageResolution($resolution->x(), $resolution->y()); + $canvas->setImageAlphaChannel(Imagick::ALPHACHANNEL_SET); // or ALPHACHANNEL_ACTIVATE? + + // set animation details + if ($image->isAnimated()) { + $canvas->setImageDelay($frame->native()->getImageDelay()); + $canvas->setImageIterations($frame->native()->getImageIterations()); + $canvas->setImageDispose($frame->native()->getImageDispose()); + } + + // make the rectangular position of the original image transparent + // so that we can later place the original on top. this preserves + // the transparency of the original and shows the background color + // of the modifier in the other areas. if the original image has no + // transparent area the rectangular transparency will be covered by + // the original. + $clearer = new Imagick(); + $clearer->newImage( + $frame->native()->getImageWidth(), + $frame->native()->getImageHeight(), + new ImagickPixel('black'), + ); + $canvas->compositeImage($clearer, Imagick::COMPOSITE_DSTOUT, ...$position); + + // place original frame content onto prepared frame canvas + $canvas->compositeImage($frame->native(), Imagick::COMPOSITE_DEFAULT, ...$position); + + // add newly built frame to container imagick + $imagick->addImage($canvas); + } + + // replace imagick in the original image + $image->core()->setNative($imagick); + + return $image; + } +} diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/DrawBezierModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/DrawBezierModifier.php new file mode 100755 index 00000000..fda3ec45 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/DrawBezierModifier.php @@ -0,0 +1,77 @@ +drawable->count() !== 3 && $this->drawable->count() !== 4) { + throw new GeometryException('You must specify either 3 or 4 points to create a bezier curve'); + } + + $drawing = new ImagickDraw(); + + if ($this->drawable->hasBackgroundColor()) { + $background_color = $this->driver()->colorProcessor($image->colorspace())->colorToNative( + $this->backgroundColor() + ); + } else { + $background_color = 'transparent'; + } + + $drawing->setFillColor($background_color); + + if ($this->drawable->hasBorder() && $this->drawable->borderSize() > 0) { + $border_color = $this->driver()->colorProcessor($image->colorspace())->colorToNative( + $this->borderColor() + ); + + $drawing->setStrokeColor($border_color); + $drawing->setStrokeWidth($this->drawable->borderSize()); + } + + $drawing->pathStart(); + $drawing->pathMoveToAbsolute( + $this->drawable->first()->x(), + $this->drawable->first()->y() + ); + if ($this->drawable->count() === 3) { + $drawing->pathCurveToQuadraticBezierAbsolute( + $this->drawable->second()->x(), + $this->drawable->second()->y(), + $this->drawable->last()->x(), + $this->drawable->last()->y() + ); + } elseif ($this->drawable->count() === 4) { + $drawing->pathCurveToAbsolute( + $this->drawable->second()->x(), + $this->drawable->second()->y(), + $this->drawable->third()->x(), + $this->drawable->third()->y(), + $this->drawable->last()->x(), + $this->drawable->last()->y() + ); + } + $drawing->pathFinish(); + + foreach ($image as $frame) { + $frame->native()->drawImage($drawing); + } + + return $image; + } +} diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/DrawEllipseModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/DrawEllipseModifier.php new file mode 100755 index 00000000..1508f918 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/DrawEllipseModifier.php @@ -0,0 +1,51 @@ +driver()->colorProcessor($image->colorspace())->colorToNative( + $this->backgroundColor() + ); + + $border_color = $this->driver()->colorProcessor($image->colorspace())->colorToNative( + $this->borderColor() + ); + + foreach ($image as $frame) { + $drawing = new ImagickDraw(); + $drawing->setFillColor($background_color); + + if ($this->drawable->hasBorder()) { + $drawing->setStrokeWidth($this->drawable->borderSize()); + $drawing->setStrokeColor($border_color); + } + + $drawing->ellipse( + $this->drawable->position()->x(), + $this->drawable->position()->y(), + $this->drawable->width() / 2, + $this->drawable->height() / 2, + 0, + 360 + ); + + $frame->native()->drawImage($drawing); + } + + return $image; + } +} diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/DrawLineModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/DrawLineModifier.php new file mode 100755 index 00000000..ac09e51d --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/DrawLineModifier.php @@ -0,0 +1,42 @@ +setStrokeWidth($this->drawable->width()); + $drawing->setFillOpacity(0); + $drawing->setStrokeColor( + $this->driver()->colorProcessor($image->colorspace())->colorToNative( + $this->backgroundColor() + ) + ); + + $drawing->line( + $this->drawable->start()->x(), + $this->drawable->start()->y(), + $this->drawable->end()->x(), + $this->drawable->end()->y(), + ); + + foreach ($image as $frame) { + $frame->native()->drawImage($drawing); + } + + return $image; + } +} diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/DrawPixelModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/DrawPixelModifier.php new file mode 100755 index 00000000..e69ecc27 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/DrawPixelModifier.php @@ -0,0 +1,30 @@ +driver()->colorProcessor($image->colorspace())->colorToNative( + $this->driver()->handleInput($this->color) + ); + + $pixel = new ImagickDraw(); + $pixel->setFillColor($color); + $pixel->point($this->position->x(), $this->position->y()); + + foreach ($image as $frame) { + $frame->native()->drawImage($pixel); + } + + return $image; + } +} diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/DrawPolygonModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/DrawPolygonModifier.php new file mode 100755 index 00000000..003d88c6 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/DrawPolygonModifier.php @@ -0,0 +1,64 @@ +setFillColor(new ImagickPixel('transparent')); // defaults to no backgroundColor + + if ($this->drawable->hasBackgroundColor()) { + $background_color = $this->driver()->colorProcessor($image->colorspace())->colorToNative( + $this->backgroundColor() + ); + + $drawing->setFillColor($background_color); + } + + if ($this->drawable->hasBorder()) { + $border_color = $this->driver()->colorProcessor($image->colorspace())->colorToNative( + $this->borderColor() + ); + + $drawing->setStrokeColor($border_color); + $drawing->setStrokeWidth($this->drawable->borderSize()); + } + + $drawing->polygon($this->points()); + + foreach ($image as $frame) { + $frame->native()->drawImage($drawing); + } + + return $image; + } + + /** + * Return points of drawable in processable form for ImagickDraw + * + * @return array> + */ + private function points(): array + { + $points = []; + foreach ($this->drawable as $point) { + $points[] = ['x' => $point->x(), 'y' => $point->y()]; + } + + return $points; + } +} diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/DrawRectangleModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/DrawRectangleModifier.php new file mode 100755 index 00000000..8f8e79ea --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/DrawRectangleModifier.php @@ -0,0 +1,50 @@ +driver()->colorProcessor($image->colorspace())->colorToNative( + $this->backgroundColor() + ); + + $border_color = $this->driver()->colorProcessor($image->colorspace())->colorToNative( + $this->borderColor() + ); + + $drawing->setFillColor($background_color); + if ($this->drawable->hasBorder()) { + $drawing->setStrokeColor($border_color); + $drawing->setStrokeWidth($this->drawable->borderSize()); + } + + // build rectangle + $drawing->rectangle( + $this->drawable->position()->x(), + $this->drawable->position()->y(), + $this->drawable->position()->x() + $this->drawable->width(), + $this->drawable->position()->y() + $this->drawable->height() + ); + + foreach ($image as $frame) { + $frame->native()->drawImage($drawing); + } + + return $image; + } +} diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/FillModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/FillModifier.php new file mode 100755 index 00000000..274745fa --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/FillModifier.php @@ -0,0 +1,63 @@ +driver()->colorProcessor($image->colorspace())->colorToNative( + $this->driver()->handleInput($this->color) + ); + + foreach ($image->core()->native() as $frame) { + if ($this->hasPosition()) { + $this->floodFillWithColor($frame, $pixel); + } else { + $this->fillAllWithColor($frame, $pixel); + } + } + + return $image; + } + + private function floodFillWithColor(Imagick $frame, ImagickPixel $pixel): void + { + $target = $frame->getImagePixelColor( + $this->position->x(), + $this->position->y() + ); + + $frame->floodfillPaintImage( + $pixel, + 100, + $target, + $this->position->x(), + $this->position->y(), + false, + Imagick::CHANNEL_ALL + ); + } + + private function fillAllWithColor(Imagick $frame, ImagickPixel $pixel): void + { + $draw = new ImagickDraw(); + $draw->setFillColor($pixel); + $draw->rectangle(0, 0, $frame->getImageWidth(), $frame->getImageHeight()); + $frame->drawImage($draw); + + // deactive alpha channel when image was filled with opaque color + if ($pixel->getColorValue(Imagick::COLOR_ALPHA) == 1) { + $frame->setImageAlphaChannel(Imagick::ALPHACHANNEL_DEACTIVATE); + } + } +} diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/FlipModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/FlipModifier.php new file mode 100755 index 00000000..edfa1244 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/FlipModifier.php @@ -0,0 +1,21 @@ +native()->flipImage(); + } + + return $image; + } +} diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/FlopModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/FlopModifier.php new file mode 100755 index 00000000..d05c239e --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/FlopModifier.php @@ -0,0 +1,21 @@ +native()->flopImage(); + } + + return $image; + } +} diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/GammaModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/GammaModifier.php new file mode 100755 index 00000000..f8b1c7ce --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/GammaModifier.php @@ -0,0 +1,21 @@ +native()->gammaImage($this->gamma); + } + + return $image; + } +} diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/GreyscaleModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/GreyscaleModifier.php new file mode 100755 index 00000000..4bc2f284 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/GreyscaleModifier.php @@ -0,0 +1,21 @@ +native()->modulateImage(100, 0, 100); + } + + return $image; + } +} diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/InvertModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/InvertModifier.php new file mode 100755 index 00000000..d504ecb5 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/InvertModifier.php @@ -0,0 +1,21 @@ +native()->negateImage(false); + } + + return $image; + } +} diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/PadModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/PadModifier.php new file mode 100755 index 00000000..40499d91 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/PadModifier.php @@ -0,0 +1,24 @@ +size() + ->containMax( + $this->width, + $this->height + ) + ->alignPivotTo( + $this->getResizeSize($image), + $this->position + ); + } +} diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/PixelateModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/PixelateModifier.php new file mode 100755 index 00000000..e79eb420 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/PixelateModifier.php @@ -0,0 +1,34 @@ +pixelateFrame($frame); + } + + return $image; + } + + protected function pixelateFrame(FrameInterface $frame): void + { + $size = $frame->size(); + + $frame->native()->scaleImage( + (int) round(max(1, $size->width() / $this->size)), + (int) round(max(1, $size->height() / $this->size)) + ); + + $frame->native()->scaleImage($size->width(), $size->height()); + } +} diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/PlaceModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/PlaceModifier.php new file mode 100755 index 00000000..eb5b7225 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/PlaceModifier.php @@ -0,0 +1,40 @@ +driver()->handleInput($this->element); + $position = $this->getPosition($image, $watermark); + + // set opacity of watermark + if ($this->opacity < 100) { + $watermark->core()->native()->setImageAlphaChannel(Imagick::ALPHACHANNEL_SET); + $watermark->core()->native()->evaluateImage( + Imagick::EVALUATE_DIVIDE, + $this->opacity > 0 ? 100 / $this->opacity : 1000, + Imagick::CHANNEL_ALPHA, + ); + } + + foreach ($image as $frame) { + $frame->native()->compositeImage( + $watermark->core()->native(), + Imagick::COMPOSITE_DEFAULT, + $position->x(), + $position->y() + ); + } + + return $image; + } +} diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ProfileModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ProfileModifier.php new file mode 100755 index 00000000..22212d95 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ProfileModifier.php @@ -0,0 +1,25 @@ +core()->native(); + $result = $imagick->profileImage('icc', (string) $this->profile); + + if ($result === false) { + throw new ColorException('ICC color profile could not be set.'); + } + + return $image; + } +} diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ProfileRemovalModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ProfileRemovalModifier.php new file mode 100755 index 00000000..ef4a2aba --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ProfileRemovalModifier.php @@ -0,0 +1,25 @@ +core()->native(); + $result = $imagick->profileImage('icc', null); + + if ($result === false) { + throw new ColorException('ICC color profile could not be removed.'); + } + + return $image; + } +} diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/QuantizeColorsModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/QuantizeColorsModifier.php new file mode 100755 index 00000000..6a93482e --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/QuantizeColorsModifier.php @@ -0,0 +1,37 @@ +limit <= 0) { + throw new InputException('Quantization limit must be greater than 0.'); + } + + // no color reduction if the limit is higher than the colors in the img + if ($this->limit > $image->core()->native()->getImageColors()) { + return $image; + } + + foreach ($image as $frame) { + $frame->native()->quantizeImage( + $this->limit, + $frame->native()->getImageColorspace(), + 0, + false, + false + ); + } + + return $image; + } +} diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/RemoveAnimationModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/RemoveAnimationModifier.php new file mode 100755 index 00000000..61c884c1 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/RemoveAnimationModifier.php @@ -0,0 +1,26 @@ +selectedFrame($image); + $imagick->addImage($frame->native()->getImage()); + + // set new imagick to image + $image->core()->setNative($imagick); + + return $image; + } +} diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ResizeCanvasModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ResizeCanvasModifier.php new file mode 100755 index 00000000..4459f329 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ResizeCanvasModifier.php @@ -0,0 +1,27 @@ +cropSize($image); + + $image->modify(new CropModifier( + $cropSize->width(), + $cropSize->height(), + $cropSize->pivot()->x(), + $cropSize->pivot()->y(), + $this->background, + )); + + return $image; + } +} diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ResizeCanvasRelativeModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ResizeCanvasRelativeModifier.php new file mode 100755 index 00000000..e1fcb740 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ResizeCanvasRelativeModifier.php @@ -0,0 +1,16 @@ +size()->resizeDown($this->width, $this->height); + } +} diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ResizeModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ResizeModifier.php new file mode 100755 index 00000000..459aad02 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ResizeModifier.php @@ -0,0 +1,36 @@ +getAdjustedSize($image); + + foreach ($image as $frame) { + $frame->native()->scaleImage( + $resizeTo->width(), + $resizeTo->height() + ); + } + + return $image; + } + + /** + * @throws RuntimeException + */ + protected function getAdjustedSize(ImageInterface $image): SizeInterface + { + return $image->size()->resize($this->width, $this->height); + } +} diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ResolutionModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ResolutionModifier.php new file mode 100755 index 00000000..426e683e --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ResolutionModifier.php @@ -0,0 +1,20 @@ +core()->native(); + $imagick->setImageResolution($this->x, $this->y); + + return $image; + } +} diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/RotateModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/RotateModifier.php new file mode 100755 index 00000000..19ad2282 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/RotateModifier.php @@ -0,0 +1,28 @@ +driver()->colorProcessor($image->colorspace())->colorToNative( + $this->driver()->handleInput($this->background) + ); + + foreach ($image as $frame) { + $frame->native()->rotateImage( + $background, + $this->rotationAngle() * -1 + ); + } + + return $image; + } +} diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ScaleDownModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ScaleDownModifier.php new file mode 100755 index 00000000..ae874bb6 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ScaleDownModifier.php @@ -0,0 +1,16 @@ +size()->scaleDown($this->width, $this->height); + } +} diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ScaleModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ScaleModifier.php new file mode 100755 index 00000000..da8c2c48 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/ScaleModifier.php @@ -0,0 +1,16 @@ +size()->scale($this->width, $this->height); + } +} diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/SharpenModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/SharpenModifier.php new file mode 100755 index 00000000..120d3c89 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/SharpenModifier.php @@ -0,0 +1,21 @@ +native()->unsharpMaskImage(1, 1, $this->amount / 6.25, 0); + } + + return $image; + } +} diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/SliceAnimationModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/SliceAnimationModifier.php new file mode 100755 index 00000000..16691079 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/SliceAnimationModifier.php @@ -0,0 +1,24 @@ +offset >= $image->count()) { + throw new AnimationException('Offset is not in the range of frames.'); + } + + $image->core()->slice($this->offset, $this->length); + + return $image; + } +} diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/StripMetaModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/StripMetaModifier.php new file mode 100755 index 00000000..58d1e7a1 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/StripMetaModifier.php @@ -0,0 +1,34 @@ +core()->native()->getImageProfiles('icc'); + + // remove meta data + $image->core()->native()->stripImage(); + $image->setExif(new Collection()); + + if ($profiles !== []) { + // re-apply icc profiles + $image->core()->native()->profileImage("icc", $profiles['icc']); + } + return $image; + } +} diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/TextModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/TextModifier.php new file mode 100755 index 00000000..69ff34ca --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/TextModifier.php @@ -0,0 +1,139 @@ +processor()->textBlock($this->text, $this->font, $this->position); + $drawText = $this->imagickDrawText($image, $this->font); + $drawStroke = $this->imagickDrawStroke($image, $this->font); + + foreach ($image as $frame) { + foreach ($lines as $line) { + foreach ($this->strokeOffsets($this->font) as $offset) { + // Draw the stroke outline under the actual text + $this->maybeDrawTextline($frame, $line, $drawStroke, $offset); + } + + // Draw the actual text + $this->maybeDrawTextline($frame, $line, $drawText); + } + } + + return $image; + } + + /** + * Create an ImagickDraw object to draw text on the image + * + * @throws RuntimeException + * @throws ColorException + * @throws FontException + * @throws ImagickDrawException + * @throws ImagickException + */ + private function imagickDrawText(ImageInterface $image, FontInterface $font): ImagickDraw + { + $color = $this->driver()->handleInput($font->color()); + + if ($font->hasStrokeEffect() && $color->isTransparent()) { + throw new ColorException( + 'The text color must be fully opaque when using the stroke effect.' + ); + } + + $color = $this->driver()->colorProcessor($image->colorspace())->colorToNative($color); + + return $this->processor()->toImagickDraw($font, $color); + } + + /** + * Create a ImagickDraw object to draw the outline stroke effect on the Image + * + * @throws RuntimeException + * @throws ColorException + * @throws FontException + * @throws ImagickDrawException + * @throws ImagickException + */ + private function imagickDrawStroke(ImageInterface $image, FontInterface $font): ?ImagickDraw + { + if (!$font->hasStrokeEffect()) { + return null; + } + + $color = $this->driver()->handleInput($font->strokeColor()); + + if ($color->isTransparent()) { + throw new ColorException( + 'The stroke color must be fully opaque.' + ); + } + + $color = $this->driver()->colorProcessor($image->colorspace())->colorToNative($color); + + return $this->processor()->toImagickDraw($font, $color); + } + + /** + * Maybe draw given line of text on frame instance depending on given + * ImageDraw instance. Optionally move line position by given offset. + */ + private function maybeDrawTextline( + FrameInterface $frame, + Line $textline, + ?ImagickDraw $draw = null, + PointInterface $offset = new Point(), + ): void { + if ($draw instanceof ImagickDraw) { + $frame->native()->annotateImage( + $draw, + $textline->position()->x() + $offset->x(), + $textline->position()->y() + $offset->y(), + $this->font->angle(), + (string) $textline + ); + } + } + + /** + * Return imagick font processor + * + * @throws FontException + */ + private function processor(): FontProcessor + { + $processor = $this->driver()->fontProcessor(); + + if (!($processor instanceof FontProcessor)) { + throw new FontException('Font processor does not match the driver.'); + } + + return $processor; + } +} diff --git a/vendor/intervention/image/src/Drivers/Imagick/Modifiers/TrimModifier.php b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/TrimModifier.php new file mode 100755 index 00000000..88bc46a2 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Imagick/Modifiers/TrimModifier.php @@ -0,0 +1,26 @@ +isAnimated()) { + throw new NotSupportedException('Trim modifier cannot be applied to animated images.'); + } + + $imagick = $image->core()->native(); + $imagick->trimImage(($this->tolerance / 100 * $imagick->getQuantum()) / 1.5); + $imagick->setImagePage(0, 0, 0, 0); + + return $image; + } +} diff --git a/vendor/intervention/image/src/Drivers/Specializable.php b/vendor/intervention/image/src/Drivers/Specializable.php new file mode 100755 index 00000000..30a1c3f2 --- /dev/null +++ b/vendor/intervention/image/src/Drivers/Specializable.php @@ -0,0 +1,13 @@ +analyze($this); + } +} diff --git a/vendor/intervention/image/src/Drivers/SpecializableDecoder.php b/vendor/intervention/image/src/Drivers/SpecializableDecoder.php new file mode 100755 index 00000000..9b0bf8bc --- /dev/null +++ b/vendor/intervention/image/src/Drivers/SpecializableDecoder.php @@ -0,0 +1,26 @@ +modify($this); + } +} diff --git a/vendor/intervention/image/src/EncodedImage.php b/vendor/intervention/image/src/EncodedImage.php new file mode 100755 index 00000000..e8c767a0 --- /dev/null +++ b/vendor/intervention/image/src/EncodedImage.php @@ -0,0 +1,65 @@ +mediaType; + } + + /** + * {@inheritdoc} + * + * @see EncodedImageInterface::mimetype() + */ + public function mimetype(): string + { + return $this->mediaType(); + } + + /** + * {@inheritdoc} + * + * @see EncodedImageInterface::toDataUri() + */ + public function toDataUri(): string + { + return sprintf('data:%s;base64,%s', $this->mediaType(), base64_encode((string) $this)); + } + + /** + * Show debug info for the current image + * + * @return array + */ + public function __debugInfo(): array + { + return [ + 'mediaType' => $this->mediaType(), + 'size' => $this->size(), + ]; + } +} diff --git a/vendor/intervention/image/src/Encoders/AutoEncoder.php b/vendor/intervention/image/src/Encoders/AutoEncoder.php new file mode 100755 index 00000000..0c909d1c --- /dev/null +++ b/vendor/intervention/image/src/Encoders/AutoEncoder.php @@ -0,0 +1,25 @@ +encode( + $this->encoderByMediaType( + $image->origin()->mediaType() + ) + ); + } +} diff --git a/vendor/intervention/image/src/Encoders/AvifEncoder.php b/vendor/intervention/image/src/Encoders/AvifEncoder.php new file mode 100755 index 00000000..2cf708d3 --- /dev/null +++ b/vendor/intervention/image/src/Encoders/AvifEncoder.php @@ -0,0 +1,23 @@ + + */ + protected array $options = []; + + /** + * Create new encoder instance to encode to format of given file extension + * + * @param null|string|FileExtension $extension Target file extension for example "png" + * @return void + */ + public function __construct(public null|string|FileExtension $extension = null, mixed ...$options) + { + $this->options = $options; + } + + /** + * {@inheritdoc} + * + * @see EncoderInterface::encode() + */ + public function encode(ImageInterface $image): EncodedImageInterface + { + $extension = is_null($this->extension) ? $image->origin()->fileExtension() : $this->extension; + + return $image->encode( + $this->encoderByFileExtension( + $extension + ) + ); + } + + /** + * Create matching encoder for given file extension + * + * @throws EncoderException + */ + protected function encoderByFileExtension(null|string|FileExtension $extension): EncoderInterface + { + if (empty($extension)) { + throw new EncoderException('No encoder found for empty file extension.'); + } + + try { + $extension = is_string($extension) ? FileExtension::from(strtolower($extension)) : $extension; + } catch (Error) { + throw new EncoderException('No encoder found for file extension (' . $extension . ').'); + } + + return $extension->format()->encoder(...$this->options); + } +} diff --git a/vendor/intervention/image/src/Encoders/FilePathEncoder.php b/vendor/intervention/image/src/Encoders/FilePathEncoder.php new file mode 100755 index 00000000..62c496da --- /dev/null +++ b/vendor/intervention/image/src/Encoders/FilePathEncoder.php @@ -0,0 +1,38 @@ +encode( + $this->encoderByFileExtension( + is_null($this->path) ? $image->origin()->fileExtension() : pathinfo($this->path, PATHINFO_EXTENSION) + ) + ); + } +} diff --git a/vendor/intervention/image/src/Encoders/GifEncoder.php b/vendor/intervention/image/src/Encoders/GifEncoder.php new file mode 100755 index 00000000..0ee950a6 --- /dev/null +++ b/vendor/intervention/image/src/Encoders/GifEncoder.php @@ -0,0 +1,20 @@ + + */ + protected array $options = []; + + /** + * Create new encoder instance + * + * @param null|string|MediaType $mediaType Target media type for example "image/jpeg" + * @return void + */ + public function __construct(public null|string|MediaType $mediaType = null, mixed ...$options) + { + $this->options = $options; + } + + /** + * {@inheritdoc} + * + * @see EncoderInterface::encode() + */ + public function encode(ImageInterface $image): EncodedImageInterface + { + $mediaType = is_null($this->mediaType) ? $image->origin()->mediaType() : $this->mediaType; + + return $image->encode( + $this->encoderByMediaType($mediaType) + ); + } + + /** + * Return new encoder by given media (MIME) type + * + * @throws EncoderException + */ + protected function encoderByMediaType(string|MediaType $mediaType): EncoderInterface + { + try { + $mediaType = is_string($mediaType) ? MediaType::from($mediaType) : $mediaType; + } catch (Error) { + throw new EncoderException('No encoder found for media type (' . $mediaType . ').'); + } + + return $mediaType->format()->encoder(...$this->options); + } +} diff --git a/vendor/intervention/image/src/Encoders/PngEncoder.php b/vendor/intervention/image/src/Encoders/PngEncoder.php new file mode 100755 index 00000000..f5420738 --- /dev/null +++ b/vendor/intervention/image/src/Encoders/PngEncoder.php @@ -0,0 +1,20 @@ +pointer = $this->buildFilePointer($data); + } + + /** + * Create file object from path in file system + * + * @throws RuntimeException + */ + public static function fromPath(string $path): self + { + return new self(fopen($path, 'r')); + } + + /** + * {@inheritdoc} + * + * @see FileInterface::save() + */ + public function save(string $filepath): void + { + $dir = pathinfo($filepath, PATHINFO_DIRNAME); + + if (!is_dir($dir)) { + throw new NotWritableException( + "Can't write image to path. Directory does not exist." + ); + } + + if (!is_writable($dir)) { + throw new NotWritableException( + "Can't write image to path. Directory is not writable." + ); + } + + if (is_file($filepath) && !is_writable($filepath)) { + throw new NotWritableException( + sprintf("Can't write image. Path (%s) is not writable.", $filepath) + ); + } + + // write data + $saved = @file_put_contents($filepath, $this->toFilePointer()); + if ($saved === false) { + throw new NotWritableException( + sprintf("Can't write image data to path (%s).", $filepath) + ); + } + } + + /** + * {@inheritdoc} + * + * @see FileInterface::toString() + */ + public function toString(): string + { + return stream_get_contents($this->toFilePointer(), offset: 0); + } + + /** + * {@inheritdoc} + * + * @see FileInterface::toFilePointer() + */ + public function toFilePointer() + { + rewind($this->pointer); + + return $this->pointer; + } + + /** + * {@inheritdoc} + * + * @see FileInterface::size() + */ + public function size(): int + { + $info = fstat($this->toFilePointer()); + + return intval($info['size']); + } + + /** + * {@inheritdoc} + * + * @see FileInterface::__toString() + */ + public function __toString(): string + { + return $this->toString(); + } +} diff --git a/vendor/intervention/image/src/FileExtension.php b/vendor/intervention/image/src/FileExtension.php new file mode 100755 index 00000000..dce24c53 --- /dev/null +++ b/vendor/intervention/image/src/FileExtension.php @@ -0,0 +1,127 @@ +fileExtension(); + } + + if ($identifier instanceof MediaType) { + return $identifier->fileExtension(); + } + + try { + $extension = self::from(strtolower($identifier)); + } catch (Error) { + try { + $extension = MediaType::from(strtolower($identifier))->fileExtension(); + } catch (Error) { + throw new NotSupportedException('Unable to create file extension from "' . $identifier . '".'); + } + } + + return $extension; + } + + /** + * Try to create media type from given identifier and return null on failure + * + * @param string|Format|MediaType|FileExtension $identifier + * @return FileExtension|null + */ + public static function tryCreate(string|self|Format|MediaType $identifier): ?self + { + try { + return self::create($identifier); + } catch (NotSupportedException) { + return null; + } + } + + /** + * Return the matching format for the current file extension + */ + public function format(): Format + { + return match ($this) { + self::JPEG, + self::JPG => Format::JPEG, + self::WEBP => Format::WEBP, + self::GIF => Format::GIF, + self::PNG => Format::PNG, + self::AVIF => Format::AVIF, + self::BMP => Format::BMP, + self::TIF, + self::TIFF => Format::TIFF, + self::JP2, + self::JP2K, + self::J2K, + self::JPF, + self::JPM, + self::JPG2, + self::J2C, + self::JPC, + self::JPX => Format::JP2, + self::HEIC, + self::HEIF => Format::HEIC, + }; + } + + /** + * Return media types for the current format + * + * @return array + */ + public function mediaTypes(): array + { + return $this->format()->mediaTypes(); + } + + /** + * Return the first found media type for the current format + */ + public function mediaType(): MediaType + { + return $this->format()->mediaType(); + } +} diff --git a/vendor/intervention/image/src/Format.php b/vendor/intervention/image/src/Format.php new file mode 100755 index 00000000..09be895d --- /dev/null +++ b/vendor/intervention/image/src/Format.php @@ -0,0 +1,165 @@ +format(); + } + + if ($identifier instanceof FileExtension) { + return $identifier->format(); + } + + try { + $format = MediaType::from(strtolower($identifier))->format(); + } catch (Error) { + try { + $format = FileExtension::from(strtolower($identifier))->format(); + } catch (Error) { + throw new NotSupportedException('Unable to create format from "' . $identifier . '".'); + } + } + + return $format; + } + + /** + * Try to create format from given identifier and return null on failure + * + * @param string|Format|MediaType|FileExtension $identifier + * @return Format|null + */ + public static function tryCreate(string|self|MediaType|FileExtension $identifier): ?self + { + try { + return self::create($identifier); + } catch (NotSupportedException) { + return null; + } + } + + /** + * Return the possible media (MIME) types for the current format + * + * @return array + */ + public function mediaTypes(): array + { + return array_filter( + MediaType::cases(), + fn(MediaType $mediaType): bool => $mediaType->format() === $this + ); + } + + /** + * Return the first found media type for the current format + */ + public function mediaType(): MediaType + { + $types = $this->mediaTypes(); + + return reset($types); + } + + /** + * Return the possible file extension for the current format + * + * @return array + */ + public function fileExtensions(): array + { + return array_filter( + FileExtension::cases(), + fn(FileExtension $fileExtension): bool => $fileExtension->format() === $this + ); + } + + /** + * Return the first found file extension for the current format + */ + public function fileExtension(): FileExtension + { + $extensions = $this->fileExtensions(); + + return reset($extensions); + } + + /** + * Create an encoder instance with given options that matches the format + */ + public function encoder(mixed ...$options): EncoderInterface + { + // get classname of target encoder from current format + $classname = match ($this) { + self::AVIF => AvifEncoder::class, + self::BMP => BmpEncoder::class, + self::GIF => GifEncoder::class, + self::HEIC => HeicEncoder::class, + self::JP2 => Jpeg2000Encoder::class, + self::JPEG => JpegEncoder::class, + self::PNG => PngEncoder::class, + self::TIFF => TiffEncoder::class, + self::WEBP => WebpEncoder::class, + }; + + // get parameters of target encoder + $parameters = []; + $reflectionClass = new ReflectionClass($classname); + if ($constructor = $reflectionClass->getConstructor()) { + $parameters = array_map( + fn(ReflectionParameter $parameter): string => $parameter->getName(), + $constructor->getParameters(), + ); + } + + // filter out unavailable options of target encoder + $options = array_filter( + $options, + fn(mixed $key): bool => in_array($key, $parameters), + ARRAY_FILTER_USE_KEY, + ); + + return new $classname(...$options); + } +} diff --git a/vendor/intervention/image/src/Geometry/Bezier.php b/vendor/intervention/image/src/Geometry/Bezier.php new file mode 100755 index 00000000..27dbba14 --- /dev/null +++ b/vendor/intervention/image/src/Geometry/Bezier.php @@ -0,0 +1,202 @@ + + * @implements ArrayAccess + */ +class Bezier implements IteratorAggregate, Countable, ArrayAccess, DrawableInterface +{ + use HasBorder; + use HasBackgroundColor; + + /** + * Create new bezier instance + * + * @param array $points + * @return void + */ + public function __construct( + protected array $points = [], + protected PointInterface $pivot = new Point() + ) { + // + } + + /** + * {@inheritdoc} + * + * @see DrawableInterface::position() + */ + public function position(): PointInterface + { + return $this->pivot; + } + + /** + * {@inheritdoc} + * + * @see DrawableInterface::setPosition() + */ + public function setPosition(PointInterface $position): DrawableInterface + { + $this->pivot = $position; + + return $this; + } + + /** + * Implement iteration through all points of bezier + * + * @return Traversable + */ + public function getIterator(): Traversable + { + return new ArrayIterator($this->points); + } + + /** + * Return current pivot point + */ + public function pivot(): PointInterface + { + return $this->pivot; + } + + /** + * Change pivot point to given point + */ + public function setPivot(PointInterface $pivot): self + { + $this->pivot = $pivot; + + return $this; + } + + /** + * Return first control point of bezier + */ + public function first(): ?PointInterface + { + if ($point = reset($this->points)) { + return $point; + } + + return null; + } + + /** + * Return second control point of bezier + */ + public function second(): ?PointInterface + { + if (array_key_exists(1, $this->points)) { + return $this->points[1]; + } + + return null; + } + + /** + * Return third control point of bezier + */ + public function third(): ?PointInterface + { + if (array_key_exists(2, $this->points)) { + return $this->points[2]; + } + + return null; + } + + /** + * Return last control point of bezier + */ + public function last(): ?PointInterface + { + if ($point = end($this->points)) { + return $point; + } + + return null; + } + + /** + * Return bezier's point count + */ + public function count(): int + { + return count($this->points); + } + + /** + * Determine if point exists at given offset + */ + public function offsetExists(mixed $offset): bool + { + return array_key_exists($offset, $this->points); + } + + /** + * Return point at given offset + */ + public function offsetGet(mixed $offset): mixed + { + return $this->points[$offset]; + } + + /** + * Set point at given offset + */ + public function offsetSet(mixed $offset, mixed $value): void + { + $this->points[$offset] = $value; + } + + /** + * Unset offset at given offset + */ + public function offsetUnset(mixed $offset): void + { + unset($this->points[$offset]); + } + + /** + * Add given point to bezier + */ + public function addPoint(PointInterface $point): self + { + $this->points[] = $point; + + return $this; + } + + /** + * Return array of all x/y values of all points of bezier + * + * @return array + */ + public function toArray(): array + { + $coordinates = []; + foreach ($this->points as $point) { + $coordinates[] = $point->x(); + $coordinates[] = $point->y(); + } + + return $coordinates; + } +} diff --git a/vendor/intervention/image/src/Geometry/Circle.php b/vendor/intervention/image/src/Geometry/Circle.php new file mode 100755 index 00000000..dc2e28b9 --- /dev/null +++ b/vendor/intervention/image/src/Geometry/Circle.php @@ -0,0 +1,57 @@ +setWidth($diameter); + $this->setHeight($diameter); + + return $this; + } + + /** + * Get diameter of circle + */ + public function diameter(): int + { + return $this->width(); + } + + /** + * Set radius of circle + */ + public function setRadius(int $radius): self + { + return $this->setDiameter(intval($radius * 2)); + } + + /** + * Get radius of circle + */ + public function radius(): int + { + return intval(round($this->diameter() / 2)); + } +} diff --git a/vendor/intervention/image/src/Geometry/Ellipse.php b/vendor/intervention/image/src/Geometry/Ellipse.php new file mode 100755 index 00000000..e27c9d8e --- /dev/null +++ b/vendor/intervention/image/src/Geometry/Ellipse.php @@ -0,0 +1,103 @@ +pivot; + } + + /** + * {@inheritdoc} + * + * @see DrawableInterface::setPosition() + */ + public function setPosition(PointInterface $position): self + { + $this->pivot = $position; + + return $this; + } + + /** + * Return pivot point of Ellipse + */ + public function pivot(): PointInterface + { + return $this->pivot; + } + + /** + * Set size of Ellipse + */ + public function setSize(int $width, int $height): self + { + return $this->setWidth($width)->setHeight($height); + } + + /** + * Set width of Ellipse + */ + public function setWidth(int $width): self + { + $this->width = $width; + + return $this; + } + + /** + * Set height of Ellipse + */ + public function setHeight(int $height): self + { + $this->height = $height; + + return $this; + } + + /** + * Get width of Ellipse + */ + public function width(): int + { + return $this->width; + } + + /** + * Get height of Ellipse + */ + public function height(): int + { + return $this->height; + } +} diff --git a/vendor/intervention/image/src/Geometry/Factories/BezierFactory.php b/vendor/intervention/image/src/Geometry/Factories/BezierFactory.php new file mode 100755 index 00000000..2d8410ba --- /dev/null +++ b/vendor/intervention/image/src/Geometry/Factories/BezierFactory.php @@ -0,0 +1,88 @@ +bezier = is_a($init, Bezier::class) ? $init : new Bezier([]); + + if (is_callable($init)) { + $init($this); + } + } + + /** + * {@inheritdoc} + * + * @see DrawableFactoryInterface::init() + */ + public static function init(null|Closure|DrawableInterface $init = null): self + { + return new self($init); + } + + /** + * {@inheritdoc} + * + * @see DrawableFactoryInterface::create() + */ + public function create(): DrawableInterface + { + return $this->bezier; + } + + /** + * Add a point to the bezier to be produced + */ + public function point(int $x, int $y): self + { + $this->bezier->addPoint(new Point($x, $y)); + + return $this; + } + + /** + * Set the background color of the bezier to be produced + */ + public function background(mixed $color): self + { + $this->bezier->setBackgroundColor($color); + + return $this; + } + + /** + * Set the border color & border size of the bezier to be produced + */ + public function border(mixed $color, int $size = 1): self + { + $this->bezier->setBorder($color, $size); + + return $this; + } + + /** + * Produce the bezier + */ + public function __invoke(): Bezier + { + return $this->bezier; + } +} diff --git a/vendor/intervention/image/src/Geometry/Factories/CircleFactory.php b/vendor/intervention/image/src/Geometry/Factories/CircleFactory.php new file mode 100755 index 00000000..f45b5812 --- /dev/null +++ b/vendor/intervention/image/src/Geometry/Factories/CircleFactory.php @@ -0,0 +1,102 @@ +circle = is_a($init, Circle::class) ? $init : new Circle(0); + $this->circle->setPosition($pivot); + + if (is_callable($init)) { + $init($this); + } + } + + /** + * {@inheritdoc} + * + * @see DrawableFactoryInterface::init() + */ + public static function init(null|Closure|DrawableInterface $init = null): self + { + return new self(init: $init); + } + + /** + * {@inheritdoc} + * + * @see DrawableFactoryInterface::create() + */ + public function create(): DrawableInterface + { + return $this->circle; + } + + /** + * Set the radius of the circle to be produced + */ + public function radius(int $radius): self + { + $this->circle->setSize($radius * 2, $radius * 2); + + return $this; + } + + /** + * Set the diameter of the circle to be produced + */ + public function diameter(int $diameter): self + { + $this->circle->setSize($diameter, $diameter); + + return $this; + } + + /** + * Set the background color of the circle to be produced + */ + public function background(mixed $color): self + { + $this->circle->setBackgroundColor($color); + + return $this; + } + + /** + * Set the border color & border size of the ellipse to be produced + */ + public function border(mixed $color, int $size = 1): self + { + $this->circle->setBorder($color, $size); + + return $this; + } + + /** + * Produce the circle + */ + public function __invoke(): Circle + { + return $this->circle; + } +} diff --git a/vendor/intervention/image/src/Geometry/Factories/Drawable.php b/vendor/intervention/image/src/Geometry/Factories/Drawable.php new file mode 100755 index 00000000..e7f14ba9 --- /dev/null +++ b/vendor/intervention/image/src/Geometry/Factories/Drawable.php @@ -0,0 +1,56 @@ +ellipse = is_a($init, Ellipse::class) ? $init : new Ellipse(0, 0); + $this->ellipse->setPosition($pivot); + + if (is_callable($init)) { + $init($this); + } + } + + /** + * {@inheritdoc} + * + * @see DrawableFactoryInterface::init() + */ + public static function init(null|Closure|DrawableInterface $init = null): self + { + return new self(init: $init); + } + + /** + * {@inheritdoc} + * + * @see DrawableFactoryInterface::create() + */ + public function create(): DrawableInterface + { + return $this->ellipse; + } + + /** + * Set the size of the ellipse to be produced + */ + public function size(int $width, int $height): self + { + $this->ellipse->setSize($width, $height); + + return $this; + } + + /** + * Set the width of the ellipse to be produced + */ + public function width(int $width): self + { + $this->ellipse->setWidth($width); + + return $this; + } + + /** + * Set the height of the ellipse to be produced + */ + public function height(int $height): self + { + $this->ellipse->setHeight($height); + + return $this; + } + + /** + * Set the background color of the ellipse to be produced + */ + public function background(mixed $color): self + { + $this->ellipse->setBackgroundColor($color); + + return $this; + } + + /** + * Set the border color & border size of the ellipse to be produced + */ + public function border(mixed $color, int $size = 1): self + { + $this->ellipse->setBorder($color, $size); + + return $this; + } + + /** + * Produce the ellipse + */ + public function __invoke(): Ellipse + { + return $this->ellipse; + } +} diff --git a/vendor/intervention/image/src/Geometry/Factories/LineFactory.php b/vendor/intervention/image/src/Geometry/Factories/LineFactory.php new file mode 100755 index 00000000..ce65433a --- /dev/null +++ b/vendor/intervention/image/src/Geometry/Factories/LineFactory.php @@ -0,0 +1,122 @@ +line = is_a($init, Line::class) ? $init : new Line(new Point(), new Point()); + + if (is_callable($init)) { + $init($this); + } + } + + /** + * {@inheritdoc} + * + * @see DrawableFactoryInterface::init() + */ + public static function init(null|Closure|DrawableInterface $init = null): self + { + return new self($init); + } + + /** + * {@inheritdoc} + * + * @see DrawableFactoryInterface::create() + */ + public function create(): DrawableInterface + { + return $this->line; + } + + /** + * Set the color of the line to be produced + */ + public function color(mixed $color): self + { + $this->line->setBackgroundColor($color); + $this->line->setBorderColor($color); + + return $this; + } + + /** + * Set the (background) color of the line to be produced + */ + public function background(mixed $color): self + { + $this->line->setBackgroundColor($color); + $this->line->setBorderColor($color); + + return $this; + } + + /** + * Set the border size & border color of the line to be produced + */ + public function border(mixed $color, int $size = 1): self + { + $this->line->setBackgroundColor($color); + $this->line->setBorderColor($color); + $this->line->setWidth($size); + + return $this; + } + + /** + * Set the width of the line to be produced + */ + public function width(int $size): self + { + $this->line->setWidth($size); + + return $this; + } + + /** + * Set the coordinates of the starting point of the line to be produced + */ + public function from(int $x, int $y): self + { + $this->line->setStart(new Point($x, $y)); + + return $this; + } + + /** + * Set the coordinates of the end point of the line to be produced + */ + public function to(int $x, int $y): self + { + $this->line->setEnd(new Point($x, $y)); + + return $this; + } + + /** + * Produce the line + */ + public function __invoke(): Line + { + return $this->line; + } +} diff --git a/vendor/intervention/image/src/Geometry/Factories/PolygonFactory.php b/vendor/intervention/image/src/Geometry/Factories/PolygonFactory.php new file mode 100755 index 00000000..d065eb86 --- /dev/null +++ b/vendor/intervention/image/src/Geometry/Factories/PolygonFactory.php @@ -0,0 +1,88 @@ +polygon = is_a($init, Polygon::class) ? $init : new Polygon([]); + + if (is_callable($init)) { + $init($this); + } + } + + /** + * {@inheritdoc} + * + * @see DrawableFactoryInterface::init() + */ + public static function init(null|Closure|DrawableInterface $init = null): self + { + return new self($init); + } + + /** + * {@inheritdoc} + * + * @see DrawableFactoryInterface::create() + */ + public function create(): DrawableInterface + { + return $this->polygon; + } + + /** + * Add a point to the polygon to be produced + */ + public function point(int $x, int $y): self + { + $this->polygon->addPoint(new Point($x, $y)); + + return $this; + } + + /** + * Set the background color of the polygon to be produced + */ + public function background(mixed $color): self + { + $this->polygon->setBackgroundColor($color); + + return $this; + } + + /** + * Set the border color & border size of the polygon to be produced + */ + public function border(mixed $color, int $size = 1): self + { + $this->polygon->setBorder($color, $size); + + return $this; + } + + /** + * Produce the polygon + */ + public function __invoke(): Polygon + { + return $this->polygon; + } +} diff --git a/vendor/intervention/image/src/Geometry/Factories/RectangleFactory.php b/vendor/intervention/image/src/Geometry/Factories/RectangleFactory.php new file mode 100755 index 00000000..34732f24 --- /dev/null +++ b/vendor/intervention/image/src/Geometry/Factories/RectangleFactory.php @@ -0,0 +1,112 @@ +rectangle = is_a($init, Rectangle::class) ? $init : new Rectangle(0, 0, $pivot); + $this->rectangle->setPosition($pivot); + + if (is_callable($init)) { + $init($this); + } + } + + /** + * {@inheritdoc} + * + * @see DrawableFactoryInterface::init() + */ + public static function init(null|Closure|DrawableInterface $init = null): self + { + return new self(init: $init); + } + + /** + * {@inheritdoc} + * + * @see DrawableFactoryInterface::create() + */ + public function create(): DrawableInterface + { + return $this->rectangle; + } + + /** + * Set the size of the rectangle to be produced + */ + public function size(int $width, int $height): self + { + $this->rectangle->setSize($width, $height); + + return $this; + } + + /** + * Set the width of the rectangle to be produced + */ + public function width(int $width): self + { + $this->rectangle->setWidth($width); + + return $this; + } + + /** + * Set the height of the rectangle to be produced + */ + public function height(int $height): self + { + $this->rectangle->setHeight($height); + + return $this; + } + + /** + * Set the background color of the rectangle to be produced + */ + public function background(mixed $color): self + { + $this->rectangle->setBackgroundColor($color); + + return $this; + } + + /** + * Set the border color & border size of the rectangle to be produced + */ + public function border(mixed $color, int $size = 1): self + { + $this->rectangle->setBorder($color, $size); + + return $this; + } + + /** + * Produce the rectangle + */ + public function __invoke(): Rectangle + { + return $this->rectangle; + } +} diff --git a/vendor/intervention/image/src/Geometry/Line.php b/vendor/intervention/image/src/Geometry/Line.php new file mode 100755 index 00000000..14dd062d --- /dev/null +++ b/vendor/intervention/image/src/Geometry/Line.php @@ -0,0 +1,127 @@ +start; + } + + /** + * {@inheritdoc} + * + * @see DrawableInterface::setPosition() + */ + public function setPosition(PointInterface $position): DrawableInterface + { + $this->start = $position; + + return $this; + } + + /** + * Return line width + */ + public function width(): int + { + return $this->width; + } + + /** + * Set line width + */ + public function setWidth(int $width): self + { + $this->width = $width; + + return $this; + } + + /** + * Get starting point of line + */ + public function start(): PointInterface + { + return $this->start; + } + + /** + * get end point of line + */ + public function end(): PointInterface + { + return $this->end; + } + + /** + * Set starting point of line + */ + public function setStart(PointInterface $start): self + { + $this->start = $start; + + return $this; + } + + /** + * Set starting point of line by coordinates + */ + public function from(int $x, int $y): self + { + $this->start()->setX($x); + $this->start()->setY($y); + + return $this; + } + + /** + * Set end point of line by coordinates + */ + public function to(int $x, int $y): self + { + $this->end()->setX($x); + $this->end()->setY($y); + + return $this; + } + + /** + * Set end point of line + */ + public function setEnd(PointInterface $end): self + { + $this->end = $end; + + return $this; + } +} diff --git a/vendor/intervention/image/src/Geometry/Pixel.php b/vendor/intervention/image/src/Geometry/Pixel.php new file mode 100755 index 00000000..dc5c5804 --- /dev/null +++ b/vendor/intervention/image/src/Geometry/Pixel.php @@ -0,0 +1,45 @@ +background = $background; + + return $this; + } + + /** + * {@inheritdoc} + * + * @see DrawableInterface::backgroundColor() + */ + public function backgroundColor(): ColorInterface + { + return $this->background; + } +} diff --git a/vendor/intervention/image/src/Geometry/Point.php b/vendor/intervention/image/src/Geometry/Point.php new file mode 100755 index 00000000..f23cd565 --- /dev/null +++ b/vendor/intervention/image/src/Geometry/Point.php @@ -0,0 +1,145 @@ + + */ +class Point implements PointInterface, IteratorAggregate +{ + /** + * Create new point instance + * + * @return void + */ + public function __construct( + protected int $x = 0, + protected int $y = 0 + ) { + // + } + + /** + * {@inheritdoc} + * + * @see IteratorAggregate::getIterator() + */ + public function getIterator(): Traversable + { + return new ArrayIterator([$this->x, $this->y]); + } + + /** + * {@inheritdoc} + * + * @see PointInterface::setX() + */ + public function setX(int $x): self + { + $this->x = $x; + + return $this; + } + + /** + * {@inheritdoc} + * + * @see PointInterface::x() + */ + public function x(): int + { + return $this->x; + } + + /** + * {@inheritdoc} + * + * @see PointInterface::setY() + */ + public function setY(int $y): self + { + $this->y = $y; + + return $this; + } + + /** + * {@inheritdoc} + * + * @see PointInterface::y() + */ + public function y(): int + { + return $this->y; + } + + /** + * {@inheritdoc} + * + * @see PointInterface::moveX() + */ + public function moveX(int $value): self + { + $this->x += $value; + + return $this; + } + + /** + * {@inheritdoc} + * + * @see PointInterface::moveY() + */ + public function moveY(int $value): self + { + $this->y += $value; + + return $this; + } + + /** + * {@inheritdoc} + * + * @see PointInterface::move() + */ + public function move(int $x, int $y): self + { + return $this->moveX($x)->moveY($y); + } + + /** + * {@inheritdoc} + * + * @see PointInterface::setPosition() + */ + public function setPosition(int $x, int $y): self + { + $this->setX($x); + $this->setY($y); + + return $this; + } + + /** + * {@inheritdoc} + * + * @see PointInterface::rotate() + */ + public function rotate(float $angle, PointInterface $pivot): self + { + $sin = round(sin(deg2rad($angle)), 6); + $cos = round(cos(deg2rad($angle)), 6); + + return $this->setPosition( + intval($cos * ($this->x() - $pivot->x()) - $sin * ($this->y() - $pivot->y()) + $pivot->x()), + intval($sin * ($this->x() - $pivot->x()) + $cos * ($this->y() - $pivot->y()) + $pivot->y()) + ); + } +} diff --git a/vendor/intervention/image/src/Geometry/Polygon.php b/vendor/intervention/image/src/Geometry/Polygon.php new file mode 100755 index 00000000..c416d39b --- /dev/null +++ b/vendor/intervention/image/src/Geometry/Polygon.php @@ -0,0 +1,390 @@ + + * @implements ArrayAccess + */ +class Polygon implements IteratorAggregate, Countable, ArrayAccess, DrawableInterface +{ + use HasBorder; + use HasBackgroundColor; + + /** + * Create new polygon instance + * + * @param array $points + * @return void + */ + public function __construct( + protected array $points = [], + protected PointInterface $pivot = new Point() + ) { + // + } + + /** + * {@inheritdoc} + * + * @see DrawableInterface::position() + */ + public function position(): PointInterface + { + return $this->pivot; + } + + /** + * {@inheritdoc} + * + * @see DrawableInterface::setPosition() + */ + public function setPosition(PointInterface $position): self + { + $this->pivot = $position; + + return $this; + } + + /** + * Implement iteration through all points of polygon + * + * @return Traversable + */ + public function getIterator(): Traversable + { + return new ArrayIterator($this->points); + } + + /** + * Return current pivot point + */ + public function pivot(): PointInterface + { + return $this->pivot; + } + + /** + * Change pivot point to given point + */ + public function setPivot(PointInterface $pivot): self + { + $this->pivot = $pivot; + + return $this; + } + + /** + * Return first point of polygon + */ + public function first(): ?PointInterface + { + if ($point = reset($this->points)) { + return $point; + } + + return null; + } + + /** + * Return last point of polygon + */ + public function last(): ?PointInterface + { + if ($point = end($this->points)) { + return $point; + } + + return null; + } + + /** + * Return polygon's point count + */ + public function count(): int + { + return count($this->points); + } + + /** + * Determine if point exists at given offset + */ + public function offsetExists(mixed $offset): bool + { + return array_key_exists($offset, $this->points); + } + + /** + * Return point at given offset + */ + public function offsetGet(mixed $offset): mixed + { + return $this->points[$offset]; + } + + /** + * Set point at given offset + */ + public function offsetSet(mixed $offset, mixed $value): void + { + $this->points[$offset] = $value; + } + + /** + * Unset offset at given offset + */ + public function offsetUnset(mixed $offset): void + { + unset($this->points[$offset]); + } + + /** + * Add given point to polygon + */ + public function addPoint(PointInterface $point): self + { + $this->points[] = $point; + + return $this; + } + + /** + * Calculate total horizontal span of polygon + */ + public function width(): int + { + return abs($this->mostLeftPoint()->x() - $this->mostRightPoint()->x()); + } + + /** + * Calculate total vertical span of polygon + */ + public function height(): int + { + return abs($this->mostBottomPoint()->y() - $this->mostTopPoint()->y()); + } + + /** + * Return most left point of all points in polygon + */ + public function mostLeftPoint(): PointInterface + { + $points = $this->points; + + usort($points, function (PointInterface $a, PointInterface $b): int { + if ($a->x() === $b->x()) { + return 0; + } + return $a->x() < $b->x() ? -1 : 1; + }); + + return $points[0]; + } + + /** + * Return most right point in polygon + */ + public function mostRightPoint(): PointInterface + { + $points = $this->points; + + usort($points, function (PointInterface $a, PointInterface $b): int { + if ($a->x() === $b->x()) { + return 0; + } + return $a->x() > $b->x() ? -1 : 1; + }); + + return $points[0]; + } + + /** + * Return most top point in polygon + */ + public function mostTopPoint(): PointInterface + { + $points = $this->points; + + usort($points, function (PointInterface $a, PointInterface $b): int { + if ($a->y() === $b->y()) { + return 0; + } + return $a->y() > $b->y() ? -1 : 1; + }); + + return $points[0]; + } + + /** + * Return most bottom point in polygon + */ + public function mostBottomPoint(): PointInterface + { + $points = $this->points; + + usort($points, function (PointInterface $a, PointInterface $b): int { + if ($a->y() === $b->y()) { + return 0; + } + return $a->y() < $b->y() ? -1 : 1; + }); + + return $points[0]; + } + + /** + * Return point in absolute center of the polygon + */ + public function centerPoint(): PointInterface + { + return new Point( + $this->mostRightPoint()->x() - (intval(round($this->width() / 2))), + $this->mostTopPoint()->y() - (intval(round($this->height() / 2))) + ); + } + + /** + * Align all points of polygon horizontally to given position around pivot point + */ + public function align(string $position): self + { + switch (strtolower($position)) { + case 'center': + case 'middle': + $diff = $this->centerPoint()->x() - $this->pivot()->x(); + break; + + case 'right': + $diff = $this->mostRightPoint()->x() - $this->pivot()->x(); + break; + + default: + case 'left': + $diff = $this->mostLeftPoint()->x() - $this->pivot()->x(); + break; + } + + foreach ($this->points as $point) { + $point->setX( + intval($point->x() - $diff) + ); + } + + return $this; + } + + /** + * Align all points of polygon vertically to given position around pivot point + */ + public function valign(string $position): self + { + switch (strtolower($position)) { + case 'center': + case 'middle': + $diff = $this->centerPoint()->y() - $this->pivot()->y(); + break; + + case 'top': + $diff = $this->mostTopPoint()->y() - $this->pivot()->y() - $this->height(); + break; + + default: + case 'bottom': + $diff = $this->mostBottomPoint()->y() - $this->pivot()->y() + $this->height(); + break; + } + + foreach ($this->points as $point) { + $point->setY( + intval($point->y() - $diff), + ); + } + + return $this; + } + + /** + * Rotate points of polygon around pivot point with given angle + */ + public function rotate(float $angle): self + { + $sin = sin(deg2rad($angle)); + $cos = cos(deg2rad($angle)); + + foreach ($this->points as $point) { + // translate point to pivot + $point->setX( + intval($point->x() - $this->pivot()->x()), + ); + $point->setY( + intval($point->y() - $this->pivot()->y()), + ); + + // rotate point + $x = $point->x() * $cos - $point->y() * $sin; + $y = $point->x() * $sin + $point->y() * $cos; + + // translate point back + $point->setX( + intval($x + $this->pivot()->x()), + ); + $point->setY( + intval($y + $this->pivot()->y()), + ); + } + + return $this; + } + + /** + * Move all points by given amount on the x-axis + */ + public function movePointsX(int $amount): self + { + foreach ($this->points as $point) { + $point->moveX($amount); + } + + return $this; + } + + /** + * Move all points by given amount on the y-axis + */ + public function movePointsY(int $amount): self + { + foreach ($this->points as $point) { + $point->moveY($amount); + } + + return $this; + } + + /** + * Return array of all x/y values of all points of polygon + * + * @return array + */ + public function toArray(): array + { + $coordinates = []; + foreach ($this->points as $point) { + $coordinates[] = $point->x(); + $coordinates[] = $point->y(); + } + + return $coordinates; + } +} diff --git a/vendor/intervention/image/src/Geometry/Rectangle.php b/vendor/intervention/image/src/Geometry/Rectangle.php new file mode 100755 index 00000000..01e57f9b --- /dev/null +++ b/vendor/intervention/image/src/Geometry/Rectangle.php @@ -0,0 +1,335 @@ +addPoint(new Point($this->pivot->x(), $this->pivot->y())); + $this->addPoint(new Point($this->pivot->x() + $width, $this->pivot->y())); + $this->addPoint(new Point($this->pivot->x() + $width, $this->pivot->y() - $height)); + $this->addPoint(new Point($this->pivot->x(), $this->pivot->y() - $height)); + } + + /** + * Set size of rectangle + */ + public function setSize(int $width, int $height): self + { + return $this->setWidth($width)->setHeight($height); + } + + /** + * Set width of rectangle + */ + public function setWidth(int $width): self + { + $this[1]->setX($this[0]->x() + $width); + $this[2]->setX($this[3]->x() + $width); + + return $this; + } + + /** + * Set height of rectangle + */ + public function setHeight(int $height): self + { + $this[2]->setY($this[1]->y() + $height); + $this[3]->setY($this[0]->y() + $height); + + return $this; + } + + /** + * Return pivot point of rectangle + */ + public function pivot(): PointInterface + { + return $this->pivot; + } + + /** + * Set pivot point of rectangle + */ + public function setPivot(PointInterface $pivot): self + { + $this->pivot = $pivot; + + return $this; + } + + /** + * Move pivot to the given position in the rectangle and adjust the new + * position by given offset values. + */ + public function movePivot(string $position, int $offset_x = 0, int $offset_y = 0): self + { + switch (strtolower($position)) { + case 'top': + case 'top-center': + case 'top-middle': + case 'center-top': + case 'middle-top': + $x = intval(round($this->width() / 2)) + $offset_x; + $y = $offset_y; + break; + + case 'top-right': + case 'right-top': + $x = $this->width() - $offset_x; + $y = $offset_y; + break; + + case 'left': + case 'left-center': + case 'left-middle': + case 'center-left': + case 'middle-left': + $x = $offset_x; + $y = intval(round($this->height() / 2)) + $offset_y; + break; + + case 'right': + case 'right-center': + case 'right-middle': + case 'center-right': + case 'middle-right': + $x = $this->width() - $offset_x; + $y = intval(round($this->height() / 2)) + $offset_y; + break; + + case 'bottom-left': + case 'left-bottom': + $x = $offset_x; + $y = $this->height() - $offset_y; + break; + + case 'bottom': + case 'bottom-center': + case 'bottom-middle': + case 'center-bottom': + case 'middle-bottom': + $x = intval(round($this->width() / 2)) + $offset_x; + $y = $this->height() - $offset_y; + break; + + case 'bottom-right': + case 'right-bottom': + $x = $this->width() - $offset_x; + $y = $this->height() - $offset_y; + break; + + case 'center': + case 'middle': + case 'center-center': + case 'middle-middle': + $x = intval(round($this->width() / 2)) + $offset_x; + $y = intval(round($this->height() / 2)) + $offset_y; + break; + + default: + case 'top-left': + case 'left-top': + $x = $offset_x; + $y = $offset_y; + break; + } + + $this->pivot->setPosition($x, $y); + + return $this; + } + + /** + * Align pivot relative to given size at given position + */ + public function alignPivotTo(SizeInterface $size, string $position): self + { + $reference = new self($size->width(), $size->height()); + $reference->movePivot($position); + + $this->movePivot($position)->setPivot( + $reference->relativePositionTo($this) + ); + + return $this; + } + + /** + * Return relative position to given rectangle + */ + public function relativePositionTo(SizeInterface $rectangle): PointInterface + { + return new Point( + $this->pivot()->x() - $rectangle->pivot()->x(), + $this->pivot()->y() - $rectangle->pivot()->y() + ); + } + + /** + * Return aspect ration of rectangle + */ + public function aspectRatio(): float + { + return $this->width() / $this->height(); + } + + /** + * Determine if rectangle fits into given rectangle + */ + public function fitsInto(SizeInterface $size): bool + { + if ($this->width() > $size->width()) { + return false; + } + + if ($this->height() > $size->height()) { + return false; + } + + return true; + } + + /** + * Determine if rectangle has landscape format + */ + public function isLandscape(): bool + { + return $this->width() > $this->height(); + } + + /** + * Determine if rectangle has landscape format + */ + public function isPortrait(): bool + { + return $this->width() < $this->height(); + } + + /** + * Return most top left point of rectangle + */ + public function topLeftPoint(): PointInterface + { + return $this->points[0]; + } + + /** + * Return bottom right point of rectangle + */ + public function bottomRightPoint(): PointInterface + { + return $this->points[2]; + } + + /** + * @see SizeInterface::resize() + * + * @throws GeometryException + */ + public function resize(?int $width = null, ?int $height = null): SizeInterface + { + return $this->resizer($width, $height)->resize($this); + } + + /** + * @see SizeInterface::resizeDown() + * + * @throws GeometryException + */ + public function resizeDown(?int $width = null, ?int $height = null): SizeInterface + { + return $this->resizer($width, $height)->resizeDown($this); + } + + /** + * @see SizeInterface::scale() + * + * @throws GeometryException + */ + public function scale(?int $width = null, ?int $height = null): SizeInterface + { + return $this->resizer($width, $height)->scale($this); + } + + /** + * @see SizeInterface::scaleDown() + * + * @throws GeometryException + */ + public function scaleDown(?int $width = null, ?int $height = null): SizeInterface + { + return $this->resizer($width, $height)->scaleDown($this); + } + + /** + * @see SizeInterface::cover() + * + * @throws GeometryException + */ + public function cover(int $width, int $height): SizeInterface + { + return $this->resizer($width, $height)->cover($this); + } + + /** + * @see SizeInterface::contain() + * + * @throws GeometryException + */ + public function contain(int $width, int $height): SizeInterface + { + return $this->resizer($width, $height)->contain($this); + } + + /** + * @see SizeInterface::containMax() + * + * @throws GeometryException + */ + public function containMax(int $width, int $height): SizeInterface + { + return $this->resizer($width, $height)->containDown($this); + } + + /** + * Create resizer instance with given target size + * + * @throws GeometryException + */ + protected function resizer(?int $width = null, ?int $height = null): RectangleResizer + { + return new RectangleResizer($width, $height); + } + + /** + * Show debug info for the current rectangle + * + * @return array + */ + public function __debugInfo(): array + { + return [ + 'width' => $this->width(), + 'height' => $this->height(), + 'pivot' => $this->pivot, + ]; + } +} diff --git a/vendor/intervention/image/src/Geometry/Tools/RectangleResizer.php b/vendor/intervention/image/src/Geometry/Tools/RectangleResizer.php new file mode 100755 index 00000000..7136b367 --- /dev/null +++ b/vendor/intervention/image/src/Geometry/Tools/RectangleResizer.php @@ -0,0 +1,341 @@ +width); + } + + /** + * Return target width of resizer if available + */ + protected function getTargetWidth(): ?int + { + return $this->hasTargetWidth() ? $this->width : null; + } + + /** + * Determine if resize has target height + */ + protected function hasTargetHeight(): bool + { + return is_int($this->height); + } + + /** + * Return target width of resizer if available + */ + protected function getTargetHeight(): ?int + { + return $this->hasTargetHeight() ? $this->height : null; + } + + /** + * Return target size object + * + * @throws GeometryException + */ + protected function getTargetSize(): SizeInterface + { + if (!$this->hasTargetWidth() || !$this->hasTargetHeight()) { + throw new GeometryException('Target size needs width and height.'); + } + + return new Rectangle($this->width, $this->height); + } + + /** + * Set target width of resizer + */ + public function toWidth(int $width): self + { + $this->width = $width; + + return $this; + } + + /** + * Set target height of resizer + */ + public function toHeight(int $height): self + { + $this->height = $height; + + return $this; + } + + /** + * Set target size to given size object + */ + public function toSize(SizeInterface $size): self + { + $this->width = $size->width(); + $this->height = $size->height(); + + return $this; + } + + /** + * Get proportinal width + */ + protected function getProportionalWidth(SizeInterface $size): int + { + if (!$this->hasTargetHeight()) { + return $size->width(); + } + + return max([1, (int) round($this->height * $size->aspectRatio())]); + } + + /** + * Get proportinal height + */ + protected function getProportionalHeight(SizeInterface $size): int + { + if (!$this->hasTargetWidth()) { + return $size->height(); + } + + return max([1, (int) round($this->width / $size->aspectRatio())]); + } + + /** + * Resize given size to target size of the resizer + */ + public function resize(SizeInterface $size): SizeInterface + { + $resized = new Rectangle($size->width(), $size->height()); + + if ($width = $this->getTargetWidth()) { + $resized->setWidth($width); + } + + if ($height = $this->getTargetHeight()) { + $resized->setHeight($height); + } + + return $resized; + } + + /** + * Resize given size to target size of the resizer but do not exceed original size + */ + public function resizeDown(SizeInterface $size): SizeInterface + { + $resized = new Rectangle($size->width(), $size->height()); + + if ($width = $this->getTargetWidth()) { + $resized->setWidth( + min($width, $size->width()) + ); + } + + if ($height = $this->getTargetHeight()) { + $resized->setHeight( + min($height, $size->height()) + ); + } + + return $resized; + } + + /** + * Resize given size to target size proportinally + */ + public function scale(SizeInterface $size): SizeInterface + { + $resized = new Rectangle($size->width(), $size->height()); + + if ($this->hasTargetWidth() && $this->hasTargetHeight()) { + $resized->setWidth(min( + $this->getProportionalWidth($size), + $this->getTargetWidth() + )); + $resized->setHeight(min( + $this->getProportionalHeight($size), + $this->getTargetHeight() + )); + } elseif ($this->hasTargetWidth()) { + $resized->setWidth($this->getTargetWidth()); + $resized->setHeight($this->getProportionalHeight($size)); + } elseif ($this->hasTargetHeight()) { + $resized->setWidth($this->getProportionalWidth($size)); + $resized->setHeight($this->getTargetHeight()); + } + + return $resized; + } + + /** + * Resize given size to target size proportinally but do not exceed original size + */ + public function scaleDown(SizeInterface $size): SizeInterface + { + $resized = new Rectangle($size->width(), $size->height()); + + if ($this->hasTargetWidth() && $this->hasTargetHeight()) { + $resized->setWidth(min( + $this->getProportionalWidth($size), + $this->getTargetWidth(), + $size->width() + )); + $resized->setHeight(min( + $this->getProportionalHeight($size), + $this->getTargetHeight(), + $size->height() + )); + } elseif ($this->hasTargetWidth()) { + $resized->setWidth(min( + $this->getTargetWidth(), + $size->width() + )); + $resized->setHeight(min( + $this->getProportionalHeight($size), + $size->height() + )); + } elseif ($this->hasTargetHeight()) { + $resized->setWidth(min( + $this->getProportionalWidth($size), + $size->width() + )); + $resized->setHeight(min( + $this->getTargetHeight(), + $size->height() + )); + } + + return $resized; + } + + /** + * Scale given size to cover target size + * + * @param SizeInterface $size Size to be resized + * @throws GeometryException + */ + public function cover(SizeInterface $size): SizeInterface + { + $resized = new Rectangle($size->width(), $size->height()); + + // auto height + $resized->setWidth($this->getTargetWidth()); + $resized->setHeight($this->getProportionalHeight($size)); + + if ($resized->fitsInto($this->getTargetSize())) { + // auto width + $resized->setWidth($this->getProportionalWidth($size)); + $resized->setHeight($this->getTargetHeight()); + } + + return $resized; + } + + /** + * Scale given size to contain target size + * + * @param SizeInterface $size Size to be resized + * @throws GeometryException + */ + public function contain(SizeInterface $size): SizeInterface + { + $resized = new Rectangle($size->width(), $size->height()); + + // auto height + $resized->setWidth($this->getTargetWidth()); + $resized->setHeight($this->getProportionalHeight($size)); + + if (!$resized->fitsInto($this->getTargetSize())) { + // auto width + $resized->setWidth($this->getProportionalWidth($size)); + $resized->setHeight($this->getTargetHeight()); + } + + return $resized; + } + + /** + * Scale given size to contain target size but prevent upsizing + * + * @param SizeInterface $size Size to be resized + * @throws GeometryException + */ + public function containDown(SizeInterface $size): SizeInterface + { + $resized = new Rectangle($size->width(), $size->height()); + + // auto height + $resized->setWidth( + min($size->width(), $this->getTargetWidth()) + ); + + $resized->setHeight( + min($size->height(), $this->getProportionalHeight($size)) + ); + + if (!$resized->fitsInto($this->getTargetSize())) { + // auto width + $resized->setWidth( + min($size->width(), $this->getProportionalWidth($size)) + ); + $resized->setHeight( + min($size->height(), $this->getTargetHeight()) + ); + } + + return $resized; + } + + /** + * Crop target size out of given size at given position (i.e. move the pivot point) + */ + public function crop(SizeInterface $size, string $position = 'top-left'): SizeInterface + { + return $this->resize($size)->alignPivotTo( + $size->movePivot($position), + $position + ); + } +} diff --git a/vendor/intervention/image/src/Geometry/Traits/HasBackgroundColor.php b/vendor/intervention/image/src/Geometry/Traits/HasBackgroundColor.php new file mode 100755 index 00000000..a18c8b4a --- /dev/null +++ b/vendor/intervention/image/src/Geometry/Traits/HasBackgroundColor.php @@ -0,0 +1,42 @@ +backgroundColor = $color; + + return $this; + } + + /** + * {@inheritdoc} + * + * @see DrawableInterface::backgroundColor() + */ + public function backgroundColor(): mixed + { + return $this->backgroundColor; + } + + /** + * {@inheritdoc} + * + * @see DrawableInterface::hasBackgroundColor() + */ + public function hasBackgroundColor(): bool + { + return !empty($this->backgroundColor); + } +} diff --git a/vendor/intervention/image/src/Geometry/Traits/HasBorder.php b/vendor/intervention/image/src/Geometry/Traits/HasBorder.php new file mode 100755 index 00000000..57ff83ae --- /dev/null +++ b/vendor/intervention/image/src/Geometry/Traits/HasBorder.php @@ -0,0 +1,75 @@ +setBorderSize($size)->setBorderColor($color); + } + + /** + * {@inheritdoc} + * + * @see DrawableInterface::setBorderSize() + */ + public function setBorderSize(int $size): self + { + $this->borderSize = $size; + + return $this; + } + + /** + * {@inheritdoc} + * + * @see DrawableInterface::borderSize() + */ + public function borderSize(): int + { + return $this->borderSize; + } + + /** + * {@inheritdoc} + * + * @see DrawableInterface::setBorderColor() + */ + public function setBorderColor(mixed $color): self + { + $this->borderColor = $color; + + return $this; + } + + /** + * {@inheritdoc} + * + * @see DrawableInterface::borderColor() + */ + public function borderColor(): mixed + { + return $this->borderColor; + } + + /** + * {@inheritdoc} + * + * @see DrawableInterface::hasBorder() + */ + public function hasBorder(): bool + { + return $this->borderSize > 0 && !is_null($this->borderColor); + } +} diff --git a/vendor/intervention/image/src/Image.php b/vendor/intervention/image/src/Image.php new file mode 100755 index 00000000..738d0fec --- /dev/null +++ b/vendor/intervention/image/src/Image.php @@ -0,0 +1,1082 @@ +origin = new Origin(); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::driver() + */ + public function driver(): DriverInterface + { + return $this->driver; + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::core() + */ + public function core(): CoreInterface + { + return $this->core; + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::origin() + */ + public function origin(): Origin + { + return $this->origin; + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::setOrigin() + */ + public function setOrigin(Origin $origin): ImageInterface + { + $this->origin = $origin; + + return $this; + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::count() + */ + public function count(): int + { + return $this->core->count(); + } + + /** + * Implementation of IteratorAggregate + * + * @return Traversable + */ + public function getIterator(): Traversable + { + return $this->core; + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::isAnimated() + */ + public function isAnimated(): bool + { + return $this->count() > 1; + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::removeAnimation( + */ + public function removeAnimation(int|string $position = 0): ImageInterface + { + return $this->modify(new RemoveAnimationModifier($position)); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::sliceAnimation() + */ + public function sliceAnimation(int $offset = 0, ?int $length = null): ImageInterface + { + return $this->modify(new SliceAnimationModifier($offset, $length)); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::loops() + */ + public function loops(): int + { + return $this->core->loops(); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::setLoops() + */ + public function setLoops(int $loops): ImageInterface + { + $this->core->setLoops($loops); + + return $this; + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::exif() + */ + public function exif(?string $query = null): mixed + { + return is_null($query) ? $this->exif : $this->exif->get($query); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::setExif() + */ + public function setExif(CollectionInterface $exif): ImageInterface + { + $this->exif = $exif; + + return $this; + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::modify() + */ + public function modify(ModifierInterface $modifier): ImageInterface + { + return $this->driver->specialize($modifier)->apply($this); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::analyze() + */ + public function analyze(AnalyzerInterface $analyzer): mixed + { + return $this->driver->specialize($analyzer)->analyze($this); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::encode() + */ + public function encode(EncoderInterface $encoder = new AutoEncoder()): EncodedImageInterface + { + return $this->driver->specialize($encoder)->encode($this); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::save() + */ + public function save(?string $path = null, mixed ...$options): ImageInterface + { + $path = is_null($path) ? $this->origin()->filePath() : $path; + + if (is_null($path)) { + throw new EncoderException('Could not determine file path to save.'); + } + + try { + // try to determine encoding format by file extension of the path + $encoded = $this->encodeByPath($path, ...$options); + } catch (EncoderException) { + // fallback to encoding format by media type + $encoded = $this->encodeByMediaType(null, ...$options); + } + + $encoded->save($path); + + return $this; + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::width() + */ + public function width(): int + { + return $this->analyze(new WidthAnalyzer()); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::height() + */ + public function height(): int + { + return $this->analyze(new HeightAnalyzer()); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::size() + */ + public function size(): SizeInterface + { + return new Rectangle($this->width(), $this->height()); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::colorspace() + */ + public function colorspace(): ColorspaceInterface + { + return $this->analyze(new ColorspaceAnalyzer()); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::setColorspace() + */ + public function setColorspace(string|ColorspaceInterface $colorspace): ImageInterface + { + return $this->modify(new ColorspaceModifier($colorspace)); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::resolution() + */ + public function resolution(): ResolutionInterface + { + return $this->analyze(new ResolutionAnalyzer()); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::setResolution() + */ + public function setResolution(float $x, float $y): ImageInterface + { + return $this->modify(new ResolutionModifier($x, $y)); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::pickColor() + */ + public function pickColor(int $x, int $y, int $frame_key = 0): ColorInterface + { + return $this->analyze(new PixelColorAnalyzer($x, $y, $frame_key)); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::pickColors() + */ + public function pickColors(int $x, int $y): CollectionInterface + { + return $this->analyze(new PixelColorsAnalyzer($x, $y)); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::blendingColor() + */ + public function blendingColor(): ColorInterface + { + return $this->driver()->handleInput( + $this->driver()->config()->blendingColor + ); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::setBlendingColor() + */ + public function setBlendingColor(mixed $color): ImageInterface + { + $this->driver()->config()->setOptions( + blendingColor: $this->driver()->handleInput($color) + ); + + return $this; + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::blendTransparency() + */ + public function blendTransparency(mixed $color = null): ImageInterface + { + return $this->modify(new BlendTransparencyModifier($color)); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::profile() + */ + public function profile(): ProfileInterface + { + return $this->analyze(new ProfileAnalyzer()); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::setProfile() + */ + public function setProfile(ProfileInterface $profile): ImageInterface + { + return $this->modify(new ProfileModifier($profile)); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::removeProfile() + */ + public function removeProfile(): ImageInterface + { + return $this->modify(new ProfileRemovalModifier()); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::reduceColors() + */ + public function reduceColors(int $limit, mixed $background = 'transparent'): ImageInterface + { + return $this->modify(new QuantizeColorsModifier($limit, $background)); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::sharpen() + */ + public function sharpen(int $amount = 10): ImageInterface + { + return $this->modify(new SharpenModifier($amount)); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::invert() + */ + public function invert(): ImageInterface + { + return $this->modify(new InvertModifier()); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::pixelate() + */ + public function pixelate(int $size): ImageInterface + { + return $this->modify(new PixelateModifier($size)); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::greyscale() + */ + public function greyscale(): ImageInterface + { + return $this->modify(new GreyscaleModifier()); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::brightness() + */ + public function brightness(int $level): ImageInterface + { + return $this->modify(new BrightnessModifier($level)); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::contrast() + */ + public function contrast(int $level): ImageInterface + { + return $this->modify(new ContrastModifier($level)); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::gamma() + */ + public function gamma(float $gamma): ImageInterface + { + return $this->modify(new GammaModifier($gamma)); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::colorize() + */ + public function colorize(int $red = 0, int $green = 0, int $blue = 0): ImageInterface + { + return $this->modify(new ColorizeModifier($red, $green, $blue)); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::flip() + */ + public function flip(): ImageInterface + { + return $this->modify(new FlipModifier()); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::flop() + */ + public function flop(): ImageInterface + { + return $this->modify(new FlopModifier()); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::blur() + */ + public function blur(int $amount = 5): ImageInterface + { + return $this->modify(new BlurModifier($amount)); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::rotate() + */ + public function rotate(float $angle, mixed $background = 'ffffff'): ImageInterface + { + return $this->modify(new RotateModifier($angle, $background)); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::orient() + */ + public function orient(): ImageInterface + { + return $this->modify(new AlignRotationModifier()); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::text() + */ + public function text(string $text, int $x, int $y, callable|Closure|FontInterface $font): ImageInterface + { + return $this->modify( + new TextModifier( + $text, + new Point($x, $y), + call_user_func(new FontFactory($font)), + ), + ); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::resize() + */ + public function resize(?int $width = null, ?int $height = null): ImageInterface + { + return $this->modify(new ResizeModifier($width, $height)); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::resizeDown() + */ + public function resizeDown(?int $width = null, ?int $height = null): ImageInterface + { + return $this->modify(new ResizeDownModifier($width, $height)); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::scale() + */ + public function scale(?int $width = null, ?int $height = null): ImageInterface + { + return $this->modify(new ScaleModifier($width, $height)); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::scaleDown() + */ + public function scaleDown(?int $width = null, ?int $height = null): ImageInterface + { + return $this->modify(new ScaleDownModifier($width, $height)); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::cover() + */ + public function cover(int $width, int $height, string $position = 'center'): ImageInterface + { + return $this->modify(new CoverModifier($width, $height, $position)); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::coverDown() + */ + public function coverDown(int $width, int $height, string $position = 'center'): ImageInterface + { + return $this->modify(new CoverDownModifier($width, $height, $position)); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::resizeCanvas() + */ + public function resizeCanvas( + ?int $width = null, + ?int $height = null, + mixed $background = 'ffffff', + string $position = 'center' + ): ImageInterface { + return $this->modify(new ResizeCanvasModifier($width, $height, $background, $position)); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::resizeCanvasRelative() + */ + public function resizeCanvasRelative( + ?int $width = null, + ?int $height = null, + mixed $background = 'ffffff', + string $position = 'center' + ): ImageInterface { + return $this->modify(new ResizeCanvasRelativeModifier($width, $height, $background, $position)); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::padDown() + */ + public function pad( + int $width, + int $height, + mixed $background = 'ffffff', + string $position = 'center' + ): ImageInterface { + return $this->modify(new PadModifier($width, $height, $background, $position)); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::pad() + */ + public function contain( + int $width, + int $height, + mixed $background = 'ffffff', + string $position = 'center' + ): ImageInterface { + return $this->modify(new ContainModifier($width, $height, $background, $position)); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::crop() + */ + public function crop( + int $width, + int $height, + int $offset_x = 0, + int $offset_y = 0, + mixed $background = 'ffffff', + string $position = 'top-left' + ): ImageInterface { + return $this->modify(new CropModifier($width, $height, $offset_x, $offset_y, $background, $position)); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::trim() + */ + public function trim(int $tolerance = 0): ImageInterface + { + return $this->modify(new TrimModifier($tolerance)); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::place() + */ + public function place( + mixed $element, + string $position = 'top-left', + int $offset_x = 0, + int $offset_y = 0, + int $opacity = 100 + ): ImageInterface { + return $this->modify(new PlaceModifier($element, $position, $offset_x, $offset_y, $opacity)); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::fill() + */ + public function fill(mixed $color, ?int $x = null, ?int $y = null): ImageInterface + { + return $this->modify( + new FillModifier( + $color, + is_null($x) || is_null($y) ? null : new Point($x, $y), + ), + ); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::drawPixel() + */ + public function drawPixel(int $x, int $y, mixed $color): ImageInterface + { + return $this->modify(new DrawPixelModifier(new Point($x, $y), $color)); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::drawRectangle() + */ + public function drawRectangle(int $x, int $y, callable|Closure|Rectangle $init): ImageInterface + { + return $this->modify( + new DrawRectangleModifier( + call_user_func(new RectangleFactory(new Point($x, $y), $init)), + ), + ); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::drawEllipse() + */ + public function drawEllipse(int $x, int $y, callable|Closure|Ellipse $init): ImageInterface + { + return $this->modify( + new DrawEllipseModifier( + call_user_func(new EllipseFactory(new Point($x, $y), $init)), + ), + ); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::drawCircle() + */ + public function drawCircle(int $x, int $y, callable|Closure|Circle $init): ImageInterface + { + return $this->modify( + new DrawEllipseModifier( + call_user_func(new CircleFactory(new Point($x, $y), $init)), + ), + ); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::drawPolygon() + */ + public function drawPolygon(callable|Closure|Polygon $init): ImageInterface + { + return $this->modify( + new DrawPolygonModifier( + call_user_func(new PolygonFactory($init)), + ), + ); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::drawLine() + */ + public function drawLine(callable|Closure|Line $init): ImageInterface + { + return $this->modify( + new DrawLineModifier( + call_user_func(new LineFactory($init)), + ), + ); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::drawBezier() + */ + public function drawBezier(callable|Closure|Bezier $init): ImageInterface + { + return $this->modify( + new DrawBezierModifier( + call_user_func(new BezierFactory($init)), + ), + ); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::encodeByMediaType() + */ + public function encodeByMediaType(null|string|MediaType $type = null, mixed ...$options): EncodedImageInterface + { + return $this->encode(new MediaTypeEncoder($type, ...$options)); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::encodeByExtension() + */ + public function encodeByExtension( + null|string|FileExtension $extension = null, + mixed ...$options + ): EncodedImageInterface { + return $this->encode(new FileExtensionEncoder($extension, ...$options)); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::encodeByPath() + */ + public function encodeByPath(?string $path = null, mixed ...$options): EncodedImageInterface + { + return $this->encode(new FilePathEncoder($path, ...$options)); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::toJpeg() + */ + public function toJpeg(mixed ...$options): EncodedImageInterface + { + return $this->encode(new JpegEncoder(...$options)); + } + + /** + * Alias of self::toJpeg() + * + * @throws RuntimeException + */ + public function toJpg(mixed ...$options): EncodedImageInterface + { + return $this->toJpeg(...$options); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::toJpeg() + */ + public function toJpeg2000(mixed ...$options): EncodedImageInterface + { + return $this->encode(new Jpeg2000Encoder(...$options)); + } + + /** + * ALias of self::toJpeg2000() + * + * @throws RuntimeException + */ + public function toJp2(mixed ...$options): EncodedImageInterface + { + return $this->toJpeg2000(...$options); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::toPng() + */ + public function toPng(mixed ...$options): EncodedImageInterface + { + return $this->encode(new PngEncoder(...$options)); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::toGif() + */ + public function toGif(mixed ...$options): EncodedImageInterface + { + return $this->encode(new GifEncoder(...$options)); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::toWebp() + */ + public function toWebp(mixed ...$options): EncodedImageInterface + { + return $this->encode(new WebpEncoder(...$options)); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::toBitmap() + */ + public function toBitmap(mixed ...$options): EncodedImageInterface + { + return $this->encode(new BmpEncoder(...$options)); + } + + /** + * Alias if self::toBitmap() + * + * @throws RuntimeException + */ + public function toBmp(mixed ...$options): EncodedImageInterface + { + return $this->toBitmap(...$options); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::toAvif() + */ + public function toAvif(mixed ...$options): EncodedImageInterface + { + return $this->encode(new AvifEncoder(...$options)); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::toTiff() + */ + public function toTiff(mixed ...$options): EncodedImageInterface + { + return $this->encode(new TiffEncoder(...$options)); + } + + /** + * Alias of self::toTiff() + * + * @throws RuntimeException + */ + public function toTif(mixed ...$options): EncodedImageInterface + { + return $this->toTiff(...$options); + } + + /** + * {@inheritdoc} + * + * @see ImageInterface::toHeic() + */ + public function toHeic(mixed ...$options): EncodedImageInterface + { + return $this->encode(new HeicEncoder(...$options)); + } + + /** + * Show debug info for the current image + * + * @return array + */ + public function __debugInfo(): array + { + try { + return [ + 'width' => $this->width(), + 'height' => $this->height(), + ]; + } catch (RuntimeException) { + return []; + } + } + + /** + * Clone image + */ + public function __clone(): void + { + $this->driver = clone $this->driver; + $this->core = clone $this->core; + $this->exif = clone $this->exif; + } +} diff --git a/vendor/intervention/image/src/ImageManager.php b/vendor/intervention/image/src/ImageManager.php new file mode 100755 index 00000000..16e608b7 --- /dev/null +++ b/vendor/intervention/image/src/ImageManager.php @@ -0,0 +1,143 @@ +driver = $this->resolveDriver($driver, ...$options); + } + + /** + * Create image manager with given driver + * + * @link https://image.intervention.io/v3/basics/configuration-drivers#static-constructor + * + * @throws DriverException + * @throws InputException + */ + public static function withDriver(string|DriverInterface $driver, mixed ...$options): self + { + return new self(self::resolveDriver($driver, ...$options)); + } + + /** + * Create image manager with GD driver + * + * @link https://image.intervention.io/v3/basics/configuration-drivers#static-gd-driver-constructor + * + * @throws DriverException + * @throws InputException + */ + public static function gd(mixed ...$options): self + { + return self::withDriver(new GdDriver(), ...$options); + } + + /** + * Create image manager with Imagick driver + * + * @link https://image.intervention.io/v3/basics/configuration-drivers#static-imagick-driver-constructor + * + * @throws DriverException + * @throws InputException + */ + public static function imagick(mixed ...$options): self + { + return self::withDriver(new ImagickDriver(), ...$options); + } + + /** + * {@inheritdoc} + * + * @see ImageManagerInterface::create() + */ + public function create(int $width, int $height): ImageInterface + { + return $this->driver->createImage($width, $height); + } + + /** + * {@inheritdoc} + * + * @see ImageManagerInterface::read() + */ + public function read(mixed $input, string|array|DecoderInterface $decoders = []): ImageInterface + { + return $this->driver->handleInput( + $input, + match (true) { + is_string($decoders), is_a($decoders, DecoderInterface::class) => [$decoders], + default => $decoders, + } + ); + } + + /** + * {@inheritdoc} + * + * @see ImageManagerInterface::animate() + */ + public function animate(callable $init): ImageInterface + { + return $this->driver->createAnimation($init); + } + + /** + * {@inheritdoc} + * + * @see ImageManagerInterface::driver() + */ + public function driver(): DriverInterface + { + return $this->driver; + } + + /** + * Return driver object from given input which might be driver classname or instance of DriverInterface + * + * @throws DriverException + * @throws InputException + */ + private static function resolveDriver(string|DriverInterface $driver, mixed ...$options): DriverInterface + { + $driver = match (true) { + $driver instanceof DriverInterface => $driver, + class_exists($driver) => new $driver(), + default => throw new DriverException( + 'Unable to resolve driver. Argment must be either an instance of ' . + DriverInterface::class . '::class or a qualified namespaced name of the driver class.', + ), + }; + + if (!$driver instanceof DriverInterface) { + throw new DriverException( + 'Unable to resolve driver. Driver object must implement ' . DriverInterface::class . '.', + ); + } + + $driver->config()->setOptions(...$options); + + return $driver; + } +} diff --git a/vendor/intervention/image/src/InputHandler.php b/vendor/intervention/image/src/InputHandler.php new file mode 100755 index 00000000..9189aad9 --- /dev/null +++ b/vendor/intervention/image/src/InputHandler.php @@ -0,0 +1,132 @@ + + */ + protected array $decoders = [ + NativeObjectDecoder::class, + ImageObjectDecoder::class, + ColorObjectDecoder::class, + RgbHexColorDecoder::class, + RgbStringColorDecoder::class, + CmykStringColorDecoder::class, + HsvStringColorDecoder::class, + HslStringColorDecoder::class, + TransparentColorDecoder::class, + HtmlColornameDecoder::class, + FilePointerImageDecoder::class, + FilePathImageDecoder::class, + SplFileInfoImageDecoder::class, + BinaryImageDecoder::class, + DataUriImageDecoder::class, + Base64ImageDecoder::class, + EncodedImageObjectDecoder::class, + ]; + + /** + * Driver with which the decoder classes are specialized + */ + protected ?DriverInterface $driver = null; + + /** + * Create new input handler instance with given decoder classnames + * + * @param array $decoders + * @return void + */ + public function __construct(array $decoders = [], ?DriverInterface $driver = null) + { + $this->decoders = count($decoders) ? $decoders : $this->decoders; + $this->driver = $driver; + } + + /** + * Static factory method + * + * @param array $decoders + */ + public static function withDecoders(array $decoders, ?DriverInterface $driver = null): self + { + return new self($decoders, $driver); + } + + /** + * {@inheritdoc} + * + * @see InputHandlerInterface::handle() + */ + public function handle(mixed $input): ImageInterface|ColorInterface + { + foreach ($this->decoders as $decoder) { + try { + // decode with driver specialized decoder + return $this->resolve($decoder)->decode($input); + } catch (DecoderException | NotSupportedException $e) { + // try next decoder + } + } + + if (isset($e)) { + throw new ($e::class)($e->getMessage()); + } + + throw new DecoderException('Unable to decode input.'); + } + + /** + * Resolve the given classname to an decoder object + * + * @throws DriverException + * @throws NotSupportedException + */ + private function resolve(string|DecoderInterface $decoder): DecoderInterface + { + if (($decoder instanceof DecoderInterface) && empty($this->driver)) { + return $decoder; + } + + if (($decoder instanceof DecoderInterface) && !empty($this->driver)) { + return $this->driver->specialize($decoder); + } + + if (empty($this->driver)) { + return new $decoder(); + } + + return $this->driver->specialize(new $decoder()); + } +} diff --git a/vendor/intervention/image/src/Interfaces/AnalyzerInterface.php b/vendor/intervention/image/src/Interfaces/AnalyzerInterface.php new file mode 100755 index 00000000..d11d874d --- /dev/null +++ b/vendor/intervention/image/src/Interfaces/AnalyzerInterface.php @@ -0,0 +1,17 @@ + + */ +interface CollectionInterface extends Traversable +{ + /** + * Determine if the collection has item at given key + */ + public function has(int|string $key): bool; + + /** + * Add item to collection + * + * @return CollectionInterface + */ + public function push(mixed $item): self; + + /** + * Return item for given key or return default is key does not exist + */ + public function get(int|string $key, mixed $default = null): mixed; + + /** + * Return item at given numeric position starting at 0 + */ + public function getAtPosition(int $key = 0, mixed $default = null): mixed; + + /** + * Return first item in collection + */ + public function first(): mixed; + + /** + * Return last item in collection + */ + public function last(): mixed; + + /** + * Return item count of collection + */ + public function count(): int; + + /** + * Empty collection + * + * @return CollectionInterface + */ + public function empty(): self; + + /** + * Transform collection as array + * + * @return array + */ + public function toArray(): array; + + /** + * Extract items based on given values and discard the rest. + * + * @return CollectionInterface + */ + public function slice(int $offset, ?int $length = 0): self; +} diff --git a/vendor/intervention/image/src/Interfaces/ColorChannelInterface.php b/vendor/intervention/image/src/Interfaces/ColorChannelInterface.php new file mode 100755 index 00000000..ed705570 --- /dev/null +++ b/vendor/intervention/image/src/Interfaces/ColorChannelInterface.php @@ -0,0 +1,57 @@ + + */ + public function toArray(): array; + + /** + * Cast color object to hex encoded web color + */ + public function toHex(string $prefix = ''): string; + + /** + * Return array of all color channels + * + * @return array + */ + public function channels(): array; + + /** + * Return array of normalized color channel values + * + * @return array + */ + public function normalize(): array; + + /** + * Retrieve the color channel by its classname + * + * @throws ColorException + */ + public function channel(string $classname): ColorChannelInterface; + + /** + * Convert color to given colorspace + */ + public function convertTo(string|ColorspaceInterface $colorspace): self; + + /** + * Determine if the current color is gray + */ + public function isGreyscale(): bool; + + /** + * Determine if the current color is (semi) transparent + */ + public function isTransparent(): bool; + + /** + * Determine whether the current color is completely transparent + */ + public function isClear(): bool; + + /** + * Cast color object to string + */ + public function __toString(): string; +} diff --git a/vendor/intervention/image/src/Interfaces/ColorProcessorInterface.php b/vendor/intervention/image/src/Interfaces/ColorProcessorInterface.php new file mode 100755 index 00000000..cd1d7ec9 --- /dev/null +++ b/vendor/intervention/image/src/Interfaces/ColorProcessorInterface.php @@ -0,0 +1,24 @@ + $normalized + */ + public function colorFromNormalized(array $normalized): ColorInterface; +} diff --git a/vendor/intervention/image/src/Interfaces/CoreInterface.php b/vendor/intervention/image/src/Interfaces/CoreInterface.php new file mode 100755 index 00000000..40829844 --- /dev/null +++ b/vendor/intervention/image/src/Interfaces/CoreInterface.php @@ -0,0 +1,70 @@ + + */ + public function setNative(mixed $native): self; + + /** + * Count number of frames of animated image core + */ + public function count(): int; + + /** + * Return frame of given position in an animated image + * + * @throws AnimationException + */ + public function frame(int $position): FrameInterface; + + /** + * Add new frame to core + * + * @return CoreInterface + */ + public function add(FrameInterface $frame): self; + + /** + * Return number of repetitions of an animated image + */ + public function loops(): int; + + /** + * Set the number of repetitions for an animation. Where a + * value of 0 means infinite repetition. + * + * @return CoreInterface + */ + public function setLoops(int $loops): self; + + /** + * Get first frame in core + * + * @throws AnimationException + */ + public function first(): FrameInterface; + + /** + * Get last frame in core + * + * @throws AnimationException + */ + public function last(): FrameInterface; +} diff --git a/vendor/intervention/image/src/Interfaces/DecoderInterface.php b/vendor/intervention/image/src/Interfaces/DecoderInterface.php new file mode 100755 index 00000000..3383269d --- /dev/null +++ b/vendor/intervention/image/src/Interfaces/DecoderInterface.php @@ -0,0 +1,17 @@ + $objects + * @throws NotSupportedException + * @throws DriverException + * @return array + */ + public function specializeMultiple(array $objects): array; + + /** + * Create new image instance with the current driver in given dimensions + * + * @throws RuntimeException + */ + public function createImage(int $width, int $height): ImageInterface; + + /** + * Create new animated image + * + * @throws RuntimeException + */ + public function createAnimation(callable $init): ImageInterface; + + /** + * Handle given input by decoding it to ImageInterface or ColorInterface + * + * @param array $decoders + * @throws RuntimeException + */ + public function handleInput(mixed $input, array $decoders = []): ImageInterface|ColorInterface; + + /** + * Return color processor for the given colorspace + */ + public function colorProcessor(ColorspaceInterface $colorspace): ColorProcessorInterface; + + /** + * Return font processor of the current driver + */ + public function fontProcessor(): FontProcessorInterface; + + /** + * Check whether all requirements for operating the driver are met and + * throw exception if the check fails. + * + * @throws DriverException + */ + public function checkHealth(): void; + + /** + * Check if the current driver supports the given format and if the + * underlying PHP extension was built with support for the format. + */ + public function supports(string|Format|FileExtension|MediaType $identifier): bool; +} diff --git a/vendor/intervention/image/src/Interfaces/EncodedImageInterface.php b/vendor/intervention/image/src/Interfaces/EncodedImageInterface.php new file mode 100755 index 00000000..d521d8e0 --- /dev/null +++ b/vendor/intervention/image/src/Interfaces/EncodedImageInterface.php @@ -0,0 +1,23 @@ + + */ +interface ImageInterface extends IteratorAggregate, Countable +{ + /** + * Return driver of current image + */ + public function driver(): DriverInterface; + + /** + * Return core of current image + */ + public function core(): CoreInterface; + + /** + * Return the origin of the image + */ + public function origin(): Origin; + + /** + * Set the origin of the image + */ + public function setOrigin(Origin $origin): self; + + /** + * Return width of current image + * + * @link https://image.intervention.io/v3/basics/meta-information#read-the-pixel-width + * + * @throws RuntimeException + */ + public function width(): int; + + /** + * Return height of current image + * + * @link https://image.intervention.io/v3/basics/meta-information#read-the-pixel-height + * + * @throws RuntimeException + */ + public function height(): int; + + /** + * Return size of current image + * + * @link https://image.intervention.io/v3/basics/meta-information#read-the-image-size-as-an-object + * + * @throws RuntimeException + */ + public function size(): SizeInterface; + + /** + * Encode image with given encoder + * + * @link https://image.intervention.io/v3/basics/image-output#encode-images + * + * @throws RuntimeException + */ + public function encode(EncoderInterface $encoder = new AutoEncoder()): EncodedImageInterface; + + /** + * Save the image to the specified path in the file system. If no path is + * given, the image will be saved at its original location. + * + * @link https://image.intervention.io/v3/basics/image-output#encode--save-combined + * + * @throws RuntimeException + */ + public function save(?string $path = null, mixed ...$options): self; + + /** + * Apply given modifier to current image + * + * @link https://image.intervention.io/v3/modifying-images/custom-modifiers + * + * @throws RuntimeException + */ + public function modify(ModifierInterface $modifier): self; + + /** + * Analyzer current image with given analyzer + * + * @throws RuntimeException + */ + public function analyze(AnalyzerInterface $analyzer): mixed; + + /** + * Determine if current image is animated + * + * @link https://image.intervention.io/v3/modifying-images/animations#check-the-current-image-instance-for-animation + */ + public function isAnimated(): bool; + + /** + * Remove all frames but keep the one at the specified position + * + * It is possible to specify the position as integer or string values. + * With the former, the exact position passed is searched for, while + * string values must represent a percentage value between '0%' and '100%' + * and the respective frame position is only determined approximately. + * + * @link https://image.intervention.io/v3/modifying-images/animations#remove-animation + * + * @throws RuntimeException + */ + public function removeAnimation(int|string $position = 0): self; + + /** + * Extract animation frames based on given values and discard the rest + * + * @link https://image.intervention.io/v3/modifying-images/animations#change-the-animation-iteration-count + * + * @throws RuntimeException + */ + public function sliceAnimation(int $offset = 0, ?int $length = null): self; + + /** + * Return loop count of animated image + * + * @link https://image.intervention.io/v3/modifying-images/animations#read-the-animation-iteration-count + */ + public function loops(): int; + + /** + * Set loop count of animated image + * + * @link https://image.intervention.io/v3/modifying-images/animations#change-the-animation-iteration-count + */ + public function setLoops(int $loops): self; + + /** + * Return exif data of current image + * + * @link https://image.intervention.io/v3/basics/meta-information#exif-information + */ + public function exif(?string $query = null): mixed; + + /** + * Set exif data for the image object + */ + public function setExif(CollectionInterface $exif): self; + + /** + * Return image resolution/density + * + * @link https://image.intervention.io/v3/basics/meta-information#image-resolution + * + * @throws RuntimeException + */ + public function resolution(): ResolutionInterface; + + /** + * Set image resolution + * + * @link https://image.intervention.io/v3/basics/meta-information#image-resolution + * + * @throws RuntimeException + */ + public function setResolution(float $x, float $y): self; + + /** + * Get the colorspace of the image + * + * @link https://image.intervention.io/v3/basics/colors#read-the-image-colorspace + * + * @throws RuntimeException + */ + public function colorspace(): ColorspaceInterface; + + /** + * Transform image to given colorspace + * + * @link https://image.intervention.io/v3/basics/colors#change-the-image-colorspace + * + * @throws RuntimeException + */ + public function setColorspace(string|ColorspaceInterface $colorspace): self; + + /** + * Return color of pixel at given position on given frame position + * + * @link https://image.intervention.io/v3/basics/colors#color-information + * + * @throws RuntimeException + */ + public function pickColor(int $x, int $y, int $frame_key = 0): ColorInterface; + + /** + * Return all colors of pixel at given position for all frames of image + * + * @link https://image.intervention.io/v3/basics/colors#color-information + * + * @throws RuntimeException + */ + public function pickColors(int $x, int $y): CollectionInterface; + + /** + * Return color that is mixed with transparent areas when converting to a format which + * does not support transparency. + * + * @throws RuntimeException + */ + public function blendingColor(): ColorInterface; + + /** + * Set blending color will have no effect unless image is converted into a format + * which does not support transparency. + * + * @throws RuntimeException + */ + public function setBlendingColor(mixed $color): self; + + /** + * Replace transparent areas of the image with given color + * + * @throws RuntimeException + */ + public function blendTransparency(mixed $color = null): self; + + /** + * Retrieve ICC color profile of image + * + * @link https://image.intervention.io/v3/basics/colors#color-profiles + * + * @throws RuntimeException + */ + public function profile(): ProfileInterface; + + /** + * Set given icc color profile to image + * + * @link https://image.intervention.io/v3/basics/colors#color-profiles + * + * @throws RuntimeException + */ + public function setProfile(ProfileInterface $profile): self; + + /** + * Remove ICC color profile from the current image + * + * @link https://image.intervention.io/v3/basics/colors#color-profiles + * + * @throws RuntimeException + */ + public function removeProfile(): self; + + /** + * Apply color quantization to the current image + * + * @link https://image.intervention.io/v3/modifying-images/effects#reduce-colors + * + * @throws RuntimeException + */ + public function reduceColors(int $limit, mixed $background = 'transparent'): self; + + /** + * Sharpen the current image with given strength + * + * @link https://image.intervention.io/v3/modifying-images/effects#sharpening-effect + * + * @throws RuntimeException + */ + public function sharpen(int $amount = 10): self; + + /** + * Turn image into a greyscale version + * + * @link https://image.intervention.io/v3/modifying-images/effects#convert-image-to-a-greyscale-version + * + * @throws RuntimeException + */ + public function greyscale(): self; + + /** + * Adjust brightness of the current image + * + * @link https://image.intervention.io/v3/modifying-images/effects#change-the-image-brightness + * + * @throws RuntimeException + */ + public function brightness(int $level): self; + + /** + * Adjust color contrast of the current image + * + * @link https://image.intervention.io/v3/modifying-images/effects#change-the-image-contrast + * + * @throws RuntimeException + */ + public function contrast(int $level): self; + + /** + * Apply gamma correction on the current image + * + * @link https://image.intervention.io/v3/modifying-images/effects#gamma-correction + * + * @throws RuntimeException + */ + public function gamma(float $gamma): self; + + /** + * Adjust the intensity of the RGB color channels + * + * @link https://image.intervention.io/v3/modifying-images/effects#color-correction + * + * @throws RuntimeException + */ + public function colorize(int $red = 0, int $green = 0, int $blue = 0): self; + + /** + * Mirror the current image vertically by swapping top and bottom + * + * @link https://image.intervention.io/v3/modifying-images/effects#mirror-image-vertically + * + * @throws RuntimeException + */ + public function flip(): self; + + /** + * Mirror the current image horizontally by swapping left and right + * + * @link https://image.intervention.io/v3/modifying-images/effects#mirror-image-horizontally + * + * @throws RuntimeException + */ + public function flop(): self; + + /** + * Blur current image by given strength + * + * @link https://image.intervention.io/v3/modifying-images/effects#blur-effect + * + * @throws RuntimeException + */ + public function blur(int $amount = 5): self; + + /** + * Invert the colors of the current image + * + * @link https://image.intervention.io/v3/modifying-images/effects#invert-colors + * + * @throws RuntimeException + */ + public function invert(): self; + + /** + * Apply pixelation filter effect on current image + * + * @link https://image.intervention.io/v3/modifying-images/effects#pixelation-effect + * + * @throws RuntimeException + */ + public function pixelate(int $size): self; + + /** + * Rotate current image by given angle + * + * @link https://image.intervention.io/v3/modifying-images/effects#image-rotation + * + * @param string $background + * @throws RuntimeException + */ + public function rotate(float $angle, mixed $background = 'ffffff'): self; + + /** + * Rotate the image to be upright according to exif information + * + * @link https://image.intervention.io/v3/modifying-images/effects#image-orientation-according-to-exif-data + * + * @throws RuntimeException + */ + public function orient(): self; + + /** + * Draw text on image + * + * @link https://image.intervention.io/v3/modifying-images/text-fonts + * + * @throws RuntimeException + */ + public function text(string $text, int $x, int $y, callable|Closure|FontInterface $font): self; + + /** + * Resize image to the given width and/or height + * + * @link https://image.intervention.io/v3/modifying-images/resizing#simple-image-resizing + * + * @throws RuntimeException + */ + public function resize(?int $width = null, ?int $height = null): self; + + /** + * Resize image to the given width and/or height without exceeding the original dimensions + * + * @link https://image.intervention.io/v3/modifying-images/resizing#resize-without-exceeding-the-original-size + * + * @throws RuntimeException + */ + public function resizeDown(?int $width = null, ?int $height = null): self; + + /** + * Resize image to the given width and/or height and keep the original aspect ratio + * + * @link https://image.intervention.io/v3/modifying-images/resizing#resize-images-proportionally + * + * @throws RuntimeException + */ + public function scale(?int $width = null, ?int $height = null): self; + + /** + * Resize image to the given width and/or height, keep the original aspect ratio + * and do not exceed the original image width or height + * + * @link https://image.intervention.io/v3/modifying-images/resizing#scale-images-but-do-not-exceed-the-original-size + * + * @throws RuntimeException + */ + public function scaleDown(?int $width = null, ?int $height = null): self; + + /** + * Takes the specified width and height and scales them to the largest + * possible size that fits within the original size. This scaled size is + * then positioned on the original and cropped, before this result is resized + * to the desired size using the arguments + * + * @link https://image.intervention.io/v3/modifying-images/resizing#cropping--resizing-combined + * + * @throws RuntimeException + */ + public function cover(int $width, int $height, string $position = 'center'): self; + + /** + * Same as cover() but do not exceed the original image size + * + * @link https://image.intervention.io/v3/modifying-images/resizing#fitted-resizing-without-exceeding-the-original-size + * + * @throws RuntimeException + */ + public function coverDown(int $width, int $height, string $position = 'center'): self; + + /** + * Resize the boundaries of the current image to given width and height. + * An anchor position can be defined to determine where the original image + * is fixed. A background color can be passed to define the color of the + * new emerging areas. + * + * @link https://image.intervention.io/v3/modifying-images/resizing#resize-image-boundaries-without-resampling-the-original-image + * + * @throws RuntimeException + */ + public function resizeCanvas( + ?int $width = null, + ?int $height = null, + mixed $background = 'ffffff', + string $position = 'center' + ): self; + + /** + * Resize canvas in the same way as resizeCanvas() but takes relative values + * for the width and height, which will be added or subtracted to the + * original image size. + * + * @link https://image.intervention.io/v3/modifying-images/resizing#resize-image-boundaries-relative-to-the-original + * + * @throws RuntimeException + */ + public function resizeCanvasRelative( + ?int $width = null, + ?int $height = null, + mixed $background = 'ffffff', + string $position = 'center' + ): self; + + /** + * Padded resizing means that the original image is scaled until it fits the + * defined target size with unchanged aspect ratio. The original image is + * not scaled up but only down. + * + * Compared to the cover() method, this method does not create cropped areas, + * but possibly new empty areas on the sides of the result image. These are + * filled with the specified background color. + * + * @link https://image.intervention.io/v3/modifying-images/resizing#resizing--padding-combined + * + * @param string $background + * @throws RuntimeException + */ + public function pad( + int $width, + int $height, + mixed $background = 'ffffff', + string $position = 'center' + ): self; + + /** + * This method does the same as pad(), but the original image is also scaled + * up if the target size exceeds the original size. + * + * @link https://image.intervention.io/v3/modifying-images/resizing#padded-resizing-with-upscaling + * + * @param string $background + * @throws RuntimeException + */ + public function contain( + int $width, + int $height, + mixed $background = 'ffffff', + string $position = 'center' + ): self; + + /** + * Cut out a rectangular part of the current image with given width and + * height at a given position. Define optional x,y offset coordinates + * to move the cutout by the given amount of pixels. + * + * @link https://image.intervention.io/v3/modifying-images/resizing#cut-out-a-rectangular-part + * + * @throws RuntimeException + */ + public function crop( + int $width, + int $height, + int $offset_x = 0, + int $offset_y = 0, + mixed $background = 'ffffff', + string $position = 'top-left' + ): self; + + /** + * Trim the image by removing border areas of similar color within a the given tolerance + * + * @link https://image.intervention.io/v3/modifying-images/resizing#remove-border-areas-in-similar-color + * + * @throws RuntimeException + * @throws AnimationException + */ + public function trim(int $tolerance = 0): self; + + /** + * Place another image into the current image instance + * + * @link https://image.intervention.io/v3/modifying-images/inserting#insert-images + * + * @throws RuntimeException + */ + public function place( + mixed $element, + string $position = 'top-left', + int $offset_x = 0, + int $offset_y = 0, + int $opacity = 100 + ): self; + + /** + * Fill image with given color + * + * If an optional position is specified for the filling process ln the form + * of x and y coordinates, the process is executed as flood fill. This means + * that the color at the specified position is taken as a reference and all + * adjacent pixels are also filled with the filling color. + * + * If no coordinates are specified, the entire image area is filled. + * + * @link https://image.intervention.io/v3/modifying-images/drawing#fill-images-with-color + * + * @throws RuntimeException + */ + public function fill(mixed $color, ?int $x = null, ?int $y = null): self; + + /** + * Draw a single pixel at given position defined by the coordinates x and y in a given color. + * + * @link https://image.intervention.io/v3/modifying-images/drawing#draw-pixels + * + * @throws RuntimeException + */ + public function drawPixel(int $x, int $y, mixed $color): self; + + /** + * Draw a rectangle on the current image + * + * @link https://image.intervention.io/v3/modifying-images/drawing#draw-a-rectangle + * + * @throws RuntimeException + */ + public function drawRectangle(int $x, int $y, callable|Closure|Rectangle $init): self; + + /** + * Draw ellipse on the current image + * + * @link https://image.intervention.io/v3/modifying-images/drawing#draw-ellipses + * + * @throws RuntimeException + */ + public function drawEllipse(int $x, int $y, callable|Closure|Ellipse $init): self; + + /** + * Draw circle on the current image + * + * @link https://image.intervention.io/v3/modifying-images/drawing#draw-a-circle + * + * @throws RuntimeException + */ + public function drawCircle(int $x, int $y, callable|Closure|Circle $init): self; + + /** + * Draw a polygon on the current image + * + * @link https://image.intervention.io/v3/modifying-images/drawing#draw-a-polygon + * + * @throws RuntimeException + */ + public function drawPolygon(callable|Closure|Polygon $init): self; + + /** + * Draw a line on the current image + * + * @link https://image.intervention.io/v3/modifying-images/drawing#draw-a-line + * + * @throws RuntimeException + */ + public function drawLine(callable|Closure|Line $init): self; + + /** + * Draw a bezier curve on the current image + * + * @link https://image.intervention.io/v3/modifying-images/drawing#draw-bezier-curves + * + * @throws RuntimeException + */ + public function drawBezier(callable|Closure|Bezier $init): self; + + /** + * Encode image to given media (mime) type. If no type is given the image + * will be encoded to the format of the originally read image. + * + * @link https://image.intervention.io/v3/basics/image-output#encode-images-by-media-mime-type + * + * @throws RuntimeException + */ + public function encodeByMediaType(null|string|MediaType $type = null, mixed ...$options): EncodedImageInterface; + + /** + * Encode the image into the format represented by the given extension. If no + * extension is given the image will be encoded to the format of the + * originally read image. + * + * @link https://image.intervention.io/v3/basics/image-output#encode-images-by-file-extension + * + * @throws RuntimeException + */ + public function encodeByExtension( + null|string|FileExtension $extension = null, + mixed ...$options + ): EncodedImageInterface; + + /** + * Encode the image into the format represented by the given extension of + * the given file path extension is given the image will be encoded to + * the format of the originally read image. + * + * @link https://image.intervention.io/v3/basics/image-output#encode-images-by-file-path + * + * @throws RuntimeException + */ + public function encodeByPath(?string $path = null, mixed ...$options): EncodedImageInterface; + + /** + * Encode image to JPEG format + * + * @link https://image.intervention.io/v3/basics/image-output#encode-jpeg-format + * + * @throws RuntimeException + */ + public function toJpeg(mixed ...$options): EncodedImageInterface; + + /** + * Encode image to Jpeg2000 format + * + * @link https://image.intervention.io/v3/basics/image-output#encode-jpeg-2000-format + * + * @throws RuntimeException + */ + public function toJpeg2000(mixed ...$options): EncodedImageInterface; + + /** + * Encode image to Webp format + * + * @link https://image.intervention.io/v3/basics/image-output#encode-webp-format + * + * @throws RuntimeException + */ + public function toWebp(mixed ...$options): EncodedImageInterface; + + /** + * Encode image to PNG format + * + * @link https://image.intervention.io/v3/basics/image-output#encode-png-format + * + * @throws RuntimeException + */ + public function toPng(mixed ...$options): EncodedImageInterface; + + /** + * Encode image to GIF format + * + * @link https://image.intervention.io/v3/basics/image-output#encode-gif-format + * + * @throws RuntimeException + */ + public function toGif(mixed ...$options): EncodedImageInterface; + + /** + * Encode image to Bitmap format + * + * @link https://image.intervention.io/v3/basics/image-output#encode-windows-bitmap-format + * + * @throws RuntimeException + */ + public function toBitmap(mixed ...$options): EncodedImageInterface; + + /** + * Encode image to AVIF format + * + * @link https://image.intervention.io/v3/basics/image-output#encode-av1-image-file-format-avif + * + * @throws RuntimeException + */ + public function toAvif(mixed ...$options): EncodedImageInterface; + + /** + * Encode image to TIFF format + * + * @link https://image.intervention.io/v3/basics/image-output#encode-tiff-format + * + * @throws RuntimeException + */ + public function toTiff(mixed ...$options): EncodedImageInterface; + + /** + * Encode image to HEIC format + * + * @link https://image.intervention.io/v3/basics/image-output#encode-heic-format + * + * @throws RuntimeException + */ + public function toHeic(mixed ...$options): EncodedImageInterface; +} diff --git a/vendor/intervention/image/src/Interfaces/ImageManagerInterface.php b/vendor/intervention/image/src/Interfaces/ImageManagerInterface.php new file mode 100755 index 00000000..92652ec2 --- /dev/null +++ b/vendor/intervention/image/src/Interfaces/ImageManagerInterface.php @@ -0,0 +1,63 @@ +|DecoderInterface $decoders + * @throws RuntimeException + */ + public function read(mixed $input, string|array|DecoderInterface $decoders = []): ImageInterface; + + /** + * Create new animated image by given callback + * + * @link https://image.intervention.io/v3/basics/instantiation#create-animations + * + * @throws RuntimeException + */ + public function animate(callable $init): ImageInterface; + + /** + * Return currently used driver + */ + public function driver(): DriverInterface; +} diff --git a/vendor/intervention/image/src/Interfaces/InputHandlerInterface.php b/vendor/intervention/image/src/Interfaces/InputHandlerInterface.php new file mode 100755 index 00000000..f6c6c3d1 --- /dev/null +++ b/vendor/intervention/image/src/Interfaces/InputHandlerInterface.php @@ -0,0 +1,17 @@ + + */ + public function specializable(): array; + + /** + * Set the driver for which the object is specialized + * + * @throws DriverException + */ + public function setDriver(DriverInterface $driver): self; + + /** + * Return the driver for which the object was specialized + */ + public function driver(): DriverInterface; +} diff --git a/vendor/intervention/image/src/Interfaces/SpecializedInterface.php b/vendor/intervention/image/src/Interfaces/SpecializedInterface.php new file mode 100755 index 00000000..5d23bab0 --- /dev/null +++ b/vendor/intervention/image/src/Interfaces/SpecializedInterface.php @@ -0,0 +1,10 @@ +mediaType(); + } + + if ($identifier instanceof FileExtension) { + return $identifier->mediaType(); + } + + try { + $type = self::from(strtolower($identifier)); + } catch (Error) { + try { + $type = FileExtension::from(strtolower($identifier))->mediaType(); + } catch (Error) { + throw new NotSupportedException('Unable to create media type from "' . $identifier . '".'); + } + } + + return $type; + } + + /** + * Try to create media type from given identifier and return null on failure + * + * @param string|Format|MediaType|FileExtension $identifier + * @return MediaType|null + */ + public static function tryCreate(string|self|Format|FileExtension $identifier): ?self + { + try { + return self::create($identifier); + } catch (NotSupportedException) { + return null; + } + } + + /** + * Return the matching format for the current media (MIME) type + */ + public function format(): Format + { + return match ($this) { + self::IMAGE_JPEG, + self::IMAGE_JPG, + self::IMAGE_PJPEG, + self::IMAGE_X_JPEG => Format::JPEG, + self::IMAGE_WEBP, + self::IMAGE_X_WEBP => Format::WEBP, + self::IMAGE_GIF => Format::GIF, + self::IMAGE_PNG, + self::IMAGE_X_PNG => Format::PNG, + self::IMAGE_AVIF, + self::IMAGE_X_AVIF => Format::AVIF, + self::IMAGE_BMP, + self::IMAGE_MS_BMP, + self::IMAGE_X_BITMAP, + self::IMAGE_X_BMP, + self::IMAGE_X_MS_BMP, + self::IMAGE_X_XBITMAP, + self::IMAGE_X_WINDOWS_BMP, + self::IMAGE_X_BMP3, + self::IMAGE_X_WIN_BITMAP => Format::BMP, + self::IMAGE_TIFF => Format::TIFF, + self::IMAGE_JP2, + self::IMAGE_JPX, + self::IMAGE_X_JP2_CODESTREAM, + self::IMAGE_JPM => Format::JP2, + self::IMAGE_HEIF, + self::IMAGE_HEIC, + self::IMAGE_X_HEIC => Format::HEIC, + }; + } + + /** + * Return the possible file extension for the current media type + * + * @return array + */ + public function fileExtensions(): array + { + return $this->format()->fileExtensions(); + } + + /** + * Return the first file extension for the current media type + */ + public function fileExtension(): FileExtension + { + return $this->format()->fileExtension(); + } +} diff --git a/vendor/intervention/image/src/ModifierStack.php b/vendor/intervention/image/src/ModifierStack.php new file mode 100755 index 00000000..aacfa15a --- /dev/null +++ b/vendor/intervention/image/src/ModifierStack.php @@ -0,0 +1,44 @@ + $modifiers + * @return void + */ + public function __construct(protected array $modifiers) + { + // + } + + /** + * Apply all modifiers in stack to the given image + */ + public function apply(ImageInterface $image): ImageInterface + { + foreach ($this->modifiers as $modifier) { + $modifier->apply($image); + } + + return $image; + } + + /** + * Append new modifier to the stack + */ + public function push(ModifierInterface $modifier): self + { + $this->modifiers[] = $modifier; + + return $this; + } +} diff --git a/vendor/intervention/image/src/Modifiers/AbstractDrawModifier.php b/vendor/intervention/image/src/Modifiers/AbstractDrawModifier.php new file mode 100755 index 00000000..123b1638 --- /dev/null +++ b/vendor/intervention/image/src/Modifiers/AbstractDrawModifier.php @@ -0,0 +1,47 @@ +driver()->handleInput($this->drawable()->backgroundColor()); + } catch (DecoderException) { + return $this->driver()->handleInput('transparent'); + } + + return $color; + } + + /** + * @throws RuntimeException + */ + public function borderColor(): ColorInterface + { + try { + $color = $this->driver()->handleInput($this->drawable()->borderColor()); + } catch (DecoderException) { + return $this->driver()->handleInput('transparent'); + } + + return $color; + } +} diff --git a/vendor/intervention/image/src/Modifiers/AlignRotationModifier.php b/vendor/intervention/image/src/Modifiers/AlignRotationModifier.php new file mode 100755 index 00000000..0faaa76c --- /dev/null +++ b/vendor/intervention/image/src/Modifiers/AlignRotationModifier.php @@ -0,0 +1,12 @@ +handleInput( + $this->color ?: $driver->config()->blendingColor + ); + + // replace alpha channel value with opaque value + if ($color->isTransparent()) { + return new Color( + $color->channel(Red::class)->value(), + $color->channel(Green::class)->value(), + $color->channel(Blue::class)->value(), + ); + } + + return $color; + } +} diff --git a/vendor/intervention/image/src/Modifiers/BlurModifier.php b/vendor/intervention/image/src/Modifiers/BlurModifier.php new file mode 100755 index 00000000..4ae60d3f --- /dev/null +++ b/vendor/intervention/image/src/Modifiers/BlurModifier.php @@ -0,0 +1,15 @@ +target)) { + return $this->target; + } + + if (in_array($this->target, ['rgb', 'RGB', RgbColorspace::class])) { + return new RgbColorspace(); + } + + if (in_array($this->target, ['cmyk', 'CMYK', CmykColorspace::class])) { + return new CmykColorspace(); + } + + throw new NotSupportedException('Given colorspace is not supported.'); + } +} diff --git a/vendor/intervention/image/src/Modifiers/ContainModifier.php b/vendor/intervention/image/src/Modifiers/ContainModifier.php new file mode 100755 index 00000000..90da85d8 --- /dev/null +++ b/vendor/intervention/image/src/Modifiers/ContainModifier.php @@ -0,0 +1,44 @@ +size() + ->contain( + $this->width, + $this->height + ) + ->alignPivotTo( + $this->getResizeSize($image), + $this->position + ); + } + + public function getResizeSize(ImageInterface $image): SizeInterface + { + return new Rectangle($this->width, $this->height); + } +} diff --git a/vendor/intervention/image/src/Modifiers/ContrastModifier.php b/vendor/intervention/image/src/Modifiers/ContrastModifier.php new file mode 100755 index 00000000..77f7b17e --- /dev/null +++ b/vendor/intervention/image/src/Modifiers/ContrastModifier.php @@ -0,0 +1,20 @@ +size(); + $crop = new Rectangle($this->width, $this->height); + + return $crop->contain( + $imagesize->width(), + $imagesize->height() + )->alignPivotTo($imagesize, $this->position); + } + + /** + * @throws RuntimeException + */ + public function getResizeSize(SizeInterface $size): SizeInterface + { + return $size->resize($this->width, $this->height); + } +} diff --git a/vendor/intervention/image/src/Modifiers/CropModifier.php b/vendor/intervention/image/src/Modifiers/CropModifier.php new file mode 100755 index 00000000..c9aa5855 --- /dev/null +++ b/vendor/intervention/image/src/Modifiers/CropModifier.php @@ -0,0 +1,44 @@ +width, $this->height); + $crop->align($this->position); + + return $crop->alignPivotTo( + $image->size(), + $this->position + ); + } +} diff --git a/vendor/intervention/image/src/Modifiers/DrawBezierModifier.php b/vendor/intervention/image/src/Modifiers/DrawBezierModifier.php new file mode 100755 index 00000000..d4e14e3c --- /dev/null +++ b/vendor/intervention/image/src/Modifiers/DrawBezierModifier.php @@ -0,0 +1,29 @@ +drawable; + } +} diff --git a/vendor/intervention/image/src/Modifiers/DrawEllipseModifier.php b/vendor/intervention/image/src/Modifiers/DrawEllipseModifier.php new file mode 100755 index 00000000..b32d5e08 --- /dev/null +++ b/vendor/intervention/image/src/Modifiers/DrawEllipseModifier.php @@ -0,0 +1,21 @@ +drawable; + } +} diff --git a/vendor/intervention/image/src/Modifiers/DrawLineModifier.php b/vendor/intervention/image/src/Modifiers/DrawLineModifier.php new file mode 100755 index 00000000..26a86e37 --- /dev/null +++ b/vendor/intervention/image/src/Modifiers/DrawLineModifier.php @@ -0,0 +1,29 @@ +drawable; + } +} diff --git a/vendor/intervention/image/src/Modifiers/DrawPixelModifier.php b/vendor/intervention/image/src/Modifiers/DrawPixelModifier.php new file mode 100755 index 00000000..3faeabcf --- /dev/null +++ b/vendor/intervention/image/src/Modifiers/DrawPixelModifier.php @@ -0,0 +1,23 @@ +drawable; + } +} diff --git a/vendor/intervention/image/src/Modifiers/DrawRectangleModifier.php b/vendor/intervention/image/src/Modifiers/DrawRectangleModifier.php new file mode 100755 index 00000000..005b79a8 --- /dev/null +++ b/vendor/intervention/image/src/Modifiers/DrawRectangleModifier.php @@ -0,0 +1,29 @@ +drawable; + } +} diff --git a/vendor/intervention/image/src/Modifiers/FillModifier.php b/vendor/intervention/image/src/Modifiers/FillModifier.php new file mode 100755 index 00000000..d3f334dc --- /dev/null +++ b/vendor/intervention/image/src/Modifiers/FillModifier.php @@ -0,0 +1,23 @@ +position instanceof PointInterface; + } +} diff --git a/vendor/intervention/image/src/Modifiers/FlipModifier.php b/vendor/intervention/image/src/Modifiers/FlipModifier.php new file mode 100755 index 00000000..8862f1df --- /dev/null +++ b/vendor/intervention/image/src/Modifiers/FlipModifier.php @@ -0,0 +1,12 @@ +size() + ->containMax( + $this->width, + $this->height + ) + ->alignPivotTo( + $this->getResizeSize($image), + $this->position + ); + } +} diff --git a/vendor/intervention/image/src/Modifiers/PixelateModifier.php b/vendor/intervention/image/src/Modifiers/PixelateModifier.php new file mode 100755 index 00000000..768fcce6 --- /dev/null +++ b/vendor/intervention/image/src/Modifiers/PixelateModifier.php @@ -0,0 +1,15 @@ +size()->movePivot( + $this->position, + $this->offset_x, + $this->offset_y + ); + + $watermark_size = $watermark->size()->movePivot( + $this->position + ); + + return $image_size->relativePositionTo($watermark_size); + } +} diff --git a/vendor/intervention/image/src/Modifiers/ProfileModifier.php b/vendor/intervention/image/src/Modifiers/ProfileModifier.php new file mode 100755 index 00000000..f784c95c --- /dev/null +++ b/vendor/intervention/image/src/Modifiers/ProfileModifier.php @@ -0,0 +1,16 @@ +core()->frame($this->normalizePosition($image)); + } + + /** + * Return the position of the selected frame as integer + * + * @throws InputException + */ + protected function normalizePosition(ImageInterface $image): int + { + if (is_int($this->position)) { + return $this->position; + } + + if (is_numeric($this->position)) { + return (int) $this->position; + } + + // calculate position from percentage value + if (preg_match("/^(?P[0-9]{1,3})%$/", $this->position, $matches) != 1) { + throw new InputException( + 'Position must be either integer or a percent value as string.' + ); + } + + $total = count($image); + $position = intval(round($total / 100 * intval($matches['percent']))); + + return $position == $total ? $position - 1 : $position; + } +} diff --git a/vendor/intervention/image/src/Modifiers/ResizeCanvasModifier.php b/vendor/intervention/image/src/Modifiers/ResizeCanvasModifier.php new file mode 100755 index 00000000..ae42b7a5 --- /dev/null +++ b/vendor/intervention/image/src/Modifiers/ResizeCanvasModifier.php @@ -0,0 +1,49 @@ + new Rectangle( + is_null($this->width) ? $image->width() : $image->width() + $this->width, + is_null($this->height) ? $image->height() : $image->height() + $this->height, + ), + default => new Rectangle( + is_null($this->width) ? $image->width() : $this->width, + is_null($this->height) ? $image->height() : $this->height, + ), + }; + + return $size->alignPivotTo($image->size(), $this->position); + } +} diff --git a/vendor/intervention/image/src/Modifiers/ResizeCanvasRelativeModifier.php b/vendor/intervention/image/src/Modifiers/ResizeCanvasRelativeModifier.php new file mode 100755 index 00000000..bcc5fa80 --- /dev/null +++ b/vendor/intervention/image/src/Modifiers/ResizeCanvasRelativeModifier.php @@ -0,0 +1,10 @@ +angle, 360); + } +} diff --git a/vendor/intervention/image/src/Modifiers/ScaleDownModifier.php b/vendor/intervention/image/src/Modifiers/ScaleDownModifier.php new file mode 100755 index 00000000..8fdfa9bc --- /dev/null +++ b/vendor/intervention/image/src/Modifiers/ScaleDownModifier.php @@ -0,0 +1,10 @@ +driver()->handleInput($this->font->color()); + + if ($this->font->hasStrokeEffect() && $color->isTransparent()) { + throw new ColorException( + 'The text color must be fully opaque when using the stroke effect.' + ); + } + + return $color; + } + + /** + * Decode outline stroke color + * + * @throws RuntimeException + * @throws ColorException + */ + protected function strokeColor(): ColorInterface + { + $color = $this->driver()->handleInput($this->font->strokeColor()); + + if ($color->isTransparent()) { + throw new ColorException( + 'The stroke color must be fully opaque.' + ); + } + + return $color; + } + + /** + * Return array of offset points to draw text stroke effect below the actual text + * + * @return array + */ + protected function strokeOffsets(FontInterface $font): array + { + $offsets = []; + + if ($font->strokeWidth() <= 0) { + return $offsets; + } + + for ($x = $font->strokeWidth() * -1; $x <= $font->strokeWidth(); $x++) { + for ($y = $font->strokeWidth() * -1; $y <= $font->strokeWidth(); $y++) { + $offsets[] = new Point($x, $y); + } + } + + return $offsets; + } +} diff --git a/vendor/intervention/image/src/Modifiers/TrimModifier.php b/vendor/intervention/image/src/Modifiers/TrimModifier.php new file mode 100755 index 00000000..6d7959b3 --- /dev/null +++ b/vendor/intervention/image/src/Modifiers/TrimModifier.php @@ -0,0 +1,20 @@ +mediaType; + } + + /** + * Alias of self::mediaType() + */ + public function mimetype(): string + { + return $this->mediaType(); + } + + /** + * Set media type of current instance + */ + public function setMediaType(string|MediaType $type): self + { + $this->mediaType = match (true) { + is_string($type) => $type, + default => $type->value, + }; + + return $this; + } + + /** + * Return file path of origin + */ + public function filePath(): ?string + { + return $this->filePath; + } + + /** + * Set file path for origin + */ + public function setFilePath(string $path): self + { + $this->filePath = $path; + + return $this; + } + + /** + * Return file extension if origin was created from file path + */ + public function fileExtension(): ?string + { + return pathinfo($this->filePath ?: '', PATHINFO_EXTENSION) ?: null; + } + + /** + * Show debug info for the current image + * + * @return array + */ + public function __debugInfo(): array + { + return [ + 'mediaType' => $this->mediaType(), + 'filePath' => $this->filePath(), + ]; + } +} diff --git a/vendor/intervention/image/src/Resolution.php b/vendor/intervention/image/src/Resolution.php new file mode 100755 index 00000000..64ab07c6 --- /dev/null +++ b/vendor/intervention/image/src/Resolution.php @@ -0,0 +1,162 @@ + + */ +class Resolution implements ResolutionInterface, Stringable, IteratorAggregate +{ + public const PER_INCH = 1; + public const PER_CM = 2; + + /** + * Create new instance + */ + public function __construct( + protected float $x, + protected float $y, + protected int $per_unit = self::PER_INCH + ) { + // + } + + /** + * {@inheritdoc} + * + * @see IteratorAggregate::getIterator() + */ + public function getIterator(): Traversable + { + return new ArrayIterator([$this->x, $this->y]); + } + + /** + * {@inheritdoc} + * + * @see ResolutionInterface::x() + */ + public function x(): float + { + return $this->x; + } + + /** + * {@inheritdoc} + * + * @see ResolutionInterface::setX() + */ + public function setX(float $x): self + { + $this->x = $x; + + return $this; + } + + /** + * {@inheritdoc} + * + * @see ResolutionInterface::y() + */ + public function y(): float + { + return $this->y; + } + + /** + * {@inheritdoc} + * + * @see ResolutionInterface::setY() + */ + public function setY(float $y): self + { + $this->y = $y; + + return $this; + } + + /** + * {@inheritdoc} + * + * @see ResolutionInterface::setPerUnit() + */ + protected function setPerUnit(int $per_unit): self + { + $this->per_unit = $per_unit; + + return $this; + } + + /** + * {@inheritdoc} + * + * @see ResolutionInterface::unit() + */ + public function unit(): string + { + return match ($this->per_unit) { + self::PER_CM => 'dpcm', + default => 'dpi', + }; + } + + /** + * {@inheritdoc} + * + * @see ResolutionInterface::perInch() + */ + public function perInch(): self + { + return match ($this->per_unit) { + self::PER_CM => $this + ->setPerUnit(self::PER_INCH) + ->setX($this->x * 2.54) + ->setY($this->y * 2.54), + default => $this + }; + } + + /** + * {@inheritdoc} + * + * @see ResolutionInterface::perCm() + */ + public function perCm(): self + { + return match ($this->per_unit) { + self::PER_INCH => $this + ->setPerUnit(self::PER_CM) + ->setX($this->x / 2.54) + ->setY($this->y / 2.54), + default => $this, + }; + } + + /** + * {@inheritdoc} + * + * @see ResolutionInterface::toString() + */ + public function toString(): string + { + return sprintf("%1\$.2f x %2\$.2f %3\$s", $this->x, $this->y, $this->unit()); + } + + /** + * {@inheritdoc} + * + * @see ResolutionInterface::__toString() + */ + public function __toString(): string + { + return $this->toString(); + } +} diff --git a/vendor/intervention/image/src/Traits/CanBeDriverSpecialized.php b/vendor/intervention/image/src/Traits/CanBeDriverSpecialized.php new file mode 100755 index 00000000..efa5622a --- /dev/null +++ b/vendor/intervention/image/src/Traits/CanBeDriverSpecialized.php @@ -0,0 +1,77 @@ +getConstructor()) { + foreach ($constructor->getParameters() as $parameter) { + $specializable[$parameter->getName()] = $this->{$parameter->getName()}; + } + } + + return $specializable; + } + + /** + * {@inheritdoc} + * + * @see SpecializableInterface::driver() + */ + public function driver(): DriverInterface + { + return $this->driver; + } + + /** + * {@inheritdoc} + * + * @see SpecializableInterface::setDriver() + */ + public function setDriver(DriverInterface $driver): SpecializableInterface + { + if (!$this->belongsToDriver($driver)) { + throw new DriverException( + "Class '" . $this::class . "' can not be used with " . $driver->id() . " driver." + ); + } + + $this->driver = $driver; + + return $this; + } + + /** + * Determine if the current object belongs to the given driver's namespace + */ + protected function belongsToDriver(object $driver): bool + { + $namespace = function (object $object): string { + return (new ReflectionClass($object))->getNamespaceName(); + }; + + return str_starts_with($namespace($this), $namespace($driver)); + } +} diff --git a/vendor/intervention/image/src/Traits/CanBuildFilePointer.php b/vendor/intervention/image/src/Traits/CanBuildFilePointer.php new file mode 100755 index 00000000..29d613d1 --- /dev/null +++ b/vendor/intervention/image/src/Traits/CanBuildFilePointer.php @@ -0,0 +1,42 @@ +filename = $filename; + } + + /** + * {@inheritdoc} + * + * @see FontInterface::setSize() + */ + public function setSize(float $size): FontInterface + { + $this->size = $size; + + return $this; + } + + /** + * {@inheritdoc} + * + * @see FontInterface::size() + */ + public function size(): float + { + return $this->size; + } + + /** + * {@inheritdoc} + * + * @see FontInterface::setAngle() + */ + public function setAngle(float $angle): FontInterface + { + $this->angle = $angle; + + return $this; + } + + /** + * {@inheritdoc} + * + * @see FontInterface::angle() + */ + public function angle(): float + { + return $this->angle; + } + + /** + * {@inheritdoc} + * + * @see FontInterface::setFilename() + * + * @throws FontException + */ + public function setFilename(string $filename): FontInterface + { + if (!file_exists($filename)) { + throw new FontException('Font file ' . $filename . ' does not exist.'); + } + + $this->filename = $filename; + + return $this; + } + + /** + * {@inheritdoc} + * + * @see FontInterface::filename() + */ + public function filename(): ?string + { + return $this->filename; + } + + /** + * {@inheritdoc} + * + * @see FontInterface::hasFilename() + */ + public function hasFilename(): bool + { + return !is_null($this->filename) && is_file($this->filename); + } + + /** + * {@inheritdoc} + * + * @see FontInterface::setColor() + */ + public function setColor(mixed $color): FontInterface + { + $this->color = $color; + + return $this; + } + + /** + * {@inheritdoc} + * + * @see FontInterface::color() + */ + public function color(): mixed + { + return $this->color; + } + + /** + * {@inheritdoc} + * + * @see FontInterface::setStrokeColor() + */ + public function setStrokeColor(mixed $color): FontInterface + { + $this->strokeColor = $color; + + return $this; + } + + /** + * {@inheritdoc} + * + * @see FontInterface::strokeColor() + */ + public function strokeColor(): mixed + { + return $this->strokeColor; + } + + /** + * {@inheritdoc} + * + * @see FontInterface::setStrokeWidth() + */ + public function setStrokeWidth(int $width): FontInterface + { + if (!in_array($width, range(0, 10))) { + throw new FontException( + 'The stroke width must be in the range from 0 to 10.' + ); + } + + $this->strokeWidth = $width; + + return $this; + } + + /** + * {@inheritdoc} + * + * @see FontInterface::strokeWidth() + */ + public function strokeWidth(): int + { + return $this->strokeWidth; + } + + /** + * {@inheritdoc} + * + * @see FontInterface::hasStrokeEffect() + */ + public function hasStrokeEffect(): bool + { + return $this->strokeWidth > 0; + } + + /** + * {@inheritdoc} + * + * @see FontInterface::alignment() + */ + public function alignment(): string + { + return $this->alignment; + } + + /** + * {@inheritdoc} + * + * @see FontInterface::setAlignment() + */ + public function setAlignment(string $value): FontInterface + { + $this->alignment = $value; + + return $this; + } + + /** + * {@inheritdoc} + * + * @see FontInterface::valignment() + */ + public function valignment(): string + { + return $this->valignment; + } + + /** + * {@inheritdoc} + * + * @see FontInterface::setValignment() + */ + public function setValignment(string $value): FontInterface + { + $this->valignment = $value; + + return $this; + } + + /** + * {@inheritdoc} + * + * @see FontInterface::setLineHeight() + */ + public function setLineHeight(float $height): FontInterface + { + $this->lineHeight = $height; + + return $this; + } + + /** + * {@inheritdoc} + * + * @see FontInterface::lineHeight() + */ + public function lineHeight(): float + { + return $this->lineHeight; + } + + /** + * {@inheritdoc} + * + * @see FontInterface::setWrapWidth() + */ + public function setWrapWidth(?int $width): FontInterface + { + $this->wrapWidth = $width; + + return $this; + } + + /** + * {@inheritdoc} + * + * @see FontInterface::wrapWidth() + */ + public function wrapWidth(): ?int + { + return $this->wrapWidth; + } +} diff --git a/vendor/intervention/image/src/Typography/FontFactory.php b/vendor/intervention/image/src/Typography/FontFactory.php new file mode 100755 index 00000000..72590126 --- /dev/null +++ b/vendor/intervention/image/src/Typography/FontFactory.php @@ -0,0 +1,141 @@ +font = is_a($init, FontInterface::class) ? $init : new Font(); + + if (is_callable($init)) { + $init($this); + } + } + + /** + * Set the filename of the font to be built + */ + public function filename(string $value): self + { + $this->font->setFilename($value); + + return $this; + } + + /** + * {@inheritdoc} + * + * @see self::filename() + */ + public function file(string $value): self + { + return $this->filename($value); + } + + /** + * Set outline stroke effect for the font to be built + * + * @throws FontException + */ + public function stroke(mixed $color, int $width = 1): self + { + $this->font->setStrokeWidth($width); + $this->font->setStrokeColor($color); + + return $this; + } + + /** + * Set color for the font to be built + */ + public function color(mixed $value): self + { + $this->font->setColor($value); + + return $this; + } + + /** + * Set the size for the font to be built + */ + public function size(float $value): self + { + $this->font->setSize($value); + + return $this; + } + + /** + * Set the horizontal alignment of the font to be built + */ + public function align(string $value): self + { + $this->font->setAlignment($value); + + return $this; + } + + /** + * Set the vertical alignment of the font to be built + */ + public function valign(string $value): self + { + $this->font->setValignment($value); + + return $this; + } + + /** + * Set the line height of the font to be built + */ + public function lineHeight(float $value): self + { + $this->font->setLineHeight($value); + + return $this; + } + + /** + * Set the rotation angle of the font to be built + */ + public function angle(float $value): self + { + $this->font->setAngle($value); + + return $this; + } + + /** + * Set the maximum width of the text block to be built + */ + public function wrap(int $width): self + { + $this->font->setWrapWidth($width); + + return $this; + } + + /** + * Build font + */ + public function __invoke(): FontInterface + { + return $this->font; + } +} diff --git a/vendor/intervention/image/src/Typography/Line.php b/vendor/intervention/image/src/Typography/Line.php new file mode 100755 index 00000000..e820dfca --- /dev/null +++ b/vendor/intervention/image/src/Typography/Line.php @@ -0,0 +1,125 @@ + + */ +class Line implements IteratorAggregate, Countable, Stringable +{ + /** + * Segments (usually individual words including punctuation marks) of the line + * + * @var array + */ + protected array $segments = []; + + /** + * Create new text line object with given text & position + * + * @return void + */ + public function __construct( + ?string $text = null, + protected PointInterface $position = new Point() + ) { + if (is_string($text)) { + $this->segments = $this->wordsSeperatedBySpaces($text) ? explode(" ", $text) : mb_str_split($text); + } + } + + /** + * Add word to current line + */ + public function add(string $word): self + { + $this->segments[] = $word; + + return $this; + } + + /** + * Returns Iterator + * + * @return Traversable + */ + public function getIterator(): Traversable + { + return new ArrayIterator($this->segments); + } + + /** + * Get Position of line + */ + public function position(): PointInterface + { + return $this->position; + } + + /** + * Set position of current line + */ + public function setPosition(PointInterface $point): self + { + $this->position = $point; + + return $this; + } + + /** + * Count segments (individual words including punctuation marks) of line + */ + public function count(): int + { + return count($this->segments); + } + + /** + * Count characters of line + */ + public function length(): int + { + return mb_strlen((string) $this); + } + + /** + * Dermine if words are sperarated by spaces in the written language of the given text + */ + private function wordsSeperatedBySpaces(string $text): bool + { + return 1 !== preg_match( + '/[' . + '\x{4E00}-\x{9FFF}' . // CJK Unified Ideographs (chinese) + '\x{3400}-\x{4DBF}' . // CJK Unified Ideographs Extension A (chinese) + '\x{3040}-\x{309F}' . // hiragana (japanese) + '\x{30A0}-\x{30FF}' . // katakana (japanese) + '\x{0E00}-\x{0E7F}' . // thai + ']/u', + $text + ); + } + + /** + * Cast line to string + */ + public function __toString(): string + { + $string = implode("", $this->segments); + + if ($this->wordsSeperatedBySpaces($string)) { + return implode(" ", $this->segments); + } + + return $string; + } +} diff --git a/vendor/intervention/image/src/Typography/TextBlock.php b/vendor/intervention/image/src/Typography/TextBlock.php new file mode 100755 index 00000000..09d109bd --- /dev/null +++ b/vendor/intervention/image/src/Typography/TextBlock.php @@ -0,0 +1,72 @@ +push(new Line($line)); + } + } + + /** + * Return array of lines in text block + * + * @return array + */ + public function lines(): array + { + return $this->items; + } + + /** + * Set lines of the text block + * + * @param array $lines + */ + public function setLines(array $lines): self + { + $this->items = $lines; + + return $this; + } + + /** + * Get line by given key + */ + public function line(mixed $key): ?Line + { + if (!array_key_exists($key, $this->lines())) { + return null; + } + + return $this->lines()[$key]; + } + + /** + * Return line with most characters of text block + */ + public function longestLine(): Line + { + $lines = $this->lines(); + usort($lines, function (Line $a, Line $b): int { + if ($a->length() === $b->length()) { + return 0; + } + return $a->length() > $b->length() ? -1 : 1; + }); + + return $lines[0]; + } +} diff --git a/vendor/irazasyed/telegram-bot-sdk/LICENSE.md b/vendor/irazasyed/telegram-bot-sdk/LICENSE.md old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/composer.json b/vendor/irazasyed/telegram-bot-sdk/composer.json old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Actions.php b/vendor/irazasyed/telegram-bot-sdk/src/Actions.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Answers/AnswerBus.php b/vendor/irazasyed/telegram-bot-sdk/src/Answers/AnswerBus.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Answers/Answerable.php b/vendor/irazasyed/telegram-bot-sdk/src/Answers/Answerable.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Api.php b/vendor/irazasyed/telegram-bot-sdk/src/Api.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/BotsManager.php b/vendor/irazasyed/telegram-bot-sdk/src/BotsManager.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Commands/Command.php b/vendor/irazasyed/telegram-bot-sdk/src/Commands/Command.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Commands/CommandBus.php b/vendor/irazasyed/telegram-bot-sdk/src/Commands/CommandBus.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Commands/CommandInterface.php b/vendor/irazasyed/telegram-bot-sdk/src/Commands/CommandInterface.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Commands/HelpCommand.php b/vendor/irazasyed/telegram-bot-sdk/src/Commands/HelpCommand.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/EntityType.php b/vendor/irazasyed/telegram-bot-sdk/src/EntityType.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Events/AbstractEvent.php b/vendor/irazasyed/telegram-bot-sdk/src/Events/AbstractEvent.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Events/Emitter.php b/vendor/irazasyed/telegram-bot-sdk/src/Events/Emitter.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Events/EventDispatcherFactory.php b/vendor/irazasyed/telegram-bot-sdk/src/Events/EventDispatcherFactory.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Events/EventDispatcherListenerContract.php b/vendor/irazasyed/telegram-bot-sdk/src/Events/EventDispatcherListenerContract.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Events/HasEventDispatcher.php b/vendor/irazasyed/telegram-bot-sdk/src/Events/HasEventDispatcher.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Events/HasEventName.php b/vendor/irazasyed/telegram-bot-sdk/src/Events/HasEventName.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Events/LeagueEventDispatcher.php b/vendor/irazasyed/telegram-bot-sdk/src/Events/LeagueEventDispatcher.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Events/UpdateEvent.php b/vendor/irazasyed/telegram-bot-sdk/src/Events/UpdateEvent.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Events/UpdateWasReceived.php b/vendor/irazasyed/telegram-bot-sdk/src/Events/UpdateWasReceived.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Exceptions/CouldNotUploadInputFile.php b/vendor/irazasyed/telegram-bot-sdk/src/Exceptions/CouldNotUploadInputFile.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Exceptions/ResponseParameters.php b/vendor/irazasyed/telegram-bot-sdk/src/Exceptions/ResponseParameters.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Exceptions/TelegramBotNotFoundException.php b/vendor/irazasyed/telegram-bot-sdk/src/Exceptions/TelegramBotNotFoundException.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Exceptions/TelegramEmojiMapFileNotFoundException.php b/vendor/irazasyed/telegram-bot-sdk/src/Exceptions/TelegramEmojiMapFileNotFoundException.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Exceptions/TelegramOtherException.php b/vendor/irazasyed/telegram-bot-sdk/src/Exceptions/TelegramOtherException.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Exceptions/TelegramResponseException.php b/vendor/irazasyed/telegram-bot-sdk/src/Exceptions/TelegramResponseException.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Exceptions/TelegramSDKException.php b/vendor/irazasyed/telegram-bot-sdk/src/Exceptions/TelegramSDKException.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Exceptions/TelegramUndefinedPropertyException.php b/vendor/irazasyed/telegram-bot-sdk/src/Exceptions/TelegramUndefinedPropertyException.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/FileUpload/InputFile.php b/vendor/irazasyed/telegram-bot-sdk/src/FileUpload/InputFile.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Helpers/Emojify.php b/vendor/irazasyed/telegram-bot-sdk/src/Helpers/Emojify.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Helpers/Entities.php b/vendor/irazasyed/telegram-bot-sdk/src/Helpers/Entities.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/HttpClients/GuzzleHttpClient.php b/vendor/irazasyed/telegram-bot-sdk/src/HttpClients/GuzzleHttpClient.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/HttpClients/HttpClientInterface.php b/vendor/irazasyed/telegram-bot-sdk/src/HttpClients/HttpClientInterface.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Keyboard/Base.php b/vendor/irazasyed/telegram-bot-sdk/src/Keyboard/Base.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Keyboard/Button.php b/vendor/irazasyed/telegram-bot-sdk/src/Keyboard/Button.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Keyboard/Keyboard.php b/vendor/irazasyed/telegram-bot-sdk/src/Keyboard/Keyboard.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Laravel/Artisan/WebhookCommand.php b/vendor/irazasyed/telegram-bot-sdk/src/Laravel/Artisan/WebhookCommand.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Laravel/Facades/Telegram.php b/vendor/irazasyed/telegram-bot-sdk/src/Laravel/Facades/Telegram.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Laravel/TelegramServiceProvider.php b/vendor/irazasyed/telegram-bot-sdk/src/Laravel/TelegramServiceProvider.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Laravel/config/telegram.php b/vendor/irazasyed/telegram-bot-sdk/src/Laravel/config/telegram.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Methods/Chat.php b/vendor/irazasyed/telegram-bot-sdk/src/Methods/Chat.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Methods/Commands.php b/vendor/irazasyed/telegram-bot-sdk/src/Methods/Commands.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Methods/EditMessage.php b/vendor/irazasyed/telegram-bot-sdk/src/Methods/EditMessage.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Methods/Forum.php b/vendor/irazasyed/telegram-bot-sdk/src/Methods/Forum.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Methods/Game.php b/vendor/irazasyed/telegram-bot-sdk/src/Methods/Game.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Methods/Get.php b/vendor/irazasyed/telegram-bot-sdk/src/Methods/Get.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Methods/Location.php b/vendor/irazasyed/telegram-bot-sdk/src/Methods/Location.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Methods/Message.php b/vendor/irazasyed/telegram-bot-sdk/src/Methods/Message.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Methods/Passport.php b/vendor/irazasyed/telegram-bot-sdk/src/Methods/Passport.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Methods/Payments.php b/vendor/irazasyed/telegram-bot-sdk/src/Methods/Payments.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Methods/Query.php b/vendor/irazasyed/telegram-bot-sdk/src/Methods/Query.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Methods/Stickers.php b/vendor/irazasyed/telegram-bot-sdk/src/Methods/Stickers.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Methods/Update.php b/vendor/irazasyed/telegram-bot-sdk/src/Methods/Update.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/Animation.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/Animation.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/Audio.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/Audio.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/BaseObject.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/BaseObject.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/BotCommand.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/BotCommand.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/CallbackQuery.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/CallbackQuery.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/Chat.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/Chat.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/ChatInviteLink.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/ChatInviteLink.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/ChatJoinRequest.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/ChatJoinRequest.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/ChatLocation.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/ChatLocation.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/ChatMember.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/ChatMember.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/ChatMemberUpdated.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/ChatMemberUpdated.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/ChatPermissions.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/ChatPermissions.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/ChatPhoto.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/ChatPhoto.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/ChosenInlineResult.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/ChosenInlineResult.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/Contact.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/Contact.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/Dice.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/Dice.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/Document.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/Document.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/EditedMessage.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/EditedMessage.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/File.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/File.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/ForumTopic.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/ForumTopic.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/Game.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/Game.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/GameHighScore.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/GameHighScore.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineBaseObject.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineBaseObject.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultArticle.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultArticle.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultAudio.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultAudio.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultCachedAudio.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultCachedAudio.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultCachedDocument.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultCachedDocument.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultCachedGif.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultCachedGif.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultCachedMpeg4Gif.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultCachedMpeg4Gif.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultCachedPhoto.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultCachedPhoto.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultCachedSticker.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultCachedSticker.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultCachedVideo.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultCachedVideo.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultCachedVoice.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultCachedVoice.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultContact.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultContact.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultDocument.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultDocument.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultGame.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultGame.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultGif.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultGif.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultLocation.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultLocation.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultMpeg4Gif.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultMpeg4Gif.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultPhoto.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultPhoto.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultVenue.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultVenue.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultVideo.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultVideo.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultVoice.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/InlineQuery/InlineQueryResultVoice.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/InputContent/InputContactMessageContent.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/InputContent/InputContactMessageContent.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/InputContent/InputLocationMessageContent.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/InputContent/InputLocationMessageContent.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/InputContent/InputTextMessageContent.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/InputContent/InputTextMessageContent.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/InputContent/InputVenueMessageContent.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/InputContent/InputVenueMessageContent.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/InputMedia/InputMedia.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/InputMedia/InputMedia.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/InputMedia/InputMediaAnimation.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/InputMedia/InputMediaAnimation.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/InputMedia/InputMediaAudio.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/InputMedia/InputMediaAudio.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/InputMedia/InputMediaDocument.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/InputMedia/InputMediaDocument.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/InputMedia/InputMediaPhoto.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/InputMedia/InputMediaPhoto.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/InputMedia/InputMediaVideo.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/InputMedia/InputMediaVideo.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/Location.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/Location.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/LoginUrl.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/LoginUrl.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/MaskPosition.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/MaskPosition.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/Message.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/Message.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/MessageAutoDeleteTimerChanged.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/MessageAutoDeleteTimerChanged.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/MessageEntity.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/MessageEntity.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/Credentials.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/Credentials.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/DataCredentials.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/DataCredentials.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/EncryptedCredentials.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/EncryptedCredentials.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/EncryptedPassportElement.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/EncryptedPassportElement.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/FileCredentials.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/FileCredentials.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/IdDocumentData.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/IdDocumentData.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/PassportData.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/PassportData.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/PassportElementError.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/PassportElementError.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/PassportElementErrorDataField.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/PassportElementErrorDataField.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/PassportElementErrorFile.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/PassportElementErrorFile.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/PassportElementErrorFiles.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/PassportElementErrorFiles.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/PassportElementErrorFrontSide.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/PassportElementErrorFrontSide.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/PassportElementErrorReverseSide.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/PassportElementErrorReverseSide.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/PassportElementErrorSelfie.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/PassportElementErrorSelfie.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/PassportElementErrorTranslationFile.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/PassportElementErrorTranslationFile.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/PassportElementErrorTranslationFiles.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/PassportElementErrorTranslationFiles.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/PassportElementErrorUnspecified.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/PassportElementErrorUnspecified.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/PassportFile.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/PassportFile.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/PassportScope.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/PassportScope.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/PassportScopeElement.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/PassportScopeElement.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/PassportScopeElementOne.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/PassportScopeElementOne.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/PassportScopeElementOneOfSeveral.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/PassportScopeElementOneOfSeveral.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/PersonalDetails.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/PersonalDetails.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/ResidentialAddress.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/ResidentialAddress.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/SecureData.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/SecureData.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/SecureValue.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/Passport/SecureValue.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/Payments/Invoice.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/Payments/Invoice.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/Payments/LabeledPrice.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/Payments/LabeledPrice.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/Payments/OrderInfo.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/Payments/OrderInfo.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/Payments/PreCheckoutQuery.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/Payments/PreCheckoutQuery.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/Payments/ShippingAddress.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/Payments/ShippingAddress.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/Payments/ShippingOption.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/Payments/ShippingOption.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/Payments/ShippingQuery.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/Payments/ShippingQuery.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/Payments/SuccessfulPayment.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/Payments/SuccessfulPayment.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/PhotoSize.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/PhotoSize.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/Poll.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/Poll.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/PollAnswer.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/PollAnswer.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/PollOption.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/PollOption.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/ProximityAlertTriggered.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/ProximityAlertTriggered.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/ReactionType.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/ReactionType.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/ResponseParameters.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/ResponseParameters.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/Sticker.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/Sticker.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/StickerSet.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/StickerSet.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/TelegramObject.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/TelegramObject.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/UnknownObject.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/UnknownObject.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/Update.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/Update.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/User.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/User.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/UserProfilePhotos.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/UserProfilePhotos.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/Venue.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/Venue.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/Video.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/Video.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/VideoNote.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/VideoNote.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/Voice.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/Voice.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/VoiceChatEnded.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/VoiceChatEnded.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/VoiceChatParticipantsInvited.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/VoiceChatParticipantsInvited.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/VoiceChatScheduled.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/VoiceChatScheduled.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/VoiceChatStarted.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/VoiceChatStarted.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/WebApp/WebAppData.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/WebApp/WebAppData.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Objects/WebhookInfo.php b/vendor/irazasyed/telegram-bot-sdk/src/Objects/WebhookInfo.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Storage/emoji.json b/vendor/irazasyed/telegram-bot-sdk/src/Storage/emoji.json old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/TelegramClient.php b/vendor/irazasyed/telegram-bot-sdk/src/TelegramClient.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/TelegramRequest.php b/vendor/irazasyed/telegram-bot-sdk/src/TelegramRequest.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/TelegramResponse.php b/vendor/irazasyed/telegram-bot-sdk/src/TelegramResponse.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Traits/CommandsHandler.php b/vendor/irazasyed/telegram-bot-sdk/src/Traits/CommandsHandler.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Traits/HasContainer.php b/vendor/irazasyed/telegram-bot-sdk/src/Traits/HasContainer.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Traits/Http.php b/vendor/irazasyed/telegram-bot-sdk/src/Traits/Http.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Traits/Singleton.php b/vendor/irazasyed/telegram-bot-sdk/src/Traits/Singleton.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Traits/Telegram.php b/vendor/irazasyed/telegram-bot-sdk/src/Traits/Telegram.php old mode 100644 new mode 100755 diff --git a/vendor/irazasyed/telegram-bot-sdk/src/Traits/Validator.php b/vendor/irazasyed/telegram-bot-sdk/src/Traits/Validator.php old mode 100644 new mode 100755 diff --git a/vendor/symfony/yaml/CHANGELOG.md b/vendor/symfony/yaml/CHANGELOG.md old mode 100644 new mode 100755 diff --git a/vendor/symfony/yaml/Command/LintCommand.php b/vendor/symfony/yaml/Command/LintCommand.php old mode 100644 new mode 100755 diff --git a/vendor/symfony/yaml/Dumper.php b/vendor/symfony/yaml/Dumper.php old mode 100644 new mode 100755 diff --git a/vendor/symfony/yaml/Escaper.php b/vendor/symfony/yaml/Escaper.php old mode 100644 new mode 100755 diff --git a/vendor/symfony/yaml/Exception/DumpException.php b/vendor/symfony/yaml/Exception/DumpException.php old mode 100644 new mode 100755 diff --git a/vendor/symfony/yaml/Exception/ExceptionInterface.php b/vendor/symfony/yaml/Exception/ExceptionInterface.php old mode 100644 new mode 100755 diff --git a/vendor/symfony/yaml/Exception/ParseException.php b/vendor/symfony/yaml/Exception/ParseException.php old mode 100644 new mode 100755 diff --git a/vendor/symfony/yaml/Exception/RuntimeException.php b/vendor/symfony/yaml/Exception/RuntimeException.php old mode 100644 new mode 100755 diff --git a/vendor/symfony/yaml/Inline.php b/vendor/symfony/yaml/Inline.php old mode 100644 new mode 100755 diff --git a/vendor/symfony/yaml/LICENSE b/vendor/symfony/yaml/LICENSE old mode 100644 new mode 100755 diff --git a/vendor/symfony/yaml/Parser.php b/vendor/symfony/yaml/Parser.php old mode 100644 new mode 100755 diff --git a/vendor/symfony/yaml/Tag/TaggedValue.php b/vendor/symfony/yaml/Tag/TaggedValue.php old mode 100644 new mode 100755 diff --git a/vendor/symfony/yaml/Unescaper.php b/vendor/symfony/yaml/Unescaper.php old mode 100644 new mode 100755 diff --git a/vendor/symfony/yaml/Yaml.php b/vendor/symfony/yaml/Yaml.php old mode 100644 new mode 100755 diff --git a/vendor/symfony/yaml/composer.json b/vendor/symfony/yaml/composer.json old mode 100644 new mode 100755