Plugin Directory

Changeset 3562098


Ignore:
Timestamp:
06/05/2026 08:55:56 AM (5 months ago)
Author:
sstoqnov
Message:

Bump to 1.2.2

Location:
sg-ai-studio/trunk
Files:
32 added
68 edited

Legend:

Unmodified
Added
Removed
  • sg-ai-studio/trunk/composer.json

    r3561022 r3562098  
    33        "type": "wordpress-plugin",
    44        "autoload": {
    5                 "psr-4": {"SG_AI_Studio\\": "core/"},
    6                 "classmap": ["vendor-prefixed/sepia/po-parser/src/"]
    7         },
    8         "require-dev": {
    9                 "brianhenryie/strauss": "^0.27"
    10         },
    11         "scripts": {
    12                 "strauss": [
    13                         "vendor/bin/strauss",
    14                         "@composer dump-autoload"
    15                 ],
    16                 "pre-autoload-dump": [
    17                         "@php -r \"is_dir('vendor-prefixed/sepia/po-parser/src') || @mkdir('vendor-prefixed/sepia/po-parser/src', 0775, true);\""
    18                 ],
    19                 "post-install-cmd": ["@strauss"],
    20                 "post-update-cmd": ["@strauss"]
    21         },
    22         "extra": {
    23                 "strauss": {
    24                         "target_directory": "vendor-prefixed",
    25                         "namespace_prefix": "SG_AI_Studio\\Vendor\\",
    26                         "classmap_prefix": "SG_AI_Studio_",
    27                         "constant_prefix": "SG_AI_STUDIO_",
    28                         "delete_vendor_packages": true,
    29                         "packages": [
    30                                 "guzzlehttp/guzzle",
    31                                 "guzzlehttp/promises",
    32                                 "guzzlehttp/psr7",
    33                                 "psr/http-client",
    34                                 "psr/http-factory",
    35                                 "psr/http-message",
    36                                 "firebase/php-jwt",
    37                                 "symfony/deprecation-contracts",
    38                                 "ralouphie/getallheaders",
    39                                 "sepia/po-parser",
    40                                 "charles-rumley/php-po-to-json",
    41                                 "siteground/siteground-helper",
    42                                 "siteground/siteground-i18n"
    43                         ]
    44                 }
     5                "psr-4": {"SG_AI_Studio\\": "core/"}
    456        },
    467        "config": {
    … …  
    6526        "prefer-stable": true,
    6627        "require": {
    67                 "firebase/php-jwt": "^6.0",
     28                "firebase/php-jwt": "^6.10",
    6829                "charles-rumley/php-po-to-json": "master@dev",
    6930                "guzzlehttp/guzzle": "^7.0",
  • sg-ai-studio/trunk/composer.lock

    r3561022 r3562098  
    55        "This file is @generated automatically"
    66    ],
    7     "content-hash": "8be3fd6875add557d1a6d9f58df101c7",
     7    "content-hash": "2b259b51f87deb57726fd6be9f32d885",
    88    "packages": [
    99        {
    … …  
    124124        {
    125125            "name": "guzzlehttp/guzzle",
    126             "version": "7.10.0",
     126            "version": "7.11.0",
    127127            "source": {
    128128                "type": "git",
    129129                "url": "https://github.com/guzzle/guzzle.git",
    130                 "reference": "b51ac707cfa420b7bfd4e4d5e510ba8008e822b4"
    131             },
    132             "dist": {
    133                 "type": "zip",
    134                 "url": "https://api.github.com/repos/guzzle/guzzle/zipball/b51ac707cfa420b7bfd4e4d5e510ba8008e822b4",
    135                 "reference": "b51ac707cfa420b7bfd4e4d5e510ba8008e822b4",
     130                "reference": "c987f8ce84b8434fa430795eca0f3430663da72b"
     131            },
     132            "dist": {
     133                "type": "zip",
     134                "url": "https://api.github.com/repos/guzzle/guzzle/zipball/c987f8ce84b8434fa430795eca0f3430663da72b",
     135                "reference": "c987f8ce84b8434fa430795eca0f3430663da72b",
    136136                "shasum": ""
    137137            },
    138138            "require": {
    139139                "ext-json": "*",
    140                 "guzzlehttp/promises": "^2.3",
    141                 "guzzlehttp/psr7": "^2.8",
     140                "guzzlehttp/promises": "^2.5",
     141                "guzzlehttp/psr7": "^2.11",
    142142                "php": "^7.2.5 || ^8.0",
    143143                "psr/http-client": "^1.0",
    144                 "symfony/deprecation-contracts": "^2.2 || ^3.0"
     144                "symfony/deprecation-contracts": "^2.5 || ^3.0",
     145                "symfony/polyfill-php80": "^1.24"
    145146            },
    146147            "provide": {
    … …  
    151152                "ext-curl": "*",
    152153                "guzzle/client-integration-tests": "3.0.2",
     154                "guzzlehttp/test-server": "^0.4",
    153155                "php-http/message-factory": "^1.1",
    154                 "phpunit/phpunit": "^8.5.39 || ^9.6.20",
     156                "phpunit/phpunit": "^8.5.52 || ^9.6.34",
    155157                "psr/log": "^1.1 || ^2.0 || ^3.0"
    156158            },
    … …  
    230232            "support": {
    231233                "issues": "https://github.com/guzzle/guzzle/issues",
    232                 "source": "https://github.com/guzzle/guzzle/tree/7.10.0"
     234                "source": "https://github.com/guzzle/guzzle/tree/7.11.0"
    233235            },
    234236            "funding": [
    … …  
    246248                }
    247249            ],
    248             "time": "2025-08-23T22:36:01+00:00"
     250            "time": "2026-06-02T12:40:51+00:00"
    249251        },
    250252        {
    251253            "name": "guzzlehttp/promises",
    252             "version": "2.3.0",
     254            "version": "2.5.0",
    253255            "source": {
    254256                "type": "git",
    255257                "url": "https://github.com/guzzle/promises.git",
    256                 "reference": "481557b130ef3790cf82b713667b43030dc9c957"
    257             },
    258             "dist": {
    259                 "type": "zip",
    260                 "url": "https://api.github.com/repos/guzzle/promises/zipball/481557b130ef3790cf82b713667b43030dc9c957",
    261                 "reference": "481557b130ef3790cf82b713667b43030dc9c957",
    262                 "shasum": ""
    263             },
    264             "require": {
    265                 "php": "^7.2.5 || ^8.0"
     258                "reference": "4360e982f87f5f258bf872d094647791db2f4c8e"
     259            },
     260            "dist": {
     261                "type": "zip",
     262                "url": "https://api.github.com/repos/guzzle/promises/zipball/4360e982f87f5f258bf872d094647791db2f4c8e",
     263                "reference": "4360e982f87f5f258bf872d094647791db2f4c8e",
     264                "shasum": ""
     265            },
     266            "require": {
     267                "php": "^7.2.5 || ^8.0",
     268                "symfony/deprecation-contracts": "^2.5 || ^3.0"
    266269            },
    267270            "require-dev": {
    268271                "bamarni/composer-bin-plugin": "^1.8.2",
    269                 "phpunit/phpunit": "^8.5.44 || ^9.6.25"
     272                "phpunit/phpunit": "^8.5.52 || ^9.6.34"
    270273            },
    271274            "type": "library",
    … …  
    313316            "support": {
    314317                "issues": "https://github.com/guzzle/promises/issues",
    315                 "source": "https://github.com/guzzle/promises/tree/2.3.0"
     318                "source": "https://github.com/guzzle/promises/tree/2.5.0"
    316319            },
    317320            "funding": [
    … …  
    329332                }
    330333            ],
    331             "time": "2025-08-22T14:34:08+00:00"
     334            "time": "2026-06-02T12:23:43+00:00"
    332335        },
    333336        {
    334337            "name": "guzzlehttp/psr7",
    335             "version": "2.9.0",
     338            "version": "2.11.0",
    336339            "source": {
    337340                "type": "git",
    338341                "url": "https://github.com/guzzle/psr7.git",
    339                 "reference": "7d0ed42f28e42d61352a7a79de682e5e67fec884"
    340             },
    341             "dist": {
    342                 "type": "zip",
    343                 "url": "https://api.github.com/repos/guzzle/psr7/zipball/7d0ed42f28e42d61352a7a79de682e5e67fec884",
    344                 "reference": "7d0ed42f28e42d61352a7a79de682e5e67fec884",
     342                "reference": "bbb5e61349fa5cb822b3e87842b951088b76b81f"
     343            },
     344            "dist": {
     345                "type": "zip",
     346                "url": "https://api.github.com/repos/guzzle/psr7/zipball/bbb5e61349fa5cb822b3e87842b951088b76b81f",
     347                "reference": "bbb5e61349fa5cb822b3e87842b951088b76b81f",
    345348                "shasum": ""
    346349            },
    … …  
    349352                "psr/http-factory": "^1.0",
    350353                "psr/http-message": "^1.1 || ^2.0",
    351                 "ralouphie/getallheaders": "^3.0"
     354                "ralouphie/getallheaders": "^3.0",
     355                "symfony/deprecation-contracts": "^2.5 || ^3.0",
     356                "symfony/polyfill-php80": "^1.24"
    352357            },
    353358            "provide": {
    … …  
    357362            "require-dev": {
    358363                "bamarni/composer-bin-plugin": "^1.8.2",
    359                 "http-interop/http-factory-tests": "0.9.0",
     364                "http-interop/http-factory-tests": "1.1.0",
    360365                "jshttp/mime-db": "1.54.0.1",
    361                 "phpunit/phpunit": "^8.5.44 || ^9.6.25"
     366                "phpunit/phpunit": "^8.5.52 || ^9.6.34"
    362367            },
    363368            "suggest": {
    … …  
    430435            "support": {
    431436                "issues": "https://github.com/guzzle/psr7/issues",
    432                 "source": "https://github.com/guzzle/psr7/tree/2.9.0"
     437                "source": "https://github.com/guzzle/psr7/tree/2.11.0"
    433438            },
    434439            "funding": [
    … …  
    446451                }
    447452            ],
    448             "time": "2026-03-10T16:41:02+00:00"
     453            "time": "2026-06-02T12:30:48+00:00"
    449454        },
    450455        {
    … …  
    710715                "type": "git",
    711716                "url": "git@gitlab.siteground.com:wordpress/siteground-helper.git",
    712                 "reference": "5601ba384a643e54359b8249e2be591e90161a7d"
     717                "reference": "1766f2fe043a0b4f3ce42bae0dcd3d7e50754b86"
    713718            },
    714719            "default-branch": true,
    … …  
    724729            "description": "Helper package used for Siteground wordpress plugins",
    725730            "homepage": "https://github.com/SiteGround/siteground-i18n",
    726             "time": "2023-09-07T11:49:29+00:00"
     731            "time": "2026-06-02T10:22:53+00:00"
    727732        },
    728733        {
    … …  
    809814            ],
    810815            "time": "2024-09-25T14:11:13+00:00"
    811         }
    812     ],
    813     "packages-dev": [
    814         {
    815             "name": "brianhenryie/simple-php-code-parser",
    816             "version": "0.15.5",
    817             "source": {
    818                 "type": "git",
    819                 "url": "https://github.com/BrianHenryIE/Simple-PHP-Code-Parser.git",
    820                 "reference": "60e50b128697ffee4efdac9881bbbbdb0722e256"
    821             },
    822             "dist": {
    823                 "type": "zip",
    824                 "url": "https://api.github.com/repos/BrianHenryIE/Simple-PHP-Code-Parser/zipball/60e50b128697ffee4efdac9881bbbbdb0722e256",
    825                 "reference": "60e50b128697ffee4efdac9881bbbbdb0722e256",
    826                 "shasum": ""
    827             },
    828             "require": {
    829                 "nikic/php-parser": "^4.18 || ^5",
    830                 "php": ">=7.4",
    831                 "phpdocumentor/reflection-common": "~2.2",
    832                 "phpdocumentor/reflection-docblock": "~5.3",
    833                 "phpdocumentor/type-resolver": "~1.7.2",
    834                 "phpstan/phpdoc-parser": "~1.23",
    835                 "voku/simple-cache": "^4.1|^5"
    836             },
    837             "require-dev": {
    838                 "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0"
    839             },
    840             "type": "library",
    841             "autoload": {
    842                 "psr-4": {
    843                     "BrianHenryIE\\SimplePhpParser\\": "src"
    844                 }
    845             },
    846             "notification-url": "https://packagist.org/downloads/",
    847             "license": [
    848                 "Apache-2.0"
    849             ],
    850             "authors": [
    851                 {
    852                     "name": "Lars Moelleken",
    853                     "homepage": "https://www.moelleken.org/"
    854                 },
    855                 {
    856                     "name": "Brian Henry",
    857                     "homepage": "https://BrianHenry.ie"
    858                 }
    859             ],
    860             "description": "Get a simple data structure from your php code.",
    861             "homepage": "https://github.com/BrianHenryIE/Simple-PHP-Code-Parser",
    862             "keywords": [
    863                 "parser",
    864                 "php",
    865                 "phpdoc"
    866             ],
    867             "support": {
    868                 "source": "https://github.com/BrianHenryIE/Simple-PHP-Code-Parser/tree/0.15.5"
    869             },
    870             "funding": [
    871                 {
    872                     "url": "https://www.paypal.me/moelleken",
    873                     "type": "custom"
    874                 },
    875                 {
    876                     "url": "https://github.com/voku",
    877                     "type": "github"
    878                 },
    879                 {
    880                     "url": "https://www.patreon.com/voku",
    881                     "type": "patreon"
    882                 }
    883             ],
    884             "time": "2026-04-22T21:31:34+00:00"
    885         },
    886         {
    887             "name": "brianhenryie/strauss",
    888             "version": "0.27.3",
    889             "source": {
    890                 "type": "git",
    891                 "url": "https://github.com/BrianHenryIE/strauss.git",
    892                 "reference": "26a8fdb5dee0d747247471023832af522d3082f1"
    893             },
    894             "dist": {
    895                 "type": "zip",
    896                 "url": "https://api.github.com/repos/BrianHenryIE/strauss/zipball/26a8fdb5dee0d747247471023832af522d3082f1",
    897                 "reference": "26a8fdb5dee0d747247471023832af522d3082f1",
    898                 "shasum": ""
    899             },
    900             "require": {
    901                 "brianhenryie/simple-php-code-parser": "^0.15.3",
    902                 "composer-runtime-api": "^2.0",
    903                 "composer/class-map-generator": "^1.6.0",
    904                 "composer/composer": "^2.10",
    905                 "elazar/flystream": "^0.5.0|^1",
    906                 "ext-json": "*",
    907                 "json-mapper/json-mapper": "^2.0.0",
    908                 "league/flysystem": "^2.1|^3.0",
    909                 "league/flysystem-memory": "*",
    910                 "monolog/monolog": "^2.10",
    911                 "nikic/php-parser": "^5.4.0",
    912                 "symfony/console": "^4|^5|^6|^7",
    913                 "symfony/finder": "^4|^5|^6|^7"
    914             },
    915             "conflict": {
    916                 "json-mapper/json-mapper": "2.23.0 | 2.24.0"
    917             },
    918             "replace": {
    919                 "coenjacobs/mozart": "*"
    920             },
    921             "require-dev": {
    922                 "brianhenryie/color-logger": "*",
    923                 "brianhenryie/php-codecoverage-markdown": "^0.1.0",
    924                 "clue/phar-composer": "^1.4",
    925                 "jaschilz/php-coverage-badger": "^2.0",
    926                 "mockery/mockery": "^1.6",
    927                 "php": "^7.4|^8.0",
    928                 "phpstan/extension-installer": "^1.4",
    929                 "phpstan/phpstan": "^1.10",
    930                 "phpstan/phpstan-mockery": "^1.1",
    931                 "phpunit/phpcov": "*",
    932                 "phpunit/phpunit": "^9|^10",
    933                 "squizlabs/php_codesniffer": "^3.5"
    934             },
    935             "bin": [
    936                 "bin/strauss"
    937             ],
    938             "type": "library",
    939             "autoload": {
    940                 "files": [
    941                     "bootstrap.php"
    942                 ],
    943                 "psr-4": {
    944                     "BrianHenryIE\\Strauss\\": "src/"
    945                 }
    946             },
    947             "notification-url": "https://packagist.org/downloads/",
    948             "license": [
    949                 "MIT"
    950             ],
    951             "authors": [
    952                 {
    953                     "name": "Brian Henry",
    954                     "email": "BrianHenryIE@gmail.com"
    955                 },
    956                 {
    957                     "name": "Coen Jacobs",
    958                     "email": "coenjacobs@gmail.com"
    959                 }
    960             ],
    961             "description": "Prefixes dependencies namespaces so they are unique to your plugin",
    962             "support": {
    963                 "issues": "https://github.com/BrianHenryIE/strauss/issues",
    964                 "source": "https://github.com/BrianHenryIE/strauss/tree/0.27.3"
    965             },
    966             "time": "2026-06-02T21:45:32+00:00"
    967         },
    968         {
    969             "name": "composer/ca-bundle",
    970             "version": "1.5.12",
    971             "source": {
    972                 "type": "git",
    973                 "url": "https://github.com/composer/ca-bundle.git",
    974                 "reference": "00a2f4201641d5c53f7fc0195e6c8d9fcc321a78"
    975             },
    976             "dist": {
    977                 "type": "zip",
    978                 "url": "https://api.github.com/repos/composer/ca-bundle/zipball/00a2f4201641d5c53f7fc0195e6c8d9fcc321a78",
    979                 "reference": "00a2f4201641d5c53f7fc0195e6c8d9fcc321a78",
    980                 "shasum": ""
    981             },
    982             "require": {
    983                 "ext-openssl": "*",
    984                 "ext-pcre": "*",
    985                 "php": "^7.2 || ^8.0"
    986             },
    987             "require-dev": {
    988                 "phpstan/phpstan": "^1.10",
    989                 "phpunit/phpunit": "^8 || ^9",
    990                 "psr/log": "^1.0 || ^2.0 || ^3.0",
    991                 "symfony/process": "^4.0 || ^5.0 || ^6.0 || ^7.0"
    992             },
    993             "type": "library",
    994             "extra": {
    995                 "branch-alias": {
    996                     "dev-main": "1.x-dev"
    997                 }
    998             },
    999             "autoload": {
    1000                 "psr-4": {
    1001                     "Composer\\CaBundle\\": "src"
    1002                 }
    1003             },
    1004             "notification-url": "https://packagist.org/downloads/",
    1005             "license": [
    1006                 "MIT"
    1007             ],
    1008             "authors": [
    1009                 {
    1010                     "name": "Jordi Boggiano",
    1011                     "email": "j.boggiano@seld.be",
    1012                     "homepage": "http://seld.be"
    1013                 }
    1014             ],
    1015             "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.",
    1016             "keywords": [
    1017                 "cabundle",
    1018                 "cacert",
    1019                 "certificate",
    1020                 "ssl",
    1021                 "tls"
    1022             ],
    1023             "support": {
    1024                 "irc": "irc://irc.freenode.org/composer",
    1025                 "issues": "https://github.com/composer/ca-bundle/issues",
    1026                 "source": "https://github.com/composer/ca-bundle/tree/1.5.12"
    1027             },
    1028             "funding": [
    1029                 {
    1030                     "url": "https://packagist.com",
    1031                     "type": "custom"
    1032                 },
    1033                 {
    1034                     "url": "https://github.com/composer",
    1035                     "type": "github"
    1036                 }
    1037             ],
    1038             "time": "2026-05-19T11:26:22+00:00"
    1039         },
    1040         {
    1041             "name": "composer/class-map-generator",
    1042             "version": "1.7.3",
    1043             "source": {
    1044                 "type": "git",
    1045                 "url": "https://github.com/composer/class-map-generator.git",
    1046                 "reference": "86d8208fc3c649a3a999daf1a63c25201be2990f"
    1047             },
    1048             "dist": {
    1049                 "type": "zip",
    1050                 "url": "https://api.github.com/repos/composer/class-map-generator/zipball/86d8208fc3c649a3a999daf1a63c25201be2990f",
    1051                 "reference": "86d8208fc3c649a3a999daf1a63c25201be2990f",
    1052                 "shasum": ""
    1053             },
    1054             "require": {
    1055                 "composer/pcre": "^2.1 || ^3.1",
    1056                 "php": "^7.2 || ^8.0",
    1057                 "symfony/finder": "^4.4 || ^5.3 || ^6 || ^7 || ^8"
    1058             },
    1059             "require-dev": {
    1060                 "phpstan/phpstan": "^1.12 || ^2",
    1061                 "phpstan/phpstan-deprecation-rules": "^1 || ^2",
    1062                 "phpstan/phpstan-phpunit": "^1 || ^2",
    1063                 "phpstan/phpstan-strict-rules": "^1.1 || ^2",
    1064                 "phpunit/phpunit": "^8",
    1065                 "symfony/filesystem": "^5.4 || ^6 || ^7 || ^8"
    1066             },
    1067             "type": "library",
    1068             "extra": {
    1069                 "branch-alias": {
    1070                     "dev-main": "1.x-dev"
    1071                 }
    1072             },
    1073             "autoload": {
    1074                 "psr-4": {
    1075                     "Composer\\ClassMapGenerator\\": "src"
    1076                 }
    1077             },
    1078             "notification-url": "https://packagist.org/downloads/",
    1079             "license": [
    1080                 "MIT"
    1081             ],
    1082             "authors": [
    1083                 {
    1084                     "name": "Jordi Boggiano",
    1085                     "email": "j.boggiano@seld.be",
    1086                     "homepage": "https://seld.be"
    1087                 }
    1088             ],
    1089             "description": "Utilities to scan PHP code and generate class maps.",
    1090             "keywords": [
    1091                 "classmap"
    1092             ],
    1093             "support": {
    1094                 "issues": "https://github.com/composer/class-map-generator/issues",
    1095                 "source": "https://github.com/composer/class-map-generator/tree/1.7.3"
    1096             },
    1097             "funding": [
    1098                 {
    1099                     "url": "https://packagist.com",
    1100                     "type": "custom"
    1101                 },
    1102                 {
    1103                     "url": "https://github.com/composer",
    1104                     "type": "github"
    1105                 }
    1106             ],
    1107             "time": "2026-05-05T09:17:07+00:00"
    1108         },
    1109         {
    1110             "name": "composer/composer",
    1111             "version": "2.10.1",
    1112             "source": {
    1113                 "type": "git",
    1114                 "url": "https://github.com/composer/composer.git",
    1115                 "reference": "4120703b9bda8795075047b40361d7ec4d2abe49"
    1116             },
    1117             "dist": {
    1118                 "type": "zip",
    1119                 "url": "https://api.github.com/repos/composer/composer/zipball/4120703b9bda8795075047b40361d7ec4d2abe49",
    1120                 "reference": "4120703b9bda8795075047b40361d7ec4d2abe49",
    1121                 "shasum": ""
    1122             },
    1123             "require": {
    1124                 "composer/ca-bundle": "^1.5",
    1125                 "composer/class-map-generator": "^1.4.0",
    1126                 "composer/metadata-minifier": "^1.0",
    1127                 "composer/pcre": "^2.3 || ^3.3",
    1128                 "composer/semver": "^3.3",
    1129                 "composer/spdx-licenses": "^1.5.7",
    1130                 "composer/xdebug-handler": "^2.0.2 || ^3.0.3",
    1131                 "ext-json": "*",
    1132                 "justinrainbow/json-schema": "^6.5.1",
    1133                 "php": "^7.2.5 || ^8.0",
    1134                 "psr/log": "^1.0 || ^2.0 || ^3.0",
    1135                 "react/promise": "^3.3",
    1136                 "seld/jsonlint": "^1.4",
    1137                 "seld/phar-utils": "^1.2",
    1138                 "seld/signal-handler": "^2.0",
    1139                 "symfony/console": "^5.4.47 || ^6.4.25 || ^7.1.10 || ^8.0",
    1140                 "symfony/filesystem": "^5.4.45 || ^6.4.24 || ^7.1.10 || ^8.0",
    1141                 "symfony/finder": "^5.4.45 || ^6.4.24 || ^7.1.10 || ^8.0",
    1142                 "symfony/polyfill-php73": "^1.24",
    1143                 "symfony/polyfill-php80": "^1.24",
    1144                 "symfony/polyfill-php81": "^1.24",
    1145                 "symfony/polyfill-php84": "^1.30",
    1146                 "symfony/process": "^5.4.47 || ^6.4.25 || ^7.1.10 || ^8.0"
    1147             },
    1148             "require-dev": {
    1149                 "phpstan/phpstan": "^1.11.8",
    1150                 "phpstan/phpstan-deprecation-rules": "^1.2.0",
    1151                 "phpstan/phpstan-phpunit": "^1.4.0",
    1152                 "phpstan/phpstan-strict-rules": "^1.6.0",
    1153                 "phpstan/phpstan-symfony": "^1.4.0",
    1154                 "symfony/phpunit-bridge": "^6.4.25 || ^7.3.3 || ^8.0"
    1155             },
    1156             "suggest": {
    1157                 "ext-curl": "Provides HTTP support (will fallback to PHP streams if missing)",
    1158                 "ext-openssl": "Enables access to repositories and packages over HTTPS",
    1159                 "ext-zip": "Allows direct extraction of ZIP archives (unzip/7z binaries will be used instead if available)",
    1160                 "ext-zlib": "Enables gzip for HTTP requests"
    1161             },
    1162             "bin": [
    1163                 "bin/composer"
    1164             ],
    1165             "type": "library",
    1166             "extra": {
    1167                 "phpstan": {
    1168                     "includes": [
    1169                         "phpstan/rules.neon"
    1170                     ]
    1171                 },
    1172                 "branch-alias": {
    1173                     "dev-main": "2.10-dev"
    1174                 }
    1175             },
    1176             "autoload": {
    1177                 "psr-4": {
    1178                     "Composer\\": "src/Composer/"
    1179                 }
    1180             },
    1181             "notification-url": "https://packagist.org/downloads/",
    1182             "license": [
    1183                 "MIT"
    1184             ],
    1185             "authors": [
    1186                 {
    1187                     "name": "Nils Adermann",
    1188                     "email": "naderman@naderman.de",
    1189                     "homepage": "https://www.naderman.de"
    1190                 },
    1191                 {
    1192                     "name": "Jordi Boggiano",
    1193                     "email": "j.boggiano@seld.be",
    1194                     "homepage": "https://seld.be"
    1195                 }
    1196             ],
    1197             "description": "Composer helps you declare, manage and install dependencies of PHP projects. It ensures you have the right stack everywhere.",
    1198             "homepage": "https://getcomposer.org/",
    1199             "keywords": [
    1200                 "autoload",
    1201                 "dependency",
    1202                 "package"
    1203             ],
    1204             "support": {
    1205                 "irc": "ircs://irc.libera.chat:6697/composer",
    1206                 "issues": "https://github.com/composer/composer/issues",
    1207                 "security": "https://github.com/composer/composer/security/policy",
    1208                 "source": "https://github.com/composer/composer/tree/2.10.1"
    1209             },
    1210             "funding": [
    1211                 {
    1212                     "url": "https://packagist.com",
    1213                     "type": "custom"
    1214                 },
    1215                 {
    1216                     "url": "https://github.com/composer",
    1217                     "type": "github"
    1218                 }
    1219             ],
    1220             "time": "2026-06-04T08:25:59+00:00"
    1221         },
    1222         {
    1223             "name": "composer/metadata-minifier",
    1224             "version": "1.0.0",
    1225             "source": {
    1226                 "type": "git",
    1227                 "url": "https://github.com/composer/metadata-minifier.git",
    1228                 "reference": "c549d23829536f0d0e984aaabbf02af91f443207"
    1229             },
    1230             "dist": {
    1231                 "type": "zip",
    1232                 "url": "https://api.github.com/repos/composer/metadata-minifier/zipball/c549d23829536f0d0e984aaabbf02af91f443207",
    1233                 "reference": "c549d23829536f0d0e984aaabbf02af91f443207",
    1234                 "shasum": ""
    1235             },
    1236             "require": {
    1237                 "php": "^5.3.2 || ^7.0 || ^8.0"
    1238             },
    1239             "require-dev": {
    1240                 "composer/composer": "^2",
    1241                 "phpstan/phpstan": "^0.12.55",
    1242                 "symfony/phpunit-bridge": "^4.2 || ^5"
    1243             },
    1244             "type": "library",
    1245             "extra": {
    1246                 "branch-alias": {
    1247                     "dev-main": "1.x-dev"
    1248                 }
    1249             },
    1250             "autoload": {
    1251                 "psr-4": {
    1252                     "Composer\\MetadataMinifier\\": "src"
    1253                 }
    1254             },
    1255             "notification-url": "https://packagist.org/downloads/",
    1256             "license": [
    1257                 "MIT"
    1258             ],
    1259             "authors": [
    1260                 {
    1261                     "name": "Jordi Boggiano",
    1262                     "email": "j.boggiano@seld.be",
    1263                     "homepage": "http://seld.be"
    1264                 }
    1265             ],
    1266             "description": "Small utility library that handles metadata minification and expansion.",
    1267             "keywords": [
    1268                 "composer",
    1269                 "compression"
    1270             ],
    1271             "support": {
    1272                 "issues": "https://github.com/composer/metadata-minifier/issues",
    1273                 "source": "https://github.com/composer/metadata-minifier/tree/1.0.0"
    1274             },
    1275             "funding": [
    1276                 {
    1277                     "url": "https://packagist.com",
    1278                     "type": "custom"
    1279                 },
    1280                 {
    1281                     "url": "https://github.com/composer",
    1282                     "type": "github"
    1283                 },
    1284                 {
    1285                     "url": "https://tidelift.com/funding/github/packagist/composer/composer",
    1286                     "type": "tidelift"
    1287                 }
    1288             ],
    1289             "time": "2021-04-07T13:37:33+00:00"
    1290         },
    1291         {
    1292             "name": "composer/pcre",
    1293             "version": "3.3.2",
    1294             "source": {
    1295                 "type": "git",
    1296                 "url": "https://github.com/composer/pcre.git",
    1297                 "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e"
    1298             },
    1299             "dist": {
    1300                 "type": "zip",
    1301                 "url": "https://api.github.com/repos/composer/pcre/zipball/b2bed4734f0cc156ee1fe9c0da2550420d99a21e",
    1302                 "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e",
    1303                 "shasum": ""
    1304             },
    1305             "require": {
    1306                 "php": "^7.4 || ^8.0"
    1307             },
    1308             "conflict": {
    1309                 "phpstan/phpstan": "<1.11.10"
    1310             },
    1311             "require-dev": {
    1312                 "phpstan/phpstan": "^1.12 || ^2",
    1313                 "phpstan/phpstan-strict-rules": "^1 || ^2",
    1314                 "phpunit/phpunit": "^8 || ^9"
    1315             },
    1316             "type": "library",
    1317             "extra": {
    1318                 "phpstan": {
    1319                     "includes": [
    1320                         "extension.neon"
    1321                     ]
    1322                 },
    1323                 "branch-alias": {
    1324                     "dev-main": "3.x-dev"
    1325                 }
    1326             },
    1327             "autoload": {
    1328                 "psr-4": {
    1329                     "Composer\\Pcre\\": "src"
    1330                 }
    1331             },
    1332             "notification-url": "https://packagist.org/downloads/",
    1333             "license": [
    1334                 "MIT"
    1335             ],
    1336             "authors": [
    1337                 {
    1338                     "name": "Jordi Boggiano",
    1339                     "email": "j.boggiano@seld.be",
    1340                     "homepage": "http://seld.be"
    1341                 }
    1342             ],
    1343             "description": "PCRE wrapping library that offers type-safe preg_* replacements.",
    1344             "keywords": [
    1345                 "PCRE",
    1346                 "preg",
    1347                 "regex",
    1348                 "regular expression"
    1349             ],
    1350             "support": {
    1351                 "issues": "https://github.com/composer/pcre/issues",
    1352                 "source": "https://github.com/composer/pcre/tree/3.3.2"
    1353             },
    1354             "funding": [
    1355                 {
    1356                     "url": "https://packagist.com",
    1357                     "type": "custom"
    1358                 },
    1359                 {
    1360                     "url": "https://github.com/composer",
    1361                     "type": "github"
    1362                 },
    1363                 {
    1364                     "url": "https://tidelift.com/funding/github/packagist/composer/composer",
    1365                     "type": "tidelift"
    1366                 }
    1367             ],
    1368             "time": "2024-11-12T16:29:46+00:00"
    1369         },
    1370         {
    1371             "name": "composer/semver",
    1372             "version": "3.4.4",
    1373             "source": {
    1374                 "type": "git",
    1375                 "url": "https://github.com/composer/semver.git",
    1376                 "reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95"
    1377             },
    1378             "dist": {
    1379                 "type": "zip",
    1380                 "url": "https://api.github.com/repos/composer/semver/zipball/198166618906cb2de69b95d7d47e5fa8aa1b2b95",
    1381                 "reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95",
    1382                 "shasum": ""
    1383             },
    1384             "require": {
    1385                 "php": "^5.3.2 || ^7.0 || ^8.0"
    1386             },
    1387             "require-dev": {
    1388                 "phpstan/phpstan": "^1.11",
    1389                 "symfony/phpunit-bridge": "^3 || ^7"
    1390             },
    1391             "type": "library",
    1392             "extra": {
    1393                 "branch-alias": {
    1394                     "dev-main": "3.x-dev"
    1395                 }
    1396             },
    1397             "autoload": {
    1398                 "psr-4": {
    1399                     "Composer\\Semver\\": "src"
    1400                 }
    1401             },
    1402             "notification-url": "https://packagist.org/downloads/",
    1403             "license": [
    1404                 "MIT"
    1405             ],
    1406             "authors": [
    1407                 {
    1408                     "name": "Nils Adermann",
    1409                     "email": "naderman@naderman.de",
    1410                     "homepage": "http://www.naderman.de"
    1411                 },
    1412                 {
    1413                     "name": "Jordi Boggiano",
    1414                     "email": "j.boggiano@seld.be",
    1415                     "homepage": "http://seld.be"
    1416                 },
    1417                 {
    1418                     "name": "Rob Bast",
    1419                     "email": "rob.bast@gmail.com",
    1420                     "homepage": "http://robbast.nl"
    1421                 }
    1422             ],
    1423             "description": "Semver library that offers utilities, version constraint parsing and validation.",
    1424             "keywords": [
    1425                 "semantic",
    1426                 "semver",
    1427                 "validation",
    1428                 "versioning"
    1429             ],
    1430             "support": {
    1431                 "irc": "ircs://irc.libera.chat:6697/composer",
    1432                 "issues": "https://github.com/composer/semver/issues",
    1433                 "source": "https://github.com/composer/semver/tree/3.4.4"
    1434             },
    1435             "funding": [
    1436                 {
    1437                     "url": "https://packagist.com",
    1438                     "type": "custom"
    1439                 },
    1440                 {
    1441                     "url": "https://github.com/composer",
    1442                     "type": "github"
    1443                 }
    1444             ],
    1445             "time": "2025-08-20T19:15:30+00:00"
    1446         },
    1447         {
    1448             "name": "composer/spdx-licenses",
    1449             "version": "1.6.0",
    1450             "source": {
    1451                 "type": "git",
    1452                 "url": "https://github.com/composer/spdx-licenses.git",
    1453                 "reference": "5ecd0cb4177696f9fd48f1605dda81db3dee7889"
    1454             },
    1455             "dist": {
    1456                 "type": "zip",
    1457                 "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/5ecd0cb4177696f9fd48f1605dda81db3dee7889",
    1458                 "reference": "5ecd0cb4177696f9fd48f1605dda81db3dee7889",
    1459                 "shasum": ""
    1460             },
    1461             "require": {
    1462                 "php": "^7.2 || ^8.0"
    1463             },
    1464             "require-dev": {
    1465                 "phpstan/phpstan": "^1.11",
    1466                 "symfony/phpunit-bridge": "^6.4.25 || ^7.3.3 || ^8.0"
    1467             },
    1468             "type": "library",
    1469             "extra": {
    1470                 "branch-alias": {
    1471                     "dev-main": "1.x-dev"
    1472                 }
    1473             },
    1474             "autoload": {
    1475                 "psr-4": {
    1476                     "Composer\\Spdx\\": "src"
    1477                 }
    1478             },
    1479             "notification-url": "https://packagist.org/downloads/",
    1480             "license": [
    1481                 "MIT"
    1482             ],
    1483             "authors": [
    1484                 {
    1485                     "name": "Nils Adermann",
    1486                     "email": "naderman@naderman.de",
    1487                     "homepage": "http://www.naderman.de"
    1488                 },
    1489                 {
    1490                     "name": "Jordi Boggiano",
    1491                     "email": "j.boggiano@seld.be",
    1492                     "homepage": "http://seld.be"
    1493                 },
    1494                 {
    1495                     "name": "Rob Bast",
    1496                     "email": "rob.bast@gmail.com",
    1497                     "homepage": "http://robbast.nl"
    1498                 }
    1499             ],
    1500             "description": "SPDX licenses list and validation library.",
    1501             "keywords": [
    1502                 "license",
    1503                 "spdx",
    1504                 "validator"
    1505             ],
    1506             "support": {
    1507                 "irc": "ircs://irc.libera.chat:6697/composer",
    1508                 "issues": "https://github.com/composer/spdx-licenses/issues",
    1509                 "source": "https://github.com/composer/spdx-licenses/tree/1.6.0"
    1510             },
    1511             "funding": [
    1512                 {
    1513                     "url": "https://packagist.com",
    1514                     "type": "custom"
    1515                 },
    1516                 {
    1517                     "url": "https://github.com/composer",
    1518                     "type": "github"
    1519                 }
    1520             ],
    1521             "time": "2026-04-08T20:18:39+00:00"
    1522         },
    1523         {
    1524             "name": "composer/xdebug-handler",
    1525             "version": "3.0.5",
    1526             "source": {
    1527                 "type": "git",
    1528                 "url": "https://github.com/composer/xdebug-handler.git",
    1529                 "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef"
    1530             },
    1531             "dist": {
    1532                 "type": "zip",
    1533                 "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/6c1925561632e83d60a44492e0b344cf48ab85ef",
    1534                 "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef",
    1535                 "shasum": ""
    1536             },
    1537             "require": {
    1538                 "composer/pcre": "^1 || ^2 || ^3",
    1539                 "php": "^7.2.5 || ^8.0",
    1540                 "psr/log": "^1 || ^2 || ^3"
    1541             },
    1542             "require-dev": {
    1543                 "phpstan/phpstan": "^1.0",
    1544                 "phpstan/phpstan-strict-rules": "^1.1",
    1545                 "phpunit/phpunit": "^8.5 || ^9.6 || ^10.5"
    1546             },
    1547             "type": "library",
    1548             "autoload": {
    1549                 "psr-4": {
    1550                     "Composer\\XdebugHandler\\": "src"
    1551                 }
    1552             },
    1553             "notification-url": "https://packagist.org/downloads/",
    1554             "license": [
    1555                 "MIT"
    1556             ],
    1557             "authors": [
    1558                 {
    1559                     "name": "John Stevenson",
    1560                     "email": "john-stevenson@blueyonder.co.uk"
    1561                 }
    1562             ],
    1563             "description": "Restarts a process without Xdebug.",
    1564             "keywords": [
    1565                 "Xdebug",
    1566                 "performance"
    1567             ],
    1568             "support": {
    1569                 "irc": "ircs://irc.libera.chat:6697/composer",
    1570                 "issues": "https://github.com/composer/xdebug-handler/issues",
    1571                 "source": "https://github.com/composer/xdebug-handler/tree/3.0.5"
    1572             },
    1573             "funding": [
    1574                 {
    1575                     "url": "https://packagist.com",
    1576                     "type": "custom"
    1577                 },
    1578                 {
    1579                     "url": "https://github.com/composer",
    1580                     "type": "github"
    1581                 },
    1582                 {
    1583                     "url": "https://tidelift.com/funding/github/packagist/composer/composer",
    1584                     "type": "tidelift"
    1585                 }
    1586             ],
    1587             "time": "2024-05-06T16:37:16+00:00"
    1588         },
    1589         {
    1590             "name": "doctrine/deprecations",
    1591             "version": "1.1.6",
    1592             "source": {
    1593                 "type": "git",
    1594                 "url": "https://github.com/doctrine/deprecations.git",
    1595                 "reference": "d4fe3e6fd9bb9e72557a19674f44d8ac7db4c6ca"
    1596             },
    1597             "dist": {
    1598                 "type": "zip",
    1599                 "url": "https://api.github.com/repos/doctrine/deprecations/zipball/d4fe3e6fd9bb9e72557a19674f44d8ac7db4c6ca",
    1600                 "reference": "d4fe3e6fd9bb9e72557a19674f44d8ac7db4c6ca",
    1601                 "shasum": ""
    1602             },
    1603             "require": {
    1604                 "php": "^7.1 || ^8.0"
    1605             },
    1606             "conflict": {
    1607                 "phpunit/phpunit": "<=7.5 || >=14"
    1608             },
    1609             "require-dev": {
    1610                 "doctrine/coding-standard": "^9 || ^12 || ^14",
    1611                 "phpstan/phpstan": "1.4.10 || 2.1.30",
    1612                 "phpstan/phpstan-phpunit": "^1.0 || ^2",
    1613                 "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6 || ^10.5 || ^11.5 || ^12.4 || ^13.0",
    1614                 "psr/log": "^1 || ^2 || ^3"
    1615             },
    1616             "suggest": {
    1617                 "psr/log": "Allows logging deprecations via PSR-3 logger implementation"
    1618             },
    1619             "type": "library",
    1620             "autoload": {
    1621                 "psr-4": {
    1622                     "Doctrine\\Deprecations\\": "src"
    1623                 }
    1624             },
    1625             "notification-url": "https://packagist.org/downloads/",
    1626             "license": [
    1627                 "MIT"
    1628             ],
    1629             "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.",
    1630             "homepage": "https://www.doctrine-project.org/",
    1631             "support": {
    1632                 "issues": "https://github.com/doctrine/deprecations/issues",
    1633                 "source": "https://github.com/doctrine/deprecations/tree/1.1.6"
    1634             },
    1635             "time": "2026-02-07T07:09:04+00:00"
    1636         },
    1637         {
    1638             "name": "elazar/flystream",
    1639             "version": "0.5.0",
    1640             "source": {
    1641                 "type": "git",
    1642                 "url": "https://github.com/elazar/flystream.git",
    1643                 "reference": "795026ac724e5b8fe827696497aff12e7935311c"
    1644             },
    1645             "dist": {
    1646                 "type": "zip",
    1647                 "url": "https://api.github.com/repos/elazar/flystream/zipball/795026ac724e5b8fe827696497aff12e7935311c",
    1648                 "reference": "795026ac724e5b8fe827696497aff12e7935311c",
    1649                 "shasum": ""
    1650             },
    1651             "require": {
    1652                 "league/flysystem": "^2.1 || ^3.0",
    1653                 "php": ">=7.4",
    1654                 "pimple/pimple": "^3.4",
    1655                 "psr/log": "^1"
    1656             },
    1657             "require-dev": {
    1658                 "friendsofphp/php-cs-fixer": "^3.0",
    1659                 "league/flysystem-memory": "^2.0 || ^3.0",
    1660                 "mockery/mockery": "^1.4",
    1661                 "monolog/monolog": "^2.3",
    1662                 "pestphp/pest": "^1.9"
    1663             },
    1664             "type": "library",
    1665             "autoload": {
    1666                 "psr-4": {
    1667                     "Elazar\\Flystream\\": "src/"
    1668                 }
    1669             },
    1670             "notification-url": "https://packagist.org/downloads/",
    1671             "license": [
    1672                 "MIT"
    1673             ],
    1674             "authors": [
    1675                 {
    1676                     "name": "Matthew Turland",
    1677                     "email": "me@matthewturland.com"
    1678                 }
    1679             ],
    1680             "description": "PHP stream wrapper for Flysystem v2",
    1681             "support": {
    1682                 "issues": "https://github.com/elazar/flystream/issues",
    1683                 "source": "https://github.com/elazar/flystream/tree/0.5.0"
    1684             },
    1685             "time": "2025-02-15T00:35:13+00:00"
    1686         },
    1687         {
    1688             "name": "json-mapper/json-mapper",
    1689             "version": "2.25.1",
    1690             "source": {
    1691                 "type": "git",
    1692                 "url": "https://github.com/JsonMapper/JsonMapper.git",
    1693                 "reference": "4fd6cb5ccfece349ed1aeb52c818bdf84ba75b61"
    1694             },
    1695             "dist": {
    1696                 "type": "zip",
    1697                 "url": "https://api.github.com/repos/JsonMapper/JsonMapper/zipball/4fd6cb5ccfece349ed1aeb52c818bdf84ba75b61",
    1698                 "reference": "4fd6cb5ccfece349ed1aeb52c818bdf84ba75b61",
    1699                 "shasum": ""
    1700             },
    1701             "require": {
    1702                 "ext-json": "*",
    1703                 "myclabs/php-enum": "^1.7",
    1704                 "nikic/php-parser": "^4.13 || ^5.0",
    1705                 "php": "^7.4 || ^8.0",
    1706                 "phpdocumentor/reflection-docblock": "^5.6",
    1707                 "psr/log": "^1.1 || ^2.0 || ^3.0",
    1708                 "psr/simple-cache": " ^1.0 || ^2.0 || ^3.0",
    1709                 "symfony/cache": "^4.4 || ^5.0 || ^6.0 || ^7.0",
    1710                 "symfony/polyfill-php73": "^1.18"
    1711             },
    1712             "require-dev": {
    1713                 "guzzlehttp/guzzle": "^6.5 || ^7.0",
    1714                 "php-coveralls/php-coveralls": "^2.4",
    1715                 "phpstan/phpstan": "^0.12.14",
    1716                 "phpstan/phpstan-phpunit": "^0.12.17",
    1717                 "phpunit/phpunit": "^7.5 || ^8.5 || ^9.0",
    1718                 "squizlabs/php_codesniffer": "^3.5",
    1719                 "symfony/console": "^2.1 || ^3.0 || ^4.0 || ^5.0",
    1720                 "vimeo/psalm": "^4.10 || ^5.0"
    1721             },
    1722             "suggest": {
    1723                 "json-mapper/laravel-package": "Use JsonMapper directly with Laravel",
    1724                 "json-mapper/symfony-bundle": "Use JsonMapper directly with Symfony"
    1725             },
    1726             "type": "library",
    1727             "autoload": {
    1728                 "psr-4": {
    1729                     "JsonMapper\\": "src/"
    1730                 }
    1731             },
    1732             "notification-url": "https://packagist.org/downloads/",
    1733             "license": [
    1734                 "MIT"
    1735             ],
    1736             "description": "Map JSON structures to PHP classes",
    1737             "homepage": "https://jsonmapper.net",
    1738             "keywords": [
    1739                 "json",
    1740                 "jsonmapper",
    1741                 "mapper",
    1742                 "middleware"
    1743             ],
    1744             "support": {
    1745                 "docs": "https://jsonmapper.net",
    1746                 "issues": "https://github.com/JsonMapper/JsonMapper/issues",
    1747                 "source": "https://github.com/JsonMapper/JsonMapper"
    1748             },
    1749             "funding": [
    1750                 {
    1751                     "url": "https://github.com/DannyvdSluijs",
    1752                     "type": "github"
    1753                 }
    1754             ],
    1755             "time": "2025-05-26T09:51:24+00:00"
    1756         },
    1757         {
    1758             "name": "justinrainbow/json-schema",
    1759             "version": "6.8.2",
    1760             "source": {
    1761                 "type": "git",
    1762                 "url": "https://github.com/jsonrainbow/json-schema.git",
    1763                 "reference": "2c89ebb95ca9cedc9347f780333f7b25792dcb76"
    1764             },
    1765             "dist": {
    1766                 "type": "zip",
    1767                 "url": "https://api.github.com/repos/jsonrainbow/json-schema/zipball/2c89ebb95ca9cedc9347f780333f7b25792dcb76",
    1768                 "reference": "2c89ebb95ca9cedc9347f780333f7b25792dcb76",
    1769                 "shasum": ""
    1770             },
    1771             "require": {
    1772                 "ext-json": "*",
    1773                 "marc-mabe/php-enum": "^4.4",
    1774                 "php": "^7.2 || ^8.0"
    1775             },
    1776             "require-dev": {
    1777                 "friendsofphp/php-cs-fixer": "3.3.0",
    1778                 "json-schema/json-schema-test-suite": "dev-main",
    1779                 "marc-mabe/php-enum-phpstan": "^2.0",
    1780                 "phpspec/prophecy": "^1.19",
    1781                 "phpstan/phpstan": "^1.12",
    1782                 "phpunit/phpunit": "^8.5"
    1783             },
    1784             "bin": [
    1785                 "bin/validate-json"
    1786             ],
    1787             "type": "library",
    1788             "extra": {
    1789                 "branch-alias": {
    1790                     "dev-master": "6.x-dev"
    1791                 }
    1792             },
    1793             "autoload": {
    1794                 "psr-4": {
    1795                     "JsonSchema\\": "src/JsonSchema/"
    1796                 }
    1797             },
    1798             "notification-url": "https://packagist.org/downloads/",
    1799             "license": [
    1800                 "MIT"
    1801             ],
    1802             "authors": [
    1803                 {
    1804                     "name": "Bruno Prieto Reis",
    1805                     "email": "bruno.p.reis@gmail.com"
    1806                 },
    1807                 {
    1808                     "name": "Justin Rainbow",
    1809                     "email": "justin.rainbow@gmail.com"
    1810                 },
    1811                 {
    1812                     "name": "Igor Wiedler",
    1813                     "email": "igor@wiedler.ch"
    1814                 },
    1815                 {
    1816                     "name": "Robert Schönthal",
    1817                     "email": "seroscho@googlemail.com"
    1818                 }
    1819             ],
    1820             "description": "A library to validate a json schema.",
    1821             "homepage": "https://github.com/jsonrainbow/json-schema",
    1822             "keywords": [
    1823                 "json",
    1824                 "schema"
    1825             ],
    1826             "support": {
    1827                 "issues": "https://github.com/jsonrainbow/json-schema/issues",
    1828                 "source": "https://github.com/jsonrainbow/json-schema/tree/6.8.2"
    1829             },
    1830             "time": "2026-05-05T05:39:01+00:00"
    1831         },
    1832         {
    1833             "name": "league/flysystem",
    1834             "version": "2.5.0",
    1835             "source": {
    1836                 "type": "git",
    1837                 "url": "https://github.com/thephpleague/flysystem.git",
    1838                 "reference": "8aaffb653c5777781b0f7f69a5d937baf7ab6cdb"
    1839             },
    1840             "dist": {
    1841                 "type": "zip",
    1842                 "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/8aaffb653c5777781b0f7f69a5d937baf7ab6cdb",
    1843                 "reference": "8aaffb653c5777781b0f7f69a5d937baf7ab6cdb",
    1844                 "shasum": ""
    1845             },
    1846             "require": {
    1847                 "ext-json": "*",
    1848                 "league/mime-type-detection": "^1.0.0",
    1849                 "php": "^7.2 || ^8.0"
    1850             },
    1851             "conflict": {
    1852                 "guzzlehttp/ringphp": "<1.1.1"
    1853             },
    1854             "require-dev": {
    1855                 "async-aws/s3": "^1.5",
    1856                 "async-aws/simple-s3": "^1.0",
    1857                 "aws/aws-sdk-php": "^3.132.4",
    1858                 "composer/semver": "^3.0",
    1859                 "ext-fileinfo": "*",
    1860                 "ext-ftp": "*",
    1861                 "friendsofphp/php-cs-fixer": "^3.2",
    1862                 "google/cloud-storage": "^1.23",
    1863                 "phpseclib/phpseclib": "^2.0",
    1864                 "phpstan/phpstan": "^0.12.26",
    1865                 "phpunit/phpunit": "^8.5 || ^9.4",
    1866                 "sabre/dav": "^4.1"
    1867             },
    1868             "type": "library",
    1869             "autoload": {
    1870                 "psr-4": {
    1871                     "League\\Flysystem\\": "src"
    1872                 }
    1873             },
    1874             "notification-url": "https://packagist.org/downloads/",
    1875             "license": [
    1876                 "MIT"
    1877             ],
    1878             "authors": [
    1879                 {
    1880                     "name": "Frank de Jonge",
    1881                     "email": "info@frankdejonge.nl"
    1882                 }
    1883             ],
    1884             "description": "File storage abstraction for PHP",
    1885             "keywords": [
    1886                 "WebDAV",
    1887                 "aws",
    1888                 "cloud",
    1889                 "file",
    1890                 "files",
    1891                 "filesystem",
    1892                 "filesystems",
    1893                 "ftp",
    1894                 "s3",
    1895                 "sftp",
    1896                 "storage"
    1897             ],
    1898             "support": {
    1899                 "issues": "https://github.com/thephpleague/flysystem/issues",
    1900                 "source": "https://github.com/thephpleague/flysystem/tree/2.5.0"
    1901             },
    1902             "funding": [
    1903                 {
    1904                     "url": "https://ecologi.com/frankdejonge",
    1905                     "type": "custom"
    1906                 },
    1907                 {
    1908                     "url": "https://github.com/frankdejonge",
    1909                     "type": "github"
    1910                 },
    1911                 {
    1912                     "url": "https://tidelift.com/funding/github/packagist/league/flysystem",
    1913                     "type": "tidelift"
    1914                 }
    1915             ],
    1916             "time": "2022-09-17T21:02:32+00:00"
    1917         },
    1918         {
    1919             "name": "league/flysystem-memory",
    1920             "version": "2.0.6",
    1921             "source": {
    1922                 "type": "git",
    1923                 "url": "https://github.com/thephpleague/flysystem-memory.git",
    1924                 "reference": "f644026c705b8a501543f38cb8b745a603aa4952"
    1925             },
    1926             "dist": {
    1927                 "type": "zip",
    1928                 "url": "https://api.github.com/repos/thephpleague/flysystem-memory/zipball/f644026c705b8a501543f38cb8b745a603aa4952",
    1929                 "reference": "f644026c705b8a501543f38cb8b745a603aa4952",
    1930                 "shasum": ""
    1931             },
    1932             "require": {
    1933                 "ext-fileinfo": "*",
    1934                 "league/flysystem": "^2.0.0",
    1935                 "php": "^7.2 || ^8.0"
    1936             },
    1937             "type": "library",
    1938             "autoload": {
    1939                 "psr-4": {
    1940                     "League\\Flysystem\\InMemory\\": ""
    1941                 }
    1942             },
    1943             "notification-url": "https://packagist.org/downloads/",
    1944             "license": [
    1945                 "MIT"
    1946             ],
    1947             "authors": [
    1948                 {
    1949                     "name": "Frank de Jonge",
    1950                     "email": "info@frankdejonge.nl"
    1951                 }
    1952             ],
    1953             "description": "In-memory filesystem adapter for Flysystem.",
    1954             "keywords": [
    1955                 "Flysystem",
    1956                 "file",
    1957                 "files",
    1958                 "filesystem",
    1959                 "memory"
    1960             ],
    1961             "support": {
    1962                 "issues": "https://github.com/thephpleague/flysystem-memory/issues",
    1963                 "source": "https://github.com/thephpleague/flysystem-memory/tree/2.0.6"
    1964             },
    1965             "time": "2021-02-12T19:24:17+00:00"
    1966         },
    1967         {
    1968             "name": "league/mime-type-detection",
    1969             "version": "1.16.0",
    1970             "source": {
    1971                 "type": "git",
    1972                 "url": "https://github.com/thephpleague/mime-type-detection.git",
    1973                 "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9"
    1974             },
    1975             "dist": {
    1976                 "type": "zip",
    1977                 "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/2d6702ff215bf922936ccc1ad31007edc76451b9",
    1978                 "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9",
    1979                 "shasum": ""
    1980             },
    1981             "require": {
    1982                 "ext-fileinfo": "*",
    1983                 "php": "^7.4 || ^8.0"
    1984             },
    1985             "require-dev": {
    1986                 "friendsofphp/php-cs-fixer": "^3.2",
    1987                 "phpstan/phpstan": "^0.12.68",
    1988                 "phpunit/phpunit": "^8.5.8 || ^9.3 || ^10.0"
    1989             },
    1990             "type": "library",
    1991             "autoload": {
    1992                 "psr-4": {
    1993                     "League\\MimeTypeDetection\\": "src"
    1994                 }
    1995             },
    1996             "notification-url": "https://packagist.org/downloads/",
    1997             "license": [
    1998                 "MIT"
    1999             ],
    2000             "authors": [
    2001                 {
    2002                     "name": "Frank de Jonge",
    2003                     "email": "info@frankdejonge.nl"
    2004                 }
    2005             ],
    2006             "description": "Mime-type detection for Flysystem",
    2007             "support": {
    2008                 "issues": "https://github.com/thephpleague/mime-type-detection/issues",
    2009                 "source": "https://github.com/thephpleague/mime-type-detection/tree/1.16.0"
    2010             },
    2011             "funding": [
    2012                 {
    2013                     "url": "https://github.com/frankdejonge",
    2014                     "type": "github"
    2015                 },
    2016                 {
    2017                     "url": "https://tidelift.com/funding/github/packagist/league/flysystem",
    2018                     "type": "tidelift"
    2019                 }
    2020             ],
    2021             "time": "2024-09-21T08:32:55+00:00"
    2022         },
    2023         {
    2024             "name": "marc-mabe/php-enum",
    2025             "version": "v4.7.2",
    2026             "source": {
    2027                 "type": "git",
    2028                 "url": "https://github.com/marc-mabe/php-enum.git",
    2029                 "reference": "bb426fcdd65c60fb3638ef741e8782508fda7eef"
    2030             },
    2031             "dist": {
    2032                 "type": "zip",
    2033                 "url": "https://api.github.com/repos/marc-mabe/php-enum/zipball/bb426fcdd65c60fb3638ef741e8782508fda7eef",
    2034                 "reference": "bb426fcdd65c60fb3638ef741e8782508fda7eef",
    2035                 "shasum": ""
    2036             },
    2037             "require": {
    2038                 "ext-reflection": "*",
    2039                 "php": "^7.1 | ^8.0"
    2040             },
    2041             "require-dev": {
    2042                 "phpbench/phpbench": "^0.16.10 || ^1.0.4",
    2043                 "phpstan/phpstan": "^1.3.1",
    2044                 "phpunit/phpunit": "^7.5.20 | ^8.5.22 | ^9.5.11",
    2045                 "vimeo/psalm": "^4.17.0 | ^5.26.1"
    2046             },
    2047             "type": "library",
    2048             "extra": {
    2049                 "branch-alias": {
    2050                     "dev-3.x": "3.2-dev",
    2051                     "dev-master": "4.7-dev"
    2052                 }
    2053             },
    2054             "autoload": {
    2055                 "psr-4": {
    2056                     "MabeEnum\\": "src/"
    2057                 },
    2058                 "classmap": [
    2059                     "stubs/Stringable.php"
    2060                 ]
    2061             },
    2062             "notification-url": "https://packagist.org/downloads/",
    2063             "license": [
    2064                 "BSD-3-Clause"
    2065             ],
    2066             "authors": [
    2067                 {
    2068                     "name": "Marc Bennewitz",
    2069                     "email": "dev@mabe.berlin",
    2070                     "homepage": "https://mabe.berlin/",
    2071                     "role": "Lead"
    2072                 }
    2073             ],
    2074             "description": "Simple and fast implementation of enumerations with native PHP",
    2075             "homepage": "https://github.com/marc-mabe/php-enum",
    2076             "keywords": [
    2077                 "enum",
    2078                 "enum-map",
    2079                 "enum-set",
    2080                 "enumeration",
    2081                 "enumerator",
    2082                 "enummap",
    2083                 "enumset",
    2084                 "map",
    2085                 "set",
    2086                 "type",
    2087                 "type-hint",
    2088                 "typehint"
    2089             ],
    2090             "support": {
    2091                 "issues": "https://github.com/marc-mabe/php-enum/issues",
    2092                 "source": "https://github.com/marc-mabe/php-enum/tree/v4.7.2"
    2093             },
    2094             "time": "2025-09-14T11:18:39+00:00"
    2095         },
    2096         {
    2097             "name": "monolog/monolog",
    2098             "version": "2.11.0",
    2099             "source": {
    2100                 "type": "git",
    2101                 "url": "https://github.com/Seldaek/monolog.git",
    2102                 "reference": "37308608e599f34a1a4845b16440047ec98a172a"
    2103             },
    2104             "dist": {
    2105                 "type": "zip",
    2106                 "url": "https://api.github.com/repos/Seldaek/monolog/zipball/37308608e599f34a1a4845b16440047ec98a172a",
    2107                 "reference": "37308608e599f34a1a4845b16440047ec98a172a",
    2108                 "shasum": ""
    2109             },
    2110             "require": {
    2111                 "php": ">=7.2",
    2112                 "psr/log": "^1.0.1 || ^2.0 || ^3.0"
    2113             },
    2114             "provide": {
    2115                 "psr/log-implementation": "1.0.0 || 2.0.0 || 3.0.0"
    2116             },
    2117             "require-dev": {
    2118                 "aws/aws-sdk-php": "^2.4.9 || ^3.0",
    2119                 "doctrine/couchdb": "~1.0@dev",
    2120                 "elasticsearch/elasticsearch": "^7 || ^8",
    2121                 "ext-json": "*",
    2122                 "graylog2/gelf-php": "^1.4.2 || ^2@dev",
    2123                 "guzzlehttp/guzzle": "^7.4",
    2124                 "guzzlehttp/psr7": "^2.2",
    2125                 "mongodb/mongodb": "^1.8 || ^2.0",
    2126                 "php-amqplib/php-amqplib": "~2.4 || ^3",
    2127                 "phpspec/prophecy": "^1.15",
    2128                 "phpstan/phpstan": "^1.10",
    2129                 "phpunit/phpunit": "^8.5.38 || ^9.6.19",
    2130                 "predis/predis": "^1.1 || ^2.0",
    2131                 "rollbar/rollbar": "^1.3 || ^2 || ^3",
    2132                 "ruflin/elastica": "^7",
    2133                 "swiftmailer/swiftmailer": "^5.3|^6.0",
    2134                 "symfony/mailer": "^5.4 || ^6",
    2135                 "symfony/mime": "^5.4 || ^6"
    2136             },
    2137             "suggest": {
    2138                 "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB",
    2139                 "doctrine/couchdb": "Allow sending log messages to a CouchDB server",
    2140                 "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client",
    2141                 "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)",
    2142                 "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler",
    2143                 "ext-mbstring": "Allow to work properly with unicode symbols",
    2144                 "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)",
    2145                 "ext-openssl": "Required to send log messages using SSL",
    2146                 "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)",
    2147                 "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server",
    2148                 "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)",
    2149                 "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib",
    2150                 "rollbar/rollbar": "Allow sending log messages to Rollbar",
    2151                 "ruflin/elastica": "Allow sending log messages to an Elastic Search server"
    2152             },
    2153             "type": "library",
    2154             "extra": {
    2155                 "branch-alias": {
    2156                     "dev-main": "2.x-dev"
    2157                 }
    2158             },
    2159             "autoload": {
    2160                 "psr-4": {
    2161                     "Monolog\\": "src/Monolog"
    2162                 }
    2163             },
    2164             "notification-url": "https://packagist.org/downloads/",
    2165             "license": [
    2166                 "MIT"
    2167             ],
    2168             "authors": [
    2169                 {
    2170                     "name": "Jordi Boggiano",
    2171                     "email": "j.boggiano@seld.be",
    2172                     "homepage": "https://seld.be"
    2173                 }
    2174             ],
    2175             "description": "Sends your logs to files, sockets, inboxes, databases and various web services",
    2176             "homepage": "https://github.com/Seldaek/monolog",
    2177             "keywords": [
    2178                 "log",
    2179                 "logging",
    2180                 "psr-3"
    2181             ],
    2182             "support": {
    2183                 "issues": "https://github.com/Seldaek/monolog/issues",
    2184                 "source": "https://github.com/Seldaek/monolog/tree/2.11.0"
    2185             },
    2186             "funding": [
    2187                 {
    2188                     "url": "https://github.com/Seldaek",
    2189                     "type": "github"
    2190                 },
    2191                 {
    2192                     "url": "https://tidelift.com/funding/github/packagist/monolog/monolog",
    2193                     "type": "tidelift"
    2194                 }
    2195             ],
    2196             "time": "2026-01-01T13:05:00+00:00"
    2197         },
    2198         {
    2199             "name": "myclabs/php-enum",
    2200             "version": "1.8.5",
    2201             "source": {
    2202                 "type": "git",
    2203                 "url": "https://github.com/myclabs/php-enum.git",
    2204                 "reference": "e7be26966b7398204a234f8673fdad5ac6277802"
    2205             },
    2206             "dist": {
    2207                 "type": "zip",
    2208                 "url": "https://api.github.com/repos/myclabs/php-enum/zipball/e7be26966b7398204a234f8673fdad5ac6277802",
    2209                 "reference": "e7be26966b7398204a234f8673fdad5ac6277802",
    2210                 "shasum": ""
    2211             },
    2212             "require": {
    2213                 "ext-json": "*",
    2214                 "php": "^7.3 || ^8.0"
    2215             },
    2216             "require-dev": {
    2217                 "phpunit/phpunit": "^9.5",
    2218                 "squizlabs/php_codesniffer": "1.*",
    2219                 "vimeo/psalm": "^4.6.2 || ^5.2"
    2220             },
    2221             "type": "library",
    2222             "autoload": {
    2223                 "psr-4": {
    2224                     "MyCLabs\\Enum\\": "src/"
    2225                 },
    2226                 "classmap": [
    2227                     "stubs/Stringable.php"
    2228                 ]
    2229             },
    2230             "notification-url": "https://packagist.org/downloads/",
    2231             "license": [
    2232                 "MIT"
    2233             ],
    2234             "authors": [
    2235                 {
    2236                     "name": "PHP Enum contributors",
    2237                     "homepage": "https://github.com/myclabs/php-enum/graphs/contributors"
    2238                 }
    2239             ],
    2240             "description": "PHP Enum implementation",
    2241             "homepage": "https://github.com/myclabs/php-enum",
    2242             "keywords": [
    2243                 "enum"
    2244             ],
    2245             "support": {
    2246                 "issues": "https://github.com/myclabs/php-enum/issues",
    2247                 "source": "https://github.com/myclabs/php-enum/tree/1.8.5"
    2248             },
    2249             "funding": [
    2250                 {
    2251                     "url": "https://github.com/mnapoli",
    2252                     "type": "github"
    2253                 },
    2254                 {
    2255                     "url": "https://tidelift.com/funding/github/packagist/myclabs/php-enum",
    2256                     "type": "tidelift"
    2257                 }
    2258             ],
    2259             "time": "2025-01-14T11:49:03+00:00"
    2260         },
    2261         {
    2262             "name": "nikic/php-parser",
    2263             "version": "v5.7.0",
    2264             "source": {
    2265                 "type": "git",
    2266                 "url": "https://github.com/nikic/PHP-Parser.git",
    2267                 "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82"
    2268             },
    2269             "dist": {
    2270                 "type": "zip",
    2271                 "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/dca41cd15c2ac9d055ad70dbfd011130757d1f82",
    2272                 "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82",
    2273                 "shasum": ""
    2274             },
    2275             "require": {
    2276                 "ext-ctype": "*",
    2277                 "ext-json": "*",
    2278                 "ext-tokenizer": "*",
    2279                 "php": ">=7.4"
    2280             },
    2281             "require-dev": {
    2282                 "ircmaxell/php-yacc": "^0.0.7",
    2283                 "phpunit/phpunit": "^9.0"
    2284             },
    2285             "bin": [
    2286                 "bin/php-parse"
    2287             ],
    2288             "type": "library",
    2289             "extra": {
    2290                 "branch-alias": {
    2291                     "dev-master": "5.x-dev"
    2292                 }
    2293             },
    2294             "autoload": {
    2295                 "psr-4": {
    2296                     "PhpParser\\": "lib/PhpParser"
    2297                 }
    2298             },
    2299             "notification-url": "https://packagist.org/downloads/",
    2300             "license": [
    2301                 "BSD-3-Clause"
    2302             ],
    2303             "authors": [
    2304                 {
    2305                     "name": "Nikita Popov"
    2306                 }
    2307             ],
    2308             "description": "A PHP parser written in PHP",
    2309             "keywords": [
    2310                 "parser",
    2311                 "php"
    2312             ],
    2313             "support": {
    2314                 "issues": "https://github.com/nikic/PHP-Parser/issues",
    2315                 "source": "https://github.com/nikic/PHP-Parser/tree/v5.7.0"
    2316             },
    2317             "time": "2025-12-06T11:56:16+00:00"
    2318         },
    2319         {
    2320             "name": "phpdocumentor/reflection-common",
    2321             "version": "2.2.0",
    2322             "source": {
    2323                 "type": "git",
    2324                 "url": "https://github.com/phpDocumentor/ReflectionCommon.git",
    2325                 "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b"
    2326             },
    2327             "dist": {
    2328                 "type": "zip",
    2329                 "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b",
    2330                 "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b",
    2331                 "shasum": ""
    2332             },
    2333             "require": {
    2334                 "php": "^7.2 || ^8.0"
    2335             },
    2336             "type": "library",
    2337             "extra": {
    2338                 "branch-alias": {
    2339                     "dev-2.x": "2.x-dev"
    2340                 }
    2341             },
    2342             "autoload": {
    2343                 "psr-4": {
    2344                     "phpDocumentor\\Reflection\\": "src/"
    2345                 }
    2346             },
    2347             "notification-url": "https://packagist.org/downloads/",
    2348             "license": [
    2349                 "MIT"
    2350             ],
    2351             "authors": [
    2352                 {
    2353                     "name": "Jaap van Otterdijk",
    2354                     "email": "opensource@ijaap.nl"
    2355                 }
    2356             ],
    2357             "description": "Common reflection classes used by phpdocumentor to reflect the code structure",
    2358             "homepage": "http://www.phpdoc.org",
    2359             "keywords": [
    2360                 "FQSEN",
    2361                 "phpDocumentor",
    2362                 "phpdoc",
    2363                 "reflection",
    2364                 "static analysis"
    2365             ],
    2366             "support": {
    2367                 "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues",
    2368                 "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x"
    2369             },
    2370             "time": "2020-06-27T09:03:43+00:00"
    2371         },
    2372         {
    2373             "name": "phpdocumentor/reflection-docblock",
    2374             "version": "5.6.7",
    2375             "source": {
    2376                 "type": "git",
    2377                 "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
    2378                 "reference": "31a105931bc8ffa3a123383829772e832fd8d903"
    2379             },
    2380             "dist": {
    2381                 "type": "zip",
    2382                 "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/31a105931bc8ffa3a123383829772e832fd8d903",
    2383                 "reference": "31a105931bc8ffa3a123383829772e832fd8d903",
    2384                 "shasum": ""
    2385             },
    2386             "require": {
    2387                 "doctrine/deprecations": "^1.1",
    2388                 "ext-filter": "*",
    2389                 "php": "^7.4 || ^8.0",
    2390                 "phpdocumentor/reflection-common": "^2.2",
    2391                 "phpdocumentor/type-resolver": "^1.7",
    2392                 "phpstan/phpdoc-parser": "^1.7|^2.0",
    2393                 "webmozart/assert": "^1.9.1 || ^2"
    2394             },
    2395             "require-dev": {
    2396                 "mockery/mockery": "~1.3.5 || ~1.6.0",
    2397                 "phpstan/extension-installer": "^1.1",
    2398                 "phpstan/phpstan": "^1.8",
    2399                 "phpstan/phpstan-mockery": "^1.1",
    2400                 "phpstan/phpstan-webmozart-assert": "^1.2",
    2401                 "phpunit/phpunit": "^9.5",
    2402                 "psalm/phar": "^5.26"
    2403             },
    2404             "type": "library",
    2405             "extra": {
    2406                 "branch-alias": {
    2407                     "dev-master": "5.x-dev"
    2408                 }
    2409             },
    2410             "autoload": {
    2411                 "psr-4": {
    2412                     "phpDocumentor\\Reflection\\": "src"
    2413                 }
    2414             },
    2415             "notification-url": "https://packagist.org/downloads/",
    2416             "license": [
    2417                 "MIT"
    2418             ],
    2419             "authors": [
    2420                 {
    2421                     "name": "Mike van Riel",
    2422                     "email": "me@mikevanriel.com"
    2423                 },
    2424                 {
    2425                     "name": "Jaap van Otterdijk",
    2426                     "email": "opensource@ijaap.nl"
    2427                 }
    2428             ],
    2429             "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
    2430             "support": {
    2431                 "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues",
    2432                 "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.6.7"
    2433             },
    2434             "time": "2026-03-18T20:47:46+00:00"
    2435         },
    2436         {
    2437             "name": "phpdocumentor/type-resolver",
    2438             "version": "1.7.4",
    2439             "source": {
    2440                 "type": "git",
    2441                 "url": "https://github.com/phpDocumentor/TypeResolver.git",
    2442                 "reference": "8430ca5c93b5b933ef1aaf8dd93f80d0c55d2349"
    2443             },
    2444             "dist": {
    2445                 "type": "zip",
    2446                 "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/8430ca5c93b5b933ef1aaf8dd93f80d0c55d2349",
    2447                 "reference": "8430ca5c93b5b933ef1aaf8dd93f80d0c55d2349",
    2448                 "shasum": ""
    2449             },
    2450             "require": {
    2451                 "doctrine/deprecations": "^1.0",
    2452                 "php": "^7.4 || ^8.0",
    2453                 "phpdocumentor/reflection-common": "^2.0",
    2454                 "phpstan/phpdoc-parser": "^1.13"
    2455             },
    2456             "require-dev": {
    2457                 "ext-tokenizer": "*",
    2458                 "phpbench/phpbench": "^1.2",
    2459                 "phpstan/extension-installer": "^1.1",
    2460                 "phpstan/phpstan": "^1.8",
    2461                 "phpstan/phpstan-phpunit": "^1.1",
    2462                 "phpunit/phpunit": "^9.5",
    2463                 "rector/rector": "^0.13.9",
    2464                 "vimeo/psalm": "^4.25"
    2465             },
    2466             "type": "library",
    2467             "extra": {
    2468                 "branch-alias": {
    2469                     "dev-1.x": "1.x-dev"
    2470                 }
    2471             },
    2472             "autoload": {
    2473                 "psr-4": {
    2474                     "phpDocumentor\\Reflection\\": "src"
    2475                 }
    2476             },
    2477             "notification-url": "https://packagist.org/downloads/",
    2478             "license": [
    2479                 "MIT"
    2480             ],
    2481             "authors": [
    2482                 {
    2483                     "name": "Mike van Riel",
    2484                     "email": "me@mikevanriel.com"
    2485                 }
    2486             ],
    2487             "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names",
    2488             "support": {
    2489                 "issues": "https://github.com/phpDocumentor/TypeResolver/issues",
    2490                 "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.7.4"
    2491             },
    2492             "time": "2024-01-11T11:21:11+00:00"
    2493         },
    2494         {
    2495             "name": "phpstan/phpdoc-parser",
    2496             "version": "1.33.0",
    2497             "source": {
    2498                 "type": "git",
    2499                 "url": "https://github.com/phpstan/phpdoc-parser.git",
    2500                 "reference": "82a311fd3690fb2bf7b64d5c98f912b3dd746140"
    2501             },
    2502             "dist": {
    2503                 "type": "zip",
    2504                 "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/82a311fd3690fb2bf7b64d5c98f912b3dd746140",
    2505                 "reference": "82a311fd3690fb2bf7b64d5c98f912b3dd746140",
    2506                 "shasum": ""
    2507             },
    2508             "require": {
    2509                 "php": "^7.2 || ^8.0"
    2510             },
    2511             "require-dev": {
    2512                 "doctrine/annotations": "^2.0",
    2513                 "nikic/php-parser": "^4.15",
    2514                 "php-parallel-lint/php-parallel-lint": "^1.2",
    2515                 "phpstan/extension-installer": "^1.0",
    2516                 "phpstan/phpstan": "^1.5",
    2517                 "phpstan/phpstan-phpunit": "^1.1",
    2518                 "phpstan/phpstan-strict-rules": "^1.0",
    2519                 "phpunit/phpunit": "^9.5",
    2520                 "symfony/process": "^5.2"
    2521             },
    2522             "type": "library",
    2523             "autoload": {
    2524                 "psr-4": {
    2525                     "PHPStan\\PhpDocParser\\": [
    2526                         "src/"
    2527                     ]
    2528                 }
    2529             },
    2530             "notification-url": "https://packagist.org/downloads/",
    2531             "license": [
    2532                 "MIT"
    2533             ],
    2534             "description": "PHPDoc parser with support for nullable, intersection and generic types",
    2535             "support": {
    2536                 "issues": "https://github.com/phpstan/phpdoc-parser/issues",
    2537                 "source": "https://github.com/phpstan/phpdoc-parser/tree/1.33.0"
    2538             },
    2539             "time": "2024-10-13T11:25:22+00:00"
    2540         },
    2541         {
    2542             "name": "pimple/pimple",
    2543             "version": "v3.6.2",
    2544             "source": {
    2545                 "type": "git",
    2546                 "url": "https://github.com/silexphp/Pimple.git",
    2547                 "reference": "8cfe7f74ac22a433d303914eba9ea4c2a834edce"
    2548             },
    2549             "dist": {
    2550                 "type": "zip",
    2551                 "url": "https://api.github.com/repos/silexphp/Pimple/zipball/8cfe7f74ac22a433d303914eba9ea4c2a834edce",
    2552                 "reference": "8cfe7f74ac22a433d303914eba9ea4c2a834edce",
    2553                 "shasum": ""
    2554             },
    2555             "require": {
    2556                 "php": ">=7.2.5",
    2557                 "psr/container": "^1.1 || ^2.0"
    2558             },
    2559             "require-dev": {
    2560                 "phpunit/phpunit": "*"
    2561             },
    2562             "type": "library",
    2563             "extra": {
    2564                 "branch-alias": {
    2565                     "dev-master": "3.x-dev"
    2566                 }
    2567             },
    2568             "autoload": {
    2569                 "psr-0": {
    2570                     "Pimple": "src/"
    2571                 }
    2572             },
    2573             "notification-url": "https://packagist.org/downloads/",
    2574             "license": [
    2575                 "MIT"
    2576             ],
    2577             "authors": [
    2578                 {
    2579                     "name": "Fabien Potencier",
    2580                     "email": "fabien@symfony.com"
    2581                 }
    2582             ],
    2583             "description": "Pimple, a simple Dependency Injection Container",
    2584             "homepage": "https://pimple.symfony.com",
    2585             "keywords": [
    2586                 "container",
    2587                 "dependency injection"
    2588             ],
    2589             "support": {
    2590                 "source": "https://github.com/silexphp/Pimple/tree/v3.6.2"
    2591             },
    2592             "time": "2026-02-26T08:23:44+00:00"
    2593         },
    2594         {
    2595             "name": "psr/cache",
    2596             "version": "1.0.1",
    2597             "source": {
    2598                 "type": "git",
    2599                 "url": "https://github.com/php-fig/cache.git",
    2600                 "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8"
    2601             },
    2602             "dist": {
    2603                 "type": "zip",
    2604                 "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8",
    2605                 "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8",
    2606                 "shasum": ""
    2607             },
    2608             "require": {
    2609                 "php": ">=5.3.0"
    2610             },
    2611             "type": "library",
    2612             "extra": {
    2613                 "branch-alias": {
    2614                     "dev-master": "1.0.x-dev"
    2615                 }
    2616             },
    2617             "autoload": {
    2618                 "psr-4": {
    2619                     "Psr\\Cache\\": "src/"
    2620                 }
    2621             },
    2622             "notification-url": "https://packagist.org/downloads/",
    2623             "license": [
    2624                 "MIT"
    2625             ],
    2626             "authors": [
    2627                 {
    2628                     "name": "PHP-FIG",
    2629                     "homepage": "http://www.php-fig.org/"
    2630                 }
    2631             ],
    2632             "description": "Common interface for caching libraries",
    2633             "keywords": [
    2634                 "cache",
    2635                 "psr",
    2636                 "psr-6"
    2637             ],
    2638             "support": {
    2639                 "source": "https://github.com/php-fig/cache/tree/master"
    2640             },
    2641             "time": "2016-08-06T20:24:11+00:00"
    2642         },
    2643         {
    2644             "name": "psr/container",
    2645             "version": "1.1.2",
    2646             "source": {
    2647                 "type": "git",
    2648                 "url": "https://github.com/php-fig/container.git",
    2649                 "reference": "513e0666f7216c7459170d56df27dfcefe1689ea"
    2650             },
    2651             "dist": {
    2652                 "type": "zip",
    2653                 "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea",
    2654                 "reference": "513e0666f7216c7459170d56df27dfcefe1689ea",
    2655                 "shasum": ""
    2656             },
    2657             "require": {
    2658                 "php": ">=7.4.0"
    2659             },
    2660             "type": "library",
    2661             "autoload": {
    2662                 "psr-4": {
    2663                     "Psr\\Container\\": "src/"
    2664                 }
    2665             },
    2666             "notification-url": "https://packagist.org/downloads/",
    2667             "license": [
    2668                 "MIT"
    2669             ],
    2670             "authors": [
    2671                 {
    2672                     "name": "PHP-FIG",
    2673                     "homepage": "https://www.php-fig.org/"
    2674                 }
    2675             ],
    2676             "description": "Common Container Interface (PHP FIG PSR-11)",
    2677             "homepage": "https://github.com/php-fig/container",
    2678             "keywords": [
    2679                 "PSR-11",
    2680                 "container",
    2681                 "container-interface",
    2682                 "container-interop",
    2683                 "psr"
    2684             ],
    2685             "support": {
    2686                 "issues": "https://github.com/php-fig/container/issues",
    2687                 "source": "https://github.com/php-fig/container/tree/1.1.2"
    2688             },
    2689             "time": "2021-11-05T16:50:12+00:00"
    2690         },
    2691         {
    2692             "name": "psr/log",
    2693             "version": "1.1.4",
    2694             "source": {
    2695                 "type": "git",
    2696                 "url": "https://github.com/php-fig/log.git",
    2697                 "reference": "d49695b909c3b7628b6289db5479a1c204601f11"
    2698             },
    2699             "dist": {
    2700                 "type": "zip",
    2701                 "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11",
    2702                 "reference": "d49695b909c3b7628b6289db5479a1c204601f11",
    2703                 "shasum": ""
    2704             },
    2705             "require": {
    2706                 "php": ">=5.3.0"
    2707             },
    2708             "type": "library",
    2709             "extra": {
    2710                 "branch-alias": {
    2711                     "dev-master": "1.1.x-dev"
    2712                 }
    2713             },
    2714             "autoload": {
    2715                 "psr-4": {
    2716                     "Psr\\Log\\": "Psr/Log/"
    2717                 }
    2718             },
    2719             "notification-url": "https://packagist.org/downloads/",
    2720             "license": [
    2721                 "MIT"
    2722             ],
    2723             "authors": [
    2724                 {
    2725                     "name": "PHP-FIG",
    2726                     "homepage": "https://www.php-fig.org/"
    2727                 }
    2728             ],
    2729             "description": "Common interface for logging libraries",
    2730             "homepage": "https://github.com/php-fig/log",
    2731             "keywords": [
    2732                 "log",
    2733                 "psr",
    2734                 "psr-3"
    2735             ],
    2736             "support": {
    2737                 "source": "https://github.com/php-fig/log/tree/1.1.4"
    2738             },
    2739             "time": "2021-05-03T11:20:27+00:00"
    2740         },
    2741         {
    2742             "name": "psr/simple-cache",
    2743             "version": "1.0.1",
    2744             "source": {
    2745                 "type": "git",
    2746                 "url": "https://github.com/php-fig/simple-cache.git",
    2747                 "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b"
    2748             },
    2749             "dist": {
    2750                 "type": "zip",
    2751                 "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b",
    2752                 "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b",
    2753                 "shasum": ""
    2754             },
    2755             "require": {
    2756                 "php": ">=5.3.0"
    2757             },
    2758             "type": "library",
    2759             "extra": {
    2760                 "branch-alias": {
    2761                     "dev-master": "1.0.x-dev"
    2762                 }
    2763             },
    2764             "autoload": {
    2765                 "psr-4": {
    2766                     "Psr\\SimpleCache\\": "src/"
    2767                 }
    2768             },
    2769             "notification-url": "https://packagist.org/downloads/",
    2770             "license": [
    2771                 "MIT"
    2772             ],
    2773             "authors": [
    2774                 {
    2775                     "name": "PHP-FIG",
    2776                     "homepage": "http://www.php-fig.org/"
    2777                 }
    2778             ],
    2779             "description": "Common interfaces for simple caching",
    2780             "keywords": [
    2781                 "cache",
    2782                 "caching",
    2783                 "psr",
    2784                 "psr-16",
    2785                 "simple-cache"
    2786             ],
    2787             "support": {
    2788                 "source": "https://github.com/php-fig/simple-cache/tree/master"
    2789             },
    2790             "time": "2017-10-23T01:57:42+00:00"
    2791         },
    2792         {
    2793             "name": "react/promise",
    2794             "version": "v3.3.0",
    2795             "source": {
    2796                 "type": "git",
    2797                 "url": "https://github.com/reactphp/promise.git",
    2798                 "reference": "23444f53a813a3296c1368bb104793ce8d88f04a"
    2799             },
    2800             "dist": {
    2801                 "type": "zip",
    2802                 "url": "https://api.github.com/repos/reactphp/promise/zipball/23444f53a813a3296c1368bb104793ce8d88f04a",
    2803                 "reference": "23444f53a813a3296c1368bb104793ce8d88f04a",
    2804                 "shasum": ""
    2805             },
    2806             "require": {
    2807                 "php": ">=7.1.0"
    2808             },
    2809             "require-dev": {
    2810                 "phpstan/phpstan": "1.12.28 || 1.4.10",
    2811                 "phpunit/phpunit": "^9.6 || ^7.5"
    2812             },
    2813             "type": "library",
    2814             "autoload": {
    2815                 "files": [
    2816                     "src/functions_include.php"
    2817                 ],
    2818                 "psr-4": {
    2819                     "React\\Promise\\": "src/"
    2820                 }
    2821             },
    2822             "notification-url": "https://packagist.org/downloads/",
    2823             "license": [
    2824                 "MIT"
    2825             ],
    2826             "authors": [
    2827                 {
    2828                     "name": "Jan Sorgalla",
    2829                     "email": "jsorgalla@gmail.com",
    2830                     "homepage": "https://sorgalla.com/"
    2831                 },
    2832                 {
    2833                     "name": "Christian Lück",
    2834                     "email": "christian@clue.engineering",
    2835                     "homepage": "https://clue.engineering/"
    2836                 },
    2837                 {
    2838                     "name": "Cees-Jan Kiewiet",
    2839                     "email": "reactphp@ceesjankiewiet.nl",
    2840                     "homepage": "https://wyrihaximus.net/"
    2841                 },
    2842                 {
    2843                     "name": "Chris Boden",
    2844                     "email": "cboden@gmail.com",
    2845                     "homepage": "https://cboden.dev/"
    2846                 }
    2847             ],
    2848             "description": "A lightweight implementation of CommonJS Promises/A for PHP",
    2849             "keywords": [
    2850                 "promise",
    2851                 "promises"
    2852             ],
    2853             "support": {
    2854                 "issues": "https://github.com/reactphp/promise/issues",
    2855                 "source": "https://github.com/reactphp/promise/tree/v3.3.0"
    2856             },
    2857             "funding": [
    2858                 {
    2859                     "url": "https://opencollective.com/reactphp",
    2860                     "type": "open_collective"
    2861                 }
    2862             ],
    2863             "time": "2025-08-19T18:57:03+00:00"
    2864         },
    2865         {
    2866             "name": "seld/jsonlint",
    2867             "version": "1.11.0",
    2868             "source": {
    2869                 "type": "git",
    2870                 "url": "https://github.com/Seldaek/jsonlint.git",
    2871                 "reference": "1748aaf847fc731cfad7725aec413ee46f0cc3a2"
    2872             },
    2873             "dist": {
    2874                 "type": "zip",
    2875                 "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/1748aaf847fc731cfad7725aec413ee46f0cc3a2",
    2876                 "reference": "1748aaf847fc731cfad7725aec413ee46f0cc3a2",
    2877                 "shasum": ""
    2878             },
    2879             "require": {
    2880                 "php": "^5.3 || ^7.0 || ^8.0"
    2881             },
    2882             "require-dev": {
    2883                 "phpstan/phpstan": "^1.11",
    2884                 "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0 || ^8.5.13"
    2885             },
    2886             "bin": [
    2887                 "bin/jsonlint"
    2888             ],
    2889             "type": "library",
    2890             "autoload": {
    2891                 "psr-4": {
    2892                     "Seld\\JsonLint\\": "src/Seld/JsonLint/"
    2893                 }
    2894             },
    2895             "notification-url": "https://packagist.org/downloads/",
    2896             "license": [
    2897                 "MIT"
    2898             ],
    2899             "authors": [
    2900                 {
    2901                     "name": "Jordi Boggiano",
    2902                     "email": "j.boggiano@seld.be",
    2903                     "homepage": "https://seld.be"
    2904                 }
    2905             ],
    2906             "description": "JSON Linter",
    2907             "keywords": [
    2908                 "json",
    2909                 "linter",
    2910                 "parser",
    2911                 "validator"
    2912             ],
    2913             "support": {
    2914                 "issues": "https://github.com/Seldaek/jsonlint/issues",
    2915                 "source": "https://github.com/Seldaek/jsonlint/tree/1.11.0"
    2916             },
    2917             "funding": [
    2918                 {
    2919                     "url": "https://github.com/Seldaek",
    2920                     "type": "github"
    2921                 },
    2922                 {
    2923                     "url": "https://tidelift.com/funding/github/packagist/seld/jsonlint",
    2924                     "type": "tidelift"
    2925                 }
    2926             ],
    2927             "time": "2024-07-11T14:55:45+00:00"
    2928         },
    2929         {
    2930             "name": "seld/phar-utils",
    2931             "version": "1.2.1",
    2932             "source": {
    2933                 "type": "git",
    2934                 "url": "https://github.com/Seldaek/phar-utils.git",
    2935                 "reference": "ea2f4014f163c1be4c601b9b7bd6af81ba8d701c"
    2936             },
    2937             "dist": {
    2938                 "type": "zip",
    2939                 "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/ea2f4014f163c1be4c601b9b7bd6af81ba8d701c",
    2940                 "reference": "ea2f4014f163c1be4c601b9b7bd6af81ba8d701c",
    2941                 "shasum": ""
    2942             },
    2943             "require": {
    2944                 "php": ">=5.3"
    2945             },
    2946             "type": "library",
    2947             "extra": {
    2948                 "branch-alias": {
    2949                     "dev-master": "1.x-dev"
    2950                 }
    2951             },
    2952             "autoload": {
    2953                 "psr-4": {
    2954                     "Seld\\PharUtils\\": "src/"
    2955                 }
    2956             },
    2957             "notification-url": "https://packagist.org/downloads/",
    2958             "license": [
    2959                 "MIT"
    2960             ],
    2961             "authors": [
    2962                 {
    2963                     "name": "Jordi Boggiano",
    2964                     "email": "j.boggiano@seld.be"
    2965                 }
    2966             ],
    2967             "description": "PHAR file format utilities, for when PHP phars you up",
    2968             "keywords": [
    2969                 "phar"
    2970             ],
    2971             "support": {
    2972                 "issues": "https://github.com/Seldaek/phar-utils/issues",
    2973                 "source": "https://github.com/Seldaek/phar-utils/tree/1.2.1"
    2974             },
    2975             "time": "2022-08-31T10:31:18+00:00"
    2976         },
    2977         {
    2978             "name": "seld/signal-handler",
    2979             "version": "2.0.2",
    2980             "source": {
    2981                 "type": "git",
    2982                 "url": "https://github.com/Seldaek/signal-handler.git",
    2983                 "reference": "04a6112e883ad76c0ada8e4a9f7520bbfdb6bb98"
    2984             },
    2985             "dist": {
    2986                 "type": "zip",
    2987                 "url": "https://api.github.com/repos/Seldaek/signal-handler/zipball/04a6112e883ad76c0ada8e4a9f7520bbfdb6bb98",
    2988                 "reference": "04a6112e883ad76c0ada8e4a9f7520bbfdb6bb98",
    2989                 "shasum": ""
    2990             },
    2991             "require": {
    2992                 "php": ">=7.2.0"
    2993             },
    2994             "require-dev": {
    2995                 "phpstan/phpstan": "^1",
    2996                 "phpstan/phpstan-deprecation-rules": "^1.0",
    2997                 "phpstan/phpstan-phpunit": "^1",
    2998                 "phpstan/phpstan-strict-rules": "^1.3",
    2999                 "phpunit/phpunit": "^7.5.20 || ^8.5.23",
    3000                 "psr/log": "^1 || ^2 || ^3"
    3001             },
    3002             "type": "library",
    3003             "extra": {
    3004                 "branch-alias": {
    3005                     "dev-main": "2.x-dev"
    3006                 }
    3007             },
    3008             "autoload": {
    3009                 "psr-4": {
    3010                     "Seld\\Signal\\": "src/"
    3011                 }
    3012             },
    3013             "notification-url": "https://packagist.org/downloads/",
    3014             "license": [
    3015                 "MIT"
    3016             ],
    3017             "authors": [
    3018                 {
    3019                     "name": "Jordi Boggiano",
    3020                     "email": "j.boggiano@seld.be",
    3021                     "homepage": "http://seld.be"
    3022                 }
    3023             ],
    3024             "description": "Simple unix signal handler that silently fails where signals are not supported for easy cross-platform development",
    3025             "keywords": [
    3026                 "posix",
    3027                 "sigint",
    3028                 "signal",
    3029                 "sigterm",
    3030                 "unix"
    3031             ],
    3032             "support": {
    3033                 "issues": "https://github.com/Seldaek/signal-handler/issues",
    3034                 "source": "https://github.com/Seldaek/signal-handler/tree/2.0.2"
    3035             },
    3036             "time": "2023-09-03T09:24:00+00:00"
    3037         },
    3038         {
    3039             "name": "symfony/cache",
    3040             "version": "v5.4.53",
    3041             "source": {
    3042                 "type": "git",
    3043                 "url": "https://github.com/symfony/cache.git",
    3044                 "reference": "bf581474737420d5c932ae80b868e253f465ee5b"
    3045             },
    3046             "dist": {
    3047                 "type": "zip",
    3048                 "url": "https://api.github.com/repos/symfony/cache/zipball/bf581474737420d5c932ae80b868e253f465ee5b",
    3049                 "reference": "bf581474737420d5c932ae80b868e253f465ee5b",
    3050                 "shasum": ""
    3051             },
    3052             "require": {
    3053                 "php": ">=7.2.5",
    3054                 "psr/cache": "^1.0|^2.0",
    3055                 "psr/log": "^1.1|^2|^3",
    3056                 "symfony/cache-contracts": "^1.1.7|^2",
    3057                 "symfony/deprecation-contracts": "^2.1|^3",
    3058                 "symfony/polyfill-php73": "^1.9",
    3059                 "symfony/polyfill-php80": "^1.16",
    3060                 "symfony/service-contracts": "^1.1|^2|^3",
    3061                 "symfony/var-exporter": "^4.4|^5.0|^6.0"
    3062             },
    3063             "conflict": {
    3064                 "doctrine/dbal": "<2.13.1",
    3065                 "symfony/dependency-injection": "<4.4",
    3066                 "symfony/http-kernel": "<4.4",
    3067                 "symfony/var-dumper": "<4.4"
    3068             },
    3069             "provide": {
    3070                 "psr/cache-implementation": "1.0|2.0",
    3071                 "psr/simple-cache-implementation": "1.0|2.0",
    3072                 "symfony/cache-implementation": "1.0|2.0"
    3073             },
    3074             "require-dev": {
    3075                 "cache/integration-tests": "dev-master",
    3076                 "doctrine/cache": "^1.6|^2.0",
    3077                 "doctrine/dbal": "^2.13.1|^3|^4",
    3078                 "predis/predis": "^1.1|^2.0",
    3079                 "psr/simple-cache": "^1.0|^2.0",
    3080                 "symfony/config": "^4.4|^5.0|^6.0",
    3081                 "symfony/dependency-injection": "^4.4|^5.0|^6.0",
    3082                 "symfony/filesystem": "^4.4|^5.0|^6.0",
    3083                 "symfony/http-kernel": "^4.4|^5.0|^6.0",
    3084                 "symfony/messenger": "^4.4|^5.0|^6.0",
    3085                 "symfony/var-dumper": "^4.4|^5.0|^6.0"
    3086             },
    3087             "type": "library",
    3088             "autoload": {
    3089                 "psr-4": {
    3090                     "Symfony\\Component\\Cache\\": ""
    3091                 },
    3092                 "exclude-from-classmap": [
    3093                     "/Tests/"
    3094                 ]
    3095             },
    3096             "notification-url": "https://packagist.org/downloads/",
    3097             "license": [
    3098                 "MIT"
    3099             ],
    3100             "authors": [
    3101                 {
    3102                     "name": "Nicolas Grekas",
    3103                     "email": "p@tchwork.com"
    3104                 },
    3105                 {
    3106                     "name": "Symfony Community",
    3107                     "homepage": "https://symfony.com/contributors"
    3108                 }
    3109             ],
    3110             "description": "Provides extended PSR-6, PSR-16 (and tags) implementations",
    3111             "homepage": "https://symfony.com",
    3112             "keywords": [
    3113                 "caching",
    3114                 "psr6"
    3115             ],
    3116             "support": {
    3117                 "source": "https://github.com/symfony/cache/tree/v5.4.53"
    3118             },
    3119             "funding": [
    3120                 {
    3121                     "url": "https://symfony.com/sponsor",
    3122                     "type": "custom"
    3123                 },
    3124                 {
    3125                     "url": "https://github.com/fabpot",
    3126                     "type": "github"
    3127                 },
    3128                 {
    3129                     "url": "https://github.com/nicolas-grekas",
    3130                     "type": "github"
    3131                 },
    3132                 {
    3133                     "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
    3134                     "type": "tidelift"
    3135                 }
    3136             ],
    3137             "time": "2026-05-24T08:41:21+00:00"
    3138         },
    3139         {
    3140             "name": "symfony/cache-contracts",
    3141             "version": "v2.5.4",
    3142             "source": {
    3143                 "type": "git",
    3144                 "url": "https://github.com/symfony/cache-contracts.git",
    3145                 "reference": "517c3a3619dadfa6952c4651767fcadffb4df65e"
    3146             },
    3147             "dist": {
    3148                 "type": "zip",
    3149                 "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/517c3a3619dadfa6952c4651767fcadffb4df65e",
    3150                 "reference": "517c3a3619dadfa6952c4651767fcadffb4df65e",
    3151                 "shasum": ""
    3152             },
    3153             "require": {
    3154                 "php": ">=7.2.5",
    3155                 "psr/cache": "^1.0|^2.0|^3.0"
    3156             },
    3157             "suggest": {
    3158                 "symfony/cache-implementation": ""
    3159             },
    3160             "type": "library",
    3161             "extra": {
    3162                 "thanks": {
    3163                     "url": "https://github.com/symfony/contracts",
    3164                     "name": "symfony/contracts"
    3165                 },
    3166                 "branch-alias": {
    3167                     "dev-main": "2.5-dev"
    3168                 }
    3169             },
    3170             "autoload": {
    3171                 "psr-4": {
    3172                     "Symfony\\Contracts\\Cache\\": ""
    3173                 }
    3174             },
    3175             "notification-url": "https://packagist.org/downloads/",
    3176             "license": [
    3177                 "MIT"
    3178             ],
    3179             "authors": [
    3180                 {
    3181                     "name": "Nicolas Grekas",
    3182                     "email": "p@tchwork.com"
    3183                 },
    3184                 {
    3185                     "name": "Symfony Community",
    3186                     "homepage": "https://symfony.com/contributors"
    3187                 }
    3188             ],
    3189             "description": "Generic abstractions related to caching",
    3190             "homepage": "https://symfony.com",
    3191             "keywords": [
    3192                 "abstractions",
    3193                 "contracts",
    3194                 "decoupling",
    3195                 "interfaces",
    3196                 "interoperability",
    3197                 "standards"
    3198             ],
    3199             "support": {
    3200                 "source": "https://github.com/symfony/cache-contracts/tree/v2.5.4"
    3201             },
    3202             "funding": [
    3203                 {
    3204                     "url": "https://symfony.com/sponsor",
    3205                     "type": "custom"
    3206                 },
    3207                 {
    3208                     "url": "https://github.com/fabpot",
    3209                     "type": "github"
    3210                 },
    3211                 {
    3212                     "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
    3213                     "type": "tidelift"
    3214                 }
    3215             ],
    3216             "time": "2024-09-25T14:11:13+00:00"
    3217         },
    3218         {
    3219             "name": "symfony/console",
    3220             "version": "v5.4.47",
    3221             "source": {
    3222                 "type": "git",
    3223                 "url": "https://github.com/symfony/console.git",
    3224                 "reference": "c4ba980ca61a9eb18ee6bcc73f28e475852bb1ed"
    3225             },
    3226             "dist": {
    3227                 "type": "zip",
    3228                 "url": "https://api.github.com/repos/symfony/console/zipball/c4ba980ca61a9eb18ee6bcc73f28e475852bb1ed",
    3229                 "reference": "c4ba980ca61a9eb18ee6bcc73f28e475852bb1ed",
    3230                 "shasum": ""
    3231             },
    3232             "require": {
    3233                 "php": ">=7.2.5",
    3234                 "symfony/deprecation-contracts": "^2.1|^3",
    3235                 "symfony/polyfill-mbstring": "~1.0",
    3236                 "symfony/polyfill-php73": "^1.9",
    3237                 "symfony/polyfill-php80": "^1.16",
    3238                 "symfony/service-contracts": "^1.1|^2|^3",
    3239                 "symfony/string": "^5.1|^6.0"
    3240             },
    3241             "conflict": {
    3242                 "psr/log": ">=3",
    3243                 "symfony/dependency-injection": "<4.4",
    3244                 "symfony/dotenv": "<5.1",
    3245                 "symfony/event-dispatcher": "<4.4",
    3246                 "symfony/lock": "<4.4",
    3247                 "symfony/process": "<4.4"
    3248             },
    3249             "provide": {
    3250                 "psr/log-implementation": "1.0|2.0"
    3251             },
    3252             "require-dev": {
    3253                 "psr/log": "^1|^2",
    3254                 "symfony/config": "^4.4|^5.0|^6.0",
    3255                 "symfony/dependency-injection": "^4.4|^5.0|^6.0",
    3256                 "symfony/event-dispatcher": "^4.4|^5.0|^6.0",
    3257                 "symfony/lock": "^4.4|^5.0|^6.0",
    3258                 "symfony/process": "^4.4|^5.0|^6.0",
    3259                 "symfony/var-dumper": "^4.4|^5.0|^6.0"
    3260             },
    3261             "suggest": {
    3262                 "psr/log": "For using the console logger",
    3263                 "symfony/event-dispatcher": "",
    3264                 "symfony/lock": "",
    3265                 "symfony/process": ""
    3266             },
    3267             "type": "library",
    3268             "autoload": {
    3269                 "psr-4": {
    3270                     "Symfony\\Component\\Console\\": ""
    3271                 },
    3272                 "exclude-from-classmap": [
    3273                     "/Tests/"
    3274                 ]
    3275             },
    3276             "notification-url": "https://packagist.org/downloads/",
    3277             "license": [
    3278                 "MIT"
    3279             ],
    3280             "authors": [
    3281                 {
    3282                     "name": "Fabien Potencier",
    3283                     "email": "fabien@symfony.com"
    3284                 },
    3285                 {
    3286                     "name": "Symfony Community",
    3287                     "homepage": "https://symfony.com/contributors"
    3288                 }
    3289             ],
    3290             "description": "Eases the creation of beautiful and testable command line interfaces",
    3291             "homepage": "https://symfony.com",
    3292             "keywords": [
    3293                 "cli",
    3294                 "command-line",
    3295                 "console",
    3296                 "terminal"
    3297             ],
    3298             "support": {
    3299                 "source": "https://github.com/symfony/console/tree/v5.4.47"
    3300             },
    3301             "funding": [
    3302                 {
    3303                     "url": "https://symfony.com/sponsor",
    3304                     "type": "custom"
    3305                 },
    3306                 {
    3307                     "url": "https://github.com/fabpot",
    3308                     "type": "github"
    3309                 },
    3310                 {
    3311                     "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
    3312                     "type": "tidelift"
    3313                 }
    3314             ],
    3315             "time": "2024-11-06T11:30:55+00:00"
    3316         },
    3317         {
    3318             "name": "symfony/filesystem",
    3319             "version": "v5.4.45",
    3320             "source": {
    3321                 "type": "git",
    3322                 "url": "https://github.com/symfony/filesystem.git",
    3323                 "reference": "57c8294ed37d4a055b77057827c67f9558c95c54"
    3324             },
    3325             "dist": {
    3326                 "type": "zip",
    3327                 "url": "https://api.github.com/repos/symfony/filesystem/zipball/57c8294ed37d4a055b77057827c67f9558c95c54",
    3328                 "reference": "57c8294ed37d4a055b77057827c67f9558c95c54",
    3329                 "shasum": ""
    3330             },
    3331             "require": {
    3332                 "php": ">=7.2.5",
    3333                 "symfony/polyfill-ctype": "~1.8",
    3334                 "symfony/polyfill-mbstring": "~1.8",
    3335                 "symfony/polyfill-php80": "^1.16"
    3336             },
    3337             "require-dev": {
    3338                 "symfony/process": "^5.4|^6.4"
    3339             },
    3340             "type": "library",
    3341             "autoload": {
    3342                 "psr-4": {
    3343                     "Symfony\\Component\\Filesystem\\": ""
    3344                 },
    3345                 "exclude-from-classmap": [
    3346                     "/Tests/"
    3347                 ]
    3348             },
    3349             "notification-url": "https://packagist.org/downloads/",
    3350             "license": [
    3351                 "MIT"
    3352             ],
    3353             "authors": [
    3354                 {
    3355                     "name": "Fabien Potencier",
    3356                     "email": "fabien@symfony.com"
    3357                 },
    3358                 {
    3359                     "name": "Symfony Community",
    3360                     "homepage": "https://symfony.com/contributors"
    3361                 }
    3362             ],
    3363             "description": "Provides basic utilities for the filesystem",
    3364             "homepage": "https://symfony.com",
    3365             "support": {
    3366                 "source": "https://github.com/symfony/filesystem/tree/v5.4.45"
    3367             },
    3368             "funding": [
    3369                 {
    3370                     "url": "https://symfony.com/sponsor",
    3371                     "type": "custom"
    3372                 },
    3373                 {
    3374                     "url": "https://github.com/fabpot",
    3375                     "type": "github"
    3376                 },
    3377                 {
    3378                     "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
    3379                     "type": "tidelift"
    3380                 }
    3381             ],
    3382             "time": "2024-10-22T13:05:35+00:00"
    3383         },
    3384         {
    3385             "name": "symfony/finder",
    3386             "version": "v5.4.45",
    3387             "source": {
    3388                 "type": "git",
    3389                 "url": "https://github.com/symfony/finder.git",
    3390                 "reference": "63741784cd7b9967975eec610b256eed3ede022b"
    3391             },
    3392             "dist": {
    3393                 "type": "zip",
    3394                 "url": "https://api.github.com/repos/symfony/finder/zipball/63741784cd7b9967975eec610b256eed3ede022b",
    3395                 "reference": "63741784cd7b9967975eec610b256eed3ede022b",
    3396                 "shasum": ""
    3397             },
    3398             "require": {
    3399                 "php": ">=7.2.5",
    3400                 "symfony/deprecation-contracts": "^2.1|^3",
    3401                 "symfony/polyfill-php80": "^1.16"
    3402             },
    3403             "type": "library",
    3404             "autoload": {
    3405                 "psr-4": {
    3406                     "Symfony\\Component\\Finder\\": ""
    3407                 },
    3408                 "exclude-from-classmap": [
    3409                     "/Tests/"
    3410                 ]
    3411             },
    3412             "notification-url": "https://packagist.org/downloads/",
    3413             "license": [
    3414                 "MIT"
    3415             ],
    3416             "authors": [
    3417                 {
    3418                     "name": "Fabien Potencier",
    3419                     "email": "fabien@symfony.com"
    3420                 },
    3421                 {
    3422                     "name": "Symfony Community",
    3423                     "homepage": "https://symfony.com/contributors"
    3424                 }
    3425             ],
    3426             "description": "Finds files and directories via an intuitive fluent interface",
    3427             "homepage": "https://symfony.com",
    3428             "support": {
    3429                 "source": "https://github.com/symfony/finder/tree/v5.4.45"
    3430             },
    3431             "funding": [
    3432                 {
    3433                     "url": "https://symfony.com/sponsor",
    3434                     "type": "custom"
    3435                 },
    3436                 {
    3437                     "url": "https://github.com/fabpot",
    3438                     "type": "github"
    3439                 },
    3440                 {
    3441                     "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
    3442                     "type": "tidelift"
    3443                 }
    3444             ],
    3445             "time": "2024-09-28T13:32:08+00:00"
    3446         },
    3447         {
    3448             "name": "symfony/polyfill-ctype",
    3449             "version": "v1.37.0",
    3450             "source": {
    3451                 "type": "git",
    3452                 "url": "https://github.com/symfony/polyfill-ctype.git",
    3453                 "reference": "141046a8f9477948ff284fa65be2095baafb94f2"
    3454             },
    3455             "dist": {
    3456                 "type": "zip",
    3457                 "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/141046a8f9477948ff284fa65be2095baafb94f2",
    3458                 "reference": "141046a8f9477948ff284fa65be2095baafb94f2",
    3459                 "shasum": ""
    3460             },
    3461             "require": {
    3462                 "php": ">=7.2"
    3463             },
    3464             "provide": {
    3465                 "ext-ctype": "*"
    3466             },
    3467             "suggest": {
    3468                 "ext-ctype": "For best performance"
    3469             },
    3470             "type": "library",
    3471             "extra": {
    3472                 "thanks": {
    3473                     "url": "https://github.com/symfony/polyfill",
    3474                     "name": "symfony/polyfill"
    3475                 }
    3476             },
    3477             "autoload": {
    3478                 "files": [
    3479                     "bootstrap.php"
    3480                 ],
    3481                 "psr-4": {
    3482                     "Symfony\\Polyfill\\Ctype\\": ""
    3483                 }
    3484             },
    3485             "notification-url": "https://packagist.org/downloads/",
    3486             "license": [
    3487                 "MIT"
    3488             ],
    3489             "authors": [
    3490                 {
    3491                     "name": "Gert de Pagter",
    3492                     "email": "BackEndTea@gmail.com"
    3493                 },
    3494                 {
    3495                     "name": "Symfony Community",
    3496                     "homepage": "https://symfony.com/contributors"
    3497                 }
    3498             ],
    3499             "description": "Symfony polyfill for ctype functions",
    3500             "homepage": "https://symfony.com",
    3501             "keywords": [
    3502                 "compatibility",
    3503                 "ctype",
    3504                 "polyfill",
    3505                 "portable"
    3506             ],
    3507             "support": {
    3508                 "source": "https://github.com/symfony/polyfill-ctype/tree/v1.37.0"
    3509             },
    3510             "funding": [
    3511                 {
    3512                     "url": "https://symfony.com/sponsor",
    3513                     "type": "custom"
    3514                 },
    3515                 {
    3516                     "url": "https://github.com/fabpot",
    3517                     "type": "github"
    3518                 },
    3519                 {
    3520                     "url": "https://github.com/nicolas-grekas",
    3521                     "type": "github"
    3522                 },
    3523                 {
    3524                     "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
    3525                     "type": "tidelift"
    3526                 }
    3527             ],
    3528             "time": "2026-04-10T16:19:22+00:00"
    3529         },
    3530         {
    3531             "name": "symfony/polyfill-intl-grapheme",
    3532             "version": "v1.38.1",
    3533             "source": {
    3534                 "type": "git",
    3535                 "url": "https://github.com/symfony/polyfill-intl-grapheme.git",
    3536                 "reference": "e9247d281d694a5120554d9afaf54e070e88a603"
    3537             },
    3538             "dist": {
    3539                 "type": "zip",
    3540                 "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/e9247d281d694a5120554d9afaf54e070e88a603",
    3541                 "reference": "e9247d281d694a5120554d9afaf54e070e88a603",
    3542                 "shasum": ""
    3543             },
    3544             "require": {
    3545                 "php": ">=7.2"
    3546             },
    3547             "suggest": {
    3548                 "ext-intl": "For best performance"
    3549             },
    3550             "type": "library",
    3551             "extra": {
    3552                 "thanks": {
    3553                     "url": "https://github.com/symfony/polyfill",
    3554                     "name": "symfony/polyfill"
    3555                 }
    3556             },
    3557             "autoload": {
    3558                 "files": [
    3559                     "bootstrap.php"
    3560                 ],
    3561                 "psr-4": {
    3562                     "Symfony\\Polyfill\\Intl\\Grapheme\\": ""
    3563                 }
    3564             },
    3565             "notification-url": "https://packagist.org/downloads/",
    3566             "license": [
    3567                 "MIT"
    3568             ],
    3569             "authors": [
    3570                 {
    3571                     "name": "Nicolas Grekas",
    3572                     "email": "p@tchwork.com"
    3573                 },
    3574                 {
    3575                     "name": "Symfony Community",
    3576                     "homepage": "https://symfony.com/contributors"
    3577                 }
    3578             ],
    3579             "description": "Symfony polyfill for intl's grapheme_* functions",
    3580             "homepage": "https://symfony.com",
    3581             "keywords": [
    3582                 "compatibility",
    3583                 "grapheme",
    3584                 "intl",
    3585                 "polyfill",
    3586                 "portable",
    3587                 "shim"
    3588             ],
    3589             "support": {
    3590                 "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.38.1"
    3591             },
    3592             "funding": [
    3593                 {
    3594                     "url": "https://symfony.com/sponsor",
    3595                     "type": "custom"
    3596                 },
    3597                 {
    3598                     "url": "https://github.com/fabpot",
    3599                     "type": "github"
    3600                 },
    3601                 {
    3602                     "url": "https://github.com/nicolas-grekas",
    3603                     "type": "github"
    3604                 },
    3605                 {
    3606                     "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
    3607                     "type": "tidelift"
    3608                 }
    3609             ],
    3610             "time": "2026-05-26T05:58:03+00:00"
    3611         },
    3612         {
    3613             "name": "symfony/polyfill-intl-normalizer",
    3614             "version": "v1.38.0",
    3615             "source": {
    3616                 "type": "git",
    3617                 "url": "https://github.com/symfony/polyfill-intl-normalizer.git",
    3618                 "reference": "2d446c214bdbe5b71bde5011b060a05fece3ae6b"
    3619             },
    3620             "dist": {
    3621                 "type": "zip",
    3622                 "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/2d446c214bdbe5b71bde5011b060a05fece3ae6b",
    3623                 "reference": "2d446c214bdbe5b71bde5011b060a05fece3ae6b",
    3624                 "shasum": ""
    3625             },
    3626             "require": {
    3627                 "php": ">=7.2"
    3628             },
    3629             "suggest": {
    3630                 "ext-intl": "For best performance"
    3631             },
    3632             "type": "library",
    3633             "extra": {
    3634                 "thanks": {
    3635                     "url": "https://github.com/symfony/polyfill",
    3636                     "name": "symfony/polyfill"
    3637                 }
    3638             },
    3639             "autoload": {
    3640                 "files": [
    3641                     "bootstrap.php"
    3642                 ],
    3643                 "psr-4": {
    3644                     "Symfony\\Polyfill\\Intl\\Normalizer\\": ""
    3645                 },
    3646                 "classmap": [
    3647                     "Resources/stubs"
    3648                 ]
    3649             },
    3650             "notification-url": "https://packagist.org/downloads/",
    3651             "license": [
    3652                 "MIT"
    3653             ],
    3654             "authors": [
    3655                 {
    3656                     "name": "Nicolas Grekas",
    3657                     "email": "p@tchwork.com"
    3658                 },
    3659                 {
    3660                     "name": "Symfony Community",
    3661                     "homepage": "https://symfony.com/contributors"
    3662                 }
    3663             ],
    3664             "description": "Symfony polyfill for intl's Normalizer class and related functions",
    3665             "homepage": "https://symfony.com",
    3666             "keywords": [
    3667                 "compatibility",
    3668                 "intl",
    3669                 "normalizer",
    3670                 "polyfill",
    3671                 "portable",
    3672                 "shim"
    3673             ],
    3674             "support": {
    3675                 "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.38.0"
    3676             },
    3677             "funding": [
    3678                 {
    3679                     "url": "https://symfony.com/sponsor",
    3680                     "type": "custom"
    3681                 },
    3682                 {
    3683                     "url": "https://github.com/fabpot",
    3684                     "type": "github"
    3685                 },
    3686                 {
    3687                     "url": "https://github.com/nicolas-grekas",
    3688                     "type": "github"
    3689                 },
    3690                 {
    3691                     "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
    3692                     "type": "tidelift"
    3693                 }
    3694             ],
    3695             "time": "2026-05-25T13:48:31+00:00"
    3696         },
    3697         {
    3698             "name": "symfony/polyfill-mbstring",
    3699             "version": "v1.38.1",
    3700             "source": {
    3701                 "type": "git",
    3702                 "url": "https://github.com/symfony/polyfill-mbstring.git",
    3703                 "reference": "14c5439eec4ccff081ac14eca2dc57feb2a66d92"
    3704             },
    3705             "dist": {
    3706                 "type": "zip",
    3707                 "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/14c5439eec4ccff081ac14eca2dc57feb2a66d92",
    3708                 "reference": "14c5439eec4ccff081ac14eca2dc57feb2a66d92",
    3709                 "shasum": ""
    3710             },
    3711             "require": {
    3712                 "ext-iconv": "*",
    3713                 "php": ">=7.2"
    3714             },
    3715             "provide": {
    3716                 "ext-mbstring": "*"
    3717             },
    3718             "suggest": {
    3719                 "ext-mbstring": "For best performance"
    3720             },
    3721             "type": "library",
    3722             "extra": {
    3723                 "thanks": {
    3724                     "url": "https://github.com/symfony/polyfill",
    3725                     "name": "symfony/polyfill"
    3726                 }
    3727             },
    3728             "autoload": {
    3729                 "files": [
    3730                     "bootstrap.php"
    3731                 ],
    3732                 "psr-4": {
    3733                     "Symfony\\Polyfill\\Mbstring\\": ""
    3734                 }
    3735             },
    3736             "notification-url": "https://packagist.org/downloads/",
    3737             "license": [
    3738                 "MIT"
    3739             ],
    3740             "authors": [
    3741                 {
    3742                     "name": "Nicolas Grekas",
    3743                     "email": "p@tchwork.com"
    3744                 },
    3745                 {
    3746                     "name": "Symfony Community",
    3747                     "homepage": "https://symfony.com/contributors"
    3748                 }
    3749             ],
    3750             "description": "Symfony polyfill for the Mbstring extension",
    3751             "homepage": "https://symfony.com",
    3752             "keywords": [
    3753                 "compatibility",
    3754                 "mbstring",
    3755                 "polyfill",
    3756                 "portable",
    3757                 "shim"
    3758             ],
    3759             "support": {
    3760                 "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.38.1"
    3761             },
    3762             "funding": [
    3763                 {
    3764                     "url": "https://symfony.com/sponsor",
    3765                     "type": "custom"
    3766                 },
    3767                 {
    3768                     "url": "https://github.com/fabpot",
    3769                     "type": "github"
    3770                 },
    3771                 {
    3772                     "url": "https://github.com/nicolas-grekas",
    3773                     "type": "github"
    3774                 },
    3775                 {
    3776                     "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
    3777                     "type": "tidelift"
    3778                 }
    3779             ],
    3780             "time": "2026-05-26T12:51:13+00:00"
    3781         },
    3782         {
    3783             "name": "symfony/polyfill-php73",
    3784             "version": "v1.37.0",
    3785             "source": {
    3786                 "type": "git",
    3787                 "url": "https://github.com/symfony/polyfill-php73.git",
    3788                 "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb"
    3789             },
    3790             "dist": {
    3791                 "type": "zip",
    3792                 "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/0f68c03565dcaaf25a890667542e8bd75fe7e5bb",
    3793                 "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb",
    3794                 "shasum": ""
    3795             },
    3796             "require": {
    3797                 "php": ">=7.2"
    3798             },
    3799             "type": "library",
    3800             "extra": {
    3801                 "thanks": {
    3802                     "url": "https://github.com/symfony/polyfill",
    3803                     "name": "symfony/polyfill"
    3804                 }
    3805             },
    3806             "autoload": {
    3807                 "files": [
    3808                     "bootstrap.php"
    3809                 ],
    3810                 "psr-4": {
    3811                     "Symfony\\Polyfill\\Php73\\": ""
    3812                 },
    3813                 "classmap": [
    3814                     "Resources/stubs"
    3815                 ]
    3816             },
    3817             "notification-url": "https://packagist.org/downloads/",
    3818             "license": [
    3819                 "MIT"
    3820             ],
    3821             "authors": [
    3822                 {
    3823                     "name": "Nicolas Grekas",
    3824                     "email": "p@tchwork.com"
    3825                 },
    3826                 {
    3827                     "name": "Symfony Community",
    3828                     "homepage": "https://symfony.com/contributors"
    3829                 }
    3830             ],
    3831             "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions",
    3832             "homepage": "https://symfony.com",
    3833             "keywords": [
    3834                 "compatibility",
    3835                 "polyfill",
    3836                 "portable",
    3837                 "shim"
    3838             ],
    3839             "support": {
    3840                 "source": "https://github.com/symfony/polyfill-php73/tree/v1.37.0"
    3841             },
    3842             "funding": [
    3843                 {
    3844                     "url": "https://symfony.com/sponsor",
    3845                     "type": "custom"
    3846                 },
    3847                 {
    3848                     "url": "https://github.com/fabpot",
    3849                     "type": "github"
    3850                 },
    3851                 {
    3852                     "url": "https://github.com/nicolas-grekas",
    3853                     "type": "github"
    3854                 },
    3855                 {
    3856                     "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
    3857                     "type": "tidelift"
    3858                 }
    3859             ],
    3860             "time": "2024-09-09T11:45:10+00:00"
    3861816        },
    3862817        {
    … …  
    3943898            ],
    3944899            "time": "2026-04-10T16:19:22+00:00"
    3945         },
    3946         {
    3947             "name": "symfony/polyfill-php81",
    3948             "version": "v1.38.1",
    3949             "source": {
    3950                 "type": "git",
    3951                 "url": "https://github.com/symfony/polyfill-php81.git",
    3952                 "reference": "6bfb9c766cacffbc8e118cb87217d08ed84e5cd7"
    3953             },
    3954             "dist": {
    3955                 "type": "zip",
    3956                 "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/6bfb9c766cacffbc8e118cb87217d08ed84e5cd7",
    3957                 "reference": "6bfb9c766cacffbc8e118cb87217d08ed84e5cd7",
    3958                 "shasum": ""
    3959             },
    3960             "require": {
    3961                 "php": ">=7.2"
    3962             },
    3963             "type": "library",
    3964             "extra": {
    3965                 "thanks": {
    3966                     "url": "https://github.com/symfony/polyfill",
    3967                     "name": "symfony/polyfill"
    3968                 }
    3969             },
    3970             "autoload": {
    3971                 "files": [
    3972                     "bootstrap.php"
    3973                 ],
    3974                 "psr-4": {
    3975                     "Symfony\\Polyfill\\Php81\\": ""
    3976                 },
    3977                 "classmap": [
    3978                     "Resources/stubs"
    3979                 ]
    3980             },
    3981             "notification-url": "https://packagist.org/downloads/",
    3982             "license": [
    3983                 "MIT"
    3984             ],
    3985             "authors": [
    3986                 {
    3987                     "name": "Nicolas Grekas",
    3988                     "email": "p@tchwork.com"
    3989                 },
    3990                 {
    3991                     "name": "Symfony Community",
    3992                     "homepage": "https://symfony.com/contributors"
    3993                 }
    3994             ],
    3995             "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions",
    3996             "homepage": "https://symfony.com",
    3997             "keywords": [
    3998                 "compatibility",
    3999                 "polyfill",
    4000                 "portable",
    4001                 "shim"
    4002             ],
    4003             "support": {
    4004                 "source": "https://github.com/symfony/polyfill-php81/tree/v1.38.1"
    4005             },
    4006             "funding": [
    4007                 {
    4008                     "url": "https://symfony.com/sponsor",
    4009                     "type": "custom"
    4010                 },
    4011                 {
    4012                     "url": "https://github.com/fabpot",
    4013                     "type": "github"
    4014                 },
    4015                 {
    4016                     "url": "https://github.com/nicolas-grekas",
    4017                     "type": "github"
    4018                 },
    4019                 {
    4020                     "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
    4021                     "type": "tidelift"
    4022                 }
    4023             ],
    4024             "time": "2026-05-26T12:45:58+00:00"
    4025         },
    4026         {
    4027             "name": "symfony/polyfill-php84",
    4028             "version": "v1.38.1",
    4029             "source": {
    4030                 "type": "git",
    4031                 "url": "https://github.com/symfony/polyfill-php84.git",
    4032                 "reference": "f4e1dfaee5b74aba5964fe1fd4dfc7ba5e3085fa"
    4033             },
    4034             "dist": {
    4035                 "type": "zip",
    4036                 "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/f4e1dfaee5b74aba5964fe1fd4dfc7ba5e3085fa",
    4037                 "reference": "f4e1dfaee5b74aba5964fe1fd4dfc7ba5e3085fa",
    4038                 "shasum": ""
    4039             },
    4040             "require": {
    4041                 "php": ">=7.2"
    4042             },
    4043             "type": "library",
    4044             "extra": {
    4045                 "thanks": {
    4046                     "url": "https://github.com/symfony/polyfill",
    4047                     "name": "symfony/polyfill"
    4048                 }
    4049             },
    4050             "autoload": {
    4051                 "files": [
    4052                     "bootstrap.php"
    4053                 ],
    4054                 "psr-4": {
    4055                     "Symfony\\Polyfill\\Php84\\": ""
    4056                 },
    4057                 "classmap": [
    4058                     "Resources/stubs"
    4059                 ]
    4060             },
    4061             "notification-url": "https://packagist.org/downloads/",
    4062             "license": [
    4063                 "MIT"
    4064             ],
    4065             "authors": [
    4066                 {
    4067                     "name": "Nicolas Grekas",
    4068                     "email": "p@tchwork.com"
    4069                 },
    4070                 {
    4071                     "name": "Symfony Community",
    4072                     "homepage": "https://symfony.com/contributors"
    4073                 }
    4074             ],
    4075             "description": "Symfony polyfill backporting some PHP 8.4+ features to lower PHP versions",
    4076             "homepage": "https://symfony.com",
    4077             "keywords": [
    4078                 "compatibility",
    4079                 "polyfill",
    4080                 "portable",
    4081                 "shim"
    4082             ],
    4083             "support": {
    4084                 "source": "https://github.com/symfony/polyfill-php84/tree/v1.38.1"
    4085             },
    4086             "funding": [
    4087                 {
    4088                     "url": "https://symfony.com/sponsor",
    4089                     "type": "custom"
    4090                 },
    4091                 {
    4092                     "url": "https://github.com/fabpot",
    4093                     "type": "github"
    4094                 },
    4095                 {
    4096                     "url": "https://github.com/nicolas-grekas",
    4097                     "type": "github"
    4098                 },
    4099                 {
    4100                     "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
    4101                     "type": "tidelift"
    4102                 }
    4103             ],
    4104             "time": "2026-05-26T12:51:13+00:00"
    4105         },
    4106         {
    4107             "name": "symfony/process",
    4108             "version": "v5.4.51",
    4109             "source": {
    4110                 "type": "git",
    4111                 "url": "https://github.com/symfony/process.git",
    4112                 "reference": "467bfc56f18f5ef6d5ccb09324d7e988c1c0a98f"
    4113             },
    4114             "dist": {
    4115                 "type": "zip",
    4116                 "url": "https://api.github.com/repos/symfony/process/zipball/467bfc56f18f5ef6d5ccb09324d7e988c1c0a98f",
    4117                 "reference": "467bfc56f18f5ef6d5ccb09324d7e988c1c0a98f",
    4118                 "shasum": ""
    4119             },
    4120             "require": {
    4121                 "php": ">=7.2.5",
    4122                 "symfony/polyfill-php80": "^1.16"
    4123             },
    4124             "type": "library",
    4125             "autoload": {
    4126                 "psr-4": {
    4127                     "Symfony\\Component\\Process\\": ""
    4128                 },
    4129                 "exclude-from-classmap": [
    4130                     "/Tests/"
    4131                 ]
    4132             },
    4133             "notification-url": "https://packagist.org/downloads/",
    4134             "license": [
    4135                 "MIT"
    4136             ],
    4137             "authors": [
    4138                 {
    4139                     "name": "Fabien Potencier",
    4140                     "email": "fabien@symfony.com"
    4141                 },
    4142                 {
    4143                     "name": "Symfony Community",
    4144                     "homepage": "https://symfony.com/contributors"
    4145                 }
    4146             ],
    4147             "description": "Executes commands in sub-processes",
    4148             "homepage": "https://symfony.com",
    4149             "support": {
    4150                 "source": "https://github.com/symfony/process/tree/v5.4.51"
    4151             },
    4152             "funding": [
    4153                 {
    4154                     "url": "https://symfony.com/sponsor",
    4155                     "type": "custom"
    4156                 },
    4157                 {
    4158                     "url": "https://github.com/fabpot",
    4159                     "type": "github"
    4160                 },
    4161                 {
    4162                     "url": "https://github.com/nicolas-grekas",
    4163                     "type": "github"
    4164                 },
    4165                 {
    4166                     "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
    4167                     "type": "tidelift"
    4168                 }
    4169             ],
    4170             "time": "2026-01-26T15:53:37+00:00"
    4171         },
    4172         {
    4173             "name": "symfony/service-contracts",
    4174             "version": "v2.5.4",
    4175             "source": {
    4176                 "type": "git",
    4177                 "url": "https://github.com/symfony/service-contracts.git",
    4178                 "reference": "f37b419f7aea2e9abf10abd261832cace12e3300"
    4179             },
    4180             "dist": {
    4181                 "type": "zip",
    4182                 "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f37b419f7aea2e9abf10abd261832cace12e3300",
    4183                 "reference": "f37b419f7aea2e9abf10abd261832cace12e3300",
    4184                 "shasum": ""
    4185             },
    4186             "require": {
    4187                 "php": ">=7.2.5",
    4188                 "psr/container": "^1.1",
    4189                 "symfony/deprecation-contracts": "^2.1|^3"
    4190             },
    4191             "conflict": {
    4192                 "ext-psr": "<1.1|>=2"
    4193             },
    4194             "suggest": {
    4195                 "symfony/service-implementation": ""
    4196             },
    4197             "type": "library",
    4198             "extra": {
    4199                 "thanks": {
    4200                     "url": "https://github.com/symfony/contracts",
    4201                     "name": "symfony/contracts"
    4202                 },
    4203                 "branch-alias": {
    4204                     "dev-main": "2.5-dev"
    4205                 }
    4206             },
    4207             "autoload": {
    4208                 "psr-4": {
    4209                     "Symfony\\Contracts\\Service\\": ""
    4210                 }
    4211             },
    4212             "notification-url": "https://packagist.org/downloads/",
    4213             "license": [
    4214                 "MIT"
    4215             ],
    4216             "authors": [
    4217                 {
    4218                     "name": "Nicolas Grekas",
    4219                     "email": "p@tchwork.com"
    4220                 },
    4221                 {
    4222                     "name": "Symfony Community",
    4223                     "homepage": "https://symfony.com/contributors"
    4224                 }
    4225             ],
    4226             "description": "Generic abstractions related to writing services",
    4227             "homepage": "https://symfony.com",
    4228             "keywords": [
    4229                 "abstractions",
    4230                 "contracts",
    4231                 "decoupling",
    4232                 "interfaces",
    4233                 "interoperability",
    4234                 "standards"
    4235             ],
    4236             "support": {
    4237                 "source": "https://github.com/symfony/service-contracts/tree/v2.5.4"
    4238             },
    4239             "funding": [
    4240                 {
    4241                     "url": "https://symfony.com/sponsor",
    4242                     "type": "custom"
    4243                 },
    4244                 {
    4245                     "url": "https://github.com/fabpot",
    4246                     "type": "github"
    4247                 },
    4248                 {
    4249                     "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
    4250                     "type": "tidelift"
    4251                 }
    4252             ],
    4253             "time": "2024-09-25T14:11:13+00:00"
    4254         },
    4255         {
    4256             "name": "symfony/string",
    4257             "version": "v5.4.47",
    4258             "source": {
    4259                 "type": "git",
    4260                 "url": "https://github.com/symfony/string.git",
    4261                 "reference": "136ca7d72f72b599f2631aca474a4f8e26719799"
    4262             },
    4263             "dist": {
    4264                 "type": "zip",
    4265                 "url": "https://api.github.com/repos/symfony/string/zipball/136ca7d72f72b599f2631aca474a4f8e26719799",
    4266                 "reference": "136ca7d72f72b599f2631aca474a4f8e26719799",
    4267                 "shasum": ""
    4268             },
    4269             "require": {
    4270                 "php": ">=7.2.5",
    4271                 "symfony/polyfill-ctype": "~1.8",
    4272                 "symfony/polyfill-intl-grapheme": "~1.0",
    4273                 "symfony/polyfill-intl-normalizer": "~1.0",
    4274                 "symfony/polyfill-mbstring": "~1.0",
    4275                 "symfony/polyfill-php80": "~1.15"
    4276             },
    4277             "conflict": {
    4278                 "symfony/translation-contracts": ">=3.0"
    4279             },
    4280             "require-dev": {
    4281                 "symfony/error-handler": "^4.4|^5.0|^6.0",
    4282                 "symfony/http-client": "^4.4|^5.0|^6.0",
    4283                 "symfony/translation-contracts": "^1.1|^2",
    4284                 "symfony/var-exporter": "^4.4|^5.0|^6.0"
    4285             },
    4286             "type": "library",
    4287             "autoload": {
    4288                 "files": [
    4289                     "Resources/functions.php"
    4290                 ],
    4291                 "psr-4": {
    4292                     "Symfony\\Component\\String\\": ""
    4293                 },
    4294                 "exclude-from-classmap": [
    4295                     "/Tests/"
    4296                 ]
    4297             },
    4298             "notification-url": "https://packagist.org/downloads/",
    4299             "license": [
    4300                 "MIT"
    4301             ],
    4302             "authors": [
    4303                 {
    4304                     "name": "Nicolas Grekas",
    4305                     "email": "p@tchwork.com"
    4306                 },
    4307                 {
    4308                     "name": "Symfony Community",
    4309                     "homepage": "https://symfony.com/contributors"
    4310                 }
    4311             ],
    4312             "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way",
    4313             "homepage": "https://symfony.com",
    4314             "keywords": [
    4315                 "grapheme",
    4316                 "i18n",
    4317                 "string",
    4318                 "unicode",
    4319                 "utf-8",
    4320                 "utf8"
    4321             ],
    4322             "support": {
    4323                 "source": "https://github.com/symfony/string/tree/v5.4.47"
    4324             },
    4325             "funding": [
    4326                 {
    4327                     "url": "https://symfony.com/sponsor",
    4328                     "type": "custom"
    4329                 },
    4330                 {
    4331                     "url": "https://github.com/fabpot",
    4332                     "type": "github"
    4333                 },
    4334                 {
    4335                     "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
    4336                     "type": "tidelift"
    4337                 }
    4338             ],
    4339             "time": "2024-11-10T20:33:58+00:00"
    4340         },
    4341         {
    4342             "name": "symfony/var-exporter",
    4343             "version": "v5.4.45",
    4344             "source": {
    4345                 "type": "git",
    4346                 "url": "https://github.com/symfony/var-exporter.git",
    4347                 "reference": "862700068db0ddfd8c5b850671e029a90246ec75"
    4348             },
    4349             "dist": {
    4350                 "type": "zip",
    4351                 "url": "https://api.github.com/repos/symfony/var-exporter/zipball/862700068db0ddfd8c5b850671e029a90246ec75",
    4352                 "reference": "862700068db0ddfd8c5b850671e029a90246ec75",
    4353                 "shasum": ""
    4354             },
    4355             "require": {
    4356                 "php": ">=7.2.5",
    4357                 "symfony/polyfill-php80": "^1.16"
    4358             },
    4359             "require-dev": {
    4360                 "symfony/var-dumper": "^4.4.9|^5.0.9|^6.0"
    4361             },
    4362             "type": "library",
    4363             "autoload": {
    4364                 "psr-4": {
    4365                     "Symfony\\Component\\VarExporter\\": ""
    4366                 },
    4367                 "exclude-from-classmap": [
    4368                     "/Tests/"
    4369                 ]
    4370             },
    4371             "notification-url": "https://packagist.org/downloads/",
    4372             "license": [
    4373                 "MIT"
    4374             ],
    4375             "authors": [
    4376                 {
    4377                     "name": "Nicolas Grekas",
    4378                     "email": "p@tchwork.com"
    4379                 },
    4380                 {
    4381                     "name": "Symfony Community",
    4382                     "homepage": "https://symfony.com/contributors"
    4383                 }
    4384             ],
    4385             "description": "Allows exporting any serializable PHP data structure to plain PHP code",
    4386             "homepage": "https://symfony.com",
    4387             "keywords": [
    4388                 "clone",
    4389                 "construct",
    4390                 "export",
    4391                 "hydrate",
    4392                 "instantiate",
    4393                 "serialize"
    4394             ],
    4395             "support": {
    4396                 "source": "https://github.com/symfony/var-exporter/tree/v5.4.45"
    4397             },
    4398             "funding": [
    4399                 {
    4400                     "url": "https://symfony.com/sponsor",
    4401                     "type": "custom"
    4402                 },
    4403                 {
    4404                     "url": "https://github.com/fabpot",
    4405                     "type": "github"
    4406                 },
    4407                 {
    4408                     "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
    4409                     "type": "tidelift"
    4410                 }
    4411             ],
    4412             "time": "2024-09-25T14:11:13+00:00"
    4413         },
    4414         {
    4415             "name": "voku/simple-cache",
    4416             "version": "5.0.0",
    4417             "source": {
    4418                 "type": "git",
    4419                 "url": "https://github.com/voku/simple-cache.git",
    4420                 "reference": "71531e9a8f4bfb75a120a986ac12867af15c65be"
    4421             },
    4422             "dist": {
    4423                 "type": "zip",
    4424                 "url": "https://api.github.com/repos/voku/simple-cache/zipball/71531e9a8f4bfb75a120a986ac12867af15c65be",
    4425                 "reference": "71531e9a8f4bfb75a120a986ac12867af15c65be",
    4426                 "shasum": ""
    4427             },
    4428             "require": {
    4429                 "php": ">=7.0.0",
    4430                 "psr/simple-cache": "~1.0 || ~2.0"
    4431             },
    4432             "provide": {
    4433                 "psr/simple-cache-implementation": "1.0"
    4434             },
    4435             "require-dev": {
    4436                 "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0"
    4437             },
    4438             "suggest": {
    4439                 "predis/predis": "~1.1 || ~2.0 || ~3.0",
    4440                 "symfony/var-exporter": "~3.0 || ~4.0 || ~5.0 || ~6.0 || ~7.0"
    4441             },
    4442             "type": "library",
    4443             "autoload": {
    4444                 "psr-4": {
    4445                     "voku\\cache\\": "src/voku/cache/"
    4446                 }
    4447             },
    4448             "notification-url": "https://packagist.org/downloads/",
    4449             "license": [
    4450                 "MIT"
    4451             ],
    4452             "authors": [
    4453                 {
    4454                     "name": "Lars Moelleken",
    4455                     "homepage": "https://www.moelleken.org/",
    4456                     "role": "Developer"
    4457                 }
    4458             ],
    4459             "description": "Simple Cache library",
    4460             "homepage": "https://github.com/voku/simple-cache",
    4461             "keywords": [
    4462                 "cache",
    4463                 "caching",
    4464                 "php",
    4465                 "simple cache"
    4466             ],
    4467             "support": {
    4468                 "issues": "https://github.com/voku/simple-cache/issues",
    4469                 "source": "https://github.com/voku/simple-cache/tree/5.0.0"
    4470             },
    4471             "funding": [
    4472                 {
    4473                     "url": "https://www.paypal.me/moelleken",
    4474                     "type": "custom"
    4475                 },
    4476                 {
    4477                     "url": "https://github.com/voku",
    4478                     "type": "github"
    4479                 },
    4480                 {
    4481                     "url": "https://www.patreon.com/voku",
    4482                     "type": "patreon"
    4483                 },
    4484                 {
    4485                     "url": "https://tidelift.com/funding/github/packagist/voku/simple-cache",
    4486                     "type": "tidelift"
    4487                 }
    4488             ],
    4489             "time": "2025-10-29T13:00:29+00:00"
    4490         },
    4491         {
    4492             "name": "webmozart/assert",
    4493             "version": "1.12.1",
    4494             "source": {
    4495                 "type": "git",
    4496                 "url": "https://github.com/webmozarts/assert.git",
    4497                 "reference": "9be6926d8b485f55b9229203f962b51ed377ba68"
    4498             },
    4499             "dist": {
    4500                 "type": "zip",
    4501                 "url": "https://api.github.com/repos/webmozarts/assert/zipball/9be6926d8b485f55b9229203f962b51ed377ba68",
    4502                 "reference": "9be6926d8b485f55b9229203f962b51ed377ba68",
    4503                 "shasum": ""
    4504             },
    4505             "require": {
    4506                 "ext-ctype": "*",
    4507                 "ext-date": "*",
    4508                 "ext-filter": "*",
    4509                 "php": "^7.2 || ^8.0"
    4510             },
    4511             "suggest": {
    4512                 "ext-intl": "",
    4513                 "ext-simplexml": "",
    4514                 "ext-spl": ""
    4515             },
    4516             "type": "library",
    4517             "extra": {
    4518                 "branch-alias": {
    4519                     "dev-master": "1.10-dev"
    4520                 }
    4521             },
    4522             "autoload": {
    4523                 "psr-4": {
    4524                     "Webmozart\\Assert\\": "src/"
    4525                 }
    4526             },
    4527             "notification-url": "https://packagist.org/downloads/",
    4528             "license": [
    4529                 "MIT"
    4530             ],
    4531             "authors": [
    4532                 {
    4533                     "name": "Bernhard Schussek",
    4534                     "email": "bschussek@gmail.com"
    4535                 }
    4536             ],
    4537             "description": "Assertions to validate method input/output with nice error messages.",
    4538             "keywords": [
    4539                 "assert",
    4540                 "check",
    4541                 "validate"
    4542             ],
    4543             "support": {
    4544                 "issues": "https://github.com/webmozarts/assert/issues",
    4545                 "source": "https://github.com/webmozarts/assert/tree/1.12.1"
    4546             },
    4547             "time": "2025-10-29T15:56:20+00:00"
    4548900        }
    4549901    ],
     902    "packages-dev": [],
    4550903    "aliases": [],
    4551904    "minimum-stability": "dev",
  • sg-ai-studio/trunk/core/Helper/HelperAuth.php

    r3505951 r3562098  
    103103        private ?string $token = null;
    104104        private ?float $token_expiry = null;
     105
     106        /**
     107         * Minimum RSA modulus size (bits) accepted for RSA-based keys (RS and PS families).
     108         */
     109        private const MIN_RSA_BITS = 2048;
     110
     111        /**
     112         * Minimum secret length (bytes) per HMAC algorithm, matching the hash output size.
     113         * Mirrors the key-length validation added upstream in firebase/php-jwt v7 (CVE-2025-45769),
     114         * backported here so we stay on the PHP 7.4-compatible 6.x line.
     115         */
     116        private const HMAC_MIN_KEY_BYTES = array(
     117                'HS256' => 32,
     118                'HS384' => 48,
     119                'HS512' => 64,
     120        );
    105121
    106122        public function __construct(
    … …  
    172188        }
    173189
     190        /**
     191         * Reject signing/verification keys that are too weak for the given algorithm.
     192         *
     193         * @param string $key        The key material (HMAC secret, or PEM private/public key).
     194         * @param string $algorithm  The JWT algorithm the key will be used with.
     195         * @param bool   $is_private Whether $key is a private key (true) or public key (false).
     196         *
     197         * @throws SignApiAuthException When the key does not meet the minimum strength.
     198         */
     199        private function validate_key_strength( string $key, string $algorithm, bool $is_private ): void {
     200                // HMAC: the symmetric secret must be at least as long as the hash output.
     201                if ( isset( self::HMAC_MIN_KEY_BYTES[ $algorithm ] ) ) {
     202                        $min = self::HMAC_MIN_KEY_BYTES[ $algorithm ];
     203                        if ( strlen( $key ) < $min ) {
     204                                throw new SignApiAuthException(
     205                                        sprintf( 'Insecure HMAC key for %s: %d bytes provided, %d required', $algorithm, strlen( $key ), $min )
     206                                );
     207                        }
     208                        return;
     209                }
     210
     211                // Asymmetric (RS, PS, ES families): inspect the key material via OpenSSL.
     212                $pkey = $is_private ? openssl_pkey_get_private( $key ) : openssl_pkey_get_public( $key );
     213                if ( false === $pkey ) {
     214                        throw new SignApiAuthException( 'Invalid key supplied for ' . esc_html( $algorithm ) );
     215                }
     216
     217                $details = openssl_pkey_get_details( $pkey );
     218                if ( false === $details ) {
     219                        throw new SignApiAuthException( 'Unable to read key details for ' . esc_html( $algorithm ) );
     220                }
     221
     222                if (
     223                        ( $details['type'] ?? null ) === OPENSSL_KEYTYPE_RSA
     224                        && ( $details['bits'] ?? 0 ) < self::MIN_RSA_BITS
     225                ) {
     226                        throw new SignApiAuthException(
     227                                sprintf( 'Insecure RSA key for %s: %d bits, minimum %d required', $algorithm, $details['bits'] ?? 0, self::MIN_RSA_BITS )
     228                        );
     229                }
     230        }
     231
    174232        private function generate_token( array $key_data, int $retries = 5, ?array $extra_payload = null ): string
    175233        {
    … …  
    187245                }
    188246
     247                $this->validate_key_strength( $private_key, $this->algorithm, true );
    189248                $token         = JWT::encode( $payload, $private_key, $this->algorithm );
    190249                $token_request = new TokenRequest( $token, $service, $client, $client_key );
    … …  
    323382                foreach ( $algorithms as $algorithm ) {
    324383                        try {
     384                                $this->validate_key_strength( trim( $service_key['key_pub'] ), $algorithm, false );
    325385                                $decoded_data = JWT::decode( $token, new Key( trim( $service_key['key_pub'] ), $algorithm ) );
    326386                                $decoded_data = (array) $decoded_data;
    … …  
    372432                        $key_value = trim( $public_key['key_pub'] );
    373433
     434                        $this->validate_key_strength( $key_value, $this->algorithm, false );
    374435                        $decoded_data = JWT::decode( $token, new Key( $key_value, $this->algorithm ) );
    375436                        $decoded_data = (array) $decoded_data;
  • sg-ai-studio/trunk/readme.txt

    r3561022 r3562098  
    44Requires at least: 5.0
    55Tested up to: 7.0
    6 Stable tag: 1.2.1
     6Stable tag: 1.2.2
    77Requires PHP: 7.4
    88License: GPLv3
    … …  
    215215
    216216== Changelog ==
     217= 1.2.2 =
     218Release Date June 5th, 2026
     219* php-jwt dependency version update
     220* Changes to signing/verification keys validation process
     221
    217222= 1.2.1 =
    218223Release Date June 4th, 2026
  • sg-ai-studio/trunk/sg-ai-studio.php

    r3561022 r3562098  
    1111 * Plugin URI:        https://siteground.com
    1212 * Description:       Manage your WordPress site with AI - create content, install plugins, and perform site management tasks effortlessly.
    13  * Version:           1.2.1
     13 * Version:           1.2.2
    1414 * Author:            SiteGround
    1515 * Author URI:        https://www.siteground.com
    … …  
    3434// Define version constant.
    3535if ( ! defined( __NAMESPACE__ . '\VERSION' ) ) {
    36         define( __NAMESPACE__ . '\VERSION', '1.2.1' );
     36        define( __NAMESPACE__ . '\VERSION', '1.2.2' );
    3737}
    3838
  • sg-ai-studio/trunk/vendor/autoload.php

    r3519232 r3562098  
    2020require_once __DIR__ . '/composer/autoload_real.php';
    2121
    22 return ComposerAutoloaderInit0382e0644fae7cd5247775f6ea49cb88::getLoader();
     22return ComposerAutoloaderInit2b259b51f87deb57726fd6be9f32d885::getLoader();
  • sg-ai-studio/trunk/vendor/composer/autoload_classmap.php

    r3505951 r3562098  
    77
    88return array(
     9    'Attribute' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/Attribute.php',
    910    'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php',
     11    'PhpToken' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/PhpToken.php',
     12    'Stringable' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/Stringable.php',
     13    'UnhandledMatchError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php',
     14    'ValueError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/ValueError.php',
    1015);
  • sg-ai-studio/trunk/vendor/composer/autoload_files.php

    r3519232 r3562098  
    77
    88return array(
     9    '6e3fae29631ef280660b3cdad06f25a8' => $vendorDir . '/symfony/deprecation-contracts/function.php',
     10    'a4a119a56e50fbb293281d9a48007e0e' => $vendorDir . '/symfony/polyfill-php80/bootstrap.php',
    911    '7b11c4dc42b3b3023073cb14e519683c' => $vendorDir . '/ralouphie/getallheaders/src/getallheaders.php',
    10     '6e3fae29631ef280660b3cdad06f25a8' => $vendorDir . '/symfony/deprecation-contracts/function.php',
    1112    '37a3dc5111fe8f707ab4c132ef1dbc62' => $vendorDir . '/guzzlehttp/guzzle/src/functions_include.php',
    1213);
  • sg-ai-studio/trunk/vendor/composer/autoload_psr4.php

    r3538917 r3562098  
    77
    88return array(
     9    'Symfony\\Polyfill\\Php80\\' => array($vendorDir . '/symfony/polyfill-php80'),
    910    'SiteGround_i18n\\' => array($vendorDir . '/siteground/siteground-i18n/src'),
    1011    'SiteGround_Helper\\' => array($vendorDir . '/siteground/siteground-helper/src'),
  • sg-ai-studio/trunk/vendor/composer/autoload_real.php

    r3519232 r3562098  
    33// autoload_real.php @generated by Composer
    44
    5 class ComposerAutoloaderInit0382e0644fae7cd5247775f6ea49cb88
     5class ComposerAutoloaderInit2b259b51f87deb57726fd6be9f32d885
    66{
    77    private static $loader;
    … …  
    2525        require __DIR__ . '/platform_check.php';
    2626
    27         spl_autoload_register(array('ComposerAutoloaderInit0382e0644fae7cd5247775f6ea49cb88', 'loadClassLoader'), true, true);
     27        spl_autoload_register(array('ComposerAutoloaderInit2b259b51f87deb57726fd6be9f32d885', 'loadClassLoader'), true, true);
    2828        self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__));
    29         spl_autoload_unregister(array('ComposerAutoloaderInit0382e0644fae7cd5247775f6ea49cb88', 'loadClassLoader'));
     29        spl_autoload_unregister(array('ComposerAutoloaderInit2b259b51f87deb57726fd6be9f32d885', 'loadClassLoader'));
    3030
    3131        require __DIR__ . '/autoload_static.php';
    32         call_user_func(\Composer\Autoload\ComposerStaticInit0382e0644fae7cd5247775f6ea49cb88::getInitializer($loader));
     32        call_user_func(\Composer\Autoload\ComposerStaticInit2b259b51f87deb57726fd6be9f32d885::getInitializer($loader));
    3333
    3434        $loader->register(true);
    3535
    36         $filesToLoad = \Composer\Autoload\ComposerStaticInit0382e0644fae7cd5247775f6ea49cb88::$files;
     36        $filesToLoad = \Composer\Autoload\ComposerStaticInit2b259b51f87deb57726fd6be9f32d885::$files;
    3737        $requireFile = \Closure::bind(static function ($fileIdentifier, $file) {
    3838            if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
  • sg-ai-studio/trunk/vendor/composer/autoload_static.php

    r3538917 r3562098  
    55namespace Composer\Autoload;
    66
    7 class ComposerStaticInit0382e0644fae7cd5247775f6ea49cb88
     7class ComposerStaticInit2b259b51f87deb57726fd6be9f32d885
    88{
    99    public static $files = array (
     10        '6e3fae29631ef280660b3cdad06f25a8' => __DIR__ . '/..' . '/symfony/deprecation-contracts/function.php',
     11        'a4a119a56e50fbb293281d9a48007e0e' => __DIR__ . '/..' . '/symfony/polyfill-php80/bootstrap.php',
    1012        '7b11c4dc42b3b3023073cb14e519683c' => __DIR__ . '/..' . '/ralouphie/getallheaders/src/getallheaders.php',
    11         '6e3fae29631ef280660b3cdad06f25a8' => __DIR__ . '/..' . '/symfony/deprecation-contracts/function.php',
    1213        '37a3dc5111fe8f707ab4c132ef1dbc62' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/functions_include.php',
    1314    );
    … …  
    1617        'S' =>
    1718        array (
     19            'Symfony\\Polyfill\\Php80\\' => 23,
    1820            'SiteGround_i18n\\' => 16,
    1921            'SiteGround_Helper\\' => 18,
    … …  
    4345
    4446    public static $prefixDirsPsr4 = array (
     47        'Symfony\\Polyfill\\Php80\\' =>
     48        array (
     49            0 => __DIR__ . '/..' . '/symfony/polyfill-php80',
     50        ),
    4551        'SiteGround_i18n\\' =>
    4652        array (
    … …  
    101107
    102108    public static $classMap = array (
     109        'Attribute' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/Attribute.php',
    103110        'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php',
     111        'PhpToken' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/PhpToken.php',
     112        'Stringable' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/Stringable.php',
     113        'UnhandledMatchError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php',
     114        'ValueError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/ValueError.php',
    104115    );
    105116
    … …  
    107118    {
    108119        return \Closure::bind(function () use ($loader) {
    109             $loader->prefixLengthsPsr4 = ComposerStaticInit0382e0644fae7cd5247775f6ea49cb88::$prefixLengthsPsr4;
    110             $loader->prefixDirsPsr4 = ComposerStaticInit0382e0644fae7cd5247775f6ea49cb88::$prefixDirsPsr4;
    111             $loader->prefixesPsr0 = ComposerStaticInit0382e0644fae7cd5247775f6ea49cb88::$prefixesPsr0;
    112             $loader->classMap = ComposerStaticInit0382e0644fae7cd5247775f6ea49cb88::$classMap;
     120            $loader->prefixLengthsPsr4 = ComposerStaticInit2b259b51f87deb57726fd6be9f32d885::$prefixLengthsPsr4;
     121            $loader->prefixDirsPsr4 = ComposerStaticInit2b259b51f87deb57726fd6be9f32d885::$prefixDirsPsr4;
     122            $loader->prefixesPsr0 = ComposerStaticInit2b259b51f87deb57726fd6be9f32d885::$prefixesPsr0;
     123            $loader->classMap = ComposerStaticInit2b259b51f87deb57726fd6be9f32d885::$classMap;
    113124
    114125        }, null, ClassLoader::class);
  • sg-ai-studio/trunk/vendor/composer/installed.json

    r3561022 r3562098  
    5858        {
    5959            "name": "firebase/php-jwt",
    60             "version": "v7.0.5",
    61             "version_normalized": "7.0.5.0",
     60            "version": "v6.10.0",
     61            "version_normalized": "6.10.0.0",
    6262            "source": {
    6363                "type": "git",
    6464                "url": "https://github.com/googleapis/php-jwt.git",
    65                 "reference": "47ad26bab5e7c70ae8a6f08ed25ff83631121380"
    66             },
    67             "dist": {
    68                 "type": "zip",
    69                 "url": "https://api.github.com/repos/googleapis/php-jwt/zipball/47ad26bab5e7c70ae8a6f08ed25ff83631121380",
    70                 "reference": "47ad26bab5e7c70ae8a6f08ed25ff83631121380",
    71                 "shasum": ""
    72             },
    73             "require": {
    74                 "php": "^8.0"
     65                "reference": "a49db6f0a5033aef5143295342f1c95521b075ff"
     66            },
     67            "dist": {
     68                "type": "zip",
     69                "url": "https://api.github.com/repos/googleapis/php-jwt/zipball/a49db6f0a5033aef5143295342f1c95521b075ff",
     70                "reference": "a49db6f0a5033aef5143295342f1c95521b075ff",
     71                "shasum": ""
     72            },
     73            "require": {
     74                "php": "^7.4||^8.0"
    7575            },
    7676            "require-dev": {
    77                 "guzzlehttp/guzzle": "^7.4",
    78                 "phpfastcache/phpfastcache": "^9.2",
     77                "guzzlehttp/guzzle": "^6.5||^7.4",
    7978                "phpspec/prophecy-phpunit": "^2.0",
    8079                "phpunit/phpunit": "^9.5",
    81                 "psr/cache": "^2.0||^3.0",
     80                "psr/cache": "^1.0||^2.0",
    8281                "psr/http-client": "^1.0",
    8382                "psr/http-factory": "^1.0"
    … …  
    8786                "paragonie/sodium_compat": "Support EdDSA (Ed25519) signatures when libsodium is not present"
    8887            },
    89             "time": "2026-04-01T20:38:03+00:00",
     88            "time": "2023-12-01T16:26:39+00:00",
    9089            "type": "library",
    9190            "installation-source": "dist",
    … …  
    119118            "support": {
    120119                "issues": "https://github.com/googleapis/php-jwt/issues",
    121                 "source": "https://github.com/googleapis/php-jwt/tree/v7.0.5"
     120                "source": "https://github.com/googleapis/php-jwt/tree/v6.10.0"
    122121            },
    123122            "install-path": "../firebase/php-jwt"
    … …  
    125124        {
    126125            "name": "guzzlehttp/guzzle",
    127             "version": "7.10.6",
    128             "version_normalized": "7.10.6.0",
     126            "version": "7.11.0",
     127            "version_normalized": "7.11.0.0",
    129128            "source": {
    130129                "type": "git",
    131130                "url": "https://github.com/guzzle/guzzle.git",
    132                 "reference": "e7412b3180912c01650cc66647f18c1d1cbe9b94"
    133             },
    134             "dist": {
    135                 "type": "zip",
    136                 "url": "https://api.github.com/repos/guzzle/guzzle/zipball/e7412b3180912c01650cc66647f18c1d1cbe9b94",
    137                 "reference": "e7412b3180912c01650cc66647f18c1d1cbe9b94",
     131                "reference": "c987f8ce84b8434fa430795eca0f3430663da72b"
     132            },
     133            "dist": {
     134                "type": "zip",
     135                "url": "https://api.github.com/repos/guzzle/guzzle/zipball/c987f8ce84b8434fa430795eca0f3430663da72b",
     136                "reference": "c987f8ce84b8434fa430795eca0f3430663da72b",
    138137                "shasum": ""
    139138            },
    140139            "require": {
    141140                "ext-json": "*",
    142                 "guzzlehttp/promises": "^2.3",
    143                 "guzzlehttp/psr7": "^2.8",
     141                "guzzlehttp/promises": "^2.5",
     142                "guzzlehttp/psr7": "^2.11",
    144143                "php": "^7.2.5 || ^8.0",
    145144                "psr/http-client": "^1.0",
    146                 "symfony/deprecation-contracts": "^2.2 || ^3.0"
     145                "symfony/deprecation-contracts": "^2.5 || ^3.0",
     146                "symfony/polyfill-php80": "^1.24"
    147147            },
    148148            "provide": {
    … …  
    163163                "psr/log": "Required for using the Log middleware"
    164164            },
    165             "time": "2026-06-01T13:06:22+00:00",
     165            "time": "2026-06-02T12:40:51+00:00",
    166166            "type": "library",
    167167            "extra": {
    … …  
    235235            "support": {
    236236                "issues": "https://github.com/guzzle/guzzle/issues",
    237                 "source": "https://github.com/guzzle/guzzle/tree/7.10.6"
     237                "source": "https://github.com/guzzle/guzzle/tree/7.11.0"
    238238            },
    239239            "funding": [
    … …  
    255255        {
    256256            "name": "guzzlehttp/promises",
    257             "version": "2.4.1",
    258             "version_normalized": "2.4.1.0",
     257            "version": "2.5.0",
     258            "version_normalized": "2.5.0.0",
    259259            "source": {
    260260                "type": "git",
    261261                "url": "https://github.com/guzzle/promises.git",
    262                 "reference": "09e8a212562fb1fb6a512c4156ed71525969d6c2"
    263             },
    264             "dist": {
    265                 "type": "zip",
    266                 "url": "https://api.github.com/repos/guzzle/promises/zipball/09e8a212562fb1fb6a512c4156ed71525969d6c2",
    267                 "reference": "09e8a212562fb1fb6a512c4156ed71525969d6c2",
    268                 "shasum": ""
    269             },
    270             "require": {
    271                 "php": "^7.2.5 || ^8.0"
     262                "reference": "4360e982f87f5f258bf872d094647791db2f4c8e"
     263            },
     264            "dist": {
     265                "type": "zip",
     266                "url": "https://api.github.com/repos/guzzle/promises/zipball/4360e982f87f5f258bf872d094647791db2f4c8e",
     267                "reference": "4360e982f87f5f258bf872d094647791db2f4c8e",
     268                "shasum": ""
     269            },
     270            "require": {
     271                "php": "^7.2.5 || ^8.0",
     272                "symfony/deprecation-contracts": "^2.5 || ^3.0"
    272273            },
    273274            "require-dev": {
    … …  
    275276                "phpunit/phpunit": "^8.5.52 || ^9.6.34"
    276277            },
    277             "time": "2026-05-20T22:57:30+00:00",
     278            "time": "2026-06-02T12:23:43+00:00",
    278279            "type": "library",
    279280            "extra": {
    … …  
    321322            "support": {
    322323                "issues": "https://github.com/guzzle/promises/issues",
    323                 "source": "https://github.com/guzzle/promises/tree/2.4.1"
     324                "source": "https://github.com/guzzle/promises/tree/2.5.0"
    324325            },
    325326            "funding": [
    … …  
    341342        {
    342343            "name": "guzzlehttp/psr7",
    343             "version": "2.10.4",
    344             "version_normalized": "2.10.4.0",
     344            "version": "2.11.0",
     345            "version_normalized": "2.11.0.0",
    345346            "source": {
    346347                "type": "git",
    347348                "url": "https://github.com/guzzle/psr7.git",
    348                 "reference": "d2a1a094e396da8957e797489fddaf860c340cfc"
    349             },
    350             "dist": {
    351                 "type": "zip",
    352                 "url": "https://api.github.com/repos/guzzle/psr7/zipball/d2a1a094e396da8957e797489fddaf860c340cfc",
    353                 "reference": "d2a1a094e396da8957e797489fddaf860c340cfc",
     349                "reference": "bbb5e61349fa5cb822b3e87842b951088b76b81f"
     350            },
     351            "dist": {
     352                "type": "zip",
     353                "url": "https://api.github.com/repos/guzzle/psr7/zipball/bbb5e61349fa5cb822b3e87842b951088b76b81f",
     354                "reference": "bbb5e61349fa5cb822b3e87842b951088b76b81f",
    354355                "shasum": ""
    355356            },
    … …  
    358359                "psr/http-factory": "^1.0",
    359360                "psr/http-message": "^1.1 || ^2.0",
    360                 "ralouphie/getallheaders": "^3.0"
     361                "ralouphie/getallheaders": "^3.0",
     362                "symfony/deprecation-contracts": "^2.5 || ^3.0",
     363                "symfony/polyfill-php80": "^1.24"
    361364            },
    362365            "provide": {
    … …  
    373376                "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses"
    374377            },
    375             "time": "2026-05-29T12:59:07+00:00",
     378            "time": "2026-06-02T12:30:48+00:00",
    376379            "type": "library",
    377380            "extra": {
    … …  
    441444            "support": {
    442445                "issues": "https://github.com/guzzle/psr7/issues",
    443                 "source": "https://github.com/guzzle/psr7/tree/2.10.4"
     446                "source": "https://github.com/guzzle/psr7/tree/2.11.0"
    444447            },
    445448            "funding": [
    … …  
    844847            ],
    845848            "install-path": "../symfony/deprecation-contracts"
     849        },
     850        {
     851            "name": "symfony/polyfill-php80",
     852            "version": "v1.37.0",
     853            "version_normalized": "1.37.0.0",
     854            "source": {
     855                "type": "git",
     856                "url": "https://github.com/symfony/polyfill-php80.git",
     857                "reference": "dfb55726c3a76ea3b6459fcfda1ec2d80a682411"
     858            },
     859            "dist": {
     860                "type": "zip",
     861                "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/dfb55726c3a76ea3b6459fcfda1ec2d80a682411",
     862                "reference": "dfb55726c3a76ea3b6459fcfda1ec2d80a682411",
     863                "shasum": ""
     864            },
     865            "require": {
     866                "php": ">=7.2"
     867            },
     868            "time": "2026-04-10T16:19:22+00:00",
     869            "type": "library",
     870            "extra": {
     871                "thanks": {
     872                    "url": "https://github.com/symfony/polyfill",
     873                    "name": "symfony/polyfill"
     874                }
     875            },
     876            "installation-source": "dist",
     877            "autoload": {
     878                "files": [
     879                    "bootstrap.php"
     880                ],
     881                "psr-4": {
     882                    "Symfony\\Polyfill\\Php80\\": ""
     883                },
     884                "classmap": [
     885                    "Resources/stubs"
     886                ]
     887            },
     888            "notification-url": "https://packagist.org/downloads/",
     889            "license": [
     890                "MIT"
     891            ],
     892            "authors": [
     893                {
     894                    "name": "Ion Bazan",
     895                    "email": "ion.bazan@gmail.com"
     896                },
     897                {
     898                    "name": "Nicolas Grekas",
     899                    "email": "p@tchwork.com"
     900                },
     901                {
     902                    "name": "Symfony Community",
     903                    "homepage": "https://symfony.com/contributors"
     904                }
     905            ],
     906            "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions",
     907            "homepage": "https://symfony.com",
     908            "keywords": [
     909                "compatibility",
     910                "polyfill",
     911                "portable",
     912                "shim"
     913            ],
     914            "support": {
     915                "source": "https://github.com/symfony/polyfill-php80/tree/v1.37.0"
     916            },
     917            "funding": [
     918                {
     919                    "url": "https://symfony.com/sponsor",
     920                    "type": "custom"
     921                },
     922                {
     923                    "url": "https://github.com/fabpot",
     924                    "type": "github"
     925                },
     926                {
     927                    "url": "https://github.com/nicolas-grekas",
     928                    "type": "github"
     929                },
     930                {
     931                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
     932                    "type": "tidelift"
     933                }
     934            ],
     935            "install-path": "../symfony/polyfill-php80"
    846936        }
    847937    ],
  • sg-ai-studio/trunk/vendor/composer/installed.php

    r3561022 r3562098  
    44        'pretty_version' => 'dev-main',
    55        'version' => 'dev-main',
    6         'reference' => 'fe7f077ab47315f1680beb74b0f655f9464be3d1',
     6        'reference' => '14a6fc2fa2e15bfbe1bc3422e874d18c9ac7a87c',
    77        'type' => 'wordpress-plugin',
    88        'install_path' => __DIR__ . '/../../',
    … …  
    2323        ),
    2424        'firebase/php-jwt' => array(
    25             'pretty_version' => 'v7.0.5',
    26             'version' => '7.0.5.0',
    27             'reference' => '47ad26bab5e7c70ae8a6f08ed25ff83631121380',
     25            'pretty_version' => 'v6.10.0',
     26            'version' => '6.10.0.0',
     27            'reference' => 'a49db6f0a5033aef5143295342f1c95521b075ff',
    2828            'type' => 'library',
    2929            'install_path' => __DIR__ . '/../firebase/php-jwt',
    … …  
    3232        ),
    3333        'guzzlehttp/guzzle' => array(
    34             'pretty_version' => '7.10.6',
    35             'version' => '7.10.6.0',
    36             'reference' => 'e7412b3180912c01650cc66647f18c1d1cbe9b94',
     34            'pretty_version' => '7.11.0',
     35            'version' => '7.11.0.0',
     36            'reference' => 'c987f8ce84b8434fa430795eca0f3430663da72b',
    3737            'type' => 'library',
    3838            'install_path' => __DIR__ . '/../guzzlehttp/guzzle',
    … …  
    4141        ),
    4242        'guzzlehttp/promises' => array(
    43             'pretty_version' => '2.4.1',
    44             'version' => '2.4.1.0',
    45             'reference' => '09e8a212562fb1fb6a512c4156ed71525969d6c2',
     43            'pretty_version' => '2.5.0',
     44            'version' => '2.5.0.0',
     45            'reference' => '4360e982f87f5f258bf872d094647791db2f4c8e',
    4646            'type' => 'library',
    4747            'install_path' => __DIR__ . '/../guzzlehttp/promises',
    … …  
    5050        ),
    5151        'guzzlehttp/psr7' => array(
    52             'pretty_version' => '2.10.4',
    53             'version' => '2.10.4.0',
    54             'reference' => 'd2a1a094e396da8957e797489fddaf860c340cfc',
     52            'pretty_version' => '2.11.0',
     53            'version' => '2.11.0.0',
     54            'reference' => 'bbb5e61349fa5cb822b3e87842b951088b76b81f',
    5555            'type' => 'library',
    5656            'install_path' => __DIR__ . '/../guzzlehttp/psr7',
    … …  
    124124            'pretty_version' => 'dev-main',
    125125            'version' => 'dev-main',
    126             'reference' => 'fe7f077ab47315f1680beb74b0f655f9464be3d1',
     126            'reference' => '14a6fc2fa2e15bfbe1bc3422e874d18c9ac7a87c',
    127127            'type' => 'wordpress-plugin',
    128128            'install_path' => __DIR__ . '/../../',
    … …  
    161161            'dev_requirement' => false,
    162162        ),
     163        'symfony/polyfill-php80' => array(
     164            'pretty_version' => 'v1.37.0',
     165            'version' => '1.37.0.0',
     166            'reference' => 'dfb55726c3a76ea3b6459fcfda1ec2d80a682411',
     167            'type' => 'library',
     168            'install_path' => __DIR__ . '/../symfony/polyfill-php80',
     169            'aliases' => array(),
     170            'dev_requirement' => false,
     171        ),
    163172    ),
    164173);
  • sg-ai-studio/trunk/vendor/composer/platform_check.php

    r3561022 r3562098  
    55$issues = array();
    66
    7 if (!(PHP_VERSION_ID >= 80000)) {
    8     $issues[] = 'Your Composer dependencies require a PHP version ">= 8.0.0". You are running ' . PHP_VERSION . '.';
     7if (!(PHP_VERSION_ID >= 70400)) {
     8    $issues[] = 'Your Composer dependencies require a PHP version ">= 7.4.0". You are running ' . PHP_VERSION . '.';
    99}
    1010
  • sg-ai-studio/trunk/vendor/firebase/php-jwt/CHANGELOG.md

    r3561022 r3562098  
    11# Changelog
    2 
    3 ## [7.0.5](https://github.com/firebase/php-jwt/compare/v7.0.4...v7.0.5) (2026-03-31)
    4 
    5 
    6 ### Bug Fixes
    7 
    8 * RSA from JWK sometimes returns empty Instance ([#628](https://github.com/firebase/php-jwt/issues/628)) ([b4c78aa](https://github.com/firebase/php-jwt/commit/b4c78aa731664122198ad36c0033aa29e807397a))
    9 
    10 ## [7.0.4](https://github.com/firebase/php-jwt/compare/v7.0.3...v7.0.4) (2026-03-27)
    11 
    12 
    13 ### Bug Fixes
    14 
    15 * readme examples, add tests for all examples ([#626](https://github.com/firebase/php-jwt/issues/626)) ([510a00c](https://github.com/firebase/php-jwt/commit/510a00c0e6353bc7d68412fab67e57a13954cb46))
    16 * use urlsafeB64Decode everywhere ([#627](https://github.com/firebase/php-jwt/issues/627)) ([b889495](https://github.com/firebase/php-jwt/commit/b889495c83ddc3f3885ca3f0b65b41b1cb37a3b1))
    17 
    18 ## [7.0.3](https://github.com/firebase/php-jwt/compare/v7.0.2...v7.0.3) (2026-02-18)
    19 
    20 
    21 ### Miscellaneous Chores
    22 
    23 * add environment for Release Please job ([#619](https://github.com/firebase/php-jwt/issues/619)) ([300fd02](https://github.com/firebase/php-jwt/commit/300fd02c883f096c9067df652dbd23f62cb5e2a7))
    24 
    25 ## [7.0.2](https://github.com/firebase/php-jwt/compare/v7.0.1...v7.0.2) (2025-12-16)
    26 
    27 
    28 ### Bug Fixes
    29 
    30 * add key length validation for ec keys ([#615](https://github.com/firebase/php-jwt/issues/615)) ([7044f9a](https://github.com/firebase/php-jwt/commit/7044f9ae7e7d175d28cca71714feb236f1c0e252))
    31 
    32 ## [7.0.0](https://github.com/firebase/php-jwt/compare/v6.11.1...v7.0.0) (2025-12-15)
    33 
    34 
    35 ### ⚠️ ⚠️ ⚠️  Security Fixes ⚠️ ⚠️ ⚠️
    36  * add key size validation ([#613](https://github.com/firebase/php-jwt/issues/613)) ([6b80341](https://github.com/firebase/php-jwt/commit/6b80341bf57838ea2d011487917337901cd71576))
    37  **NOTE**: This fix will cause keys with a size below the minimally allowed size to break.
    38 
    39 ### Features
    40 
    41 * add SensitiveParameter attribute to security-critical parameters ([#603](https://github.com/firebase/php-jwt/issues/603)) ([4dbfac0](https://github.com/firebase/php-jwt/commit/4dbfac0260eeb0e9e643063c99998e3219cc539b))
    42 * store timestamp in `ExpiredException` ([#604](https://github.com/firebase/php-jwt/issues/604)) ([f174826](https://github.com/firebase/php-jwt/commit/f1748260d218a856b6a0c23715ac7fae1d7ca95b))
    43 
    44 
    45 ### Bug Fixes
    46 
    47 * validate iat and nbf on payload ([#568](https://github.com/firebase/php-jwt/issues/568)) ([953b2c8](https://github.com/firebase/php-jwt/commit/953b2c88bb445b7e3bb82a5141928f13d7343afd))
    48 
    49 ## [6.11.1](https://github.com/firebase/php-jwt/compare/v6.11.0...v6.11.1) (2025-04-09)
    50 
    51 
    52 ### Bug Fixes
    53 
    54 * update error text for consistency ([#528](https://github.com/firebase/php-jwt/issues/528)) ([c11113a](https://github.com/firebase/php-jwt/commit/c11113afa13265e016a669e75494b9203b8a7775))
    55 
    56 ## [6.11.0](https://github.com/firebase/php-jwt/compare/v6.10.2...v6.11.0) (2025-01-23)
    57 
    58 
    59 ### Features
    60 
    61 * support octet typed JWK ([#587](https://github.com/firebase/php-jwt/issues/587)) ([7cb8a26](https://github.com/firebase/php-jwt/commit/7cb8a265fa81edf2fa6ef8098f5bc5ae573c33ad))
    62 
    63 
    64 ### Bug Fixes
    65 
    66 * refactor constructor Key to use PHP 8.0 syntax ([#577](https://github.com/firebase/php-jwt/issues/577)) ([29fa2ce](https://github.com/firebase/php-jwt/commit/29fa2ce9e0582cd397711eec1e80c05ce20fabca))
    67 
    68 ## [6.10.2](https://github.com/firebase/php-jwt/compare/v6.10.1...v6.10.2) (2024-11-24)
    69 
    70 
    71 ### Bug Fixes
    72 
    73 * Mitigate PHP8.4 deprecation warnings ([#570](https://github.com/firebase/php-jwt/issues/570)) ([76808fa](https://github.com/firebase/php-jwt/commit/76808fa227f3811aa5cdb3bf81233714b799a5b5))
    74 * support php 8.4 ([#583](https://github.com/firebase/php-jwt/issues/583)) ([e3d68b0](https://github.com/firebase/php-jwt/commit/e3d68b044421339443c74199edd020e03fb1887e))
    75 
    76 ## [6.10.1](https://github.com/firebase/php-jwt/compare/v6.10.0...v6.10.1) (2024-05-18)
    77 
    78 
    79 ### Bug Fixes
    80 
    81 * ensure ratelimit expiry is set every time ([#556](https://github.com/firebase/php-jwt/issues/556)) ([09cb208](https://github.com/firebase/php-jwt/commit/09cb2081c2c3bc0f61e2f2a5fbea5741f7498648))
    82 * ratelimit cache expiration ([#550](https://github.com/firebase/php-jwt/issues/550)) ([dda7250](https://github.com/firebase/php-jwt/commit/dda725033585ece30ff8cae8937320d7e9f18bae))
    832
    843## [6.10.0](https://github.com/firebase/php-jwt/compare/v6.9.0...v6.10.0) (2023-11-28)
  • sg-ai-studio/trunk/vendor/firebase/php-jwt/README.md

    r3561022 r3562098  
    1818
    1919Optionally, install the `paragonie/sodium_compat` package from composer if your
    20 php env does not have libsodium installed:
     20php is < 7.2 or does not have libsodium installed:
    2121
    2222```bash
    … …  
    2424```
    2525
    26 ## Example
    27 
     26Example
     27-------
    2828```php
    2929use Firebase\JWT\JWT;
    3030use Firebase\JWT\Key;
    3131
    32 $key = 'example_key_of_sufficient_length';
    33 $payload = [
    34     'iss' => 'example.org',
    35     'aud' => 'example.com',
     32$key = 'example_key';
     33$payload = [
     34    'iss' => 'http://example.org',
     35    'aud' => 'http://example.com',
    3636    'iat' => 1356999524,
    3737    'nbf' => 1357000000
    … …  
    4949
    5050// Pass a stdClass in as the third parameter to get the decoded header values
    51 $headers = new stdClass();
    52 $decoded = JWT::decode($jwt, new Key($key, 'HS256'), $headers);
     51$decoded = JWT::decode($jwt, new Key($key, 'HS256'), $headers = new stdClass());
    5352print_r($headers);
    5453
    … …  
    7069$decoded = JWT::decode($jwt, new Key($key, 'HS256'));
    7170```
    72 
    73 ## Example encode/decode headers
    74 
     71Example encode/decode headers
     72-------
    7573Decoding the JWT headers without verifying the JWT first is NOT recommended, and is not supported by
    7674this library. This is because without verifying the JWT, the header values could have been tampered with.
    … …  
    8280use Firebase\JWT\JWT;
    8381
    84 $key = 'example_key_of_sufficient_length';
    85 $payload = [
    86     'iss' => 'example.org',
    87     'aud' => 'example.com',
     82$key = 'example_key';
     83$payload = [
     84    'iss' => 'http://example.org',
     85    'aud' => 'http://example.com',
    8886    'iat' => 1356999524,
    8987    'nbf' => 1357000000
    … …  
    105103print_r($decoded);
    106104```
    107 
    108 ## Example with RS256 (openssl)
    109 
     105Example with RS256 (openssl)
     106----------------------------
    110107```php
    111108use Firebase\JWT\JWT;
    … …  
    175172```
    176173
    177 ## Example with a passphrase
     174Example with a passphrase
     175-------------------------
    178176
    179177```php
    … …  
    188186$privateKeyFile = '/path/to/key-with-passphrase.pem';
    189187
    190 /** @var OpenSSLAsymmetricKey $privateKey */
     188// Create a private key of type "resource"
    191189$privateKey = openssl_pkey_get_private(
    192190    file_get_contents($privateKeyFile),
    … …  
    211209```
    212210
    213 ## Example with EdDSA (libsodium and Ed25519 signature)
    214 
     211Example with EdDSA (libsodium and Ed25519 signature)
     212----------------------------
    215213```php
    216214use Firebase\JWT\JWT;
    … …  
    240238$decoded = JWT::decode($jwt, new Key($publicKey, 'EdDSA'));
    241239echo "Decode:\n" . print_r((array) $decoded, true) . "\n";
    242 ```
    243 
    244 ## Example with multiple keys
    245 
     240````
     241
     242Example with multiple keys
     243--------------------------
    246244```php
    247245use Firebase\JWT\JWT;
    … …  
    249247
    250248// Example RSA keys from previous example
    251 // $privateRsKey = '...';
    252 // $publicRsKey = '...';
     249// $privateKey1 = '...';
     250// $publicKey1 = '...';
    253251
    254252// Example EdDSA keys from previous example
    255 // $privateEcKey = '...';
    256 // $publicEcKey = '...';
     253// $privateKey2 = '...';
     254// $publicKey2 = '...';
    257255
    258256$payload = [
    … …  
    263261];
    264262
    265 $jwt1 = JWT::encode($payload, $privateRsKey, 'RS256', 'kid1');
    266 $jwt2 = JWT::encode($payload, $privateEcKey, 'EdDSA', 'kid2');
     263$jwt1 = JWT::encode($payload, $privateKey1, 'RS256', 'kid1');
     264$jwt2 = JWT::encode($payload, $privateKey2, 'EdDSA', 'kid2');
    267265echo "Encode 1:\n" . print_r($jwt1, true) . "\n";
    268266echo "Encode 2:\n" . print_r($jwt2, true) . "\n";
    269267
    270268$keys = [
    271     'kid1' => new Key($publicRsKey, 'RS256'),
    272     'kid2' => new Key($publicEcKey, 'EdDSA'),
     269    'kid1' => new Key($publicKey1, 'RS256'),
     270    'kid2' => new Key($publicKey2, 'EdDSA'),
    273271];
    274272
    … …  
    280278```
    281279
    282 ## Using JWKs
     280Using JWKs
     281----------
    283282
    284283```php
    … …  
    292291// JWK::parseKeySet($jwks) returns an associative array of **kid** to Firebase\JWT\Key
    293292// objects. Pass this as the second parameter to JWT::decode.
    294 $decoded = JWT::decode($jwt, JWK::parseKeySet($jwks));
    295 print_r($decoded);
    296 ```
    297 
    298 ## Using Cached Key Sets
     293JWT::decode($payload, JWK::parseKeySet($jwks));
     294```
     295
     296Using Cached Key Sets
     297---------------------
    299298
    300299The `CachedKeySet` class can be used to fetch and cache JWKS (JSON Web Key Sets) from a public URI.
    … …  
    316315
    317316// Create an HTTP request factory (can be any PSR-17 compatible HTTP request factory)
    318 $httpFactory = new GuzzleHttp\Psr7\HttpFactory();
     317$httpFactory = new GuzzleHttp\Psr\HttpFactory();
    319318
    320319// Create a cache item pool (can be any PSR-6 compatible cache item pool)
    … …  
    351350
    352351try {
    353     $decoded = JWT::decode($jwt, $keys);
     352    $decoded = JWT::decode($payload, $keys);
    354353} catch (InvalidArgumentException $e) {
    355354    // provided key/key-array is empty or malformed.
    … …  
    381380use UnexpectedValueException;
    382381try {
    383     $decoded = JWT::decode($jwt, $keys);
     382    $decoded = JWT::decode($payload, $keys);
    384383} catch (LogicException $e) {
    385384    // errors having to do with environmental setup or malformed JWT Keys
    … …  
    396395```php
    397396// return type is stdClass
    398 $decoded = JWT::decode($jwt, $keys);
     397$decoded = JWT::decode($payload, $keys);
    399398
    400399// cast to array
    … …  
    407406
    408407```bash
    409 $ composer update
    410 $ vendor/bin/phpunit -c phpunit.xml.dist
     408$ pear install PHPUnit
     409$ phpunit --configuration phpunit.xml.dist
    411410PHPUnit 3.7.10 by Sebastian Bergmann.
    412411.....
  • sg-ai-studio/trunk/vendor/firebase/php-jwt/src/CachedKeySet.php

    r3561022 r3562098  
    8181        RequestFactoryInterface $httpFactory,
    8282        CacheItemPoolInterface $cache,
    83         ?int $expiresAfter = null,
     83        int $expiresAfter = null,
    8484        bool $rateLimit = false,
    85         ?string $defaultAlg = null
     85        string $defaultAlg = null
    8686    ) {
    8787        $this->jwksUri = $jwksUri;
    … …  
    181181            if ($jwksResponse->getStatusCode() !== 200) {
    182182                throw new UnexpectedValueException(
    183                     \sprintf(
    184                         'HTTP Error: %d %s for URI "%s"',
     183                    sprintf('HTTP Error: %d %s for URI "%s"',
    185184                        $jwksResponse->getStatusCode(),
    186185                        $jwksResponse->getReasonPhrase(),
    … …  
    214213
    215214        $cacheItem = $this->cache->getItem($this->rateLimitCacheKey);
    216 
    217         $cacheItemData = [];
    218         if ($cacheItem->isHit() && \is_array($data = $cacheItem->get())) {
    219             $cacheItemData = $data;
    220         }
    221 
    222         $callsPerMinute = $cacheItemData['callsPerMinute'] ?? 0;
    223         $expiry = $cacheItemData['expiry'] ?? new \DateTime('+60 seconds', new \DateTimeZone('UTC'));
    224 
     215        if (!$cacheItem->isHit()) {
     216            $cacheItem->expiresAfter(1); // # of calls are cached each minute
     217        }
     218
     219        $callsPerMinute = (int) $cacheItem->get();
    225220        if (++$callsPerMinute > $this->maxCallsPerMinute) {
    226221            return true;
    227222        }
    228 
    229         $cacheItem->set(['expiry' => $expiry, 'callsPerMinute' => $callsPerMinute]);
    230         $cacheItem->expiresAt($expiry);
     223        $cacheItem->set($callsPerMinute);
    231224        $this->cache->save($cacheItem);
    232225        return false;
  • sg-ai-studio/trunk/vendor/firebase/php-jwt/src/ExpiredException.php

    r3561022 r3562098  
    66{
    77    private object $payload;
    8 
    9     private ?int $timestamp = null;
    108
    119    public function setPayload(object $payload): void
    … …  
    1816        return $this->payload;
    1917    }
    20 
    21     public function setTimestamp(int $timestamp): void
    22     {
    23         $this->timestamp = $timestamp;
    24     }
    25 
    26     public function getTimestamp(): ?int
    27     {
    28         return $this->timestamp;
    29     }
    3018}
  • sg-ai-studio/trunk/vendor/firebase/php-jwt/src/JWK.php

    r3561022 r3562098  
    5353     * @uses parseKey
    5454     */
    55     public static function parseKeySet(#[\SensitiveParameter] array $jwks, ?string $defaultAlg = null): array
     55    public static function parseKeySet(array $jwks, string $defaultAlg = null): array
    5656    {
    5757        $keys = [];
    … …  
    9494     * @uses createPemFromModulusAndExponent
    9595     */
    96     public static function parseKey(#[\SensitiveParameter] array $jwk, ?string $defaultAlg = null): ?Key
     96    public static function parseKey(array $jwk, string $defaultAlg = null): ?Key
    9797    {
    9898        if (empty($jwk)) {
    … …  
    173173                $publicKey = JWT::convertBase64urlToBase64($jwk['x']);
    174174                return new Key($publicKey, $jwk['alg']);
    175             case 'oct':
    176                 if (!isset($jwk['k'])) {
    177                     throw new UnexpectedValueException('k not set');
    178                 }
    179 
    180                 return new Key(JWT::urlsafeB64Decode($jwk['k']), $jwk['alg']);
    181175            default:
    182176                break;
    … …  
    219213            );
    220214
    221         return \sprintf(
     215        return sprintf(
    222216            "-----BEGIN PUBLIC KEY-----\n%s\n-----END PUBLIC KEY-----\n",
    223217            wordwrap(base64_encode($pem), 64, "\n", true)
    … …  
    241235        $mod = JWT::urlsafeB64Decode($n);
    242236        $exp = JWT::urlsafeB64Decode($e);
    243         // Correct encoding for ASN1, as ints are represented as unsigned in jwk
    244         // but signed in ASN1. Prepending null byte makes it unsigned.
    245         if (\strlen($mod) > 0 && \ord($mod[0]) >= 128) {
    246             $mod = \chr(0) . $mod;
    247         }
    248         if (\strlen($exp) > 0 && \ord($exp[0]) >= 128) {
    249             $exp = \chr(0) . $exp;
    250         }
    251237
    252238        $modulus = \pack('Ca*a*', 2, self::encodeLength(\strlen($mod)), $mod);
  • sg-ai-studio/trunk/vendor/firebase/php-jwt/src/JWT.php

    r3561022 r3562098  
    3232    private const ASN1_BIT_STRING = 0x03;
    3333
    34     private const RSA_KEY_MIN_LENGTH = 2048;
    35 
    3634    /**
    3735     * When checking nbf, iat or expiration times,
    … …  
    9896    public static function decode(
    9997        string $jwt,
    100         #[\SensitiveParameter] $keyOrKeyArray,
    101         ?stdClass &$headers = null
     98        $keyOrKeyArray,
     99        stdClass &$headers = null
    102100    ): stdClass {
    103101        // Validate JWT
    … …  
    130128            throw new UnexpectedValueException('Payload must be a JSON object');
    131129        }
    132         if (isset($payload->iat) && !\is_numeric($payload->iat)) {
    133             throw new UnexpectedValueException('Payload iat must be a number');
    134         }
    135         if (isset($payload->nbf) && !\is_numeric($payload->nbf)) {
    136             throw new UnexpectedValueException('Payload nbf must be a number');
    137         }
    138         if (isset($payload->exp) && !\is_numeric($payload->exp)) {
    139             throw new UnexpectedValueException('Payload exp must be a number');
    140         }
    141 
    142130        $sig = static::urlsafeB64Decode($cryptob64);
    143131        if (empty($header->alg)) {
    … …  
    167155        if (isset($payload->nbf) && floor($payload->nbf) > ($timestamp + static::$leeway)) {
    168156            $ex = new BeforeValidException(
    169                 'Cannot handle token with nbf prior to ' . \date(DateTime::ATOM, (int) floor($payload->nbf))
     157                'Cannot handle token with nbf prior to ' . \date(DateTime::ISO8601, (int) $payload->nbf)
    170158            );
    171159            $ex->setPayload($payload);
    … …  
    178166        if (!isset($payload->nbf) && isset($payload->iat) && floor($payload->iat) > ($timestamp + static::$leeway)) {
    179167            $ex = new BeforeValidException(
    180                 'Cannot handle token with iat prior to ' . \date(DateTime::ATOM, (int) floor($payload->iat))
     168                'Cannot handle token with iat prior to ' . \date(DateTime::ISO8601, (int) $payload->iat)
    181169            );
    182170            $ex->setPayload($payload);
    … …  
    188176            $ex = new ExpiredException('Expired token');
    189177            $ex->setPayload($payload);
    190             $ex->setTimestamp($timestamp);
    191178            throw $ex;
    192179        }
    … …  
    199186     *
    200187     * @param array<mixed>          $payload PHP array
    201      * @param string|OpenSSLAsymmetricKey|OpenSSLCertificate $key The secret key.
     188     * @param string|resource|OpenSSLAsymmetricKey|OpenSSLCertificate $key The secret key.
    202189     * @param string                $alg     Supported algorithms are 'ES384','ES256', 'ES256K', 'HS256',
    203190     *                                       'HS384', 'HS512', 'RS256', 'RS384', and 'RS512'
    204191     * @param string                $keyId
    205      * @param array<string, string|string[]> $head  An array with header elements to attach
     192     * @param array<string, string> $head    An array with header elements to attach
    206193     *
    207194     * @return string A signed JWT
    … …  
    212199    public static function encode(
    213200        array $payload,
    214         #[\SensitiveParameter] $key,
     201        $key,
    215202        string $alg,
    216         ?string $keyId = null,
    217         ?array $head = null
     203        string $keyId = null,
     204        array $head = null
    218205    ): string {
    219206        $header = ['typ' => 'JWT'];
    220         if (isset($head)) {
     207        if (isset($head) && \is_array($head)) {
    221208            $header = \array_merge($header, $head);
    222209        }
    … …  
    240227     *
    241228     * @param string $msg  The message to sign
    242      * @param string|OpenSSLAsymmetricKey|OpenSSLCertificate  $key  The secret key.
     229     * @param string|resource|OpenSSLAsymmetricKey|OpenSSLCertificate  $key  The secret key.
    243230     * @param string $alg  Supported algorithms are 'EdDSA', 'ES384', 'ES256', 'ES256K', 'HS256',
    244231     *                    'HS384', 'HS512', 'RS256', 'RS384', and 'RS512'
    … …  
    250237    public static function sign(
    251238        string $msg,
    252         #[\SensitiveParameter] $key,
     239        $key,
    253240        string $alg
    254241    ): string {
    … …  
    262249                    throw new InvalidArgumentException('key must be a string when using hmac');
    263250                }
    264                 self::validateHmacKeyLength($key, $algorithm);
    265251                return \hash_hmac($algorithm, $msg, $key, true);
    266252            case 'openssl':
    267253                $signature = '';
    268                 if (!$key = openssl_pkey_get_private($key)) {
    269                     throw new DomainException('OpenSSL unable to validate key');
    270                 }
    271                 if (str_starts_with($alg, 'RS')) {
    272                     self::validateRsaKeyLength($key);
    273                 } elseif (str_starts_with($alg, 'ES')) {
    274                     self::validateEcKeyLength($key, $alg);
    275                 }
    276                 $success = \openssl_sign($msg, $signature, $key, $algorithm);
     254                $success = \openssl_sign($msg, $signature, $key, $algorithm); // @phpstan-ignore-line
    277255                if (!$success) {
    278256                    throw new DomainException('OpenSSL unable to sign data');
    … …  
    285263                return $signature;
    286264            case 'sodium_crypto':
     265                if (!\function_exists('sodium_crypto_sign_detached')) {
     266                    throw new DomainException('libsodium is not available');
     267                }
     268                if (!\is_string($key)) {
     269                    throw new InvalidArgumentException('key must be a string when using EdDSA');
     270                }
    287271                try {
    288                     return sodium_crypto_sign_detached($msg, self::validateEdDSAKey($key));
     272                    // The last non-empty line is used as the key.
     273                    $lines = array_filter(explode("\n", $key));
     274                    $key = base64_decode((string) end($lines));
     275                    if (\strlen($key) === 0) {
     276                        throw new DomainException('Key cannot be empty string');
     277                    }
     278                    return sodium_crypto_sign_detached($msg, $key);
    289279                } catch (Exception $e) {
    290280                    throw new DomainException($e->getMessage(), 0, $e);
    … …  
    301291     * @param string $msg         The original message (header and body)
    302292     * @param string $signature   The original signature
    303      * @param string|OpenSSLAsymmetricKey|OpenSSLCertificate  $keyMaterial For Ed*, ES*, HS*, a string key works. for RS*, must be an instance of OpenSSLAsymmetricKey
     293     * @param string|resource|OpenSSLAsymmetricKey|OpenSSLCertificate  $keyMaterial For Ed*, ES*, HS*, a string key works. for RS*, must be an instance of OpenSSLAsymmetricKey
    304294     * @param string $alg         The algorithm
    305295     *
    … …  
    311301        string $msg,
    312302        string $signature,
    313         #[\SensitiveParameter] $keyMaterial,
     303        $keyMaterial,
    314304        string $alg
    315305    ): bool {
    … …  
    321311        switch ($function) {
    322312            case 'openssl':
    323                 if (!$key = openssl_pkey_get_public($keyMaterial)) {
    324                     throw new DomainException('OpenSSL unable to validate key');
    325                 }
    326                 if (str_starts_with($alg, 'RS')) {
    327                     self::validateRsaKeyLength($key);
    328                 } elseif (str_starts_with($alg, 'ES')) {
    329                     self::validateEcKeyLength($key, $alg);
    330                 }
    331                 $success = \openssl_verify($msg, $signature, $keyMaterial, $algorithm);
     313                $success = \openssl_verify($msg, $signature, $keyMaterial, $algorithm); // @phpstan-ignore-line
    332314                if ($success === 1) {
    333315                    return true;
    … …  
    341323                );
    342324            case 'sodium_crypto':
     325                if (!\function_exists('sodium_crypto_sign_verify_detached')) {
     326                    throw new DomainException('libsodium is not available');
     327                }
     328                if (!\is_string($keyMaterial)) {
     329                    throw new InvalidArgumentException('key must be a string when using EdDSA');
     330                }
    343331                try {
    344                     $key = self::validateEdDSAKey($keyMaterial);
     332                    // The last non-empty line is used as the key.
     333                    $lines = array_filter(explode("\n", $keyMaterial));
     334                    $key = base64_decode((string) end($lines));
     335                    if (\strlen($key) === 0) {
     336                        throw new DomainException('Key cannot be empty string');
     337                    }
    345338                    if (\strlen($signature) === 0) {
    346339                        throw new DomainException('Signature cannot be empty string');
    … …  
    355348                    throw new InvalidArgumentException('key must be a string when using hmac');
    356349                }
    357                 self::validateHmacKeyLength($keyMaterial, $algorithm);
    358350                $hash = \hash_hmac($algorithm, $msg, $keyMaterial, true);
    359351                return self::constantTimeEquals($hash, $signature);
    … …  
    393385    public static function jsonEncode(array $input): string
    394386    {
    395         $json = \json_encode($input, \JSON_UNESCAPED_SLASHES);
     387        if (PHP_VERSION_ID >= 50400) {
     388            $json = \json_encode($input, \JSON_UNESCAPED_SLASHES);
     389        } else {
     390            // PHP 5.3 only
     391            $json = \json_encode($input);
     392        }
    396393        if ($errno = \json_last_error()) {
    397394            self::handleJsonError($errno);
    … …  
    451448    }
    452449
     450
    453451    /**
    454452     * Determine if an algorithm has been provided for each Key
    … …  
    462460     */
    463461    private static function getKey(
    464         #[\SensitiveParameter] $keyOrKeyArray,
     462        $keyOrKeyArray,
    465463        ?string $kid
    466464    ): Key {
    … …  
    669667        return [$pos, $data];
    670668    }
    671 
    672     /**
    673      * Validate HMAC key length
    674      *
    675      * @param string $key HMAC key material
    676      * @param string $algorithm The algorithm
    677      *
    678      * @throws DomainException Provided key is too short
    679      */
    680     private static function validateHmacKeyLength(string $key, string $algorithm): void
    681     {
    682         $keyLength = \strlen($key) * 8;
    683         $minKeyLength = (int) \str_replace('SHA', '', $algorithm);
    684         if ($keyLength < $minKeyLength) {
    685             throw new DomainException('Provided key is too short');
    686         }
    687     }
    688 
    689     /**
    690      * Validate RSA key length
    691      *
    692      * @param OpenSSLAsymmetricKey $key RSA key material
    693      * @throws DomainException Provided key is too short
    694      */
    695     private static function validateRsaKeyLength(#[\SensitiveParameter] OpenSSLAsymmetricKey $key): void
    696     {
    697         if (!$keyDetails = openssl_pkey_get_details($key)) {
    698             throw new DomainException('Unable to validate key');
    699         }
    700         if ($keyDetails['bits'] < self::RSA_KEY_MIN_LENGTH) {
    701             throw new DomainException('Provided key is too short');
    702         }
    703     }
    704 
    705     /**
    706      * Validate RSA key length
    707      *
    708      * @param OpenSSLAsymmetricKey $key RSA key material
    709      * @param string $algorithm The algorithm
    710      * @throws DomainException Provided key is too short
    711      */
    712     private static function validateEcKeyLength(
    713         #[\SensitiveParameter] OpenSSLAsymmetricKey $key,
    714         string $algorithm
    715     ): void {
    716         if (!$keyDetails = openssl_pkey_get_details($key)) {
    717             throw new DomainException('Unable to validate key');
    718         }
    719         $minKeyLength = (int) \str_replace('ES', '', $algorithm);
    720         if ($keyDetails['bits'] < $minKeyLength) {
    721             throw new DomainException('Provided key is too short');
    722         }
    723     }
    724 
    725     /**
    726      * @param string|OpenSSLAsymmetricKey|OpenSSLCertificate  $keyMaterial
    727      * @return non-empty-string
    728      */
    729     private static function validateEdDSAKey(#[\SensitiveParameter] $keyMaterial): string
    730     {
    731         if (!\function_exists('sodium_crypto_sign_verify_detached')) {
    732             throw new DomainException('libsodium is not available');
    733         }
    734         if (!\is_string($keyMaterial)) {
    735             throw new InvalidArgumentException('key must be a string when using EdDSA');
    736         }
    737         // The last non-empty line is used as the key.
    738         $lines = array_filter(explode("\n", $keyMaterial));
    739         $key = self::urlsafeB64Decode((string) end($lines));
    740         if (\strlen($key) === 0) {
    741             throw new DomainException('Key cannot be empty string');
    742         }
    743         return $key;
    744     }
    745669}
  • sg-ai-studio/trunk/vendor/firebase/php-jwt/src/Key.php

    r3561022 r3562098  
    1010class Key
    1111{
     12    /** @var string|resource|OpenSSLAsymmetricKey|OpenSSLCertificate */
     13    private $keyMaterial;
     14    /** @var string */
     15    private $algorithm;
     16
    1217    /**
    13      * @param string|OpenSSLAsymmetricKey|OpenSSLCertificate $keyMaterial
     18     * @param string|resource|OpenSSLAsymmetricKey|OpenSSLCertificate $keyMaterial
    1419     * @param string $algorithm
    1520     */
    1621    public function __construct(
    17         #[\SensitiveParameter] private $keyMaterial,
    18         private string $algorithm
     22        $keyMaterial,
     23        string $algorithm
    1924    ) {
    2025        if (
    … …  
    2227            && !$keyMaterial instanceof OpenSSLAsymmetricKey
    2328            && !$keyMaterial instanceof OpenSSLCertificate
     29            && !\is_resource($keyMaterial)
    2430        ) {
    25             throw new TypeError('Key material must be a string, OpenSSLCertificate, or OpenSSLAsymmetricKey');
     31            throw new TypeError('Key material must be a string, resource, or OpenSSLAsymmetricKey');
    2632        }
    2733
    … …  
    3339            throw new InvalidArgumentException('Algorithm must not be empty');
    3440        }
     41
     42        // TODO: Remove in PHP 8.0 in favor of class constructor property promotion
     43        $this->keyMaterial = $keyMaterial;
     44        $this->algorithm = $algorithm;
    3545    }
    3646
    … …  
    4656
    4757    /**
    48      * @return string|OpenSSLAsymmetricKey|OpenSSLCertificate
     58     * @return string|resource|OpenSSLAsymmetricKey|OpenSSLCertificate
    4959     */
    5060    public function getKeyMaterial()
  • sg-ai-studio/trunk/vendor/guzzlehttp/guzzle/CHANGELOG.md

    r3561022 r3562098  
    22
    33Please refer to [UPGRADING](UPGRADING.md) guide for upgrading to a major version.
     4
     5
     6## 7.11.0 - 2026-06-02
     7
     8### Added
     9
     10- Added support for providing the `proxy` request option's `no` value as a comma-delimited string
     11- Added the `protocols` request option to restrict allowed URI schemes for request transfers
     12- Added `cert_type` and `ssl_key_type` request options for TLS certificate and private-key file types
     13- Added PHP stream handler support for the `ssl_key` request option
     14- Added transport sharing via the `transport_sharing` client and cURL handler options
     15
     16### Changed
     17
     18- Adjusted `guzzlehttp/promises` version constraint to `^2.5`
     19- Adjusted `guzzlehttp/psr7` version constraint to `^2.11`
     20- Allowed domainless `SetCookie` instances to be stored without wildcard request matching
     21- Changed no-proxy matching to respect request ports for host-and-port rules
     22- Prevented `CurlMultiHandler` destructors from throwing during cleanup
     23- Improved invalid response handling across handlers
     24
     25### Deprecated
     26
     27- Deprecated non-iterable `Pool` request collections, which will be rejected in 8.0
     28- Deprecated non-uppercase easy request methods; 8.0 preserves method casing
     29- Deprecated non-string `headers` request option values, which will be rejected in 8.0
     30- Deprecated empty `headers` request option value arrays, which will be rejected in 8.0
     31- Deprecated empty and malformed request protocol versions, which will be rejected in 8.0
     32- Deprecated conflicting raw cURL request options, including `CURLOPT_SHARE`, which will be rejected in 8.0
     33- Deprecated scalar-coerced `idn_conversion` request option values, which will be rejected in 8.0
     34- Deprecated invalid documented request option value types, which will be rejected in 8.0
     35- Deprecated selected request options ignored by incompatible built-in handlers, which will be rejected in 8.0
     36- Deprecated `RequestException::wrapException()`, which will be removed in 8.0
     37- Deprecated `RetryMiddleware::exponentialDelay()`, which will be removed in 8.0
    438
    539
    … …  
    9911025
    9921026* For information on changes and upgrading, see:
    993   https://github.com/guzzle/guzzle/blob/master/UPGRADING.md#3x-to-40
     1027  https://github.com/guzzle/guzzle/blob/4.x/UPGRADING.md#3x-to-40
    9941028* Added `GuzzleHttp\batch()` as a convenience function for sending requests in
    9951029  parallel without needing to write asynchronous code.
    … …  
    10241058## 4.0.0-rc.1 - 2014-03-15
    10251059
    1026 * See https://github.com/guzzle/guzzle/blob/master/UPGRADING.md#3x-to-40
     1060* See https://github.com/guzzle/guzzle/blob/4.x/UPGRADING.md#3x-to-40
    10271061
    10281062## 3.8.1 - 2014-01-28
  • sg-ai-studio/trunk/vendor/guzzlehttp/guzzle/README.md

    r3561022 r3562098  
    4343We use GitHub issues only to discuss bugs and new features. For support please refer to:
    4444
    45 - [Documentation](https://docs.guzzlephp.org)
     45- [Documentation](docs/index.md)
    4646- [Stack Overflow](https://stackoverflow.com/questions/tagged/guzzle)
    4747- [#guzzle](https://app.slack.com/client/T0D2S9JCT/CE6UAAKL4) channel on [PHP-HTTP Slack](https://slack.httplug.io/)
    … …  
    7373[guzzle-5-repo]: https://github.com/guzzle/guzzle/tree/5.3
    7474[guzzle-6-repo]: https://github.com/guzzle/guzzle/tree/6.5
    75 [guzzle-7-repo]: https://github.com/guzzle/guzzle
    76 [guzzle-3-docs]: https://guzzle3.readthedocs.io/
    77 [guzzle-5-docs]: https://docs.guzzlephp.org/en/5.3/
    78 [guzzle-6-docs]: https://docs.guzzlephp.org/en/6.5/
    79 [guzzle-7-docs]: https://docs.guzzlephp.org/en/latest/
     75[guzzle-7-repo]: https://github.com/guzzle/guzzle/tree/7.11
     76[guzzle-3-docs]: https://github.com/guzzle/guzzle3/tree/master/docs
     77[guzzle-5-docs]: https://github.com/guzzle/guzzle/tree/5.3/docs
     78[guzzle-6-docs]: https://github.com/guzzle/guzzle/tree/6.5/docs
     79[guzzle-7-docs]: https://github.com/guzzle/guzzle/blob/7.11/docs/index.md
    8080
    8181
  • sg-ai-studio/trunk/vendor/guzzlehttp/guzzle/UPGRADING.md

    r3505951 r3562098  
    1313- If you extend a class of Guzzle; update all signatures on methods you override.
    1414
    15 #### Other backwards compatibility breaking changes
     15#### Other Backwards Compatibility Breaking Changes
    1616
    1717- Class `GuzzleHttp\UriTemplate` is removed.
    … …  
    3636- Support for international domain names (IDN) is now disabled by default, and enabling it requires installing ext-intl, linked against a modern version of the C library (ICU 4.6 or higher).
    3737
    38 #### Native functions calls
     38#### Native Functions Calls
    3939
    4040All internal native functions calls of Guzzle are now prefixed with a slash. This
    … …  
    5050```
    5151
    52 For the full diff you can check [here](https://github.com/guzzle/guzzle/compare/6.5.4..master).
     52For the full diff you can check [here](https://github.com/guzzle/guzzle/compare/6.5.4..7.0.0).
    5353
    54545.0 to 6.0
    … …  
    190190## POST Requests
    191191
    192 This version added the [`form_params`](https://docs.guzzlephp.org/en/latest/request-options.html#form_params)
     192This version added the [`form_params`](https://github.com/guzzle/guzzle/blob/6.5/docs/request-options.rst#form_params)
    193193and `multipart` request options. `form_params` is an associative array of
    194194strings or array of strings and is used to serialize an
    195195`application/x-www-form-urlencoded` POST request. The
    196 [`multipart`](https://docs.guzzlephp.org/en/latest/request-options.html#multipart)
     196[`multipart`](https://github.com/guzzle/guzzle/blob/6.5/docs/request-options.rst#multipart)
    197197option is now used to send a multipart/form-data POST request.
    198198
    … …  
    210210## Rewritten Adapter Layer
    211211
    212 Guzzle now uses [RingPHP](https://ringphp.readthedocs.org/en/latest) to send
     212Guzzle now uses [RingPHP](https://github.com/guzzle/RingPHP) to send
    213213HTTP requests. The `adapter` option in a `GuzzleHttp\Client` constructor
    214214is still supported, but it has now been renamed to `handler`. Instead of
    … …  
    575575of a `GuzzleHttp\Event\BeforeEvent`, `GuzzleHttp\Event\CompleteEvent`, and
    576576`GuzzleHttp\Event\ErrorEvent` event.
    577 
    578 See: https://docs.guzzlephp.org/en/latest/events.html
    579577
    580578## Inflection
  • sg-ai-studio/trunk/vendor/guzzlehttp/guzzle/src/Client.php

    r3561022 r3562098  
    66use GuzzleHttp\Exception\GuzzleException;
    77use GuzzleHttp\Exception\InvalidArgumentException;
     8use GuzzleHttp\Handler\CurlShareHandleState;
    89use GuzzleHttp\Promise as P;
    910use GuzzleHttp\Promise\PromiseInterface;
    1011use Psr\Http\Message\RequestInterface;
    1112use Psr\Http\Message\ResponseInterface;
     13use Psr\Http\Message\StreamInterface;
    1214use Psr\Http\Message\UriInterface;
    1315
    … …  
    4951     * - base_uri: (string|UriInterface) Base URI of the client that is merged
    5052     *   into relative URIs. Can be a string or instance of UriInterface.
     53     * - transport_sharing: (string|null) Transport sharing mode for the
     54     *   default handler. Accepts TransportSharing::* or null. Defaults to null.
    5155     * - **: any request option
    5256     *
    … …  
    5761    public function __construct(array $config = [])
    5862    {
     63        $transportSharing = \array_key_exists('transport_sharing', $config) ? $config['transport_sharing'] : null;
     64        $transportSharingMode = CurlShareHandleState::normalizeMode($transportSharing, 'transport_sharing');
     65        unset($config['transport_sharing']);
     66
    5967        if (!isset($config['handler'])) {
    60             $config['handler'] = HandlerStack::create();
     68            $config['handler'] = $transportSharingMode === TransportSharing::NONE
     69                ? HandlerStack::create()
     70                : HandlerStack::create(Utils::chooseHandler(['transport_sharing' => $transportSharingMode]));
    6171        } elseif (!\is_callable($config['handler'])) {
    6272            throw new InvalidArgumentException('handler must be a callable');
     73        } elseif ($transportSharingMode === TransportSharing::HANDLER_REQUIRE) {
     74            throw new InvalidArgumentException('The "transport_sharing" client option can only require sharing when Guzzle creates the default handler. Configure the "transport_sharing" option on CurlHandler or CurlMultiHandler when providing a custom cURL handler.');
    6375        }
    6476
    … …  
    157169    public function requestAsync(string $method, $uri = '', array $options = []): PromiseInterface
    158170    {
     171        $normalizedMethod = \strtoupper($method);
     172        if ($method !== $normalizedMethod) {
     173            \trigger_deprecation(
     174                'guzzlehttp/guzzle',
     175                '7.11',
     176                'Passing a non-uppercase HTTP method to Client::requestAsync() is deprecated; guzzlehttp/guzzle 8.0 will preserve HTTP method casing. Pass an uppercase method explicitly if uppercase is required.'
     177            );
     178            $method = $normalizedMethod;
     179        }
     180
    159181        $options = $this->prepareDefaults($options);
    160182        // Remove request modifying parameter because it can be done up-front.
    161183        $headers = $options['headers'] ?? [];
     184        $droppedHeaderNames = self::castDeprecatedHeaderOptionValues($headers);
     185        if ($droppedHeaderNames !== [] && isset($options['_conditional'])) {
     186            $options['_conditional'] = Psr7\Utils::caselessRemove($droppedHeaderNames, $options['_conditional']);
     187        }
    162188        $body = $options['body'] ?? null;
    163189        $version = self::normalizeProtocolVersion($options['version'] ?? '1.1');
    … …  
    189215    public function request(string $method, $uri = '', array $options = []): ResponseInterface
    190216    {
     217        $normalizedMethod = \strtoupper($method);
     218        if ($method !== $normalizedMethod) {
     219            \trigger_deprecation(
     220                'guzzlehttp/guzzle',
     221                '7.11',
     222                'Passing a non-uppercase HTTP method to Client::request() is deprecated; guzzlehttp/guzzle 8.0 will preserve HTTP method casing. Pass an uppercase method explicitly if uppercase is required.'
     223            );
     224            $method = $normalizedMethod;
     225        }
     226
    191227        $options[RequestOptions::SYNCHRONOUS] = true;
    192228
    … …  
    204240     *
    205241     * @return mixed
    206      *
    207      * @deprecated Client::getConfig will be removed in guzzlehttp/guzzle:8.0.
    208242     */
    209243    public function getConfig(?string $option = null)
    … …  
    220254        }
    221255
    222         if (isset($config['idn_conversion']) && ($config['idn_conversion'] !== false)) {
    223             $idnOptions = ($config['idn_conversion'] === true) ? \IDNA_DEFAULT : $config['idn_conversion'];
     256        $idnOptions = Utils::normalizeIdnConversionOption($config['idn_conversion'] ?? null);
     257        if ($idnOptions !== null) {
    224258            $uri = Utils::idnUriConvert($uri, $idnOptions);
    225259        }
    … …  
    240274            'cookies' => false,
    241275            'idn_conversion' => false,
     276            'protocols' => ['http', 'https'],
    242277        ];
    243278
    … …  
    271306        } else {
    272307            // Add the User-Agent header if one was not already set.
     308            $hasUserAgent = false;
    273309            foreach (\array_keys($this->config['headers']) as $name) {
    274                 if (\strtolower($name) === 'user-agent') {
    275                     return;
     310                if (\strtolower((string) $name) === 'user-agent') {
     311                    $hasUserAgent = true;
     312                    break;
    276313                }
    277314            }
    278             $this->config['headers']['User-Agent'] = Utils::defaultUserAgent();
     315
     316            if (!$hasUserAgent) {
     317                $this->config['headers']['User-Agent'] = Utils::defaultUserAgent();
     318            }
     319        }
     320
     321        if (\is_array($this->config['headers'])) {
     322            self::warnAboutInvalidHeaderOptionTypes($this->config['headers']);
     323            self::castDeprecatedHeaderOptionValues($this->config['headers']);
    279324        }
    280325    }
    … …  
    317362        }
    318363
     364        self::warnAboutInvalidRequestOptionTypes($result);
     365
    319366        return $result;
     367    }
     368
     369    private static function warnAboutInvalidRequestOptionTypes(array $options): void
     370    {
     371        if (isset($options['handler']) && !\is_callable($options['handler'])) {
     372            self::warnInvalidRequestOptionType('handler', 'callable', $options['handler']);
     373        }
     374
     375        if (isset($options['allow_redirects']) && \is_array($options['allow_redirects'])) {
     376            self::warnAboutInvalidAllowRedirectsOptionTypes($options['allow_redirects']);
     377        }
     378
     379        if (isset($options['auth'])) {
     380            self::warnAboutInvalidAuthOptionTypes($options['auth']);
     381        }
     382
     383        if (isset($options['body']) && \is_array($options['body'])) {
     384            self::warnInvalidRequestOptionType('body', 'resource|string|null|int|float|bool|StreamInterface|(callable&object)|\Iterator|\Stringable', $options['body']);
     385        }
     386
     387        self::warnAboutInvalidTlsFileOptionTypes($options, 'cert');
     388        self::warnIfPresentAndNotString($options, 'cert_type');
     389        self::warnIfPresentAndNotNumber($options, 'connect_timeout');
     390        self::warnIfPresentAndNotInt($options, 'crypto_method');
     391        self::warnIfPresentAndNotBoolOrResource($options, 'debug');
     392        self::warnIfPresentAndNotBoolOrString($options, 'decode_content');
     393        self::warnIfPresentAndNotNumber($options, 'delay');
     394        self::warnIfPresentAndNotBoolOrInt($options, 'expect');
     395
     396        if (isset($options['form_params'])) {
     397            self::warnAboutInvalidFormParamTypes($options['form_params']);
     398        }
     399
     400        if (isset($options['force_ip_resolve']) && !\is_string($options['force_ip_resolve'])) {
     401            self::warnInvalidRequestOptionType('force_ip_resolve', 'string', $options['force_ip_resolve']);
     402        }
     403
     404        if (isset($options['headers'])) {
     405            self::warnAboutInvalidHeaderOptionTypes($options['headers']);
     406        }
     407
     408        self::warnIfPresentAndNotBool($options, 'http_errors');
     409
     410        if (isset($options['multipart'])) {
     411            self::warnAboutInvalidMultipartOptionTypes($options['multipart']);
     412        }
     413
     414        self::warnIfPresentAndNotCallable($options, 'on_headers');
     415        self::warnIfPresentAndNotCallable($options, 'on_stats');
     416        self::warnIfPresentAndNotCallable($options, 'progress');
     417        self::warnIfPresentAndNotStringArray($options, 'protocols', true);
     418        self::warnAboutInvalidProxyOptionTypes($options);
     419
     420        self::warnIfPresentAndNotNumber($options, 'read_timeout');
     421        self::warnIfPresentAndNotInt($options, 'retries');
     422
     423        if (isset($options['sink']) && !\is_bool($options['sink']) && !\is_resource($options['sink']) && !\is_string($options['sink']) && !$options['sink'] instanceof StreamInterface) {
     424            self::warnInvalidRequestOptionType('sink', 'resource|string|StreamInterface', $options['sink']);
     425        }
     426
     427        self::warnAboutInvalidTlsFileOptionTypes($options, 'ssl_key');
     428        self::warnIfPresentAndNotString($options, 'ssl_key_type');
     429        self::warnIfPresentAndNotBool($options, 'stream');
     430        self::warnIfPresentAndNotArray($options, 'stream_context', 'array<array-key, mixed>');
     431        self::warnIfPresentAndNotBool($options, 'synchronous');
     432        self::warnIfPresentAndNotNumber($options, 'timeout');
     433        self::warnIfPresentAndNotBoolOrString($options, 'verify');
     434        self::warnIfPresentAndNotStringOrNumber($options, 'version');
     435        self::warnIfPresentAndNotArray($options, 'curl', 'array<int|string, mixed>');
     436
     437        if (isset($options['cookies']) && $options['cookies'] === true) {
     438            self::warnInvalidRequestOptionType('cookies', 'false|CookieJarInterface', $options['cookies']);
     439        }
     440    }
     441
     442    private static function warnAboutInvalidAllowRedirectsOptionTypes(array $allowRedirects): void
     443    {
     444        self::warnIfPresentAndNotInt($allowRedirects, 'max', 'allow_redirects.max');
     445        self::warnIfPresentAndNotBool($allowRedirects, 'strict', 'allow_redirects.strict');
     446        self::warnIfPresentAndNotBool($allowRedirects, 'referer', 'allow_redirects.referer');
     447        self::warnIfPresentAndNotStringArray($allowRedirects, 'protocols', true, 'allow_redirects.protocols');
     448        self::warnIfPresentAndNotCallable($allowRedirects, 'on_redirect', 'allow_redirects.on_redirect');
     449        self::warnIfPresentAndNotBool($allowRedirects, 'track_redirects', 'allow_redirects.track_redirects');
     450    }
     451
     452    /**
     453     * @param mixed $auth
     454     */
     455    private static function warnAboutInvalidAuthOptionTypes($auth): void
     456    {
     457        if ($auth === false || \is_string($auth) || $auth === []) {
     458            return;
     459        }
     460
     461        if (!\is_array($auth)) {
     462            self::warnInvalidRequestOptionType('auth', 'array{0: string, 1: string, 2?: string|null}|string|false|null', $auth);
     463
     464            return;
     465        }
     466
     467        if (!\array_key_exists(0, $auth) || !\is_string($auth[0])) {
     468            self::warnInvalidRequestOptionType('auth.0', 'string', $auth[0] ?? null);
     469        }
     470
     471        if (!\array_key_exists(1, $auth) || !\is_string($auth[1])) {
     472            self::warnInvalidRequestOptionType('auth.1', 'string', $auth[1] ?? null);
     473        }
     474
     475        if (\array_key_exists(2, $auth) && $auth[2] !== null && !\is_string($auth[2])) {
     476            self::warnInvalidRequestOptionType('auth.2', 'string|null', $auth[2]);
     477        }
     478    }
     479
     480    /**
     481     * @param mixed $value
     482     */
     483    private static function warnAboutInvalidFormParamTypes($value): void
     484    {
     485        if (!\is_array($value)) {
     486            self::warnInvalidRequestOptionType('form_params', 'array<array-key, string|int|float|bool|null|array>', $value);
     487
     488            return;
     489        }
     490
     491        self::warnAboutInvalidFormParamArray($value, 'form_params');
     492    }
     493
     494    private static function warnAboutInvalidFormParamArray(array $values, string $path): bool
     495    {
     496        foreach ($values as $key => $item) {
     497            $itemPath = $path.'.'.(string) $key;
     498            if (\is_array($item)) {
     499                if (!self::warnAboutInvalidFormParamArray($item, $itemPath)) {
     500                    return false;
     501                }
     502
     503                continue;
     504            }
     505
     506            if ($item !== null && !\is_scalar($item)) {
     507                self::warnInvalidRequestOptionType($itemPath, 'string|int|float|bool|null|array', $item);
     508
     509                return false;
     510            }
     511        }
     512
     513        return true;
     514    }
     515
     516    /**
     517     * @param mixed $headers
     518     */
     519    private static function warnAboutInvalidHeaderOptionTypes($headers): void
     520    {
     521        if (!\is_array($headers)) {
     522            self::warnInvalidRequestOptionType('headers', 'array<array-key, string|non-empty-array<array-key, string>>|null', $headers);
     523
     524            return;
     525        }
     526
     527        foreach ($headers as $name => $value) {
     528            $path = 'headers.'.(string) $name;
     529            if (\is_array($value)) {
     530                if ($value === []) {
     531                    self::warnInvalidRequestOptionType($path, 'string|non-empty-array<array-key, string>', $value);
     532
     533                    break;
     534                }
     535
     536                foreach ($value as $index => $item) {
     537                    if (!\is_string($item)) {
     538                        self::warnInvalidRequestOptionType($path.'.'.(string) $index, 'string', $item);
     539
     540                        break 2;
     541                    }
     542                }
     543            } elseif (!\is_string($value)) {
     544                self::warnInvalidRequestOptionType($path, 'string|non-empty-array<array-key, string>', $value);
     545
     546                break;
     547            }
     548        }
     549    }
     550
     551    /**
     552     * @param mixed $multipart
     553     */
     554    private static function warnAboutInvalidMultipartOptionTypes($multipart): void
     555    {
     556        if (!\is_array($multipart)) {
     557            self::warnInvalidRequestOptionType('multipart', 'array<array-key, array{name: string|int, contents: mixed, headers?: array<array-key, string>, filename?: string}>', $multipart);
     558
     559            return;
     560        }
     561
     562        foreach ($multipart as $index => $part) {
     563            $path = 'multipart.'.(string) $index;
     564            if (!\is_array($part)) {
     565                self::warnInvalidRequestOptionType($path, 'array{name: string|int, contents: mixed, headers?: array<array-key, string>, filename?: string}', $part);
     566
     567                return;
     568            }
     569
     570            if (!\array_key_exists('name', $part) || (!\is_string($part['name']) && !\is_int($part['name']))) {
     571                self::warnInvalidRequestOptionType($path.'.name', 'string|int', $part['name'] ?? null);
     572            }
     573
     574            if (!\array_key_exists('contents', $part)) {
     575                self::warnInvalidRequestOptionType($path, 'array{name: string|int, contents: mixed, headers?: array<array-key, string>, filename?: string}', $part);
     576            }
     577
     578            if (\array_key_exists('headers', $part)) {
     579                if (!\is_array($part['headers'])) {
     580                    self::warnInvalidRequestOptionType($path.'.headers', 'array<array-key, string>', $part['headers']);
     581                } else {
     582                    foreach ($part['headers'] as $name => $value) {
     583                        if (!\is_string($value)) {
     584                            self::warnInvalidRequestOptionType($path.'.headers.'.(string) $name, 'string', $value);
     585
     586                            break 2;
     587                        }
     588                    }
     589                }
     590            }
     591
     592            if (\array_key_exists('filename', $part) && !\is_string($part['filename'])) {
     593                self::warnInvalidRequestOptionType($path.'.filename', 'string', $part['filename']);
     594            }
     595        }
     596    }
     597
     598    private static function warnAboutInvalidProxyOptionTypes(array $options): void
     599    {
     600        if (!isset($options['proxy'])) {
     601            return;
     602        }
     603
     604        if (!\is_string($options['proxy']) && !\is_array($options['proxy'])) {
     605            self::warnInvalidRequestOptionType('proxy', 'string|array{http?: string|null, https?: string|null, no?: string|array<array-key, string>|null}', $options['proxy']);
     606
     607            return;
     608        }
     609
     610        if (!\is_array($options['proxy'])) {
     611            return;
     612        }
     613
     614        foreach (['http', 'https'] as $scheme) {
     615            if (\array_key_exists($scheme, $options['proxy']) && $options['proxy'][$scheme] !== null && !\is_string($options['proxy'][$scheme])) {
     616                self::warnInvalidRequestOptionType('proxy.'.$scheme, 'string|null', $options['proxy'][$scheme]);
     617            }
     618        }
     619
     620        if (!\array_key_exists('no', $options['proxy']) || $options['proxy']['no'] === null) {
     621            return;
     622        }
     623
     624        if (\is_string($options['proxy']['no'])) {
     625            return;
     626        }
     627
     628        if (!\is_array($options['proxy']['no'])) {
     629            self::warnInvalidRequestOptionType('proxy.no', 'string|array<array-key, string>|null', $options['proxy']['no']);
     630
     631            return;
     632        }
     633
     634        foreach ($options['proxy']['no'] as $index => $noProxy) {
     635            if (!\is_string($noProxy)) {
     636                self::warnInvalidRequestOptionType('proxy.no.'.(string) $index, 'string', $noProxy);
     637
     638                return;
     639            }
     640        }
     641    }
     642
     643    private static function warnAboutInvalidTlsFileOptionTypes(array $options, string $option): void
     644    {
     645        if (!isset($options[$option])) {
     646            return;
     647        }
     648
     649        if (\is_string($options[$option])) {
     650            return;
     651        }
     652
     653        if (!\is_array($options[$option])) {
     654            self::warnInvalidRequestOptionType($option, 'string|array{0: string, 1?: string}', $options[$option]);
     655
     656            return;
     657        }
     658
     659        if (!\array_key_exists(0, $options[$option]) || !\is_string($options[$option][0])) {
     660            self::warnInvalidRequestOptionType($option.'.0', 'string', $options[$option][0] ?? null);
     661        }
     662
     663        if (\array_key_exists(1, $options[$option]) && $options[$option][1] !== null && !\is_string($options[$option][1])) {
     664            self::warnInvalidRequestOptionType($option.'.1', 'string|null', $options[$option][1]);
     665        }
     666    }
     667
     668    private static function warnIfPresentAndNotArray(array $options, string $option, string $expected): void
     669    {
     670        if (\array_key_exists($option, $options) && !\is_array($options[$option])) {
     671            self::warnInvalidRequestOptionType($option, $expected, $options[$option]);
     672        }
     673    }
     674
     675    private static function warnIfPresentAndNotBool(array $options, string $option, ?string $path = null): void
     676    {
     677        if (\array_key_exists($option, $options) && !\is_bool($options[$option])) {
     678            self::warnInvalidRequestOptionType($path ?? $option, 'bool', $options[$option]);
     679        }
     680    }
     681
     682    private static function warnIfPresentAndNotBoolOrInt(array $options, string $option): void
     683    {
     684        if (\array_key_exists($option, $options) && !\is_bool($options[$option]) && !\is_int($options[$option])) {
     685            self::warnInvalidRequestOptionType($option, 'bool|int', $options[$option]);
     686        }
     687    }
     688
     689    private static function warnIfPresentAndNotBoolOrResource(array $options, string $option): void
     690    {
     691        if (\array_key_exists($option, $options) && !\is_bool($options[$option]) && !\is_resource($options[$option])) {
     692            self::warnInvalidRequestOptionType($option, 'bool|resource', $options[$option]);
     693        }
     694    }
     695
     696    private static function warnIfPresentAndNotBoolOrString(array $options, string $option): void
     697    {
     698        if (\array_key_exists($option, $options) && !\is_bool($options[$option]) && !\is_string($options[$option])) {
     699            self::warnInvalidRequestOptionType($option, 'bool|string', $options[$option]);
     700        }
     701    }
     702
     703    private static function warnIfPresentAndNotCallable(array $options, string $option, ?string $path = null): void
     704    {
     705        if (\array_key_exists($option, $options) && !\is_callable($options[$option])) {
     706            self::warnInvalidRequestOptionType($path ?? $option, 'callable', $options[$option]);
     707        }
     708    }
     709
     710    private static function warnIfPresentAndNotInt(array $options, string $option, ?string $path = null): void
     711    {
     712        if (\array_key_exists($option, $options) && !\is_int($options[$option])) {
     713            self::warnInvalidRequestOptionType($path ?? $option, 'int', $options[$option]);
     714        }
     715    }
     716
     717    private static function warnIfPresentAndNotNumber(array $options, string $option): void
     718    {
     719        if (\array_key_exists($option, $options) && !\is_int($options[$option]) && !\is_float($options[$option])) {
     720            self::warnInvalidRequestOptionType($option, 'int|float', $options[$option]);
     721        }
     722    }
     723
     724    private static function warnIfPresentAndNotString(array $options, string $option): void
     725    {
     726        if (\array_key_exists($option, $options) && !\is_string($options[$option])) {
     727            self::warnInvalidRequestOptionType($option, 'string', $options[$option]);
     728        }
     729    }
     730
     731    private static function warnIfPresentAndNotStringArray(array $options, string $option, bool $nonEmpty, ?string $path = null): void
     732    {
     733        if (!\array_key_exists($option, $options)) {
     734            return;
     735        }
     736
     737        $path = $path ?? $option;
     738        $expected = ($nonEmpty ? 'non-empty-' : '').'array<array-key, string>';
     739
     740        if (!\is_array($options[$option]) || ($nonEmpty && $options[$option] === [])) {
     741            self::warnInvalidRequestOptionType($path, $expected, $options[$option]);
     742
     743            return;
     744        }
     745
     746        foreach ($options[$option] as $index => $item) {
     747            if (!\is_string($item)) {
     748                self::warnInvalidRequestOptionType($path.'.'.(string) $index, 'string', $item);
     749
     750                return;
     751            }
     752        }
     753    }
     754
     755    private static function warnIfPresentAndNotStringOrNumber(array $options, string $option): void
     756    {
     757        if (
     758            \array_key_exists($option, $options)
     759            && !\is_string($options[$option])
     760            && !\is_int($options[$option])
     761            && !\is_float($options[$option])
     762        ) {
     763            self::warnInvalidRequestOptionType($option, 'string|int|float', $options[$option]);
     764        }
     765    }
     766
     767    /**
     768     * @param mixed $value
     769     */
     770    private static function warnInvalidRequestOptionType(string $option, string $expected, $value): void
     771    {
     772        \trigger_deprecation(
     773            'guzzlehttp/guzzle',
     774            '7.11',
     775            'Passing %s to request option "%s" is deprecated; guzzlehttp/guzzle 8.0 requires %s.',
     776            \get_debug_type($value),
     777            $option,
     778            $expected
     779        );
    320780    }
    321781
    … …  
    332792        $request = $this->applyOptions($request, $options);
    333793
    334         if ('' === $request->getProtocolVersion()) {
     794        $protocolVersion = $request->getProtocolVersion();
     795
     796        if ('' === $protocolVersion) {
     797            \trigger_deprecation('guzzlehttp/guzzle', '7.11', 'Sending a request with an empty protocol version is deprecated; guzzlehttp/guzzle 8.0 will reject empty protocol versions.');
     798
    335799            $request = Psr7\Utils::modifyRequest($request, ['version' => '1.1']);
     800        } elseif (!self::isProtocolVersionValid($protocolVersion)) {
     801            \trigger_deprecation('guzzlehttp/guzzle', '7.11', 'Sending a request with a malformed protocol version is deprecated; guzzlehttp/guzzle 8.0 will reject malformed protocol versions.');
    336802        }
    337803
    … …  
    359825                throw new InvalidArgumentException('The headers array must have header name as keys.');
    360826            }
    361             $modify['set_headers'] = $options['headers'];
     827            $headers = $options['headers'];
     828            $droppedHeaderNames = self::castDeprecatedHeaderOptionValues($headers);
     829            if ($droppedHeaderNames !== [] && isset($options['_conditional'])) {
     830                $options['_conditional'] = Psr7\Utils::caselessRemove($droppedHeaderNames, $options['_conditional']);
     831            }
     832            $modify['set_headers'] = $headers;
    362833            unset($options['headers']);
    363834        }
    … …  
    467938            $modify = [];
    468939            foreach ($options['_conditional'] as $k => $v) {
    469                 if (!$request->hasHeader($k)) {
    470                     $modify['set_headers'][$k] = $v;
     940                $name = (string) $k;
     941                if (!$request->hasHeader($name)) {
     942                    $modify['set_headers'][$name] = $v;
    471943                }
    472944            }
    … …  
    480952
    481953    /**
    482      * @param string|float $version
     954     * @param array<array-key, mixed> $headers
     955     *
     956     * @return list<string>
     957     */
     958    private static function castDeprecatedHeaderOptionValues(array &$headers): array
     959    {
     960        $droppedHeaderNames = [];
     961
     962        foreach ($headers as $name => $value) {
     963            if (\is_array($value)) {
     964                if ($value === []) {
     965                    $droppedHeaderNames[] = (string) $name;
     966                    unset($headers[$name]);
     967
     968                    continue;
     969                }
     970
     971                foreach ($value as $index => $item) {
     972                    if ($item === null || (!\is_string($item) && \is_scalar($item))) {
     973                        $value[$index] = (string) $item;
     974                    }
     975                }
     976
     977                $headers[$name] = $value;
     978
     979                continue;
     980            }
     981
     982            if ($value === null || (!\is_string($value) && \is_scalar($value))) {
     983                $headers[$name] = (string) $value;
     984            }
     985        }
     986
     987        return $droppedHeaderNames;
     988    }
     989
     990    /**
     991     * @param string|int|float $version
    483992     */
    484993    private static function normalizeProtocolVersion($version): string
    485994    {
    486995        if ('' === $version) {
     996            \trigger_deprecation('guzzlehttp/guzzle', '7.11', 'Passing an empty "version" request option is deprecated; guzzlehttp/guzzle 8.0 will reject empty protocol versions.');
     997
    487998            return '1.1';
    488999        }
    4891000
    4901001        return \is_float($version) ? \number_format($version, 1, '.', '') : (string) $version;
     1002    }
     1003
     1004    private static function isProtocolVersionValid(string $version): bool
     1005    {
     1006        return 1 === \preg_match('/^\d+(?:\.\d+)?$/D', $version);
    4911007    }
    4921008
  • sg-ai-studio/trunk/vendor/guzzlehttp/guzzle/src/Cookie/CookieJar.php

    r3561022 r3562098  
    106106    public function clear(?string $domain = null, ?string $path = null, ?string $name = null): void
    107107    {
    108         if (!$domain) {
     108        if ($domain === null) {
    109109            $this->cookies = [];
    110110
    … …  
    114114                $this->cookies,
    115115                static function (SetCookie $cookie) use ($domain): bool {
    116                     return !$cookie->matchesDomain($domain);
     116                    return $cookie->getDomain() === null || !$cookie->matchesDomain($domain);
    117117                }
    118118            );
    … …  
    121121                $this->cookies,
    122122                static function (SetCookie $cookie) use ($path, $domain): bool {
    123                     return !($cookie->matchesPath($path)
     123                    return !($cookie->getDomain() !== null
     124                        && $cookie->matchesPath($path)
    124125                        && $cookie->matchesDomain($domain));
    125126                }
    … …  
    129130                $this->cookies,
    130131                static function (SetCookie $cookie) use ($path, $domain, $name) {
    131                     return !($cookie->getName() == $name
     132                    return !($cookie->getDomain() !== null
     133                        && $cookie->getName() == $name
    132134                        && $cookie->matchesPath($path)
    133135                        && $cookie->matchesDomain($domain));
    … …  
    275277
    276278        foreach ($this->cookies as $cookie) {
    277             if ($cookie->matchesPath($path)
     279            if ($cookie->getDomain() !== null
     280                && $cookie->matchesPath($path)
    278281                && $cookie->matchesDomain($host)
    279282                && !$cookie->isExpired()
    … …  
    297300    {
    298301        $cookieValue = $cookie->getValue();
    299         if ($cookieValue === null || $cookieValue === '') {
     302        if (($cookieValue === null || $cookieValue === '') && $cookie->getDomain() !== null) {
    300303            $this->clear(
    301304                $cookie->getDomain(),
  • sg-ai-studio/trunk/vendor/guzzlehttp/guzzle/src/Cookie/SetCookie.php

    r3561022 r3562098  
    176176    {
    177177        if (!is_string($name)) {
    178             trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a string to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__);
     178            \trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a string to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__);
    179179        }
    180180
    … …  
    200200    {
    201201        if (!is_string($value)) {
    202             trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a string to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__);
     202            \trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a string to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__);
    203203        }
    204204
    … …  
    224224    {
    225225        if (!is_string($domain) && null !== $domain) {
    226             trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a string or null to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__);
     226            \trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a string or null to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__);
    227227        }
    228228
    … …  
    248248    {
    249249        if (!is_string($path)) {
    250             trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a string to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__);
     250            \trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a string to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__);
    251251        }
    252252
    … …  
    272272    {
    273273        if (!is_int($maxAge) && null !== $maxAge) {
    274             trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing an int or null to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__);
     274            \trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing an int or null to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__);
    275275        }
    276276
    … …  
    296296    {
    297297        if (!is_int($timestamp) && !is_string($timestamp) && null !== $timestamp) {
    298             trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing an int, string or null to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__);
     298            \trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing an int, string or null to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__);
    299299        }
    300300
    … …  
    328328    {
    329329        if (!is_bool($secure)) {
    330             trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a bool to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__);
     330            \trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a bool to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__);
    331331        }
    332332
    … …  
    352352    {
    353353        if (!is_bool($discard)) {
    354             trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a bool to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__);
     354            \trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a bool to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__);
    355355        }
    356356
    … …  
    376376    {
    377377        if (!is_bool($httpOnly)) {
    378             trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a bool to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__);
     378            \trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a bool to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__);
    379379        }
    380380
    … …  
    489489        }
    490490
    491         // Domains must not be empty, but can be 0. "0" is not a valid internet
    492         // domain, but may be used as server name in a private network.
     491        // Domains must not be empty, but may be omitted. "0" is not a valid
     492        // internet domain, but may be used as server name in a private network.
    493493        $domain = $this->getDomain();
    494         if ($domain === null || $domain === '') {
     494        if ($domain === '') {
    495495            return 'The cookie domain must not be empty';
    496496        }
  • sg-ai-studio/trunk/vendor/guzzlehttp/guzzle/src/Exception/ConnectException.php

    r3505951 r3562098  
    88/**
    99 * Exception thrown when a connection cannot be established.
    10  *
    11  * Note that no response is present for a ConnectException
    1210 */
    1311class ConnectException extends TransferException implements NetworkExceptionInterface
  • sg-ai-studio/trunk/vendor/guzzlehttp/guzzle/src/Exception/RequestException.php

    r3505951 r3562098  
    4646    /**
    4747     * Wrap non-RequestExceptions with a RequestException
     48     *
     49     * @deprecated since 7.11. Create a RequestException directly instead.
    4850     */
    4951    public static function wrapException(RequestInterface $request, \Throwable $e): RequestException
    5052    {
     53        \trigger_deprecation('guzzlehttp/guzzle', '7.11', '%s::wrapException() is deprecated and will be removed in 8.0. Create a %s directly instead.', self::class, self::class);
     54
    5155        return $e instanceof RequestException ? $e : new RequestException($e->getMessage(), $request, null, $e);
    5256    }
  • sg-ai-studio/trunk/vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php

    r3561022 r3562098  
    1010use GuzzleHttp\Psr7\LazyOpenStream;
    1111use GuzzleHttp\TransferStats;
     12use GuzzleHttp\TransportSharing;
    1213use GuzzleHttp\Utils;
    1314use Psr\Http\Message\RequestInterface;
    … …  
    3940
    4041    /**
    41      * @param int $maxHandles Maximum number of idle handles.
    42      */
    43     public function __construct(int $maxHandles)
     42     * @var resource|\CurlShareHandle|null
     43     */
     44    private $shareHandle;
     45
     46    /**
     47     * @var string
     48     */
     49    private $shareMode;
     50
     51    /**
     52     * @param int                            $maxHandles  Maximum number of idle handles.
     53     * @param resource|\CurlShareHandle|null $shareHandle
     54     */
     55    public function __construct(int $maxHandles, string $shareMode = TransportSharing::NONE, $shareHandle = null)
    4456    {
    4557        $this->maxHandles = $maxHandles;
     58        $this->shareMode = CurlShareHandleState::normalizeMode($shareMode, 'transport_sharing');
     59
     60        if ($this->shareMode === TransportSharing::NONE && $shareHandle !== null) {
     61            throw new \InvalidArgumentException('A cURL share handle cannot be provided when transport sharing is disabled.');
     62        }
     63
     64        if ($this->shareMode !== TransportSharing::NONE && $shareHandle === null) {
     65            throw new \InvalidArgumentException('A cURL share handle is required when transport sharing is enabled.');
     66        }
     67
     68        if ($shareHandle !== null && !self::isCurlShareHandle($shareHandle)) {
     69            throw new \InvalidArgumentException('A cURL share handle must be an instance of CurlShareHandle or a curl_share resource.');
     70        }
     71
     72        $this->shareHandle = $shareHandle;
     73    }
     74
     75    /**
     76     * @param mixed $value
     77     */
     78    private static function isCurlShareHandle($value): bool
     79    {
     80        if (\PHP_VERSION_ID < 80000) {
     81            return \is_resource($value) && \get_resource_type($value) === 'curl_share';
     82        }
     83
     84        return $value instanceof \CurlShareHandle;
    4685    }
    4786
    … …  
    5190
    5291        if ('' === $protocolVersion) {
     92            \trigger_deprecation('guzzlehttp/guzzle', '7.11', 'Sending a request with an empty protocol version is deprecated; guzzlehttp/guzzle 8.0 will reject empty protocol versions.');
     93
    5394            $protocolVersion = '1.1';
    5495            $request = \GuzzleHttp\Psr7\Utils::modifyRequest($request, ['version' => $protocolVersion]);
    … …  
    67108            unset($options['curl']['body_as_string']);
    68109        }
     110
     111        self::triggerUnsupportedRequestOptionDeprecations($options);
     112        $this->rejectRequestLevelShareConflict($options);
     113        self::triggerConflictingCurlOptionDeprecations($options);
    69114
    70115        $easy = new EasyHandle();
    … …  
    83128
    84129        $conf[\CURLOPT_HEADERFUNCTION] = $this->createHeaderFn($easy);
     130        if ($this->shareHandle !== null) {
     131            if (!\defined('CURLOPT_SHARE')) {
     132                throw new \InvalidArgumentException('The configured cURL share handle requires CURLOPT_SHARE, but it is not available in the installed PHP cURL extension.');
     133            }
     134
     135            $conf[(int) \constant('CURLOPT_SHARE')] = $this->shareHandle;
     136        }
     137
    85138        $handle = $this->handles ? \array_pop($this->handles) : \curl_init();
    86139        if (false === $handle) {
    … …  
    140193    }
    141194
     195    private function rejectRequestLevelShareConflict(array $options): void
     196    {
     197        if ($this->shareHandle === null) {
     198            return;
     199        }
     200
     201        if (
     202            !\defined('CURLOPT_SHARE')
     203            || !isset($options['curl'])
     204            || !\is_array($options['curl'])
     205            || !\array_key_exists((int) \constant('CURLOPT_SHARE'), $options['curl'])
     206        ) {
     207            return;
     208        }
     209
     210        throw new \InvalidArgumentException('The request-level CURLOPT_SHARE cURL option cannot be combined with configured transport sharing.');
     211    }
     212
    142213    /**
    143214     * @param int|string $option
    … …  
    165236
    166237        return (string) $option;
     238    }
     239
     240    private static function triggerConflictingCurlOptionDeprecations(array $options): void
     241    {
     242        if (!isset($options['curl']) || !\is_array($options['curl']) || $options['curl'] === []) {
     243            return;
     244        }
     245
     246        $conflictingOptions = self::conflictingCurlOptions();
     247
     248        foreach ($options['curl'] as $option => $_) {
     249            if (!\array_key_exists($option, $conflictingOptions)) {
     250                continue;
     251            }
     252
     253            $name = self::formatCurlOption($option);
     254            $replacement = $conflictingOptions[$option];
     255            if ($replacement !== null) {
     256                \trigger_deprecation(
     257                    'guzzlehttp/guzzle',
     258                    '7.11',
     259                    \sprintf(
     260                        'Passing %s in the "curl" request option is deprecated; guzzlehttp/guzzle 8.0 will reject this option because it conflicts with Guzzle-managed request handling. Use %s instead.',
     261                        $name,
     262                        $replacement
     263                    )
     264                );
     265
     266                continue;
     267            }
     268
     269            \trigger_deprecation(
     270                'guzzlehttp/guzzle',
     271                '7.11',
     272                \sprintf(
     273                    'Passing %s in the "curl" request option is deprecated; guzzlehttp/guzzle 8.0 will reject this option because it conflicts with Guzzle-managed cURL internals.',
     274                    $name
     275                )
     276            );
     277        }
     278    }
     279
     280    private static function triggerUnsupportedRequestOptionDeprecations(array $options): void
     281    {
     282        if (
     283            \array_key_exists('transport_sharing', $options)
     284            && CurlShareHandleState::normalizeMode($options['transport_sharing'], 'transport_sharing') !== TransportSharing::NONE
     285        ) {
     286            \trigger_deprecation('guzzlehttp/guzzle', '7.11', 'Passing the "transport_sharing" request option to a cURL handler is deprecated; guzzlehttp/guzzle 8.0 will reject this option because transport sharing must be configured when creating the Client, CurlHandler, or CurlMultiHandler.');
     287        }
     288
     289        if (\array_key_exists('stream_context', $options)) {
     290            \trigger_deprecation('guzzlehttp/guzzle', '7.11', 'Passing the "stream_context" request option to a cURL handler is deprecated; guzzlehttp/guzzle 8.0 will reject this option because cURL handlers ignore PHP stream context options.');
     291        }
     292    }
     293
     294    /**
     295     * @return array<int, string|null>
     296     */
     297    private static function conflictingCurlOptions(): array
     298    {
     299        static $options = null;
     300
     301        if ($options !== null) {
     302            return $options;
     303        }
     304
     305        $options = [];
     306
     307        self::addConflictingCurlOption($options, 'CURLOPT_SHARE', 'the "transport_sharing" client option or cURL handler option');
     308        self::addConflictingCurlOption($options, 'CURLOPT_URL', 'the request URI');
     309        self::addConflictingCurlOption($options, 'CURLOPT_PORT', 'the request URI');
     310        self::addConflictingCurlOption($options, 'CURLOPT_CUSTOMREQUEST', 'the request method');
     311        self::addConflictingCurlOption($options, 'CURLOPT_HTTPGET', 'the request method');
     312        self::addConflictingCurlOption($options, 'CURLOPT_POST', 'the request method and body');
     313        self::addConflictingCurlOption($options, 'CURLOPT_PUT', 'the request method and body');
     314        self::addConflictingCurlOption($options, 'CURLOPT_NOBODY', 'the request method');
     315        self::addConflictingCurlOption($options, 'CURLOPT_UPLOAD', 'the request body');
     316        self::addConflictingCurlOption($options, 'CURLOPT_POSTFIELDS', 'the request body');
     317        self::addConflictingCurlOption($options, 'CURLOPT_READFUNCTION', 'the request body');
     318        self::addConflictingCurlOption($options, 'CURLOPT_READDATA', 'the request body');
     319        self::addConflictingCurlOption($options, 'CURLOPT_INFILE', 'the request body');
     320        self::addConflictingCurlOption($options, 'CURLOPT_INFILESIZE', 'the request body');
     321        self::addConflictingCurlOption($options, 'CURLOPT_INFILESIZE_LARGE', 'the request body');
     322        self::addConflictingCurlOption($options, 'CURLOPT_HTTPHEADER', 'the request headers');
     323        self::addConflictingCurlOption($options, 'CURLOPT_USERAGENT', 'the request headers');
     324        self::addConflictingCurlOption($options, 'CURLOPT_REFERER', 'the request headers');
     325        self::addConflictingCurlOption($options, 'CURLOPT_HEADERFUNCTION', 'the "on_headers" request option');
     326        self::addConflictingCurlOption($options, 'CURLOPT_WRITEFUNCTION', 'the "sink" request option');
     327        self::addConflictingCurlOption($options, 'CURLOPT_FILE', 'the "sink" request option');
     328        self::addConflictingCurlOption($options, 'CURLOPT_RETURNTRANSFER', null);
     329        self::addConflictingCurlOption($options, 'CURLOPT_HEADER', null);
     330        self::addConflictingCurlOption($options, 'CURLOPT_TIMEOUT', 'the "timeout" request option');
     331        self::addConflictingCurlOption($options, 'CURLOPT_TIMEOUT_MS', 'the "timeout" request option');
     332        self::addConflictingCurlOption($options, 'CURLOPT_CONNECTTIMEOUT', 'the "connect_timeout" request option');
     333        self::addConflictingCurlOption($options, 'CURLOPT_CONNECTTIMEOUT_MS', 'the "connect_timeout" request option');
     334        self::addConflictingCurlOption($options, 'CURLOPT_NOSIGNAL', 'the "timeout" or "connect_timeout" request option');
     335        self::addConflictingCurlOption($options, 'CURLOPT_NOPROGRESS', 'the "progress" request option');
     336        self::addConflictingCurlOption($options, 'CURLOPT_PROGRESSFUNCTION', 'the "progress" request option');
     337        self::addConflictingCurlOption($options, 'CURLOPT_XFERINFOFUNCTION', 'the "progress" request option');
     338        self::addConflictingCurlOption($options, 'CURLOPT_VERBOSE', 'the "debug" request option');
     339        self::addConflictingCurlOption($options, 'CURLOPT_STDERR', 'the "debug" request option');
     340        self::addConflictingCurlOption($options, 'CURLOPT_PROXY', 'the "proxy" request option');
     341        self::addConflictingCurlOption($options, 'CURLOPT_NOPROXY', 'the "proxy" request option');
     342        self::addConflictingCurlOption($options, 'CURLOPT_FOLLOWLOCATION', 'the "allow_redirects" request option');
     343        self::addConflictingCurlOption($options, 'CURLOPT_MAXREDIRS', 'the "allow_redirects" request option');
     344        self::addConflictingCurlOption($options, 'CURLOPT_POSTREDIR', 'the "allow_redirects" request option');
     345        self::addConflictingCurlOption($options, 'CURLOPT_REDIR_PROTOCOLS', 'the "allow_redirects" request option');
     346        self::addConflictingCurlOption($options, 'CURLOPT_REDIR_PROTOCOLS_STR', 'the "allow_redirects" request option');
     347        self::addConflictingCurlOption($options, 'CURLOPT_PROTOCOLS', 'the "protocols" request option');
     348        self::addConflictingCurlOption($options, 'CURLOPT_PROTOCOLS_STR', 'the "protocols" request option');
     349        self::addConflictingCurlOption($options, 'CURLOPT_HTTP09_ALLOWED', null);
     350        self::addConflictingCurlOption($options, 'CURLOPT_HTTP_VERSION', 'the request protocol version');
     351        self::addConflictingCurlOption($options, 'CURLOPT_IPRESOLVE', 'the "force_ip_resolve" request option');
     352        self::addConflictingCurlOption($options, 'CURLOPT_SSL_VERIFYPEER', 'the "verify" request option');
     353        self::addConflictingCurlOption($options, 'CURLOPT_SSL_VERIFYHOST', 'the "verify" request option');
     354        self::addConflictingCurlOption($options, 'CURLOPT_CAINFO', 'the "verify" request option');
     355        self::addConflictingCurlOption($options, 'CURLOPT_CAPATH', 'the "verify" request option');
     356        self::addConflictingCurlOption($options, 'CURLOPT_SSLVERSION', 'the "crypto_method" request option');
     357        self::addConflictingCurlOption($options, 'CURLOPT_SSLCERT', 'the "cert" request option');
     358        self::addConflictingCurlOption($options, 'CURLOPT_SSLCERTPASSWD', 'the "cert" request option');
     359        self::addConflictingCurlOption($options, 'CURLOPT_SSLCERTTYPE', 'the "cert_type" request option');
     360        self::addConflictingCurlOption($options, 'CURLOPT_SSLKEY', 'the "ssl_key" request option');
     361        self::addConflictingCurlOption($options, 'CURLOPT_SSLKEYPASSWD', 'the "ssl_key" request option');
     362        self::addConflictingCurlOption($options, 'CURLOPT_KEYPASSWD', 'the "ssl_key" request option');
     363        self::addConflictingCurlOption($options, 'CURLOPT_SSLKEYTYPE', 'the "ssl_key_type" request option');
     364        self::addConflictingCurlOption($options, 'CURLOPT_COOKIE', 'the "Cookie" request header or Guzzle cookie middleware');
     365        self::addConflictingCurlOption($options, 'CURLOPT_COOKIEFILE', 'Guzzle cookie middleware');
     366        self::addConflictingCurlOption($options, 'CURLOPT_COOKIEJAR', 'Guzzle cookie middleware');
     367        self::addConflictingCurlOption($options, 'CURLOPT_COOKIELIST', 'Guzzle cookie middleware');
     368        self::addConflictingCurlOption($options, 'CURLOPT_COOKIESESSION', 'Guzzle cookie middleware');
     369
     370        return $options;
     371    }
     372
     373    /**
     374     * @param array<int, string|null> $options
     375     */
     376    private static function addConflictingCurlOption(array &$options, string $constant, ?string $replacement): void
     377    {
     378        if (!\defined($constant)) {
     379            return;
     380        }
     381
     382        $value = \constant($constant);
     383        if (\is_int($value)) {
     384            $options[$value] = $replacement;
     385        }
    167386    }
    168387
    … …  
    396615        ];
    397616
     617        $protocols = Utils::normalizeProtocols($easy->options['protocols'] ?? ['http', 'https']);
     618        $scheme = $easy->request->getUri()->getScheme();
     619        if (!\in_array($scheme, $protocols, true)) {
     620            throw new RequestException(\sprintf('The scheme "%s" is not allowed by the protocols request option.', $scheme), $easy->request);
     621        }
     622
    398623        if (\defined('CURLOPT_PROTOCOLS')) {
    399             $conf[\CURLOPT_PROTOCOLS] = \CURLPROTO_HTTP | \CURLPROTO_HTTPS;
     624            $conf[\CURLOPT_PROTOCOLS] = self::curlProtocolMask($protocols);
    400625        }
    401626
    … …  
    411636
    412637        return $conf;
     638    }
     639
     640    /**
     641     * @param string[] $protocols
     642     */
     643    private static function curlProtocolMask(array $protocols): int
     644    {
     645        $mask = 0;
     646
     647        if (\in_array('http', $protocols, true)) {
     648            $mask |= \CURLPROTO_HTTP;
     649        }
     650
     651        if (\in_array('https', $protocols, true)) {
     652            $mask |= \CURLPROTO_HTTPS;
     653        }
     654
     655        return $mask;
     656    }
     657
     658    /**
     659     * @param mixed $type
     660     */
     661    private static function normalizeTlsFileType(string $option, $type): string
     662    {
     663        if (!\is_string($type) || $type === '') {
     664            throw new \InvalidArgumentException(\sprintf('%s must be a non-empty string', $option));
     665        }
     666
     667        return \strtoupper($type);
     668    }
     669
     670    private static function shouldValidateSslKeyFile(?string $type): bool
     671    {
     672        return $type !== 'ENG' && $type !== 'PROV';
    413673    }
    414674
    … …  
    510770    {
    511771        foreach (\array_keys($options['_headers']) as $key) {
    512             if (!\strcasecmp($key, $name)) {
     772            if (!\strcasecmp((string) $key, $name)) {
    513773                unset($options['_headers'][$key]);
    514774
    … …  
    616876                $scheme = $easy->request->getUri()->getScheme();
    617877                if (isset($options['proxy'][$scheme])) {
    618                     $host = $easy->request->getUri()->getHost();
    619                     if (isset($options['proxy']['no']) && Utils::isHostInNoProxy($host, $options['proxy']['no'])) {
     878                    if (
     879                        isset($options['proxy']['no'])
     880                        && Utils::isUriInNoProxy($easy->request->getUri(), $options['proxy']['no'])
     881                    ) {
    620882                        unset($conf[\CURLOPT_PROXY]);
    621883                    } else {
    … …  
    664926        }
    665927
     928        $certType = null;
     929        if (isset($options['cert_type'])) {
     930            $certType = self::normalizeTlsFileType('cert_type', $options['cert_type']);
     931            $conf[\CURLOPT_SSLCERTTYPE] = $certType;
     932        }
     933
    666934        if (isset($options['cert'])) {
    667935            $cert = $options['cert'];
    … …  
    687955            // see https://curl.se/libcurl/c/CURLOPT_SSLCERTTYPE.html
    688956            $ext = pathinfo($cert, \PATHINFO_EXTENSION);
    689             if (preg_match('#^(der|p12)$#i', $ext)) {
     957            if ($certType === null && preg_match('#^(der|p12)$#i', $ext)) {
    690958                $conf[\CURLOPT_SSLCERTTYPE] = strtoupper($ext);
    691959            }
    692960            $conf[\CURLOPT_SSLCERT] = $cert;
     961        }
     962
     963        $sslKeyType = null;
     964        if (isset($options['ssl_key_type'])) {
     965            $sslKeyType = self::normalizeTlsFileType('ssl_key_type', $options['ssl_key_type']);
     966            $conf[\CURLOPT_SSLKEYTYPE] = $sslKeyType;
    693967        }
    694968
    695969        if (isset($options['ssl_key'])) {
    696970            if (\is_array($options['ssl_key'])) {
    697                 if (\count($options['ssl_key']) === 2) {
    698                     [$sslKey, $conf[\CURLOPT_SSLKEYPASSWD]] = $options['ssl_key'];
    699                 } else {
    700                     [$sslKey] = $options['ssl_key'];
    701                 }
     971                if (!isset($options['ssl_key'][0]) || !\is_string($options['ssl_key'][0])) {
     972                    throw new \InvalidArgumentException('Invalid ssl_key request option');
     973                }
     974                if (isset($options['ssl_key'][1])) {
     975                    if (!\is_string($options['ssl_key'][1])) {
     976                        throw new \InvalidArgumentException('Invalid ssl_key request option');
     977                    }
     978                    $conf[\CURLOPT_SSLKEYPASSWD] = $options['ssl_key'][1];
     979                }
     980                $sslKey = $options['ssl_key'][0];
    702981            }
    703982
    704983            $sslKey = $sslKey ?? $options['ssl_key'];
    705984
    706             if (!\file_exists($sslKey)) {
     985            if (!\is_string($sslKey)) {
     986                throw new \InvalidArgumentException('Invalid ssl_key request option');
     987            }
     988
     989            if (self::shouldValidateSslKeyFile($sslKeyType) && !\file_exists($sslKey)) {
    707990                throw new \InvalidArgumentException("SSL private key not found: {$sslKey}");
    708991            }
    … …  
    7961079                try {
    7971080                    $easy->createResponse();
    798                 } catch (\Exception $e) {
     1081                } catch (\Throwable $e) {
     1082                    $easy->response = null;
    7991083                    $easy->createResponseException = $e;
    8001084
    … …  
    8041088                    try {
    8051089                        $onHeaders($easy->response);
    806                     } catch (\Exception $e) {
     1090                    } catch (\Throwable $e) {
    8071091                        // Associate the exception with the handle and trigger
    8081092                        // a curl header write error by returning 0.
  • sg-ai-studio/trunk/vendor/guzzlehttp/guzzle/src/Handler/CurlHandler.php

    r3505951 r3562098  
    44
    55use GuzzleHttp\Promise\PromiseInterface;
     6use GuzzleHttp\TransportSharing;
    67use Psr\Http\Message\RequestInterface;
    78
    … …  
    2324
    2425    /**
     26     * @var CurlShareHandleState|null
     27     */
     28    private $shareHandleState;
     29
     30    /**
    2531     * Accepts an associative array of options:
    2632     *
    2733     * - handle_factory: Optional curl factory used to create cURL handles.
     34     * - transport_sharing: Optional transport sharing mode.
    2835     *
    29      * @param array{handle_factory?: ?CurlFactoryInterface} $options Array of options to use with the handler
     36     * @param array{handle_factory?: ?CurlFactoryInterface, transport_sharing?: mixed} $options Array of options to use with the handler
    3037     */
    3138    public function __construct(array $options = [])
    3239    {
    33         $this->factory = $options['handle_factory']
    34             ?? new CurlFactory(3);
     40        CurlShareHandleState::assertNoRequiredSharingCustomFactoryConflict($options, 'CurlHandler');
     41        $transportSharing = $options['transport_sharing'] ?? null;
     42        $sharingMode = CurlShareHandleState::normalizeMode($transportSharing, 'transport_sharing');
     43
     44        if (\array_key_exists('handle_factory', $options) && $options['handle_factory'] !== null) {
     45            $this->shareHandleState = null;
     46            $this->factory = $options['handle_factory'];
     47
     48            return;
     49        }
     50
     51        $this->shareHandleState = $sharingMode !== TransportSharing::NONE
     52            ? CurlShareHandleState::fromOption($transportSharing)
     53            : null;
     54
     55        $this->factory = $this->shareHandleState !== null
     56            ? new CurlFactory(3, $this->shareHandleState->mode, $this->shareHandleState->handle)
     57            : new CurlFactory(3);
    3558    }
    3659
  • sg-ai-studio/trunk/vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php

    r3561022 r3562098  
    77use GuzzleHttp\Promise\Promise;
    88use GuzzleHttp\Promise\PromiseInterface;
     9use GuzzleHttp\TransportSharing;
    910use GuzzleHttp\Utils;
    1011use Psr\Http\Message\RequestInterface;
    … …  
    2728
    2829    /**
     30     * @var CurlShareHandleState|null
     31     */
     32    private $shareHandleState;
     33
     34    /**
    2935     * @var int
    3036     */
    … …  
    7278     *
    7379     * - handle_factory: An optional factory  used to create curl handles
     80     * - transport_sharing: Optional transport sharing mode.
    7481     * - select_timeout: Optional timeout (in seconds) to block before timing
    7582     *   out while selecting curl handles. Defaults to 1 second.
    … …  
    7986    public function __construct(array $options = [])
    8087    {
    81         $this->factory = $options['handle_factory'] ?? new CurlFactory(50);
     88        CurlShareHandleState::assertNoRequiredSharingCustomFactoryConflict($options, 'CurlMultiHandler');
     89        $transportSharing = $options['transport_sharing'] ?? null;
     90        $sharingMode = CurlShareHandleState::normalizeMode($transportSharing, 'transport_sharing');
     91
     92        if (\array_key_exists('handle_factory', $options) && $options['handle_factory'] !== null) {
     93            $this->shareHandleState = null;
     94            $this->factory = $options['handle_factory'];
     95        } else {
     96            $this->shareHandleState = $sharingMode !== TransportSharing::NONE
     97                ? CurlShareHandleState::fromOption($transportSharing)
     98                : null;
     99
     100            $this->factory = $this->shareHandleState !== null
     101                ? new CurlFactory(50, $this->shareHandleState->mode, $this->shareHandleState->handle)
     102                : new CurlFactory(50);
     103        }
    82104
    83105        if (isset($options['select_timeout'])) {
    84106            $this->selectTimeout = $options['select_timeout'];
    85107        } elseif ($selectTimeout = Utils::getenv('GUZZLE_CURL_SELECT_TIMEOUT')) {
    86             @trigger_error('Since guzzlehttp/guzzle 7.2.0: Using environment variable GUZZLE_CURL_SELECT_TIMEOUT is deprecated. Use option "select_timeout" instead.', \E_USER_DEPRECATED);
     108            \trigger_deprecation('guzzlehttp/guzzle', '7.2', 'The GUZZLE_CURL_SELECT_TIMEOUT environment variable is deprecated; use the "select_timeout" option instead.');
    87109            $this->selectTimeout = (int) $selectTimeout;
    88110        } else {
    … …  
    130152    {
    131153        if (isset($this->_mh)) {
    132             \curl_multi_close($this->_mh);
    133             unset($this->_mh);
     154            try {
     155                \curl_multi_close($this->_mh);
     156            } catch (\Throwable $e) {
     157                // Destructors must not throw.
     158            } finally {
     159                unset($this->_mh);
     160            }
    134161        }
    135162    }
    … …  
    260287    {
    261288        if (!is_int($id)) {
    262             trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing an integer to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__);
     289            \trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing an int to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__);
    263290        }
    264291
  • sg-ai-studio/trunk/vendor/guzzlehttp/guzzle/src/Handler/EasyHandle.php

    r3561022 r3562098  
    5757
    5858    /**
    59      * @var \Exception|null Exception during createResponse (if any)
     59     * @var \Throwable|null Exception during createResponse (if any)
    6060     */
    6161    public $createResponseException;
  • sg-ai-studio/trunk/vendor/guzzlehttp/guzzle/src/Handler/HeaderProcessor.php

    r3561022 r3562098  
    2525        }
    2626
    27         $parts = \explode(' ', \array_shift($headers), 3);
     27        $headers = self::getLastHeaderBlock(\array_values($headers));
     28
     29        $statusLine = \array_shift($headers);
     30        if ($statusLine === null) {
     31            throw new \RuntimeException('Expected a non-empty array of header data');
     32        }
     33
     34        $parts = \explode(' ', $statusLine, 3);
    2835        $version = \explode('/', $parts[0])[1] ?? null;
    2936
    … …  
    3845        }
    3946
     47        if (!\preg_match('/^\d{3}$/', $status)) {
     48            throw new \RuntimeException('HTTP status code is invalid');
     49        }
     50
    4051        foreach ($headers as $header) {
    4152            if (\strpos($header, ':') === false) {
    … …  
    4657        return [$version, (int) $status, $parts[2] ?? null, Utils::headersFromLines($headers)];
    4758    }
     59
     60    /**
     61     * @param non-empty-list<string> $headers
     62     *
     63     * @return list<string>
     64     */
     65    private static function getLastHeaderBlock(array $headers): array
     66    {
     67        $lastStatusLine = 0;
     68
     69        foreach ($headers as $index => $line) {
     70            if (\preg_match('/^HTTP\/\S+\s+/i', $line)) {
     71                $lastStatusLine = $index;
     72            }
     73        }
     74
     75        return \array_slice($headers, $lastStatusLine);
     76    }
    4877}
  • sg-ai-studio/trunk/vendor/guzzlehttp/guzzle/src/Handler/StreamHandler.php

    r3561022 r3562098  
    1010use GuzzleHttp\Psr7;
    1111use GuzzleHttp\TransferStats;
     12use GuzzleHttp\TransportSharing;
    1213use GuzzleHttp\Utils;
    1314use Psr\Http\Message\RequestInterface;
    … …  
    6263
    6364        if ('' === $protocolVersion) {
     65            \trigger_deprecation('guzzlehttp/guzzle', '7.11', 'Sending a request with an empty protocol version is deprecated; guzzlehttp/guzzle 8.0 will reject empty protocol versions.');
     66
    6467            $protocolVersion = '1.1';
    6568            $request = Psr7\Utils::modifyRequest($request, ['version' => $protocolVersion]);
    … …  
    7174
    7275        $startTime = isset($options['on_stats']) ? Utils::currentTime() : null;
     76
     77        self::triggerUnsupportedRequestOptionDeprecations($request, $options);
    7378
    7479        try {
    … …  
    101106                $e = new ConnectException($e->getMessage(), $request, $e);
    102107            } else {
    103                 $e = RequestException::wrapException($request, $e);
     108                $e = $e instanceof RequestException ? $e : new RequestException($e->getMessage(), $request, null, $e);
    104109            }
    105110            $this->invokeStats($options, $request, $startTime, null, $e);
    … …  
    143148        try {
    144149            [$ver, $status, $reason, $headers] = HeaderProcessor::parseHeaders($hdrs);
    145         } catch (\Exception $e) {
    146             return P\Create::rejectionFor(
    147                 new RequestException('An error was encountered while creating the response', $request, null, $e)
    148             );
     150        } catch (\Throwable $e) {
     151            return $this->rejectResponseCreation($options, $request, $startTime, $e);
    149152        }
    150153
    … …  
    159162        try {
    160163            $response = new Psr7\Response($status, $headers, $sink, $ver, $reason);
    161         } catch (\Exception $e) {
    162             return P\Create::rejectionFor(
    163                 new RequestException('An error was encountered while creating the response', $request, null, $e)
    164             );
     164        } catch (\Throwable $e) {
     165            return $this->rejectResponseCreation($options, $request, $startTime, $e);
    165166        }
    166167
    … …  
    168169            try {
    169170                $options['on_headers']($response);
    170             } catch (\Exception $e) {
     171            } catch (\Throwable $e) {
    171172                return P\Create::rejectionFor(
    172173                    new RequestException('An error was encountered during the on_headers event', $request, $response, $e)
    … …  
    184185
    185186        return new FulfilledPromise($response);
     187    }
     188
     189    private function rejectResponseCreation(
     190        array $options,
     191        RequestInterface $request,
     192        ?float $startTime,
     193        \Throwable $previous
     194    ): PromiseInterface {
     195        $reason = new RequestException(
     196            'An error was encountered while creating the response',
     197            $request,
     198            null,
     199            $previous
     200        );
     201
     202        $this->invokeStats($options, $request, $startTime, null, $reason);
     203
     204        return P\Create::rejectionFor($reason);
    186205    }
    187206
    … …  
    305324        }
    306325
    307         if (!\in_array($request->getUri()->getScheme(), ['http', 'https'])) {
    308             throw new RequestException(\sprintf("The scheme '%s' is not supported.", $request->getUri()->getScheme()), $request);
     326        $scheme = $request->getUri()->getScheme();
     327        if (!\in_array($scheme, ['http', 'https'], true)) {
     328            throw new RequestException(\sprintf("The scheme '%s' is not supported.", $scheme), $request);
     329        }
     330
     331        $protocols = Utils::normalizeProtocols($options['protocols'] ?? ['http', 'https']);
     332        if (!\in_array($scheme, $protocols, true)) {
     333            throw new RequestException(\sprintf('The scheme "%s" is not allowed by the protocols request option.', $scheme), $request);
    309334        }
    310335
    … …  
    364389                // See https://wiki.php.net/rfc/deprecations_php_8_5#deprecate_the_http_response_header_predefined_variable
    365390                if (function_exists('http_get_last_response_headers')) {
    366                     /** @var array|null */
    367391                    $http_response_header = \http_get_last_response_headers();
    368392                }
    … …  
    449473    }
    450474
     475    private static function triggerUnsupportedRequestOptionDeprecations(RequestInterface $request, array $options): void
     476    {
     477        if (\array_key_exists('transport_sharing', $options)) {
     478            $transportSharingMode = CurlShareHandleState::normalizeMode($options['transport_sharing'], 'transport_sharing');
     479
     480            if ($transportSharingMode === TransportSharing::HANDLER_REQUIRE) {
     481                throw new \InvalidArgumentException('The "transport_sharing" option requires transport sharing, but the stream handler does not support it.');
     482            }
     483        }
     484
     485        if (
     486            \array_key_exists('curl', $options)
     487            && $options['curl'] !== null
     488            && $options['curl'] !== []
     489            && !self::isCurlOptionGeneratedByAuth($options)
     490        ) {
     491            \trigger_deprecation('guzzlehttp/guzzle', '7.11', 'Passing the "curl" request option to the stream handler is deprecated; guzzlehttp/guzzle 8.0 will reject this option because the stream handler ignores cURL options.');
     492        }
     493
     494        if (self::usesDigestAuth($options)) {
     495            \trigger_deprecation('guzzlehttp/guzzle', '7.11', 'Passing digest authentication to the stream handler is deprecated; guzzlehttp/guzzle 8.0 will reject digest authentication with the stream handler because it is only supported by cURL handlers.');
     496        }
     497
     498        if (\array_key_exists('expect', $options) && $options['expect'] !== false && $request->hasHeader('Expect')) {
     499            \trigger_deprecation('guzzlehttp/guzzle', '7.11', 'Passing the "expect" request option to the stream handler is deprecated when it adds an Expect header; guzzlehttp/guzzle 8.0 will reject this option because the stream handler does not support Expect: 100-Continue.');
     500        }
     501    }
     502
     503    private static function isCurlOptionGeneratedByAuth(array $options): bool
     504    {
     505        if (!isset($options['curl']) || !\is_array($options['curl']) || !isset($options['auth'][2]) || !\is_string($options['auth'][2])) {
     506            return false;
     507        }
     508
     509        if (!\defined('CURLOPT_HTTPAUTH') || !\defined('CURLOPT_USERPWD')) {
     510            return false;
     511        }
     512
     513        $type = \strtolower($options['auth'][2]);
     514        if ($type === 'digest') {
     515            $httpAuth = \defined('CURLAUTH_DIGEST') ? \constant('CURLAUTH_DIGEST') : null;
     516        } elseif ($type === 'ntlm') {
     517            $httpAuth = \defined('CURLAUTH_NTLM') ? \constant('CURLAUTH_NTLM') : null;
     518        } else {
     519            return false;
     520        }
     521
     522        return $httpAuth !== null
     523            && \count($options['curl']) === 2
     524            && isset($options['curl'][\CURLOPT_HTTPAUTH], $options['curl'][\CURLOPT_USERPWD])
     525            && $options['curl'][\CURLOPT_HTTPAUTH] === $httpAuth;
     526    }
     527
     528    private static function usesDigestAuth(array $options): bool
     529    {
     530        return isset($options['auth'][2])
     531            && \is_string($options['auth'][2])
     532            && \strtolower($options['auth'][2]) === 'digest';
     533    }
     534
     535    /**
     536     * @param mixed $value as passed via Request transfer options.
     537     *
     538     * @return array{0: string, 1: string|null}
     539     */
     540    private static function normalizeTlsFileOption(string $option, $value): array
     541    {
     542        $passphrase = null;
     543
     544        if (\is_array($value)) {
     545            if (!isset($value[0]) || !\is_string($value[0])) {
     546                throw new \InvalidArgumentException(\sprintf('Invalid %s request option', $option));
     547            }
     548            if (isset($value[1])) {
     549                if (!\is_string($value[1])) {
     550                    throw new \InvalidArgumentException(\sprintf('Invalid %s request option', $option));
     551                }
     552                $passphrase = $value[1];
     553            }
     554            $value = $value[0];
     555        }
     556
     557        if (!\is_string($value)) {
     558            throw new \InvalidArgumentException(\sprintf('Invalid %s request option', $option));
     559        }
     560
     561        return [$value, $passphrase];
     562    }
     563
     564    private static function setTlsPassphrase(array &$options, ?string $passphrase, string $option): void
     565    {
     566        if ($passphrase === null) {
     567            return;
     568        }
     569
     570        if (isset($options['ssl']['passphrase']) && $options['ssl']['passphrase'] !== $passphrase) {
     571            throw new \InvalidArgumentException(\sprintf('Cannot use different passphrases for cert and ssl_key with the stream handler; %s conflicts with an existing TLS passphrase.', $option));
     572        }
     573
     574        $options['ssl']['passphrase'] = $passphrase;
     575    }
     576
     577    /**
     578     * @param mixed $value as passed via Request transfer options.
     579     */
     580    private static function assertStreamTlsType(string $option, $value): void
     581    {
     582        if (!\is_string($value) || $value === '') {
     583            throw new \InvalidArgumentException(\sprintf('%s must be a non-empty string', $option));
     584        }
     585
     586        if (\strtoupper($value) !== 'PEM') {
     587            throw new \InvalidArgumentException(\sprintf('The stream handler only supports "PEM" for the %s request option.', $option));
     588        }
     589    }
     590
    451591    /**
    452592     * @param mixed $value as passed via Request transfer options.
    … …  
    461601            $scheme = $request->getUri()->getScheme();
    462602            if (isset($value[$scheme])) {
    463                 if (!isset($value['no']) || !Utils::isHostInNoProxy($request->getUri()->getHost(), $value['no'])) {
     603                if (
     604                    !isset($value['no'])
     605                    || !Utils::isUriInNoProxy($request->getUri(), $value['no'])
     606                ) {
    464607                    $uri = $value[$scheme];
    465608                }
    … …  
    570713    private function add_cert(RequestInterface $request, array &$options, $value, array &$params): void
    571714    {
    572         if (\is_array($value)) {
    573             if (!isset($value[0]) || !\is_string($value[0])) {
    574                 throw new \InvalidArgumentException('Invalid cert request option');
    575             }
    576             if (isset($value[1])) {
    577                 if (!\is_string($value[1])) {
    578                     throw new \InvalidArgumentException('Invalid cert request option');
    579                 }
    580                 $options['ssl']['passphrase'] = $value[1];
    581             }
    582             $value = $value[0];
    583         }
    584 
    585         if (!\is_string($value)) {
    586             throw new \InvalidArgumentException('Invalid cert request option');
    587         }
     715        [$value, $passphrase] = self::normalizeTlsFileOption('cert', $value);
    588716
    589717        if (!\file_exists($value)) {
    … …  
    591719        }
    592720
     721        self::setTlsPassphrase($options, $passphrase, 'cert');
    593722        $options['ssl']['local_cert'] = $value;
     723    }
     724
     725    /**
     726     * @param mixed $value as passed via Request transfer options.
     727     */
     728    private function add_cert_type(RequestInterface $request, array &$options, $value, array &$params): void
     729    {
     730        self::assertStreamTlsType('cert_type', $value);
     731    }
     732
     733    /**
     734     * @param mixed $value as passed via Request transfer options.
     735     */
     736    private function add_ssl_key(RequestInterface $request, array &$options, $value, array &$params): void
     737    {
     738        [$value, $passphrase] = self::normalizeTlsFileOption('ssl_key', $value);
     739
     740        if (!\file_exists($value)) {
     741            throw new \RuntimeException("SSL private key not found: {$value}");
     742        }
     743
     744        self::setTlsPassphrase($options, $passphrase, 'ssl_key');
     745        $options['ssl']['local_pk'] = $value;
     746    }
     747
     748    /**
     749     * @param mixed $value as passed via Request transfer options.
     750     */
     751    private function add_ssl_key_type(RequestInterface $request, array &$options, $value, array &$params): void
     752    {
     753        self::assertStreamTlsType('ssl_key_type', $value);
    594754    }
    595755
  • sg-ai-studio/trunk/vendor/guzzlehttp/guzzle/src/HandlerStack.php

    r3561022 r3562098  
    182182    {
    183183        if (!is_string($remove) && !is_callable($remove)) {
    184             trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a callable or string to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__);
     184            \trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a callable or string to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__);
    185185        }
    186186
  • sg-ai-studio/trunk/vendor/guzzlehttp/guzzle/src/Pool.php

    r3505951 r3562098  
    5050        } else {
    5151            $opts = [];
     52        }
     53
     54        if (!\is_iterable($requests)) {
     55            \trigger_deprecation(
     56                'guzzlehttp/guzzle',
     57                '7.11',
     58                'Passing a non-iterable request collection to %s::__construct() or %s::batch() is deprecated; guzzlehttp/guzzle 8.0 will require an iterable.',
     59                __CLASS__,
     60                __CLASS__
     61            );
     62
     63            $requests = [$requests];
    5264        }
    5365
  • sg-ai-studio/trunk/vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php

    r3561022 r3562098  
    178178
    179179        $uri = self::redirectUri($request, $response, $protocols);
    180         if (isset($options['idn_conversion']) && ($options['idn_conversion'] !== false)) {
    181             $idnOptions = ($options['idn_conversion'] === true) ? \IDNA_DEFAULT : $options['idn_conversion'];
     180        $idnOptions = Utils::normalizeIdnConversionOption($options['idn_conversion'] ?? null);
     181        if ($idnOptions !== null) {
    182182            $uri = Utils::idnUriConvert($uri, $idnOptions);
    183183        }
  • sg-ai-studio/trunk/vendor/guzzlehttp/guzzle/src/RequestOptions.php

    r3561022 r3562098  
    66 * This class contains a list of built-in Guzzle request options.
    77 *
    8  * @see https://docs.guzzlephp.org/en/latest/request-options.html
     8 * @see https://github.com/guzzle/guzzle/blob/7.11/docs/request-options.md
    99 */
    1010final class RequestOptions
    … …  
    2424     * - referer: (bool, default=false) Set to true to enable the Referer
    2525     *   header.
    26      * - protocols: (array, default=['http', 'https']) Allowed redirect
    27      *   protocols.
     26     * - protocols: (non-empty-array<array-key, string>, default=['http', 'https'])
     27     *   Allowed redirect protocols. Redirect matching is case-sensitive; use
     28     *   "http" and "https".
    2829     * - on_redirect: (callable) PHP callable that is invoked when a redirect
    2930     *   is encountered. The callable is invoked with the request, the redirect
    3031     *   response that was received, and the effective URI. Any return value
    3132     *   from the on_redirect function is ignored.
     33     * - track_redirects: (bool, default=false) Track redirected URI and status
     34     *   history in response headers.
    3235     */
    3336    public const ALLOW_REDIRECTS = 'allow_redirects';
    3437
    3538    /**
    36      * auth: (array) Pass an array of HTTP authentication parameters to use
    37      * with the request. The array must contain the username in index [0],
    38      * the password in index [1], and you can optionally provide a built-in
    39      * authentication type in index [2]. Pass null to disable authentication
    40      * for a request.
     39     * auth: (array{0: string, 1: string, 2?: string|null}|string|false|null)
     40     * Pass an array of HTTP authentication parameters to use with the request.
     41     * The array must contain the username in index [0], the password in index
     42     * [1], and you can optionally provide a built-in authentication type in
     43     * index [2]. Pass false or null to disable authentication for a request.
     44     * String values are passed through for custom handlers.
    4145     */
    4246    public const AUTH = 'auth';
    4347
    4448    /**
    45      * body: (resource|string|null|int|float|StreamInterface|callable|\Iterator)
    46      * Body to send in the request.
     49     * body: (resource|string|null|int|float|bool|\Psr\Http\Message\StreamInterface|(callable&object)|\Iterator|\Stringable)
     50     * Body to send in the request. Callable arrays are arrays, and arrays are
     51     * not valid body values in Guzzle.
    4752     */
    4853    public const BODY = 'body';
    4954
    5055    /**
    51      * cert: (string|array) Set to a string to specify the path to a file
    52      * containing a PEM formatted SSL client side certificate. If a password
    53      * is required, then set cert to an array containing the path to the PEM
    54      * file in the first array element followed by the certificate password
    55      * in the second array element.
     56     * cert: (string|array{0: string, 1?: string|null}) Set to a string to
     57     * specify the path to a client certificate file. PEM is the default
     58     * certificate format. If a password is required, set cert to an array
     59     * containing the certificate path in the first array element followed by
     60     * the certificate password in the second array element. A null password is
     61     * treated the same as omitting it. Use cert_type to specify another
     62     * supported certificate format.
    5663     */
    5764    public const CERT = 'cert';
    5865
    5966    /**
    60      * cookies: (bool|GuzzleHttp\Cookie\CookieJarInterface, default=false)
     67     * cert_type: (string) Specify the SSL client certificate file type.
     68     */
     69    public const CERT_TYPE = 'cert_type';
     70
     71    /**
     72     * cookies: (false|GuzzleHttp\Cookie\CookieJarInterface, default=false)
    6173     * Specifies whether or not cookies are used in a request or what cookie
    6274     * jar to use or what cookies to send. This option only works if your
    … …  
    6779
    6880    /**
    69      * connect_timeout: (float, default=0) Float describing the number of
    70      * seconds to wait while trying to connect to a server. Use 0 to wait
    71      * 300 seconds (the default behavior).
     81     * connect_timeout: (int|float, default=0) Number of seconds to wait while
     82     * trying to connect to a server. Use 0 to wait 300 seconds (the default
     83     * behavior).
    7284     */
    7385    public const CONNECT_TIMEOUT = 'connect_timeout';
    … …  
    93105
    94106    /**
    95      * decode_content: (bool, default=true) Specify whether or not
     107     * decode_content: (bool|string, default=true) Specify whether or not
    96108     * Content-Encoding responses (gzip, deflate, etc.) are automatically
    97109     * decoded.
    … …  
    100112
    101113    /**
    102      * delay: (int) The amount of time to delay before sending in milliseconds.
     114     * delay: (int|float) The amount of time to delay before sending in
     115     * milliseconds.
    103116     */
    104117    public const DELAY = 'delay';
    … …  
    123136
    124137    /**
    125      * form_params: (array) Associative array of form field names to values
    126      * where each value is a string or array of strings. Sets the Content-Type
    127      * header to application/x-www-form-urlencoded when no Content-Type header
    128      * is already present.
     138     * form_params: (array<array-key, string|int|float|bool|null|array>)
     139     * Associative array of form field names to scalar, null, or nested array
     140     * values. Sets the Content-Type header to application/x-www-form-urlencoded
     141     * when no Content-Type header is already present.
    129142     */
    130143    public const FORM_PARAMS = 'form_params';
    131144
    132145    /**
    133      * headers: (array) Associative array of HTTP headers. Each value MUST be
    134      * a string or array of strings.
     146     * headers: (array<array-key, string|non-empty-array<array-key, string>>|null)
     147     * Associative array of HTTP headers. Each value MUST be a string or non-empty
     148     * array of strings.
    135149     */
    136150    public const HEADERS = 'headers';
    … …  
    145159
    146160    /**
    147      * idn: (bool|int, default=true) A combination of IDNA_* constants for
    148      * idn_to_ascii() PHP's function (see "options" parameter). Set to false to
    149      * disable IDN support completely, or to true to use the default
    150      * configuration (IDNA_DEFAULT constant).
     161     * idn_conversion: (bool|int|null, default=false) A combination of IDNA_*
     162     * constants for PHP's idn_to_ascii() function. Set to false or null to
     163     * disable IDN support, or to true to use the default configuration
     164     * (IDNA_DEFAULT constant).
    151165     */
    152166    public const IDN_CONVERSION = 'idn_conversion';
    … …  
    160174
    161175    /**
    162      * multipart: (array) Array of associative arrays, each containing a
    163      * required "name" key mapping to the form field, name, a required
    164      * "contents" key mapping to a StreamInterface|resource|string, an
    165      * optional "headers" associative array of custom headers, and an
    166      * optional "filename" key mapping to a string to send as the filename in
    167      * the part. If no "filename" key is present, then no "filename" attribute
    168      * will be added to the part.
     176     * multipart: (array) Array of part arrays, each containing a required
     177     * "name" key mapping to the string or integer form field name, a required
     178     * "contents" key mapping to any non-array value accepted by PSR-7
     179     * Utils::streamFor() or a nested array of field values, an optional
     180     * "headers" array of string custom header values, and an optional
     181     * "filename" key mapping to a string to send as the filename in the part.
     182     * "headers" and "filename" cannot be used when "contents" is an array.
    169183     */
    170184    public const MULTIPART = 'multipart';
    … …  
    198212
    199213    /**
     214     * protocols: (non-empty-array<array-key, string>, default=['http', 'https'])
     215     * Allowed URI schemes. Built-in handlers accept only the case-sensitive
     216     * values "http" and "https".
     217     */
     218    public const PROTOCOLS = 'protocols';
     219
     220    /**
    200221     * proxy: (string|array) Pass a string to specify an HTTP proxy, or an
    201222     * array to specify different proxies for different protocols (where the
    202      * key is the protocol and the value is a proxy string).
     223     * key is the protocol and the value is a proxy string or null). Provide a
     224     * "no" key as a comma-delimited string, array of strings, or null to
     225     * specify hosts or host-and-port pairs that should not be proxied.
    203226     */
    204227    public const PROXY = 'proxy';
    205228
    206229    /**
    207      * query: (array|string) Associative array of query string values to add
    208      * to the request. This option uses PHP's http_build_query() to create
    209      * the string representation. Pass a string value if you need more
    210      * control than what this method provides
     230     * query: (array<array-key, mixed>|string) Associative array of query string
     231     * values to add to the request. This option uses PHP's http_build_query()
     232     * to create the string representation. Pass a string value if you need
     233     * more control than what this method provides
    211234     */
    212235    public const QUERY = 'query';
    213236
    214237    /**
    215      * sink: (resource|string|StreamInterface) Where the data of the
    216      * response is written to. Defaults to a PHP temp stream. Providing a
    217      * string will write data to a file by the given name.
     238     * sink: (resource|string|\Psr\Http\Message\StreamInterface) Where the data
     239     * of the response is written to. Defaults to a PHP temp stream. Providing
     240     * a string will write data to a file by the given name.
    218241     */
    219242    public const SINK = 'sink';
    … …  
    228251
    229252    /**
    230      * ssl_key: (array|string) Specify the path to a file containing a private
    231      * SSL key in PEM format. If a password is required, then set to an array
    232      * containing the path to the SSL key in the first array element followed
    233      * by the password required for the certificate in the second element.
     253     * ssl_key: (array{0: string, 1?: string|null}|string) Specify the path to
     254     * a private SSL key file. PEM is the default private key format. If a
     255     * password is required, set ssl_key to an array containing the key path in
     256     * the first array element followed by the key password in the second
     257     * element. A null password is treated the same as omitting it. Use
     258     * ssl_key_type to specify another supported key format.
    234259     */
    235260    public const SSL_KEY = 'ssl_key';
    236261
    237262    /**
    238      * stream: Set to true to attempt to stream a response rather than
     263     * ssl_key_type: (string) Specify the SSL private key file type.
     264     */
     265    public const SSL_KEY_TYPE = 'ssl_key_type';
     266
     267    /**
     268     * stream: (bool) Set to true to attempt to stream a response rather than
    239269     * download it all up-front.
    240270     */
    … …  
    252282
    253283    /**
    254      * timeout: (float, default=0) Float describing the timeout of the
     284     * timeout: (int|float, default=0) Number describing the timeout of the
    255285     * request in seconds. Use 0 to wait indefinitely (the default behavior).
    256286     */
    … …  
    258288
    259289    /**
    260      * read_timeout: (float, default=default_socket_timeout ini setting) Float describing
    261      * the body read timeout, for stream requests.
     290     * read_timeout: (int|float, default=default_socket_timeout ini setting)
     291     * Number describing the body read timeout, for stream requests.
    262292     */
    263293    public const READ_TIMEOUT = 'read_timeout';
    264294
    265295    /**
    266      * version: (string|float) Specifies the HTTP protocol version to attempt to use.
     296     * version: (string|int|float) Specifies the HTTP protocol version to attempt
     297     * to use.
    267298     */
    268299    public const VERSION = 'version';
    269300
    270301    /**
    271      * force_ip_resolve: (bool) Force client to use only ipv4 or ipv6 protocol
     302     * force_ip_resolve: (string) Set to "v4" to force IPv4 resolution or "v6"
     303     * for IPv6 resolution when supported by the handler.
    272304     */
    273305    public const FORCE_IP_RESOLVE = 'force_ip_resolve';
  • sg-ai-studio/trunk/vendor/guzzlehttp/guzzle/src/RetryMiddleware.php

    r3505951 r3562098  
    4545        $this->decider = $decider;
    4646        $this->nextHandler = $nextHandler;
    47         $this->delay = $delay ?: __CLASS__.'::exponentialDelay';
     47        $this->delay = $delay ?: static function (int $retries): int {
     48            return (int) 2 ** ($retries - 1) * 1000;
     49        };
    4850    }
    4951
    … …  
    5254     *
    5355     * @return int milliseconds.
     56     *
     57     * @deprecated since 7.11, will be removed in 8.0.
    5458     */
    5559    public static function exponentialDelay(int $retries): int
    5660    {
     61        \trigger_deprecation('guzzlehttp/guzzle', '7.11', '%s::%s() is deprecated and will be removed in 8.0.', __CLASS__, __FUNCTION__);
     62
    5763        return (int) 2 ** ($retries - 1) * 1000;
    5864    }
  • sg-ai-studio/trunk/vendor/guzzlehttp/guzzle/src/Utils.php

    r3561022 r3562098  
    66use GuzzleHttp\Handler\CurlHandler;
    77use GuzzleHttp\Handler\CurlMultiHandler;
     8use GuzzleHttp\Handler\CurlShareHandleState;
    89use GuzzleHttp\Handler\Proxy;
    910use GuzzleHttp\Handler\StreamHandler;
     11use Psr\Http\Message\RequestInterface;
    1012use Psr\Http\Message\UriInterface;
    1113
    … …  
    8082     * The returned handler is not wrapped by any default middlewares.
    8183     *
    82      * @return callable(\Psr\Http\Message\RequestInterface, array): Promise\PromiseInterface Returns the best handler for the given system.
     84     * @param array{transport_sharing?: mixed} $handlerOptions Handler constructor options.
     85     *
     86     * @return callable(RequestInterface, array): Promise\PromiseInterface Returns the best handler for the given system.
    8387     *
    8488     * @throws \RuntimeException if no viable Handler is available.
    8589     */
    86     public static function chooseHandler(): callable
     90    public static function chooseHandler(array $handlerOptions = []): callable
    8791    {
    8892        $handler = null;
    89 
    90         if (\defined('CURLOPT_CUSTOMREQUEST') && \function_exists('curl_version') && version_compare(curl_version()['version'], '7.21.2') >= 0) {
     93        $sharingMode = CurlShareHandleState::normalizeMode($handlerOptions['transport_sharing'] ?? null, 'transport_sharing');
     94        $sharingRequested = $sharingMode !== TransportSharing::NONE;
     95        $sharingRequired = $sharingMode === TransportSharing::HANDLER_REQUIRE;
     96        $curlHandlerOptions = [];
     97        $curlSupported = \defined('CURLOPT_CUSTOMREQUEST')
     98            && \function_exists('curl_version')
     99            && version_compare(curl_version()['version'], '7.21.2') >= 0
     100            && (\function_exists('curl_multi_exec') || \function_exists('curl_exec'));
     101
     102        if ($sharingRequired && !$curlSupported) {
     103            throw new \RuntimeException('Required transport sharing requires the PHP cURL extension, curl_exec() or curl_multi_exec(), and libcurl 7.21.2 or higher.');
     104        }
     105
     106        if ($curlSupported) {
     107            if ($sharingRequested) {
     108                $shareState = CurlShareHandleState::fromOption($sharingMode);
     109                if ($shareState !== null) {
     110                    $curlHandlerOptions['transport_sharing'] = $shareState;
     111                }
     112            }
     113
    91114            if (\function_exists('curl_multi_exec') && \function_exists('curl_exec')) {
    92                 $handler = Proxy::wrapSync(new CurlMultiHandler(), new CurlHandler());
     115                $handler = Proxy::wrapSync(new CurlMultiHandler($curlHandlerOptions), new CurlHandler($curlHandlerOptions));
    93116            } elseif (\function_exists('curl_exec')) {
    94                 $handler = new CurlHandler();
     117                $handler = new CurlHandler($curlHandlerOptions);
    95118            } elseif (\function_exists('curl_multi_exec')) {
    96                 $handler = new CurlMultiHandler();
     119                $handler = new CurlMultiHandler($curlHandlerOptions);
    97120            }
    98121        }
    99122
    100123        if (\ini_get('allow_url_fopen')) {
     124            $streamHandler = new StreamHandler();
     125            if ($sharingRequired) {
     126                $streamHandler = self::wrapStreamHandlerTransportSharing($streamHandler, $sharingMode);
     127            }
     128
    101129            $handler = $handler
    102                 ? Proxy::wrapStreaming($handler, new StreamHandler())
    103                 : new StreamHandler();
     130                ? Proxy::wrapStreaming($handler, $streamHandler)
     131                : $streamHandler;
    104132        } elseif (!$handler) {
    105133            throw new \RuntimeException('GuzzleHttp requires cURL, the allow_url_fopen ini setting, or a custom HTTP handler.');
    … …  
    107135
    108136        return $handler;
     137    }
     138
     139    private static function wrapStreamHandlerTransportSharing(callable $handler, string $sharingMode): callable
     140    {
     141        return static function (RequestInterface $request, array $options) use ($handler, $sharingMode): Promise\PromiseInterface {
     142            if (\array_key_exists('transport_sharing', $options)) {
     143                CurlShareHandleState::normalizeMode($options['transport_sharing'], 'transport_sharing');
     144            }
     145
     146            $options['transport_sharing'] = $sharingMode;
     147
     148            return $handler($request, $options);
     149        };
    109150    }
    110151
    … …  
    177218CA bundle by default. In order to verify peer certificates, you will need to
    178219supply the path on disk to a certificate bundle to the 'verify' request
    179 option: https://docs.guzzlephp.org/en/latest/request-options.html#verify. If
     220option: https://github.com/guzzle/guzzle/blob/7.11/docs/request-options.md#verify. If
    180221you do not need a specific certificate bundle, then Mozilla provides a commonly
    181222used CA bundle which can be downloaded here (provided by the maintainer of
    … …  
    196237        $result = [];
    197238        foreach (\array_keys($headers) as $key) {
    198             $result[\strtolower($key)] = $key;
     239            $result[\strtolower((string) $key)] = $key;
    199240        }
    200241
    201242        return $result;
     243    }
     244
     245    /**
     246     * @param mixed $protocols
     247     *
     248     * @return string[]
     249     *
     250     * @throws InvalidArgumentException
     251     */
     252    public static function normalizeProtocols($protocols): array
     253    {
     254        if (!\is_array($protocols) || $protocols === []) {
     255            throw new InvalidArgumentException('protocols must be a non-empty array of "http" and/or "https"');
     256        }
     257
     258        $normalized = [];
     259
     260        foreach ($protocols as $protocol) {
     261            if (!\is_string($protocol)) {
     262                throw new InvalidArgumentException('protocols must contain only strings');
     263            }
     264
     265            if ($protocol !== 'http' && $protocol !== 'https') {
     266                throw new InvalidArgumentException('protocols may only contain "http" and "https"');
     267            }
     268
     269            $normalized[$protocol] = true;
     270        }
     271
     272        return \array_keys($normalized);
    202273    }
    203274
    … …  
    235306            }
    236307
    237             if (empty($area)) {
    238                 // Don't match on empty values.
     308            if ($area === '') {
    239309                continue;
    240310            }
    … …  
    261331    }
    262332
     333    /**
     334     * Returns true if the provided URI matches any of the no proxy areas.
     335     *
     336     * @param mixed $noProxy No-proxy host patterns.
     337     *
     338     * @internal
     339     */
     340    public static function isUriInNoProxy(UriInterface $uri, $noProxy): bool
     341    {
     342        if (\is_string($noProxy)) {
     343            $noProxy = \explode(',', $noProxy);
     344        }
     345
     346        if (!\is_array($noProxy)) {
     347            return false;
     348        }
     349
     350        $host = $uri->getHost();
     351        if ($host === '') {
     352            return false;
     353        }
     354
     355        $port = $uri->getPort();
     356        if ($port === null) {
     357            $port = self::getDefaultPort($uri->getScheme());
     358        }
     359
     360        foreach ($noProxy as $area) {
     361            if (!\is_string($area)) {
     362                continue;
     363            }
     364
     365            $area = \trim($area);
     366
     367            // Always match on wildcards.
     368            if ($area === '*') {
     369                return true;
     370            }
     371
     372            if ($area === '') {
     373                continue;
     374            }
     375
     376            [$area, $areaPort] = self::splitNoProxyHostAndPort($area);
     377            if ($areaPort !== null && $areaPort !== $port) {
     378                continue;
     379            }
     380
     381            if (self::isHostInNoProxy($host, [$area])) {
     382                return true;
     383            }
     384        }
     385
     386        return false;
     387    }
     388
    263389    private static function normalizeNoProxyHost(string $host, bool $stripPort): string
    264390    {
    … …  
    291417
    292418    /**
     419     * @return array{0: string, 1: int|null}
     420     */
     421    private static function splitNoProxyHostAndPort(string $area): array
     422    {
     423        if ($area !== '' && $area[0] === '[') {
     424            $closingBracket = \strpos($area, ']');
     425
     426            if ($closingBracket !== false) {
     427                $tail = \substr($area, $closingBracket + 1);
     428                if ($tail !== '' && $tail[0] === ':') {
     429                    $port = self::parseNoProxyPort(\substr($tail, 1));
     430
     431                    if ($port !== null) {
     432                        return [\substr($area, 0, $closingBracket + 1), $port];
     433                    }
     434                }
     435            }
     436
     437            return [$area, null];
     438        }
     439
     440        if (\filter_var($area, \FILTER_VALIDATE_IP, \FILTER_FLAG_IPV6)) {
     441            return [$area, null];
     442        }
     443
     444        $colon = \strrpos($area, ':');
     445        if ($colon === false) {
     446            return [$area, null];
     447        }
     448
     449        $port = self::parseNoProxyPort(\substr($area, $colon + 1));
     450        if ($port === null) {
     451            return [$area, null];
     452        }
     453
     454        return [\substr($area, 0, $colon), $port];
     455    }
     456
     457    private static function parseNoProxyPort(string $port): ?int
     458    {
     459        if ($port === '' || !\ctype_digit($port)) {
     460            return null;
     461        }
     462
     463        $port = (int) $port;
     464
     465        return $port <= 65535 ? $port : null;
     466    }
     467
     468    private static function getDefaultPort(string $scheme): ?int
     469    {
     470        if ($scheme === 'http') {
     471            return 80;
     472        }
     473
     474        if ($scheme === 'https') {
     475            return 443;
     476        }
     477
     478        return null;
     479    }
     480
     481    /**
    293482     * Wrapper for json_decode that throws when an error occurs.
    294483     *
    … …  
    352541    {
    353542        return (float) \function_exists('hrtime') ? \hrtime(true) / 1e9 : \microtime(true);
     543    }
     544
     545    /**
     546     * @param mixed $value
     547     *
     548     * @internal
     549     */
     550    public static function normalizeIdnConversionOption($value): ?int
     551    {
     552        if ($value === null || $value === false) {
     553            return null;
     554        }
     555
     556        if ($value === true) {
     557            return \IDNA_DEFAULT;
     558        }
     559
     560        if (\is_int($value)) {
     561            return $value;
     562        }
     563
     564        if ((\is_string($value) && \is_numeric($value)) || (\is_float($value) && \is_finite($value))) {
     565            \trigger_deprecation(
     566                'guzzlehttp/guzzle',
     567                '7.11',
     568                'Passing %s as the "idn_conversion" request option is deprecated; guzzlehttp/guzzle 8.0 will reject values that are not true, false, null, or an integer IDNA_* bitmask.',
     569                self::describeType($value)
     570            );
     571
     572            return (int) $value;
     573        }
     574
     575        throw new InvalidArgumentException('idn_conversion must be true, false, null, or an integer IDNA_* bitmask');
    354576    }
    355577
  • sg-ai-studio/trunk/vendor/guzzlehttp/promises/CHANGELOG.md

    r3561022 r3562098  
    11# CHANGELOG
     2
     3
     4## 2.5.0 - 2026-06-02
     5
     6### Deprecated
     7
     8- Deprecated passing non-iterable inputs to promise collection helpers and `EachPromise`
    29
    310
  • sg-ai-studio/trunk/vendor/guzzlehttp/promises/README.md

    r3561022 r3562098  
    5454### Callbacks
    5555
    56 Callbacks are registered with the `then` method by providing an optional 
     56Callbacks are registered with the `then` method by providing an optional
    5757`$onFulfilled` followed by an optional `$onRejected` function.
    5858
    … …  
    228228```
    229229
    230 If an exception is encountered while invoking the wait function of a promise,
    231 the promise is rejected with the exception and the exception is thrown.
     230If a throwable is encountered while invoking the wait function of a promise,
     231the promise is rejected with the throwable and the throwable is thrown.
    232232
    233233```php
    … …  
    248248```
    249249
    250 Calling `wait` on a promise that has been rejected will throw an exception. If
    251 the rejection reason is an instance of `\Exception` the reason is thrown.
     250Calling `wait` on a promise that has been rejected will throw. If the rejection
     251reason is an instance of `\Throwable` the reason is thrown.
    252252Otherwise, a `GuzzleHttp\Promise\RejectionException` is thrown and the reason
    253253can be obtained by calling the `getReason` method of the exception.
    … …  
    324324A promise has the following methods:
    325325
    326 - `then(callable $onFulfilled, callable $onRejected) : PromiseInterface`
    327  
    328   Appends fulfillment and rejection handlers to the promise, and returns a new promise resolving to the return value of the called handler.
     326- `then(?callable $onFulfilled = null, ?callable $onRejected = null) : PromiseInterface`
     327
     328  Appends fulfillment and rejection handlers to the promise, and returns a new
     329  promise resolving to the return value of the called handler. If a handler is
     330  omitted, the original fulfillment value or rejection reason is forwarded.
    329331
    330332- `otherwise(callable $onRejected) : PromiseInterface`
  • sg-ai-studio/trunk/vendor/guzzlehttp/promises/src/Create.php

    r3505951 r3562098  
    7575        }
    7676
     77        if (!is_iterable($value)) {
     78            \trigger_deprecation(
     79                'guzzlehttp/promises',
     80                '2.5',
     81                'Passing a non-iterable to %s::%s() is deprecated; guzzlehttp/promises 3.0 will require an iterable.',
     82                __CLASS__,
     83                __FUNCTION__
     84            );
     85        }
     86
    7787        return new \ArrayIterator([$value]);
    7888    }
  • sg-ai-studio/trunk/vendor/guzzlehttp/promises/src/Each.php

    r3505951 r3562098  
    2727        ?callable $onRejected = null
    2828    ): PromiseInterface {
     29        $iterable = self::prepareIterable($iterable, __FUNCTION__);
     30
    2931        return (new EachPromise($iterable, [
    3032            'fulfilled' => $onFulfilled,
    … …  
    5052        ?callable $onRejected = null
    5153    ): PromiseInterface {
     54        $iterable = self::prepareIterable($iterable, __FUNCTION__);
     55
    5256        return (new EachPromise($iterable, [
    5357            'fulfilled' => $onFulfilled,
    … …  
    7074        ?callable $onFulfilled = null
    7175    ): PromiseInterface {
     76        $iterable = self::prepareIterable($iterable, __FUNCTION__);
     77
    7278        return self::ofLimit(
    7379            $iterable,
    … …  
    7985        );
    8086    }
     87
     88    private static function prepareIterable($iterable, string $method): iterable
     89    {
     90        if (is_iterable($iterable)) {
     91            return $iterable;
     92        }
     93
     94        \trigger_deprecation(
     95            'guzzlehttp/promises',
     96            '2.5',
     97            'Passing a non-iterable to %s::%s() is deprecated; guzzlehttp/promises 3.0 will require an iterable.',
     98            self::class,
     99            $method
     100        );
     101
     102        return [$iterable];
     103    }
    81104}
  • sg-ai-studio/trunk/vendor/guzzlehttp/promises/src/EachPromise.php

    r3561022 r3562098  
    5858    public function __construct($iterable, array $config = [])
    5959    {
     60        if (!is_iterable($iterable)) {
     61            \trigger_deprecation(
     62                'guzzlehttp/promises',
     63                '2.5',
     64                'Passing a non-iterable to %s::%s() is deprecated; guzzlehttp/promises 3.0 will require an iterable.',
     65                __CLASS__,
     66                __FUNCTION__
     67            );
     68
     69            $iterable = [$iterable];
     70        }
     71
    6072        $this->iterable = Create::iterFor($iterable);
    6173
  • sg-ai-studio/trunk/vendor/guzzlehttp/promises/src/Utils.php

    r3561022 r3562098  
    102102    public static function inspectAll($promises): array
    103103    {
     104        $promises = self::prepareIterable($promises, __FUNCTION__);
     105
    104106        $results = [];
    105107        foreach ($promises as $key => $promise) {
    … …  
    123125    public static function unwrap($promises): array
    124126    {
     127        $promises = self::prepareIterable($promises, __FUNCTION__);
     128
    125129        $results = [];
    126130        foreach ($promises as $key => $promise) {
    … …  
    144148    public static function all($promises, bool $recursive = false): PromiseInterface
    145149    {
     150        $promises = self::prepareIterable($promises, __FUNCTION__);
     151
    146152        $results = [];
    147153        $promise = Each::of(
    … …  
    192198    public static function some(int $count, $promises): PromiseInterface
    193199    {
     200        $promises = self::prepareIterable($promises, __FUNCTION__);
     201
    194202        $results = [];
    195203        $rejections = [];
    … …  
    232240    public static function any($promises): PromiseInterface
    233241    {
     242        $promises = self::prepareIterable($promises, __FUNCTION__);
     243
    234244        return self::some(1, $promises)->then(function ($values) {
    235245            return $values[0];
    … …  
    249259    public static function settle($promises): PromiseInterface
    250260    {
     261        $promises = self::prepareIterable($promises, __FUNCTION__);
     262
    251263        $results = [];
    252264
    … …  
    265277        });
    266278    }
     279
     280    private static function prepareIterable($promises, string $method): iterable
     281    {
     282        if (is_iterable($promises)) {
     283            return $promises;
     284        }
     285
     286        self::triggerNonIterableDeprecation($promises, $method);
     287
     288        return [$promises];
     289    }
     290
     291    private static function triggerNonIterableDeprecation($promises, string $method): void
     292    {
     293        if (is_iterable($promises)) {
     294            return;
     295        }
     296
     297        \trigger_deprecation(
     298            'guzzlehttp/promises',
     299            '2.5',
     300            'Passing a non-iterable to %s::%s() is deprecated; guzzlehttp/promises 3.0 will require an iterable.',
     301            self::class,
     302            $method
     303        );
     304    }
    267305}
  • sg-ai-studio/trunk/vendor/guzzlehttp/psr7/CHANGELOG.md

    r3561022 r3562098  
    55The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
    66and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
     7
     8## 2.11.0 - 2026-06-02
     9
     10### Changed
     11
     12- Changed `Utils::modifyRequest()` to reject conflicting URI and `Host` header changes in the same call
     13- Changed `Header::parse()` to split semicolon-separated parameters without repeated regular expression lookaheads
     14- Changed `UriComparator::isCrossOrigin()` so only HTTP and HTTPS missing ports receive implicit default ports
     15
     16### Deprecated
     17
     18- Deprecated invalid PSR-7 arguments that guzzlehttp/psr7 3.0 will require native types for
     19- Deprecated non-string header values that guzzlehttp/psr7 3.0 will reject
     20- Deprecated empty header value arrays that guzzlehttp/psr7 3.0 will reject
     21- Deprecated URI schemes that do not match guzzlehttp/psr7 3.0 syntax requirements
     22- Deprecated multipart boundary and custom part header metadata that guzzlehttp/psr7 3.0 will reject
     23- Deprecated reliance on automatic uppercasing of request methods; guzzlehttp/psr7 3.0 preserves method casing
     24- Deprecated invalid `Utils::modifyRequest()` change values that guzzlehttp/psr7 3.0 will reject
     25
     26### Fixed
     27
     28- Fixed `Utils::copyToStream()` to retry short destination writes instead of dropping the unwritten remainder
     29- Fixed `Header::parse()` splitting of semicolon-separated parameters with escaped quotes
    730
    831## 2.10.4 - 2026-05-29
  • sg-ai-studio/trunk/vendor/guzzlehttp/psr7/README.md

    r3561022 r3562098  
    120120`GuzzleHttp\Psr7\FnStream`
    121121
    122 Compose stream implementations based on a hash of functions.
     122Compose stream implementations based on a hash of callables.
    123123
    124124Allows for easy testing and extension of a provided stream without needing
    … …  
    203203multipart/form-data stream.
    204204
     205Each multipart element must contain a `name` and `contents` key. `contents` may
     206be any non-array value accepted by `GuzzleHttp\Psr7\Utils::streamFor()`,
     207including closures and invokable objects. Array contents are recursively
     208expanded into nested form fields.
     209
    205210
    206211## NoSeekStream
    … …  
    232237Provides a read only stream that pumps data from a PHP callable.
    233238
    234 When invoking the provided callable, the PumpStream will pass the amount of
    235 data requested to read to the callable. The callable can choose to ignore
     239When invoking the provided callable, the PumpStream will pass the suggested
     240number of bytes to read to the callable. The callable can choose to ignore
    236241this value and return fewer or more bytes than requested. Any extra data
    237242returned by the provided callable is buffered internally until drained using
    238243the read() function of the PumpStream. The provided callable MUST return
    239 false when there is no more data to read.
     244false or null when there is no more data to read.
     245
     246Userland callables that declare no parameters are tolerated by PHP, but
     247length-aware callables remain the recommended formal shape.
    240248
    241249
    … …  
    462470of bytes have been read.
    463471
     472The copy stops if the destination `write()` returns 0, for example a
     473`BufferStream` at its high water mark or a full `DroppingStream`. For a
     474guaranteed full copy, use a normal writable stream such as a file or
     475`php://temp` stream.
     476
    464477
    465478## `GuzzleHttp\Psr7\Utils::copyToString`
    … …  
    493506- set_headers: (array) Sets the given headers.
    494507- remove_headers: (array) Remove the given headers.
    495 - body: (mixed) Sets the given body.
     508- body: (mixed) Sets the given body. Present non-null values are converted with
     509  `GuzzleHttp\Psr7\Utils::streamFor()`, including scalar values, resources,
     510  streams, iterators, callable arrays, closures, invokable objects, and
     511  objects with `__toString()`. String inputs remain literal bodies.
    496512- uri: (UriInterface) Set the URI.
    497513- query: (string) Set the query string value of the URI.
    … …  
    539555  uses the string value.
    540556- `NULL`: When `null` is passed, an empty stream object is returned.
    541 - `callable` When a callable is passed, a read-only stream object will be
     557- `callable`: When a callable array, closure, or invokable object is passed and
     558  no earlier resource or object rule applies, a read-only stream object will be
    542559  created that invokes the given callable. The callable is invoked with the
    543   number of suggested bytes to read. The callable can return any number of
    544   bytes, but MUST return `false` when there is no more data to return. The
    545   stream object that wraps the callable will invoke the callable until the
    546   number of requested bytes are available. Any additional bytes will be
    547   buffered and used in subsequent reads.
     560  suggested number of bytes to read. The callable can return fewer or more bytes
     561  than requested, but MUST return `false` or `null` when there is no more data
     562  to return. Any additional bytes will be buffered and used in subsequent reads.
     563  String inputs are always treated as string bodies, even when they name
     564  callable functions.
    548565
    549566```php
    … …  
    718735Determines if a modified URL should be considered cross-origin with respect to an original URL.
    719736
     737Two URLs are cross-origin when their scheme, host, or effective port differ. Host comparison is case-insensitive, and missing ports use the default port for `http` or `https`. Other schemes do not receive implicit default ports.
     738
     739This helper only compares URI origins. It does not implement redirect handling or credential policy.
     740
    720741## Reference Resolution
    721742
  • sg-ai-studio/trunk/vendor/guzzlehttp/psr7/src/AppendStream.php

    r3561022 r3562098  
    156156    public function seek($offset, $whence = SEEK_SET): void
    157157    {
     158        if (!\is_int($offset)) {
     159            \trigger_deprecation(
     160                'guzzlehttp/psr7',
     161                '2.11',
     162                'Passing %s to StreamInterface::seek() is deprecated; guzzlehttp/psr7 3.0 requires int for $offset.',
     163                \get_debug_type($offset)
     164            );
     165        }
     166
     167        if (!\is_int($whence)) {
     168            \trigger_deprecation(
     169                'guzzlehttp/psr7',
     170                '2.11',
     171                'Passing %s to StreamInterface::seek() is deprecated; guzzlehttp/psr7 3.0 requires int for $whence.',
     172                \get_debug_type($whence)
     173            );
     174        }
     175
    158176        if (!$this->seekable) {
    159177            throw new \RuntimeException('This AppendStream is not seekable');
    … …  
    188206    public function read($length): string
    189207    {
     208        if (!\is_int($length)) {
     209            \trigger_deprecation(
     210                'guzzlehttp/psr7',
     211                '2.11',
     212                'Passing %s to StreamInterface::read() is deprecated; guzzlehttp/psr7 3.0 requires int for $length.',
     213                \get_debug_type($length)
     214            );
     215        }
     216
    190217        if ($this->streams === []) {
    191218            return '';
    … …  
    240267    public function write($string): int
    241268    {
     269        if (!\is_string($string)) {
     270            \trigger_deprecation(
     271                'guzzlehttp/psr7',
     272                '2.11',
     273                'Passing %s to StreamInterface::write() is deprecated; guzzlehttp/psr7 3.0 requires string for $string.',
     274                \get_debug_type($string)
     275            );
     276        }
     277
    242278        throw new \RuntimeException('Cannot write to an AppendStream');
    243279    }
    … …  
    248284    public function getMetadata($key = null)
    249285    {
     286        if ($key !== null && !\is_string($key)) {
     287            \trigger_deprecation(
     288                'guzzlehttp/psr7',
     289                '2.11',
     290                'Passing %s to StreamInterface::getMetadata() is deprecated; guzzlehttp/psr7 3.0 requires string|null for $key.',
     291                \get_debug_type($key)
     292            );
     293        }
     294
    250295        return $key ? null : [];
    251296    }
  • sg-ai-studio/trunk/vendor/guzzlehttp/psr7/src/BufferStream.php

    r3505951 r3562098  
    8787    public function seek($offset, $whence = SEEK_SET): void
    8888    {
     89        if (!\is_int($offset)) {
     90            \trigger_deprecation(
     91                'guzzlehttp/psr7',
     92                '2.11',
     93                'Passing %s to StreamInterface::seek() is deprecated; guzzlehttp/psr7 3.0 requires int for $offset.',
     94                \get_debug_type($offset)
     95            );
     96        }
     97
     98        if (!\is_int($whence)) {
     99            \trigger_deprecation(
     100                'guzzlehttp/psr7',
     101                '2.11',
     102                'Passing %s to StreamInterface::seek() is deprecated; guzzlehttp/psr7 3.0 requires int for $whence.',
     103                \get_debug_type($whence)
     104            );
     105        }
     106
    89107        throw new \RuntimeException('Cannot seek a BufferStream');
    90108    }
    … …  
    105123    public function read($length): string
    106124    {
     125        if (!\is_int($length)) {
     126            \trigger_deprecation(
     127                'guzzlehttp/psr7',
     128                '2.11',
     129                'Passing %s to StreamInterface::read() is deprecated; guzzlehttp/psr7 3.0 requires int for $length.',
     130                \get_debug_type($length)
     131            );
     132        }
     133
    107134        $currentLength = strlen($this->buffer);
    108135
    … …  
    125152    public function write($string): int
    126153    {
     154        if (!\is_string($string)) {
     155            \trigger_deprecation(
     156                'guzzlehttp/psr7',
     157                '2.11',
     158                'Passing %s to StreamInterface::write() is deprecated; guzzlehttp/psr7 3.0 requires string for $string.',
     159                \get_debug_type($string)
     160            );
     161        }
     162
    127163        $this->buffer .= $string;
    128164
    … …  
    139175    public function getMetadata($key = null)
    140176    {
     177        if ($key !== null && !\is_string($key)) {
     178            \trigger_deprecation(
     179                'guzzlehttp/psr7',
     180                '2.11',
     181                'Passing %s to StreamInterface::getMetadata() is deprecated; guzzlehttp/psr7 3.0 requires string|null for $key.',
     182                \get_debug_type($key)
     183            );
     184        }
     185
    141186        if ($key === 'hwm') {
    142187            return $this->hwm;
  • sg-ai-studio/trunk/vendor/guzzlehttp/psr7/src/CachingStream.php

    r3561022 r3562098  
    6565    public function seek($offset, $whence = SEEK_SET): void
    6666    {
     67        if (!\is_int($offset)) {
     68            \trigger_deprecation(
     69                'guzzlehttp/psr7',
     70                '2.11',
     71                'Passing %s to StreamInterface::seek() is deprecated; guzzlehttp/psr7 3.0 requires int for $offset.',
     72                \get_debug_type($offset)
     73            );
     74        }
     75
     76        if (!\is_int($whence)) {
     77            \trigger_deprecation(
     78                'guzzlehttp/psr7',
     79                '2.11',
     80                'Passing %s to StreamInterface::seek() is deprecated; guzzlehttp/psr7 3.0 requires int for $whence.',
     81                \get_debug_type($whence)
     82            );
     83        }
     84
    6785        if ($whence === SEEK_SET) {
    6886            $byte = $offset;
    … …  
    104122    public function read($length): string
    105123    {
     124        if (!\is_int($length)) {
     125            \trigger_deprecation(
     126                'guzzlehttp/psr7',
     127                '2.11',
     128                'Passing %s to StreamInterface::read() is deprecated; guzzlehttp/psr7 3.0 requires int for $length.',
     129                \get_debug_type($length)
     130            );
     131        }
     132
    106133        // Perform a regular read on any previously read data from the buffer
    107134        $data = $this->stream->read($length);
    … …  
    137164    public function write($string): int
    138165    {
     166        if (!\is_string($string)) {
     167            \trigger_deprecation(
     168                'guzzlehttp/psr7',
     169                '2.11',
     170                'Passing %s to StreamInterface::write() is deprecated; guzzlehttp/psr7 3.0 requires string for $string.',
     171                \get_debug_type($string)
     172            );
     173        }
     174
    139175        // When appending to the end of the currently read stream, you'll want
    140176        // to skip bytes from being read from the remote stream to emulate
  • sg-ai-studio/trunk/vendor/guzzlehttp/psr7/src/DroppingStream.php

    r3505951 r3562098  
    3333    public function write($string): int
    3434    {
     35        if (!\is_string($string)) {
     36            \trigger_deprecation(
     37                'guzzlehttp/psr7',
     38                '2.11',
     39                'Passing %s to StreamInterface::write() is deprecated; guzzlehttp/psr7 3.0 requires string for $string.',
     40                \get_debug_type($string)
     41            );
     42        }
     43
    3544        $diff = $this->maxLength - $this->stream->getSize();
    3645
  • sg-ai-studio/trunk/vendor/guzzlehttp/psr7/src/FnStream.php

    r3505951 r3562098  
    88
    99/**
    10  * Compose stream implementations based on a hash of functions.
     10 * Compose stream implementations based on a hash of callables.
    1111 *
    1212 * Allows for easy testing and extension of a provided stream without needing
    … …  
    3232        $this->methods = $methods;
    3333
    34         // Create the functions on the class
     34        // Create the callables on the class
    3535        foreach ($methods as $name => $fn) {
    3636            $this->{'_fn_'.$name} = $fn;
    … …  
    7474     *
    7575     * @param StreamInterface         $stream  Stream to decorate
    76      * @param array<string, callable> $methods Hash of method name to a closure
     76     * @param array<string, callable> $methods Hash of method name to a callable
    7777     *
    7878     * @return FnStream
    … …  
    143143    public function seek($offset, $whence = SEEK_SET): void
    144144    {
     145        if (!\is_int($offset)) {
     146            \trigger_deprecation(
     147                'guzzlehttp/psr7',
     148                '2.11',
     149                'Passing %s to StreamInterface::seek() is deprecated; guzzlehttp/psr7 3.0 requires int for $offset.',
     150                \get_debug_type($offset)
     151            );
     152        }
     153
     154        if (!\is_int($whence)) {
     155            \trigger_deprecation(
     156                'guzzlehttp/psr7',
     157                '2.11',
     158                'Passing %s to StreamInterface::seek() is deprecated; guzzlehttp/psr7 3.0 requires int for $whence.',
     159                \get_debug_type($whence)
     160            );
     161        }
     162
    145163        ($this->_fn_seek)($offset, $whence);
    146164    }
    … …  
    153171    public function write($string): int
    154172    {
     173        if (!\is_string($string)) {
     174            \trigger_deprecation(
     175                'guzzlehttp/psr7',
     176                '2.11',
     177                'Passing %s to StreamInterface::write() is deprecated; guzzlehttp/psr7 3.0 requires string for $string.',
     178                \get_debug_type($string)
     179            );
     180        }
     181
    155182        return ($this->_fn_write)($string);
    156183    }
    … …  
    163190    public function read($length): string
    164191    {
     192        if (!\is_int($length)) {
     193            \trigger_deprecation(
     194                'guzzlehttp/psr7',
     195                '2.11',
     196                'Passing %s to StreamInterface::read() is deprecated; guzzlehttp/psr7 3.0 requires int for $length.',
     197                \get_debug_type($length)
     198            );
     199        }
     200
    165201        return ($this->_fn_read)($length);
    166202    }
    … …  
    176212    public function getMetadata($key = null)
    177213    {
     214        if ($key !== null && !\is_string($key)) {
     215            \trigger_deprecation(
     216                'guzzlehttp/psr7',
     217                '2.11',
     218                'Passing %s to StreamInterface::getMetadata() is deprecated; guzzlehttp/psr7 3.0 requires string|null for $key.',
     219                \get_debug_type($key)
     220            );
     221        }
     222
    178223        return ($this->_fn_getMetadata)($key);
    179224    }
  • sg-ai-studio/trunk/vendor/guzzlehttp/psr7/src/Header.php

    r3505951 r3562098  
    2323            foreach (self::splitList($value) as $val) {
    2424                $part = [];
    25                 foreach (preg_split('/;(?=([^"]*"[^"]*")*[^"]*$)/', $val) ?: [] as $kvp) {
     25                foreach (self::splitParameters($val) as $kvp) {
    2626                    if (preg_match_all('/<[^>]+>|[^=]+/', $kvp, $matches)) {
    2727                        $m = $matches[0];
    … …  
    4040
    4141        return $params;
     42    }
     43
     44    /**
     45     * Split a header value into semicolon-separated parameters.
     46     *
     47     * @return string[]
     48     */
     49    private static function splitParameters(string $value): array
     50    {
     51        $values = [];
     52        $start = 0;
     53        $isQuoted = false;
     54        $isEscaped = false;
     55
     56        for ($i = 0, $max = \strlen($value); $i < $max; ++$i) {
     57            $char = $value[$i];
     58
     59            if ($isEscaped) {
     60                $isEscaped = false;
     61
     62                continue;
     63            }
     64
     65            if ($isQuoted && $char === '\\') {
     66                $isEscaped = true;
     67
     68                continue;
     69            }
     70
     71            if ($char === '"') {
     72                $isQuoted = !$isQuoted;
     73
     74                continue;
     75            }
     76
     77            if (!$isQuoted && $char === ';') {
     78                $values[] = \substr($value, $start, $i - $start);
     79                $start = $i + 1;
     80            }
     81        }
     82
     83        $values[] = \substr($value, $start);
     84
     85        return $values;
    4286    }
    4387
  • sg-ai-studio/trunk/vendor/guzzlehttp/psr7/src/LimitStream.php

    r3561022 r3562098  
    7878    public function seek($offset, $whence = SEEK_SET): void
    7979    {
     80        if (!\is_int($offset)) {
     81            \trigger_deprecation(
     82                'guzzlehttp/psr7',
     83                '2.11',
     84                'Passing %s to StreamInterface::seek() is deprecated; guzzlehttp/psr7 3.0 requires int for $offset.',
     85                \get_debug_type($offset)
     86            );
     87        }
     88
     89        if (!\is_int($whence)) {
     90            \trigger_deprecation(
     91                'guzzlehttp/psr7',
     92                '2.11',
     93                'Passing %s to StreamInterface::seek() is deprecated; guzzlehttp/psr7 3.0 requires int for $whence.',
     94                \get_debug_type($whence)
     95            );
     96        }
     97
    8098        if ($whence !== SEEK_SET || $offset < 0) {
    8199            throw new \RuntimeException(sprintf(
    … …  
    144162    public function read($length): string
    145163    {
     164        if (!\is_int($length)) {
     165            \trigger_deprecation(
     166                'guzzlehttp/psr7',
     167                '2.11',
     168                'Passing %s to StreamInterface::read() is deprecated; guzzlehttp/psr7 3.0 requires int for $length.',
     169                \get_debug_type($length)
     170            );
     171        }
     172
    146173        if ($this->limit === -1) {
    147174            return $this->stream->read($length);
  • sg-ai-studio/trunk/vendor/guzzlehttp/psr7/src/MessageTrait.php

    r3538917 r3562098  
    3535    public function withProtocolVersion($version): MessageInterface
    3636    {
     37        if (!\is_string($version)) {
     38            \trigger_deprecation(
     39                'guzzlehttp/psr7',
     40                '2.11',
     41                'Passing %s to MessageInterface::withProtocolVersion() is deprecated; guzzlehttp/psr7 3.0 requires string.',
     42                \get_debug_type($version)
     43            );
     44        }
     45
    3746        if ($this->protocol === $version) {
    3847            return $this;
    … …  
    7988    {
    8089        $this->assertHeader($header);
     90        $values = \is_array($value) ? $value : [$value];
     91        foreach ($values as $item) {
     92            if (!\is_string($item) && (\is_scalar($item) || $item === null)) {
     93                \trigger_deprecation(
     94                    'guzzlehttp/psr7',
     95                    '2.11',
     96                    'Passing %s to MessageInterface::withHeader() is deprecated; guzzlehttp/psr7 3.0 requires string|string[].',
     97                    \get_debug_type($item)
     98                );
     99
     100                break;
     101            }
     102        }
    81103        $value = $this->normalizeHeaderValue($value);
    82104        $normalized = strtolower($header);
    … …  
    98120    {
    99121        $this->assertHeader($header);
     122        $values = \is_array($value) ? $value : [$value];
     123        foreach ($values as $item) {
     124            if (!\is_string($item) && (\is_scalar($item) || $item === null)) {
     125                \trigger_deprecation(
     126                    'guzzlehttp/psr7',
     127                    '2.11',
     128                    'Passing %s to MessageInterface::withAddedHeader() is deprecated; guzzlehttp/psr7 3.0 requires string|string[].',
     129                    \get_debug_type($item)
     130                );
     131
     132                break;
     133            }
     134        }
    100135        $value = $this->normalizeHeaderValue($value);
    101136        $normalized = strtolower($header);
    … …  
    167202
    168203            $this->assertHeader($header);
     204            $values = \is_array($value) ? $value : [$value];
     205            foreach ($values as $item) {
     206                if (!\is_string($item) && (\is_scalar($item) || $item === null)) {
     207                    \trigger_deprecation(
     208                        'guzzlehttp/psr7',
     209                        '2.11',
     210                        'Passing %s to %s::__construct() is deprecated; guzzlehttp/psr7 3.0 requires string|string[].',
     211                        \get_debug_type($item),
     212                        static::class
     213                    );
     214
     215                    break;
     216                }
     217            }
    169218            $value = $this->normalizeHeaderValue($value);
    170219            $normalized = strtolower($header);
    … …  
    186235    private function normalizeHeaderValue($value): array
    187236    {
     237        if (is_array($value) && $value === []) {
     238            \trigger_deprecation(
     239                'guzzlehttp/psr7',
     240                '2.11',
     241                'Passing an empty array as a header value is deprecated; guzzlehttp/psr7 3.0 rejects empty header value arrays.'
     242            );
     243        }
     244
    188245        if (!is_array($value)) {
    189246            return $this->trimAndValidateHeaderValues([$value]);
  • sg-ai-studio/trunk/vendor/guzzlehttp/psr7/src/MultipartStream.php

    r3538917 r3562098  
    2121    private $stream;
    2222
    23     /**
    24      * @param array  $elements Array of associative arrays, each containing a
    25      *                         required "name" key mapping to the form field,
    26      *                         name, a required "contents" key mapping to any
    27      *                         value accepted by Utils::streamFor() (scalar,
    28      *                         null, resource, StreamInterface, Iterator, or
    29      *                         callable), or an array for nested expansion.
    30      *                         Optional keys include "headers" (associative
    31      *                         array of custom headers) and "filename" (string
    32      *                         to send as the filename in the part).
    33      *                         When "contents" is an array, it is recursively
    34      *                         expanded into multiple fields using bracket notation
    35      *                         (e.g., name[0][key]). Empty arrays produce no fields.
    36      *                         The "filename" and "headers" options cannot be used
    37      *                         with array contents.
    38      * @param string $boundary You can optionally provide a specific boundary
     23    private const BOUNDARY_CHARS = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'()+_,-./:=? ";
     24
     25    /**
     26     * @param array       $elements Array of associative arrays, each containing a
     27     *                              required "name" key mapping to the form field,
     28     *                              name, a required "contents" key mapping to any
     29     *                              non-array value accepted by Utils::streamFor(),
     30     *                              or an array for nested expansion.
     31     *                              Optional keys include "headers" (associative
     32     *                              array of custom headers) and "filename" (string
     33     *                              to send as the filename in the part).
     34     *                              When "contents" is an array, it is recursively
     35     *                              expanded into multiple fields using bracket notation
     36     *                              (e.g., name[0][key]). Empty arrays produce no fields.
     37     *                              The "filename" and "headers" options cannot be used
     38     *                              with array contents.
     39     * @param string|null $boundary You can optionally provide a specific boundary
    3940     *
    4041     * @throws \InvalidArgumentException
    … …  
    4243    public function __construct(array $elements = [], ?string $boundary = null)
    4344    {
     45        if ($boundary !== null && !self::isValidBoundary($boundary)) {
     46            \trigger_deprecation(
     47                'guzzlehttp/psr7',
     48                '2.11',
     49                'Passing an invalid multipart boundary to MultipartStream::__construct() is deprecated; guzzlehttp/psr7 3.0 rejects invalid multipart boundaries.'
     50            );
     51        }
     52
    4453        $this->boundary = $boundary ?: bin2hex(random_bytes(20));
    4554        $this->stream = $this->createStream($elements);
    … …  
    5968     * Get the headers needed before transferring the content of a POST file
    6069     *
    61      * @param string[] $headers
     70     * @param array<array-key, string> $headers
    6271     */
    6372    private function getHeaders(array $headers): string
    … …  
    6574        $str = '';
    6675        foreach ($headers as $key => $value) {
     76            $key = (string) $key;
    6777            $str .= "{$key}: {$value}\r\n";
    6878        }
    … …  
    155165
    156166    /**
    157      * @param string[] $headers
    158      *
    159      * @return array{0: StreamInterface, 1: string[]}
     167     * @param array<array-key, mixed> $headers
     168     *
     169     * @return array{0: StreamInterface, 1: array<array-key, string>}
    160170     */
    161171    private function createElement(string $name, StreamInterface $stream, ?string $filename, array $headers): array
    162172    {
     173        $headers = self::normalizePartHeaders($headers);
     174
    163175        // Set a default content-disposition header if one was no provided
    164176        $disposition = self::getHeader($headers, 'content-disposition');
    … …  
    191203
    192204    /**
    193      * @param string[] $headers
     205     * @param array<array-key, string> $headers
    194206     */
    195207    private static function getHeader(array $headers, string $key): ?string
    … …  
    204216        return null;
    205217    }
     218
     219    private static function isValidBoundary(string $boundary): bool
     220    {
     221        $length = strlen($boundary);
     222
     223        if ($length < 1 || $length > 70 || $boundary[$length - 1] === ' ') {
     224            return false;
     225        }
     226
     227        return strspn($boundary, self::BOUNDARY_CHARS) === $length;
     228    }
     229
     230    /**
     231     * @param array<array-key, mixed> $headers
     232     *
     233     * @return array<array-key, string>
     234     */
     235    private static function normalizePartHeaders(array $headers): array
     236    {
     237        $normalized = [];
     238
     239        foreach ($headers as $key => $value) {
     240            self::deprecateInvalidPartHeaderName((string) $key);
     241
     242            if (!is_string($value)) {
     243                if (!is_scalar($value) && $value !== null && !(is_object($value) && method_exists($value, '__toString'))) {
     244                    throw new \InvalidArgumentException(sprintf(
     245                        'Multipart part header value must be a string or stringable value but %s provided.',
     246                        \get_debug_type($value)
     247                    ));
     248                }
     249
     250                \trigger_deprecation(
     251                    'guzzlehttp/psr7',
     252                    '2.11',
     253                    'Passing %s as a multipart part header value is deprecated; guzzlehttp/psr7 3.0 requires string multipart part header values.',
     254                    \get_debug_type($value)
     255                );
     256            }
     257
     258            $value = (string) $value;
     259
     260            self::deprecateInvalidPartHeaderValue($value);
     261
     262            $normalized[$key] = $value;
     263        }
     264
     265        return $normalized;
     266    }
     267
     268    private static function deprecateInvalidPartHeaderName(string $name): void
     269    {
     270        if (!preg_match('/^[a-zA-Z0-9\'`#$%&*+.^_|~!-]+$/D', $name)) {
     271            \trigger_deprecation(
     272                'guzzlehttp/psr7',
     273                '2.11',
     274                'Passing an invalid multipart part header name to MultipartStream is deprecated; guzzlehttp/psr7 3.0 rejects invalid multipart part header names.'
     275            );
     276        }
     277    }
     278
     279    private static function deprecateInvalidPartHeaderValue(string $value): void
     280    {
     281        if (!preg_match('/^[\x20\x09\x21-\x7E\x80-\xFF]*$/D', $value)) {
     282            \trigger_deprecation(
     283                'guzzlehttp/psr7',
     284                '2.11',
     285                'Passing an invalid multipart part header value to MultipartStream is deprecated; guzzlehttp/psr7 3.0 rejects invalid multipart part header values.'
     286            );
     287        }
     288    }
    206289}
  • sg-ai-studio/trunk/vendor/guzzlehttp/psr7/src/NoSeekStream.php

    r3505951 r3562098  
    1919    public function seek($offset, $whence = SEEK_SET): void
    2020    {
     21        if (!\is_int($offset)) {
     22            \trigger_deprecation(
     23                'guzzlehttp/psr7',
     24                '2.11',
     25                'Passing %s to StreamInterface::seek() is deprecated; guzzlehttp/psr7 3.0 requires int for $offset.',
     26                \get_debug_type($offset)
     27            );
     28        }
     29
     30        if (!\is_int($whence)) {
     31            \trigger_deprecation(
     32                'guzzlehttp/psr7',
     33                '2.11',
     34                'Passing %s to StreamInterface::seek() is deprecated; guzzlehttp/psr7 3.0 requires int for $whence.',
     35                \get_debug_type($whence)
     36            );
     37        }
     38
    2139        throw new \RuntimeException('Cannot seek a NoSeekStream');
    2240    }
  • sg-ai-studio/trunk/vendor/guzzlehttp/psr7/src/PumpStream.php

    r3505951 r3562098  
    1010 * Provides a read only stream that pumps data from a PHP callable.
    1111 *
    12  * When invoking the provided callable, the PumpStream will pass the amount of
    13  * data requested to read to the callable. The callable can choose to ignore
     12 * When invoking the provided callable, the PumpStream will pass the suggested
     13 * number of bytes to read to the callable. The callable can choose to ignore
    1414 * this value and return fewer or more bytes than requested. Any extra data
    15  * returned by the provided callable is buffered internally until drained using
    16  * the read() function of the PumpStream. The provided callable MUST return
    17  * false when there is no more data to read.
     15 * returned by the callable is buffered internally until drained using the
     16 * read() function of the PumpStream. The callable MUST return false or null
     17 * when there is no more data to read.
     18 *
     19 * Userland callables that declare no parameters are tolerated by PHP, but
     20 * length-aware callables remain the recommended formal shape.
    1821 */
    1922final class PumpStream implements StreamInterface
    2023{
    21     /** @var callable(int): (string|false|null)|null */
     24    /** @var callable|null */
    2225    private $source;
    2326
    … …  
    3538
    3639    /**
    37      * @param callable(int): (string|false|null)  $source  Source of the stream data. The callable MAY
    38      *                                                     accept an integer argument used to control the
    39      *                                                     amount of data to return. The callable MUST
    40      *                                                     return a string when called, or false|null on error
    41      *                                                     or EOF.
    42      * @param array{size?: int, metadata?: array} $options Stream options:
    43      *                                                     - metadata: Hash of metadata to use with stream.
    44      *                                                     - size: Size of the stream, if known.
     40     * @param (callable(): (string|false|null))|(callable(int): (string|false|null)) $source  Source of the stream data. The callable receives
     41     *                                                                                        the suggested number of bytes to read, may ignore
     42     *                                                                                        that value, and may return fewer or more bytes.
     43     *                                                                                        Extra bytes are buffered. The callable MUST return
     44     *                                                                                        a string when called, or false|null on error or EOF.
     45     *                                                                                        Userland callables that declare no parameters are
     46     *                                                                                        tolerated by PHP, but length-aware callables remain
     47     *                                                                                        the recommended formal shape.
     48     * @param array{size?: int, metadata?: array}                                    $options Stream options:
     49     *                                                                                        - metadata: Hash of metadata to use with stream.
     50     *                                                                                        - size: Size of the stream, if known.
    4551     */
    4652    public function __construct(callable $source, array $options = [])
    … …  
    106112    public function seek($offset, $whence = SEEK_SET): void
    107113    {
     114        if (!\is_int($offset)) {
     115            \trigger_deprecation(
     116                'guzzlehttp/psr7',
     117                '2.11',
     118                'Passing %s to StreamInterface::seek() is deprecated; guzzlehttp/psr7 3.0 requires int for $offset.',
     119                \get_debug_type($offset)
     120            );
     121        }
     122
     123        if (!\is_int($whence)) {
     124            \trigger_deprecation(
     125                'guzzlehttp/psr7',
     126                '2.11',
     127                'Passing %s to StreamInterface::seek() is deprecated; guzzlehttp/psr7 3.0 requires int for $whence.',
     128                \get_debug_type($whence)
     129            );
     130        }
     131
    108132        throw new \RuntimeException('Cannot seek a PumpStream');
    109133    }
    … …  
    116140    public function write($string): int
    117141    {
     142        if (!\is_string($string)) {
     143            \trigger_deprecation(
     144                'guzzlehttp/psr7',
     145                '2.11',
     146                'Passing %s to StreamInterface::write() is deprecated; guzzlehttp/psr7 3.0 requires string for $string.',
     147                \get_debug_type($string)
     148            );
     149        }
     150
    118151        throw new \RuntimeException('Cannot write to a PumpStream');
    119152    }
    … …  
    126159    public function read($length): string
    127160    {
     161        if (!\is_int($length)) {
     162            \trigger_deprecation(
     163                'guzzlehttp/psr7',
     164                '2.11',
     165                'Passing %s to StreamInterface::read() is deprecated; guzzlehttp/psr7 3.0 requires int for $length.',
     166                \get_debug_type($length)
     167            );
     168        }
     169
    128170        $data = $this->buffer->read($length);
    129171        $readLen = strlen($data);
    … …  
    155197    public function getMetadata($key = null)
    156198    {
     199        if ($key !== null && !\is_string($key)) {
     200            \trigger_deprecation(
     201                'guzzlehttp/psr7',
     202                '2.11',
     203                'Passing %s to StreamInterface::getMetadata() is deprecated; guzzlehttp/psr7 3.0 requires string|null for $key.',
     204                \get_debug_type($key)
     205            );
     206        }
     207
    157208        if (!$key) {
    158209            return $this->metadata;
  • sg-ai-studio/trunk/vendor/guzzlehttp/psr7/src/Request.php

    r3561022 r3562098  
    4545        }
    4646
     47        self::warnOnMethodCasingChange($method);
    4748        $this->method = strtoupper($method);
    4849        $this->uri = $uri;
    … …  
    9899    {
    99100        $this->assertMethod($method);
     101        self::warnOnMethodCasingChange($method);
    100102        $new = clone $this;
    101103        $new->method = strtoupper($method);
    … …  
    111113    public function withUri(UriInterface $uri, $preserveHost = false): RequestInterface
    112114    {
     115        if (!\is_bool($preserveHost)) {
     116            \trigger_deprecation(
     117                'guzzlehttp/psr7',
     118                '2.11',
     119                'Passing %s to RequestInterface::withUri() is deprecated; guzzlehttp/psr7 3.0 requires bool for $preserveHost.',
     120                \get_debug_type($preserveHost)
     121            );
     122        }
     123
    113124        if ($uri === $this->uri) {
    114125            return $this;
    … …  
    161172        }
    162173    }
     174
     175    private static function warnOnMethodCasingChange(string $method): void
     176    {
     177        if ($method !== strtoupper($method)) {
     178            \trigger_deprecation(
     179                'guzzlehttp/psr7',
     180                '2.11',
     181                'Passing a non-uppercase HTTP method is deprecated; guzzlehttp/psr7 3.0 preserves method casing and will no longer uppercase it. Normalize the method before constructing or modifying requests if uppercase is required.'
     182            );
     183        }
     184    }
    163185}
  • sg-ai-studio/trunk/vendor/guzzlehttp/psr7/src/Response.php

    r3505951 r3562098  
    129129    public function withStatus($code, $reasonPhrase = ''): ResponseInterface
    130130    {
     131        if (!\is_int($code) && \filter_var($code, \FILTER_VALIDATE_INT) !== false) {
     132            \trigger_deprecation(
     133                'guzzlehttp/psr7',
     134                '2.11',
     135                'Passing %s to ResponseInterface::withStatus() is deprecated; guzzlehttp/psr7 3.0 requires int for $code.',
     136                \get_debug_type($code)
     137            );
     138        }
     139
     140        if (!\is_string($reasonPhrase)) {
     141            \trigger_deprecation(
     142                'guzzlehttp/psr7',
     143                '2.11',
     144                'Passing %s to ResponseInterface::withStatus() is deprecated; guzzlehttp/psr7 3.0 requires string for $reasonPhrase.',
     145                \get_debug_type($reasonPhrase)
     146            );
     147        }
     148
    131149        $this->assertStatusCodeIsInteger($code);
    132150        $code = (int) $code;
  • sg-ai-studio/trunk/vendor/guzzlehttp/psr7/src/ServerRequest.php

    r3561022 r3562098  
    166166    public static function fromGlobals(): ServerRequestInterface
    167167    {
    168         $method = self::getServerParam('REQUEST_METHOD') ?? 'GET';
     168        $method = strtoupper(self::getServerParam('REQUEST_METHOD') ?? 'GET');
    169169        $headers = self::removeInvalidHostHeader(self::getAllHeaders());
    170170        $uri = self::getUriFromGlobals();
    … …  
    305305    public function withUploadedFiles(array $uploadedFiles): ServerRequestInterface
    306306    {
     307        $invalidUploadedFileFound = false;
     308        $invalidUploadedFile = null;
     309        $stack = [$uploadedFiles];
     310
     311        while ($stack !== []) {
     312            foreach (\array_pop($stack) as $uploadedFile) {
     313                if ($uploadedFile instanceof UploadedFileInterface) {
     314                    continue;
     315                }
     316
     317                if (\is_array($uploadedFile)) {
     318                    $stack[] = $uploadedFile;
     319                    continue;
     320                }
     321
     322                $invalidUploadedFileFound = true;
     323                $invalidUploadedFile = $uploadedFile;
     324
     325                break 2;
     326            }
     327        }
     328
     329        if ($invalidUploadedFileFound) {
     330            \trigger_deprecation(
     331                'guzzlehttp/psr7',
     332                '2.11',
     333                'Passing %s inside ServerRequestInterface::withUploadedFiles() is deprecated; guzzlehttp/psr7 3.0 requires an UploadedFileInterface[] tree.',
     334                \get_debug_type($invalidUploadedFile)
     335            );
     336        }
     337
    307338        $new = clone $this;
    308339        $new->uploadedFiles = $uploadedFiles;
    … …  
    347378    public function withParsedBody($data): ServerRequestInterface
    348379    {
     380        if ($data !== null && !\is_array($data) && !\is_object($data)) {
     381            \trigger_deprecation(
     382                'guzzlehttp/psr7',
     383                '2.11',
     384                'Passing %s to ServerRequestInterface::withParsedBody() is deprecated; guzzlehttp/psr7 3.0 requires array|object|null.',
     385                \get_debug_type($data)
     386            );
     387        }
     388
    349389        $new = clone $this;
    350390        $new->parsedBody = $data;
    … …  
    363403    public function getAttribute($attribute, $default = null)
    364404    {
     405        if (!\is_string($attribute)) {
     406            \trigger_deprecation(
     407                'guzzlehttp/psr7',
     408                '2.11',
     409                'Passing %s to ServerRequestInterface::getAttribute() is deprecated; guzzlehttp/psr7 3.0 requires string for $attribute.',
     410                \get_debug_type($attribute)
     411            );
     412        }
     413
    365414        if (false === array_key_exists($attribute, $this->attributes)) {
    366415            return $default;
    … …  
    372421    public function withAttribute($attribute, $value): ServerRequestInterface
    373422    {
     423        if (!\is_string($attribute)) {
     424            \trigger_deprecation(
     425                'guzzlehttp/psr7',
     426                '2.11',
     427                'Passing %s to ServerRequestInterface::withAttribute() is deprecated; guzzlehttp/psr7 3.0 requires string for $attribute.',
     428                \get_debug_type($attribute)
     429            );
     430        }
     431
    374432        $new = clone $this;
    375433        $new->attributes[$attribute] = $value;
    … …  
    380438    public function withoutAttribute($attribute): ServerRequestInterface
    381439    {
     440        if (!\is_string($attribute)) {
     441            \trigger_deprecation(
     442                'guzzlehttp/psr7',
     443                '2.11',
     444                'Passing %s to ServerRequestInterface::withoutAttribute() is deprecated; guzzlehttp/psr7 3.0 requires string for $attribute.',
     445                \get_debug_type($attribute)
     446            );
     447        }
     448
    382449        if (false === array_key_exists($attribute, $this->attributes)) {
    383450            return $this;
  • sg-ai-studio/trunk/vendor/guzzlehttp/psr7/src/Stream.php

    r3561022 r3562098  
    201201    public function seek($offset, $whence = SEEK_SET): void
    202202    {
     203        if (!\is_int($offset)) {
     204            \trigger_deprecation(
     205                'guzzlehttp/psr7',
     206                '2.11',
     207                'Passing %s to StreamInterface::seek() is deprecated; guzzlehttp/psr7 3.0 requires int for $offset.',
     208                \get_debug_type($offset)
     209            );
     210        }
     211
     212        if (!\is_int($whence)) {
     213            \trigger_deprecation(
     214                'guzzlehttp/psr7',
     215                '2.11',
     216                'Passing %s to StreamInterface::seek() is deprecated; guzzlehttp/psr7 3.0 requires int for $whence.',
     217                \get_debug_type($whence)
     218            );
     219        }
     220
    203221        $whence = (int) $whence;
    204222
    … …  
    217235    public function read($length): string
    218236    {
     237        if (!\is_int($length)) {
     238            \trigger_deprecation(
     239                'guzzlehttp/psr7',
     240                '2.11',
     241                'Passing %s to StreamInterface::read() is deprecated; guzzlehttp/psr7 3.0 requires int for $length.',
     242                \get_debug_type($length)
     243            );
     244        }
     245
    219246        if (!isset($this->stream)) {
    220247            throw new \RuntimeException('Stream is detached');
    … …  
    246273    public function write($string): int
    247274    {
     275        if (!\is_string($string)) {
     276            \trigger_deprecation(
     277                'guzzlehttp/psr7',
     278                '2.11',
     279                'Passing %s to StreamInterface::write() is deprecated; guzzlehttp/psr7 3.0 requires string for $string.',
     280                \get_debug_type($string)
     281            );
     282        }
     283
    248284        if (!isset($this->stream)) {
    249285            throw new \RuntimeException('Stream is detached');
    … …  
    269305    public function getMetadata($key = null)
    270306    {
     307        if ($key !== null && !\is_string($key)) {
     308            \trigger_deprecation(
     309                'guzzlehttp/psr7',
     310                '2.11',
     311                'Passing %s to StreamInterface::getMetadata() is deprecated; guzzlehttp/psr7 3.0 requires string|null for $key.',
     312                \get_debug_type($key)
     313            );
     314        }
     315
    271316        if (!isset($this->stream)) {
    272317            return $key ? null : [];
  • sg-ai-studio/trunk/vendor/guzzlehttp/psr7/src/StreamDecoratorTrait.php

    r3505951 r3562098  
    8787    public function getMetadata($key = null)
    8888    {
     89        if ($key !== null && !\is_string($key)) {
     90            \trigger_deprecation(
     91                'guzzlehttp/psr7',
     92                '2.11',
     93                'Passing %s to StreamInterface::getMetadata() is deprecated; guzzlehttp/psr7 3.0 requires string|null for $key.',
     94                \get_debug_type($key)
     95            );
     96        }
     97
    8998        return $this->stream->getMetadata($key);
    9099    }
    … …  
    132141    public function seek($offset, $whence = SEEK_SET): void
    133142    {
     143        if (!\is_int($offset)) {
     144            \trigger_deprecation(
     145                'guzzlehttp/psr7',
     146                '2.11',
     147                'Passing %s to StreamInterface::seek() is deprecated; guzzlehttp/psr7 3.0 requires int for $offset.',
     148                \get_debug_type($offset)
     149            );
     150        }
     151
     152        if (!\is_int($whence)) {
     153            \trigger_deprecation(
     154                'guzzlehttp/psr7',
     155                '2.11',
     156                'Passing %s to StreamInterface::seek() is deprecated; guzzlehttp/psr7 3.0 requires int for $whence.',
     157                \get_debug_type($whence)
     158            );
     159        }
     160
    134161        $this->stream->seek($offset, $whence);
    135162    }
    … …  
    137164    public function read($length): string
    138165    {
     166        if (!\is_int($length)) {
     167            \trigger_deprecation(
     168                'guzzlehttp/psr7',
     169                '2.11',
     170                'Passing %s to StreamInterface::read() is deprecated; guzzlehttp/psr7 3.0 requires int for $length.',
     171                \get_debug_type($length)
     172            );
     173        }
     174
    139175        return $this->stream->read($length);
    140176    }
    … …  
    142178    public function write($string): int
    143179    {
     180        if (!\is_string($string)) {
     181            \trigger_deprecation(
     182                'guzzlehttp/psr7',
     183                '2.11',
     184                'Passing %s to StreamInterface::write() is deprecated; guzzlehttp/psr7 3.0 requires string for $string.',
     185                \get_debug_type($string)
     186            );
     187        }
     188
    144189        return $this->stream->write($string);
    145190    }
  • sg-ai-studio/trunk/vendor/guzzlehttp/psr7/src/Uri.php

    r3561022 r3562098  
    516516    public function withPort($port): UriInterface
    517517    {
     518        if ($port !== null && !\is_int($port)) {
     519            \trigger_deprecation(
     520                'guzzlehttp/psr7',
     521                '2.11',
     522                'Passing %s to UriInterface::withPort() is deprecated; guzzlehttp/psr7 3.0 requires int|null.',
     523                \get_debug_type($port)
     524            );
     525        }
     526
    518527        $port = $this->filterPort($port);
    519528
    … …  
    624633        }
    625634
    626         return \strtr($scheme, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz');
     635        $scheme = \strtr($scheme, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz');
     636
     637        if ($scheme !== '' && !preg_match('/^[a-z][a-z0-9.+-]*$/D', $scheme)) {
     638            \trigger_deprecation(
     639                'guzzlehttp/psr7',
     640                '2.11',
     641                'Passing "%s" as a URI scheme is deprecated; guzzlehttp/psr7 3.0 requires URI schemes to match RFC 3986 syntax and begin with a letter.',
     642                $scheme
     643            );
     644        }
     645
     646        return $scheme;
    627647    }
    628648
  • sg-ai-studio/trunk/vendor/guzzlehttp/psr7/src/UriComparator.php

    r3505951 r3562098  
    3535    }
    3636
    37     private static function computePort(UriInterface $uri): int
     37    private static function computePort(UriInterface $uri): ?int
    3838    {
    3939        $port = $uri->getPort();
    … …  
    4343        }
    4444
    45         return 'https' === $uri->getScheme() ? 443 : 80;
     45        if ('http' === $uri->getScheme()) {
     46            return 80;
     47        }
     48
     49        if ('https' === $uri->getScheme()) {
     50            return 443;
     51        }
     52
     53        return null;
    4654    }
    4755
  • sg-ai-studio/trunk/vendor/guzzlehttp/psr7/src/Utils.php

    r3561022 r3562098  
    3636     * Copy the contents of a stream into another stream until the given number
    3737     * of bytes have been read.
     38     *
     39     * The copy stops if the destination write returns 0, for example a
     40     * BufferStream at its high water mark or a full DroppingStream. For a
     41     * guaranteed full copy use a normal writable stream such as a file or
     42     * php://temp stream.
    3843     *
    3944     * @param StreamInterface $source Stream to read from
    … …  
    5055        if ($maxLen === -1) {
    5156            while (!$source->eof()) {
    52                 if (!$dest->write($source->read($bufferSize))) {
     57                $buf = $source->read($bufferSize);
     58                if ($buf === '') {
     59                    break;
     60                }
     61
     62                if (!self::writeAll($dest, $buf)) {
    5363                    break;
    5464                }
    … …  
    6373                }
    6474                $remaining -= $len;
    65                 $dest->write($buf);
    66             }
    67         }
     75                if (!self::writeAll($dest, $buf)) {
     76                    break;
     77                }
     78            }
     79        }
     80    }
     81
     82    /**
     83     * Writes the full buffer to the destination, retrying short writes.
     84     *
     85     * Returns false when the destination write returns 0 or less.
     86     */
     87    private static function writeAll(StreamInterface $dest, string $buf): bool
     88    {
     89        $written = 0;
     90        $len = strlen($buf);
     91
     92        while ($written < $len) {
     93            $result = $dest->write(substr($buf, $written));
     94            if ($result <= 0) {
     95                return false;
     96            }
     97
     98            $written += $result;
     99        }
     100
     101        return true;
    68102    }
    69103
    … …  
    146180     * The changes can be one of:
    147181     * - method: (string) Changes the HTTP method.
    148      * - set_headers: (array) Sets the given headers.
    149      * - remove_headers: (array) Remove the given headers.
    150      * - body: (mixed) Sets the given body.
     182     * - set_headers: (array) Sets the given headers. Values must be strings
     183     *   or non-empty arrays of strings.
     184     * - remove_headers: (array) Remove the given headers. Values may be
     185     *   strings or integers.
     186     * - body: (mixed) Sets the given body. Present non-null values are converted
     187     *   with self::streamFor(), including scalar values, resources, streams,
     188     *   iterators, callable arrays, closures, invokable objects, and objects
     189     *   with __toString(). String inputs remain literal bodies.
    151190     * - uri: (UriInterface) Set the URI.
    152191     * - query: (string) Set the query string value of the URI.
    … …  
    161200            return $request;
    162201        }
     202
     203        self::warnOnInvalidModifyRequestChanges($changes);
    163204
    164205        $headers = $request->getHeaders();
    … …  
    168209        } else {
    169210            // Remove the host header if one is on the URI
    170             if ($host = $changes['uri']->getHost()) {
     211            $host = $changes['uri']->getHost();
     212            if ($host !== '') {
     213                if (isset($changes['set_headers']) && is_array($changes['set_headers'])) {
     214                    foreach (array_keys($changes['set_headers']) as $header) {
     215                        if (strtolower((string) $header) === 'host') {
     216                            throw new \InvalidArgumentException(
     217                                'Cannot modify request with both a URI containing a host and an explicit Host header.'
     218                            );
     219                        }
     220                    }
     221                }
     222
    171223                $changes['set_headers']['Host'] = $host;
    172224
    … …  
    257309
    258310        return $new;
     311    }
     312
     313    /**
     314     * @param array<array-key, mixed> $changes
     315     */
     316    private static function warnOnInvalidModifyRequestChanges(array $changes): void
     317    {
     318        foreach (['method', 'query', 'version'] as $key) {
     319            if (\array_key_exists($key, $changes) && !\is_string($changes[$key])) {
     320                self::warnOnInvalidModifyRequestChange($key, 'string', $changes[$key]);
     321            }
     322        }
     323
     324        if (\array_key_exists('uri', $changes) && !$changes['uri'] instanceof UriInterface) {
     325            self::warnOnInvalidModifyRequestChange('uri', 'UriInterface', $changes['uri']);
     326        }
     327
     328        if (\array_key_exists('body', $changes) && $changes['body'] === null) {
     329            self::warnOnInvalidModifyRequestChange('body', 'resource|string|int|float|bool|StreamInterface|callable|\Iterator|\Stringable', $changes['body']);
     330        }
     331
     332        if (\array_key_exists('set_headers', $changes)) {
     333            if (!\is_array($changes['set_headers'])) {
     334                self::warnOnInvalidModifyRequestChange('set_headers', 'array<array-key, string|non-empty-array<array-key, string>>', $changes['set_headers']);
     335            } else {
     336                foreach ($changes['set_headers'] as $header => $value) {
     337                    $headerPath = \sprintf('set_headers.%s', (string) $header);
     338
     339                    if (\is_array($value)) {
     340                        if ($value === []) {
     341                            self::warnOnInvalidModifyRequestChange($headerPath, 'string|non-empty-array<array-key, string>', $value);
     342
     343                            break;
     344                        }
     345
     346                        foreach ($value as $index => $item) {
     347                            if (!\is_string($item)) {
     348                                self::warnOnInvalidModifyRequestChange(\sprintf('%s.%s', $headerPath, (string) $index), 'string', $item);
     349
     350                                break 2;
     351                            }
     352                        }
     353                    } elseif (!\is_string($value)) {
     354                        self::warnOnInvalidModifyRequestChange($headerPath, 'string|non-empty-array<array-key, string>', $value);
     355
     356                        break;
     357                    }
     358                }
     359            }
     360        }
     361
     362        if (!\array_key_exists('remove_headers', $changes)) {
     363            return;
     364        }
     365
     366        if (!\is_array($changes['remove_headers'])) {
     367            self::warnOnInvalidModifyRequestChange('remove_headers', 'array<array-key, string|int>', $changes['remove_headers']);
     368
     369            return;
     370        }
     371
     372        foreach ($changes['remove_headers'] as $index => $header) {
     373            if (!\is_string($header) && !\is_int($header)) {
     374                self::warnOnInvalidModifyRequestChange(\sprintf('remove_headers.%s', (string) $index), 'string|int', $header);
     375
     376                return;
     377            }
     378        }
     379    }
     380
     381    /**
     382     * @param mixed $value
     383     */
     384    private static function warnOnInvalidModifyRequestChange(string $key, string $expected, $value): void
     385    {
     386        \trigger_deprecation(
     387            'guzzlehttp/psr7',
     388            '2.11',
     389            'Passing %s to Utils::modifyRequest() change "%s" is deprecated; guzzlehttp/psr7 3.0 requires %s.',
     390            \get_debug_type($value),
     391            $key,
     392            $expected
     393        );
    259394    }
    260395
    … …  
    319454     *   uses the string value.
    320455     * - `NULL`: When `null` is passed, an empty stream object is returned.
    321      * - `callable` When a callable is passed, a read-only stream object will be
    322      *   created that invokes the given callable. The callable is invoked with the
    323      *   number of suggested bytes to read. The callable can return any number of
    324      *   bytes, but MUST return `false` when there is no more data to return. The
    325      *   stream object that wraps the callable will invoke the callable until the
    326      *   number of requested bytes are available. Any additional bytes will be
    327      *   buffered and used in subsequent reads.
     456     * - `callable`: When a callable array, closure, or invokable object is passed
     457     *   and no earlier resource or object rule applies, a read-only stream object
     458     *   will be created that invokes the given callable. The callable is invoked
     459     *   with the suggested number of bytes to read. The callable can return fewer
     460     *   or more bytes than requested, but MUST return `false` or `null` when there
     461     *   is no more data to return. Any additional bytes will be buffered and used
     462     *   in subsequent reads. String inputs are always treated as string bodies,
     463     *   even when they name callable functions.
    328464     *
    329465     * @param resource|string|int|float|bool|StreamInterface|callable|\Iterator|null $resource Entity body data
Note: See TracChangeset for help on using the changeset viewer.